Unverified Commit e87b3a21 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

complete documentation for LAMMPS plugin coupling example

parent 4180b4a7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ examples/COUPLE/README for more details:

* simple: simple driver programs in C++ and C which invoke LAMMPS as a
  library
* plugin: simple driver program in C which invokes LAMMPS as a plugin
  from a shared library.
* lammps\_quest: coupling of LAMMPS and `Quest <quest_>`_, to run classical
  MD with quantum forces calculated by a density functional code
* lammps\_spparks: coupling of LAMMPS and `SPPARKS <spparks_>`_, to couple
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ These are the sub-directories included in this directory:

simple		    simple example of driver code calling LAMMPS as a lib
multiple	    example of driver code calling multiple instances of LAMMPS
plugin              example for loading LAMMPS at runtime from a shared library
lammps_mc           client/server coupling of Monte Carlo client 
                      with LAMMPS server for energy evaluation
lammps_nwchem       client/server coupling of LAMMPS client with 
+16 −23
Original line number Diff line number Diff line
This directory has a simple C code that shows how
LAMMPS can be linked to a driver application as a library. The purpose
is to illustrate how another code could perform computations while
using LAMMPS to perform MD on all or a subset of the processors, or
how an umbrella code or script could call both LAMMPS and some other
code to perform a coupled calculation.
This directory has a simple C code that shows how LAMMPS can be included
in an application as a shared library loaded at runtime. The code is
essentially the same as in the "simple" example that links to LAMMPS
either with a static or shared library. The purpose is to illustrate
how another code could be built without having a LAMMPS library present
and then load the (separately compiled) shared library.

simple.c           is the C driver
liblammpsplugin.c  is the LAMMPS library plugin loader

The 3 codes do the same thing, so you can compare them to see how to
drive LAMMPS from each language.  See lammps/python/example/simple.py
to do something similar from Python.  The Fortran driver requires an
additional wrapper library that interfaces the C interface of the
LAMMPS library to Fortran and also translates the MPI communicator
from Fortran to C.
You can then build the driver executable codes with a compile line
like below.

First build LAMMPS as a library (see examples/COUPLE/README), e.g. 
mpicc -c -O -Wall -g -I$HOME/lammps/src liblammpsplugin.c
mpicc -c -O -Wall -g simple.c
mpicc simple.o liblammsplugin.o -ldl -o simpleC

You also need to build LAMMPS as a shared library
(see examples/COUPLE/README), e.g. 

cd $HOME/lammps/src
make mode=shlib mpi
@@ -28,15 +29,6 @@ cd build-shared
cmake -D BUILD_LIB=on -D BUILD_SHARED_LIBS=on ../cmake
make

You can then build any of the driver codes with compile lines like
these, which include paths to the LAMMPS library interface, and
linking with FFTW (only needed if you built LAMMPS as a library with
its PPPM solver).

mpicc -c simple.c
mpicc simple.o -llammps -lfftw -o simpleC


You then run simpleC on a parallel machine
on some number of processors Q with 3 arguments:

@@ -66,5 +58,6 @@ of LAMMPS through the function pointers in the liblammpsplugin_t struct.
This has the benefit that your binary is not linked to liblammps.so directly
and thus you can change the name of the shared library (e.g. to have 
different variants compiled, or to load a different LAMMPS versions without
having to update your executable).
having to update your executable). The shared library still has to be
compatible with the compilation settings the plugin code.