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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines