Files
lammps/examples/QUANTUM/PySCF

# Test runs with copuling of LAMMPS and PySCF

Step 0: What PySCF currently supports
Step 1: Build LAMMPS
Step 2: Install or download/build MDI code coupling package
Step 3: Download/build PySCF
Step 4: Perform test runs in any of 3 modes

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

Step 0: What PySCF currently supports

PySCF can be used with fix mdi/qmmm for QM/MM simulations, but not
with fix mdi/qm to perform QM calculations of an entire system.  For
QM/MM it can use the direct mode of fix mdi/qmmm, but not the
potential mode.  PySCF can calculate a QM energy and QM forces on each
atom, but it cannot compute a QM stress tensor.

PySCF does not support MPI parallelism, so run it on a single MPI task.
But it does support multi-threading via OpenMP.  By default it will use
all the threads available on your compute node.  Depending on the size
of the problem and your hardware, it may be faster to run on fewer threads.
Thus for a production run it is a good idea to do some short runs first
with different thread counts to test performance.

For example, these commands will set the OpenMP thread count (to 4)
before performing a run.  Unsetting the environment variable will
revert to the default (use all available threads).

bash:
% export OMP_NUM_THREADS=4
% unset OMP_NUM_THREADS

(t)csh:
% setenv OMP_NUM_THREADS 4
% unsetenv OMP_NUM_THREADS

All the example log files in this directory were run with OMP_NUM_THREADS = 1

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

Step 1: Build LAMMPS

The MDI, molecule, and kspace packages are needed.  Copy the final
LAMMPS executable into the examples/QUANTUM/PySCF directory.

Traditional make:

% cd ~/lammps/lib/mdi
% python Install.py -m mpi
% cd ~/lammps/src
% make yes-mdi yes-molecule yes-kspace
% make -j mpi
% cp lmp_mpi ~/lammps/examples/QUANTUM/PySCF

CMake:

% cd ~/lammps
% mkdir build; cd build
% cmake -DPKG_MDI=yes -DPKG_MOLECULE=yes -DPKG_KSPACE=yes ../cmake
% make -j
% cp lmp ~/lammps/examples/QUANTUM/PySCF/lmp_mpi

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

Step 2: Install or download/build MDI code coupling package

To simply use the MDI python module for the example scripts in this
dir, you only need to install the MDI python module in your
environment.  Alternatively, you can download/build MDI itself, which
will include its documentation and examples (as well as libraries and
Python interface).

NOTE: It should be fine to leave off the version number for the python
module installs, to just grab the latest MDI version.  1.4.16 is the
version of MDI LAMMPS is currently using.

(option 1) Install MDI python module via pip:

% pip install 'pymdi>=1.4.14'

(option 2) Install MDI python module via conda:

% conda install -c conda-forge pymdi=1.4.16

(option 3) Download/build MDI code coupling package

(a) clone the MDI Git repo

% git clone https://github.com/MolSSI-MDI/MDI_Library.git mdi

(b) build MDI

% cd mdi
% mkdir build; cd build
% cmake ..
% make -j

(c) Add a line like this to your ~/.bashrc or ~/.cshrc file so that
Python can find MDI:

For bash:

% export PYTHONPATH="${HOME}/mdi/build/MDI_Library:${PYTHONPATH}"
% hash -r

For (t)csh:

% setenv PYTHONPATH "${HOME}/mdi/build/MDI_Library:${PYTHONPATH}"
% rehash

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

Step 3: Download/build PySCF

NOTE: As of March 2023, this PySCF repo is a fork of the main PySCF
repo.  This fork has some additional features.  It will be merged into
the main PySCF repo at some point in the future.  This doc page will
be updated when that happens.

This section describes building PySCF from source code.
See https://pyscf.org/install.html for other options.

(a) clone the PySCF Git repo

% git clone https://github.com/MoleOrbitalHybridAnalyst/pyscf.git pyscf

(option 1) build using Python

(b) create and install a wheel file

% cd pyscf
% python -m pip install --user --upgrade pip
% python -m pip install --user build wheel
% python -m build -n --wheel -o .
% python -m pip install --user pyscf-2.*.whl

(c) no setting of envionment variables needed

(d) Check import of 4 Python modules which the script that wraps PySCF
will need:

% python -i
>>> import numpy as np
>>> from mpi4py import MPI
>>> import mdi
>>> import pyscf

(option 2) build using CMake and use in place

(b) build PySCF

NOTE: you will also need numpy, scipy, h5py in your python

% cd pyscf/pyscf/lib
% mkdir build; cd build
% cmake ..
% make -j

(c) Add a line like this to your ~/.bashrc or ~/.cshrc file so that
Python can find PySCF where you compiled it:

For bash:

% export PYTHONPATH="${HOME}/pyscf:${PYTHONPATH}"
% hash -r

For (t)csh:

% setenv PYTHONPATH "${HOME}/pyscf:${PYTHONPATH}"
% rehash

(d) Check import of 4 Python modules which the script that wraps PySCF
will need:

% python -i
>>> import numpy as np
>>> from mpi4py import MPI
>>> import mdi
>>> import pyscf

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

Step 4: Perform test runs in any of 3 modes

These tests are in lammps/examples/QUANTUM/PySCF

in.water = QMMM of two-water system, 1 QM + 1 MM
in.mixture = QMMM of mixture, QM small molecule in MM water

** run LAMMPS-only versions of mixture problem

lmp_mpi -log log.mixture.mm.1 -in in.mixture.mm

** run LAMMPS and PySCF with TCP/IP, 1 proc each

lmp_mpi -mdi "-name LMP -role DRIVER -method TCP -port 8021" -log log.water.qmmm.tcp.1 -in in.water.qmmm &
python pyscf_mdi.py -mdi "-name PYSCF -role ENGINE -method TCP -port 8021 -hostname localhost"

lmp_mpi -mdi "-name LMP -role DRIVER -method TCP -port 8021" -log log.mixture.qmmm.tcp.1 -in in.mixture.qmmm &
python pyscf_mdi.py -mdi "-name PYSCF -role ENGINE -method TCP -port 8021 -hostname localhost"

** run LAMMPS and PySCF with MPI, 1 proc each

mpirun -np 1 lmp_mpi -mdi "-name LMP -role DRIVER -method MPI" -log log.water.qmmm.mpi.1 -in in.water.qmmm : -np 1 python pyscf_mdi.py -mdi "-name PYSCF -role ENGINE -method MPI" -pbc no

mpirun -np 1 lmp_mpi -mdi "-name LMP -role DRIVER -method MPI" -log log.mixture.qmmm.mpi.1 -in in.mixture.qmmm : -np 1 python pyscf_mdi.py -mdi "-name PYSCF -role ENGINE -method MPI" -pbc no

** run PySCF as plugin MDI engine, 1 proc

lmp_mpi -mdi "-name LMP -role DRIVER -method LINK -plugin_path ${HOME}/lammps/examples/QUANTUM/PySCF" -log log.water.qmmm.plugin.1 -in in.water.qmmm.plugin

lmp_mpi -mdi "-name LMP -role DRIVER -method LINK -plugin_path ${HOME}/lammps/examples/QUANTUM/PySCF" -log log.mixture.qmmm.plugin.1 -in in.mixture.qmmm.plugin