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