ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/io/Globals.cpp
Revision: 2447
Committed: Wed Nov 16 21:37:45 2005 UTC (18 years, 8 months ago) by chuckv
File size: 16245 byte(s)
Log Message:
ForceField optional parameters....

File Contents

# Content
1 /*
2 * Copyright (c) 2005 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
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * 3. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the
24 * distribution.
25 *
26 * This software is provided "AS IS," without a warranty of any
27 * kind. All express or implied conditions, representations and
28 * warranties, including any implied warranty of merchantability,
29 * fitness for a particular purpose or non-infringement, are hereby
30 * excluded. The University of Notre Dame and its licensors shall not
31 * be liable for any damages suffered by licensee as a result of
32 * using, modifying or distributing the software or its
33 * derivatives. In no event will the University of Notre Dame or its
34 * licensors be liable for any lost revenue, profit or data, or for
35 * direct, indirect, special, consequential, incidental or punitive
36 * damages, however caused and regardless of the theory of liability,
37 * arising out of the use of or inability to use software, even if the
38 * University of Notre Dame has been advised of the possibility of
39 * such damages.
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 "utils/simError.h"
49 #ifdef IS_MPI
50 #include "io/mpiBASS.h"
51 #endif // is_mpi
52
53 #include "io/ParamConstraint.hpp"
54
55
56 Globals::Globals(){
57
58 DefineParameter(ForceField, "forceField")
59 DefineParameter(NComponents, "nComponents")
60
61 DefineOptionalParameter(TargetTemp, "targetTemp");
62 DefineOptionalParameter(Ensemble, "ensemble");
63 DefineOptionalParameter(Dt, "dt");
64 DefineOptionalParameter(RunTime, "runTime");
65 DefineOptionalParameter(InitialConfig, "initialConfig");
66 DefineOptionalParameter(FinalConfig, "finalConfig");
67 DefineOptionalParameter(NMol, "nMol");
68 DefineOptionalParameter(Density, "density");
69 DefineOptionalParameter(Box, "box");
70 DefineOptionalParameter(BoxX, "boxX");
71 DefineOptionalParameter(BoxY, "boxY");
72 DefineOptionalParameter(BoxZ, "boxZ");
73 DefineOptionalParameter(SampleTime, "sampleTime");
74 DefineOptionalParameter(ResetTime, "resetTime");
75 DefineOptionalParameter(StatusTime, "statusTime");
76 DefineOptionalParameter(CutoffRadius, "cutoffRadius");
77 DefineOptionalParameter(SwitchingRadius, "switchingRadius");
78 DefineOptionalParameter(Dielectric, "dielectric");
79 DefineOptionalParameter(TempSet, "tempSet");
80 DefineOptionalParameter(ThermalTime, "thermalTime");
81 DefineOptionalParameter(TargetPressure, "targetPressure");
82 DefineOptionalParameter(TauThermostat, "tauThermostat");
83 DefineOptionalParameter(TauBarostat, "tauBarostat");
84 DefineOptionalParameter(ZconsTime, "zconsTime");
85 DefineOptionalParameter(NZconstraints, "nZconstraints");
86 DefineOptionalParameter(ZconsTol, "zconsTol");
87 DefineOptionalParameter(ZconsForcePolicy, "zconsForcePolicy");
88 DefineOptionalParameter(Seed, "seed");
89 DefineOptionalParameter(Minimizer, "minimizer");
90 DefineOptionalParameter(MinimizerMaxIter,"minimizerMaxIter");
91 DefineOptionalParameter(MinimizerWriteFrq, "minimizerWriteFrq");
92 DefineOptionalParameter(MinimizerStepSize, "minimizerStepSize");
93 DefineOptionalParameter(MinimizerFTol, "minimizerFTol");
94 DefineOptionalParameter(MinimizerGTol, "minimizerGTol");
95 DefineOptionalParameter(MinimizerLSTol, "minimizerLSTol");
96 DefineOptionalParameter(MinimizerLSMaxIter, "minimizerLSMaxIter");
97 DefineOptionalParameter(ZconsGap, "zconsGap");
98 DefineOptionalParameter(ZconsFixtime, "zconsFixtime");
99 DefineOptionalParameter(ZconsUsingSMD, "zconsUsingSMD");
100 DefineOptionalParameter(ThermodynamicIntegrationLambda, "thermodynamicIntegrationLambda");
101 DefineOptionalParameter(ThermodynamicIntegrationK, "thermodynamicIntegrationK");
102 DefineOptionalParameter(ForceFieldVariant, "forceFieldVariant");
103 DefineOptionalParameter(ForceFieldFileName, "forceFieldFileName");
104 DefineOptionalParameter(ThermIntDistSpringConst, "thermIntDistSpringConst");
105 DefineOptionalParameter(ThermIntThetaSpringConst, "thermIntThetaSpringConst");
106 DefineOptionalParameter(ThermIntOmegaSpringConst, "thermIntOmegaSpringConst");
107 DefineOptionalParameter(SurfaceTension, "surfaceTension");
108 DefineOptionalParameter(PrintPressureTensor, "printPressureTensor");
109 DefineOptionalParameter(ElectrostaticSummationMethod, "electrostaticSummationMethod");
110 DefineOptionalParameter(ElectrostaticScreeningMethod, "electrostaticScreeningMethod");
111 DefineOptionalParameter(CutoffPolicy, "cutoffPolicy");
112 DefineOptionalParameter(SwitchingFunctionType, "switchingFunctionType");
113 DefineOptionalParameterWithDefaultValue(MixingRule, "mixingRule", "standard");
114 DefineOptionalParameterWithDefaultValue(UsePeriodicBoundaryConditions, "usePeriodicBoundaryConditions", true);
115 DefineOptionalParameterWithDefaultValue(UseInitalTime, "useInitialTime", false);
116 DefineOptionalParameterWithDefaultValue(UseIntialExtendedSystemState, "useInitialExtendedSystemState", false);
117 DefineOptionalParameterWithDefaultValue(OrthoBoxTolerance, "orthoBoxTolerance", 1E-6);
118 DefineOptionalParameterWithDefaultValue(UseSolidThermInt, "useSolidThermInt", false);
119 DefineOptionalParameterWithDefaultValue(UseLiquidThermInt, "useLiquidThermInt", false);
120 DefineOptionalParameterWithDefaultValue(ThermIntDistSpringConst, "thermIntDistSpringConst", 6.0);
121 DefineOptionalParameterWithDefaultValue(ThermIntThetaSpringConst, "thermIntThetaSpringConst", 7.5);
122 DefineOptionalParameterWithDefaultValue(ThermIntOmegaSpringConst, "thermIntOmegaSpringConst", 13.5);
123 DefineOptionalParameterWithDefaultValue(DampingAlpha, "dampingAlpha", 0.2);
124 DefineOptionalParameterWithDefaultValue(CompressDumpFile, "compressDumpFile", 0);
125 DefineOptionalParameterWithDefaultValue(OutputForceVector, "outputForceVector", 0);
126 DefineOptionalParameterWithDefaultValue(SkinThickness, "skinThickness", 1.0);
127 DefineOptionalParameterWithDefaultValue(StatFileFormat, "statFileFormat", "TIME|TOTAL_ENERGY|POTENTIAL_ENERGY|KINETIC_ENERGY|TEMPERATURE|PRESSURE|VOLUME|CONSERVED_QUANTITY");
128
129
130 }
131
132 int Globals::globalAssign( event* the_event ){
133 char errorMessage[65535];
134 int key;
135 interface_assign_type the_type = the_event->evt.asmt.asmt_type;
136 char* lhs = the_event->evt.asmt.lhs;
137 std::string keyword(lhs);
138
139 bool result = false;
140
141 /**@todo fix memory leak */
142 ParamMap::iterator i =parameters_.find(keyword);
143 if (i != parameters_.end()) {
144 if( the_type == STRING ){
145 result = i->second->setData(std::string(the_event->evt.asmt.rhs.sval));
146 if (!result ) {
147 sprintf(errorMessage, "Error in parsing %s: expect %s, but get a string \"%s\".\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.sval);
148 the_event->err_msg = strdup(errorMessage);
149 }
150 } else if( the_type == DOUBLE ){
151 result = i->second->setData(the_event->evt.asmt.rhs.dval);
152 if (!result )
153 sprintf(errorMessage, "Error in parsing %s: expect %s, but get a double %f.\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.dval );
154 the_event->err_msg = strdup(errorMessage);
155 }
156 else if (the_type == INT ){
157 result = i->second->setData(the_event->evt.asmt.rhs.ival);
158 if (!result )
159 sprintf(errorMessage, "Error in parsing %s: expect %s, but get an int %d.\n", keyword.c_str(), i->second->getParamType().c_str(), the_event->evt.asmt.rhs.ival );
160 the_event->err_msg = strdup(errorMessage);
161
162 } else {
163 sprintf(errorMessage, "Internal error of parser\n");
164 the_event->err_msg = strdup(errorMessage);
165 }
166 } else {
167 sprintf(errorMessage, "%s is an unrecognized keyword\n", keyword.c_str() );
168 the_event->err_msg = strdup(errorMessage);
169 }
170
171 if (keyword == "nComponents" && getNComponents() > 0) {
172 components = new Component*[getNComponents()];
173 }else if (keyword == "nZconstraints" && getNZconstraints() > 0) {
174 zConstraints = new ZconStamp*[getNZconstraints()];
175 }
176
177 return result;
178 }
179
180 int Globals::newComponent( event* the_event ){
181
182 current_component = new Component;
183 int index = the_event->evt.blk_index;
184 char err[200];
185
186 if( haveNComponents() && index < getNComponents() )
187 components[index] = current_component;
188 else{
189 if( haveNComponents() ){
190 sprintf( err, "meta-data parsing error: %d out of nComponents range",
191 index );
192 the_event->err_msg = strdup( err );
193 return 0;
194 }
195 else{
196 the_event->err_msg = strdup("meta-data parsing error: nComponents not given before"
197 " first component declaration." );
198 return 0;
199 }
200 }
201
202 return 1;
203 }
204
205
206
207 int Globals::componentAssign( event* the_event ){
208
209 switch( the_event->evt.asmt.asmt_type ){
210
211 case STRING:
212 return current_component->assignString( the_event->evt.asmt.lhs,
213 the_event->evt.asmt.rhs.sval,
214 &(the_event->err_msg));
215 break;
216
217 case DOUBLE:
218 return current_component->assignDouble( the_event->evt.asmt.lhs,
219 the_event->evt.asmt.rhs.dval,
220 &(the_event->err_msg));
221 break;
222
223 case INT:
224 return current_component->assignInt( the_event->evt.asmt.lhs,
225 the_event->evt.asmt.rhs.ival,
226 &(the_event->err_msg));
227 break;
228
229 default:
230 the_event->err_msg = strdup( "Globals error. Invalid component"
231 " assignment type" );
232 return 0;
233 break;
234 }
235 return 0;
236 }
237
238 int Globals::componentEnd( event* the_event ){
239
240 the_event->err_msg = current_component->checkMe();
241 if( the_event->err_msg != NULL ) return 0;
242
243 return 1;
244 }
245
246 int Globals::newZconstraint( event* the_event ){
247
248
249 int index = the_event->evt.blk_index;
250 char err[200];
251 current_zConstraint = new ZconStamp( index );
252
253 if( haveNZconstraints() && index < getNZconstraints() )
254 zConstraints[index] = current_zConstraint;
255 else{
256 if( haveNZconstraints() ){
257 sprintf( err, "meta-data parsing error: %d out of nZconstraints range",
258 index );
259 the_event->err_msg = strdup( err );
260 return 0;
261 }
262 else{
263 the_event->err_msg = strdup("meta-data parsing error: nZconstraints"
264 " not given before"
265 " first zConstraint declaration." );
266 return 0;
267 }
268 }
269
270 return 1;
271 }
272
273
274
275 int Globals::zConstraintAssign( event* the_event ){
276
277 switch( the_event->evt.asmt.asmt_type ){
278
279 case STRING:
280 return current_zConstraint->assignString( the_event->evt.asmt.lhs,
281 the_event->evt.asmt.rhs.sval,
282 &(the_event->err_msg));
283 break;
284
285 case DOUBLE:
286 return current_zConstraint->assignDouble( the_event->evt.asmt.lhs,
287 the_event->evt.asmt.rhs.dval,
288 &(the_event->err_msg));
289 break;
290
291 case INT:
292 return current_zConstraint->assignInt( the_event->evt.asmt.lhs,
293 the_event->evt.asmt.rhs.ival,
294 &(the_event->err_msg));
295 break;
296
297 default:
298 the_event->err_msg = strdup( "Globals error. Invalid zConstraint"
299 " assignment type" );
300 return 0;
301 break;
302 }
303 return 0;
304 }
305
306 int Globals::zConstraintEnd( event* the_event ){
307
308 the_event->err_msg = current_zConstraint->checkMe();
309 if( the_event->err_msg != NULL ) return 0;
310
311 return 1;
312 }
313
314 char* Globals::checkMe( void ){
315
316
317 std::string err("The following required keywords are missing:\n");
318 short int have_err = 0;
319
320 ParamMap::iterator i;
321 for (i = parameters_.begin(); i != parameters_.end(); ++i) {
322 if (!i->second->isOptional() && i->second->empty()) {
323 err += i->second->getKeyword() + "\n";
324 }
325 }
326
327 CheckParameter(ForceField, isNotEmpty());
328 CheckParameter(NComponents,isPositive());
329 CheckParameter(TargetTemp, isPositive());
330 CheckParameter(Ensemble, isEqualIgnoreCase(std::string("NVE")) ||
331 isEqualIgnoreCase(std::string("NVT")) ||
332 isEqualIgnoreCase(std::string("NPTi")) ||
333 isEqualIgnoreCase(std::string("NPTf")) ||
334 isEqualIgnoreCase(std::string("NPTxyz")) );
335 CheckParameter(Dt, isPositive());
336 CheckParameter(RunTime, isPositive());
337 CheckParameter(InitialConfig, isNotEmpty());
338 CheckParameter(FinalConfig, isNotEmpty());
339 CheckParameter(NMol, isPositive());
340 CheckParameter(Density, isPositive());
341 CheckParameter(Box, isPositive());
342 CheckParameter(BoxX, isPositive());
343 CheckParameter(BoxY, isPositive());
344 CheckParameter(BoxZ, isPositive());
345 CheckParameter(SampleTime, isNonNegative());
346 CheckParameter(ResetTime, isNonNegative());
347 CheckParameter(StatusTime, isNonNegative());
348 CheckParameter(CutoffRadius, isPositive());
349 CheckParameter(SwitchingRadius, isNonNegative());
350 CheckParameter(Dielectric, isPositive());
351 CheckParameter(ThermalTime, isNonNegative());
352 CheckParameter(TargetPressure, isPositive());
353 CheckParameter(TauThermostat, isPositive());
354 CheckParameter(TauBarostat, isPositive());
355 CheckParameter(ZconsTime, isPositive());
356 CheckParameter(NZconstraints, isPositive());
357 CheckParameter(ZconsTol, isPositive());
358 //CheckParameter(ZconsForcePolicy,);
359 CheckParameter(Seed, isPositive());
360 CheckParameter(Minimizer, isEqualIgnoreCase(std::string("SD")) ||
361 isEqualIgnoreCase(std::string("CG")));
362 CheckParameter(MinimizerMaxIter, isPositive());
363 CheckParameter(MinimizerWriteFrq, isPositive());
364 CheckParameter(MinimizerStepSize, isPositive());
365 CheckParameter(MinimizerFTol, isPositive());
366 CheckParameter(MinimizerGTol, isPositive());
367 CheckParameter(MinimizerLSTol, isPositive());
368 CheckParameter(MinimizerLSMaxIter, isPositive());
369 CheckParameter(ZconsGap, isPositive());
370 CheckParameter(ZconsFixtime, isPositive());
371 CheckParameter(ThermodynamicIntegrationLambda, isPositive());
372 CheckParameter(ThermodynamicIntegrationK, isPositive());
373 CheckParameter(ForceFieldVariant, isNotEmpty());
374 CheckParameter(ForceFieldFileName, isNotEmpty());
375 CheckParameter(ThermIntDistSpringConst, isPositive());
376 CheckParameter(ThermIntThetaSpringConst, isPositive());
377 CheckParameter(ThermIntOmegaSpringConst, isPositive());
378 CheckParameter(SurfaceTension, isPositive());
379 CheckParameter(ElectrostaticSummationMethod,
380 isEqualIgnoreCase(std::string("NONE")) ||
381 isEqualIgnoreCase(std::string("SHIFTED_POTENTIAL")) ||
382 isEqualIgnoreCase(std::string("SHIFTED_FORCE")) ||
383 isEqualIgnoreCase(std::string("REACTION_FIELD")));
384 CheckParameter(ElectrostaticScreeningMethod,
385 isEqualIgnoreCase(std::string("UNDAMPED")) ||
386 isEqualIgnoreCase(std::string("DAMPED")));
387 CheckParameter(CutoffPolicy, isEqualIgnoreCase(std::string("MIX")) ||
388 isEqualIgnoreCase(std::string("MAX")) ||
389 isEqualIgnoreCase(std::string("TRADITIONAL")));
390 CheckParameter(SwitchingFunctionType,
391 isEqualIgnoreCase(std::string("CUBIC")) ||
392 isEqualIgnoreCase(std::string("FIFTH_ORDER_POLYNOMIAL")));
393 //CheckParameter(StatFileFormat,);
394 //CheckParameter(MixingRule,);
395 CheckParameter(OrthoBoxTolerance, isPositive());
396 CheckParameter(ThermIntDistSpringConst, isPositive());
397 CheckParameter(ThermIntThetaSpringConst, isPositive());
398 CheckParameter(ThermIntOmegaSpringConst, isPositive());
399 CheckParameter(DampingAlpha,isNonNegative());
400 CheckParameter(SkinThickness, isPositive());
401
402 //@todo memory leak
403 if( have_err )
404 return strdup( err.c_str() );
405
406 return NULL;
407
408
409 }
410
411 int Globals::globalEnd( event* the_event ){
412
413 the_event->err_msg = checkMe();
414 if( the_event->err_msg != NULL ) return 0;
415
416 return 1;
417 }