21 #define MIN_DEBUG_LEVEL 1 48 for (
int port=1025; port < 4096; port++)
54 DebugM(3,
"Constructing\n");
64 NAMD_die(
"Unable to initialize socket interface for IMD.\n");
68 if (newport != port) {
69 iout <<
iWARN <<
"Interactive MD failed to bind to port " 70 << port <<
".\n" <<
endi;
74 NAMD_die(
"Interactive MD failed to find free port.\n");
77 iout <<
iINFO <<
"Interactive MD listening on port " 78 << newport <<
".\n" <<
endi;
101 iout <<
iWARN <<
"Incompatible Interactive MD, use VMD v1.4b2 or higher\n" 120 iout <<
iINFO <<
"INTERACTIVE MD AWAITING CONNECTION\n" <<
endi;
156 DebugM(2,
"Setting " << num <<
" forces.\n");
164 for ( i = 0; i < num; ++i, ++v_i) {
187 for (
int i_client=0; i_client<
clients.
size(); i_client++) {
188 void *clientsock =
clients[i_client];
196 vmd_atoms =
new int32[length];
197 vmd_forces =
new float[3*length];
200 "Error reading IMD forces, killing connection\n" <<
endi;
201 goto vmdDestroySocket;
207 if (
IMDignore) strcpy(option,
"IMDignore");
208 else strcpy(option,
"IMDignoreForces");
209 iout <<
iWARN <<
"Ignoring IMD forces due to " << option <<
"\n" <<
endi;
212 for (
int i=0; i<length; i++) {
213 vnew.
index = vmd_atoms[i];
214 if ( (vtest=
vmdforces.find(vnew)) != NULL) {
216 if (vmd_forces[3*i] != 0.0f || vmd_forces[3*i+1] != 0.0f
217 || vmd_forces[3*i+2] != 0.0f) {
218 vtest->
force.
x = vmd_forces[3*i];
219 vtest->
force.
y = vmd_forces[3*i+1];
220 vtest->
force.
z = vmd_forces[3*i+2];
228 if (vmd_forces[3*i] != 0.0f || vmd_forces[3*i+1] != 0.0f
229 || vmd_forces[3*i+2] != 0.0f) {
230 vnew.
force.
x = vmd_forces[3*i];
231 vnew.
force.
y = vmd_forces[3*i+1];
232 vnew.
force.
z = vmd_forces[3*i+2];
239 delete [] vmd_forces;
242 iout <<
iINFO <<
"Setting transfer rate to " << length<<
'\n'<<
endi;
247 iout <<
iWARN <<
"Ignoring IMD pause due to IMDignore\n" <<
endi;
272 iout <<
iWARN <<
"Ignoring IMD kill due to IMDignore\n" <<
endi;
275 NAMD_quit(
"Received IMD kill from client\n");
282 vmd_forces =
new float[3*length];
284 delete [] vmd_forces;
313 for (
int i=0; i<N; i++) {
int vmdsock_selwrite(void *v, int sec)
void * vmdsock_create(void)
ForceList & modifyAppliedForces()
std::ostream & iINFO(std::ostream &s)
static int find_free_port(void *sock, int defport)
int vmdsock_selread(void *v, int sec)
static int my_imd_connect(void *s)
void NAMD_quit(const char *err_msg)
int imd_send_energies(void *s, const IMDEnergies *energies)
SimParameters * simParameters
std::ostream & endi(std::ostream &s)
std::ostream & iWARN(std::ostream &s)
int add(const Elem &elem)
const ResizeArray< AtomIDList > & requestedGroups()
int imd_send_fcoords(void *s, int32 n, const float *coords)
vmdforce & operator=(const vmdforce &v)
int vmdsock_listen(void *v)
int vmdsock_bind(void *v, int port)
int imd_recv_fcoords(void *s, int32 n, float *coords)
int imd_recv_mdcomm(void *s, int32 n, int32 *indices, float *forces)
AtomIDList & modifyForcedAtoms()
int imd_handshake(void *s)
void NAMD_die(const char *err_msg)
ForceList & modifyGroupForces()
ResizeArray< void * > clients
static UniqueSortedArray< vmdforce > vmdforces
void send_energies(IMDEnergies *)
void vmdsock_destroy(void *v)
int operator<(const vmdforce &v)
void del(int index, int num=1)
int imd_recv_energies(void *s, IMDEnergies *energies)
int operator==(const vmdforce &v)
IMDType imd_recv_header(void *s, int32 *length)
void set_transrate(int newrate)
void use_imd(GlobalMasterIMD *)
void send_fcoords(int, FloatVector *)
void * vmdsock_accept(void *v)