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

Comparing trunk/OOPSE/utils/sysBuild.cpp (file contents):
Revision 498 by mmeineke, Mon Apr 14 21:22:54 2003 UTC vs.
Revision 589 by chuckv, Thu Jul 10 19:53:50 2003 UTC

# Line 1 | Line 1
1   #include <cstdlib>
2   #include <cstdio>
3   #include <cstring>
4 + #include <cmath>
5  
6   #include "simError.h"
7 + #include "parse_me.h"
8 + #include "MakeStamps.hpp"
9 + #include "Globals.hpp"
10 + #include "SimInfo.hpp"
11  
12 + #include "sysBuild.hpp"
13   #include "bilayerSys.hpp"
14 + //#include "nanoBuilder.hpp"
15  
16 < // quick case asignments
16 > // this routine is defined in BASS_interface.cpp
17 > extern void set_interface_stamps( MakeStamps* ms, Globals* g );
18  
19 +
20 + // case asignments
21   #define BILAYER 1
22 + #define NANO 2
23  
13
24   char* program_name;
25 + bassInfo bsInfo;
26   void usage(void);
27  
28  
# Line 23 | Line 34 | int main( int argc, char* argv[]){
34    char current_flag;
35    char* out_prefix;
36    char* in_name;
37 +  char* id;
38    
39 <  sysBuildInfo info;
39 >  includeLinked* headInc;
40 >  includeLinked* prevInc;
41 >  includeLinked* currInc;
42  
43 <  // initialize simError
44 <  initSimError();
43 >  MakeStamps* the_stamps = NULL;
44 >  Globals* the_globals = NULL;
45 >  Component** the_components = NULL;
46 >  LinkedMolStamp* headStamp = NULL;
47 >  LinkedMolStamp* currStamp;
48  
49 +  // initialize all functions and variables
50  
51 <  program_name = argv[0]; /*save the program name in case we need it*/
51 >  initSimError();
52 >  program_name = argv[0];
53    sysType = -1;
54    have_prefix = 0;
55    isRandom = 0;
56    in_name = NULL;
57 +  headInc = NULL;
58 +
59 +  bsInfo.includes = NULL;
60 +  bsInfo.componentsNmol = NULL;
61 +  bsInfo.compStamps = NULL;
62 +  bsInfo.havePressure = 0;
63 +  bsInfo.haveTauBarostat = 0;
64 +  bsInfo.haveTauThermostat = 0;
65 +  bsInfo.haveQmass = 0;
66 +
67 +  headStamp = new LinkedMolStamp();
68 +  the_stamps = new MakeStamps();
69 +  the_globals = new Globals();
70 +  set_interface_stamps( the_stamps, the_globals );
71 +
72 +  // parse command line arguments
73 +
74    for( i = 1; i < argc; i++){
75      
76      if(argv[i][0] =='-'){
# Line 53 | Line 89 | int main( int argc, char* argv[]){
89              simError();
90              usage();
91            }
92 +
93            sysType = BILAYER;
94 +
95 +          i++;
96 +          if( i>=argc ){
97 +            sprintf( painCave.errMsg,
98 +                     "\n"
99 +                     "not enough arguments for bilayer\n");
100 +            painCave.isFatal = 0;
101 +            simError();
102 +            usage();
103 +          }      
104 +          strcpy( bsInfo.lipidName, argv[i] );
105 +          
106 +          i++;
107 +          if( i>=argc ){
108 +            sprintf( painCave.errMsg,
109 +                     "\n"
110 +                     "not enough arguments for bilayer\n");
111 +            painCave.isFatal = 0;
112 +            simError();
113 +            usage();
114 +          }      
115 +          strcpy( bsInfo.waterName, argv[i] );
116 +
117          }
118  
119          else{
# Line 85 | Line 145 | int main( int argc, char* argv[]){
145              done = 1;
146              break;
147  
148 +          case 'I':
149 +            // -I <include> => the include file.
150 +
151 +            i++;
152 +            if( headInc == NULL ){
153 +              headInc = new includeLinked;
154 +              headInc->next = NULL;
155 +              strcpy( headInc->name, argv[i] );
156 +            }
157 +            else{
158 +              prevInc = headInc;
159 +              currInc = headInc->next;
160 +              while( currInc != NULL ){
161 +                prevInc = currInc;
162 +                currInc = prevInc->next;
163 +              }
164 +              currInc = new includeLinked;
165 +              currInc->next = NULL;
166 +              strcpy( currInc->name, argv[i] );
167 +              prevInc->next = currInc;
168 +            }
169 +            
170 +            done = 1;
171 +            break;
172 +
173            case 'h':
174              // -h => give the usage
175              
# Line 149 | Line 234 | int main( int argc, char* argv[]){
234    if( !have_prefix ){
235      out_prefix = strdup( "donkey" );
236    }
152  
153  info.in_name = in_name;
154  info.out_prefix = out_prefix;
155  info.isRandom = isRandom;
237    
238 <  // switch the system type
238 >  // set command line info into the bassInfo struct
239 >  
240 >  bsInfo.outPrefix = out_prefix;
241 >  bsInfo.includes = headInc;
242 >  
243  
244 +  // open and parse the bass file.
245 +
246 +  set_interface_stamps( the_stamps, the_globals );
247 +  yacc_BASS( in_name );  
248 +
249 +  // set the easy ones first
250 +  bsInfo.targetTemp = the_globals->getTargetTemp();
251 +  bsInfo.dt = the_globals->getDt();
252 +  bsInfo.runTime = the_globals->getRunTime();
253 +
254 +  // get the ones we know are there, yet still may need some work.
255 +  bsInfo.nComponents = the_globals->getNComponents();
256 +  strcpy( bsInfo.forceField, the_globals->getForceField() );
257 +
258 +  // get the ensemble:
259 +  strcpy( bsInfo.ensemble, the_globals->getEnsemble() );
260 +  if( !strcasecmp( bsInfo.ensemble, "NPT" ) ) {
261 +    
262 +    if (the_globals->haveTargetPressure()){
263 +      bsInfo.targetPressure = the_globals->getTargetPressure();
264 +      bsInfo.havePressure = 1;
265 +    }
266 +    else {
267 +      sprintf( painCave.errMsg,
268 +               "sysBuild error: If you use the constant pressure\n"
269 +               "    ensemble, you must set targetPressure.\n"
270 +               "    This was found in the BASS file.\n");
271 +      painCave.isFatal = 1;
272 +      simError();
273 +    }
274 +
275 +    if (the_globals->haveTauThermostat()){
276 +      bsInfo.tauThermostat = the_globals->getTauThermostat();
277 +      bsInfo.haveTauThermostat = 1;;
278 +    }
279 +    else if (the_globals->haveQmass()){
280 +      bsInfo.Qmass = the_globals->getQmass();
281 +      bsInfo.haveQmass = 1;
282 +    }
283 +    else {
284 +      sprintf( painCave.errMsg,
285 +               "sysBuild error: If you use one of the constant temperature\n"
286 +               "    ensembles, you must set either tauThermostat or qMass.\n"
287 +               "    Neither of these was found in the BASS file.\n");
288 +      painCave.isFatal = 1;
289 +      simError();
290 +    }
291 +
292 +    if (the_globals->haveTauBarostat()){
293 +      bsInfo.tauBarostat = the_globals->getTauBarostat();
294 +      bsInfo.haveTauBarostat = 1;
295 +    }                                    
296 +    else {
297 +      sprintf( painCave.errMsg,
298 +               "sysBuild error: If you use the constant pressure\n"
299 +               "    ensemble, you must set tauBarostat.\n"
300 +               "    This was found in the BASS file.\n");
301 +      painCave.isFatal = 1;
302 +      simError();
303 +    }
304 +
305 +  }
306 +  else if ( !strcasecmp( bsInfo.ensemble, "NVT") ) {
307 +
308 +    if (the_globals->haveTauThermostat()){
309 +      bsInfo.tauThermostat = the_globals->getTauThermostat();
310 +      bsInfo.haveTauThermostat = 1;
311 +    }
312 +    else if (the_globals->haveQmass()){
313 +      bsInfo.Qmass = the_globals->getQmass();
314 +      bsInfo.haveQmass = 1;
315 +    }
316 +    else {
317 +      sprintf( painCave.errMsg,
318 +               "sysBuild error: If you use one of the constant temperature\n"
319 +               "    ensembles, you must set either tauThermostat or qMass.\n"
320 +               "    Neither of these was found in the BASS file.\n");
321 +      painCave.isFatal = 1;
322 +      simError();
323 +    }
324 +    
325 +  }
326 +  else if ( !strcasecmp( bsInfo.ensemble, "NVE") ) {
327 +    
328 +    // nothing special for now
329 +  }
330 +  else {
331 +    sprintf( painCave.errMsg,
332 +             "sysBuild Warning. Unrecognized Ensemble -> %s, "
333 +             "reverting to NVE for this simulation.\n",
334 +             bsInfo.ensemble );
335 +    painCave.isFatal = 0;
336 +    simError();
337 +    strcpy( bsInfo.ensemble, "NVE" );
338 +  }  
339 +
340 +
341 +  // get the components and calculate the tot_nMol and indvidual n_mol
342 +
343 +  the_components = the_globals->getComponents();
344 +  bsInfo.componentsNmol = new int[bsInfo.nComponents];
345 +  bsInfo.compStamps = new MoleculeStamp*[bsInfo.nComponents];  
346 +  bsInfo.totNmol = 0;
347 +  for( i=0; i<bsInfo.nComponents; i++ ){
348 +    
349 +    if( !the_components[i]->haveNMol() ){
350 +      // we have a problem
351 +      sprintf( painCave.errMsg,
352 +               "sysBuild Error. No component NMol"
353 +               " given. Cannot calculate the number of atoms.\n" );
354 +      painCave.isFatal = 1;
355 +      simError();
356 +    }
357 +    
358 +    bsInfo.totNmol += the_components[i]->getNMol();
359 +    bsInfo.componentsNmol[i] = the_components[i]->getNMol();
360 +  }
361 +
362 +  // make an array of molecule stamps that match the components used.
363 +  // also extract the used stamps out into a separate linked list
364 +  
365 +  for( i=0; i<bsInfo.nComponents; i++ ){
366 +
367 +    id = the_components[i]->getType();
368 +    bsInfo.compStamps[i] = NULL;
369 +    
370 +    // check to make sure the component isn't already in the list
371 +
372 +    bsInfo.compStamps[i] = headStamp->match( id );
373 +    if( bsInfo.compStamps[i] == NULL ){
374 +      
375 +      // extract the component from the list;
376 +      
377 +      currStamp = the_stamps->extractMolStamp( id );
378 +      if( currStamp == NULL ){
379 +        sprintf( painCave.errMsg,
380 +                 "sysBuild error: Component \"%s\" was not found in the "
381 +                 "list of declared molecules\n",
382 +                 id );
383 +        painCave.isFatal = 1;
384 +        simError();
385 +      }
386 +      
387 +      headStamp->add( currStamp );
388 +      bsInfo.compStamps[i] = headStamp->match( id );
389 +    }
390 +  }
391 +
392 +  // get and set the boxSize
393 +
394 +  if( the_globals->haveBox() ){
395 +    bsInfo.boxX = the_globals->getBox();
396 +    bsInfo.boxY = the_globals->getBox();
397 +    bsInfo.boxZ = the_globals->getBox();
398 +  }
399 +  else if( the_globals->haveDensity() ){
400 +
401 +    double vol;
402 +    vol = (double)bsInfo.totNmol / the_globals->getDensity();
403 +    bsInfo.boxX = pow( vol, ( 1.0 / 3.0 ) );
404 +    bsInfo.boxY = bsInfo.boxX;
405 +    bsInfo.boxZ = bsInfo.boxY;
406 +  }
407 +  else{
408 +    if( !the_globals->haveBoxX() ){
409 +      sprintf( painCave.errMsg,
410 +               "sysBuild error, no periodic BoxX size given.\n" );
411 +      painCave.isFatal = 1;
412 +      simError();
413 +    }
414 +    bsInfo.boxX = the_globals->getBoxX();
415 +
416 +    if( !the_globals->haveBoxY() ){
417 +      sprintf( painCave.errMsg,
418 +               "sysBuild error, no periodic BoxY size given.\n" );
419 +      painCave.isFatal = 1;
420 +      simError();
421 +    }
422 +    bsInfo.boxY = the_globals->getBoxY();
423 +
424 +    if( !the_globals->haveBoxZ() ){
425 +      sprintf( painCave.errMsg,
426 +               "SimSetup error, no periodic BoxZ size given.\n" );
427 +      painCave.isFatal = 1;
428 +      simError();
429 +    }
430 +    bsInfo.boxZ = the_globals->getBoxZ();
431 +  }
432 +  
433 +
434 +  //************************************************************
435 +  // that should be all we need from bass. now to switch to the
436 +  // appropriate system builder.
437 +  // ***********************************************************
438 +
439 +
440    switch( sysType ){
441      
442    case BILAYER:
443      
444 <    buildBilayer( info );
444 >    buildBilayer( isRandom );
445      break;
446  
447 +  case NANO:
448 +    // buildNano( isRandom );
449 +    break;
450 +
451    default:
452      sprintf( painCave.errMsg,
453               "Unknown system type: %d\n", sysType );
454      painCave.isFatal = 1;
455      simError();
456 +
457    }
458    
459 +
460 +
461 +  // clean up memory;
462 +
463 +  if( headStamp!= NULL )       delete headStamp;
464 +  if( the_stamps != NULL )     delete the_stamps;
465 +  if( the_globals != NULL )    delete the_globals;
466 +  if( the_components != NULL ) delete[] the_components;
467 +  
468 +  if( bsInfo.componentsNmol != NULL ) delete[] bsInfo.componentsNmol;
469 +  if( bsInfo.compStamps != NULL )     delete[] bsInfo.compStamps;
470 +  if( bsInfo.includes != NULL ){
471 +    prevInc = bsInfo.includes;
472 +    while( prevInc != NULL ){
473 +      currInc = prevInc->next;
474 +      delete prevInc;
475 +      prevInc = currInc;
476 +    }
477 +  }
478 +      
479    return 0;
480   }
481  
# Line 188 | Line 494 | void usage(){
494                  "  ------\n"
495                  "   -h              Display this message\n"
496                  "   -o <prefix>     The output prefix\n"
497 +                "   -I <include>    File name that should be included at the top of the\n"
498 +                "                     output bass file.\n"
499                  "   -r              toggle the random option\n"
500                  "\n"
501                  "  long:\n"
502                  "  -----\n"
503 <                "   --bilayer       Tries to build a basic bilayer with the specified number\n"
504 <                "                     of lipids in the input bass file. The bilayer will be\n"
505 <                "                     surrounded by the number of solvent molecules given\n"
506 <                "                     in the bass file.\n"
507 <                "                      -note: combined with \"-r\" the simulation will start in\n"
508 <                "                             an FCC lattice with randomly assigned latice\n"
201 <                "                             sites for all atoms involved.\n"
503 >                "   --bilayer <lipid> <water>  Tries to build a basic bilayer with the specified number\n"
504 >                "                              of lipids in the input bass file. The bilayer will be\n"
505 >                "                              surrounded by the number of solvent molecules given\n"
506 >                "                              in the bass file.\n"
507 >                "                                -note: combined with \"-r\" the simulation will start\n"
508 >                "                                 the lipids randomly oriented in a sea of waters.\n"
509                  "\n"
510                  "\n",
511                  program_name);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines