ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/SimSetup.cpp
Revision: 656
Committed: Tue Jul 29 16:32:37 2003 UTC (20 years, 11 months ago) by mmeineke
File size: 35946 byte(s)
Log Message:
working on the props code

File Contents

# User Rev Content
1 mmeineke 377 #include <cstdlib>
2     #include <iostream>
3     #include <cmath>
4    
5     #include "SimSetup.hpp"
6     #include "parse_me.h"
7     #include "Integrator.hpp"
8     #include "simError.h"
9    
10     #ifdef IS_MPI
11     #include "mpiBASS.h"
12     #include "mpiSimulation.hpp"
13     #endif
14    
15 mmeineke 557 // some defines for ensemble and Forcefield cases
16    
17 gezelter 604 #define NVE_ENS 0
18     #define NVT_ENS 1
19     #define NPTi_ENS 2
20     #define NPTf_ENS 3
21     #define NPTim_ENS 4
22     #define NPTfm_ENS 5
23 mmeineke 557
24 mmeineke 582
25 mmeineke 557 #define FF_DUFF 0
26     #define FF_LJ 1
27 chuckv 653 #define FF_EAM 2
28 mmeineke 557
29 mmeineke 377 SimSetup::SimSetup(){
30 mmeineke 656
31     isInfoArray = 0;
32     nInfo = 1;
33    
34 mmeineke 377 stamps = new MakeStamps();
35     globals = new Globals();
36    
37 mmeineke 656
38 mmeineke 377 #ifdef IS_MPI
39     strcpy( checkPointMsg, "SimSetup creation successful" );
40     MPIcheckPoint();
41     #endif // IS_MPI
42     }
43    
44     SimSetup::~SimSetup(){
45     delete stamps;
46     delete globals;
47     }
48    
49 mmeineke 656 void SimSetup::setSimInfo( SimInfo* the_info, int theNinfo ) {
50     info = the_info;
51     nInfo = theNinfo;
52     isInfoArray = 1;
53     }
54    
55    
56 mmeineke 377 void SimSetup::parseFile( char* fileName ){
57    
58     #ifdef IS_MPI
59     if( worldRank == 0 ){
60     #endif // is_mpi
61    
62     inFileName = fileName;
63     set_interface_stamps( stamps, globals );
64    
65     #ifdef IS_MPI
66     mpiEventInit();
67     #endif
68    
69     yacc_BASS( fileName );
70    
71     #ifdef IS_MPI
72     throwMPIEvent(NULL);
73     }
74     else receiveParse();
75     #endif
76    
77     }
78    
79     #ifdef IS_MPI
80     void SimSetup::receiveParse(void){
81    
82     set_interface_stamps( stamps, globals );
83     mpiEventInit();
84     MPIcheckPoint();
85     mpiEventLoop();
86    
87     }
88    
89     #endif // is_mpi
90    
91     void SimSetup::createSim( void ){
92    
93 gezelter 490 int i, j, k, globalAtomIndex;
94 mmeineke 557
95 mmeineke 614 // gather all of the information from the Bass file
96 mmeineke 557
97 mmeineke 614 gatherInfo();
98 mmeineke 377
99 mmeineke 614 // creation of complex system objects
100 mmeineke 377
101 mmeineke 614 sysObjectsCreation();
102 mmeineke 377
103 mmeineke 614 // check on the post processing info
104 gezelter 394
105 mmeineke 614 finalInfoCheck();
106 mmeineke 377
107 mmeineke 614 // initialize the system coordinates
108 mmeineke 377
109 mmeineke 614 initSystemCoords();
110 mmeineke 377
111    
112 mmeineke 614 // make the output filenames
113 mmeineke 377
114 mmeineke 614 makeOutNames();
115 mmeineke 377
116 mmeineke 555 // make the integrator
117 mmeineke 561
118 mmeineke 616 makeIntegrator();
119 mmeineke 561
120 chuckv 432 #ifdef IS_MPI
121     mpiSim->mpiRefresh();
122     #endif
123 mmeineke 377
124 chuckv 432 // initialize the Fortran
125 mmeineke 377
126 mmeineke 616 initFortran();
127 chuckv 432
128 mmeineke 377
129    
130     }
131    
132 mmeineke 407
133     void SimSetup::makeMolecules( void ){
134    
135 mmeineke 412 int i, j, exI, exJ, tempEx, stampID, atomOffset, excludeOffset;
136 mmeineke 616 molInit molInfo;
137 mmeineke 407 DirectionalAtom* dAtom;
138 mmeineke 412 LinkedAssign* extras;
139     LinkedAssign* current_extra;
140 mmeineke 407 AtomStamp* currentAtom;
141     BondStamp* currentBond;
142     BendStamp* currentBend;
143     TorsionStamp* currentTorsion;
144 mmeineke 427
145     bond_pair* theBonds;
146     bend_set* theBends;
147     torsion_set* theTorsions;
148    
149 mmeineke 407
150     //init the forceField paramters
151    
152     the_ff->readParams();
153    
154    
155 mmeineke 427 // init the atoms
156 mmeineke 407
157 mmeineke 427 double ux, uy, uz, u, uSqr;
158    
159 mmeineke 407 atomOffset = 0;
160 mmeineke 412 excludeOffset = 0;
161 mmeineke 614 for(i=0; i<info->n_mol; i++){
162 mmeineke 407
163     stampID = the_molecules[i].getStampID();
164    
165 mmeineke 616 molInfo.nAtoms = comp_stamps[stampID]->getNAtoms();
166     molInfo.nBonds = comp_stamps[stampID]->getNBonds();
167     molInfo.nBends = comp_stamps[stampID]->getNBends();
168     molInfo.nTorsions = comp_stamps[stampID]->getNTorsions();
169     molInfo.nExcludes = molInfo.nBonds + molInfo.nBends + molInfo.nTorsions;
170 mmeineke 412
171 mmeineke 616 molInfo.myAtoms = &the_atoms[atomOffset];
172     molInfo.myExcludes = &the_excludes[excludeOffset];
173     molInfo.myBonds = new Bond*[molInfo.nBonds];
174     molInfo.myBends = new Bend*[molInfo.nBends];
175     molInfo.myTorsions = new Torsion*[molInfo.nTorsions];
176 mmeineke 407
177 mmeineke 616 theBonds = new bond_pair[molInfo.nBonds];
178     theBends = new bend_set[molInfo.nBends];
179     theTorsions = new torsion_set[molInfo.nTorsions];
180 mmeineke 407
181     // make the Atoms
182    
183 mmeineke 616 for(j=0; j<molInfo.nAtoms; j++){
184 mmeineke 407
185 mmeineke 427 currentAtom = comp_stamps[stampID]->getAtom( j );
186 mmeineke 407 if( currentAtom->haveOrientation() ){
187    
188     dAtom = new DirectionalAtom(j + atomOffset);
189 mmeineke 614 info->n_oriented++;
190 mmeineke 616 molInfo.myAtoms[j] = dAtom;
191 mmeineke 407
192     ux = currentAtom->getOrntX();
193     uy = currentAtom->getOrntY();
194     uz = currentAtom->getOrntZ();
195    
196     uSqr = (ux * ux) + (uy * uy) + (uz * uz);
197    
198     u = sqrt( uSqr );
199     ux = ux / u;
200     uy = uy / u;
201     uz = uz / u;
202    
203     dAtom->setSUx( ux );
204     dAtom->setSUy( uy );
205     dAtom->setSUz( uz );
206     }
207     else{
208 mmeineke 616 molInfo.myAtoms[j] = new GeneralAtom(j + atomOffset);
209 mmeineke 407 }
210 mmeineke 616 molInfo.myAtoms[j]->setType( currentAtom->getType() );
211 mmeineke 407
212     #ifdef IS_MPI
213    
214 mmeineke 616 molInfo.myAtoms[j]->setGlobalIndex( globalIndex[j+atomOffset] );
215 mmeineke 407
216     #endif // is_mpi
217     }
218    
219     // make the bonds
220 mmeineke 616 for(j=0; j<molInfo.nBonds; j++){
221 mmeineke 407
222     currentBond = comp_stamps[stampID]->getBond( j );
223     theBonds[j].a = currentBond->getA() + atomOffset;
224     theBonds[j].b = currentBond->getB() + atomOffset;
225    
226 mmeineke 435 exI = theBonds[j].a;
227     exJ = theBonds[j].b;
228 mmeineke 407
229     // exclude_I must always be the smaller of the pair
230     if( exI > exJ ){
231     tempEx = exI;
232     exI = exJ;
233     exJ = tempEx;
234     }
235     #ifdef IS_MPI
236 mmeineke 412 tempEx = exI;
237     exI = the_atoms[tempEx]->getGlobalIndex() + 1;
238     tempEx = exJ;
239     exJ = the_atoms[tempEx]->getGlobalIndex() + 1;
240 mmeineke 407
241 mmeineke 412 the_excludes[j+excludeOffset]->setPair( exI, exJ );
242     #else // isn't MPI
243 mmeineke 435
244 mmeineke 412 the_excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
245     #endif //is_mpi
246     }
247 mmeineke 616 excludeOffset += molInfo.nBonds;
248 mmeineke 412
249     //make the bends
250 mmeineke 616 for(j=0; j<molInfo.nBends; j++){
251 mmeineke 407
252 mmeineke 412 currentBend = comp_stamps[stampID]->getBend( j );
253     theBends[j].a = currentBend->getA() + atomOffset;
254     theBends[j].b = currentBend->getB() + atomOffset;
255     theBends[j].c = currentBend->getC() + atomOffset;
256    
257     if( currentBend->haveExtras() ){
258    
259 mmeineke 427 extras = currentBend->getExtras();
260 mmeineke 412 current_extra = extras;
261    
262     while( current_extra != NULL ){
263     if( !strcmp( current_extra->getlhs(), "ghostVectorSource" )){
264    
265     switch( current_extra->getType() ){
266    
267     case 0:
268     theBends[j].ghost =
269     current_extra->getInt() + atomOffset;
270     theBends[j].isGhost = 1;
271     break;
272    
273     case 1:
274     theBends[j].ghost =
275     (int)current_extra->getDouble() + atomOffset;
276     theBends[j].isGhost = 1;
277     break;
278    
279     default:
280     sprintf( painCave.errMsg,
281 chuckv 434 "SimSetup Error: ghostVectorSource was neither a "
282 mmeineke 412 "double nor an int.\n"
283     "-->Bend[%d] in %s\n",
284     j, comp_stamps[stampID]->getID() );
285     painCave.isFatal = 1;
286     simError();
287     }
288     }
289    
290     else{
291    
292     sprintf( painCave.errMsg,
293     "SimSetup Error: unhandled bend assignment:\n"
294     " -->%s in Bend[%d] in %s\n",
295     current_extra->getlhs(),
296     j, comp_stamps[stampID]->getID() );
297     painCave.isFatal = 1;
298     simError();
299     }
300    
301     current_extra = current_extra->getNext();
302     }
303     }
304    
305     if( !theBends[j].isGhost ){
306    
307     exI = theBends[j].a;
308     exJ = theBends[j].c;
309     }
310     else{
311    
312     exI = theBends[j].a;
313     exJ = theBends[j].b;
314     }
315    
316     // exclude_I must always be the smaller of the pair
317     if( exI > exJ ){
318     tempEx = exI;
319     exI = exJ;
320     exJ = tempEx;
321     }
322     #ifdef IS_MPI
323     tempEx = exI;
324     exI = the_atoms[tempEx]->getGlobalIndex() + 1;
325     tempEx = exJ;
326     exJ = the_atoms[tempEx]->getGlobalIndex() + 1;
327    
328     the_excludes[j+excludeOffset]->setPair( exI, exJ );
329 mmeineke 407 #else // isn't MPI
330 mmeineke 412 the_excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
331     #endif //is_mpi
332     }
333 mmeineke 616 excludeOffset += molInfo.nBends;
334 mmeineke 412
335 mmeineke 616 for(j=0; j<molInfo.nTorsions; j++){
336 mmeineke 407
337 mmeineke 412 currentTorsion = comp_stamps[stampID]->getTorsion( j );
338     theTorsions[j].a = currentTorsion->getA() + atomOffset;
339     theTorsions[j].b = currentTorsion->getB() + atomOffset;
340     theTorsions[j].c = currentTorsion->getC() + atomOffset;
341     theTorsions[j].d = currentTorsion->getD() + atomOffset;
342    
343     exI = theTorsions[j].a;
344     exJ = theTorsions[j].d;
345 mmeineke 407
346 mmeineke 412 // exclude_I must always be the smaller of the pair
347     if( exI > exJ ){
348     tempEx = exI;
349     exI = exJ;
350     exJ = tempEx;
351     }
352     #ifdef IS_MPI
353     tempEx = exI;
354     exI = the_atoms[tempEx]->getGlobalIndex() + 1;
355     tempEx = exJ;
356     exJ = the_atoms[tempEx]->getGlobalIndex() + 1;
357    
358     the_excludes[j+excludeOffset]->setPair( exI, exJ );
359     #else // isn't MPI
360     the_excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
361 mmeineke 407 #endif //is_mpi
362 mmeineke 412 }
363 mmeineke 616 excludeOffset += molInfo.nTorsions;
364 mmeineke 412
365 mmeineke 407
366 mmeineke 414 // send the arrays off to the forceField for init.
367 mmeineke 407
368 mmeineke 616 the_ff->initializeAtoms( molInfo.nAtoms, molInfo.myAtoms );
369     the_ff->initializeBonds( molInfo.nBonds, molInfo.myBonds, theBonds );
370     the_ff->initializeBends( molInfo.nBends, molInfo.myBends, theBends );
371     the_ff->initializeTorsions( molInfo.nTorsions, molInfo.myTorsions, theTorsions );
372 mmeineke 407
373    
374 mmeineke 616 the_molecules[i].initialize( molInfo );
375 chuckv 438
376    
377 mmeineke 616 atomOffset += molInfo.nAtoms;
378 mmeineke 427 delete[] theBonds;
379     delete[] theBends;
380     delete[] theTorsions;
381 mmeineke 414 }
382 mmeineke 407
383 chuckv 434 #ifdef IS_MPI
384     sprintf( checkPointMsg, "all molecules initialized succesfully" );
385     MPIcheckPoint();
386     #endif // is_mpi
387    
388 mmeineke 414 // clean up the forcefield
389 mmeineke 420 the_ff->calcRcut();
390 mmeineke 414 the_ff->cleanMe();
391 chuckv 434
392 mmeineke 414 }
393 mmeineke 407
394 mmeineke 377 void SimSetup::initFromBass( void ){
395    
396     int i, j, k;
397     int n_cells;
398     double cellx, celly, cellz;
399     double temp1, temp2, temp3;
400     int n_per_extra;
401     int n_extra;
402     int have_extra, done;
403    
404     temp1 = (double)tot_nmol / 4.0;
405     temp2 = pow( temp1, ( 1.0 / 3.0 ) );
406     temp3 = ceil( temp2 );
407    
408     have_extra =0;
409     if( temp2 < temp3 ){ // we have a non-complete lattice
410     have_extra =1;
411    
412     n_cells = (int)temp3 - 1;
413 gezelter 621 cellx = info->boxL[0] / temp3;
414     celly = info->boxL[1] / temp3;
415     cellz = info->boxL[2] / temp3;
416 mmeineke 377 n_extra = tot_nmol - ( 4 * n_cells * n_cells * n_cells );
417     temp1 = ((double)n_extra) / ( pow( temp3, 3.0 ) - pow( n_cells, 3.0 ) );
418     n_per_extra = (int)ceil( temp1 );
419    
420     if( n_per_extra > 4){
421     sprintf( painCave.errMsg,
422     "SimSetup error. There has been an error in constructing"
423     " the non-complete lattice.\n" );
424     painCave.isFatal = 1;
425     simError();
426     }
427     }
428     else{
429     n_cells = (int)temp3;
430 gezelter 621 cellx = info->boxL[0] / temp3;
431     celly = info->boxL[1] / temp3;
432     cellz = info->boxL[2] / temp3;
433 mmeineke 377 }
434    
435     current_mol = 0;
436     current_comp_mol = 0;
437     current_comp = 0;
438     current_atom_ndx = 0;
439    
440     for( i=0; i < n_cells ; i++ ){
441     for( j=0; j < n_cells; j++ ){
442     for( k=0; k < n_cells; k++ ){
443    
444     makeElement( i * cellx,
445     j * celly,
446     k * cellz );
447    
448     makeElement( i * cellx + 0.5 * cellx,
449     j * celly + 0.5 * celly,
450     k * cellz );
451    
452     makeElement( i * cellx,
453     j * celly + 0.5 * celly,
454     k * cellz + 0.5 * cellz );
455    
456     makeElement( i * cellx + 0.5 * cellx,
457     j * celly,
458     k * cellz + 0.5 * cellz );
459     }
460     }
461     }
462    
463     if( have_extra ){
464     done = 0;
465    
466     int start_ndx;
467     for( i=0; i < (n_cells+1) && !done; i++ ){
468     for( j=0; j < (n_cells+1) && !done; j++ ){
469    
470     if( i < n_cells ){
471    
472     if( j < n_cells ){
473     start_ndx = n_cells;
474     }
475     else start_ndx = 0;
476     }
477     else start_ndx = 0;
478    
479     for( k=start_ndx; k < (n_cells+1) && !done; k++ ){
480    
481     makeElement( i * cellx,
482     j * celly,
483     k * cellz );
484     done = ( current_mol >= tot_nmol );
485    
486     if( !done && n_per_extra > 1 ){
487     makeElement( i * cellx + 0.5 * cellx,
488     j * celly + 0.5 * celly,
489     k * cellz );
490     done = ( current_mol >= tot_nmol );
491     }
492    
493     if( !done && n_per_extra > 2){
494     makeElement( i * cellx,
495     j * celly + 0.5 * celly,
496     k * cellz + 0.5 * cellz );
497     done = ( current_mol >= tot_nmol );
498     }
499    
500     if( !done && n_per_extra > 3){
501     makeElement( i * cellx + 0.5 * cellx,
502     j * celly,
503     k * cellz + 0.5 * cellz );
504     done = ( current_mol >= tot_nmol );
505     }
506     }
507     }
508     }
509     }
510    
511    
512 mmeineke 614 for( i=0; i<info->n_atoms; i++ ){
513     info->atoms[i]->set_vx( 0.0 );
514     info->atoms[i]->set_vy( 0.0 );
515     info->atoms[i]->set_vz( 0.0 );
516 mmeineke 377 }
517     }
518    
519     void SimSetup::makeElement( double x, double y, double z ){
520    
521     int k;
522     AtomStamp* current_atom;
523     DirectionalAtom* dAtom;
524     double rotMat[3][3];
525    
526     for( k=0; k<comp_stamps[current_comp]->getNAtoms(); k++ ){
527    
528     current_atom = comp_stamps[current_comp]->getAtom( k );
529     if( !current_atom->havePosition() ){
530     sprintf( painCave.errMsg,
531     "SimSetup:initFromBass error.\n"
532     "\tComponent %s, atom %s does not have a position specified.\n"
533     "\tThe initialization routine is unable to give a start"
534     " position.\n",
535     comp_stamps[current_comp]->getID(),
536     current_atom->getType() );
537     painCave.isFatal = 1;
538     simError();
539     }
540    
541     the_atoms[current_atom_ndx]->setX( x + current_atom->getPosX() );
542     the_atoms[current_atom_ndx]->setY( y + current_atom->getPosY() );
543     the_atoms[current_atom_ndx]->setZ( z + current_atom->getPosZ() );
544    
545     if( the_atoms[current_atom_ndx]->isDirectional() ){
546    
547     dAtom = (DirectionalAtom *)the_atoms[current_atom_ndx];
548    
549     rotMat[0][0] = 1.0;
550     rotMat[0][1] = 0.0;
551     rotMat[0][2] = 0.0;
552    
553     rotMat[1][0] = 0.0;
554     rotMat[1][1] = 1.0;
555     rotMat[1][2] = 0.0;
556    
557     rotMat[2][0] = 0.0;
558     rotMat[2][1] = 0.0;
559     rotMat[2][2] = 1.0;
560    
561     dAtom->setA( rotMat );
562     }
563    
564     current_atom_ndx++;
565     }
566    
567     current_mol++;
568     current_comp_mol++;
569    
570     if( current_comp_mol >= components_nmol[current_comp] ){
571    
572     current_comp_mol = 0;
573     current_comp++;
574     }
575     }
576 mmeineke 614
577    
578     void SimSetup::gatherInfo( void ){
579 mmeineke 616 int i,j,k;
580 mmeineke 614
581     ensembleCase = -1;
582     ffCase = -1;
583    
584     // get the stamps and globals;
585 mmeineke 616 stamps = stamps;
586     globals = globals;
587 mmeineke 614
588     // set the easy ones first
589 mmeineke 616 info->target_temp = globals->getTargetTemp();
590     info->dt = globals->getDt();
591     info->run_time = globals->getRunTime();
592     n_components = globals->getNComponents();
593 mmeineke 614
594    
595     // get the forceField
596    
597 mmeineke 616 strcpy( force_field, globals->getForceField() );
598 mmeineke 614
599     if( !strcasecmp( force_field, "DUFF" )) ffCase = FF_DUFF;
600     else if( !strcasecmp( force_field, "LJ" )) ffCase = FF_LJ;
601 chuckv 653 else if( !strcasecmp( force_field, "EAM" )) ffCase = FF_EAM;
602 mmeineke 614 else{
603     sprintf( painCave.errMsg,
604     "SimSetup Error. Unrecognized force field -> %s\n",
605     force_field );
606     painCave.isFatal = 1;
607     simError();
608     }
609    
610     // get the ensemble
611    
612 mmeineke 616 strcpy( ensemble, globals->getEnsemble() );
613 mmeineke 614
614     if( !strcasecmp( ensemble, "NVE" )) ensembleCase = NVE_ENS;
615     else if( !strcasecmp( ensemble, "NVT" )) ensembleCase = NVT_ENS;
616     else if( !strcasecmp( ensemble, "NPTi" ) || !strcasecmp( ensemble, "NPT") )
617     ensembleCase = NPTi_ENS;
618     else if( !strcasecmp( ensemble, "NPTf" )) ensembleCase = NPTf_ENS;
619     else if( !strcasecmp( ensemble, "NPTim" )) ensembleCase = NPTim_ENS;
620     else if( !strcasecmp( ensemble, "NPTfm" )) ensembleCase = NPTfm_ENS;
621     else{
622     sprintf( painCave.errMsg,
623     "SimSetup Warning. Unrecognized Ensemble -> %s, "
624     "reverting to NVE for this simulation.\n",
625     ensemble );
626     painCave.isFatal = 0;
627     simError();
628     strcpy( ensemble, "NVE" );
629     ensembleCase = NVE_ENS;
630     }
631     strcpy( info->ensemble, ensemble );
632    
633     // get the mixing rule
634    
635 mmeineke 616 strcpy( info->mixingRule, globals->getMixingRule() );
636     info->usePBC = globals->getPBC();
637 mmeineke 614
638    
639     // get the components and calculate the tot_nMol and indvidual n_mol
640    
641 mmeineke 616 the_components = globals->getComponents();
642 mmeineke 614 components_nmol = new int[n_components];
643    
644    
645 mmeineke 616 if( !globals->haveNMol() ){
646 mmeineke 614 // we don't have the total number of molecules, so we assume it is
647     // given in each component
648    
649     tot_nmol = 0;
650     for( i=0; i<n_components; i++ ){
651    
652     if( !the_components[i]->haveNMol() ){
653     // we have a problem
654     sprintf( painCave.errMsg,
655     "SimSetup Error. No global NMol or component NMol"
656     " given. Cannot calculate the number of atoms.\n" );
657     painCave.isFatal = 1;
658     simError();
659     }
660    
661     tot_nmol += the_components[i]->getNMol();
662     components_nmol[i] = the_components[i]->getNMol();
663     }
664     }
665     else{
666     sprintf( painCave.errMsg,
667     "SimSetup error.\n"
668     "\tSorry, the ability to specify total"
669     " nMols and then give molfractions in the components\n"
670     "\tis not currently supported."
671     " Please give nMol in the components.\n" );
672     painCave.isFatal = 1;
673     simError();
674     }
675    
676     // set the status, sample, and thermal kick times
677    
678 mmeineke 616 if( globals->haveSampleTime() ){
679     info->sampleTime = globals->getSampleTime();
680 mmeineke 614 info->statusTime = info->sampleTime;
681     info->thermalTime = info->sampleTime;
682     }
683     else{
684 mmeineke 616 info->sampleTime = globals->getRunTime();
685 mmeineke 614 info->statusTime = info->sampleTime;
686     info->thermalTime = info->sampleTime;
687     }
688    
689 mmeineke 616 if( globals->haveStatusTime() ){
690     info->statusTime = globals->getStatusTime();
691 mmeineke 614 }
692    
693 mmeineke 616 if( globals->haveThermalTime() ){
694     info->thermalTime = globals->getThermalTime();
695 mmeineke 614 }
696    
697     // check for the temperature set flag
698    
699 mmeineke 616 if( globals->haveTempSet() ) info->setTemp = globals->getTempSet();
700 mmeineke 614
701     // get some of the tricky things that may still be in the globals
702    
703     double boxVector[3];
704 mmeineke 616 if( globals->haveBox() ){
705     boxVector[0] = globals->getBox();
706     boxVector[1] = globals->getBox();
707     boxVector[2] = globals->getBox();
708 mmeineke 614
709     info->setBox( boxVector );
710     }
711 mmeineke 616 else if( globals->haveDensity() ){
712 mmeineke 614
713     double vol;
714 mmeineke 616 vol = (double)tot_nmol / globals->getDensity();
715 mmeineke 614 boxVector[0] = pow( vol, ( 1.0 / 3.0 ) );
716     boxVector[1] = boxVector[0];
717     boxVector[2] = boxVector[0];
718    
719     info->setBox( boxVector );
720     }
721     else{
722 mmeineke 616 if( !globals->haveBoxX() ){
723 mmeineke 614 sprintf( painCave.errMsg,
724     "SimSetup error, no periodic BoxX size given.\n" );
725     painCave.isFatal = 1;
726     simError();
727     }
728 mmeineke 616 boxVector[0] = globals->getBoxX();
729 mmeineke 614
730 mmeineke 616 if( !globals->haveBoxY() ){
731 mmeineke 614 sprintf( painCave.errMsg,
732     "SimSetup error, no periodic BoxY size given.\n" );
733     painCave.isFatal = 1;
734     simError();
735     }
736 mmeineke 616 boxVector[1] = globals->getBoxY();
737 mmeineke 614
738 mmeineke 616 if( !globals->haveBoxZ() ){
739 mmeineke 614 sprintf( painCave.errMsg,
740     "SimSetup error, no periodic BoxZ size given.\n" );
741     painCave.isFatal = 1;
742     simError();
743     }
744 mmeineke 616 boxVector[2] = globals->getBoxZ();
745 mmeineke 614
746     info->setBox( boxVector );
747     }
748    
749    
750    
751     #ifdef IS_MPI
752     strcpy( checkPointMsg, "Succesfully gathered all information from Bass\n" );
753     MPIcheckPoint();
754     #endif // is_mpi
755    
756     }
757    
758    
759     void SimSetup::finalInfoCheck( void ){
760     int index;
761     int usesDipoles;
762    
763    
764     // check electrostatic parameters
765    
766     index = 0;
767     usesDipoles = 0;
768     while( (index < info->n_atoms) && !usesDipoles ){
769     usesDipoles = ((info->atoms)[index])->hasDipole();
770     index++;
771     }
772    
773     #ifdef IS_MPI
774 mmeineke 616 int myUse = usesDipoles;
775     MPI_Allreduce( &myUse, &usesDipoles, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD );
776 mmeineke 614 #endif //is_mpi
777    
778 mmeineke 626 double theEcr, theEst;
779 mmeineke 614
780 mmeineke 616 if (globals->getUseRF() ) {
781 mmeineke 614 info->useReactionField = 1;
782    
783 mmeineke 616 if( !globals->haveECR() ){
784 mmeineke 614 sprintf( painCave.errMsg,
785     "SimSetup Warning: using default value of 1/2 the smallest "
786     "box length for the electrostaticCutoffRadius.\n"
787     "I hope you have a very fast processor!\n");
788     painCave.isFatal = 0;
789     simError();
790     double smallest;
791 gezelter 621 smallest = info->boxL[0];
792     if (info->boxL[1] <= smallest) smallest = info->boxL[1];
793     if (info->boxL[2] <= smallest) smallest = info->boxL[2];
794 mmeineke 626 theEcr = 0.5 * smallest;
795 mmeineke 614 } else {
796 mmeineke 626 theEcr = globals->getECR();
797 mmeineke 614 }
798    
799 mmeineke 616 if( !globals->haveEST() ){
800 mmeineke 614 sprintf( painCave.errMsg,
801     "SimSetup Warning: using default value of 0.05 * the "
802     "electrostaticCutoffRadius for the electrostaticSkinThickness\n"
803     );
804     painCave.isFatal = 0;
805     simError();
806 mmeineke 626 theEst = 0.05 * theEcr;
807 mmeineke 614 } else {
808 mmeineke 626 theEst= globals->getEST();
809 mmeineke 614 }
810 mmeineke 626
811     info->setEcr( theEcr, theEst );
812 mmeineke 614
813 mmeineke 616 if(!globals->haveDielectric() ){
814 mmeineke 614 sprintf( painCave.errMsg,
815     "SimSetup Error: You are trying to use Reaction Field without"
816     "setting a dielectric constant!\n"
817     );
818     painCave.isFatal = 1;
819     simError();
820     }
821 mmeineke 616 info->dielectric = globals->getDielectric();
822 mmeineke 614 }
823     else {
824     if (usesDipoles) {
825    
826 mmeineke 616 if( !globals->haveECR() ){
827 mmeineke 626 sprintf( painCave.errMsg,
828     "SimSetup Warning: using default value of 1/2 the smallest "
829     "box length for the electrostaticCutoffRadius.\n"
830     "I hope you have a very fast processor!\n");
831     painCave.isFatal = 0;
832     simError();
833     double smallest;
834     smallest = info->boxL[0];
835     if (info->boxL[1] <= smallest) smallest = info->boxL[1];
836     if (info->boxL[2] <= smallest) smallest = info->boxL[2];
837     theEcr = 0.5 * smallest;
838 mmeineke 614 } else {
839 mmeineke 626 theEcr = globals->getECR();
840 mmeineke 614 }
841    
842 mmeineke 616 if( !globals->haveEST() ){
843 mmeineke 626 sprintf( painCave.errMsg,
844     "SimSetup Warning: using default value of 0.05 * the "
845     "electrostaticCutoffRadius for the "
846     "electrostaticSkinThickness\n"
847     );
848     painCave.isFatal = 0;
849     simError();
850     theEst = 0.05 * theEcr;
851 mmeineke 614 } else {
852 mmeineke 626 theEst= globals->getEST();
853 mmeineke 614 }
854 mmeineke 626
855     info->setEcr( theEcr, theEst );
856 mmeineke 614 }
857     }
858    
859     #ifdef IS_MPI
860     strcpy( checkPointMsg, "post processing checks out" );
861     MPIcheckPoint();
862     #endif // is_mpi
863    
864     }
865    
866     void SimSetup::initSystemCoords( void ){
867    
868 mmeineke 616 if( globals->haveInitialConfig() ){
869 mmeineke 614
870     InitializeFromFile* fileInit;
871     #ifdef IS_MPI // is_mpi
872     if( worldRank == 0 ){
873     #endif //is_mpi
874 mmeineke 616 fileInit = new InitializeFromFile( globals->getInitialConfig() );
875 mmeineke 614 #ifdef IS_MPI
876     }else fileInit = new InitializeFromFile( NULL );
877     #endif
878 mmeineke 644 fileInit->readInit( info ); // default velocities on
879 mmeineke 614
880     delete fileInit;
881     }
882     else{
883    
884     #ifdef IS_MPI
885    
886     // no init from bass
887    
888     sprintf( painCave.errMsg,
889     "Cannot intialize a parallel simulation without an initial configuration file.\n" );
890     painCave.isFatal;
891     simError();
892    
893     #else
894    
895     initFromBass();
896    
897    
898     #endif
899     }
900    
901     #ifdef IS_MPI
902     strcpy( checkPointMsg, "Successfully read in the initial configuration" );
903     MPIcheckPoint();
904     #endif // is_mpi
905    
906     }
907    
908    
909     void SimSetup::makeOutNames( void ){
910    
911     #ifdef IS_MPI
912     if( worldRank == 0 ){
913     #endif // is_mpi
914    
915 mmeineke 616 if( globals->haveFinalConfig() ){
916     strcpy( info->finalName, globals->getFinalConfig() );
917 mmeineke 614 }
918     else{
919     strcpy( info->finalName, inFileName );
920     char* endTest;
921     int nameLength = strlen( info->finalName );
922     endTest = &(info->finalName[nameLength - 5]);
923     if( !strcmp( endTest, ".bass" ) ){
924     strcpy( endTest, ".eor" );
925     }
926     else if( !strcmp( endTest, ".BASS" ) ){
927     strcpy( endTest, ".eor" );
928     }
929     else{
930     endTest = &(info->finalName[nameLength - 4]);
931     if( !strcmp( endTest, ".bss" ) ){
932     strcpy( endTest, ".eor" );
933     }
934     else if( !strcmp( endTest, ".mdl" ) ){
935     strcpy( endTest, ".eor" );
936     }
937     else{
938     strcat( info->finalName, ".eor" );
939     }
940     }
941     }
942    
943     // make the sample and status out names
944    
945     strcpy( info->sampleName, inFileName );
946     char* endTest;
947     int nameLength = strlen( info->sampleName );
948     endTest = &(info->sampleName[nameLength - 5]);
949     if( !strcmp( endTest, ".bass" ) ){
950     strcpy( endTest, ".dump" );
951     }
952     else if( !strcmp( endTest, ".BASS" ) ){
953     strcpy( endTest, ".dump" );
954     }
955     else{
956     endTest = &(info->sampleName[nameLength - 4]);
957     if( !strcmp( endTest, ".bss" ) ){
958     strcpy( endTest, ".dump" );
959     }
960     else if( !strcmp( endTest, ".mdl" ) ){
961     strcpy( endTest, ".dump" );
962     }
963     else{
964     strcat( info->sampleName, ".dump" );
965     }
966     }
967    
968     strcpy( info->statusName, inFileName );
969     nameLength = strlen( info->statusName );
970     endTest = &(info->statusName[nameLength - 5]);
971     if( !strcmp( endTest, ".bass" ) ){
972     strcpy( endTest, ".stat" );
973     }
974     else if( !strcmp( endTest, ".BASS" ) ){
975     strcpy( endTest, ".stat" );
976     }
977     else{
978     endTest = &(info->statusName[nameLength - 4]);
979     if( !strcmp( endTest, ".bss" ) ){
980     strcpy( endTest, ".stat" );
981     }
982     else if( !strcmp( endTest, ".mdl" ) ){
983     strcpy( endTest, ".stat" );
984     }
985     else{
986     strcat( info->statusName, ".stat" );
987     }
988     }
989    
990     #ifdef IS_MPI
991     }
992     #endif // is_mpi
993    
994     }
995    
996    
997     void SimSetup::sysObjectsCreation( void ){
998    
999 mmeineke 616 int i;
1000    
1001 mmeineke 614 // create the forceField
1002    
1003     createFF();
1004    
1005     // extract componentList
1006    
1007     compList();
1008    
1009     // calc the number of atoms, bond, bends, and torsions
1010    
1011     calcSysValues();
1012    
1013     #ifdef IS_MPI
1014     // divide the molecules among the processors
1015    
1016     mpiMolDivide();
1017     #endif //is_mpi
1018    
1019     // create the atom and SRI arrays. Also initialize Molecule Stamp ID's
1020    
1021     makeSysArrays();
1022    
1023 mmeineke 616 // make and initialize the molecules (all but atomic coordinates)
1024 mmeineke 614
1025 mmeineke 616 makeMolecules();
1026     info->identArray = new int[info->n_atoms];
1027     for(i=0; i<info->n_atoms; i++){
1028     info->identArray[i] = the_atoms[i]->getIdent();
1029     }
1030    
1031 mmeineke 614
1032    
1033     }
1034    
1035    
1036     void SimSetup::createFF( void ){
1037    
1038     switch( ffCase ){
1039    
1040     case FF_DUFF:
1041     the_ff = new DUFF();
1042     break;
1043    
1044     case FF_LJ:
1045     the_ff = new LJFF();
1046     break;
1047    
1048 chuckv 653 case FF_EAM:
1049     the_ff = new EAM_FF();
1050     break;
1051    
1052 mmeineke 614 default:
1053     sprintf( painCave.errMsg,
1054     "SimSetup Error. Unrecognized force field in case statement.\n");
1055     painCave.isFatal = 1;
1056     simError();
1057     }
1058    
1059     #ifdef IS_MPI
1060     strcpy( checkPointMsg, "ForceField creation successful" );
1061     MPIcheckPoint();
1062     #endif // is_mpi
1063    
1064     }
1065    
1066    
1067     void SimSetup::compList( void ){
1068    
1069 mmeineke 616 int i;
1070    
1071 mmeineke 614 comp_stamps = new MoleculeStamp*[n_components];
1072    
1073     // make an array of molecule stamps that match the components used.
1074     // also extract the used stamps out into a separate linked list
1075    
1076     info->nComponents = n_components;
1077     info->componentsNmol = components_nmol;
1078     info->compStamps = comp_stamps;
1079     info->headStamp = new LinkedMolStamp();
1080    
1081     char* id;
1082     LinkedMolStamp* headStamp = info->headStamp;
1083     LinkedMolStamp* currentStamp = NULL;
1084     for( i=0; i<n_components; i++ ){
1085    
1086     id = the_components[i]->getType();
1087     comp_stamps[i] = NULL;
1088    
1089     // check to make sure the component isn't already in the list
1090    
1091     comp_stamps[i] = headStamp->match( id );
1092     if( comp_stamps[i] == NULL ){
1093    
1094     // extract the component from the list;
1095    
1096 mmeineke 616 currentStamp = stamps->extractMolStamp( id );
1097 mmeineke 614 if( currentStamp == NULL ){
1098     sprintf( painCave.errMsg,
1099     "SimSetup error: Component \"%s\" was not found in the "
1100     "list of declared molecules\n",
1101     id );
1102     painCave.isFatal = 1;
1103     simError();
1104     }
1105    
1106     headStamp->add( currentStamp );
1107     comp_stamps[i] = headStamp->match( id );
1108     }
1109     }
1110    
1111     #ifdef IS_MPI
1112     strcpy( checkPointMsg, "Component stamps successfully extracted\n" );
1113     MPIcheckPoint();
1114     #endif // is_mpi
1115    
1116    
1117     }
1118    
1119     void SimSetup::calcSysValues( void ){
1120 mmeineke 616 int i, j, k;
1121 mmeineke 614
1122 mmeineke 616
1123 mmeineke 614 tot_atoms = 0;
1124     tot_bonds = 0;
1125     tot_bends = 0;
1126     tot_torsions = 0;
1127     for( i=0; i<n_components; i++ ){
1128    
1129     tot_atoms += components_nmol[i] * comp_stamps[i]->getNAtoms();
1130     tot_bonds += components_nmol[i] * comp_stamps[i]->getNBonds();
1131     tot_bends += components_nmol[i] * comp_stamps[i]->getNBends();
1132     tot_torsions += components_nmol[i] * comp_stamps[i]->getNTorsions();
1133     }
1134    
1135     tot_SRI = tot_bonds + tot_bends + tot_torsions;
1136    
1137     info->n_atoms = tot_atoms;
1138     info->n_bonds = tot_bonds;
1139     info->n_bends = tot_bends;
1140     info->n_torsions = tot_torsions;
1141     info->n_SRI = tot_SRI;
1142     info->n_mol = tot_nmol;
1143    
1144     info->molMembershipArray = new int[tot_atoms];
1145     }
1146    
1147    
1148     #ifdef IS_MPI
1149    
1150     void SimSetup::mpiMolDivide( void ){
1151    
1152 mmeineke 616 int i, j, k;
1153 mmeineke 614 int localMol, allMol;
1154     int local_atoms, local_bonds, local_bends, local_torsions, local_SRI;
1155    
1156     mpiSim = new mpiSimulation( info );
1157    
1158     globalIndex = mpiSim->divideLabor();
1159    
1160     // set up the local variables
1161    
1162     mol2proc = mpiSim->getMolToProcMap();
1163     molCompType = mpiSim->getMolComponentType();
1164    
1165     allMol = 0;
1166     localMol = 0;
1167     local_atoms = 0;
1168     local_bonds = 0;
1169     local_bends = 0;
1170     local_torsions = 0;
1171     globalAtomIndex = 0;
1172    
1173    
1174     for( i=0; i<n_components; i++ ){
1175    
1176     for( j=0; j<components_nmol[i]; j++ ){
1177    
1178     if( mol2proc[allMol] == worldRank ){
1179    
1180     local_atoms += comp_stamps[i]->getNAtoms();
1181     local_bonds += comp_stamps[i]->getNBonds();
1182     local_bends += comp_stamps[i]->getNBends();
1183     local_torsions += comp_stamps[i]->getNTorsions();
1184     localMol++;
1185     }
1186     for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1187     info->molMembershipArray[globalAtomIndex] = allMol;
1188     globalAtomIndex++;
1189     }
1190    
1191     allMol++;
1192     }
1193     }
1194     local_SRI = local_bonds + local_bends + local_torsions;
1195    
1196     info->n_atoms = mpiSim->getMyNlocal();
1197    
1198     if( local_atoms != info->n_atoms ){
1199     sprintf( painCave.errMsg,
1200     "SimSetup error: mpiSim's localAtom (%d) and SimSetup's"
1201     " localAtom (%d) are not equal.\n",
1202     info->n_atoms,
1203     local_atoms );
1204     painCave.isFatal = 1;
1205     simError();
1206     }
1207    
1208     info->n_bonds = local_bonds;
1209     info->n_bends = local_bends;
1210     info->n_torsions = local_torsions;
1211     info->n_SRI = local_SRI;
1212     info->n_mol = localMol;
1213    
1214     strcpy( checkPointMsg, "Passed nlocal consistency check." );
1215     MPIcheckPoint();
1216     }
1217    
1218     #endif // is_mpi
1219    
1220    
1221     void SimSetup::makeSysArrays( void ){
1222 mmeineke 616 int i, j, k;
1223 mmeineke 614
1224 mmeineke 616
1225 mmeineke 614 // create the atom and short range interaction arrays
1226    
1227     Atom::createArrays(info->n_atoms);
1228     the_atoms = new Atom*[info->n_atoms];
1229     the_molecules = new Molecule[info->n_mol];
1230     int molIndex;
1231    
1232     // initialize the molecule's stampID's
1233    
1234     #ifdef IS_MPI
1235    
1236    
1237     molIndex = 0;
1238     for(i=0; i<mpiSim->getTotNmol(); i++){
1239    
1240     if(mol2proc[i] == worldRank ){
1241     the_molecules[molIndex].setStampID( molCompType[i] );
1242     the_molecules[molIndex].setMyIndex( molIndex );
1243     the_molecules[molIndex].setGlobalIndex( i );
1244     molIndex++;
1245     }
1246     }
1247    
1248     #else // is_mpi
1249    
1250     molIndex = 0;
1251     globalAtomIndex = 0;
1252     for(i=0; i<n_components; i++){
1253     for(j=0; j<components_nmol[i]; j++ ){
1254     the_molecules[molIndex].setStampID( i );
1255     the_molecules[molIndex].setMyIndex( molIndex );
1256     the_molecules[molIndex].setGlobalIndex( molIndex );
1257     for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1258     info->molMembershipArray[globalAtomIndex] = molIndex;
1259     globalAtomIndex++;
1260     }
1261     molIndex++;
1262     }
1263     }
1264    
1265    
1266     #endif // is_mpi
1267    
1268    
1269     if( info->n_SRI ){
1270    
1271     Exclude::createArray(info->n_SRI);
1272     the_excludes = new Exclude*[info->n_SRI];
1273     for( int ex=0; ex<info->n_SRI; ex++) the_excludes[ex] = new Exclude(ex);
1274     info->globalExcludes = new int;
1275     info->n_exclude = info->n_SRI;
1276     }
1277     else{
1278    
1279     Exclude::createArray( 1 );
1280     the_excludes = new Exclude*;
1281     the_excludes[0] = new Exclude(0);
1282     the_excludes[0]->setPair( 0,0 );
1283     info->globalExcludes = new int;
1284     info->globalExcludes[0] = 0;
1285     info->n_exclude = 0;
1286     }
1287    
1288     // set the arrays into the SimInfo object
1289    
1290     info->atoms = the_atoms;
1291     info->molecules = the_molecules;
1292     info->nGlobalExcludes = 0;
1293     info->excludes = the_excludes;
1294    
1295     the_ff->setSimInfo( info );
1296    
1297     }
1298 mmeineke 616
1299     void SimSetup::makeIntegrator( void ){
1300    
1301 tim 645 NVT<RealIntegrator>* myNVT = NULL;
1302     NPTi<RealIntegrator>* myNPTi = NULL;
1303     NPTf<RealIntegrator>* myNPTf = NULL;
1304     NPTim<RealIntegrator>* myNPTim = NULL;
1305     NPTfm<RealIntegrator>* myNPTfm = NULL;
1306 mmeineke 616
1307     switch( ensembleCase ){
1308    
1309     case NVE_ENS:
1310 tim 645 new NVE<RealIntegrator>( info, the_ff );
1311 mmeineke 616 break;
1312    
1313     case NVT_ENS:
1314 tim 645 myNVT = new NVT<RealIntegrator>( info, the_ff );
1315 mmeineke 616 myNVT->setTargetTemp(globals->getTargetTemp());
1316    
1317     if (globals->haveTauThermostat())
1318     myNVT->setTauThermostat(globals->getTauThermostat());
1319    
1320     else {
1321     sprintf( painCave.errMsg,
1322     "SimSetup error: If you use the NVT\n"
1323     " ensemble, you must set tauThermostat.\n");
1324     painCave.isFatal = 1;
1325     simError();
1326     }
1327     break;
1328    
1329     case NPTi_ENS:
1330 tim 645 myNPTi = new NPTi<RealIntegrator>( info, the_ff );
1331 mmeineke 616 myNPTi->setTargetTemp( globals->getTargetTemp() );
1332    
1333     if (globals->haveTargetPressure())
1334     myNPTi->setTargetPressure(globals->getTargetPressure());
1335     else {
1336     sprintf( painCave.errMsg,
1337     "SimSetup error: If you use a constant pressure\n"
1338     " ensemble, you must set targetPressure in the BASS file.\n");
1339     painCave.isFatal = 1;
1340     simError();
1341     }
1342    
1343     if( globals->haveTauThermostat() )
1344     myNPTi->setTauThermostat( globals->getTauThermostat() );
1345     else{
1346     sprintf( painCave.errMsg,
1347     "SimSetup error: If you use an NPT\n"
1348     " ensemble, you must set tauThermostat.\n");
1349     painCave.isFatal = 1;
1350     simError();
1351     }
1352    
1353     if( globals->haveTauBarostat() )
1354     myNPTi->setTauBarostat( globals->getTauBarostat() );
1355     else{
1356     sprintf( painCave.errMsg,
1357     "SimSetup error: If you use an NPT\n"
1358     " ensemble, you must set tauBarostat.\n");
1359     painCave.isFatal = 1;
1360     simError();
1361     }
1362     break;
1363    
1364     case NPTf_ENS:
1365 tim 645 myNPTf = new NPTf<RealIntegrator>( info, the_ff );
1366 mmeineke 616 myNPTf->setTargetTemp( globals->getTargetTemp());
1367    
1368     if (globals->haveTargetPressure())
1369     myNPTf->setTargetPressure(globals->getTargetPressure());
1370     else {
1371     sprintf( painCave.errMsg,
1372     "SimSetup error: If you use a constant pressure\n"
1373     " ensemble, you must set targetPressure in the BASS file.\n");
1374     painCave.isFatal = 1;
1375     simError();
1376     }
1377    
1378     if( globals->haveTauThermostat() )
1379     myNPTf->setTauThermostat( globals->getTauThermostat() );
1380     else{
1381     sprintf( painCave.errMsg,
1382     "SimSetup error: If you use an NPT\n"
1383     " ensemble, you must set tauThermostat.\n");
1384     painCave.isFatal = 1;
1385     simError();
1386     }
1387    
1388     if( globals->haveTauBarostat() )
1389     myNPTf->setTauBarostat( globals->getTauBarostat() );
1390     else{
1391     sprintf( painCave.errMsg,
1392     "SimSetup error: If you use an NPT\n"
1393     " ensemble, you must set tauBarostat.\n");
1394     painCave.isFatal = 1;
1395     simError();
1396     }
1397     break;
1398    
1399     case NPTim_ENS:
1400 tim 645 myNPTim = new NPTim<RealIntegrator>( info, the_ff );
1401 mmeineke 616 myNPTim->setTargetTemp( globals->getTargetTemp());
1402    
1403     if (globals->haveTargetPressure())
1404     myNPTim->setTargetPressure(globals->getTargetPressure());
1405     else {
1406     sprintf( painCave.errMsg,
1407     "SimSetup error: If you use a constant pressure\n"
1408     " ensemble, you must set targetPressure in the BASS file.\n");
1409     painCave.isFatal = 1;
1410     simError();
1411     }
1412    
1413     if( globals->haveTauThermostat() )
1414     myNPTim->setTauThermostat( globals->getTauThermostat() );
1415     else{
1416     sprintf( painCave.errMsg,
1417     "SimSetup error: If you use an NPT\n"
1418     " ensemble, you must set tauThermostat.\n");
1419     painCave.isFatal = 1;
1420     simError();
1421     }
1422    
1423     if( globals->haveTauBarostat() )
1424     myNPTim->setTauBarostat( globals->getTauBarostat() );
1425     else{
1426     sprintf( painCave.errMsg,
1427     "SimSetup error: If you use an NPT\n"
1428     " ensemble, you must set tauBarostat.\n");
1429     painCave.isFatal = 1;
1430     simError();
1431     }
1432     break;
1433    
1434     case NPTfm_ENS:
1435 tim 645 myNPTfm = new NPTfm<RealIntegrator>( info, the_ff );
1436 mmeineke 616 myNPTfm->setTargetTemp( globals->getTargetTemp());
1437    
1438     if (globals->haveTargetPressure())
1439     myNPTfm->setTargetPressure(globals->getTargetPressure());
1440     else {
1441     sprintf( painCave.errMsg,
1442     "SimSetup error: If you use a constant pressure\n"
1443     " ensemble, you must set targetPressure in the BASS file.\n");
1444     painCave.isFatal = 1;
1445     simError();
1446     }
1447    
1448     if( globals->haveTauThermostat() )
1449     myNPTfm->setTauThermostat( globals->getTauThermostat() );
1450     else{
1451     sprintf( painCave.errMsg,
1452     "SimSetup error: If you use an NPT\n"
1453     " ensemble, you must set tauThermostat.\n");
1454     painCave.isFatal = 1;
1455     simError();
1456     }
1457    
1458     if( globals->haveTauBarostat() )
1459     myNPTfm->setTauBarostat( globals->getTauBarostat() );
1460     else{
1461     sprintf( painCave.errMsg,
1462     "SimSetup error: If you use an NPT\n"
1463     " ensemble, you must set tauBarostat.\n");
1464     painCave.isFatal = 1;
1465     simError();
1466     }
1467     break;
1468    
1469     default:
1470     sprintf( painCave.errMsg,
1471     "SimSetup Error. Unrecognized ensemble in case statement.\n");
1472     painCave.isFatal = 1;
1473     simError();
1474     }
1475    
1476     }
1477    
1478     void SimSetup::initFortran( void ){
1479    
1480     info->refreshSim();
1481    
1482     if( !strcmp( info->mixingRule, "standard") ){
1483     the_ff->initForceField( LB_MIXING_RULE );
1484     }
1485     else if( !strcmp( info->mixingRule, "explicit") ){
1486     the_ff->initForceField( EXPLICIT_MIXING_RULE );
1487     }
1488     else{
1489     sprintf( painCave.errMsg,
1490     "SimSetup Error: unknown mixing rule -> \"%s\"\n",
1491     info->mixingRule );
1492     painCave.isFatal = 1;
1493     simError();
1494     }
1495    
1496    
1497     #ifdef IS_MPI
1498     strcpy( checkPointMsg,
1499     "Successfully intialized the mixingRule for Fortran." );
1500     MPIcheckPoint();
1501     #endif // is_mpi
1502    
1503     }