23 #define MIN_DEBUG_LEVEL 3 28 int GlobalMasterTcl::Tcl_print(ClientData,
29 Tcl_Interp *,
int argc,
const char *argv[]) {
30 int arglen = 1;
int ai;
31 for (ai=1; ai<argc; ++ai) { arglen += strlen(argv[ai]) + 1; }
32 char *buf =
new char[arglen]; *buf = 0;
33 for (ai=1; ai<argc; ++ai) { strcat(buf,argv[ai]); strcat(buf,
" "); }
34 ai = strlen(buf);
if ( ai ) buf[ai-1] = 0;
35 CkPrintf(
"TCL: %s\n",buf);
41 int GlobalMasterTcl::Tcl_atomid(ClientData clientData,
42 Tcl_Interp *interp,
int argc,
const char *argv[]) {
44 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
47 const char *segid = argv[1];
49 if (Tcl_GetInt(interp,argv[2],&resid) != TCL_OK) {
52 const char *aname = argv[3];
58 Tcl_SetResult(interp,(
char*)
"atom not found",TCL_VOLATILE);
63 char s[16]; sprintf(s,
"%d",atomid);
64 Tcl_SetResult(interp,s,TCL_VOLATILE);
65 DebugM(4,
"Atom ID " << atomid <<
" identified by name\n");
70 int GlobalMasterTcl::Tcl_addatom(ClientData clientData,
71 Tcl_Interp *interp,
int argc,
const char *argv[]) {
72 DebugM(2,
"Tcl_addatom called\n");
74 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
78 if (Tcl_GetInt(interp,argv[1],&atomid) != TCL_OK) {
83 if ( (atomid-1) < 0 || (atomid-1) >= numAtoms ) {
85 sprintf(errmsg,
"illegal atomid %d",atomid);
86 Tcl_SetResult(interp,errmsg,TCL_VOLATILE);
91 DebugM(4,
"Atom ID " << atomid <<
" added to config list\n");
96 int GlobalMasterTcl::Tcl_addgroup(ClientData clientData,
97 Tcl_Interp *interp,
int argc,
const char *argv[]) {
98 DebugM(2,
"Tcl_addgroup called\n");
100 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
108 int gcount = 1 + group_list.
size();
109 group_list.
resize(gcount);
112 int listc, i;
const char **listv;
113 if (Tcl_SplitList(interp,argv[1],&listc,&listv) != TCL_OK) {
120 for ( i = 0; i < listc; ++i ) {
122 if (Tcl_GetInt(interp,listv[i],&atomid) != TCL_OK) {
123 group_list.
resize(gcount-1);
124 Tcl_Free((
char*) listv);
127 if ( (atomid-1) < 0 || (atomid-1) >= numAtoms ) {
129 sprintf(errmsg,
"illegal atomid %d",atomid);
130 Tcl_SetResult(interp,errmsg,TCL_VOLATILE);
133 group_list[gcount-1].
add(atomid-1);
135 Tcl_Free((
char*) listv);
138 char s[16]; sprintf(s,
"g%d",gcount);
139 Tcl_SetResult(interp,s,TCL_VOLATILE);
141 DebugM(4,
"Group " << s <<
" added to config list\n");
146 int GlobalMasterTcl::Tcl_reconfig(ClientData clientData,
147 Tcl_Interp *interp,
int argc,
const char **) {
148 DebugM(2,
"Tcl_reconfig called\n");
150 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
153 iout <<
iWARN <<
"'reconfig' is obsolete - reconfiguration is now automatic." <<
endi;
154 iout <<
iWARN <<
"Use 'clearconfig' to clear the list of atoms and groups." <<
endi;
155 DebugM(4,
"Reconfiguration turned on\n");
159 int GlobalMasterTcl::Tcl_clearconfig(ClientData clientData,
160 Tcl_Interp *interp,
int argc,
const char **) {
161 DebugM(2,
"Tcl_reconfig called\n");
163 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
168 self->modifyRequestedAtoms().resize(0);
172 int GlobalMasterTcl::Tcl_getstep(ClientData clientData,
173 Tcl_Interp *interp,
int argc,
const char **) {
174 DebugM(2,
"Tcl_reconfig called\n");
176 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
181 char s[16]; sprintf(s,
"%d",self->step);
182 Tcl_SetResult(interp,s,TCL_VOLATILE);
186 int GlobalMasterTcl::Tcl_loadforces(ClientData clientData,
187 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
188 DebugM(1,
"Making tcl force array\n");
190 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
193 Tcl_Obj *
const force_array_name = objv[1];
204 DebugM(1,
"Making Tcl array\n");
205 while(forced_ids_i != forced_ids_e) {
206 Tcl_Obj *array_key = Tcl_NewIntObj((
int)((*forced_ids_i)+1));
207 Tcl_IncrRefCount(array_key);
210 Tcl_Obj *oldlist = Tcl_ObjGetVar2(interp, force_array_name, array_key, 0);
211 Tcl_Obj *newlist = Tcl_NewListObj(0,NULL);
212 if (oldlist == NULL) {
213 Tcl_ListObjAppendElement(interp, newlist,
214 Tcl_NewDoubleObj((
double)((*forces_i).x)));
215 Tcl_ListObjAppendElement(interp, newlist,
216 Tcl_NewDoubleObj((
double)((*forces_i).y)));
217 Tcl_ListObjAppendElement(interp, newlist,
218 Tcl_NewDoubleObj((
double)((*forces_i).z)));
222 double currval = 0.0;
223 Tcl_ListObjGetElements(interp, oldlist, &num_old_elems, &old_elems);
224 if (num_old_elems != 3) {
225 NAMD_die(
"TCL error in loadforces! Force list doesn't have 3 elements!");
227 Tcl_GetDoubleFromObj(interp, old_elems[0], &currval);
228 Tcl_ListObjAppendElement(interp, newlist,
229 Tcl_NewDoubleObj((
double)((*forces_i).x) + currval));
230 Tcl_GetDoubleFromObj(interp, old_elems[1], &currval);
231 Tcl_ListObjAppendElement(interp, newlist,
232 Tcl_NewDoubleObj((
double)((*forces_i).y + currval)));
233 Tcl_GetDoubleFromObj(interp, old_elems[2], &currval);
234 Tcl_ListObjAppendElement(interp, newlist,
235 Tcl_NewDoubleObj((
double)((*forces_i).z + currval)));
239 if (!Tcl_ObjSetVar2(interp, force_array_name, array_key, newlist, 0)) {
240 NAMD_die(
"TCL error in loadforces!");
244 Tcl_DecrRefCount(array_key);
251 DebugM(1,
"Done making tcl force array\n");
256 int GlobalMasterTcl::Tcl_enabletotalforces(ClientData clientData,
257 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[])
259 DebugM(2,
"Tcl_enabletotalforces called\n");
261 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
269 int GlobalMasterTcl::Tcl_disabletotalforces(ClientData clientData,
270 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[])
272 DebugM(2,
"Tcl_disabletotalforces called\n");
274 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
285 int GlobalMasterTcl::Tcl_loadtotalforces(ClientData clientData,
286 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[])
289 { Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
292 Tcl_Obj *
const force_array_name = objv[1];
295 if ( ! self->requestedTotalForces() ) {
296 Tcl_SetResult(interp,
297 (
char*)
"must call enabletotalforces before loadtotalforces",
308 while(forced_ids_i != forced_ids_e) {
309 Tcl_Obj *array_key = Tcl_NewIntObj((
int)((*forced_ids_i)+1));
310 Tcl_IncrRefCount(array_key);
311 Tcl_Obj *newlist = Tcl_NewListObj(0,NULL);
312 Tcl_ListObjAppendElement(interp, newlist,
313 Tcl_NewDoubleObj((
double)((*forces_i).x)));
314 Tcl_ListObjAppendElement(interp, newlist,
315 Tcl_NewDoubleObj((
double)((*forces_i).y)));
316 Tcl_ListObjAppendElement(interp, newlist,
317 Tcl_NewDoubleObj((
double)((*forces_i).z)));
320 if (!Tcl_ObjSetVar2(interp, force_array_name, array_key, newlist, 0)) {
321 NAMD_die(
"TCL error in loadtotalforces!");
325 Tcl_DecrRefCount(array_key);
336 for ( ; tf_i != tf_e; ++tf_i, ++gcount ) {
337 Tcl_Obj *newlist = Tcl_NewListObj(0, NULL);
339 sprintf(buf,
"g%d", gcount);
340 Tcl_Obj *arrkey = Tcl_NewStringObj(buf, -1);
341 Tcl_IncrRefCount(arrkey);
343 Tcl_ListObjAppendElement(interp, newlist,
344 Tcl_NewDoubleObj((
double)((*tf_i).x)));
345 Tcl_ListObjAppendElement(interp, newlist,
346 Tcl_NewDoubleObj((
double)((*tf_i).y)));
347 Tcl_ListObjAppendElement(interp, newlist,
348 Tcl_NewDoubleObj((
double)((*tf_i).z)));
350 if (!Tcl_ObjSetVar2(interp, force_array_name, arrkey, newlist, 0)) {
351 NAMD_die(
"TCL error in loadtotalforces for groups!");
354 Tcl_DecrRefCount(arrkey);
360 int GlobalMasterTcl::Tcl_loadcoords(ClientData clientData,
361 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
363 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
366 Tcl_Obj *
const vname = objv[1];
371 for ( ; a_i != a_e; ++a_i, ++p_i ) {
372 Tcl_Obj *newlist = Tcl_NewListObj(0, NULL);
373 Tcl_Obj *arrkey = Tcl_NewIntObj((
int)((*a_i)+1));
374 Tcl_IncrRefCount(arrkey);
376 Tcl_ListObjAppendElement(interp, newlist,
377 Tcl_NewDoubleObj((
double)((*p_i).x)));
378 Tcl_ListObjAppendElement(interp, newlist,
379 Tcl_NewDoubleObj((
double)((*p_i).y)));
380 Tcl_ListObjAppendElement(interp, newlist,
381 Tcl_NewDoubleObj((
double)((*p_i).z)));
383 if (!Tcl_ObjSetVar2(interp, vname, arrkey, newlist, 0)) {
384 NAMD_die(
"TCL error in global force calculation!");
387 Tcl_DecrRefCount(arrkey);
394 for ( ; c_i != c_e; ++c_i, ++gcount ) {
395 Tcl_Obj *newlist = Tcl_NewListObj(0, NULL);
397 sprintf(buf,
"g%d", gcount);
398 Tcl_Obj *arrkey = Tcl_NewStringObj(buf, -1);
399 Tcl_IncrRefCount(arrkey);
401 Tcl_ListObjAppendElement(interp, newlist,
402 Tcl_NewDoubleObj((
double)((*c_i).x)));
403 Tcl_ListObjAppendElement(interp, newlist,
404 Tcl_NewDoubleObj((
double)((*c_i).y)));
405 Tcl_ListObjAppendElement(interp, newlist,
406 Tcl_NewDoubleObj((
double)((*c_i).z)));
408 if (!Tcl_ObjSetVar2(interp, vname, arrkey, newlist, 0)) {
409 NAMD_die(
"TCL error in global force calculation!");
412 Tcl_DecrRefCount(arrkey);
418 int GlobalMasterTcl::Tcl_loadmasses(ClientData clientData,
419 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
421 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
424 Tcl_Obj *
const vname = objv[1];
429 for ( ; a_i != a_e; ++a_i) {
430 Tcl_Obj *arrkey = Tcl_NewIntObj((
int)((*a_i)+1));
431 Tcl_IncrRefCount(arrkey);
432 if (!Tcl_ObjSetVar2(interp, vname, arrkey,
433 Tcl_NewDoubleObj((
double)(mol->
atommass(*a_i))),
435 NAMD_die(
"TCL error in global force calculation!");
438 Tcl_DecrRefCount(arrkey);
442 g_i =
self->getGroupMassBegin();
443 g_e =
self->getGroupMassEnd();
445 for ( ; g_i != g_e; ++g_i, ++gcount) {
447 sprintf(buf,
"g%d", gcount);
448 Tcl_Obj *arrkey = Tcl_NewStringObj(buf, -1);
449 Tcl_IncrRefCount(arrkey);
450 if (!Tcl_ObjSetVar2(interp, vname, arrkey,
451 Tcl_NewDoubleObj((
double)(*g_i)),
453 NAMD_die(
"TCL error in global force calculation!");
456 Tcl_DecrRefCount(arrkey);
462 int GlobalMasterTcl::Tcl_addforce(ClientData clientData,
463 Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
464 DebugM(2,
"Tcl_addforce called\n");
466 Tcl_SetResult(interp,(
char*)
"wrong # args",TCL_VOLATILE);
469 Tcl_Obj **force;
int fnum;
int atomid;
double x, y, z;
471 char *
id = Tcl_GetStringFromObj(objv[1], NULL);
472 if (
id[0] ==
'g' ) {
474 if ( Tcl_GetInt(interp,
id+1,&atomid) != TCL_OK )
return TCL_ERROR;
476 if ( Tcl_GetInt(interp,
id,&atomid) != TCL_OK )
return TCL_ERROR;
478 if (Tcl_ListObjGetElements(interp, objv[2], &fnum, &force) != TCL_OK) {
482 (Tcl_GetDoubleFromObj(interp, force[0],&x) != TCL_OK) ||
483 (Tcl_GetDoubleFromObj(interp, force[1],&y) != TCL_OK) ||
484 (Tcl_GetDoubleFromObj(interp, force[2],&z) != TCL_OK) ) {
485 Tcl_SetResult(interp,(
char*)
"force not a vector",TCL_VOLATILE);
492 if ( atomid < 1 || atomid > ngrps ) {
493 Tcl_SetResult(interp,(
char*)
"requested group not available",TCL_VOLATILE);
496 self->modifyGroupForces().item(atomid-1) +=
Vector(x,y,z);
498 self->modifyForcedAtoms().add(atomid-1);
499 self->modifyAppliedForces().add(
Vector(x,y,z));
501 DebugM(4,
"Atom ID " << atomid <<
" added to force list\n");
506 int GlobalMasterTcl::Tcl_addenergy(ClientData clientData,
507 Tcl_Interp *interp,
int argc,
const char *argv[])
513 if (Tcl_GetDouble(interp,argv[1],&energy) != TCL_OK)
525 DebugM(3,
"Constructing GlobalMasterTcl\n");
535 DebugM(3,
"Destructing GlobalMasterTcl\n");
545 void GlobalMasterTcl::initialize() {
546 DebugM(4,
"Initializing master\n");
551 NAMD_die(
"Node::Object()->getScript() == NULL");
556 Tcl_CreateCommand(interp,
"atomid", Tcl_atomid,
557 (ClientData) (
Node::Object()->molecule), (Tcl_CmdDeleteProc *) NULL);
561 Tcl_CreateCommand(interp,
"addatom", Tcl_addatom,
562 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
563 Tcl_CreateCommand(interp,
"addgroup", Tcl_addgroup,
564 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
565 Tcl_CreateObjCommand(interp, (
char *)
"enabletotalforces", Tcl_enabletotalforces,
566 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
567 Tcl_CreateObjCommand(interp, (
char *)
"disabletotalforces", Tcl_disabletotalforces,
568 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
575 for ( ; script; script = script->
next ) {
578 if ( strstr(script->
data,
"\n") ) {
579 code = Tcl_Eval(interp,script->
data);
581 else code = Tcl_EvalFile(interp,script->
data);
583 const char *result = Tcl_GetStringResult(interp);
585 if (*result != 0) CkPrintf(
"TCL: %s\n",result);
587 if (code != TCL_OK) {
588 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
589 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
594 Tcl_CreateObjCommand(interp, (
char *)
"loadforces", Tcl_loadforces,
595 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
596 Tcl_CreateObjCommand(interp, (
char *)
"loadtotalforces", Tcl_loadtotalforces,
597 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
598 Tcl_CreateObjCommand(interp, (
char *)
"loadcoords", Tcl_loadcoords,
599 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
600 Tcl_CreateObjCommand(interp, (
char *)
"loadmasses", Tcl_loadmasses,
601 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
602 Tcl_CreateObjCommand(interp, (
char *)
"addforce", Tcl_addforce,
603 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
604 Tcl_CreateCommand(interp, (
char *)
"addenergy", Tcl_addenergy,
605 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
606 Tcl_CreateCommand(interp, (
char *)
"reconfig", Tcl_reconfig,
607 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
608 Tcl_CreateCommand(interp, (
char *)
"clearconfig", Tcl_clearconfig,
609 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
610 Tcl_CreateCommand(interp, (
char *)
"getstep", Tcl_getstep,
611 (ClientData)
this, (Tcl_CmdDeleteProc *) NULL);
614 NAMD_die(
"Sorry, tclForces is not available; built without TCL.");
617 DebugM(2,
"done initializing master\n");
622 DebugM(4,
"Calculating forces on master\n");
633 char cmd[129];
int code;
634 strcpy(cmd,
"calcforces"); code = Tcl_Eval(interp,cmd);
635 const char *result = Tcl_GetStringResult(interp);
636 if (*result != 0) CkPrintf(
"TCL: %s\n",result);
637 if (code != TCL_OK) {
638 const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
639 NAMD_die(errorInfo ? errorInfo :
"Unknown Tcl error");
ForceList & modifyAppliedForces()
AtomIDList & modifyRequestedAtoms()
AtomIDList::const_iterator getAtomIdBegin()
std::ostream & endi(std::ostream &s)
SubmitReduction * willSubmit(int setID, int size=-1)
std::ostream & iWARN(std::ostream &s)
static ReductionMgr * Object(void)
int add(const Elem &elem)
BigRealList::const_iterator getGroupMassEnd()
Molecule stores the structural information for the system.
const ResizeArray< AtomIDList > & requestedGroups()
void setall(const Elem &elem)
int get_atom_from_name(const char *segid, int resid, const char *aname) const
const Elem * const_iterator
AtomIDList & modifyForcedAtoms()
ResizeArray< AtomIDList > & modifyRequestedGroups()
void NAMD_die(const char *err_msg)
BigRealList::const_iterator getGroupMassBegin()
ForceList & modifyGroupForces()
Real atommass(int anum) const
void requestTotalForce(bool yesno=true)
AtomIDList::const_iterator getLastAtomsForcedBegin()
StringList * find(const char *name) const