ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/io/Globals.cpp
Revision: 2101
Committed: Thu Mar 10 15:10:24 2005 UTC (19 years, 4 months ago) by chrisfen
File size: 49791 byte(s)
Log Message:
First commit of the new restraints code

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