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");
   534   DebugM(3,
"Destructing GlobalMasterTcl\n");
   543 void GlobalMasterTcl::initialize() {
   544   DebugM(4,
"Initializing master\n");
   549     NAMD_die(
"Node::Object()->getScript() == NULL");
   554   Tcl_CreateCommand(interp, 
"atomid", Tcl_atomid,
   555     (ClientData) (
Node::Object()->molecule), (Tcl_CmdDeleteProc *) NULL);
   559   Tcl_CreateCommand(interp, 
"addatom", Tcl_addatom,
   560     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   561   Tcl_CreateCommand(interp, 
"addgroup", Tcl_addgroup,
   562       (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   563   Tcl_CreateObjCommand(interp, (
char *)
"enabletotalforces", Tcl_enabletotalforces,
   564     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   565   Tcl_CreateObjCommand(interp, (
char *)
"disabletotalforces", Tcl_disabletotalforces,
   566     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   573   for ( ; script; script = script->
next ) {
   576     if ( strstr(script->
data,
"\n") ) {
   577        code = Tcl_Eval(interp,script->
data);
   579     else code = Tcl_EvalFile(interp,script->
data);
   581     const char *result = Tcl_GetStringResult(interp);
   583     if (*result != 0) CkPrintf(
"TCL: %s\n",result);
   585     if (code != TCL_OK) {
   586       const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
   587       NAMD_die(errorInfo ? errorInfo : 
"Unknown Tcl error");
   592   Tcl_CreateObjCommand(interp, (
char *)
"loadforces", Tcl_loadforces,
   593     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   594   Tcl_CreateObjCommand(interp, (
char *)
"loadtotalforces", Tcl_loadtotalforces,
   595     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   596   Tcl_CreateObjCommand(interp, (
char *)
"loadcoords", Tcl_loadcoords,
   597     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   598   Tcl_CreateObjCommand(interp, (
char *)
"loadmasses", Tcl_loadmasses,
   599     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   600   Tcl_CreateObjCommand(interp, (
char *)
"addforce", Tcl_addforce,
   601     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   602   Tcl_CreateCommand(interp, (
char *)
"addenergy", Tcl_addenergy,
   603     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   604   Tcl_CreateCommand(interp, (
char *)
"reconfig", Tcl_reconfig,
   605       (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   606   Tcl_CreateCommand(interp, (
char *)
"clearconfig", Tcl_clearconfig,
   607       (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   608   Tcl_CreateCommand(interp, (
char *)
"getstep", Tcl_getstep,
   609     (ClientData) 
this, (Tcl_CmdDeleteProc *) NULL);
   612   NAMD_die(
"Sorry, tclForces is not available; built without TCL.");
   615   DebugM(2,
"done initializing master\n");
   620   DebugM(4,
"Calculating forces on master\n");
   631   char cmd[129];  
int code;
   632   strcpy(cmd,
"calcforces");  code = Tcl_Eval(interp,cmd);
   633   const char *result = Tcl_GetStringResult(interp);
   634   if (*result != 0) CkPrintf(
"TCL: %s\n",result);
   635   if (code != TCL_OK) {
   636     const char *errorInfo = Tcl_GetVar(interp,
"errorInfo",0);
   637     NAMD_die(errorInfo ? errorInfo : 
"Unknown Tcl error");
 
ForceList & modifyAppliedForces()
 
AtomIDList & modifyRequestedAtoms()
 
AtomIDList::const_iterator getAtomIdBegin()
 
std::ostream & endi(std::ostream &s)
 
std::ostream & iWARN(std::ostream &s)
 
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()
 
void addReductionEnergy(int reductionTag, BigReal energy)
 
StringList * find(const char *name) const