eOn client
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
DimerRotationDispatch.h
Go to the documentation of this file.
1
/*
2
** This file is part of eOn.
3
**
4
** SPDX-License-Identifier: BSD-3-Clause
5
**
6
** Copyright (c) 2010--present, eOn Development Team
7
** All rights reserved.
8
**
9
** Repo:
10
** https://github.com/TheochemUI/eOn
11
*/
12
#pragma once
13
14
#include "
BaseStructures.h
"
15
#include "
Davidson.h
"
16
#include "
EonLogger.h
"
17
#include "
LORRotation.h
"
18
#include "
Lanczos.h
"
19
#include "
Matter.h
"
20
#include "
Parameters.h
"
21
22
#include <memory>
23
#include <optional>
24
#include <string_view>
25
#include <type_traits>
26
27
namespace
eonc
{
28
30
struct
DimerRotationResult
{
31
AtomMatrix
eigenvector
;
32
double
eigenvalue
{0.0};
33
long
forceCalls
{0};
34
long
rotations
{0};
37
bool
converged
{
true
};
38
};
39
40
[[nodiscard]]
inline
constexpr
bool
41
usesAlternativeRotation
(
DimerRotationBackend
backend)
noexcept
{
42
return
backend !=
DimerRotationBackend::Classical
;
43
}
44
45
namespace
detail
{
46
47
template
<
typename
Solver>
48
[[nodiscard]]
DimerRotationResult
runRotationSolver
(
49
const
std::shared_ptr<Matter> &matter,
const
Parameters
¶ms,
50
const
std::shared_ptr<Potential> &
pot
,
const
AtomMatrix
&initialDirection) {
51
Solver solver(matter, params,
pot
);
52
solver.compute(matter, initialDirection);
53
DimerRotationResult
out;
54
out.
eigenvector
= solver.getEigenvector();
55
out.
eigenvalue
= solver.getEigenvalue();
56
out.
forceCalls
= solver.totalForceCalls;
57
out.
rotations
= solver.statsRotations;
58
if
constexpr
(std::is_same_v<Solver, LORRotation>) {
59
out.
converged
= solver.convergedOnResidual;
60
}
else
{
61
out.
converged
=
true
;
62
}
63
return
out;
64
}
65
66
}
// namespace detail
67
70
[[nodiscard]]
inline
std::optional<DimerRotationResult>
runAlternativeRotation
(
71
DimerRotationBackend
backend,
const
std::shared_ptr<Matter> &matter,
72
const
Parameters
¶ms,
const
std::shared_ptr<Potential> &
pot
,
73
const
AtomMatrix
&initialDirection, quill::Logger *
log
=
nullptr
) {
74
if
(!
usesAlternativeRotation
(backend)) {
75
return
std::nullopt;
76
}
77
78
const
std::string_view backendName = magic_enum::enum_name(backend);
79
80
if
(
log
) {
81
QUILL_LOG_INFO(
log
,
82
"[DimerRot] rotation_backend={} (skipping classical "
83
"constrained rotation loop)"
,
84
backendName);
85
}
86
87
DimerRotationResult
result;
88
switch
(backend) {
89
case
DimerRotationBackend::LOR
:
90
result =
detail::runRotationSolver<LORRotation>
(matter, params,
pot
,
91
initialDirection);
92
break
;
93
case
DimerRotationBackend::Lanczos
:
94
result =
detail::runRotationSolver<Lanczos>
(matter, params,
pot
,
95
initialDirection);
96
break
;
97
case
DimerRotationBackend::Davidson
:
98
result =
detail::runRotationSolver<Davidson>
(matter, params,
pot
,
99
initialDirection);
100
break
;
101
case
DimerRotationBackend::Classical
:
102
return
std::nullopt;
103
}
104
105
if
(
log
) {
106
QUILL_LOG_INFO(
log
,
107
"[DimerRot] alternative rotation done backend={} "
108
"eigenvalue={:.6f} force_calls={}"
,
109
backendName, result.
eigenvalue
, result.
forceCalls
);
110
}
111
return
result;
112
}
113
114
}
// namespace eonc
BaseStructures.h
Davidson.h
AtomMatrix
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition
Eigen.h:37
EonLogger.h
LORRotation.h
Lanczos.h
Matter.h
Parameters.h
eonc::Parameters
Definition
Parameters.h:28
eonc::detail
Definition
DimerRotationDispatch.h:45
eonc::detail::runRotationSolver
DimerRotationResult runRotationSolver(const std::shared_ptr< Matter > &matter, const Parameters ¶ms, const std::shared_ptr< Potential > &pot, const AtomMatrix &initialDirection)
Definition
DimerRotationDispatch.h:48
eonc::log
Definition
EonLogger.h:28
eonc::pot
Definition
ExternalCommand.h:22
eonc
RAII resource manager for the ARTn C library with global synchronization.
Definition
ARTnSaddleSearch.cpp:19
eonc::DimerRotationBackend
DimerRotationBackend
Definition
BaseStructures.h:116
eonc::DimerRotationBackend::Classical
@ Classical
Definition
BaseStructures.h:117
eonc::DimerRotationBackend::Lanczos
@ Lanczos
Definition
BaseStructures.h:118
eonc::DimerRotationBackend::Davidson
@ Davidson
Definition
BaseStructures.h:119
eonc::DimerRotationBackend::LOR
@ LOR
Definition
BaseStructures.h:120
eonc::usesAlternativeRotation
constexpr bool usesAlternativeRotation(DimerRotationBackend backend) noexcept
Definition
DimerRotationDispatch.h:41
eonc::runAlternativeRotation
std::optional< DimerRotationResult > runAlternativeRotation(DimerRotationBackend backend, const std::shared_ptr< Matter > &matter, const Parameters ¶ms, const std::shared_ptr< Potential > &pot, const AtomMatrix &initialDirection, quill::Logger *log=nullptr)
Run Lanczos, Davidson, or LOR.
Definition
DimerRotationDispatch.h:70
eonc::DimerRotationResult
Result of a non-classical dimer rotation backend (mode estimate only).
Definition
DimerRotationDispatch.h:30
eonc::DimerRotationResult::converged
bool converged
LOR: true only when residual stop fired; Lanczos/Davidson: true (internal convergence criteria,...
Definition
DimerRotationDispatch.h:37
eonc::DimerRotationResult::rotations
long rotations
Definition
DimerRotationDispatch.h:34
eonc::DimerRotationResult::forceCalls
long forceCalls
Definition
DimerRotationDispatch.h:33
eonc::DimerRotationResult::eigenvalue
double eigenvalue
Definition
DimerRotationDispatch.h:32
eonc::DimerRotationResult::eigenvector
AtomMatrix eigenvector
Definition
DimerRotationDispatch.h:31
include
eon
DimerRotationDispatch.h
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf