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

Comparing trunk/OOPSE-3.0/src/io/Globals.cpp (file contents):
Revision 2101 by chrisfen, Thu Mar 10 15:10:24 2005 UTC vs.
Revision 2464 by gezelter, Mon Nov 21 22:59:36 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  
53 < /*
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 > #include "io/ParamConstraint.hpp"
54  
55 < //required parameters
61 < #define G_FORCEFIELD         1
62 < #define G_NCOMPONENTS        2
63 < #define G_TARGETTEMP         3
64 < #define G_ENSEMBLE           4
65 < #define G_DT                 5
66 < #define G_RUNTIME            6
55 > using namespace oopse;
56  
68 //optional parameters
69 #define G_INITIALCONFIG      7
70 #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
119
57   Globals::Globals(){
58 <  initalize();
58 >
59 >  DefineParameter(ForceField, "forceField")
60 >  DefineParameter(NComponents, "nComponents")
61 >
62 >  DefineOptionalParameter(TargetTemp, "targetTemp");
63 >  DefineOptionalParameter(Ensemble, "ensemble");
64 >  DefineOptionalParameter(Dt, "dt");
65 >  DefineOptionalParameter(RunTime, "runTime");
66 >  DefineOptionalParameter(InitialConfig, "initialConfig");
67 >  DefineOptionalParameter(FinalConfig, "finalConfig");
68 >  DefineOptionalParameter(NMol, "nMol");
69 >  DefineOptionalParameter(Density, "density");
70 >  DefineOptionalParameter(Box, "box");
71 >  DefineOptionalParameter(BoxX, "boxX");
72 >  DefineOptionalParameter(BoxY, "boxY");
73 >  DefineOptionalParameter(BoxZ, "boxZ");
74 >  DefineOptionalParameter(SampleTime, "sampleTime");
75 >  DefineOptionalParameter(ResetTime, "resetTime");
76 >  DefineOptionalParameter(StatusTime, "statusTime");
77 >  DefineOptionalParameter(CutoffRadius, "cutoffRadius");
78 >  DefineOptionalParameter(SwitchingRadius, "switchingRadius");
79 >  DefineOptionalParameter(Dielectric, "dielectric");
80 >  DefineOptionalParameter(TempSet, "tempSet");
81 >  DefineOptionalParameter(ThermalTime, "thermalTime");
82 >  DefineOptionalParameter(TargetPressure, "targetPressure");
83 >  DefineOptionalParameter(TauThermostat, "tauThermostat");
84 >  DefineOptionalParameter(TauBarostat, "tauBarostat");
85 >  DefineOptionalParameter(ZconsTime, "zconsTime");
86 >  DefineOptionalParameter(NZconstraints, "nZconstraints");  
87 >  DefineOptionalParameter(ZconsTol, "zconsTol");
88 >  DefineOptionalParameter(ZconsForcePolicy, "zconsForcePolicy");
89 >  DefineOptionalParameter(Seed, "seed");
90 >  DefineOptionalParameter(Minimizer, "minimizer");
91 >  DefineOptionalParameter(MinimizerMaxIter,"minimizerMaxIter");
92 >  DefineOptionalParameter(MinimizerWriteFrq, "minimizerWriteFrq");
93 >  DefineOptionalParameter(MinimizerStepSize, "minimizerStepSize");
94 >  DefineOptionalParameter(MinimizerFTol, "minimizerFTol");
95 >  DefineOptionalParameter(MinimizerGTol, "minimizerGTol");
96 >  DefineOptionalParameter(MinimizerLSTol, "minimizerLSTol");
97 >  DefineOptionalParameter(MinimizerLSMaxIter, "minimizerLSMaxIter");
98 >  DefineOptionalParameter(ZconsGap, "zconsGap");
99 >  DefineOptionalParameter(ZconsFixtime, "zconsFixtime");
100 >  DefineOptionalParameter(ZconsUsingSMD, "zconsUsingSMD");
101 >  DefineOptionalParameter(ThermodynamicIntegrationLambda, "thermodynamicIntegrationLambda");
102 >  DefineOptionalParameter(ThermodynamicIntegrationK, "thermodynamicIntegrationK");
103 >  DefineOptionalParameter(ForceFieldVariant, "forceFieldVariant");
104 >  DefineOptionalParameter(ForceFieldFileName, "forceFieldFileName");
105 >  DefineOptionalParameter(ThermIntDistSpringConst, "thermIntDistSpringConst");
106 >  DefineOptionalParameter(ThermIntThetaSpringConst, "thermIntThetaSpringConst");
107 >  DefineOptionalParameter(ThermIntOmegaSpringConst, "thermIntOmegaSpringConst");
108 >  DefineOptionalParameter(SurfaceTension, "surfaceTension");
109 >  DefineOptionalParameter(PrintPressureTensor, "printPressureTensor");
110 >  DefineOptionalParameter(ElectrostaticSummationMethod, "electrostaticSummationMethod");
111 >  DefineOptionalParameter(ElectrostaticScreeningMethod, "electrostaticScreeningMethod");
112 >  DefineOptionalParameter(CutoffPolicy, "cutoffPolicy");
113 >  DefineOptionalParameter(SwitchingFunctionType, "switchingFunctionType");
114 >  DefineOptionalParameterWithDefaultValue(MixingRule, "mixingRule", "standard");
115 >  DefineOptionalParameterWithDefaultValue(UsePeriodicBoundaryConditions, "usePeriodicBoundaryConditions", true);
116 >  DefineOptionalParameterWithDefaultValue(UseInitalTime, "useInitialTime", false);
117 >  DefineOptionalParameterWithDefaultValue(UseIntialExtendedSystemState, "useInitialExtendedSystemState", false);
118 >  DefineOptionalParameterWithDefaultValue(OrthoBoxTolerance, "orthoBoxTolerance", 1E-6);  
119 >  DefineOptionalParameterWithDefaultValue(UseSolidThermInt, "useSolidThermInt", false);
120 >  DefineOptionalParameterWithDefaultValue(UseLiquidThermInt, "useLiquidThermInt", false);
121 >  DefineOptionalParameterWithDefaultValue(ThermIntDistSpringConst, "thermIntDistSpringConst", 6.0);
122 >  DefineOptionalParameterWithDefaultValue(ThermIntThetaSpringConst, "thermIntThetaSpringConst", 7.5);
123 >  DefineOptionalParameterWithDefaultValue(ThermIntOmegaSpringConst, "thermIntOmegaSpringConst", 13.5);
124 >  DefineOptionalParameterWithDefaultValue(DampingAlpha, "dampingAlpha", 0.2);
125 >  DefineOptionalParameterWithDefaultValue(CompressDumpFile, "compressDumpFile", 0);
126 >  DefineOptionalParameterWithDefaultValue(OutputForceVector, "outputForceVector", 0);
127 >  DefineOptionalParameterWithDefaultValue(SkinThickness, "skinThickness", 1.0);
128 >  DefineOptionalParameterWithDefaultValue(StatFileFormat, "statFileFormat", "TIME|TOTAL_ENERGY|POTENTIAL_ENERGY|KINETIC_ENERGY|TEMPERATURE|PRESSURE|VOLUME|CONSERVED_QUANTITY");    
129 >
130 >  
131   }
132  
133   Globals::~Globals(){
134    int i;
126
127  for( i=0; i<hash_size; i++ ){
128    if( command_table[i] != NULL ) delete command_table[i];
129  }
130  delete[] command_table;
131
135    if( components != NULL ){
136 <    for( i=0; i<n_components; i++ ) delete components[i];
136 >    for( i=0; i< getNComponents(); i++ ) delete components[i];
137      delete[] components;
138    }
136 }
137
138 void Globals::initalize(){
139  int i;
139    
140 <  hash_size = 23;
141 <  hash_shift = 4;
140 >  if( zConstraints != NULL ){
141 >    for( i=0; i< getNZconstraints(); i++ ) delete zConstraints[i];
142 >    delete[] zConstraints;
143 >  }
144    
145 <  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);
145 > }
146  
147 <  strcpy( mixingRule,"standard");  //default mixing rules to standard.
148 <  usePBC = 1; //default  periodic boundry conditions to on
149 <  useRF  = 0;
150 <  useInitTime = 0; // default to pull init time from the init file
151 <  useInitXSstate = 0; // default to pull the extended state from the init file
152 <  orthoBoxTolerance = 1E-6;
214 <  useSolidThermInt = 0; // default solid-state thermodynamic integration to off
215 <  useLiquidThermInt = 0; // default liquid thermodynamic integration to off
147 > int Globals::globalAssign( event* the_event ){
148 >  char errorMessage[65535];
149 >  int key;
150 >  interface_assign_type the_type =  the_event->evt.asmt.asmt_type;
151 >  char* lhs = the_event->evt.asmt.lhs;
152 >  std::string keyword(lhs);
153  
154 <  have_force_field =  0;
155 <  have_n_components = 0;
156 <  have_target_temp =  0;
157 <  have_ensemble =     0;
158 <  have_dt =           0;
159 <  have_run_time =     0;
154 >  bool result = false;
155 >
156 >  /**@todo fix memory leak */  
157 >  ParamMap::iterator i =parameters_.find(keyword);
158 >  if (i != parameters_.end()) {
159 >    if( the_type == STRING ){
160 >       result = i->second->setData(std::string(the_event->evt.asmt.rhs.sval));
161 >       if (!result ) {
162 >            sprintf(errorMessage, "Error in parsing %s: expect %s, but get a string \"%s\".\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.sval);
163 >            the_event->err_msg = strdup(errorMessage);
164 >       }
165 >    } else if( the_type == DOUBLE ){
166 >      result = i->second->setData(the_event->evt.asmt.rhs.dval);
167 >       if (!result )
168 >         sprintf(errorMessage, "Error in parsing %s: expect %s, but get a double %f.\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.dval );
169 >       the_event->err_msg = strdup(errorMessage);
170 >    }      
171 >    else if (the_type == INT ){
172 >      result = i->second->setData(the_event->evt.asmt.rhs.ival);
173 >       if (!result )
174 >         sprintf(errorMessage,  "Error in parsing %s: expect %s, but get an int %d.\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.ival );
175 >       the_event->err_msg = strdup(errorMessage);
176 >      
177 >    } else {
178 >        sprintf(errorMessage,  "Internal error of parser\n");
179 >        the_event->err_msg = strdup(errorMessage);
180 >    }
181 >  } else {
182 >    sprintf(errorMessage,  "%s is an unrecognized keyword\n", keyword.c_str() );
183 >    the_event->err_msg = strdup(errorMessage);
184 >  }
185 >
186 >  if (keyword == "nComponents" && getNComponents() > 0) {
187 >    components = new Component*[getNComponents()];
188 >  }else if (keyword == "nZconstraints" && getNZconstraints() > 0) {
189 >    zConstraints = new ZconStamp*[getNZconstraints()];
190 >  }
191    
192 <  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;
192 >  return result;
193   }
194  
195   int Globals::newComponent( event* the_event ){
# Line 273 | Line 198 | int Globals::newComponent( event* the_event ){
198    int index = the_event->evt.blk_index;
199    char err[200];
200    
201 <  if( have_n_components && index < n_components )
201 >  if( haveNComponents() && index < getNComponents() )
202      components[index] = current_component;
203    else{
204 <    if( have_n_components ){
204 >    if( haveNComponents()  ){
205        sprintf( err, "meta-data parsing error: %d out of nComponents range",
206                 index );
207        the_event->err_msg = strdup( err );
# Line 340 | Line 265 | int Globals::newZconstraint( event* the_event ){
265    char err[200];
266    current_zConstraint = new ZconStamp( index );
267    
268 <  have_zConstraints = 1;
344 <
345 <  if( have_n_zConstraints && index < n_zConstraints )
268 >  if( haveNZconstraints() && index < getNZconstraints() )
269      zConstraints[index] = current_zConstraint;
270    else{
271 <    if( have_n_zConstraints ){
271 >    if( haveNZconstraints() ){
272        sprintf( err, "meta-data parsing error: %d out of nZconstraints range",
273                 index );
274        the_event->err_msg = strdup( err );
# Line 358 | Line 281 | int Globals::newZconstraint( event* the_event ){
281        return 0;
282      }
283    }  
284 <
284 >
285    return 1;
286   }
287  
# Line 403 | Line 326 | int Globals::globalAssign( event* the_event ){
326    return 1;
327   }
328  
329 < 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;
329 > char* Globals::checkMe( void ){
330  
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;
331  
332 <    case G_ORTHOBOXTOLERANCE:
333 <      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;
332 >  std::string err("The following required keywords are missing:\n");
333 >  short int have_err = 0;
334  
335 <    case G_RESETTIME:
336 <      switch( the_type ){
337 <        
338 <      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;
1036 <
1037 <    case G_USEINITTIME:
1038 <      if( the_type == STRING ){
1039 <        
1040 <        if( !strcasecmp( "true", the_event->evt.asmt.rhs.sval )) useInitTime = 1;
1041 <        else if( !strcasecmp( "false", the_event->evt.asmt.rhs.sval )) useInitTime = 0;
1042 <        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;
1054 <
1055 <    case G_USEINIT_XS_STATE:
1056 <      if( the_type == STRING ){
1057 <        
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 ){
1292 <  
1293 <      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 ){
1499 <
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 ){
1528 <
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.      
335 >  ParamMap::iterator i;
336 >  for (i = parameters_.begin(); i != parameters_.end(); ++i) {
337 >    if (!i->second->isOptional() && i->second->empty()) {
338 >        err +=  i->second->getKeyword() + "\n";
339      }
340    }
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;
1886 }
341  
342 < char* Globals::checkMe( void ){
342 >  CheckParameter(ForceField, isNotEmpty());
343 >  CheckParameter(NComponents,isPositive());
344 >  CheckParameter(TargetTemp, isPositive());
345 >  CheckParameter(Ensemble, isEqualIgnoreCase(std::string("NVE")) || isEqualIgnoreCase(std::string("NVT")) || isEqualIgnoreCase(std::string("NPTi")) || isEqualIgnoreCase(std::string("NPTf")) || isEqualIgnoreCase(std::string("NPTxyz")) );
346 >  CheckParameter(Dt, isPositive());
347 >  CheckParameter(RunTime, isPositive());
348 >  CheckParameter(InitialConfig, isNotEmpty());
349 >  CheckParameter(FinalConfig, isNotEmpty());
350 >  CheckParameter(NMol, isPositive());
351 >  CheckParameter(Density, isPositive());
352 >  CheckParameter(Box, isPositive());
353 >  CheckParameter(BoxX, isPositive());
354 >  CheckParameter(BoxY, isPositive());
355 >  CheckParameter(BoxZ, isPositive());
356 >  CheckParameter(SampleTime, isNonNegative());
357 >  CheckParameter(ResetTime, isNonNegative());
358 >  CheckParameter(StatusTime, isNonNegative());
359 >  CheckParameter(CutoffRadius, isPositive());
360 >  CheckParameter(SwitchingRadius, isNonNegative());
361 >  CheckParameter(Dielectric, isPositive());
362 >  CheckParameter(ThermalTime,  isNonNegative());
363 >  CheckParameter(TargetPressure,  isPositive());
364 >  CheckParameter(TauThermostat, isPositive());
365 >  CheckParameter(TauBarostat, isPositive());
366 >  CheckParameter(ZconsTime, isPositive());
367 >  CheckParameter(NZconstraints, isPositive());  
368 >  CheckParameter(ZconsTol, isPositive());
369 >  //CheckParameter(ZconsForcePolicy,);
370 >  CheckParameter(Seed, isPositive());
371 >  CheckParameter(Minimizer, isEqualIgnoreCase(std::string("SD")) || isEqualIgnoreCase(std::string("CG")));
372 >  CheckParameter(MinimizerMaxIter, isPositive());
373 >  CheckParameter(MinimizerWriteFrq, isPositive());
374 >  CheckParameter(MinimizerStepSize, isPositive());
375 >  CheckParameter(MinimizerFTol, isPositive());
376 >  CheckParameter(MinimizerGTol, isPositive());
377 >  CheckParameter(MinimizerLSTol, isPositive());
378 >  CheckParameter(MinimizerLSMaxIter, isPositive());
379 >  CheckParameter(ZconsGap, isPositive());
380 >  CheckParameter(ZconsFixtime, isPositive());
381 >  CheckParameter(ThermodynamicIntegrationLambda, isPositive());
382 >  CheckParameter(ThermodynamicIntegrationK, isPositive());
383 >  CheckParameter(ForceFieldVariant, isNotEmpty());
384 >  CheckParameter(ForceFieldFileName, isNotEmpty());
385 >  CheckParameter(ThermIntDistSpringConst, isPositive());
386 >  CheckParameter(ThermIntThetaSpringConst, isPositive());
387 >  CheckParameter(ThermIntOmegaSpringConst, isPositive());
388 >  CheckParameter(SurfaceTension, isPositive());
389 >  CheckParameter(ElectrostaticSummationMethod, isEqualIgnoreCase(std::string("NONE")) || isEqualIgnoreCase(std::string("SHIFTED_POTENTIAL")) || isEqualIgnoreCase(std::string("SHIFTED_FORCE")) || isEqualIgnoreCase(std::string("REACTION_FIELD")));
390 >  CheckParameter(ElectrostaticScreeningMethod, isEqualIgnoreCase(std::string("UNDAMPED")) || isEqualIgnoreCase(std::string("DAMPED")));
391 >  CheckParameter(CutoffPolicy, isEqualIgnoreCase(std::string("MIX")) || isEqualIgnoreCase(std::string("MAX")) || isEqualIgnoreCase(std::string("TRADITIONAL")));
392 >  CheckParameter(SwitchingFunctionType, isEqualIgnoreCase(std::string("CUBIC")) || isEqualIgnoreCase(std::string("FIFTH_ORDER_POLYNOMIAL")));
393 >  //CheckParameter(StatFileFormat,);    
394 >  //CheckParameter(MixingRule,);
395 >  CheckParameter(OrthoBoxTolerance, isPositive());  
396 >  CheckParameter(ThermIntDistSpringConst, isPositive());
397 >  CheckParameter(ThermIntThetaSpringConst, isPositive());
398 >  CheckParameter(ThermIntOmegaSpringConst, isPositive());
399 >  CheckParameter(DampingAlpha,isNonNegative());
400 >  CheckParameter(SkinThickness, isPositive());
401    
402 <  char err[300];
403 <  short int have_err = 0;
404 <
1893 <  strcpy( err, "The following required keywords are missing:\n" );
402 >  //@todo memory leak
403 >  if( have_err )
404 >    return strdup( err.c_str() );
405    
406 <  if( !have_force_field ){
1896 <    strcat( err, "\t\t->forceField\n" );
1897 <    have_err= 1;
1898 <  }
406 >  return NULL;
407  
1900  if( !have_n_components ){
1901    strcat( err, "\t\t->nComponents\n" );
1902    have_err= 1;
1903  }
408  
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;
409   }
410  
411   int Globals::globalEnd( event* the_event ){
# Line 1936 | Line 415 | int Globals::globalEnd( event* the_event ){
415  
416    return 1;
417   }
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