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

File Contents

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