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 690 by mmeineke, Tue Aug 12 21:44:06 2003 UTC vs.
Revision 708 by tim, Wed Aug 20 22:23:34 2003 UTC

# Line 3 | Line 3
3   #include <iostream>
4   #include <cmath>
5   #include <string>
6 + #include <sys/time.h>
7  
8   #include "SimSetup.hpp"
9   #include "ReadWrite.hpp"
# Line 189 | Line 190 | void SimSetup::makeMolecules( void ){
190        // make the Atoms
191      
192        for(j=0; j<molInfo.nAtoms; j++){
193 <        
194 <        currentAtom = comp_stamps[stampID]->getAtom( j );
195 <        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() );
193 >  
194 >  currentAtom = comp_stamps[stampID]->getAtom( j );
195 >  if( currentAtom->haveOrientation() ){
196      
197 +    dAtom = new DirectionalAtom( (j + atomOffset),
198 +               info[k].getConfiguration() );
199 +    info[k].n_oriented++;
200 +    molInfo.myAtoms[j] = dAtom;
201 +    
202 +    ux = currentAtom->getOrntX();
203 +    uy = currentAtom->getOrntY();
204 +    uz = currentAtom->getOrntZ();
205 +    
206 +    uSqr = (ux * ux) + (uy * uy) + (uz * uz);
207 +    
208 +    u = sqrt( uSqr );
209 +    ux = ux / u;
210 +    uy = uy / u;
211 +    uz = uz / u;
212 +    
213 +    dAtom->setSUx( ux );
214 +    dAtom->setSUy( uy );
215 +    dAtom->setSUz( uz );
216 +  }
217 +  else{
218 +    molInfo.myAtoms[j] = new GeneralAtom( (j + atomOffset),
219 +            info[k].getConfiguration() );
220 +  }
221 +  molInfo.myAtoms[j]->setType( currentAtom->getType() );
222 +    
223   #ifdef IS_MPI
224        
225 <        molInfo.myAtoms[j]->setGlobalIndex( globalIndex[j+atomOffset] );
225 >  molInfo.myAtoms[j]->setGlobalIndex( globalIndex[j+atomOffset] );
226        
227   #endif // is_mpi
228        }
# Line 229 | Line 230 | void SimSetup::makeMolecules( void ){
230      // make the bonds
231        for(j=0; j<molInfo.nBonds; j++){
232        
233 <        currentBond = comp_stamps[stampID]->getBond( j );
234 <        theBonds[j].a = currentBond->getA() + atomOffset;
235 <        theBonds[j].b = currentBond->getB() + atomOffset;
236 <        
237 <        exI = theBonds[j].a;
238 <        exJ = theBonds[j].b;
239 <        
240 <        // exclude_I must always be the smaller of the pair
241 <        if( exI > exJ ){
242 <          tempEx = exI;
243 <          exI = exJ;
244 <          exJ = tempEx;
245 <        }
246 < #ifdef IS_MPI
247 <        tempEx = exI;
248 <        exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
249 <        tempEx = exJ;
250 <        exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
251 <        
252 <        info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
233 >  currentBond = comp_stamps[stampID]->getBond( j );
234 >  theBonds[j].a = currentBond->getA() + atomOffset;
235 >  theBonds[j].b = currentBond->getB() + atomOffset;
236 >  
237 >  exI = theBonds[j].a;
238 >  exJ = theBonds[j].b;
239 >  
240 >  // exclude_I must always be the smaller of the pair
241 >  if( exI > exJ ){
242 >    tempEx = exI;
243 >    exI = exJ;
244 >    exJ = tempEx;
245 >  }
246 > #ifdef IS_MPI
247 >  tempEx = exI;
248 >  exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
249 >  tempEx = exJ;
250 >  exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
251 >  
252 >  info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
253   #else  // isn't MPI
254 <        
255 <        info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
254 >  
255 >  info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
256   #endif  //is_mpi
257        }
258        excludeOffset += molInfo.nBonds;
259        
260        //make the bends
261        for(j=0; j<molInfo.nBends; j++){
262 <        
263 <        currentBend = comp_stamps[stampID]->getBend( j );
264 <        theBends[j].a = currentBend->getA() + atomOffset;
265 <        theBends[j].b = currentBend->getB() + atomOffset;
266 <        theBends[j].c = currentBend->getC() + atomOffset;
267 <        
268 <        if( currentBend->haveExtras() ){
269 <          
270 <          extras = currentBend->getExtras();
271 <          current_extra = extras;
272 <          
273 <          while( current_extra != NULL ){
274 <            if( !strcmp( current_extra->getlhs(), "ghostVectorSource" )){
275 <              
276 <              switch( current_extra->getType() ){
277 <                
278 <              case 0:
279 <                theBends[j].ghost =
280 <                  current_extra->getInt() + atomOffset;
281 <                theBends[j].isGhost = 1;
282 <                break;
283 <                
284 <              case 1:
285 <                theBends[j].ghost =
286 <                  (int)current_extra->getDouble() + atomOffset;
287 <                theBends[j].isGhost = 1;
288 <                break;
289 <                
290 <              default:
291 <                sprintf( painCave.errMsg,
292 <                         "SimSetup Error: ghostVectorSource was neither a "
293 <                         "double nor an int.\n"
294 <                         "-->Bend[%d] in %s\n",
295 <                         j, comp_stamps[stampID]->getID() );
296 <                painCave.isFatal = 1;
297 <                simError();
298 <              }
299 <            }
300 <            
301 <            else{
302 <              
303 <              sprintf( painCave.errMsg,
304 <                       "SimSetup Error: unhandled bend assignment:\n"
305 <                       "    -->%s in Bend[%d] in %s\n",
306 <                       current_extra->getlhs(),
307 <                       j, comp_stamps[stampID]->getID() );
308 <              painCave.isFatal = 1;
309 <              simError();
310 <            }
311 <            
312 <            current_extra = current_extra->getNext();
313 <          }
314 <        }
315 <        
316 <        if( !theBends[j].isGhost ){
317 <          
318 <          exI = theBends[j].a;
319 <          exJ = theBends[j].c;
320 <        }
321 <        else{
322 <          
323 <          exI = theBends[j].a;
324 <          exJ = theBends[j].b;
325 <        }
326 <        
327 <        // exclude_I must always be the smaller of the pair
328 <        if( exI > exJ ){
329 <          tempEx = exI;
330 <          exI = exJ;
331 <          exJ = tempEx;
332 <        }
262 >  
263 >  currentBend = comp_stamps[stampID]->getBend( j );
264 >  theBends[j].a = currentBend->getA() + atomOffset;
265 >  theBends[j].b = currentBend->getB() + atomOffset;
266 >  theBends[j].c = currentBend->getC() + atomOffset;
267 >  
268 >  if( currentBend->haveExtras() ){
269 >    
270 >    extras = currentBend->getExtras();
271 >    current_extra = extras;
272 >    
273 >    while( current_extra != NULL ){
274 >      if( !strcmp( current_extra->getlhs(), "ghostVectorSource" )){
275 >        
276 >        switch( current_extra->getType() ){
277 >    
278 >        case 0:
279 >    theBends[j].ghost =
280 >      current_extra->getInt() + atomOffset;
281 >    theBends[j].isGhost = 1;
282 >    break;
283 >    
284 >        case 1:
285 >    theBends[j].ghost =
286 >      (int)current_extra->getDouble() + atomOffset;
287 >    theBends[j].isGhost = 1;
288 >    break;
289 >    
290 >        default:
291 >    sprintf( painCave.errMsg,
292 >       "SimSetup Error: ghostVectorSource was neither a "
293 >       "double nor an int.\n"
294 >       "-->Bend[%d] in %s\n",
295 >       j, comp_stamps[stampID]->getID() );
296 >    painCave.isFatal = 1;
297 >    simError();
298 >        }
299 >      }
300 >      
301 >      else{
302 >        
303 >        sprintf( painCave.errMsg,
304 >           "SimSetup Error: unhandled bend assignment:\n"
305 >           "    -->%s in Bend[%d] in %s\n",
306 >           current_extra->getlhs(),
307 >           j, comp_stamps[stampID]->getID() );
308 >        painCave.isFatal = 1;
309 >        simError();
310 >      }
311 >      
312 >      current_extra = current_extra->getNext();
313 >    }
314 >  }
315 >  
316 >  if( !theBends[j].isGhost ){
317 >    
318 >    exI = theBends[j].a;
319 >    exJ = theBends[j].c;
320 >  }
321 >  else{
322 >    
323 >    exI = theBends[j].a;
324 >    exJ = theBends[j].b;
325 >  }
326 >  
327 >  // exclude_I must always be the smaller of the pair
328 >  if( exI > exJ ){
329 >    tempEx = exI;
330 >    exI = exJ;
331 >    exJ = tempEx;
332 >  }
333   #ifdef IS_MPI
334 <        tempEx = exI;
335 <        exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
336 <        tempEx = exJ;
337 <        exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
334 >  tempEx = exI;
335 >  exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
336 >  tempEx = exJ;
337 >  exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
338        
339 <        info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
339 >  info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
340   #else  // isn't MPI
341 <        info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
341 >  info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
342   #endif  //is_mpi
343        }
344        excludeOffset += molInfo.nBends;
345        
346        for(j=0; j<molInfo.nTorsions; j++){
347 <        
348 <        currentTorsion = comp_stamps[stampID]->getTorsion( j );
349 <        theTorsions[j].a = currentTorsion->getA() + atomOffset;
350 <        theTorsions[j].b = currentTorsion->getB() + atomOffset;
351 <        theTorsions[j].c = currentTorsion->getC() + atomOffset;
352 <        theTorsions[j].d = currentTorsion->getD() + atomOffset;
353 <        
354 <        exI = theTorsions[j].a;
355 <        exJ = theTorsions[j].d;
356 <        
357 <        // exclude_I must always be the smaller of the pair
358 <        if( exI > exJ ){
359 <          tempEx = exI;
360 <          exI = exJ;
361 <          exJ = tempEx;
362 <        }
347 >  
348 >  currentTorsion = comp_stamps[stampID]->getTorsion( j );
349 >  theTorsions[j].a = currentTorsion->getA() + atomOffset;
350 >  theTorsions[j].b = currentTorsion->getB() + atomOffset;
351 >  theTorsions[j].c = currentTorsion->getC() + atomOffset;
352 >  theTorsions[j].d = currentTorsion->getD() + atomOffset;
353 >  
354 >  exI = theTorsions[j].a;
355 >  exJ = theTorsions[j].d;
356 >  
357 >  // exclude_I must always be the smaller of the pair
358 >  if( exI > exJ ){
359 >    tempEx = exI;
360 >    exI = exJ;
361 >    exJ = tempEx;
362 >  }
363   #ifdef IS_MPI
364 <        tempEx = exI;
365 <        exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
366 <        tempEx = exJ;
367 <        exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
368 <        
369 <        info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
364 >  tempEx = exI;
365 >  exI = info[k].atoms[tempEx]->getGlobalIndex() + 1;
366 >  tempEx = exJ;
367 >  exJ = info[k].atoms[tempEx]->getGlobalIndex() + 1;
368 >  
369 >  info[k].excludes[j+excludeOffset]->setPair( exI, exJ );
370   #else  // isn't MPI
371 <        info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
371 >  info[k].excludes[j+excludeOffset]->setPair( (exI+1), (exJ+1) );
372   #endif  //is_mpi
373        }
374        excludeOffset += molInfo.nTorsions;
# Line 436 | Line 437 | void SimSetup::initFromBass( void ){
437  
438      if( n_per_extra > 4){
439        sprintf( painCave.errMsg,
440 <               "SimSetup error. There has been an error in constructing"
441 <               " the non-complete lattice.\n" );
440 >         "SimSetup error. There has been an error in constructing"
441 >         " the non-complete lattice.\n" );
442        painCave.isFatal = 1;
443        simError();
444      }
# Line 458 | Line 459 | void SimSetup::initFromBass( void ){
459      for( j=0; j < n_cells; j++ ){
460        for( k=0; k < n_cells; k++ ){
461  
462 <        makeElement( i * cellx,
463 <                     j * celly,
464 <                     k * cellz );
462 >  makeElement( i * cellx,
463 >         j * celly,
464 >         k * cellz );
465  
466 <        makeElement( i * cellx + 0.5 * cellx,
467 <                     j * celly + 0.5 * celly,
468 <                     k * cellz );
466 >  makeElement( i * cellx + 0.5 * cellx,
467 >         j * celly + 0.5 * celly,
468 >         k * cellz );
469  
470 <        makeElement( i * cellx,
471 <                     j * celly + 0.5 * celly,
472 <                     k * cellz + 0.5 * cellz );
470 >  makeElement( i * cellx,
471 >         j * celly + 0.5 * celly,
472 >         k * cellz + 0.5 * cellz );
473  
474 <        makeElement( i * cellx + 0.5 * cellx,
475 <                     j * celly,
476 <                     k * cellz + 0.5 * cellz );
474 >  makeElement( i * cellx + 0.5 * cellx,
475 >         j * celly,
476 >         k * cellz + 0.5 * cellz );
477        }
478      }
479    }
# Line 484 | Line 485 | void SimSetup::initFromBass( void ){
485      for( i=0; i < (n_cells+1) && !done; i++ ){
486        for( j=0; j < (n_cells+1) && !done; j++ ){
487  
488 <        if( i < n_cells ){
488 >  if( i < n_cells ){
489  
490 <          if( j < n_cells ){
491 <            start_ndx = n_cells;
492 <          }
493 <          else start_ndx = 0;
494 <        }
495 <        else start_ndx = 0;
490 >    if( j < n_cells ){
491 >      start_ndx = n_cells;
492 >    }
493 >    else start_ndx = 0;
494 >  }
495 >  else start_ndx = 0;
496  
497 <        for( k=start_ndx; k < (n_cells+1) && !done; k++ ){
497 >  for( k=start_ndx; k < (n_cells+1) && !done; k++ ){
498  
499 <          makeElement( i * cellx,
500 <                       j * celly,
501 <                       k * cellz );
502 <          done = ( current_mol >= tot_nmol );
499 >    makeElement( i * cellx,
500 >           j * celly,
501 >           k * cellz );
502 >    done = ( current_mol >= tot_nmol );
503  
504 <          if( !done && n_per_extra > 1 ){
505 <            makeElement( i * cellx + 0.5 * cellx,
506 <                         j * celly + 0.5 * celly,
507 <                         k * cellz );
508 <            done = ( current_mol >= tot_nmol );
509 <          }
504 >    if( !done && n_per_extra > 1 ){
505 >      makeElement( i * cellx + 0.5 * cellx,
506 >       j * celly + 0.5 * celly,
507 >       k * cellz );
508 >      done = ( current_mol >= tot_nmol );
509 >    }
510  
511 <          if( !done && n_per_extra > 2){
512 <            makeElement( i * cellx,
513 <                         j * celly + 0.5 * celly,
514 <                         k * cellz + 0.5 * cellz );
515 <            done = ( current_mol >= tot_nmol );
516 <          }
511 >    if( !done && n_per_extra > 2){
512 >      makeElement( i * cellx,
513 >       j * celly + 0.5 * celly,
514 >       k * cellz + 0.5 * cellz );
515 >      done = ( current_mol >= tot_nmol );
516 >    }
517  
518 <          if( !done && n_per_extra > 3){
519 <            makeElement( i * cellx + 0.5 * cellx,
520 <                         j * celly,
521 <                         k * cellz + 0.5 * cellz );
522 <            done = ( current_mol >= tot_nmol );
523 <          }
524 <        }
518 >    if( !done && n_per_extra > 3){
519 >      makeElement( i * cellx + 0.5 * cellx,
520 >       j * celly,
521 >       k * cellz + 0.5 * cellz );
522 >      done = ( current_mol >= tot_nmol );
523 >    }
524 >  }
525        }
526      }
527    }
# Line 543 | Line 544 | void SimSetup::makeElement( double x, double y, double
544      current_atom = comp_stamps[current_comp]->getAtom( k );
545      if( !current_atom->havePosition() ){
546        sprintf( painCave.errMsg,
547 <               "SimSetup:initFromBass error.\n"
548 <               "\tComponent %s, atom %s does not have a position specified.\n"
549 <               "\tThe initialization routine is unable to give a start"
550 <               " position.\n",
551 <               comp_stamps[current_comp]->getID(),
552 <               current_atom->getType() );
547 >         "SimSetup:initFromBass error.\n"
548 >         "\tComponent %s, atom %s does not have a position specified.\n"
549 >         "\tThe initialization routine is unable to give a start"
550 >         " position.\n",
551 >         comp_stamps[current_comp]->getID(),
552 >         current_atom->getType() );
553        painCave.isFatal = 1;
554        simError();
555      }
# Line 617 | Line 618 | void SimSetup::gatherInfo( void ){
618    else if( !strcasecmp( force_field, "EAM" )) ffCase = FF_EAM;
619    else{
620      sprintf( painCave.errMsg,
621 <             "SimSetup Error. Unrecognized force field -> %s\n",
622 <             force_field );
621 >       "SimSetup Error. Unrecognized force field -> %s\n",
622 >       force_field );
623      painCave.isFatal = 1;
624      simError();
625    }
# Line 636 | Line 637 | void SimSetup::gatherInfo( void ){
637    else if( !strcasecmp( ensemble, "NPTfm" )) ensembleCase = NPTfm_ENS;
638    else{
639      sprintf( painCave.errMsg,
640 <             "SimSetup Warning. Unrecognized Ensemble -> %s, "
640 >       "SimSetup Warning. Unrecognized Ensemble -> %s, "
641               "reverting to NVE for this simulation.\n",
642 <             ensemble );
642 >       ensemble );
643      painCave.isFatal = 0;
644      simError();
645      strcpy( ensemble, "NVE" );
# Line 669 | Line 670 | void SimSetup::gatherInfo( void ){
670      for( i=0; i<n_components; i++ ){
671  
672        if( !the_components[i]->haveNMol() ){
673 <        // we have a problem
674 <        sprintf( painCave.errMsg,
675 <                 "SimSetup Error. No global NMol or component NMol"
676 <                 " given. Cannot calculate the number of atoms.\n" );
677 <        painCave.isFatal = 1;
678 <        simError();
673 >  // we have a problem
674 >  sprintf( painCave.errMsg,
675 >     "SimSetup Error. No global NMol or component NMol"
676 >     " given. Cannot calculate the number of atoms.\n" );
677 >  painCave.isFatal = 1;
678 >  simError();
679        }
680  
681        tot_nmol += the_components[i]->getNMol();
# Line 683 | Line 684 | void SimSetup::gatherInfo( void ){
684    }
685    else{
686      sprintf( painCave.errMsg,
687 <             "SimSetup error.\n"
688 <             "\tSorry, the ability to specify total"
689 <             " nMols and then give molfractions in the components\n"
690 <             "\tis not currently supported."
691 <             " Please give nMol in the components.\n" );
687 >       "SimSetup error.\n"
688 >       "\tSorry, the ability to specify total"
689 >       " nMols and then give molfractions in the components\n"
690 >       "\tis not currently supported."
691 >       " Please give nMol in the components.\n" );
692      painCave.isFatal = 1;
693      simError();
694    }
# Line 741 | Line 742 | void SimSetup::gatherInfo( void ){
742    }
743      else{
744        if( !globals->haveBoxX() ){
745 <        sprintf( painCave.errMsg,
746 <                 "SimSetup error, no periodic BoxX size given.\n" );
747 <        painCave.isFatal = 1;
748 <        simError();
745 >  sprintf( painCave.errMsg,
746 >     "SimSetup error, no periodic BoxX size given.\n" );
747 >  painCave.isFatal = 1;
748 >  simError();
749        }
750        boxVector[0] = globals->getBoxX();
751        
752        if( !globals->haveBoxY() ){
753 <        sprintf( painCave.errMsg,
754 <                 "SimSetup error, no periodic BoxY size given.\n" );
755 <        painCave.isFatal = 1;
756 <        simError();
753 >  sprintf( painCave.errMsg,
754 >     "SimSetup error, no periodic BoxY size given.\n" );
755 >  painCave.isFatal = 1;
756 >  simError();
757        }
758        boxVector[1] = globals->getBoxY();
759        
760        if( !globals->haveBoxZ() ){
761 <        sprintf( painCave.errMsg,
762 <                 "SimSetup error, no periodic BoxZ size given.\n" );
763 <        painCave.isFatal = 1;
764 <        simError();
761 >  sprintf( painCave.errMsg,
762 >     "SimSetup error, no periodic BoxZ size given.\n" );
763 >  painCave.isFatal = 1;
764 >  simError();
765        }
766        boxVector[2] = globals->getBoxZ();
767        
768        info[i].setBox( boxVector );
769      }
770 +  }
771  
772 +  int seedValue;
773 +  struct timeval now_time_val;
774 +  struct timezone time_zone;
775 +
776 +  if(globals->haveSeed()){
777 +    seedValue = globals->getSeed();
778    }
779 <    
779 >  else{
780 > #ifndef IS_MPI
781 >    gettimeofday(&now_time_val, &time_zone);  // get the time now  
782 >    seedValue = (int) now_time_val.tv_sec;      //  convert to epoch time
783 > #else
784 >    if(worldRank == 0){
785 >      gettimeofday(&now_time_val, &time_zone);  // get the time now
786 >      seedValue = (int) now_time_val.tv_sec;      //  convert to epoch time      
787 >    }
788 >     MPI_Bcast(&seedValue, 1, MPI_INT, 0, MPI_COMM_WORLD);  
789 > #endif
790 >  }
791 >
792 >  for(int i = 0; i < nInfo; i++){
793 >    info[i].setSeed(seedValue);
794 >  }
795 >
796   #ifdef IS_MPI
797    strcpy( checkPointMsg, "Succesfully gathered all information from Bass\n" );
798    MPIcheckPoint();
# Line 803 | Line 827 | void SimSetup::finalInfoCheck( void ){
827        info[i].useReactionField = 1;
828        
829        if( !globals->haveECR() ){
830 <        sprintf( painCave.errMsg,
831 <                 "SimSetup Warning: using default value of 1/2 the smallest "
832 <                 "box length for the electrostaticCutoffRadius.\n"
833 <                 "I hope you have a very fast processor!\n");
834 <        painCave.isFatal = 0;
835 <        simError();
836 <        double smallest;
837 <        smallest = info[i].boxL[0];
838 <        if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
839 <        if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
840 <        theEcr = 0.5 * smallest;
830 >  sprintf( painCave.errMsg,
831 >     "SimSetup Warning: using default value of 1/2 the smallest "
832 >     "box length for the electrostaticCutoffRadius.\n"
833 >     "I hope you have a very fast processor!\n");
834 >  painCave.isFatal = 0;
835 >  simError();
836 >  double smallest;
837 >  smallest = info[i].boxL[0];
838 >  if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
839 >  if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
840 >  theEcr = 0.5 * smallest;
841        } else {
842 <        theEcr = globals->getECR();
842 >  theEcr = globals->getECR();
843        }
844        
845        if( !globals->haveEST() ){
846 <        sprintf( painCave.errMsg,
847 <                 "SimSetup Warning: using default value of 0.05 * the "
848 <                 "electrostaticCutoffRadius for the electrostaticSkinThickness\n"
849 <                 );
850 <        painCave.isFatal = 0;
851 <        simError();
852 <        theEst = 0.05 * theEcr;
846 >  sprintf( painCave.errMsg,
847 >     "SimSetup Warning: using default value of 0.05 * the "
848 >     "electrostaticCutoffRadius for the electrostaticSkinThickness\n"
849 >     );
850 >  painCave.isFatal = 0;
851 >  simError();
852 >  theEst = 0.05 * theEcr;
853        } else {
854 <        theEst= globals->getEST();
854 >  theEst= globals->getEST();
855        }
856        
857        info[i].setEcr( theEcr, theEst );
858        
859        if(!globals->haveDielectric() ){
860 <        sprintf( painCave.errMsg,
861 <                 "SimSetup Error: You are trying to use Reaction Field without"
862 <                 "setting a dielectric constant!\n"
863 <                 );
864 <        painCave.isFatal = 1;
865 <        simError();
860 >  sprintf( painCave.errMsg,
861 >     "SimSetup Error: You are trying to use Reaction Field without"
862 >     "setting a dielectric constant!\n"
863 >     );
864 >  painCave.isFatal = 1;
865 >  simError();
866        }
867        info[i].dielectric = globals->getDielectric();  
868      }
869      else {
870        if (usesDipoles) {
871 <        
872 <        if( !globals->haveECR() ){
873 <          sprintf( painCave.errMsg,
874 <                   "SimSetup Warning: using default value of 1/2 the smallest "
875 <                   "box length for the electrostaticCutoffRadius.\n"
876 <                   "I hope you have a very fast processor!\n");
877 <          painCave.isFatal = 0;
878 <          simError();
879 <          double smallest;
880 <          smallest = info[i].boxL[0];
881 <          if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
882 <          if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
883 <          theEcr = 0.5 * smallest;
884 <        } else {
885 <          theEcr = globals->getECR();
886 <        }
887 <        
888 <        if( !globals->haveEST() ){
889 <          sprintf( painCave.errMsg,
890 <                   "SimSetup Warning: using default value of 0.05 * the "
891 <                   "electrostaticCutoffRadius for the "
892 <                   "electrostaticSkinThickness\n"
893 <                   );
894 <          painCave.isFatal = 0;
895 <          simError();
896 <          theEst = 0.05 * theEcr;
897 <        } else {
898 <          theEst= globals->getEST();
899 <        }
900 <        
901 <        info[i].setEcr( theEcr, theEst );
871 >  
872 >  if( !globals->haveECR() ){
873 >    sprintf( painCave.errMsg,
874 >       "SimSetup Warning: using default value of 1/2 the smallest "
875 >       "box length for the electrostaticCutoffRadius.\n"
876 >       "I hope you have a very fast processor!\n");
877 >    painCave.isFatal = 0;
878 >    simError();
879 >    double smallest;
880 >    smallest = info[i].boxL[0];
881 >    if (info[i].boxL[1] <= smallest) smallest = info[i].boxL[1];
882 >    if (info[i].boxL[2] <= smallest) smallest = info[i].boxL[2];
883 >    theEcr = 0.5 * smallest;
884 >  } else {
885 >    theEcr = globals->getECR();
886 >  }
887 >  
888 >  if( !globals->haveEST() ){
889 >    sprintf( painCave.errMsg,
890 >       "SimSetup Warning: using default value of 0.05 * the "
891 >       "electrostaticCutoffRadius for the "
892 >       "electrostaticSkinThickness\n"
893 >       );
894 >    painCave.isFatal = 0;
895 >    simError();
896 >    theEst = 0.05 * theEcr;
897 >  } else {
898 >    theEst= globals->getEST();
899 >  }
900 >  
901 >  info[i].setEcr( theEcr, theEst );
902        }
903      }  
904    }
# Line 891 | Line 915 | void SimSetup::initSystemCoords( void ){
915    
916    char* inName;
917  
894
918    (info[0].getConfiguration())->createArrays( info[0].n_atoms );
919 <  
919 >
920    for(i=0; i<info[0].n_atoms; i++) info[0].atoms[i]->setCoords();
921    
922    if( globals->haveInitialConfig() ){
# Line 903 | Line 926 | void SimSetup::initSystemCoords( void ){
926      if( worldRank == 0 ){
927   #endif //is_mpi
928        inName = globals->getInitialConfig();
929 +      double* tempDouble = new double[1000000];
930        fileInit = new InitializeFromFile( inName );
931   #ifdef IS_MPI
932      }else fileInit = new InitializeFromFile( NULL );
# Line 918 | Line 942 | void SimSetup::initSystemCoords( void ){
942      // no init from bass
943      
944      sprintf( painCave.errMsg,
945 <             "Cannot intialize a parallel simulation without an initial configuration file.\n" );
945 >       "Cannot intialize a parallel simulation without an initial configuration file.\n" );
946      painCave.isFatal;
947      simError();
948      
# Line 950 | Line 974 | void SimSetup::makeOutNames( void ){
974   #endif // is_mpi
975        
976        if( globals->haveFinalConfig() ){
977 <        strcpy( info[k].finalName, globals->getFinalConfig() );
977 >  strcpy( info[k].finalName, globals->getFinalConfig() );
978        }
979        else{
980 <        strcpy( info[k].finalName, inFileName );
981 <        char* endTest;
982 <        int nameLength = strlen( info[k].finalName );
983 <        endTest = &(info[k].finalName[nameLength - 5]);
984 <        if( !strcmp( endTest, ".bass" ) ){
985 <          strcpy( endTest, ".eor" );
986 <        }
987 <        else if( !strcmp( endTest, ".BASS" ) ){
988 <          strcpy( endTest, ".eor" );
989 <        }
990 <        else{
991 <          endTest = &(info[k].finalName[nameLength - 4]);
992 <          if( !strcmp( endTest, ".bss" ) ){
993 <            strcpy( endTest, ".eor" );
994 <          }
995 <          else if( !strcmp( endTest, ".mdl" ) ){
996 <            strcpy( endTest, ".eor" );
997 <          }
998 <          else{
999 <            strcat( info[k].finalName, ".eor" );
1000 <          }
1001 <        }
980 >  strcpy( info[k].finalName, inFileName );
981 >  char* endTest;
982 >  int nameLength = strlen( info[k].finalName );
983 >  endTest = &(info[k].finalName[nameLength - 5]);
984 >  if( !strcmp( endTest, ".bass" ) ){
985 >    strcpy( endTest, ".eor" );
986 >  }
987 >  else if( !strcmp( endTest, ".BASS" ) ){
988 >    strcpy( endTest, ".eor" );
989 >  }
990 >  else{
991 >    endTest = &(info[k].finalName[nameLength - 4]);
992 >    if( !strcmp( endTest, ".bss" ) ){
993 >      strcpy( endTest, ".eor" );
994 >    }
995 >    else if( !strcmp( endTest, ".mdl" ) ){
996 >      strcpy( endTest, ".eor" );
997 >    }
998 >    else{
999 >      strcat( info[k].finalName, ".eor" );
1000 >    }
1001 >  }
1002        }
1003        
1004        // make the sample and status out names
# Line 984 | Line 1008 | void SimSetup::makeOutNames( void ){
1008        int nameLength = strlen( info[k].sampleName );
1009        endTest = &(info[k].sampleName[nameLength - 5]);
1010        if( !strcmp( endTest, ".bass" ) ){
1011 <        strcpy( endTest, ".dump" );
1011 >  strcpy( endTest, ".dump" );
1012        }
1013        else if( !strcmp( endTest, ".BASS" ) ){
1014 <        strcpy( endTest, ".dump" );
1014 >  strcpy( endTest, ".dump" );
1015        }
1016        else{
1017 <        endTest = &(info[k].sampleName[nameLength - 4]);
1018 <        if( !strcmp( endTest, ".bss" ) ){
1019 <          strcpy( endTest, ".dump" );
1020 <        }
1021 <        else if( !strcmp( endTest, ".mdl" ) ){
1022 <          strcpy( endTest, ".dump" );
1023 <        }
1024 <        else{
1025 <          strcat( info[k].sampleName, ".dump" );
1026 <        }
1017 >  endTest = &(info[k].sampleName[nameLength - 4]);
1018 >  if( !strcmp( endTest, ".bss" ) ){
1019 >    strcpy( endTest, ".dump" );
1020 >  }
1021 >  else if( !strcmp( endTest, ".mdl" ) ){
1022 >    strcpy( endTest, ".dump" );
1023 >  }
1024 >  else{
1025 >    strcat( info[k].sampleName, ".dump" );
1026 >  }
1027        }
1028        
1029        strcpy( info[k].statusName, inFileName );
1030        nameLength = strlen( info[k].statusName );
1031        endTest = &(info[k].statusName[nameLength - 5]);
1032        if( !strcmp( endTest, ".bass" ) ){
1033 <        strcpy( endTest, ".stat" );
1033 >  strcpy( endTest, ".stat" );
1034        }
1035        else if( !strcmp( endTest, ".BASS" ) ){
1036 <        strcpy( endTest, ".stat" );
1036 >  strcpy( endTest, ".stat" );
1037        }
1038        else{
1039 <        endTest = &(info[k].statusName[nameLength - 4]);
1040 <        if( !strcmp( endTest, ".bss" ) ){
1041 <          strcpy( endTest, ".stat" );
1042 <        }
1043 <        else if( !strcmp( endTest, ".mdl" ) ){
1044 <          strcpy( endTest, ".stat" );
1045 <        }
1046 <        else{
1047 <          strcat( info[k].statusName, ".stat" );
1048 <        }
1039 >  endTest = &(info[k].statusName[nameLength - 4]);
1040 >  if( !strcmp( endTest, ".bss" ) ){
1041 >    strcpy( endTest, ".stat" );
1042 >  }
1043 >  else if( !strcmp( endTest, ".mdl" ) ){
1044 >    strcpy( endTest, ".stat" );
1045 >  }
1046 >  else{
1047 >    strcat( info[k].statusName, ".stat" );
1048 >  }
1049        }
1050        
1051   #ifdef IS_MPI
# Line 1088 | Line 1112 | void SimSetup::createFF( void ){
1112  
1113    default:
1114      sprintf( painCave.errMsg,
1115 <             "SimSetup Error. Unrecognized force field in case statement.\n");
1115 >       "SimSetup Error. Unrecognized force field in case statement.\n");
1116      painCave.isFatal = 1;
1117      simError();
1118    }
# Line 1134 | Line 1158 | void SimSetup::compList( void ){
1158        
1159        currentStamp = stamps->extractMolStamp( id );
1160        if( currentStamp == NULL ){
1161 <        sprintf( painCave.errMsg,
1162 <                 "SimSetup error: Component \"%s\" was not found in the "
1163 <                 "list of declared molecules\n",
1164 <                 id );
1165 <        painCave.isFatal = 1;
1166 <        simError();
1161 >  sprintf( painCave.errMsg,
1162 >     "SimSetup error: Component \"%s\" was not found in the "
1163 >     "list of declared molecules\n",
1164 >     id );
1165 >  painCave.isFatal = 1;
1166 >  simError();
1167        }
1168        
1169        headStamp->add( currentStamp );
# Line 1218 | Line 1242 | void SimSetup::mpiMolDivide( void ){
1242      for( j=0; j<components_nmol[i]; j++ ){
1243        
1244        if( mol2proc[allMol] == worldRank ){
1245 <        
1246 <        local_atoms +=    comp_stamps[i]->getNAtoms();
1247 <        local_bonds +=    comp_stamps[i]->getNBonds();
1248 <        local_bends +=    comp_stamps[i]->getNBends();
1249 <        local_torsions += comp_stamps[i]->getNTorsions();
1250 <        localMol++;
1245 >  
1246 >  local_atoms +=    comp_stamps[i]->getNAtoms();
1247 >  local_bonds +=    comp_stamps[i]->getNBonds();
1248 >  local_bends +=    comp_stamps[i]->getNBends();
1249 >  local_torsions += comp_stamps[i]->getNTorsions();
1250 >  localMol++;
1251        }      
1252        for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1253          info[0].molMembershipArray[globalAtomIndex] = allMol;
# Line 1239 | Line 1263 | void SimSetup::mpiMolDivide( void ){
1263    
1264    if( local_atoms != info[0].n_atoms ){
1265      sprintf( painCave.errMsg,
1266 <             "SimSetup error: mpiSim's localAtom (%d) and SimSetup's"
1267 <             " localAtom (%d) are not equal.\n",
1268 <             info[0].n_atoms,
1269 <             local_atoms );
1266 >       "SimSetup error: mpiSim's localAtom (%d) and SimSetup's"
1267 >       " localAtom (%d) are not equal.\n",
1268 >       info[0].n_atoms,
1269 >       local_atoms );
1270      painCave.isFatal = 1;
1271      simError();
1272    }
# Line 1285 | Line 1309 | void SimSetup::makeSysArrays( void ){
1309      for(i=0; i<mpiSim->getTotNmol(); i++){
1310      
1311        if(mol2proc[i] == worldRank ){
1312 <        the_molecules[molIndex].setStampID( molCompType[i] );
1313 <        the_molecules[molIndex].setMyIndex( molIndex );
1314 <        the_molecules[molIndex].setGlobalIndex( i );
1315 <        molIndex++;
1312 >  the_molecules[molIndex].setStampID( molCompType[i] );
1313 >  the_molecules[molIndex].setMyIndex( molIndex );
1314 >  the_molecules[molIndex].setGlobalIndex( i );
1315 >  molIndex++;
1316        }
1317      }
1318      
# Line 1298 | Line 1322 | void SimSetup::makeSysArrays( void ){
1322      globalAtomIndex = 0;
1323      for(i=0; i<n_components; i++){
1324        for(j=0; j<components_nmol[i]; j++ ){
1325 <        the_molecules[molIndex].setStampID( i );
1326 <        the_molecules[molIndex].setMyIndex( molIndex );
1327 <        the_molecules[molIndex].setGlobalIndex( molIndex );
1328 <        for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1329 <          info[l].molMembershipArray[globalAtomIndex] = molIndex;
1330 <          globalAtomIndex++;
1331 <        }
1332 <        molIndex++;
1325 >  the_molecules[molIndex].setStampID( i );
1326 >  the_molecules[molIndex].setMyIndex( molIndex );
1327 >  the_molecules[molIndex].setGlobalIndex( molIndex );
1328 >  for (k = 0; k < comp_stamps[i]->getNAtoms(); k++) {
1329 >    info[l].molMembershipArray[globalAtomIndex] = molIndex;
1330 >    globalAtomIndex++;
1331 >  }
1332 >  molIndex++;
1333        }
1334      }
1335      
# Line 1318 | Line 1342 | void SimSetup::makeSysArrays( void ){
1342        Exclude::createArray(info[l].n_SRI);
1343        the_excludes = new Exclude*[info[l].n_SRI];
1344        for( int ex=0; ex<info[l].n_SRI; ex++){
1345 <        the_excludes[ex] = new Exclude(ex);
1345 >  the_excludes[ex] = new Exclude(ex);
1346        }
1347        info[l].globalExcludes = new int;
1348        info[l].n_exclude = info[l].n_SRI;
# Line 1361 | Line 1385 | void SimSetup::makeIntegrator( void ){
1385      switch( ensembleCase ){
1386        
1387      case NVE_ENS:
1388 <        if (globals->haveZconstraints()){
1389 <         setupZConstraint(info[k]);
1390 <           new ZConstraint<NVE<RealIntegrator> >( &(info[k]), the_ff );
1391 <        }
1388 >      if (globals->haveZconstraints()){
1389 >        setupZConstraint(info[k]);
1390 >        new ZConstraint<NVE<RealIntegrator> >( &(info[k]), the_ff );
1391 >     }
1392  
1393 <        else
1393 >     else
1394          new NVE<RealIntegrator>( &(info[k]), the_ff );
1395        break;
1396        
1397      case NVT_ENS:
1398 <        if (globals->haveZconstraints()){
1399 <         setupZConstraint(info[k]);
1400 <           myNVT = new ZConstraint<NVT<RealIntegrator> >( &(info[k]), the_ff );
1401 <        }
1402 <        else
1398 >      if (globals->haveZconstraints()){
1399 >        setupZConstraint(info[k]);
1400 >        myNVT = new ZConstraint<NVT<RealIntegrator> >( &(info[k]), the_ff );
1401 >      }
1402 >      else
1403          myNVT = new NVT<RealIntegrator>( &(info[k]), the_ff );
1404  
1405 <      myNVT->setTargetTemp(globals->getTargetTemp());
1405 >        myNVT->setTargetTemp(globals->getTargetTemp());
1406        
1407 <      if (globals->haveTauThermostat())
1408 <        myNVT->setTauThermostat(globals->getTauThermostat());
1407 >        if (globals->haveTauThermostat())
1408 >          myNVT->setTauThermostat(globals->getTauThermostat());
1409        
1410 <      else {
1411 <        sprintf( painCave.errMsg,
1412 <                 "SimSetup error: If you use the NVT\n"
1413 <                 "    ensemble, you must set tauThermostat.\n");
1414 <        painCave.isFatal = 1;
1415 <        simError();
1416 <      }
1417 <      break;
1410 >        else {
1411 >          sprintf( painCave.errMsg,
1412 >                    "SimSetup error: If you use the NVT\n"
1413 >                    "    ensemble, you must set tauThermostat.\n");
1414 >          painCave.isFatal = 1;
1415 >          simError();
1416 >        }
1417 >        break;
1418        
1419      case NPTi_ENS:
1420 <        if (globals->haveZconstraints()){
1421 <         setupZConstraint(info[k]);
1422 <           myNPTi = new ZConstraint<NPTi<RealIntegrator> >( &(info[k]), the_ff );
1423 <        }
1424 <        else
1420 >      if (globals->haveZconstraints()){
1421 >             setupZConstraint(info[k]);
1422 >         myNPTi = new ZConstraint<NPTi<RealIntegrator> >( &(info[k]), the_ff );
1423 >      }
1424 >      else
1425          myNPTi = new NPTi<RealIntegrator>( &(info[k]), the_ff );
1426  
1427 <        myNPTi->setTargetTemp( globals->getTargetTemp() );
1428 <      
1427 >      myNPTi->setTargetTemp( globals->getTargetTemp() );
1428 >          
1429        if (globals->haveTargetPressure())
1430 <        myNPTi->setTargetPressure(globals->getTargetPressure());
1430 >        myNPTi->setTargetPressure(globals->getTargetPressure());
1431        else {
1432 <        sprintf( painCave.errMsg,
1433 <                 "SimSetup error: If you use a constant pressure\n"
1434 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1435 <        painCave.isFatal = 1;
1436 <        simError();
1432 >         sprintf( painCave.errMsg,
1433 >                   "SimSetup error: If you use a constant pressure\n"
1434 >                   "    ensemble, you must set targetPressure in the BASS file.\n");
1435 >         painCave.isFatal = 1;
1436 >         simError();
1437        }
1438 <      
1438 >          
1439        if( globals->haveTauThermostat() )
1440 <        myNPTi->setTauThermostat( globals->getTauThermostat() );
1440 >        myNPTi->setTauThermostat( globals->getTauThermostat() );
1441        else{
1442 <        sprintf( painCave.errMsg,
1443 <                 "SimSetup error: If you use an NPT\n"
1444 <                 "    ensemble, you must set tauThermostat.\n");
1445 <        painCave.isFatal = 1;
1446 <        simError();
1442 >         sprintf( painCave.errMsg,
1443 >                   "SimSetup error: If you use an NPT\n"
1444 >                  "    ensemble, you must set tauThermostat.\n");
1445 >         painCave.isFatal = 1;
1446 >         simError();
1447        }
1448 <      
1448 >          
1449        if( globals->haveTauBarostat() )
1450 <        myNPTi->setTauBarostat( globals->getTauBarostat() );
1450 >        myNPTi->setTauBarostat( globals->getTauBarostat() );
1451        else{
1452 <        sprintf( painCave.errMsg,
1453 <                 "SimSetup error: If you use an NPT\n"
1454 <                 "    ensemble, you must set tauBarostat.\n");
1455 <        painCave.isFatal = 1;
1456 <        simError();
1457 <      }
1458 <      break;
1452 >        sprintf( painCave.errMsg,
1453 >                  "SimSetup error: If you use an NPT\n"
1454 >                  "    ensemble, you must set tauBarostat.\n");
1455 >        painCave.isFatal = 1;
1456 >        simError();
1457 >       }
1458 >       break;
1459        
1460      case NPTf_ENS:
1461 <        if (globals->haveZconstraints()){
1462 <         setupZConstraint(info[k]);
1463 <           myNPTf = new ZConstraint<NPTf<RealIntegrator> >( &(info[k]), the_ff );
1464 <        }
1465 <        else
1461 >      if (globals->haveZconstraints()){
1462 >        setupZConstraint(info[k]);
1463 >        myNPTf = new ZConstraint<NPTf<RealIntegrator> >( &(info[k]), the_ff );
1464 >      }
1465 >      else
1466          myNPTf = new NPTf<RealIntegrator>( &(info[k]), the_ff );
1467  
1468        myNPTf->setTargetTemp( globals->getTargetTemp());
1469 <      
1469 >          
1470        if (globals->haveTargetPressure())
1471 <        myNPTf->setTargetPressure(globals->getTargetPressure());
1471 >        myNPTf->setTargetPressure(globals->getTargetPressure());
1472        else {
1473 <        sprintf( painCave.errMsg,
1474 <                 "SimSetup error: If you use a constant pressure\n"
1475 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1476 <        painCave.isFatal = 1;
1477 <        simError();
1473 >        sprintf( painCave.errMsg,
1474 >                  "SimSetup error: If you use a constant pressure\n"
1475 >                  "    ensemble, you must set targetPressure in the BASS file.\n");
1476 >        painCave.isFatal = 1;
1477 >        simError();
1478        }    
1479 <      
1479 >          
1480        if( globals->haveTauThermostat() )
1481 <        myNPTf->setTauThermostat( globals->getTauThermostat() );
1481 >        myNPTf->setTauThermostat( globals->getTauThermostat() );
1482        else{
1483 <        sprintf( painCave.errMsg,
1484 <                 "SimSetup error: If you use an NPT\n"
1485 <               "    ensemble, you must set tauThermostat.\n");
1486 <        painCave.isFatal = 1;
1487 <        simError();
1483 >        sprintf( painCave.errMsg,
1484 >         "SimSetup error: If you use an NPT\n"
1485 >                   "    ensemble, you must set tauThermostat.\n");
1486 >        painCave.isFatal = 1;
1487 >        simError();
1488        }
1489 <      
1489 >          
1490        if( globals->haveTauBarostat() )
1491 <        myNPTf->setTauBarostat( globals->getTauBarostat() );
1491 >        myNPTf->setTauBarostat( globals->getTauBarostat() );
1492        else{
1493 <        sprintf( painCave.errMsg,
1494 <                 "SimSetup error: If you use an NPT\n"
1495 <                 "    ensemble, you must set tauBarostat.\n");
1496 <        painCave.isFatal = 1;
1497 <        simError();
1493 >        sprintf( painCave.errMsg,
1494 >                  "SimSetup error: If you use an NPT\n"
1495 >                  "    ensemble, you must set tauBarostat.\n");
1496 >        painCave.isFatal = 1;
1497 >        simError();
1498        }
1499        break;
1500        
1501      case NPTim_ENS:
1502 <        if (globals->haveZconstraints()){
1503 <         setupZConstraint(info[k]);
1504 <           myNPTim = new ZConstraint<NPTim<RealIntegrator> >( &(info[k]), the_ff );
1505 <        }
1506 <        else
1502 >      if (globals->haveZconstraints()){
1503 >        setupZConstraint(info[k]);
1504 >        myNPTim = new ZConstraint<NPTim<RealIntegrator> >( &(info[k]), the_ff );
1505 >      }
1506 >      else
1507          myNPTim = new NPTim<RealIntegrator>( &(info[k]), the_ff );
1508  
1509 <        myNPTim->setTargetTemp( globals->getTargetTemp());
1510 <      
1509 >        myNPTim->setTargetTemp( globals->getTargetTemp());
1510 >          
1511        if (globals->haveTargetPressure())
1512 <        myNPTim->setTargetPressure(globals->getTargetPressure());
1512 >        myNPTim->setTargetPressure(globals->getTargetPressure());
1513        else {
1514 <        sprintf( painCave.errMsg,
1515 <                 "SimSetup error: If you use a constant pressure\n"
1516 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1517 <        painCave.isFatal = 1;
1518 <        simError();
1514 >        sprintf( painCave.errMsg,
1515 >                  "SimSetup error: If you use a constant pressure\n"
1516 >                  "    ensemble, you must set targetPressure in the BASS file.\n");
1517 >        painCave.isFatal = 1;
1518 >        simError();
1519        }
1520 <      
1520 >          
1521        if( globals->haveTauThermostat() )
1522 <        myNPTim->setTauThermostat( globals->getTauThermostat() );
1522 >        myNPTim->setTauThermostat( globals->getTauThermostat() );
1523        else{
1524 <        sprintf( painCave.errMsg,
1525 <                 "SimSetup error: If you use an NPT\n"
1526 <                 "    ensemble, you must set tauThermostat.\n");
1527 <        painCave.isFatal = 1;
1528 <        simError();
1524 >        sprintf( painCave.errMsg,
1525 >                  "SimSetup error: If you use an NPT\n"
1526 >                  "    ensemble, you must set tauThermostat.\n");
1527 >        painCave.isFatal = 1;
1528 >        simError();
1529        }
1530 <      
1530 >          
1531        if( globals->haveTauBarostat() )
1532 <        myNPTim->setTauBarostat( globals->getTauBarostat() );
1532 >        myNPTim->setTauBarostat( globals->getTauBarostat() );
1533        else{
1534 <      sprintf( painCave.errMsg,
1535 <               "SimSetup error: If you use an NPT\n"
1536 <               "    ensemble, you must set tauBarostat.\n");
1537 <      painCave.isFatal = 1;
1538 <      simError();
1534 >        sprintf( painCave.errMsg,
1535 >                   "SimSetup error: If you use an NPT\n"
1536 >                   "    ensemble, you must set tauBarostat.\n");
1537 >        painCave.isFatal = 1;
1538 >        simError();
1539        }
1540        break;
1541        
1542      case NPTfm_ENS:
1543 <        if (globals->haveZconstraints()){
1544 <         setupZConstraint(info[k]);
1545 <           myNPTfm = new ZConstraint<NPTfm<RealIntegrator> >( &(info[k]), the_ff );
1546 <        }
1547 <        else
1543 >      if (globals->haveZconstraints()){
1544 >        setupZConstraint(info[k]);
1545 >        myNPTfm = new ZConstraint<NPTfm<RealIntegrator> >( &(info[k]), the_ff );
1546 >      }
1547 >      else
1548          myNPTfm = new NPTfm<RealIntegrator>( &(info[k]), the_ff );
1549  
1550 <        myNPTfm->setTargetTemp( globals->getTargetTemp());
1551 <      
1550 >      myNPTfm->setTargetTemp( globals->getTargetTemp());
1551 >
1552        if (globals->haveTargetPressure())
1553 <        myNPTfm->setTargetPressure(globals->getTargetPressure());
1553 >        myNPTfm->setTargetPressure(globals->getTargetPressure());
1554        else {
1555 <        sprintf( painCave.errMsg,
1556 <                 "SimSetup error: If you use a constant pressure\n"
1557 <                 "    ensemble, you must set targetPressure in the BASS file.\n");
1558 <        painCave.isFatal = 1;
1559 <        simError();
1555 >        sprintf( painCave.errMsg,
1556 >                  "SimSetup error: If you use a constant pressure\n"
1557 >                  "    ensemble, you must set targetPressure in the BASS file.\n");
1558 >        painCave.isFatal = 1;
1559 >        simError();
1560        }
1561 <      
1561 >
1562        if( globals->haveTauThermostat() )
1563 <        myNPTfm->setTauThermostat( globals->getTauThermostat() );
1563 >        myNPTfm->setTauThermostat( globals->getTauThermostat() );
1564        else{
1565 <        sprintf( painCave.errMsg,
1566 <                 "SimSetup error: If you use an NPT\n"
1567 <                 "    ensemble, you must set tauThermostat.\n");
1568 <        painCave.isFatal = 1;
1569 <        simError();
1565 >        sprintf( painCave.errMsg,
1566 >                  "SimSetup error: If you use an NPT\n"
1567 >                  "    ensemble, you must set tauThermostat.\n");
1568 >        painCave.isFatal = 1;
1569 >        simError();
1570        }
1571 <      
1571 >
1572        if( globals->haveTauBarostat() )
1573 <        myNPTfm->setTauBarostat( globals->getTauBarostat() );
1573 >        myNPTfm->setTauBarostat( globals->getTauBarostat() );
1574        else{
1575 <        sprintf( painCave.errMsg,
1576 <                 "SimSetup error: If you use an NPT\n"
1577 <                 "    ensemble, you must set tauBarostat.\n");
1578 <        painCave.isFatal = 1;
1579 <        simError();
1575 >        sprintf( painCave.errMsg,
1576 >                  "SimSetup error: If you use an NPT\n"
1577 >                  "    ensemble, you must set tauBarostat.\n");
1578 >        painCave.isFatal = 1;
1579 >        simError();
1580        }
1581        break;
1582        
1583      default:
1584        sprintf( painCave.errMsg,
1585 <               "SimSetup Error. Unrecognized ensemble in case statement.\n");
1585 >                 "SimSetup Error. Unrecognized ensemble in case statement.\n");
1586        painCave.isFatal = 1;
1587        simError();
1588      }
# Line 1577 | Line 1601 | void SimSetup::initFortran( void ){
1601    }
1602    else{
1603      sprintf( painCave.errMsg,
1604 <             "SimSetup Error: unknown mixing rule -> \"%s\"\n",
1605 <             info[0].mixingRule );
1604 >       "SimSetup Error: unknown mixing rule -> \"%s\"\n",
1605 >       info[0].mixingRule );
1606      painCave.isFatal = 1;
1607      simError();
1608    }
# Line 1586 | Line 1610 | void SimSetup::initFortran( void ){
1610  
1611   #ifdef IS_MPI
1612    strcpy( checkPointMsg,
1613 <          "Successfully intialized the mixingRule for Fortran." );
1613 >    "Successfully intialized the mixingRule for Fortran." );
1614    MPIcheckPoint();
1615   #endif // is_mpi
1616  
# Line 1594 | Line 1618 | void SimSetup::setupZConstraint(SimInfo& theInfo)
1618  
1619   void SimSetup::setupZConstraint(SimInfo& theInfo)
1620   {
1621 <    int nZConstraints;
1622 <    ZconStamp** zconStamp;
1599 <        
1600 <    if(globals->haveZconstraintTime()){  
1601 <      
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 <    }
1621 >  int nZConstraints;
1622 >  ZconStamp** zconStamp;
1623  
1624 <    //
1625 <    nZConstraints = globals->getNzConstraints();
1626 <    zconStamp = globals->getZconStamp();
1627 <    ZConsParaItem tempParaItem;
1624 >  if(globals->haveZconstraintTime()){  
1625 >    
1626 >    //add sample time of z-constraint  into SimInfo's property list                    
1627 >    DoubleData* zconsTimeProp = new DoubleData();
1628 >    zconsTimeProp->setID(ZCONSTIME_ID);
1629 >    zconsTimeProp->setData(globals->getZconsTime());
1630 >    theInfo.addProperty(zconsTimeProp);
1631 >  }
1632 >  else{
1633 >    sprintf( painCave.errMsg,
1634 >       "ZConstraint error: If you use an ZConstraint\n"
1635 >       " , you must set sample time.\n");
1636 >    painCave.isFatal = 1;
1637 >    simError();      
1638 >  }
1639  
1640 <    ZConsParaData* zconsParaData = new ZConsParaData();
1641 <    zconsParaData->setID(ZCONSPARADATA_ID);
1642 <  
1643 <    for(int i = 0; i < nZConstraints; i++){
1640 >  //push zconsTol into siminfo, if user does not specify
1641 >  //value for zconsTol, a default value will be used
1642 >  DoubleData* zconsTol = new DoubleData();
1643 >  zconsTol->setID(ZCONSTOL_ID);
1644 >  if(globals->haveZconsTol()){
1645 >    zconsTol->setData(globals->getZconsTol());
1646 >  }
1647 >  else{
1648 >  double defaultZConsTol = 0.01;
1649 >    sprintf( painCave.errMsg,
1650 >       "ZConstraint Waring: Tolerance for z-constraint methodl is not specified\n"
1651 >       " , default value %f is used.\n", defaultZConsTol);
1652 >    painCave.isFatal = 0;
1653 >    simError();      
1654 >
1655 >    zconsTol->setData(defaultZConsTol);
1656 >  }
1657 >  theInfo.addProperty(zconsTol);
1658 >
1659 >  //set Force Substraction Policy
1660 >  StringData* zconsForcePolicy =  new StringData();
1661 >  zconsForcePolicy->setID(ZCONSFORCEPOLICY_ID);
1662 >  
1663 >  if(globals->haveZconsForcePolicy()){
1664 >    zconsForcePolicy->setData(globals->getZconsForcePolicy());
1665 >  }  
1666 >  else{
1667 >     sprintf( painCave.errMsg,
1668 >             "ZConstraint Warning: User does not set force substraction policy, "
1669 >             "average force substraction policy is used\n");
1670 >     painCave.isFatal = 0;
1671 >     simError();
1672 >     zconsForcePolicy->setData("BYNUMBER");
1673 >  }
1674 >
1675 > theInfo.addProperty(zconsForcePolicy);
1676 >
1677 >  //Determine the name of ouput file and add it into SimInfo's property list
1678 >  //Be careful, do not use inFileName, since it is a pointer which
1679 >  //point to a string at master node, and slave nodes do not contain that string
1680 >  
1681 >  string zconsOutput(theInfo.finalName);
1682 >  
1683 >  zconsOutput = zconsOutput.substr(0, zconsOutput.rfind(".")) + ".fz";
1684 >  
1685 >  StringData* zconsFilename = new StringData();
1686 >  zconsFilename->setID(ZCONSFILENAME_ID);
1687 >  zconsFilename->setData(zconsOutput);
1688 >  
1689 >  theInfo.addProperty(zconsFilename);
1690 >  
1691 >  //setup index, pos and other parameters of z-constraint molecules
1692 >  nZConstraints = globals->getNzConstraints();
1693 >  theInfo.nZconstraints = nZConstraints;
1694 >
1695 >  zconStamp = globals->getZconStamp();
1696 >  ZConsParaItem tempParaItem;
1697 >
1698 >  ZConsParaData* zconsParaData = new ZConsParaData();
1699 >  zconsParaData->setID(ZCONSPARADATA_ID);
1700 >
1701 >  for(int i = 0; i < nZConstraints; i++){
1702      tempParaItem.havingZPos = zconStamp[i]->haveZpos();
1703      tempParaItem.zPos = zconStamp[i]->getZpos();
1704      tempParaItem.zconsIndex = zconStamp[i]->getMolIndex();
1705      tempParaItem.kRatio = zconStamp[i]->getKratio();
1706  
1707      zconsParaData->addItem(tempParaItem);
1708 <    }
1708 >  }
1709  
1710 <    //sort the parameters by index of molecules
1711 <    zconsParaData->sortByIndex();
1712 <        
1713 <    //push data into siminfo, therefore, we can retrieve later
1714 <    theInfo.addProperty(zconsParaData);
1715 <
1639 <    //push zconsTol into siminfo, if user does not specify
1640 <    //value for zconsTol, a default value will be used
1641 <    DoubleData* zconsTol = new DoubleData();
1642 <    zconsTol->setID(ZCONSTOL_ID);
1643 <    if(globals->haveZconsTol()){
1644 <      zconsTol->setData(globals->getZconsTol());
1645 <    }
1646 <         else{
1647 <                double defaultZConsTol = 1E-6;
1648 <      sprintf( painCave.errMsg,
1649 <               "ZConstraint Waring: Tolerance for z-constraint methodl is not specified\n"
1650 <               " , default value %f is used.\n", defaultZConsTol);
1651 <      painCave.isFatal = 0;
1652 <      simError();      
1653 <
1654 <      zconsTol->setData(defaultZConsTol);
1655 <         }
1656 <    theInfo.addProperty(zconsTol);
1657 <        
1658 <    //Determine the name of ouput file and add it into SimInfo's property list
1659 <    //Be careful, do not use inFileName, since it is a pointer which
1660 <    //point to a string at master node, and slave nodes do not contain that string
1661 <    
1662 <    string zconsOutput(theInfo.finalName);
1663 <    
1664 <    zconsOutput = zconsOutput.substr(0, zconsOutput.rfind(".")) + ".fz";
1665 <    
1666 <    StringData* zconsFilename = new StringData();
1667 <    zconsFilename->setID(ZCONSFILENAME_ID);
1668 <    zconsFilename->setData(zconsOutput);
1669 <    
1670 <    theInfo.addProperty(zconsFilename);      
1710 >  //sort the parameters by index of molecules
1711 >  zconsParaData->sortByIndex();
1712 >  
1713 >  //push data into siminfo, therefore, we can retrieve later
1714 >  theInfo.addProperty(zconsParaData);
1715 >      
1716   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines