Files
lammps/examples/mdi
2022-06-14 10:45:05 -04:00
..
2022-06-14 10:45:05 -04:00
2022-03-23 13:45:20 -06:00
2022-04-07 15:13:29 -06:00

These are examples that work the MDI package in LAMMPS which uses the
MolSSI MDI library for coupling codes together and communicating
between them with MDI messages.

In MDI lingo, one code is the driver and another code is the engine.
The 2 codes can be written in any language; C++ (LAMMPS) and Python
are illustrated here.  The 2 codes can each be stand-alone codes, in
which case they can be run on different numbers of processors.  The 2
codes can communicate either via TCP (sockets) or via MPI.  For the
TCP case, the driver and engine need to be launched separately,
e.g. in 2 windows on your desktop machine.  For the MPI case, a single
mpirun command launches both codes.

Alternatively the engine code can be a plugin library which the driver
code loads, in which case the driver and engine run on the same
processors.

LAMMPS supports operating in all these MDI modes.  It can be an engine
operating either as a stand-alone code or as a plugin.  It can also be
a driver and couple to an engine that is either a stand-alone code or
a plugin.  Examples for all these use cases are in this directory.
The example commands below illustrate how to run all the variants.

To use LAMMPS as a plugin engine, you must build it as a shared library.
Something like this, which also builds the normal LAMMPS executable
lmp_mpi:

cd src
make yes-mdi
make mode=shlib mpi

To use the serial_driver.py example you will need Python 3 with Numpy
and mpi4py available in your Python.  Make sure LAMMPS and Python are
using same the same version of MPI.

-------------------------------------------------
-------------------------------------------------

* Example #1 = run ab inito MD (AIMD)
  Two instances of LAMMPS operate as a driver and engine
  As an engine, LAMMPS is a surrogate for a quantum code

Note that the 2 input scripts in.aimd.alone and in.aimd.driver
have an option for running in NVE vs NPT mode.  Comment in/out
the appropriate line to change modes.  Nothing needs to be
changed in the in.aimd.engine or in.aimd.engine.plugin scripts.

---

Run the entire calculation with a single instance of LAMMPS by itself
  results should be identical to running this example with MDI

% lmp_mpi < in.aimd.alone

With MDI, the thermo output of the driver should match the thermo
output of the in.aimd.alone script.

---

Run with TCP: 1 proc each

% lmp_mpi -mdi "-name aimd -role DRIVER -method TCP -port 8021" -log log.aimd.driver -in in.aimd.driver

% lmp_mpi -mdi "-name LAMMPS -role ENGINE -method TCP -port 8021 -hostname localhost" -log log.aimd.engine -in in.aimd.engine

---

Run with TCP: 3 procs + 4 procs

% mpirun -np 3 lmp_mpi -mdi "-name aimd -role DRIVER -method TCP -port 8021" -log log.aimd.driver -in in.aimd.driver

% mpirun -np 4 lmp_mpi -mdi "-name LAMMPS -role ENGINE -method TCP -port 8021 -hostname localhost" -log log.aimd.engine -in in.aimd.engine

---

Run with MPI: 1 proc each

% mpirun -np 1 lmp_mpi -mdi "-name aimd -role DRIVER -method MPI" -log log.aimd.driver -in in.aimd.driver : -np 1 lmp_mpi -mdi "-name LAMMPS -role ENGINE -method MPI" -log log.aimd.engine -in in.aimd.engine

---

Run with MPI: 3 procs + 4 procs

% mpirun -np 3 lmp_mpi -mdi "-name aimd -role DRIVER -method MPI" -log log.aimd.driver -in in.aimd.driver : -np 4 lmp_mpi -mdi "-name LAMMPS -role ENGINE -method MPI" -log log.aimd.engine -in in.aimd.engine

---

Run in plugin mode: 1 proc

% lmp_mpi -mdi "-name aimd -role DRIVER -method LINK -plugin_path /home/sjplimp/lammps/git/src" -log log.aimd.driver.plugin -in in.aimd.driver.plugin

---

Run in plugin mode: 3 procs

% mpirun -np 3 lmp_mpi -mdi "-name aimd -role DRIVER -method LINK -plugin_path /home/sjplimp/lammps/git/src" -log log.aimd.driver.plugin -in in.aimd.driver.plugin

-------------------------------------------------
-------------------------------------------------

* Example #2 = Python driver runs a sequence of unrelated LAMMPS calculations
  Each calculation can be a single-point evaluation, MD run, or minimization

The sequence_driver.py code allows for optional switches in addition
to -mdi (required) and the -plugin and -plugin_args switches which are
used to link to an engine as a plugin library.  The example run
commands below just use the default values of the optional switches.
The switches are also explained at the top of the file; the info is
copied here:

#   -n 3
#     number of calculations to perform, default = 3
#   -mode eval/run/min
#     style of calculations: single snapshot evals, dynamics, minimization
#     default = run
#   -size Nx Ny Nz
#     cubic lattice, default = 2 2 2
#   -rho 0.75 0.1
#     reduced density and random variation thereof, default = 0.75 0.1
#   -delta 0.1
#     randomly perturb atoms initially by this distance, default 0.1
#   -nsteps 100
#     number of timesteps in dynamics runs, default = 100
#   -temp 1.0
#     initial temperature in dynamics runs, default = 1.0
#   -tol 0.001
#     tolerance for minimizations, default = 0.001
#   -seed 12345
#     random number seed > 0, default = 12345

---

Run with TCP: 1 proc each

% python3 sequence_driver.py -mdi "-role DRIVER -name sequence -method TCP -port 8021"

% lmp_mpi -mdi "-role ENGINE -name LAMMPS -method TCP -port 8021 -hostname localhost" -log log.sequence -in in.sequence

---

Run with TCP: 2 proc + 4 procs

% mpirun -np 2 python3 sequence_driver.py -mdi "-role DRIVER -name sequence -method TCP -port 8021"

% mpirun -np 4 lmp_mpi -mdi "-role ENGINE -name LAMMPS -method TCP -port 8021 -hostname localhost" -log log.sequence -in in.sequence

---

Run with MPI: 1 proc each

% mpirun -np 1 python3 sequence_driver.py -mdi "-role DRIVER -name sequence -method MPI" : -np 1 lmp_mpi -mdi "-role ENGINE -name LAMMPS -method MPI" -log log.sequence -in in.sequence

---

Run with MPI: 2 procs + 4 procs

% mpirun -np 2 python3 sequence_driver.py -mdi "-role DRIVER -name sequence -method MPI" : -np 4 lmp_mpi -mdi "-role ENGINE -name LAMMPS -method MPI" -log log.sequence -in in.sequence

---

Run in plugin mode: 1 proc

% python3 sequence_driver.py -plugin lammps -mdi "-role DRIVER -name sequence -method LINK -plugin_path /home/sjplimp/lammps/git/src" -plugin_args "-log log.sequence -in in.sequence"

---

Run in plugin mode: 3 procs

% mpirun -np 3 python3 sequence_driver.py -plugin lammps -mdi "-role DRIVER -name sequence -method LINK -plugin_path /home/sjplimp/lammps/git/src" -plugin_args "-log log.sequence -in in.sequence"

-------------------------------------------------
-------------------------------------------------

* Example #3 = run AIMD with Python driver code and 2 LAMMPS instances as engines
  First LAMMPS instance performs the MD timestepping
  Second LAMMPS instance is surrogate QM = computes forces

The aimd_driver.py code allows for an optional switch in addition to
-mdi (required) and the -plugin and -plugin_args swiches which are
used to link to the 2 engines as a plugin libraries.  The example run
commands below use the default values of the optional switch.  The
switch is also explained the top of the file; the info is copied
here:

#   -nsteps 5
#     number of timesteps in dynamics runs, default = 5

---

Run the entire calculation with a single instance of LAMMPS by itself
  results should be identical to running this example with MDI

% lmp_mpi < in.aimd.alone

With MDI, the driver prints the QM and Total energies.  These should
match the PotEng and TotEng output of the in.aimd.alone script.

---

Run with TCP: 1 proc each

% python3 aimd_driver.py -mdi "-role DRIVER -name aimd -method TCP -port 8021"

% lmp_mpi -mdi "-role ENGINE -name MM -method TCP -port 8021 -hostname localhost" -log log.aimd.mm -in in.aimd.mm

% lmp_mpi -mdi "-role ENGINE -name QM -method TCP -port 8021 -hostname localhost" -log log.aimd.qm -in in.aimd.qm

---

Run with TCP: 2 procs + 2 procs + 3 procs

% mpirun -np 2 python3 aimd_driver.py -mdi "-role DRIVER -name aimd -method TCP -port 8021"

% mpirun -np 2 lmp_mpi -mdi "-role ENGINE -name MM -method TCP -port 8021 -hostname localhost" -log log.aimd.mm -in in.aimd.mm

% mpirun -np 3 lmp_mpi -mdi "-role ENGINE -name QM -method TCP -port 8021 -hostname localhost" -log log.aimd.qm -in in.aimd.qm

---

Run with MPI: 1 proc each

% mpirun -np 1 python3 aimd_driver.py -mdi "-role DRIVER -name aimd -method MPI" : -np 1 lmp_mpi -mdi "-role ENGINE -name MM -method MPI" -log log.aimd.mm -in in.aimd.mm : -np 1 lmp_mpi -mdi "-role ENGINE -name QM -method MPI" -log log.aimd.qm -in in.aimd.qm

---

Run with MPI: 2 procs + 2 procs + 3 procs

% mpirun -np 2 python3 aimd_driver.py -mdi "-role DRIVER -name aimd -method MPI" : -np 2 lmp_mpi -mdi "-role ENGINE -name MM -method MPI" -log log.aimd.mm -in in.aimd.mm : -np 3 lmp_mpi -mdi "-role ENGINE -name QM -method MPI" -log log.aimd.qm -in in.aimd.qm