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

Comparing trunk/mdtools/interface_implementation/SimSetup.cpp (file contents):
Revision 176 by mmeineke, Thu Nov 14 22:00:44 2002 UTC vs.
Revision 198 by mmeineke, Fri Dec 6 21:20:42 2002 UTC

# Line 119 | Line 119 | void SimSetup::createSim( void ){
119  
120        if( !the_components[i]->haveNMol() ){
121          // we have a problem
122 <        std::cerr << "SimSetup Error. No global NMol or component NMol"
123 <                  << " given. Cannot calculate the number of atoms.\n";
124 <        exit( 8 );
122 >        sprintf( painCave.errMsg,
123 >                 "SimSetup Error. No global NMol or component NMol"
124 >                 " given. Cannot calculate the number of atoms.\n" );
125 >        painCave.isFatal = 1;
126 >        simError();
127        }
128  
129        tot_nmol += the_components[i]->getNMol();
# Line 129 | Line 131 | void SimSetup::createSim( void ){
131      }
132    }
133    else{
134 <    std::cerr << "NOT A SUPPORTED FEATURE\n";
135 <
136 < //     tot_nmol = the_globals->getNMol();
137 <
138 < //     //we have the total number of molecules, now we check for molfractions
139 < //     for( i=0; i<n_components; i++ ){
140 <
141 < //       if( !the_components[i]->haveMolFraction() ){
142 <
143 < //      if( !the_components[i]->haveNMol() ){
144 < //        //we have a problem
145 < //        std::cerr << "SimSetup error. Neither molFraction nor "
146 < //                  << " nMol was given in component
147 <
134 >    sprintf( painCave.errMsg,
135 >             "SimSetup error.\n"
136 >             "\tSorry, the ability to specify total"
137 >             " nMols and then give molfractions in the components\n"
138 >             "\tis not currently supported."
139 >             " Please give nMol in the components.\n" );
140 >    painCave.isFatal = 1;
141 >    simError();
142 >    
143 >    
144 >    //     tot_nmol = the_globals->getNMol();
145 >    
146 >    //   //we have the total number of molecules, now we check for molfractions
147 >    //     for( i=0; i<n_components; i++ ){
148 >    
149 >    //       if( !the_components[i]->haveMolFraction() ){
150 >    
151 >    //  if( !the_components[i]->haveNMol() ){
152 >    //    //we have a problem
153 >    //    std::cerr << "SimSetup error. Neither molFraction nor "
154 >    //              << " nMol was given in component
155 >    
156    }
157  
158 + #ifdef IS_MPI
159 +  strcpy( checkPointMsg, "Have the number of components" );
160 +  MPIcheckPoint();
161 + #endif // is_mpi
162 +
163    // make an array of molecule stamps that match the components used.
164 +  // also extract the used stamps out into a separate linked list
165  
166 +  simnfo->nComponents = n_components;
167 +  simnfo->componentsNmol = components_nmol;
168 +  simnfo->compStamps = comp_stamps;
169 +  simnfo->headStamp = new LinkedMolStamp();
170 +  
171 +  char* id;
172 +  LinkedMolStamp* headStamp = simnfo->headStamp;
173 +  LinkedMolStamp* currentStamp = NULL;
174    for( i=0; i<n_components; i++ ){
175  
176 <    comp_stamps[i] =
177 <      the_stamps->getMolecule( the_components[i]->getType() );
176 >    id = the_components[i]->getType();
177 >    comp_stamps[i] = NULL;
178 >    
179 >    // check to make sure the component isn't already in the list
180 >
181 >    comp_stamps[i] = headStamp->match( id );
182 >    if( comp_stamps[i] == NULL ){
183 >      
184 >      // extract the component from the list;
185 >      
186 >      currentStamp = the_stamps->extractMolStamp( id );
187 >      if( currentStamp == NULL ){
188 >        sprintf( painCave.errMsg,
189 >                 "SimSetup error: Component \"%s\" was not found in the "
190 >                 "list of declared molecules\n"
191 >                 id );
192 >        painCave.isFatal = 1;
193 >        simError();
194 >      }
195 >      
196 >      headStamp->add( currentStamp );
197 >      comp_stamps[i] = headStamp->match( id );
198 >    }
199    }
200  
201 + #ifdef IS_MPI
202 +  strcpy( checkPointMsg, "Component stamps successfully extracted\n" );
203 +  MPIcheckPoint();
204 + #endif // is_mpi
205 +  
206  
207  
208 +
209    // caclulate the number of atoms, bonds, bends and torsions
210  
211    tot_atoms = 0;
# Line 176 | Line 227 | void SimSetup::createSim( void ){
227    simnfo->n_bends = tot_bends;
228    simnfo->n_torsions = tot_torsions;
229    simnfo->n_SRI = tot_SRI;
230 +  simnfo->n_mol = tot_nmol;
231  
232 +  
233 + #ifdef IS_MPI
234 +
235 +  // divide the molecules among processors here.
236 +  
237 +  new mpiSimulation( simnfo );
238 +  
239 +  simnfo->mpiSim->divideLabor( n_components, comp_stamps, components_nmol );
240 +
241 + #endif // is_mpi
242 +  
243 +
244    // create the atom and short range interaction arrays
245  
246 <  the_atoms = new Atom*[tot_atoms];
247 <  Atom::createArrays(tot_atoms);
248 <  the_molecules = new Molecule[tot_nmol];
246 >  Atom::createArrays(simnfo->n_atoms);
247 >  the_atoms = new Atom*[simnfo->n_atoms];
248 >  the_molecules = new Molecule[simnfo->n_mol];
249  
250  
251 <  if( tot_SRI ){
252 <    the_sris = new SRI*[tot_SRI];
253 <    the_excludes = new ex_pair[tot_SRI];
251 >  if( simnfo->n_SRI ){
252 >    the_sris = new SRI*[simnfo->n_SRI];
253 >    the_excludes = new ex_pair[simnfo->n_SRI];
254    }
255  
256    // set the arrays into the SimInfo object
# Line 215 | Line 279 | void SimSetup::createSim( void ){
279      makeTorsions();
280    }
281  
218  //  makeMolecules();
282  
283    // get some of the tricky things that may still be in the globals
284  
285    if( simnfo->n_dipoles ){
286  
287      if( !the_globals->haveRRF() ){
288 <      std::cerr << "SimSetup Error, system has dipoles, but no rRF was set.\n";
289 <      exit(8);
288 >      sprintf( painCave.errMsg,
289 >               "SimSetup Error, system has dipoles, but no rRF was set.\n");
290 >      painCave.isFatal = 1;
291 >      simError();
292      }
293      if( !the_globals->haveDielectric() ){
294 <      std::cerr << "SimSetup Error, system has dipoles, but no"
295 <                << " dielectric was set.\n";
296 <      exit(8);
294 >      sprintf( painCave.errMsg,
295 >               "SimSetup Error, system has dipoles, but no"
296 >               " dielectric was set.\n" );
297 >      painCave.isFatal = 1;
298 >      simError();
299      }
300  
301      simnfo->rRF        = the_globals->getRRF();
302      simnfo->dielectric = the_globals->getDielectric();
303    }
304  
305 + #ifdef IS_MPI
306 +  strcpy( checkPointMsg, "rRf and dielectric check out" );
307 +  MPIcheckPoint();
308 + #endif // is_mpi
309 +  
310    if( the_globals->haveBox() ){
311      simnfo->box_x = the_globals->getBox();
312      simnfo->box_y = the_globals->getBox();
# Line 250 | Line 322 | void SimSetup::createSim( void ){
322    }
323    else{
324      if( !the_globals->haveBoxX() ){
325 <      std::cerr << "SimSetup error, no periodic BoxX size given.\n";
326 <      exit(8);
325 >      sprintf( painCave.errMsg,
326 >               "SimSetup error, no periodic BoxX size given.\n" );
327 >      painCave.isFatal = 1;
328 >      simError();
329      }
330      simnfo->box_x = the_globals->getBoxX();
331  
332      if( !the_globals->haveBoxY() ){
333 <      std::cerr << "SimSetup error, no periodic BoxY size given.\n";
334 <      exit(8);
333 >      sprintf( painCave.errMsg,
334 >               "SimSetup error, no periodic BoxY size given.\n" );
335 >      painCave.isFatal = 1;
336 >      simError();
337      }
338      simnfo->box_y = the_globals->getBoxY();
339  
340      if( !the_globals->haveBoxZ() ){
341 <      std::cerr << "SimSetup error, no periodic BoxZ size given.\n";
342 <      exit(8);
341 >      sprintf( painCave.errMsg,
342 >               "SimSetup error, no periodic BoxZ size given.\n" );
343 >      painCave.isFatal = 1;
344 >      simError();
345      }
346      simnfo->box_z = the_globals->getBoxZ();
347    }
348  
349 + #ifdef IS_MPI
350 +  strcpy( checkPointMsg, "Box size set up" );
351 +  MPIcheckPoint();
352 + #endif // is_mpi
353  
354 +
355 +
356   //   if( the_globals->haveInitialConfig() ){
357   //        InitializeFromFile* fileInit;
358   //     fileInit = new InitializeFromFile( the_globals->getInitialConfig() );
# Line 279 | Line 363 | void SimSetup::createSim( void ){
363   //   }
364   //   else{
365  
366 <    initFromBass();
366 > #ifdef IS_MPI
367  
368 +  // no init from bass
369 +  
370 +  sprintf( painCave.errMsg,
371 +           "Cannot intialize a parallel simulation without an initial configuration file.\n" );
372 +  painCave.isFatal;
373 +  simError();
374 +  
375 + #else
376  
377 < //   }
377 >  initFromBass();
378  
379 < //   if( the_globals->haveFinalConfig() ){
380 < //     strcpy( simnfo->finalName, the_globals->getFinalConfig() );
381 < //   }
382 < //   else{
383 < //     strcpy( simnfo->finalName, inFileName );
384 < //     char* endTest;
293 < //     int nameLength = strlen( simnfo->finalName );
294 < //     endTest = &(simnfo->finalName[nameLength - 5]);
295 < //     if( !strcmp( endTest, ".bass" ) ){
296 < //       strcpy( endTest, ".eor" );
297 < //     }
298 < //     else if( !strcmp( endTest, ".BASS" ) ){
299 < //       strcpy( endTest, ".eor" );
300 < //     }
301 < //     else{
302 < //       endTest = &(simnfo->finalName[nameLength - 4]);
303 < //       if( !strcmp( endTest, ".bss" ) ){
304 < //      strcpy( endTest, ".eor" );
305 < //       }
306 < //       else if( !strcmp( endTest, ".mdl" ) ){
307 < //      strcpy( endTest, ".eor" );
308 < //       }
309 < //       else{
310 < //      strcat( simnfo->finalName, ".eor" );
311 < //       }
312 < //     }
313 < //   }
379 > #endif // is_mpi
380 >
381 > #ifdef IS_MPI
382 >  strcpy( checkPointMsg, "Successfully read in the initial configuration" );
383 >  MPIcheckPoint();
384 > #endif // is_mpi
385  
315 //   // make the sample and status out names
386  
387 < //   strcpy( simnfo->sampleName, inFileName );
388 < //   char* endTest;
389 < //   int nameLength = strlen( simnfo->sampleName );
390 < //   endTest = &(simnfo->sampleName[nameLength - 5]);
391 < //   if( !strcmp( endTest, ".bass" ) ){
392 < //     strcpy( endTest, ".dump" );
393 < //   }
394 < //   else if( !strcmp( endTest, ".BASS" ) ){
395 < //     strcpy( endTest, ".dump" );
396 < //   }
397 < //   else{
398 < //     endTest = &(simnfo->sampleName[nameLength - 4]);
399 < //     if( !strcmp( endTest, ".bss" ) ){
400 < //       strcpy( endTest, ".dump" );
401 < //     }
402 < //     else if( !strcmp( endTest, ".mdl" ) ){
403 < //       strcpy( endTest, ".dump" );
404 < //     }
405 < //     else{
406 < //       strcat( simnfo->sampleName, ".dump" );
407 < //     }
408 < //   }
409 <
410 < //   strcpy( simnfo->statusName, inFileName );
411 < //   nameLength = strlen( simnfo->statusName );
412 < //   endTest = &(simnfo->statusName[nameLength - 5]);
413 < //   if( !strcmp( endTest, ".bass" ) ){
414 < //     strcpy( endTest, ".stat" );
415 < //   }
416 < //   else if( !strcmp( endTest, ".BASS" ) ){
417 < //     strcpy( endTest, ".stat" );
418 < //   }
419 < //   else{
420 < //     endTest = &(simnfo->statusName[nameLength - 4]);
421 < //     if( !strcmp( endTest, ".bss" ) ){
422 < //       strcpy( endTest, ".stat" );
423 < //     }
424 < //     else if( !strcmp( endTest, ".mdl" ) ){
425 < //       strcpy( endTest, ".stat" );
426 < //     }
427 < //     else{
428 < //       strcat( simnfo->statusName, ".stat" );
429 < //     }
430 < //   }
431 <
432 <
387 >  
388 >
389 >  
390 >  //   }
391 >  
392 > #ifdef IS_MPI
393 >  if( worldRank == 0 ){
394 > #endif // is_mpi
395 >    
396 >    if( the_globals->haveFinalConfig() ){
397 >      strcpy( simnfo->finalName, the_globals->getFinalConfig() );
398 >    }
399 >    else{
400 >      strcpy( simnfo->finalName, inFileName );
401 >      char* endTest;
402 >      int nameLength = strlen( simnfo->finalName );
403 >      endTest = &(simnfo->finalName[nameLength - 5]);
404 >      if( !strcmp( endTest, ".bass" ) ){
405 >        strcpy( endTest, ".eor" );
406 >      }
407 >      else if( !strcmp( endTest, ".BASS" ) ){
408 >        strcpy( endTest, ".eor" );
409 >      }
410 >      else{
411 >        endTest = &(simnfo->finalName[nameLength - 4]);
412 >        if( !strcmp( endTest, ".bss" ) ){
413 >          strcpy( endTest, ".eor" );
414 >        }
415 >        else if( !strcmp( endTest, ".mdl" ) ){
416 >          strcpy( endTest, ".eor" );
417 >        }
418 >        else{
419 >          strcat( simnfo->finalName, ".eor" );
420 >        }
421 >      }
422 >    }
423 >    
424 >    // make the sample and status out names
425 >    
426 >    strcpy( simnfo->sampleName, inFileName );
427 >    char* endTest;
428 >    int nameLength = strlen( simnfo->sampleName );
429 >    endTest = &(simnfo->sampleName[nameLength - 5]);
430 >    if( !strcmp( endTest, ".bass" ) ){
431 >      strcpy( endTest, ".dump" );
432 >    }
433 >    else if( !strcmp( endTest, ".BASS" ) ){
434 >      strcpy( endTest, ".dump" );
435 >    }
436 >    else{
437 >      endTest = &(simnfo->sampleName[nameLength - 4]);
438 >      if( !strcmp( endTest, ".bss" ) ){
439 >        strcpy( endTest, ".dump" );
440 >      }
441 >      else if( !strcmp( endTest, ".mdl" ) ){
442 >        strcpy( endTest, ".dump" );
443 >      }
444 >      else{
445 >        strcat( simnfo->sampleName, ".dump" );
446 >      }
447 >    }
448 >    
449 >    strcpy( simnfo->statusName, inFileName );
450 >    nameLength = strlen( simnfo->statusName );
451 >    endTest = &(simnfo->statusName[nameLength - 5]);
452 >    if( !strcmp( endTest, ".bass" ) ){
453 >      strcpy( endTest, ".stat" );
454 >    }
455 >    else if( !strcmp( endTest, ".BASS" ) ){
456 >      strcpy( endTest, ".stat" );
457 >    }
458 >    else{
459 >      endTest = &(simnfo->statusName[nameLength - 4]);
460 >      if( !strcmp( endTest, ".bss" ) ){
461 >        strcpy( endTest, ".stat" );
462 >      }
463 >      else if( !strcmp( endTest, ".mdl" ) ){
464 >        strcpy( endTest, ".stat" );
465 >      }
466 >      else{
467 >        strcat( simnfo->statusName, ".stat" );
468 >      }
469 >    }
470 >    
471 > #ifdef IS_MPI
472 >  }
473 > #endif // is_mpi
474 >  
475    // set the status, sample, and themal kick times
476 <
476 >  
477    if( the_globals->haveSampleTime() ){
478      simnfo->sampleTime = the_globals->getSampleTime();
479      simnfo->statusTime = simnfo->sampleTime;
# Line 584 | Line 696 | void SimSetup::initFromBass( void ){
696      n_per_extra = (int)ceil( temp1 );
697  
698      if( n_per_extra > 4){
699 <      std::cerr << "THere has been an error in constructing the non-complete lattice.\n";
700 <      exit(8);
699 >      sprintf( painCave.errMsg,
700 >               "SimSetup error. There has been an error in constructing"
701 >               " the non-complete lattice.\n" );
702 >      painCave.isFatal = 1;
703 >      simError();
704      }
705    }
706    else{
# Line 690 | Line 805 | void SimSetup::makeElement( double x, double y, double
805  
806      current_atom = comp_stamps[current_comp]->getAtom( k );
807      if( !current_atom->havePosition() ){
808 <      std::cerr << "Component " << comp_stamps[current_comp]->getID()
809 <                << ", atom " << current_atom->getType()
810 <                << " does not have a position specified.\n"
811 <                << "The initialization routine is unable to give a start"
812 <                << " position.\n";
813 <      exit(8);
808 >      sprintf( painCave.errMsg,
809 >               "SimSetup:initFromBass error.\n"
810 >               "\tComponent %s, atom %s does not have a position specified.\n"
811 >               "\tThe initialization routine is unable to give a start"
812 >               " position.\n",
813 >               comp_stamps[current_comp]->getID(),
814 >               current_atom->getType() );
815 >      painCave.isFatal = 1;
816 >      simError();
817      }
818  
819      the_atoms[current_atom_ndx]->setX( x + current_atom->getPosX() );

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines