ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-3.0/src/io/Globals.cpp
Revision: 1957
Committed: Tue Jan 25 17:45:23 2005 UTC (19 years, 5 months ago) by tim
File size: 46959 byte(s)
Log Message:
(1) complete section parser's error message
(2) add GhostTorsion
(3) accumulate inertial tensor from the directional atoms before calculate rigidbody's inertial tensor

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