29 #include "colvarmodule.h" 30 #include "colvarscript.h" 50 #define MIN_DEBUG_LEVEL 4 53 #include "molfile_plugin.h" 54 #include "libmolfile_plugin.h" 75 void ScriptTcl::suspend() {
79 void ScriptTcl::barrier() {
83 void ScriptTcl::initcheck() {
84 if ( initWasCalled == 0 ) {
86 CkPrintf(
"TCL: Suspending until startup complete.\n");
87 Tcl_CreateCommand(interp,
"param", Tcl_param,
88 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
89 Tcl_CreateCommand(interp,
"unknown", Tcl_param,
90 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
91 Tcl_CreateCommand(interp,
"isset", Tcl_isset_param,
92 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
93 Tcl_CreateCommand(interp,
"istrue", Tcl_istrue_param,
94 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
95 Tcl_CreateCommand(interp,
"structure", Tcl_reloadStructure,
96 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
105 ! ! Tcl_GetVar2(interp,
"tcl_platform",
"threaded", TCL_GLOBAL_ONLY);
112 void ScriptTcl::runController(
int task) {
117 doCallback(state->callback_labelstring.c_str(),
118 state->callback_valuestring.c_str());
123 void ScriptTcl::setParameter(
const char* param,
const char* value) {
127 (CProxy_Node(CkpvAccess(BOCclass_group).node)).scriptParam(msg);
131 void ScriptTcl::setParameter(
const char* param,
int value) {
134 sprintf(msg->
value,
"%d",value);
135 (CProxy_Node(CkpvAccess(BOCclass_group).node)).scriptParam(msg);
139 void ScriptTcl::reinitAtoms(
const char *basename) {
149 #if PY_MAJOR_VERSION >= 3 151 #define PYINT_CHECK PyLong_Check 152 #define PYINT_ASLONG PyLong_AsLong 153 #define PYSTRING_CHECK PyUnicode_Check 155 #define PYSTRING_ASSTRING PyUnicode_AsUTF8 159 #define PYINT_CHECK PyInt_Check 160 #define PYINT_ASLONG PyInt_AsLong 161 #define PYSTRING_CHECK PyString_Check 162 #define PYSTRING_ASSTRING PyString_AsString 166 static Tcl_Obj* python_tcl_convert(PyObject *obj) {
168 if ( PYINT_CHECK(obj) ) {
169 return Tcl_NewLongObj(PYINT_ASLONG(obj));
171 if ( PyFloat_Check(obj) ) {
172 return Tcl_NewDoubleObj(PyFloat_AsDouble(obj));
174 if ( PYSTRING_CHECK(obj) ) {
175 return Tcl_NewStringObj(PYSTRING_ASSTRING(obj), -1);
177 if ( PySequence_Check(obj) ) {
178 PyObject *iter = PyObject_GetIter(obj);
179 if ( ! iter )
NAMD_bug(
"python_tcl_convert failed to get iterator");
180 Tcl_Obj *rlist = Tcl_NewListObj(0,0);
181 while ( PyObject *item = PyIter_Next(iter) ) {
182 Tcl_ListObjAppendElement(0, rlist, python_tcl_convert(item));
188 PyObject *str = PyObject_Str(obj);
189 Tcl_Obj *robj = Tcl_NewStringObj(PYSTRING_ASSTRING(str), -1);
194 static int atoBool(
const char *s);
196 static PyObject* tcl_python_convert(Tcl_Obj *obj) {
198 if ( TCL_OK == Tcl_GetLongFromObj(0, obj, &rlong) )
199 return Py_BuildValue(
"l", rlong);
201 if ( TCL_OK == Tcl_GetDoubleFromObj(0, obj, &rdouble) )
202 return Py_BuildValue(
"d", rdouble);
203 const char *
rstring = Tcl_GetString(obj);
208 return PyBool_FromLong(rbool);
209 return Py_BuildValue(
"s",
rstring);
212 static Tcl_Interp *static_interp;
214 static PyObject* python_tcl_call(PyObject *
self, PyObject *args) {
215 Tcl_Interp *interp = static_interp;
216 Tcl_Obj *command = python_tcl_convert(args);
217 Tcl_IncrRefCount(command);
218 if ( TCL_OK != Tcl_EvalObjEx(interp,command,TCL_EVAL_DIRECT) ) {
219 PyErr_SetString(PyExc_RuntimeError, Tcl_GetStringResult(interp));
220 Tcl_DecrRefCount(command);
223 Tcl_DecrRefCount(command);
224 return tcl_python_convert(Tcl_GetObjResult(interp));
227 static PyObject* python_tcl_eval(PyObject *
self, PyObject *args) {
228 Tcl_Interp *interp = static_interp;
230 if ( ! PyArg_ParseTuple(args,
"s", &command) )
return 0;
231 if ( TCL_OK != Tcl_EvalEx(interp,command,-1,TCL_EVAL_DIRECT) ) {
232 PyErr_SetString(PyExc_RuntimeError, Tcl_GetStringResult(interp));
235 return tcl_python_convert(Tcl_GetObjResult(interp));
238 static PyObject* python_tcl_write(PyObject *
self, PyObject *args) {
240 if ( ! PyArg_ParseTuple(args,
"s", &
string) )
return 0;
241 CkPrintf(
"%s",
string);
245 static PyMethodDef namdPython_methods[] = {
246 {
"eval", python_tcl_eval, METH_VARARGS,
247 "Evaluate string in Tcl interpreter."},
248 {
"call", python_tcl_call, METH_VARARGS,
249 "Call command and arguments in Tcl interpreter."},
250 {
"write", python_tcl_write, METH_VARARGS,
251 "Write string using CkPrintf."},
252 {NULL, NULL, 0, NULL}
255 static PyMethodDef namdPython_methods_empty[] = {
256 {NULL, NULL, 0, NULL}
259 #if PY_MAJOR_VERSION >= 3 261 struct module_state {
265 static int namdPython_traverse(PyObject *m, visitproc visit,
void *arg);
266 static int namdPython_clear(PyObject *m);
267 PyObject *namdPythonModule;
269 static int namdPython_traverse(PyObject *m, visitproc visit,
void *arg) {
270 Py_VISIT(((
struct module_state*)PyModule_GetState(m))->error);
274 static int namdPython_clear(PyObject *m) {
275 Py_CLEAR(((
struct module_state*)PyModule_GetState(m))->error);
279 static struct PyModuleDef moduledef = {
280 PyModuleDef_HEAD_INIT,
283 sizeof(
struct module_state),
291 static PyObject* PyInit_tcl(
void) {
293 module = PyModule_Create(&moduledef);
294 if (module == NULL) {
295 NAMD_bug(
"Failed to create Python tcl module");
300 static struct PyModuleDef namdmoduledef = {
301 PyModuleDef_HEAD_INIT,
304 sizeof(
struct module_state),
305 namdPython_methods_empty,
312 static PyObject* PyInit_namd(
void) {
314 module = PyModule_Create(&namdmoduledef);
315 if (module == NULL) {
316 NAMD_bug(
"Failed to create Python namd module");
324 static void namd_python_initialize(
void *interp) {
325 if ( static_interp )
return;
326 static_interp = (Tcl_Interp*) interp;
328 #if PY_MAJOR_VERSION >= 3 329 PyImport_AppendInittab(
"tcl", &PyInit_tcl);
330 PyImport_AppendInittab(
"namd", &PyInit_namd);
334 Py_InitModule(
"tcl", namdPython_methods);
335 Py_InitModule(
"namd", namdPython_methods_empty);
338 const char * python_code =
"\n" 343 "class _namd_wrapper(object):\n" 344 " tcl = __import__('tcl')\n" 345 " class _wrapped(object):\n" 346 " def __init__(self,_name):\n" 347 " self.name = _name\n" 348 " def __call__(self,*args):\n" 349 " return self.tcl.call(self.name,*args)\n" 350 " def __getattr__(self,name):\n" 351 " if self.tcl.call('info','commands',name) == name:\n" 352 " return self._wrapped(name)\n" 354 " return self.tcl.call('param',name)\n" 355 " def __setattr__(self,name,val):\n" 356 " if self.tcl.call('info','commands',name) == name:\n" 357 " raise AttributeError\n" 358 " return self.tcl.call('param',name,val)\n" 359 " def __call__(self, **args):\n" 360 " for (name,val) in args.items():\n" 361 " self.tcl.call('param',name,val)\n" 363 "sys.modules[__name__] = _namd_wrapper()\n" 366 PyObject* mainmod = PyImport_AddModule(
"__main__");
367 PyObject* globalDictionary = PyModule_GetDict(mainmod);
368 PyObject* namdmod = PyImport_AddModule(
"namd");
369 PyObject* localDictionary = PyModule_GetDict(namdmod);
370 PyObject* result = PyRun_String(python_code, Py_file_input, globalDictionary, localDictionary);
372 if ( 0 != PyRun_SimpleString(
"import tcl\nimport namd\n") ) {
373 NAMD_bug(
"namd_python_initialize failed");
377 int ScriptTcl::Tcl_python(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
379 Tcl_SetResult(interp,(
char*)
"args: script",TCL_VOLATILE);
382 namd_python_initialize(interp);
383 PyObject *dict = PyModule_GetDict(PyImport_AddModule(
"__main__"));
385 const char *script = argv[1];
386 int token = Py_eval_input;
389 Tcl_DStringInit(&scr);
391 Tcl_DStringAppend(&scr,argv[1],-1);
392 for (
int i = 2; i < argc; ++i ) {
393 Tcl_DStringAppend(&scr,
" ",-1);
394 Tcl_DStringAppend(&scr,argv[i],-1);
396 script = Tcl_DStringValue(&scr);
398 while ( script[0] ==
' ' || script[0] ==
'\t' ) ++script;
399 for (
int i=0; script[i]; ++i ) {
400 if ( script[i] ==
'\n' ) {
401 token = Py_file_input;
408 PyObject *result = PyRun_String(script, token, dict, dict);
409 Tcl_ResetResult(interp);
410 Tcl_DStringFree(&scr);
412 if ( PyErr_Occurred() ) {
413 if ( result )
NAMD_bug(
"PyErr_Occurred indicates error but PyRun does not");
415 Tcl_AppendResult(interp,
"error from python interpreter\n", NULL);
416 PyObject *type, *value, *traceback, *str;
417 PyErr_Fetch(&type, &value, &traceback);
424 PyObject *mod = PyImport_ImportModule(
"traceback");
425 if ( ! mod )
return TCL_ERROR;
427 PyObject *func = PyObject_GetAttrString(mod,
"format_exception");
428 if ( ! func )
return TCL_ERROR;
432 PyObject *list = PyObject_CallFunctionObjArgs(func, type, value, traceback, NULL);
433 if ( ! list )
return TCL_ERROR;
439 Py_DECREF(traceback);
441 PyObject *iter = PyObject_GetIter(list);
442 if ( ! iter )
return TCL_ERROR;
443 while ( PyObject *item = PyIter_Next(iter) ) {
444 str = PyObject_Str(item);
445 Tcl_AppendResult(interp, PYSTRING_ASSTRING(str),
"\n", NULL);
453 }
else if ( ! result ) {
454 NAMD_bug(
"PyRun indicates error but PyErr_Occurred does not");
456 if ( result != Py_None ) {
457 Tcl_SetObjResult(interp, python_tcl_convert(result));
465 int ScriptTcl::Tcl_python(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
466 Tcl_SetResult(interp,(
char*)
"python not enabled",TCL_VOLATILE);
470 #endif // NAMD_PYTHON 472 int ScriptTcl::Tcl_startup(ClientData clientData,
473 Tcl_Interp *interp,
int argc,
const char *argv[]) {
475 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
483 int ScriptTcl::Tcl_exit(ClientData clientData,
484 Tcl_Interp *interp,
int argc,
const char *argv[]) {
486 if ( CmiNumPartitions() > 1 ) {
487 if ( ! script->initWasCalled ) CkPrintf(
"TCL: Running startup before exit due to replicas.\n");
490 CkPrintf(
"TCL: Exiting due to exit command.\n");
491 if ( script->runWasCalled ) script->runController(
SCRIPT_END);
492 #if CMK_HAS_PARTITION 496 Tcl_SetResult(interp,(
char*)
"wrong # args: should be \"exit ?returnCode?\"",TCL_VOLATILE);
500 if (argc > 1 && Tcl_GetInt(interp,argv[1],&status) != TCL_OK) {
507 int ScriptTcl::Tcl_abort(ClientData,
508 Tcl_Interp *,
int argc,
const char *argv[]) {
510 Tcl_DStringInit(&msg);
511 Tcl_DStringAppend(&msg,
"TCL:",-1);
512 if ( argc == 1 ) Tcl_DStringAppend(&msg,
" abort called",-1);
513 for (
int i = 1; i < argc; ++i ) {
514 Tcl_DStringAppend(&msg,
" ",-1);
515 Tcl_DStringAppend(&msg,argv[i],-1);
518 Tcl_DStringFree(&msg);
522 int ScriptTcl::Tcl_numPes(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
524 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
527 Tcl_SetObjResult(interp, Tcl_NewIntObj(CkNumPes()));
531 int ScriptTcl::Tcl_numNodes(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
533 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
536 Tcl_SetObjResult(interp, Tcl_NewIntObj(CkNumNodes()));
540 int ScriptTcl::Tcl_numPhysicalNodes(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
542 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
545 Tcl_SetObjResult(interp, Tcl_NewIntObj(CmiNumPhysicalNodes()));
549 int ScriptTcl::Tcl_numReplicas(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
551 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
554 Tcl_SetObjResult(interp, Tcl_NewIntObj(CmiNumPartitions()));
558 int ScriptTcl::Tcl_myReplica(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
560 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
563 Tcl_SetObjResult(interp, Tcl_NewIntObj(CmiMyPartition()));
567 #define CHECK_REPLICA(REP) do {\ 569 Tcl_SetResult(interp,(char*)"negative replica index",TCL_VOLATILE); \ 572 if ( (REP) >= CmiNumPartitions() ) { \ 573 Tcl_SetResult(interp,(char*)"non-existent replica index",TCL_VOLATILE); \ 578 int ScriptTcl::Tcl_replicaEval(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
580 Tcl_SetResult(interp,(
char*)
"args: dest script",TCL_VOLATILE);
583 int dest = atoi(argv[1]);
585 #if CMK_HAS_PARTITION 587 Tcl_DStringInit(&recvstr);
590 CmiAssert(recvMsg != NULL);
591 int code = recvMsg->
code;
592 Tcl_DStringAppend(&recvstr, recvMsg->
data, recvMsg->
size);
593 Tcl_DStringResult(interp, &recvstr);
594 Tcl_DStringFree(&recvstr);
598 return Tcl_EvalEx(interp,argv[2],-1,TCL_EVAL_GLOBAL);
602 int ScriptTcl::Tcl_replicaYield(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
604 Tcl_SetResult(interp,(
char*)
"args: ?seconds?",TCL_VOLATILE);
609 if ( sscanf(argv[1],
"%lf",&time) != 1 ) {
610 Tcl_SetResult(interp,(
char*)
"args: ?seconds?",TCL_VOLATILE);
615 time += CmiWallTimer();
616 do { CsdSchedulePoll(); }
while ( CmiWallTimer() < time );
624 int ScriptTcl::Tcl_replicaSendrecv(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
625 if ( argc < 3 || argc > 4 ) {
626 Tcl_SetResult(interp,(
char*)
"args: data dest ?source?",TCL_VOLATILE);
630 Tcl_DStringInit(&recvstr);
631 int sendcount = strlen(argv[1]);
633 int dest = atoi(argv[2]);
635 if ( argc > 3 ) source = atoi(argv[3]);
636 #if CMK_HAS_PARTITION 637 if (dest == CmiMyPartition()) {
638 Tcl_DStringSetLength(&recvstr,sendcount);
639 memcpy(Tcl_DStringValue(&recvstr),argv[1],sendcount);
642 replica_sendRecv(argv[1], sendcount, dest, CkMyPe(), &recvMsg, source, CkMyPe());
643 CmiAssert(recvMsg != NULL);
644 Tcl_DStringAppend(&recvstr, recvMsg->
data, recvMsg->
size);
648 Tcl_DStringResult(interp, &recvstr);
649 Tcl_DStringFree(&recvstr);
653 int ScriptTcl::Tcl_replicaSend(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
655 Tcl_SetResult(interp,(
char*)
"args: data dest",TCL_VOLATILE);
658 int sendcount = strlen(argv[1]);
659 int dest = atoi(argv[2]);
660 #if CMK_HAS_PARTITION 666 int ScriptTcl::Tcl_replicaRecv(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
668 Tcl_SetResult(interp,(
char*)
"args: source",TCL_VOLATILE);
672 Tcl_DStringInit(&recvstr);
674 int source = atoi(argv[1]);
675 #if CMK_HAS_PARTITION 678 CmiAssert(recvMsg != NULL);
679 Tcl_DStringAppend(&recvstr, recvMsg->
data, recvMsg->
size);
682 Tcl_DStringResult(interp, &recvstr);
683 Tcl_DStringFree(&recvstr);
687 int ScriptTcl::Tcl_replicaBarrier(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
689 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
692 #if CMK_HAS_PARTITION 698 int ScriptTcl::Tcl_replicaAtomSendrecv(ClientData clientData, Tcl_Interp *interp,
int argc,
const char **argv) {
701 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
702 Tcl_SetResult(interp,
703 (
char*)
"replicaUniformPatchGrids is required for atom exchange",
707 if ( argc < 2 || argc > 3 ) {
708 Tcl_SetResult(interp,
709 (
char*)
"bad arg count; args: dest ?source?",TCL_VOLATILE);
713 if ( sscanf(argv[1],
"%d", &dest) != 1 ) {
714 Tcl_SetResult(interp,(
char*)
"bad dest; args: dest ?source?",TCL_VOLATILE);
719 if ( sscanf(argv[2],
"%d", &source) != 1 ) {
720 Tcl_SetResult(interp,
721 (
char*)
"bad source; args: dest ?source?",TCL_VOLATILE);
726 #if CMK_HAS_PARTITION 727 if (dest != CmiMyPartition()) {
729 replica_sendRecv((
char*)&(script->state->lattice),
sizeof(
Lattice), dest, CkMyPe(), &recvMsg, source, CkMyPe());
730 CmiAssert(recvMsg != NULL);
731 memcpy(&(script->state->lattice), recvMsg->
data, recvMsg->
size);
737 sprintf(str,
"%d", dest);
738 script->setParameter(
"scriptArg1", str);
739 sprintf(str,
"%d", source);
740 script->setParameter(
"scriptArg2", str);
746 #if CMK_HAS_PARTITION 747 if (dest != CmiMyPartition()) {
751 CmiAssert(recvMsg != NULL);
752 memcpy(cstate, recvMsg->
data, recvMsg->
size);
760 int ScriptTcl::Tcl_replicaAtomSend(ClientData clientData, Tcl_Interp *interp,
int argc,
const char **argv) {
763 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
764 Tcl_SetResult(interp,
765 (
char*)
"replicaUniformPatchGrids is required for atom exchange",
770 Tcl_SetResult(interp,(
char*)
"bad arg count; args: dest",TCL_VOLATILE);
774 if ( sscanf(argv[1],
"%d", &dest) != 1 ) {
775 Tcl_SetResult(interp,(
char*)
"bad dest; args: dest",TCL_VOLATILE);
779 #if CMK_HAS_PARTITION 784 sprintf(str,
"%d", dest);
785 script->setParameter(
"scriptArg1", str);
791 #if CMK_HAS_PARTITION 799 int ScriptTcl::Tcl_replicaAtomRecv(ClientData clientData, Tcl_Interp *interp,
int argc,
const char **argv) {
802 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
803 Tcl_SetResult(interp,
804 (
char*)
"replicaUniformPatchGrids is required for atom exchange",
809 Tcl_SetResult(interp,(
char*)
"bad arg count; args: ?source?",TCL_VOLATILE);
814 if ( sscanf(argv[1],
"%d", &source) != 1 ) {
815 Tcl_SetResult(interp,(
char*)
"bad source; args: ?source?",TCL_VOLATILE);
820 #if CMK_HAS_PARTITION 823 CmiAssert(recvMsg != NULL);
824 memcpy(&(script->state->lattice), recvMsg->
data, recvMsg->
size);
829 sprintf(str,
"%d", source);
830 script->setParameter(
"scriptArg2", str);
836 #if CMK_HAS_PARTITION 840 CmiAssert(recvMsg != NULL);
841 memcpy(cstate, recvMsg->
data, recvMsg->
size);
849 int ScriptTcl::Tcl_stdout(ClientData,
850 Tcl_Interp *interp,
int argc,
const char *argv[]) {
852 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
856 const char *filename= argv[1];
857 CkPrintf(
"TCL: redirecting stdout to file %s\n", filename);
859 if ( ! freopen(filename,
"a", stdout) ) {
860 Tcl_SetResult(interp, strerror(errno), TCL_VOLATILE);
866 int ScriptTcl::Tcl_print(ClientData,
867 Tcl_Interp *,
int argc,
const char *argv[]) {
869 Tcl_DStringInit(&msg);
870 for (
int i = 1; i < argc; ++i ) {
871 Tcl_DStringAppend(&msg,
" ",-1);
872 Tcl_DStringAppend(&msg,argv[i],-1);
874 CkPrintf(
"TCL:%s\n",Tcl_DStringValue(&msg));
875 Tcl_DStringFree(&msg);
879 int ScriptTcl::Tcl_config(ClientData clientData,
880 Tcl_Interp *interp,
int argc,
const char *argv[]) {
902 int arglen = 1;
int ai;
903 for (ai=1; ai<argc; ++ai) { arglen += strlen(argv[ai]) + 1; }
904 char *data =
new char[arglen]; *data = 0;
905 char *name =
new char[arglen]; *name = 0;
908 const char *s = argv[1];
910 for ( ; *s && *s !=
'='; *(sn++) = *(s++) );
914 for (ai=2; ai<argc; ++ai) {
if (argv[ai][0] ==
'#') argc = ai; }
918 if ( *s ) { ++s; strcat(data,s); }
919 else if ( ai < argc && argv[ai][0] ==
'=' ) {
920 strcat(data,argv[ai]+1);
923 for ( ; ai<argc; ++ai) {
924 if ( data[0] ) { strcat(data,
" "); }
925 strcat(data,argv[ai]);
931 Tcl_SetResult(interp,(
char*)
"error parsing config file",TCL_VOLATILE);
938 script->config->
add_element( name, strlen(name), data, strlen(data) );
949 Tcl_SetResult(interp,
950 (
char*)
"tried before startup to read config file parameter " 951 "that was not set",TCL_VOLATILE);
954 Tcl_SetResult(interp,strlist->
data,TCL_VOLATILE);
958 int ScriptTcl::Tcl_isset_config(ClientData clientData,
959 Tcl_Interp *interp,
int argc,
const char *argv[]) {
961 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
965 const char *param = argv[1];
968 Tcl_SetResult(interp, (
char*)(strlist ?
"1" :
"0"), TCL_VOLATILE);
974 if (!strcasecmp(s,
"on"))
return 1;
975 if (!strcasecmp(s,
"off"))
return 0;
976 if (!strcasecmp(s,
"true"))
return 1;
977 if (!strcasecmp(s,
"false"))
return 0;
978 if (!strcasecmp(s,
"yes"))
return 1;
979 if (!strcasecmp(s,
"no"))
return 0;
980 if (!strcasecmp(s,
"1"))
return 1;
981 if (!strcasecmp(s,
"0"))
return 0;
985 int ScriptTcl::Tcl_istrue_config(ClientData clientData,
986 Tcl_Interp *interp,
int argc,
const char *argv[]) {
988 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
992 const char *param = argv[1];
996 Tcl_SetResult(interp,(
char*)
"parameter value is not set",TCL_VOLATILE);
1001 Tcl_SetResult(interp,(
char*)
"parameter value is not boolean",TCL_VOLATILE);
1004 Tcl_SetResult(interp, (
char*)(val ?
"1" :
"0"), TCL_VOLATILE);
1008 int ScriptTcl::Tcl_istrue_param(ClientData clientData,
1009 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1011 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1015 const char *param = argv[1];
1017 int val =
simParams->istrueinparseopts(param);
1019 Tcl_SetResult(interp,(
char*)
"unknown parameter",TCL_VOLATILE);
1023 Tcl_SetResult(interp,(
char*)
"parameter is not boolean",TCL_VOLATILE);
1027 Tcl_SetResult(interp,(
char*)
"parameter value is not set",TCL_VOLATILE);
1030 if ( val != 0 && val != 1 ) {
1031 Tcl_SetResult(interp,(
char*)
"bug in Tcl_istrue_param",TCL_VOLATILE);
1034 Tcl_SetResult(interp, (
char*)(val ?
"1" :
"0"), TCL_VOLATILE);
1038 int ScriptTcl::Tcl_isset_param(ClientData clientData,
1039 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1041 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1045 const char *param = argv[1];
1047 int val =
simParams->issetinparseopts(param);
1049 Tcl_SetResult(interp,(
char*)
"unknown parameter",TCL_VOLATILE);
1052 Tcl_SetResult(interp, (
char*)(val ?
"1" :
"0"), TCL_VOLATILE);
1056 int ScriptTcl::Tcl_param(ClientData clientData,
1057 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1058 if (argc != 2 && argc != 3 && argc != 5) {
1059 Tcl_SetResult(interp,
1060 (
char*)
"wrong # args for NAMD config parameter",TCL_VOLATILE);
1064 const char *param = argv[1];
1066 Tcl_SetResult(interp,
1067 (
char*)
"parameter name too long for NAMD config parameter",
1075 char *result =
simParams->getfromparseopts(param,buf);
1077 Tcl_SetResult(interp, result, TCL_VOLATILE);
1080 Tcl_SetResult(interp,
1081 (
char*)
"parameter unknown for NAMD config parameter",TCL_VOLATILE);
1087 int arglen = strlen(argv[2]) + 1;
1088 if ( argc == 5 ) arglen += strlen(argv[3]) + strlen(argv[4]) + 2;
1090 Tcl_SetResult(interp,
1091 (
char*)
"parameter value too long for NAMD config parameter",
1095 if ( argc == 3 ) sprintf(value,
"%s",argv[2]);
1096 if ( argc == 5 ) sprintf(value,
"%s %s %s",argv[2],argv[3],argv[4]);
1098 iout <<
"TCL: Setting parameter " << param <<
" to " << value <<
"\n" <<
endi;
1101 script->setParameter(param,value);
1112 int ScriptTcl::Tcl_reinitvels(ClientData clientData,
1113 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1115 script->initcheck();
1117 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1120 const char *temp = argv[1];
1122 script->setParameter(
"initialTemp",temp);
1129 int ScriptTcl::Tcl_rescalevels(ClientData clientData,
1130 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1132 script->initcheck();
1134 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1137 const char *factor = argv[1];
1139 script->setParameter(
"scriptArg1",factor);
1146 int ScriptTcl::Tcl_run(ClientData clientData,
1147 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1149 script->initcheck();
1151 Tcl_SetResult(interp,(
char*)
"too few args",TCL_VOLATILE);
1155 Tcl_SetResult(interp,(
char*)
"too many args",TCL_VOLATILE);
1160 if ( ! strcmp(argv[1],
"norepeat") ) {
1161 if ( script->runWasCalled ) { norepeat = 1; }
1163 Tcl_SetResult(interp,(
char*)
"first arg not norepeat",TCL_VOLATILE);
1167 int numstepsarg = argc-1;
1169 if (Tcl_GetInt(interp,argv[numstepsarg],&numsteps) != TCL_OK) {
1173 Tcl_SetResult(interp,
1174 (
char*)
"number of steps must be non-negative",TCL_VOLATILE);
1179 Tcl_SetResult(interp,
1180 (
char*)
"firstTimestep must be a multiple of stepsPerCycle",
1184 if (numsteps %
simParams->stepsPerCycle) {
1185 Tcl_SetResult(interp,
1186 (
char*)
"number of steps must be a multiple of stepsPerCycle",
1191 Tcl_SetResult(interp,
1192 (
char*)
"run called with minimization enabled; " 1193 "use minimize command instead",TCL_VOLATILE);
1198 <<
" will be ignored.\n";
1202 script->setParameter(
"CUDASOAintegrate",
"on");
1204 iout <<
"TCL: Running for " << numsteps <<
" steps";
1205 if ( norepeat )
iout <<
" without repeating first step";
1208 script->setParameter(
"numsteps",
simParams->firstTimestep + numsteps);
1211 script->runWasCalled = 1;
1213 script->setParameter(
"firsttimestep",
simParams->N);
1218 int ScriptTcl::Tcl_minimize(ClientData clientData,
1219 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1221 script->initcheck();
1223 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1227 if (Tcl_GetInt(interp,argv[1],&numsteps) != TCL_OK) {
1231 Tcl_SetResult(interp,
1232 (
char*)
"number of steps must be non-negative",TCL_VOLATILE);
1237 Tcl_SetResult(interp,
1238 (
char*)
"firstTimestep must be a multiple of stepsPerCycle",
1242 if (numsteps %
simParams->stepsPerCycle) {
1243 Tcl_SetResult(interp,
1244 (
char*)
"number of steps must be a multiple of stepsPerCycle",
1250 <<
" will be ignored.\n";
1254 script->setParameter(
"CUDASOAintegrate",
"off");
1256 iout <<
"TCL: Minimizing for " << numsteps <<
" steps\n" <<
endi;
1258 script->setParameter(
"numsteps",
simParams->firstTimestep + numsteps);
1261 script->runWasCalled = 1;
1263 script->setParameter(
"firsttimestep",
simParams->N);
1269 int ScriptTcl::Tcl_moveallby(ClientData clientData,
1270 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1272 script->initcheck();
1274 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1277 const char **fstring;
1280 if (Tcl_SplitList(interp, argv[1], &fnum, &fstring) != TCL_OK)
1283 (Tcl_GetDouble(interp, fstring[0],&x) != TCL_OK) ||
1284 (Tcl_GetDouble(interp, fstring[1],&y) != TCL_OK) ||
1285 (Tcl_GetDouble(interp, fstring[2],&z) != TCL_OK) ) {
1286 Tcl_SetResult(interp,(
char*)
"argument not a vector",TCL_VOLATILE);
1287 Tcl_Free((
char*)fstring);
1290 Tcl_Free((
char*)fstring);
1294 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).moveAllBy(msg);
1300 int ScriptTcl::Tcl_move(ClientData clientData,
1301 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1303 script->initcheck();
1305 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1308 const char **fstring;
int fnum;
int atomid;
int moveto;
double x, y, z;
1309 if (Tcl_GetInt(interp,argv[1],&atomid) != TCL_OK)
return TCL_ERROR;
1310 if (argv[2][0]==
't' && argv[2][1]==
'o' && argv[2][2]==0) moveto = 1;
1311 else if (argv[2][0]==
'b' && argv[2][1]==
'y' && argv[2][2]==0) moveto = 0;
1313 Tcl_SetResult(interp,
1314 (
char*)
"syntax is 'move <id> to|by {<x> <y> <z>}'",TCL_VOLATILE);
1317 if (Tcl_SplitList(interp, argv[3], &fnum, &fstring) != TCL_OK) {
1321 (Tcl_GetDouble(interp, fstring[0],&x) != TCL_OK) ||
1322 (Tcl_GetDouble(interp, fstring[1],&y) != TCL_OK) ||
1323 (Tcl_GetDouble(interp, fstring[2],&z) != TCL_OK) ) {
1324 Tcl_SetResult(interp,(
char*)
"third argument not a vector",TCL_VOLATILE);
1325 Tcl_Free((
char*)fstring);
1328 Tcl_Free((
char*)fstring);
1332 iout <<
"TCL: Moving atom " << atomid <<
" ";
1333 if ( moveto )
iout <<
"to";
else iout <<
"by";
1337 msg->
atomid = atomid - 1;
1340 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).moveAtom(msg);
1347 int ScriptTcl::Tcl_output(ClientData clientData,
1348 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1350 script->initcheck();
1352 Tcl_SetResult(interp,(
char*)
"too few args",TCL_VOLATILE);
1356 Tcl_SetResult(interp,(
char*)
"too many args",TCL_VOLATILE);
1359 int filenamearg = argc-1;
1361 Tcl_SetResult(interp,(
char*)
"file name too long",TCL_VOLATILE);
1367 if ( ! strcmp(argv[1],
"withforces") ) {
1369 }
else if ( ! strcmp(argv[1],
"onlyforces") ) {
1373 Tcl_SetResult(interp,
1374 (
char*)
"first arg not withforces or onlyforces",TCL_VOLATILE);
1384 script->setParameter(
"outputname",argv[filenamearg]);
1386 iout <<
"TCL: Writing to files with basename " <<
1389 if ( doforces && ! script->runWasCalled )
NAMD_die(
1390 "No forces to output; must call run or minimize first.");
1395 script->setParameter(
"outputname",oldname);
1403 measure_result = Tcl_Eval(interp,measure_command);
1408 int ScriptTcl::Tcl_measure(ClientData clientData,
1409 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1411 script->initcheck();
1413 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1416 script->measure_command = argv[1];
1420 return script->measure_result;
1435 int ScriptTcl::Tcl_colvarbias(ClientData clientData,
1436 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1438 script->initcheck();
1439 if (argc < 4 || argc % 2) {
1440 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1445 Tcl_SetResult(interp,(
char*)
"colvars module not active",TCL_VOLATILE);
1448 if ( ! strcmp(argv[1],
"changeconfig") ) {
1449 for (
int i=2; i<argc; i+=2 ) {
1450 std::string name(argv[i]);
1451 std::string conf(argv[i+1]);
1452 colvars->change_configuration(name,conf);
1455 }
else if ( ! strcmp(argv[1],
"energydiff") ) {
1456 if ( ! script->runWasCalled ) {
1457 Tcl_SetResult(interp,
1458 (
char*)
"energydiff requires a previous timestep",TCL_VOLATILE);
1462 for (
int i=2; i<argc; i+=2 ) {
1463 std::string name(argv[i]);
1464 std::string conf(argv[i+1]);
1465 ediff += colvars->energy_difference(name,conf);
1467 Tcl_SetObjResult(interp, Tcl_NewDoubleObj(ediff));
1470 Tcl_SetResult(interp,(
char*)
"unknown colvarbias operation",TCL_VOLATILE);
1478 int ScriptTcl::Tcl_colvarvalue(ClientData clientData,
1479 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1481 script->initcheck();
1483 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1488 Tcl_SetResult(interp,(
char*)
"colvars module not active",TCL_VOLATILE);
1492 std::string name(argv[1]);
1493 std::string value = colvars->read_colvar(name);
1497 found = value.find(
"(");
1498 if (found != std::string::npos) {
1499 value.replace(found, 1,
" ");
1505 found = value.find(
")");
1506 if (found != std::string::npos) {
1507 value.replace(found, 1,
" ");
1513 found = value.find(
",");
1514 if (found != std::string::npos) {
1515 value.replace(found, 1,
" ");
1521 Tcl_DString recvstr;
1522 Tcl_DStringInit(&recvstr);
1523 Tcl_DStringAppend(&recvstr,value.c_str(), -1);
1524 Tcl_DStringResult(interp, &recvstr);
1525 Tcl_DStringFree(&recvstr);
1529 int ScriptTcl::Tcl_colvarfreq(ClientData clientData,
1530 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1532 script->initcheck();
1534 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1539 Tcl_SetResult(interp,(
char*)
"colvars module not active",TCL_VOLATILE);
1543 if (Tcl_GetInt(interp,argv[1],&new_freq) != TCL_OK) {
1546 colvars->cv_traj_freq = new_freq;
1553 Tcl_Interp *interp_in,
1554 int objc, Tcl_Obj *
const objv[]);
1556 int ScriptTcl::Tcl_colvars(ClientData clientData,
1559 Tcl_Obj *
const objv[])
1562 script->initcheck();
1566 int ScriptTcl::Tcl_checkpoint(ClientData clientData,
1567 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1569 script->initcheck();
1571 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1580 int ScriptTcl::Tcl_revert(ClientData clientData,
1581 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1583 script->initcheck();
1585 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1595 unsigned int hash = 0;
1602 return hash % CmiNumPartitions();
1605 int ScriptTcl::Tcl_checkpointReplica(ClientData clientData,
1606 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1608 script->initcheck();
1609 if (argc < 2 || argc > 3) {
1610 Tcl_SetResult(interp,
1611 (
char*)
"args: <key> ?<replica> or global?",TCL_VOLATILE);
1614 script->setParameter(
"scriptStringArg1", argv[1]);
1615 int replica = CmiMyPartition();
1617 if ( ! strcmp(argv[2],
"global") ) {
1619 }
else if ( sscanf(argv[2],
"%d",&replica) != 1 ) {
1620 Tcl_SetResult(interp,
1621 (
char*)
"args: <key> ?<replica> or global?",TCL_VOLATILE);
1625 if ( replica != CmiMyPartition() ) {
1626 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
1627 Tcl_SetResult(interp,
1628 (
char*)
"replicaUniformPatchGrids is required for " 1629 "checkpointing on other replicas",TCL_VOLATILE);
1636 sprintf(str,
"%d", replica);
1637 script->setParameter(
"scriptIntArg1", str);
1640 if ( replica != CmiMyPartition() ) CkpvAccess(_qd)->create(1);
1647 Tcl_SetResult(interp,
1648 (
char*)
"checkpointStore/Load/Swap/Free called via unrecognized name",
1656 int ScriptTcl::Tcl_replicaDcdFile(ClientData clientData,
1657 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1658 #ifdef MEM_OPT_VERSION 1659 Tcl_SetResult(interp,
1660 (
char*)
"replicaDcdFile not supported in memory-optimized builds",
1665 script->initcheck();
1668 if (argc < 2 || argc > 3 || ((cmpoff = strcmp(argv[1],
"off")) != 0 && sscanf(argv[1],
"%d",&index) != 1) ) {
1669 Tcl_SetResult(interp,(
char*)
"args: <index>|off ?<filename>?",TCL_VOLATILE);
1675 }
else if ( argc == 3 ) {
1682 int ScriptTcl::Tcl_replicaDcdSelectFile(ClientData clientData,
1683 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1684 #ifdef MEM_OPT_VERSION 1685 Tcl_SetResult(interp,
1686 (
char*)
"replicaDcdSelectFile not supported in memory-optimized builds",
1691 script->initcheck();
1693 char *keystr =
new char[256];
1695 if (argc < 3 || argc > 4 || ((cmpoff = strcmp(argv[1],
"off")) != 0 && sscanf(argv[1],
"%d",&index ) != 1)) {
1696 Tcl_SetResult(interp,(
char*)
"args: <index>|off ?<filename>?",TCL_VOLATILE);
1702 }
else if ( argc == 4 ) {
1710 int ScriptTcl::Tcl_callback(ClientData clientData,
1711 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1714 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1718 delete [] script->callbackname;
1719 script->callbackname =
new char[strlen(argv[1])+1];
1720 strcpy(script->callbackname,argv[1]);
1722 iout <<
"TCL: Reduction callback proc set to " <<
1723 script->callbackname <<
"\n" <<
endi;
1728 void ScriptTcl::doCallback(
const char *labels,
const char *data) {
1729 if ( ! callbackname )
return;
1730 int len = strlen(callbackname) + strlen(labels) + strlen(data) + 7;
1731 char *cmd =
new char[len];
1732 sprintf(cmd,
"%s {%s} {%s}", callbackname, labels, data);
1733 int rval = Tcl_Eval(interp,cmd);
1735 if (rval != TCL_OK) {
1736 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
1737 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
1743 int ScriptTcl::Tcl_reinitatoms(ClientData clientData,
1744 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1746 script->initcheck();
1748 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1753 iout <<
"TCL: Reinitializing atom data\n" <<
endi;
1761 msg->
lattice = script->state->lattice;
1762 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).setLattice(msg);
1765 StringList *coordinateFilename = script->state->configList->
find(
"bincoordinates");
1766 if ( coordinateFilename ) {
1768 }
else if (coordinateFilename = script->state->configList->
find(
"coordinates")) {
1769 PDB coordpdb(coordinateFilename->
data);
1770 if ( coordpdb.num_atoms() != script->state->pdb->
num_atoms() ) {
1771 NAMD_die(
"inconsistent atom count on re-reading coordinates pdb file");
1774 coordpdb.get_all_positions(positions);
1776 delete [] positions;
1778 iout <<
iWARN <<
"reinitatoms may fail if pdb-format output has occurred\n" <<
endi;
1781 script->reinitAtoms();
1785 iout <<
"TCL: Reinitializing atom data from files with basename " << argv[1] <<
"\n" <<
endi;
1787 simParams->readExtendedSystem((std::string(argv[1])+
".xsc").c_str(), &(script->state->lattice));
1794 msg->
lattice = script->state->lattice;
1795 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).setLattice(msg);
1797 script->reinitAtoms(argv[1]);
1802 #define DEG2RAD 3.14159625359/180.0 1803 #define UNITCELLSLOP 0.0001 1810 if (ts->A <= 1 || ts->B <= 1 || ts->C <= 1)
return 0;
1814 double epsalpha =
DEG2RAD*(ts->alpha-90.0);
1815 double epsbeta =
DEG2RAD*(ts->beta-90.0);
1816 double epsgamma =
DEG2RAD*(ts->gamma-90.0);
1817 double cosAB = -sin(epsgamma);
1818 double sinAB = cos(epsgamma);
1819 double cosAC = -sin(epsbeta);
1820 double cosBC = -sin(epsalpha);
1825 Vector A(0), B(0), vecC(0);
1831 vecC.
x = ts->C * cosAC;
1832 vecC.
y = (ts->B*ts->C*cosBC - B.x*vecC.
x)/B.y;
1833 vecC.
z = sqrt(ts->C*ts->C - vecC.
x*vecC.
x - vecC.
y*vecC.
y);
1841 int ScriptTcl::Tcl_coorfile(ClientData clientData,
1842 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1844 script->initcheck();
1845 if (argc == 4 && !strcmp(argv[1],
"open")) {
1846 if (strcmp(argv[2],
"dcd")) {
1847 NAMD_die(
"Sorry, coorfile presently supports only DCD files");
1851 Tcl_AppendResult(interp,
"coorfile: Error opening file ", argv[3], NULL);
1855 Tcl_AppendResult(interp,
"Coordinate file ", argv[3],
1856 "\ncontains the wrong number of atoms.", NULL);
1861 iout <<
iINFO <<
"Coordinate file " << argv[3] <<
" opened for reading.\n" 1863 }
else if (argc == 2 && !strcmp(argv[1],
"read")) {
1865 Tcl_AppendResult(interp,
"coorfile read: Error, no file open for reading",
1869 molfile_timestep_t ts;
1873 Tcl_SetObjResult(interp, Tcl_NewIntObj(-1));
1879 iout <<
iINFO <<
"Updating unit cell from timestep.\n" <<
endi;
1880 if ( lattice.
a_p() && ! script->state->lattice.
a_p() ||
1881 lattice.
b_p() && ! script->state->lattice.
b_p() ||
1882 lattice.
c_p() && ! script->state->lattice.
c_p() ) {
1883 iout <<
iWARN <<
"Cell basis vectors should be specified before reading trajectory.\n" <<
endi;
1886 Vector a(0.);
if ( script->state->lattice.
a_p() ) a = lattice.
a();
1887 Vector b(0.);
if ( script->state->lattice.
b_p() ) b = lattice.
b();
1888 Vector c(0.);
if ( script->state->lattice.
c_p() ) c = lattice.
c();
1889 script->state->lattice.
set(a,b,c);
1891 msg->
lattice = script->state->lattice;
1892 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).setLattice(msg);
1901 script->reinitAtoms();
1902 Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
1903 }
else if (argc == 2 && !strcmp(argv[1],
"close")) {
1905 Tcl_AppendResult(interp,
"coorfile close: No file opened for reading!",
1915 }
else if (argc ==2 && !strcmp(argv[1],
"skip")) {
1917 Tcl_AppendResult(interp,
"coorfile skip: Error, no file open for reading",
1923 Tcl_SetObjResult(interp, Tcl_NewIntObj(-1));
1926 Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
1929 NAMD_die(
"Unknown option passed to coorfile");
1934 int ScriptTcl::Tcl_dumpbench(ClientData clientData,
1935 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1937 script->initcheck();
1939 Tcl_AppendResult(interp,
"usage: dumpbench <filename>", NULL);
1943 if ( CkNumPes() != 1 ) {
1944 Tcl_AppendResult(interp,
"multiple processors detected; dumpbench only works on serial runs", NULL);
1948 FILE *file = fopen(argv[1],
"w");
1950 Tcl_AppendResult(interp,
"dumpbench: error opening file ", argv[1], NULL);
1955 Tcl_AppendResult(interp,
"dumpbench: error dumping benchmark data", NULL);
1961 Tcl_AppendResult(interp,
"benchmark data written to file ", argv[1], NULL);
1967 int ScriptTcl::Tcl_consForceConfig(ClientData clientData,
1968 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
1970 script->initcheck();
1972 Tcl_AppendResult(interp,
"consForceConfig requires constantForce on", NULL);
1976 Tcl_WrongNumArgs(interp, 1, objv, (
char *)
"<atomids> <forces>");
1979 int natoms, nforces;
1980 Tcl_Obj **atomobjlist, **forceobjlist;
1981 if (Tcl_ListObjGetElements(interp, objv[1], &natoms, &atomobjlist) != TCL_OK ||
1982 Tcl_ListObjGetElements(interp, objv[2], &nforces, &forceobjlist) != TCL_OK) {
1985 if (natoms != nforces) {
1986 Tcl_AppendResult(interp, (
char *)
"consforceconfig: atom list and force list not the same size!", NULL);
1990 for (
int i=0; i<natoms; i++) {
1995 if (Tcl_GetIntFromObj(interp, atomobjlist[i], &atomid) != TCL_OK)
1997 if (Tcl_ListObjGetElements(interp, forceobjlist[i], &nelem, &elemlist) != TCL_OK)
2000 Tcl_AppendResult(interp, (
char *)
"consforceconfig: forces must have three elements", NULL);
2003 if (Tcl_GetDoubleFromObj(interp, elemlist[0], &force.
x) != TCL_OK ||
2004 Tcl_GetDoubleFromObj(interp, elemlist[1], &force.
y) != TCL_OK ||
2005 Tcl_GetDoubleFromObj(interp, elemlist[2], &force.
z) != TCL_OK) {
2011 (CProxy_ComputeMgr(CkpvAccess(BOCclass_group).computeMgr)).recvComputeConsForceMsg(msg);
2015 int ScriptTcl::Tcl_reloadCharges(ClientData clientData,
2016 Tcl_Interp *interp,
int argc,
const char *argv[]) {
2018 script->initcheck();
2020 Tcl_AppendResult(interp,
"usage: reloadCharges <filename>", NULL);
2032 int ScriptTcl::Tcl_reloadGridforceGrid(ClientData clientData,
2033 Tcl_Interp *interp,
int argc,
const char *argv[]) {
2035 script->initcheck();
2037 const char *key = NULL;
2042 }
else if (argc == 2) {
2045 Tcl_AppendResult(interp,
"usage: reloadGridforceGrid [<gridkey>]", NULL);
2056 int ScriptTcl::Tcl_updateGridScale(ClientData clientData,
2057 Tcl_Interp *interp,
int argc,
const char *argv[]) {
2059 script->initcheck();
2061 Vector scale(1.0f,1.0f,1.0f);
2062 const char *key = NULL;
2067 scale.x = atof( argv[1] );
2068 scale.y = atof( argv[2] );
2069 scale.z = atof( argv[3] );
2070 }
else if (argc == 5) {
2072 scale.x = atof( argv[2] );
2073 scale.y = atof( argv[3] );
2074 scale.z = atof( argv[4] );
2076 Tcl_AppendResult(interp,
"usage: updateGridforceGrid [<gridkey>] scaleX scaleY scaleZ", NULL);
2088 int ScriptTcl::Tcl_reloadStructure(ClientData clientData,
2089 Tcl_Interp *interp,
int argc,
const char *argv[]) {
2091 script->initcheck();
2096 char *result =
simParams->getfromparseopts(
"structure",buf);
2098 Tcl_SetResult(interp, result, TCL_VOLATILE);
2101 Tcl_SetResult(interp,(
char*)
"unknown structure",TCL_VOLATILE);
2107 if (argc == 2) ok = 1;
2108 if (argc == 4 && ! strcmp(argv[2],
"pdb")) ok = 1;
2110 Tcl_AppendResult(interp,
"usage: structure <filename> [pdb] <filename>", NULL);
2114 iout <<
"TCL: Reloading molecular structure from file " << argv[1];
2115 if ( argc == 4 )
iout <<
" and pdb file " << argv[3];
2117 script->config->
find(
"structure")->
set(argv[1]);
2118 if (argc == 4) script->config->
find(
"coordinates")->
set(argv[3]);
2129 int ScriptTcl::Tcl_gpuGlobalCreateClient(ClientData clientData,
2130 Tcl_Interp *interp,
int objc, Tcl_Obj*
const objv[]) {
2132 script->initcheck();
2134 Tcl_WrongNumArgs(interp, 1, objv, (
char *)
"<library> <client_name> <args>...");
2137 std::vector<std::string> args;
2138 for (
int i = 1; i < objc; ++i) {
2140 char* c_str = Tcl_GetStringFromObj(objv[i], &sz);
2141 args.push_back(std::string{c_str,
static_cast<size_t>(sz)});
2143 (CProxy_ComputeMgr(CkpvAccess(BOCclass_group).computeMgr)).recvCudaGlobalMasterCreateMsg(args);
2148 int ScriptTcl::Tcl_gpuGlobalRemoveClient(ClientData clientData,
2149 Tcl_Interp *interp,
int objc, Tcl_Obj*
const objv[]) {
2151 script->initcheck();
2153 Tcl_WrongNumArgs(interp, 1, objv, (
char *)
"<client_name>");
2156 std::vector<std::string> args;
2157 for (
int i = 1; i < objc; ++i) {
2159 char* c_str = Tcl_GetStringFromObj(objv[i], &sz);
2160 args.push_back(std::string{c_str,
static_cast<size_t>(sz)});
2162 (CProxy_ComputeMgr(CkpvAccess(BOCclass_group).computeMgr)).recvCudaGlobalMasterRemoveMsg(args);
2167 int ScriptTcl::Tcl_gpuGlobalUpdateClient(ClientData clientData,
2168 Tcl_Interp *interp,
int objc, Tcl_Obj*
const objv[]) {
2170 script->initcheck();
2172 Tcl_WrongNumArgs(interp, 1, objv, (
char *)
"<client_name> <args>...");
2175 std::vector<std::string> args;
2176 std::string client_name;
2177 for (
int i = 1; i < objc; ++i) {
2179 char* c_str = Tcl_GetStringFromObj(objv[i], &sz);
2181 client_name = std::string{c_str,
static_cast<size_t>(sz)};
2183 args.push_back(std::string{c_str,
static_cast<size_t>(sz)});
2185 (CProxy_ComputeMgr(CkpvAccess(BOCclass_group).computeMgr)).recvCudaGlobalMasterUpdateMsg(args);
2188 CProxy_ComputeMgr cm(CkpvAccess(BOCclass_group).computeMgr);
2191 Tcl_Obj* result_obj = Tcl_NewStringObj(update_result.c_str(), strlen(update_result.c_str()));
2192 Tcl_SetObjResult(interp, result_obj);
2197 CkPrintf(
"psfgen) %s\n",msg);
2200 extern "C" void newhandle_msg_ex(
void *vdata,
void *v,
const char *msg,
int prepend,
int newline) {
2201 CkPrintf(
"%s%s%s", (prepend ?
"psfgen) " :
""), msg, (newline ?
"\n" :
""));
2212 DebugM(3,
"Constructing ScriptTcl\n");
2230 interp = Tcl_CreateInterp();
2234 Tcl_CreateCommand(interp,
"python", Tcl_python,
2235 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2236 Tcl_CreateCommand(interp,
"startup", Tcl_startup,
2237 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2238 Tcl_CreateCommand(interp,
"exit", Tcl_exit,
2239 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2240 Tcl_CreateCommand(interp,
"abort", Tcl_abort,
2241 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2242 Tcl_CreateCommand(interp,
"numPes", Tcl_numPes,
2243 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2244 Tcl_CreateCommand(interp,
"numNodes", Tcl_numNodes,
2245 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2246 Tcl_CreateCommand(interp,
"numPhysicalNodes", Tcl_numPhysicalNodes,
2247 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2248 Tcl_CreateCommand(interp,
"numReplicas", Tcl_numReplicas,
2249 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2250 Tcl_CreateCommand(interp,
"myReplica", Tcl_myReplica,
2251 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2252 Tcl_CreateCommand(interp,
"replicaEval", Tcl_replicaEval,
2253 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2254 Tcl_CreateCommand(interp,
"replicaYield", Tcl_replicaYield,
2255 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2256 Tcl_CreateCommand(interp,
"replicaSendrecv", Tcl_replicaSendrecv,
2257 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2258 Tcl_CreateCommand(interp,
"replicaSend", Tcl_replicaSend,
2259 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2260 Tcl_CreateCommand(interp,
"replicaRecv", Tcl_replicaRecv,
2261 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2262 Tcl_CreateCommand(interp,
"replicaBarrier", Tcl_replicaBarrier,
2263 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2264 Tcl_CreateCommand(interp,
"replicaAtomSendrecv", Tcl_replicaAtomSendrecv,
2265 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2266 Tcl_CreateCommand(interp,
"replicaAtomSend", Tcl_replicaAtomSend,
2267 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2268 Tcl_CreateCommand(interp,
"replicaAtomRecv", Tcl_replicaAtomRecv,
2269 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2270 Tcl_CreateCommand(interp,
"stdout", Tcl_stdout,
2271 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2272 Tcl_CreateCommand(interp,
"print", Tcl_print,
2273 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2274 Tcl_CreateCommand(interp,
"unknown", Tcl_config,
2275 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2276 Tcl_CreateCommand(interp,
"param", Tcl_config,
2277 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2278 Tcl_CreateCommand(interp,
"isset", Tcl_isset_config,
2279 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2280 Tcl_CreateCommand(interp,
"istrue", Tcl_istrue_config,
2281 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2282 Tcl_CreateCommand(interp,
"run", Tcl_run,
2283 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2284 Tcl_CreateCommand(interp,
"minimize", Tcl_minimize,
2285 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2286 Tcl_CreateCommand(interp,
"move", Tcl_move,
2287 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2288 Tcl_CreateCommand(interp,
"moveallby", Tcl_moveallby,
2289 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2290 Tcl_CreateCommand(interp,
"output", Tcl_output,
2291 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2292 Tcl_CreateCommand(interp,
"measure", Tcl_measure,
2293 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2294 Tcl_CreateCommand(interp,
"colvarbias", Tcl_colvarbias,
2295 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2296 Tcl_CreateCommand(interp,
"colvarvalue", Tcl_colvarvalue,
2297 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2298 Tcl_CreateObjCommand(interp,
"cv", Tcl_colvars,
2299 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2300 Tcl_CreateCommand(interp,
"colvarfreq", Tcl_colvarfreq,
2301 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2302 Tcl_CreateCommand(interp,
"checkpoint", Tcl_checkpoint,
2303 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2304 Tcl_CreateCommand(interp,
"revert", Tcl_revert,
2305 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2306 Tcl_CreateCommand(interp,
"checkpointStore", Tcl_checkpointReplica,
2307 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2308 Tcl_CreateCommand(interp,
"checkpointLoad", Tcl_checkpointReplica,
2309 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2310 Tcl_CreateCommand(interp,
"checkpointSwap", Tcl_checkpointReplica,
2311 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2312 Tcl_CreateCommand(interp,
"checkpointFree", Tcl_checkpointReplica,
2313 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2314 Tcl_CreateCommand(interp,
"reinitvels", Tcl_reinitvels,
2315 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2316 Tcl_CreateCommand(interp,
"rescalevels", Tcl_rescalevels,
2317 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2318 Tcl_CreateCommand(interp,
"reinitatoms", Tcl_reinitatoms,
2319 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2320 Tcl_CreateCommand(interp,
"replicaDcdFile", Tcl_replicaDcdFile,
2321 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2322 Tcl_CreateCommand(interp,
"replicaDcdSelectFile", Tcl_replicaDcdSelectFile,
2323 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2324 Tcl_CreateCommand(interp,
"callback", Tcl_callback,
2325 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2326 Tcl_CreateCommand(interp,
"coorfile", Tcl_coorfile,
2327 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2328 Tcl_CreateCommand(interp,
"dumpbench", Tcl_dumpbench,
2329 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2330 Tcl_CreateObjCommand(interp,
"consForceConfig", Tcl_consForceConfig,
2331 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2332 Tcl_CreateCommand(interp,
"reloadCharges", Tcl_reloadCharges,
2333 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2335 Tcl_CreateCommand(interp,
"reloadGridforceGrid", Tcl_reloadGridforceGrid,
2336 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2337 Tcl_CreateCommand(interp,
"updateGridScale", Tcl_updateGridScale,
2338 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2340 Tcl_CreateObjCommand(interp,
"gpuGlobalCreateClient", Tcl_gpuGlobalCreateClient,
2341 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2342 Tcl_CreateObjCommand(interp,
"gpuGlobalRemoveClient", Tcl_gpuGlobalRemoveClient,
2343 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2344 Tcl_CreateObjCommand(interp,
"gpuGlobalUpdateClient", Tcl_gpuGlobalUpdateClient,
2345 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2353 int code = Tcl_EvalEx(interp,script,-1,TCL_EVAL_GLOBAL);
2354 *resultPtr = Tcl_GetStringResult(interp);
2357 NAMD_bug(
"ScriptTcl::eval called without Tcl.");
2365 int code = Tcl_Eval(interp,script);
2366 const char *result = Tcl_GetStringResult(interp);
2367 if (*result != 0) CkPrintf(
"TCL: %s\n",result);
2368 if (code != TCL_OK) {
2369 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2370 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
2373 NAMD_bug(
"ScriptTcl::eval called without Tcl.");
2381 Tcl_Interp *interp = Tcl_CreateInterp();
2385 Tcl_SetVar(interp,
"argv0", argv[0], TCL_GLOBAL_ONLY);
2386 Tcl_SetVar2Ex(interp,
"argc", NULL, Tcl_NewIntObj(argc-1), TCL_GLOBAL_ONLY);
2387 Tcl_Obj *argvPtr = Tcl_NewListObj(0, NULL);
2388 for (
int i=1; i<argc; ++i ) {
2389 Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(argv[i],-1));
2391 Tcl_SetVar2Ex(interp,
"argv", NULL, argvPtr, TCL_GLOBAL_ONLY);
2392 int code = Tcl_EvalFile(interp,argv[0]);
2393 if (code != TCL_OK) {
2394 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2395 fprintf(stderr,
"%s\n",(errorInfo ? errorInfo :
"Unknown Tcl error"));
2403 Tcl_SetVar(interp,
"argv0", argv[0], TCL_GLOBAL_ONLY);
2404 Tcl_SetVar2Ex(interp,
"argc", NULL, Tcl_NewIntObj(argc-1), TCL_GLOBAL_ONLY);
2405 Tcl_Obj *argvPtr = Tcl_NewListObj(0, NULL);
2406 for (
int i=1; i<argc; ++i ) {
2407 Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(argv[i],-1));
2409 Tcl_SetVar2Ex(interp,
"argv", NULL, argvPtr, TCL_GLOBAL_ONLY);
2410 int code = Tcl_EvalFile(interp,argv[0]);
2411 if (code != TCL_OK) {
2412 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2413 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
2422 int code = Tcl_EvalFile(interp,scriptFile);
2423 const char *result = Tcl_GetStringResult(interp);
2424 if (*result != 0) CkPrintf(
"TCL: %s\n",result);
2425 if (code != TCL_OK) {
2426 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2427 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
2430 NAMD_bug(
"ScriptTcl::load called without Tcl.");
2440 if ( NULL == scriptFile || NULL == (config =
new ConfigList(scriptFile)) ) {
2441 NAMD_die(
"Simulation config file is empty.");
2445 if (runWasCalled == 0) {
2454 #if CMK_HAS_PARTITION 2461 DebugM(3,
"Destructing ScriptTcl\n");
2463 if ( interp ) Tcl_DeleteInterp(interp);
2464 delete [] callbackname;
2466 if (scriptBarrierWrapper !=
nullptr)
delete scriptBarrierWrapper;
static NAMD_HOST_DEVICE Tensor symmetric(const Vector &v1, const Vector &v2)
int eabf_static_init(Tcl_Interp *)
std::ostream & iINFO(std::ostream &s)
NAMD_HOST_DEVICE Vector c() const
static int replica_hash(const char *key)
NAMD_HOST_DEVICE int c_p() const
void setReplicaDcdIndex(int index)
int molfile_dcdplugin_init(void)
void saveMolDataPointers(NamdState *)
void set(const char *newdata)
void load(char *scriptFile)
static PatchMap * Object()
void newhandle_msg(void *vdata, void *v, const char *msg)
void add_element(const char *s1, int len1, const char *s2, int len2)
static void exit(int status=0)
SimParameters * simParameters
NAMD_HOST_DEVICE void set(Vector A, Vector B, Vector C)
int psfgen_static_init(Tcl_Interp *)
void replica_send(const char *sndbuf, int sendcount, int destPart, int destPE)
std::ostream & endi(std::ostream &s)
static void suspend(void)
char value[MAX_SCRIPT_PARAM_SIZE]
static void messageStartUp()
std::ostream & iWARN(std::ostream &s)
void set_all_positions(Vector *)
void replicaDcdSelectInit(int index, const char *tag, const char *filename)
std::string getCudaGlobalMasterUpdateResult(const std::string &client_name) const
int add(const Elem &elem)
NAMD_HOST_DEVICE int b_p() const
const char * rstring(Range r)
void replica_eval(const char *cmdbuf, int targPart, int targPE, DataMessage **precvMsg)
static int atoBool(const char *s)
Tensor langevinPiston_strainRate
void replica_recv(DataMessage **precvMsg, int srcPart, int srcPE)
void read_binary_coors(char *fname, PDB *pdbobj)
void reinitAtoms(const char *basename=0)
void replicaDcdInit(int index, const char *filename)
void NAMD_bug(const char *err_msg)
void newhandle_msg_ex(void *vdata, void *v, const char *msg, int prepend, int newline)
void updateGridScale(const char *key, Vector scale)
static molfile_plugin_t * dcdplugin
BigReal rescaleVelocities_sumTemps
void reloadStructure(const char *, const char *)
int berendsenPressure_count
NAMD_HOST_DEVICE int a_p() const
SimpleBroadcastObjectWrapper()
void NAMD_die(const char *err_msg)
void tclmain(int, char **)
void publish(int tag, const T &t)
NAMD_HOST_DEVICE Vector b() const
int tcl_run_colvarscript_command(ClientData clientData, Tcl_Interp *interp_in, int objc, Tcl_Obj *const objv[])
WorkDistrib * workDistrib
int tcl_vector_math_init(Tcl_Interp *interp)
static void barrier(void)
int rescaleVelocities_numTemps
#define MAX_SCRIPT_PARAM_SIZE
static void createCommands(Tcl_Interp *)
int dumpbench(FILE *file)
int molfile_dcdplugin_fini(void)
static int get_lattice_from_ts(Lattice *lattice, const molfile_timestep_t *ts)
#define CHECK_REPLICA(REP)
SimpleBroadcastObject< int > scriptBarrier
void replica_sendRecv(const char *sndbuf, int sendcount, int destPart, int destPE, DataMessage **precvMsg, int srcPart, int srcPE)
static int tclsh(int, char **)
StringList * find(const char *name) const
NAMD_HOST_DEVICE Vector a() const
int molfile_dcdplugin_register(void *, vmdplugin_register_cb)
int configListInit(ConfigList *)
Tensor langevinPiston_origStrainRate
static void deleteCommands(Tcl_Interp *)
static int register_cb(void *v, vmdplugin_t *p)
Tensor berendsenPressure_avg
char param[MAX_SCRIPT_PARAM_SIZE]
void reloadCharges(const char *filename)
void reloadGridforceGrid(const char *key)