ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/io/Globals.cpp
(Generate patch)

Comparing trunk/src/io/Globals.cpp (file contents):
Revision 246 by gezelter, Wed Jan 12 22:41:40 2005 UTC vs.
Revision 726 by chrisfen, Fri Nov 11 15:22:11 2005 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines