ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/interface_implementation/Globals.cpp
Revision: 178
Committed: Mon Nov 18 21:24:02 2002 UTC (21 years, 7 months ago) by mmeineke
File size: 16716 byte(s)
Log Message:
*** empty log message ***

File Contents

# Content
1 #include <cstdlib>
2 #include <cstdio>
3 #include <cstring>
4
5 #include "Globals.hpp"
6 #include "simError.h"
7 #ifdef IS_MPI
8 #include "mpiBASS.h"
9 #endif // is_mpi
10
11 /*
12 * The following section lists all of the defined tokens for the
13 * gloabal assignment statements. All are prefixed with a G_ to avoid
14 * stepping on any previously defined enumerations.
15 *
16 * NOTE: tokens start at 1, 0 is a resrved token number
17 */
18
19 //required parameters
20 #define G_FORCEFIELD 1
21 #define G_NCOMPONENTS 2
22 #define G_TARGETTEMP 3
23 #define G_ENSEMBLE 4
24 #define G_DT 5
25 #define G_RUNTIME 6
26
27 //optional parameters
28 #define G_INITIALCONFIG 7
29 #define G_FINALCONFIG 8
30 #define G_NMOL 9
31 #define G_DENSITY 10
32 #define G_BOX 11
33 #define G_BOXX 12
34 #define G_BOXY 13
35 #define G_BOXZ 14
36 #define G_SAMPLETIME 15
37 #define G_STATUSTIME 16
38 #define G_RRF 17
39 #define G_DIELECTRIC 18
40 #define G_TEMPSET 19
41 #define G_THERMALTIME 20
42
43
44 Globals::Globals(){
45
46 int i;
47
48 components = NULL;
49
50 command_table = new LinkedCommand*[hash_size];
51 for( i=0; i<hash_size; i++ ) command_table[i] = NULL;
52
53 addHash( "forceField", G_FORCEFIELD );
54 addHash( "nComponents", G_NCOMPONENTS );
55 addHash( "targetTemp", G_TARGETTEMP );
56 addHash( "ensemble", G_ENSEMBLE );
57 addHash( "dt", G_DT );
58 addHash( "runTime", G_RUNTIME );
59
60 addHash( "initialConfig", G_INITIALCONFIG );
61 addHash( "finalConfig", G_FINALCONFIG );
62 addHash( "nMol", G_NMOL );
63 addHash( "density", G_DENSITY );
64 addHash( "box", G_BOX );
65 addHash( "boxX", G_BOXX );
66 addHash( "boxY", G_BOXY );
67 addHash( "boxZ", G_BOXZ );
68 addHash( "sampleTime", G_SAMPLETIME );
69 addHash( "statusTime", G_STATUSTIME );
70 addHash( "rRF", G_RRF );
71 addHash( "dielectric", G_DIELECTRIC );
72 addHash( "tempSet", G_TEMPSET );
73 addHash( "thermalTime", G_THERMALTIME );
74
75 have_force_field = 0;
76 have_n_components = 0;
77 have_target_temp = 0;
78 have_ensemble = 0;
79 have_dt = 0;
80 have_run_time = 0;
81
82 have_initial_config = 0;
83 have_final_config = 0;
84 have_n_mol = 0;
85 have_density = 0;
86 have_box = 0;
87 have_box_x = 0;
88 have_box_y = 0;
89 have_box_y = 0;
90 have_box_z = 0;
91 have_sample_time = 0;
92 have_status_time = 0;
93 have_thermal_time = 0;
94 have_rrf = 0;
95 have_dielectric = 0;
96 have_tempSet = 0;
97 }
98
99 Globals::~Globals(){
100 int i;
101
102 for( i=0; i<hash_size; i++ ){
103 if( command_table[i] != NULL ) delete command_table[i];
104 }
105 delete[] command_table;
106
107 if( components != NULL ){
108 for( i=0; i<n_components; i++ ) delete components[i];
109 delete[] components;
110 }
111 }
112
113 int Globals::newComponent( event* the_event ){
114
115 current_component = new Component;
116 int index = the_event->evt.blk_index;
117 char err[200];
118
119 if( have_n_components && index < n_components )
120 components[index] = current_component;
121 else{
122 if( have_n_components ){
123 sprintf( err, "Globals error, %d out of nComponents range",
124 index );
125 the_event->err_msg = strdup( err );
126 return 0;
127 }
128 else{
129 the_event->err_msg = strdup("Globals error, nComponents not given before"
130 "first component declaration." );
131 return 0;
132 }
133 }
134
135 return 1;
136 }
137
138
139
140 int Globals::componentAssign( event* the_event ){
141
142 switch( the_event->evt.asmt.asmt_type ){
143
144 case STRING:
145 return current_component->assignString( the_event->evt.asmt.lhs,
146 the_event->evt.asmt.rhs.sval,
147 &(the_event->err_msg));
148 break;
149
150 case DOUBLE:
151 return current_component->assignDouble( the_event->evt.asmt.lhs,
152 the_event->evt.asmt.rhs.dval,
153 &(the_event->err_msg));
154 break;
155
156 case INT:
157 return current_component->assignInt( the_event->evt.asmt.lhs,
158 the_event->evt.asmt.rhs.ival,
159 &(the_event->err_msg));
160 break;
161
162 default:
163 the_event->err_msg = strdup( "Globals error. Invalid component"
164 " assignment type" );
165 return 0;
166 break;
167 }
168 return 0;
169 }
170
171 int Globals::componentStartIndex( event* the_event ){
172
173 current_component->startIndex( the_event->evt.si.array,
174 the_event->evt.si.n_elements );
175 return 1;
176 }
177
178 int Globals::componentEnd( event* the_event ){
179
180 the_event->err_msg = current_component->checkMe();
181 if( the_event->err_msg != NULL ) return 0;
182
183 return 1;
184 }
185
186 int Globals::globalAssign( event* the_event ){
187
188 int key;
189 int token;
190 interface_assign_type the_type = the_event->evt.asmt.asmt_type;
191 char* lhs = the_event->evt.asmt.lhs;
192 char err[300];
193
194 token = 0;
195 key = hash( lhs );
196 if( command_table[key] != NULL ) token = command_table[key]->match( lhs );
197
198 if( token ){
199
200 switch( token ){
201
202 case G_FORCEFIELD:
203 if( the_type == STRING ){
204 strcpy( force_field, the_event->evt.asmt.rhs.sval );
205 have_force_field = 1;
206 return 1;
207 }
208
209 the_event->err_msg =
210 strdup( "Global error. forceField was not a string assignment.\n" );
211 return 0;
212 break;
213
214 case G_NCOMPONENTS:
215 if( the_type == STRING ){
216 the_event->err_msg =
217 strdup("Global error. nComponents is not a double or an int.\n" );
218 return 0;
219 }
220
221 else if( the_type == DOUBLE ){
222 n_components = (int)the_event->evt.asmt.rhs.dval;
223 components = new Component*[n_components];
224 have_n_components = 1;
225 return 1;
226 }
227
228 else{
229 n_components = the_event->evt.asmt.rhs.ival;
230 components = new Component*[n_components];
231 have_n_components = 1;
232 return 1;
233 }
234 break;
235
236 case G_TARGETTEMP:
237 switch( the_type ){
238
239 case STRING:
240 the_event->err_msg =
241 strdup( "Global error. targetTemp is not a double or int.\n" );
242 return 0;
243 break;
244
245 case DOUBLE:
246 target_temp = the_event->evt.asmt.rhs.dval;
247 have_target_temp = 1;
248 return 1;
249 break;
250
251 case INT:
252 target_temp = (double)the_event->evt.asmt.rhs.ival;
253 have_target_temp = 1;
254 return 1;
255 break;
256
257 default:
258 the_event->err_msg =
259 strdup( "Global error. targetTemp unrecognized.\n" );
260 return 0;
261 break;
262 }
263 break;
264
265 case G_ENSEMBLE:
266 if( the_type == STRING ){
267 strcpy( ensemble, the_event->evt.asmt.rhs.sval );
268 have_ensemble = 1;
269 return 1;
270 }
271
272 the_event->err_msg =
273 strdup( "Global error. ensemble was not assigned to a string\n" );
274 return 0;
275 break;
276
277 case G_DT:
278 switch( the_type ){
279
280 case STRING:
281 the_event->err_msg =
282 strdup( "Global error. dt is not a double or int.\n" );
283 return 0;
284 break;
285
286 case DOUBLE:
287 dt = the_event->evt.asmt.rhs.dval;
288 have_dt = 1;
289 return 1;
290 break;
291
292 case INT:
293 dt = (double)the_event->evt.asmt.rhs.ival;
294 have_dt = 1;
295 return 1;
296 break;
297
298 default:
299 the_event->err_msg =
300 strdup( "Global error. dt unrecognized.\n" );
301 return 0;
302 break;
303 }
304 break;
305
306 case G_RUNTIME:
307 switch( the_type ){
308
309 case STRING:
310 the_event->err_msg =
311 strdup( "Global error. runTime is not a double or int.\n" );
312 return 0;
313 break;
314
315 case DOUBLE:
316 run_time = the_event->evt.asmt.rhs.dval;
317 have_run_time = 1;
318 return 1;
319 break;
320
321 case INT:
322 run_time = (double)the_event->evt.asmt.rhs.ival;
323 have_run_time = 1;
324 return 1;
325 break;
326
327 default:
328 the_event->err_msg =
329 strdup( "Global error. runTime unrecognized.\n" );
330 return 0;
331 break;
332 }
333 break;
334
335 case G_INITIALCONFIG:
336 if( the_type == STRING ){
337 strcpy( initial_config, the_event->evt.asmt.rhs.sval );
338 have_initial_config = 1;
339 return 1;
340 }
341
342 the_event->err_msg =
343 strdup( "Global error. initialConfig was not a string assignment.\n" );
344 return 0;
345 break;
346
347 case G_FINALCONFIG:
348 if( the_type == STRING ){
349 strcpy( final_config, the_event->evt.asmt.rhs.sval );
350 have_final_config = 1;
351 return 1;
352 }
353
354 the_event->err_msg =
355 strdup( "Global error. finalConfig was not a string assignment.\n" );
356 return 0;
357 break;
358
359 case G_NMOL:
360 switch( the_type ){
361
362 case STRING:
363 the_event->err_msg =
364 strdup( "Global error. nMol is not a double or int.\n" );
365 return 0;
366 break;
367
368 case DOUBLE:
369 n_mol = (int)the_event->evt.asmt.rhs.dval;
370 have_n_mol = 1;
371 return 1;
372 break;
373
374 case INT:
375 n_mol = the_event->evt.asmt.rhs.ival;
376 have_n_mol = 1;
377 return 1;
378 break;
379
380 default:
381 the_event->err_msg =
382 strdup( "Global error. nMol unrecognized.\n" );
383 return 0;
384 break;
385 }
386 break;
387
388 case G_DENSITY:
389 switch( the_type ){
390
391 case STRING:
392 the_event->err_msg =
393 strdup( "Global error. density is not a double or int.\n" );
394 return 0;
395 break;
396
397 case DOUBLE:
398 density = the_event->evt.asmt.rhs.dval;
399 have_density = 1;
400 return 1;
401 break;
402
403 case INT:
404 density = (double)the_event->evt.asmt.rhs.ival;
405 have_density = 1;
406 return 1;
407 break;
408
409 default:
410 the_event->err_msg =
411 strdup( "Global error. density unrecognized.\n" );
412 return 0;
413 break;
414 }
415 break;
416
417 case G_BOX:
418 switch( the_type ){
419
420 case STRING:
421 the_event->err_msg =
422 strdup( "Global error. box is not a double or int.\n" );
423 return 0;
424 break;
425
426 case DOUBLE:
427 box = the_event->evt.asmt.rhs.dval;
428 have_box = 1;
429 return 1;
430 break;
431
432 case INT:
433 box = (double)the_event->evt.asmt.rhs.ival;
434 have_box = 1;
435 return 1;
436 break;
437
438 default:
439 the_event->err_msg =
440 strdup( "Global error. box unrecognized.\n" );
441 return 0;
442 break;
443 }
444 break;
445
446 case G_BOXX:
447 switch( the_type ){
448
449 case STRING:
450 the_event->err_msg =
451 strdup( "Global error. boxX is not a double or int.\n" );
452 return 0;
453 break;
454
455 case DOUBLE:
456 box_x = the_event->evt.asmt.rhs.dval;
457 have_box_x = 1;
458 return 1;
459 break;
460
461 case INT:
462 box_x = (double)the_event->evt.asmt.rhs.ival;
463 have_box_x = 1;
464 return 1;
465 break;
466
467 default:
468 the_event->err_msg =
469 strdup( "Global error. boxX unrecognized.\n" );
470 return 0;
471 break;
472 }
473 break;
474
475 case G_BOXY:
476 switch( the_type ){
477
478 case STRING:
479 the_event->err_msg =
480 strdup( "Global error. boxY is not a double or int.\n" );
481 return 0;
482 break;
483
484 case DOUBLE:
485 box_y = the_event->evt.asmt.rhs.dval;
486 have_box_y = 1;
487 return 1;
488 break;
489
490 case INT:
491 box_y = (double)the_event->evt.asmt.rhs.ival;
492 have_box_y = 1;
493 return 1;
494 break;
495
496 default:
497 the_event->err_msg =
498 strdup( "Global error. boxY unrecognized.\n" );
499 return 0;
500 break;
501 }
502 break;
503
504 case G_BOXZ:
505 switch( the_type ){
506
507 case STRING:
508 the_event->err_msg =
509 strdup( "Global error. boxZ is not a double or int.\n" );
510 return 0;
511 break;
512
513 case DOUBLE:
514 box_z = the_event->evt.asmt.rhs.dval;
515 have_box_z = 1;
516 return 1;
517 break;
518
519 case INT:
520 box_z = (double)the_event->evt.asmt.rhs.ival;
521 have_box_z = 1;
522 return 1;
523 break;
524
525 default:
526 the_event->err_msg =
527 strdup( "Global error. boxZ unrecognized.\n" );
528 return 0;
529 break;
530 }
531 break;
532
533 case G_SAMPLETIME:
534 switch( the_type ){
535
536 case STRING:
537 the_event->err_msg =
538 strdup( "Global error. sampleTime is not a double or int.\n" );
539 return 0;
540 break;
541
542 case DOUBLE:
543 sample_time = the_event->evt.asmt.rhs.dval;
544 have_sample_time = 1;
545 return 1;
546 break;
547
548 case INT:
549 sample_time = (double)the_event->evt.asmt.rhs.ival;
550 have_sample_time = 1;
551 return 1;
552 break;
553
554 default:
555 the_event->err_msg =
556 strdup( "Global error. sampleTime unrecognized.\n" );
557 return 0;
558 break;
559 }
560 break;
561
562 case G_STATUSTIME:
563 switch( the_type ){
564
565 case STRING:
566 the_event->err_msg =
567 strdup( "Global error. statusTime is not a double or int.\n" );
568 return 0;
569 break;
570
571 case DOUBLE:
572 status_time = the_event->evt.asmt.rhs.dval;
573 have_status_time = 1;
574 return 1;
575 break;
576
577 case INT:
578 status_time = (double)the_event->evt.asmt.rhs.ival;
579 have_status_time = 1;
580 return 1;
581 break;
582
583 default:
584 the_event->err_msg =
585 strdup( "Global error. statusTime unrecognized.\n" );
586 return 0;
587 break;
588 }
589 break;
590
591 case G_THERMALTIME:
592 switch( the_type ){
593
594 case STRING:
595 the_event->err_msg =
596 strdup( "Global error. thermalTime is not a double or int.\n" );
597 return 0;
598 break;
599
600 case DOUBLE:
601 thermal_time = the_event->evt.asmt.rhs.dval;
602 have_thermal_time = 1;
603 return 1;
604 break;
605
606 case INT:
607 thermal_time = (double)the_event->evt.asmt.rhs.ival;
608 have_thermal_time = 1;
609 return 1;
610 break;
611
612 default:
613 the_event->err_msg =
614 strdup( "Global error. thermalTime unrecognized.\n" );
615 return 0;
616 break;
617 }
618 break;
619
620 case G_RRF:
621 switch( the_type ){
622
623 case STRING:
624 the_event->err_msg =
625 strdup( "Global error. rRF is not a double or int.\n" );
626 return 0;
627 break;
628
629 case DOUBLE:
630 rRF = the_event->evt.asmt.rhs.dval;
631 have_rrf = 1;
632 return 1;
633 break;
634
635 case INT:
636 rRF = (double)the_event->evt.asmt.rhs.ival;
637 have_rrf = 1;
638 return 1;
639 break;
640
641 default:
642 the_event->err_msg =
643 strdup( "Global error. rRF unrecognized.\n" );
644 return 0;
645 break;
646 }
647 break;
648
649 case G_DIELECTRIC:
650 switch( the_type ){
651
652 case STRING:
653 the_event->err_msg =
654 strdup( "Global error. dielectric is not a double or int.\n" );
655 return 0;
656 break;
657
658 case DOUBLE:
659 dielectric = the_event->evt.asmt.rhs.dval;
660 have_dielectric = 1;
661 return 1;
662 break;
663
664 case INT:
665 dielectric = (double)the_event->evt.asmt.rhs.ival;
666 have_dielectric = 1;
667 return 1;
668 break;
669
670 default:
671 the_event->err_msg =
672 strdup( "Global error. dielectric unrecognized.\n" );
673 return 0;
674 break;
675 }
676 break;
677
678 case G_TEMPSET:
679 if( the_type == STRING ){
680
681 if( !strcmp( "true", the_event->evt.asmt.rhs.sval )) tempSet = 1;
682 else if( !strcmp( "false", the_event->evt.asmt.rhs.sval )) tempSet = 0;
683 else{
684 the_event->err_msg =
685 strdup( "Global error. tempSet was not \"true\" or \"false\".\n" );
686 return 0;
687 }
688 have_tempSet = 1;
689 return 1;
690 }
691
692 the_event->err_msg =
693 strdup( "Global error. tempSet was not \"true\" or \"false\".\n" );
694 return 0;
695 break;
696 }
697 }
698
699 switch( the_type ){
700
701 case STRING:
702 sprintf( err,
703 "Global error. Unrecognized assignment:\n"
704 "\t-> %s = %s\n",
705 lhs, the_event->evt.asmt.rhs.sval );
706 break;
707
708 case DOUBLE:
709 sprintf( err,
710 "Global error. Unrecognized assignment:\n"
711 "\t-> %s = %lf\n",
712 lhs, the_event->evt.asmt.rhs.dval );
713 break;
714
715 case INT:
716 sprintf( err,
717 "Global error. Unrecognized assignment:\n"
718 "\t-> %s = %d\n",
719 lhs, the_event->evt.asmt.rhs.ival );
720 break;
721
722 default:
723 sprintf( err,
724 "Global error. Unrecognized assignment:\n"
725 "\t-> %s = ?\n",
726 lhs );
727 break;
728 }
729
730 the_event->err_msg = strdup( err );
731 return 0;
732 }
733
734 char* Globals::checkMe( void ){
735
736 char err[300];
737 short int have_err = 0;
738
739 strcpy( err, "Global error. The following are required:\n" );
740
741 if( !have_force_field ){
742 strcat( err, "\t->forceField\n" );
743 have_err= 1;
744 }
745
746 if( !have_n_components ){
747 strcat( err, "\t->nComponents\n" );
748 have_err= 1;
749 }
750
751 if( !have_target_temp ){
752 strcat( err, "\t->targetTemp\n" );
753 have_err= 1;
754 }
755
756 if( !have_ensemble ){
757 strcat( err, "\t->ensemble\n" );
758 have_err= 1;
759 }
760
761 if( !have_dt ){
762 strcat( err, "\t->dt\n" );
763 have_err= 1;
764 }
765
766 if( !have_run_time ){
767 strcat( err, "\t->runTime\n" );
768 have_err= 1;
769 }
770
771 if( have_err ) return strdup( err );
772
773 return NULL;
774 }
775
776 int Globals::globalEnd( event* the_event ){
777
778 the_event->err_msg = checkMe();
779 if( the_event->err_msg != NULL ) return 0;
780
781 return 1;
782 }
783
784 int Globals::hash( char* text ){
785
786 register unsigned short int i = 0; // loop counter
787 int key = 0; // the hash key
788
789 while( text[i] != '\0' ){
790
791 key = ( ( key << hash_shift ) + text[i] ) % hash_size;
792
793 i++;
794 }
795
796 if( key < 0 ){
797
798 // if the key is less than zero, we've had an overflow error
799
800 sprintf( painCave.errMsg,
801 "There has been an overflow error in the Globals' hash key.");
802 painCave.isFatal = 1;
803 simError();
804 #ifdef IS_MPI
805 if( painCave.isEventLoop ){
806 if( worldRank == 0 ) mpiInterfaceExit();
807 }
808 #endif //is_mpi
809 }
810
811 return key;
812 }
813
814 void Globals::addHash( char* text, int token ){
815
816 int key;
817 LinkedCommand* the_element;
818
819 the_element = new LinkedCommand;
820 the_element->setValues( text, token );
821
822 key = hash( text );
823 the_element->setNext( command_table[key] );
824 command_table[key] = the_element;
825 }