28 #include "colvarmodule.h"
29 #include "colvarscript.h"
49 #define MIN_DEBUG_LEVEL 4
52 #include "molfile_plugin.h"
53 #include "libmolfile_plugin.h"
70 void ScriptTcl::suspend() {
74 void ScriptTcl::barrier() {
78 void ScriptTcl::initcheck() {
79 if ( initWasCalled == 0 ) {
81 CkPrintf(
"TCL: Suspending until startup complete.\n");
82 Tcl_CreateCommand(interp,
"param", Tcl_param,
83 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
84 Tcl_CreateCommand(interp,
"unknown", Tcl_param,
85 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
86 Tcl_CreateCommand(interp,
"isset", Tcl_isset_param,
87 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
88 Tcl_CreateCommand(interp,
"istrue", Tcl_istrue_param,
89 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
90 Tcl_CreateCommand(interp,
"structure", Tcl_reloadStructure,
91 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
100 ! ! Tcl_GetVar2(interp,
"tcl_platform",
"threaded", TCL_GLOBAL_ONLY);
107 void ScriptTcl::runController(
int task) {
108 scriptBarrier.
publish(barrierStep++,task);
112 doCallback(state->callback_labelstring.c_str(),
113 state->callback_valuestring.c_str());
118 void ScriptTcl::setParameter(
const char* param,
const char* value) {
122 (CProxy_Node(CkpvAccess(BOCclass_group).node)).scriptParam(msg);
126 void ScriptTcl::setParameter(
const char* param,
int value) {
129 sprintf(msg->
value,
"%d",value);
130 (CProxy_Node(CkpvAccess(BOCclass_group).node)).scriptParam(msg);
134 void ScriptTcl::reinitAtoms(
const char *basename) {
144 #if PY_MAJOR_VERSION >= 3
146 #define PYINT_CHECK PyLong_Check
147 #define PYINT_ASLONG PyLong_AsLong
148 #define PYSTRING_CHECK PyUnicode_Check
150 #define PYSTRING_ASSTRING PyUnicode_AsUTF8
154 #define PYINT_CHECK PyInt_Check
155 #define PYINT_ASLONG PyInt_AsLong
156 #define PYSTRING_CHECK PyString_Check
157 #define PYSTRING_ASSTRING PyString_AsString
161 static Tcl_Obj* python_tcl_convert(PyObject *obj) {
163 if ( PYINT_CHECK(obj) ) {
164 return Tcl_NewLongObj(PYINT_ASLONG(obj));
166 if ( PyFloat_Check(obj) ) {
167 return Tcl_NewDoubleObj(PyFloat_AsDouble(obj));
169 if ( PYSTRING_CHECK(obj) ) {
170 return Tcl_NewStringObj(PYSTRING_ASSTRING(obj), -1);
172 if ( PySequence_Check(obj) ) {
173 PyObject *iter = PyObject_GetIter(obj);
174 if ( ! iter )
NAMD_bug(
"python_tcl_convert failed to get iterator");
175 Tcl_Obj *rlist = Tcl_NewListObj(0,0);
176 while ( PyObject *item = PyIter_Next(iter) ) {
177 Tcl_ListObjAppendElement(0, rlist, python_tcl_convert(item));
183 PyObject *str = PyObject_Str(obj);
184 Tcl_Obj *robj = Tcl_NewStringObj(PYSTRING_ASSTRING(str), -1);
189 static int atoBool(
const char *s);
191 static PyObject* tcl_python_convert(Tcl_Obj *obj) {
193 if ( TCL_OK == Tcl_GetLongFromObj(0, obj, &rlong) )
194 return Py_BuildValue(
"l", rlong);
196 if ( TCL_OK == Tcl_GetDoubleFromObj(0, obj, &rdouble) )
197 return Py_BuildValue(
"d", rdouble);
198 const char *
rstring = Tcl_GetString(obj);
199 if ( rstring[0] ==
'\0' )
203 return PyBool_FromLong(rbool);
204 return Py_BuildValue(
"s", rstring);
207 static Tcl_Interp *static_interp;
209 static PyObject* python_tcl_call(PyObject *
self, PyObject *args) {
210 Tcl_Interp *interp = static_interp;
211 Tcl_Obj *command = python_tcl_convert(args);
212 Tcl_IncrRefCount(command);
213 if ( TCL_OK != Tcl_EvalObjEx(interp,command,TCL_EVAL_DIRECT) ) {
214 PyErr_SetString(PyExc_RuntimeError, Tcl_GetStringResult(interp));
215 Tcl_DecrRefCount(command);
218 Tcl_DecrRefCount(command);
219 return tcl_python_convert(Tcl_GetObjResult(interp));
222 static PyObject* python_tcl_eval(PyObject *
self, PyObject *args) {
223 Tcl_Interp *interp = static_interp;
225 if ( ! PyArg_ParseTuple(args,
"s", &command) )
return 0;
226 if ( TCL_OK != Tcl_EvalEx(interp,command,-1,TCL_EVAL_DIRECT) ) {
227 PyErr_SetString(PyExc_RuntimeError, Tcl_GetStringResult(interp));
230 return tcl_python_convert(Tcl_GetObjResult(interp));
233 static PyObject* python_tcl_write(PyObject *
self, PyObject *args) {
235 if ( ! PyArg_ParseTuple(args,
"s", &
string) )
return 0;
236 CkPrintf(
"%s",
string);
240 static PyMethodDef namdPython_methods[] = {
241 {
"eval", python_tcl_eval, METH_VARARGS,
242 "Evaluate string in Tcl interpreter."},
243 {
"call", python_tcl_call, METH_VARARGS,
244 "Call command and arguments in Tcl interpreter."},
245 {
"write", python_tcl_write, METH_VARARGS,
246 "Write string using CkPrintf."},
247 {NULL, NULL, 0, NULL}
250 static PyMethodDef namdPython_methods_empty[] = {
251 {NULL, NULL, 0, NULL}
254 #if PY_MAJOR_VERSION >= 3
256 struct module_state {
260 static int namdPython_traverse(PyObject *m, visitproc visit,
void *arg);
261 static int namdPython_clear(PyObject *m);
262 PyObject *namdPythonModule;
264 static int namdPython_traverse(PyObject *m, visitproc visit,
void *arg) {
265 Py_VISIT(((
struct module_state*)PyModule_GetState(m))->error);
269 static int namdPython_clear(PyObject *m) {
270 Py_CLEAR(((
struct module_state*)PyModule_GetState(m))->error);
274 static struct PyModuleDef moduledef = {
275 PyModuleDef_HEAD_INIT,
278 sizeof(
struct module_state),
286 static PyObject* PyInit_tcl(
void) {
288 module = PyModule_Create(&moduledef);
289 if (module == NULL) {
290 NAMD_bug(
"Failed to create Python tcl module");
295 static struct PyModuleDef namdmoduledef = {
296 PyModuleDef_HEAD_INIT,
299 sizeof(
struct module_state),
300 namdPython_methods_empty,
307 static PyObject* PyInit_namd(
void) {
309 module = PyModule_Create(&namdmoduledef);
310 if (module == NULL) {
311 NAMD_bug(
"Failed to create Python namd module");
319 static void namd_python_initialize(
void *interp) {
320 if ( static_interp )
return;
321 static_interp = (Tcl_Interp*) interp;
323 #if PY_MAJOR_VERSION >= 3
324 PyImport_AppendInittab(
"tcl", &PyInit_tcl);
325 PyImport_AppendInittab(
"namd", &PyInit_namd);
329 Py_InitModule(
"tcl", namdPython_methods);
330 Py_InitModule(
"namd", namdPython_methods_empty);
333 const char * python_code =
"\n"
338 "class _namd_wrapper(object):\n"
339 " tcl = __import__('tcl')\n"
340 " class _wrapped(object):\n"
341 " def __init__(self,_name):\n"
342 " self.name = _name\n"
343 " def __call__(self,*args):\n"
344 " return self.tcl.call(self.name,*args)\n"
345 " def __getattr__(self,name):\n"
346 " if self.tcl.call('info','commands',name) == name:\n"
347 " return self._wrapped(name)\n"
349 " return self.tcl.call('param',name)\n"
350 " def __setattr__(self,name,val):\n"
351 " if self.tcl.call('info','commands',name) == name:\n"
352 " raise AttributeError\n"
353 " return self.tcl.call('param',name,val)\n"
354 " def __call__(self, **args):\n"
355 " for (name,val) in args.items():\n"
356 " self.tcl.call('param',name,val)\n"
358 "sys.modules[__name__] = _namd_wrapper()\n"
361 PyObject* mainmod = PyImport_AddModule(
"__main__");
362 PyObject* globalDictionary = PyModule_GetDict(mainmod);
363 PyObject* namdmod = PyImport_AddModule(
"namd");
364 PyObject* localDictionary = PyModule_GetDict(namdmod);
365 PyObject* result = PyRun_String(python_code, Py_file_input, globalDictionary, localDictionary);
367 if ( 0 != PyRun_SimpleString(
"import tcl\nimport namd\n") ) {
368 NAMD_bug(
"namd_python_initialize failed");
372 int ScriptTcl::Tcl_python(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
374 Tcl_SetResult(interp,(
char*)
"args: script",TCL_VOLATILE);
377 namd_python_initialize(interp);
378 PyObject *dict = PyModule_GetDict(PyImport_AddModule(
"__main__"));
380 const char *script = argv[1];
381 int token = Py_eval_input;
384 Tcl_DStringInit(&scr);
386 Tcl_DStringAppend(&scr,argv[1],-1);
387 for (
int i = 2; i < argc; ++i ) {
388 Tcl_DStringAppend(&scr,
" ",-1);
389 Tcl_DStringAppend(&scr,argv[i],-1);
391 script = Tcl_DStringValue(&scr);
393 while ( script[0] ==
' ' || script[0] ==
'\t' ) ++script;
394 for (
int i=0; script[i]; ++i ) {
395 if ( script[i] ==
'\n' ) {
396 token = Py_file_input;
403 PyObject *result = PyRun_String(script, token, dict, dict);
404 Tcl_ResetResult(interp);
405 Tcl_DStringFree(&scr);
407 if ( PyErr_Occurred() ) {
408 if ( result )
NAMD_bug(
"PyErr_Occurred indicates error but PyRun does not");
410 Tcl_AppendResult(interp,
"error from python interpreter\n", NULL);
411 PyObject *type, *value, *traceback, *str;
412 PyErr_Fetch(&type, &value, &traceback);
419 PyObject *mod = PyImport_ImportModule(
"traceback");
420 if ( ! mod )
return TCL_ERROR;
422 PyObject *func = PyObject_GetAttrString(mod,
"format_exception");
423 if ( ! func )
return TCL_ERROR;
427 PyObject *list = PyObject_CallFunctionObjArgs(func, type, value, traceback, NULL);
428 if ( ! list )
return TCL_ERROR;
434 Py_DECREF(traceback);
436 PyObject *iter = PyObject_GetIter(list);
437 if ( ! iter )
return TCL_ERROR;
438 while ( PyObject *item = PyIter_Next(iter) ) {
439 str = PyObject_Str(item);
440 Tcl_AppendResult(interp, PYSTRING_ASSTRING(str),
"\n", NULL);
448 }
else if ( ! result ) {
449 NAMD_bug(
"PyRun indicates error but PyErr_Occurred does not");
451 if ( result != Py_None ) {
452 Tcl_SetObjResult(interp, python_tcl_convert(result));
460 int ScriptTcl::Tcl_python(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
461 Tcl_SetResult(interp,(
char*)
"python not enabled",TCL_VOLATILE);
465 #endif // NAMD_PYTHON
467 int ScriptTcl::Tcl_startup(ClientData clientData,
468 Tcl_Interp *interp,
int argc,
const char *argv[]) {
470 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
478 int ScriptTcl::Tcl_exit(ClientData clientData,
479 Tcl_Interp *interp,
int argc,
const char *argv[]) {
481 if ( CmiNumPartitions() > 1 ) {
482 if ( ! script->initWasCalled ) CkPrintf(
"TCL: Running startup before exit due to replicas.\n");
485 CkPrintf(
"TCL: Exiting due to exit command.\n");
486 if ( script->runWasCalled ) script->runController(
SCRIPT_END);
487 #if CMK_HAS_PARTITION
491 Tcl_SetResult(interp,(
char*)
"wrong # args: should be \"exit ?returnCode?\"",TCL_VOLATILE);
495 if (argc > 1 && Tcl_GetInt(interp,argv[1],&status) != TCL_OK) {
502 int ScriptTcl::Tcl_abort(ClientData,
503 Tcl_Interp *,
int argc,
const char *argv[]) {
505 Tcl_DStringInit(&msg);
506 Tcl_DStringAppend(&msg,
"TCL:",-1);
507 if ( argc == 1 ) Tcl_DStringAppend(&msg,
" abort called",-1);
508 for (
int i = 1; i < argc; ++i ) {
509 Tcl_DStringAppend(&msg,
" ",-1);
510 Tcl_DStringAppend(&msg,argv[i],-1);
513 Tcl_DStringFree(&msg);
517 int ScriptTcl::Tcl_numPes(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
519 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
522 Tcl_SetObjResult(interp, Tcl_NewIntObj(CkNumPes()));
526 int ScriptTcl::Tcl_numNodes(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
528 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
531 Tcl_SetObjResult(interp, Tcl_NewIntObj(CkNumNodes()));
535 int ScriptTcl::Tcl_numPhysicalNodes(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
537 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
540 Tcl_SetObjResult(interp, Tcl_NewIntObj(CmiNumPhysicalNodes()));
544 int ScriptTcl::Tcl_numReplicas(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
546 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
549 Tcl_SetObjResult(interp, Tcl_NewIntObj(CmiNumPartitions()));
553 int ScriptTcl::Tcl_myReplica(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
555 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
558 Tcl_SetObjResult(interp, Tcl_NewIntObj(CmiMyPartition()));
562 #define CHECK_REPLICA(REP) do {\
564 Tcl_SetResult(interp,(char*)"negative replica index",TCL_VOLATILE); \
567 if ( (REP) >= CmiNumPartitions() ) { \
568 Tcl_SetResult(interp,(char*)"non-existent replica index",TCL_VOLATILE); \
573 int ScriptTcl::Tcl_replicaEval(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
575 Tcl_SetResult(interp,(
char*)
"args: dest script",TCL_VOLATILE);
578 int dest = atoi(argv[1]);
580 #if CMK_HAS_PARTITION
582 Tcl_DStringInit(&recvstr);
585 CmiAssert(recvMsg != NULL);
586 int code = recvMsg->
code;
587 Tcl_DStringAppend(&recvstr, recvMsg->
data, recvMsg->
size);
588 Tcl_DStringResult(interp, &recvstr);
589 Tcl_DStringFree(&recvstr);
593 return Tcl_EvalEx(interp,argv[2],-1,TCL_EVAL_GLOBAL);
597 int ScriptTcl::Tcl_replicaYield(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
599 Tcl_SetResult(interp,(
char*)
"args: ?seconds?",TCL_VOLATILE);
604 if ( sscanf(argv[1],
"%lf",&time) != 1 ) {
605 Tcl_SetResult(interp,(
char*)
"args: ?seconds?",TCL_VOLATILE);
610 time += CmiWallTimer();
611 do { CsdSchedulePoll(); }
while ( CmiWallTimer() < time );
619 int ScriptTcl::Tcl_replicaSendrecv(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
620 if ( argc < 3 || argc > 4 ) {
621 Tcl_SetResult(interp,(
char*)
"args: data dest ?source?",TCL_VOLATILE);
625 Tcl_DStringInit(&recvstr);
626 int sendcount = strlen(argv[1]);
628 int dest = atoi(argv[2]);
630 if ( argc > 3 ) source = atoi(argv[3]);
631 #if CMK_HAS_PARTITION
632 if (dest == CmiMyPartition()) {
633 Tcl_DStringSetLength(&recvstr,sendcount);
634 memcpy(Tcl_DStringValue(&recvstr),argv[1],sendcount);
637 replica_sendRecv(argv[1], sendcount, dest, CkMyPe(), &recvMsg, source, CkMyPe());
638 CmiAssert(recvMsg != NULL);
639 Tcl_DStringAppend(&recvstr, recvMsg->
data, recvMsg->
size);
643 Tcl_DStringResult(interp, &recvstr);
644 Tcl_DStringFree(&recvstr);
648 int ScriptTcl::Tcl_replicaSend(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
650 Tcl_SetResult(interp,(
char*)
"args: data dest",TCL_VOLATILE);
653 int sendcount = strlen(argv[1]);
654 int dest = atoi(argv[2]);
655 #if CMK_HAS_PARTITION
661 int ScriptTcl::Tcl_replicaRecv(ClientData, Tcl_Interp *interp,
int argc,
const char **argv) {
663 Tcl_SetResult(interp,(
char*)
"args: source",TCL_VOLATILE);
667 Tcl_DStringInit(&recvstr);
669 int source = atoi(argv[1]);
670 #if CMK_HAS_PARTITION
673 CmiAssert(recvMsg != NULL);
674 Tcl_DStringAppend(&recvstr, recvMsg->
data, recvMsg->
size);
677 Tcl_DStringResult(interp, &recvstr);
678 Tcl_DStringFree(&recvstr);
682 int ScriptTcl::Tcl_replicaBarrier(ClientData, Tcl_Interp *interp,
int argc,
const char **) {
684 Tcl_SetResult(interp,(
char*)
"no arguments needed",TCL_VOLATILE);
687 #if CMK_HAS_PARTITION
693 int ScriptTcl::Tcl_replicaAtomSendrecv(ClientData clientData, Tcl_Interp *interp,
int argc,
const char **argv) {
696 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
697 Tcl_SetResult(interp,
698 (
char*)
"replicaUniformPatchGrids is required for atom exchange",
702 if ( argc < 2 || argc > 3 ) {
703 Tcl_SetResult(interp,
704 (
char*)
"bad arg count; args: dest ?source?",TCL_VOLATILE);
708 if ( sscanf(argv[1],
"%d", &dest) != 1 ) {
709 Tcl_SetResult(interp,(
char*)
"bad dest; args: dest ?source?",TCL_VOLATILE);
714 if ( sscanf(argv[2],
"%d", &source) != 1 ) {
715 Tcl_SetResult(interp,
716 (
char*)
"bad source; args: dest ?source?",TCL_VOLATILE);
721 #if CMK_HAS_PARTITION
722 if (dest != CmiMyPartition()) {
724 replica_sendRecv((
char*)&(script->state->lattice),
sizeof(
Lattice), dest, CkMyPe(), &recvMsg, source, CkMyPe());
725 CmiAssert(recvMsg != NULL);
726 memcpy(&(script->state->lattice), recvMsg->
data, recvMsg->
size);
732 sprintf(str,
"%d", dest);
733 script->setParameter(
"scriptArg1", str);
734 sprintf(str,
"%d", source);
735 script->setParameter(
"scriptArg2", str);
741 #if CMK_HAS_PARTITION
742 if (dest != CmiMyPartition()) {
746 CmiAssert(recvMsg != NULL);
747 memcpy(cstate, recvMsg->
data, recvMsg->
size);
755 int ScriptTcl::Tcl_replicaAtomSend(ClientData clientData, Tcl_Interp *interp,
int argc,
const char **argv) {
758 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
759 Tcl_SetResult(interp,
760 (
char*)
"replicaUniformPatchGrids is required for atom exchange",
765 Tcl_SetResult(interp,(
char*)
"bad arg count; args: dest",TCL_VOLATILE);
769 if ( sscanf(argv[1],
"%d", &dest) != 1 ) {
770 Tcl_SetResult(interp,(
char*)
"bad dest; args: dest",TCL_VOLATILE);
774 #if CMK_HAS_PARTITION
779 sprintf(str,
"%d", dest);
780 script->setParameter(
"scriptArg1", str);
786 #if CMK_HAS_PARTITION
794 int ScriptTcl::Tcl_replicaAtomRecv(ClientData clientData, Tcl_Interp *interp,
int argc,
const char **argv) {
797 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
798 Tcl_SetResult(interp,
799 (
char*)
"replicaUniformPatchGrids is required for atom exchange",
804 Tcl_SetResult(interp,(
char*)
"bad arg count; args: ?source?",TCL_VOLATILE);
809 if ( sscanf(argv[1],
"%d", &source) != 1 ) {
810 Tcl_SetResult(interp,(
char*)
"bad source; args: ?source?",TCL_VOLATILE);
815 #if CMK_HAS_PARTITION
818 CmiAssert(recvMsg != NULL);
819 memcpy(&(script->state->lattice), recvMsg->
data, recvMsg->
size);
824 sprintf(str,
"%d", source);
825 script->setParameter(
"scriptArg2", str);
831 #if CMK_HAS_PARTITION
835 CmiAssert(recvMsg != NULL);
836 memcpy(cstate, recvMsg->
data, recvMsg->
size);
844 int ScriptTcl::Tcl_stdout(ClientData,
845 Tcl_Interp *interp,
int argc,
const char *argv[]) {
847 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
851 const char *filename= argv[1];
852 CkPrintf(
"TCL: redirecting stdout to file %s\n", filename);
854 if ( ! freopen(filename,
"a", stdout) ) {
855 Tcl_SetResult(interp, strerror(errno), TCL_VOLATILE);
861 int ScriptTcl::Tcl_print(ClientData,
862 Tcl_Interp *,
int argc,
const char *argv[]) {
864 Tcl_DStringInit(&msg);
865 for (
int i = 1; i < argc; ++i ) {
866 Tcl_DStringAppend(&msg,
" ",-1);
867 Tcl_DStringAppend(&msg,argv[i],-1);
869 CkPrintf(
"TCL:%s\n",Tcl_DStringValue(&msg));
870 Tcl_DStringFree(&msg);
874 int ScriptTcl::Tcl_config(ClientData clientData,
875 Tcl_Interp *interp,
int argc,
const char *argv[]) {
897 int arglen = 1;
int ai;
898 for (ai=1; ai<argc; ++ai) { arglen += strlen(argv[ai]) + 1; }
899 char *data =
new char[arglen]; *data = 0;
900 char *name =
new char[arglen]; *name = 0;
903 const char *s = argv[1];
905 for ( ; *s && *s !=
'='; *(sn++) = *(s++) );
909 for (ai=2; ai<argc; ++ai) {
if (argv[ai][0] ==
'#') argc = ai; }
913 if ( *s ) { ++s; strcat(data,s); }
914 else if ( ai < argc && argv[ai][0] ==
'=' ) {
915 strcat(data,argv[ai]+1);
918 for ( ; ai<argc; ++ai) {
919 if ( data[0] ) { strcat(data,
" "); }
920 strcat(data,argv[ai]);
926 Tcl_SetResult(interp,(
char*)
"error parsing config file",TCL_VOLATILE);
933 script->config->
add_element( name, strlen(name), data, strlen(data) );
944 Tcl_SetResult(interp,
945 (
char*)
"tried before startup to read config file parameter "
946 "that was not set",TCL_VOLATILE);
949 Tcl_SetResult(interp,strlist->
data,TCL_VOLATILE);
953 int ScriptTcl::Tcl_isset_config(ClientData clientData,
954 Tcl_Interp *interp,
int argc,
const char *argv[]) {
956 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
960 const char *param = argv[1];
963 Tcl_SetResult(interp, (
char*)(strlist ?
"1" :
"0"), TCL_VOLATILE);
969 if (!strcasecmp(s,
"on"))
return 1;
970 if (!strcasecmp(s,
"off"))
return 0;
971 if (!strcasecmp(s,
"true"))
return 1;
972 if (!strcasecmp(s,
"false"))
return 0;
973 if (!strcasecmp(s,
"yes"))
return 1;
974 if (!strcasecmp(s,
"no"))
return 0;
975 if (!strcasecmp(s,
"1"))
return 1;
976 if (!strcasecmp(s,
"0"))
return 0;
980 int ScriptTcl::Tcl_istrue_config(ClientData clientData,
981 Tcl_Interp *interp,
int argc,
const char *argv[]) {
983 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
987 const char *param = argv[1];
991 Tcl_SetResult(interp,(
char*)
"parameter value is not set",TCL_VOLATILE);
996 Tcl_SetResult(interp,(
char*)
"parameter value is not boolean",TCL_VOLATILE);
999 Tcl_SetResult(interp, (
char*)(val ?
"1" :
"0"), TCL_VOLATILE);
1003 int ScriptTcl::Tcl_istrue_param(ClientData clientData,
1004 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1006 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1010 const char *param = argv[1];
1014 Tcl_SetResult(interp,(
char*)
"unknown parameter",TCL_VOLATILE);
1018 Tcl_SetResult(interp,(
char*)
"parameter is not boolean",TCL_VOLATILE);
1022 Tcl_SetResult(interp,(
char*)
"parameter value is not set",TCL_VOLATILE);
1025 if ( val != 0 && val != 1 ) {
1026 Tcl_SetResult(interp,(
char*)
"bug in Tcl_istrue_param",TCL_VOLATILE);
1029 Tcl_SetResult(interp, (
char*)(val ?
"1" :
"0"), TCL_VOLATILE);
1033 int ScriptTcl::Tcl_isset_param(ClientData clientData,
1034 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1036 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1040 const char *param = argv[1];
1044 Tcl_SetResult(interp,(
char*)
"unknown parameter",TCL_VOLATILE);
1047 Tcl_SetResult(interp, (
char*)(val ?
"1" :
"0"), TCL_VOLATILE);
1051 int ScriptTcl::Tcl_param(ClientData clientData,
1052 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1053 if (argc != 2 && argc != 3 && argc != 5) {
1054 Tcl_SetResult(interp,
1055 (
char*)
"wrong # args for NAMD config parameter",TCL_VOLATILE);
1059 const char *param = argv[1];
1061 Tcl_SetResult(interp,
1062 (
char*)
"parameter name too long for NAMD config parameter",
1072 Tcl_SetResult(interp, result, TCL_VOLATILE);
1075 Tcl_SetResult(interp,
1076 (
char*)
"parameter unknown for NAMD config parameter",TCL_VOLATILE);
1082 int arglen = strlen(argv[2]) + 1;
1083 if ( argc == 5 ) arglen += strlen(argv[3]) + strlen(argv[4]) + 2;
1085 Tcl_SetResult(interp,
1086 (
char*)
"parameter value too long for NAMD config parameter",
1090 if ( argc == 3 ) sprintf(value,
"%s",argv[2]);
1091 if ( argc == 5 ) sprintf(value,
"%s %s %s",argv[2],argv[3],argv[4]);
1093 iout <<
"TCL: Setting parameter " << param <<
" to " << value <<
"\n" <<
endi;
1096 script->setParameter(param,value);
1107 int ScriptTcl::Tcl_reinitvels(ClientData clientData,
1108 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1110 script->initcheck();
1112 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1115 const char *temp = argv[1];
1117 script->setParameter(
"initialTemp",temp);
1124 int ScriptTcl::Tcl_rescalevels(ClientData clientData,
1125 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1127 script->initcheck();
1129 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1132 const char *factor = argv[1];
1134 script->setParameter(
"scriptArg1",factor);
1141 int ScriptTcl::Tcl_run(ClientData clientData,
1142 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1144 script->initcheck();
1146 Tcl_SetResult(interp,(
char*)
"too few args",TCL_VOLATILE);
1150 Tcl_SetResult(interp,(
char*)
"too many args",TCL_VOLATILE);
1155 if ( ! strcmp(argv[1],
"norepeat") ) {
1156 if ( script->runWasCalled ) { norepeat = 1; }
1158 Tcl_SetResult(interp,(
char*)
"first arg not norepeat",TCL_VOLATILE);
1162 int numstepsarg = argc-1;
1164 if (Tcl_GetInt(interp,argv[numstepsarg],&numsteps) != TCL_OK) {
1168 Tcl_SetResult(interp,
1169 (
char*)
"number of steps must be non-negative",TCL_VOLATILE);
1174 Tcl_SetResult(interp,
1175 (
char*)
"firstTimestep must be a multiple of stepsPerCycle",
1180 Tcl_SetResult(interp,
1181 (
char*)
"number of steps must be a multiple of stepsPerCycle",
1186 Tcl_SetResult(interp,
1187 (
char*)
"run called with minimization enabled; "
1188 "use minimize command instead",TCL_VOLATILE);
1192 iout <<
"TCL: Original numsteps " << simParams->
N
1193 <<
" will be ignored.\n";
1195 iout <<
"TCL: Running for " << numsteps <<
" steps";
1196 if ( norepeat )
iout <<
" without repeating first step";
1199 script->setParameter(
"numsteps",simParams->
firstTimestep + numsteps);
1202 script->runWasCalled = 1;
1204 script->setParameter(
"firsttimestep",simParams->
N);
1209 int ScriptTcl::Tcl_minimize(ClientData clientData,
1210 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1212 script->initcheck();
1214 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1218 if (Tcl_GetInt(interp,argv[1],&numsteps) != TCL_OK) {
1222 Tcl_SetResult(interp,
1223 (
char*)
"number of steps must be non-negative",TCL_VOLATILE);
1228 Tcl_SetResult(interp,
1229 (
char*)
"firstTimestep must be a multiple of stepsPerCycle",
1234 Tcl_SetResult(interp,
1235 (
char*)
"number of steps must be a multiple of stepsPerCycle",
1240 iout <<
"TCL: Original numsteps " << simParams->
N
1241 <<
" will be ignored.\n";
1243 iout <<
"TCL: Minimizing for " << numsteps <<
" steps\n" <<
endi;
1245 script->setParameter(
"numsteps",simParams->
firstTimestep + numsteps);
1248 script->runWasCalled = 1;
1250 script->setParameter(
"firsttimestep",simParams->
N);
1256 int ScriptTcl::Tcl_moveallby(ClientData clientData,
1257 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1259 script->initcheck();
1261 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1264 const char **fstring;
1267 if (Tcl_SplitList(interp, argv[1], &fnum, &fstring) != TCL_OK)
1270 (Tcl_GetDouble(interp, fstring[0],&x) != TCL_OK) ||
1271 (Tcl_GetDouble(interp, fstring[1],&y) != TCL_OK) ||
1272 (Tcl_GetDouble(interp, fstring[2],&z) != TCL_OK) ) {
1273 Tcl_SetResult(interp,(
char*)
"argument not a vector",TCL_VOLATILE);
1274 Tcl_Free((
char*)fstring);
1277 Tcl_Free((
char*)fstring);
1281 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).moveAllBy(msg);
1287 int ScriptTcl::Tcl_move(ClientData clientData,
1288 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1290 script->initcheck();
1292 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1295 const char **fstring;
int fnum;
int atomid;
int moveto;
double x,
y,
z;
1296 if (Tcl_GetInt(interp,argv[1],&atomid) != TCL_OK)
return TCL_ERROR;
1297 if (argv[2][0]==
't' && argv[2][1]==
'o' && argv[2][2]==0) moveto = 1;
1298 else if (argv[2][0]==
'b' && argv[2][1]==
'y' && argv[2][2]==0) moveto = 0;
1300 Tcl_SetResult(interp,
1301 (
char*)
"syntax is 'move <id> to|by {<x> <y> <z>}'",TCL_VOLATILE);
1304 if (Tcl_SplitList(interp, argv[3], &fnum, &fstring) != TCL_OK) {
1308 (Tcl_GetDouble(interp, fstring[0],&x) != TCL_OK) ||
1309 (Tcl_GetDouble(interp, fstring[1],&y) != TCL_OK) ||
1310 (Tcl_GetDouble(interp, fstring[2],&z) != TCL_OK) ) {
1311 Tcl_SetResult(interp,(
char*)
"third argument not a vector",TCL_VOLATILE);
1312 Tcl_Free((
char*)fstring);
1315 Tcl_Free((
char*)fstring);
1319 iout <<
"TCL: Moving atom " << atomid <<
" ";
1320 if ( moveto )
iout <<
"to";
else iout <<
"by";
1324 msg->
atomid = atomid - 1;
1327 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).moveAtom(msg);
1334 int ScriptTcl::Tcl_output(ClientData clientData,
1335 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1337 script->initcheck();
1339 Tcl_SetResult(interp,(
char*)
"too few args",TCL_VOLATILE);
1343 Tcl_SetResult(interp,(
char*)
"too many args",TCL_VOLATILE);
1346 int filenamearg = argc-1;
1348 Tcl_SetResult(interp,(
char*)
"file name too long",TCL_VOLATILE);
1354 if ( ! strcmp(argv[1],
"withforces") ) {
1356 }
else if ( ! strcmp(argv[1],
"onlyforces") ) {
1360 Tcl_SetResult(interp,
1361 (
char*)
"first arg not withforces or onlyforces",TCL_VOLATILE);
1371 script->setParameter(
"outputname",argv[filenamearg]);
1373 iout <<
"TCL: Writing to files with basename " <<
1376 if ( doforces && ! script->runWasCalled )
NAMD_die(
1377 "No forces to output; must call run or minimize first.");
1382 script->setParameter(
"outputname",oldname);
1390 measure_result = Tcl_Eval(interp,measure_command);
1395 int ScriptTcl::Tcl_measure(ClientData clientData,
1396 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1398 script->initcheck();
1400 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1403 script->measure_command = argv[1];
1407 return script->measure_result;
1422 int ScriptTcl::Tcl_colvarbias(ClientData clientData,
1423 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1425 script->initcheck();
1426 if (argc < 4 || argc % 2) {
1427 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1432 Tcl_SetResult(interp,(
char*)
"colvars module not active",TCL_VOLATILE);
1435 if ( ! strcmp(argv[1],
"changeconfig") ) {
1436 for (
int i=2; i<argc; i+=2 ) {
1437 std::string name(argv[i]);
1438 std::string conf(argv[i+1]);
1439 colvars->change_configuration(name,conf);
1442 }
else if ( ! strcmp(argv[1],
"energydiff") ) {
1443 if ( ! script->runWasCalled ) {
1444 Tcl_SetResult(interp,
1445 (
char*)
"energydiff requires a previous timestep",TCL_VOLATILE);
1449 for (
int i=2; i<argc; i+=2 ) {
1450 std::string name(argv[i]);
1451 std::string conf(argv[i+1]);
1452 ediff += colvars->energy_difference(name,conf);
1454 Tcl_SetObjResult(interp, Tcl_NewDoubleObj(ediff));
1457 Tcl_SetResult(interp,(
char*)
"unknown colvarbias operation",TCL_VOLATILE);
1465 int ScriptTcl::Tcl_colvarvalue(ClientData clientData,
1466 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1468 script->initcheck();
1470 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1475 Tcl_SetResult(interp,(
char*)
"colvars module not active",TCL_VOLATILE);
1479 std::string name(argv[1]);
1480 std::string value = colvars->read_colvar(name);
1484 found = value.find(
"(");
1485 if (found != std::string::npos) {
1486 value.replace(found, 1,
" ");
1492 found = value.find(
")");
1493 if (found != std::string::npos) {
1494 value.replace(found, 1,
" ");
1500 found = value.find(
",");
1501 if (found != std::string::npos) {
1502 value.replace(found, 1,
" ");
1508 Tcl_DString recvstr;
1509 Tcl_DStringInit(&recvstr);
1510 Tcl_DStringAppend(&recvstr,value.c_str(), -1);
1511 Tcl_DStringResult(interp, &recvstr);
1512 Tcl_DStringFree(&recvstr);
1516 int ScriptTcl::Tcl_colvarfreq(ClientData clientData,
1517 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1519 script->initcheck();
1521 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1526 Tcl_SetResult(interp,(
char*)
"colvars module not active",TCL_VOLATILE);
1530 if (Tcl_GetInt(interp,argv[1],&new_freq) != TCL_OK) {
1533 colvars->cv_traj_freq = new_freq;
1540 Tcl_Interp *interp_in,
1541 int objc, Tcl_Obj *
const objv[]);
1543 int ScriptTcl::Tcl_colvars(ClientData clientData,
1546 Tcl_Obj *
const objv[])
1549 script->initcheck();
1553 int ScriptTcl::Tcl_checkpoint(ClientData clientData,
1554 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1556 script->initcheck();
1558 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1567 int ScriptTcl::Tcl_revert(ClientData clientData,
1568 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1570 script->initcheck();
1572 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1582 unsigned int hash = 0;
1589 return hash % CmiNumPartitions();
1592 int ScriptTcl::Tcl_checkpointReplica(ClientData clientData,
1593 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1595 script->initcheck();
1596 if (argc < 2 || argc > 3) {
1597 Tcl_SetResult(interp,
1598 (
char*)
"args: <key> ?<replica> or global?",TCL_VOLATILE);
1601 script->setParameter(
"scriptStringArg1", argv[1]);
1602 int replica = CmiMyPartition();
1604 if ( ! strcmp(argv[2],
"global") ) {
1606 }
else if ( sscanf(argv[2],
"%d",&replica) != 1 ) {
1607 Tcl_SetResult(interp,
1608 (
char*)
"args: <key> ?<replica> or global?",TCL_VOLATILE);
1612 if ( replica != CmiMyPartition() ) {
1613 if ( !
Node::Object()->simParameters->replicaUniformPatchGrids ) {
1614 Tcl_SetResult(interp,
1615 (
char*)
"replicaUniformPatchGrids is required for "
1616 "checkpointing on other replicas",TCL_VOLATILE);
1623 sprintf(str,
"%d", replica);
1624 script->setParameter(
"scriptIntArg1", str);
1627 if ( replica != CmiMyPartition() ) CkpvAccess(_qd)->create(1);
1634 Tcl_SetResult(interp,
1635 (
char*)
"checkpointStore/Load/Swap/Free called via unrecognized name",
1643 int ScriptTcl::Tcl_replicaDcdFile(ClientData clientData,
1644 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1645 #ifdef MEM_OPT_VERSION
1646 Tcl_SetResult(interp,
1647 (
char*)
"replicaDcdFile not supported in memory-optimized builds",
1652 script->initcheck();
1655 if (argc < 2 || argc > 3 || ((cmpoff = strcmp(argv[1],
"off")) != 0 && sscanf(argv[1],
"%d",&index) != 1) ) {
1656 Tcl_SetResult(interp,(
char*)
"args: <index>|off ?<filename>?",TCL_VOLATILE);
1662 }
else if ( argc == 3 ) {
1669 int ScriptTcl::Tcl_callback(ClientData clientData,
1670 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1673 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1677 delete [] script->callbackname;
1678 script->callbackname =
new char[strlen(argv[1])+1];
1679 strcpy(script->callbackname,argv[1]);
1681 iout <<
"TCL: Reduction callback proc set to " <<
1682 script->callbackname <<
"\n" <<
endi;
1687 void ScriptTcl::doCallback(
const char *labels,
const char *data) {
1688 if ( ! callbackname )
return;
1689 int len = strlen(callbackname) + strlen(labels) + strlen(data) + 7;
1690 char *cmd =
new char[len];
1691 sprintf(cmd,
"%s {%s} {%s}", callbackname, labels, data);
1692 int rval = Tcl_Eval(interp,cmd);
1694 if (rval != TCL_OK) {
1695 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
1696 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
1702 int ScriptTcl::Tcl_reinitatoms(ClientData clientData,
1703 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1705 script->initcheck();
1707 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
1712 iout <<
"TCL: Reinitializing atom data\n" <<
endi;
1720 msg->
lattice = script->state->lattice;
1721 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).setLattice(msg);
1724 StringList *coordinateFilename = script->state->configList->
find(
"bincoordinates");
1725 if ( coordinateFilename ) {
1727 }
else if (coordinateFilename = script->state->configList->
find(
"coordinates")) {
1728 PDB coordpdb(coordinateFilename->
data);
1729 if ( coordpdb.num_atoms() != script->state->pdb->
num_atoms() ) {
1730 NAMD_die(
"inconsistent atom count on re-reading coordinates pdb file");
1733 coordpdb.get_all_positions(positions);
1735 delete [] positions;
1737 iout <<
iWARN <<
"reinitatoms may fail if pdb-format output has occurred\n" <<
endi;
1740 script->reinitAtoms();
1744 iout <<
"TCL: Reinitializing atom data from files with basename " << argv[1] <<
"\n" <<
endi;
1746 simParams->
readExtendedSystem((std::string(argv[1])+
".xsc").c_str(), &(script->state->lattice));
1753 msg->
lattice = script->state->lattice;
1754 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).setLattice(msg);
1756 script->reinitAtoms(argv[1]);
1761 #define DEG2RAD 3.14159625359/180.0
1762 #define UNITCELLSLOP 0.0001
1769 if (ts->A <= 1 || ts->B <= 1 || ts->C <= 1)
return 0;
1773 double epsalpha =
DEG2RAD*(ts->alpha-90.0);
1774 double epsbeta =
DEG2RAD*(ts->beta-90.0);
1775 double epsgamma =
DEG2RAD*(ts->gamma-90.0);
1776 double cosAB = -sin(epsgamma);
1777 double sinAB = cos(epsgamma);
1778 double cosAC = -sin(epsbeta);
1779 double cosBC = -sin(epsalpha);
1790 vecC.
x = ts->C * cosAC;
1791 vecC.
y = (ts->B*ts->C*cosBC -
B.x*vecC.
x)/
B.y;
1792 vecC.
z = sqrt(ts->C*ts->C - vecC.
x*vecC.
x - vecC.
y*vecC.
y);
1800 int ScriptTcl::Tcl_coorfile(ClientData clientData,
1801 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1803 script->initcheck();
1804 if (argc == 4 && !strcmp(argv[1],
"open")) {
1805 if (strcmp(argv[2],
"dcd")) {
1806 NAMD_die(
"Sorry, coorfile presently supports only DCD files");
1810 Tcl_AppendResult(interp,
"coorfile: Error opening file ", argv[3], NULL);
1814 Tcl_AppendResult(interp,
"Coordinate file ", argv[3],
1815 "\ncontains the wrong number of atoms.", NULL);
1820 iout <<
iINFO <<
"Coordinate file " << argv[3] <<
" opened for reading.\n"
1822 }
else if (argc == 2 && !strcmp(argv[1],
"read")) {
1824 Tcl_AppendResult(interp,
"coorfile read: Error, no file open for reading",
1828 molfile_timestep_t ts;
1832 Tcl_SetObjResult(interp, Tcl_NewIntObj(-1));
1838 iout <<
iINFO <<
"Updating unit cell from timestep.\n" <<
endi;
1839 if ( lattice.
a_p() && ! script->state->lattice.
a_p() ||
1840 lattice.
b_p() && ! script->state->lattice.
b_p() ||
1841 lattice.
c_p() && ! script->state->lattice.
c_p() ) {
1842 iout <<
iWARN <<
"Cell basis vectors should be specified before reading trajectory.\n" <<
endi;
1845 Vector a(0.);
if ( script->state->lattice.
a_p() ) a = lattice.
a();
1846 Vector b(0.);
if ( script->state->lattice.
b_p() ) b = lattice.
b();
1847 Vector c(0.);
if ( script->state->lattice.
c_p() ) c = lattice.
c();
1848 script->state->lattice.
set(a,b,c);
1850 msg->
lattice = script->state->lattice;
1851 (CProxy_PatchMgr(CkpvAccess(BOCclass_group).patchMgr)).setLattice(msg);
1860 script->reinitAtoms();
1861 Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
1862 }
else if (argc == 2 && !strcmp(argv[1],
"close")) {
1864 Tcl_AppendResult(interp,
"coorfile close: No file opened for reading!",
1874 }
else if (argc ==2 && !strcmp(argv[1],
"skip")) {
1876 Tcl_AppendResult(interp,
"coorfile skip: Error, no file open for reading",
1882 Tcl_SetObjResult(interp, Tcl_NewIntObj(-1));
1885 Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
1888 NAMD_die(
"Unknown option passed to coorfile");
1893 int ScriptTcl::Tcl_dumpbench(ClientData clientData,
1894 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1896 script->initcheck();
1898 Tcl_AppendResult(interp,
"usage: dumpbench <filename>", NULL);
1902 if ( CkNumPes() != 1 ) {
1903 Tcl_AppendResult(interp,
"multiple processors detected; dumpbench only works on serial runs", NULL);
1907 FILE *file = fopen(argv[1],
"w");
1909 Tcl_AppendResult(interp,
"dumpbench: error opening file ", argv[1], NULL);
1914 Tcl_AppendResult(interp,
"dumpbench: error dumping benchmark data", NULL);
1920 Tcl_AppendResult(interp,
"benchmark data written to file ", argv[1], NULL);
1926 int ScriptTcl::Tcl_consForceConfig(ClientData clientData,
1927 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
1929 script->initcheck();
1931 Tcl_AppendResult(interp,
"consForceConfig requires constantForce on", NULL);
1935 Tcl_WrongNumArgs(interp, 1, objv, (
char *)
"<atomids> <forces>");
1938 int natoms, nforces;
1939 Tcl_Obj **atomobjlist, **forceobjlist;
1940 if (Tcl_ListObjGetElements(interp, objv[1], &natoms, &atomobjlist) != TCL_OK ||
1941 Tcl_ListObjGetElements(interp, objv[2], &nforces, &forceobjlist) != TCL_OK) {
1944 if (natoms != nforces) {
1945 Tcl_AppendResult(interp, (
char *)
"consforceconfig: atom list and force list not the same size!", NULL);
1949 for (
int i=0; i<natoms; i++) {
1954 if (Tcl_GetIntFromObj(interp, atomobjlist[i], &atomid) != TCL_OK)
1956 if (Tcl_ListObjGetElements(interp, forceobjlist[i], &nelem, &elemlist) != TCL_OK)
1959 Tcl_AppendResult(interp, (
char *)
"consforceconfig: forces must have three elements", NULL);
1962 if (Tcl_GetDoubleFromObj(interp, elemlist[0], &force.
x) != TCL_OK ||
1963 Tcl_GetDoubleFromObj(interp, elemlist[1], &force.
y) != TCL_OK ||
1964 Tcl_GetDoubleFromObj(interp, elemlist[2], &force.
z) != TCL_OK) {
1970 (CProxy_ComputeMgr(CkpvAccess(BOCclass_group).
computeMgr)).recvComputeConsForceMsg(msg);
1974 int ScriptTcl::Tcl_reloadCharges(ClientData clientData,
1975 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1977 script->initcheck();
1979 Tcl_AppendResult(interp,
"usage: reloadCharges <filename>", NULL);
1991 int ScriptTcl::Tcl_reloadGridforceGrid(ClientData clientData,
1992 Tcl_Interp *interp,
int argc,
const char *argv[]) {
1994 script->initcheck();
1996 const char *key = NULL;
2001 }
else if (argc == 2) {
2004 Tcl_AppendResult(interp,
"usage: reloadGridforceGrid [<gridkey>]", NULL);
2015 int ScriptTcl::Tcl_updateGridScale(ClientData clientData,
2016 Tcl_Interp *interp,
int argc,
const char *argv[]) {
2018 script->initcheck();
2020 Vector scale(1.0f,1.0f,1.0f);
2021 const char *key = NULL;
2026 scale.x = atof( argv[1] );
2027 scale.y = atof( argv[2] );
2028 scale.z = atof( argv[3] );
2029 }
else if (argc == 5) {
2031 scale.x = atof( argv[2] );
2032 scale.y = atof( argv[3] );
2033 scale.z = atof( argv[4] );
2035 Tcl_AppendResult(interp,
"usage: updateGridforceGrid [<gridkey>] scaleX scaleY scaleZ", NULL);
2047 int ScriptTcl::Tcl_reloadStructure(ClientData clientData,
2048 Tcl_Interp *interp,
int argc,
const char *argv[]) {
2050 script->initcheck();
2057 Tcl_SetResult(interp, result, TCL_VOLATILE);
2060 Tcl_SetResult(interp,(
char*)
"unknown structure",TCL_VOLATILE);
2066 if (argc == 2) ok = 1;
2067 if (argc == 4 && ! strcmp(argv[2],
"pdb")) ok = 1;
2069 Tcl_AppendResult(interp,
"usage: structure <filename> [pdb] <filename>", NULL);
2073 iout <<
"TCL: Reloading molecular structure from file " << argv[1];
2074 if ( argc == 4 )
iout <<
" and pdb file " << argv[3];
2076 script->config->
find(
"structure")->
set(argv[1]);
2077 if (argc == 4) script->config->
find(
"coordinates")->
set(argv[3]);
2089 CkPrintf(
"psfgen) %s\n",msg);
2092 extern "C" void newhandle_msg_ex(
void *vdata,
void *v,
const char *msg,
int prepend,
int newline) {
2093 CkPrintf(
"%s%s%s", (prepend ?
"psfgen) " :
""), msg, (newline ?
"\n" :
""));
2105 DebugM(3,
"Constructing ScriptTcl\n");
2123 interp = Tcl_CreateInterp();
2127 Tcl_CreateCommand(interp,
"python", Tcl_python,
2128 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2129 Tcl_CreateCommand(interp,
"startup", Tcl_startup,
2130 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2131 Tcl_CreateCommand(interp,
"exit", Tcl_exit,
2132 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2133 Tcl_CreateCommand(interp,
"abort", Tcl_abort,
2134 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2135 Tcl_CreateCommand(interp,
"numPes", Tcl_numPes,
2136 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2137 Tcl_CreateCommand(interp,
"numNodes", Tcl_numNodes,
2138 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2139 Tcl_CreateCommand(interp,
"numPhysicalNodes", Tcl_numPhysicalNodes,
2140 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2141 Tcl_CreateCommand(interp,
"numReplicas", Tcl_numReplicas,
2142 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2143 Tcl_CreateCommand(interp,
"myReplica", Tcl_myReplica,
2144 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2145 Tcl_CreateCommand(interp,
"replicaEval", Tcl_replicaEval,
2146 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2147 Tcl_CreateCommand(interp,
"replicaYield", Tcl_replicaYield,
2148 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2149 Tcl_CreateCommand(interp,
"replicaSendrecv", Tcl_replicaSendrecv,
2150 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2151 Tcl_CreateCommand(interp,
"replicaSend", Tcl_replicaSend,
2152 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2153 Tcl_CreateCommand(interp,
"replicaRecv", Tcl_replicaRecv,
2154 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2155 Tcl_CreateCommand(interp,
"replicaBarrier", Tcl_replicaBarrier,
2156 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2157 Tcl_CreateCommand(interp,
"replicaAtomSendrecv", Tcl_replicaAtomSendrecv,
2158 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2159 Tcl_CreateCommand(interp,
"replicaAtomSend", Tcl_replicaAtomSend,
2160 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2161 Tcl_CreateCommand(interp,
"replicaAtomRecv", Tcl_replicaAtomRecv,
2162 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2163 Tcl_CreateCommand(interp,
"stdout", Tcl_stdout,
2164 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2165 Tcl_CreateCommand(interp,
"print", Tcl_print,
2166 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
2167 Tcl_CreateCommand(interp,
"unknown", Tcl_config,
2168 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2169 Tcl_CreateCommand(interp,
"param", Tcl_config,
2170 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2171 Tcl_CreateCommand(interp,
"isset", Tcl_isset_config,
2172 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2173 Tcl_CreateCommand(interp,
"istrue", Tcl_istrue_config,
2174 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2175 Tcl_CreateCommand(interp,
"run", Tcl_run,
2176 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2177 Tcl_CreateCommand(interp,
"minimize", Tcl_minimize,
2178 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2179 Tcl_CreateCommand(interp,
"move", Tcl_move,
2180 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2181 Tcl_CreateCommand(interp,
"moveallby", Tcl_moveallby,
2182 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2183 Tcl_CreateCommand(interp,
"output", Tcl_output,
2184 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2185 Tcl_CreateCommand(interp,
"measure", Tcl_measure,
2186 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2187 Tcl_CreateCommand(interp,
"colvarbias", Tcl_colvarbias,
2188 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2189 Tcl_CreateCommand(interp,
"colvarvalue", Tcl_colvarvalue,
2190 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2191 Tcl_CreateObjCommand(interp,
"cv", Tcl_colvars,
2192 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2193 Tcl_CreateCommand(interp,
"colvarfreq", Tcl_colvarfreq,
2194 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2195 Tcl_CreateCommand(interp,
"checkpoint", Tcl_checkpoint,
2196 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2197 Tcl_CreateCommand(interp,
"revert", Tcl_revert,
2198 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2199 Tcl_CreateCommand(interp,
"checkpointStore", Tcl_checkpointReplica,
2200 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2201 Tcl_CreateCommand(interp,
"checkpointLoad", Tcl_checkpointReplica,
2202 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2203 Tcl_CreateCommand(interp,
"checkpointSwap", Tcl_checkpointReplica,
2204 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2205 Tcl_CreateCommand(interp,
"checkpointFree", Tcl_checkpointReplica,
2206 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2207 Tcl_CreateCommand(interp,
"reinitvels", Tcl_reinitvels,
2208 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2209 Tcl_CreateCommand(interp,
"rescalevels", Tcl_rescalevels,
2210 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2211 Tcl_CreateCommand(interp,
"reinitatoms", Tcl_reinitatoms,
2212 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2213 Tcl_CreateCommand(interp,
"replicaDcdFile", Tcl_replicaDcdFile,
2214 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2215 Tcl_CreateCommand(interp,
"callback", Tcl_callback,
2216 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2217 Tcl_CreateCommand(interp,
"coorfile", Tcl_coorfile,
2218 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2219 Tcl_CreateCommand(interp,
"dumpbench", Tcl_dumpbench,
2220 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2221 Tcl_CreateObjCommand(interp,
"consForceConfig", Tcl_consForceConfig,
2222 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2223 Tcl_CreateCommand(interp,
"reloadCharges", Tcl_reloadCharges,
2224 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2226 Tcl_CreateCommand(interp,
"reloadGridforceGrid", Tcl_reloadGridforceGrid,
2227 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2228 Tcl_CreateCommand(interp,
"updateGridScale", Tcl_updateGridScale,
2229 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
2238 int code = Tcl_EvalEx(interp,script,-1,TCL_EVAL_GLOBAL);
2239 *resultPtr = Tcl_GetStringResult(interp);
2242 NAMD_bug(
"ScriptTcl::eval called without Tcl.");
2250 int code = Tcl_Eval(interp,script);
2251 const char *result = Tcl_GetStringResult(interp);
2252 if (*result != 0) CkPrintf(
"TCL: %s\n",result);
2253 if (code != TCL_OK) {
2254 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2255 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
2258 NAMD_bug(
"ScriptTcl::eval called without Tcl.");
2266 Tcl_Interp *interp = Tcl_CreateInterp();
2270 Tcl_SetVar(interp,
"argv0", argv[0], TCL_GLOBAL_ONLY);
2271 Tcl_SetVar2Ex(interp,
"argc", NULL, Tcl_NewIntObj(argc-1), TCL_GLOBAL_ONLY);
2272 Tcl_Obj *argvPtr = Tcl_NewListObj(0, NULL);
2273 for (
int i=1; i<argc; ++i ) {
2274 Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(argv[i],-1));
2276 Tcl_SetVar2Ex(interp,
"argv", NULL, argvPtr, TCL_GLOBAL_ONLY);
2277 int code = Tcl_EvalFile(interp,argv[0]);
2278 if (code != TCL_OK) {
2279 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2280 fprintf(stderr,
"%s\n",(errorInfo ? errorInfo :
"Unknown Tcl error"));
2288 Tcl_SetVar(interp,
"argv0", argv[0], TCL_GLOBAL_ONLY);
2289 Tcl_SetVar2Ex(interp,
"argc", NULL, Tcl_NewIntObj(argc-1), TCL_GLOBAL_ONLY);
2290 Tcl_Obj *argvPtr = Tcl_NewListObj(0, NULL);
2291 for (
int i=1; i<argc; ++i ) {
2292 Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(argv[i],-1));
2294 Tcl_SetVar2Ex(interp,
"argv", NULL, argvPtr, TCL_GLOBAL_ONLY);
2295 int code = Tcl_EvalFile(interp,argv[0]);
2296 if (code != TCL_OK) {
2297 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2298 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
2307 int code = Tcl_EvalFile(interp,scriptFile);
2308 const char *result = Tcl_GetStringResult(interp);
2309 if (*result != 0) CkPrintf(
"TCL: %s\n",result);
2310 if (code != TCL_OK) {
2311 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
2312 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
2315 NAMD_bug(
"ScriptTcl::load called without Tcl.");
2325 if ( NULL == scriptFile || NULL == (config =
new ConfigList(scriptFile)) ) {
2326 NAMD_die(
"Simulation config file is empty.");
2330 if (runWasCalled == 0) {
2334 else runController(SCRIPT_RUN);
2339 #if CMK_HAS_PARTITION
2346 DebugM(3,
"Destructing ScriptTcl\n");
2348 if ( interp ) Tcl_DeleteInterp(interp);
2349 delete [] callbackname;
std::ostream & iINFO(std::ostream &s)
int istrueinparseopts(const char *name)
static int replica_hash(const char *key)
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 __thread ComputeMgr * computeMgr
static void exit(int status=0)
SimParameters * simParameters
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 *)
const char * rstring(Range r)
char outputFilename[NAMD_FILENAME_BUFFER_SIZE]
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 reinitAtoms(const char *basename=0)
void replicaDcdInit(int index, const char *filename)
void NAMD_bug(const char *err_msg)
void set(Vector A, Vector B, Vector C)
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
int eabf_static_init(Tcl_Interp *interp)
BigReal rescaleVelocities_sumTemps
void reloadStructure(const char *, const char *)
int berendsenPressure_count
void readExtendedSystem(const char *filename, Lattice *latptr=0)
__global__ void const int const TileList *__restrict__ TileExcl *__restrict__ const int *__restrict__ const int const float2 *__restrict__ cudaTextureObject_t const int *__restrict__ const float3 const float3 const float3 const float4 *__restrict__ const float cudaTextureObject_t cudaTextureObject_t float const PatchPairRecord *__restrict__ const int *__restrict__ const int2 *__restrict__ const unsigned int *__restrict__ unsigned int *__restrict__ int *__restrict__ int *__restrict__ TileListStat *__restrict__ const BoundingBox *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ float *__restrict__ const int numPatches
void NAMD_die(const char *err_msg)
void tclmain(int, char **)
void publish(int tag, const T &t)
int tcl_run_colvarscript_command(ClientData clientData, Tcl_Interp *interp_in, int objc, Tcl_Obj *const objv[])
int add(const Elem &elem)
char * getfromparseopts(const char *name, char *outbuf)
WorkDistrib * workDistrib
int tcl_vector_math_init(Tcl_Interp *interp)
static void barrier(void)
int register_cb(void *v, vmdplugin_t *p)
int rescaleVelocities_numTemps
#define MAX_SCRIPT_PARAM_SIZE
static void createCommands(Tcl_Interp *)
StringList * find(const char *name) const
int dumpbench(FILE *file)
int molfile_dcdplugin_fini(void)
static int get_lattice_from_ts(Lattice *lattice, const molfile_timestep_t *ts)
static Tensor symmetric(const Vector &v1, const Vector &v2)
#define CHECK_REPLICA(REP)
void replica_sendRecv(const char *sndbuf, int sendcount, int destPart, int destPE, DataMessage **precvMsg, int srcPart, int srcPE)
static int tclsh(int, char **)
int molfile_dcdplugin_register(void *, vmdplugin_register_cb)
int configListInit(ConfigList *)
Tensor langevinPiston_origStrainRate
static void deleteCommands(Tcl_Interp *)
int issetinparseopts(const char *name)
Tensor berendsenPressure_avg
char param[MAX_SCRIPT_PARAM_SIZE]
void reloadCharges(const char *filename)
void reloadGridforceGrid(const char *key)