├── README.md
├── example_datafile
├── example_input
├── fix_conp.cpp
└── fix_conp.h
/README.md:
--------------------------------------------------------------------------------
1 | # Introduction
2 |
3 | Constant potential method is an approach to describe charges on electrode atoms in Molecular Dynamics(MD) simulations of Electric Double-Layer Capacitors(EDLCs). The advantage is to take into account the charge fluctuations on the electrode induced by local density fluctuations in the electrolyte solution. This method was developed by Reed et al.[1] and some derivation was corrected by Gingrich and Wilson[2] later.
4 |
5 | The aim of this project is to implement this method into LAMMPS.
6 |
7 | Please cite the following article if using this code.
8 |
9 | Z. Wang, Y. Yang, D. L. Olmsted, M. Asta and B. B. Laird, J. Chem. Phys. 141, 184102 (2014). http://dx.doi.org/10.1063/1.4899176
10 |
11 | # Installation
12 |
13 | 1. Download **fix_conp.cpp** and **fix_conp.h** to [LAMMPS home directory]/src/
14 |
15 | 2. If using gnu compiler, download and compile LAPACK. Note BLAS within LAPACK package needs to be compiled first.
16 | http://www.netlib.org/lapack/
17 |
18 | 3. Add library files of LAPACK and BLAS (file name is refblas if using default setting when compiling BLAS within LAPACK package) to link flag in LAMMPS Makefile. For Intel compiler with MKL, the corresponding library files are mkl_blacs and mkl_lapack95.
19 |
20 | 4. Compile LAMMPS as usual.
21 |
22 | # Syntax
23 | This method is turned on through a FIX command
24 |
25 | ```
26 | fix [ID] all conp [Nevery] [η] [Molecule-ID 1] [Molecule-ID 2] [Potential 1] [Potential 2] [Method] [Log] [Matrix]
27 | ```
28 |
29 | **ID** = ID of FIX command
30 |
31 | **Nevery** = Compute charge every this many steps (set to 1 for current version)
32 |
33 | **η** = Parameter for Gaussian charge. The unit is is angstrom-1 (see note below)
34 |
35 | **Molecule-ID 1** = Molecule ID of first electrode (the second column in data file)
36 |
37 | **Molecule-ID 2** = Molecule ID of second electrode
38 |
39 | **Potential 1** = Potential on first electrode (unit: V)
40 |
41 | **Potential 2** = Potential on second electrode
42 |
43 | **Method** = Method for solving linear equations. "inv" for inverse matrix and "cg" for conjugate gradient
44 |
45 | **Log** = Name of log file recording time usage of different parts
46 |
47 | **Matrix** = Optional argument. File name of A matrix to read in. If it is assigned, A matrix is read in instead of calculation
48 |
49 | # Note
50 |
51 | Current version is compatible with 11Apr14 or later version of LAMMPS. Also some limitations exist and certain settings are required.
52 |
53 | * Only simulation with two electrodes is supported
54 | * Only pair style **lj_cut_coul_long** is supported
55 | * **RESPA** is not supported
56 | * **Fix npt** is not supported
57 | * **Newton** must be **off**
58 | * **Unit** must be **real**. As so the unit of **η** is angstrom-1. For example, as in our work it is 19.79 nm-1, the actual value of **η** in command is 1.979
59 | * Electrodes need to be frozen (set the force on electrode atoms to 0 and exclude electrode atoms from integration)
60 | * The simulation cell must be symmetric with respect to z=0 plane
61 | * Two electrodes must be assigned equal but opposite potentials. For example, for a 5V potential difference, the potential on lower electrode should be -2.5V and on upper electrode should be 2.5V
62 |
63 | # Example input file
64 |
65 | The example files are for a system of acetonitrile between two graphite electrodes with potential difference as 1V. Acetonitrile is described by a united atom model (in example data file, CH3, C and N are named as CAC, CAB and NAA respectively). Inital charge on carbon in electrodes is zero (carbon is named as CG in example data file). The references of parameters can be found in our paper.
66 |
67 | # Reference
68 | [1] S. K. Reed, O. J. Lanning, and P. A. Madden, J. Chem. Phys. 126, 084704 (2007).
69 |
70 | [2] T. R. Gingrich and M. Wilson, Chem. Phys. Lett. 500, 178 (2010).
71 |
--------------------------------------------------------------------------------
/example_datafile:
--------------------------------------------------------------------------------
1 | LAMMPS data file
2 | 432 atoms
3 | 160 bonds
4 | 80 angles
5 | 0 dihedrals
6 | 0 impropers
7 | 4 atom types
8 | 2 bond types
9 | 1 angle types
10 | 0 dihedral types
11 | 0 improper types
12 | 0.00000 9.83800 xlo xhi
13 | 0.00000 8.52000 ylo yhi
14 | -40.20000 40.20000 zlo zhi
15 |
16 | Masses
17 |
18 | 1 12.01070000 # CAB
19 | 2 15.03450000 # CAC
20 | 3 12.01000000 # CG
21 | 4 14.00670000 # NAA
22 |
23 | Bond Coeffs
24 |
25 | 1 380.0 1.46 # CAB-CAC
26 | 2 600.0 1.157 # CAB-NAA
27 |
28 | Angle Coeffs
29 |
30 | 1 20.0 180.0 # CAC-CAB-NAA
31 |
32 | Atoms
33 |
34 | 1 1 4 -0.39800000 8.851000 0.975000 -6.334999 # NAA
35 | 2 1 2 0.26900000 6.388000 1.419000 -5.554001 # CAC
36 | 3 1 1 0.12900000 7.619500 1.197000 -5.944500 # CAB
37 | 4 2 4 -0.39800000 5.977000 5.769000 -1.848000 # NAA
38 | 5 2 2 0.26900000 7.839000 6.896000 -3.309002 # CAC
39 | 6 2 1 0.12900000 6.908000 6.332500 -2.578501 # CAB
40 | 7 3 4 -0.39800000 6.122000 4.832000 12.683998 # NAA
41 | 8 3 2 0.26900000 3.792000 5.287000 13.798000 # CAC
42 | 9 3 1 0.12900000 4.957000 5.059500 13.240999 # CAB
43 | 10 4 4 -0.39800000 7.252000 2.530000 -13.560001 # NAA
44 | 11 4 2 0.26900000 5.037000 1.613000 -12.497002 # CAC
45 | 12 4 1 0.12900000 6.144500 2.071500 -13.028502 # CAB
46 | 13 5 4 -0.39800000 7.943000 7.526000 16.175999 # NAA
47 | 14 5 2 0.26900000 5.747000 6.680000 17.330997 # CAC
48 | 15 5 1 0.12900000 6.845000 7.103000 16.753498 # CAB
49 | 16 6 4 -0.39800000 8.580000 4.065000 20.260998 # NAA
50 | 17 6 2 0.26900000 8.245000 1.794000 21.528000 # CAC
51 | 18 6 1 0.12900000 8.412500 2.929500 20.894499 # CAB
52 | 19 7 4 -0.39800000 4.170000 7.521000 -26.691002 # NAA
53 | 20 7 2 0.26900000 1.643000 7.019000 -26.205002 # CAC
54 | 21 7 1 0.12900000 2.906500 7.270000 -26.448002 # CAB
55 | 22 8 4 -0.39800000 1.993000 7.526000 -9.664001 # NAA
56 | 23 8 2 0.26900000 3.949000 6.754000 -11.231001 # CAC
57 | 24 8 1 0.12900000 2.971000 7.140000 -10.447501 # CAB
58 | 25 9 4 -0.39800000 5.065000 3.007000 -18.692001 # NAA
59 | 26 9 2 0.26900000 4.842000 4.743000 -16.740002 # CAC
60 | 27 9 1 0.12900000 4.953500 3.875000 -17.716002 # CAB
61 | 28 10 4 -0.39800000 3.208000 1.517000 -18.274000 # NAA
62 | 29 10 2 0.26900000 1.940000 3.760000 -17.791000 # CAC
63 | 30 10 1 0.12900000 2.574000 2.638500 -18.032500 # CAB
64 | 31 11 4 -0.39800000 1.114000 3.761000 -25.317001 # NAA
65 | 32 11 2 0.26900000 1.504000 1.927000 -27.151001 # CAC
66 | 33 11 1 0.12900000 1.309000 2.844000 -26.234001 # CAB
67 | 34 12 4 -0.39800000 8.429000 7.530000 2.828999 # NAA
68 | 35 12 2 0.26900000 8.096000 7.019000 0.278999 # CAC
69 | 36 12 1 0.12900000 8.262500 7.274500 1.553999 # CAB
70 | 37 13 4 -0.39800000 5.829000 7.074000 14.202000 # NAA
71 | 38 13 2 0.26900000 8.310000 6.486000 13.591999 # CAC
72 | 39 13 1 0.12900000 7.069500 6.780000 13.896999 # CAB
73 | 40 14 4 -0.39800000 5.714000 1.534000 -0.882000 # NAA
74 | 41 14 2 0.26900000 8.188000 1.511000 -0.012001 # CAC
75 | 42 14 1 0.12900000 6.951000 1.522500 -0.447001 # CAB
76 | 43 15 4 -0.39800000 7.154000 2.226000 -17.805000 # NAA
77 | 44 15 2 0.26900000 5.409000 1.583000 -15.957001 # CAC
78 | 45 15 1 0.12900000 6.281500 1.904500 -16.881000 # CAB
79 | 46 16 4 -0.39800000 4.043000 3.453000 26.206997 # NAA
80 | 47 16 2 0.26900000 1.551000 3.726000 25.439999 # CAC
81 | 48 16 1 0.12900000 2.797000 3.589500 25.823498 # CAB
82 | 49 17 4 -0.39800000 8.697000 1.014000 -3.367001 # NAA
83 | 50 17 2 0.26900000 7.979000 3.452000 -2.722000 # CAC
84 | 51 17 1 0.12900000 8.338000 2.233000 -3.044500 # CAB
85 | 52 18 4 -0.39800000 1.083000 0.998000 23.978001 # NAA
86 | 53 18 2 0.26900000 3.526000 1.909000 23.702000 # CAC
87 | 54 18 1 0.12900000 2.304500 1.453500 23.840001 # CAB
88 | 55 19 4 -0.39800000 1.001000 4.596000 -14.555000 # NAA
89 | 56 19 2 0.26900000 1.813000 6.792000 -15.734001 # CAC
90 | 57 19 1 0.12900000 1.407000 5.694000 -15.144500 # CAB
91 | 58 20 4 -0.39800000 5.096000 6.425000 8.608997 # NAA
92 | 59 20 2 0.26900000 7.096000 6.906000 10.233997 # CAC
93 | 60 20 1 0.12900000 6.096000 6.665500 9.421497 # CAB
94 | 61 21 4 -0.39800000 8.839000 1.126000 10.568001 # NAA
95 | 62 21 2 0.26900000 6.664000 1.456000 11.994999 # CAC
96 | 63 21 1 0.12900000 7.751500 1.291000 11.281500 # CAB
97 | 64 22 4 -0.39800000 1.495000 7.521000 -22.815001 # NAA
98 | 65 22 2 0.26900000 3.945000 7.084000 -21.987001 # CAC
99 | 66 22 1 0.12900000 2.720000 7.302500 -22.401001 # CAB
100 | 67 23 4 -0.39800000 8.132000 5.150000 2.758999 # NAA
101 | 68 23 2 0.26900000 6.189000 4.509000 1.118999 # CAC
102 | 69 23 1 0.12900000 7.160500 4.829500 1.938999 # CAB
103 | 70 24 4 -0.39800000 8.330000 2.514000 -19.877001 # NAA
104 | 71 24 2 0.26900000 6.020000 1.626000 -20.742001 # CAC
105 | 72 24 1 0.12900000 7.175000 2.070000 -20.309501 # CAB
106 | 73 25 4 -0.39800000 3.704000 7.525000 -18.358002 # NAA
107 | 74 25 2 0.26900000 1.727000 6.610000 -19.817001 # CAC
108 | 75 25 1 0.12900000 2.715500 7.067500 -19.087502 # CAB
109 | 76 26 4 -0.39800000 8.845000 3.311000 -5.583000 # NAA
110 | 77 26 2 0.26900000 8.036000 3.398000 -8.075001 # CAC
111 | 78 26 1 0.12900000 8.440500 3.354500 -6.829001 # CAB
112 | 79 27 4 -0.39800000 3.581000 3.512000 -9.962000 # NAA
113 | 80 27 2 0.26900000 3.106000 5.012000 -7.865002 # CAC
114 | 81 27 1 0.12900000 3.343500 4.262000 -8.913501 # CAB
115 | 82 28 4 -0.39800000 6.159000 5.144000 26.732998 # NAA
116 | 83 28 2 0.26900000 7.225000 6.450000 24.724003 # CAC
117 | 84 28 1 0.12900000 6.692000 5.797000 25.728500 # CAB
118 | 85 29 4 -0.39800000 4.161000 7.531000 11.090000 # NAA
119 | 86 29 2 0.26900000 1.724000 7.043000 11.927998 # CAC
120 | 87 29 1 0.12900000 2.942500 7.287000 11.508999 # CAB
121 | 88 30 4 -0.39800000 1.000000 1.413000 -23.328001 # NAA
122 | 89 30 2 0.26900000 1.580000 1.692000 -20.786001 # CAC
123 | 90 30 1 0.12900000 1.290000 1.552500 -22.057001 # CAB
124 | 91 31 4 -0.39800000 3.369000 0.997000 6.346001 # NAA
125 | 92 31 2 0.26900000 5.905000 1.664000 6.395000 # CAC
126 | 93 31 1 0.12900000 4.637000 1.330500 6.370501 # CAB
127 | 94 32 4 -0.39800000 3.943000 3.723000 -0.688999 # NAA
128 | 95 32 2 0.26900000 3.233000 1.560000 0.612000 # CAC
129 | 96 32 1 0.12900000 3.588000 2.641500 -0.038500 # CAB
130 | 97 33 4 -0.39800000 1.000000 1.258000 -16.845001 # NAA
131 | 98 33 2 0.26900000 1.815000 1.881000 -14.432001 # CAC
132 | 99 33 1 0.12900000 1.407500 1.569500 -15.638501 # CAB
133 | 100 34 4 -0.39800000 8.666000 2.286000 -25.629002 # NAA
134 | 101 34 2 0.26900000 7.118000 1.669000 -27.653000 # CAC
135 | 102 34 1 0.12900000 7.892000 1.977500 -26.641001 # CAB
136 | 103 35 4 -0.39800000 0.994000 3.886000 18.003998 # NAA
137 | 104 35 2 0.26900000 1.437000 3.246000 15.500000 # CAC
138 | 105 35 1 0.12900000 1.215500 3.566000 16.751999 # CAB
139 | 106 36 4 -0.39800000 5.321000 2.583000 -8.051003 # NAA
140 | 107 36 2 0.26900000 2.973000 2.222000 -6.941002 # CAC
141 | 108 36 1 0.12900000 4.147000 2.402500 -7.496002 # CAB
142 | 109 37 4 -0.39800000 4.446000 4.347000 -13.809000 # NAA
143 | 110 37 2 0.26900000 5.292000 6.801000 -14.175001 # CAC
144 | 111 37 1 0.12900000 4.869000 5.574000 -13.992000 # CAB
145 | 112 38 4 -0.39800000 8.743000 1.220000 18.677998 # NAA
146 | 113 38 2 0.26900000 6.278000 2.004000 19.105999 # CAC
147 | 114 38 1 0.12900000 7.510500 1.612000 18.891998 # CAB
148 | 115 39 4 -0.39800000 8.839000 5.348000 22.320999 # NAA
149 | 116 39 2 0.26900000 6.877000 6.643000 21.160000 # CAC
150 | 117 39 1 0.12900000 7.858000 5.995500 21.740499 # CAB
151 | 118 40 4 -0.39800000 3.743000 7.513000 19.566998 # NAA
152 | 119 40 2 0.26900000 3.791000 4.904000 19.311001 # CAC
153 | 120 40 1 0.12900000 3.767000 6.208500 19.439000 # CAB
154 | 121 41 4 -0.39800000 8.753000 1.092000 8.169998 # NAA
155 | 122 41 2 0.26900000 8.137000 3.638000 8.280998 # CAC
156 | 123 41 1 0.12900000 8.445000 2.365000 8.225498 # CAB
157 | 124 42 4 -0.39800000 5.206000 3.183000 -2.656002 # NAA
158 | 125 42 2 0.26900000 3.256000 1.631000 -3.473000 # CAC
159 | 126 42 1 0.12900000 4.231000 2.407000 -3.064501 # CAB
160 | 127 43 4 -0.39800000 5.329000 4.553000 -4.622002 # NAA
161 | 128 43 2 0.26900000 4.715000 7.010000 -5.299999 # CAC
162 | 129 43 1 0.12900000 5.022000 5.781500 -4.961000 # CAB
163 | 130 44 4 -0.39800000 8.840000 7.324000 -17.161001 # NAA
164 | 131 44 2 0.26900000 8.391000 4.818000 -17.785000 # CAC
165 | 132 44 1 0.12900000 8.615500 6.071000 -17.473000 # CAB
166 | 133 45 4 -0.39800000 8.837000 0.999000 24.786999 # NAA
167 | 134 45 2 0.26900000 7.856000 2.655000 26.565998 # CAC
168 | 135 45 1 0.12900000 8.346500 1.827000 25.676499 # CAB
169 | 136 46 4 -0.39800000 8.876000 2.870000 2.813000 # NAA
170 | 137 46 2 0.26900000 6.417000 1.964000 2.903000 # CAC
171 | 138 46 1 0.12900000 7.646500 2.417000 2.858000 # CAB
172 | 139 47 4 -0.39800000 0.967000 6.087000 0.590000 # NAA
173 | 140 47 2 0.26900000 3.255000 6.955000 -0.350002 # CAC
174 | 141 47 1 0.12900000 2.111000 6.521000 0.119999 # CAB
175 | 142 48 4 -0.39800000 0.984000 3.204000 11.528000 # NAA
176 | 143 48 2 0.26900000 2.322000 4.812000 9.946999 # CAC
177 | 144 48 1 0.12900000 1.653000 4.008000 10.737500 # CAB
178 | 145 49 4 -0.39800000 1.029000 1.212000 19.030998 # NAA
179 | 146 49 2 0.26900000 1.447000 2.783000 21.089001 # CAC
180 | 147 49 1 0.12900000 1.238000 1.997500 20.059999 # CAB
181 | 148 50 4 -0.39800000 7.317000 7.271000 -10.969000 # NAA
182 | 149 50 2 0.26900000 5.868000 7.043000 -8.796001 # CAC
183 | 150 50 1 0.12900000 6.592500 7.157000 -9.882500 # CAB
184 | 151 51 4 -0.39800000 8.677000 6.078000 -9.260000 # NAA
185 | 152 51 2 0.26900000 8.121000 6.209000 -6.701000 # CAC
186 | 153 51 1 0.12900000 8.399000 6.143500 -7.980500 # CAB
187 | 154 52 4 -0.39800000 8.321000 4.301000 -24.326000 # NAA
188 | 155 52 2 0.26900000 8.328000 5.546000 -26.634001 # CAC
189 | 156 52 1 0.12900000 8.324500 4.923500 -25.480001 # CAB
190 | 157 53 4 -0.39800000 5.710000 7.522000 6.564999 # NAA
191 | 158 53 2 0.26900000 8.222000 6.774000 6.611000 # CAC
192 | 159 53 1 0.12900000 6.966000 7.148000 6.588000 # CAB
193 | 160 54 4 -0.39800000 5.284000 3.058000 14.526001 # NAA
194 | 161 54 2 0.26900000 3.342000 1.630000 13.493000 # CAC
195 | 162 54 1 0.12900000 4.313000 2.344000 14.009501 # CAB
196 | 163 55 4 -0.39800000 4.258000 5.085000 -19.710001 # NAA
197 | 164 55 2 0.26900000 6.378000 6.598000 -19.409000 # CAC
198 | 165 55 1 0.12900000 5.318000 5.841500 -19.559500 # CAB
199 | 166 56 4 -0.39800000 6.226000 0.996000 23.646999 # NAA
200 | 167 56 2 0.26900000 6.635000 3.585000 23.728001 # CAC
201 | 168 56 1 0.12900000 6.430500 2.290500 23.687500 # CAB
202 | 169 57 4 -0.39800000 8.843000 7.461000 -14.765001 # NAA
203 | 170 57 2 0.26900000 8.100000 5.283000 -13.508001 # CAC
204 | 171 57 1 0.12900000 8.471500 6.372000 -14.136501 # CAB
205 | 172 58 4 -0.39800000 3.859000 5.302000 -2.871002 # NAA
206 | 173 58 2 0.26900000 1.626000 4.128000 -2.157001 # CAC
207 | 174 58 1 0.12900000 2.742500 4.715000 -2.514002 # CAB
208 | 175 59 4 -0.39800000 8.841000 4.361000 -21.422001 # NAA
209 | 176 59 2 0.26900000 8.311000 6.872000 -21.957001 # CAC
210 | 177 59 1 0.12900000 8.576000 5.616500 -21.689501 # CAB
211 | 178 60 4 -0.39800000 4.479000 4.147000 7.537998 # NAA
212 | 179 60 2 0.26900000 5.430000 3.400000 9.864998 # CAC
213 | 180 60 1 0.12900000 4.954500 3.773500 8.701498 # CAB
214 | 181 61 4 -0.39800000 4.059000 0.997000 3.980999 # NAA
215 | 182 61 2 0.26900000 1.497000 1.529000 3.806000 # CAC
216 | 183 61 1 0.12900000 2.778000 1.263000 3.893499 # CAB
217 | 184 62 4 -0.39800000 3.617000 3.292000 -25.667000 # NAA
218 | 185 62 2 0.26900000 3.658000 4.421000 -28.033001 # CAC
219 | 186 62 1 0.12900000 3.637500 3.856500 -26.850001 # CAB
220 | 187 63 4 -0.39800000 2.710000 7.522000 3.057999 # NAA
221 | 188 63 2 0.26900000 5.292000 7.084000 3.170998 # CAC
222 | 189 63 1 0.12900000 4.001000 7.303000 3.114498 # CAB
223 | 190 64 4 -0.39800000 8.849000 2.872000 -11.637001 # NAA
224 | 191 64 2 0.26900000 6.520000 3.916000 -11.035000 # CAC
225 | 192 64 1 0.12900000 7.684500 3.394000 -11.336001 # CAB
226 | 193 65 4 -0.39800000 5.468000 5.011000 5.366001 # NAA
227 | 194 65 2 0.26900000 3.370000 6.528000 5.780998 # CAC
228 | 195 65 1 0.12900000 4.419000 5.769500 5.573500 # CAB
229 | 196 66 4 -0.39800000 2.055000 5.455000 -23.902000 # NAA
230 | 197 66 2 0.26900000 3.486000 3.614000 -22.703001 # CAC
231 | 198 66 1 0.12900000 2.770500 4.534500 -23.302501 # CAB
232 | 199 67 4 -0.39800000 1.002000 3.445000 0.587997 # NAA
233 | 200 67 2 0.26900000 2.574000 4.563000 2.362999 # CAC
234 | 201 67 1 0.12900000 1.788000 4.004000 1.475498 # CAB
235 | 202 68 4 -0.39800000 0.982000 6.791000 -13.046001 # NAA
236 | 203 68 2 0.26900000 1.681000 4.619000 -11.753000 # CAC
237 | 204 68 1 0.12900000 1.331500 5.705000 -12.399501 # CAB
238 | 205 69 4 -0.39800000 3.919000 3.207000 5.040001 # NAA
239 | 206 69 2 0.26900000 1.572000 3.880000 5.998001 # CAC
240 | 207 69 1 0.12900000 2.745500 3.543500 5.519001 # CAB
241 | 208 70 4 -0.39800000 4.133000 7.521000 21.936001 # NAA
242 | 209 70 2 0.26900000 1.755000 6.416000 21.918999 # CAC
243 | 210 70 1 0.12900000 2.944000 6.968500 21.927500 # CAB
244 | 211 71 4 -0.39800000 5.317000 0.988000 15.770000 # NAA
245 | 212 71 2 0.26900000 3.361000 1.441000 17.455997 # CAC
246 | 213 71 1 0.12900000 4.339000 1.214500 16.612998 # CAB
247 | 214 72 4 -0.39800000 0.998000 6.782000 -2.688000 # NAA
248 | 215 72 2 0.26900000 1.657000 5.714000 -4.990002 # CAC
249 | 216 72 1 0.12900000 1.327500 6.248000 -3.839001 # CAB
250 | 217 73 4 -0.39800000 7.230000 7.520000 -24.656002 # NAA
251 | 218 73 2 0.26900000 5.506000 5.560000 -24.900002 # CAC
252 | 219 73 1 0.12900000 6.368000 6.540000 -24.778002 # CAB
253 | 220 74 4 -0.39800000 8.846000 6.768000 18.457001 # NAA
254 | 221 74 2 0.26900000 8.023000 4.549000 17.327000 # CAC
255 | 222 74 1 0.12900000 8.434500 5.658500 17.892001 # CAB
256 | 223 75 4 -0.39800000 4.029000 1.585000 8.704998 # NAA
257 | 224 75 2 0.26900000 1.412000 1.512000 8.847000 # CAC
258 | 225 75 1 0.12900000 2.720500 1.548500 8.775999 # CAB
259 | 226 76 4 -0.39800000 4.152000 0.997000 -9.485001 # NAA
260 | 227 76 2 0.26900000 1.613000 1.437000 -9.964001 # CAC
261 | 228 76 1 0.12900000 2.882500 1.217000 -9.724501 # CAB
262 | 229 77 4 -0.39800000 3.661000 7.545000 15.655998 # NAA
263 | 230 77 2 0.26900000 1.616000 6.650000 17.030998 # CAC
264 | 231 77 1 0.12900000 2.638500 7.097500 16.343498 # CAB
265 | 232 78 4 -0.39800000 1.178000 7.520000 24.674000 # NAA
266 | 233 78 2 0.26900000 3.663000 6.838000 25.159000 # CAC
267 | 234 78 1 0.12900000 2.420500 7.179000 24.916500 # CAB
268 | 235 79 4 -0.39800000 6.958000 3.407000 -22.563002 # NAA
269 | 236 79 2 0.26900000 6.088000 1.654000 -24.308001 # CAC
270 | 237 79 1 0.12900000 6.523000 2.530500 -23.435502 # CAB
271 | 238 80 4 -0.39800000 8.840000 3.563000 13.758999 # NAA
272 | 239 80 2 0.26900000 8.026000 1.933000 15.644001 # CAC
273 | 240 80 1 0.12900000 8.433000 2.748000 14.701500 # CAB
274 | 241 81 3 0.00000000 0.615000 1.065000 -38.525000 # CG
275 | 242 81 3 0.00000000 0.615000 3.905000 -38.525000 # CG
276 | 243 81 3 0.00000000 1.845000 1.775000 -38.525000 # CG
277 | 244 81 3 0.00000000 1.845000 3.195000 -38.525000 # CG
278 | 245 81 3 0.00000000 3.074000 1.065000 -38.525000 # CG
279 | 246 81 3 0.00000000 3.074000 3.905000 -38.525000 # CG
280 | 247 81 3 0.00000000 4.304000 1.775000 -38.525000 # CG
281 | 248 81 3 0.00000000 4.304000 3.195000 -38.525000 # CG
282 | 249 81 3 0.00000000 5.534000 1.065000 -38.525000 # CG
283 | 250 81 3 0.00000000 5.534000 3.905000 -38.525000 # CG
284 | 251 81 3 0.00000000 6.764000 1.775000 -38.525000 # CG
285 | 252 81 3 0.00000000 6.764000 3.195000 -38.525000 # CG
286 | 253 81 3 0.00000000 7.993000 1.065000 -38.525000 # CG
287 | 254 81 3 0.00000000 7.993000 3.905000 -38.525000 # CG
288 | 255 81 3 0.00000000 9.223000 1.775000 -38.525000 # CG
289 | 256 81 3 0.00000000 9.223000 3.195000 -38.525000 # CG
290 | 257 81 3 0.00000000 0.615000 5.325000 -38.525000 # CG
291 | 258 81 3 0.00000000 0.615000 8.165000 -38.525000 # CG
292 | 259 81 3 0.00000000 1.845000 6.035000 -38.525000 # CG
293 | 260 81 3 0.00000000 1.845000 7.455000 -38.525000 # CG
294 | 261 81 3 0.00000000 3.074000 5.325000 -38.525000 # CG
295 | 262 81 3 0.00000000 3.074000 8.165000 -38.525000 # CG
296 | 263 81 3 0.00000000 4.304000 6.035000 -38.525000 # CG
297 | 264 81 3 0.00000000 4.304000 7.455000 -38.525000 # CG
298 | 265 81 3 0.00000000 5.534000 5.325000 -38.525000 # CG
299 | 266 81 3 0.00000000 5.534000 8.165000 -38.525000 # CG
300 | 267 81 3 0.00000000 6.764000 6.035000 -38.525000 # CG
301 | 268 81 3 0.00000000 6.764000 7.455000 -38.525000 # CG
302 | 269 81 3 0.00000000 7.993000 5.325000 -38.525000 # CG
303 | 270 81 3 0.00000000 7.993000 8.165000 -38.525000 # CG
304 | 271 81 3 0.00000000 9.223000 6.035000 -38.525000 # CG
305 | 272 81 3 0.00000000 9.223000 7.455000 -38.525000 # CG
306 | 273 81 3 0.00000000 9.223000 0.355000 -35.175000 # CG
307 | 274 81 3 0.00000000 9.223000 3.195000 -35.175000 # CG
308 | 275 81 3 0.00000000 7.993000 1.065000 -35.175000 # CG
309 | 276 81 3 0.00000000 7.993000 2.485000 -35.175000 # CG
310 | 277 81 3 0.00000000 6.764000 0.355000 -35.175000 # CG
311 | 278 81 3 0.00000000 6.764000 3.195000 -35.175000 # CG
312 | 279 81 3 0.00000000 5.534000 1.065000 -35.175000 # CG
313 | 280 81 3 0.00000000 5.534000 2.485000 -35.175000 # CG
314 | 281 81 3 0.00000000 4.304000 0.355000 -35.175000 # CG
315 | 282 81 3 0.00000000 4.304000 3.195000 -35.175000 # CG
316 | 283 81 3 0.00000000 3.074000 1.065000 -35.175000 # CG
317 | 284 81 3 0.00000000 3.074000 2.485000 -35.175000 # CG
318 | 285 81 3 0.00000000 1.845000 0.355000 -35.175000 # CG
319 | 286 81 3 0.00000000 1.845000 3.195000 -35.175000 # CG
320 | 287 81 3 0.00000000 0.615000 1.065000 -35.175000 # CG
321 | 288 81 3 0.00000000 0.615000 2.485000 -35.175000 # CG
322 | 289 81 3 0.00000000 9.223000 4.615000 -35.175000 # CG
323 | 290 81 3 0.00000000 9.223000 7.455000 -35.175000 # CG
324 | 291 81 3 0.00000000 7.993000 5.325000 -35.175000 # CG
325 | 292 81 3 0.00000000 7.993000 6.745000 -35.175000 # CG
326 | 293 81 3 0.00000000 6.764000 4.615000 -35.175000 # CG
327 | 294 81 3 0.00000000 6.764000 7.455000 -35.175000 # CG
328 | 295 81 3 0.00000000 5.534000 5.325000 -35.175000 # CG
329 | 296 81 3 0.00000000 5.534000 6.745000 -35.175000 # CG
330 | 297 81 3 0.00000000 4.304000 4.615000 -35.175000 # CG
331 | 298 81 3 0.00000000 4.304000 7.455000 -35.175000 # CG
332 | 299 81 3 0.00000000 3.074000 5.325000 -35.175000 # CG
333 | 300 81 3 0.00000000 3.074000 6.745000 -35.175000 # CG
334 | 301 81 3 0.00000000 1.845000 4.615000 -35.175000 # CG
335 | 302 81 3 0.00000000 1.845000 7.455000 -35.175000 # CG
336 | 303 81 3 0.00000000 0.615000 5.325000 -35.175000 # CG
337 | 304 81 3 0.00000000 0.615000 6.745000 -35.175000 # CG
338 | 305 81 3 0.00000000 0.615000 1.065000 -31.825000 # CG
339 | 306 81 3 0.00000000 0.615000 3.905000 -31.825000 # CG
340 | 307 81 3 0.00000000 1.845000 1.775000 -31.825000 # CG
341 | 308 81 3 0.00000000 1.845000 3.195000 -31.825000 # CG
342 | 309 81 3 0.00000000 3.074000 1.065000 -31.825000 # CG
343 | 310 81 3 0.00000000 3.074000 3.905000 -31.825000 # CG
344 | 311 81 3 0.00000000 4.304000 1.775000 -31.825000 # CG
345 | 312 81 3 0.00000000 4.304000 3.195000 -31.825000 # CG
346 | 313 81 3 0.00000000 5.534000 1.065000 -31.825000 # CG
347 | 314 81 3 0.00000000 5.534000 3.905000 -31.825000 # CG
348 | 315 81 3 0.00000000 6.764000 1.775000 -31.825000 # CG
349 | 316 81 3 0.00000000 6.764000 3.195000 -31.825000 # CG
350 | 317 81 3 0.00000000 7.993000 1.065000 -31.825000 # CG
351 | 318 81 3 0.00000000 7.993000 3.905000 -31.825000 # CG
352 | 319 81 3 0.00000000 9.223000 1.775000 -31.825000 # CG
353 | 320 81 3 0.00000000 9.223000 3.195000 -31.825000 # CG
354 | 321 81 3 0.00000000 0.615000 5.325000 -31.825000 # CG
355 | 322 81 3 0.00000000 0.615000 8.165000 -31.825000 # CG
356 | 323 81 3 0.00000000 1.845000 6.035000 -31.825000 # CG
357 | 324 81 3 0.00000000 1.845000 7.455000 -31.825000 # CG
358 | 325 81 3 0.00000000 3.074000 5.325000 -31.825000 # CG
359 | 326 81 3 0.00000000 3.074000 8.165000 -31.825000 # CG
360 | 327 81 3 0.00000000 4.304000 6.035000 -31.825000 # CG
361 | 328 81 3 0.00000000 4.304000 7.455000 -31.825000 # CG
362 | 329 81 3 0.00000000 5.534000 5.325000 -31.825000 # CG
363 | 330 81 3 0.00000000 5.534000 8.165000 -31.825000 # CG
364 | 331 81 3 0.00000000 6.764000 6.035000 -31.825000 # CG
365 | 332 81 3 0.00000000 6.764000 7.455000 -31.825000 # CG
366 | 333 81 3 0.00000000 7.993000 5.325000 -31.825000 # CG
367 | 334 81 3 0.00000000 7.993000 8.165000 -31.825000 # CG
368 | 335 81 3 0.00000000 9.223000 6.035000 -31.825000 # CG
369 | 336 81 3 0.00000000 9.223000 7.455000 -31.825000 # CG
370 | 337 82 3 0.00000000 0.615000 1.065000 31.825000 # CG
371 | 338 82 3 0.00000000 0.615000 3.905000 31.825000 # CG
372 | 339 82 3 0.00000000 1.845000 1.775000 31.825000 # CG
373 | 340 82 3 0.00000000 1.845000 3.195000 31.825000 # CG
374 | 341 82 3 0.00000000 3.074000 1.065000 31.825000 # CG
375 | 342 82 3 0.00000000 3.074000 3.905000 31.825000 # CG
376 | 343 82 3 0.00000000 4.304000 1.775000 31.825000 # CG
377 | 344 82 3 0.00000000 4.304000 3.195000 31.825000 # CG
378 | 345 82 3 0.00000000 5.534000 1.065000 31.825000 # CG
379 | 346 82 3 0.00000000 5.534000 3.905000 31.825000 # CG
380 | 347 82 3 0.00000000 6.764000 1.775000 31.825000 # CG
381 | 348 82 3 0.00000000 6.764000 3.195000 31.825000 # CG
382 | 349 82 3 0.00000000 7.993000 1.065000 31.825000 # CG
383 | 350 82 3 0.00000000 7.993000 3.905000 31.825000 # CG
384 | 351 82 3 0.00000000 9.223000 1.775000 31.825000 # CG
385 | 352 82 3 0.00000000 9.223000 3.195000 31.825000 # CG
386 | 353 82 3 0.00000000 0.615000 5.325000 31.825000 # CG
387 | 354 82 3 0.00000000 0.615000 8.165000 31.825000 # CG
388 | 355 82 3 0.00000000 1.845000 6.035000 31.825000 # CG
389 | 356 82 3 0.00000000 1.845000 7.455000 31.825000 # CG
390 | 357 82 3 0.00000000 3.074000 5.325000 31.825000 # CG
391 | 358 82 3 0.00000000 3.074000 8.165000 31.825000 # CG
392 | 359 82 3 0.00000000 4.304000 6.035000 31.825000 # CG
393 | 360 82 3 0.00000000 4.304000 7.455000 31.825000 # CG
394 | 361 82 3 0.00000000 5.534000 5.325000 31.825000 # CG
395 | 362 82 3 0.00000000 5.534000 8.165000 31.825000 # CG
396 | 363 82 3 0.00000000 6.764000 6.035000 31.825000 # CG
397 | 364 82 3 0.00000000 6.764000 7.455000 31.825000 # CG
398 | 365 82 3 0.00000000 7.993000 5.325000 31.825000 # CG
399 | 366 82 3 0.00000000 7.993000 8.165000 31.825000 # CG
400 | 367 82 3 0.00000000 9.223000 6.035000 31.825000 # CG
401 | 368 82 3 0.00000000 9.223000 7.455000 31.825000 # CG
402 | 369 82 3 0.00000000 9.223000 0.355000 35.175000 # CG
403 | 370 82 3 0.00000000 9.223000 3.195000 35.175000 # CG
404 | 371 82 3 0.00000000 7.993000 1.065000 35.175000 # CG
405 | 372 82 3 0.00000000 7.993000 2.485000 35.175000 # CG
406 | 373 82 3 0.00000000 6.764000 0.355000 35.175000 # CG
407 | 374 82 3 0.00000000 6.764000 3.195000 35.175000 # CG
408 | 375 82 3 0.00000000 5.534000 1.065000 35.175000 # CG
409 | 376 82 3 0.00000000 5.534000 2.485000 35.175000 # CG
410 | 377 82 3 0.00000000 4.304000 0.355000 35.175000 # CG
411 | 378 82 3 0.00000000 4.304000 3.195000 35.175000 # CG
412 | 379 82 3 0.00000000 3.074000 1.065000 35.175000 # CG
413 | 380 82 3 0.00000000 3.074000 2.485000 35.175000 # CG
414 | 381 82 3 0.00000000 1.845000 0.355000 35.175000 # CG
415 | 382 82 3 0.00000000 1.845000 3.195000 35.175000 # CG
416 | 383 82 3 0.00000000 0.615000 1.065000 35.175000 # CG
417 | 384 82 3 0.00000000 0.615000 2.485000 35.175000 # CG
418 | 385 82 3 0.00000000 9.223000 4.615000 35.175000 # CG
419 | 386 82 3 0.00000000 9.223000 7.455000 35.175000 # CG
420 | 387 82 3 0.00000000 7.993000 5.325000 35.175000 # CG
421 | 388 82 3 0.00000000 7.993000 6.745000 35.175000 # CG
422 | 389 82 3 0.00000000 6.764000 4.615000 35.175000 # CG
423 | 390 82 3 0.00000000 6.764000 7.455000 35.175000 # CG
424 | 391 82 3 0.00000000 5.534000 5.325000 35.175000 # CG
425 | 392 82 3 0.00000000 5.534000 6.745000 35.175000 # CG
426 | 393 82 3 0.00000000 4.304000 4.615000 35.175000 # CG
427 | 394 82 3 0.00000000 4.304000 7.455000 35.175000 # CG
428 | 395 82 3 0.00000000 3.074000 5.325000 35.175000 # CG
429 | 396 82 3 0.00000000 3.074000 6.745000 35.175000 # CG
430 | 397 82 3 0.00000000 1.845000 4.615000 35.175000 # CG
431 | 398 82 3 0.00000000 1.845000 7.455000 35.175000 # CG
432 | 399 82 3 0.00000000 0.615000 5.325000 35.175000 # CG
433 | 400 82 3 0.00000000 0.615000 6.745000 35.175000 # CG
434 | 401 82 3 0.00000000 0.615000 1.065000 38.525000 # CG
435 | 402 82 3 0.00000000 0.615000 3.905000 38.525000 # CG
436 | 403 82 3 0.00000000 1.845000 1.775000 38.525000 # CG
437 | 404 82 3 0.00000000 1.845000 3.195000 38.525000 # CG
438 | 405 82 3 0.00000000 3.074000 1.065000 38.525000 # CG
439 | 406 82 3 0.00000000 3.074000 3.905000 38.525000 # CG
440 | 407 82 3 0.00000000 4.304000 1.775000 38.525000 # CG
441 | 408 82 3 0.00000000 4.304000 3.195000 38.525000 # CG
442 | 409 82 3 0.00000000 5.534000 1.065000 38.525000 # CG
443 | 410 82 3 0.00000000 5.534000 3.905000 38.525000 # CG
444 | 411 82 3 0.00000000 6.764000 1.775000 38.525000 # CG
445 | 412 82 3 0.00000000 6.764000 3.195000 38.525000 # CG
446 | 413 82 3 0.00000000 7.993000 1.065000 38.525000 # CG
447 | 414 82 3 0.00000000 7.993000 3.905000 38.525000 # CG
448 | 415 82 3 0.00000000 9.223000 1.775000 38.525000 # CG
449 | 416 82 3 0.00000000 9.223000 3.195000 38.525000 # CG
450 | 417 82 3 0.00000000 0.615000 5.325000 38.525000 # CG
451 | 418 82 3 0.00000000 0.615000 8.165000 38.525000 # CG
452 | 419 82 3 0.00000000 1.845000 6.035000 38.525000 # CG
453 | 420 82 3 0.00000000 1.845000 7.455000 38.525000 # CG
454 | 421 82 3 0.00000000 3.074000 5.325000 38.525000 # CG
455 | 422 82 3 0.00000000 3.074000 8.165000 38.525000 # CG
456 | 423 82 3 0.00000000 4.304000 6.035000 38.525000 # CG
457 | 424 82 3 0.00000000 4.304000 7.455000 38.525000 # CG
458 | 425 82 3 0.00000000 5.534000 5.325000 38.525000 # CG
459 | 426 82 3 0.00000000 5.534000 8.165000 38.525000 # CG
460 | 427 82 3 0.00000000 6.764000 6.035000 38.525000 # CG
461 | 428 82 3 0.00000000 6.764000 7.455000 38.525000 # CG
462 | 429 82 3 0.00000000 7.993000 5.325000 38.525000 # CG
463 | 430 82 3 0.00000000 7.993000 8.165000 38.525000 # CG
464 | 431 82 3 0.00000000 9.223000 6.035000 38.525000 # CG
465 | 432 82 3 0.00000000 9.223000 7.455000 38.525000 # CG
466 |
467 | Bonds
468 |
469 | 1 2 1 3
470 | 2 1 2 3
471 | 3 2 4 6
472 | 4 1 5 6
473 | 5 2 7 9
474 | 6 1 8 9
475 | 7 2 10 12
476 | 8 1 11 12
477 | 9 2 13 15
478 | 10 1 14 15
479 | 11 2 16 18
480 | 12 1 17 18
481 | 13 2 19 21
482 | 14 1 20 21
483 | 15 2 22 24
484 | 16 1 23 24
485 | 17 2 25 27
486 | 18 1 26 27
487 | 19 2 28 30
488 | 20 1 29 30
489 | 21 2 31 33
490 | 22 1 32 33
491 | 23 2 34 36
492 | 24 1 35 36
493 | 25 2 37 39
494 | 26 1 38 39
495 | 27 2 40 42
496 | 28 1 41 42
497 | 29 2 43 45
498 | 30 1 44 45
499 | 31 2 46 48
500 | 32 1 47 48
501 | 33 2 49 51
502 | 34 1 50 51
503 | 35 2 52 54
504 | 36 1 53 54
505 | 37 2 55 57
506 | 38 1 56 57
507 | 39 2 58 60
508 | 40 1 59 60
509 | 41 2 61 63
510 | 42 1 62 63
511 | 43 2 64 66
512 | 44 1 65 66
513 | 45 2 67 69
514 | 46 1 68 69
515 | 47 2 70 72
516 | 48 1 71 72
517 | 49 2 73 75
518 | 50 1 74 75
519 | 51 2 76 78
520 | 52 1 77 78
521 | 53 2 79 81
522 | 54 1 80 81
523 | 55 2 82 84
524 | 56 1 83 84
525 | 57 2 85 87
526 | 58 1 86 87
527 | 59 2 88 90
528 | 60 1 89 90
529 | 61 2 91 93
530 | 62 1 92 93
531 | 63 2 94 96
532 | 64 1 95 96
533 | 65 2 97 99
534 | 66 1 98 99
535 | 67 2 100 102
536 | 68 1 101 102
537 | 69 2 103 105
538 | 70 1 104 105
539 | 71 2 106 108
540 | 72 1 107 108
541 | 73 2 109 111
542 | 74 1 110 111
543 | 75 2 112 114
544 | 76 1 113 114
545 | 77 2 115 117
546 | 78 1 116 117
547 | 79 2 118 120
548 | 80 1 119 120
549 | 81 2 121 123
550 | 82 1 122 123
551 | 83 2 124 126
552 | 84 1 125 126
553 | 85 2 127 129
554 | 86 1 128 129
555 | 87 2 130 132
556 | 88 1 131 132
557 | 89 2 133 135
558 | 90 1 134 135
559 | 91 2 136 138
560 | 92 1 137 138
561 | 93 2 139 141
562 | 94 1 140 141
563 | 95 2 142 144
564 | 96 1 143 144
565 | 97 2 145 147
566 | 98 1 146 147
567 | 99 2 148 150
568 | 100 1 149 150
569 | 101 2 151 153
570 | 102 1 152 153
571 | 103 2 154 156
572 | 104 1 155 156
573 | 105 2 157 159
574 | 106 1 158 159
575 | 107 2 160 162
576 | 108 1 161 162
577 | 109 2 163 165
578 | 110 1 164 165
579 | 111 2 166 168
580 | 112 1 167 168
581 | 113 2 169 171
582 | 114 1 170 171
583 | 115 2 172 174
584 | 116 1 173 174
585 | 117 2 175 177
586 | 118 1 176 177
587 | 119 2 178 180
588 | 120 1 179 180
589 | 121 2 181 183
590 | 122 1 182 183
591 | 123 2 184 186
592 | 124 1 185 186
593 | 125 2 187 189
594 | 126 1 188 189
595 | 127 2 190 192
596 | 128 1 191 192
597 | 129 2 193 195
598 | 130 1 194 195
599 | 131 2 196 198
600 | 132 1 197 198
601 | 133 2 199 201
602 | 134 1 200 201
603 | 135 2 202 204
604 | 136 1 203 204
605 | 137 2 205 207
606 | 138 1 206 207
607 | 139 2 208 210
608 | 140 1 209 210
609 | 141 2 211 213
610 | 142 1 212 213
611 | 143 2 214 216
612 | 144 1 215 216
613 | 145 2 217 219
614 | 146 1 218 219
615 | 147 2 220 222
616 | 148 1 221 222
617 | 149 2 223 225
618 | 150 1 224 225
619 | 151 2 226 228
620 | 152 1 227 228
621 | 153 2 229 231
622 | 154 1 230 231
623 | 155 2 232 234
624 | 156 1 233 234
625 | 157 2 235 237
626 | 158 1 236 237
627 | 159 2 238 240
628 | 160 1 239 240
629 |
630 | Angles
631 |
632 | 1 1 1 3 2
633 | 2 1 4 6 5
634 | 3 1 7 9 8
635 | 4 1 10 12 11
636 | 5 1 13 15 14
637 | 6 1 16 18 17
638 | 7 1 19 21 20
639 | 8 1 22 24 23
640 | 9 1 25 27 26
641 | 10 1 28 30 29
642 | 11 1 31 33 32
643 | 12 1 34 36 35
644 | 13 1 37 39 38
645 | 14 1 40 42 41
646 | 15 1 43 45 44
647 | 16 1 46 48 47
648 | 17 1 49 51 50
649 | 18 1 52 54 53
650 | 19 1 55 57 56
651 | 20 1 58 60 59
652 | 21 1 61 63 62
653 | 22 1 64 66 65
654 | 23 1 67 69 68
655 | 24 1 70 72 71
656 | 25 1 73 75 74
657 | 26 1 76 78 77
658 | 27 1 79 81 80
659 | 28 1 82 84 83
660 | 29 1 85 87 86
661 | 30 1 88 90 89
662 | 31 1 91 93 92
663 | 32 1 94 96 95
664 | 33 1 97 99 98
665 | 34 1 100 102 101
666 | 35 1 103 105 104
667 | 36 1 106 108 107
668 | 37 1 109 111 110
669 | 38 1 112 114 113
670 | 39 1 115 117 116
671 | 40 1 118 120 119
672 | 41 1 121 123 122
673 | 42 1 124 126 125
674 | 43 1 127 129 128
675 | 44 1 130 132 131
676 | 45 1 133 135 134
677 | 46 1 136 138 137
678 | 47 1 139 141 140
679 | 48 1 142 144 143
680 | 49 1 145 147 146
681 | 50 1 148 150 149
682 | 51 1 151 153 152
683 | 52 1 154 156 155
684 | 53 1 157 159 158
685 | 54 1 160 162 161
686 | 55 1 163 165 164
687 | 56 1 166 168 167
688 | 57 1 169 171 170
689 | 58 1 172 174 173
690 | 59 1 175 177 176
691 | 60 1 178 180 179
692 | 61 1 181 183 182
693 | 62 1 184 186 185
694 | 63 1 187 189 188
695 | 64 1 190 192 191
696 | 65 1 193 195 194
697 | 66 1 196 198 197
698 | 67 1 199 201 200
699 | 68 1 202 204 203
700 | 69 1 205 207 206
701 | 70 1 208 210 209
702 | 71 1 211 213 212
703 | 72 1 214 216 215
704 | 73 1 217 219 218
705 | 74 1 220 222 221
706 | 75 1 223 225 224
707 | 76 1 226 228 227
708 | 77 1 229 231 230
709 | 78 1 232 234 233
710 | 79 1 235 237 236
711 | 80 1 238 240 239
712 |
713 |
--------------------------------------------------------------------------------
/example_input:
--------------------------------------------------------------------------------
1 | units real
2 | dimension 3
3 | newton off
4 | #processors * * *
5 | boundary p p f
6 | atom_style full
7 |
8 | ##force field
9 | pair_style lj/cut/coul/long 4.0
10 | bond_style harmonic
11 | angle_style harmonic
12 | kspace_style pppm 1.0e-6
13 | kspace_modify slab 3.0
14 |
15 | ##atom definition
16 | read_data example_datafile
17 | pair_coeff 1 1 0.09935850 3.40000000 # CAB CAB
18 | pair_coeff 1 2 0.19419428 3.50000000 # CAB CAC
19 | pair_coeff 1 3 0.07390356 3.38500000 # CAB CG
20 | pair_coeff 1 4 0.09935850 3.35000000 # CAB NAA
21 | pair_coeff 2 2 0.37954900 3.60000000 # CAC CAC
22 | pair_coeff 2 3 0.14444310 3.48500000 # CAC CG
23 | pair_coeff 2 4 0.19419428 3.45000000 # CAC NAA
24 | pair_coeff 3 3 0.05497000 3.37000000 # CG CG
25 | pair_coeff 3 4 0.07390356 3.33500000 # CG NAA
26 | pair_coeff 4 4 0.09935850 3.30000000 # NAA NAA
27 |
28 | ##setting
29 | neighbor 2 bin
30 | group ele type 3
31 | group sol type 1 2 4
32 | thermo_style multi
33 | thermo 1000
34 | restart 100000 restart
35 | dump 1 ele custom 500 ele id q
36 | dump_modify 1 sort id
37 | dump 2 all dcd 500 lmp.dcd
38 | ##run
39 | run_style verlet
40 | timestep 1
41 | velocity ele set 0.0 0.0 0.0
42 | fix 0 ele setforce 0.0 0.0 0.0
43 | fix e all conp 1 1.979 81 82 -0.5 0.5 inv iter
44 | fix 1 sol nvt temp 298.0 298.0 100.0
45 | run 500000
46 |
--------------------------------------------------------------------------------
/fix_conp.cpp:
--------------------------------------------------------------------------------
1 | /* ---------------------------------------------------------------------
2 | LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
3 | http://lammps.sandia.gov, Sandia National Laboratories
4 | Steve Plimpton, sjplimp@sandia.gov
5 |
6 | Copyright (2003) Sandia Corporation. Under the terms of Contract
7 | DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
8 | certain rights in this software. This software is distributed under
9 | the GNU General Public License.
10 |
11 | See the README file in the top-level LAMMPS directory.
12 | ------------------------------------------------------------------------- */
13 |
14 | /* ----------------------------------------------------------------------
15 | Version: Sep/22/2014
16 | Zhenxing Wang(KU)
17 | ------------------------------------------------------------------------- */
18 |
19 | #include "math.h"
20 | #include "string.h"
21 | #include "stdlib.h"
22 | #include "stddef.h"
23 | #include "fix_conp.h"
24 | #include "atom.h"
25 | #include "update.h"
26 | #include "modify.h"
27 | #include "force.h"
28 | #include "respa.h"
29 | #include "input.h"
30 | #include "variable.h"
31 | #include "memory.h"
32 | #include "error.h"
33 | #include "compute.h"
34 |
35 | #include "pair.h"
36 | #include "kspace.h"
37 | #include "comm.h"
38 | #include "mpi.h"
39 | #include "math_const.h"
40 | #include "neigh_list.h"
41 | #include "domain.h"
42 | #include "iostream"
43 |
44 | #define EWALD_F 1.12837917
45 | #define EWALD_P 0.3275911
46 | #define A1 0.254829592
47 | #define A2 -0.284496736
48 | #define A3 1.421413741
49 | #define A4 -1.453152027
50 | #define A5 1.061405429
51 |
52 | using namespace LAMMPS_NS;
53 | using namespace FixConst;
54 | using namespace MathConst;
55 |
56 | enum{CONSTANT,EQUAL,ATOM};
57 |
58 | extern "C" {
59 | void dgetrf_(const int *M,const int *N,double *A,const int *lda,int *ipiv,int *info);
60 | void dgetri_(const int *N,double *A,const int *lda,const int *ipiv,double *work,const int *lwork,int *info);
61 | }
62 | /* ---------------------------------------------------------------------- */
63 |
64 | FixConp::FixConp(LAMMPS *lmp, int narg, char **arg) :
65 | Fix(lmp, narg, arg)
66 | {
67 | if (narg < 11) error->all(FLERR,"Illegal fix conp command");
68 | maxiter = 100;
69 | tolerance = 0.000001;
70 | everynum = utils->numeric(FLERR,arg[3],false,lmp);
71 | eta = utils->numeric(FLERR,arg[4],false,lmp);
72 | molidL = utils->inumeric(FLERR,arg[5],false,lmp);
73 | molidR = utils->inumeric(FLERR,arg[6],false,lmp);
74 | vL = utils->numeric(FLERR,arg[7],false,lmp);
75 | vR = utils->numeric(FLERR,arg[8],false,lmp);
76 | if (strcmp(arg[9],"cg") == 0) {
77 | minimizer = 0;
78 | } else if (strcmp(arg[9],"inv") == 0) {
79 | minimizer = 1;
80 | } else error->all(FLERR,"Unknown minimization method");
81 |
82 | outf = fopen(arg[10],"w");
83 | if (narg == 12) {
84 | outa = NULL;
85 | a_matrix_fp = fopen(arg[11],"r");
86 | if (a_matrix_fp == NULL) error->all(FLERR,"Cannot open A matrix file");
87 | if (strcmp(arg[11],"org") == 0) {
88 | a_matrix_f = 1;
89 | } else if (strcmp(arg[11],"inv") == 0) {
90 | a_matrix_f = 2;
91 | } else {
92 | error->all(FLERR,"Unknown A matrix type");
93 | }
94 | } else {
95 | a_matrix_f = 0;
96 | }
97 | elenum = elenum_old = 0;
98 | csk = snk = NULL;
99 | aaa_all = NULL;
100 | bbb_all = NULL;
101 | tag2eleall = eleall2tag = curr_tag2eleall = ele2tag = NULL;
102 | Btime = cgtime = Ctime = Ktime = 0;
103 | runstage = 0; //after operation
104 | //0:init; 1: a_cal; 2: first sin/cos cal; 3: inv only, aaa inverse
105 | }
106 |
107 | /* ---------------------------------------------------------------------- */
108 |
109 | FixConp::~FixConp()
110 | {
111 | fclose(outf);
112 | memory->destroy3d_offset(cs,-kmax_created);
113 | memory->destroy3d_offset(sn,-kmax_created);
114 | delete [] aaa_all;
115 | delete [] bbb_all;
116 | delete [] curr_tag2eleall;
117 | delete [] tag2eleall;
118 | delete [] eleall2tag;
119 | delete [] ele2tag;
120 | delete [] kxvecs;
121 | delete [] kyvecs;
122 | delete [] kzvecs;
123 | delete [] ug;
124 | delete [] sfacrl;
125 | delete [] sfacim;
126 | delete [] sfacrl_all;
127 | delete [] sfacim_all;
128 | }
129 |
130 | /* ---------------------------------------------------------------------- */
131 |
132 | int FixConp::setmask()
133 | {
134 | int mask = 0;
135 | mask |= PRE_FORCE;
136 | return mask;
137 | }
138 |
139 | /* ---------------------------------------------------------------------- */
140 |
141 | void FixConp::init()
142 | {
143 | MPI_Comm_rank(world,&me);
144 | }
145 |
146 | /* ---------------------------------------------------------------------- */
147 |
148 | void FixConp::setup(int vflag)
149 | {
150 | g_ewald = force->kspace->g_ewald;
151 | slab_volfactor = force->kspace->slab_volfactor;
152 | double accuracy = force->kspace->accuracy;
153 |
154 | int i;
155 | double qsqsum = 0.0;
156 | for (i = 0; i < atom->nlocal; i++) {
157 | qsqsum += atom->q[i]*atom->q[i];
158 | }
159 | double tmp,q2;
160 | MPI_Allreduce(&qsqsum,&tmp,1,MPI_DOUBLE,MPI_SUM,world);
161 | qsqsum = tmp;
162 | q2 = qsqsum * force->qqrd2e / force->dielectric;
163 |
164 | // Copied from ewald.cpp
165 | double xprd = domain->xprd;
166 | double yprd = domain->yprd;
167 | double zprd = domain->zprd;
168 | double zprd_slab = zprd*slab_volfactor;
169 | volume = xprd * yprd * zprd_slab;
170 |
171 | unitk[0] = 2.0*MY_PI/xprd;
172 | unitk[1] = 2.0*MY_PI/yprd;
173 | unitk[2] = 2.0*MY_PI/zprd_slab;
174 |
175 | bigint natoms = atom->natoms;
176 | double err;
177 | kxmax = 1;
178 | kymax = 1;
179 | kzmax = 1;
180 |
181 | err = rms(kxmax,xprd,natoms,q2);
182 | while (err > accuracy) {
183 | kxmax++;
184 | err = rms(kxmax,xprd,natoms,q2);
185 | }
186 |
187 | err = rms(kymax,yprd,natoms,q2);
188 | while (err > accuracy) {
189 | kymax++;
190 | err = rms(kymax,yprd,natoms,q2);
191 | }
192 |
193 | err = rms(kzmax,zprd_slab,natoms,q2);
194 | while (err > accuracy) {
195 | kzmax++;
196 | err = rms(kzmax,zprd_slab,natoms,q2);
197 | }
198 |
199 | kmax = MAX(kxmax,kymax);
200 | kmax = MAX(kmax,kzmax);
201 | kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax;
202 |
203 | kxvecs = new int[kmax3d];
204 | kyvecs = new int[kmax3d];
205 | kzvecs = new int[kmax3d];
206 | ug = new double[kmax3d];
207 |
208 | double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax;
209 | double gsqymx = unitk[1]*unitk[1]*kymax*kymax;
210 | double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax;
211 | gsqmx = MAX(gsqxmx,gsqymx);
212 | gsqmx = MAX(gsqmx,gsqzmx);
213 |
214 | gsqmx *= 1.00001;
215 |
216 | coeffs();
217 | kmax_created = kmax;
218 |
219 | //copied from ewald.cpp end
220 |
221 | int nmax = atom->nmax;
222 | double evscale = 0.069447;
223 | vL *= evscale;
224 | vR *= evscale;
225 |
226 | memory->create3d_offset(cs,-kmax,kmax,3,nmax,"fixconp:cs");
227 | memory->create3d_offset(sn,-kmax,kmax,3,nmax,"fixconp:sn");
228 | sfacrl = new double[kmax3d];
229 | sfacim = new double[kmax3d];
230 | sfacrl_all = new double[kmax3d];
231 | sfacim_all = new double[kmax3d];
232 | tag2eleall = new int[natoms+1];
233 | curr_tag2eleall = new int[natoms+1];
234 | if (runstage == 0) {
235 | int i;
236 | int nlocal = atom->nlocal;
237 | for ( i = 0; i < nlocal; i++) {
238 | if (electrode_check(i)) ++elenum;
239 | }
240 | MPI_Allreduce(&elenum,&elenum_all,1,MPI_INT,MPI_SUM,world);
241 |
242 | eleall2tag = new int[elenum_all];
243 | aaa_all = new double[elenum_all*elenum_all];
244 | bbb_all = new double[elenum_all];
245 | ele2tag = new int[elenum];
246 | for (i = 0; i < natoms+1; i++) tag2eleall[i] = -1;
247 | for (i = 0; i < natoms+1; i++) curr_tag2eleall[i] = -1;
248 | if (minimizer == 0) {
249 | eleallq = new double [elenum_all];
250 | }
251 | if (a_matrix_f == 0) {
252 | if (me == 0) outa = fopen("amatrix","w");
253 | a_cal();
254 | } else {
255 | a_read();
256 | }
257 | runstage = 1;
258 | }
259 |
260 | }
261 |
262 | /* ---------------------------------------------------------------------- */
263 |
264 | void FixConp::pre_force(int vflag)
265 | {
266 | if(update->ntimestep % everynum == 0) {
267 | if (strstr(update->integrate_style,"verlet")) { //not respa
268 | Btime1 = MPI_Wtime();
269 | b_cal();
270 | Btime2 = MPI_Wtime();
271 | Btime += Btime2-Btime1;
272 | if (update->laststep == update->ntimestep) {
273 | double Btime_all;
274 | MPI_Reduce(&Btime,&Btime_all,1,MPI_DOUBLE,MPI_SUM,0,world);
275 | double Ctime_all;
276 | MPI_Reduce(&Ctime,&Ctime_all,1,MPI_DOUBLE,MPI_SUM,0,world);
277 | double Ktime_all;
278 | MPI_Reduce(&Ktime,&Ktime_all,1,MPI_DOUBLE,MPI_SUM,0,world);
279 | if (me == 0) {
280 | Btime = Btime_all/comm->nprocs;
281 | Ctime = Ctime_all/comm->nprocs;
282 | Ktime = Ktime_all/comm->nprocs;
283 | fprintf(outf,"B vector calculation time = %g\n",Btime);
284 | fprintf(outf,"Coulomb calculation time = %g\n",Ctime);
285 | fprintf(outf,"Kspace calculation time = %g\n",Ktime);
286 | }
287 | }
288 | }
289 | equation_solve();
290 | update_charge();
291 | }
292 | force_cal(vflag);
293 | }
294 |
295 | /* ---------------------------------------------------------------------- */
296 |
297 | int FixConp::electrode_check(int atomid)
298 | {
299 | int *molid = atom->molecule;
300 | if (molid[atomid] == molidL) return 1;
301 | else if (molid[atomid] == molidR) return -1;
302 | else return 0;
303 | }
304 |
305 | /* ----------------------------------------------------------------------*/
306 |
307 | void FixConp::b_cal()
308 | {
309 | Ktime1 = MPI_Wtime();
310 | int i,j,k;
311 | int nmax = atom->nmax;
312 | if (atom->nlocal > nmax) {
313 | memory->destroy3d_offset(cs,-kmax_created);
314 | memory->destroy3d_offset(sn,-kmax_created);
315 | nmax = atom->nmax;
316 | kmax_created = kmax;
317 | }
318 | sincos_b();
319 | MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world);
320 | MPI_Allreduce(sfacim,sfacim_all,kcount,MPI_DOUBLE,MPI_SUM,world);
321 | double **x = atom->x;
322 | double *q = atom->q;
323 | int *tag = atom->tag;
324 | int nlocal = atom->nlocal;
325 | int kx,ky,kz;
326 | double cypz,sypz,exprl,expim,kspacetmp;
327 | elenum = 0;
328 | for (i = 0; i < nlocal; i++) {
329 | if(electrode_check(i)) elenum++;
330 | }
331 | double bbb[elenum];
332 | j = 0;
333 | for (i = 0; i < nlocal; i++) {
334 | if (electrode_check(i) == 1) {
335 | bbb[j] = vL;
336 | j++;
337 | }
338 | if (electrode_check(i) == -1) {
339 | bbb[j] = vR;
340 | j++;
341 | }
342 | }
343 | for (k = 0; k < kcount; k++) {
344 | kx = kxvecs[k];
345 | ky = kyvecs[k];
346 | kz = kzvecs[k];
347 | j = 0;
348 | for (i = 0; i < nlocal; i++) {
349 | if (electrode_check(i)) {
350 | cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i];
351 | sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i];
352 | exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz;
353 | expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz;
354 | bbb[j] -= 2.0*ug[k]*(exprl*sfacrl_all[k]+expim*sfacim_all[k]);
355 | j++;
356 | }
357 | }
358 | }
359 |
360 | //elenum_list and displs for gathering ele tag list and bbb
361 | int nprocs = comm->nprocs;
362 | int elenum_list[nprocs];
363 | MPI_Allgather(&elenum,1,MPI_INT,elenum_list,1,MPI_INT,world);
364 | int displs[nprocs];
365 | displs[0] = 0;
366 | int displssum = 0;
367 | for (i = 1; i < nprocs; ++i) {
368 | displssum += elenum_list[i-1];
369 | displs[i] = displssum;
370 | }
371 |
372 | //slabcorrection and create ele tag list in current timestep
373 | double slabcorrtmp = 0.0;
374 | double slabcorrtmp_all = 0.0;
375 | for (i = 0; i < nlocal; i++) {
376 | if (electrode_check(i) == 0) {
377 | slabcorrtmp += 4*q[i]*MY_PI*x[i][2]/volume;
378 | }
379 | }
380 | MPI_Allreduce(&slabcorrtmp,&slabcorrtmp_all,1,MPI_DOUBLE,MPI_SUM,world);
381 | j = 0;
382 | for (i = 0; i < nlocal; i++) {
383 | if (electrode_check(i)) {
384 | bbb[j] -= x[i][2]*slabcorrtmp_all;
385 | ele2tag[j] = tag[i];
386 | j++;
387 | }
388 | }
389 | Ktime2 = MPI_Wtime();
390 | Ktime += Ktime2-Ktime1;
391 |
392 | coul_cal(1,bbb,ele2tag);
393 |
394 |
395 |
396 | //gather ele tag list
397 | int ele_taglist_all[elenum_all];
398 | int tagi;
399 | MPI_Allgatherv(ele2tag,elenum,MPI_INT,&ele_taglist_all,elenum_list,displs,MPI_INT,world);
400 | for (i = 0; i < elenum_all; i++) {
401 | tagi = ele_taglist_all[i];
402 | curr_tag2eleall[tagi] = i;
403 | }
404 |
405 | //gather b to bbb_all and sort in the same order as aaa_all
406 | double bbb_buf[elenum_all];
407 | MPI_Allgatherv(&bbb,elenum,MPI_DOUBLE,&bbb_buf,elenum_list,displs,MPI_DOUBLE,world);
408 | int elei;
409 | for (i = 0; i < elenum_all; i++) {
410 | tagi = eleall2tag[i];
411 | elei = curr_tag2eleall[tagi];
412 | bbb_all[i] = bbb_buf[elei];
413 | }
414 | }
415 |
416 | /*----------------------------------------------------------------------- */
417 | void FixConp::equation_solve()
418 | {
419 | //solve equations
420 | if (minimizer == 0) {
421 | cgtime1 = MPI_Wtime();
422 | cg();
423 | cgtime2 = MPI_Wtime();
424 | cgtime += cgtime2-cgtime1;
425 | if (update->laststep == update->ntimestep) {
426 | double cgtime_all;
427 | MPI_Reduce(&cgtime,&cgtime_all,1,MPI_DOUBLE,MPI_SUM,0,world);
428 | if (me == 0) {
429 | cgtime = cgtime_all/comm->nprocs;
430 | if (screen) fprintf(screen,"conjugate gradient solver time = %g\n",cgtime);
431 | if (logfile) fprintf(logfile,"conjugate gradient solver time = %g\n",cgtime);
432 | }
433 | }
434 | } else if (minimizer == 1) {
435 | inv();
436 | }
437 | }
438 |
439 | /*----------------------------------------------------------------------- */
440 | void FixConp::a_read()
441 | {
442 | int i = 0;
443 | int idx1d;
444 | if (me == 0) {
445 | int maxchar = 21*elenum_all+1;
446 | char line[maxchar];
447 | char *word;
448 | while(fgets(line,maxchar,a_matrix_fp) != NULL) {
449 | word = strtok(line," \t");
450 | while(word != NULL) {
451 | if (i < elenum_all) {
452 | eleall2tag[i] = atoi(word);
453 | } else {
454 | idx1d = i-elenum_all;
455 | aaa_all[idx1d] = atof(word);
456 | }
457 | word = strtok(NULL," \t");
458 | i++;
459 | }
460 | }
461 | fclose(a_matrix_fp);
462 | }
463 | MPI_Bcast(eleall2tag,elenum_all,MPI_INT,0,world);
464 | MPI_Bcast(aaa_all,elenum_all*elenum_all,MPI_DOUBLE,0,world);
465 |
466 | int tagi;
467 | for (i = 0; i < elenum_all; i++) {
468 | tagi = eleall2tag[i];
469 | tag2eleall[tagi] = i;
470 | }
471 | }
472 |
473 | /*----------------------------------------------------------------------- */
474 | void FixConp::a_cal()
475 | {
476 | double t1,t2;
477 | t1 = MPI_Wtime();
478 | Ktime1 = MPI_Wtime();
479 | if (me == 0) {
480 | fprintf(outf,"A matrix calculating ...\n");
481 | }
482 |
483 | double **eleallx = NULL;
484 | memory->create(eleallx,elenum_all,3,"fixconp:eleallx");
485 |
486 | int nprocs = comm->nprocs;
487 | int nlocal = atom->nlocal;
488 | int *tag = atom->tag;
489 | int i,j,k;
490 | int elenum_list[nprocs];
491 | MPI_Allgather(&elenum,1,MPI_INT,elenum_list,1,MPI_INT,world);
492 | int displs[nprocs];
493 | displs[0] = 0;
494 | int displssum = 0;
495 | for (i = 1; i < nprocs; ++i) {
496 | displssum += elenum_list[i-1];
497 | displs[i] = displssum;
498 | }
499 | j = 0;
500 | for (i = 0; i < nlocal; i++) {
501 | if (electrode_check(i)) {
502 | ele2tag[j] = tag[i];
503 | j++;
504 | }
505 | }
506 |
507 | //gather tag,x and q
508 | double **x = atom->x;
509 |
510 | double *elexyzlist = new double[3*elenum];
511 | double *elexyzlist_all = new double[3*elenum_all];
512 | j = 0;
513 | for (i = 0; i < nlocal; i++) {
514 | if (electrode_check(i)) {
515 | elexyzlist[j] = x[i][0];
516 | j++;
517 | elexyzlist[j] = x[i][1];
518 | j++;
519 | elexyzlist[j] = x[i][2];
520 | j++;
521 | }
522 | }
523 | MPI_Allgatherv(ele2tag,elenum,MPI_INT,eleall2tag,elenum_list,displs,MPI_INT,world);
524 | int displs2[nprocs];
525 | int elenum_list2[nprocs];
526 | for (i = 0; i < nprocs; i++) {
527 | elenum_list2[i] = elenum_list[i]*3;
528 | displs2[i] = displs[i]*3;
529 | }
530 | MPI_Allgatherv(elexyzlist,elenum*3,MPI_DOUBLE,elexyzlist_all,elenum_list2,displs2,MPI_DOUBLE,world);
531 |
532 | double *aaa = new double[elenum*elenum_all];
533 | for (i = 0; i < elenum*elenum_all; i++) {
534 | aaa[i] = 0.0;
535 | }
536 | j = 0;
537 | for (i = 0; i < elenum_all; i++) {
538 | if (i == 0 && me == 0) fprintf(outa," ");
539 | if (me == 0) fprintf (outa,"%20d",eleall2tag[i]);
540 | tag2eleall[eleall2tag[i]] = i;
541 | eleallx[i][0] = elexyzlist_all[j];
542 | j++;
543 | eleallx[i][1] = elexyzlist_all[j];
544 | j++;
545 | eleallx[i][2] = elexyzlist_all[j];
546 | j++;
547 | }
548 | if (me == 0) fprintf (outa,"\n");
549 |
550 |
551 | memory->create(csk,kcount,elenum_all,"fixconp:csk");
552 | memory->create(snk,kcount,elenum_all,"fixconp:snk");
553 | sincos_a(eleallx);
554 | delete [] elexyzlist;
555 | delete [] elexyzlist_all;
556 |
557 | int elealli,elei,idx1d;
558 | double zi;
559 | double CON_4PIoverV = MY_4PI/volume;
560 | double CON_s2overPIS = sqrt(2.0)/MY_PIS;
561 | double CON_2overPIS = 2.0/MY_PIS;
562 | for (i = 0; i < nlocal; ++i) {
563 | zi = x[i][2];
564 | if (electrode_check(i)) {
565 | elealli = tag2eleall[tag[i]];
566 | for (k = 0; k < elenum; ++k) {
567 | if (ele2tag[k] == tag[i]) {
568 | elei = k;
569 | break;
570 | }
571 | }
572 | for (j = 0; j < elenum_all; ++j) {
573 | idx1d = elei*elenum_all+j;
574 | for (k = 0; k < kcount; ++k) {
575 | aaa[idx1d] += 2.0*ug[k]*(csk[k][elealli]*csk[k][j]+snk[k][elealli]*snk[k][j]);
576 | }
577 | aaa[idx1d] += CON_4PIoverV*zi*eleallx[j][2];
578 | }
579 | idx1d = elei*elenum_all+elealli;
580 | aaa[idx1d] += CON_s2overPIS*eta-CON_2overPIS*g_ewald; //gaussian self correction
581 | }
582 | }
583 |
584 | memory->destroy(eleallx);
585 | memory->destroy(csk);
586 | memory->destroy(snk);
587 |
588 | coul_cal(2,aaa,ele2tag);
589 |
590 | int elenum_list3[nprocs];
591 | int displs3[nprocs];
592 | for (i = 0; i < nprocs; i++) {
593 | elenum_list3[i] = elenum_list[i]*elenum_all;
594 | displs3[i] = displs[i]*elenum_all;
595 | }
596 | MPI_Allgatherv(aaa,elenum*elenum_all,MPI_DOUBLE,aaa_all,elenum_list3,displs3,MPI_DOUBLE,world);
597 | delete [] aaa;
598 | aaa = NULL;
599 | for (i = 0; i < elenum_all; ++i) {
600 | for (j = 0; j < elenum_all; ++j) {
601 | idx1d = i*elenum_all+j;
602 | if (j != 0 && me == 0) fprintf(outa," ");
603 | if (me == 0) fprintf (outa,"%20.12f",aaa_all[idx1d]);
604 | }
605 | if (me == 0) fprintf (outa,"\n");
606 | }
607 | if(me == 0) fclose(outa);
608 |
609 | t2 = MPI_Wtime();
610 | double tsum = t2 - t1;
611 | double tsum_all;
612 | MPI_Allreduce(&tsum,&tsum_all,1,MPI_DOUBLE,MPI_SUM,world);
613 | if (me == 0) {
614 | tsum = tsum_all/nprocs;
615 | fprintf(outf,"A matrix calculation time = %g\n",tsum);
616 | }
617 | Ktime2 = MPI_Wtime();
618 | Ktime += Ktime2-Ktime1;
619 | }
620 | /*--------------------------------------------------------------*/
621 |
622 | void FixConp::sincos_a(double **eleallx)
623 | {
624 | int i,m,k,ic;
625 | int kx,ky,kz;
626 | double ***csele,***snele;
627 | memory->create3d_offset(csele,-kmax,kmax,3,elenum_all,"fixconp:csele");
628 | memory->create3d_offset(snele,-kmax,kmax,3,elenum_all,"fixconp:snele");
629 | double sqk,cypz,sypz;
630 | for (ic = 0; ic < 3; ic++) {
631 | sqk = unitk[ic]*unitk[ic];
632 | if (sqk <= gsqmx) {
633 | for (i = 0; i < elenum_all; i++) {
634 | csele[0][ic][i] = 1.0;
635 | snele[0][ic][i] = 0.0;
636 | csele[1][ic][i] = cos(unitk[ic]*eleallx[i][ic]);
637 | snele[1][ic][i] = sin(unitk[ic]*eleallx[i][ic]);
638 | csele[-1][ic][i] = csele[1][ic][i];
639 | snele[-1][ic][i] = -snele[1][ic][i];
640 | }
641 | }
642 | }
643 |
644 | for (m = 2; m <= kmax; m++) {
645 | for (ic = 0; ic < 3; ic++) {
646 | sqk = m*unitk[ic] * m*unitk[ic];
647 | if (sqk <= gsqmx) {
648 | for (i = 0; i < elenum_all; i++) {
649 | csele[m][ic][i] = csele[m-1][ic][i]*csele[1][ic][i] -
650 | snele[m-1][ic][i]*snele[1][ic][i];
651 | snele[m][ic][i] = snele[m-1][ic][i]*csele[1][ic][i] +
652 | csele[m-1][ic][i]*snele[1][ic][i];
653 | csele[-m][ic][i] = csele[m][ic][i];
654 | snele[-m][ic][i] = -snele[m][ic][i];
655 | }
656 | }
657 | }
658 | }
659 | for (k = 0; k < kcount; ++k) {
660 | kx = kxvecs[k];
661 | ky = kyvecs[k];
662 | kz = kzvecs[k];
663 | for (i = 0; i < elenum_all; ++i) {
664 | cypz = csele[ky][1][i]*csele[kz][2][i] - snele[ky][1][i]*snele[kz][2][i];
665 | sypz = snele[ky][1][i]*csele[kz][2][i] + csele[ky][1][i]*snele[kz][2][i];
666 | csk[k][i] = csele[kx][0][i]*cypz - snele[kx][0][i]*sypz;
667 | snk[k][i] = snele[kx][0][i]*cypz + csele[kx][0][i]*sypz;
668 | }
669 | }
670 | memory->destroy3d_offset(csele,-kmax_created);
671 | memory->destroy3d_offset(snele,-kmax_created);
672 | }
673 |
674 | /*--------------------------------------------------------------*/
675 | void FixConp::sincos_b()
676 | {
677 | int i,k,l,m,n,ic;
678 | double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4;
679 | double sqk,clpm,slpm;
680 |
681 | double **x = atom->x;
682 | double *q = atom->q;
683 | int nlocal = atom->nlocal;
684 |
685 | n = 0;
686 |
687 | // (k,0,0), (0,l,0), (0,0,m)
688 |
689 | for (ic = 0; ic < 3; ic++) {
690 | sqk = unitk[ic]*unitk[ic];
691 | if (sqk <= gsqmx) {
692 | cstr1 = 0.0;
693 | sstr1 = 0.0;
694 | for (i = 0; i < nlocal; i++) {
695 | cs[0][ic][i] = 1.0;
696 | sn[0][ic][i] = 0.0;
697 | cs[1][ic][i] = cos(unitk[ic]*x[i][ic]);
698 | sn[1][ic][i] = sin(unitk[ic]*x[i][ic]);
699 | cs[-1][ic][i] = cs[1][ic][i];
700 | sn[-1][ic][i] = -sn[1][ic][i];
701 | if (electrode_check(i) == 0) {
702 | cstr1 += q[i]*cs[1][ic][i];
703 | sstr1 += q[i]*sn[1][ic][i];
704 | }
705 | }
706 | sfacrl[n] = cstr1;
707 | sfacim[n++] = sstr1;
708 | }
709 | }
710 | for (m = 2; m <= kmax; m++) {
711 | for (ic = 0; ic < 3; ic++) {
712 | sqk = m*unitk[ic] * m*unitk[ic];
713 | if (sqk <= gsqmx) {
714 | cstr1 = 0.0;
715 | sstr1 = 0.0;
716 | for (i = 0; i < nlocal; i++) {
717 | cs[m][ic][i] = cs[m-1][ic][i]*cs[1][ic][i] -
718 | sn[m-1][ic][i]*sn[1][ic][i];
719 | sn[m][ic][i] = sn[m-1][ic][i]*cs[1][ic][i] +
720 | cs[m-1][ic][i]*sn[1][ic][i];
721 | cs[-m][ic][i] = cs[m][ic][i];
722 | sn[-m][ic][i] = -sn[m][ic][i];
723 | if (electrode_check(i) == 0) {
724 | cstr1 += q[i]*cs[m][ic][i];
725 | sstr1 += q[i]*sn[m][ic][i];
726 | }
727 | }
728 | sfacrl[n] = cstr1;
729 | sfacim[n++] = sstr1;
730 | }
731 | }
732 | }
733 |
734 | // 1 = (k,l,0), 2 = (k,-l,0)
735 | for (k = 1; k <= kxmax; k++) {
736 | for (l = 1; l <= kymax; l++) {
737 | sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]);
738 | if (sqk <= gsqmx) {
739 | cstr1 = 0.0;
740 | sstr1 = 0.0;
741 | cstr2 = 0.0;
742 | sstr2 = 0.0;
743 | for (i = 0; i < nlocal; i++) {
744 | if (electrode_check(i) == 0) {
745 | cstr1 += q[i]*(cs[k][0][i]*cs[l][1][i] - sn[k][0][i]*sn[l][1][i]);
746 | sstr1 += q[i]*(sn[k][0][i]*cs[l][1][i] + cs[k][0][i]*sn[l][1][i]);
747 | cstr2 += q[i]*(cs[k][0][i]*cs[l][1][i] + sn[k][0][i]*sn[l][1][i]);
748 | sstr2 += q[i]*(sn[k][0][i]*cs[l][1][i] - cs[k][0][i]*sn[l][1][i]);
749 | }
750 | }
751 | sfacrl[n] = cstr1;
752 | sfacim[n++] = sstr1;
753 | sfacrl[n] = cstr2;
754 | sfacim[n++] = sstr2;
755 | }
756 | }
757 | }
758 |
759 | // 1 = (0,l,m), 2 = (0,l,-m)
760 |
761 | for (l = 1; l <= kymax; l++) {
762 | for (m = 1; m <= kzmax; m++) {
763 | sqk = (l*unitk[1] * l*unitk[1]) + (m*unitk[2] * m*unitk[2]);
764 | if (sqk <= gsqmx) {
765 | cstr1 = 0.0;
766 | sstr1 = 0.0;
767 | cstr2 = 0.0;
768 | sstr2 = 0.0;
769 | for (i = 0; i < nlocal; i++) {
770 | if (electrode_check(i) == 0) {
771 | cstr1 += q[i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]);
772 | sstr1 += q[i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]);
773 | cstr2 += q[i]*(cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]);
774 | sstr2 += q[i]*(sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]);
775 | }
776 | }
777 | sfacrl[n] = cstr1;
778 | sfacim[n++] = sstr1;
779 | sfacrl[n] = cstr2;
780 | sfacim[n++] = sstr2;
781 | }
782 | }
783 | }
784 |
785 | // 1 = (k,0,m), 2 = (k,0,-m)
786 |
787 | for (k = 1; k <= kxmax; k++) {
788 | for (m = 1; m <= kzmax; m++) {
789 | sqk = (k*unitk[0] * k*unitk[0]) + (m*unitk[2] * m*unitk[2]);
790 | if (sqk <= gsqmx) {
791 | cstr1 = 0.0;
792 | sstr1 = 0.0;
793 | cstr2 = 0.0;
794 | sstr2 = 0.0;
795 | for (i = 0; i < nlocal; i++) {
796 | if (electrode_check(i) == 0) {
797 | cstr1 += q[i]*(cs[k][0][i]*cs[m][2][i] - sn[k][0][i]*sn[m][2][i]);
798 | sstr1 += q[i]*(sn[k][0][i]*cs[m][2][i] + cs[k][0][i]*sn[m][2][i]);
799 | cstr2 += q[i]*(cs[k][0][i]*cs[m][2][i] + sn[k][0][i]*sn[m][2][i]);
800 | sstr2 += q[i]*(sn[k][0][i]*cs[m][2][i] - cs[k][0][i]*sn[m][2][i]);
801 | }
802 | }
803 | sfacrl[n] = cstr1;
804 | sfacim[n++] = sstr1;
805 | sfacrl[n] = cstr2;
806 | sfacim[n++] = sstr2;
807 | }
808 | }
809 | }
810 |
811 | // 1 = (k,l,m), 2 = (k,-l,m), 3 = (k,l,-m), 4 = (k,-l,-m)
812 |
813 | for (k = 1; k <= kxmax; k++) {
814 | for (l = 1; l <= kymax; l++) {
815 | for (m = 1; m <= kzmax; m++) {
816 | sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]) +
817 | (m*unitk[2] * m*unitk[2]);
818 | if (sqk <= gsqmx) {
819 | cstr1 = 0.0;
820 | sstr1 = 0.0;
821 | cstr2 = 0.0;
822 | sstr2 = 0.0;
823 | cstr3 = 0.0;
824 | sstr3 = 0.0;
825 | cstr4 = 0.0;
826 | sstr4 = 0.0;
827 | for (i = 0; i < nlocal; i++) {
828 | if (electrode_check(i) == 0) {
829 | clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i];
830 | slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i];
831 | cstr1 += q[i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm);
832 | sstr1 += q[i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm);
833 |
834 | clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i];
835 | slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i];
836 | cstr2 += q[i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm);
837 | sstr2 += q[i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm);
838 |
839 | clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i];
840 | slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i];
841 | cstr3 += q[i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm);
842 | sstr3 += q[i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm);
843 |
844 | clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i];
845 | slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i];
846 | cstr4 += q[i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm);
847 | sstr4 += q[i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm);
848 | }
849 | }
850 | sfacrl[n] = cstr1;
851 | sfacim[n++] = sstr1;
852 | sfacrl[n] = cstr2;
853 | sfacim[n++] = sstr2;
854 | sfacrl[n] = cstr3;
855 | sfacim[n++] = sstr3;
856 | sfacrl[n] = cstr4;
857 | sfacim[n++] = sstr4;
858 | }
859 | }
860 | }
861 | }
862 | if (runstage == 1) runstage = 2;
863 | }
864 |
865 | /* ---------------------------------------------------------------------- */
866 | void FixConp::cg()
867 | {
868 | int iter,i,j,idx1d;
869 | double d,beta,ptap,lresnorm,resnorm,netcharge,tmp;
870 | double res[elenum_all],p[elenum_all],ap[elenum_all];
871 | for (i = 0; i < elenum_all; i++) eleallq[i] = 0.0;
872 | lresnorm = 0.0;
873 | for (i = 0; i < elenum_all; ++i) {
874 | res[i] = bbb_all[i];
875 | p[i] = bbb_all[i];
876 | for (j = 0; j < elenum_all; ++j) {
877 | idx1d= i*elenum_all+j;
878 | tmp = aaa_all[idx1d]*eleallq[j];
879 | res[i] -= tmp;
880 | p[i] -= tmp;
881 | }
882 | lresnorm += res[i]*res[i];
883 | }
884 | for (iter = 1; iter < maxiter; ++iter) {
885 | d = 0.0;
886 | for (i = 0; i < elenum_all; ++i) {
887 | ap[i] = 0.0;
888 | for (j = 0; j < elenum_all; ++j) {
889 | idx1d= i*elenum_all+j;
890 | ap[i] += aaa_all[idx1d]*p[j];
891 | }
892 | }
893 | ptap = 0.0;
894 | for (i = 0; i < elenum_all; ++i) {
895 | ptap += ap[i]*p[i];
896 | }
897 | d = lresnorm/ptap;
898 | resnorm = 0.0;
899 | for (i = 0; i all(FLERR,"Inversion failed!");
947 | if (me == 0) {
948 | FILE *outinva = fopen("inv_a_matrix","w");
949 | for (i = 0; i < elenum_all; i++) {
950 | if(i == 0) fprintf (outinva," ");
951 | fprintf (outinva,"%12d",eleall2tag[i]);
952 | }
953 | fprintf (outinva,"\n");
954 | for (k = 0; k < elenum_all*elenum_all; k++) {
955 | if (k%elenum_all != 0) {
956 | fprintf (outinva," ");
957 | }
958 | fprintf(outinva,"%20.10f",aaa_all[k]);
959 | if ((k+1)%elenum_all == 0) {
960 | fprintf(outinva,"\n");
961 | }
962 | }
963 | fclose(outinva);
964 | }
965 | }
966 | if (runstage == 2) runstage = 3;
967 | }
968 | /* ---------------------------------------------------------------------- */
969 | void FixConp::update_charge()
970 | {
971 | int i,j,idx1d;
972 | int elealli,tagi;
973 | double eleallq_i;
974 | int *tag = atom->tag;
975 | int nall = atom->nlocal+atom->nghost;
976 | double *q = atom->q;
977 | double **x = atom->x;
978 | for (i = 0; i < nall; ++i) {
979 | if (electrode_check(i)) {
980 | tagi = tag[i];
981 | elealli = tag2eleall[tagi];
982 | if (minimizer == 0) {
983 | q[i] = eleallq[elealli];
984 | } else if (minimizer == 1) {
985 | eleallq_i = 0.0;
986 | for (j = 0; j < elenum_all; j++) {
987 | idx1d=elealli*elenum_all+j;
988 | eleallq_i += aaa_all[idx1d]*bbb_all[j];
989 | }
990 | q[i] = eleallq_i;
991 | }
992 | }
993 | }
994 | }
995 | /* ---------------------------------------------------------------------- */
996 | void FixConp::force_cal(int vflag)
997 | {
998 | int i;
999 | if (force->kspace->energy) {
1000 | double eleqsqsum = 0.0;
1001 | int nlocal = atom->nlocal;
1002 | for (i = 0; i < nlocal; i++) {
1003 | if (electrode_check(i)) {
1004 | eleqsqsum += atom->q[i]*atom->q[i];
1005 | }
1006 | }
1007 | double tmp;
1008 | MPI_Allreduce(&eleqsqsum,&tmp,1,MPI_DOUBLE,MPI_SUM,world);
1009 | eleqsqsum = tmp;
1010 | double scale = 1.0;
1011 | double qscale = force->qqrd2e*scale;
1012 | force->kspace->energy += qscale*eta*eleqsqsum/(sqrt(2)*MY_PIS);
1013 | }
1014 | coul_cal(0,NULL,NULL);
1015 |
1016 | }
1017 | /* ---------------------------------------------------------------------- */
1018 | void FixConp::coul_cal(int coulcalflag,double *m,int *ele2tag)
1019 | {
1020 | Ctime1 = MPI_Wtime();
1021 | //coulcalflag = 2: a_cal; 1: b_cal; 0: force_cal
1022 | int i,j,k,ii,jj,jnum,itype,jtype,idx1d;
1023 | int checksum,elei,elej,elealli,eleallj;
1024 | double qtmp,xtmp,ytmp,ztmp,delx,dely,delz;
1025 | double r,r2inv,rsq,grij,etarij,expm2,t,erfc,dudq;
1026 | double forcecoul,ecoul,prefactor,fpair;
1027 |
1028 | int inum = force->pair->list->inum;
1029 | int nlocal = atom->nlocal;
1030 | int newton_pair = force->newton_pair;
1031 | int *atomtype = atom->type;
1032 | int *tag = atom->tag;
1033 | int *ilist = force->pair->list->ilist;
1034 | int *jlist;
1035 | int *numneigh = force->pair->list->numneigh;
1036 | int **firstneigh = force->pair->list->firstneigh;
1037 |
1038 | double qqrd2e = force->qqrd2e;
1039 | double **cutsq = force->pair->cutsq;
1040 | int itmp;
1041 | double *p_cut_coul = (double *) force->pair->extract("cut_coul",itmp);
1042 | double cut_coulsq = (*p_cut_coul)*(*p_cut_coul);
1043 | double **x = atom->x;
1044 | double **f = atom->f;
1045 | double *q = atom->q;
1046 |
1047 | for (ii = 0; ii < inum; ii++) {
1048 | i = ilist[ii];
1049 | qtmp = q[i];
1050 | xtmp = x[i][0];
1051 | ytmp = x[i][1];
1052 | ztmp = x[i][2];
1053 | itype = atomtype[i];
1054 | jlist = firstneigh[i];
1055 | jnum = numneigh[i];
1056 | for (jj = 0; jj < jnum; jj++) {
1057 | j = jlist[jj];
1058 | j &= NEIGHMASK;
1059 | checksum = abs(electrode_check(i))+abs(electrode_check(j));
1060 | if (checksum == 1 || checksum == 2) {
1061 | if (coulcalflag == 0 || checksum == coulcalflag) {
1062 | delx = xtmp - x[j][0];
1063 | dely = ytmp - x[j][1];
1064 | delz = ztmp - x[j][2];
1065 | rsq = delx*delx + dely*dely + delz*delz;
1066 | jtype = atomtype[j];
1067 | if (rsq < cutsq[itype][jtype]) {
1068 | r2inv = 1.0/rsq;
1069 | if (rsq < cut_coulsq) {
1070 | dudq =0.0;
1071 | r = sqrt(rsq);
1072 | if (coulcalflag != 0) {
1073 | grij = g_ewald * r;
1074 | expm2 = exp(-grij*grij);
1075 | t = 1.0 / (1.0 + EWALD_P*grij);
1076 | erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
1077 | dudq = erfc/r;
1078 | }
1079 | if (checksum == 1) etarij = eta*r;
1080 | else if (checksum == 2) etarij = eta*r/sqrt(2);
1081 | expm2 = exp(-etarij*etarij);
1082 | t = 1.0 / (1.0+EWALD_P*etarij);
1083 | erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
1084 |
1085 | if (coulcalflag == 0) {
1086 | prefactor = qqrd2e*qtmp*q[j]/r;
1087 | forcecoul = -prefactor*(erfc+EWALD_F*etarij*expm2);
1088 | fpair = forcecoul*r2inv;
1089 | f[i][0] += delx*forcecoul;
1090 | f[i][1] += dely*forcecoul;
1091 | f[i][2] += delz*forcecoul;
1092 | if (newton_pair || j < nlocal) {
1093 | f[j][0] -= delx*forcecoul;
1094 | f[j][1] -= dely*forcecoul;
1095 | f[j][2] -= delz*forcecoul;
1096 | }
1097 | ecoul = -prefactor*erfc;
1098 | force->pair->ev_tally(i,j,nlocal,newton_pair,0,ecoul,fpair,delx,dely,delz); //evdwl=0
1099 | } else {
1100 | dudq -= erfc/r;
1101 | elei = -1;
1102 | elej = -1;
1103 | for (k = 0; k < elenum; ++k) {
1104 | if (i < nlocal) {
1105 | if (ele2tag[k] == tag[i]) {
1106 | elei = k;
1107 | if (coulcalflag == 1) {
1108 | m[k] -= q[j]*dudq;
1109 | break;
1110 | }
1111 | }
1112 | }
1113 | if (j < nlocal) {
1114 | if (ele2tag[k] == tag[j]) {
1115 | elej = k;
1116 | if (coulcalflag == 1) {
1117 | m[k] -= q[i]*dudq;
1118 | break;
1119 | }
1120 | }
1121 | }
1122 | }
1123 | if (coulcalflag == 2 && checksum == 2) {
1124 | elealli = tag2eleall[tag[i]];
1125 | eleallj = tag2eleall[tag[j]];
1126 | if (elei != -1) {
1127 | idx1d = elei*elenum_all+eleallj;
1128 | m[idx1d] += dudq;
1129 | }
1130 | if (elej != -1) {
1131 | idx1d = elej*elenum_all+elealli;
1132 | m[idx1d] += dudq;
1133 | }
1134 | }
1135 | }
1136 | }
1137 | }
1138 | }
1139 | }
1140 | }
1141 | }
1142 | Ctime2 = MPI_Wtime();
1143 | Ctime += Ctime2-Ctime1;
1144 | }
1145 |
1146 | /* ---------------------------------------------------------------------- */
1147 | double FixConp::rms(int km, double prd, bigint natoms, double q2)
1148 | {
1149 | double value = 2.0*q2*g_ewald/prd *
1150 | sqrt(1.0/(MY_PI*km*natoms)) *
1151 | exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd));
1152 | return value;
1153 | }
1154 |
1155 | /* ---------------------------------------------------------------------- */
1156 | void FixConp::coeffs()
1157 | {
1158 | int k,l,m;
1159 | double sqk;
1160 |
1161 | double g_ewald_sq_inv = 1.0 / (g_ewald*g_ewald);
1162 | double preu = 4.0*MY_PI/volume;
1163 |
1164 | kcount = 0;
1165 |
1166 | // (k,0,0), (0,l,0), (0,0,m)
1167 |
1168 | for (m = 1; m <= kmax; m++) {
1169 | sqk = (m*unitk[0]) * (m*unitk[0]);
1170 | if (sqk <= gsqmx) {
1171 | kxvecs[kcount] = m;
1172 | kyvecs[kcount] = 0;
1173 | kzvecs[kcount] = 0;
1174 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1175 | kcount++;
1176 | }
1177 | sqk = (m*unitk[1]) * (m*unitk[1]);
1178 | if (sqk <= gsqmx) {
1179 | kxvecs[kcount] = 0;
1180 | kyvecs[kcount] = m;
1181 | kzvecs[kcount] = 0;
1182 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1183 | kcount++;
1184 | }
1185 | sqk = (m*unitk[2]) * (m*unitk[2]);
1186 | if (sqk <= gsqmx) {
1187 | kxvecs[kcount] = 0;
1188 | kyvecs[kcount] = 0;
1189 | kzvecs[kcount] = m;
1190 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1191 | kcount++;
1192 | }
1193 | }
1194 |
1195 | // 1 = (k,l,0), 2 = (k,-l,0)
1196 |
1197 | for (k = 1; k <= kxmax; k++) {
1198 | for (l = 1; l <= kymax; l++) {
1199 | sqk = (unitk[0]*k) * (unitk[0]*k) + (unitk[1]*l) * (unitk[1]*l);
1200 | if (sqk <= gsqmx) {
1201 | kxvecs[kcount] = k;
1202 | kyvecs[kcount] = l;
1203 | kzvecs[kcount] = 0;
1204 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1205 | kcount++;
1206 |
1207 | kxvecs[kcount] = k;
1208 | kyvecs[kcount] = -l;
1209 | kzvecs[kcount] = 0;
1210 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1211 | kcount++;;
1212 | }
1213 | }
1214 | }
1215 |
1216 | // 1 = (0,l,m), 2 = (0,l,-m)
1217 |
1218 | for (l = 1; l <= kymax; l++) {
1219 | for (m = 1; m <= kzmax; m++) {
1220 | sqk = (unitk[1]*l) * (unitk[1]*l) + (unitk[2]*m) * (unitk[2]*m);
1221 | if (sqk <= gsqmx) {
1222 | kxvecs[kcount] = 0;
1223 | kyvecs[kcount] = l;
1224 | kzvecs[kcount] = m;
1225 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1226 | kcount++;
1227 |
1228 | kxvecs[kcount] = 0;
1229 | kyvecs[kcount] = l;
1230 | kzvecs[kcount] = -m;
1231 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1232 | kcount++;
1233 | }
1234 | }
1235 | }
1236 |
1237 | // 1 = (k,0,m), 2 = (k,0,-m)
1238 |
1239 | for (k = 1; k <= kxmax; k++) {
1240 | for (m = 1; m <= kzmax; m++) {
1241 | sqk = (unitk[0]*k) * (unitk[0]*k) + (unitk[2]*m) * (unitk[2]*m);
1242 | if (sqk <= gsqmx) {
1243 | kxvecs[kcount] = k;
1244 | kyvecs[kcount] = 0;
1245 | kzvecs[kcount] = m;
1246 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1247 | kcount++;
1248 |
1249 | kxvecs[kcount] = k;
1250 | kyvecs[kcount] = 0;
1251 | kzvecs[kcount] = -m;
1252 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1253 | kcount++;
1254 | }
1255 | }
1256 | }
1257 |
1258 | // 1 = (k,l,m), 2 = (k,-l,m), 3 = (k,l,-m), 4 = (k,-l,-m)
1259 |
1260 | for (k = 1; k <= kxmax; k++) {
1261 | for (l = 1; l <= kymax; l++) {
1262 | for (m = 1; m <= kzmax; m++) {
1263 | sqk = (unitk[0]*k) * (unitk[0]*k) + (unitk[1]*l) * (unitk[1]*l) +
1264 | (unitk[2]*m) * (unitk[2]*m);
1265 | if (sqk <= gsqmx) {
1266 | kxvecs[kcount] = k;
1267 | kyvecs[kcount] = l;
1268 | kzvecs[kcount] = m;
1269 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1270 | kcount++;
1271 |
1272 | kxvecs[kcount] = k;
1273 | kyvecs[kcount] = -l;
1274 | kzvecs[kcount] = m;
1275 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1276 | kcount++;
1277 |
1278 | kxvecs[kcount] = k;
1279 | kyvecs[kcount] = l;
1280 | kzvecs[kcount] = -m;
1281 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1282 | kcount++;
1283 |
1284 | kxvecs[kcount] = k;
1285 | kyvecs[kcount] = -l;
1286 | kzvecs[kcount] = -m;
1287 | ug[kcount] = preu*exp(-0.25*sqk*g_ewald_sq_inv)/sqk;
1288 | kcount++;
1289 | }
1290 | }
1291 | }
1292 | }
1293 | }
1294 |
1295 |
--------------------------------------------------------------------------------
/fix_conp.h:
--------------------------------------------------------------------------------
1 | /* ----------------------------------------------------------------------
2 | LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
3 | http://lammps.sandia.gov, Sandia National Laboratories
4 | Steve Plimpton, sjplimp@sandia.gov
5 |
6 | Copyright (2003) Sandia Corporation. Under the terms of Contract
7 | DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
8 | certain rights in this software. This software is distributed under
9 | the GNU General Public License.
10 |
11 | See the README file in the top-level LAMMPS directory.
12 | ------------------------------------------------------------------------- */
13 |
14 | /* ----------------------------------------------------------------------
15 | Version Sep/22/2014
16 | Zhenxing Wang (KU)
17 | ------------------------------------------------------------------------- */
18 |
19 | #ifdef FIX_CLASS
20 |
21 | FixStyle(conp,FixConp)
22 |
23 | #else
24 |
25 | #ifndef LMP_FIX_CONP_H
26 | #define LMP_FIX_CONP_H
27 |
28 | #include "fix.h"
29 |
30 | namespace LAMMPS_NS {
31 |
32 | class FixConp : public Fix {
33 | public:
34 | FixConp(class LAMMPS *, int, char **);
35 | ~FixConp();
36 | int setmask();
37 | void init();
38 | void setup(int);
39 | void pre_force(int);
40 | void force_cal(int);
41 | void a_cal();
42 | void a_read();
43 | void b_cal();
44 | void equation_solve();
45 | void update_charge();
46 | int electrode_check(int);
47 | void sincos_a(double **);
48 | void sincos_b();
49 | void cg();
50 | void inv();
51 | void coul_cal(int, double *,int *);
52 |
53 | private:
54 | int me,runstage;
55 | double Btime,Btime1,Btime2;
56 | double Ctime,Ctime1,Ctime2;
57 | double Ktime,Ktime1,Ktime2;
58 | double cgtime,cgtime1,cgtime2;
59 | FILE *outf,*outa,*a_matrix_fp;
60 | int a_matrix_f;
61 | int minimizer;
62 | double vL,vR;
63 | int molidL,molidR;
64 | int maxiter;
65 | double tolerance;
66 |
67 | double rms(int,double,bigint,double);
68 | void coeffs();
69 |
70 | double unitk[3];
71 | double *ug;
72 | double g_ewald,eta,gsqmx,volume,slab_volfactor;
73 | int *kxvecs,*kyvecs,*kzvecs;
74 | double ***cs,***sn,**csk,**snk;
75 | int kmax,kmax3d,kmax_created,kcount;
76 | int kxmax,kymax,kzmax;
77 | double *sfacrl,*sfacrl_all,*sfacim,*sfacim_all;
78 | int everynum;
79 | int elenum,elenum_old,elenum_all;
80 | double *eleallq;
81 | double *aaa_all,*bbb_all;
82 | int *tag2eleall,*eleall2tag,*curr_tag2eleall,*ele2tag;
83 | };
84 |
85 | }
86 |
87 | #endif
88 | #endif
89 |
--------------------------------------------------------------------------------