ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/makeLipid/makeLipid.cpp
Revision: 32
Committed: Wed Jul 17 20:33:56 2002 UTC (21 years, 11 months ago) by mmeineke
File size: 8346 byte(s)
Log Message:

fixed makeRandom to set up a correct simulation

File Contents

# Content
1 #include <iostream>
2 #include <cstdlib>
3 #include <cstring>
4 #include <cstdio>
5
6 #include "SimSetup.hpp"
7 #include "SimInfo.hpp"
8 #include "Atom.hpp"
9 #include "Integrator.hpp"
10 #include "Thermo.hpp"
11 #include "ReadWrite.hpp"
12
13
14 char* program_name;
15 using namespace std;
16
17 int main(int argc,char* argv[]){
18
19 int i, j, k, l;
20 unsigned int n_atoms, eo, xo;
21 char* in_name;
22 SimSetup* startMe;
23 SimInfo* entry_plug;
24 Thermo* tStats;
25
26 int lipidNAtoms;
27 Atom** lipidAtoms;
28
29 int tot_Natoms;
30 Atom** totAtoms;
31
32 const double water_rho = 0.0334; // number density per cubic angstrom
33 const double water_vol = 4.0 / water_rho; // volume occupied by 4 waters
34 const double water_cell = 4.929; // fcc unit cell length
35
36 int n_lipidsX = 5;
37 int n_lipidsY = 10;
38 int n_lipids = n_lipidsX * n_lipidsY;
39
40 std::cerr << "n_lipids = " << n_lipids << "\n";
41
42 double water_shell = 10.0;
43 double water_padding = 2.5;
44 double lipid_spaceing = 4.0;
45
46 srand48( 1337 ); // initialize the random number generator.
47
48 program_name = argv[0]; /*save the program name in case we need it*/
49 if( argc < 3 ){
50 cerr<< "Error, input and output bass files are needed to run.\n"
51 << program_name << " <input.bass> <output.bass>\n";
52
53 exit(8);
54 }
55
56 in_name = argv[1];
57 char* out_name = argv[2];
58 entry_plug = new SimInfo;
59
60 startMe = new SimSetup;
61 startMe->setSimInfo( entry_plug );
62 startMe->parseFile( in_name );
63 startMe->createSim();
64
65 delete startMe;
66
67 lipidAtoms = entry_plug->atoms;
68 lipidNAtoms = entry_plug->n_atoms;
69
70 int group_nAtoms = n_lipids * lipidNAtoms;
71 Atom** group_atoms = new Atom*[group_nAtoms];
72 DirectionalAtom* dAtom;
73 DirectionalAtom* dAtomNew;
74
75 double rotMat[3][3];
76 double unitRotMat[3][3];
77
78 unitRotMat[0][0] = 1.0;
79 unitRotMat[0][1] = 0.0;
80 unitRotMat[0][2] = 0.0;
81
82 unitRotMat[1][0] = 0.0;
83 unitRotMat[1][1] = 1.0;
84 unitRotMat[1][2] = 0.0;
85
86 unitRotMat[2][0] = 0.0;
87 unitRotMat[2][1] = 0.0;
88 unitRotMat[2][2] = 1.0;
89
90 int index =0;
91 for(i=0; i<n_lipids; i++ ){
92 for(j=0; j<lipidNAtoms; j++){
93
94 if( lipidAtoms[j]->isDirectional() ){
95 dAtom = (DirectionalAtom *)lipidAtoms[j];
96
97 dAtomNew = new DirectionalAtom();
98 dAtomNew->setSUx( dAtom->getSUx() );
99 dAtomNew->setSUx( dAtom->getSUx() );
100 dAtomNew->setSUx( dAtom->getSUx() );
101
102 dAtom->getA( rotMat );
103 dAtomNew->setA( rotMat );
104
105 group_atoms[index] = dAtomNew;
106 }
107 else{
108
109 group_atoms[index] = new GeneralAtom();
110 }
111
112 group_atoms[index]->setType( lipidAtoms[j]->getType() );
113
114 index++;
115 }
116 }
117
118 index = 0;
119 for(i=0; i<n_lipidsX; i++){
120 for(j=0; j<n_lipidsY; j++){
121 for(l=0; l<lipidNAtoms; l++){
122
123 group_atoms[index]->setX( lipidAtoms[l]->getX() +
124 i*lipid_spaceing );
125
126 group_atoms[index]->setY( lipidAtoms[l]->getY() +
127 j*lipid_spaceing );
128
129 group_atoms[index]->setZ( lipidAtoms[l]->getZ() );
130
131 index++;
132 }
133 }
134 }
135
136 double min_x, min_y, min_z;
137 double max_x, max_y, max_z;
138 double test_x, test_y, test_z;
139
140 max_x = min_x = group_atoms[0]->getX();
141 max_y = min_y = group_atoms[0]->getY();
142 max_z = min_z = group_atoms[0]->getZ();
143
144 for(i=0; i<group_nAtoms; i++){
145
146 test_x = group_atoms[i]->getX();
147 test_y = group_atoms[i]->getY();
148 test_z = group_atoms[i]->getZ();
149
150 if( test_x < min_x ) min_x = test_x;
151 if( test_y < min_y ) min_y = test_y;
152 if( test_z < min_z ) min_z = test_z;
153
154 if( test_x > max_x ) max_x = test_x;
155 if( test_y > max_y ) max_y = test_y;
156 if( test_z > max_z ) max_z = test_z;
157 }
158
159 double box_x = max_x - min_x + 2*water_shell;
160 double box_y = max_y - min_y + 2*water_shell;
161 double box_z = max_z - min_z + 2*water_shell;
162
163 int n_cellX = (int)(box_x / water_cell + 0.5 );
164 int n_cellY = (int)(box_y / water_cell + 0.5 );
165 int n_cellZ = (int)(box_z / water_cell + 0.5 );
166
167 box_x = water_cell * n_cellX;
168 box_y = water_cell * n_cellY;
169 box_z = water_cell * n_cellZ;
170
171 int n_water = n_cellX * n_cellY * n_cellZ * 4;
172
173 double *waterX = new double[n_water];
174 double *waterY = new double[n_water];
175 double *waterZ = new double[n_water];
176
177 double cx, cy, cz;
178
179 cx = 0.0;
180 cy = 0.0;
181 cz = 0.0;
182 for(i=0; i<group_nAtoms; i++){
183 cx += group_atoms[i]->getX();
184 cy += group_atoms[i]->getY();
185 cz += group_atoms[i]->getZ();
186 }
187 cx /= group_nAtoms;
188 cy /= group_nAtoms;
189 cz /= group_nAtoms;
190
191 double x0 = cx - ( box_x * 0.5 );
192 double y0 = cy - ( box_y * 0.5 );
193 double z0 = cz - ( box_z * 0.5 );
194
195 index = 0;
196 for( i=0; i < n_cellX; i++ ){
197 for( j=0; j < n_cellY; j++ ){
198 for( k=0; k < n_cellZ; k++ ){
199
200 waterX[index] = i * water_cell + x0;
201 waterY[index] = j * water_cell + y0;
202 waterZ[index] = k * water_cell + z0;
203 index++;
204
205 waterX[index] = i * water_cell + 0.5 * water_cell + x0;
206 waterY[index] = j * water_cell + 0.5 * water_cell + y0;
207 waterZ[index] = k * water_cell + z0;
208 index++;
209
210 waterX[index] = i * water_cell + x0;
211 waterY[index] = j * water_cell + 0.5 * water_cell + y0;
212 waterZ[index] = k * water_cell + 0.5 * water_cell + z0;
213 index++;
214
215 waterX[index] = i * water_cell + 0.5 * water_cell + x0;
216 waterY[index] = j * water_cell + y0;
217 waterZ[index] = k * water_cell + 0.5 * water_cell + z0;
218 index++;
219 }
220 }
221 }
222
223 int *isActive = new int[n_water];
224 for(i=0; i<n_water; i++) isActive[i] = 1;
225
226 int n_active = n_water;
227 double dx, dy, dz;
228 double dx2, dy2, dz2, dSqr;
229 double rCutSqr = water_padding * water_padding;
230
231 for(i=0; ( (i<n_water) && isActive[i] ); i++){
232 for(j=0; ( (j<group_nAtoms) && isActive[i] ); j++){
233
234 dx = waterX[i] - group_atoms[j]->getX();
235 dy = waterY[i] - group_atoms[j]->getY();
236 dz = waterZ[i] - group_atoms[j]->getZ();
237
238 dx2 = dx * dx;
239 dy2 = dy * dy;
240 dz2 = dz * dz;
241
242 dSqr = dx2 + dy2 + dz2;
243 if( dSqr < rCutSqr ){
244 isActive[i] = 0;
245 n_active--;
246 }
247 }
248 }
249
250 std::cerr << "final n_waters = " << n_active << "\n";
251
252 int new_nAtoms = group_nAtoms + n_active;
253 Atom** new_atoms = new Atom*[new_nAtoms];
254
255 index = 0;
256 for(i=0; i<group_nAtoms; i++ ){
257
258 if( group_atoms[i]->isDirectional() ){
259 dAtom = (DirectionalAtom *)group_atoms[i];
260
261 dAtomNew = new DirectionalAtom();
262 dAtomNew->setSUx( dAtom->getSUx() );
263 dAtomNew->setSUx( dAtom->getSUx() );
264 dAtomNew->setSUx( dAtom->getSUx() );
265
266 dAtom->getA(rotMat);
267 dAtomNew->setA( rotMat );
268
269 new_atoms[index] = dAtomNew;
270 }
271 else{
272
273 new_atoms[index] = new GeneralAtom();
274 }
275
276 new_atoms[index]->setType( group_atoms[i]->getType() );
277
278 new_atoms[index]->setX( group_atoms[i]->getX() );
279 new_atoms[index]->setY( group_atoms[i]->getY() );
280 new_atoms[index]->setZ( group_atoms[i]->getZ() );
281
282 new_atoms[index]->set_vx( 0.0 );
283 new_atoms[index]->set_vy( 0.0 );
284 new_atoms[index]->set_vz( 0.0 );
285
286 index++;
287 }
288
289
290
291
292 for(i=0; i<n_water; i++){
293 if(isActive[i]){
294
295 new_atoms[index] = new DirectionalAtom();
296 new_atoms[index]->setType( "SSD" );
297
298 new_atoms[index]->setX( waterX[i] );
299 new_atoms[index]->setY( waterY[i] );
300 new_atoms[index]->setZ( waterZ[i] );
301
302 new_atoms[index]->set_vx( 0.0 );
303 new_atoms[index]->set_vy( 0.0 );
304 new_atoms[index]->set_vz( 0.0 );
305
306 dAtom = (DirectionalAtom *) new_atoms[index];
307
308 dAtom->setSUx( 0.0 );
309 dAtom->setSUy( 0.0 );
310 dAtom->setSUz( 1.0 );
311
312 dAtom->setA( unitRotMat );
313
314 index++;
315 }
316 }
317
318 entry_plug->n_atoms = new_nAtoms;
319 entry_plug->atoms = new_atoms;
320
321 entry_plug->box_x = box_x;
322 entry_plug->box_y = box_y;
323 entry_plug->box_z = box_z;
324
325 DumpWriter* xyz_out = new DumpWriter( entry_plug );
326 xyz_out->writeFinal();
327 delete xyz_out;
328
329 FILE* out_file;
330
331 out_file = fopen( out_name, "w" );
332
333 fprintf(out_file,
334 "#include \"water.mdl\"\n"
335 "#include \"lipid.mdl\"\n"
336 "\n"
337 "nComponents = 2;\n"
338 "component{\n"
339 " type = \"theLipid\";\n"
340 " nMol = %d;\n"
341 "}\n"
342 "\n"
343 "component{\n"
344 " type = \"SSD_water\";\n"
345 " nMol = %d;\n"
346 "}\n"
347 "\n"
348 "initialConfig = \"%s\";\n"
349 "\n"
350 "boxX = %lf;\n"
351 "boxY = %lf;\n"
352 "boxZ = %lf;\n",
353 n_lipids, n_active, entry_plug->finalName,
354 box_x, box_y, box_z );
355
356 fclose( out_file );
357
358 return 0;
359 }