23 #define MIN_DEBUG_LEVEL 1 50 for (
int port=1025; port < 4096; port++)
56 DebugM(3,
"Constructing\n");
72 NAMD_die(
"Unable to initialize socket interface for IMD.\n");
76 if (newport != port) {
77 iout <<
iWARN <<
"Interactive MD failed to bind to port " 78 << port <<
".\n" <<
endi;
82 NAMD_die(
"Interactive MD failed to find free port.\n");
85 iout <<
iINFO <<
"Interactive MD listening on port " 86 << newport <<
".\n" <<
endi;
111 iout <<
iWARN <<
"IMD protocol version 3 detected\n" <<
endi;
121 iout <<
iWARN <<
"Incompatible Interactive MD, use VMD v1.4b2 or higher\n" 140 iout <<
iINFO <<
"INTERACTIVE MD AWAITING CONNECTION\n" <<
endi;
176 DebugM(2,
"Setting " << num <<
" forces.\n");
184 for ( i = 0; i < num; ++i, ++v_i) {
207 for (
int i_client=0; i_client<
clients.
size(); i_client++) {
208 void *clientsock =
clients[i_client];
216 vmd_atoms =
new int32[length];
217 vmd_forces =
new float[3*length];
220 "Error reading IMD forces, killing connection\n" <<
endi;
221 goto vmdDestroySocket;
227 if (
IMDignore) strcpy(option,
"IMDignore");
228 else strcpy(option,
"IMDignoreForces");
229 iout <<
iWARN <<
"Ignoring IMD forces due to " << option <<
"\n" <<
endi;
232 for (
int i=0; i<length; i++) {
233 vnew.
index = vmd_atoms[i];
234 if ( (vtest=
vmdforces.find(vnew)) != NULL) {
236 if (vmd_forces[3*i] != 0.0f || vmd_forces[3*i+1] != 0.0f
237 || vmd_forces[3*i+2] != 0.0f) {
238 vtest->
force.
x = vmd_forces[3*i];
239 vtest->
force.
y = vmd_forces[3*i+1];
240 vtest->
force.
z = vmd_forces[3*i+2];
248 if (vmd_forces[3*i] != 0.0f || vmd_forces[3*i+1] != 0.0f
249 || vmd_forces[3*i+2] != 0.0f) {
250 vnew.
force.
x = vmd_forces[3*i];
251 vnew.
force.
y = vmd_forces[3*i+1];
252 vnew.
force.
z = vmd_forces[3*i+2];
259 delete [] vmd_forces;
262 iout <<
iINFO <<
"Setting transfer rate to " << length<<
'\n'<<
endi;
267 iout <<
iWARN <<
"Ignoring IMD pause due to IMDignore\n" <<
endi;
312 iout <<
iWARN <<
"Ignoring IMD kill due to IMDignore\n" <<
endi;
315 NAMD_quit(
"Received IMD kill from client\n");
322 vmd_forces =
new float[3*length];
324 delete [] vmd_forces;
329 iout <<
iINFO <<
"IMD set to " << (
IMDwait ?
"wait" :
"not wait") <<
"for incoming connection" <<
'\n' <<
endi;
353 if (!clientsock)
continue;
355 const std::string error =
356 std::string{
"IMDv3: GlobalMasterIMD::send_energies socket timeout in "} +
379 if (!clientsock)
continue;
381 const std::string error =
382 std::string{
"IMDv3: GlobalMasterIMD::send_fcoords socket timeout in "} +
395 for (
int i=0; i<N; i++) {
411 if (!clientsock)
continue;
413 const std::string error =
414 std::string{
"IMDv3: GlobalMasterIMD::send_velocities socket timeout in "} +
426 for (
int i=0; i<N; i++) {
428 veltmp[3*i+1] = velocities[i].
y;
429 veltmp[3*i+2] = velocities[i].
z;
442 if (!clientsock)
continue;
444 const std::string error =
445 std::string{
"IMDv3: GlobalMasterIMD::send_forces socket timeout in "} +
457 for (
int i=0; i<N; i++) {
473 if (!clientsock)
continue;
475 const std::string error =
476 std::string{
"IMDv3: GlobalMasterIMD::send_box socket timeout in "} +
490 if (!clientsock)
continue;
492 const std::string error =
493 std::string{
"IMDv3: GlobalMasterIMD::send_time socket timeout in "} +
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)
void send_time(IMDTime *)
static int my_imd_connect(void *s, const int IMDversion, const IMDSessionInfo *sessionInfo)
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 imd_send_box(void *s, const IMDBox *box)
int add(const Elem &elem)
const ResizeArray< AtomIDList > & requestedGroups()
void send_velocities(int, FloatVector *)
int imd_send_fcoords(void *s, int32 n, const float *coords)
vmdforce & operator=(const vmdforce &v)
int vmdsock_listen(void *v)
int imd_send_forces(void *s, int32 n, const float *forces)
int vmdsock_bind(void *v, int port)
int imd_recv_fcoords(void *s, int32 n, float *coords)
int imd_send_time(void *s, const IMDTime *time)
int imd_recv_mdcomm(void *s, int32 n, int32 *indices, float *forces)
int imd_sessioninfo(void *s, const IMDSessionInfo *info)
AtomIDList & modifyForcedAtoms()
void NAMD_die(const char *err_msg)
ForceList & modifyGroupForces()
int imd_handshake(void *s, const int IMDVersion)
IMDSessionInfo IMDsendsettings
ResizeArray< void * > clients
static UniqueSortedArray< vmdforce > vmdforces
void send_energies(IMDEnergies *)
void vmdsock_destroy(void *v)
void send_forces(int, FloatVector *)
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)
IMDSessionInfo IMDsendsettings
IMDType imd_recv_header(void *s, int32 *length)
void set_transrate(int newrate)
void use_imd(GlobalMasterIMD *)
void send_fcoords(int, FloatVector *)
int imd_send_velocities(void *s, int32 n, const float *vels)
void * vmdsock_accept(void *v)