int VMDmain(int argc, char **argv) { #else int main(int argc, char **argv) { #endif int mpienabled = 0; PROFILE_MAIN_THREAD(); // mark main VMD thread within profiler timelines PROFILE_PUSH_RANGE("VMD main() initialization", 4); #if defined(VMDMPI) // so long as the caller has not disabled MPI, we initialize MPI when VMD // has been compiled to support it. if (getenv("VMDNOMPI") == NULL) { mpienabled = 1; } #endif if (!VMDinitialize(&argc, &argv, mpienabled)) { return 0; } const char *displayTypeName = VMDgetDisplayTypeName(); int displayLoc[2], displaySize[2]; VMDgetDisplayFrame(displayLoc, displaySize); VMDApp *app = new VMDApp(argc, argv, mpienabled); if (!app->VMDinit(argc, argv, displayTypeName, displayLoc, displaySize)) { delete app; return 1; } PROFILE_POP_RANGE(); PROFILE_PUSH_RANGE("VMD startup scripts", 1); // read various application defaults VMDreadInit(app); PROFILE_POP_RANGE(); PROFILE_PUSH_RANGE("VMD process user script(s)", 1); // read user-defined startup files VMDreadStartup(app); PROFILE_POP_RANGE(); PROFILE_PUSH_RANGE("VMD interactive event loop", 1); // main event loop do { // If we knew that there were no embedded python interpreter, we could // process Tcl events here, rather than within the VMD instance. #ifdef VMDTCL // Loop on the Tcl event notifier // while (Tcl_DoOneEvent(TCL_DONT_WAIT)); #endif // handle Fltk events VMDupdateFltk(); #if 0 // take over the console if (vmd_check_stdin()) { app->process_console(); } #endif } while(app->VMDupdate(VMD_CHECK_EVENTS)); PROFILE_POP_RANGE(); // end of program delete app; VMDshutdown(mpienabled); return 0; }
static int vmdinfo_tcl(ClientData, Tcl_Interp *interp, int argc, const char *argv[]) { VMDApp *app = (VMDApp *)Tcl_GetAssocData(interp, "VMDApp", NULL); if (argc == 2) { SIMPLE_TCL_OPT("version", VMDVERSION); SIMPLE_TCL_OPT("versionmsg", VERSION_MSG); SIMPLE_TCL_OPT("authors", VMD_AUTHORS); SIMPLE_TCL_OPT("arch", VMD_ARCH); SIMPLE_TCL_OPT("options", VMD_OPTIONS); SIMPLE_TCL_OPT("www", VMD_HOMEPAGE); SIMPLE_TCL_OPT("wwwhelp", VMD_HELPPAGE); // return the estimated amount of available physical memory if (!strcmp(argv[1], "freemem")) { long vmdcorefree = vmd_get_avail_physmem_mb(); Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewIntObj(vmdcorefree)); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } // return the number of available CPU cores if (!strcmp(argv[1], "numcpus")) { #if defined(VMDTHREADS) int numcpus = wkf_thread_numprocessors(); #else int numcpus = 1; #endif Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewIntObj(numcpus)); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } // return the CPU affinity list for the VMD process if (!strcmp(argv[1], "cpuaffinity")) { int numcpus = -1; int *cpuaffinitylist = NULL; #if defined(VMDTHREADS) cpuaffinitylist = wkf_cpu_affinitylist(&numcpus); #endif if (numcpus > 0 && cpuaffinitylist != NULL) { int i; Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); for (i=0; i<numcpus; i++) Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewIntObj(cpuaffinitylist[i])); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } if (cpuaffinitylist != NULL) free(cpuaffinitylist); Tcl_AppendResult(interp, "CPU affinity query unavailable on this platform", NULL); return TCL_ERROR; } // return the number of available CUDA devices if (!strcmp(argv[1], "numcudadevices")) { int numdevices; #if defined(VMDCUDA) vmd_cuda_num_devices(&numdevices); #else numdevices = 0; #endif Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewIntObj(numdevices)); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } // return the active display device (e.g. "text", "win", "cave", ...) if (!strcmp(argv[1], "dispdev")) { const char *disp = VMDgetDisplayTypeName(); Tcl_AppendResult(interp, disp, NULL); return TCL_OK; } // return the MPI node name if (!strcmp(argv[1], "nodename")) { Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewStringObj(app->par_name(), strlen(app->par_name()))); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } // return the MPI node rank if (!strcmp(argv[1], "noderank")) { Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewIntObj(app->par_rank())); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } // return the MPI node count if (!strcmp(argv[1], "nodecount")) { Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewIntObj(app->par_size())); Tcl_SetObjResult(interp, tcl_result); return TCL_OK; } } Tcl_AppendResult(interp, "vmdinfo: version | versionmsg | authors | arch | \n" "freemem | numcpus | cpuaffinity | numcudadevices | \n" "dispdev | nodename | noderank | nodecount | \n" "options | www | wwwhelp", NULL); return TCL_ERROR; }