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

Comparing trunk/OOPSE-2.0/src/io/Globals.cpp (file contents):
Revision 2088 by gezelter, Tue Mar 8 21:07:14 2005 UTC vs.
Revision 2364 by tim, Thu Oct 13 22:26:47 2005 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines