├── 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 | --------------------------------------------------------------------------------