add message quit protocol, to allow for non-quantum MD steps

This commit is contained in:
Steve Plimpton
2019-06-18 14:30:30 -06:00
parent a39a35af20
commit 0bc648e23e
10 changed files with 115 additions and 41 deletions

View File

@ -32,9 +32,38 @@ atoms. The quantum code computes energy and forces based on the
coords. It returns them as a message to LAMMPS, which completes the
timestep.
A more complex example is where LAMMPS is the client code and
processes a series of data files, sending each configuration to a
quantum code to compute energy and forces. Or LAMMPS runs dynamics
with an atomistic force field, but pauses every N steps to ask the
quantum code to compute energy and forces.
Alternate methods for code coupling with LAMMPS are described on
the "Howto couple"_Howto_couple.html doc page.
The protocol for using LAMMPS as a client is to use these 3 commands
in this order (other commands may come in between):
"message client"_message.html # initiate client/server interaction
"fix client/md"_fix_client_md.html # any client fix which makes specific requests to the server
"message quit"_message.html # terminate client/server interaction :ul
In between the two message commands, a client fix command and
"unfix"_unfix.html command can be used multiple times. Similarly,
this sequence of 3 commands can be repeated multiple times, assuming
the server program operates in a similar fashion, to initiate and
terminate client/server communication.
The protocol for using LAMMPS as a server is to use these 2 commands
in this order (other commands may come in between):
"message server"_message.html # initiate client/server interaction
"server md"_server__md.html # any server command which responds to specific requests from the client :ul
This sequence of 2 commands can be repeated multiple times, assuming
the client program operates in a similar fashion, to initiate and
terminate client/server communication.
LAMMPS support for client/server coupling is in its "MESSAGE
package"_Packages_details.html#PKG-MESSAGE which implements several
commands that enable LAMMPS to act as a client or server, as discussed
@ -46,8 +75,8 @@ in the lib/message dir. The CSlib has its own
programs.
NOTE: For client/server coupling to work between LAMMPS and another
code, the other code also has to use the CSlib. This can sometimes be
done without any modifications to the other code by simply wrapping it
code, the other code also has to use the CSlib. This can often be
done without any modification to the other code by simply wrapping it
with a Python script that exchanges CSlib messages with LAMMPS and
prepares input for or processes output from the other code. The other
code also has to implement a matching protocol for the format and

View File

@ -37,10 +37,10 @@ computes their interaction, and returns the energy, forces, and virial
for the interacting particles to LAMMPS, so it can complete the
timestep.
The server code could be a quantum code, or another classical MD code
which encodes a force field (pair_style in LAMMPS lingo) which LAMMPS
does not have. In the quantum case, this fix is a mechanism for
running {ab initio} MD with quantum forces.
Note that the server code can be a quantum code, or another classical
MD code which encodes a force field (pair_style in LAMMPS lingo) which
LAMMPS does not have. In the quantum case, this fix is a mechanism
for running {ab initio} MD with quantum forces.
The group associated with this fix is ignored.
@ -96,8 +96,8 @@ was built with that package. See the "Build
package"_Build_package.html doc page for more info.
A script that uses this command must also use the
"message"_message.html command to setup the messaging protocol with
the other server code.
"message"_message.html command to setup and shut down the messaging
protocol with the server code.
[Related commands:]

View File

@ -12,7 +12,7 @@ message command :h3
message which protocol mode arg :pre
which = {client} or {server} :ulb,l
which = {client} or {server} or {quit} :ulb,l
protocol = {md} or {mc} :l
mode = {file} or {zmq} or {mpi/one} or {mpi/two} :l
{file} arg = filename
@ -39,6 +39,8 @@ message server md mpi/one :pre
message client md mpi/two tmp.couple
message server md mpi/two tmp.couple :pre
message quit :pre
[Description:]
Establish a messaging protocol between LAMMPS and another code for the
@ -54,6 +56,10 @@ enables the two codes to work in tandem to perform a simulation.
The {which} argument defines LAMMPS to be the client or the server.
As explained below the {quit} option should be used when LAMMPS is
finished as a client. It sends a message to the server to tell it to
shut down.
:line
The {protocol} argument defines the format and content of messages
@ -121,12 +127,12 @@ path/file in a common filesystem.
:line
Normally, the message command should be used at the top of a LAMMPS
input script. It performs an initial handshake with the other code to
setup messaging and to verify that both codes are using the same
message protocol and mode. Assuming both codes are launched at
(nearly) the same time, the other code should perform the same kind of
initialization.
Normally, the message client or message server command should be used
at the top of a LAMMPS input script. It performs an initial handshake
with the other code to setup messaging and to verify that both codes
are using the same message protocol and mode. Assuming both codes are
launched at (nearly) the same time, the other code should perform the
same kind of initialization.
If LAMMPS is the client code, it will begin sending messages when a
LAMMPS client command begins its operation. E.g. for the "fix
@ -136,16 +142,25 @@ command is executed.
If LAMMPS is the server code, it will begin receiving messages when
the "server"_server.html command is invoked.
A fix client command will terminate its messaging with the server when
LAMMPS ends, or the fix is deleted via the "unfix"_unfix.html command.
The server command will terminate its messaging with the client when the
client signals it. Then the remainder of the LAMMPS input script will
be processed.
If LAMMPS is being used as a client, the message quit command will
terminate its messaging with the server. If you do not use this
command and just allow LAMMPS to exit, then the server will continue
to wait for further messages. This may not be a problem, but if both
the client and server programs were launched in the same batch script,
then if the server runs indefinitely, it may consume the full allocation
of computer time, even if the calculation finishes sooner.
If both codes do something similar, this means a new round of
client/server messaging can be initiated after termination by re-using
a 2nd message command in your LAMMPS input script, followed by a new
fix client or server command.
Note that if LAMMPS is the client or server, it will continue
processing the rest of its input script after client/server
communication terminates.
If both codes cooperate in this manner, a new round of client/server
messaging can be initiated after termination by re-using a 2nd message
command in your LAMMPS input script, followed by a new fix client or
server command, followed by another message quit command (if LAMMPS is
the client). As an example, this can be performed in a loop to use a
quantum code as a server to compute quantum forces for multiple LAMMPS
data files or periodic snapshots while running dynamics.
:line

View File

@ -35,7 +35,7 @@ enables the two codes to work in tandem to perform a simulation.
When this command is invoked, LAMMPS will run in server mode in an
endless loop, waiting for messages from the client code. The client
signals when it is done sending messages to LAMMPS, at which point the
loop will exit, and the remainder of the LAMMPS script will be
loop will exit, and the remainder of the LAMMPS input script will be
processed.
The {protocol} argument defines the format and content of messages

View File

@ -32,3 +32,4 @@ fix_modify 2 energy yes
thermo 1
run 3
message quit

View File

@ -39,3 +39,5 @@ fix_modify 2 energy yes
thermo 10
run 50
message quit

View File

@ -40,3 +40,5 @@ thermo_style custom step temp epair etotal press xy
thermo 1000
run 50000
message quit

View File

@ -80,21 +80,6 @@ FixClientMD::FixClientMD(LAMMPS *lmp, int narg, char **arg) :
FixClientMD::~FixClientMD()
{
memory->destroy(xpbc);
CSlib *cs = (CSlib *) lmp->cslib;
// all-done message to server
cs->send(-1,0);
int nfield;
int *fieldID,*fieldtype,*fieldlen;
cs->recv(nfield,fieldID,fieldtype,fieldlen);
// clean-up
delete cs;
lmp->cslib = NULL;
}
/* ---------------------------------------------------------------------- */

View File

@ -26,16 +26,31 @@ using namespace CSLIB_NS;
void Message::command(int narg, char **arg)
{
if (narg < 3) error->all(FLERR,"Illegal message command");
if (narg < 1) error->all(FLERR,"Illegal message command");
int clientserver;
if (strcmp(arg[0],"client") == 0) clientserver = 1;
else if (strcmp(arg[0],"server") == 0) clientserver = 2;
else if (strcmp(arg[0],"quit") == 0) clientserver = 0;
else error->all(FLERR,"Illegal message command");
// shutdown current client mode
if (clientserver == 0) {
if (lmp->clientserver != 1)
error->all(FLERR,"Cannot message quit if not in client mode");
quit();
return;
}
// setup client or server mode
lmp->clientserver = clientserver;
// validate supported protocols
if (narg < 3) error->all(FLERR,"Illegal message command");
if ((strcmp(arg[1],"md") != 0) && (strcmp(arg[1],"mc") != 0))
error->all(FLERR,"Unknown message protocol");
@ -82,3 +97,25 @@ void Message::command(int narg, char **arg)
cs->send(0,0);
}
}
/* ---------------------------------------------------------------------- */
void Message::quit()
{
CSlib *cs = (CSlib *) lmp->cslib;
// send all-done message to server
// receive acknowledgement back
cs->send(-1,0);
int nfield;
int *fieldID,*fieldtype,*fieldlen;
cs->recv(nfield,fieldID,fieldtype,fieldlen);
// clean-up
delete cs;
lmp->cslib = NULL;
lmp->clientserver = 0;
}

View File

@ -28,6 +28,9 @@ class Message : protected Pointers {
public:
Message(class LAMMPS *lmp) : Pointers(lmp) {};
void command(int, char **);
private:
void quit();
};
}