-
Notifications
You must be signed in to change notification settings - Fork 0
/
fix_addacforce.h
161 lines (121 loc) · 3.72 KB
/
fix_addacforce.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef FIX_CLASS
FixStyle(addacforce, FixAddACForce)
#else
#ifndef LMP_FIX_ADDACFORCE_H
#define LMP_FIX_ADDACFORCE_H
#include <cmath>
#include <cstring>
#include "math_vector.h"
namespace ACFORCE {
struct C_Vector_3 {
LAMMPS_NS::vector ar;
C_Vector_3() { LAMMPS_NS::vec_null(ar); }
C_Vector_3(const C_Vector_3 &rhs) {
memcpy(ar, rhs.ar, sizeof(LAMMPS_NS::vector));
}
C_Vector_3 &operator=(const C_Vector_3 &rhs) {
if (this != &rhs) {
memcpy(ar, rhs.ar, sizeof(LAMMPS_NS::vector));
}
return *this;
}
double &operator[](const int &i) { return ar[i % 3]; }
C_Vector_3 &operator+=(const C_Vector_3 &prhs) {
ar[0] += prhs.ar[0];
ar[1] += prhs.ar[1];
ar[2] += prhs.ar[2];
return *this;
}
C_Vector_3 operator+(const C_Vector_3 &rhs) const {
C_Vector_3 C(*this);
C += rhs;
return C;
}
C_Vector_3 &operator-=(const C_Vector_3 &prhs) {
ar[0] -= prhs.ar[0];
ar[1] -= prhs.ar[1];
ar[2] -= prhs.ar[2];
return *this;
}
C_Vector_3 operator-(const C_Vector_3 &rhs) const {
C_Vector_3 C(*this);
C -= rhs;
return C;
}
double operator*(const C_Vector_3 &rhs) const {
return ar[0] * rhs.ar[0] + ar[1] * rhs.ar[1] + ar[2] * rhs.ar[2];
}
C_Vector_3 &operator*=(const double &rhs) {
ar[0] *= rhs;
ar[1] *= rhs;
ar[2] *= rhs;
return *this;
}
C_Vector_3 operator*(const double &rhs) const {
C_Vector_3 C(*this);
C *= rhs;
return C;
}
friend C_Vector_3 operator*(const double &lhs, const C_Vector_3 &rhs);
};
inline C_Vector_3 operator*(const double &lhs, const C_Vector_3 &rhs) {
C_Vector_3 C(rhs);
C *= lhs;
return C;
}
} // namespace ACFORCE
#include "fix.h"
namespace LAMMPS_NS {
class FixAddACForce : public Fix {
public:
FixAddACForce(class LAMMPS *, int, char **);
~FixAddACForce();
int setmask();
void init();
void setup(int);
void min_setup(int);
void post_force(int);
void post_force_respa(int, int, int);
void min_post_force(int);
double compute_scalar();
double compute_vector(int);
double memory_usage();
private:
double foriginal[4], foriginal_all[4], time_origin;
int force_flag, ilevel_respa, maxatom;
double **sforce;
double dt, dtv, dtf;
double xi, densi, sounde, kt, eta, beta, psi;
ACFORCE::C_Vector_3 k;
};
} // namespace LAMMPS_NS
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
E: Region ID for fix addforce does not exist
Self-explanatory.
E: Variable name for fix addcforce does not exist
Self-explanatory.
E: Variable for fix addcforce is invalid style
Self-explanatory.
E: Cannot use variable energy with constant force in fix addcforce
This is because for constant force, LAMMPS can compute the change
in energy directly.
E: Must use variable energy with fix addcforce
Must define an energy vartiable when applyting a dynamic
force during minimization.
*/