ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/io/Globals.cpp
Revision: 1930
Committed: Wed Jan 12 22:41:40 2005 UTC (19 years, 5 months ago) by gezelter
File size: 46427 byte(s)
Log Message:
merging new_design branch into OOPSE-2.0

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