forked from lammps/lammps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpair_comb3.h
341 lines (278 loc) · 11.7 KB
/
pair_comb3.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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, [email protected]
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 PAIR_CLASS
PairStyle(comb3,PairComb3)
#else
#ifndef LMP_PAIR_COMB3_H
#define LMP_PAIR_COMB3_H
#include "pair.h"
namespace LAMMPS_NS {
class PairComb3 : public Pair {
public:
PairComb3(class LAMMPS *);
virtual ~PairComb3();
virtual void compute(int, int);
void settings(int, char **);
void coeff(int, char **);
void init_style();
double init_one(int, int);
double memory_usage();
virtual double combqeq(double *, int &);
double enegtot;
static const int NPARAMS_PER_LINE = 74;
protected:
// general potential parameters
struct Param {
int ielement,jelement,kelement,powermint;
int ielementgp,jelementgp,kelementgp; //element group
int ang_flag,pcn_flag,rad_flag,tor_flag; //angle, coordination,radical, torsion flag
double lami,lambda,alfi,alpha1,alpha2,alpha3,beta;
double pcos6,pcos5,pcos4,pcos3,pcos2,pcos1,pcos0;
double gamma,powerm,powern,bigA,bigB1,bigB2,bigB3;
double bigd,bigr,cut,cutsq,c1,c2,c3,c4;
double p6p0,p6p1,p6p2,p6p3,p6p4,p6p5,p6p6;
double ptork1,ptork2;
double addrepr,addrep, vdwflag;
double QU,QL,DU,DL,Qo,dQ,aB,bB,nD,bD,qmin,qmax;
double chi,dj,dk,dl,dm,esm,cmn1,cmn2,pcmn1,pcmn2;
double coulcut, lcut, lcutsq;
double veps, vsig, pcna, pcnb, pcnc, pcnd, polz, curl, pcross;
double paaa, pbbb;
double curlcut1, curlcut2, curl0;
};
// general setups
int nelements; // # of unique elements
int ***elem2param; // mapping from element triplets to parameters
int *map; // mapping from atom types to elements
int nparams; // # of stored parameter sets
int maxparam; // max # of parameter sets
double PI,PI2,PI4,PIsq; // PIs
double cutmin; // min cutoff for all elements
double cutmax; // max cutoff for all elements
double precision; // tolerance for QEq convergence
char **elements; // names of unique elements
Param *params; // parameter set for an I-J-K interaction
int debug_eng1, debug_eng2, debug_fq; // logic controlling debugging outputs
int pack_flag;
// Short range neighbor list
void Short_neigh();
int pgsize, oneatom;
int *sht_num, **sht_first;
MyPage<int> *ipage;
// loop up tables and flags
int nmax, **intype;
int pol_flag, polar;
double *qf, **bbij, *charge, *NCo;
double *esm, **fafb, **dfafb, **ddfafb, **phin, **dphin, **erpaw;
double **vvdw, **vdvdw;
double **afb, **dafb;
double **dpl, bytes;
double *xcctmp, *xchtmp, *xcotmp;
// additional carbon parameters
int cflag;
int nsplpcn,nsplrad,nspltor;
int maxx,maxy,maxz,maxxc,maxyc,maxconj;
int maxxcn[4];
double vmaxxcn[4],dvmaxxcn[4];
int ntab;
double iin2[16][2],iin3[64][3];
double brad[4], btor[4], bbtor, ptorr;
double fi_tor[3], fj_tor[3], fk_tor[3], fl_tor[3];
double radtmp, fi_rad[3], fj_rad[3], fk_rad[3];
double ccutoff[6],ch_a[7];
//COMB3-v18 arrays for CHO
// We wanna dynamic arrays
// C angle arrays, size = ntab+1
double pang[20001];
double dpang[20001];
double ddpang[20001];
//coordination spline arrays
double pcn_grid[4][5][5][5];
double pcn_gridx[4][5][5][5];
double pcn_gridy[4][5][5][5];
double pcn_gridz[4][5][5][5];
double pcn_cubs[4][4][4][4][64];
//coordination spline arrays
double rad_grid[3][5][5][11];
double rad_gridx[3][5][5][11];
double rad_gridy[3][5][5][11];
double rad_gridz[3][5][5][11];
double rad_spl[3][4][4][10][64];
//torsion spline arrays
double tor_grid[1][5][5][11];
double tor_gridx[1][5][5][11];
double tor_gridy[1][5][5][11];
double tor_gridz[1][5][5][11];
double tor_spl[1][4][4][10][64];
// initialization functions
void allocate();
void read_lib();
void setup_params();
virtual void read_file(char *);
// cutoff functions
double comb_fc(double, Param *);
double comb_fc_d(double, Param *);
double comb_fc_curl(double, Param *);
double comb_fc_curl_d(double, Param *);
double comb_fccc(double);
double comb_fccc_d(double);
double comb_fcch(double);
double comb_fcch_d(double);
double comb_fccch(double);
double comb_fccch_d(double);
double comb_fcsw(double);
// short range terms
void attractive(Param *, Param *, Param *, double, double, double, double,
double, double, double, double *, double *, double *,
double *, double *, int, double);
virtual void comb_fa(double, Param *, Param *, double, double,
double &, double &);
virtual void repulsive(Param *, Param *,double, double &, int,
double &, double, double);
// bond order terms
double comb_bij(double, Param *, double, int, double);
double comb_gijk(double, Param *, double);
void comb_gijk_d(double, Param *, double, double &, double &);
double zeta(Param *, Param *, double, double, double *, double *, int, double);
void comb_bij_d(double, Param *, double, int, double &,
double &, double &, double &, double &, double &, double);
void coord(Param *, double, int, double &, double &,
double &, double &, double &, double);
void comb_zetaterm_d(double, double, double, double, double,
double *, double, double *, double, double *, double *,
double *, Param *, Param *, Param *, double);
void costheta_d(double *, double, double *, double,
double *, double *, double *);
void force_zeta(Param *, Param *, double, double, double, double &,
double &, double &, double &, double &, double &, double &,
double &, double &, double &, double &, double &, double &,
int, double &, double,double, int, int, int,
double , double , double);
void cntri_int(int, double, double, double, int, int, int,
double &, double &, double &, double &, Param *);
// Legendre polynomials
void selfp6p(Param *, Param *, double, double &, double &);
double ep6p(Param *, Param *, double, double, double *, double * ,double &);
void fp6p(Param *, Param *, double, double, double *, double *, double *,
double *, double *);
// long range q-dependent terms
double self(Param *, double);
void tables();
void potal_calc(double &, double &, double &);
void tri_point(double, int &, int &, int &, double &, double &,
double &);
void vdwaals(int,int,int,int,double,double,double,double,
double &, double &);
void direct(Param *, Param *, int,int,int,double,double,
double,double,double,double, double,double,double &,double &,
int, int);
void field(Param *, Param *,double,double,double,double &,double &);
int heaviside(double);
double switching(double);
double switching_d(double);
double chicut1, chicut2;
// radical terms
double rad_init(double, Param *, int, double &, double);
void rad_calc(double, Param *, Param *, double, double, int,
int, double, double);
void rad_int(int , double, double, double, int, int, int,
double &, double &, double &, double &);
void rad_forceik(Param *, double, double *, double, double);
void rad_force(Param *, double, double *, double);
// torsion terms
double bbtor1(int, Param *, Param *, double, double, double,
double *, double *, double *, double); //modified by TAO
void tor_calc(double, Param *, Param *, double, double, int,
int, double, double);
void tor_int(int , double, double, double, int, int, int,
double &, double &, double &, double &);
void tor_force(int, Param *, Param *, double, double, double,
double, double *, double *, double *); //modified by TAO
// charge force terms
double qfo_self(Param *, double);
void qfo_short(Param *, Param *, double, double, double,
double &, double &, int, int, int);
void qfo_direct(Param *, Param *, int, int, int, double,
double, double, double, double, double &, double &,
double, double, int, int);
void qfo_field(Param *, Param *,double,double ,double ,double &, double &);
void qfo_dipole(double, int, int, int, int, double, double *, double,
double, double, double &, double &, int, int);
void qsolve(double *);
// dipole - polarization terms
double dipole_self(Param *, int);
void dipole_init(Param *, Param *, double, double *, double,
int, int, int, double, double, double, double, double, int , int);
void dipole_calc(Param *, Param *, double, double, double, double, double,
int, int, int, double, double, double, double, double, int , int,
double &, double &, double *);
// communication functions
int pack_reverse_comm(int, int, double *);
void unpack_reverse_comm(int, int *, double *);
int pack_forward_comm(int , int *, double *, int, int *);
void unpack_forward_comm(int , int , double *);
// vector functions, inline for efficiency
inline double vec3_dot(double *x, double *y) {
return x[0]*y[0] + x[1]*y[1] + x[2]*y[2];
}
inline void vec3_add(double *x, double *y, double *z) {
z[0] = x[0]+y[0]; z[1] = x[1]+y[1]; z[2] = x[2]+y[2];
}
inline void vec3_scale(double k, double *x, double *y) {
y[0] = k*x[0]; y[1] = k*x[1]; y[2] = k*x[2];
}
inline void vec3_scaleadd(double k, double *x, double *y, double *z) {
z[0] = k*x[0]+y[0]; z[1] = k*x[1]+y[1]; z[2] = k*x[2]+y[2];
}
};
}
#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: Incorrect args for pair coefficients
Self-explanatory. Check the input script or data file.
E: Pair style COMB3 requires atom IDs
This is a requirement to use the COMB3 potential.
E: Pair style COMB3 requires newton pair on
See the newton command. This is a restriction to use the COMB3
potential.
E: Pair style COMB3 requires atom attribute q
Self-explanatory.
E: All pair coeffs are not set
All pair coefficients must be set in the data file or by the
pair_coeff command before running a simulation.
E: Cannot open COMB3 lib.comb3 file
The COMB3 library file cannot be opened. Check that the path and name
are correct.
E: Cannot open COMB3 potential file %s
The specified COMB3 potential file cannot be opened. Check that the
path and name are correct.
E: Incorrect format in COMB3 potential file
Incorrect number of words per line in the potential file.
E: Illegal COMB3 parameter
One or more of the coefficients defined in the potential file is
invalid.
E: Potential file has duplicate entry
The potential file has more than one entry for the same element.
E: Potential file is missing an entry
The potential file does not have a needed entry.
E: Neighbor list overflow, boost neigh_modify one
There are too many neighbors of a single atom. Use the neigh_modify
command to increase the max number of neighbors allowed for one atom.
You may also want to boost the page size.
E: Error in vdw spline: inner radius > outer radius
A pre-tabulated spline is invalid. Likely a problem with the
potential parameters.
*/