ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/oopse-1.0/libBASS/Globals.cpp
Revision: 1447
Committed: Fri Jul 30 21:01:35 2004 UTC (19 years, 11 months ago) by gezelter
File size: 44303 byte(s)
Log Message:
Initial import of OOPSE sources into cvs tree

File Contents

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