add NWChem wrapper to client/server mode for AIMD
This commit is contained in:
@ -72,6 +72,7 @@ client or server code:
|
||||
examples/message
|
||||
examples/COUPLE/README
|
||||
examples/COUPLE/lammps_mc
|
||||
examples/COUPLE/lammps_nwchem
|
||||
examples/COUPLE/lammps_vasp :ul
|
||||
|
||||
The examples/message dir couples a client instance of LAMMPS to a
|
||||
@ -80,6 +81,10 @@ server instance of LAMMPS.
|
||||
The lammps_mc dir shows how to couple LAMMPS as a server to a simple
|
||||
Monte Carlo client code as the driver.
|
||||
|
||||
The lammps_nwchem dir shows how to couple LAMMPS as a client code
|
||||
running MD timestepping to NWChem acting as a server providing quantum
|
||||
DFT forces, through a Python wrapper script on NWChem.
|
||||
|
||||
The lammps_vasp dir shows how to couple LAMMPS as a client code
|
||||
running MD timestepping to VASP acting as a server providing quantum
|
||||
DFT forces, through a Python wrapper script on VASP.
|
||||
|
||||
@ -64,8 +64,9 @@ in this pseudo code is a pointer to an instance of the CSlib.
|
||||
|
||||
See the src/MESSAGE/server_md.cpp and src/MESSAGE/fix_client_md.cpp
|
||||
files for details on how LAMMPS uses these messages. See the
|
||||
examples/COUPLE/lammps_vasp/vasp_wrapper.py file for an example of how
|
||||
a quantum code (VASP) can use these messages.
|
||||
examples/COUPLE/lammps_vasp/vasp_wrap.py or
|
||||
examples/COUPLE/lammps_nwchem/nwchem_wrap.py files for examples of how
|
||||
a quantum code (VASP or NWChem) can use these messages.
|
||||
|
||||
The following pseudo-code uses these values, defined as enums.
|
||||
|
||||
|
||||
@ -6,23 +6,16 @@ codes or calling LAMMPS as a library. The examples are provided for
|
||||
demonstration purposes. The physics they calculate is too simple to
|
||||
model a realistic problem.
|
||||
|
||||
In many of the examples included here, LAMMPS must first be built as a
|
||||
library.
|
||||
|
||||
See these sections of the LAMMPS manaul for details:
|
||||
|
||||
2.5 Building LAMMPS as a library (doc/Section_start.html#start_5)
|
||||
6.10 Coupling LAMMPS to other codes (doc/Section_howto.html#howto_10)
|
||||
6.29 Using LAMMPS in client/server mode (doc/Section_howto.html#howto_29)
|
||||
|
||||
In all of the examples included here, LAMMPS must first be built as a
|
||||
library. Basically, in the src dir you type one of
|
||||
|
||||
make mode=lib machine
|
||||
make mode=shlib machine
|
||||
|
||||
to create the static library liblammps_machine.a or the shared library
|
||||
liblammps_machine.so for your code to link against. A soft link
|
||||
(liblammps.a or liblammps.so) is also created that points to the most
|
||||
recently built static or shared library. Your code build can simply
|
||||
use the soft link if you prefer.
|
||||
Build LAMMPS as a library (doc/Build_basics.html)
|
||||
Link LAMMPS as a library to another code (doc/Build_link.html)
|
||||
Coupling LAMMPS to other codes (doc/Howto_couple.html)
|
||||
Using LAMMPS in client/server mode (doc/Howto_client_server.html)
|
||||
Library interface to LAMMPS (doc/Howto_library.html)
|
||||
|
||||
The library interface to LAMMPS is in src/library.cpp. Routines can
|
||||
be easily added to this file so an external program can perform the
|
||||
@ -36,6 +29,8 @@ simple simple example of driver code calling LAMMPS as a lib
|
||||
multiple example of driver code calling multiple instances of LAMMPS
|
||||
lammps_mc client/server coupling of Monte Carlo client
|
||||
with LAMMPS server for energy evaluation
|
||||
lammps_nwchem client/server coupling of LAMMPS client with
|
||||
NWChem quantum DFT as server for quantum forces
|
||||
lammps_quest MD with quantum forces, coupling to Quest DFT code
|
||||
lammps_spparks grain-growth Monte Carlo with strain via MD,
|
||||
coupling to SPPARKS kinetic MC code
|
||||
|
||||
197
examples/COUPLE/lammps_nwchem/README
Normal file
197
examples/COUPLE/lammps_nwchem/README
Normal file
@ -0,0 +1,197 @@
|
||||
Sample LAMMPS MD wrapper on NWChem via client/server coupling
|
||||
|
||||
See the MESSAGE package (doc/Section_messages.html#MESSAGE) and
|
||||
Section_howto.html#howto10 for more details on how client/server
|
||||
coupling works in LAMMPS.
|
||||
|
||||
In this dir, the nwchem_wrap.py is a wrapper on the NWChem electronic
|
||||
structure code so it can work as a "server" code which LAMMPS drives
|
||||
as a "client" code to perform ab initio MD. LAMMPS performs the MD
|
||||
timestepping, sends NWChem a current set of coordinates each timestep,
|
||||
NWChem computes forces and energy (and virial) and returns that info
|
||||
to LAMMPS.
|
||||
|
||||
Messages are exchanged between NWChem and LAMMPS via a client/server
|
||||
library (CSlib), which is included in the LAMMPS distribution in
|
||||
lib/message. As explained below you can choose to exchange data
|
||||
between the two programs either via files or sockets (ZMQ). If the
|
||||
nwchem_wrap.py program became parallel, or the CSlib library calls were
|
||||
integrated into NWChem directly, then data could also be exchanged via
|
||||
MPI.
|
||||
|
||||
There are 2 examples provided in the planeware and ao_basis
|
||||
sub-directories. See details below.
|
||||
|
||||
----------------
|
||||
|
||||
Build LAMMPS with its MESSAGE package installed:
|
||||
|
||||
See the Build extras doc page and its MESSAGE package
|
||||
section for details.
|
||||
|
||||
CMake:
|
||||
|
||||
-D PKG_MESSAGE=yes # include the MESSAGE package
|
||||
-D MESSAGE_ZMQ=value # build with ZeroMQ support, value = no (default) or yes
|
||||
|
||||
Traditional make:
|
||||
|
||||
cd lammps/lib/message
|
||||
python Install.py -m -z # build CSlib with MPI and ZMQ support
|
||||
cd lammps/src
|
||||
make yes-message
|
||||
make mpi
|
||||
|
||||
You can leave off the -z if you do not have ZMQ on your system.
|
||||
|
||||
----------------
|
||||
|
||||
Build the CSlib in a form usable by the nwchem_wrapper.py script:
|
||||
|
||||
% cd lammps/lib/message/cslib/src
|
||||
% make shlib # build serial and parallel shared lib with ZMQ support
|
||||
% make shlib zmq=no # build serial and parallel shared lib w/out ZMQ support
|
||||
|
||||
This will make a shared library versions of the CSlib, which Python
|
||||
requires. Python must be able to find both the cslib.py script and
|
||||
the libcsnompi.so library in your lammps/lib/message/cslib/src
|
||||
directory. If it is not able to do this, you will get an error when
|
||||
you run nwchem_wrapper.py.
|
||||
|
||||
You can do this by augmenting two environment variables, either from
|
||||
the command line, or in your shell start-up script. Here is the
|
||||
sample syntax for the csh or tcsh shells:
|
||||
|
||||
setenv PYTHONPATH ${PYTHONPATH}:/home/sjplimp/lammps/lib/message/cslib/src
|
||||
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/home/sjplimp/lammps/lib/message/cslib/src
|
||||
|
||||
----------------
|
||||
|
||||
Prepare to use NWChem and the nwchem_wrap.py script
|
||||
|
||||
You can run the nwchem_wrap.py script as-is to test that the coupling
|
||||
between it and LAMMPS is functional. This will use the included
|
||||
nwchem_lammps.out files output by a previous NWChem run.
|
||||
|
||||
But note that the as-is version of nwchem_wrap.py will not attempt to
|
||||
run NWChem.
|
||||
|
||||
To do this, you must edit the 1st nwchemcmd line at the top of
|
||||
nwchem_wrapper.py to be the launch command needed to run NWChem on
|
||||
your system. It can be a command to run NWChem in serial or in
|
||||
parallel, e.g. an mpirun command. Then comment out the 2nd nwchemcmd
|
||||
line immediately following it.
|
||||
|
||||
Ensure you have the necessary NWChem input file in this directory,
|
||||
suitable for the NWChem calculation you want to perform.
|
||||
|
||||
Example input files are provided for both atom-centered AO basis sets
|
||||
and plane-wave basis sets. Note that the NWChem template file should
|
||||
be matched to the LAMMPS input script (# of atoms and atom types, box
|
||||
size, etc).
|
||||
|
||||
Once you run NWChem yourself, the nwchem_lammps.out file will be
|
||||
overwritten.
|
||||
|
||||
The syntax of the wrapper is:
|
||||
nwchem_wrap.py file/zmq ao/pw input_template
|
||||
* file/zmg = messaging mode, must match LAMMPS messaging mode
|
||||
* ao/pw = basis set mode, selects between atom-centered and plane-wave
|
||||
the input_template file must correspond to the appropriate basis set mode:
|
||||
the "ao" mode supports the scf and dft modules in NWChem,
|
||||
the "pw" mode supports the nwpw module.
|
||||
* input_template = NWChem input file used as template, must include a
|
||||
"geometry" block with the atoms in the simulation, dummy
|
||||
xyz coordinates should be included (but are not used).
|
||||
Atom ordering must match LAMMPS input.
|
||||
|
||||
During a simulation, the molecular orbitals from the previous timestep
|
||||
will be used as the initial guess for the next NWChem calculation. If
|
||||
a file named "nwchem_lammps.movecs" is in the directory the wrapper is
|
||||
called from, these orbitals will be used as the initial guess orbitals
|
||||
in the first step of the simulation.
|
||||
|
||||
----------------
|
||||
|
||||
Example directories
|
||||
|
||||
(1) planewave
|
||||
|
||||
Demonstrates coupling of the nwpw module in NWChem with LAMMPS. Only fully
|
||||
periodic boundary conditions and orthogonal simulation boxes are currently
|
||||
supported by the wrapper. The included files provide an example run using a
|
||||
2 atom unit cell of tungsten.
|
||||
|
||||
Files:
|
||||
* data.W LAMMPS input with geometry information
|
||||
* in.client.W LAMMPS simulation input
|
||||
* log.client.output LAMMPS simulation output
|
||||
* w.nw NWChem template input file
|
||||
* nwchem_lammps.out NWChem output
|
||||
|
||||
(2) ao_basis
|
||||
|
||||
Demonstrates coupling of the scf (or dft) modules in NWChem with
|
||||
LAMMPS. Only fully aperiodic boundary conditions are currently
|
||||
supported by the wrapper. The included files provide an example run
|
||||
using a single water molecule.
|
||||
|
||||
Files:
|
||||
* data.h2o LAMMPS input with geometry information
|
||||
* in.client.h2o LAMMPS simulation input
|
||||
* log.client.output LAMMPS simulation output
|
||||
* h2o.nw NWChem template input file
|
||||
* nwchem_lammps.out NWChem output
|
||||
|
||||
As noted above, you can run the nwchem_wrap.py script as-is to test that
|
||||
the coupling between it and LAMMPS is functional. This will use the included
|
||||
nwchem_lammps.out files.
|
||||
|
||||
----------------
|
||||
|
||||
To run in client/server mode:
|
||||
|
||||
NOTE: The nwchem_wrap.py script must be run with Python version 2, not
|
||||
3. This is because it used the CSlib python wrapper, which only
|
||||
supports version 2. We plan to upgrade CSlib to support Python 3.
|
||||
|
||||
Both the client (LAMMPS) and server (nwchem_wrap.py) must use the same
|
||||
messaging mode, namely file or zmq. This is an argument to the
|
||||
nwchem_wrap.py code; it can be selected by setting the "mode" variable
|
||||
when you run LAMMPS. The default mode = file.
|
||||
|
||||
Here we assume LAMMPS was built to run in parallel, and the MESSAGE
|
||||
package was installed with socket (ZMQ) support. This means either of
|
||||
the messaging modes can be used and LAMMPS can be run in serial or
|
||||
parallel. The nwchem_wrap.py code is always run in serial, but it
|
||||
launches NWChem from Python via an mpirun command which can run NWChem
|
||||
itself in parallel.
|
||||
|
||||
When you run, the server should print out thermodynamic info every
|
||||
timestep which corresponds to the forces and virial computed by NWChem.
|
||||
NWChem will also generate output files each timestep. Output files from
|
||||
previous timesteps are archived in a "nwchem_logs" directory.
|
||||
|
||||
The examples below are commands you should use in two different
|
||||
terminal windows. The order of the two commands (client or server
|
||||
launch) does not matter. You can run them both in the same window if
|
||||
you append a "&" character to the first one to run it in the
|
||||
background.
|
||||
|
||||
--------------
|
||||
|
||||
File mode of messaging:
|
||||
|
||||
% mpirun -np 1 lmp_mpi -v mode file < in.client.W
|
||||
% python nwchem_wrap.py file pw w.nw
|
||||
|
||||
% mpirun -np 2 lmp_mpi -v mode file < in.client.h2o
|
||||
% python nwchem_wrap.py file ao h2o_dft.nw
|
||||
|
||||
ZMQ mode of messaging:
|
||||
|
||||
% mpirun -np 1 lmp_mpi -v mode zmq < in.client.W
|
||||
% python nwchem_wrap.py zmq pw w.nw
|
||||
|
||||
% mpirun -np 2 lmp_mpi -v mode zmq < in.client.h2o
|
||||
% python nwchem_wrap.py zmq ao h2o_dft.nw
|
||||
20
examples/COUPLE/lammps_nwchem/ao_basis/data.h2o
Normal file
20
examples/COUPLE/lammps_nwchem/ao_basis/data.h2o
Normal file
@ -0,0 +1,20 @@
|
||||
LAMMPS H2O data file
|
||||
|
||||
3 atoms
|
||||
|
||||
2 atom types
|
||||
|
||||
-10.0 10.0 xlo xhi
|
||||
-10.0 10.0 ylo yhi
|
||||
-10.0 10.0 zlo zhi
|
||||
|
||||
Masses
|
||||
|
||||
1 15.994915008544922
|
||||
2 1.0078250169754028
|
||||
|
||||
Atoms
|
||||
|
||||
1 1 0.0 0.0 0.0
|
||||
2 2 0.0 0.756723 -0.585799
|
||||
3 2 0.0 -0.756723 -0.585799
|
||||
25
examples/COUPLE/lammps_nwchem/ao_basis/h2o.nw
Normal file
25
examples/COUPLE/lammps_nwchem/ao_basis/h2o.nw
Normal file
@ -0,0 +1,25 @@
|
||||
echo
|
||||
|
||||
memory global 40 mb stack 23 mb heap 5 mb
|
||||
|
||||
geometry units angstrom noautosym
|
||||
O 0.0 0.0 0.0
|
||||
H 1.0 0.5 0.0
|
||||
H -1.0 0.5 0.0
|
||||
end
|
||||
|
||||
basis
|
||||
O library 6-31g*
|
||||
H library 6-31g*
|
||||
end
|
||||
|
||||
scf
|
||||
maxiter 100
|
||||
end
|
||||
|
||||
#dft
|
||||
# xc b3lyp
|
||||
#end
|
||||
|
||||
task scf gradient
|
||||
#task dft gradient
|
||||
33
examples/COUPLE/lammps_nwchem/ao_basis/in.client.h2o
Normal file
33
examples/COUPLE/lammps_nwchem/ao_basis/in.client.h2o
Normal file
@ -0,0 +1,33 @@
|
||||
# H2O with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then &
|
||||
"message client md file tmp.couple" &
|
||||
elif "${mode} == zmq" &
|
||||
"message client md zmq localhost:5555" &
|
||||
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
boundary m m m
|
||||
read_data data.h2o
|
||||
|
||||
replicate $x $y $z
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
77
examples/COUPLE/lammps_nwchem/ao_basis/log.client.output
Normal file
77
examples/COUPLE/lammps_nwchem/ao_basis/log.client.output
Normal file
@ -0,0 +1,77 @@
|
||||
LAMMPS (18 Sep 2018)
|
||||
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87)
|
||||
using 1 OpenMP thread(s) per MPI task
|
||||
# H2O with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then "message client md file tmp.couple" elif "${mode} == zmq" "message client md zmq localhost:5555"
|
||||
message client md zmq localhost:5555
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
boundary m m m
|
||||
read_data data.h2o
|
||||
orthogonal box = (-10 -10 -10) to (10 10 10)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
reading atoms ...
|
||||
3 atoms
|
||||
|
||||
replicate $x $y $z
|
||||
replicate 1 $y $z
|
||||
replicate 1 1 $z
|
||||
replicate 1 1 1
|
||||
orthogonal box = (-10 -10 -10) to (10 10 10)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
3 atoms
|
||||
Time spent = 5.8016e-05 secs
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
Per MPI rank memory allocation (min/avg/max) = 0.02705 | 0.02705 | 0.02705 Mbytes
|
||||
Step Temp E_pair E_mol TotEng Press Volume
|
||||
0 300 0 0 -2068.2746 10.354878 8000
|
||||
1 368.98118 0 0 -2068.2567 12.735851 8000
|
||||
2 459.96278 0 0 -2068.2332 15.876195 8000
|
||||
3 572.94479 0 0 -2068.204 19.775912 8000
|
||||
Loop time of 0.0174769 on 1 procs for 3 steps with 3 atoms
|
||||
|
||||
Performance: 14.831 ns/day, 1.618 hours/ns, 171.655 timesteps/s
|
||||
8.4% CPU use with 1 MPI tasks x 1 OpenMP threads
|
||||
|
||||
MPI task timing breakdown:
|
||||
Section | min time | avg time | max time |%varavg| %total
|
||||
---------------------------------------------------------------
|
||||
Pair | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Neigh | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Comm | 2.555e-06 | 2.555e-06 | 2.555e-06 | 0.0 | 0.01
|
||||
Output | 8.4169e-05 | 8.4169e-05 | 8.4169e-05 | 0.0 | 0.48
|
||||
Modify | 0.017383 | 0.017383 | 0.017383 | 0.0 | 99.46
|
||||
Other | | 7.694e-06 | | | 0.04
|
||||
|
||||
Nlocal: 3 ave 3 max 3 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Nghost: 0 ave 0 max 0 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Neighs: 0 ave 0 max 0 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
|
||||
Total # of neighbors = 0
|
||||
Ave neighs/atom = 0
|
||||
Neighbor list builds = 0
|
||||
Dangerous builds not checked
|
||||
Total wall time: 0:00:01
|
||||
622
examples/COUPLE/lammps_nwchem/ao_basis/nwchem_lammps.out
Normal file
622
examples/COUPLE/lammps_nwchem/ao_basis/nwchem_lammps.out
Normal file
@ -0,0 +1,622 @@
|
||||
argument 1 = nwchem_lammps.nw
|
||||
|
||||
|
||||
|
||||
============================== echo of input deck ==============================
|
||||
echo
|
||||
|
||||
memory global 40 mb stack 23 mb heap 5 mb
|
||||
|
||||
geometry units angstrom noautosym
|
||||
O 0 0 0
|
||||
H 0 0.756723 -0.585799
|
||||
H 0 -0.756723 -0.585799
|
||||
end
|
||||
|
||||
scf
|
||||
vectors input nwchem_lammps.movecs
|
||||
end
|
||||
|
||||
dft
|
||||
vectors input nwchem_lammps.movecs
|
||||
end
|
||||
|
||||
basis
|
||||
O library 6-31g*
|
||||
H library 6-31g*
|
||||
end
|
||||
|
||||
scf
|
||||
maxiter 100
|
||||
end
|
||||
|
||||
task scf gradient
|
||||
|
||||
================================================================================
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Northwest Computational Chemistry Package (NWChem) 6.8
|
||||
------------------------------------------------------
|
||||
|
||||
|
||||
Environmental Molecular Sciences Laboratory
|
||||
Pacific Northwest National Laboratory
|
||||
Richland, WA 99352
|
||||
|
||||
Copyright (c) 1994-2017
|
||||
Pacific Northwest National Laboratory
|
||||
Battelle Memorial Institute
|
||||
|
||||
NWChem is an open-source computational chemistry package
|
||||
distributed under the terms of the
|
||||
Educational Community License (ECL) 2.0
|
||||
A copy of the license is included with this distribution
|
||||
in the LICENSE.TXT file
|
||||
|
||||
ACKNOWLEDGMENT
|
||||
--------------
|
||||
|
||||
This software and its documentation were developed at the
|
||||
EMSL at Pacific Northwest National Laboratory, a multiprogram
|
||||
national laboratory, operated for the U.S. Department of Energy
|
||||
by Battelle under Contract Number DE-AC05-76RL01830. Support
|
||||
for this work was provided by the Department of Energy Office
|
||||
of Biological and Environmental Research, Office of Basic
|
||||
Energy Sciences, and the Office of Advanced Scientific Computing.
|
||||
|
||||
|
||||
Job information
|
||||
---------------
|
||||
|
||||
hostname = mcq
|
||||
program = /usr/bin/nwchem
|
||||
date = Mon Sep 23 16:28:27 2019
|
||||
|
||||
compiled = Wed_Aug_15_19:14:19_2018
|
||||
source = /home/edo/debichem-team/nwchem/nwchem-6.8.1
|
||||
nwchem branch = 6.8.1
|
||||
nwchem revision = v6.8-133-ge032219
|
||||
ga revision = 5.6.5
|
||||
use scalapack = T
|
||||
input = nwchem_lammps.nw
|
||||
prefix = nwchem_lammps.
|
||||
data base = ./nwchem_lammps.db
|
||||
status = restart
|
||||
nproc = 1
|
||||
time left = -1s
|
||||
|
||||
|
||||
|
||||
Memory information
|
||||
------------------
|
||||
|
||||
heap = 655358 doubles = 5.0 Mbytes
|
||||
stack = 3014651 doubles = 23.0 Mbytes
|
||||
global = 5242880 doubles = 40.0 Mbytes (distinct from heap & stack)
|
||||
total = 8912889 doubles = 68.0 Mbytes
|
||||
verify = yes
|
||||
hardfail = no
|
||||
|
||||
|
||||
Directory information
|
||||
---------------------
|
||||
|
||||
0 permanent = .
|
||||
0 scratch = .
|
||||
|
||||
|
||||
Previous task information
|
||||
-------------------------
|
||||
|
||||
Theory = scf
|
||||
Operation = gradient
|
||||
Status = ok
|
||||
Qmmm = F
|
||||
Ignore = F
|
||||
|
||||
|
||||
Geometries in the database
|
||||
--------------------------
|
||||
|
||||
Name Natoms Last Modified
|
||||
-------------------------------- ------ ------------------------
|
||||
1 geometry 3 Mon Sep 23 16:26:29 2019
|
||||
|
||||
The geometry named "geometry" is the default for restart
|
||||
|
||||
|
||||
|
||||
Basis sets in the database
|
||||
--------------------------
|
||||
|
||||
Name Natoms Last Modified
|
||||
-------------------------------- ------ ------------------------
|
||||
1 ao basis 2 Mon Sep 23 16:26:29 2019
|
||||
|
||||
The basis set named "ao basis" is the default AO basis for restart
|
||||
|
||||
|
||||
|
||||
|
||||
NWChem Input Module
|
||||
-------------------
|
||||
|
||||
|
||||
|
||||
Scaling coordinates for geometry "geometry" by 1.889725989
|
||||
(inverse scale = 0.529177249)
|
||||
|
||||
|
||||
------
|
||||
auto-z
|
||||
------
|
||||
|
||||
|
||||
Geometry "geometry" -> ""
|
||||
-------------------------
|
||||
|
||||
Output coordinates in angstroms (scale by 1.889725989 to convert to a.u.)
|
||||
|
||||
No. Tag Charge X Y Z
|
||||
---- ---------------- ---------- -------------- -------------- --------------
|
||||
1 O 8.0000 0.00000000 0.00000000 0.11715980
|
||||
2 H 1.0000 0.00000000 0.75672300 -0.46863920
|
||||
3 H 1.0000 0.00000000 -0.75672300 -0.46863920
|
||||
|
||||
Atomic Mass
|
||||
-----------
|
||||
|
||||
O 15.994910
|
||||
H 1.007825
|
||||
|
||||
|
||||
Effective nuclear repulsion energy (a.u.) 9.1972032776
|
||||
|
||||
Nuclear Dipole moment (a.u.)
|
||||
----------------------------
|
||||
X Y Z
|
||||
---------------- ---------------- ----------------
|
||||
0.0000000000 0.0000000000 0.0000000000
|
||||
|
||||
|
||||
|
||||
Z-matrix (autoz)
|
||||
--------
|
||||
|
||||
Units are Angstrom for bonds and degrees for angles
|
||||
|
||||
Type Name I J K L M Value
|
||||
----------- -------- ----- ----- ----- ----- ----- ----------
|
||||
1 Stretch 1 2 0.95697
|
||||
2 Stretch 1 3 0.95697
|
||||
3 Bend 2 1 3 104.51122
|
||||
|
||||
|
||||
XYZ format geometry
|
||||
-------------------
|
||||
3
|
||||
geometry
|
||||
O 0.00000000 0.00000000 0.11715980
|
||||
H 0.00000000 0.75672300 -0.46863920
|
||||
H 0.00000000 -0.75672300 -0.46863920
|
||||
|
||||
==============================================================================
|
||||
internuclear distances
|
||||
------------------------------------------------------------------------------
|
||||
center one | center two | atomic units | angstroms
|
||||
------------------------------------------------------------------------------
|
||||
2 H | 1 O | 1.80841 | 0.95697
|
||||
3 H | 1 O | 1.80841 | 0.95697
|
||||
------------------------------------------------------------------------------
|
||||
number of included internuclear distances: 2
|
||||
==============================================================================
|
||||
|
||||
|
||||
|
||||
==============================================================================
|
||||
internuclear angles
|
||||
------------------------------------------------------------------------------
|
||||
center 1 | center 2 | center 3 | degrees
|
||||
------------------------------------------------------------------------------
|
||||
2 H | 1 O | 3 H | 104.51
|
||||
------------------------------------------------------------------------------
|
||||
number of included internuclear angles: 1
|
||||
==============================================================================
|
||||
|
||||
|
||||
|
||||
Basis "ao basis" -> "" (cartesian)
|
||||
-----
|
||||
O (Oxygen)
|
||||
----------
|
||||
Exponent Coefficients
|
||||
-------------- ---------------------------------------------------------
|
||||
1 S 5.48467170E+03 0.001831
|
||||
1 S 8.25234950E+02 0.013950
|
||||
1 S 1.88046960E+02 0.068445
|
||||
1 S 5.29645000E+01 0.232714
|
||||
1 S 1.68975700E+01 0.470193
|
||||
1 S 5.79963530E+00 0.358521
|
||||
|
||||
2 S 1.55396160E+01 -0.110778
|
||||
2 S 3.59993360E+00 -0.148026
|
||||
2 S 1.01376180E+00 1.130767
|
||||
|
||||
3 P 1.55396160E+01 0.070874
|
||||
3 P 3.59993360E+00 0.339753
|
||||
3 P 1.01376180E+00 0.727159
|
||||
|
||||
4 S 2.70005800E-01 1.000000
|
||||
|
||||
5 P 2.70005800E-01 1.000000
|
||||
|
||||
6 D 8.00000000E-01 1.000000
|
||||
|
||||
H (Hydrogen)
|
||||
------------
|
||||
Exponent Coefficients
|
||||
-------------- ---------------------------------------------------------
|
||||
1 S 1.87311370E+01 0.033495
|
||||
1 S 2.82539370E+00 0.234727
|
||||
1 S 6.40121700E-01 0.813757
|
||||
|
||||
2 S 1.61277800E-01 1.000000
|
||||
|
||||
|
||||
|
||||
Summary of "ao basis" -> "" (cartesian)
|
||||
------------------------------------------------------------------------------
|
||||
Tag Description Shells Functions and Types
|
||||
---------------- ------------------------------ ------ ---------------------
|
||||
O 6-31g* 6 15 3s2p1d
|
||||
H 6-31g* 2 2 2s
|
||||
|
||||
|
||||
NWChem SCF Module
|
||||
-----------------
|
||||
|
||||
|
||||
|
||||
ao basis = "ao basis"
|
||||
functions = 19
|
||||
atoms = 3
|
||||
closed shells = 5
|
||||
open shells = 0
|
||||
charge = 0.00
|
||||
wavefunction = RHF
|
||||
input vectors = ./nwchem_lammps.movecs
|
||||
output vectors = ./nwchem_lammps.movecs
|
||||
use symmetry = F
|
||||
symmetry adapt = F
|
||||
|
||||
|
||||
Summary of "ao basis" -> "ao basis" (cartesian)
|
||||
------------------------------------------------------------------------------
|
||||
Tag Description Shells Functions and Types
|
||||
---------------- ------------------------------ ------ ---------------------
|
||||
O 6-31g* 6 15 3s2p1d
|
||||
H 6-31g* 2 2 2s
|
||||
|
||||
|
||||
|
||||
Forming initial guess at 0.0s
|
||||
|
||||
|
||||
Loading old vectors from job with title :
|
||||
|
||||
|
||||
|
||||
|
||||
Starting SCF solution at 0.0s
|
||||
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
Quadratically convergent ROHF
|
||||
|
||||
Convergence threshold : 1.000E-04
|
||||
Maximum no. of iterations : 100
|
||||
Final Fock-matrix accuracy: 1.000E-07
|
||||
----------------------------------------------
|
||||
|
||||
|
||||
#quartets = 1.540D+03 #integrals = 8.874D+03 #direct = 0.0% #cached =100.0%
|
||||
|
||||
|
||||
Integral file = ./nwchem_lammps.aoints.0
|
||||
Record size in doubles = 65536 No. of integs per rec = 43688
|
||||
Max. records in memory = 2 Max. records in file = 326674
|
||||
No. of bits per label = 8 No. of bits per value = 64
|
||||
|
||||
|
||||
iter energy gnorm gmax time
|
||||
----- ------------------- --------- --------- --------
|
||||
1 -75.9732571733 7.14D-01 3.37D-01 0.3
|
||||
2 -76.0055117003 3.10D-01 1.79D-01 0.3
|
||||
3 -76.0098071888 1.15D-01 5.21D-02 0.3
|
||||
4 -76.0105377099 2.55D-03 9.57D-04 0.3
|
||||
5 -76.0105386346 9.48D-06 3.52D-06 0.3
|
||||
|
||||
|
||||
Final RHF results
|
||||
------------------
|
||||
|
||||
Total SCF energy = -76.010538634624
|
||||
One-electron energy = -123.058850386783
|
||||
Two-electron energy = 37.851108474513
|
||||
Nuclear repulsion energy = 9.197203277646
|
||||
|
||||
Time for solution = 0.1s
|
||||
|
||||
|
||||
Final eigenvalues
|
||||
-----------------
|
||||
|
||||
1
|
||||
1 -20.5603
|
||||
2 -1.3419
|
||||
3 -0.7071
|
||||
4 -0.5711
|
||||
5 -0.4979
|
||||
6 0.2108
|
||||
7 0.3042
|
||||
8 1.0227
|
||||
9 1.1318
|
||||
10 1.1678
|
||||
11 1.1719
|
||||
12 1.3809
|
||||
13 1.4341
|
||||
14 2.0201
|
||||
15 2.0337
|
||||
|
||||
ROHF Final Molecular Orbital Analysis
|
||||
-------------------------------------
|
||||
|
||||
Vector 2 Occ=2.000000D+00 E=-1.341930D+00
|
||||
MO Center= -7.7D-08, 1.6D-07, -5.6D-02, r^2= 5.0D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
2 0.475861 1 O s 6 0.439201 1 O s
|
||||
1 -0.209676 1 O s
|
||||
|
||||
Vector 3 Occ=2.000000D+00 E=-7.070591D-01
|
||||
MO Center= 5.8D-08, -1.2D-07, -1.0D-01, r^2= 7.7D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
4 0.507651 1 O py 8 0.306488 1 O py
|
||||
16 0.230979 2 H s 18 -0.230979 3 H s
|
||||
|
||||
Vector 4 Occ=2.000000D+00 E=-5.710712D-01
|
||||
MO Center= 6.9D-07, -2.0D-07, 1.7D-01, r^2= 6.9D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
5 0.555446 1 O pz 9 0.403175 1 O pz
|
||||
6 0.325535 1 O s 2 0.164591 1 O s
|
||||
|
||||
Vector 5 Occ=2.000000D+00 E=-4.979251D-01
|
||||
MO Center= -9.5D-08, -7.1D-08, 9.7D-02, r^2= 6.0D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
3 0.639615 1 O px 7 0.511470 1 O px
|
||||
|
||||
Vector 6 Occ=0.000000D+00 E= 2.108019D-01
|
||||
MO Center= -5.7D-07, 1.0D-06, -6.5D-01, r^2= 2.6D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
6 1.415545 1 O s 17 -1.041449 2 H s
|
||||
19 -1.041447 3 H s 9 -0.508218 1 O pz
|
||||
5 -0.217054 1 O pz
|
||||
|
||||
Vector 7 Occ=0.000000D+00 E= 3.042327D-01
|
||||
MO Center= -1.9D-09, -9.8D-07, -6.2D-01, r^2= 2.7D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
17 1.395012 2 H s 19 -1.395014 3 H s
|
||||
8 -0.833805 1 O py 4 -0.329272 1 O py
|
||||
|
||||
Vector 8 Occ=0.000000D+00 E= 1.022735D+00
|
||||
MO Center= -1.1D-10, 6.2D-07, -4.7D-02, r^2= 1.4D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
16 0.838912 2 H s 18 -0.838911 3 H s
|
||||
8 -0.662620 1 O py 17 -0.459236 2 H s
|
||||
19 0.459235 3 H s 14 -0.343167 1 O dyz
|
||||
|
||||
Vector 9 Occ=0.000000D+00 E= 1.131842D+00
|
||||
MO Center= 2.2D-07, 3.1D-07, 2.0D-01, r^2= 1.6D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
6 1.636696 1 O s 2 -0.921950 1 O s
|
||||
9 0.708679 1 O pz 16 0.548799 2 H s
|
||||
18 0.548800 3 H s 17 -0.474050 2 H s
|
||||
19 -0.474049 3 H s 5 -0.419243 1 O pz
|
||||
10 -0.387486 1 O dxx 15 -0.318053 1 O dzz
|
||||
|
||||
Vector 10 Occ=0.000000D+00 E= 1.167786D+00
|
||||
MO Center= 2.2D-05, 5.1D-09, 1.1D-01, r^2= 1.1D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
7 -1.036049 1 O px 3 0.962745 1 O px
|
||||
|
||||
Vector 11 Occ=0.000000D+00 E= 1.171944D+00
|
||||
MO Center= -2.2D-05, -4.7D-07, -3.9D-02, r^2= 1.1D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
5 0.761007 1 O pz 16 0.661205 2 H s
|
||||
18 0.661206 3 H s 6 -0.462694 1 O s
|
||||
9 -0.370404 1 O pz 17 -0.357353 2 H s
|
||||
19 -0.357353 3 H s 13 0.249348 1 O dyy
|
||||
|
||||
Vector 12 Occ=0.000000D+00 E= 1.380937D+00
|
||||
MO Center= -2.5D-09, 2.4D-07, 5.7D-02, r^2= 1.4D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
8 1.537091 1 O py 4 -1.037376 1 O py
|
||||
17 -0.915091 2 H s 19 0.915090 3 H s
|
||||
|
||||
Vector 13 Occ=0.000000D+00 E= 1.434077D+00
|
||||
MO Center= 5.4D-08, -5.6D-07, -3.9D-01, r^2= 1.4D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
6 3.574401 1 O s 2 -1.418426 1 O s
|
||||
9 -1.174649 1 O pz 17 -0.784923 2 H s
|
||||
19 -0.784925 3 H s 13 -0.644454 1 O dyy
|
||||
5 0.506381 1 O pz 15 -0.402328 1 O dzz
|
||||
16 -0.323132 2 H s 18 -0.323132 3 H s
|
||||
|
||||
Vector 14 Occ=0.000000D+00 E= 2.020054D+00
|
||||
MO Center= -2.1D-08, 1.2D-08, 1.6D-01, r^2= 6.2D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
15 1.008815 1 O dzz 13 -0.580616 1 O dyy
|
||||
10 -0.366779 1 O dxx 6 -0.227333 1 O s
|
||||
|
||||
Vector 15 Occ=0.000000D+00 E= 2.033720D+00
|
||||
MO Center= -5.0D-08, 6.6D-08, 1.2D-01, r^2= 6.1D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
11 1.732051 1 O dxy
|
||||
|
||||
|
||||
center of mass
|
||||
--------------
|
||||
x = 0.00000000 y = 0.00000000 z = 0.09751017
|
||||
|
||||
moments of inertia (a.u.)
|
||||
------------------
|
||||
6.315433940446 0.000000000000 0.000000000000
|
||||
0.000000000000 2.193636332720 0.000000000000
|
||||
0.000000000000 0.000000000000 4.121797607726
|
||||
|
||||
Mulliken analysis of the total density
|
||||
--------------------------------------
|
||||
|
||||
Atom Charge Shell Charges
|
||||
----------- ------ -------------------------------------------------------
|
||||
1 O 8 8.87 2.00 0.90 2.90 0.92 2.07 0.08
|
||||
2 H 1 0.57 0.46 0.10
|
||||
3 H 1 0.57 0.46 0.10
|
||||
|
||||
Multipole analysis of the density wrt the origin
|
||||
------------------------------------------------
|
||||
|
||||
L x y z total open nuclear
|
||||
- - - - ----- ---- -------
|
||||
0 0 0 0 0.000000 0.000000 10.000000
|
||||
|
||||
1 1 0 0 -0.000002 0.000000 0.000000
|
||||
1 0 1 0 0.000001 0.000000 0.000000
|
||||
1 0 0 1 -0.875296 0.000000 0.000000
|
||||
|
||||
2 2 0 0 -5.372336 0.000000 0.000000
|
||||
2 1 1 0 -0.000002 0.000000 0.000000
|
||||
2 1 0 1 0.000001 0.000000 0.000000
|
||||
2 0 2 0 -3.071804 0.000000 4.089795
|
||||
2 0 1 1 0.000000 0.000000 0.000000
|
||||
2 0 0 2 -4.444596 0.000000 1.960717
|
||||
|
||||
|
||||
Parallel integral file used 1 records with 0 large values
|
||||
|
||||
NWChem Gradients Module
|
||||
-----------------------
|
||||
|
||||
|
||||
|
||||
wavefunction = RHF
|
||||
|
||||
|
||||
|
||||
RHF ENERGY GRADIENTS
|
||||
|
||||
atom coordinates gradient
|
||||
x y z x y z
|
||||
1 O 0.000000 0.000000 0.221400 0.000001 0.000000 0.014490
|
||||
2 H 0.000000 1.429999 -0.885600 -0.000001 0.007296 -0.007245
|
||||
3 H 0.000000 -1.429999 -0.885600 -0.000000 -0.007296 -0.007245
|
||||
|
||||
----------------------------------------
|
||||
| Time | 1-e(secs) | 2-e(secs) |
|
||||
----------------------------------------
|
||||
| CPU | 0.00 | 0.07 |
|
||||
----------------------------------------
|
||||
| WALL | 0.00 | 0.03 |
|
||||
----------------------------------------
|
||||
|
||||
Task times cpu: 0.2s wall: 0.1s
|
||||
|
||||
|
||||
NWChem Input Module
|
||||
-------------------
|
||||
|
||||
|
||||
Summary of allocated global arrays
|
||||
-----------------------------------
|
||||
No active global arrays
|
||||
|
||||
|
||||
|
||||
GA Statistics for process 0
|
||||
------------------------------
|
||||
|
||||
create destroy get put acc scatter gather read&inc
|
||||
calls: 225 225 3182 894 878 0 0 68
|
||||
number of processes/call 1.00e+00 1.00e+00 1.00e+00 0.00e+00 0.00e+00
|
||||
bytes total: 8.62e+05 5.44e+05 1.23e+05 0.00e+00 0.00e+00 5.44e+02
|
||||
bytes remote: 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00
|
||||
Max memory consumed for GA by this process: 39432 bytes
|
||||
|
||||
MA_summarize_allocated_blocks: starting scan ...
|
||||
MA_summarize_allocated_blocks: scan completed: 0 heap blocks, 0 stack blocks
|
||||
MA usage statistics:
|
||||
|
||||
allocation statistics:
|
||||
heap stack
|
||||
---- -----
|
||||
current number of blocks 0 0
|
||||
maximum number of blocks 18 28
|
||||
current total bytes 0 0
|
||||
maximum total bytes 1060104 16000888
|
||||
maximum total K-bytes 1061 16001
|
||||
maximum total M-bytes 2 17
|
||||
|
||||
|
||||
CITATION
|
||||
--------
|
||||
Please cite the following reference when publishing
|
||||
results obtained with NWChem:
|
||||
|
||||
M. Valiev, E.J. Bylaska, N. Govind, K. Kowalski,
|
||||
T.P. Straatsma, H.J.J. van Dam, D. Wang, J. Nieplocha,
|
||||
E. Apra, T.L. Windus, W.A. de Jong
|
||||
"NWChem: a comprehensive and scalable open-source
|
||||
solution for large scale molecular simulations"
|
||||
Comput. Phys. Commun. 181, 1477 (2010)
|
||||
doi:10.1016/j.cpc.2010.04.018
|
||||
|
||||
AUTHORS
|
||||
-------
|
||||
E. Apra, E. J. Bylaska, W. A. de Jong, N. Govind, K. Kowalski,
|
||||
T. P. Straatsma, M. Valiev, H. J. J. van Dam, D. Wang, T. L. Windus,
|
||||
J. Hammond, J. Autschbach, K. Bhaskaran-Nair, J. Brabec, K. Lopata,
|
||||
S. A. Fischer, S. Krishnamoorthy, M. Jacquelin, W. Ma, M. Klemm, O. Villa,
|
||||
Y. Chen, V. Anisimov, F. Aquino, S. Hirata, M. T. Hackler, V. Konjkov,
|
||||
D. Mejia-Rodriguez, T. Risthaus, M. Malagoli, A. Marenich,
|
||||
A. Otero-de-la-Roza, J. Mullin, P. Nichols, R. Peverati, J. Pittner, Y. Zhao,
|
||||
P.-D. Fan, A. Fonari, M. J. Williamson, R. J. Harrison, J. R. Rehr,
|
||||
M. Dupuis, D. Silverstein, D. M. A. Smith, J. Nieplocha, V. Tipparaju,
|
||||
M. Krishnan, B. E. Van Kuiken, A. Vazquez-Mayagoitia, L. Jensen, M. Swart,
|
||||
Q. Wu, T. Van Voorhis, A. A. Auer, M. Nooijen, L. D. Crosby, E. Brown,
|
||||
G. Cisneros, G. I. Fann, H. Fruchtl, J. Garza, K. Hirao, R. A. Kendall,
|
||||
J. A. Nichols, K. Tsemekhman, K. Wolinski, J. Anchell, D. E. Bernholdt,
|
||||
P. Borowski, T. Clark, D. Clerc, H. Dachsel, M. J. O. Deegan, K. Dyall,
|
||||
D. Elwood, E. Glendening, M. Gutowski, A. C. Hess, J. Jaffe, B. G. Johnson,
|
||||
J. Ju, R. Kobayashi, R. Kutteh, Z. Lin, R. Littlefield, X. Long, B. Meng,
|
||||
T. Nakajima, S. Niu, L. Pollack, M. Rosing, K. Glaesemann, G. Sandrone,
|
||||
M. Stave, H. Taylor, G. Thomas, J. H. van Lenthe, A. T. Wong, Z. Zhang.
|
||||
|
||||
Total times cpu: 0.2s wall: 0.1s
|
||||
197
examples/COUPLE/lammps_nwchem/lammps_nwchem/README
Normal file
197
examples/COUPLE/lammps_nwchem/lammps_nwchem/README
Normal file
@ -0,0 +1,197 @@
|
||||
Sample LAMMPS MD wrapper on NWChem via client/server coupling
|
||||
|
||||
See the MESSAGE package (doc/Section_messages.html#MESSAGE) and
|
||||
Section_howto.html#howto10 for more details on how client/server
|
||||
coupling works in LAMMPS.
|
||||
|
||||
In this dir, the nwchem_wrap.py is a wrapper on the NWChem electronic
|
||||
structure code so it can work as a "server" code which LAMMPS drives
|
||||
as a "client" code to perform ab initio MD. LAMMPS performs the MD
|
||||
timestepping, sends NWChem a current set of coordinates each timestep,
|
||||
NWChem computes forces and energy (and virial) and returns that info
|
||||
to LAMMPS.
|
||||
|
||||
Messages are exchanged between NWChem and LAMMPS via a client/server
|
||||
library (CSlib), which is included in the LAMMPS distribution in
|
||||
lib/message. As explained below you can choose to exchange data
|
||||
between the two programs either via files or sockets (ZMQ). If the
|
||||
nwchem_wrap.py program became parallel, or the CSlib library calls were
|
||||
integrated into NWChem directly, then data could also be exchanged via
|
||||
MPI.
|
||||
|
||||
There are 2 examples provided in the planeware and ao_basis
|
||||
sub-directories. See details below.
|
||||
|
||||
----------------
|
||||
|
||||
Build LAMMPS with its MESSAGE package installed:
|
||||
|
||||
See the Build extras doc page and its MESSAGE package
|
||||
section for details.
|
||||
|
||||
CMake:
|
||||
|
||||
-D PKG_MESSAGE=yes # include the MESSAGE package
|
||||
-D MESSAGE_ZMQ=value # build with ZeroMQ support, value = no (default) or yes
|
||||
|
||||
Traditional make:
|
||||
|
||||
cd lammps/lib/message
|
||||
python Install.py -m -z # build CSlib with MPI and ZMQ support
|
||||
cd lammps/src
|
||||
make yes-message
|
||||
make mpi
|
||||
|
||||
You can leave off the -z if you do not have ZMQ on your system.
|
||||
|
||||
----------------
|
||||
|
||||
Build the CSlib in a form usable by the nwchem_wrapper.py script:
|
||||
|
||||
% cd lammps/lib/message/cslib/src
|
||||
% make shlib # build serial and parallel shared lib with ZMQ support
|
||||
% make shlib zmq=no # build serial and parallel shared lib w/out ZMQ support
|
||||
|
||||
This will make a shared library versions of the CSlib, which Python
|
||||
requires. Python must be able to find both the cslib.py script and
|
||||
the libcsnompi.so library in your lammps/lib/message/cslib/src
|
||||
directory. If it is not able to do this, you will get an error when
|
||||
you run nwchem_wrapper.py.
|
||||
|
||||
You can do this by augmenting two environment variables, either from
|
||||
the command line, or in your shell start-up script. Here is the
|
||||
sample syntax for the csh or tcsh shells:
|
||||
|
||||
setenv PYTHONPATH ${PYTHONPATH}:/home/sjplimp/lammps/lib/message/cslib/src
|
||||
setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/home/sjplimp/lammps/lib/message/cslib/src
|
||||
|
||||
----------------
|
||||
|
||||
Prepare to use NWChem and the nwchem_wrap.py script
|
||||
|
||||
You can run the nwchem_wrap.py script as-is to test that the coupling
|
||||
between it and LAMMPS is functional. This will use the included
|
||||
nwchem_lammps.out files output by a previous NWChem run.
|
||||
|
||||
But note that the as-is version of nwchem_wrap.py will not attempt to
|
||||
run NWChem.
|
||||
|
||||
To do this, you must edit the 1st nwchemcmd line at the top of
|
||||
nwchem_wrapper.py to be the launch command needed to run NWChem on
|
||||
your system. It can be a command to run NWChem in serial or in
|
||||
parallel, e.g. an mpirun command. Then comment out the 2nd nwchemcmd
|
||||
line immediately following it.
|
||||
|
||||
Ensure you have the necessary NWChem input file in this directory,
|
||||
suitable for the NWChem calculation you want to perform.
|
||||
|
||||
Example input files are provided for both atom-centered AO basis sets
|
||||
and plane-wave basis sets. Note that the NWChem template file should
|
||||
be matched to the LAMMPS input script (# of atoms and atom types, box
|
||||
size, etc).
|
||||
|
||||
Once you run NWChem yourself, the nwchem_lammps.out file will be
|
||||
overwritten.
|
||||
|
||||
The syntax of the wrapper is:
|
||||
nwchem_wrap.py file/zmq ao/pw input_template
|
||||
* file/zmg = messaging mode, must match LAMMPS messaging mode
|
||||
* ao/pw = basis set mode, selects between atom-centered and plane-wave
|
||||
the input_template file must correspond to the appropriate basis set mode:
|
||||
the "ao" mode supports the scf and dft modules in NWChem,
|
||||
the "pw" mode supports the nwpw module.
|
||||
* input_template = NWChem input file used as template, must include a
|
||||
"geometry" block with the atoms in the simulation, dummy
|
||||
xyz coordinates should be included (but are not used).
|
||||
Atom ordering must match LAMMPS input.
|
||||
|
||||
During a simulation, the molecular orbitals from the previous timestep
|
||||
will be used as the initial guess for the next NWChem calculation. If
|
||||
a file named "nwchem_lammps.movecs" is in the directory the wrapper is
|
||||
called from, these orbitals will be used as the initial guess orbitals
|
||||
in the first step of the simulation.
|
||||
|
||||
----------------
|
||||
|
||||
Example directories
|
||||
|
||||
(1) planewave
|
||||
|
||||
Demonstrates coupling of the nwpw module in NWChem with LAMMPS. Only fully
|
||||
periodic boundary conditions and orthogonal simulation boxes are currently
|
||||
supported by the wrapper. The included files provide an example run using a
|
||||
2 atom unit cell of tungsten.
|
||||
|
||||
Files:
|
||||
* data.W LAMMPS input with geometry information
|
||||
* in.client.W LAMMPS simulation input
|
||||
* log.client.output LAMMPS simulation output
|
||||
* w.nw NWChem template input file
|
||||
* nwchem_lammps.out NWChem output
|
||||
|
||||
(2) ao_basis
|
||||
|
||||
Demonstrates coupling of the scf (or dft) modules in NWChem with
|
||||
LAMMPS. Only fully aperiodic boundary conditions are currently
|
||||
supported by the wrapper. The included files provide an example run
|
||||
using a single water molecule.
|
||||
|
||||
Files:
|
||||
* data.h2o LAMMPS input with geometry information
|
||||
* in.client.h2o LAMMPS simulation input
|
||||
* log.client.output LAMMPS simulation output
|
||||
* h2o.nw NWChem template input file
|
||||
* nwchem_lammps.out NWChem output
|
||||
|
||||
As noted above, you can run the nwchem_wrap.py script as-is to test that
|
||||
the coupling between it and LAMMPS is functional. This will use the included
|
||||
nwchem_lammps.out files.
|
||||
|
||||
----------------
|
||||
|
||||
To run in client/server mode:
|
||||
|
||||
NOTE: The nwchem_wrap.py script must be run with Python version 2, not
|
||||
3. This is because it used the CSlib python wrapper, which only
|
||||
supports version 2. We plan to upgrade CSlib to support Python 3.
|
||||
|
||||
Both the client (LAMMPS) and server (nwchem_wrap.py) must use the same
|
||||
messaging mode, namely file or zmq. This is an argument to the
|
||||
nwchem_wrap.py code; it can be selected by setting the "mode" variable
|
||||
when you run LAMMPS. The default mode = file.
|
||||
|
||||
Here we assume LAMMPS was built to run in parallel, and the MESSAGE
|
||||
package was installed with socket (ZMQ) support. This means either of
|
||||
the messaging modes can be used and LAMMPS can be run in serial or
|
||||
parallel. The nwchem_wrap.py code is always run in serial, but it
|
||||
launches NWChem from Python via an mpirun command which can run NWChem
|
||||
itself in parallel.
|
||||
|
||||
When you run, the server should print out thermodynamic info every
|
||||
timestep which corresponds to the forces and virial computed by NWChem.
|
||||
NWChem will also generate output files each timestep. Output files from
|
||||
previous timesteps are archived in a "nwchem_logs" directory.
|
||||
|
||||
The examples below are commands you should use in two different
|
||||
terminal windows. The order of the two commands (client or server
|
||||
launch) does not matter. You can run them both in the same window if
|
||||
you append a "&" character to the first one to run it in the
|
||||
background.
|
||||
|
||||
--------------
|
||||
|
||||
File mode of messaging:
|
||||
|
||||
% mpirun -np 1 lmp_mpi -v mode file < in.client.W
|
||||
% python nwchem_wrap.py file pw w.nw
|
||||
|
||||
% mpirun -np 2 lmp_mpi -v mode file < in.client.h2o
|
||||
% python nwchem_wrap.py file ao h2o_dft.nw
|
||||
|
||||
ZMQ mode of messaging:
|
||||
|
||||
% mpirun -np 1 lmp_mpi -v mode zmq < in.client.W
|
||||
% python nwchem_wrap.py zmq pw w.nw
|
||||
|
||||
% mpirun -np 2 lmp_mpi -v mode zmq < in.client.h2o
|
||||
% python nwchem_wrap.py zmq ao h2o_dft.nw
|
||||
@ -0,0 +1,20 @@
|
||||
LAMMPS H2O data file
|
||||
|
||||
3 atoms
|
||||
|
||||
2 atom types
|
||||
|
||||
-10.0 10.0 xlo xhi
|
||||
-10.0 10.0 ylo yhi
|
||||
-10.0 10.0 zlo zhi
|
||||
|
||||
Masses
|
||||
|
||||
1 15.994915008544922
|
||||
2 1.0078250169754028
|
||||
|
||||
Atoms
|
||||
|
||||
1 1 0.0 0.0 0.0
|
||||
2 2 0.0 0.756723 -0.585799
|
||||
3 2 0.0 -0.756723 -0.585799
|
||||
25
examples/COUPLE/lammps_nwchem/lammps_nwchem/ao_basis/h2o.nw
Normal file
25
examples/COUPLE/lammps_nwchem/lammps_nwchem/ao_basis/h2o.nw
Normal file
@ -0,0 +1,25 @@
|
||||
echo
|
||||
|
||||
memory global 40 mb stack 23 mb heap 5 mb
|
||||
|
||||
geometry units angstrom noautosym
|
||||
O 0.0 0.0 0.0
|
||||
H 1.0 0.5 0.0
|
||||
H -1.0 0.5 0.0
|
||||
end
|
||||
|
||||
basis
|
||||
O library 6-31g*
|
||||
H library 6-31g*
|
||||
end
|
||||
|
||||
scf
|
||||
maxiter 100
|
||||
end
|
||||
|
||||
#dft
|
||||
# xc b3lyp
|
||||
#end
|
||||
|
||||
task scf gradient
|
||||
#task dft gradient
|
||||
@ -0,0 +1,33 @@
|
||||
# H2O with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then &
|
||||
"message client md file tmp.couple" &
|
||||
elif "${mode} == zmq" &
|
||||
"message client md zmq localhost:5555" &
|
||||
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
boundary m m m
|
||||
read_data data.h2o
|
||||
|
||||
replicate $x $y $z
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
@ -0,0 +1,77 @@
|
||||
LAMMPS (18 Sep 2018)
|
||||
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87)
|
||||
using 1 OpenMP thread(s) per MPI task
|
||||
# H2O with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then "message client md file tmp.couple" elif "${mode} == zmq" "message client md zmq localhost:5555"
|
||||
message client md zmq localhost:5555
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
boundary m m m
|
||||
read_data data.h2o
|
||||
orthogonal box = (-10 -10 -10) to (10 10 10)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
reading atoms ...
|
||||
3 atoms
|
||||
|
||||
replicate $x $y $z
|
||||
replicate 1 $y $z
|
||||
replicate 1 1 $z
|
||||
replicate 1 1 1
|
||||
orthogonal box = (-10 -10 -10) to (10 10 10)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
3 atoms
|
||||
Time spent = 5.8016e-05 secs
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
Per MPI rank memory allocation (min/avg/max) = 0.02705 | 0.02705 | 0.02705 Mbytes
|
||||
Step Temp E_pair E_mol TotEng Press Volume
|
||||
0 300 0 0 -2068.2746 10.354878 8000
|
||||
1 368.98118 0 0 -2068.2567 12.735851 8000
|
||||
2 459.96278 0 0 -2068.2332 15.876195 8000
|
||||
3 572.94479 0 0 -2068.204 19.775912 8000
|
||||
Loop time of 0.0174769 on 1 procs for 3 steps with 3 atoms
|
||||
|
||||
Performance: 14.831 ns/day, 1.618 hours/ns, 171.655 timesteps/s
|
||||
8.4% CPU use with 1 MPI tasks x 1 OpenMP threads
|
||||
|
||||
MPI task timing breakdown:
|
||||
Section | min time | avg time | max time |%varavg| %total
|
||||
---------------------------------------------------------------
|
||||
Pair | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Neigh | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Comm | 2.555e-06 | 2.555e-06 | 2.555e-06 | 0.0 | 0.01
|
||||
Output | 8.4169e-05 | 8.4169e-05 | 8.4169e-05 | 0.0 | 0.48
|
||||
Modify | 0.017383 | 0.017383 | 0.017383 | 0.0 | 99.46
|
||||
Other | | 7.694e-06 | | | 0.04
|
||||
|
||||
Nlocal: 3 ave 3 max 3 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Nghost: 0 ave 0 max 0 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Neighs: 0 ave 0 max 0 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
|
||||
Total # of neighbors = 0
|
||||
Ave neighs/atom = 0
|
||||
Neighbor list builds = 0
|
||||
Dangerous builds not checked
|
||||
Total wall time: 0:00:01
|
||||
@ -0,0 +1,622 @@
|
||||
argument 1 = nwchem_lammps.nw
|
||||
|
||||
|
||||
|
||||
============================== echo of input deck ==============================
|
||||
echo
|
||||
|
||||
memory global 40 mb stack 23 mb heap 5 mb
|
||||
|
||||
geometry units angstrom noautosym
|
||||
O 0 0 0
|
||||
H 0 0.756723 -0.585799
|
||||
H 0 -0.756723 -0.585799
|
||||
end
|
||||
|
||||
scf
|
||||
vectors input nwchem_lammps.movecs
|
||||
end
|
||||
|
||||
dft
|
||||
vectors input nwchem_lammps.movecs
|
||||
end
|
||||
|
||||
basis
|
||||
O library 6-31g*
|
||||
H library 6-31g*
|
||||
end
|
||||
|
||||
scf
|
||||
maxiter 100
|
||||
end
|
||||
|
||||
task scf gradient
|
||||
|
||||
================================================================================
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Northwest Computational Chemistry Package (NWChem) 6.8
|
||||
------------------------------------------------------
|
||||
|
||||
|
||||
Environmental Molecular Sciences Laboratory
|
||||
Pacific Northwest National Laboratory
|
||||
Richland, WA 99352
|
||||
|
||||
Copyright (c) 1994-2017
|
||||
Pacific Northwest National Laboratory
|
||||
Battelle Memorial Institute
|
||||
|
||||
NWChem is an open-source computational chemistry package
|
||||
distributed under the terms of the
|
||||
Educational Community License (ECL) 2.0
|
||||
A copy of the license is included with this distribution
|
||||
in the LICENSE.TXT file
|
||||
|
||||
ACKNOWLEDGMENT
|
||||
--------------
|
||||
|
||||
This software and its documentation were developed at the
|
||||
EMSL at Pacific Northwest National Laboratory, a multiprogram
|
||||
national laboratory, operated for the U.S. Department of Energy
|
||||
by Battelle under Contract Number DE-AC05-76RL01830. Support
|
||||
for this work was provided by the Department of Energy Office
|
||||
of Biological and Environmental Research, Office of Basic
|
||||
Energy Sciences, and the Office of Advanced Scientific Computing.
|
||||
|
||||
|
||||
Job information
|
||||
---------------
|
||||
|
||||
hostname = mcq
|
||||
program = /usr/bin/nwchem
|
||||
date = Mon Sep 23 16:28:27 2019
|
||||
|
||||
compiled = Wed_Aug_15_19:14:19_2018
|
||||
source = /home/edo/debichem-team/nwchem/nwchem-6.8.1
|
||||
nwchem branch = 6.8.1
|
||||
nwchem revision = v6.8-133-ge032219
|
||||
ga revision = 5.6.5
|
||||
use scalapack = T
|
||||
input = nwchem_lammps.nw
|
||||
prefix = nwchem_lammps.
|
||||
data base = ./nwchem_lammps.db
|
||||
status = restart
|
||||
nproc = 1
|
||||
time left = -1s
|
||||
|
||||
|
||||
|
||||
Memory information
|
||||
------------------
|
||||
|
||||
heap = 655358 doubles = 5.0 Mbytes
|
||||
stack = 3014651 doubles = 23.0 Mbytes
|
||||
global = 5242880 doubles = 40.0 Mbytes (distinct from heap & stack)
|
||||
total = 8912889 doubles = 68.0 Mbytes
|
||||
verify = yes
|
||||
hardfail = no
|
||||
|
||||
|
||||
Directory information
|
||||
---------------------
|
||||
|
||||
0 permanent = .
|
||||
0 scratch = .
|
||||
|
||||
|
||||
Previous task information
|
||||
-------------------------
|
||||
|
||||
Theory = scf
|
||||
Operation = gradient
|
||||
Status = ok
|
||||
Qmmm = F
|
||||
Ignore = F
|
||||
|
||||
|
||||
Geometries in the database
|
||||
--------------------------
|
||||
|
||||
Name Natoms Last Modified
|
||||
-------------------------------- ------ ------------------------
|
||||
1 geometry 3 Mon Sep 23 16:26:29 2019
|
||||
|
||||
The geometry named "geometry" is the default for restart
|
||||
|
||||
|
||||
|
||||
Basis sets in the database
|
||||
--------------------------
|
||||
|
||||
Name Natoms Last Modified
|
||||
-------------------------------- ------ ------------------------
|
||||
1 ao basis 2 Mon Sep 23 16:26:29 2019
|
||||
|
||||
The basis set named "ao basis" is the default AO basis for restart
|
||||
|
||||
|
||||
|
||||
|
||||
NWChem Input Module
|
||||
-------------------
|
||||
|
||||
|
||||
|
||||
Scaling coordinates for geometry "geometry" by 1.889725989
|
||||
(inverse scale = 0.529177249)
|
||||
|
||||
|
||||
------
|
||||
auto-z
|
||||
------
|
||||
|
||||
|
||||
Geometry "geometry" -> ""
|
||||
-------------------------
|
||||
|
||||
Output coordinates in angstroms (scale by 1.889725989 to convert to a.u.)
|
||||
|
||||
No. Tag Charge X Y Z
|
||||
---- ---------------- ---------- -------------- -------------- --------------
|
||||
1 O 8.0000 0.00000000 0.00000000 0.11715980
|
||||
2 H 1.0000 0.00000000 0.75672300 -0.46863920
|
||||
3 H 1.0000 0.00000000 -0.75672300 -0.46863920
|
||||
|
||||
Atomic Mass
|
||||
-----------
|
||||
|
||||
O 15.994910
|
||||
H 1.007825
|
||||
|
||||
|
||||
Effective nuclear repulsion energy (a.u.) 9.1972032776
|
||||
|
||||
Nuclear Dipole moment (a.u.)
|
||||
----------------------------
|
||||
X Y Z
|
||||
---------------- ---------------- ----------------
|
||||
0.0000000000 0.0000000000 0.0000000000
|
||||
|
||||
|
||||
|
||||
Z-matrix (autoz)
|
||||
--------
|
||||
|
||||
Units are Angstrom for bonds and degrees for angles
|
||||
|
||||
Type Name I J K L M Value
|
||||
----------- -------- ----- ----- ----- ----- ----- ----------
|
||||
1 Stretch 1 2 0.95697
|
||||
2 Stretch 1 3 0.95697
|
||||
3 Bend 2 1 3 104.51122
|
||||
|
||||
|
||||
XYZ format geometry
|
||||
-------------------
|
||||
3
|
||||
geometry
|
||||
O 0.00000000 0.00000000 0.11715980
|
||||
H 0.00000000 0.75672300 -0.46863920
|
||||
H 0.00000000 -0.75672300 -0.46863920
|
||||
|
||||
==============================================================================
|
||||
internuclear distances
|
||||
------------------------------------------------------------------------------
|
||||
center one | center two | atomic units | angstroms
|
||||
------------------------------------------------------------------------------
|
||||
2 H | 1 O | 1.80841 | 0.95697
|
||||
3 H | 1 O | 1.80841 | 0.95697
|
||||
------------------------------------------------------------------------------
|
||||
number of included internuclear distances: 2
|
||||
==============================================================================
|
||||
|
||||
|
||||
|
||||
==============================================================================
|
||||
internuclear angles
|
||||
------------------------------------------------------------------------------
|
||||
center 1 | center 2 | center 3 | degrees
|
||||
------------------------------------------------------------------------------
|
||||
2 H | 1 O | 3 H | 104.51
|
||||
------------------------------------------------------------------------------
|
||||
number of included internuclear angles: 1
|
||||
==============================================================================
|
||||
|
||||
|
||||
|
||||
Basis "ao basis" -> "" (cartesian)
|
||||
-----
|
||||
O (Oxygen)
|
||||
----------
|
||||
Exponent Coefficients
|
||||
-------------- ---------------------------------------------------------
|
||||
1 S 5.48467170E+03 0.001831
|
||||
1 S 8.25234950E+02 0.013950
|
||||
1 S 1.88046960E+02 0.068445
|
||||
1 S 5.29645000E+01 0.232714
|
||||
1 S 1.68975700E+01 0.470193
|
||||
1 S 5.79963530E+00 0.358521
|
||||
|
||||
2 S 1.55396160E+01 -0.110778
|
||||
2 S 3.59993360E+00 -0.148026
|
||||
2 S 1.01376180E+00 1.130767
|
||||
|
||||
3 P 1.55396160E+01 0.070874
|
||||
3 P 3.59993360E+00 0.339753
|
||||
3 P 1.01376180E+00 0.727159
|
||||
|
||||
4 S 2.70005800E-01 1.000000
|
||||
|
||||
5 P 2.70005800E-01 1.000000
|
||||
|
||||
6 D 8.00000000E-01 1.000000
|
||||
|
||||
H (Hydrogen)
|
||||
------------
|
||||
Exponent Coefficients
|
||||
-------------- ---------------------------------------------------------
|
||||
1 S 1.87311370E+01 0.033495
|
||||
1 S 2.82539370E+00 0.234727
|
||||
1 S 6.40121700E-01 0.813757
|
||||
|
||||
2 S 1.61277800E-01 1.000000
|
||||
|
||||
|
||||
|
||||
Summary of "ao basis" -> "" (cartesian)
|
||||
------------------------------------------------------------------------------
|
||||
Tag Description Shells Functions and Types
|
||||
---------------- ------------------------------ ------ ---------------------
|
||||
O 6-31g* 6 15 3s2p1d
|
||||
H 6-31g* 2 2 2s
|
||||
|
||||
|
||||
NWChem SCF Module
|
||||
-----------------
|
||||
|
||||
|
||||
|
||||
ao basis = "ao basis"
|
||||
functions = 19
|
||||
atoms = 3
|
||||
closed shells = 5
|
||||
open shells = 0
|
||||
charge = 0.00
|
||||
wavefunction = RHF
|
||||
input vectors = ./nwchem_lammps.movecs
|
||||
output vectors = ./nwchem_lammps.movecs
|
||||
use symmetry = F
|
||||
symmetry adapt = F
|
||||
|
||||
|
||||
Summary of "ao basis" -> "ao basis" (cartesian)
|
||||
------------------------------------------------------------------------------
|
||||
Tag Description Shells Functions and Types
|
||||
---------------- ------------------------------ ------ ---------------------
|
||||
O 6-31g* 6 15 3s2p1d
|
||||
H 6-31g* 2 2 2s
|
||||
|
||||
|
||||
|
||||
Forming initial guess at 0.0s
|
||||
|
||||
|
||||
Loading old vectors from job with title :
|
||||
|
||||
|
||||
|
||||
|
||||
Starting SCF solution at 0.0s
|
||||
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
Quadratically convergent ROHF
|
||||
|
||||
Convergence threshold : 1.000E-04
|
||||
Maximum no. of iterations : 100
|
||||
Final Fock-matrix accuracy: 1.000E-07
|
||||
----------------------------------------------
|
||||
|
||||
|
||||
#quartets = 1.540D+03 #integrals = 8.874D+03 #direct = 0.0% #cached =100.0%
|
||||
|
||||
|
||||
Integral file = ./nwchem_lammps.aoints.0
|
||||
Record size in doubles = 65536 No. of integs per rec = 43688
|
||||
Max. records in memory = 2 Max. records in file = 326674
|
||||
No. of bits per label = 8 No. of bits per value = 64
|
||||
|
||||
|
||||
iter energy gnorm gmax time
|
||||
----- ------------------- --------- --------- --------
|
||||
1 -75.9732571733 7.14D-01 3.37D-01 0.3
|
||||
2 -76.0055117003 3.10D-01 1.79D-01 0.3
|
||||
3 -76.0098071888 1.15D-01 5.21D-02 0.3
|
||||
4 -76.0105377099 2.55D-03 9.57D-04 0.3
|
||||
5 -76.0105386346 9.48D-06 3.52D-06 0.3
|
||||
|
||||
|
||||
Final RHF results
|
||||
------------------
|
||||
|
||||
Total SCF energy = -76.010538634624
|
||||
One-electron energy = -123.058850386783
|
||||
Two-electron energy = 37.851108474513
|
||||
Nuclear repulsion energy = 9.197203277646
|
||||
|
||||
Time for solution = 0.1s
|
||||
|
||||
|
||||
Final eigenvalues
|
||||
-----------------
|
||||
|
||||
1
|
||||
1 -20.5603
|
||||
2 -1.3419
|
||||
3 -0.7071
|
||||
4 -0.5711
|
||||
5 -0.4979
|
||||
6 0.2108
|
||||
7 0.3042
|
||||
8 1.0227
|
||||
9 1.1318
|
||||
10 1.1678
|
||||
11 1.1719
|
||||
12 1.3809
|
||||
13 1.4341
|
||||
14 2.0201
|
||||
15 2.0337
|
||||
|
||||
ROHF Final Molecular Orbital Analysis
|
||||
-------------------------------------
|
||||
|
||||
Vector 2 Occ=2.000000D+00 E=-1.341930D+00
|
||||
MO Center= -7.7D-08, 1.6D-07, -5.6D-02, r^2= 5.0D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
2 0.475861 1 O s 6 0.439201 1 O s
|
||||
1 -0.209676 1 O s
|
||||
|
||||
Vector 3 Occ=2.000000D+00 E=-7.070591D-01
|
||||
MO Center= 5.8D-08, -1.2D-07, -1.0D-01, r^2= 7.7D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
4 0.507651 1 O py 8 0.306488 1 O py
|
||||
16 0.230979 2 H s 18 -0.230979 3 H s
|
||||
|
||||
Vector 4 Occ=2.000000D+00 E=-5.710712D-01
|
||||
MO Center= 6.9D-07, -2.0D-07, 1.7D-01, r^2= 6.9D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
5 0.555446 1 O pz 9 0.403175 1 O pz
|
||||
6 0.325535 1 O s 2 0.164591 1 O s
|
||||
|
||||
Vector 5 Occ=2.000000D+00 E=-4.979251D-01
|
||||
MO Center= -9.5D-08, -7.1D-08, 9.7D-02, r^2= 6.0D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
3 0.639615 1 O px 7 0.511470 1 O px
|
||||
|
||||
Vector 6 Occ=0.000000D+00 E= 2.108019D-01
|
||||
MO Center= -5.7D-07, 1.0D-06, -6.5D-01, r^2= 2.6D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
6 1.415545 1 O s 17 -1.041449 2 H s
|
||||
19 -1.041447 3 H s 9 -0.508218 1 O pz
|
||||
5 -0.217054 1 O pz
|
||||
|
||||
Vector 7 Occ=0.000000D+00 E= 3.042327D-01
|
||||
MO Center= -1.9D-09, -9.8D-07, -6.2D-01, r^2= 2.7D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
17 1.395012 2 H s 19 -1.395014 3 H s
|
||||
8 -0.833805 1 O py 4 -0.329272 1 O py
|
||||
|
||||
Vector 8 Occ=0.000000D+00 E= 1.022735D+00
|
||||
MO Center= -1.1D-10, 6.2D-07, -4.7D-02, r^2= 1.4D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
16 0.838912 2 H s 18 -0.838911 3 H s
|
||||
8 -0.662620 1 O py 17 -0.459236 2 H s
|
||||
19 0.459235 3 H s 14 -0.343167 1 O dyz
|
||||
|
||||
Vector 9 Occ=0.000000D+00 E= 1.131842D+00
|
||||
MO Center= 2.2D-07, 3.1D-07, 2.0D-01, r^2= 1.6D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
6 1.636696 1 O s 2 -0.921950 1 O s
|
||||
9 0.708679 1 O pz 16 0.548799 2 H s
|
||||
18 0.548800 3 H s 17 -0.474050 2 H s
|
||||
19 -0.474049 3 H s 5 -0.419243 1 O pz
|
||||
10 -0.387486 1 O dxx 15 -0.318053 1 O dzz
|
||||
|
||||
Vector 10 Occ=0.000000D+00 E= 1.167786D+00
|
||||
MO Center= 2.2D-05, 5.1D-09, 1.1D-01, r^2= 1.1D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
7 -1.036049 1 O px 3 0.962745 1 O px
|
||||
|
||||
Vector 11 Occ=0.000000D+00 E= 1.171944D+00
|
||||
MO Center= -2.2D-05, -4.7D-07, -3.9D-02, r^2= 1.1D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
5 0.761007 1 O pz 16 0.661205 2 H s
|
||||
18 0.661206 3 H s 6 -0.462694 1 O s
|
||||
9 -0.370404 1 O pz 17 -0.357353 2 H s
|
||||
19 -0.357353 3 H s 13 0.249348 1 O dyy
|
||||
|
||||
Vector 12 Occ=0.000000D+00 E= 1.380937D+00
|
||||
MO Center= -2.5D-09, 2.4D-07, 5.7D-02, r^2= 1.4D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
8 1.537091 1 O py 4 -1.037376 1 O py
|
||||
17 -0.915091 2 H s 19 0.915090 3 H s
|
||||
|
||||
Vector 13 Occ=0.000000D+00 E= 1.434077D+00
|
||||
MO Center= 5.4D-08, -5.6D-07, -3.9D-01, r^2= 1.4D+00
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
6 3.574401 1 O s 2 -1.418426 1 O s
|
||||
9 -1.174649 1 O pz 17 -0.784923 2 H s
|
||||
19 -0.784925 3 H s 13 -0.644454 1 O dyy
|
||||
5 0.506381 1 O pz 15 -0.402328 1 O dzz
|
||||
16 -0.323132 2 H s 18 -0.323132 3 H s
|
||||
|
||||
Vector 14 Occ=0.000000D+00 E= 2.020054D+00
|
||||
MO Center= -2.1D-08, 1.2D-08, 1.6D-01, r^2= 6.2D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
15 1.008815 1 O dzz 13 -0.580616 1 O dyy
|
||||
10 -0.366779 1 O dxx 6 -0.227333 1 O s
|
||||
|
||||
Vector 15 Occ=0.000000D+00 E= 2.033720D+00
|
||||
MO Center= -5.0D-08, 6.6D-08, 1.2D-01, r^2= 6.1D-01
|
||||
Bfn. Coefficient Atom+Function Bfn. Coefficient Atom+Function
|
||||
----- ------------ --------------- ----- ------------ ---------------
|
||||
11 1.732051 1 O dxy
|
||||
|
||||
|
||||
center of mass
|
||||
--------------
|
||||
x = 0.00000000 y = 0.00000000 z = 0.09751017
|
||||
|
||||
moments of inertia (a.u.)
|
||||
------------------
|
||||
6.315433940446 0.000000000000 0.000000000000
|
||||
0.000000000000 2.193636332720 0.000000000000
|
||||
0.000000000000 0.000000000000 4.121797607726
|
||||
|
||||
Mulliken analysis of the total density
|
||||
--------------------------------------
|
||||
|
||||
Atom Charge Shell Charges
|
||||
----------- ------ -------------------------------------------------------
|
||||
1 O 8 8.87 2.00 0.90 2.90 0.92 2.07 0.08
|
||||
2 H 1 0.57 0.46 0.10
|
||||
3 H 1 0.57 0.46 0.10
|
||||
|
||||
Multipole analysis of the density wrt the origin
|
||||
------------------------------------------------
|
||||
|
||||
L x y z total open nuclear
|
||||
- - - - ----- ---- -------
|
||||
0 0 0 0 0.000000 0.000000 10.000000
|
||||
|
||||
1 1 0 0 -0.000002 0.000000 0.000000
|
||||
1 0 1 0 0.000001 0.000000 0.000000
|
||||
1 0 0 1 -0.875296 0.000000 0.000000
|
||||
|
||||
2 2 0 0 -5.372336 0.000000 0.000000
|
||||
2 1 1 0 -0.000002 0.000000 0.000000
|
||||
2 1 0 1 0.000001 0.000000 0.000000
|
||||
2 0 2 0 -3.071804 0.000000 4.089795
|
||||
2 0 1 1 0.000000 0.000000 0.000000
|
||||
2 0 0 2 -4.444596 0.000000 1.960717
|
||||
|
||||
|
||||
Parallel integral file used 1 records with 0 large values
|
||||
|
||||
NWChem Gradients Module
|
||||
-----------------------
|
||||
|
||||
|
||||
|
||||
wavefunction = RHF
|
||||
|
||||
|
||||
|
||||
RHF ENERGY GRADIENTS
|
||||
|
||||
atom coordinates gradient
|
||||
x y z x y z
|
||||
1 O 0.000000 0.000000 0.221400 0.000001 0.000000 0.014490
|
||||
2 H 0.000000 1.429999 -0.885600 -0.000001 0.007296 -0.007245
|
||||
3 H 0.000000 -1.429999 -0.885600 -0.000000 -0.007296 -0.007245
|
||||
|
||||
----------------------------------------
|
||||
| Time | 1-e(secs) | 2-e(secs) |
|
||||
----------------------------------------
|
||||
| CPU | 0.00 | 0.07 |
|
||||
----------------------------------------
|
||||
| WALL | 0.00 | 0.03 |
|
||||
----------------------------------------
|
||||
|
||||
Task times cpu: 0.2s wall: 0.1s
|
||||
|
||||
|
||||
NWChem Input Module
|
||||
-------------------
|
||||
|
||||
|
||||
Summary of allocated global arrays
|
||||
-----------------------------------
|
||||
No active global arrays
|
||||
|
||||
|
||||
|
||||
GA Statistics for process 0
|
||||
------------------------------
|
||||
|
||||
create destroy get put acc scatter gather read&inc
|
||||
calls: 225 225 3182 894 878 0 0 68
|
||||
number of processes/call 1.00e+00 1.00e+00 1.00e+00 0.00e+00 0.00e+00
|
||||
bytes total: 8.62e+05 5.44e+05 1.23e+05 0.00e+00 0.00e+00 5.44e+02
|
||||
bytes remote: 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.00e+00
|
||||
Max memory consumed for GA by this process: 39432 bytes
|
||||
|
||||
MA_summarize_allocated_blocks: starting scan ...
|
||||
MA_summarize_allocated_blocks: scan completed: 0 heap blocks, 0 stack blocks
|
||||
MA usage statistics:
|
||||
|
||||
allocation statistics:
|
||||
heap stack
|
||||
---- -----
|
||||
current number of blocks 0 0
|
||||
maximum number of blocks 18 28
|
||||
current total bytes 0 0
|
||||
maximum total bytes 1060104 16000888
|
||||
maximum total K-bytes 1061 16001
|
||||
maximum total M-bytes 2 17
|
||||
|
||||
|
||||
CITATION
|
||||
--------
|
||||
Please cite the following reference when publishing
|
||||
results obtained with NWChem:
|
||||
|
||||
M. Valiev, E.J. Bylaska, N. Govind, K. Kowalski,
|
||||
T.P. Straatsma, H.J.J. van Dam, D. Wang, J. Nieplocha,
|
||||
E. Apra, T.L. Windus, W.A. de Jong
|
||||
"NWChem: a comprehensive and scalable open-source
|
||||
solution for large scale molecular simulations"
|
||||
Comput. Phys. Commun. 181, 1477 (2010)
|
||||
doi:10.1016/j.cpc.2010.04.018
|
||||
|
||||
AUTHORS
|
||||
-------
|
||||
E. Apra, E. J. Bylaska, W. A. de Jong, N. Govind, K. Kowalski,
|
||||
T. P. Straatsma, M. Valiev, H. J. J. van Dam, D. Wang, T. L. Windus,
|
||||
J. Hammond, J. Autschbach, K. Bhaskaran-Nair, J. Brabec, K. Lopata,
|
||||
S. A. Fischer, S. Krishnamoorthy, M. Jacquelin, W. Ma, M. Klemm, O. Villa,
|
||||
Y. Chen, V. Anisimov, F. Aquino, S. Hirata, M. T. Hackler, V. Konjkov,
|
||||
D. Mejia-Rodriguez, T. Risthaus, M. Malagoli, A. Marenich,
|
||||
A. Otero-de-la-Roza, J. Mullin, P. Nichols, R. Peverati, J. Pittner, Y. Zhao,
|
||||
P.-D. Fan, A. Fonari, M. J. Williamson, R. J. Harrison, J. R. Rehr,
|
||||
M. Dupuis, D. Silverstein, D. M. A. Smith, J. Nieplocha, V. Tipparaju,
|
||||
M. Krishnan, B. E. Van Kuiken, A. Vazquez-Mayagoitia, L. Jensen, M. Swart,
|
||||
Q. Wu, T. Van Voorhis, A. A. Auer, M. Nooijen, L. D. Crosby, E. Brown,
|
||||
G. Cisneros, G. I. Fann, H. Fruchtl, J. Garza, K. Hirao, R. A. Kendall,
|
||||
J. A. Nichols, K. Tsemekhman, K. Wolinski, J. Anchell, D. E. Bernholdt,
|
||||
P. Borowski, T. Clark, D. Clerc, H. Dachsel, M. J. O. Deegan, K. Dyall,
|
||||
D. Elwood, E. Glendening, M. Gutowski, A. C. Hess, J. Jaffe, B. G. Johnson,
|
||||
J. Ju, R. Kobayashi, R. Kutteh, Z. Lin, R. Littlefield, X. Long, B. Meng,
|
||||
T. Nakajima, S. Niu, L. Pollack, M. Rosing, K. Glaesemann, G. Sandrone,
|
||||
M. Stave, H. Taylor, G. Thomas, J. H. van Lenthe, A. T. Wong, Z. Zhang.
|
||||
|
||||
Total times cpu: 0.2s wall: 0.1s
|
||||
448
examples/COUPLE/lammps_nwchem/lammps_nwchem/nwchem_wrap.py
Normal file
448
examples/COUPLE/lammps_nwchem/lammps_nwchem/nwchem_wrap.py
Normal file
@ -0,0 +1,448 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
# http://lammps.sandia.gov, Sandia National Laboratories
|
||||
# Steve Plimpton, sjplimp@sandia.gov
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
# Syntax: nwchem_wrap.py file/zmq ao/pw input_template
|
||||
# file/zmg = messaging mode, must match LAMMPS messaging mode
|
||||
# ao/pw = basis set mode, selects between atom-centered and plane-wave
|
||||
# the input_template file must correspond to the appropriate basis set mode:
|
||||
# the "ao" mode supports the scf and dft modules in NWChem,
|
||||
# the "pw" mode supports the nwpw module.
|
||||
# input_template = NWChem input file used as template, must include a
|
||||
# "geometry" block with the atoms in the simulation, dummy
|
||||
# xyz coordinates should be included (but are not used).
|
||||
# Atom ordering must match LAMMPS input.
|
||||
|
||||
# wrapper on NWChem
|
||||
# receives message with list of coords
|
||||
# creates NWChem inputs
|
||||
# invokes NWChem to calculate self-consistent energy of that config
|
||||
# reads NWChem outputs
|
||||
# sends message with energy, forces, pressure to client
|
||||
|
||||
from __future__ import print_function
|
||||
import sys
|
||||
|
||||
version = sys.version_info[0]
|
||||
if version == 3:
|
||||
sys.exit("The CSlib python wrapper does not yet support python 3")
|
||||
|
||||
import subprocess
|
||||
import re
|
||||
import os
|
||||
import shutil
|
||||
from cslib import CSlib
|
||||
|
||||
# comment out 2nd line once 1st line is correct for your system
|
||||
|
||||
nwchemcmd = "mpirun -np 1 /usr/bin/nwchem nwchem_lammps.nw > "
|
||||
nwchemcmd = "touch tmp"
|
||||
|
||||
# enums matching FixClientMD class in LAMMPS
|
||||
|
||||
SETUP,STEP = range(1,2+1)
|
||||
DIM,PERIODICITY,ORIGIN,BOX,NATOMS,NTYPES,TYPES,COORDS,UNITS,CHARGE = range(1,10+1)
|
||||
FORCES,ENERGY,VIRIAL,ERROR = range(1,4+1)
|
||||
|
||||
# -------------------------------------
|
||||
# functions
|
||||
|
||||
# error message and exit
|
||||
|
||||
def error(txt):
|
||||
print("ERROR:",txt)
|
||||
sys.exit(1)
|
||||
|
||||
# -------------------------------------
|
||||
# read initial input file to setup problem
|
||||
# return natoms
|
||||
|
||||
def nwchem_setup_ao(input):
|
||||
|
||||
template = open(input,'r')
|
||||
|
||||
geometry_block = False
|
||||
natoms = 0
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and re.search("end",line):
|
||||
geometry_block = False
|
||||
if geometry_block and not re.match("#",line) :
|
||||
natoms += 1
|
||||
if re.search("geometry",line):
|
||||
geometry_block = True
|
||||
|
||||
return natoms
|
||||
|
||||
# -------------------------------------
|
||||
# write a new input file for NWChem
|
||||
# assumes the NWChem input geometry is to be specified in angstroms
|
||||
|
||||
def nwchem_input_write_ao(input,coords):
|
||||
|
||||
template = open(input,'r')
|
||||
new_input = open("nwchem_lammps.nw",'w')
|
||||
|
||||
geometry_block = False
|
||||
i = 0
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and not re.match("#",line) and re.search("end",line):
|
||||
geometry_block = False
|
||||
if os.path.exists("nwchem_lammps.movecs"):
|
||||
# The below is hacky, but one of these lines will be ignored
|
||||
# by NWChem depending on if the input file is for scf/dft.
|
||||
append = "\nscf\n vectors input nwchem_lammps.movecs\nend\n"
|
||||
append2 = "\ndft\n vectors input nwchem_lammps.movecs\nend\n"
|
||||
line = line + append + append2
|
||||
|
||||
if geometry_block and not re.match("#",line):
|
||||
x = coords[3*i+0]
|
||||
y = coords[3*i+1]
|
||||
z = coords[3*i+2]
|
||||
coord_string = " %g %g %g \n" % (x,y,z)
|
||||
atom_string = line.split()[0]
|
||||
line = atom_string + coord_string
|
||||
i += 1
|
||||
|
||||
if (not re.match("#",line)) and re.search("geometry",line):
|
||||
geometry_block = True
|
||||
line = "geometry units angstrom noautosym\n"
|
||||
|
||||
print(line,file=new_input,end='')
|
||||
|
||||
new_input.close()
|
||||
|
||||
# -------------------------------------
|
||||
# read a NWChem output nwchem_lammps.out file
|
||||
|
||||
def nwchem_read_ao(natoms, log):
|
||||
|
||||
nwchem_output = open(log, 'r')
|
||||
energy_pattern = r"Total \w+ energy"
|
||||
gradient_pattern = "x y z x y z"
|
||||
|
||||
eout = 0.0
|
||||
fout = []
|
||||
|
||||
while True:
|
||||
line = nwchem_output.readline()
|
||||
if not line: break
|
||||
|
||||
# pattern match for energy
|
||||
if re.search(energy_pattern,line):
|
||||
eout = float(line.split()[4])
|
||||
|
||||
# pattern match for forces
|
||||
if re.search(gradient_pattern, line):
|
||||
for i in range(natoms):
|
||||
line = nwchem_output.readline()
|
||||
forces = line.split()
|
||||
fout += [float(forces[5]), float(forces[6]), float(forces[7])]
|
||||
|
||||
# convert units
|
||||
hartree2eV = 27.21138602
|
||||
bohr2angstrom = 0.52917721092
|
||||
eout = eout * hartree2eV
|
||||
fout = [i * hartree2eV/bohr2angstrom for i in fout]
|
||||
print(eout)
|
||||
|
||||
return eout,fout
|
||||
|
||||
# -------------------------------------
|
||||
# read initial planewave input file to setup problem
|
||||
# return natoms,box
|
||||
def nwchem_setup_pw(input):
|
||||
|
||||
template = open(input,'r')
|
||||
|
||||
geometry_block = False
|
||||
system_block = False
|
||||
coord_pattern = r"^\s*\w{1,2}(?:\s+-?(?:\d+.?\d*|\d*.?\d+)){3}"
|
||||
natoms = 0
|
||||
box = []
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and re.search("system crystal",line):
|
||||
system_block = True
|
||||
for i in range(3):
|
||||
line = template.readline()
|
||||
line = re.sub(r'd|D', 'e', line)
|
||||
box += [float(line.split()[1])]
|
||||
|
||||
if geometry_block and not system_block and re.match("#",line) and re.search("end",line):
|
||||
geometry_block = False
|
||||
|
||||
if system_block and re.search("end",line):
|
||||
system_block = False
|
||||
|
||||
if geometry_block and not re.match("#",line) and re.search(coord_pattern,line):
|
||||
natoms += 1
|
||||
|
||||
if re.search("geometry",line) and not re.match("#",line):
|
||||
geometry_block = True
|
||||
|
||||
return natoms,box
|
||||
|
||||
# -------------------------------------
|
||||
# write a new planewave input file for NWChem
|
||||
# assumes the NWChem input geometry is to be specified fractional coordinates
|
||||
|
||||
def nwchem_input_write_pw(input,coords,box):
|
||||
|
||||
template = open(input,'r')
|
||||
new_input = open("nwchem_lammps.nw",'w')
|
||||
|
||||
writing_atoms = False
|
||||
geometry_block = False
|
||||
system_block = False
|
||||
coord_pattern = r"^\s*\w{1,2}(?:\s+-?(?:\d+.?\d*|\d*.?\d+)){3}"
|
||||
i = 0
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and re.search("system crystal",line):
|
||||
system_block = True
|
||||
|
||||
if geometry_block and not system_block and not re.match("#",line) and re.search("end",line):
|
||||
geometry_block = False
|
||||
if os.path.exists("nwchem_lammps.movecs"):
|
||||
append = "\nnwpw\n vectors input nwchem_lammps.movecs\nend\n"
|
||||
line = line + append
|
||||
|
||||
if system_block and re.search("end",line):
|
||||
system_block = False
|
||||
|
||||
if geometry_block and not re.match("#",line) and re.search(coord_pattern,line):
|
||||
x = coords[3*i+0] / box[0]
|
||||
y = coords[3*i+1] / box[1]
|
||||
z = coords[3*i+2] / box[2]
|
||||
coord_string = " %g %g %g \n" % (x,y,z)
|
||||
atom_string = line.split()[0]
|
||||
line = atom_string + coord_string
|
||||
i += 1
|
||||
|
||||
if re.search("geometry",line) and not re.match("#",line):
|
||||
geometry_block = True
|
||||
|
||||
print(line,file=new_input,end='')
|
||||
|
||||
new_input.close()
|
||||
|
||||
# -------------------------------------
|
||||
# read a NWChem output nwchem_lammps.out file for planewave calculation
|
||||
|
||||
def nwchem_read_pw(log):
|
||||
nw_output = open(log, 'r')
|
||||
|
||||
eout = 0.0
|
||||
sout = []
|
||||
fout = []
|
||||
reading_forces = False
|
||||
|
||||
while True:
|
||||
line = nw_output.readline()
|
||||
if not line: break
|
||||
|
||||
# pattern match for energy
|
||||
if re.search("PSPW energy",line):
|
||||
eout = float(line.split()[4])
|
||||
|
||||
# pattern match for forces
|
||||
if re.search("C\.O\.M", line):
|
||||
reading_forces = False
|
||||
if reading_forces:
|
||||
forces = line.split()
|
||||
fout += [float(forces[3]), float(forces[4]), float(forces[5])]
|
||||
if re.search("Ion Forces",line):
|
||||
reading_forces = True
|
||||
|
||||
# pattern match for stress
|
||||
if re.search("=== total gradient ===",line):
|
||||
stensor = []
|
||||
for i in range(3):
|
||||
line = nw_output.readline()
|
||||
line = line.replace("S ="," ")
|
||||
stress = line.split()
|
||||
stensor += [float(stress[1]), float(stress[2]), float(stress[3])]
|
||||
sxx = stensor[0]
|
||||
syy = stensor[4]
|
||||
szz = stensor[8]
|
||||
sxy = 0.5 * (float(stensor[1]) + float(stensor[3]))
|
||||
sxz = 0.5 * (stensor[2] + stensor[6])
|
||||
syz = 0.5 * (stensor[5] + stensor[7])
|
||||
sout = [sxx,syy,szz,sxy,sxz,syz]
|
||||
|
||||
# convert units
|
||||
hartree2eV = 27.21138602
|
||||
bohr2angstrom = 0.52917721092
|
||||
austress2bar = 294210156.97
|
||||
eout = eout * hartree2eV
|
||||
fout = [i * hartree2eV/bohr2angstrom for i in fout]
|
||||
sout = [i * austress2bar for i in sout]
|
||||
|
||||
return eout,fout,sout
|
||||
|
||||
# -------------------------------------
|
||||
# main program
|
||||
|
||||
# command-line args
|
||||
#
|
||||
if len(sys.argv) != 4:
|
||||
print("Syntax: python nwchem_wrap.py file/zmq ao/pw input_template")
|
||||
sys.exit(1)
|
||||
|
||||
comm_mode = sys.argv[1]
|
||||
basis_type = sys.argv[2]
|
||||
input_template = sys.argv[3]
|
||||
|
||||
if comm_mode == "file": cs = CSlib(1,comm_mode,"tmp.couple",None)
|
||||
elif comm_mode == "zmq": cs = CSlib(1,comm_mode,"*:5555",None)
|
||||
else:
|
||||
print("Syntax: python nwchem_wrap.py file/zmq")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
natoms = 0
|
||||
box = []
|
||||
if basis_type == "ao":
|
||||
natoms = nwchem_setup_ao(input_template)
|
||||
elif basis_type == "pw":
|
||||
natoms,box = nwchem_setup_pw(input_template)
|
||||
|
||||
# initial message for AIMD protocol
|
||||
|
||||
msgID,nfield,fieldID,fieldtype,fieldlen = cs.recv()
|
||||
if msgID != 0: error("Bad initial client/server handshake")
|
||||
protocol = cs.unpack_string(1)
|
||||
if protocol != "md": error("Mismatch in client/server protocol")
|
||||
cs.send(0,0)
|
||||
|
||||
# endless server loop
|
||||
|
||||
i = 0
|
||||
if not os.path.exists("nwchem_logs"):
|
||||
os.mkdir("nwchem_logs")
|
||||
|
||||
while 1:
|
||||
|
||||
# recv message from client
|
||||
# msgID = 0 = all-done message
|
||||
|
||||
msgID,nfield,fieldID,fieldtype,fieldlen = cs.recv()
|
||||
if msgID < 0: break
|
||||
|
||||
# SETUP receive at beginning of each run
|
||||
# required fields: DIM, PERIODICITY, ORIGIN, BOX,
|
||||
# NATOMS, COORDS
|
||||
# optional fields: others in enum above, but NWChem ignores them
|
||||
|
||||
if msgID == SETUP:
|
||||
|
||||
origin = []
|
||||
box_lmp = []
|
||||
natoms_recv = ntypes_recv = 0
|
||||
types = []
|
||||
coords = []
|
||||
|
||||
for field in fieldID:
|
||||
if field == DIM:
|
||||
dim = cs.unpack_int(DIM)
|
||||
if dim != 3: error("NWChem only performs 3d simulations")
|
||||
elif field == PERIODICITY:
|
||||
periodicity = cs.unpack(PERIODICITY,1)
|
||||
if basis_type == "ao":
|
||||
if periodicity[0] or periodicity[1] or periodicity[2]:
|
||||
error("NWChem AO basis wrapper only currently supports fully aperiodic systems")
|
||||
elif basis_type == "pw":
|
||||
if not periodicity[0] or not periodicity[1] or not periodicity[2]:
|
||||
error("NWChem PW basis wrapper only currently supports fully periodic systems")
|
||||
elif field == ORIGIN:
|
||||
origin = cs.unpack(ORIGIN,1)
|
||||
elif field == BOX:
|
||||
box_lmp = cs.unpack(BOX,1)
|
||||
if (basis_type == "pw"):
|
||||
if (box[0] != box_lmp[0] or box[1] != box_lmp[4] or box[2] != box_lmp[8]):
|
||||
error("NWChem wrapper mismatch in box dimensions")
|
||||
elif field == NATOMS:
|
||||
natoms_recv = cs.unpack_int(NATOMS)
|
||||
if natoms != natoms_recv:
|
||||
error("NWChem wrapper mismatch in number of atoms")
|
||||
elif field == COORDS:
|
||||
coords = cs.unpack(COORDS,1)
|
||||
|
||||
if not origin or not box_lmp or not natoms or not coords:
|
||||
error("Required NWChem wrapper setup field not received");
|
||||
|
||||
# STEP receive at each timestep of run or minimization
|
||||
# required fields: COORDS
|
||||
# optional fields: ORIGIN, BOX
|
||||
|
||||
elif msgID == STEP:
|
||||
|
||||
coords = []
|
||||
|
||||
for field in fieldID:
|
||||
if field == COORDS:
|
||||
coords = cs.unpack(COORDS,1)
|
||||
|
||||
if not coords: error("Required NWChem wrapper step field not received");
|
||||
|
||||
else: error("NWChem wrapper received unrecognized message")
|
||||
|
||||
# unpack coords from client
|
||||
# create NWChem input
|
||||
|
||||
if basis_type == "ao":
|
||||
nwchem_input_write_ao(input_template,coords)
|
||||
elif basis_type == "pw":
|
||||
nwchem_input_write_pw(input_template,coords,box)
|
||||
|
||||
# invoke NWChem
|
||||
|
||||
i += 1
|
||||
log = "nwchem_lammps.out"
|
||||
archive = "nwchem_logs/nwchem_lammps" + str(i) + ".out"
|
||||
cmd = nwchemcmd + log
|
||||
print("\nLaunching NWChem ...")
|
||||
print(cmd)
|
||||
subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True)
|
||||
|
||||
shutil.copyfile(log,archive)
|
||||
|
||||
# process NWChem output
|
||||
|
||||
if basis_type == "ao":
|
||||
energy,forces = nwchem_read_ao(natoms,log)
|
||||
virial = [0,0,0,0,0,0]
|
||||
elif basis_type == "pw":
|
||||
energy,forces,virial = nwchem_read_pw(log)
|
||||
|
||||
# return forces, energy to client
|
||||
cs.send(msgID,3)
|
||||
cs.pack(FORCES,4,3*natoms,forces)
|
||||
cs.pack_double(ENERGY,energy)
|
||||
cs.pack(VIRIAL,4,6,virial)
|
||||
|
||||
# final reply to client
|
||||
|
||||
cs.send(0,0)
|
||||
|
||||
# clean-up
|
||||
|
||||
del cs
|
||||
15
examples/COUPLE/lammps_nwchem/lammps_nwchem/planewave/data.W
Normal file
15
examples/COUPLE/lammps_nwchem/lammps_nwchem/planewave/data.W
Normal file
@ -0,0 +1,15 @@
|
||||
LAMMPS W data file
|
||||
|
||||
2 atoms
|
||||
|
||||
1 atom types
|
||||
|
||||
0.0 3.16 xlo xhi
|
||||
0.0 3.16 ylo yhi
|
||||
0.0 3.16 zlo zhi
|
||||
|
||||
Atoms
|
||||
|
||||
1 1 0.000 0.000 0.000
|
||||
2 1 1.58 1.58 1.58
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
# small W unit cell for use with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then &
|
||||
"message client md file tmp.couple" &
|
||||
elif "${mode} == zmq" &
|
||||
"message client md zmq localhost:5555" &
|
||||
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
read_data data.W
|
||||
mass 1 183.85
|
||||
|
||||
replicate $x $y $z
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
|
||||
@ -0,0 +1,76 @@
|
||||
LAMMPS (18 Sep 2018)
|
||||
# small W unit cell for use with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then "message client md file tmp.couple" elif "${mode} == zmq" "message client md zmq localhost:5555"
|
||||
message client md file tmp.couple
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
read_data data.W
|
||||
orthogonal box = (0 0 0) to (3.16 3.16 3.16)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
reading atoms ...
|
||||
2 atoms
|
||||
mass 1 183.85
|
||||
|
||||
replicate $x $y $z
|
||||
replicate 1 $y $z
|
||||
replicate 1 1 $z
|
||||
replicate 1 1 1
|
||||
orthogonal box = (0 0 0) to (3.16 3.16 3.16)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
2 atoms
|
||||
Time spent = 0.000187325 secs
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
Per MPI rank memory allocation (min/avg/max) = 1.8 | 1.8 | 1.8 Mbytes
|
||||
Step Temp E_pair E_mol TotEng Press
|
||||
0 300 0 0 -549.75686 36815830
|
||||
1 300 0 0 -549.75686 36815830
|
||||
2 300 0 0 -549.75686 36815830
|
||||
3 300 0 0 -549.75686 36815830
|
||||
Loop time of 0.400933 on 1 procs for 3 steps with 2 atoms
|
||||
|
||||
Performance: 0.646 ns/day, 37.123 hours/ns, 7.483 timesteps/s
|
||||
0.1% CPU use with 1 MPI tasks x 1 OpenMP threads
|
||||
|
||||
MPI task timing breakdown:
|
||||
Section | min time | avg time | max time |%varavg| %total
|
||||
---------------------------------------------------------------
|
||||
Pair | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Neigh | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Comm | 4.755e-06 | 4.755e-06 | 4.755e-06 | 0.0 | 0.00
|
||||
Output | 0.00010114 | 0.00010114 | 0.00010114 | 0.0 | 0.03
|
||||
Modify | 0.40082 | 0.40082 | 0.40082 | 0.0 | 99.97
|
||||
Other | | 1.232e-05 | | | 0.00
|
||||
|
||||
Nlocal: 2 ave 2 max 2 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Nghost: 7 ave 7 max 7 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Neighs: 0 ave 0 max 0 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
|
||||
Total # of neighbors = 0
|
||||
Ave neighs/atom = 0
|
||||
Neighbor list builds = 0
|
||||
Dangerous builds not checked
|
||||
|
||||
Total wall time: 0:00:09
|
||||
File diff suppressed because it is too large
Load Diff
28
examples/COUPLE/lammps_nwchem/lammps_nwchem/planewave/w.nw
Normal file
28
examples/COUPLE/lammps_nwchem/lammps_nwchem/planewave/w.nw
Normal file
@ -0,0 +1,28 @@
|
||||
echo
|
||||
|
||||
#**** Enter the geometry using fractional coordinates ****
|
||||
geometry units angstrom noautosym
|
||||
system crystal
|
||||
lat_a 3.16d0
|
||||
lat_b 3.16d0
|
||||
lat_c 3.16d0
|
||||
end
|
||||
W 0.0 0.0 0.0
|
||||
W 0.5 0.5 0.5
|
||||
end
|
||||
|
||||
#***** setup the nwpw gamma point code ****
|
||||
nwpw
|
||||
simulation_cell
|
||||
ngrid 16 16 16
|
||||
end
|
||||
ewald_ncut 8
|
||||
mulliken
|
||||
lcao #old default
|
||||
end
|
||||
|
||||
nwpw
|
||||
tolerances 1.0d-9 1.0d-9
|
||||
end
|
||||
|
||||
task pspw stress
|
||||
448
examples/COUPLE/lammps_nwchem/nwchem_wrap.py
Normal file
448
examples/COUPLE/lammps_nwchem/nwchem_wrap.py
Normal file
@ -0,0 +1,448 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
# http://lammps.sandia.gov, Sandia National Laboratories
|
||||
# Steve Plimpton, sjplimp@sandia.gov
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
# Syntax: nwchem_wrap.py file/zmq ao/pw input_template
|
||||
# file/zmg = messaging mode, must match LAMMPS messaging mode
|
||||
# ao/pw = basis set mode, selects between atom-centered and plane-wave
|
||||
# the input_template file must correspond to the appropriate basis set mode:
|
||||
# the "ao" mode supports the scf and dft modules in NWChem,
|
||||
# the "pw" mode supports the nwpw module.
|
||||
# input_template = NWChem input file used as template, must include a
|
||||
# "geometry" block with the atoms in the simulation, dummy
|
||||
# xyz coordinates should be included (but are not used).
|
||||
# Atom ordering must match LAMMPS input.
|
||||
|
||||
# wrapper on NWChem
|
||||
# receives message with list of coords
|
||||
# creates NWChem inputs
|
||||
# invokes NWChem to calculate self-consistent energy of that config
|
||||
# reads NWChem outputs
|
||||
# sends message with energy, forces, pressure to client
|
||||
|
||||
from __future__ import print_function
|
||||
import sys
|
||||
|
||||
version = sys.version_info[0]
|
||||
if version == 3:
|
||||
sys.exit("The CSlib python wrapper does not yet support python 3")
|
||||
|
||||
import subprocess
|
||||
import re
|
||||
import os
|
||||
import shutil
|
||||
from cslib import CSlib
|
||||
|
||||
# comment out 2nd line once 1st line is correct for your system
|
||||
|
||||
nwchemcmd = "mpirun -np 1 /usr/bin/nwchem nwchem_lammps.nw > "
|
||||
nwchemcmd = "touch tmp"
|
||||
|
||||
# enums matching FixClientMD class in LAMMPS
|
||||
|
||||
SETUP,STEP = range(1,2+1)
|
||||
DIM,PERIODICITY,ORIGIN,BOX,NATOMS,NTYPES,TYPES,COORDS,UNITS,CHARGE = range(1,10+1)
|
||||
FORCES,ENERGY,VIRIAL,ERROR = range(1,4+1)
|
||||
|
||||
# -------------------------------------
|
||||
# functions
|
||||
|
||||
# error message and exit
|
||||
|
||||
def error(txt):
|
||||
print("ERROR:",txt)
|
||||
sys.exit(1)
|
||||
|
||||
# -------------------------------------
|
||||
# read initial input file to setup problem
|
||||
# return natoms
|
||||
|
||||
def nwchem_setup_ao(input):
|
||||
|
||||
template = open(input,'r')
|
||||
|
||||
geometry_block = False
|
||||
natoms = 0
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and re.search("end",line):
|
||||
geometry_block = False
|
||||
if geometry_block and not re.match("#",line) :
|
||||
natoms += 1
|
||||
if re.search("geometry",line):
|
||||
geometry_block = True
|
||||
|
||||
return natoms
|
||||
|
||||
# -------------------------------------
|
||||
# write a new input file for NWChem
|
||||
# assumes the NWChem input geometry is to be specified in angstroms
|
||||
|
||||
def nwchem_input_write_ao(input,coords):
|
||||
|
||||
template = open(input,'r')
|
||||
new_input = open("nwchem_lammps.nw",'w')
|
||||
|
||||
geometry_block = False
|
||||
i = 0
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and not re.match("#",line) and re.search("end",line):
|
||||
geometry_block = False
|
||||
if os.path.exists("nwchem_lammps.movecs"):
|
||||
# The below is hacky, but one of these lines will be ignored
|
||||
# by NWChem depending on if the input file is for scf/dft.
|
||||
append = "\nscf\n vectors input nwchem_lammps.movecs\nend\n"
|
||||
append2 = "\ndft\n vectors input nwchem_lammps.movecs\nend\n"
|
||||
line = line + append + append2
|
||||
|
||||
if geometry_block and not re.match("#",line):
|
||||
x = coords[3*i+0]
|
||||
y = coords[3*i+1]
|
||||
z = coords[3*i+2]
|
||||
coord_string = " %g %g %g \n" % (x,y,z)
|
||||
atom_string = line.split()[0]
|
||||
line = atom_string + coord_string
|
||||
i += 1
|
||||
|
||||
if (not re.match("#",line)) and re.search("geometry",line):
|
||||
geometry_block = True
|
||||
line = "geometry units angstrom noautosym\n"
|
||||
|
||||
print(line,file=new_input,end='')
|
||||
|
||||
new_input.close()
|
||||
|
||||
# -------------------------------------
|
||||
# read a NWChem output nwchem_lammps.out file
|
||||
|
||||
def nwchem_read_ao(natoms, log):
|
||||
|
||||
nwchem_output = open(log, 'r')
|
||||
energy_pattern = r"Total \w+ energy"
|
||||
gradient_pattern = "x y z x y z"
|
||||
|
||||
eout = 0.0
|
||||
fout = []
|
||||
|
||||
while True:
|
||||
line = nwchem_output.readline()
|
||||
if not line: break
|
||||
|
||||
# pattern match for energy
|
||||
if re.search(energy_pattern,line):
|
||||
eout = float(line.split()[4])
|
||||
|
||||
# pattern match for forces
|
||||
if re.search(gradient_pattern, line):
|
||||
for i in range(natoms):
|
||||
line = nwchem_output.readline()
|
||||
forces = line.split()
|
||||
fout += [float(forces[5]), float(forces[6]), float(forces[7])]
|
||||
|
||||
# convert units
|
||||
hartree2eV = 27.21138602
|
||||
bohr2angstrom = 0.52917721092
|
||||
eout = eout * hartree2eV
|
||||
fout = [i * hartree2eV/bohr2angstrom for i in fout]
|
||||
print(eout)
|
||||
|
||||
return eout,fout
|
||||
|
||||
# -------------------------------------
|
||||
# read initial planewave input file to setup problem
|
||||
# return natoms,box
|
||||
def nwchem_setup_pw(input):
|
||||
|
||||
template = open(input,'r')
|
||||
|
||||
geometry_block = False
|
||||
system_block = False
|
||||
coord_pattern = r"^\s*\w{1,2}(?:\s+-?(?:\d+.?\d*|\d*.?\d+)){3}"
|
||||
natoms = 0
|
||||
box = []
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and re.search("system crystal",line):
|
||||
system_block = True
|
||||
for i in range(3):
|
||||
line = template.readline()
|
||||
line = re.sub(r'd|D', 'e', line)
|
||||
box += [float(line.split()[1])]
|
||||
|
||||
if geometry_block and not system_block and re.match("#",line) and re.search("end",line):
|
||||
geometry_block = False
|
||||
|
||||
if system_block and re.search("end",line):
|
||||
system_block = False
|
||||
|
||||
if geometry_block and not re.match("#",line) and re.search(coord_pattern,line):
|
||||
natoms += 1
|
||||
|
||||
if re.search("geometry",line) and not re.match("#",line):
|
||||
geometry_block = True
|
||||
|
||||
return natoms,box
|
||||
|
||||
# -------------------------------------
|
||||
# write a new planewave input file for NWChem
|
||||
# assumes the NWChem input geometry is to be specified fractional coordinates
|
||||
|
||||
def nwchem_input_write_pw(input,coords,box):
|
||||
|
||||
template = open(input,'r')
|
||||
new_input = open("nwchem_lammps.nw",'w')
|
||||
|
||||
writing_atoms = False
|
||||
geometry_block = False
|
||||
system_block = False
|
||||
coord_pattern = r"^\s*\w{1,2}(?:\s+-?(?:\d+.?\d*|\d*.?\d+)){3}"
|
||||
i = 0
|
||||
|
||||
while True:
|
||||
line = template.readline()
|
||||
if not line: break
|
||||
|
||||
if geometry_block and re.search("system crystal",line):
|
||||
system_block = True
|
||||
|
||||
if geometry_block and not system_block and not re.match("#",line) and re.search("end",line):
|
||||
geometry_block = False
|
||||
if os.path.exists("nwchem_lammps.movecs"):
|
||||
append = "\nnwpw\n vectors input nwchem_lammps.movecs\nend\n"
|
||||
line = line + append
|
||||
|
||||
if system_block and re.search("end",line):
|
||||
system_block = False
|
||||
|
||||
if geometry_block and not re.match("#",line) and re.search(coord_pattern,line):
|
||||
x = coords[3*i+0] / box[0]
|
||||
y = coords[3*i+1] / box[1]
|
||||
z = coords[3*i+2] / box[2]
|
||||
coord_string = " %g %g %g \n" % (x,y,z)
|
||||
atom_string = line.split()[0]
|
||||
line = atom_string + coord_string
|
||||
i += 1
|
||||
|
||||
if re.search("geometry",line) and not re.match("#",line):
|
||||
geometry_block = True
|
||||
|
||||
print(line,file=new_input,end='')
|
||||
|
||||
new_input.close()
|
||||
|
||||
# -------------------------------------
|
||||
# read a NWChem output nwchem_lammps.out file for planewave calculation
|
||||
|
||||
def nwchem_read_pw(log):
|
||||
nw_output = open(log, 'r')
|
||||
|
||||
eout = 0.0
|
||||
sout = []
|
||||
fout = []
|
||||
reading_forces = False
|
||||
|
||||
while True:
|
||||
line = nw_output.readline()
|
||||
if not line: break
|
||||
|
||||
# pattern match for energy
|
||||
if re.search("PSPW energy",line):
|
||||
eout = float(line.split()[4])
|
||||
|
||||
# pattern match for forces
|
||||
if re.search("C\.O\.M", line):
|
||||
reading_forces = False
|
||||
if reading_forces:
|
||||
forces = line.split()
|
||||
fout += [float(forces[3]), float(forces[4]), float(forces[5])]
|
||||
if re.search("Ion Forces",line):
|
||||
reading_forces = True
|
||||
|
||||
# pattern match for stress
|
||||
if re.search("=== total gradient ===",line):
|
||||
stensor = []
|
||||
for i in range(3):
|
||||
line = nw_output.readline()
|
||||
line = line.replace("S ="," ")
|
||||
stress = line.split()
|
||||
stensor += [float(stress[1]), float(stress[2]), float(stress[3])]
|
||||
sxx = stensor[0]
|
||||
syy = stensor[4]
|
||||
szz = stensor[8]
|
||||
sxy = 0.5 * (float(stensor[1]) + float(stensor[3]))
|
||||
sxz = 0.5 * (stensor[2] + stensor[6])
|
||||
syz = 0.5 * (stensor[5] + stensor[7])
|
||||
sout = [sxx,syy,szz,sxy,sxz,syz]
|
||||
|
||||
# convert units
|
||||
hartree2eV = 27.21138602
|
||||
bohr2angstrom = 0.52917721092
|
||||
austress2bar = 294210156.97
|
||||
eout = eout * hartree2eV
|
||||
fout = [i * hartree2eV/bohr2angstrom for i in fout]
|
||||
sout = [i * austress2bar for i in sout]
|
||||
|
||||
return eout,fout,sout
|
||||
|
||||
# -------------------------------------
|
||||
# main program
|
||||
|
||||
# command-line args
|
||||
#
|
||||
if len(sys.argv) != 4:
|
||||
print("Syntax: python nwchem_wrap.py file/zmq ao/pw input_template")
|
||||
sys.exit(1)
|
||||
|
||||
comm_mode = sys.argv[1]
|
||||
basis_type = sys.argv[2]
|
||||
input_template = sys.argv[3]
|
||||
|
||||
if comm_mode == "file": cs = CSlib(1,comm_mode,"tmp.couple",None)
|
||||
elif comm_mode == "zmq": cs = CSlib(1,comm_mode,"*:5555",None)
|
||||
else:
|
||||
print("Syntax: python nwchem_wrap.py file/zmq")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
natoms = 0
|
||||
box = []
|
||||
if basis_type == "ao":
|
||||
natoms = nwchem_setup_ao(input_template)
|
||||
elif basis_type == "pw":
|
||||
natoms,box = nwchem_setup_pw(input_template)
|
||||
|
||||
# initial message for AIMD protocol
|
||||
|
||||
msgID,nfield,fieldID,fieldtype,fieldlen = cs.recv()
|
||||
if msgID != 0: error("Bad initial client/server handshake")
|
||||
protocol = cs.unpack_string(1)
|
||||
if protocol != "md": error("Mismatch in client/server protocol")
|
||||
cs.send(0,0)
|
||||
|
||||
# endless server loop
|
||||
|
||||
i = 0
|
||||
if not os.path.exists("nwchem_logs"):
|
||||
os.mkdir("nwchem_logs")
|
||||
|
||||
while 1:
|
||||
|
||||
# recv message from client
|
||||
# msgID = 0 = all-done message
|
||||
|
||||
msgID,nfield,fieldID,fieldtype,fieldlen = cs.recv()
|
||||
if msgID < 0: break
|
||||
|
||||
# SETUP receive at beginning of each run
|
||||
# required fields: DIM, PERIODICITY, ORIGIN, BOX,
|
||||
# NATOMS, COORDS
|
||||
# optional fields: others in enum above, but NWChem ignores them
|
||||
|
||||
if msgID == SETUP:
|
||||
|
||||
origin = []
|
||||
box_lmp = []
|
||||
natoms_recv = ntypes_recv = 0
|
||||
types = []
|
||||
coords = []
|
||||
|
||||
for field in fieldID:
|
||||
if field == DIM:
|
||||
dim = cs.unpack_int(DIM)
|
||||
if dim != 3: error("NWChem only performs 3d simulations")
|
||||
elif field == PERIODICITY:
|
||||
periodicity = cs.unpack(PERIODICITY,1)
|
||||
if basis_type == "ao":
|
||||
if periodicity[0] or periodicity[1] or periodicity[2]:
|
||||
error("NWChem AO basis wrapper only currently supports fully aperiodic systems")
|
||||
elif basis_type == "pw":
|
||||
if not periodicity[0] or not periodicity[1] or not periodicity[2]:
|
||||
error("NWChem PW basis wrapper only currently supports fully periodic systems")
|
||||
elif field == ORIGIN:
|
||||
origin = cs.unpack(ORIGIN,1)
|
||||
elif field == BOX:
|
||||
box_lmp = cs.unpack(BOX,1)
|
||||
if (basis_type == "pw"):
|
||||
if (box[0] != box_lmp[0] or box[1] != box_lmp[4] or box[2] != box_lmp[8]):
|
||||
error("NWChem wrapper mismatch in box dimensions")
|
||||
elif field == NATOMS:
|
||||
natoms_recv = cs.unpack_int(NATOMS)
|
||||
if natoms != natoms_recv:
|
||||
error("NWChem wrapper mismatch in number of atoms")
|
||||
elif field == COORDS:
|
||||
coords = cs.unpack(COORDS,1)
|
||||
|
||||
if not origin or not box_lmp or not natoms or not coords:
|
||||
error("Required NWChem wrapper setup field not received");
|
||||
|
||||
# STEP receive at each timestep of run or minimization
|
||||
# required fields: COORDS
|
||||
# optional fields: ORIGIN, BOX
|
||||
|
||||
elif msgID == STEP:
|
||||
|
||||
coords = []
|
||||
|
||||
for field in fieldID:
|
||||
if field == COORDS:
|
||||
coords = cs.unpack(COORDS,1)
|
||||
|
||||
if not coords: error("Required NWChem wrapper step field not received");
|
||||
|
||||
else: error("NWChem wrapper received unrecognized message")
|
||||
|
||||
# unpack coords from client
|
||||
# create NWChem input
|
||||
|
||||
if basis_type == "ao":
|
||||
nwchem_input_write_ao(input_template,coords)
|
||||
elif basis_type == "pw":
|
||||
nwchem_input_write_pw(input_template,coords,box)
|
||||
|
||||
# invoke NWChem
|
||||
|
||||
i += 1
|
||||
log = "nwchem_lammps.out"
|
||||
archive = "nwchem_logs/nwchem_lammps" + str(i) + ".out"
|
||||
cmd = nwchemcmd + log
|
||||
print("\nLaunching NWChem ...")
|
||||
print(cmd)
|
||||
subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True)
|
||||
|
||||
shutil.copyfile(log,archive)
|
||||
|
||||
# process NWChem output
|
||||
|
||||
if basis_type == "ao":
|
||||
energy,forces = nwchem_read_ao(natoms,log)
|
||||
virial = [0,0,0,0,0,0]
|
||||
elif basis_type == "pw":
|
||||
energy,forces,virial = nwchem_read_pw(log)
|
||||
|
||||
# return forces, energy to client
|
||||
cs.send(msgID,3)
|
||||
cs.pack(FORCES,4,3*natoms,forces)
|
||||
cs.pack_double(ENERGY,energy)
|
||||
cs.pack(VIRIAL,4,6,virial)
|
||||
|
||||
# final reply to client
|
||||
|
||||
cs.send(0,0)
|
||||
|
||||
# clean-up
|
||||
|
||||
del cs
|
||||
15
examples/COUPLE/lammps_nwchem/planewave/data.W
Normal file
15
examples/COUPLE/lammps_nwchem/planewave/data.W
Normal file
@ -0,0 +1,15 @@
|
||||
LAMMPS W data file
|
||||
|
||||
2 atoms
|
||||
|
||||
1 atom types
|
||||
|
||||
0.0 3.16 xlo xhi
|
||||
0.0 3.16 ylo yhi
|
||||
0.0 3.16 zlo zhi
|
||||
|
||||
Atoms
|
||||
|
||||
1 1 0.000 0.000 0.000
|
||||
2 1 1.58 1.58 1.58
|
||||
|
||||
34
examples/COUPLE/lammps_nwchem/planewave/in.client.W
Normal file
34
examples/COUPLE/lammps_nwchem/planewave/in.client.W
Normal file
@ -0,0 +1,34 @@
|
||||
# small W unit cell for use with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then &
|
||||
"message client md file tmp.couple" &
|
||||
elif "${mode} == zmq" &
|
||||
"message client md zmq localhost:5555" &
|
||||
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
read_data data.W
|
||||
mass 1 183.85
|
||||
|
||||
replicate $x $y $z
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
|
||||
76
examples/COUPLE/lammps_nwchem/planewave/log.client.output
Normal file
76
examples/COUPLE/lammps_nwchem/planewave/log.client.output
Normal file
@ -0,0 +1,76 @@
|
||||
LAMMPS (18 Sep 2018)
|
||||
# small W unit cell for use with NWChem
|
||||
|
||||
variable mode index file
|
||||
|
||||
if "${mode} == file" then "message client md file tmp.couple" elif "${mode} == zmq" "message client md zmq localhost:5555"
|
||||
message client md file tmp.couple
|
||||
variable x index 1
|
||||
variable y index 1
|
||||
variable z index 1
|
||||
|
||||
units metal
|
||||
atom_style atomic
|
||||
atom_modify sort 0 0.0 map yes
|
||||
|
||||
read_data data.W
|
||||
orthogonal box = (0 0 0) to (3.16 3.16 3.16)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
reading atoms ...
|
||||
2 atoms
|
||||
mass 1 183.85
|
||||
|
||||
replicate $x $y $z
|
||||
replicate 1 $y $z
|
||||
replicate 1 1 $z
|
||||
replicate 1 1 1
|
||||
orthogonal box = (0 0 0) to (3.16 3.16 3.16)
|
||||
1 by 1 by 1 MPI processor grid
|
||||
2 atoms
|
||||
Time spent = 0.000187325 secs
|
||||
|
||||
velocity all create 300.0 87287 loop geom
|
||||
|
||||
neighbor 0.3 bin
|
||||
neigh_modify delay 0 every 10 check no
|
||||
|
||||
fix 1 all nve
|
||||
fix 2 all client/md
|
||||
fix_modify 2 energy yes
|
||||
|
||||
thermo 1
|
||||
run 3
|
||||
Per MPI rank memory allocation (min/avg/max) = 1.8 | 1.8 | 1.8 Mbytes
|
||||
Step Temp E_pair E_mol TotEng Press
|
||||
0 300 0 0 -549.75686 36815830
|
||||
1 300 0 0 -549.75686 36815830
|
||||
2 300 0 0 -549.75686 36815830
|
||||
3 300 0 0 -549.75686 36815830
|
||||
Loop time of 0.400933 on 1 procs for 3 steps with 2 atoms
|
||||
|
||||
Performance: 0.646 ns/day, 37.123 hours/ns, 7.483 timesteps/s
|
||||
0.1% CPU use with 1 MPI tasks x 1 OpenMP threads
|
||||
|
||||
MPI task timing breakdown:
|
||||
Section | min time | avg time | max time |%varavg| %total
|
||||
---------------------------------------------------------------
|
||||
Pair | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Neigh | 0 | 0 | 0 | 0.0 | 0.00
|
||||
Comm | 4.755e-06 | 4.755e-06 | 4.755e-06 | 0.0 | 0.00
|
||||
Output | 0.00010114 | 0.00010114 | 0.00010114 | 0.0 | 0.03
|
||||
Modify | 0.40082 | 0.40082 | 0.40082 | 0.0 | 99.97
|
||||
Other | | 1.232e-05 | | | 0.00
|
||||
|
||||
Nlocal: 2 ave 2 max 2 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Nghost: 7 ave 7 max 7 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
Neighs: 0 ave 0 max 0 min
|
||||
Histogram: 1 0 0 0 0 0 0 0 0 0
|
||||
|
||||
Total # of neighbors = 0
|
||||
Ave neighs/atom = 0
|
||||
Neighbor list builds = 0
|
||||
Dangerous builds not checked
|
||||
|
||||
Total wall time: 0:00:09
|
||||
2305
examples/COUPLE/lammps_nwchem/planewave/nwchem_lammps.out
Normal file
2305
examples/COUPLE/lammps_nwchem/planewave/nwchem_lammps.out
Normal file
File diff suppressed because it is too large
Load Diff
28
examples/COUPLE/lammps_nwchem/planewave/w.nw
Normal file
28
examples/COUPLE/lammps_nwchem/planewave/w.nw
Normal file
@ -0,0 +1,28 @@
|
||||
echo
|
||||
|
||||
#**** Enter the geometry using fractional coordinates ****
|
||||
geometry units angstrom noautosym
|
||||
system crystal
|
||||
lat_a 3.16d0
|
||||
lat_b 3.16d0
|
||||
lat_c 3.16d0
|
||||
end
|
||||
W 0.0 0.0 0.0
|
||||
W 0.5 0.5 0.5
|
||||
end
|
||||
|
||||
#***** setup the nwpw gamma point code ****
|
||||
nwpw
|
||||
simulation_cell
|
||||
ngrid 16 16 16
|
||||
end
|
||||
ewald_ncut 8
|
||||
mulliken
|
||||
lcao #old default
|
||||
end
|
||||
|
||||
nwpw
|
||||
tolerances 1.0d-9 1.0d-9
|
||||
end
|
||||
|
||||
task pspw stress
|
||||
Reference in New Issue
Block a user