ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/utilities/waterBoxer
Revision: 3113
Committed: Tue Jan 9 03:42:14 2007 UTC (17 years, 6 months ago) by gezelter
File size: 18025 byte(s)
Log Message:
Added the ability of waterBoxer to deal with non-cubical boxes.

File Contents

# User Rev Content
1 chrisfen 3037 #!/usr/bin/env perl
2    
3     # program that builds water boxes
4    
5     # author = "Chris Fennell
6 gezelter 3113 # version = "$Revision: 1.2 $"
7     # date = "$Date: 2007-01-09 03:42:14 $"
8 chrisfen 3037 # copyright = "Copyright (c) 2006 by the University of Notre Dame"
9     # license = "OOPSE"
10    
11     use Getopt::Std;
12    
13     $tolerance = 1.0E-8;
14     $mass = 2.99151E-23; # mass of H2O in grams
15     $cm3ToAng3 = 1E24; # convert cm^3 to angstroms^3
16     $densityConvert = $mass*$cm3ToAng3;
17     $lattice = 0;
18     $nMol = 500;
19     $density = 1.0;
20     $doRandomize = 0;
21     $cutoff = 12;
22     $alpha = 0.2125;
23     $alphaInt = 0.5125;
24     $alphaSlope = 0.025;
25     $invalidWater = 0;
26     $waterCase = -1;
27     $nothingSelected = 1;
28    
29     # get our options
30 gezelter 3113 getopts('hmrvd:l:n:o:w:x:y:z:');
31 chrisfen 3037
32     # just to test opt_h
33     $opt_h = "true" if $#ARGV >= 0;
34    
35     # our option output
36     if ($opt_h){
37     print "waterBoxer: builds water boxes\n\n";
38     print "usage: waterBoxer [-hmrv] [-d density] [-l lattice] [-n # waters]\n";
39     print "\t[-o file name] [-w water name] \n\n";
40     print " -h : show this message\n";
41     print " -m : print out a water.md file (file with all water models)\n";
42     print " -r : randomize orientations\n";
43     print " -v : verbose output\n\n";
44     print " -d real : density in g/cm^3\n";
45     print " (default: 1)\n";
46     print " -l integer : 0 - face centered cubic, 1 - simple cubic\n";
47     print " (default: 0)\n";
48     print " -n integer : # of water molecules\n";
49     print " (default: 500)\n";
50     print " -o char : output file name\n";
51     print " (default: freshWater.md)\n";
52     print " -w char : name of the water stunt double\n";
53 gezelter 3113 print " (default: SPCE)\n";
54     print " -x real : dimension of the box along the x direction\n";
55     print " -y real : dimension of the box along the y direction\n";
56     print " -z real : dimension of the box along the z direction\n\n";
57     print "Note: you can only use values of x, y, or z that are smaller\n";
58     print " than the derived box length for a given density and\n";
59     print " number of molecules.\n\n";
60 chrisfen 3037 print "Example:\n";
61     die " waterBoxer -d 0.997 -n 864 -w SSD_RF -o ssdrfWater.md\n";
62     }
63    
64     # set some variables to be used in the code
65     if (defined($opt_o)){
66     $fileName = $opt_o;
67     $nothingSelected = 0;
68     } else {
69     $fileName = 'freshWater.md';
70     }
71     if ($opt_m){
72     die "Error: $fileName cannot be \"water.md\"\n Please choose a different name\n" if $fileName eq 'water.md';
73     $waterFileHandle = 'WATERMD';
74     $nothingSelected = 0;
75     } else {
76     $waterFileHandle = 'OUTFILE';
77     }
78     if ($opt_r){
79     $doRandomize = $opt_r;
80     $nothingSelected = 0;
81     }
82    
83 gezelter 3113 if (defined($opt_d)){
84     $nothingSelected = 0;
85     if ($opt_d =~ /^[0-9]/) {
86     $density = $opt_d;
87     } else {
88     die "Error: the value for '-d' ($opt_d) is not a valid number\n Please choose a positive real # value\n";
89     }
90     }
91 chrisfen 3037 if (defined($opt_w)){
92     $waterName = $opt_w;
93     $nothingSelected = 0;
94     } else {
95     $waterName = 'SPCE';
96     }
97     validateWater();
98     if ($invalidWater == 1){
99     print "Warning: \'$waterName\' is not a recognized water model name.\n";
100     print " Use the \'-m\' option to generate a \'water.md\' with the\n";
101     print " recognized water model geometries.\n\n";
102     }
103 gezelter 3113 if ($waterName eq 'DPD') {
104     # DPD waters are stand-ins for 4 water molecules
105     $density = $density * 0.25;
106 chrisfen 3037 }
107 gezelter 3113
108 chrisfen 3037 if (defined($opt_l)){
109     $nothingSelected = 0;
110     if ($opt_l =~ /^[0-9]/) {
111     $lattice = $opt_l;
112     if ($lattice != 0 && $lattice != 1){
113     die "Error: the '-l' value ($opt_l) is not a valid number\n Please choose 0 or 1\n";
114     }
115     } else {
116     die "Error: the '-l' value ($opt_l) is not a valid number\n Please choose 0 or 1\n";
117     }
118     }
119     if (defined($opt_n)){
120     $nothingSelected = 0;
121     if ($opt_n =~ /^[0-9]/) {
122     $nMol = $opt_n;
123     } else {
124     die "Error: the '-n' value ($opt_n) is not a valid number\n Please choose a non-negative integer\n";
125     }
126     }
127 gezelter 3113 if (defined($opt_x)){
128     $nothingSelected = 0;
129     if ($opt_x =~ /^[0-9]/) {
130     $boxx = $opt_x;
131     } else {
132     die "Error: the value for '-x' ($opt_x) is not a valid number\n Please choose a positive real # value\n";
133     }
134     }
135     if (defined($opt_y)){
136     $nothingSelected = 0;
137     if ($opt_y =~ /^[0-9]/) {
138     $boxy = $opt_y;
139     } else {
140     die "Error: the value for '-y' ($opt_y) is not a valid number\n Please choose a positive real # value\n";
141     }
142     }
143     if (defined($opt_z)){
144     $nothingSelected = 0;
145     if ($opt_z =~ /^[0-9]/) {
146     $boxz = $opt_z;
147     } else {
148     die "Error: the value for '-z' ($opt_z) is not a valid number\n Please choose a positive real # value\n";
149     }
150     }
151 chrisfen 3037
152 gezelter 3113
153 chrisfen 3037 # open the file writer
154     open(OUTFILE, ">./$fileName") || die "Error: can't open file $fileName\n";
155    
156     # check to set magic lattice numbers
157     if ($lattice == 0){
158     $crystalNumReal = ($nMol/4.0)**(1.0/3.0);
159     $crystalNum = int($crystalNumReal + $tolerance);
160     $remainder = $crystalNumReal - $crystalNum;
161    
162     # if crystalNumReal wasn't an integer, we bump the crystal to the next
163     # magic number
164     if ($remainder > $tolerance){
165     $crystalNum = $crystalNum + 1;
166     $newMol = 4 * $crystalNum**3;
167     print "Warning: The number chosen ($nMol) failed to build a clean fcc lattice.\n";
168     print " The number of molecules has been increased to the next magic number ($newMol).\n\n";
169     $nMol = $newMol;
170     }
171     } elsif ($lattice == 1){
172     $crystalNumReal = ($nMol/1.0)**(1.0/3.0);
173     $crystalNum = int($crystalNumReal);
174     $remainder = $crystalNumReal - $crystalNum;
175    
176     # again, if crystalNumReal wasn't an integer, we bump the crystal to the next
177     # magic number
178     if ($remainder > $tolerance){
179     $crystalNum = $crystalNum + 1;
180     $newMol = $crystalNum**3;
181     print "Warning: The number chosen ($nMol) failed to build a clean simple cubic lattice.\n";
182     print " The number of molecules has been increased to the next magic number ($newMol).\n\n";
183     $nMol = $newMol;
184     }
185     }
186    
187     # now we can start building the crystals
188     $boxLength = ($nMol*$densityConvert/$density)**(1.0/3.0);
189     $cellLength = $boxLength / $crystalNum;
190    
191 gezelter 3113 if ($boxx != 0) {
192     if ($boxLength < $boxx) {
193     print "Computed box length is smaller than requested x axis. Use more\n";
194     die "molecules.";
195     }
196     } else {
197     $boxx = $boxLength;
198     }
199     if ($boxy != 0) {
200     if ($boxLength < $boxy) {
201     print "Computed box length is smaller than requested y axis. Use more\n";
202     die "molecules.";
203     }
204     } else {
205     $boxy = $boxLength;
206     }
207     if ($boxz != 0) {
208     if ($boxLength < $boxz) {
209     print "Computed box length is smaller than requested z axis. Use more\n";
210     die "molecules.";
211     }
212     } else {
213     $boxz = $boxLength;
214     }
215    
216     $nx = int($boxx / $cellLength);
217     $ny = int($boxy / $cellLength);
218     $nz = int($boxz / $cellLength);
219    
220 chrisfen 3037 if ($lattice == 0) {
221 gezelter 3113 $nMol = 4 * $nx * $ny * $nz;
222     } else {
223     $nMol = $nx * $ny * $nz;
224     }
225    
226     $newDensity = $nMol * $densityConvert / ($boxx*$boxy*$boxz);
227    
228     if (abs($newDensity-$density) > $tolerance) {
229     print "Resetting density to $newDensity to make chosen box sides work out\n";
230     }
231     $cellLengthX = $boxx/$nx;
232     $cellLengthY = $boxy/$ny;
233     $cellLengthZ = $boxz/$nz;
234    
235     $cell2X = $cellLengthX*0.5;
236     $cell2Y = $cellLengthY*0.5;
237     $cell2Z = $cellLengthZ*0.5;
238    
239     if ($lattice == 0) {
240 chrisfen 3037 # build the unit cell
241     # molecule 0
242     $xCorr[0] = 0.0;
243     $yCorr[0] = 0.0;
244     $zCorr[0] = 0.0;
245     # molecule 1
246     $xCorr[1] = 0.0;
247 gezelter 3113 $yCorr[1] = $cell2Y;
248     $zCorr[1] = $cell2Z;
249 chrisfen 3037 # molecule 2
250 gezelter 3113 $xCorr[2] = $cell2X;
251     $yCorr[2] = $cell2Y;
252 chrisfen 3037 $zCorr[2] = 0.0;
253     # molecule 3
254 gezelter 3113 $xCorr[3] = $cell2X;
255 chrisfen 3037 $yCorr[3] = 0.0;
256 gezelter 3113 $zCorr[3] = $cell2Z;
257 chrisfen 3037 # assemble the lattice
258     $counter = 0;
259 gezelter 3113 for ($z = 0; $z < $nx; $z++) {
260     for ($y = 0; $y < $ny; $y++) {
261     for ($x = 0; $x < $nz; $x++) {
262 chrisfen 3037 for ($uc = 0; $uc < 4; $uc++) {
263 gezelter 3113 $xCorr[$uc+$counter] = $xCorr[$uc] + $cellLengthX*$x;
264     $yCorr[$uc+$counter] = $yCorr[$uc] + $cellLengthY*$y;
265     $zCorr[$uc+$counter] = $zCorr[$uc] + $cellLengthZ*$z;
266 chrisfen 3037 }
267     $counter = $counter + 4;
268     }
269     }
270     }
271    
272     } elsif ($lattice == 1) {
273 gezelter 3113 # build the unit cell
274     # molecule 0
275     $xCorr[0] = $cell2X;
276     $yCorr[0] = $cell2Y;
277     $zCorr[0] = $cell2Z;
278 chrisfen 3037 #assemble the lattice
279     $counter = 0;
280 gezelter 3113 for ($z = 0; $z < $nx; $z++) {
281     for ($y = 0; $y < $ny; $y++) {
282     for ($x = 0; $x < $nz; $x++) {
283     $xCorr[$counter] = $xCorr[0] + $cellLengthX*$x;
284     $yCorr[$counter] = $yCorr[0] + $cellLengthY*$y;
285     $zCorr[$counter] = $zCorr[0] + $cellLengthZ*$z;
286 chrisfen 3037
287     $counter++;
288     }
289     }
290     }
291     }
292    
293     writeOutFile();
294     print "The water box \"$fileName\" was generated.\n";
295    
296     if ($opt_m){
297     printWaterMD();
298     print "The file \"water.md\" was generated for inclusion in \"$fileName\"\n";
299     }
300    
301     if ($nothingSelected == 1) {
302     print "(For help, use the \'-h\' option.)\n";
303     }
304    
305    
306     # this marks the end of the main program, below is subroutines
307    
308     sub acos {
309     my ($rad) = @_;
310     my $ret = atan2(sqrt(1 - $rad*$rad), $rad);
311     return $ret;
312     }
313    
314     sub writeOutFile {
315     # write out the header
316     print OUTFILE "<OOPSE version=4>\n";
317     findCutoff();
318     findAlpha();
319     printMetaData();
320     printFrameData();
321     print OUTFILE " <StuntDoubles>\n";
322    
323     # shift the box center to the origin and write out the coordinates
324     for ($i = 0; $i < $nMol; $i++) {
325 gezelter 3113 $xCorr[$i] -= 0.5*$boxx;
326     $yCorr[$i] -= 0.5*$boxy;
327     $zCorr[$i] -= 0.5*$boxz;
328 chrisfen 3037
329     $q0 = 1.0;
330     $q1 = 0.0;
331     $q2 = 0.0;
332     $q3 = 0.0;
333    
334     if ($doRandomize == 1){
335     $cosTheta = 2.0*rand() - 1.0;
336     $theta = acos($cosTheta);
337     $phi = 2.0*3.14159265359*rand();
338     $psi = 2.0*3.14159265359*rand();
339    
340     $q0 = cos(0.5*$theta)*cos(0.5*($phi + $psi));
341     $q1 = sin(0.5*$theta)*cos(0.5*($phi - $psi));
342     $q2 = sin(0.5*$theta)*sin(0.5*($phi - $psi));
343     $q3 = cos(0.5*$theta)*sin(0.5*($phi + $psi));
344     }
345    
346     print OUTFILE "$i\tpq\t$xCorr[$i] $yCorr[$i] $zCorr[$i] ";
347     print OUTFILE "$q0 $q1 $q2 $q3\n";
348     }
349    
350     print OUTFILE " </StuntDoubles>\n </Snapshot>\n</OOPSE>\n";
351     }
352    
353     sub printMetaData {
354     print OUTFILE " <MetaData>\n";
355    
356     # print the water model or includes
357     if ($opt_m){
358     print OUTFILE "#include \"water.md\"";
359     } else {
360     printWaterModel();
361     }
362     printFakeWater() if $invalidWater == 1;
363    
364     # now back to the metaData output
365     print OUTFILE "\n\ncomponent{
366     type = \"$waterName\";
367     nMol = $nMol;
368     }
369    
370     ensemble = NVE;
371     forceField = \"DUFF\";
372     electrostaticSummationMethod = \"shifted_force\";
373     electrostaticScreeningMethod = \"damped\";
374     cutoffRadius = $cutoff;
375    
376     targetTemp = 300;
377     targetPressure = 1.0;
378    
379     tauThermostat = 1e3;
380     tauBarostat = 1e4;
381    
382     dt = 2.0;
383     runTime = 1e3;
384    
385     tempSet = \"true\";
386     thermalTime = 10;
387     sampleTime = 100;
388     statusTime = 2;
389     </MetaData>\n";
390     }
391    
392     sub findCutoff {
393 gezelter 3113 if ($boxy < $boxx) {
394     $bm = $boxy;
395     } else {
396     $bm = $boxx;
397     }
398     if ($boxz < $bm) {
399     $bm = $boxz;
400     }
401     $boxLength2 = 0.5*$bm;
402 chrisfen 3037 if ($boxLength2 > $cutoff){
403     # the default is good
404     } else {
405     $cutoff = int($boxLength2);
406     }
407     }
408    
409     sub findAlpha {
410     $alpha = $alphaInt - $cutoff*$alphaSlope;
411     }
412    
413     sub printFrameData {
414     print OUTFILE
415     " <Snapshot>
416     <FrameData>
417     Time: 0
418 gezelter 3113 Hmat: {{ $boxx, 0, 0 }, { 0, $boxy, 0 }, { 0, 0, $boxz }}
419 chrisfen 3037 </FrameData>\n";
420     }
421    
422     sub printWaterMD {
423     open(WATERMD, ">./water.md") || die "Error: can't open file water.md\n";
424     $waterFileHandle = 'WATERMD';
425    
426     print WATERMD "#ifndef _WATER_MD_\n#define _WATER_MD_\n";
427     printCl();
428     printNa();
429     printSSD_E();
430     printSSD_RF();
431     printSSD();
432     printSSD1();
433     printTRED();
434     printTIP3P();
435     printTIP4P();
436     printTIP4PEw();
437     printTIP5P();
438     printTIP5PE();
439     printSPCE();
440     printSPC();
441     printDPD();
442     print WATERMD "\n\n#endif";
443     }
444    
445     sub printCl {
446     print $waterFileHandle "\n\nmolecule{
447     name = \"Cl-\";
448    
449     atom[0]{
450     type = \"Cl-\";
451     position(0.0, 0.0, 0.0);
452     }
453     }"
454     }
455    
456     sub printNa {
457     print $waterFileHandle "\n\nmolecule{
458     name = \"Na+\";
459    
460     atom[0]{
461     type = \"Na+\";
462     position(0.0, 0.0, 0.0);
463     }
464     }"
465     }
466    
467     sub printSSD_E {
468     print $waterFileHandle "\n\nmolecule{
469     name = \"SSD_E\";
470    
471     atom[0]{
472     type = \"SSD_E\";
473     position( 0.0, 0.0, 0.0 );
474     orientation( 0.0, 0.0, 0.0 );
475     }
476     }"
477     }
478    
479     sub printSSD_RF {
480     print $waterFileHandle "\n\nmolecule{
481     name = \"SSD_RF\";
482    
483     atom[0]{
484     type = \"SSD_RF\";
485     position( 0.0, 0.0, 0.0 );
486     orientation( 0.0, 0.0, 0.0 );
487     }
488     }"
489     }
490    
491     sub printSSD {
492     print $waterFileHandle "\n\nmolecule{
493     name = \"SSD\";
494    
495     atom[0]{
496     type = \"SSD\";
497     position( 0.0, 0.0, 0.0 );
498     orientation( 0.0, 0.0, 0.0 );
499     }
500     }"
501     }
502    
503     sub printSSD1 {
504     print $waterFileHandle "\n\nmolecule{
505     name = \"SSD1\";
506    
507     atom[0]{
508     type = \"SSD1\";
509     position( 0.0, 0.0, 0.0 );
510     orientation( 0.0, 0.0, 0.0 );
511     }
512     }"
513     }
514    
515     sub printTRED {
516     print $waterFileHandle "\n\nmolecule{
517     name = \"TRED\";
518    
519     atom[0]{
520     type = \"TRED\";
521     position( 0.0, 0.0, 0.0 );
522     orientation( 0.0, 0.0, 0.0 );
523     }
524     atom[1]{
525     type = \"EP_TRED\";
526     position( 0.0, 0.0, 0.5 );
527     }
528    
529     rigidBody[0]{
530     members(0, 1);
531     }
532    
533     cutoffGroup{
534     members(0, 1);
535     }
536     }"
537     }
538    
539     sub printTIP3P {
540     print $waterFileHandle "\n\nmolecule{
541     name = \"TIP3P\";
542    
543     atom[0]{
544     type = \"O_TIP3P\";
545     position( 0.0, 0.0, -0.06556 );
546     }
547     atom[1]{
548     type = \"H_TIP3P\";
549     position( 0.0, 0.75695, 0.52032 );
550     }
551     atom[2]{
552     type = \"H_TIP3P\";
553     position( 0.0, -0.75695, 0.52032 );
554     }
555    
556     rigidBody[0]{
557     members(0, 1, 2);
558     }
559    
560     cutoffGroup{
561     members(0, 1, 2);
562     }
563     }"
564     }
565    
566     sub printTIP4P {
567     print $waterFileHandle "\n\nmolecule{
568     name = \"TIP4P\";
569    
570     atom[0]{
571     type = \"O_TIP4P\";
572     position( 0.0, 0.0, -0.06556 );
573     }
574     atom[1]{
575     type = \"H_TIP4P\";
576     position( 0.0, 0.75695, 0.52032 );
577     }
578     atom[2]{
579     type = \"H_TIP4P\";
580     position( 0.0, -0.75695, 0.52032 );
581     }
582     atom[3]{
583     type = \"EP_TIP4P\";
584     position( 0.0, 0.0, 0.08444 );
585     }
586    
587     rigidBody[0]{
588     members(0, 1, 2, 3);
589     }
590    
591     cutoffGroup{
592     members(0, 1, 2, 3);
593     }
594     }"
595     }
596    
597     sub printTIP4PEw {
598     print $waterFileHandle "\n\nmolecule{
599     name = \"TIP4P-Ew\";
600    
601     atom[0]{
602     type = \"O_TIP4P-Ew\";
603     position( 0.0, 0.0, -0.06556 );
604     }
605     atom[1]{
606     type = \"H_TIP4P-Ew\";
607     position( 0.0, 0.75695, 0.52032 );
608     }
609     atom[2]{
610     type = \"H_TIP4P-Ew\";
611     position( 0.0, -0.75695, 0.52032 );
612     }
613     atom[3]{
614     type = \"EP_TIP4P-Ew\";
615     position( 0.0, 0.0, 0.05944 );
616     }
617    
618     rigidBody[0]{
619     members(0, 1, 2, 3);
620     }
621    
622     cutoffGroup{
623     members(0, 1, 2, 3);
624     }
625     }"
626     }
627    
628     sub printTIP5P {
629     print $waterFileHandle "\n\nmolecule{
630     name = \"TIP5P\";
631    
632     atom[0]{
633     type = \"O_TIP5P\";
634     position( 0.0, 0.0, -0.06556 );
635     }
636     atom[1]{
637     type = \"H_TIP5P\";
638     position( 0.0, 0.75695, 0.52032 );
639     }
640     atom[2]{
641     type = \"H_TIP5P\";
642     position( 0.0, -0.75695, 0.52032 );
643     }
644     atom[3]{
645     type = \"EP_TIP5P\";
646     position( 0.57154, 0.0, -0.46971 );
647     }
648     atom[4]{
649     type = \"EP_TIP5P\";
650     position( -0.57154, 0.0, -0.46971 );
651     }
652    
653     rigidBody[0]{
654     members(0, 1, 2, 3, 4);
655     }
656    
657     cutoffGroup{
658     members(0, 1, 2, 3, 4);
659     }
660     }"
661     }
662    
663     sub printTIP5PE {
664     print $waterFileHandle "\n\nmolecule{
665     name = \"TIP5P-E\";
666    
667     atom[0]{
668     type = \"O_TIP5P-E\";
669     position( 0.0, 0.0, -0.06556 );
670     }
671     atom[1]{
672     type = \"H_TIP5P\";
673     position( 0.0, 0.75695, 0.52032 );
674     }
675     atom[2]{
676     type = \"H_TIP5P\";
677     position( 0.0, -0.75695, 0.52032 );
678     }
679     atom[3]{
680     type = \"EP_TIP5P\";
681     position( 0.57154, 0.0, -0.46971 );
682     }
683     atom[4]{
684     type = \"EP_TIP5P\";
685     position( -0.57154, 0.0, -0.46971 );
686     }
687    
688     rigidBody[0]{
689     members(0, 1, 2, 3, 4);
690     }
691    
692     cutoffGroup{
693     members(0, 1, 2, 3, 4);
694     }
695     }"
696     }
697    
698     sub printSPCE {
699     print $waterFileHandle "\n\nmolecule{
700     name = \"SPCE\";
701    
702     atom[0]{
703     type = \"O_SPCE\";
704     position( 0.0, 0.0, -0.06461 );
705     }
706     atom[1]{
707     type = \"H_SPCE\";
708     position( 0.0, 0.81649, 0.51275 );
709     }
710     atom[2]{
711     type = \"H_SPCE\";
712     position( 0.0, -0.81649, 0.51275 );
713     }
714    
715     rigidBody[0]{
716     members(0, 1, 2);
717     }
718    
719     cutoffGroup{
720     members(0, 1, 2);
721     }
722     }"
723     }
724    
725     sub printSPC {
726     print $waterFileHandle "\n\nmolecule{
727     name = \"SPC\";
728    
729     atom[0]{
730     type = \"O_SPC\";
731     position( 0.0, 0.0, -0.06461 );
732     }
733     atom[1]{
734     type = \"H_SPC\";
735     position( 0.0, 0.81649, 0.51275 );
736     }
737     atom[2]{
738     type = \"H_SPC\";
739     position( 0.0, -0.81649, 0.51275 );
740     }
741    
742     rigidBody[0]{
743     members(0, 1, 2);
744     }
745    
746     cutoffGroup{
747     members(0, 1, 2);
748     }
749     }"
750     }
751    
752     sub printDPD {
753     print $waterFileHandle "\n\nmolecule{
754     name = \"DPD\";
755    
756     atom[0]{
757     type = \"DPD\";
758     position(0.0, 0.0, 0.0);
759     }
760     }"
761     }
762    
763    
764     sub printFakeWater {
765     print $waterFileHandle "\n\nmolecule{
766     name = \"$waterName\";
767    
768     atom[0]{
769     type = \"$waterName\";
770     position(0.0, 0.0, 0.0);
771     }
772     }"
773     }
774    
775    
776     sub validateWater {
777     if ($waterName eq 'Cl-') { $waterCase = 0; }
778     elsif ($waterName eq 'Na+') { $waterCase = 1; }
779     elsif ($waterName eq 'SSD_E') { $waterCase = 2; }
780     elsif ($waterName eq 'SSD_RF') { $waterCase = 3; }
781     elsif ($waterName eq 'SSD') { $waterCase = 4; }
782     elsif ($waterName eq 'SSD1') { $waterCase = 5; }
783     elsif ($waterName eq 'TIP3P') { $waterCase = 6; }
784     elsif ($waterName eq 'TIP4P') { $waterCase = 7; }
785     elsif ($waterName eq 'TIP4P-Ew') { $waterCase = 8; }
786     elsif ($waterName eq 'TIP5P') { $waterCase = 9; }
787     elsif ($waterName eq 'TIP5P-E') { $waterCase = 10; }
788     elsif ($waterName eq 'SPCE') { $waterCase = 11; }
789     elsif ($waterName eq 'SPC') { $waterCase = 12; }
790     elsif ($waterName eq 'DPD') { $waterCase = 13; }
791     else { $invalidWater = 1; }
792     }
793    
794     sub printWaterModel {
795     if ($waterCase == 0) { printCl(); }
796     elsif ($waterCase == 1) { printNa(); }
797     elsif ($waterCase == 2) { printSSD_E(); }
798     elsif ($waterCase == 3) { printSSD_RF(); }
799     elsif ($waterCase == 4) { printSSD(); }
800     elsif ($waterCase == 5) { printSSD1(); }
801     elsif ($waterCase == 6) { printTIP3P(); }
802     elsif ($waterCase == 7) { printTIP4P(); }
803     elsif ($waterCase == 8) { printTIP4PEw(); }
804     elsif ($waterCase == 9) { printTIP5P(); }
805     elsif ($waterCase == 10) { printTIP5PE(); }
806     elsif ($waterCase == 11) { printSPCE(); }
807     elsif ($waterCase == 12) { printSPC(); }
808     elsif ($waterCase == 13) { printDPD(); }
809     }

Properties

Name Value
svn:executable *