summaryrefslogtreecommitdiff
path: root/var
diff options
context:
space:
mode:
authordownloadico <download@carc.unm.edu>2020-07-16 14:57:42 -0600
committerGitHub <noreply@github.com>2020-07-16 15:57:42 -0500
commit3f24188d19cf94dfa705e0899828a6e9b4501fb9 (patch)
treef63fc23c1d30ec29dec4989cf25bca1c0f45ec7d /var
parent34490872849fa54e81354a5d68cc84480c292004 (diff)
downloadspack-3f24188d19cf94dfa705e0899828a6e9b4501fb9.tar.gz
spack-3f24188d19cf94dfa705e0899828a6e9b4501fb9.tar.bz2
spack-3f24188d19cf94dfa705e0899828a6e9b4501fb9.tar.xz
spack-3f24188d19cf94dfa705e0899828a6e9b4501fb9.zip
Abinit+wannier90 fix (#17417)
* wannier90: add versions 3.0.0 and 3.1.0 and 'shared variant' Added versions 3.0.0 and 3.1.0 Added shared variant Added url_for_version function as versions less than 3 are from the wannier.org site and versions 3 and up are from github.com Added the MPI libraries to the list of libs substituted into the make.sys file in place of @LIBS Made it possible to build a shared object version of the library for versions < 3 by filtering the src/Makefile.2 file (based off of the patch from a src rpm from RHEL for version 2.0.1) Create a modules directory in the install prefix root directory and copy the Fortran .mod files there. Set the MPIFC variable to the Spack Fortran MPI compiler wrapper. * abinit: added 'wannier90' variant which enables building abinit with wannier90 Added wannier90 variant Made abinit depend on the shared object ('shared') variant of wannier90 if the wannier90 variant is selected Add configure args for wannier90 libs, includes, and binaries and to set MPIFC set the dft-flavor to wannier90 when wannier90 is enabled and only set the dft flavor to 'atompaw+libxc' if wannier90 is not selected * Update var/spack/repos/builtin/packages/abinit/package.py Co-authored-by: Greg Becker <becker33@llnl.gov> * Update var/spack/repos/builtin/packages/wannier90/package.py Co-authored-by: Greg Becker <becker33@llnl.gov> * Update var/spack/repos/builtin/packages/wannier90/package.py Co-authored-by: Greg Becker <becker33@llnl.gov> * incorporated bbecker's suggestion for making the strings less ugly! * incorporated bbecker's suggestion to fix the logic for picking which "DFT flavor" configure argument. If the wannier variant is enabled, it passes --with-dft-flavor=wannier90 to configure, otherwise it passes --with-dft-flavor=atompaw+libxc to configure * Changed to using plain strings * Fixed version tests * incorporated @adamjstewart's fix for testing if the major version is > 2 * incorporated @adamjstewart's fix to check if mpi is enabled and only set the MPIFC variable if it is. * Update var/spack/repos/builtin/packages/wannier90/package.py Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com> * Only set MPIFC if '+mpi' is set * incorporated fixes from @adamjstewart including: - using the string=True argument to filter_file (and removed the unneeded escapes) - changing the url to the github location - fixing the version checks - building a libwannier.dylib on darwin * incorporated fixes suggested by @adamjstewart including: - using the string=True argument to filter_file and cleaned up the escapes - only pass the MPIFC argument to configure when '+mpi' is set - chaned the url to the github site for Wannier090 - fixed the version checks - build a 'libwannier.dylib' file when building the shared variant on darwin * Update var/spack/repos/builtin/packages/wannier90/package.py Co-authored-by: Greg Becker <becker33@llnl.gov> * moved a configure argument from it's own '+mpi' check to under the lower one * Update var/spack/repos/builtin/packages/wannier90/package.py Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com> * Cleaned up syntax as suggested by @adamjstewart It looks *so much better* now! Thanks! * removed unneeded import of 'find' from 'llnl.util.filesystem' package as suggested by @adamjstewart * Update var/spack/repos/builtin/packages/wannier90/package.py Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com> * incorporated changes from @adamjstewart changed check to "if '@:2 +shared' in spec:" instead of a nested check of '@:2' and '+shared' removed unneeded joins used in filter_file and spliced the list of objs directly into the filter_file call used the dso_suffix instead of testing for darwin to determine the name of the shared library * removed whitespace from blank line * fixed bug with '../../wannier90.x: .*' not being treated as a regexp. Thanks Adam! * fixed missing whitespace when modifying Makefile.2 Co-authored-by: Greg Becker <becker33@llnl.gov> Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com>
Diffstat (limited to 'var')
-rw-r--r--var/spack/repos/builtin/packages/abinit/package.py19
-rw-r--r--var/spack/repos/builtin/packages/wannier90/package.py135
2 files changed, 134 insertions, 20 deletions
diff --git a/var/spack/repos/builtin/packages/abinit/package.py b/var/spack/repos/builtin/packages/abinit/package.py
index 6f07ffee81..4378c28213 100644
--- a/var/spack/repos/builtin/packages/abinit/package.py
+++ b/var/spack/repos/builtin/packages/abinit/package.py
@@ -56,6 +56,9 @@ class Abinit(AutotoolsPackage):
variant('hdf5', default=False,
description='Enables HDF5+Netcdf4 with MPI. WARNING: experimental')
+ variant('wannier90', default=False,
+ description='Enables the Wannier90 library')
+
# Add dependencies
# currently one cannot forward options to virtual packages, see #1712.
# depends_on('blas', when='~openmp')
@@ -84,6 +87,8 @@ class Abinit(AutotoolsPackage):
# Cannot ask for +scalapack if it does not depend on MPI
conflicts('+scalapack', when='~mpi')
+ depends_on("wannier90+shared", when='+wannier90')
+
# Elpa is a substitute for scalapack and needs mpi
# conflicts('+elpa', when='~mpi')
# conflicts('+elpa', when='+scalapack')
@@ -95,12 +100,25 @@ class Abinit(AutotoolsPackage):
options = []
oapp = options.append
+ if '+wannier90' in spec:
+ oapp('--with-wannier90-libs=-L{0}'
+ .format(spec['wannier90'].prefix.lib + ' -lwannier -lm'))
+ oapp('--with-wannier90-incs=-I{0}'
+ .format(spec['wannier90'].prefix.modules))
+ oapp('--with-wannier90-bins={0}'
+ .format(spec['wannier90'].prefix.bin))
+ oapp('--enable-connectors')
+ oapp('--with-dft-flavor=wannier90')
+
if '+mpi' in spec:
# MPI version:
# let the configure script auto-detect MPI support from mpi_prefix
oapp('--with-mpi-prefix={0}'.format(spec['mpi'].prefix))
oapp('--enable-mpi=yes')
oapp('--enable-mpi-io=yes')
+ oapp('MPIFC={0}/mpifc'.format(spec['mpi'].prefix.bin))
+ if '~wannier90' in spec:
+ oapp('--with-dft-flavor=atompaw+libxc')
# Activate OpenMP in Abinit Fortran code.
if '+openmp' in spec:
@@ -129,7 +147,6 @@ class Abinit(AutotoolsPackage):
'--with-fft-incs=-I%s' % spec['fftw'].prefix.include,
'--with-fft-libs=-L%s %s' % (spec['fftw'].prefix.lib, fftlibs),
])
- oapp('--with-dft-flavor=atompaw+libxc')
# LibXC library
libxc = spec['libxc:fortran']
diff --git a/var/spack/repos/builtin/packages/wannier90/package.py b/var/spack/repos/builtin/packages/wannier90/package.py
index 5be0134141..e4aa1017c7 100644
--- a/var/spack/repos/builtin/packages/wannier90/package.py
+++ b/var/spack/repos/builtin/packages/wannier90/package.py
@@ -15,8 +15,10 @@ class Wannier90(MakefilePackage):
Wannier90 is released under the GNU General Public License.
"""
homepage = 'http://wannier.org'
- url = 'http://wannier.org/code/wannier90-2.0.1.tar.gz'
+ url = 'https://github.com/wannier-developers/wannier90/archive/v3.1.0.tar.gz'
+ version('3.1.0', sha256='40651a9832eb93dec20a8360dd535262c261c34e13c41b6755fa6915c936b254')
+ version('3.0.0', sha256='f196e441dcd7b67159a1d09d2d7de2893b011a9f03aab6b30c4703ecbf20fe5b')
version('2.1.0', sha256='ee90108d4bc4aa6a1cf16d72abebcb3087cf6c1007d22dda269eb7e7076bddca')
version('2.0.1', sha256='05ea7cd421a219ce19d379ad6ae3d9b1a84be4ffb367506ffdfab1e729309e94')
@@ -26,17 +28,40 @@ class Wannier90(MakefilePackage):
parallel = False
- build_targets = [
- 'wannier', 'post', 'lib', 'w90chk2chk', 'w90vdw', 'w90pov'
- ]
+ variant(
+ 'shared',
+ default=True,
+ description='Builds a shared version of the library'
+ )
@property
- def makefile_name(self):
- # Older versions use 'make.sys'
- filename = 'make.sys'
+ def build_targets(self):
+ targets = []
+ if '@:2' in self.spec:
+ targets = [
+ 'lib', 'wannier', 'post', 'w90chk2chk', 'w90vdw', 'w90pov'
+ ]
+ if '@3:' in self.spec:
+ targets = ['wannier', 'post', 'lib', 'w90chk2chk', 'w90vdw']
+ if '+shared' in self.spec:
+ targets.append('dynlib')
+
+ return targets
+
+ def url_for_version(self, version):
+ if (version > Version('2')):
+ url = 'https://github.com/wannier-developers/wannier90/archive/v{0}.tar.gz'
+ else:
+ url = 'http://wannier.org/code/wannier90-{0}.tar.gz'
+ return url.format(version)
- # While newer search for 'make.inc'
- if self.spec.satisfies('@2.1.0:'):
+ @property
+ def makefile_name(self):
+ # Version 2.0.1 uses make.sys,
+ # other verions use make.inc
+ if self.spec.satisfies('@2.0.1'):
+ filename = 'make.sys'
+ else:
filename = 'make.inc'
abspath = join_path(self.stage.source_path, filename)
@@ -46,10 +71,12 @@ class Wannier90(MakefilePackage):
lapack = self.spec['lapack'].libs
blas = self.spec['blas'].libs
+ mpi = self.spec['mpi'].libs
+
substitutions = {
'@F90': spack_fc,
'@MPIF90': self.spec['mpi'].mpifc,
- '@LIBS': (lapack + blas).joined()
+ '@LIBS': (lapack + blas + mpi).joined()
}
template = join_path(
@@ -61,10 +88,67 @@ class Wannier90(MakefilePackage):
for key, value in substitutions.items():
filter_file(key, value, self.makefile_name)
- def install(self, spec, prefix):
+ if '@:2 +shared' in self.spec:
+ # this is to build a .shared wannier90 library
+ filter_file('LIBRARY = ../../libwannier.a',
+ 'LIBRARY = ../../libwannier.' + dso_suffix,
+ join_path(self.stage.source_path, 'src/Makefile.2'))
+ filter_file('parameters.o kmesh.o io.o comms.o '
+ 'utility.o get_oper.o constants.o '
+ 'postw90_common.o wan_ham.o spin.o '
+ 'dos.o berry.o kpath.o kslice.o '
+ 'boltzwann.o geninterp.o',
+ 'comms.o get_oper.o postw90_common.o '
+ 'wan_ham.o spin.o dos.o berry.o '
+ 'kpath.o kslice.o boltzwann.o geninterp.o',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'))
+ filter_file('../../wannier90.x: .*',
+ '../../wannier90.x: $(OBJS) '
+ '../wannier_prog.F90 $(LIBRARY)',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'))
+ filter_file('../../postw90.x: $(OBJS_POST) '
+ '$(POSTDIR)postw90.F90',
+ '../../postw90.x: $(OBJS_POST) '
+ '$(POSTDIR)postw90.F90 $(LIBRARY)',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+ filter_file(
+ '$(COMPILER) ../wannier_prog.F90 '
+ '$(LDOPTS) $(OBJS) $(LIBS) '
+ '-o ../../wannier90.x',
+ '$(COMPILER) -I../obj ../wannier_prog.F90 '
+ '$(LDOPTS) -L../.. -lwannier '
+ '-o ../../wannier90.x',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+ filter_file(
+ '$(COMPILER) $(POSTDIR)postw90.F90 '
+ '$(POSTOPTS) $(LDOPTS) '
+ '$(OBJS_POST) '
+ '$(LIBS) -o ../../postw90.x',
+ '$(COMPILER) -I../obj $(POSTDIR)postw90.F90 '
+ '$(POSTOPTS) $(LDOPTS) $(OBJS_POST) '
+ '-L../.. -lwannier $(LIBS) -o ../../postw90.x',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+ filter_file(
+ '$(AR) $(ARFLAGS) '
+ '$(LIBRARY) $(OBJS2) $(OBJS)',
+ '$(MPIF90) $(FCOPTS) -shared -o '
+ '$(LIBRARY) $(OBJS2) $(OBJS) $(LIBS)',
+ join_path(self.stage.source_path,
+ 'src/Makefile.2'), string=True)
+
+ def setup_build_environment(self, env):
+ env.set('MPIFC', self.prefix.bin.mpifc)
+ def install(self, spec, prefix):
mkdirp(self.prefix.bin)
mkdirp(self.prefix.lib)
+ if '+shared' in spec:
+ mkdirp(self.prefix.modules)
install(
join_path(self.stage.source_path, 'wannier90.x'),
@@ -76,10 +160,17 @@ class Wannier90(MakefilePackage):
join_path(self.prefix.bin, 'postw90.x')
)
- install(
- join_path(self.stage.source_path, 'libwannier.a'),
- join_path(self.prefix.lib, 'libwannier.a')
- )
+ inst = []
+ if '+shared' in spec:
+ inst.append('libwannier.' + dso_suffix)
+ # version 3 or 2 without the shared variant
+ # also has a .a version of the library
+ if '@3:' in spec or '~shared' in spec:
+ inst.append('libwannier.a')
+
+ for file in inst:
+ install(join_path(self.stage.source_path, file),
+ join_path(self.prefix.lib, file))
install(
join_path(self.stage.source_path, 'w90chk2chk.x'),
@@ -91,12 +182,18 @@ class Wannier90(MakefilePackage):
join_path(self.prefix.bin, 'w90vdw.x')
)
- install(
- join_path(self.stage.source_path, 'utility', 'w90pov', 'w90pov'),
- join_path(self.prefix.bin, 'w90pov')
- )
+ if spec.satisfies('@:2'):
+ install(
+ join_path(self.stage.source_path,
+ 'utility', 'w90pov', 'w90pov'),
+ join_path(self.prefix.bin, 'w90pov')
+ )
install_tree(
join_path(self.stage.source_path, 'pseudo'),
join_path(self.prefix.bin, 'pseudo')
)
+
+ for file in find(join_path(self.stage.source_path, 'src/obj'),
+ '*.mod'):
+ install(file, self.prefix.modules)