ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/SimSetup.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/SimSetup.cpp (file contents):
Revision 670 by mmeineke, Thu Aug 7 21:47:18 2003 UTC vs.
Revision 707 by mmeineke, Wed Aug 20 19:42:31 2003 UTC

# Line 5 | Line 5
5   #include <string>
6  
7   #include "SimSetup.hpp"
8 + #include "ReadWrite.hpp"
9   #include "parse_me.h"
10   #include "Integrator.hpp"
11   #include "simError.h"
# Line 22 | Line 23
23   #define NPTf_ENS       3
24   #define NPTim_ENS      4
25   #define NPTfm_ENS      5
25 #define NVEZCONS_ENS   6
26 #define NVTZCONS_ENS   7
27 #define NPTiZCONS_ENS  8
28 #define NPTfZCONS_ENS  9
29 #define NPTimZCONS_ENS 10
30 #define NPTfmZCONS_ENS 11
26  
27   #define FF_DUFF 0
28   #define FF_LJ   1
# Line 102 | Line 97 | void SimSetup::createSim(void){
97    int i, j, k, globalAtomIndex;
98    
99    // gather all of the information from the Bass file
100 <  
100 >
101    gatherInfo();
102  
103    // creation of complex system objects
# Line 110 | Line 105 | void SimSetup::createSim(void){
105    sysObjectsCreation();
106  
107    // check on the post processing info
108 <  
108 >
109    finalInfoCheck();
110  
111    // initialize the system coordinates
# Line 194 | Line 189 | void SimSetup::makeMolecules( void ){
189        // make the Atoms
190      
191        for(j=0; j<molInfo.nAtoms; j++){
192 <        
193 <        currentAtom = comp_stamps[stampID]->getAtom( j );
194 <        if( currentAtom->haveOrientation() ){
200 <          
201 <          dAtom = new DirectionalAtom( (j + atomOffset),
202 <                                       info[k].getConfiguration() );
203 <          info[k].n_oriented++;
204 <          molInfo.myAtoms[j] = dAtom;
205 <          
206 <          ux = currentAtom->getOrntX();
207 <          uy = currentAtom->getOrntY();
208 <          uz = currentAtom->getOrntZ();
209 <          
210 <          uSqr = (ux * ux) + (uy * uy) + (uz * uz);
211 <          
212 <          u = sqrt( uSqr );
213 <          ux = ux / u;
214 <          uy = uy / u;
215 <          uz = uz / u;
216 <          
217 <          dAtom->setSUx( ux );
218 <          dAtom->setSUy( uy );
219 <          dAtom->setSUz( uz );
220 <        }
221 <        else{
222 <          molInfo.myAtoms[j] = new GeneralAtom( (j + atomOffset),
223 <                                                info[k].getConfiguration() );
224 <        }
225 <        molInfo.myAtoms[j]->setType( currentAtom->getType() );
192 >  
193 >  currentAtom = comp_stamps[stampID]->getAtom( j );
194 >  if( currentAtom->haveOrientation() ){
195      
196 +    dAtom = new DirectionalAtom( (j + atomOffset),
197 +               info[k].getConfiguration() );
198 +    info[k].n_oriented++;
199 +    molInfo.myAtoms[j] = dAtom;
200 +    
201 +    ux = currentAtom->getOrntX();
202 +    uy = currentAtom->getOrntY();
203 +    uz = currentAtom->getOrntZ();
204 +    
205 +    uSqr = (ux * ux) + (uy * uy) + (uz * uz);
206 +    
207 +    u = sqrt( uSqr );
208 +    ux = ux / u;
209 +    uy = uy / u;
210 +    uz = uz / u;
211 +    
212 +    dAtom->setSUx( ux );
213 +    dAtom->setSUy( uy );
214 +    dAtom->setSUz( uz );
215 +  }
216 +  else{
217 +    molInfo.myAtoms[j] = new GeneralAtom( (j + atomOffset),
218 +            info[k].getConfiguration() );
219 +  }
220 +  molInfo.myAtoms[j]->setType( currentAtom->getType() );
221 +    
222   #ifdef IS_MPI
223        
224 <        molInfo.myAtoms[j]->setGlobalIndex( globalIndex[j+atomOffset] );
224 >  molInfo.myAtoms[j]->setGlobalIndex( globalIndex[j+atomOffset] );
225        
226   #endif // is_mpi
227        }
# Line 234 | Line 229 | void SimSetup::makeMolecules( void ){
229      // make the bonds
230        for(j=0; j<molInfo.nBonds; j++){
231        
232 <        currentBond = comp_stamps[stampID]->getBond( j );
233 <        theBonds[j].a = currentBond->getA() + atomOffset;
234 <        theBonds[j].b = currentBond->getB() + atomOffset;
235 <        
236 <        exI = theBonds[j].a;
237 <        exJ = theBonds[j].b;
238 <        
239 <        // exclude_I must always be the smaller of the pair
240 <        if( exI > exJ ){
241 <          tempEx = exI;
242 <          exI = exJ;
243 <          exJ = tempEx;
244 <        }
245 < #ifdef IS_MPI
246 <        tempEx = exI;
247 <        exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
248 <        tempEx = exJ;
249 <        exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
250 <        
251 <        info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
232 >  currentBond = comp_stamps[stampID]->getBond( j );
233 >  theBonds[j].a = currentBond->getA() + atomOffset;
234 >  theBonds[j].b = currentBond->getB() + atomOffset;
235 >  
236 >  exI = theBonds[j].a;
237 >  exJ = theBonds[j].b;
238 >  
239 >  // exclude_I must always be the smaller of the pair
240 >  if( exI > exJ ){
241 >    tempEx = exI;
242 >    exI = exJ;
243 >    exJ = tempEx;
244 >  }
245 > #ifdef IS_MPI
246 >  tempEx = exI;
247 >  exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
248 >  tempEx = exJ;
249 >  exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
250 >  
251 >  info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
252   #else  // isn't MPI
253 <        
254 <        info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
253 >  
254 >  info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
255   #endif  //is_mpi
256        }
257        excludeOffset += molInfo.nBonds;
258        
259        //make the bends
260        for(j=0; j<molInfo.nBends; j++){
261 <        
262 <        currentBend = comp_stamps[stampID]->getBend( j );
263 <        theBends[j].a = currentBend->getA() + atomOffset;
264 <        theBends[j].b = currentBend->getB() + atomOffset;
265 <        theBends[j].c = currentBend->getC() + atomOffset;
266 <        
267 <        if( currentBend->haveExtras() ){
268 <          
269 <          extras = currentBend->getExtras();
270 <          current_extra = extras;
271 <          
272 <          while( current_extra != NULL ){
273 <            if( !strcmp( current_extra->getlhs(), "ghostVectorSource" )){
274 <              
275 <              switch( current_extra->getType() ){
276 <                
277 <              case 0:
278 <                theBends[j].ghost =
279 <                  current_extra->getInt() + atomOffset;
280 <                theBends[j].isGhost = 1;
281 <                break;
282 <                
283 <              case 1:
284 <                theBends[j].ghost =
285 <                  (int)current_extra->getDouble() + atomOffset;
286 <                theBends[j].isGhost = 1;
287 <                break;
288 <                
289 <              default:
290 <                sprintf( painCave.errMsg,
291 <                         "SimSetup Error: ghostVectorSource was neither a "
292 <                         "double nor an int.\n"
293 <                         "-->Bend[%d] in %s\n",
294 <                         j, comp_stamps[stampID]->getID() );
295 <                painCave.isFatal = 1;
296 <                simError();
297 <              }
298 <            }
299 <            
300 <            else{
301 <              
302 <              sprintf( painCave.errMsg,
303 <                       "SimSetup Error: unhandled bend assignment:\n"
304 <                       "    -->%s in Bend[%d] in %s\n",
305 <                       current_extra->getlhs(),
306 <                       j, comp_stamps[stampID]->getID() );
307 <              painCave.isFatal = 1;
308 <              simError();
309 <            }
310 <            
311 <            current_extra = current_extra->getNext();
312 <          }
313 <        }
314 <        
315 <        if( !theBends[j].isGhost ){
316 <          
317 <          exI = theBends[j].a;
318 <          exJ = theBends[j].c;
319 <        }
320 <        else{
321 <          
322 <          exI = theBends[j].a;
323 <          exJ = theBends[j].b;
324 <        }
325 <        
326 <        // exclude_I must always be the smaller of the pair
327 <        if( exI > exJ ){
328 <          tempEx = exI;
329 <          exI = exJ;
330 <          exJ = tempEx;
331 <        }
332 < #ifdef IS_MPI
333 <        tempEx = exI;
334 <        exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
335 <        tempEx = exJ;
336 <        exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
337 <      
338 <        info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
261 >  
262 >  currentBend = comp_stamps[stampID]->getBend( j );
263 >  theBends[j].a = currentBend->getA() + atomOffset;
264 >  theBends[j].b = currentBend->getB() + atomOffset;
265 >  theBends[j].c = currentBend->getC() + atomOffset;
266 >  
267 >  if( currentBend->haveExtras() ){
268 >    
269 >    extras = currentBend->getExtras();
270 >    current_extra = extras;
271 >    
272 >    while( current_extra != NULL ){
273 >      if( !strcmp( current_extra->getlhs(), "ghostVectorSource" )){
274 >        
275 >        switch( current_extra->getType() ){
276 >    
277 >        case 0:
278 >    theBends[j].ghost =
279 >      current_extra->getInt() + atomOffset;
280 >    theBends[j].isGhost = 1;
281 >    break;
282 >    
283 >        case 1:
284 >    theBends[j].ghost =
285 >      (int)current_extra->getDouble() + atomOffset;
286 >    theBends[j].isGhost = 1;
287 >    break;
288 >    
289 >        default:
290 >    sprintf( painCave.errMsg,
291 >       "SimSetup Error: ghostVectorSource was neither a "
292 >       "double nor an int.\n"
293 >       "-->Bend[%d] in %s\n",
294 >       j, comp_stamps[stampID]->getID() );
295 >    painCave.isFatal = 1;
296 >    simError();
297 >        }
298 >      }
299 >      
300 >      else{
301 >        
302 >        sprintf( painCave.errMsg,
303 >           "SimSetup Error: unhandled bend assignment:\n"
304 >           "    -->%s in Bend[%d] in %s\n",
305 >           current_extra->getlhs(),
306 >           j, comp_stamps[stampID]->getID() );
307 >        painCave.isFatal = 1;
308 >        simError();
309 >      }
310 >      
311 >      current_extra = current_extra->getNext();
312 >    }
313 >  }
314 >  
315 >  if( !theBends[j].isGhost ){
316 >    
317 >    exI = theBends[j].a;
318 >    exJ = theBends[j].c;
319 >  }
320 >  else{
321 >    
322 >    exI = theBends[j].a;
323 >    exJ = theBends[j].b;
324 >  }
325 >  
326 >  // exclude_I must always be the smaller of the pair
327 >  if( exI > exJ ){
328 >    tempEx = exI;
329 >    exI = exJ;
330 >    exJ = tempEx;
331 >  }
332 > #ifdef IS_MPI
333 >  tempEx = exI;
334 >  exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
335 >  tempEx = exJ;
336 >  exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
337 >      
338 >  info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
339   #else  // isn't MPI
340 <        info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
340 >  info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
341   #endif  //is_mpi
342        }
343        excludeOffset += molInfo.nBends;
344        
345        for(j=0; j<molInfo.nTorsions; j++){
346 <        
347 <        currentTorsion = comp_stamps[stampID]->getTorsion( j );
348 <        theTorsions[j].a = currentTorsion->getA() + atomOffset;
349 <        theTorsions[j].b = currentTorsion->getB() + atomOffset;
350 <        theTorsions[j].c = currentTorsion->getC() + atomOffset;
351 <        theTorsions[j].d = currentTorsion->getD() + atomOffset;
352 <        
353 <        exI = theTorsions[j].a;
354 <        exJ = theTorsions[j].d;
355 <        
356 <        // exclude_I must always be the smaller of the pair
357 <        if( exI > exJ ){
358 <          tempEx = exI;
359 <          exI = exJ;
360 <          exJ = tempEx;
361 <        }
346 >  
347 >  currentTorsion = comp_stamps[stampID]->getTorsion( j );
348 >  theTorsions[j].a = currentTorsion->getA() + atomOffset;
349 >  theTorsions[j].b = currentTorsion->getB() + atomOffset;
350 >  theTorsions[j].c = currentTorsion->getC() + atomOffset;
351 >  theTorsions[j].d = currentTorsion->getD() + atomOffset;
352 >  
353 >  exI = theTorsions[j].a;
354 >  exJ = theTorsions[j].d;
355 >  
356 >  // exclude_I must always be the smaller of the pair
357 >  if( exI > exJ ){
358 >    tempEx = exI;
359 >    exI = exJ;
360 >    exJ = tempEx;
361 >  }
362   #ifdef IS_MPI
363 <        tempEx = exI;
364 <        exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
365 <        tempEx = exJ;
366 <        exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
367 <        
368 <        info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
363 >  tempEx = exI;
364 >  exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
365 >  tempEx = exJ;
366 >  exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
367 >  
368 >  info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
369   #else  // isn't MPI
370 <        info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
370 >  info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
371   #endif  //is_mpi
372        }
373        excludeOffset += molInfo.nTorsions;
# Line 441 | Line 436 | void SimSetup::initFromBass( void ){
436  
437      if( n_per_extra > 4){
438        sprintf( painCave.errMsg,
439 <               "SimSetup error. There has been an error in constructing"
440 <               " the non-complete lattice.\n" );
439 >         "SimSetup error. There has been an error in constructing"
440 >         " the non-complete lattice.\n" );
441        painCave.isFatal = 1;
442        simError();
443      }
# Line 463 | Line 458 | void SimSetup::initFromBass( void ){
458      for( j=0; j < n_cells; j++ ){
459        for( k=0; k < n_cells; k++ ){
460  
461 <        makeElement( i * cellx,
462 <                     j * celly,
463 <                     k * cellz );
461 >  makeElement( i * cellx,
462 >         j * celly,
463 >         k * cellz );
464  
465 <        makeElement( i * cellx + 0.5 * cellx,
466 <                     j * celly + 0.5 * celly,
467 <                     k * cellz );
465 >  makeElement( i * cellx + 0.5 * cellx,
466 >         j * celly + 0.5 * celly,
467 >         k * cellz );
468  
469 <        makeElement( i * cellx,
470 <                     j * celly + 0.5 * celly,
471 <                     k * cellz + 0.5 * cellz );
469 >  makeElement( i * cellx,
470 >         j * celly + 0.5 * celly,
471 >         k * cellz + 0.5 * cellz );
472  
473 <        makeElement( i * cellx + 0.5 * cellx,
474 <                     j * celly,
475 <                     k * cellz + 0.5 * cellz );
473 >  makeElement( i * cellx + 0.5 * cellx,
474 >         j * celly,
475 >         k * cellz + 0.5 * cellz );
476        }
477      }
478    }
# Line 489 | Line 484 | void SimSetup::initFromBass( void ){
484      for( i=0; i < (n_cells+1) && !done; i++ ){
485        for( j=0; j < (n_cells+1) && !done; j++ ){
486  
487 <        if( i < n_cells ){
487 >  if( i < n_cells ){
488  
489 <          if( j < n_cells ){
490 <            start_ndx = n_cells;
491 <          }
492 <          else start_ndx = 0;
493 <        }
494 <        else start_ndx = 0;
489 >    if( j < n_cells ){
490 >      start_ndx = n_cells;
491 >    }
492 >    else start_ndx = 0;
493 >  }
494 >  else start_ndx = 0;
495  
496 <        for( k=start_ndx; k < (n_cells+1) && !done; k++ ){
496 >  for( k=start_ndx; k < (n_cells+1) && !done; k++ ){
497  
498 <          makeElement( i * cellx,
499 <                       j * celly,
500 <                       k * cellz );
501 <          done = ( current_mol >= tot_nmol );
498 >    makeElement( i * cellx,
499 >           j * celly,
500 >           k * cellz );
501 >    done = ( current_mol >= tot_nmol );
502  
503 <          if( !done && n_per_extra > 1 ){
504 <            makeElement( i * cellx + 0.5 * cellx,
505 <                         j * celly + 0.5 * celly,
506 <                         k * cellz );
507 <            done = ( current_mol >= tot_nmol );
508 <          }
503 >    if( !done && n_per_extra > 1 ){
504 >      makeElement( i * cellx + 0.5 * cellx,
505 >       j * celly + 0.5 * celly,
506 >       k * cellz );
507 >      done = ( current_mol >= tot_nmol );
508 >    }
509  
510 <          if( !done && n_per_extra > 2){
511 <            makeElement( i * cellx,
512 <                         j * celly + 0.5 * celly,
513 <                         k * cellz + 0.5 * cellz );
514 <            done = ( current_mol >= tot_nmol );
515 <          }
510 >    if( !done && n_per_extra > 2){
511 >      makeElement( i * cellx,
512 >       j * celly + 0.5 * celly,
513 >       k * cellz + 0.5 * cellz );
514 >      done = ( current_mol >= tot_nmol );
515 >    }
516  
517 <          if( !done && n_per_extra > 3){
518 <            makeElement( i * cellx + 0.5 * cellx,
519 <                         j * celly,
520 <                         k * cellz + 0.5 * cellz );
521 <            done = ( current_mol >= tot_nmol );
522 <          }
523 <        }
517 >    if( !done && n_per_extra > 3){
518 >      makeElement( i * cellx + 0.5 * cellx,
519 >       j * celly,
520 >       k * cellz + 0.5 * cellz );
521 >      done = ( current_mol >= tot_nmol );
522 >    }
523 >  }
524        }
525      }
526    }
# Line 548 | Line 543 | void SimSetup::makeElement( double x, double y, double
543      current_atom = comp_stamps[current_comp]->getAtom( k );
544      if( !current_atom->havePosition() ){
545        sprintf( painCave.errMsg,
546 <               "SimSetup:initFromBass error.\n"
547 <               "\tComponent %s, atom %s does not have a position specified.\n"
548 <               "\tThe initialization routine is unable to give a start"
549 <               " position.\n",
550 <               comp_stamps[current_comp]->getID(),
551 <               current_atom->getType() );
546 >         "SimSetup:initFromBass error.\n"
547 >         "\tComponent %s, atom %s does not have a position specified.\n"
548 >         "\tThe initialization routine is unable to give a start"
549 >         " position.\n",
550 >         comp_stamps[current_comp]->getID(),
551 >         current_atom->getType() );
552        painCave.isFatal = 1;
553        simError();
554      }
# Line 622 | Line 617 | void SimSetup::gatherInfo( void ){
617    else if( !strcasecmp( force_field, "EAM" )) ffCase = FF_EAM;
618    else{
619      sprintf( painCave.errMsg,
620 <             "SimSetup Error. Unrecognized force field -> %s\n",
621 <             force_field );
620 >       "SimSetup Error. Unrecognized force field -> %s\n",
621 >       force_field );
622      painCave.isFatal = 1;
623      simError();
624    }
# Line 639 | Line 634 | void SimSetup::gatherInfo( void ){
634    else if( !strcasecmp( ensemble, "NPTf" )) ensembleCase = NPTf_ENS;
635    else if( !strcasecmp( ensemble, "NPTim" )) ensembleCase = NPTim_ENS;
636    else if( !strcasecmp( ensemble, "NPTfm" )) ensembleCase = NPTfm_ENS;
642
643  else if( !strcasecmp( ensemble, "NVEZCONS")) ensembleCase = NVEZCONS_ENS;
644  else if( !strcasecmp( ensemble, "NVTZCONS"))  ensembleCase = NVTZCONS_ENS;
645  else if( !strcasecmp( ensemble, "NPTiZCONS") || !strcasecmp( ensemble, "NPTZCONS"))
646    ensembleCase = NPTiZCONS_ENS;
647  else if( !strcasecmp( ensemble, "NPTfZCONS"))  ensembleCase = NPTfZCONS_ENS;
648  else if( !strcasecmp( ensemble, "NPTimZCONS"))  ensembleCase = NPTimZCONS_ENS;
649  else if( !strcasecmp( ensemble, "NPTfmZCONS"))  ensembleCase = NPTfmZCONS_ENS;
650  
637    else{
638      sprintf( painCave.errMsg,
639 <             "SimSetup Warning. Unrecognized Ensemble -> %s, "
639 >       "SimSetup Warning. Unrecognized Ensemble -> %s, "
640               "reverting to NVE for this simulation.\n",
641 <             ensemble );
641 >       ensemble );
642      painCave.isFatal = 0;
643      simError();
644      strcpy( ensemble, "NVE" );
# Line 683 | Line 669 | void SimSetup::gatherInfo( void ){
669      for( i=0; i<n_components; i++ ){
670  
671        if( !the_components[i]->haveNMol() ){
672 <        // we have a problem
673 <        sprintf( painCave.errMsg,
674 <                 "SimSetup Error. No global NMol or component NMol"
675 <                 " given. Cannot calculate the number of atoms.\n" );
676 <        painCave.isFatal = 1;
677 <        simError();
672 >  // we have a problem
673 >  sprintf( painCave.errMsg,
674 >     "SimSetup Error. No global NMol or component NMol"
675 >     " given. Cannot calculate the number of atoms.\n" );
676 >  painCave.isFatal = 1;
677 >  simError();
678        }
679  
680        tot_nmol += the_components[i]->getNMol();
# Line 697 | Line 683 | void SimSetup::gatherInfo( void ){
683    }
684    else{
685      sprintf( painCave.errMsg,
686 <             "SimSetup error.\n"
687 <             "\tSorry, the ability to specify total"
688 <             " nMols and then give molfractions in the components\n"
689 <             "\tis not currently supported."
690 <             " Please give nMol in the components.\n" );
686 >       "SimSetup error.\n"
687 >       "\tSorry, the ability to specify total"
688 >       " nMols and then give molfractions in the components\n"
689 >       "\tis not currently supported."
690 >       " Please give nMol in the components.\n" );
691      painCave.isFatal = 1;
692      simError();
693    }
# Line 755 | Line 741 | void SimSetup::gatherInfo( void ){
741    }
742      else{
743        if( !globals->haveBoxX() ){
744 <        sprintf( painCave.errMsg,
745 <                 "SimSetup error, no periodic BoxX size given.\n" );
746 <        painCave.isFatal = 1;
747 <        simError();
744 >  sprintf( painCave.errMsg,
745 >     "SimSetup error, no periodic BoxX size given.\n" );
746 >  painCave.isFatal = 1;
747 >  simError();
748        }
749        boxVector[0] = globals->getBoxX();
750        
751        if( !globals->haveBoxY() ){
752 <        sprintf( painCave.errMsg,
753 <                 "SimSetup error, no periodic BoxY size given.\n" );
754 <        painCave.isFatal = 1;
755 <        simError();
752 >  sprintf( painCave.errMsg,
753 >     "SimSetup error, no periodic BoxY size given.\n" );
754 >  painCave.isFatal = 1;
755 >  simError();
756        }
757        boxVector[1] = globals->getBoxY();
758        
759        if( !globals->haveBoxZ() ){
760 <        sprintf( painCave.errMsg,
761 <                 "SimSetup error, no periodic BoxZ size given.\n" );
762 <        painCave.isFatal = 1;
763 <        simError();
760 >  sprintf( painCave.errMsg,
761 >     "SimSetup error, no periodic BoxZ size given.\n" );
762 >  painCave.isFatal = 1;
763 >  simError();
764        }
765        boxVector[2] = globals->getBoxZ();
766        
# Line 817 | Line 803 | void SimSetup::finalInfoCheck( void ){
803        info[i].useReactionField = 1;
804        
805        if( !globals->haveECR() ){
806 <        sprintf( painCave.errMsg,
807 <                 "SimSetup Warning: using default value of 1/2 the smallest "
808 <                 "box length for the electrostaticCutoffRadius.\n"
809 <                 "I hope you have a very fast processor!\n");
810 <        painCave.isFatal = 0;
811 <        simError();
812 <        double smallest;
813 <        smallest = info[i].boxL[0];
814 <        if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
815 <        if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
816 <        theEcr = 0.5 * smallest;
806 >  sprintf( painCave.errMsg,
807 >     "SimSetup Warning: using default value of 1/2 the smallest "
808 >     "box length for the electrostaticCutoffRadius.\n"
809 >     "I hope you have a very fast processor!\n");
810 >  painCave.isFatal = 0;
811 >  simError();
812 >  double smallest;
813 >  smallest = info[i].boxL[0];
814 >  if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
815 >  if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
816 >  theEcr = 0.5 * smallest;
817        } else {
818 <        theEcr = globals->getECR();
818 >  theEcr = globals->getECR();
819        }
820        
821        if( !globals->haveEST() ){
822 <        sprintf( painCave.errMsg,
823 <                 "SimSetup Warning: using default value of 0.05 * the "
824 <                 "electrostaticCutoffRadius for the electrostaticSkinThickness\n"
825 <                 );
826 <        painCave.isFatal = 0;
827 <        simError();
828 <        theEst = 0.05 * theEcr;
822 >  sprintf( painCave.errMsg,
823 >     "SimSetup Warning: using default value of 0.05 * the "
824 >     "electrostaticCutoffRadius for the electrostaticSkinThickness\n"
825 >     );
826 >  painCave.isFatal = 0;
827 >  simError();
828 >  theEst = 0.05 * theEcr;
829        } else {
830 <        theEst= globals->getEST();
830 >  theEst= globals->getEST();
831        }
832        
833        info[i].setEcr( theEcr, theEst );
834        
835        if(!globals->haveDielectric() ){
836 <        sprintf( painCave.errMsg,
837 <                 "SimSetup Error: You are trying to use Reaction Field without"
838 <                 "setting a dielectric constant!\n"
839 <                 );
840 <        painCave.isFatal = 1;
841 <        simError();
836 >  sprintf( painCave.errMsg,
837 >     "SimSetup Error: You are trying to use Reaction Field without"
838 >     "setting a dielectric constant!\n"
839 >     );
840 >  painCave.isFatal = 1;
841 >  simError();
842        }
843        info[i].dielectric = globals->getDielectric();  
844      }
845      else {
846        if (usesDipoles) {
847 <        
848 <        if( !globals->haveECR() ){
849 <          sprintf( painCave.errMsg,
850 <                   "SimSetup Warning: using default value of 1/2 the smallest "
851 <                   "box length for the electrostaticCutoffRadius.\n"
852 <                   "I hope you have a very fast processor!\n");
853 <          painCave.isFatal = 0;
854 <          simError();
855 <          double smallest;
856 <          smallest = info[i].boxL[0];
857 <          if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
858 <          if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
859 <          theEcr = 0.5 * smallest;
860 <        } else {
861 <          theEcr = globals->getECR();
862 <        }
863 <        
864 <        if( !globals->haveEST() ){
865 <          sprintf( painCave.errMsg,
866 <                   "SimSetup Warning: using default value of 0.05 * the "
867 <                   "electrostaticCutoffRadius for the "
868 <                   "electrostaticSkinThickness\n"
869 <                   );
870 <          painCave.isFatal = 0;
871 <          simError();
872 <          theEst = 0.05 * theEcr;
873 <        } else {
874 <          theEst= globals->getEST();
875 <        }
876 <        
877 <        info[i].setEcr( theEcr, theEst );
847 >  
848 >  if( !globals->haveECR() ){
849 >    sprintf( painCave.errMsg,
850 >       "SimSetup Warning: using default value of 1/2 the smallest "
851 >       "box length for the electrostaticCutoffRadius.\n"
852 >       "I hope you have a very fast processor!\n");
853 >    painCave.isFatal = 0;
854 >    simError();
855 >    double smallest;
856 >    smallest = info[i].boxL[0];
857 >    if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
858 >    if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
859 >    theEcr = 0.5 * smallest;
860 >  } else {
861 >    theEcr = globals->getECR();
862 >  }
863 >  
864 >  if( !globals->haveEST() ){
865 >    sprintf( painCave.errMsg,
866 >       "SimSetup Warning: using default value of 0.05 * the "
867 >       "electrostaticCutoffRadius for the "
868 >       "electrostaticSkinThickness\n"
869 >       );
870 >    painCave.isFatal = 0;
871 >    simError();
872 >    theEst = 0.05 * theEcr;
873 >  } else {
874 >    theEst= globals->getEST();
875 >  }
876 >  
877 >  info[i].setEcr( theEcr, theEst );
878        }
879      }  
880    }
# Line 903 | Line 889 | void SimSetup::initSystemCoords( void ){
889   void SimSetup::initSystemCoords( void ){
890    int i;
891    
892 <  std::cerr << "Setting atom Coords\n";
892 >  char* inName;
893  
894    (info[0].getConfiguration())->createArrays( info[0].n_atoms );
895 <  
895 >
896    for(i=0; i<info[0].n_atoms; i++) info[0].atoms[i]->setCoords();
897    
898    if( globals->haveInitialConfig() ){
# Line 915 | Line 901 | void SimSetup::initSystemCoords( void ){
901   #ifdef IS_MPI // is_mpi
902      if( worldRank == 0 ){
903   #endif //is_mpi
904 <      fileInit = new InitializeFromFile( globals->getInitialConfig() );
904 >      inName = globals->getInitialConfig();
905 >      double* tempDouble = new double[1000000];
906 >      fileInit = new InitializeFromFile( inName );
907   #ifdef IS_MPI
908      }else fileInit = new InitializeFromFile( NULL );
909   #endif
# Line 930 | Line 918 | void SimSetup::initSystemCoords( void ){
918      // no init from bass
919      
920      sprintf( painCave.errMsg,
921 <             "Cannot intialize a parallel simulation without an initial configuration file.\n" );
921 >       "Cannot intialize a parallel simulation without an initial configuration file.\n" );
922      painCave.isFatal;
923      simError();
924      
# Line 962 | Line 950 | void SimSetup::makeOutNames( void ){
950   #endif // is_mpi
951        
952        if( globals->haveFinalConfig() ){
953 <        strcpy( info[k].finalName, globals->getFinalConfig() );
953 >  strcpy( info[k].finalName, globals->getFinalConfig() );
954        }
955        else{
956 <        strcpy( info[k].finalName, inFileName );
957 <        char* endTest;
958 <        int nameLength = strlen( info[k].finalName );
959 <        endTest = &(info[k].finalName[nameLength - 5]);
960 <        if( !strcmp( endTest, ".bass" ) ){
961 <          strcpy( endTest, ".eor" );
962 <        }
963 <        else if( !strcmp( endTest, ".BASS" ) ){
964 <          strcpy( endTest, ".eor" );
965 <        }
966 <        else{
967 <          endTest = &(info[k].finalName[nameLength - 4]);
968 <          if( !strcmp( endTest, ".bss" ) ){
969 <            strcpy( endTest, ".eor" );
970 <          }
971 <          else if( !strcmp( endTest, ".mdl" ) ){
972 <            strcpy( endTest, ".eor" );
973 <          }
974 <          else{
975 <            strcat( info[k].finalName, ".eor" );
976 <          }
977 <        }
956 >  strcpy( info[k].finalName, inFileName );
957 >  char* endTest;
958 >  int nameLength = strlen( info[k].finalName );
959 >  endTest = &(info[k].finalName[nameLength - 5]);
960 >  if( !strcmp( endTest, ".bass" ) ){
961 >    strcpy( endTest, ".eor" );
962 >  }
963 >  else if( !strcmp( endTest, ".BASS" ) ){
964 >    strcpy( endTest, ".eor" );
965 >  }
966 >  else{
967 >    endTest = &(info[k].finalName[nameLength - 4]);
968 >    if( !strcmp( endTest, ".bss" ) ){
969 >      strcpy( endTest, ".eor" );
970 >    }
971 >    else if( !strcmp( endTest, ".mdl" ) ){
972 >      strcpy( endTest, ".eor" );
973 >    }
974 >    else{
975 >      strcat( info[k].finalName, ".eor" );
976 >    }
977 >  }
978        }
979        
980        // make the sample and status out names
# Line 996 | Line 984 | void SimSetup::makeOutNames( void ){
984        int nameLength = strlen( info[k].sampleName );
985        endTest = &(info[k].sampleName[nameLength - 5]);
986        if( !strcmp( endTest, ".bass" ) ){
987 <        strcpy( endTest, ".dump" );
987 >  strcpy( endTest, ".dump" );
988        }
989        else if( !strcmp( endTest, ".BASS" ) ){
990 <        strcpy( endTest, ".dump" );
990 >  strcpy( endTest, ".dump" );
991        }
992        else{
993 <        endTest = &(info[k].sampleName[nameLength - 4]);
994 <        if( !strcmp( endTest, ".bss" ) ){
995 <          strcpy( endTest, ".dump" );
996 <        }
997 <        else if( !strcmp( endTest, ".mdl" ) ){
998 <          strcpy( endTest, ".dump" );
999 <        }
1000 <        else{
1001 <          strcat( info[k].sampleName, ".dump" );
1002 <        }
993 >  endTest = &(info[k].sampleName[nameLength - 4]);
994 >  if( !strcmp( endTest, ".bss" ) ){
995 >    strcpy( endTest, ".dump" );
996 >  }
997 >  else if( !strcmp( endTest, ".mdl" ) ){
998 >    strcpy( endTest, ".dump" );
999 >  }
1000 >  else{
1001 >    strcat( info[k].sampleName, ".dump" );
1002 >  }
1003        }
1004        
1005        strcpy( info[k].statusName, inFileName );
1006        nameLength = strlen( info[k].statusName );
1007        endTest = &(info[k].statusName[nameLength - 5]);
1008        if( !strcmp( endTest, ".bass" ) ){
1009 <        strcpy( endTest, ".stat" );
1009 >  strcpy( endTest, ".stat" );
1010        }
1011        else if( !strcmp( endTest, ".BASS" ) ){
1012 <        strcpy( endTest, ".stat" );
1012 >  strcpy( endTest, ".stat" );
1013        }
1014        else{
1015 <        endTest = &(info[k].statusName[nameLength - 4]);
1016 <        if( !strcmp( endTest, ".bss" ) ){
1017 <          strcpy( endTest, ".stat" );
1018 <        }
1019 <        else if( !strcmp( endTest, ".mdl" ) ){
1020 <          strcpy( endTest, ".stat" );
1021 <        }
1022 <        else{
1023 <          strcat( info[k].statusName, ".stat" );
1024 <        }
1015 >  endTest = &(info[k].statusName[nameLength - 4]);
1016 >  if( !strcmp( endTest, ".bss" ) ){
1017 >    strcpy( endTest, ".stat" );
1018 >  }
1019 >  else if( !strcmp( endTest, ".mdl" ) ){
1020 >    strcpy( endTest, ".stat" );
1021 >  }
1022 >  else{
1023 >    strcat( info[k].statusName, ".stat" );
1024 >  }
1025        }
1026        
1027   #ifdef IS_MPI
# Line 1048 | Line 1036 | void SimSetup::sysObjectsCreation( void ){
1036    int i,k;
1037    
1038    // create the forceField
1039 <  
1039 >
1040    createFF();
1041  
1042    // extract componentList
# Line 1066 | Line 1054 | void SimSetup::sysObjectsCreation( void ){
1054   #endif //is_mpi
1055    
1056    // create the atom and SRI arrays. Also initialize Molecule Stamp ID's
1057 <  
1057 >
1058    makeSysArrays();
1059  
1060    // make and initialize the molecules (all but atomic coordinates)
1061 <  
1061 >
1062    makeMolecules();
1063    
1064    for(k=0; k<nInfo; k++){
# Line 1100 | Line 1088 | void SimSetup::createFF( void ){
1088  
1089    default:
1090      sprintf( painCave.errMsg,
1091 <             "SimSetup Error. Unrecognized force field in case statement.\n");
1091 >       "SimSetup Error. Unrecognized force field in case statement.\n");
1092      painCave.isFatal = 1;
1093      simError();
1094    }
# Line 1146 | Line 1134 | void SimSetup::compList( void ){
1134        
1135        currentStamp = stamps->extractMolStamp( id );
1136        if( currentStamp == NULL ){
1137 <        sprintf( painCave.errMsg,
1138 <                 "SimSetup error: Component \"%s\" was not found in the "
1139 <                 "list of declared molecules\n",
1140 <                 id );
1141 <        painCave.isFatal = 1;
1142 <        simError();
1137 >  sprintf( painCave.errMsg,
1138 >     "SimSetup error: Component \"%s\" was not found in the "
1139 >     "list of declared molecules\n",
1140 >     id );
1141 >  painCave.isFatal = 1;
1142 >  simError();
1143        }
1144        
1145        headStamp->add( currentStamp );
# Line 1230 | Line 1218 | void SimSetup::mpiMolDivide( void ){
1218      for( j=0; j<components_nmol[i]; j++ ){
1219        
1220        if( mol2proc[allMol] == worldRank ){
1221 <        
1222 <        local_atoms +=    comp_stamps[i]->getNAtoms();
1223 <        local_bonds +=    comp_stamps[i]->getNBonds();
1224 <        local_bends +=    comp_stamps[i]->getNBends();
1225 <        local_torsions += comp_stamps[i]->getNTorsions();
1226 <        localMol++;
1221 >  
1222 >  local_atoms +=    comp_stamps[i]->getNAtoms();
1223 >  local_bonds +=    comp_stamps[i]->getNBonds();
1224 >  local_bends +=    comp_stamps[i]->getNBends();
1225 >  local_torsions += comp_stamps[i]->getNTorsions();
1226 >  localMol++;
1227        }      
1228        for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1229          info[0].molMembershipArray[globalAtomIndex] = allMol;
# Line 1251 | Line 1239 | void SimSetup::mpiMolDivide( void ){
1239    
1240    if( local_atoms != info[0].n_atoms ){
1241      sprintf( painCave.errMsg,
1242 <             "SimSetup error: mpiSim's localAtom (%d) and SimSetup's"
1243 <             " localAtom (%d) are not equal.\n",
1244 <             info[0].n_atoms,
1245 <             local_atoms );
1242 >       "SimSetup error: mpiSim's localAtom (%d) and SimSetup's"
1243 >       " localAtom (%d) are not equal.\n",
1244 >       info[0].n_atoms,
1245 >       local_atoms );
1246      painCave.isFatal = 1;
1247      simError();
1248    }
# Line 1297 | Line 1285 | void SimSetup::makeSysArrays( void ){
1285      for(i=0; i<mpiSim->getTotNmol(); i++){
1286      
1287        if(mol2proc[i] == worldRank ){
1288 <        the_molecules[molIndex].setStampID( molCompType[i] );
1289 <        the_molecules[molIndex].setMyIndex( molIndex );
1290 <        the_molecules[molIndex].setGlobalIndex( i );
1291 <        molIndex++;
1288 >  the_molecules[molIndex].setStampID( molCompType[i] );
1289 >  the_molecules[molIndex].setMyIndex( molIndex );
1290 >  the_molecules[molIndex].setGlobalIndex( i );
1291 >  molIndex++;
1292        }
1293      }
1294      
# Line 1310 | Line 1298 | void SimSetup::makeSysArrays( void ){
1298      globalAtomIndex = 0;
1299      for(i=0; i<n_components; i++){
1300        for(j=0; j<components_nmol[i]; j++ ){
1301 <        the_molecules[molIndex].setStampID( i );
1302 <        the_molecules[molIndex].setMyIndex( molIndex );
1303 <        the_molecules[molIndex].setGlobalIndex( molIndex );
1304 <        for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1305 <          info[l].molMembershipArray[globalAtomIndex] = molIndex;
1306 <          globalAtomIndex++;
1307 <        }
1308 <        molIndex++;
1301 >  the_molecules[molIndex].setStampID( i );
1302 >  the_molecules[molIndex].setMyIndex( molIndex );
1303 >  the_molecules[molIndex].setGlobalIndex( molIndex );
1304 >  for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1305 >    info[l].molMembershipArray[globalAtomIndex] = molIndex;
1306 >    globalAtomIndex++;
1307 >  }
1308 >  molIndex++;
1309        }
1310      }
1311      
# Line 1330 | Line 1318 | void SimSetup::makeSysArrays( void ){
1318        Exclude::createArray(info[l].n_SRI);
1319        the_excludes = new Exclude*[info[l].n_SRI];
1320        for( int ex=0; ex<info[l].n_SRI; ex++){
1321 <        the_excludes[ex] = new Exclude(ex);
1321 >  the_excludes[ex] = new Exclude(ex);
1322        }
1323        info[l].globalExcludes = new int;
1324        info[l].n_exclude = info[l].n_SRI;
# Line 1367 | Line 1355 | void SimSetup::makeIntegrator( void ){
1355    NPTf<RealIntegrator>* myNPTf = NULL;
1356    NPTim<RealIntegrator>* myNPTim = NULL;
1357    NPTfm<RealIntegrator>* myNPTfm = NULL;
1370  ZConstraint<NVE<RealIntegrator> >* myNVEZCons = NULL;
1371  ZConstraint<NVT<RealIntegrator> >* myNVTZCons = NULL;
1372  ZConstraint<NPTi<RealIntegrator> >* myNPTiZCons = NULL;
1373  ZConstraint<NPTf<RealIntegrator> >* myNPTfZCons = NULL;
1374  ZConstraint<NPTim<RealIntegrator> >* myNPTimZCons = NULL;
1375  ZConstraint<NPTfm<RealIntegrator> >* myNPTfmZCons = NULL;
1358          
1359    for(k=0; k<nInfo; k++){
1360      
1361      switch( ensembleCase ){
1362        
1363      case NVE_ENS:
1364 <      new NVE<RealIntegrator>( &(info[k]), the_ff );
1364 >      if (globals->haveZconstraints()){
1365 >        setupZConstraint(info[k]);
1366 >        new ZConstraint<NVE<RealIntegrator> >( &(info[k]), the_ff );
1367 >     }
1368 >
1369 >     else
1370 >        new NVE<RealIntegrator>( &(info[k]), the_ff );
1371        break;
1372        
1373      case NVT_ENS:
1374 <      myNVT = new NVT<RealIntegrator>( &(info[k]), the_ff );
1375 <      myNVT->setTargetTemp(globals->getTargetTemp());
1374 >      if (globals->haveZconstraints()){
1375 >        setupZConstraint(info[k]);
1376 >        myNVT = new ZConstraint<NVT<RealIntegrator> >( &(info[k]), the_ff );
1377 >      }
1378 >      else
1379 >        myNVT = new NVT<RealIntegrator>( &(info[k]), the_ff );
1380 >
1381 >        myNVT->setTargetTemp(globals->getTargetTemp());
1382        
1383 <      if (globals->haveTauThermostat())
1384 <        myNVT->setTauThermostat(globals->getTauThermostat());
1383 >        if (globals->haveTauThermostat())
1384 >          myNVT->setTauThermostat(globals->getTauThermostat());
1385        
1386 <      else {
1387 <        sprintf( painCave.errMsg,
1388 <                 "SimSetup error: If you use the NVT\n"
1389 <                 "    ensemble, you must set tauThermostat.\n");
1390 <        painCave.isFatal = 1;
1391 <        simError();
1392 <      }
1393 <      break;
1386 >        else {
1387 >          sprintf( painCave.errMsg,
1388 >                    "SimSetup error: If you use the NVT\n"
1389 >                    "    ensemble, you must set tauThermostat.\n");
1390 >          painCave.isFatal = 1;
1391 >          simError();
1392 >        }
1393 >        break;
1394        
1395      case NPTi_ENS:
1396 <      myNPTi = new NPTi<RealIntegrator>( &(info[k]), the_ff );
1396 >      if (globals->haveZconstraints()){
1397 >             setupZConstraint(info[k]);
1398 >         myNPTi = new ZConstraint<NPTi<RealIntegrator> >( &(info[k]), the_ff );
1399 >      }
1400 >      else
1401 >        myNPTi = new NPTi<RealIntegrator>( &(info[k]), the_ff );
1402 >
1403        myNPTi->setTargetTemp( globals->getTargetTemp() );
1404 <      
1404 >          
1405        if (globals->haveTargetPressure())
1406 <        myNPTi->setTargetPressure(globals->getTargetPressure());
1406 >        myNPTi->setTargetPressure(globals->getTargetPressure());
1407        else {
1408 <        sprintf( painCave.errMsg,
1409 <                 "SimSetup error: If you use a constant pressure\n"
1410 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1411 <        painCave.isFatal = 1;
1412 <        simError();
1408 >         sprintf( painCave.errMsg,
1409 >                   "SimSetup error: If you use a constant pressure\n"
1410 >                   "    ensemble, you must set targetPressure in the BASS file.\n");
1411 >         painCave.isFatal = 1;
1412 >         simError();
1413        }
1414 <      
1414 >          
1415        if( globals->haveTauThermostat() )
1416 <        myNPTi->setTauThermostat( globals->getTauThermostat() );
1416 >        myNPTi->setTauThermostat( globals->getTauThermostat() );
1417        else{
1418 <        sprintf( painCave.errMsg,
1419 <                 "SimSetup error: If you use an NPT\n"
1420 <                 "    ensemble, you must set tauThermostat.\n");
1421 <        painCave.isFatal = 1;
1422 <        simError();
1418 >         sprintf( painCave.errMsg,
1419 >                   "SimSetup error: If you use an NPT\n"
1420 >                  "    ensemble, you must set tauThermostat.\n");
1421 >         painCave.isFatal = 1;
1422 >         simError();
1423        }
1424 <      
1424 >          
1425        if( globals->haveTauBarostat() )
1426 <        myNPTi->setTauBarostat( globals->getTauBarostat() );
1426 >        myNPTi->setTauBarostat( globals->getTauBarostat() );
1427        else{
1428 <        sprintf( painCave.errMsg,
1429 <                 "SimSetup error: If you use an NPT\n"
1430 <                 "    ensemble, you must set tauBarostat.\n");
1431 <        painCave.isFatal = 1;
1432 <        simError();
1433 <      }
1434 <      break;
1428 >        sprintf( painCave.errMsg,
1429 >                  "SimSetup error: If you use an NPT\n"
1430 >                  "    ensemble, you must set tauBarostat.\n");
1431 >        painCave.isFatal = 1;
1432 >        simError();
1433 >       }
1434 >       break;
1435        
1436      case NPTf_ENS:
1437 <      myNPTf = new NPTf<RealIntegrator>( &(info[k]), the_ff );
1437 >      if (globals->haveZconstraints()){
1438 >        setupZConstraint(info[k]);
1439 >        myNPTf = new ZConstraint<NPTf<RealIntegrator> >( &(info[k]), the_ff );
1440 >      }
1441 >      else
1442 >        myNPTf = new NPTf<RealIntegrator>( &(info[k]), the_ff );
1443 >
1444        myNPTf->setTargetTemp( globals->getTargetTemp());
1445 <      
1445 >          
1446        if (globals->haveTargetPressure())
1447 <        myNPTf->setTargetPressure(globals->getTargetPressure());
1447 >        myNPTf->setTargetPressure(globals->getTargetPressure());
1448        else {
1449 <        sprintf( painCave.errMsg,
1450 <                 "SimSetup error: If you use a constant pressure\n"
1451 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1452 <        painCave.isFatal = 1;
1453 <        simError();
1449 >        sprintf( painCave.errMsg,
1450 >                  "SimSetup error: If you use a constant pressure\n"
1451 >                  "    ensemble, you must set targetPressure in the BASS file.\n");
1452 >        painCave.isFatal = 1;
1453 >        simError();
1454        }    
1455 <      
1455 >          
1456        if( globals->haveTauThermostat() )
1457 <        myNPTf->setTauThermostat( globals->getTauThermostat() );
1457 >        myNPTf->setTauThermostat( globals->getTauThermostat() );
1458        else{
1459 <        sprintf( painCave.errMsg,
1460 <                 "SimSetup error: If you use an NPT\n"
1461 <               "    ensemble, you must set tauThermostat.\n");
1462 <        painCave.isFatal = 1;
1463 <        simError();
1459 >        sprintf( painCave.errMsg,
1460 >         "SimSetup error: If you use an NPT\n"
1461 >                   "    ensemble, you must set tauThermostat.\n");
1462 >        painCave.isFatal = 1;
1463 >        simError();
1464        }
1465 <      
1465 >          
1466        if( globals->haveTauBarostat() )
1467 <        myNPTf->setTauBarostat( globals->getTauBarostat() );
1467 >        myNPTf->setTauBarostat( globals->getTauBarostat() );
1468        else{
1469 <        sprintf( painCave.errMsg,
1470 <                 "SimSetup error: If you use an NPT\n"
1471 <                 "    ensemble, you must set tauBarostat.\n");
1472 <        painCave.isFatal = 1;
1473 <        simError();
1469 >        sprintf( painCave.errMsg,
1470 >                  "SimSetup error: If you use an NPT\n"
1471 >                  "    ensemble, you must set tauBarostat.\n");
1472 >        painCave.isFatal = 1;
1473 >        simError();
1474        }
1475        break;
1476        
1477      case NPTim_ENS:
1478 <      myNPTim = new NPTim<RealIntegrator>( &(info[k]), the_ff );
1479 <      myNPTim->setTargetTemp( globals->getTargetTemp());
1480 <      
1478 >      if (globals->haveZconstraints()){
1479 >        setupZConstraint(info[k]);
1480 >        myNPTim = new ZConstraint<NPTim<RealIntegrator> >( &(info[k]), the_ff );
1481 >      }
1482 >      else
1483 >        myNPTim = new NPTim<RealIntegrator>( &(info[k]), the_ff );
1484 >
1485 >        myNPTim->setTargetTemp( globals->getTargetTemp());
1486 >          
1487        if (globals->haveTargetPressure())
1488 <        myNPTim->setTargetPressure(globals->getTargetPressure());
1488 >        myNPTim->setTargetPressure(globals->getTargetPressure());
1489        else {
1490 <        sprintf( painCave.errMsg,
1491 <                 "SimSetup error: If you use a constant pressure\n"
1492 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1493 <        painCave.isFatal = 1;
1494 <        simError();
1490 >        sprintf( painCave.errMsg,
1491 >                  "SimSetup error: If you use a constant pressure\n"
1492 >                  "    ensemble, you must set targetPressure in the BASS file.\n");
1493 >        painCave.isFatal = 1;
1494 >        simError();
1495        }
1496 <      
1496 >          
1497        if( globals->haveTauThermostat() )
1498 <        myNPTim->setTauThermostat( globals->getTauThermostat() );
1498 >        myNPTim->setTauThermostat( globals->getTauThermostat() );
1499        else{
1500 <        sprintf( painCave.errMsg,
1501 <                 "SimSetup error: If you use an NPT\n"
1502 <                 "    ensemble, you must set tauThermostat.\n");
1503 <        painCave.isFatal = 1;
1504 <        simError();
1500 >        sprintf( painCave.errMsg,
1501 >                  "SimSetup error: If you use an NPT\n"
1502 >                  "    ensemble, you must set tauThermostat.\n");
1503 >        painCave.isFatal = 1;
1504 >        simError();
1505        }
1506 <      
1506 >          
1507        if( globals->haveTauBarostat() )
1508 <        myNPTim->setTauBarostat( globals->getTauBarostat() );
1508 >        myNPTim->setTauBarostat( globals->getTauBarostat() );
1509        else{
1510 <      sprintf( painCave.errMsg,
1511 <               "SimSetup error: If you use an NPT\n"
1512 <               "    ensemble, you must set tauBarostat.\n");
1513 <      painCave.isFatal = 1;
1514 <      simError();
1510 >        sprintf( painCave.errMsg,
1511 >                   "SimSetup error: If you use an NPT\n"
1512 >                   "    ensemble, you must set tauBarostat.\n");
1513 >        painCave.isFatal = 1;
1514 >        simError();
1515        }
1516        break;
1517        
1518      case NPTfm_ENS:
1519 <      myNPTfm = new NPTfm<RealIntegrator>( &(info[k]), the_ff );
1519 >      if (globals->haveZconstraints()){
1520 >        setupZConstraint(info[k]);
1521 >        myNPTfm = new ZConstraint<NPTfm<RealIntegrator> >( &(info[k]), the_ff );
1522 >      }
1523 >      else
1524 >        myNPTfm = new NPTfm<RealIntegrator>( &(info[k]), the_ff );
1525 >
1526        myNPTfm->setTargetTemp( globals->getTargetTemp());
1527 <      
1527 >
1528        if (globals->haveTargetPressure())
1529 <        myNPTfm->setTargetPressure(globals->getTargetPressure());
1529 >        myNPTfm->setTargetPressure(globals->getTargetPressure());
1530        else {
1531 <        sprintf( painCave.errMsg,
1532 <                 "SimSetup error: If you use a constant pressure\n"
1533 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1534 <        painCave.isFatal = 1;
1535 <        simError();
1531 >        sprintf( painCave.errMsg,
1532 >                  "SimSetup error: If you use a constant pressure\n"
1533 >                  "    ensemble, you must set targetPressure in the BASS file.\n");
1534 >        painCave.isFatal = 1;
1535 >        simError();
1536        }
1537 <      
1537 >
1538        if( globals->haveTauThermostat() )
1539 <        myNPTfm->setTauThermostat( globals->getTauThermostat() );
1539 >        myNPTfm->setTauThermostat( globals->getTauThermostat() );
1540        else{
1541 <        sprintf( painCave.errMsg,
1542 <                 "SimSetup error: If you use an NPT\n"
1543 <                 "    ensemble, you must set tauThermostat.\n");
1544 <        painCave.isFatal = 1;
1545 <        simError();
1541 >        sprintf( painCave.errMsg,
1542 >                  "SimSetup error: If you use an NPT\n"
1543 >                  "    ensemble, you must set tauThermostat.\n");
1544 >        painCave.isFatal = 1;
1545 >        simError();
1546        }
1547 <      
1547 >
1548        if( globals->haveTauBarostat() )
1549 <        myNPTfm->setTauBarostat( globals->getTauBarostat() );
1549 >        myNPTfm->setTauBarostat( globals->getTauBarostat() );
1550        else{
1551 <        sprintf( painCave.errMsg,
1552 <                 "SimSetup error: If you use an NPT\n"
1553 <                 "    ensemble, you must set tauBarostat.\n");
1554 <        painCave.isFatal = 1;
1555 <        simError();
1538 <      }
1539 <      break;
1540 <      
1541 <    case NVEZCONS_ENS:
1542 <      
1543 <      
1544 <      //setup index of z-constraint molecules, z-constraint sampel time
1545 <      //and z-constraint force output name. These parameter should be known
1546 <      //before constructing the z-constraint integrator
1547 <      setupZConstraint();
1548 <      
1549 <      myNVEZCons = new ZConstraint<NVE<RealIntegrator> >( &(info[k]), the_ff );
1550 <      
1551 <      break;
1552 <      
1553 <      
1554 <    case NVTZCONS_ENS:
1555 <      
1556 <      setupZConstraint();
1557 <      
1558 <      myNVTZCons = new ZConstraint<NVT<RealIntegrator> >( &(info[k]), the_ff );
1559 <      myNVTZCons->setTargetTemp(globals->getTargetTemp());
1560 <      
1561 <      if (globals->haveTauThermostat())
1562 <        myNVTZCons->setTauThermostat(globals->getTauThermostat());
1563 <      
1564 <      else {
1565 <        sprintf( painCave.errMsg,
1566 <                 "SimSetup error: If you use the NVT\n"
1567 <                 "    ensemble, you must set tauThermostat.\n");
1568 <        painCave.isFatal = 1;
1569 <        simError();
1570 <      }    
1571 <      break;    
1572 <      
1573 <    case NPTiZCONS_ENS:
1574 <      
1575 <      setupZConstraint();
1576 <      
1577 <      myNPTiZCons = new ZConstraint<NPTi<RealIntegrator> >( &(info[k]), the_ff );
1578 <      myNPTiZCons->setTargetTemp( globals->getTargetTemp() );
1579 <      
1580 <      if (globals->haveTargetPressure())
1581 <        myNPTiZCons->setTargetPressure(globals->getTargetPressure());
1582 <      else {
1583 <        sprintf( painCave.errMsg,
1584 <                 "SimSetup error: If you use a constant pressure\n"
1585 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1586 <        painCave.isFatal = 1;
1587 <        simError();
1551 >        sprintf( painCave.errMsg,
1552 >                  "SimSetup error: If you use an NPT\n"
1553 >                  "    ensemble, you must set tauBarostat.\n");
1554 >        painCave.isFatal = 1;
1555 >        simError();
1556        }
1589      
1590      if( globals->haveTauThermostat() )
1591        myNPTiZCons->setTauThermostat( globals->getTauThermostat() );
1592      else{
1593        sprintf( painCave.errMsg,
1594                 "SimSetup error: If you use an NPT\n"
1595                 "    ensemble, you must set tauThermostat.\n");
1596        painCave.isFatal = 1;
1597        simError();
1598      }
1599      
1600      if( globals->haveTauBarostat() )
1601        myNPTiZCons->setTauBarostat( globals->getTauBarostat() );
1602      else{
1603        sprintf( painCave.errMsg,
1604                 "SimSetup error: If you use an NPT\n"
1605                 "    ensemble, you must set tauBarostat.\n");
1606        painCave.isFatal = 1;
1607        simError();
1608      }  
1609      
1557        break;
1558        
1612    case NPTfZCONS_ENS:
1613      
1614      setupZConstraint();
1615      
1616      myNPTfZCons = new ZConstraint<NPTf<RealIntegrator> >( &(info[k]), the_ff );
1617      myNPTfZCons->setTargetTemp( globals->getTargetTemp());
1618      
1619      if (globals->haveTargetPressure())
1620        myNPTfZCons->setTargetPressure(globals->getTargetPressure());
1621      else {
1622        sprintf( painCave.errMsg,
1623                 "SimSetup error: If you use a constant pressure\n"
1624                 "    ensemble, you must set targetPressure in the BASS file.\n");
1625        painCave.isFatal = 1;
1626        simError();
1627      }    
1628      
1629      if( globals->haveTauThermostat() )
1630        myNPTfZCons->setTauThermostat( globals->getTauThermostat() );
1631      else{
1632        sprintf( painCave.errMsg,
1633                 "SimSetup error: If you use an NPT\n"
1634                 "    ensemble, you must set tauThermostat.\n");
1635        painCave.isFatal = 1;
1636        simError();
1637      }
1638      
1639      if( globals->haveTauBarostat() )
1640        myNPTfZCons->setTauBarostat( globals->getTauBarostat() );
1641      else{
1642        sprintf( painCave.errMsg,
1643                 "SimSetup error: If you use an NPT\n"
1644                 "    ensemble, you must set tauBarostat.\n");
1645        painCave.isFatal = 1;
1646        simError();
1647      }  
1648      
1649      break;  
1650      
1651    case NPTimZCONS_ENS:
1652      
1653      setupZConstraint();
1654      
1655      myNPTimZCons = new ZConstraint<NPTim<RealIntegrator> >( &(info[k]), the_ff );
1656      myNPTimZCons->setTargetTemp( globals->getTargetTemp());
1657      
1658      if (globals->haveTargetPressure())
1659        myNPTimZCons->setTargetPressure(globals->getTargetPressure());
1660      else {
1661        sprintf( painCave.errMsg,
1662                 "SimSetup error: If you use a constant pressure\n"
1663                 "    ensemble, you must set targetPressure in the BASS file.\n");
1664        painCave.isFatal = 1;
1665        simError();
1666      }
1667      
1668      if( globals->haveTauThermostat() )
1669        myNPTimZCons->setTauThermostat( globals->getTauThermostat() );
1670      else{
1671        sprintf( painCave.errMsg,
1672                 "SimSetup error: If you use an NPT\n"
1673                 "    ensemble, you must set tauThermostat.\n");
1674        painCave.isFatal = 1;
1675        simError();
1676      }
1677      
1678      if( globals->haveTauBarostat() )
1679        myNPTimZCons->setTauBarostat( globals->getTauBarostat() );
1680      else{
1681        sprintf( painCave.errMsg,
1682                 "SimSetup error: If you use an NPT\n"
1683                 "    ensemble, you must set tauBarostat.\n");
1684        painCave.isFatal = 1;
1685        simError();
1686      }  
1687      
1688      break;
1689      
1690    case NPTfmZCONS_ENS:
1691      
1692      setupZConstraint();
1693      
1694      myNPTfmZCons = new ZConstraint<NPTfm<RealIntegrator> >( &(info[k]), the_ff );
1695      myNPTfmZCons->setTargetTemp( globals->getTargetTemp());
1696      
1697      if (globals->haveTargetPressure())
1698        myNPTfmZCons->setTargetPressure(globals->getTargetPressure());
1699      else {
1700        sprintf( painCave.errMsg,
1701                 "SimSetup error: If you use a constant pressure\n"
1702                 "    ensemble, you must set targetPressure in the BASS file.\n");
1703        painCave.isFatal = 1;
1704        simError();
1705      }
1706      
1707      if( globals->haveTauThermostat() )
1708        myNPTfmZCons->setTauThermostat( globals->getTauThermostat() );
1709      else{
1710        sprintf( painCave.errMsg,
1711                 "SimSetup error: If you use an NPT\n"
1712                 "    ensemble, you must set tauThermostat.\n");
1713        painCave.isFatal = 1;
1714        simError();
1715      }
1716      
1717      if( globals->haveTauBarostat() )
1718        myNPTfmZCons->setTauBarostat( globals->getTauBarostat() );
1719      else{
1720        sprintf( painCave.errMsg,
1721                 "SimSetup error: If you use an NPT\n"
1722                 "    ensemble, you must set tauBarostat.\n");
1723        painCave.isFatal = 1;
1724        simError();
1725      }    
1726      break;      
1727      
1728      
1729      
1559      default:
1560        sprintf( painCave.errMsg,
1561 <               "SimSetup Error. Unrecognized ensemble in case statement.\n");
1561 >                 "SimSetup Error. Unrecognized ensemble in case statement.\n");
1562        painCave.isFatal = 1;
1563        simError();
1564      }
# Line 1748 | Line 1577 | void SimSetup::initFortran( void ){
1577    }
1578    else{
1579      sprintf( painCave.errMsg,
1580 <             "SimSetup Error: unknown mixing rule -> \"%s\"\n",
1581 <             info[0].mixingRule );
1580 >       "SimSetup Error: unknown mixing rule -> \"%s\"\n",
1581 >       info[0].mixingRule );
1582      painCave.isFatal = 1;
1583      simError();
1584    }
# Line 1757 | Line 1586 | void SimSetup::initFortran( void ){
1586  
1587   #ifdef IS_MPI
1588    strcpy( checkPointMsg,
1589 <          "Successfully intialized the mixingRule for Fortran." );
1589 >    "Successfully intialized the mixingRule for Fortran." );
1590    MPIcheckPoint();
1591   #endif // is_mpi
1592  
1593   }
1594  
1595 < void SimSetup::setupZConstraint()
1595 > void SimSetup::setupZConstraint(SimInfo& theInfo)
1596   {
1597 <  int k;
1597 >  int nZConstraints;
1598 >  ZconStamp** zconStamp;
1599  
1600 <  for(k=0; k<nInfo; k++){
1600 >  if(globals->haveZconstraintTime()){  
1601      
1602 <    if(globals->haveZConsTime()){  
1603 <      
1604 <      //add sample time of z-constraint  into SimInfo's property list                    
1605 <      DoubleData* zconsTimeProp = new DoubleData();
1606 <      zconsTimeProp->setID("zconstime");
1607 <      zconsTimeProp->setData(globals->getZConsTime());
1608 <      info[k].addProperty(zconsTimeProp);
1609 <    }
1610 <    else{
1611 <      sprintf( painCave.errMsg,
1612 <               "ZConstraint error: If you use an ZConstraint\n"
1613 <               " , you must set sample time.\n");
1614 <      painCave.isFatal = 1;
1615 <      simError();      
1616 <    }
1617 <    
1618 <    if(globals->haveIndexOfAllZConsMols()){
1602 >    //add sample time of z-constraint  into SimInfo's property list                    
1603 >    DoubleData* zconsTimeProp = new DoubleData();
1604 >    zconsTimeProp->setID(ZCONSTIME_ID);
1605 >    zconsTimeProp->setData(globals->getZconsTime());
1606 >    theInfo.addProperty(zconsTimeProp);
1607 >  }
1608 >  else{
1609 >    sprintf( painCave.errMsg,
1610 >       "ZConstraint error: If you use an ZConstraint\n"
1611 >       " , you must set sample time.\n");
1612 >    painCave.isFatal = 1;
1613 >    simError();      
1614 >  }
1615 >
1616 >  //push zconsTol into siminfo, if user does not specify
1617 >  //value for zconsTol, a default value will be used
1618 >  DoubleData* zconsTol = new DoubleData();
1619 >  zconsTol->setID(ZCONSTOL_ID);
1620 >  if(globals->haveZconsTol()){
1621 >    zconsTol->setData(globals->getZconsTol());
1622 >  }
1623 >  else{
1624 >  double defaultZConsTol = 0.01;
1625 >    sprintf( painCave.errMsg,
1626 >       "ZConstraint Waring: Tolerance for z-constraint methodl is not specified\n"
1627 >       " , default value %f is used.\n", defaultZConsTol);
1628 >    painCave.isFatal = 0;
1629 >    simError();      
1630 >
1631 >    zconsTol->setData(defaultZConsTol);
1632 >  }
1633 >  theInfo.addProperty(zconsTol);
1634 >
1635 >  //set Force Substraction Policy
1636 >  StringData* zconsForcePolicy =  new StringData();
1637 >  zconsForcePolicy->setID(ZCONSFORCEPOLICY_ID);
1638 >  
1639 >  if(globals->haveZconsForcePolicy()){
1640 >    zconsForcePolicy->setData(globals->getZconsForcePolicy());
1641 >  }  
1642 >  else{
1643 >     sprintf( painCave.errMsg,
1644 >             "ZConstraint Warning: User does not set force substraction policy, "
1645 >             "average force substraction policy is used\n");
1646 >     painCave.isFatal = 0;
1647 >     simError();
1648 >     zconsForcePolicy->setData("BYNUMBER");
1649 >  }
1650  
1651 <      //add index of z-constraint molecules into SimInfo's property list
1652 <      vector<int> tempIndex = globals->getIndexOfAllZConsMols();
1653 <      
1654 <      //sort the index
1655 <      sort(tempIndex.begin(), tempIndex.end());
1656 <      
1657 <      IndexData* zconsIndex = new IndexData();
1658 <      zconsIndex->setID("zconsindex");
1659 <      zconsIndex->setIndexData(tempIndex);
1660 <      info[k].addProperty(zconsIndex);
1661 <    }
1662 <    else{
1663 <      sprintf( painCave.errMsg,
1664 <               "SimSetup error: If you use an ZConstraint\n"
1665 <               " , you must set index of z-constraint molecules.\n");
1666 <      painCave.isFatal = 1;
1667 <      simError();    
1668 <      
1669 <    }
1670 <    
1671 <    //Determine the name of ouput file and add it into SimInfo's property list
1672 <    //Be careful, do not use inFileName, since it is a pointer which
1673 <    //point to a string at master node, and slave nodes do not contain that string
1674 <    
1675 <    string zconsOutput(info[k].finalName);
1676 <    
1677 <    zconsOutput = zconsOutput.substr(0, zconsOutput.rfind(".")) + ".fz";
1678 <    
1679 <    StringData* zconsFilename = new StringData();
1680 <    zconsFilename->setID("zconsfilename");
1681 <    zconsFilename->setData(zconsOutput);
1682 <    
1683 <    info[k].addProperty(zconsFilename);      
1651 > theInfo.addProperty(zconsForcePolicy);
1652 >
1653 >  //Determine the name of ouput file and add it into SimInfo's property list
1654 >  //Be careful, do not use inFileName, since it is a pointer which
1655 >  //point to a string at master node, and slave nodes do not contain that string
1656 >  
1657 >  string zconsOutput(theInfo.finalName);
1658 >  
1659 >  zconsOutput = zconsOutput.substr(0, zconsOutput.rfind(".")) + ".fz";
1660 >  
1661 >  StringData* zconsFilename = new StringData();
1662 >  zconsFilename->setID(ZCONSFILENAME_ID);
1663 >  zconsFilename->setData(zconsOutput);
1664 >  
1665 >  theInfo.addProperty(zconsFilename);
1666 >  
1667 >  //setup index, pos and other parameters of z-constraint molecules
1668 >  nZConstraints = globals->getNzConstraints();
1669 >  theInfo.nZconstraints = nZConstraints;
1670 >
1671 >  zconStamp = globals->getZconStamp();
1672 >  ZConsParaItem tempParaItem;
1673 >
1674 >  ZConsParaData* zconsParaData = new ZConsParaData();
1675 >  zconsParaData->setID(ZCONSPARADATA_ID);
1676 >
1677 >  for(int i = 0; i < nZConstraints; i++){
1678 >    tempParaItem.havingZPos = zconStamp[i]->haveZpos();
1679 >    tempParaItem.zPos = zconStamp[i]->getZpos();
1680 >    tempParaItem.zconsIndex = zconStamp[i]->getMolIndex();
1681 >    tempParaItem.kRatio = zconStamp[i]->getKratio();
1682 >
1683 >    zconsParaData->addItem(tempParaItem);
1684    }
1685 +
1686 +  //sort the parameters by index of molecules
1687 +  zconsParaData->sortByIndex();
1688 +  
1689 +  //push data into siminfo, therefore, we can retrieve later
1690 +  theInfo.addProperty(zconsParaData);
1691 +      
1692   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines