2 "Standalone" version of all the Charm++ routines
3 needed by simple libraries. Currently only used
6 Orion Sky Lawlor, olawlor@acm.org, 2003/8/15
10 #include <stdarg.h> /*<- for va_start & friends */
11 #include <string.h> /*<- for strlen */
14 #include "charm-api.h"
16 /* CkPrintf/CkAbort support: */
17 extern "C" void CmiAbort(const char *why) {
18 fprintf(stderr,"Fatal error> %s\n",why);
22 extern "C" void CmiPrintf(const char *fmt, ...) {
23 va_list p; va_start(p, fmt);
24 vfprintf(stdout,fmt,p);
27 extern "C" void CmiError(const char *fmt, ...) {
28 va_list p; va_start(p, fmt);
29 vfprintf(stderr,fmt,p);
33 extern "C" void *CmiTmpAlloc(int size) {return malloc(size);}
34 extern "C" void CmiTmpFree(void *p) {free(p);}
35 extern "C" void __cmi_assert(const char *errmsg) { CmiAbort(errmsg);}
37 /* Bizarre stuff for Cpv support: thankfully not needed by FEM.
39 int CmiMyPe(void) {return 0;}
42 int CmiMyRank(void) {return 0;}
47 int _Cmi_mynodesize=1;
51 /* CmiWallTimer support */
52 double _cpu_speed_factor=0.0;
53 CDECL double CmiTimer(void) {return 0.0;}
55 CDECL double CmiWallTimer(void) {return 0.0;}
58 /* Mini-micro TCHARM */
60 CDECL void TCHARM_Migrate(void) {}
62 enum {tc_global_max=64};
63 void *tc_globals[tc_global_max];
64 void TCHARM_Set_global(int globalID,void *new_value,TCHARM_Pup_global_fn pup_or_NULL) {
65 tc_globals[globalID]=new_value;
67 void *TCHARM_Get_global(int globalID) {
68 return tc_globals[globalID];
72 /* FIXME: add real calls based on MPI here: */
73 CDECL int TCHARM_Register(void *data,TCHARM_Pup_fn pfn) {return -1;}
74 FORTRAN_AS_C_RETURN(int,TCHARM_REGISTER,TCHARM_Register,tcharm_register,
75 (void *data,TCHARM_Pup_fn pfn),(data,pfn))
77 CDECL void *TCHARM_Get_userdata(int id) {return 0;}
79 CDECL void TCHARM_Done(int exitcode) { /* fallthrough */ }
80 FORTRAN_AS_C(TCHARM_DONE,TCHARM_Done,tcharm_done,(int *exitcode),(*exitcode))
82 CDECL void TCHARM_Barrier(void) { /* fallthrough */ }
83 FORTRAN_AS_C(TCHARM_BARRIER,TCHARM_Barrier,tcharm_barrier,(void),())
85 CDECL int TCHARM_Element(void) {return 0;}
86 FORTRAN_AS_C_RETURN(int,TCHARM_ELEMENT,TCHARM_Element,tcharm_element,(void),())
88 CDECL int TCHARM_Num_elements(void) {return 1;}
89 FORTRAN_AS_C_RETURN(int,TCHARM_NUM_ELEMENTS,TCHARM_Num_elements,tcharm_num_elements,(void),())
91 CDECL double TCHARM_Wall_timer(void) {return 0.0;}
92 FORTRAN_AS_C_RETURN(double,TCHARM_WALL_TIMER,TCHARM_Wall_timer,tcharm_wall_timer,(void),())
94 #define FORTRAN_TCHARM_UNIMPLEMENTED(ROUTINE,routine) \
95 FDECL void FTN_NAME(TCHARM_##ROUTINE,tcharm_##routine)(void) \
96 { CkAbort("Sorry, standalone mode does not have TCHARM_" #ROUTINE); }
98 FORTRAN_TCHARM_UNIMPLEMENTED(INIT,init)
99 FORTRAN_TCHARM_UNIMPLEMENTED(CREATE,create)
100 FORTRAN_TCHARM_UNIMPLEMENTED(MIGRATE,migrate)
101 FORTRAN_TCHARM_UNIMPLEMENTED(SET_STACK_SIZE,set_stack_size)
102 FORTRAN_TCHARM_UNIMPLEMENTED(CREATE_DATA,create_data)
103 FORTRAN_TCHARM_UNIMPLEMENTED(MIGRATE_TO,migrate_to)
104 FORTRAN_TCHARM_UNIMPLEMENTED(YIELD,yeild)
107 /* Command-line argument handling */
108 static char **saved_argv=NULL;
110 CDECL int CmiGetArgFlagDesc(char **argv,const char *arg,const char *desc) {
113 for (i=0;argv[i]!=NULL;i++)
114 if (0==strcmp(argv[i],arg))
115 {/*We found the argument*/
118 return 0;/*Didn't find the argument*/
121 CDECL int CmiGetArgIntDesc(char **argv,const char *arg,int *optDest,const char *desc) {
124 for (i=0;argv[i]!=NULL;i++)
125 if (0==strcmp(argv[i],arg))
126 {/*We found the argument*/
127 *optDest = atoi(argv[i+1]);
130 return 0;/*Didn't find the argument*/
133 FDECL void FTN_NAME(TCHARM_GETARG,tcharm_getarg)(int *arg,char *dest,int destLen) {
134 if (saved_argv==NULL)
135 CkAbort("TCHARM_GETARG not supported in FEM_ALONE mode!\n");
136 else /* actually have a saved argument-- return it */ {
138 const char *src=saved_argv[*arg];
140 for (i=strlen(dest);i<destLen;i++) dest[i]=' ';