eOn client
Long-timescale dynamics: aKMC, NEB, parallel replica
☾
Toggle main menu visibility
Loading...
Searching...
No Matches
AtomicGPDimer.cpp
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
// An interface to the GPDimer library
13
14
#include "
eon/AtomicGPDimer.h
"
15
#include "
eon/GPRHelpers.h
"
16
#include "
eon/HelperFunctions.h
"
17
#include "
eon/fpe_handler.h
"
18
#include <cassert>
19
#include <cmath>
20
#include <cstring>
21
22
#include "subprojects/gpr_optim/gpr/AtomicDimer.h"
23
#include "subprojects/gpr_optim/gpr/auxiliary/ProblemSetUp.h"
24
#include "subprojects/gpr_optim/structures/Structures.h"
25
26
namespace
{
27
28
// AtomMatrix is row-major N×3; gpr::Coord is row-major 1×(3N) with the same
29
// flat packing [x0,y0,z0,x1,...].
30
void
copyAtomMatrixToCoord(
const
AtomMatrix
&src, gpr::Coord &dst) {
31
dst.resize(1,
static_cast<
Eigen::Index
>
(src.size()));
32
if
(src.size() > 0) {
33
std::memcpy(dst.data(), src.data(),
34
static_cast<
size_t
>
(src.size()) *
sizeof
(
double
));
35
}
36
}
37
38
}
// namespace
39
40
const
char
AtomicGPDimer::OPT_SCG
[] =
"scg"
;
41
const
char
AtomicGPDimer::OPT_LBFGS
[] =
"lbfgs"
;
42
43
AtomicGPDimer::AtomicGPDimer
(std::shared_ptr<Matter> matter,
44
const
Parameters
&
params
,
45
std::shared_ptr<Potential>
pot
)
46
:
LowestEigenmode
(
pot
,
params
) {
47
matterCenter
= std::make_shared<Matter>(
pot
,
params
);
48
*
matterCenter
= *matter;
49
p
=
eonc::helpers::eon_parameters_to_gpr
(
params
);
50
const
Matrix3d
cell = matter->getCell();
51
for
(
int
i = 0; i < 9; i++) {
52
p
.cell_dimensions.value[i] = cell.data()[i];
53
}
54
}
55
56
void
AtomicGPDimer::compute
(std::shared_ptr<Matter> matter,
57
AtomMatrix
initialDirectionAtomMatrix) {
58
atoms_config
=
eonc::helpers::eon_matter_to_atmconf
(matter.get());
59
copyAtomMatrixToCoord(
matterCenter
->getPositionsFree(),
R_init
);
60
init_middle_point
.clear();
61
init_middle_point
.R =
R_init
;
62
init_observations
.clear();
63
problem_setup
.activateFrozenAtoms(
64
R_init
,
params
.gpr_dimer_options.active_radius,
atoms_config
);
65
AtomMatrix
freeOrient(
matterCenter
->numberOfFreeAtoms(), 3);
66
int
j = 0;
67
for
(
int
i = 0; i <
matterCenter
->numberOfAtoms(); i++) {
68
if
(!
matterCenter
->getFixed(i)) {
69
freeOrient.row(j) = initialDirectionAtomMatrix.row(i);
70
j++;
71
if
(j ==
matterCenter
->numberOfFreeAtoms()) {
72
break
;
73
}
74
}
75
}
76
copyAtomMatrixToCoord(freeOrient,
orient_init
);
77
atomic_dimer
.initialize(
p
,
init_observations
,
init_middle_point
,
orient_init
,
78
atoms_config
);
79
80
auto
potential =
eonc::helpers::makePotential
(
params
);
81
pot::PotentialWrapper wrapper(
82
[&potential](
long
N,
const
double
*R,
const
int
*atomicNrs,
double
*F,
83
double
*U,
double
*variance,
const
double
*box) {
84
potential->force(N, R, atomicNrs, F, U, variance, box);
85
});
86
eonc::FPEHandler
fpeh;
87
fpeh.
eat_fpe
();
88
atomic_dimer
.execute(wrapper);
89
fpeh.restore_fpe();
90
// Forcefully set the right positions
91
matter->setPositionsFreeV(
atomic_dimer
.getFinalCoordOfMidPoint());
92
this->
totalIterations
=
atomic_dimer
.getIterations();
93
this->
totalForceCalls
=
atomic_dimer
.getTotalForceCalls();
94
pot
->forceCallCounter =
atomic_dimer
.getTotalForceCalls();
95
return
;
96
}
97
98
double
AtomicGPDimer::getEigenvalue
() {
99
return
atomic_dimer
.getFinalCurvature();
100
}
101
102
AtomMatrix
AtomicGPDimer::getEigenvector
() {
103
const
gpr::Coord &orient =
atomic_dimer
.getFinalOrientation();
104
long
nFree =
matterCenter
->numberOfFreeAtoms();
105
return
Eigen::Map<const AtomMatrix>(orient.data(), nFree, 3);
106
}
AtomicGPDimer.h
Matrix3d
Eigen::Matrix< double, 3, 3, eOnStorageOrder > Matrix3d
Definition
Eigen.h:35
AtomMatrix
Eigen::Matrix< double, Eigen::Dynamic, 3, eOnStorageOrder > AtomMatrix
Definition
Eigen.h:37
GPRHelpers.h
HelperFunctions.h
AtomicGPDimer::OPT_LBFGS
static const char OPT_LBFGS[]
Definition
AtomicGPDimer.h:31
AtomicGPDimer::OPT_SCG
static const char OPT_SCG[]
Definition
AtomicGPDimer.h:30
AtomicGPDimer::AtomicGPDimer
AtomicGPDimer(std::shared_ptr< Matter > matter, const Parameters ¶ms, std::shared_ptr< Potential > pot)
Definition
AtomicGPDimer.cpp:43
eonc::AtomicGPDimer::atoms_config
gpr::AtomsConfiguration atoms_config
Definition
AtomicGPDimer.h:49
eonc::AtomicGPDimer::init_observations
gpr::Observation init_observations
Definition
AtomicGPDimer.h:50
eonc::AtomicGPDimer::orient_init
gpr::Coord orient_init
Definition
AtomicGPDimer.h:51
eonc::AtomicGPDimer::matterCenter
std::shared_ptr< Matter > matterCenter
Definition
AtomicGPDimer.h:42
eonc::AtomicGPDimer::p
gpr::InputParameters p
Definition
AtomicGPDimer.h:46
eonc::AtomicGPDimer::getEigenvector
AtomMatrix getEigenvector()
Definition
AtomicGPDimer.cpp:102
eonc::AtomicGPDimer::getEigenvalue
double getEigenvalue()
Definition
AtomicGPDimer.cpp:98
eonc::AtomicGPDimer::init_middle_point
gpr::Observation init_middle_point
Definition
AtomicGPDimer.h:50
eonc::AtomicGPDimer::R_init
gpr::Coord R_init
Definition
AtomicGPDimer.h:51
eonc::AtomicGPDimer::compute
void compute(std::shared_ptr< Matter > matter, AtomMatrix initialDirection)
Definition
AtomicGPDimer.cpp:56
eonc::AtomicGPDimer::atomic_dimer
atmd::AtomicDimer atomic_dimer
Definition
AtomicGPDimer.h:47
eonc::AtomicGPDimer::problem_setup
aux::ProblemSetUp problem_setup
Definition
AtomicGPDimer.h:48
eonc::FPEHandler
Definition
fpe_handler.h:25
eonc::FPEHandler::eat_fpe
void eat_fpe()
Definition
fpe_handler.cpp:246
eonc::LowestEigenmode::params
const Parameters & params
Definition
LowestEigenmode.h:28
eonc::LowestEigenmode::pot
std::shared_ptr< Potential > pot
Definition
LowestEigenmode.h:27
eonc::LowestEigenmode::totalForceCalls
long totalForceCalls
Definition
LowestEigenmode.h:31
eonc::LowestEigenmode::totalIterations
long totalIterations
Definition
LowestEigenmode.h:36
eonc::LowestEigenmode::LowestEigenmode
LowestEigenmode(std::shared_ptr< Potential > potPassed, const Parameters ¶meters)
Definition
LowestEigenmode.h:42
eonc::Parameters
Definition
Parameters.h:28
fpe_handler.h
eonc::helpers::eon_parameters_to_gpr
gpr::InputParameters eon_parameters_to_gpr(const Parameters ¶meters)
Create a parameters object for gpr_dimer.
Definition
GPRHelpers.cpp:23
eonc::helpers::eon_matter_to_atmconf
gpr::AtomsConfiguration eon_matter_to_atmconf(Matter *matter)
Create a configuration of atoms for gpr_dimer.
Definition
GPRHelpers.cpp:100
eonc::helpers::makePotential
std::shared_ptr< Potential > makePotential(const Parameters ¶ms)
Definition
Potential.cpp:118
client
AtomicGPDimer.cpp
Generated by
1.17.0
Generated by
Doxygen 1.17.0
Analytics by
Antics
provided by
TurtleTech ehf