diff options
-rw-r--r-- | var/spack/repos/builtin/packages/abinit/package.py | 19 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/wannier90/package.py | 135 |
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) |