OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
LDForceModifier.hpp
1/*
2 * Copyright (c) 2004-present, The University of Notre Dame. All rights
3 * reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
32 * research, please cite the following paper when you publish your work:
33 *
34 * [1] Drisko et al., J. Open Source Softw. 9, 7004 (2024).
35 *
36 * Good starting points for code and simulation methodology are:
37 *
38 * [2] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
39 * [3] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
40 * [4] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
41 * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
42 * [6] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
43 * [7] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
44 * [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
45 * [9] Drisko & Gezelter, J. Chem. Theory Comput. 20, 4986-4997 (2024).
46 */
47
48#ifndef INTEGRATOR_LDFORCEMODIFIER_HPP
49#define INTEGRATOR_LDFORCEMODIFIER_HPP
50
51#include <map>
52#include <memory>
53#include <random>
54#include <string>
55#include <vector>
56
57#include "brains/ForceModifier.hpp"
58#include "brains/Velocitizer.hpp"
59#include "hydrodynamics/Shape.hpp"
61#include "utils/RandNumGen.hpp"
62
63namespace OpenMD {
64
65 struct SDShape {
66 StuntDouble* sd;
67 Shape* shape;
68 };
69
70 struct MomentData {
71 Vector3d rcr; /**< Distance between CoM and Center of Resistance */
72 Mat3x3d Icr; /**< Moment of Inertia at Center of Resistance */
73 Mat3x3d IcrInv; /**< Icr^{-1} */
74 };
75
76 /**
77 * @class LDForceModifier
78 * Force modifier for Langevin Dynamics applying friction and random
79 * forces as well as torques.
80 */
81 class LDForceModifier : public ForceModifier {
82 public:
83 LDForceModifier(SimInfo* info);
84
85 void modifyForces() override;
86 int getMaxIterationNumber() { return maxIterNum_; }
87 void setMaxIterationNumber(int maxIter) { maxIterNum_ = maxIter; }
88 RealType getForceTolerance() { return forceTolerance_; }
89 void setForceTolerance(RealType tol) { forceTolerance_ = tol; }
90
91 private:
92 MomentData* getMomentData(StuntDouble* sd);
93 void genRandomForceAndTorque(Vector3d& force, Vector3d& torque,
94 unsigned int index);
95
96 std::map<std::string, HydroProp*> hydroPropMap_;
97 std::vector<HydroProp*> hydroProps_;
98
99 std::map<std::string, MomentData*> momentsMap_;
100 std::vector<MomentData*> moments_;
101
102 // convergence parameters:
103 int maxIterNum_;
104 RealType forceTolerance_;
105 RealType dt2_;
106
107 // random number generation:
108 Utils::RandNumGenPtr randNumGen_;
109 std::normal_distribution<RealType> forceDistribution_;
110
111 RealType langevinBufferRadius_;
112 RealType frozenBufferRadius_;
113 bool sphericalBoundaryConditions_;
114 Globals* simParams_;
115 std::unique_ptr<Velocitizer> veloMunge_ {nullptr};
116 };
117} // namespace OpenMD
118
119#endif // INTEGRATOR_LDFORCEMODIFIER_HPP
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Definition SimInfo.hpp:96
"Don't move, or you're dead! Stand up! Captain, we've got them!"
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
Vector3d rcr
Distance between CoM and Center of Resistance.
Mat3x3d IcrInv
Icr^{-1}.
Mat3x3d Icr
Moment of Inertia at Center of Resistance.