ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/io/Globals.cpp
(Generate patch)

Comparing trunk/OOPSE-2.0/src/io/Globals.cpp (file contents):
Revision 2101 by chrisfen, Thu Mar 10 15:10:24 2005 UTC vs.
Revision 2364 by tim, Thu Oct 13 22:26:47 2005 UTC

# Line 42 | Line 42
42   #include <stdlib.h>
43   #include <stdio.h>
44   #include <string.h>
45 + #include <string>
46  
47   #include "io/Globals.hpp"
48   #include "utils/simError.h"
# Line 49 | Line 50
50   #include "io/mpiBASS.h"
51   #endif // is_mpi
52  
52 /*
53 * The following section lists all of the defined tokens for the
54 * global assignment statements. All are prefixed with a G_ to avoid
55 * stepping on any previously defined enumerations.
56 *
57 * NOTE: tokens start at 1, 0 is a resrved token number
58 */
53  
54 < //required parameters
55 < #define G_FORCEFIELD         1
56 < #define G_NCOMPONENTS        2
63 < #define G_TARGETTEMP         3
64 < #define G_ENSEMBLE           4
65 < #define G_DT                 5
66 < #define G_RUNTIME            6
54 > #define DefineParameter(NAME,KEYWORD)                              \
55 >  NAME.setKeyword(KEYWORD);                  \
56 >  parameters_.insert(std::make_pair(std::string(KEYWORD),  &NAME));
57  
58 < //optional parameters
59 < #define G_INITIALCONFIG      7
60 < #define G_FINALCONFIG        8
71 < #define G_NMOL               9
72 < #define G_DENSITY           10
73 < #define G_BOX               11
74 < #define G_BOXX              12
75 < #define G_BOXY              13
76 < #define G_BOXZ              14
77 < #define G_SAMPLETIME        15
78 < #define G_STATUSTIME        16
79 < #define G_RCUT              17
80 < #define G_RSW               18
81 < #define G_DIELECTRIC        19
82 < #define G_TEMPSET           20
83 < #define G_THERMALTIME       21
84 < #define G_USEPBC            22
85 < #define G_MIXINGRULE        23
86 < #define G_USERF             24
87 < #define G_TARGETPRESSURE    25
88 < #define G_TAUTHERMOSTAT     26
89 < #define G_TAUBAROSTAT       27
90 < #define G_ZCONSTIME         28
91 < #define G_NZCONSTRAINTS     29
92 < #define G_ZCONSTOL          30
93 < #define G_ZCONSFORCEPOLICY  31
94 < #define G_SEED              32
95 < #define G_RESETTIME         33
96 < #define G_USEINITTIME       34
97 < #define G_USEINIT_XS_STATE  35
98 < #define G_ORTHOBOXTOLERANCE 36
99 < #define G_MINIMIZER         37
100 < #define G_MIN_MAXITER       38
101 < #define G_MIN_WRITEFRQ      39
102 < #define G_MIN_STEPSIZE      40
103 < #define G_MIN_FTOL          41
104 < #define G_MIN_GTOL          42
105 < #define G_MIN_LSTOL         43
106 < #define G_MIN_LSMAXITER     44
107 < #define G_ZCONSGAP          45
108 < #define G_ZCONSFIXTIME      46
109 < #define G_ZCONSUSINGSMD     47
110 < #define G_USE_SOLID_THERM_INT     48
111 < #define G_USE_LIQUID_THERM_INT    49
112 < #define G_THERM_INT_LAMBDA  50
113 < #define G_THERM_INT_K       51
114 < #define G_FORCEFIELD_VARIANT 52
115 < #define G_FORCEFIELD_FILENAME 53
116 < #define G_THERM_INT_DIST_SPRING  54
117 < #define G_THERM_INT_THETA_SPRING 55
118 < #define G_THERM_INT_OMEGA_SPRING 56
58 > #define DefineOptionalParameter(NAME,KEYWORD)                              \
59 >  NAME.setKeyword(KEYWORD); NAME.setOptional(true);                    \
60 >  parameters_.insert(std::make_pair(std::string(KEYWORD),  &NAME));
61  
62 + #define DefineOptionalParameterWithDefaultValue(NAME,KEYWORD, DEFAULTVALUE)                              \
63 +  NAME.setKeyword(KEYWORD); NAME.setOptional(true); NAME.setDefaultValue(DEFAULTVALUE);                      \
64 +  parameters_.insert(std::make_pair(std::string(KEYWORD),  &NAME));
65 +
66   Globals::Globals(){
67 <  initalize();
67 >
68 >  DefineParameter(ForceField, "forceField")
69 >  DefineParameter(NComponents, "nComponents")
70 >
71 >  DefineOptionalParameter(TargetTemp, "targetTemp");
72 >  DefineOptionalParameter(Ensemble, "ensemble");
73 >  DefineOptionalParameter(Dt, "dt");
74 >  DefineOptionalParameter(RunTime, "runTime");
75 >  DefineOptionalParameter(InitialConfig, "initialConfig");
76 >  DefineOptionalParameter(FinalConfig, "finalConfig");
77 >  DefineOptionalParameter(NMol, "nMol");
78 >  DefineOptionalParameter(Density, "density");
79 >  DefineOptionalParameter(Box, "box");
80 >  DefineOptionalParameter(BoxX, "boxX");
81 >  DefineOptionalParameter(BoxY, "boxY");
82 >  DefineOptionalParameter(BoxZ, "boxZ");
83 >  DefineOptionalParameter(SampleTime, "sampleTime");
84 >  DefineOptionalParameter(ResetTime, "resetTime");
85 >  DefineOptionalParameter(StatusTime, "statusTime");
86 >  DefineOptionalParameter(CutoffRadius, "cutoffRadius");
87 >  DefineOptionalParameter(SwitchingRadius, "switchingRadius");
88 >  DefineOptionalParameter(Dielectric, "dielectric");
89 >  DefineOptionalParameter(TempSet, "tempSet");
90 >  DefineOptionalParameter(ThermalTime, "thermalTime");
91 >  DefineOptionalParameter(TargetPressure, "targetPressure");
92 >  DefineOptionalParameter(TauThermostat, "tauThermostat");
93 >  DefineOptionalParameter(TauBarostat, "tauBarostat");
94 >  DefineOptionalParameter(ZconsTime, "zconsTime");
95 >  DefineOptionalParameter(NZconstraints, "nZconstraints");  
96 >  DefineOptionalParameter(ZconsTol, "zconsTol");
97 >  DefineOptionalParameter(ZconsForcePolicy, "zconsForcePolicy");
98 >  DefineOptionalParameter(Seed, "seed");
99 >  DefineOptionalParameter(Minimizer, "minimizer");
100 >  DefineOptionalParameter(MinimizerMaxIter,"minimizerMaxIter");
101 >  DefineOptionalParameter(MinimizerWriteFrq, "minimizerWriteFrq");
102 >  DefineOptionalParameter(MinimizerStepSize, "minimizerStepSize");
103 >  DefineOptionalParameter(MinimizerFTol, "minimizerFTol");
104 >  DefineOptionalParameter(MinimizerGTol, "minimizerGTol");
105 >  DefineOptionalParameter(MinimizerLSTol, "minimizerLSTol");
106 >  DefineOptionalParameter(MinimizerLSMaxIter, "minimizerLSMaxIter");
107 >  DefineOptionalParameter(ZconsGap, "zconsGap");
108 >  DefineOptionalParameter(ZconsFixtime, "zconsFixtime");
109 >  DefineOptionalParameter(ZconsUsingSMD, "zconsUsingSMD");
110 >  DefineOptionalParameter(ThermodynamicIntegrationLambda, "thermodynamicIntegrationLambda");
111 >  DefineOptionalParameter(ThermodynamicIntegrationK, "thermodynamicIntegrationK");
112 >  DefineOptionalParameter(ForceFieldVariant, "forceFieldVariant");
113 >  DefineOptionalParameter(ForceFieldFileName, "forceFieldFileName");
114 >  DefineOptionalParameter(ThermIntDistSpringConst, "thermIntDistSpringConst");
115 >  DefineOptionalParameter(ThermIntThetaSpringConst, "thermIntThetaSpringConst");
116 >  DefineOptionalParameter(ThermIntOmegaSpringConst, "thermIntOmegaSpringConst");
117 >  DefineOptionalParameter(SurfaceTension, "surfaceTension");
118 >  DefineOptionalParameter(PrintPressureTensor, "printPressureTensor");
119 >  DefineOptionalParameter(ElectrostaticSummationMethod, "electrostaticSummationMethod");
120 >  DefineOptionalParameter(CutoffPolicy, "cutoffPolicy");
121 >  DefineOptionalParameter(StatFileFormat, "statFileFormat");    
122 >  
123 >  DefineOptionalParameterWithDefaultValue(MixingRule, "mixingRule", "standard");
124 >  DefineOptionalParameterWithDefaultValue(UsePeriodicBoundaryConditions, "usePeriodicBoundaryConditions", true);
125 >  DefineOptionalParameterWithDefaultValue(UseInitalTime, "useInitialTime", false);
126 >  DefineOptionalParameterWithDefaultValue(UseIntialExtendedSystemState, "useInitialExtendedSystemState", false);
127 >  DefineOptionalParameterWithDefaultValue(OrthoBoxTolerance, "orthoBoxTolerance", 1E-6);  
128 >  DefineOptionalParameterWithDefaultValue(UseSolidThermInt, "useSolidThermInt", false);
129 >  DefineOptionalParameterWithDefaultValue(UseLiquidThermInt, "useLiquidThermInt", false);
130 >  DefineOptionalParameterWithDefaultValue(DampingAlpha, "dampingAlpha", 1.5);
131 >  DefineOptionalParameterWithDefaultValue(CompressDumpFile, "compressDumpFile", 0);
132 >  DefineOptionalParameterWithDefaultValue(SkinThickness, "skinThickness", 1.0);
133 >  
134   }
135  
136 < Globals::~Globals(){
137 <  int i;
136 > int Globals::globalAssign( event* the_event ){
137 >  
138 >  int key;
139 >  int token;
140 >  interface_assign_type the_type =  the_event->evt.asmt.asmt_type;
141 >  char* lhs = the_event->evt.asmt.lhs;
142 >  std::string keyword(lhs);
143  
144 <  for( i=0; i<hash_size; i++ ){
128 <    if( command_table[i] != NULL ) delete command_table[i];
129 <  }
130 <  delete[] command_table;
144 >  bool result;
145  
146 <  if( components != NULL ){
147 <    for( i=0; i<n_components; i++ ) delete components[i];
148 <    delete[] components;
146 >
147 >  ParamMap::iterator i =parameters_.find(keyword);
148 >  if (i != parameters_.end()) {
149 >    if( the_type == STRING ){
150 >       result = i->second->setData(std::string(the_event->evt.asmt.rhs.sval));
151 >       if (!result ) {
152 >            sprintf(the_event->err_msg, "Error in parsing meta-data file!\n\t%s must be a string.\n", keyword.c_str() );
153 >       }
154 >    } else if( the_type == DOUBLE ){
155 >      result = i->second->setData(the_event->evt.asmt.rhs.dval);
156 >       if (!result )
157 >         sprintf(the_event->err_msg, "Error in parsing meta-data file!\n\t%s must be a double.\n", keyword.c_str() );
158 >    }      
159 >    else if (the_type == INT ){
160 >      result = i->second->setData(the_event->evt.asmt.rhs.ival);
161 >       if (!result )
162 >         sprintf(the_event->err_msg,  "Error in parsing meta-data file!\n\t%s must be an int.\n", keyword.c_str() );
163 >      
164 >    } else {
165 >    
166 >    }
167    }
136 }
168  
169 < void Globals::initalize(){
170 <  int i;
169 >  if (keyword == "nComponents" && getNComponents() > 0) {
170 >    components = new Component*[getNComponents()];
171 >  }else if (keyword == "nZconstraints" && getNZconstraints() > 0) {
172 >    zConstraints = new ZconStamp*[getNZconstraints()];
173 >  }
174    
175 <  hash_size = 23;
142 <  hash_shift = 4;
143 <  
144 <  components = NULL;
145 <  
146 <  command_table = new LinkedCommand*[hash_size];
147 <  for( i=0; i<hash_size; i++ ) command_table[i] = NULL;
148 <  
149 <  addHash( "forceField",    G_FORCEFIELD );
150 <  addHash( "nComponents",   G_NCOMPONENTS );
151 <  addHash( "targetTemp",    G_TARGETTEMP );
152 <  addHash( "ensemble",      G_ENSEMBLE );
153 <  
154 <  addHash( "dt",            G_DT );
155 <  addHash( "runTime",       G_RUNTIME );
156 <  
157 <  addHash( "initialConfig", G_INITIALCONFIG );
158 <  addHash( "finalConfig",   G_FINALCONFIG );
159 <  addHash( "nMol",          G_NMOL );
160 <  addHash( "density",       G_DENSITY );
161 <  addHash( "box",           G_BOX );
162 <  addHash( "boxX",          G_BOXX );
163 <  addHash( "boxY",          G_BOXY );
164 <  addHash( "boxZ",          G_BOXZ );
165 <  addHash( "sampleTime",    G_SAMPLETIME );
166 <  addHash( "resetTime",     G_RESETTIME );
167 <  addHash( "statusTime",    G_STATUSTIME );
168 <  addHash( "cutoffRadius",  G_RCUT );
169 <  addHash( "switchingRadius",  G_RSW );
170 <  addHash( "dielectric",    G_DIELECTRIC );
171 <  addHash( "tempSet",       G_TEMPSET );
172 <  addHash( "thermalTime",   G_THERMALTIME );
173 <  addHash( "mixingRule",    G_MIXINGRULE);
174 <  addHash( "usePeriodicBoundaryConditions",        G_USEPBC);
175 <  addHash( "useReactionField",                     G_USERF );
176 <  addHash( "targetPressure",                       G_TARGETPRESSURE);
177 <  addHash( "tauThermostat",                        G_TAUTHERMOSTAT);
178 <  addHash( "tauBarostat",                          G_TAUBAROSTAT);
179 <  addHash( "zconsTime",                            G_ZCONSTIME);
180 <  addHash( "nZconstraints",                        G_NZCONSTRAINTS);
181 <  addHash( "zconsTol",                             G_ZCONSTOL);
182 <  addHash( "zconsForcePolicy",                     G_ZCONSFORCEPOLICY);
183 <  addHash( "seed",                                 G_SEED);
184 <  addHash( "useInitialTime",                       G_USEINITTIME);
185 <  addHash( "useInitialExtendedSystemState",        G_USEINIT_XS_STATE);
186 <  addHash( "orthoBoxTolerance",                    G_ORTHOBOXTOLERANCE);
187 <  addHash( "minimizer",                            G_MINIMIZER);
188 <  addHash( "minimizerMaxIter",                     G_MIN_MAXITER);
189 <  addHash( "minimizerWriteFrq",                    G_MIN_WRITEFRQ);
190 <  addHash( "minimizerStepSize",                    G_MIN_STEPSIZE);
191 <  addHash( "minimizerFTol",                        G_MIN_FTOL);
192 <  addHash( "minimizerGTol",                        G_MIN_GTOL);
193 <  addHash( "minimizerLSTol",                       G_MIN_LSTOL);
194 <  addHash( "minimizerLSMaxIter",                   G_MIN_LSMAXITER);
195 <  addHash( "zconsGap",                             G_ZCONSGAP);
196 <  addHash( "zconsFixtime",                         G_ZCONSFIXTIME);
197 <  addHash( "zconsUsingSMD",                        G_ZCONSUSINGSMD);
198 <  addHash( "useSolidThermInt",                     G_USE_SOLID_THERM_INT);
199 <  addHash( "useLiquidThermInt",                    G_USE_LIQUID_THERM_INT);
200 <  addHash( "thermodynamicIntegrationLambda",       G_THERM_INT_LAMBDA);
201 <  addHash( "thermodynamicIntegrationK",            G_THERM_INT_K);
202 <  addHash( "forceFieldVariant",                    G_FORCEFIELD_VARIANT);
203 <  addHash( "forceFieldFileName",                   G_FORCEFIELD_FILENAME);
204 <  addHash( "thermIntDistSpringConst",              G_THERM_INT_DIST_SPRING);
205 <  addHash( "thermIntThetaSpringConst",             G_THERM_INT_THETA_SPRING);
206 <  addHash( "thermIntOmegaSpringConst",             G_THERM_INT_OMEGA_SPRING);
207 <
208 <  strcpy( mixingRule,"standard");  //default mixing rules to standard.
209 <  usePBC = 1; //default  periodic boundry conditions to on
210 <  useRF  = 0;
211 <  useInitTime = 0; // default to pull init time from the init file
212 <  useInitXSstate = 0; // default to pull the extended state from the init file
213 <  orthoBoxTolerance = 1E-6;
214 <  useSolidThermInt = 0; // default solid-state thermodynamic integration to off
215 <  useLiquidThermInt = 0; // default liquid thermodynamic integration to off
216 <
217 <  have_force_field =  0;
218 <  have_n_components = 0;
219 <  have_target_temp =  0;
220 <  have_ensemble =     0;
221 <  have_dt =           0;
222 <  have_run_time =     0;
223 <  
224 <  have_initial_config = 0;
225 <  have_final_config =   0;
226 <  have_n_mol =          0;
227 <  have_density =        0;
228 <  have_box =            0;
229 <  have_box_x =          0;
230 <  have_box_y =          0;
231 <  have_box_y =          0;
232 <  have_box_z =          0;
233 <  have_sample_time =    0;
234 <  have_status_time =    0;
235 <  have_reset_time =     0;
236 <  have_thermal_time =   0;
237 <  have_rcut =           0;
238 <  have_rsw =            0;
239 <  have_dielectric =     0;
240 <  have_tempSet =        0;
241 <  have_target_pressure =0;
242 <  have_q_mass =         0;
243 <  have_tau_thermostat = 0;
244 <  have_tau_barostat   = 0;
245 <  have_zcons_time     = 0;
246 <  have_n_zConstraints = 0;
247 <  have_zConstraints   = 0;
248 <  have_zcons_tol = 0;
249 <  have_zcons_gap = 0;
250 <  have_zcons_fixtime = 0;
251 <  have_zcons_using_smd = 0;  
252 <  have_seed = 0;
253 <  have_minimizer = 0;
254 <  have_minimizer_maxiteration = 0;
255 <  have_minimizer_writefrq = 0;
256 <  have_minimizer_stepsize = 0;
257 <  have_minimizer_ftol = 0;
258 <  have_minimizer_gtol = 0;
259 <  have_minimizer_ls_tol = 0;
260 <  have_minimizer_ls_maxiteration = 0;
261 <  have_thermodynamic_integration_lambda = 0;
262 <  have_thermodynamic_integration_k = 0;
263 <  have_forcefield_variant = 0;
264 <  have_forcefield_filename = 0;
265 <  have_dist_spring_constant =  0;
266 <  have_theta_spring_constant = 0;
267 <  have_omega_spring_constant = 0;
175 >  return result;
176   }
177  
178   int Globals::newComponent( event* the_event ){
# Line 273 | Line 181 | int Globals::newComponent( event* the_event ){
181    int index = the_event->evt.blk_index;
182    char err[200];
183    
184 <  if( have_n_components && index < n_components )
184 >  if( haveNComponents() && index < getNComponents() )
185      components[index] = current_component;
186    else{
187 <    if( have_n_components ){
187 >    if( haveNComponents()  ){
188        sprintf( err, "meta-data parsing error: %d out of nComponents range",
189                 index );
190        the_event->err_msg = strdup( err );
# Line 340 | Line 248 | int Globals::newZconstraint( event* the_event ){
248    char err[200];
249    current_zConstraint = new ZconStamp( index );
250    
251 <  have_zConstraints = 1;
344 <
345 <  if( have_n_zConstraints && index < n_zConstraints )
251 >  if( haveNZconstraints() && index < getNZconstraints() )
252      zConstraints[index] = current_zConstraint;
253    else{
254 <    if( have_n_zConstraints ){
254 >    if( haveNZconstraints() ){
255        sprintf( err, "meta-data parsing error: %d out of nZconstraints range",
256                 index );
257        the_event->err_msg = strdup( err );
# Line 358 | Line 264 | int Globals::newZconstraint( event* the_event ){
264        return 0;
265      }
266    }  
267 <
267 >
268    return 1;
269   }
270  
# Line 403 | Line 309 | int Globals::globalAssign( event* the_event ){
309    return 1;
310   }
311  
312 < int Globals::globalAssign( event* the_event ){
407 <  
408 <  int key;
409 <  int token;
410 <  interface_assign_type the_type =  the_event->evt.asmt.asmt_type;
411 <  char* lhs = the_event->evt.asmt.lhs;
412 <  char err[300];
413 <  
414 <  token = 0;
415 <  key = hash( lhs );
416 <  if( command_table[key] != NULL ) token = command_table[key]->match( lhs );
417 <  
418 <  if( token ){
419 <    
420 <    switch( token ){
421 <      
422 <    case G_FORCEFIELD:
423 <      if( the_type == STRING ){
424 <        strcpy( force_field, the_event->evt.asmt.rhs.sval );
425 <        have_force_field = 1;
426 <        return 1;
427 <      }
428 <      
429 <      the_event->err_msg =
430 <        strdup( "Error in parsing meta-data file!\n\tforceField was not a string assignment.\n" );
431 <      return 0;
432 <      break;
433 <      
434 <    case G_NCOMPONENTS:
435 <      if( the_type == STRING ){
436 <        the_event->err_msg =
437 <          strdup("Error in parsing meta-data file!\n\tnComponents is not a double or an int.\n" );
438 <        return 0;
439 <      }
440 <      
441 <      else if( the_type == DOUBLE ){
442 <        n_components = (int)the_event->evt.asmt.rhs.dval;
443 <        components = new Component*[n_components];
444 <        have_n_components = 1;
445 <        return 1;
446 <      }
447 <      
448 <      else{
449 <        n_components = the_event->evt.asmt.rhs.ival;
450 <        components = new Component*[n_components];
451 <        have_n_components = 1;
452 <        return 1;
453 <      }
454 <      break;
312 > char* Globals::checkMe( void ){
313  
456    case G_NZCONSTRAINTS:
457      if( the_type == STRING ){
458        the_event->err_msg =
459          strdup("Error in parsing meta-data file!\n\tnZconstraints is not a double or an int.\n" );
460        return 0;
461      }
462      
463      else if( the_type == DOUBLE ){
464        n_zConstraints = (int)the_event->evt.asmt.rhs.dval;
465        zConstraints = new ZconStamp*[n_zConstraints];
466        have_n_zConstraints = 1;
467        return 1;
468      }
469      
470      else{
471        n_zConstraints = the_event->evt.asmt.rhs.ival;
472        zConstraints = new ZconStamp*[n_zConstraints];
473        have_n_zConstraints = 1;
474        return 1;
475      }
476      break;
477      
478    case G_TARGETTEMP:
479      switch( the_type ){
480        
481      case STRING:
482        the_event->err_msg =
483          strdup( "Error in parsing meta-data file!\n\ttargetTemp is not a double or int.\n" );
484        return 0;
485        break;
486        
487      case DOUBLE:
488        target_temp = the_event->evt.asmt.rhs.dval;
489        have_target_temp = 1;
490        return 1;
491        break;
492        
493      case INT:
494        target_temp = (double)the_event->evt.asmt.rhs.ival;
495        have_target_temp = 1;
496        return 1;
497        break;
498        
499      default:
500        the_event->err_msg =
501          strdup( "Error in parsing meta-data file!\n\ttargetTemp unrecognized.\n" );
502        return 0;
503        break;
504      }
505      break;
314  
315 <    case G_ORTHOBOXTOLERANCE:
316 <      switch( the_type ){
509 <        
510 <      case STRING:
511 <        the_event->err_msg =
512 <          strdup( "Error in parsing meta-data file!\n\torthoBoxTolerance is not a double or int.\n" );
513 <        return 0;
514 <        break;
515 <        
516 <      case DOUBLE:
517 <        orthoBoxTolerance = the_event->evt.asmt.rhs.dval;
518 <        have_target_temp = 1;
519 <        return 1;
520 <        break;
521 <        
522 <      case INT:
523 <        orthoBoxTolerance = (double)the_event->evt.asmt.rhs.ival;
524 <        have_target_temp = 1;
525 <        return 1;
526 <        break;
527 <        
528 <      default:
529 <        the_event->err_msg =
530 <          strdup( "Global error.orthoBoxTolerance unrecognized.\n" );
531 <        return 0;
532 <        break;
533 <      }
534 <      break;
535 <      
536 <    case G_ENSEMBLE:
537 <      if( the_type == STRING ){
538 <        strcpy( ensemble, the_event->evt.asmt.rhs.sval );
539 <        have_ensemble = 1;
540 <        return 1;
541 <      }
542 <      
543 <      the_event->err_msg =
544 <        strdup( "Error in parsing meta-data file!\n\tensemble was not assigned to a string\n" );
545 <      return 0;
546 <      break;      
547 <
548 <    case G_MIXINGRULE:
549 <      if( the_type == STRING ){
550 <        strcpy( mixingRule, the_event->evt.asmt.rhs.sval );
551 <        return 1;
552 <      }
553 <      
554 <      the_event->err_msg =
555 <        strdup( "Error in parsing meta-data file!\n\tmixing rule was not assigned to a string\n" );
556 <      return 0;
557 <      break;      
558 <      
559 <    case G_DT:
560 <      switch( the_type ){
561 <        
562 <      case STRING:
563 <        the_event->err_msg =
564 <          strdup( "Error in parsing meta-data file!\n\tdt is not a double or int.\n" );
565 <        return 0;
566 <        break;
567 <        
568 <      case DOUBLE:
569 <        dt = the_event->evt.asmt.rhs.dval;
570 <        have_dt = 1;
571 <        return 1;
572 <        break;
573 <        
574 <      case INT:
575 <        dt = (double)the_event->evt.asmt.rhs.ival;
576 <        have_dt = 1;
577 <        return 1;
578 <        break;
579 <        
580 <      default:
581 <        the_event->err_msg =
582 <          strdup( "Error in parsing meta-data file!\n\tdt unrecognized.\n" );
583 <        return 0;
584 <        break;
585 <      }
586 <      break;
587 <      
588 <    case G_RUNTIME:
589 <      switch( the_type ){
590 <        
591 <      case STRING:
592 <        the_event->err_msg =
593 <          strdup( "Error in parsing meta-data file!\n\trunTime is not a double or int.\n" );
594 <        return 0;
595 <        break;
596 <        
597 <      case DOUBLE:
598 <        run_time = the_event->evt.asmt.rhs.dval;
599 <        have_run_time = 1;
600 <        return 1;
601 <        break;
602 <        
603 <      case INT:
604 <        run_time = (double)the_event->evt.asmt.rhs.ival;
605 <        have_run_time = 1;
606 <        return 1;
607 <        break;
608 <        
609 <      default:
610 <        the_event->err_msg =
611 <          strdup( "Error in parsing meta-data file!\n\trunTime unrecognized.\n" );
612 <        return 0;
613 <        break;
614 <      }
615 <      break;
616 <      
617 <    case G_INITIALCONFIG:
618 <      if( the_type == STRING ){
619 <        strcpy( initial_config, the_event->evt.asmt.rhs.sval );
620 <        have_initial_config = 1;
621 <        return 1;
622 <      }
623 <      
624 <      the_event->err_msg =
625 <        strdup( "Error in parsing meta-data file!\n\tinitialConfig was not a string assignment.\n" );
626 <      return 0;
627 <      break;
628 <      
629 <    case G_FINALCONFIG:
630 <      if( the_type == STRING ){
631 <        strcpy( final_config, the_event->evt.asmt.rhs.sval );
632 <        have_final_config = 1;
633 <        return 1;
634 <      }
635 <      
636 <      the_event->err_msg =
637 <        strdup( "Error in parsing meta-data file!\n\tfinalConfig was not a string assignment.\n" );
638 <      return 0;
639 <      break;
640 <      
641 <    case G_NMOL:
642 <      switch( the_type ){
643 <        
644 <      case STRING:
645 <        the_event->err_msg =
646 <          strdup( "Error in parsing meta-data file!\n\tnMol is not a double or int.\n" );
647 <        return 0;
648 <        break;
649 <        
650 <      case DOUBLE:
651 <        n_mol = (int)the_event->evt.asmt.rhs.dval;
652 <        have_n_mol = 1;
653 <        return 1;
654 <        break;
655 <        
656 <      case INT:
657 <        n_mol = the_event->evt.asmt.rhs.ival;
658 <        have_n_mol = 1;
659 <        return 1;
660 <        break;
661 <        
662 <      default:
663 <        the_event->err_msg =
664 <          strdup( "Error in parsing meta-data file!\n\tnMol unrecognized.\n" );
665 <        return 0;
666 <        break;
667 <      }
668 <      break;
669 <      
670 <    case G_DENSITY:
671 <      switch( the_type ){
672 <        
673 <      case STRING:
674 <        the_event->err_msg =
675 <          strdup( "Error in parsing meta-data file!\n\tdensity is not a double or int.\n" );
676 <        return 0;
677 <        break;
678 <        
679 <      case DOUBLE:
680 <        density = the_event->evt.asmt.rhs.dval;
681 <        have_density = 1;
682 <        return 1;
683 <        break;
684 <        
685 <      case INT:
686 <        density = (double)the_event->evt.asmt.rhs.ival;
687 <        have_density = 1;
688 <        return 1;
689 <        break;
690 <        
691 <      default:
692 <        the_event->err_msg =
693 <          strdup( "Error in parsing meta-data file!\n\tdensity unrecognized.\n" );
694 <        return 0;
695 <        break;
696 <      }
697 <      break;
698 <      
699 <    case G_BOX:
700 <      switch( the_type ){
701 <        
702 <      case STRING:
703 <        the_event->err_msg =
704 <          strdup( "Error in parsing meta-data file!\n\tbox is not a double or int.\n" );
705 <        return 0;
706 <        break;
707 <        
708 <      case DOUBLE:
709 <        box = the_event->evt.asmt.rhs.dval;
710 <        have_box = 1;
711 <        return 1;
712 <        break;
713 <        
714 <      case INT:
715 <        box = (double)the_event->evt.asmt.rhs.ival;
716 <        have_box = 1;
717 <        return 1;
718 <        break;
719 <        
720 <      default:
721 <        the_event->err_msg =
722 <          strdup( "Error in parsing meta-data file!\n\tbox unrecognized.\n" );
723 <        return 0;
724 <        break;
725 <      }
726 <      break;
727 <      
728 <    case G_BOXX:
729 <      switch( the_type ){
730 <        
731 <      case STRING:
732 <        the_event->err_msg =
733 <          strdup( "Error in parsing meta-data file!\n\tboxX is not a double or int.\n" );
734 <        return 0;
735 <        break;
736 <        
737 <      case DOUBLE:
738 <        box_x = the_event->evt.asmt.rhs.dval;
739 <        have_box_x = 1;
740 <        return 1;
741 <        break;
742 <        
743 <      case INT:
744 <        box_x = (double)the_event->evt.asmt.rhs.ival;
745 <        have_box_x = 1;
746 <        return 1;
747 <        break;
748 <        
749 <      default:
750 <        the_event->err_msg =
751 <          strdup( "Error in parsing meta-data file!\n\tboxX unrecognized.\n" );
752 <        return 0;
753 <        break;
754 <      }
755 <      break;
756 <      
757 <    case G_BOXY:
758 <      switch( the_type ){
759 <        
760 <      case STRING:
761 <        the_event->err_msg =
762 <          strdup( "Error in parsing meta-data file!\n\tboxY is not a double or int.\n" );
763 <        return 0;
764 <        break;
765 <        
766 <      case DOUBLE:
767 <        box_y = the_event->evt.asmt.rhs.dval;
768 <        have_box_y = 1;
769 <        return 1;
770 <        break;
771 <        
772 <      case INT:
773 <        box_y = (double)the_event->evt.asmt.rhs.ival;
774 <        have_box_y = 1;
775 <        return 1;
776 <        break;
777 <        
778 <      default:
779 <        the_event->err_msg =
780 <          strdup( "Error in parsing meta-data file!\n\tboxY unrecognized.\n" );
781 <        return 0;
782 <        break;
783 <      }
784 <      break;
785 <      
786 <    case G_BOXZ:
787 <      switch( the_type ){
788 <        
789 <      case STRING:
790 <        the_event->err_msg =
791 <          strdup( "Error in parsing meta-data file!\n\tboxZ is not a double or int.\n" );
792 <        return 0;
793 <        break;
794 <        
795 <      case DOUBLE:
796 <        box_z = the_event->evt.asmt.rhs.dval;
797 <        have_box_z = 1;
798 <        return 1;
799 <        break;
800 <        
801 <      case INT:
802 <        box_z = (double)the_event->evt.asmt.rhs.ival;
803 <        have_box_z = 1;
804 <        return 1;
805 <        break;
806 <        
807 <      default:
808 <        the_event->err_msg =
809 <          strdup( "Error in parsing meta-data file!\n\tboxZ unrecognized.\n" );
810 <        return 0;
811 <        break;
812 <      }
813 <      break;
814 <      
815 <    case G_SAMPLETIME:
816 <      switch( the_type ){
817 <        
818 <      case STRING:
819 <        the_event->err_msg =
820 <          strdup( "Error in parsing meta-data file!\n\tsampleTime is not a double or int.\n" );
821 <        return 0;
822 <        break;
823 <        
824 <      case DOUBLE:
825 <        sample_time = the_event->evt.asmt.rhs.dval;
826 <        have_sample_time = 1;
827 <        return 1;
828 <        break;
829 <        
830 <      case INT:
831 <        sample_time = (double)the_event->evt.asmt.rhs.ival;
832 <        have_sample_time = 1;
833 <        return 1;
834 <        break;
835 <        
836 <      default:
837 <        the_event->err_msg =
838 <          strdup( "Error in parsing meta-data file!\n\tsampleTime unrecognized.\n" );
839 <        return 0;
840 <        break;
841 <      }
842 <      break;
843 <      
844 <    case G_STATUSTIME:
845 <      switch( the_type ){
846 <        
847 <      case STRING:
848 <        the_event->err_msg =
849 <          strdup( "Error in parsing meta-data file!\n\tstatusTime is not a double or int.\n" );
850 <        return 0;
851 <        break;
852 <        
853 <      case DOUBLE:
854 <        status_time = the_event->evt.asmt.rhs.dval;
855 <        have_status_time = 1;
856 <        return 1;
857 <        break;
858 <        
859 <      case INT:
860 <        status_time = (double)the_event->evt.asmt.rhs.ival;
861 <        have_status_time = 1;
862 <        return 1;
863 <        break;
864 <        
865 <      default:
866 <        the_event->err_msg =
867 <          strdup( "Error in parsing meta-data file!\n\tstatusTime unrecognized.\n" );
868 <        return 0;
869 <        break;
870 <      }
871 <      break;
872 <
873 <    case G_RESETTIME:
874 <      switch( the_type ){
875 <        
876 <      case STRING:
877 <        the_event->err_msg =
878 <          strdup( "Error in parsing meta-data file!\n\tresetTime is not a double or int.\n" );
879 <        return 0;
880 <        break;
881 <        
882 <      case DOUBLE:
883 <        resetTime = the_event->evt.asmt.rhs.dval;
884 <        have_reset_time = 1;
885 <        return 1;
886 <        break;
887 <        
888 <      case INT:
889 <        resetTime = (double)the_event->evt.asmt.rhs.ival;
890 <        have_reset_time = 1;
891 <        return 1;
892 <        break;
893 <        
894 <      default:
895 <        the_event->err_msg =
896 <          strdup( "Error in parsing meta-data file!\n\tresetTime unrecognized.\n" );
897 <        return 0;
898 <        break;
899 <      }
900 <      break;
901 <
902 <    case G_THERMALTIME:
903 <      switch( the_type ){
904 <        
905 <      case STRING:
906 <        the_event->err_msg =
907 <          strdup( "Error in parsing meta-data file!\n\tthermalTime is not a double or int.\n" );
908 <        return 0;
909 <        break;
910 <        
911 <      case DOUBLE:
912 <        thermal_time = the_event->evt.asmt.rhs.dval;
913 <        have_thermal_time = 1;
914 <        return 1;
915 <        break;
916 <        
917 <      case INT:
918 <        thermal_time = (double)the_event->evt.asmt.rhs.ival;
919 <        have_thermal_time = 1;
920 <        return 1;
921 <        break;
922 <        
923 <      default:
924 <        the_event->err_msg =
925 <          strdup( "Error in parsing meta-data file!\n\tthermalTime unrecognized.\n" );
926 <        return 0;
927 <        break;
928 <      }
929 <      break;
930 <      
931 <    case G_RCUT:
932 <      switch( the_type ){
933 <        
934 <      case STRING:
935 <        the_event->err_msg =
936 <          strdup( "Error in parsing meta-data file!\n\tcutoffRadius is not a double or int.\n" );
937 <        return 0;
938 <        break;
939 <        
940 <      case DOUBLE:
941 <        rcut = the_event->evt.asmt.rhs.dval;
942 <        have_rcut = 1;
943 <        return 1;
944 <        break;
945 <        
946 <      case INT:
947 <        rcut = (double)the_event->evt.asmt.rhs.ival;
948 <        have_rcut = 1;
949 <        return 1;
950 <        break;
951 <        
952 <      default:
953 <        the_event->err_msg =
954 <          strdup( "Error in parsing meta-data file!\n\tcutoffRadius unrecognized.\n" );
955 <        return 0;
956 <        break;
957 <      }
958 <      break;
959 <
960 <    case G_RSW:
961 <      switch( the_type ){
962 <        
963 <      case STRING:
964 <        the_event->err_msg =
965 <          strdup( "Error in parsing meta-data file!\n\tswitchingRadius is not a double or int.\n" );
966 <        return 0;
967 <        break;
968 <        
969 <      case DOUBLE:
970 <        rsw = the_event->evt.asmt.rhs.dval;
971 <        have_rsw = 1;
972 <        return 1;
973 <        break;
974 <        
975 <      case INT:
976 <        rsw = (double)the_event->evt.asmt.rhs.ival;
977 <        have_rsw = 1;
978 <        return 1;
979 <        break;
980 <        
981 <      default:
982 <        the_event->err_msg =
983 <          strdup( "Error in parsing meta-data file!\n\tswitchingRadius unrecognized.\n" );
984 <        return 0;
985 <        break;
986 <      }
987 <      break;
988 <      
989 <    case G_DIELECTRIC:
990 <      switch( the_type ){
991 <        
992 <      case STRING:
993 <        the_event->err_msg =
994 <          strdup( "Error in parsing meta-data file!\n\tdielectric is not a double or int.\n" );
995 <        return 0;
996 <        break;
997 <        
998 <      case DOUBLE:
999 <        dielectric = the_event->evt.asmt.rhs.dval;
1000 <        have_dielectric = 1;
1001 <        return 1;
1002 <        break;
1003 <        
1004 <      case INT:
1005 <        dielectric = (double)the_event->evt.asmt.rhs.ival;
1006 <        have_dielectric = 1;
1007 <        return 1;
1008 <        break;
1009 <        
1010 <      default:
1011 <        the_event->err_msg =
1012 <          strdup( "Error in parsing meta-data file!\n\tdielectric unrecognized.\n" );
1013 <        return 0;
1014 <        break;
1015 <      }
1016 <      break;
1017 <      
1018 <    case G_TEMPSET:
1019 <      if( the_type == STRING ){
1020 <        
1021 <        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) tempSet = 1;
1022 <        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) tempSet = 0;
1023 <        else{
1024 <          the_event->err_msg =
1025 <            strdup( "Error in parsing meta-data file!\n\ttempSet was not \"true\" or \"false\".\n" );
1026 <          return 0;
1027 <        }
1028 <        have_tempSet = 1;
1029 <        return 1;
1030 <      }
1031 <      
1032 <      the_event->err_msg =
1033 <        strdup( "Error in parsing meta-data file!\n\ttempSet was not \"true\" or \"false\".\n" );
1034 <      return 0;
1035 <      break;
315 >  std::string err("The following required keywords are missing:\n");
316 >  short int have_err = 0;
317  
318 <    case G_USEINITTIME:
319 <      if( the_type == STRING ){
320 <        
321 <        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) useInitTime = 1;
322 <        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) useInitTime = 0;
323 <        else{
1043 <          the_event->err_msg =
1044 <            strdup( "Error in parsing meta-data file!\n\tuseInitTime was not \"true\" or \"false\".\n" );
1045 <          return 0;
1046 <        }
1047 <        return 1;
1048 <      }
1049 <      
1050 <      the_event->err_msg =
1051 <        strdup( "Error in parsing meta-data file!\n\tuseInitTime was not \"true\" or \"false\".\n" );
1052 <      return 0;
1053 <      break;
318 >  ParamMap::iterator i;
319 >  for (i = parameters_.begin(); i != parameters_.end(); ++i) {
320 >    if (!i->second->isOptional() && i->second->empty()) {
321 >        err +=  i->second->getKeyword() + "\n";
322 >    }
323 >  }
324  
325 <    case G_USEINIT_XS_STATE:
326 <      if( the_type == STRING ){
327 <        
1058 <        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval ))
1059 <          useInitXSstate = 1;
1060 <        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval ))
1061 <          useInitXSstate = 0;
1062 <        else{
1063 <          the_event->err_msg =
1064 <            strdup( "Error in parsing meta-data file!\n\tuseInitExtendedSystemState was not \"true\" or \"false\".\n" );
1065 <          return 0;
1066 <        }
1067 <        return 1;
1068 <      }
1069 <      
1070 <      the_event->err_msg =
1071 <        strdup( "Error in parsing meta-data file!\n\tuseInitExtendedSystemState was not \"true\" or \"false\".\n" );
1072 <      return 0;
1073 <      break;
1074 <      
1075 <    case G_USEPBC:
1076 <      if( the_type == STRING ){
1077 <        
1078 <        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) usePBC = 1;
1079 <        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) usePBC = 0;
1080 <        else{
1081 <          the_event->err_msg =
1082 <            strdup( "Error in parsing meta-data file!\n\tusePeriodicBoundaryConditions was not \"true\" or \"false\".\n" );
1083 <          return 0;
1084 <        }
1085 <        return 1;
1086 <      }
1087 <      
1088 <      the_event->err_msg =
1089 <        strdup( "Error in parsing meta-data file!\n\tusePeriodicBoundaryConditions was not \"true\" or \"false\".\n" );
1090 <      return 0;
1091 <      break;
1092 <
1093 <    case G_USERF:
1094 <      if( the_type == STRING ){
1095 <        
1096 <        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) useRF = 1;
1097 <        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) useRF = 0;
1098 <        else{
1099 <          the_event->err_msg =
1100 <            strdup( "Error in parsing meta-data file!\n\tuseReactionField was not \"true\" or \"false\".\n" );
1101 <          return 0;
1102 <        }
1103 <        return 1;
1104 <      }
1105 <      
1106 <      the_event->err_msg =
1107 <        strdup( "Error in parsing meta-data file!\n\tuseReactionField was not \"true\" or \"false\".\n" );
1108 <      return 0;
1109 <      break;
1110 <
1111 <    case G_TARGETPRESSURE:
1112 <      switch( the_type ){
1113 <        
1114 <      case STRING:
1115 <        the_event->err_msg =
1116 <          strdup( "Error in parsing meta-data file!\n\ttargetPressure is not a double or int.\n" );
1117 <        return 0;
1118 <        break;
1119 <        
1120 <      case DOUBLE:
1121 <        target_pressure = the_event->evt.asmt.rhs.dval;
1122 <        have_target_pressure = 1;
1123 <        return 1;
1124 <        break;
1125 <        
1126 <      case INT:
1127 <        target_pressure = (double)the_event->evt.asmt.rhs.ival;
1128 <        have_target_pressure = 1;
1129 <        return 1;
1130 <        break;
1131 <        
1132 <      default:
1133 <        the_event->err_msg =
1134 <          strdup( "Error in parsing meta-data file!\n\ttargetPressure unrecognized.\n" );
1135 <        return 0;
1136 <        break;
1137 <      }
1138 <      break;
1139 <
1140 <    case G_TAUTHERMOSTAT:
1141 <      switch( the_type ){
1142 <        
1143 <      case STRING:
1144 <        the_event->err_msg =
1145 <          strdup( "Error in parsing meta-data file!\n\ttauThermostat is not a double or int.\n" );
1146 <        return 0;
1147 <        break;
1148 <        
1149 <      case DOUBLE:
1150 <        tau_thermostat = the_event->evt.asmt.rhs.dval;
1151 <        have_tau_thermostat = 1;
1152 <        return 1;
1153 <        break;
1154 <        
1155 <      case INT:
1156 <        tau_thermostat = (double)the_event->evt.asmt.rhs.ival;
1157 <        have_tau_thermostat = 1;
1158 <        return 1;
1159 <        break;
1160 <        
1161 <      default:
1162 <        the_event->err_msg =
1163 <          strdup( "Error in parsing meta-data file!\n\ttauThermostat unrecognized.\n" );
1164 <        return 0;
1165 <        break;
1166 <      }
1167 <      break;
1168 <
1169 <    case G_TAUBAROSTAT:
1170 <      switch( the_type ){
1171 <        
1172 <      case STRING:
1173 <        the_event->err_msg =
1174 <          strdup( "Error in parsing meta-data file!\n\ttauBarostat is not a double or int.\n" );
1175 <        return 0;
1176 <        break;
1177 <        
1178 <      case DOUBLE:
1179 <        tau_barostat = the_event->evt.asmt.rhs.dval;
1180 <        have_tau_barostat = 1;
1181 <        return 1;
1182 <        break;
1183 <        
1184 <      case INT:
1185 <        tau_barostat = (double)the_event->evt.asmt.rhs.ival;
1186 <        have_tau_barostat = 1;
1187 <        return 1;
1188 <        break;
1189 <        
1190 <      default:
1191 <        the_event->err_msg =
1192 <          strdup( "Error in parsing meta-data file!\n\ttauBarostat unrecognized.\n" );
1193 <        return 0;
1194 <        break;
1195 <      }
1196 <      break;
1197 <      
1198 <    case G_ZCONSTIME:
1199 <      switch( the_type ){
1200 <        
1201 <      case STRING:
1202 <        the_event->err_msg =
1203 <          strdup( "Error in parsing meta-data file!\n\tzcons_time is not a double or int.\n" );
1204 <        return 0;
1205 <        break;
1206 <        
1207 <      case DOUBLE:
1208 <        zcons_time = the_event->evt.asmt.rhs.dval;
1209 <        have_zcons_time = 1;
1210 <        return 1;
1211 <        break;
1212 <        
1213 <      case INT:
1214 <        zcons_time = (double)the_event->evt.asmt.rhs.ival;
1215 <        have_zcons_time = 1;
1216 <        return 1;
1217 <        break;
1218 <        
1219 <      default:
1220 <        the_event->err_msg =
1221 <          strdup( "Error in parsing meta-data file!\n\tzcons_time unrecognized.\n" );
1222 <        return 0;
1223 <        break;
1224 <      }
1225 <      break;
1226 <
1227 <    case G_ZCONSTOL:
1228 <      switch( the_type ){
1229 <        
1230 <      case STRING:
1231 <        the_event->err_msg =
1232 <          strdup( "Error in parsing meta-data file!\n\tzcons_tol is not a double or int.\n" );
1233 <        return 0;
1234 <        break;
1235 <        
1236 <      case DOUBLE:
1237 <        zcons_tol = the_event->evt.asmt.rhs.dval;
1238 <        have_zcons_tol = 1;
1239 <        return 1;
1240 <        break;
1241 <        
1242 <      case INT:
1243 <        zcons_tol = (double)the_event->evt.asmt.rhs.ival;
1244 <        have_zcons_tol = 1;
1245 <        return 1;
1246 <        break;
1247 <        
1248 <      default:
1249 <        the_event->err_msg =
1250 <          strdup( "Error in parsing meta-data file!\n\tzcons_ol unrecognized.\n" );
1251 <        return 0;
1252 <        break;
1253 <      }
1254 <      break;
1255 <  
1256 <    case G_ZCONSFORCEPOLICY:
1257 <      switch( the_type ){
1258 <        
1259 <      case STRING:
1260 <   strcpy(zconsForcePolicy, the_event->evt.asmt.rhs.sval);
1261 <
1262 <   for(int i = 0; zconsForcePolicy[i] != '\0'; i++)
1263 <        {
1264 <      zconsForcePolicy[i] = toupper(zconsForcePolicy[i]);
1265 <   }
1266 <        have_zcons_force_policy = 1;
1267 <   return 1;
1268 <        break;
1269 <        
1270 <      case DOUBLE:
1271 <        the_event->err_msg =
1272 <          strdup( "Error in parsing meta-data file!\n\tzconsForcePolicy is not a double or int.\n" );
1273 <        return 0;
1274 <        break;
1275 <        
1276 <      case INT:
1277 <        the_event->err_msg =
1278 <          strdup( "Error in parsing meta-data file!\n\tzconsForcePolicy is not a double or int.\n" );
1279 <        return 0;
1280 <        break;
1281 <        
1282 <      default:
1283 <        the_event->err_msg =
1284 <          strdup( "Error in parsing meta-data file!\n\tzconsForcePolicy unrecognized.\n" );
1285 <        return 0;
1286 <        break;
1287 <      }
1288 <      break;
1289 <      
1290 <    case G_ZCONSGAP:
1291 <      switch( the_type ){
325 >  //@todo memory leak
326 >  if( have_err )
327 >    return strdup( err.c_str() );
328    
329 <      case STRING:
1294 <        the_event->err_msg =
1295 <          strdup( "Error in parsing meta-data file!\n\tzcons_gap is not a double or int.\n" );
1296 <        return 0;
1297 <        break;
1298 <  
1299 <      case DOUBLE:
1300 <        zcons_gap = the_event->evt.asmt.rhs.dval;
1301 <        have_zcons_gap= 1;
1302 <        return 1;
1303 <        break;
1304 <  
1305 <      case INT:
1306 <        zcons_gap= (double)the_event->evt.asmt.rhs.ival;
1307 <        have_zcons_gap= 1;
1308 <        return 1;
1309 <        break;
1310 <  
1311 <      default:
1312 <        the_event->err_msg =
1313 <          strdup( "Error in parsing meta-data file!\n\tzcons_gap unrecognized.\n" );
1314 <        return 0;
1315 <        break;
1316 <      }
1317 <      break;
1318 <
1319 <    case G_ZCONSFIXTIME:
1320 <      switch( the_type ){
1321 <  
1322 <      case STRING:
1323 <        the_event->err_msg =
1324 <          strdup( "Error in parsing meta-data file!\n\tzcons_fixtime is not a double or int.\n" );
1325 <        return 0;
1326 <        break;
1327 <  
1328 <      case DOUBLE:
1329 <        zcons_fixtime= the_event->evt.asmt.rhs.dval;
1330 <        have_zcons_fixtime= 1;
1331 <        return 1;
1332 <        break;
1333 <  
1334 <      case INT:
1335 <        zcons_fixtime= (double)the_event->evt.asmt.rhs.ival;
1336 <        have_zcons_fixtime= 1;
1337 <        return 1;
1338 <        break;
1339 <  
1340 <      default:
1341 <        the_event->err_msg =
1342 <          strdup( "Error in parsing meta-data file!\n\tzcons_fixtime unrecognized.\n" );
1343 <        return 0;
1344 <        break;
1345 <      }
1346 <      break;
1347 <
1348 <    case G_ZCONSUSINGSMD:
1349 <      switch( the_type ){
1350 <  
1351 <      case STRING:
1352 <        the_event->err_msg =
1353 <          strdup( "Error in parsing meta-data file!\n\tzcons_fixtime is not an  int.\n" );
1354 <        return 0;
1355 <        break;
1356 <  
1357 <      case DOUBLE:
1358 <        the_event->err_msg =
1359 <          strdup( "Error in parsing meta-data file!\n\tzcons_fixtime is not an  int.\n" );
1360 <        return 0;
1361 <        break;
1362 <  
1363 <      case INT:
1364 <        zcons_using_smd= the_event->evt.asmt.rhs.ival;
1365 <        have_zcons_using_smd= 1;
1366 <        return 1;
1367 <        break;
1368 <  
1369 <      default:
1370 <        the_event->err_msg =
1371 <          strdup( "Error in parsing meta-data file!\n\tzcons_usingsmd unrecognized.\n" );
1372 <        return 0;
1373 <        break;
1374 <      }
1375 <      break;
1376 <      
1377 <    case G_MINIMIZER:
1378 <      switch( the_type ){
1379 <
1380 <      case STRING:
1381 <        strcpy(minimizer_name, the_event->evt.asmt.rhs.sval);
1382 <
1383 <        for(int i = 0; zconsForcePolicy[i] != '\0'; i++){
1384 <          zconsForcePolicy[i] = toupper(zconsForcePolicy[i]);
1385 <        }
1386 <        have_minimizer= 1;
1387 <        return 1;
1388 <        break;
1389 <        
1390 <      case DOUBLE:
1391 <        the_event->err_msg =
1392 <          strdup( "Error in parsing meta-data file!\n\tminimizer_name is not a double or int.\n" );
1393 <        return 0;
1394 <        break;
1395 <        
1396 <      case INT:
1397 <        the_event->err_msg =
1398 <          strdup( "Error in parsing meta-data file!\n\tminimizer_name is not a double or int.\n" );
1399 <        return 0;
1400 <        break;
1401 <        
1402 <      default:
1403 <        the_event->err_msg =
1404 <          strdup( "Error in parsing meta-data file!\n\tminimizer_name unrecognized.\n" );
1405 <        return 0;
1406 <        break;
1407 <      }
1408 <      break;
1409 <
1410 <    case G_MIN_MAXITER:
1411 <      switch( the_type ){
1412 <
1413 <      case STRING:
1414 <        the_event->err_msg =
1415 <          strdup( "Error in parsing meta-data file!\n\tminimizer_maxiteration is not a double or int.\n" );
1416 <        return 1;
1417 <        break;
1418 <        
1419 <      case DOUBLE:
1420 <        minimizer_maxiteration = (int)the_event->evt.asmt.rhs.dval;
1421 <        have_minimizer_maxiteration = 1;
1422 <        return 1;
1423 <        break;
1424 <        
1425 <      case INT:
1426 <        minimizer_maxiteration = the_event->evt.asmt.rhs.ival;
1427 <        have_minimizer_maxiteration = 1;
1428 <        return 1;
1429 <        break;
1430 <        
1431 <      default:
1432 <        the_event->err_msg =
1433 <          strdup( "Error in parsing meta-data file!\n\tminimizer_maxiteration unrecognized.\n" );
1434 <        return 0;
1435 <        break;
1436 <      }
1437 <      break;
1438 <      
1439 <    case G_MIN_WRITEFRQ:
1440 <      switch( the_type ){
1441 <
1442 <      case STRING:
1443 <        the_event->err_msg =
1444 <          strdup( "Error in parsing meta-data file!\n\tminimizer_writefrq is not an int.\n" );
1445 <        return 1;
1446 <        break;
1447 <        
1448 <      case DOUBLE:
1449 <        the_event->err_msg =
1450 <          strdup( "Error in parsing meta-data file!\n\tminimizer_writefrq is not an  int.\n" );
1451 <        return 1;
1452 <        break;
1453 <        
1454 <      case INT:
1455 <        minimizer_writefrq= the_event->evt.asmt.rhs.ival;
1456 <        have_minimizer_writefrq = 1;
1457 <        return 1;
1458 <        break;
1459 <        
1460 <      default:
1461 <        the_event->err_msg =
1462 <          strdup( "Error in parsing meta-data file!\n\tminimizer_writefrq unrecognized.\n" );
1463 <        return 0;
1464 <        break;
1465 <      }
1466 <      break;
1467 <
1468 <    case G_MIN_STEPSIZE:
1469 <      switch( the_type ){
1470 <
1471 <      case STRING:
1472 <        the_event->err_msg =
1473 <          strdup( "Error in parsing meta-data file!\n\tminimizer_resetfrq is not a double or int.\n" );
1474 <        return 1;
1475 <        break;
1476 <        
1477 <      case DOUBLE:
1478 <        minimizer_stepsize= the_event->evt.asmt.rhs.dval;
1479 <        have_minimizer_stepsize = 1;
1480 <        return 1;
1481 <        break;
1482 <        
1483 <      case INT:
1484 <        minimizer_stepsize= the_event->evt.asmt.rhs.ival;
1485 <        have_minimizer_stepsize = 1;
1486 <        return 1;
1487 <        break;
1488 <        
1489 <      default:
1490 <        the_event->err_msg =
1491 <          strdup( "Error in parsing meta-data file!\n\tminimizer_resetfrq unrecognized.\n" );
1492 <        return 0;
1493 <        break;
1494 <      }
1495 <      break;      
1496 <
1497 <    case G_MIN_FTOL:
1498 <      switch( the_type ){
329 >  return NULL;
330  
1500      case STRING:
1501        the_event->err_msg =
1502          strdup( "Error in parsing meta-data file!\n\tminimizer_ftol is not a double or int.\n" );
1503        return 1;
1504        break;
1505        
1506      case DOUBLE:
1507        minimizer_ftol= the_event->evt.asmt.rhs.dval;
1508        have_minimizer_ftol = 1;
1509        return 1;
1510        break;
1511        
1512      case INT:
1513        minimizer_ftol= the_event->evt.asmt.rhs.ival;
1514        have_minimizer_ftol = 1;
1515        return 1;
1516        break;
1517        
1518      default:
1519        the_event->err_msg =
1520          strdup( "Error in parsing meta-data file!\n\tminimizer_ftol unrecognized.\n" );
1521        return 0;
1522        break;
1523      }
1524      break;
1525      
1526    case G_MIN_GTOL:
1527      switch( the_type ){
331  
1529      case STRING:
1530        the_event->err_msg =
1531          strdup( "Error in parsing meta-data file!\n\tminimizer_gtol is not a double or int.\n" );
1532        return 1;
1533        break;
1534        
1535      case DOUBLE:
1536        minimizer_gtol= the_event->evt.asmt.rhs.dval;
1537        have_minimizer_gtol = 1;
1538        return 1;
1539        break;
1540        
1541      case INT:
1542        minimizer_gtol= the_event->evt.asmt.rhs.ival;
1543        have_minimizer_gtol = 1;
1544        return 1;
1545        break;
1546        
1547      default:
1548        the_event->err_msg =
1549          strdup( "Error in parsing meta-data file!\n\tminimizer_gtol unrecognized.\n" );
1550        return 0;
1551        break;
1552      }
1553      break;
1554      
1555    case G_MIN_LSMAXITER:
1556      switch( the_type ){
1557
1558      case STRING:
1559        the_event->err_msg =
1560          strdup( "Error in parsing meta-data file!\n\tminimizer_ls_maxiteration is not an int.\n" );
1561        return 1;
1562        break;
1563        
1564      case DOUBLE:
1565        the_event->err_msg =
1566          strdup( "Error in parsing meta-data file!\n\tminimizer_ls_maxiteration is not an int.\n" );
1567        return 1;
1568        break;
1569        
1570      case INT:
1571        minimizer_ls_maxiteration = the_event->evt.asmt.rhs.ival;
1572        have_minimizer_ls_maxiteration = 1;
1573        return 1;
1574        break;
1575        
1576      default:
1577        the_event->err_msg =
1578          strdup( "Error in parsing meta-data file!\n\tminimizer_ls_maxiteration unrecognized.\n" );
1579        return 0;
1580        break;
1581      }
1582      break;      
1583
1584    case G_MIN_LSTOL:
1585      switch( the_type ){
1586
1587      case STRING:
1588        the_event->err_msg =
1589          strdup( "Error in parsing meta-data file!\n\tminimizer_ls_tol is not a double or int.\n" );
1590        return 1;
1591        break;
1592        
1593      case DOUBLE:
1594        minimizer_ls_tol= the_event->evt.asmt.rhs.dval;
1595        have_minimizer_ls_tol = 1;
1596        return 1;
1597        break;
1598        
1599      case INT:
1600        minimizer_ls_tol= the_event->evt.asmt.rhs.ival;
1601        have_minimizer_ls_tol = 1;
1602        return 1;
1603        break;
1604        
1605      default:
1606        the_event->err_msg =
1607          strdup( "Error in parsing meta-data file!\n\tminimizer_ls_tol unrecognized.\n" );
1608        return 0;
1609        break;
1610      }
1611      break;
1612      
1613      // add more token cases here.
1614    case G_SEED:
1615      switch( the_type ){
1616        
1617      case STRING:
1618   the_event->err_msg =
1619          strdup( "Error in parsing meta-data file!\n\tseed is not a string.\n" );
1620        return 0;
1621   return 0;
1622        break;
1623        
1624      case DOUBLE:
1625   have_seed = 1;
1626   seed = (int)the_event->evt.asmt.rhs.dval;
1627        return 1;
1628        break;
1629        
1630      case INT:
1631   have_seed = 1;
1632   seed =  the_event->evt.asmt.rhs.ival ;
1633        return 1;
1634        break;
1635        
1636      default:
1637        the_event->err_msg =
1638          strdup( "Error in parsing meta-data file!\n\tseed unrecognized.\n" );
1639        return 0;
1640        break;
1641      }
1642      break;
1643
1644    case G_USE_SOLID_THERM_INT:
1645      if( the_type == STRING ){
1646        
1647        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) useSolidThermInt = 1;
1648        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) useSolidThermInt = 0;
1649        else{
1650          the_event->err_msg =
1651            strdup( "Error in parsing meta-data file!\n\tuseSolidThermInt was not \"true\" or \"false\".\n" );
1652          return 0;
1653        }
1654        return 1;
1655      }
1656      
1657      the_event->err_msg =
1658        strdup( "Error in parsing meta-data file!\n\tuseSolidThermInt was not \"true\" or \"false\".\n" );
1659      return 0;
1660      break;
1661
1662    case G_USE_LIQUID_THERM_INT:
1663      if( the_type == STRING ){
1664        
1665        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) useLiquidThermInt = 1;
1666        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) useLiquidThermInt = 0;
1667        else{
1668          the_event->err_msg =
1669            strdup( "Error in parsing meta-data file!\n\tuseLiquidThermInt was not \"true\" or \"false\".\n" );
1670          return 0;
1671        }
1672        return 1;
1673      }
1674      
1675      the_event->err_msg =
1676        strdup( "Error in parsing meta-data file!\n\tuseLiquidThermInt was not \"true\" or \"false\".\n" );
1677      return 0;
1678      break;
1679
1680    case G_THERM_INT_LAMBDA:
1681      switch( the_type ){
1682        
1683      case STRING:
1684        the_event->err_msg =
1685          strdup( "Error in parsing meta-data file!\n\tthermodynamicIntegrationLambda is not a double or int.\n" );
1686        return 1;
1687        break;
1688        
1689      case DOUBLE:
1690        thermodynamic_integration_lambda = the_event->evt.asmt.rhs.dval;
1691        have_thermodynamic_integration_lambda = 1;
1692        return 1;
1693        break;
1694        
1695      case INT:
1696        thermodynamic_integration_lambda = (double)the_event->evt.asmt.rhs.dval;
1697        have_thermodynamic_integration_lambda = 1;
1698        return 1;
1699        break;
1700        
1701      default:
1702        the_event->err_msg =
1703          strdup( "Error in parsing meta-data file!\n\tthermodynamicIntegrationLambda unrecognized.\n" );
1704        return 0;
1705        break;
1706      }
1707      break;      
1708
1709    case G_THERM_INT_K:
1710      switch( the_type ){
1711        
1712      case STRING:
1713        the_event->err_msg =
1714          strdup( "Error in parsing meta-data file!\n\tthermodynamicIntegrationK is not a double or int.\n" );
1715        return 1;
1716        break;
1717        
1718      case DOUBLE:
1719        thermodynamic_integration_k = the_event->evt.asmt.rhs.dval;
1720        have_thermodynamic_integration_k = 1;
1721        return 1;
1722        break;
1723        
1724      case INT:
1725        thermodynamic_integration_k = (double)the_event->evt.asmt.rhs.dval;
1726        have_thermodynamic_integration_k = 1;
1727        return 1;
1728        break;
1729        
1730      default:
1731        the_event->err_msg =
1732          strdup( "Error in parsing meta-data file!\n\tthermodynamicIntegrationK unrecognized.\n" );
1733        return 0;
1734        break;
1735      }
1736      break;  
1737  
1738    case G_FORCEFIELD_VARIANT:
1739      if( the_type == STRING ){
1740        strcpy( forcefield_variant, the_event->evt.asmt.rhs.sval );
1741        have_forcefield_variant = 1;
1742        return 1;
1743      }
1744      
1745      the_event->err_msg =
1746        strdup( "Error in parsing meta-data file!\n\tforceFieldVariant was not a string assignment.\n" );
1747      return 0;
1748      break;      
1749      // add more token cases here.      
1750
1751    case G_FORCEFIELD_FILENAME:
1752      if( the_type == STRING ){
1753        strcpy( forcefield_filename, the_event->evt.asmt.rhs.sval );
1754        have_forcefield_filename = 1;
1755        return 1;
1756      }
1757      
1758      the_event->err_msg =
1759        strdup( "Error in parsing meta-data file!\n\tforceFieldFileName was not a string assignment.\n" );
1760      return 0;
1761      break;      
1762
1763    case G_THERM_INT_DIST_SPRING:
1764      switch( the_type ){
1765        
1766      case STRING:
1767        the_event->err_msg =
1768          strdup( "Error in parsing meta-data file!\n\tthermIntDistSpringConst is not a double or int.\n" );
1769        return 1;
1770        break;
1771        
1772      case DOUBLE:
1773        therm_int_dist_spring = the_event->evt.asmt.rhs.dval;
1774        have_dist_spring_constant = 1;
1775        return 1;
1776        break;
1777        
1778      case INT:
1779        therm_int_dist_spring = (double)the_event->evt.asmt.rhs.dval;
1780        have_dist_spring_constant = 1;
1781        return 1;
1782        break;
1783        
1784      default:
1785        the_event->err_msg =
1786          strdup( "Error in parsing meta-data file!\n\tthermIntDistSpringConst unrecognized.\n" );
1787        return 0;
1788        break;
1789      }
1790      break;  
1791
1792    case G_THERM_INT_THETA_SPRING:
1793      switch( the_type ){
1794        
1795      case STRING:
1796        the_event->err_msg =
1797          strdup( "Error in parsing meta-data file!\n\tthermIntThetaSpringConst is not a double or int.\n" );
1798        return 1;
1799        break;
1800        
1801      case DOUBLE:
1802        therm_int_theta_spring = the_event->evt.asmt.rhs.dval;
1803        have_theta_spring_constant = 1;
1804        return 1;
1805        break;
1806        
1807      case INT:
1808        therm_int_theta_spring = (double)the_event->evt.asmt.rhs.dval;
1809        have_theta_spring_constant = 1;
1810        return 1;
1811        break;
1812        
1813      default:
1814        the_event->err_msg =
1815          strdup( "Error in parsing meta-data file!\n\tthermIntThetaSpringConst unrecognized.\n" );
1816        return 0;
1817        break;
1818      }
1819      break;
1820
1821       case G_THERM_INT_OMEGA_SPRING:
1822      switch( the_type ){
1823        
1824      case STRING:
1825        the_event->err_msg =
1826          strdup( "Error in parsing meta-data file!\n\tthermIntOmegaSpringConst is not a double or int.\n" );
1827        return 1;
1828        break;
1829        
1830      case DOUBLE:
1831        therm_int_omega_spring = the_event->evt.asmt.rhs.dval;
1832        have_omega_spring_constant = 1;
1833        return 1;
1834        break;
1835        
1836      case INT:
1837        therm_int_omega_spring = (double)the_event->evt.asmt.rhs.dval;
1838        have_omega_spring_constant = 1;
1839        return 1;
1840        break;
1841        
1842      default:
1843        the_event->err_msg =
1844          strdup( "Error in parsing meta-data file!\n\tthermIntOmegaSpringConst unrecognized.\n" );
1845        return 0;
1846        break;
1847      }
1848      break;  
1849      // add more token cases here.      
1850    }
1851  }
1852  
1853  switch( the_type ){
1854    
1855  case STRING:
1856    sprintf( err,
1857             "\tUnrecognized assignment:\n"
1858             "\t\t-> %s = %s\n",
1859             lhs, the_event->evt.asmt.rhs.sval );
1860    break;
1861    
1862  case DOUBLE:
1863    sprintf( err,
1864             "\tUnrecognized assignment:\n"
1865             "\t\t-> %s = %lf\n",
1866             lhs, the_event->evt.asmt.rhs.dval );
1867    break;
1868    
1869  case INT:
1870    sprintf( err,
1871             "\tUnrecognized assignment:\n"
1872             "\t\t-> %s = %d\n",
1873             lhs, the_event->evt.asmt.rhs.ival );
1874    break;
1875    
1876  default:
1877    sprintf( err,
1878             "\tUnrecognized assignment:\n"
1879             "\t\t-> %s = ?\n",
1880             lhs );
1881    break;
1882  }
1883  
1884  the_event->err_msg = strdup( err );
1885  return 0;
332   }
333  
1888 char* Globals::checkMe( void ){
1889  
1890  char err[300];
1891  short int have_err = 0;
1892
1893  strcpy( err, "The following required keywords are missing:\n" );
1894  
1895  if( !have_force_field ){
1896    strcat( err, "\t\t->forceField\n" );
1897    have_err= 1;
1898  }
1899
1900  if( !have_n_components ){
1901    strcat( err, "\t\t->nComponents\n" );
1902    have_err= 1;
1903  }
1904
1905  
1906  if ( !have_ensemble ) {
1907    // I'm not doing MD:
1908    if ( !have_minimizer ) {
1909      // I'm not doing MD or minimization:
1910      strcat( err, "\t\t->either ensemble or minimizer must be set!\n" );
1911      have_err = 1;      
1912    } else {
1913      // I'm a minimizer:
1914    }
1915  } else {
1916    // I *am* doing MD:
1917    if( !have_dt ){
1918      strcat( err, "\t\t->dt (timestep in fs)\n" );
1919      have_err= 1;
1920    }
1921    if( !have_run_time ){
1922      strcat( err, "\t\t->runTime (total run time in fs)\n" );
1923      have_err= 1;
1924    }    
1925  }
1926      
1927  if( have_err ) return strdup( err );
1928  
1929  return NULL;
1930 }
1931
334   int Globals::globalEnd( event* the_event ){
335    
336    the_event->err_msg = checkMe();
# Line 1936 | Line 338 | int Globals::globalEnd( event* the_event ){
338  
339    return 1;
340   }
1939
1940 int Globals::hash( char* text ){
1941
1942  register unsigned short int i = 0; // loop counter
1943  int key = 0; // the hash key
1944  
1945  while( text[i] != '\0' ){
1946    
1947    key = ( ( key << hash_shift ) + text[i] ) % hash_size;
1948    
1949    i++;
1950  }
1951  
1952  if( key < 0 ){
1953
1954    // if the key is less than zero, we've had an overflow error
1955
1956    sprintf( painCave.errMsg,
1957             "There has been an overflow error in the Globals' hash key.");
1958    painCave.isFatal = 1;
1959    simError();
1960 #ifdef IS_MPI
1961    if( painCave.isEventLoop ){
1962      if( worldRank == 0 ) mpiInterfaceExit();
1963    }
1964 #endif //is_mpi
1965  }
1966  
1967  return key;
1968 }
1969
1970 void Globals::addHash( char* text, int token ){
1971
1972  int key;
1973  LinkedCommand* the_element;
1974
1975  the_element = new LinkedCommand;
1976  the_element->setValues( text, token );
1977
1978  key = hash( text );
1979
1980  the_element->setNext( command_table[key] );
1981  command_table[key] = the_element;
1982 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines