Difference between revisions of "Code:libnwchem"

From Predictive Chemistry
Jump to: navigation, search
(Obtaining)
m (Compilation)
Line 68: Line 68:
 
export MPI_LIB=/apps/openmpi/1.4.5/lib
 
export MPI_LIB=/apps/openmpi/1.4.5/lib
 
export MPI_INCLUDE=/apps/openmpi/1.4.5/include
 
export MPI_INCLUDE=/apps/openmpi/1.4.5/include
export LIBMPI="-lpthread -lmpi_f90 -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lrdmacm -libverbs -lpsm_infinipath -lnuma -ldl -Wl,--export-dynamic -lnsl -lutil -lm -ldl"
+
export LIBMPI="-lpthread -lmpi_f90 -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lrdmacm -libverbs
  +
-lpsm_infinipath -lnuma -ldl -Wl,--export-dynamic -lnsl -lutil -lm -ldl"
   
 
export ARMCI_NETWORK=OPENIB
 
export ARMCI_NETWORK=OPENIB
Line 79: Line 79:
 
export CFLAGS="-O2 -fPIC"
 
export CFLAGS="-O2 -fPIC"
 
export MKLROOT=/apps/intel/mkl
 
export MKLROOT=/apps/intel/mkl
# see intel's link-line advisor for generating the next line. Use the options for single dynamic library. (this is for MKL 10.3.6 with icc 11.1)
+
# see intel's link-line advisor for generating the next line. Use the options for single dynamic library.
export BLASOPT="-i8 -I$MKLROOT/include/intel64/ilp64 -I$MKLROOT/include $MKLROOT/lib/intel64/libmkl_blas95_ilp64.a $MKLROOT/lib/intel64/libmkl_lapack95_ilp64.a -Wl,--start-group $MKLROOT/lib/intel64/libmkl_intel_ilp64.a $MKLROOT/lib/intel64/libmkl_core.a $MKLROOT/lib/intel64/libmkl_sequential.a -Wl,--end-group -lpthread -lm"
+
# (the following is for MKL 10.3.6 with icc 11.1)
  +
export BLASOPT="-i8 -I$MKLROOT/include/intel64/ilp64 -I$MKLROOT/include $MKLROOT/lib/intel64/libmkl_blas95_ilp64.a
  +
$MKLROOT/lib/intel64/libmkl_lapack95_ilp64.a -Wl,--start-group $MKLROOT/lib/intel64/libmkl_intel_ilp64.a
  +
$MKLROOT/lib/intel64/libmkl_core.a $MKLROOT/lib/intel64/libmkl_sequential.a -Wl,--end-group -lpthread -lm"
   
 
# These may be helpful for compiling with CUDA, but beware - the resulting program no longer loads without cuda libraries!
 
# These may be helpful for compiling with CUDA, but beware - the resulting program no longer loads without cuda libraries!

Revision as of 16:52, 21 October 2014

Libnwchem is a patch to the 6.5 Revision of NWChem that adds three useful features.

  1. push_inp_string and pop_inp_string (nw_inp_from_file.F) to fake string input as input from an nwchem parameter file
    • push_inp_cstring (push_inp_cstring.c) to provide a 0-terminated c-string interface to same
  2. an nwchem_init function (libnwchem.F) to perform the start-up tasks of nwchem and return its runtime database
    • a libnwchem target to the GNUMakefile (sorry, no cygwin right now)
  3. nwchem.py, rtdb.py and related python wrappers to call nwchem's top-level functions and handle io from the rtdb
    • various fixes to error handling in rtdb
    • the test for a "movecs" file as proof of convergence was removed in the scf module, since the python script may change the geometry, requiring a new run of SCF despite a valid movecs file.

Obtaining

You can download the patch here. Next, get the nwchem sources from the link at the top of the page. To unpack and patch them, use

<source lang="bash"> tar xjf Nwchem-6.5.revision26243-src.2014-09-10.tar.bz2 mv Nwchem-6.5.revision26243-src nwchem-6.5 cd nwchem-6.5/src for i in Util_md_sockets Hbar Tcenxtask Parallelmpi Makefile_gcc4x Bcast_ccsd Elpa_syncs; do

 wget http://www.nwchem-sw.org/images/$i.patch.gz
 zcat $i.patch.gz | patch -p0
 rm -f $i.patch.gz

done i=Hnd_giaxyz_noinline # there's always that one. wget http://www.nwchem-sw.org/images/$i.patch.gz zcat $i.patch.gz | (cd NWints/hondo && patch -p0) rm -f $i.patch.gz

  1. Finally, apply the libnwchem patch.

zcat ../../libnwchem-6.5.patch.gz | patch -p0 cd .. bash ../build-6.5.sh # the build-6.5.sh script is at the bottom of this page. </source> The mv line is really required, since nwchem's build can fail if the path to the source directory is too long!

Compilation

For most Linux systems (but not BSD-based OSX), the -fPIC flag is required. This is such a PITA to add to nwchem's compilation that my solution is an ugly hack. Replace the real compiler with a shell script in your $HOME/bin directory, and make sure your path has $HOME/bin in front of all other directories.

(for icc) <source lang="bash">

  1. !/bin/sh
  2. file $HOME/bin/icc

/opt/intel/bin/icc -fPIC $@ </source>

(or gcc) <source lang="bash">

  1. !/bin/sh
  2. file $HOME/bin/gcc

/usr/bin/gcc -fPIC $@ </source>

I use the following script for compiling NWChem:

(on 64-bit Linux with icc) <source lang="bash">

  1. !/bin/bash
  2. file build-6.5.sh

export NWCHEM_TOP=$HOME/build/nwchem-6.5 export NWCHEM_TARGET=LINUX64

export NWCHEM_MODULES=all

export USE_MPI=y export USE_MPIF=y export USE_MPIF4=y export MPI_LIB=/apps/openmpi/1.4.5/lib export MPI_INCLUDE=/apps/openmpi/1.4.5/include export LIBMPI="-lpthread -lmpi_f90 -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lrdmacm -libverbs -lpsm_infinipath -lnuma -ldl -Wl,--export-dynamic -lnsl -lutil -lm -ldl"

export ARMCI_NETWORK=OPENIB

  1. export IB_INCLUDE <Location of Infiniband libraries>/include

export MSG_COMMS=MPI export CC=icc export FCC=ifort export FOPTIMIZE="-O2 -fPIC" export FFLAGS="-O2 -fPIC" export CFLAGS="-O2 -fPIC" export MKLROOT=/apps/intel/mkl

  1. see intel's link-line advisor for generating the next line. Use the options for single dynamic library.
  2. (the following is for MKL 10.3.6 with icc 11.1)

export BLASOPT="-i8 -I$MKLROOT/include/intel64/ilp64 -I$MKLROOT/include $MKLROOT/lib/intel64/libmkl_blas95_ilp64.a $MKLROOT/lib/intel64/libmkl_lapack95_ilp64.a -Wl,--start-group $MKLROOT/lib/intel64/libmkl_intel_ilp64.a $MKLROOT/lib/intel64/libmkl_core.a $MKLROOT/lib/intel64/libmkl_sequential.a -Wl,--end-group -lpthread -lm"

  1. These may be helpful for compiling with CUDA, but beware - the resulting program no longer loads without cuda libraries!
  2. export TCE_CUDA=n
  3. export CUDA=$CUDA_HOME/bin/nvcc
  4. export CUDA_FLAGS="-arch=sm_35"
  5. export CUDA_INCLUDE="-I$CUDA_HOME/include"
  6. export CUDA_LIBS="-L$CUDA_HOME/lib64 -lcudart -lcufft"
  7. -L/usr/X11R6/lib -lGL -lGLU -lX11 -lXi -lXmu -lglut -lGLEW

cd $NWCHEM_TOP/src

  1. make realclean # These two lines let you start again (theoretically).
  2. find . -name dependencies -exec rm {} \; -print

make nwchem_config make nwchem

  1. make -B -C ddscf # in case you just changed something in the ddscf directory

make libnwchem </source>

(on 64/32 OSX with gcc)

to appear!

Testing

Inspecting the patch file, you will notice that the python wrapper was added into the src/python directory. It also includes a simple test (test.py), which opens libnwchem.so from its compiled location and does geometry optimization on a water molecule. To use it yourself,

  1. cd to nwchem-6.5/src/python
  2. export PYTHONPATH=$PWD:$PYTHONPATH
  3. edit nwchem.py to make sure the CDLL() command has the right path to libnwchem.so (in a pinch, just move libnwchem.so to the current dir, and change the CDLL line to CDLL("libnwchem.so"))
  4. run: python test.py
  5. if all goes well, you should see normal nwchem output (listing basis functions, showing geometry convergence, and ending with a citation note)

Help

The patch is released without any warranty or indeed any guarantee of working at all. If you have lots of ($$$) around, shoot me an email.