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 273 by tim, Tue Jan 25 17:45:23 2005 UTC vs.
Revision 1423 by gezelter, Tue Mar 30 15:05:13 2010 UTC

# Line 1 | Line 1
1 < /*
2 < * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
1 > /*
2 > * Copyright (c) 2005, 2010 The University of Notre Dame. All Rights Reserved.
3   *
4   * The University of Notre Dame grants you ("Licensee") a
5   * non-exclusive, royalty free, license to use, modify and
6   * redistribute this software in source and binary code form, provided
7   * that the following conditions are met:
8   *
9 < * 1. Acknowledgement of the program authors must be made in any
10 < *    publication of scientific results based in part on use of the
11 < *    program.  An acceptable form of acknowledgement is citation of
12 < *    the article in which the program was described (Matthew
13 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 < *    Parallel Simulation Engine for Molecular Dynamics,"
16 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 < *
18 < * 2. Redistributions of source code must retain the above copyright
9 > * 1. Redistributions of source code must retain the above copyright
10   *    notice, this list of conditions and the following disclaimer.
11   *
12 < * 3. Redistributions in binary form must reproduce the above copyright
12 > * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the
15   *    distribution.
# Line 37 | Line 28
28   * arising out of the use of or inability to use software, even if the
29   * University of Notre Dame has been advised of the possibility of
30   * such damages.
31 + *
32 + * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
33 + * research, please cite the appropriate papers when you publish your
34 + * work.  Good starting points are:
35 + *                                                                      
36 + * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
37 + * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
38 + * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
39 + * [4]  Vardeman & Gezelter, in progress (2009).                        
40   */
41  
42   #include <stdlib.h>
43   #include <stdio.h>
44   #include <string.h>
45 + #include <string>
46  
47   #include "io/Globals.hpp"
48 + #include "io/ParamConstraint.hpp"
49 + #include "utils/MemoryUtils.hpp"
50   #include "utils/simError.h"
48 #ifdef IS_MPI
49 #include "io/mpiBASS.h"
50 #endif // is_mpi
51  
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 < */
52 > namespace OpenMD {
53 > Globals::Globals() {
54 >  DefineParameter(ForceField, "forceField")
55 >
56 >  DefineOptionalParameter(TargetTemp, "targetTemp");
57 >  DefineOptionalParameter(Ensemble, "ensemble");
58 >  DefineOptionalParameter(Dt, "dt");
59 >  DefineOptionalParameter(RunTime, "runTime");
60 >  DefineOptionalParameter(FinalConfig, "finalConfig");
61 >  DefineOptionalParameter(SampleTime, "sampleTime");
62 >  DefineOptionalParameter(ResetTime, "resetTime");
63 >  DefineOptionalParameter(StatusTime, "statusTime");
64 >  DefineOptionalParameter(CutoffRadius, "cutoffRadius");
65 >  DefineOptionalParameter(SwitchingRadius, "switchingRadius");
66 >  DefineOptionalParameter(TempSet, "tempSet");
67 >  DefineOptionalParameter(ThermalTime, "thermalTime");
68 >  DefineOptionalParameter(TargetPressure, "targetPressure");  
69 >  DefineOptionalParameter(TauThermostat, "tauThermostat");
70 >  DefineOptionalParameter(TauBarostat, "tauBarostat");
71 >  DefineOptionalParameter(ZconsTime, "zconsTime");
72 >  DefineOptionalParameter(ZconsTol, "zconsTol");
73 >  DefineOptionalParameter(ZconsForcePolicy, "zconsForcePolicy");
74 >  DefineOptionalParameter(Seed, "seed");
75 >  DefineOptionalParameter(Minimizer, "minimizer");
76 >  DefineOptionalParameter(MinimizerMaxIter,"minimizerMaxIter");
77 >  DefineOptionalParameter(MinimizerWriteFreq, "minimizerWriteFreq");
78 >  DefineOptionalParameter(MinimizerStepSize, "minimizerStepSize");
79 >  DefineOptionalParameter(MinimizerFTol, "minimizerFTol");
80 >  DefineOptionalParameter(MinimizerGTol, "minimizerGTol");
81 >  DefineOptionalParameter(MinimizerLSTol, "minimizerLSTol");
82 >  DefineOptionalParameter(MinimizerLSMaxIter, "minimizerLSMaxIter");
83 >  DefineOptionalParameter(ZconsGap, "zconsGap");
84 >  DefineOptionalParameter(ZconsFixtime, "zconsFixtime");
85 >  DefineOptionalParameter(ZconsUsingSMD, "zconsUsingSMD");
86 >  DefineOptionalParameter(ThermodynamicIntegrationLambda, "thermodynamicIntegrationLambda");
87 >  DefineOptionalParameter(ThermodynamicIntegrationK, "thermodynamicIntegrationK");
88 >  DefineOptionalParameter(ForceFieldVariant, "forceFieldVariant");
89 >  DefineOptionalParameter(ForceFieldFileName, "forceFieldFileName");
90 >  DefineOptionalParameter(DampingAlpha, "dampingAlpha");
91 >  DefineOptionalParameter(SurfaceTension, "surfaceTension");
92 >  DefineOptionalParameter(PrintPressureTensor, "printPressureTensor");
93 >  DefineOptionalParameter(TaggedAtomPair, "taggedAtomPair");
94 >  DefineOptionalParameter(PrintTaggedPairDistance, "printTaggedPairDistance");
95 >  DefineOptionalParameter(CutoffPolicy, "cutoffPolicy");
96 >  DefineOptionalParameter(SwitchingFunctionType, "switchingFunctionType");
97 >  DefineOptionalParameter(HydroPropFile, "HydroPropFile");
98 >  DefineOptionalParameter(Viscosity, "viscosity");
99 >  DefineOptionalParameter(BeadSize, "beadSize");
100 >  DefineOptionalParameter(FrozenBufferRadius, "frozenBufferRadius");
101 >  DefineOptionalParameter(LangevinBufferRadius, "langevinBufferRadius");
102 >  DefineOptionalParameter(NeighborListNeighbors,"NeighborListNeighbors");
103 >  DefineOptionalParameter(UseMultipleTemperatureMethod, "useMultipleTemperatureMethod");
104 >  DefineOptionalParameter(MTM_Ce, "MTM_Ce");
105 >  DefineOptionalParameter(MTM_G, "MTM_G");
106 >  DefineOptionalParameter(MTM_Io, "MTM_Io");
107 >  DefineOptionalParameter(MTM_Sigma, "MTM_Sigma");
108 >  DefineOptionalParameter(MTM_R, "MTM_R");
109 >  DefineOptionalParameter(Alpha, "alpha");
110  
111 < //required parameters
112 < #define G_FORCEFIELD         1
113 < #define G_NCOMPONENTS        2
114 < #define G_TARGETTEMP         3
115 < #define G_ENSEMBLE           4
116 < #define G_DT                 5
117 < #define G_RUNTIME            6
111 >  
112 >  DefineOptionalParameterWithDefaultValue(UsePeriodicBoundaryConditions, "usePeriodicBoundaryConditions", true);
113 >  DefineOptionalParameterWithDefaultValue(UseAtomicVirial, "useAtomicVirial", true);
114 >  DefineOptionalParameterWithDefaultValue(UseInitalTime, "useInitialTime", false);
115 >  DefineOptionalParameterWithDefaultValue(UseIntialExtendedSystemState, "useInitialExtendedSystemState", false);
116 >  DefineOptionalParameterWithDefaultValue(OrthoBoxTolerance, "orthoBoxTolerance", 1E-6);  
117 >  DefineOptionalParameterWithDefaultValue(ElectrostaticSummationMethod, "electrostaticSummationMethod", "SHIFTED_FORCE");
118 >  DefineOptionalParameterWithDefaultValue(ElectrostaticScreeningMethod, "electrostaticScreeningMethod", "DAMPED");
119 >  DefineOptionalParameterWithDefaultValue(Dielectric, "dielectric", 78.5);
120 >  DefineOptionalParameterWithDefaultValue(CompressDumpFile, "compressDumpFile", 0);
121 >  DefineOptionalParameterWithDefaultValue(OutputForceVector, "outputForceVector", 0);
122 >  DefineOptionalParameterWithDefaultValue(SkinThickness, "skinThickness", 1.0);
123 >  DefineOptionalParameterWithDefaultValue(StatFileFormat, "statFileFormat", "TIME|TOTAL_ENERGY|POTENTIAL_ENERGY|KINETIC_ENERGY|TEMPERATURE|PRESSURE|VOLUME|CONSERVED_QUANTITY");    
124 >  DefineOptionalParameterWithDefaultValue(UseSphericalBoundaryConditions, "useSphericalBoundaryConditions", false);
125 >  DefineOptionalParameterWithDefaultValue(AccumulateBoxDipole, "accumulateBoxDipole", false);
126  
127 < //optional parameters
128 < #define G_INITIALCONFIG      7
129 < #define G_FINALCONFIG        8
130 < #define G_NMOL               9
131 < #define G_DENSITY           10
132 < #define G_BOX               11
133 < #define G_BOXX              12
134 < #define G_BOXY              13
135 < #define G_BOXZ              14
136 < #define G_SAMPLETIME        15
137 < #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 < Globals::Globals(){
117 <  initalize();
118 < }
127 >  DefineOptionalParameterWithDefaultValue(UseRNEMD, "useRNEMD", false);
128 >  DefineOptionalParameterWithDefaultValue(RNEMD_exchangeTime, "RNEMD_exchangeTime", 100.0);
129 >  DefineOptionalParameterWithDefaultValue(RNEMD_nBins, "RNEMD_nBins", 16);
130 >  DefineOptionalParameterWithDefaultValue(RNEMD_logWidth, "RNEMD_logWidth", 16);
131 >  DefineOptionalParameterWithDefaultValue(RNEMD_exchangeType, "RNEMD_exchangeType", "KineticScale");
132 >  DefineOptionalParameterWithDefaultValue(RNEMD_targetFlux, "RNEMD_targetFlux", 0.0);
133 >  DefineOptionalParameterWithDefaultValue(RNEMD_objectSelection, "RNEMD_objectSelection", "select all");
134 >  DefineOptionalParameterWithDefaultValue(UseRestraints, "useRestraints", false);
135 >  DefineOptionalParameterWithDefaultValue(Restraint_file, "Restraint_file", "idealCrystal.in");
136 >  DefineOptionalParameterWithDefaultValue(UseThermodynamicIntegration, "useThermodynamicIntegration", false);
137 >  DefineOptionalParameterWithDefaultValue(HULL_Method,"HULL_Method","Convex");
138  
120 Globals::~Globals(){
121  int i;
139  
140 <  for( i=0; i<hash_size; i++ ){
141 <    if( command_table[i] != NULL ) delete command_table[i];
142 <  }
143 <  delete[] command_table;
144 <
145 <  if( components != NULL ){
146 <    for( i=0; i<n_components; i++ ) delete components[i];
147 <    delete[] components;
148 <  }
132 < }
133 <
134 < void Globals::initalize(){
135 <  int i;
136 <  
137 <  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 <
140 >  deprecatedKeywords_.insert("nComponents");
141 >  deprecatedKeywords_.insert("nZconstraints");
142 >  deprecatedKeywords_.insert("initialConfig");
143 >  deprecatedKeywords_.insert("thermIntDistSpringConst");
144 >  deprecatedKeywords_.insert("thermIntThetaSpringConst");
145 >  deprecatedKeywords_.insert("thermIntOmegaSpringConst");
146 >  deprecatedKeywords_.insert("useSolidThermInt");  
147 >  deprecatedKeywords_.insert("useLiquidThermInt");
148 >    
149   }
150  
151 < int Globals::newComponent( event* the_event ){
152 <  
153 <  current_component = new Component;
154 <  int index = the_event->evt.blk_index;
265 <  char err[200];
266 <  
267 <  if( have_n_components && index < n_components )
268 <    components[index] = current_component;
269 <  else{
270 <    if( have_n_components ){
271 <      sprintf( err, "meta-data parsing error: %d out of nComponents range",
272 <               index );
273 <      the_event->err_msg = strdup( err );
274 <      return 0;
275 <    }
276 <    else{
277 <      the_event->err_msg = strdup("meta-data parsing error: nComponents not given before"
278 <                                  " first component declaration." );
279 <      return 0;
280 <    }
281 <  }  
282 <
283 <  return 1;
151 > Globals::~Globals() {
152 >    MemoryUtils::deletePointers(components_);
153 >    MemoryUtils::deletePointers(zconstraints_);
154 >    MemoryUtils::deletePointers(restraints_);
155   }
156  
157 + void Globals::validate() {
158 +  DataHolder::validate();
159  
160 +  CheckParameter(ForceField, isNotEmpty());
161 +  CheckParameter(TargetTemp, isPositive());
162 +  CheckParameter(Ensemble, isEqualIgnoreCase("NVE") || isEqualIgnoreCase("NVT") || isEqualIgnoreCase("NPTi") || isEqualIgnoreCase("NPTf") || isEqualIgnoreCase("NPTxyz") || isEqualIgnoreCase("NPAT")  || isEqualIgnoreCase("LANGEVINDYNAMICS") || isEqualIgnoreCase("LD") || isEqualIgnoreCase("NPRT") || isEqualIgnoreCase("NPGT") || isEqualIgnoreCase("NGammaT") || isEqualIgnoreCase("NGT") || isEqualIgnoreCase("SMIPD"));
163 +  CheckParameter(Dt, isPositive());
164 +  CheckParameter(RunTime, isPositive());
165 +  CheckParameter(FinalConfig, isNotEmpty());
166 +  CheckParameter(SampleTime, isNonNegative());
167 +  CheckParameter(ResetTime, isNonNegative());
168 +  CheckParameter(StatusTime, isNonNegative());
169 +  CheckParameter(CutoffRadius, isPositive());
170 +  CheckParameter(SwitchingRadius, isNonNegative());
171 +  CheckParameter(Dielectric, isPositive());
172 +  CheckParameter(ThermalTime,  isNonNegative());
173 +  CheckParameter(TauThermostat, isPositive());
174 +  CheckParameter(TauBarostat, isPositive());
175 +  CheckParameter(ZconsTime, isPositive());
176 +  CheckParameter(ZconsTol, isPositive());
177 +  CheckParameter(Seed, isPositive());
178 +  CheckParameter(Minimizer, isEqualIgnoreCase("SD") || isEqualIgnoreCase("CG"));
179 +  CheckParameter(MinimizerMaxIter, isPositive());
180 +  CheckParameter(MinimizerWriteFreq, isPositive());
181 +  CheckParameter(MinimizerStepSize, isPositive());
182 +  CheckParameter(MinimizerFTol, isPositive());
183 +  CheckParameter(MinimizerGTol, isPositive());
184 +  CheckParameter(MinimizerLSTol, isPositive());
185 +  CheckParameter(MinimizerLSMaxIter, isPositive());
186 +  CheckParameter(ZconsGap, isPositive());
187 +  CheckParameter(ZconsFixtime, isPositive());
188 +  CheckParameter(ThermodynamicIntegrationLambda, isNonNegative());
189 +  CheckParameter(ThermodynamicIntegrationK, isPositive());
190 +  CheckParameter(ForceFieldVariant, isNotEmpty());
191 +  CheckParameter(ForceFieldFileName, isNotEmpty());
192 +  CheckParameter(ElectrostaticSummationMethod, isEqualIgnoreCase("NONE") || isEqualIgnoreCase("SHIFTED_POTENTIAL") || isEqualIgnoreCase("SHIFTED_FORCE") || isEqualIgnoreCase("REACTION_FIELD"));
193 +  CheckParameter(ElectrostaticScreeningMethod, isEqualIgnoreCase("UNDAMPED") || isEqualIgnoreCase("DAMPED"));
194 +  CheckParameter(CutoffPolicy, isEqualIgnoreCase("MIX") || isEqualIgnoreCase("MAX") || isEqualIgnoreCase("TRADITIONAL"));
195 +  CheckParameter(SwitchingFunctionType, isEqualIgnoreCase("CUBIC") || isEqualIgnoreCase("FIFTH_ORDER_POLYNOMIAL"));
196 +  //CheckParameter(StatFileFormat,);    
197 +  CheckParameter(OrthoBoxTolerance, isPositive());  
198 +  CheckParameter(DampingAlpha,isNonNegative());
199 +  CheckParameter(SkinThickness, isPositive());
200 +  CheckParameter(Viscosity, isNonNegative());
201 +  CheckParameter(BeadSize, isPositive());
202 +  CheckParameter(FrozenBufferRadius, isPositive());
203 +  CheckParameter(LangevinBufferRadius, isPositive());
204 +  CheckParameter(NeighborListNeighbors, isPositive());
205 +  CheckParameter(RNEMD_exchangeTime, isPositive());
206 +  CheckParameter(RNEMD_nBins, isPositive() && isEven());
207 +  CheckParameter(RNEMD_exchangeType, isEqualIgnoreCase("KineticSwap") || isEqualIgnoreCase("KineticScale") || isEqualIgnoreCase("Px") || isEqualIgnoreCase("Py") || isEqualIgnoreCase("Pz") || isEqualIgnoreCase("PxScale") || isEqualIgnoreCase("PyScale") || isEqualIgnoreCase("PzScale"));
208 +  CheckParameter(RNEMD_targetFlux, isNonNegative());
209 +  CheckParameter(HULL_Method, isEqualIgnoreCase("Convex") || isEqualIgnoreCase("AlphaShape"));
210 +  CheckParameter(Alpha, isPositive());
211  
212 < int Globals::componentAssign( event* the_event ){
213 <
214 <  switch( the_event->evt.asmt.asmt_type ){
215 <    
216 <  case STRING:
217 <    return current_component->assignString( the_event->evt.asmt.lhs,
218 <                                            the_event->evt.asmt.rhs.sval,
295 <                                            &(the_event->err_msg));
296 <    break;
297 <    
298 <  case DOUBLE:
299 <    return current_component->assignDouble( the_event->evt.asmt.lhs,
300 <                                            the_event->evt.asmt.rhs.dval,
301 <                                            &(the_event->err_msg));
302 <    break;
303 <    
304 <  case INT:
305 <    return current_component->assignInt( the_event->evt.asmt.lhs,
306 <                                         the_event->evt.asmt.rhs.ival,
307 <                                         &(the_event->err_msg));
308 <    break;
309 <    
310 <  default:
311 <    the_event->err_msg = strdup( "Globals error. Invalid component"
312 <                                 " assignment type" );
313 <    return 0;
314 <    break;
212 >  
213 >  for(std::vector<Component*>::iterator i = components_.begin(); i != components_.end(); ++i) {
214 >    if (!(*i)->findMoleculeStamp(moleculeStamps_)) {
215 >        std::ostringstream oss;
216 >        oss << "Globals Error: can not find molecule stamp for component " << (*i)->getType() << std::endl;
217 >        throw OpenMDException(oss.str());          
218 >    }
219    }
316  return 0;
220   }
318
319 int Globals::componentEnd( event* the_event ){
320
321  the_event->err_msg = current_component->checkMe();
322  if( the_event->err_msg != NULL ) return 0;
323
324  return 1;
325 }
326
327 int Globals::newZconstraint( event* the_event ){
221    
222 <
223 <  int index = the_event->evt.blk_index;
224 <  char err[200];
332 <  current_zConstraint = new ZconStamp( index );
333 <  
334 <  have_zConstraints = 1;
335 <
336 <  if( have_n_zConstraints && index < n_zConstraints )
337 <    zConstraints[index] = current_zConstraint;
338 <  else{
339 <    if( have_n_zConstraints ){
340 <      sprintf( err, "meta-data parsing error: %d out of nZconstraints range",
341 <               index );
342 <      the_event->err_msg = strdup( err );
343 <      return 0;
344 <    }
345 <    else{
346 <      the_event->err_msg = strdup("meta-data parsing error: nZconstraints"
347 <                                  " not given before"
348 <                                  " first zConstraint declaration." );
349 <      return 0;
350 <    }
351 <  }  
352 <
353 <  return 1;
222 > bool Globals::addComponent(Component* comp) {
223 >    components_.push_back(comp);
224 >    return true;
225   }
226  
227 <
228 <
229 < int Globals::zConstraintAssign( event* the_event ){
359 <
360 <  switch( the_event->evt.asmt.asmt_type ){
361 <    
362 <  case STRING:
363 <    return current_zConstraint->assignString( the_event->evt.asmt.lhs,
364 <                                              the_event->evt.asmt.rhs.sval,
365 <                                              &(the_event->err_msg));
366 <    break;
367 <    
368 <  case DOUBLE:
369 <    return current_zConstraint->assignDouble( the_event->evt.asmt.lhs,
370 <                                              the_event->evt.asmt.rhs.dval,
371 <                                              &(the_event->err_msg));
372 <    break;
373 <    
374 <  case INT:
375 <    return current_zConstraint->assignInt( the_event->evt.asmt.lhs,
376 <                                           the_event->evt.asmt.rhs.ival,
377 <                                           &(the_event->err_msg));
378 <    break;
379 <    
380 <  default:
381 <    the_event->err_msg = strdup( "Globals error. Invalid zConstraint"
382 <                                 " assignment type" );
383 <    return 0;
384 <    break;
385 <  }
386 <  return 0;
227 > bool Globals::addZConsStamp(ZConsStamp* zcons) {
228 >    zconstraints_.push_back(zcons);
229 >    return true;
230   }
231  
232 < int Globals::zConstraintEnd( event* the_event ){
233 <
234 <  the_event->err_msg = current_zConstraint->checkMe();
392 <  if( the_event->err_msg != NULL ) return 0;
393 <
394 <  return 1;
232 > bool Globals::addRestraintStamp(RestraintStamp* rest) {
233 >    restraints_.push_back(rest);
234 >    return true;
235   }
396
397 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;
446
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;
497
498    case G_ORTHOBOXTOLERANCE:
499      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;      
538
539    case G_MIXINGRULE:
540      if( the_type == STRING ){
541        strcpy( mixingRule, the_event->evt.asmt.rhs.sval );
542        return 1;
543      }
544      
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;
236  
237 <    case G_RESETTIME:
238 <      switch( the_type ){
239 <        
240 <      case STRING:
241 <        the_event->err_msg =
242 <          strdup( "Error in parsing meta-data file!\n\tresetTime is not a double or int.\n" );
243 <        return 0;
244 <        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;
1027 <
1028 <    case G_USEINITTIME:
1029 <      if( the_type == STRING ){
1030 <        
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 ){
1283 <  
1284 <      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;
1309 <
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;
1338 <
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;
1789 < }
1790 <
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;      
237 > bool Globals::addMoleculeStamp(MoleculeStamp* molStamp) {
238 >    std::string molStampName = molStamp->getName();
239 >    std::map<std::string, MoleculeStamp*>::iterator i;
240 >    bool ret = false;
241 >    i = moleculeStamps_.find(molStampName);
242 >    if (i == moleculeStamps_.end()) {
243 >        moleculeStamps_.insert(std::map<std::string, MoleculeStamp*>::value_type(molStampName, molStamp));
244 >        ret = true;
245      } else {
246 <      // I'm a minimizer:
246 >        std::ostringstream oss;
247 >        oss << "Globals Error: Molecule Stamp " << molStamp->getName() << "appears multiple times\n";
248 >        throw OpenMDException(oss.str());  
249      }
250 <  } 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;
250 >    return ret;
251   }
252 +
253  
1835 int Globals::globalEnd( event* the_event ){
1836  
1837  the_event->err_msg = checkMe();
1838  if( the_event->err_msg != NULL ) return 0;
1839
1840  return 1;
254   }
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