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

File Contents

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