15 int Measure::wrapCommand(ClientData clientData,
16 Tcl_Interp *interp,
int argc,
const char *argv[]) {
42 for(
int i = 0; i < numAtoms; ++i ) {
44 center += coordinates[i];
49 sprintf(s,
"%g %g %g", center.
x, center.
y, center.
z);
50 Tcl_SetResult(interp,s,TCL_VOLATILE);
55 static int Tcl_centerOfMass(ClientData, Tcl_Interp *interp,
int argc,
const char *argv[]) {
65 for(
int i = 0; i < numAtoms; ++i ) {
68 center += mass * coordinates[i];
73 sprintf(s,
"%g %g %g", center.
x, center.
y, center.
z);
74 Tcl_SetResult(interp,s,TCL_VOLATILE);
90 for( i = 0; i < numAtoms; ++i ) {
93 center += mass * coordinates[i];
98 for( i = 0; i < numAtoms; ++i ) {
100 moment += mass * (coordinates[i] - center).length2();
102 BigReal radius = sqrt(moment/totalMass);
105 sprintf(s,
"%g", radius);
106 Tcl_SetResult(interp,s,TCL_VOLATILE);
111 static int Tcl_loadCoords(ClientData, Tcl_Interp *interp,
int objc, Tcl_Obj *
const objv[]) {
113 if (objc < 2 || objc > 3) {
114 Tcl_SetResult(interp,(
char*)
"loadCoords: wrong # args",TCL_VOLATILE);
117 Tcl_Obj *
const vname = objv[1];
126 for (
int i=0; i<numAtoms; i++) {
127 Tcl_Obj *newlist = Tcl_NewListObj(0, NULL);
128 Tcl_Obj *arrkey = Tcl_NewIntObj(i+1);
129 Tcl_IncrRefCount(arrkey);
130 Tcl_ListObjAppendElement(interp, newlist,
131 Tcl_NewDoubleObj(coords[i].
x));
132 Tcl_ListObjAppendElement(interp, newlist,
133 Tcl_NewDoubleObj(coords[i].
y));
134 Tcl_ListObjAppendElement(interp, newlist,
135 Tcl_NewDoubleObj(coords[i].
z));
136 if (!Tcl_ObjSetVar2(interp, vname, arrkey, newlist, 0))
138 Tcl_DecrRefCount(arrkey);
144 if (Tcl_ListObjGetElements(interp, objv[2], &nelems, &elems) != TCL_OK) {
147 for (
int i=0; i<nelems; i++) {
149 if (Tcl_GetIntFromObj(interp, elems[i], &ind) != TCL_OK)
151 Tcl_Obj *newlist = Tcl_NewListObj(0, NULL);
152 Tcl_Obj *arrkey = Tcl_NewIntObj(ind);
153 Tcl_IncrRefCount(arrkey);
155 Tcl_ListObjAppendElement(interp, newlist,
156 Tcl_NewDoubleObj(coords[ind].
x));
157 Tcl_ListObjAppendElement(interp, newlist,
158 Tcl_NewDoubleObj(coords[ind].
y));
159 Tcl_ListObjAppendElement(interp, newlist,
160 Tcl_NewDoubleObj(coords[ind].
z));
161 if (!Tcl_ObjSetVar2(interp, vname, arrkey, newlist, 0))
163 Tcl_DecrRefCount(arrkey);
171 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
173 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
175 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
177 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
181 Tcl_DeleteCommand(interp,
"centerOfNumber");
182 Tcl_DeleteCommand(interp,
"centerOfMass");
183 Tcl_DeleteCommand(interp,
"radiusOfGyration");
184 Tcl_DeleteCommand(interp,
"loadCoords");
static int Tcl_centerOfNumber(ClientData, Tcl_Interp *interp, int argc, const char *argv[])
static int Tcl_radiusOfGyration(ClientData, Tcl_Interp *interp, int argc, const char *argv[])
static void createCommands(Tcl_Interp *)
Real atommass(int anum) const
static int Tcl_loadCoords(ClientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
static void deleteCommands(Tcl_Interp *)
static int Tcl_centerOfMass(ClientData, Tcl_Interp *interp, int argc, const char *argv[])