From d9992a778faa6688143a537d802b3078416c0a7a Mon Sep 17 00:00:00 2001 From: Veselin Dobrev Date: Sat, 18 Apr 2020 16:57:57 -0700 Subject: CEED v3.0 release (#15500) * [mfem] A few updates: add 'strumpack' variant; add 'zlib' variant (same as 'gzstream'); fix optmization flag for v4.0. * [mfem] flake8 fix * [mfem] Add version 4.1 * [mfem] Add/tweak some 'conflicts' directives. * [gslib] Add new release versions + 'develop' version. * [petsc] Restrict hdf5 version to <= 1.10.99 since 1.12.0 fails * [metis] Use the original metis url for v4.0.3. * [conduit] Remove restrictions to the used hdf5 variant to allow building with other packages that use hdf5, e.g. petsc. * [mfem] Few updates: * Replace the 'gzstream' variant with 'zlib' variant. * Do not add system library paths with -L flags. * Allow '+pumi+shared' variant. * Update the 'test_builds.sh' script. * [occa] Add version 1.0.9. * [mfem] Some OCCA and RAJA updates. * [gslib] Fix the build for new versions of the library. * [mfem] Add 'gslib' variant for GSLIB. * [mfem] Add 'cuda' variant. * [mfem] Add 'libceed' variant + a few more tweaks. * [mfem] Add 'umpire' variant. * [ceed] Add a draft for v3.0. Not tested. Just made sure that concretization works for 'ceed' and 'ceed+cuda'. * [nek] Fix Nek5000/NekCEM * [nek] Add Nek5000-v19 & polishing Nek packages * [flake8] Fix flake8 failure * petsc: use of HDF5 does not care about +hl+fortran * [petsc] Temporarily allow any hypre version with petsc@develop. [ceed] Remove the requirement for hypre@develop. * [libceed] Do not explicitly set NVCCFLAGS for v0.5 and later. * [laghos] Add version 3.0, pointing to dev branch for now. Do not set CXX at the make command line. Simplify the dependecy directives a little. [ceed] Use laghos v3.0 for ceed v3.0.0. * [laghos] Keep the injection of CXX in the makefile for laghos versions <= 2.0. * [nekcem] Recovert hash-versions used by older versions of the 'ceed' package. * [occa] Disable hip autodetection because it fails on some machines. * [laghos] Update v3.0 with the actual release source. * [suite-sparse] Explicitly add the c11 flag to CFLAGS. * Update package.py (#15749) * [magma] Add forgotten specification of the 'cuda_arch' variant. * [ceed] Use magma v2.5.3 for ceed v3.0. * libceed-0.6 * mfem: depend on libceed 0.6:, not 0.6.0: * [libceed] Add 'magma' variant -- enable MAGMA backend. * [ceed] In v3.0, use '+magma' variant of libceed when cuda is enabled. * Initial package for Remhos (needs to be updated with actual sha256 * Adding Remhos to CEED-3.0, for now @develop * petsc: add 3.13.0 (using petsc-lite) and 3.12.5 * ceed: update to petsc@3.13.0:3.13.99 * Temporary fix * [nekcem] Add hash-version for ceed v3.0. * [nek5000] Simplify source urls. * [nektools] Use the same sources and versions as in nek5000. * [ceed] Update Nek-related package versions. * libceed: add v0.6 portabilty fix * libceed: better v0.6 portabilty fix * Adding Remhos 1.0 release in CEED-3.0 * Updating hash for Remhos-1.0 * [petsc] Add cuda variant. * [libceed] Flake8 fix. * [petsc] Add cuda variant. * [ceed] Fix the OCCA version to 1.0.9. Enable petsc+cuda when compiling ceed@3.0.0+cuda. * nek5000: fix python 2.7+ syntax * [laghos] Fix testing. * [remhos] Fix testing. * [remhos] For testing use the 'tests' target instead of 'test'. * Add/update the maintainers for ceed, libceed, mfem, laghos, and remhos. * [ceed] Remove unnecessary dependencies. * libceed: activate AVX when supported Co-authored-by: Thilina Rathnayake Co-authored-by: Jed Brown Co-authored-by: Stan Tomov Co-authored-by: Tzanio --- var/spack/repos/builtin/packages/ceed/package.py | 59 +++++- .../repos/builtin/packages/conduit/package.py | 8 +- var/spack/repos/builtin/packages/gslib/package.py | 31 +-- var/spack/repos/builtin/packages/laghos/package.py | 40 ++-- .../repos/builtin/packages/libceed/package.py | 22 +- var/spack/repos/builtin/packages/magma/package.py | 2 + var/spack/repos/builtin/packages/metis/package.py | 8 +- var/spack/repos/builtin/packages/mfem/package.py | 222 ++++++++++++++++----- .../repos/builtin/packages/mfem/test_builds.sh | 115 ++++++----- .../repos/builtin/packages/nek5000/package.py | 29 ++- .../repos/builtin/packages/nekbone/package.py | 6 +- var/spack/repos/builtin/packages/nekcem/package.py | 7 +- .../repos/builtin/packages/nektools/package.py | 7 +- var/spack/repos/builtin/packages/occa/package.py | 6 + var/spack/repos/builtin/packages/petsc/package.py | 8 +- var/spack/repos/builtin/packages/remhos/package.py | 54 +++++ .../repos/builtin/packages/suite-sparse/package.py | 8 + 17 files changed, 470 insertions(+), 162 deletions(-) create mode 100644 var/spack/repos/builtin/packages/remhos/package.py (limited to 'var') diff --git a/var/spack/repos/builtin/packages/ceed/package.py b/var/spack/repos/builtin/packages/ceed/package.py index 3b47deb25b..b5ab233e94 100644 --- a/var/spack/repos/builtin/packages/ceed/package.py +++ b/var/spack/repos/builtin/packages/ceed/package.py @@ -16,15 +16,19 @@ class Ceed(BundlePackage): homepage = "https://ceed.exascaleproject.org" - version('2.0') + maintainers = ['jedbrown', 'v-dobrev', 'tzanio'] + + version('3.0.0') + version('2.0.0') + version('1.0.0') variant('cuda', default=False, - description='Build MAGMA; enable CUDA support in libCEED and OCCA') - variant('mfem', default=True, description='Build MFEM and Laghos') + description='Enable CUDA support') + variant('mfem', default=True, description='Build MFEM, Laghos and Remhos') variant('nek', default=True, description='Build Nek5000, GSLIB, Nekbone, and NekCEM') variant('occa', default=True, - description='Build OCCA; enable OCCA support in libCEED') + description='Enable OCCA support') variant('petsc', default=True, description='Build PETSc and HPGMG') variant('pumi', default=True, @@ -34,6 +38,11 @@ class Ceed(BundlePackage): # TODO: Add 'int64' variant? # LibCEED + # ceed-3.0 + depends_on('libceed@0.6~cuda', when='@3.0.0~cuda') + depends_on('libceed@0.6+cuda+magma', when='@3.0.0+cuda') + depends_on('libceed@0.6+occa', when='@3.0.0+occa') + depends_on('libceed@0.6~occa', when='@3.0.0~occa') # ceed-2.0 depends_on('libceed@0.4~cuda', when='@2.0.0~cuda') depends_on('libceed@0.4+cuda', when='@2.0.0+cuda') @@ -46,6 +55,9 @@ class Ceed(BundlePackage): depends_on('libceed@0.2~occa', when='@1.0.0~occa') # OCCA + # ceed-3.0 + depends_on('occa@1.0.9~cuda', when='@3.0.0+occa~cuda') + depends_on('occa@1.0.9+cuda', when='@3.0.0+occa+cuda') # ceed-2.0 depends_on('occa@1.0.8~cuda', when='@2.0.0+occa~cuda') depends_on('occa@1.0.8+cuda', when='@2.0.0+occa+cuda') @@ -54,6 +66,12 @@ class Ceed(BundlePackage): depends_on('occa@1.0.0-alpha.5+cuda', when='@1.0.0+occa+cuda') # Nek5000, GSLIB, Nekbone, and NekCEM + # ceed-3.0 + depends_on('nek5000@19.0', when='@3.0.0+nek') + depends_on('nektools@19.0%gcc', when='@3.0.0+nek') + depends_on('gslib@1.0.6', when='@3.0.0+nek') + depends_on('nekbone@17.0', when='@3.0.0+nek') + depends_on('nekcem@c8db04b', when='@3.0.0+nek') # ceed-2.0 depends_on('nek5000@17.0', when='@2.0.0+nek') depends_on('nektools@17.0%gcc', when='@2.0.0+nek') @@ -67,7 +85,17 @@ class Ceed(BundlePackage): depends_on('nekbone@17.0', when='@1.0.0+nek') depends_on('nekcem@0b8bedd', when='@1.0.0+nek') - # PETSc, HPGMG + # PETSc + # ceed-3.0 + depends_on('petsc+cuda', when='@3.0.0+petsc+cuda') + # For a +quickbuild we disable hdf5, and superlu-dist in PETSc. + depends_on('petsc@3.13.0:3.13.99~hdf5~superlu-dist', + when='@3.0.0+petsc+quickbuild') + depends_on('petsc@3.13.0:3.13.99+mpi+double~int64', when='@3.0.0+petsc~mfem') + # The mfem petsc examples need the petsc variants +hypre, +suite-sparse, + # and +mumps: + depends_on('petsc@3.13.0:3.13.99+mpi+hypre+suite-sparse+mumps+double~int64', + when='@3.0.0+petsc+mfem') # ceed-2.0 # For a +quickbuild we disable hdf5, and superlu-dist in PETSc. # Ideally, these can be turned into recommendations to Spack for @@ -94,18 +122,37 @@ class Ceed(BundlePackage): depends_on('hpgmg@a0a5510df23b+fe', when='@1.0.0+petsc') # MAGMA + # ceed-3.0 + depends_on('magma@2.5.3', when='@3.0.0+cuda') # ceed-2.0 depends_on('magma@2.5.0', when='@2.0.0+cuda') # ceed-1.0 depends_on('magma@2.3.0', when='@1.0.0+cuda') # PUMI + # ceed-3.0 + depends_on('pumi@2.2.2', when='@3.0.0+pumi') # ceed-2.0 depends_on('pumi@2.2.0', when='@2.0.0+pumi') # ceed-1.0 depends_on('pumi@2.1.0', when='@1.0.0+pumi') - # MFEM, Laghos + # MFEM, Laghos, Remhos + # ceed-3.0 + depends_on('mfem@4.1.0+mpi+examples+miniapps', when='@3.0.0+mfem~petsc') + depends_on('mfem@4.1.0+mpi+petsc+examples+miniapps', + when='@3.0.0+mfem+petsc') + depends_on('mfem@4.1.0+pumi', when='@3.0.0+mfem+pumi') + depends_on('mfem@4.1.0+gslib', when='@3.0.0+mfem+nek') + depends_on('mfem@4.1.0+libceed', when='@3.0.0+mfem') + depends_on('mfem@4.1.0+cuda', when='@3.0.0+mfem+cuda') + depends_on('mfem@4.1.0+occa', when='@3.0.0+mfem+occa') + depends_on('laghos@3.0', when='@3.0.0+mfem') + depends_on('remhos@1.0', when='@3.0.0+mfem') + + # If using gcc version <= 4.8 build suite-sparse version <= 5.1.0 + depends_on('suite-sparse@:5.1.0', when='@3.0.0%gcc@:4.8+mfem+petsc') + # ceed-2.0 depends_on('mfem@3.4.0+mpi+examples+miniapps', when='@2.0.0+mfem~petsc') depends_on('mfem@3.4.0+mpi+petsc+examples+miniapps', diff --git a/var/spack/repos/builtin/packages/conduit/package.py b/var/spack/repos/builtin/packages/conduit/package.py index eecc15d798..ed1bd4f3d3 100644 --- a/var/spack/repos/builtin/packages/conduit/package.py +++ b/var/spack/repos/builtin/packages/conduit/package.py @@ -107,10 +107,10 @@ class Conduit(Package): # # Use HDF5 1.8, for wider output compatibly # variants reflect we are not using hdf5's mpi or fortran features. - depends_on("hdf5@1.8.19:1.8.999~cxx~mpi~fortran", when="+hdf5+hdf5_compat+shared") - depends_on("hdf5@1.8.19:1.8.999~shared~cxx~mpi~fortran", when="+hdf5+hdf5_compat~shared") - depends_on("hdf5~cxx~mpi~fortran", when="+hdf5~hdf5_compat+shared") - depends_on("hdf5~shared~cxx~mpi~fortran", when="+hdf5~hdf5_compat~shared") + depends_on("hdf5@1.8.19:1.8.999~cxx", when="+hdf5+hdf5_compat+shared") + depends_on("hdf5@1.8.19:1.8.999~shared~cxx", when="+hdf5+hdf5_compat~shared") + depends_on("hdf5~cxx", when="+hdf5~hdf5_compat+shared") + depends_on("hdf5~shared~cxx", when="+hdf5~hdf5_compat~shared") ############### # Silo diff --git a/var/spack/repos/builtin/packages/gslib/package.py b/var/spack/repos/builtin/packages/gslib/package.py index 1bdffc3ecf..37827a8c1f 100644 --- a/var/spack/repos/builtin/packages/gslib/package.py +++ b/var/spack/repos/builtin/packages/gslib/package.py @@ -12,6 +12,10 @@ class Gslib(Package): homepage = "https://github.com/gslib/gslib" git = "https://github.com/gslib/gslib.git" + version('develop', branch='master') + version('1.0.6', tag='v1.0.6') + version('1.0.5', tag='v1.0.5') + version('1.0.4', tag='v1.0.4') version('1.0.3', tag='v1.0.3') version('1.0.2', tag='v1.0.2') version('1.0.1', tag='v1.0.1') @@ -32,7 +36,7 @@ class Gslib(Package): lib_dir = 'lib' libname = 'libgs.a' - if self.version == Version('1.0.1'): + if self.spec.satisfies('@1.0.1:'): makefile = 'Makefile' else: makefile = 'src/Makefile' @@ -56,16 +60,19 @@ class Gslib(Package): ld_flags = blas.ld_flags filter_file(r'\$\(LDFLAGS\)', ld_flags, makefile) - if self.version == Version('1.0.1'): + if self.spec.satisfies('@1.0.3:'): make(make_cmd) - make('install') - install_tree(lib_dir, prefix.lib) - elif self.version == Version('1.0.0'): - with working_dir(src_dir): + make('install', 'INSTALL_ROOT=%s' % self.prefix) + else: + if self.spec.satisfies('@1.0.1:'): make(make_cmd) - mkdir(prefix.lib) - install(libname, prefix.lib) - - # Should only install the headers (this will be fixed in gslib on - # future releases). - install_tree(src_dir, prefix.include) + make('install') + install_tree(lib_dir, prefix.lib) + elif self.version == Version('1.0.0'): + with working_dir(src_dir): + make(make_cmd) + mkdir(prefix.lib) + install(libname, prefix.lib) + # Should only install the headers (this will be fixed in gslib on + # future releases). + install_tree(src_dir, prefix.include) diff --git a/var/spack/repos/builtin/packages/laghos/package.py b/var/spack/repos/builtin/packages/laghos/package.py index 438da2f5cf..e5a828dbe8 100644 --- a/var/spack/repos/builtin/packages/laghos/package.py +++ b/var/spack/repos/builtin/packages/laghos/package.py @@ -18,7 +18,9 @@ class Laghos(MakefilePackage): url = "https://github.com/CEED/Laghos/archive/v1.0.tar.gz" git = "https://github.com/CEED/Laghos.git" - version('master', branch='master') + maintainers = ['v-dobrev', 'tzanio', 'vladotomov'] + + version('develop', branch='master') version('3.0', sha256='4db56286e15b42ecdc8d540c4888a7dec698b019df9c7ccb8319b7ea1f92d8b4') version('2.0', sha256='dd3632d5558889beec2cd3c49eb60f633f99e6d886ac868731610dd006c44c14') version('1.1', sha256='53b9bfe2af263c63eb4544ca1731dd26f40b73a0d2775a9883db51821bf23b7f') @@ -26,20 +28,15 @@ class Laghos(MakefilePackage): variant('metis', default=True, description='Enable/disable METIS support') - depends_on('metis@4.0.3:', when='+metis') + depends_on('mfem+mpi+metis', when='+metis') + depends_on('mfem+mpi~metis', when='~metis') + depends_on('mfem@develop', when='@develop') + depends_on('mfem@4.1.0:', when='@3.0') # Recommended mfem version for laghos v2.0 is: ^mfem@3.4.1-laghos-v2.0 - depends_on('mfem@3.4.0:+mpi+metis', when='@2.0+metis') - depends_on('mfem@3.4.0:+mpi~metis', when='@2.0~metis') - + depends_on('mfem@3.4.0:', when='@2.0') # Recommended mfem version for laghos v1.x is: ^mfem@3.3.1-laghos-v1.0 - depends_on('mfem@3.3.1-laghos-v1.0:+mpi+metis', when='@1.0,1.1+metis') - depends_on('mfem@3.3.1-laghos-v1.0:+mpi~metis', when='@1.0,1.1~metis') - - # 3.0 requirements - depends_on('hypre@2.11.2', when='@3.0:') - depends_on('mfem@develop+mpi+metis', when='@3.0:+metis') - depends_on('mfem@develop+mpi~metis', when='@3.0:~metis') + depends_on('mfem@3.3.1-laghos-v1.0:', when='@1.0,1.1') @property def build_targets(self): @@ -49,27 +46,18 @@ class Laghos(MakefilePackage): targets.append('MFEM_DIR=%s' % spec['mfem'].prefix) targets.append('CONFIG_MK=%s' % spec['mfem'].package.config_mk) targets.append('TEST_MK=%s' % spec['mfem'].package.test_mk) - targets.append('CXX=%s' % spec['mpi'].mpicxx) - - if self.version >= ver('3.0'): - targets.append('HYPRE_DIR=%s' % spec['hypre'].prefix) - if '+metis' in self.spec: - targets.append('METIS_DIR=%s' % spec['metis'].prefix) + if spec.satisfies('@:2.0'): + targets.append('CXX=%s' % spec['mpi'].mpicxx) return targets # See lib/spack/spack/build_systems/makefile.py def check(self): - targets = [] - spec = self.spec - - targets.append('MFEM_DIR=%s' % spec['mfem'].prefix) - targets.append('CONFIG_MK=%s' % spec['mfem'].package.config_mk) - targets.append('TEST_MK=%s' % spec['mfem'].package.test_mk) - with working_dir(self.build_directory): - make('test', *targets) + make('test', *self.build_targets) def install(self, spec, prefix): mkdirp(prefix.bin) install('laghos', prefix.bin) + + install_time_test_callbacks = [] diff --git a/var/spack/repos/builtin/packages/libceed/package.py b/var/spack/repos/builtin/packages/libceed/package.py index 64d04a7b89..36d46dae0b 100644 --- a/var/spack/repos/builtin/packages/libceed/package.py +++ b/var/spack/repos/builtin/packages/libceed/package.py @@ -12,7 +12,10 @@ class Libceed(Package): homepage = "https://github.com/CEED/libCEED" git = "https://github.com/CEED/libCEED.git" + maintainers = ['jedbrown', 'v-dobrev', 'tzanio'] + version('develop', branch='master') + version('0.6', commit='c7f533e01e2f3f6720fbf37aac2af2ffed225f60') # tag v0.6 + small portability fixes version('0.5', tag='v0.5') version('0.4', tag='v0.4') version('0.2', tag='v0.2') @@ -22,8 +25,10 @@ class Libceed(Package): variant('cuda', default=False, description='Enable CUDA support') variant('debug', default=False, description='Enable debug build') variant('libxsmm', default=False, description='Enable LIBXSMM backend') + variant('magma', default=False, description='Enable MAGMA backend') conflicts('+libxsmm', when='@:0.2') + conflicts('+magma', when='@:0.5') depends_on('cuda', when='+cuda') @@ -35,6 +40,8 @@ class Libceed(Package): depends_on('libxsmm', when='+libxsmm') + depends_on('magma', when='+magma') + patch('pkgconfig-version-0.4.diff', when='@0.4') # occa: do not occaFree kernels @@ -78,12 +85,16 @@ class Libceed(Package): opt = '-O -g' makeopts += ['OPT=%s' % opt] + if 'avx' in self.spec.target: + makeopts.append('AVX=1') + if '+cuda' in spec: makeopts += ['CUDA_DIR=%s' % spec['cuda'].prefix] - nvccflags = ['-ccbin %s -Xcompiler "%s" -Xcompiler %s' % - (compiler.cxx, opt, compiler.cc_pic_flag)] - nvccflags = ' '.join(nvccflags) - makeopts += ['NVCCFLAGS=%s' % nvccflags] + if spec.satisfies('@:0.4'): + nvccflags = ['-ccbin %s -Xcompiler "%s" -Xcompiler %s' % + (compiler.cxx, opt, compiler.cc_pic_flag)] + nvccflags = ' '.join(nvccflags) + makeopts += ['NVCCFLAGS=%s' % nvccflags] else: # Disable CUDA auto-detection: makeopts += ['CUDA_DIR=/disable-cuda'] @@ -91,6 +102,9 @@ class Libceed(Package): if '+libxsmm' in spec: makeopts += ['XSMM_DIR=%s' % spec['libxsmm'].prefix] + if '+magma' in spec: + makeopts += ['MAGMA_DIR=%s' % spec['magma'].prefix] + return makeopts def build(self, spec, prefix): diff --git a/var/spack/repos/builtin/packages/magma/package.py b/var/spack/repos/builtin/packages/magma/package.py index b2ab37a318..16b7c777c1 100644 --- a/var/spack/repos/builtin/packages/magma/package.py +++ b/var/spack/repos/builtin/packages/magma/package.py @@ -30,6 +30,8 @@ class Magma(CMakePackage, CudaPackage): variant('shared', default=True, description='Enable shared library') variant('cuda', default=True, description='Build with CUDA') + variant('cuda_arch', default='none', multi=True, + description='Specify CUDA architecture(s)') depends_on('blas') depends_on('lapack') diff --git a/var/spack/repos/builtin/packages/metis/package.py b/var/spack/repos/builtin/packages/metis/package.py index ad0f78566b..12d1223a72 100644 --- a/var/spack/repos/builtin/packages/metis/package.py +++ b/var/spack/repos/builtin/packages/metis/package.py @@ -18,14 +18,18 @@ class Metis(Package): partitioning schemes.""" # - # the previous metis website http://glaros.dtc.umn.edu/gkhome/metis/metis - # no longer exists. This is a github mirror that provides metis 5.1.0 + # The original metis website: http://glaros.dtc.umn.edu/gkhome/metis/metis/overview + # is down sometimes. This is a github mirror that provides metis 5.1.0 # homepage = "https://github.com/scivision/METIS/" url = "https://github.com/scivision/METIS/raw/master/metis-5.1.0.tar.gz" version('5.1.0', sha256='76faebe03f6c963127dbb73c13eab58c9a3faeae48779f049066a21c087c5db2') + # For v4.0.3, use the original metis website since this version is not + # mirrored at the above github location. + version('4.0.3', url='http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-4.0.3.tar.gz', + sha256='5efa35de80703c1b2c4d0de080fafbcf4e0d363a21149a1ad2f96e0144841a55') variant('shared', default=True, description='Enables the build of shared libraries.') variant('gdb', default=False, description='Enables gdb support (version 5+).') diff --git a/var/spack/repos/builtin/packages/mfem/package.py b/var/spack/repos/builtin/packages/mfem/package.py index f754cd915e..5f6d8b5c0a 100644 --- a/var/spack/repos/builtin/packages/mfem/package.py +++ b/var/spack/repos/builtin/packages/mfem/package.py @@ -16,8 +16,8 @@ class Mfem(Package): homepage = 'http://www.mfem.org' git = 'https://github.com/mfem/mfem.git' - maintainers = ['goxberry', 'tzanio', 'markcmiller86', 'acfisher', - 'v-dobrev'] + maintainers = ['v-dobrev', 'tzanio', 'acfisher', + 'goxberry', 'markcmiller86'] # Recommended mfem builds to test when updating this file: see the shell # script 'test_builds.sh' in the same directory as this file. @@ -45,13 +45,17 @@ class Mfem(Package): # other version. version('develop', branch='master') + version('4.1.0', + '4c83fdcf083f8e2f5b37200a755db843cdb858811e25a8486ad36b2cbec0e11d', + url='https://bit.ly/mfem-4-1', extension='.tar.gz', + preferred=True) + # Tagged development version used by xSDK version('4.0.1-xsdk', commit='c55c80d17b82d80de04b849dd526e17044f8c99a') version('4.0.0', 'df5bdac798ea84a263979f6fbf79de9013e1c55562f95f98644c3edcacfbc727', - url='https://bit.ly/mfem-4-0', extension='.tar.gz', - preferred=True) + url='https://bit.ly/mfem-4-0', extension='.tar.gz') # Tagged development version used by the laghos package: version('3.4.1-laghos-v2.0', tag='laghos-v2.0') @@ -96,8 +100,13 @@ class Mfem(Package): description='Required for MPI parallelism') variant('openmp', default=False, description='Enable OpenMP parallelism') + variant('cuda', default=False, description='Enable CUDA support') + variant('cuda_arch', default='sm_60', + description='CUDA architecture to compile for') variant('occa', default=False, description='Enable OCCA backend') variant('raja', default=False, description='Enable RAJA backend') + variant('libceed', default=False, description='Enable libCEED backend') + variant('umpire', default=False, description='Enable Umpire support') variant('threadsafe', default=False, description=('Enable thread safe features.' @@ -105,9 +114,8 @@ class Mfem(Package): ' May cause minor performance issues.')) variant('superlu-dist', default=False, description='Enable MPI parallel, sparse direct solvers') - # Placeholder for STRUMPACK, support added in mfem v3.3.2: - # variant('strumpack', default=False, - # description='Enable support for STRUMPACK') + variant('strumpack', default=False, + description='Enable support for STRUMPACK') variant('suite-sparse', default=False, description='Enable serial, sparse direct solvers') variant('petsc', default=False, @@ -116,6 +124,8 @@ class Mfem(Package): description='Enable Sundials time integrators') variant('pumi', default=False, description='Enable functionality based on PUMI') + variant('gslib', default=False, + description='Enable functionality based on GSLIB') variant('mpfr', default=False, description='Enable precise, 1D quadrature rules') variant('lapack', default=False, @@ -126,7 +136,7 @@ class Mfem(Package): description='Enable Cubit/Genesis reader') variant('conduit', default=False, description='Enable binary data I/O using Conduit') - variant('gzstream', default=True, + variant('zlib', default=True, description='Support zip\'d streams for I/O') variant('gnutls', default=False, description='Enable secure sockets using GnuTLS') @@ -144,43 +154,58 @@ class Mfem(Package): conflicts('~static~shared') conflicts('~threadsafe', when='+openmp') + conflicts('+cuda', when='@:3.99.99') conflicts('+netcdf', when='@:3.1') conflicts('+superlu-dist', when='@:3.1') + # STRUMPACK support was added in mfem v3.3.2, however, here we allow only + # strumpack v3 support which is available starting with mfem v4.0: + conflicts('+strumpack', when='@:3.99.99') conflicts('+gnutls', when='@:3.1') - conflicts('+gzstream', when='@:3.2') + conflicts('+zlib', when='@:3.2') conflicts('+mpfr', when='@:3.2') conflicts('+petsc', when='@:3.2') conflicts('+sundials', when='@:3.2') conflicts('+pumi', when='@:3.3.2') + conflicts('+gslib', when='@:4.0.99') conflicts('timer=mac', when='@:3.3.0') conflicts('timer=mpi', when='@:3.3.0') conflicts('~metis+mpi', when='@:3.3.0') conflicts('+metis~mpi', when='@:3.3.0') conflicts('+conduit', when='@:3.3.2') + conflicts('+occa', when='mfem@:3.99.99') + conflicts('+raja', when='mfem@:3.99.99') + conflicts('+libceed', when='mfem@:4.0.99') + conflicts('+umpire', when='mfem@:4.0.99') conflicts('+superlu-dist', when='~mpi') + conflicts('+strumpack', when='~mpi') conflicts('+petsc', when='~mpi') conflicts('+pumi', when='~mpi') conflicts('timer=mpi', when='~mpi') - conflicts('+pumi', when='+shared') - depends_on('mpi', when='+mpi') - depends_on('hypre@2.10.0:2.13.999', when='@:3.3.999+mpi') + depends_on('hypre@2.10.0:2.13.99', when='@:3.3.99+mpi') depends_on('hypre', when='@3.4:+mpi') depends_on('metis', when='+metis') depends_on('blas', when='+lapack') depends_on('lapack@3.0:', when='+lapack') + depends_on('cuda', when='+cuda') + depends_on('sundials@2.7.0', when='@:3.3.0+sundials~mpi') depends_on('sundials@2.7.0+mpi+hypre', when='@:3.3.0+sundials+mpi') depends_on('sundials@2.7.0:', when='@3.3.2:+sundials~mpi') depends_on('sundials@2.7.0:+mpi+hypre', when='@3.3.2:+sundials+mpi') - depends_on('sundials@5.0.0', when='@4.0.1-xsdk:+sundials~mpi') - depends_on('pumi', when='+pumi') + depends_on('sundials@5.0.0:', when='@4.0.1-xsdk:+sundials~mpi') + depends_on('sundials@5.0.0:+mpi+hypre', when='@4.0.1-xsdk:+sundials+mpi') + depends_on('pumi', when='+pumi~shared') + depends_on('pumi+shared', when='+pumi+shared') + depends_on('gslib@1.0.5:+mpi', when='+gslib+mpi') + depends_on('gslib@1.0.5:~mpi~mpiio', when='+gslib~mpi') depends_on('suite-sparse', when='+suite-sparse') depends_on('superlu-dist', when='+superlu-dist') + depends_on('strumpack@3.0.0:', when='+strumpack') # The PETSc tests in MFEM will fail if PETSc is not configured with # SuiteSparse and MUMPS. On the other hand, if we require the variants # '+suite-sparse+mumps' of PETSc, the xsdk package concretization fails. @@ -191,23 +216,32 @@ class Mfem(Package): depends_on('mpfr', when='+mpfr') depends_on('netcdf-c@4.1.3:', when='+netcdf') depends_on('unwind', when='+libunwind') - depends_on('zlib', when='+gzstream') + depends_on('zlib', when='+zlib') depends_on('gnutls', when='+gnutls') depends_on('conduit@0.3.1:,master:', when='+conduit') depends_on('conduit+mpi', when='+conduit+mpi') # The MFEM 4.0.0 SuperLU interface fails when using hypre@2.16.0 and # superlu-dist@6.1.1. See https://github.com/mfem/mfem/issues/983. - conflicts('+hypre+superlu-dist', - when='mfem@4.0.0 ^hypre@2.16.0 ^superlu-dist@6.1.1') + # This issue was resolved in v4.1. + conflicts('+superlu-dist', + when='mfem@:4.0.99 ^hypre@2.16.0: ^superlu-dist@6:') + # The STRUMPACK v3 interface in MFEM seems to be broken as of MFEM v4.1 + # when using hypre version >= 2.16.0: + conflicts('+strumpack', when='mfem@4.0.0: ^hypre@2.16.0:') - # The OCCA backend is first available in MFEM 4.0.0 - depends_on('occa', when='mfem@4.0.0:+occa') - conflicts('+occa', when='mfem@:3.99.999') + depends_on('occa@1.0.8:', when='+occa') + depends_on('occa+cuda', when='+occa+cuda') - # The RAJA backend is first available in MFEM 4.0.0 - depends_on('raja', when='mfem@4.0.0:+raja') - conflicts('+raja', when='mfem@:3.99.999') + depends_on('raja@0.10.0:', when='@4.0.1:+raja') + depends_on('raja@0.7.0:0.9.0', when='@4.0.0+raja') + depends_on('raja+cuda', when='+raja+cuda') + + depends_on('libceed@0.6:', when='+libceed') + depends_on('libceed+cuda', when='+libceed+cuda') + + depends_on('umpire@2.0.0:', when='+umpire') + depends_on('umpire+cuda', when='+umpire+cuda') patch('mfem_ppc_build.patch', when='@3.2:3.3.0 arch=ppc64le') patch('mfem-3.4.patch', when='@3.4.0') @@ -237,18 +271,47 @@ class Mfem(Package): def yes_no(varstr): return 'YES' if varstr in self.spec else 'NO' + # See also find_system_libraries in lib/spack/llnl/util/filesystem.py + # where the same list of paths is used. + sys_lib_paths = [ + '/lib64', + '/lib', + '/usr/lib64', + '/usr/lib', + '/usr/local/lib64', + '/usr/local/lib'] + + def is_sys_lib_path(dir): + return dir in sys_lib_paths + + xcompiler = '' + xlinker = '-Wl,' + if '+cuda' in spec: + xcompiler = '-Xcompiler=' + xlinker = '-Xlinker=' + cuda_arch = spec.variants['cuda_arch'].value + # We need to add rpaths explicitly to allow proper export of link flags # from within MFEM. # Similar to spec[pkg].libs.ld_flags but prepends rpath flags too. + # Also does not add system library paths as defined by 'sys_lib_paths' + # above -- this is done to avoid issues like this: + # https://github.com/mfem/mfem/issues/1088. def ld_flags_from_library_list(libs_list): - flags = ['-Wl,-rpath,%s' % dir for dir in libs_list.directories] - flags += [libs_list.ld_flags] + flags = ['%s-rpath,%s' % (xlinker, dir) + for dir in libs_list.directories + if not is_sys_lib_path(dir)] + flags += ['-L%s' % dir for dir in libs_list.directories + if not is_sys_lib_path(dir)] + flags += [libs_list.link_flags] return ' '.join(flags) def ld_flags_from_dirs(pkg_dirs_list, pkg_libs_list): - flags = ['-Wl,-rpath,%s' % dir for dir in pkg_dirs_list] - flags += ['-L%s' % dir for dir in pkg_dirs_list] + flags = ['%s-rpath,%s' % (xlinker, dir) for dir in pkg_dirs_list + if not is_sys_lib_path(dir)] + flags += ['-L%s' % dir for dir in pkg_dirs_list + if not is_sys_lib_path(dir)] flags += ['-l%s' % lib for lib in pkg_libs_list] return ' '.join(flags) @@ -265,6 +328,9 @@ class Mfem(Package): if ('+metis' in spec) and spec['metis'].satisfies('@5:'): metis5_str = 'YES' + zlib_var = 'MFEM_USE_ZLIB' if (spec.satisfies('@4.1.0:')) else \ + 'MFEM_USE_GZSTREAM' + options = [ 'PREFIX=%s' % prefix, 'MFEM_USE_MEMALLOC=YES', @@ -273,32 +339,41 @@ class Mfem(Package): # compiler is defined by env['SPACK_CXX']. 'CXX=%s' % env['CXX'], 'MFEM_USE_LIBUNWIND=%s' % yes_no('+libunwind'), - 'MFEM_USE_GZSTREAM=%s' % yes_no('+gzstream'), + '%s=%s' % (zlib_var, yes_no('+zlib')), 'MFEM_USE_METIS=%s' % yes_no('+metis'), 'MFEM_USE_METIS_5=%s' % metis5_str, 'MFEM_THREAD_SAFE=%s' % yes_no('+threadsafe'), 'MFEM_USE_MPI=%s' % yes_no('+mpi'), 'MFEM_USE_LAPACK=%s' % yes_no('+lapack'), 'MFEM_USE_SUPERLU=%s' % yes_no('+superlu-dist'), + 'MFEM_USE_STRUMPACK=%s' % yes_no('+strumpack'), 'MFEM_USE_SUITESPARSE=%s' % yes_no('+suite-sparse'), 'MFEM_USE_SUNDIALS=%s' % yes_no('+sundials'), 'MFEM_USE_PETSC=%s' % yes_no('+petsc'), 'MFEM_USE_PUMI=%s' % yes_no('+pumi'), + 'MFEM_USE_GSLIB=%s' % yes_no('+gslib'), 'MFEM_USE_NETCDF=%s' % yes_no('+netcdf'), 'MFEM_USE_MPFR=%s' % yes_no('+mpfr'), 'MFEM_USE_GNUTLS=%s' % yes_no('+gnutls'), 'MFEM_USE_OPENMP=%s' % yes_no('+openmp'), - 'MFEM_USE_CONDUIT=%s' % yes_no('+conduit')] - - if spec.satisfies('@4.0.0:'): - options += ['MFEM_USE_OCCA=%s' % yes_no('+occa'), - 'MFEM_USE_RAJA=%s' % yes_no('+raja')] + 'MFEM_USE_CONDUIT=%s' % yes_no('+conduit'), + 'MFEM_USE_CUDA=%s' % yes_no('+cuda'), + 'MFEM_USE_OCCA=%s' % yes_no('+occa'), + 'MFEM_USE_RAJA=%s' % yes_no('+raja'), + 'MFEM_USE_CEED=%s' % yes_no('+libceed'), + 'MFEM_USE_UMPIRE=%s' % yes_no('+umpire')] cxxflags = spec.compiler_flags['cxxflags'] - if self.spec.satisfies('@4.0:'): - cxxflags.append(self.compiler.cxx11_flag) if cxxflags: + cxxflags = [(xcompiler + flag) for flag in cxxflags] + if '+cuda' in spec: + cxxflags += [ + '-x=cu --expt-extended-lambda -arch=%s' % cuda_arch, + '-ccbin %s' % (spec['mpi'].mpicxx if '+mpi' in spec + else env['CXX'])] + if self.spec.satisfies('@4.0.0:'): + cxxflags.append(self.compiler.cxx11_flag) # The cxxflags are set by the spack c++ compiler wrapper. We also # set CXXFLAGS explicitly, for clarity, and to properly export the # cxxflags in the variable MFEM_CXXFLAGS in config.mk. @@ -325,7 +400,7 @@ class Mfem(Package): options += [ 'METIS_OPT=-I%s' % spec['metis'].prefix.include, 'METIS_LIB=%s' % - ld_flags_from_dirs([spec['metis'].prefix.lib], ['metis'])] + ld_flags_from_library_list(spec['metis'].libs)] if '+lapack' in spec: lapack_blas = spec['lapack'].libs + spec['blas'].libs @@ -339,11 +414,42 @@ class Mfem(Package): 'SUPERLU_OPT=-I%s -I%s' % (spec['superlu-dist'].prefix.include, spec['parmetis'].prefix.include), - 'SUPERLU_LIB=-L%s -L%s -lsuperlu_dist -lparmetis %s' % - (spec['superlu-dist'].prefix.lib, - spec['parmetis'].prefix.lib, + 'SUPERLU_LIB=%s %s' % + (ld_flags_from_dirs([spec['superlu-dist'].prefix.lib, + spec['parmetis'].prefix.lib], + ['superlu_dist', 'parmetis']), ld_flags_from_library_list(lapack_blas))] + if '+strumpack' in spec: + strumpack = spec['strumpack'] + sp_opt = ['-I%s' % strumpack.prefix.include] + sp_lib = [ld_flags_from_library_list(strumpack.libs)] + # Parts of STRUMPACK use fortran, so we need to link with the + # fortran library and also the MPI fortran library: + if '~shared' in strumpack: + if os.path.basename(env['FC']) == 'gfortran': + sp_lib += ['-lgfortran'] + if '^mpich' in strumpack: + sp_lib += ['-lmpifort'] + elif '^openmpi' in strumpack: + sp_lib += ['-lmpi_mpifh'] + if '+openmp' in strumpack: + sp_opt += [self.compiler.openmp_flag] + if '^scalapack' in strumpack: + scalapack = strumpack['scalapack'] + sp_opt += ['-I%s' % scalapack.prefix.include] + sp_lib += [ld_flags_from_dirs([scalapack.prefix.lib], + ['scalapack'])] + if '+butterflypack' in strumpack: + bp = strumpack['butterflypack'] + sp_opt += ['-I%s' % bp.prefix.include] + sp_lib += [ld_flags_from_dirs([bp.prefix.lib], + ['dbutterflypack', + 'zbutterflypack'])] + options += [ + 'STRUMPACK_OPT=%s' % ' '.join(sp_opt), + 'STRUMPACK_LIB=%s' % ' '.join(sp_lib)] + if '+suite-sparse' in spec: ss_spec = 'suite-sparse:' + self.suitesparse_components options += [ @@ -359,14 +465,24 @@ class Mfem(Package): ld_flags_from_library_list(spec[sun_spec].libs)] if '+petsc' in spec: - # options += ['PETSC_DIR=%s' % spec['petsc'].prefix] options += [ 'PETSC_OPT=%s' % spec['petsc'].headers.cpp_flags, 'PETSC_LIB=%s' % ld_flags_from_library_list(spec['petsc'].libs)] if '+pumi' in spec: - options += ['PUMI_DIR=%s' % spec['pumi'].prefix] + pumi_libs = ['pumi', 'crv', 'ma', 'mds', 'apf', 'pcu', 'gmi', + 'parma', 'lion', 'mth', 'apf_zoltan', 'spr'] + options += [ + 'PUMI_OPT=-I%s' % spec['pumi'].prefix.include, + 'PUMI_LIB=%s' % + ld_flags_from_dirs([spec['pumi'].prefix.lib], pumi_libs)] + + if '+gslib' in spec: + options += [ + 'GSLIB_OPT=-I%s' % spec['gslib'].prefix.include, + 'GSLIB_LIB=%s' % + ld_flags_from_dirs([spec['gslib'].prefix.lib], ['gs'])] if '+netcdf' in spec: options += [ @@ -374,7 +490,7 @@ class Mfem(Package): 'NETCDF_LIB=%s' % ld_flags_from_dirs([spec['netcdf-c'].prefix.lib], ['netcdf'])] - if '+gzstream' in spec: + if '+zlib' in spec: if "@:3.3.2" in spec: options += ['ZLIB_DIR=%s' % spec['zlib'].prefix] else: @@ -409,20 +525,34 @@ class Mfem(Package): if '+openmp' in spec: options += ['OPENMP_OPT=%s' % self.compiler.openmp_flag] + if '+cuda' in spec: + options += [ + 'CUDA_CXX=%s' % join_path(spec['cuda'].prefix, 'bin', 'nvcc'), + 'CUDA_ARCH=%s' % cuda_arch] + if '+occa' in spec: - options += ['OCCA_DIR=%s' % spec['occa'].prefix, - 'OCCA_OPT=-I%s' % spec['occa'].prefix.include, + options += ['OCCA_OPT=-I%s' % spec['occa'].prefix.include, 'OCCA_LIB=%s' % ld_flags_from_dirs([spec['occa'].prefix.lib], ['occa'])] if '+raja' in spec: - options += ['RAJA_DIR=%s' % spec['raja'].prefix, - 'RAJA_OPT=-I%s' % spec['raja'].prefix.include, + options += ['RAJA_OPT=-I%s' % spec['raja'].prefix.include, 'RAJA_LIB=%s' % ld_flags_from_dirs([spec['raja'].prefix.lib], ['RAJA'])] + if '+libceed' in spec: + options += ['CEED_OPT=-I%s' % spec['libceed'].prefix.include, + 'CEED_LIB=%s' % + ld_flags_from_dirs([spec['libceed'].prefix.lib], + ['ceed'])] + + if '+umpire' in spec: + options += ['UMPIRE_OPT=-I%s' % spec['umpire'].prefix.include, + 'UMPIRE_LIB=%s' % + ld_flags_from_library_list(spec['umpire'].libs)] + timer_ids = {'std': '0', 'posix': '2', 'mac': '4', 'mpi': '6'} timer = spec.variants['timer'].value if timer != 'auto': diff --git a/var/spack/repos/builtin/packages/mfem/test_builds.sh b/var/spack/repos/builtin/packages/mfem/test_builds.sh index 125fa0055c..4f3c3f787b 100755 --- a/var/spack/repos/builtin/packages/mfem/test_builds.sh +++ b/var/spack/repos/builtin/packages/mfem/test_builds.sh @@ -1,59 +1,82 @@ #!/bin/bash +# Set a compiler to test with, e.g. '%gcc', '%clang', etc. +compiler='' + +mfem='mfem'${compiler} +mfem_dev='mfem@develop'${compiler} + +backends='+occa+raja+libceed' +# Using occa@develop to help the spack concretization +backends_specs='^occa@develop~cuda ^raja~openmp' + +# As of 03/20/20 +mpfr breaks one of the unit tests in both @4.1.0 and @develop, +# so it is disabled here for now. +# mpfr='+mpfr' +mpfr='' + builds=( # preferred version: - 'mfem' - 'mfem~mpi~metis~gzstream' - 'mfem+mpi+superlu-dist+suite-sparse+petsc \ - +sundials+pumi+mpfr+netcdf+gzstream+gnutls+libunwind \ - ^hypre~internal-superlu ^petsc+suite-sparse+mumps' - 'mfem~mpi+suite-sparse+sundials+mpfr+netcdf \ - +gzstream+gnutls+libunwind' + ${mfem} + ${mfem}'~mpi~metis~zlib' + # NOTE: Skip +strumpack since mfem needs hypre < 2.16.0 in that case + ${mfem}"$backends"'+superlu-dist+suite-sparse+petsc \ + +sundials+pumi+gslib'${mpfr}'+netcdf+zlib+gnutls+libunwind+conduit \ + ^petsc+suite-sparse+mumps'" $backends_specs" + ${mfem}'~mpi \ + '"$backends"'+suite-sparse+sundials+gslib'${mpfr}'+netcdf \ + +zlib+gnutls+libunwind+conduit'" $backends_specs" # develop version: - 'mfem@develop+shared~static' - 'mfem@develop+shared~static~mpi~metis~gzstream' - # TODO: Replace '^conduit~python~hdf5' with '^conduit~python' when conduit - # is fixed to accept '^hdf5+mpi'. - # NOTE: Skip PUMI since it conflicts with '+shared'. - 'mfem@develop+shared~static+mpi \ - +superlu-dist+suite-sparse+petsc+sundials+mpfr+netcdf+gzstream \ - +gnutls+libunwind+conduit ^hypre~internal-superlu \ - ^petsc+suite-sparse+mumps ^conduit~python~hdf5' - # TODO: The options '^netcdf~mpi ^hdf5@1.8.19~mpi' are added just to make - # conduit happy. - 'mfem@develop+shared~static~mpi \ - +suite-sparse+sundials+mpfr+netcdf+gzstream+gnutls+libunwind \ - +conduit ^conduit~python ^netcdf~mpi ^hdf5@1.8.19~mpi' + ${mfem_dev}'+shared~static' + ${mfem_dev}'+shared~static~mpi~metis~zlib' + # NOTE: Skip +strumpack since mfem needs hypre < 2.16.0 in that case + # NOTE: Shared build with +gslib works on mac but not on linux + ${mfem_dev}'+shared~static \ + '"$backends"'+superlu-dist+suite-sparse+petsc \ + +sundials+pumi'${mpfr}'+netcdf+zlib+gnutls+libunwind+conduit \ + ^petsc+suite-sparse+mumps'" $backends_specs" + ${mfem_dev}'+shared~static~mpi \ + '"$backends"'+suite-sparse+sundials'${mpfr}'+netcdf \ + +zlib+gnutls+libunwind+conduit'" $backends_specs" ) builds2=( # preferred version - 'mfem+superlu-dist' - 'mfem+suite-sparse~mpi' - 'mfem+suite-sparse' - 'mfem+sundials~mpi' - 'mfem+sundials' - 'mfem+pumi' - 'mfem+netcdf~mpi' - 'mfem+netcdf' - 'mfem+mpfr' - 'mfem+gnutls' - 'mfem+petsc+mpi ^hypre~internal-superlu ^petsc+suite-sparse+mumps' + ${mfem}"$backends $backends_specs" + ${mfem}'+superlu-dist' + # NOTE: On mac +strumpack works only with gcc, as of 03/20/20. + ${mfem}'+strumpack ^hypre@2.15.1' + ${mfem}'+suite-sparse~mpi' + ${mfem}'+suite-sparse' + ${mfem}'+sundials~mpi' + ${mfem}'+sundials' + ${mfem}'+pumi' + ${mfem}'+gslib' + ${mfem}'+netcdf~mpi' + ${mfem}'+netcdf' + ${mfem}${mpfr} + ${mfem}'+gnutls' + ${mfem}'+conduit~mpi' + ${mfem}'+conduit' + ${mfem}'+petsc ^petsc+suite-sparse+mumps' # develop version - 'mfem@develop+superlu-dist' - 'mfem@develop+suite-sparse~mpi' - 'mfem@develop+suite-sparse' - 'mfem@develop+sundials~mpi' - 'mfem@develop+sundials' - 'mfem@develop+pumi' - 'mfem@develop+netcdf~mpi' - 'mfem@develop+netcdf' - 'mfem@develop+mpfr' - 'mfem@develop+gnutls' - 'mfem@develop+conduit~mpi ^conduit~python' - 'mfem@develop+conduit ^conduit~python' - 'mfem@develop+petsc+mpi ^hypre~internal-superlu \ - ^petsc+suite-sparse+mumps' + ${mfem_dev}"$backends $backends_specs" + ${mfem_dev}'+superlu-dist' + # NOTE: On mac +strumpack works only with gcc, as of 03/20/20. + ${mfem_dev}'+strumpack ^hypre@2.15.1' + ${mfem_dev}'+suite-sparse~mpi' + ${mfem_dev}'+suite-sparse' + ${mfem_dev}'+sundials~mpi' + ${mfem_dev}'+sundials' + ${mfem_dev}'+pumi' + ${mfem_dev}'+gslib' + ${mfem_dev}'+netcdf~mpi' + ${mfem_dev}'+netcdf' + ${mfem_dev}${mpfr} + ${mfem_dev}'+gnutls' + ${mfem_dev}'+conduit~mpi' + ${mfem_dev}'+conduit' + ${mfem_dev}'+petsc ^petsc+suite-sparse+mumps' ) trap 'printf "\nScript interrupted.\n"; exit 33' INT diff --git a/var/spack/repos/builtin/packages/nek5000/package.py b/var/spack/repos/builtin/packages/nek5000/package.py index 86ccb6b090..47bea5f6e5 100644 --- a/var/spack/repos/builtin/packages/nek5000/package.py +++ b/var/spack/repos/builtin/packages/nek5000/package.py @@ -4,7 +4,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) from spack import * - +from shutil import copyfile import os @@ -13,14 +13,17 @@ class Nek5000(Package): dynamics""" homepage = "https://nek5000.mcs.anl.gov/" - url = "https://github.com/Nek5000/Nek5000/releases/download/v17.0/Nek5000-v17.0.tar.gz" + url = 'https://github.com/Nek5000/Nek5000/archive/v17.0.tar.gz' git = "https://github.com/Nek5000/Nek5000.git" tags = ['cfd', 'flow', 'hpc', 'solver', 'navier-stokes', 'spectral-elements', 'fluid', 'ecp', 'ecp-apps'] version('develop', branch='master') - version('17.0', sha256='298d83ffd9f695ee7cf565cb445be33b02775eb9c2e9f0f74d91d89fe722e114') + version('17.0', + '4d8d4793ce3c926c54e09a5a5968fa959fe0ba46bd2e6b8043e099528ee35a60') + version('19.0', + 'db129877a10ff568d49edc77cf65f9e732eecb1fce10edbd91ffc5ac10c41ad6') # MPI, Profiling and Visit variants variant('mpi', default=True, description='Build with MPI.') @@ -42,6 +45,14 @@ class Nek5000(Package): @run_after('install') def test_install(self): with working_dir('short_tests/eddy'): + f_size = join_path(os.getcwd(), 'SIZE') + f_size_legacy = join_path(os.getcwd(), 'SIZE.legacy') + if not os.access(f_size, os.F_OK): + if os.access(f_size_legacy, os.F_OK): + copyfile(f_size_legacy, f_size) + else: + raise RuntimeError('Can not find {0}'.format(f_size)) + os.system(join_path(self.prefix.bin, 'makenek') + ' eddy_uv') if not os.path.isfile(join_path(os.getcwd(), 'nek5000')): msg = 'Cannot build example: short_tests/eddy.' @@ -93,8 +104,14 @@ class Nek5000(Package): # Nek5000 source. filter_file(r'^#FC\s*=.*', 'FC="{0}"'.format(fc), 'makenek') filter_file(r'^#CC\s*=.*', 'CC="{0}"'.format(cc), 'makenek') - filter_file(r'^#SOURCE_ROOT\s*=\"\$H.*', 'SOURCE_ROOT=\"' + - prefix.bin.Nek5000 + '\"', 'makenek') + if self.spec.version == Version('17.0'): + filter_file(r'^#SOURCE_ROOT\s*=\"\$H.*', 'SOURCE_ROOT=\"' + + prefix.bin.Nek5000 + '\"', 'makenek') + else: + filter_file(r'^#NEK_SOURCE_ROOT\s*=\"\$H.*', + 'NEK_SOURCE_ROOT=\"' + prefix.bin.Nek5000 + '\"', + 'makenek') + if fflags: filter_file(r'^#FFLAGS=.*', 'FFLAGS+=" {0}"'.format(fflags), 'makenek') @@ -116,4 +133,4 @@ class Nek5000(Package): install_tree(bin_dir, prefix.bin) # Copy Nek5000 source to prefix/bin - install_tree('../Nek5000', prefix.bin.Nek5000) + install_tree(self.stage.source_path, prefix.bin.Nek5000) diff --git a/var/spack/repos/builtin/packages/nekbone/package.py b/var/spack/repos/builtin/packages/nekbone/package.py index 0ad37561e3..6f8cd220ff 100644 --- a/var/spack/repos/builtin/packages/nekbone/package.py +++ b/var/spack/repos/builtin/packages/nekbone/package.py @@ -13,13 +13,15 @@ class Nekbone(Package): the spectral element method.""" homepage = "https://github.com/Nek5000/Nekbone" - url = "https://github.com/Nek5000/Nekbone/archive/v17.0.tar.gz" git = "https://github.com/Nek5000/Nekbone.git" tags = ['proxy-app', 'ecp-proxy-app'] version('develop', branch='master') - version('17.0', sha256='ae361cc61368a924398a28a296f675b7f0c4a9516788a7f8fa3c09d787cdf69b') + version('17.0', + 'ae361cc61368a924398a28a296f675b7f0c4a9516788a7f8fa3c09d787cdf69b', + url='https://github.com/Nek5000/Nekbone/archive/v17.0.tar.gz', + extension='.tar.gz') # Variants variant('mpi', default=True, description='Build with MPI') diff --git a/var/spack/repos/builtin/packages/nekcem/package.py b/var/spack/repos/builtin/packages/nekcem/package.py index e5f829677d..09e1988224 100644 --- a/var/spack/repos/builtin/packages/nekcem/package.py +++ b/var/spack/repos/builtin/packages/nekcem/package.py @@ -20,7 +20,9 @@ class Nekcem(Package): variant('mpi', default=True, description='Build with MPI') # We only have a development version - version('develop') + version('develop', branch='development') + # The following hash-versions are used by the 'ceed' package + version('c8db04b', commit='c8db04b96f9b9cb0434ee75da711502fe95891b5') version('0b8bedd', commit='0b8beddfdcca646bfcc866dfda1c5f893338399b') version('7332619', commit='7332619b73d03868a256614b61794dce2d95b360') @@ -28,7 +30,6 @@ class Nekcem(Package): depends_on('mpi', when='+mpi') depends_on('blas') depends_on('lapack') - depends_on('python@2.7:', type='build') @run_before('install') def fortran_check(self): @@ -112,7 +113,7 @@ class Nekcem(Package): 'makenek') # Install NekCEM in prefix/bin - install_tree('../NekCEM', prefix.bin.NekCEM) + install_tree(self.stage.source_path, prefix.bin.NekCEM) # Create symlinks to makenek, nek and configurenek scripts with working_dir(prefix.bin): os.symlink(os.path.join('NekCEM', bin_dir, makenek), makenek) diff --git a/var/spack/repos/builtin/packages/nektools/package.py b/var/spack/repos/builtin/packages/nektools/package.py index c8a5b46a9f..d1f190e653 100644 --- a/var/spack/repos/builtin/packages/nektools/package.py +++ b/var/spack/repos/builtin/packages/nektools/package.py @@ -22,14 +22,17 @@ class Nektools(Package): """Tools reuqired by Nek5000""" homepage = "https://nek5000.mcs.anl.gov/" - url = "https://github.com/Nek5000/Nek5000/releases/download/v17.0/Nek5000-v17.0.tar.gz" + url = 'https://github.com/Nek5000/Nek5000/archive/v17.0.tar.gz' git = "https://github.com/Nek5000/Nek5000.git" tags = ['cfd', 'flow', 'hpc', 'solver', 'navier-stokes', 'spectral-elements', 'fluid', 'ecp', 'ecp-apps'] version('develop', branch='master') - version('17.0', sha256='298d83ffd9f695ee7cf565cb445be33b02775eb9c2e9f0f74d91d89fe722e114') + version('19.0', + 'db129877a10ff568d49edc77cf65f9e732eecb1fce10edbd91ffc5ac10c41ad6') + version('17.0', + '4d8d4793ce3c926c54e09a5a5968fa959fe0ba46bd2e6b8043e099528ee35a60') # Variant for MAXNEL, we need to read this from user variant( diff --git a/var/spack/repos/builtin/packages/occa/package.py b/var/spack/repos/builtin/packages/occa/package.py index 314f79b121..ec7e303a3e 100644 --- a/var/spack/repos/builtin/packages/occa/package.py +++ b/var/spack/repos/builtin/packages/occa/package.py @@ -19,7 +19,10 @@ class Occa(Package): homepage = "http://libocca.org" git = 'https://github.com/libocca/occa.git' + maintainers = ['v-dobrev', 'dmed256'] + version('develop') + version('1.0.9', tag='v1.0.9') version('1.0.8', tag='v1.0.8') version('1.0.0-alpha.5', tag='v1.0.0-alpha.5') version('0.2.0', tag='v0.2.0') @@ -97,6 +100,9 @@ class Occa(Package): else: env.set('OCCA_CUDA_ENABLED', '0') + # Disable hip autodetection for now since it fails on some machines. + env.set('OCCA_HIP_ENABLED', '0') + if '~opencl' in spec: env.set('OCCA_OPENCL_ENABLED', '0') diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py index 8e1770aac8..cccced63a0 100644 --- a/var/spack/repos/builtin/packages/petsc/package.py +++ b/var/spack/repos/builtin/packages/petsc/package.py @@ -66,6 +66,7 @@ class Petsc(Package): variant('shared', default=True, description='Enables the build of shared libraries') variant('mpi', default=True, description='Activates MPI support') + variant('cuda', default=False, description='Activates CUDA support') variant('double', default=True, description='Switches between single and double precision') variant('complex', default=False, description='Build with complex numbers') @@ -133,6 +134,7 @@ class Petsc(Package): depends_on('blas') depends_on('lapack') depends_on('mpi', when='+mpi') + depends_on('cuda', when='+cuda') # Build dependencies depends_on('python@2.6:2.8', type='build', when='@:3.10.99') @@ -147,8 +149,8 @@ class Petsc(Package): depends_on('metis@5:~int64', when='@3.8:+metis~int64') depends_on('metis@5:+int64', when='@3.8:+metis+int64') - depends_on('hdf5@:1.10.99+mpi+hl+fortran', when='@:3.12.99+hdf5+mpi') - depends_on('hdf5+mpi+hl+fortran', when='@3.13:+hdf5+mpi') + depends_on('hdf5@:1.10.99+mpi', when='@:3.12.99+hdf5+mpi') + depends_on('hdf5+mpi', when='@3.13:+hdf5+mpi') depends_on('zlib', when='+hdf5') depends_on('parmetis', when='+metis+mpi') depends_on('valgrind', when='+valgrind') @@ -294,7 +296,7 @@ class Petsc(Package): ]) # Activates library support if needed - for library in ('metis', 'hdf5', 'hypre', 'parmetis', + for library in ('cuda', 'metis', 'hdf5', 'hypre', 'parmetis', 'mumps', 'trilinos', 'fftw', 'valgrind'): options.append( '--with-{library}={value}'.format( diff --git a/var/spack/repos/builtin/packages/remhos/package.py b/var/spack/repos/builtin/packages/remhos/package.py new file mode 100644 index 0000000000..337c0056dd --- /dev/null +++ b/var/spack/repos/builtin/packages/remhos/package.py @@ -0,0 +1,54 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack import * + + +class Remhos(MakefilePackage): + """Remhos (REMap High-Order Solver) is a CEED miniapp that performs monotonic + and conservative high-order discontinuous field interpolation (remap) + using DG advection-based spatial discretization and explicit high-order + time-stepping. + """ + tags = ['proxy-app'] + + homepage = "https://github.com/CEED/Remhos" + url = "https://github.com/CEED/Remhos/archive/v1.0.tar.gz" + git = "https://github.com/CEED/Remhos.git" + + maintainers = ['v-dobrev', 'tzanio', 'vladotomov'] + + version('develop', branch='master') + version('1.0', sha256='e60464a867fe5b1fd694fbb37bb51773723427f071c0ae26852a2804c08bbb32') + + variant('metis', default=True, description='Enable/disable METIS support') + + depends_on('mfem+mpi+metis', when='+metis') + depends_on('mfem+mpi~metis', when='~metis') + + depends_on('mfem@develop', when='@develop') + depends_on('mfem@4.1.0:', when='@1.0') + + @property + def build_targets(self): + targets = [] + spec = self.spec + + targets.append('MFEM_DIR=%s' % spec['mfem'].prefix) + targets.append('CONFIG_MK=%s' % spec['mfem'].package.config_mk) + targets.append('TEST_MK=%s' % spec['mfem'].package.test_mk) + + return targets + + # See lib/spack/spack/build_systems/makefile.py + def check(self): + with working_dir(self.build_directory): + make('tests', *self.build_targets) + + def install(self, spec, prefix): + mkdirp(prefix.bin) + install('remhos', prefix.bin) + + install_time_test_callbacks = [] diff --git a/var/spack/repos/builtin/packages/suite-sparse/package.py b/var/spack/repos/builtin/packages/suite-sparse/package.py index 39532db801..da2cc222ae 100644 --- a/var/spack/repos/builtin/packages/suite-sparse/package.py +++ b/var/spack/repos/builtin/packages/suite-sparse/package.py @@ -97,6 +97,14 @@ class SuiteSparse(Package): 'LAPACK=%s' % spec['lapack'].libs.ld_flags, ] + # Recent versions require c11 but some demos do not get the c11 from + # GraphBLAS/CMakeLists.txt, for example the file + # GraphBLAS/Demo/Program/wildtype_demo.c. For many compilers this is + # not an issue because c11 or newer is their default. However, for some + # compilers (e.g. xlc) the c11 flag is necessary. + if spec.satisfies('@5.4:'): + make_args += ['CFLAGS+=%s' % self.compiler.c11_flag] + # 64bit blas in UMFPACK: if (spec.satisfies('^openblas+ilp64') or spec.satisfies('^intel-mkl+ilp64') or -- cgit v1.2.3-70-g09d2