ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/Globals.cpp
Revision: 377
Committed: Fri Mar 21 17:42:12 2003 UTC (21 years, 3 months ago) by mmeineke
Original Path: branches/mmeineke/OOPSE/libBASS/Globals.cpp
File size: 17772 byte(s)
Log Message:
New OOPSE Tree

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