Merge pull request #1053 from davydden/pkg/dealii_suite_update
update Petsc, Slepc, Trilinos, Superlu-dist and deal.II
This commit is contained in:
commit
c09111bbef
@ -22,28 +22,28 @@
|
|||||||
# License along with this program; if not, write to the Free Software
|
# License along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
__all__ = ['set_install_permissions', 'install', 'install_tree', 'traverse_tree',
|
|
||||||
'expand_user', 'working_dir', 'touch', 'touchp', 'mkdirp',
|
|
||||||
'force_remove', 'join_path', 'ancestor', 'can_access', 'filter_file',
|
|
||||||
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
|
|
||||||
'set_executable', 'copy_mode', 'unset_executable_mode',
|
|
||||||
'remove_dead_links', 'remove_linked_tree', 'find_library_path',
|
|
||||||
'fix_darwin_install_name']
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import glob
|
import glob
|
||||||
import sys
|
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import stat
|
import stat
|
||||||
import errno
|
import errno
|
||||||
import getpass
|
import getpass
|
||||||
from contextlib import contextmanager, closing
|
from contextlib import contextmanager, closing
|
||||||
from tempfile import NamedTemporaryFile
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
from spack.util.compression import ALLOWED_ARCHIVE_TYPES
|
|
||||||
|
__all__ = ['set_install_permissions', 'install', 'install_tree',
|
||||||
|
'traverse_tree',
|
||||||
|
'expand_user', 'working_dir', 'touch', 'touchp', 'mkdirp',
|
||||||
|
'force_remove', 'join_path', 'ancestor', 'can_access',
|
||||||
|
'filter_file',
|
||||||
|
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
|
||||||
|
'set_executable', 'copy_mode', 'unset_executable_mode',
|
||||||
|
'remove_dead_links', 'remove_linked_tree', 'find_library_path',
|
||||||
|
'fix_darwin_install_name', 'to_link_flags']
|
||||||
|
|
||||||
|
|
||||||
def filter_file(regex, repl, *filenames, **kwargs):
|
def filter_file(regex, repl, *filenames, **kwargs):
|
||||||
"""Like sed, but uses python regular expressions.
|
"""Like sed, but uses python regular expressions.
|
||||||
@ -69,6 +69,7 @@ def filter_file(regex, repl, *filenames, **kwargs):
|
|||||||
# Allow strings to use \1, \2, etc. for replacement, like sed
|
# Allow strings to use \1, \2, etc. for replacement, like sed
|
||||||
if not callable(repl):
|
if not callable(repl):
|
||||||
unescaped = repl.replace(r'\\', '\\')
|
unescaped = repl.replace(r'\\', '\\')
|
||||||
|
|
||||||
def replace_groups_with_groupid(m):
|
def replace_groups_with_groupid(m):
|
||||||
def groupid_to_group(x):
|
def groupid_to_group(x):
|
||||||
return m.group(int(x.group(1)))
|
return m.group(int(x.group(1)))
|
||||||
@ -157,9 +158,12 @@ def set_install_permissions(path):
|
|||||||
def copy_mode(src, dest):
|
def copy_mode(src, dest):
|
||||||
src_mode = os.stat(src).st_mode
|
src_mode = os.stat(src).st_mode
|
||||||
dest_mode = os.stat(dest).st_mode
|
dest_mode = os.stat(dest).st_mode
|
||||||
if src_mode & stat.S_IXUSR: dest_mode |= stat.S_IXUSR
|
if src_mode & stat.S_IXUSR:
|
||||||
if src_mode & stat.S_IXGRP: dest_mode |= stat.S_IXGRP
|
dest_mode |= stat.S_IXUSR
|
||||||
if src_mode & stat.S_IXOTH: dest_mode |= stat.S_IXOTH
|
if src_mode & stat.S_IXGRP:
|
||||||
|
dest_mode |= stat.S_IXGRP
|
||||||
|
if src_mode & stat.S_IXOTH:
|
||||||
|
dest_mode |= stat.S_IXOTH
|
||||||
os.chmod(dest, dest_mode)
|
os.chmod(dest, dest_mode)
|
||||||
|
|
||||||
|
|
||||||
@ -224,9 +228,10 @@ def force_remove(*paths):
|
|||||||
for path in paths:
|
for path in paths:
|
||||||
try:
|
try:
|
||||||
os.remove(path)
|
os.remove(path)
|
||||||
except OSError, e:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def working_dir(dirname, **kwargs):
|
def working_dir(dirname, **kwargs):
|
||||||
if kwargs.get('create', False):
|
if kwargs.get('create', False):
|
||||||
@ -240,7 +245,7 @@ def working_dir(dirname, **kwargs):
|
|||||||
|
|
||||||
def touch(path):
|
def touch(path):
|
||||||
"""Creates an empty file at the specified path."""
|
"""Creates an empty file at the specified path."""
|
||||||
with open(path, 'a') as file:
|
with open(path, 'a'):
|
||||||
os.utime(path, None)
|
os.utime(path, None)
|
||||||
|
|
||||||
|
|
||||||
@ -253,7 +258,7 @@ def touchp(path):
|
|||||||
def force_symlink(src, dest):
|
def force_symlink(src, dest):
|
||||||
try:
|
try:
|
||||||
os.symlink(src, dest)
|
os.symlink(src, dest)
|
||||||
except OSError as e:
|
except OSError:
|
||||||
os.remove(dest)
|
os.remove(dest)
|
||||||
os.symlink(src, dest)
|
os.symlink(src, dest)
|
||||||
|
|
||||||
@ -275,7 +280,7 @@ def ancestor(dir, n=1):
|
|||||||
|
|
||||||
def can_access(file_name):
|
def can_access(file_name):
|
||||||
"""True if we have read/write access to the file."""
|
"""True if we have read/write access to the file."""
|
||||||
return os.access(file_name, os.R_OK|os.W_OK)
|
return os.access(file_name, os.R_OK | os.W_OK)
|
||||||
|
|
||||||
|
|
||||||
def traverse_tree(source_root, dest_root, rel_path='', **kwargs):
|
def traverse_tree(source_root, dest_root, rel_path='', **kwargs):
|
||||||
@ -343,13 +348,14 @@ def traverse_tree(source_root, dest_root, rel_path='', **kwargs):
|
|||||||
|
|
||||||
# Treat as a directory
|
# Treat as a directory
|
||||||
if os.path.isdir(source_child) and (
|
if os.path.isdir(source_child) and (
|
||||||
follow_links or not os.path.islink(source_child)):
|
follow_links or not os.path.islink(source_child)):
|
||||||
|
|
||||||
# When follow_nonexisting isn't set, don't descend into dirs
|
# When follow_nonexisting isn't set, don't descend into dirs
|
||||||
# in source that do not exist in dest
|
# in source that do not exist in dest
|
||||||
if follow_nonexisting or os.path.exists(dest_child):
|
if follow_nonexisting or os.path.exists(dest_child):
|
||||||
tuples = traverse_tree(source_root, dest_root, rel_child, **kwargs)
|
tuples = traverse_tree(source_root, dest_root, rel_child, **kwargs) # NOQA: ignore=E501
|
||||||
for t in tuples: yield t
|
for t in tuples:
|
||||||
|
yield t
|
||||||
|
|
||||||
# Treat as a file.
|
# Treat as a file.
|
||||||
elif not ignore(os.path.join(rel_path, f)):
|
elif not ignore(os.path.join(rel_path, f)):
|
||||||
@ -379,6 +385,7 @@ def remove_dead_links(root):
|
|||||||
if not os.path.exists(real_path):
|
if not os.path.exists(real_path):
|
||||||
os.unlink(path)
|
os.unlink(path)
|
||||||
|
|
||||||
|
|
||||||
def remove_linked_tree(path):
|
def remove_linked_tree(path):
|
||||||
"""
|
"""
|
||||||
Removes a directory and its contents. If the directory is a
|
Removes a directory and its contents. If the directory is a
|
||||||
@ -402,28 +409,41 @@ def fix_darwin_install_name(path):
|
|||||||
Fix install name of dynamic libraries on Darwin to have full path.
|
Fix install name of dynamic libraries on Darwin to have full path.
|
||||||
There are two parts of this task:
|
There are two parts of this task:
|
||||||
(i) use install_name('-id',...) to change install name of a single lib;
|
(i) use install_name('-id',...) to change install name of a single lib;
|
||||||
(ii) use install_name('-change',...) to change the cross linking between libs.
|
(ii) use install_name('-change',...) to change the cross linking between
|
||||||
The function assumes that all libraries are in one folder and currently won't
|
libs. The function assumes that all libraries are in one folder and
|
||||||
follow subfolders.
|
currently won't follow subfolders.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
path: directory in which .dylib files are alocated
|
path: directory in which .dylib files are alocated
|
||||||
|
|
||||||
"""
|
"""
|
||||||
libs = glob.glob(join_path(path,"*.dylib"))
|
libs = glob.glob(join_path(path, "*.dylib"))
|
||||||
for lib in libs:
|
for lib in libs:
|
||||||
# fix install name first:
|
# fix install name first:
|
||||||
subprocess.Popen(["install_name_tool", "-id",lib,lib], stdout=subprocess.PIPE).communicate()[0]
|
subprocess.Popen(["install_name_tool", "-id", lib, lib], stdout=subprocess.PIPE).communicate()[0] # NOQA: ignore=E501
|
||||||
long_deps = subprocess.Popen(["otool", "-L",lib], stdout=subprocess.PIPE).communicate()[0].split('\n')
|
long_deps = subprocess.Popen(["otool", "-L", lib], stdout=subprocess.PIPE).communicate()[0].split('\n') # NOQA: ignore=E501
|
||||||
deps = [dep.partition(' ')[0][1::] for dep in long_deps[2:-1]]
|
deps = [dep.partition(' ')[0][1::] for dep in long_deps[2:-1]]
|
||||||
# fix all dependencies:
|
# fix all dependencies:
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
for loc in libs:
|
for loc in libs:
|
||||||
if dep == os.path.basename(loc):
|
if dep == os.path.basename(loc):
|
||||||
subprocess.Popen(["install_name_tool", "-change",dep,loc,lib], stdout=subprocess.PIPE).communicate()[0]
|
subprocess.Popen(["install_name_tool", "-change", dep, loc, lib], stdout=subprocess.PIPE).communicate()[0] # NOQA: ignore=E501
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
def to_link_flags(library):
|
||||||
|
"""Transforms a path to a <library> into linking flags -L<dir> -l<name>.
|
||||||
|
|
||||||
|
Return:
|
||||||
|
A string of linking flags.
|
||||||
|
"""
|
||||||
|
dir = os.path.dirname(library)
|
||||||
|
# Asume libXYZ.suffix
|
||||||
|
name = os.path.basename(library)[3:].split(".")[0]
|
||||||
|
res = '-L%s -l%s' % (dir, name)
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
def find_library_path(libname, *paths):
|
def find_library_path(libname, *paths):
|
||||||
"""Searches for a file called <libname> in each path.
|
"""Searches for a file called <libname> in each path.
|
||||||
|
|
||||||
|
@ -80,8 +80,8 @@ class Dealii(Package):
|
|||||||
depends_on("netcdf-cxx", when='+netcdf+mpi')
|
depends_on("netcdf-cxx", when='+netcdf+mpi')
|
||||||
depends_on("oce", when='+oce')
|
depends_on("oce", when='+oce')
|
||||||
depends_on("p4est", when='+p4est+mpi')
|
depends_on("p4est", when='+p4est+mpi')
|
||||||
depends_on("petsc+mpi", when='+petsc+mpi')
|
depends_on("petsc@:3.6.4+mpi", when='+petsc+mpi') # FIXME: update after 3.7 is supported upstream. # NOQA: ignore=E501
|
||||||
depends_on("slepc", when='+slepc+petsc+mpi')
|
depends_on("slepc@:3.6.3", when='+slepc+petsc+mpi')
|
||||||
depends_on("trilinos", when='+trilinos+mpi')
|
depends_on("trilinos", when='+trilinos+mpi')
|
||||||
|
|
||||||
# developer dependnecies
|
# developer dependnecies
|
||||||
@ -108,12 +108,11 @@ def install(self, spec, prefix):
|
|||||||
# of Spack's. Be more specific to avoid this.
|
# of Spack's. Be more specific to avoid this.
|
||||||
# Note that both lapack and blas are provided in -DLAPACK_XYZ.
|
# Note that both lapack and blas are provided in -DLAPACK_XYZ.
|
||||||
'-DLAPACK_FOUND=true',
|
'-DLAPACK_FOUND=true',
|
||||||
'-DLAPACK_INCLUDE_DIRS=%s;%s' %
|
'-DLAPACK_INCLUDE_DIRS=%s;%s' % (
|
||||||
(spec['lapack'].prefix.include,
|
spec['lapack'].prefix.include, spec['blas'].prefix.include),
|
||||||
spec['blas'].prefix.include),
|
'-DLAPACK_LIBRARIES=%s;%s' % (
|
||||||
'-DLAPACK_LIBRARIES=%s;%s' %
|
spec['lapack'].lapack_shared_lib,
|
||||||
(spec['lapack'].lapack_shared_lib,
|
spec['blas'].blas_shared_lib),
|
||||||
spec['blas'].blas_shared_lib),
|
|
||||||
'-DMUPARSER_DIR=%s' % spec['muparser'].prefix,
|
'-DMUPARSER_DIR=%s' % spec['muparser'].prefix,
|
||||||
'-DUMFPACK_DIR=%s' % spec['suite-sparse'].prefix,
|
'-DUMFPACK_DIR=%s' % spec['suite-sparse'].prefix,
|
||||||
'-DTBB_DIR=%s' % spec['tbb'].prefix,
|
'-DTBB_DIR=%s' % spec['tbb'].prefix,
|
||||||
@ -168,14 +167,14 @@ def install(self, spec, prefix):
|
|||||||
if '+netcdf' in spec:
|
if '+netcdf' in spec:
|
||||||
options.extend([
|
options.extend([
|
||||||
'-DNETCDF_FOUND=true',
|
'-DNETCDF_FOUND=true',
|
||||||
'-DNETCDF_LIBRARIES=%s;%s' %
|
'-DNETCDF_LIBRARIES=%s;%s' % (
|
||||||
(join_path(spec['netcdf-cxx'].prefix.lib,
|
join_path(spec['netcdf-cxx'].prefix.lib,
|
||||||
'libnetcdf_c++.%s' % dsuf),
|
'libnetcdf_c++.%s' % dsuf),
|
||||||
join_path(spec['netcdf'].prefix.lib,
|
join_path(spec['netcdf'].prefix.lib,
|
||||||
'libnetcdf.%s' % dsuf)),
|
'libnetcdf.%s' % dsuf)),
|
||||||
'-DNETCDF_INCLUDE_DIRS=%s;%s' %
|
'-DNETCDF_INCLUDE_DIRS=%s;%s' % (
|
||||||
(spec['netcdf-cxx'].prefix.include,
|
spec['netcdf-cxx'].prefix.include,
|
||||||
spec['netcdf'].prefix.include),
|
spec['netcdf'].prefix.include),
|
||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
options.extend([
|
options.extend([
|
||||||
@ -266,9 +265,9 @@ def install(self, spec, prefix):
|
|||||||
filter_file(r'(LA::SolverCG solver\(solver_control\);)', ('TrilinosWrappers::SolverDirect::AdditionalData data(false,"Amesos_Superludist"); TrilinosWrappers::SolverDirect solver(solver_control,data);'), 'step-40.cc') # NOQA: ignore=E501
|
filter_file(r'(LA::SolverCG solver\(solver_control\);)', ('TrilinosWrappers::SolverDirect::AdditionalData data(false,"Amesos_Superludist"); TrilinosWrappers::SolverDirect solver(solver_control,data);'), 'step-40.cc') # NOQA: ignore=E501
|
||||||
filter_file(r'(LA::MPI::PreconditionAMG preconditioner;)',
|
filter_file(r'(LA::MPI::PreconditionAMG preconditioner;)',
|
||||||
(''), 'step-40.cc')
|
(''), 'step-40.cc')
|
||||||
filter_file(r'(LA::MPI::PreconditionAMG::AdditionalData data;)',
|
filter_file(r'(LA::MPI::PreconditionAMG::AdditionalData data;)', # NOQA: ignore=E501
|
||||||
(''), 'step-40.cc')
|
(''), 'step-40.cc')
|
||||||
filter_file(r'(preconditioner.initialize\(system_matrix, data\);)',
|
filter_file(r'(preconditioner.initialize\(system_matrix, data\);)', # NOQA: ignore=E501
|
||||||
(''), 'step-40.cc')
|
(''), 'step-40.cc')
|
||||||
filter_file(r'(solver\.solve \(system_matrix, completely_distributed_solution, system_rhs,)', ('solver.solve (system_matrix, completely_distributed_solution, system_rhs);'), 'step-40.cc') # NOQA: ignore=E501
|
filter_file(r'(solver\.solve \(system_matrix, completely_distributed_solution, system_rhs,)', ('solver.solve (system_matrix, completely_distributed_solution, system_rhs);'), 'step-40.cc') # NOQA: ignore=E501
|
||||||
filter_file(r'(preconditioner\);)', (''), 'step-40.cc')
|
filter_file(r'(preconditioner\);)', (''), 'step-40.cc')
|
||||||
|
@ -28,13 +28,16 @@
|
|||||||
|
|
||||||
class Petsc(Package):
|
class Petsc(Package):
|
||||||
"""
|
"""
|
||||||
PETSc is a suite of data structures and routines for the scalable (parallel) solution of scientific applications
|
PETSc is a suite of data structures and routines for the scalable
|
||||||
modeled by partial differential equations.
|
(parallel) solution of scientific applications modeled by partial
|
||||||
|
differential equations.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
homepage = "http://www.mcs.anl.gov/petsc/index.html"
|
homepage = "http://www.mcs.anl.gov/petsc/index.html"
|
||||||
url = "http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.5.3.tar.gz"
|
url = "http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.5.3.tar.gz"
|
||||||
|
|
||||||
|
version('3.7.2', '50da49867ce7a49e7a0c1b37f4ec7b34')
|
||||||
|
version('3.6.4', '7632da2375a3df35b8891c9526dbdde7')
|
||||||
version('3.6.3', '91dd3522de5a5ef039ff8f50800db606')
|
version('3.6.3', '91dd3522de5a5ef039ff8f50800db606')
|
||||||
version('3.5.3', 'd4fd2734661e89f18ac6014b5dd1ef2f')
|
version('3.5.3', 'd4fd2734661e89f18ac6014b5dd1ef2f')
|
||||||
version('3.5.2', 'ad170802b3b058b5deb9cd1f968e7e13')
|
version('3.5.2', 'ad170802b3b058b5deb9cd1f968e7e13')
|
||||||
@ -69,10 +72,12 @@ class Petsc(Package):
|
|||||||
depends_on('hdf5+mpi', when='+hdf5+mpi')
|
depends_on('hdf5+mpi', when='+hdf5+mpi')
|
||||||
depends_on('parmetis', when='+metis+mpi')
|
depends_on('parmetis', when='+metis+mpi')
|
||||||
# Hypre does not support complex numbers.
|
# Hypre does not support complex numbers.
|
||||||
# Also PETSc prefer to build it without internal superlu, likely due to conflict in headers
|
# Also PETSc prefer to build it without internal superlu, likely due to
|
||||||
# see https://bitbucket.org/petsc/petsc/src/90564b43f6b05485163c147b464b5d6d28cde3ef/config/BuildSystem/config/packages/hypre.py
|
# conflict in headers see
|
||||||
|
# https://bitbucket.org/petsc/petsc/src/90564b43f6b05485163c147b464b5d6d28cde3ef/config/BuildSystem/config/packages/hypre.py # NOQA: ignore=E501
|
||||||
depends_on('hypre~internal-superlu', when='+hypre+mpi~complex')
|
depends_on('hypre~internal-superlu', when='+hypre+mpi~complex')
|
||||||
depends_on('superlu-dist', when='+superlu-dist+mpi')
|
depends_on('superlu-dist@:4.3', when='@:3.6.4+superlu-dist+mpi')
|
||||||
|
depends_on('superlu-dist@5.0.0:', when='@3.7:+superlu-dist+mpi')
|
||||||
depends_on('mumps+mpi', when='+mumps+mpi')
|
depends_on('mumps+mpi', when='+mumps+mpi')
|
||||||
depends_on('scalapack', when='+mumps+mpi')
|
depends_on('scalapack', when='+mumps+mpi')
|
||||||
|
|
||||||
@ -80,17 +85,17 @@ def mpi_dependent_options(self):
|
|||||||
if '~mpi' in self.spec:
|
if '~mpi' in self.spec:
|
||||||
compiler_opts = [
|
compiler_opts = [
|
||||||
'--with-cc=%s' % os.environ['CC'],
|
'--with-cc=%s' % os.environ['CC'],
|
||||||
'--with-cxx=%s' % (os.environ['CXX'] if self.compiler.cxx is not None else '0'),
|
'--with-cxx=%s' % (os.environ['CXX'] if self.compiler.cxx is not None else '0'), # NOQA: ignore=E501
|
||||||
'--with-fc=%s' % (os.environ['FC'] if self.compiler.fc is not None else '0'),
|
'--with-fc=%s' % (os.environ['FC'] if self.compiler.fc is not None else '0'), # NOQA: ignore=E501
|
||||||
'--with-mpi=0'
|
'--with-mpi=0'
|
||||||
]
|
]
|
||||||
error_message_fmt = '\t{library} support requires "+mpi" to be activated'
|
error_message_fmt = '\t{library} support requires "+mpi" to be activated' # NOQA: ignore=E501
|
||||||
|
|
||||||
# If mpi is disabled (~mpi), it's an error to have any of these enabled.
|
# If mpi is disabled (~mpi), it's an error to have any of these
|
||||||
# This generates a list of any such errors.
|
# enabled. This generates a list of any such errors.
|
||||||
errors = [error_message_fmt.format(library=x)
|
errors = [error_message_fmt.format(library=x)
|
||||||
for x in ('hdf5', 'hypre', 'parmetis','mumps','superlu-dist')
|
for x in ('hdf5', 'hypre', 'parmetis', 'mumps', 'superlu-dist') # NOQA: ignore=E501
|
||||||
if ('+'+x) in self.spec]
|
if ('+' + x) in self.spec]
|
||||||
if errors:
|
if errors:
|
||||||
errors = ['incompatible variants given'] + errors
|
errors = ['incompatible variants given'] + errors
|
||||||
raise RuntimeError('\n'.join(errors))
|
raise RuntimeError('\n'.join(errors))
|
||||||
@ -105,26 +110,31 @@ def install(self, spec, prefix):
|
|||||||
options = ['--with-ssl=0']
|
options = ['--with-ssl=0']
|
||||||
options.extend(self.mpi_dependent_options())
|
options.extend(self.mpi_dependent_options())
|
||||||
options.extend([
|
options.extend([
|
||||||
'--with-precision=%s' % ('double' if '+double' in spec else 'single'),
|
'--with-precision=%s' % ('double' if '+double' in spec else 'single'), # NOQA: ignore=E501
|
||||||
'--with-scalar-type=%s' % ('complex' if '+complex' in spec else 'real'),
|
'--with-scalar-type=%s' % ('complex' if '+complex' in spec else 'real'), # NOQA: ignore=E501
|
||||||
'--with-shared-libraries=%s' % ('1' if '+shared' in spec else '0'),
|
'--with-shared-libraries=%s' % ('1' if '+shared' in spec else '0'),
|
||||||
'--with-debugging=%s' % ('1' if '+debug' in spec else '0'),
|
'--with-debugging=%s' % ('1' if '+debug' in spec else '0'),
|
||||||
'--with-blas-lapack-dir=%s' % spec['lapack'].prefix
|
'--with-blas-lapack-dir=%s' % spec['lapack'].prefix
|
||||||
])
|
])
|
||||||
# Activates library support if needed
|
# Activates library support if needed
|
||||||
for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis','mumps','scalapack'):
|
for library in ('metis', 'boost', 'hdf5', 'hypre', 'parmetis',
|
||||||
|
'mumps', 'scalapack'):
|
||||||
options.append(
|
options.append(
|
||||||
'--with-{library}={value}'.format(library=library, value=('1' if library in spec else '0'))
|
'--with-{library}={value}'.format(library=library, value=('1' if library in spec else '0')) # NOQA: ignore=E501
|
||||||
)
|
)
|
||||||
if library in spec:
|
if library in spec:
|
||||||
options.append(
|
options.append(
|
||||||
'--with-{library}-dir={path}'.format(library=library, path=spec[library].prefix)
|
'--with-{library}-dir={path}'.format(library=library, path=spec[library].prefix) # NOQA: ignore=E501
|
||||||
)
|
)
|
||||||
# PETSc does not pick up SuperluDist from the dir as they look for superlu_dist_4.1.a
|
# PETSc does not pick up SuperluDist from the dir as they look for
|
||||||
|
# superlu_dist_4.1.a
|
||||||
if 'superlu-dist' in spec:
|
if 'superlu-dist' in spec:
|
||||||
options.extend([
|
options.extend([
|
||||||
'--with-superlu_dist-include=%s' % spec['superlu-dist'].prefix.include,
|
'--with-superlu_dist-include=%s' %
|
||||||
'--with-superlu_dist-lib=%s' % join_path(spec['superlu-dist'].prefix.lib, 'libsuperlu_dist.a'),
|
spec['superlu-dist'].prefix.include,
|
||||||
|
'--with-superlu_dist-lib=%s' %
|
||||||
|
join_path(spec['superlu-dist'].prefix.lib,
|
||||||
|
'libsuperlu_dist.a'),
|
||||||
'--with-superlu_dist=1'
|
'--with-superlu_dist=1'
|
||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
|
@ -34,13 +34,16 @@ class Slepc(Package):
|
|||||||
homepage = "http://www.grycap.upv.es/slepc"
|
homepage = "http://www.grycap.upv.es/slepc"
|
||||||
url = "http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz"
|
url = "http://slepc.upv.es/download/download.php?filename=slepc-3.6.2.tar.gz"
|
||||||
|
|
||||||
|
version('3.7.1', '670216f263e3074b21e0623c01bc0f562fdc0bffcd7bd42dd5d8edbe73a532c2')
|
||||||
|
version('3.6.3', '384939d009546db37bc05ed81260c8b5ba451093bf891391d32eb7109ccff876')
|
||||||
version('3.6.2', '2ab4311bed26ccf7771818665991b2ea3a9b15f97e29fd13911ab1293e8e65df')
|
version('3.6.2', '2ab4311bed26ccf7771818665991b2ea3a9b15f97e29fd13911ab1293e8e65df')
|
||||||
|
|
||||||
variant('arpack', default=False, description='Enables Arpack wrappers')
|
variant('arpack', default=True, description='Enables Arpack wrappers')
|
||||||
|
|
||||||
depends_on('petsc')
|
depends_on('petsc@3.7:', when='@3.7.1:')
|
||||||
depends_on('arpack-ng~mpi',when='+arpack^petsc~mpi')
|
depends_on('petsc@3.6.3:3.6.4', when='@3.6.2:3.6.3')
|
||||||
depends_on('arpack-ng+mpi',when='+arpack^petsc+mpi')
|
depends_on('arpack-ng~mpi', when='+arpack^petsc~mpi')
|
||||||
|
depends_on('arpack-ng+mpi', when='+arpack^petsc+mpi')
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
# set SLEPC_DIR for installation
|
# set SLEPC_DIR for installation
|
||||||
@ -64,7 +67,7 @@ def install(self, spec, prefix):
|
|||||||
configure('--prefix=%s' % prefix, *options)
|
configure('--prefix=%s' % prefix, *options)
|
||||||
|
|
||||||
make('MAKE_NP=%s' % make_jobs, parallel=False)
|
make('MAKE_NP=%s' % make_jobs, parallel=False)
|
||||||
#FIXME:
|
# FIXME:
|
||||||
# make('test')
|
# make('test')
|
||||||
make('install')
|
make('install')
|
||||||
|
|
||||||
|
@ -25,50 +25,54 @@
|
|||||||
from spack import *
|
from spack import *
|
||||||
import glob
|
import glob
|
||||||
|
|
||||||
|
|
||||||
class SuperluDist(Package):
|
class SuperluDist(Package):
|
||||||
"""A general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equations on high performance machines."""
|
"""A general purpose library for the direct solution of large, sparse,
|
||||||
|
nonsymmetric systems of linear equations on high performance machines."""
|
||||||
homepage = "http://crd-legacy.lbl.gov/~xiaoye/SuperLU/"
|
homepage = "http://crd-legacy.lbl.gov/~xiaoye/SuperLU/"
|
||||||
url = "http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_dist_4.1.tar.gz"
|
url = "http://crd-legacy.lbl.gov/~xiaoye/SuperLU/superlu_dist_4.1.tar.gz"
|
||||||
|
|
||||||
version('5.0.0', '2b53baf1b0ddbd9fcf724992577f0670')
|
version('5.0.0', '2b53baf1b0ddbd9fcf724992577f0670')
|
||||||
# default to version 4.3 since petsc and trilinos are not tested with 5.0.
|
version('4.3', 'ee66c84e37b4f7cc557771ccc3dc43ae')
|
||||||
version('4.3', 'ee66c84e37b4f7cc557771ccc3dc43ae', preferred=True)
|
|
||||||
version('4.2', 'ae9fafae161f775fbac6eba11e530a65')
|
version('4.2', 'ae9fafae161f775fbac6eba11e530a65')
|
||||||
version('4.1', '4edee38cc29f687bd0c8eb361096a455')
|
version('4.1', '4edee38cc29f687bd0c8eb361096a455')
|
||||||
version('4.0', 'c0b98b611df227ae050bc1635c6940e0')
|
version('4.0', 'c0b98b611df227ae050bc1635c6940e0')
|
||||||
|
|
||||||
depends_on ('mpi')
|
depends_on('mpi')
|
||||||
depends_on ('blas')
|
depends_on('blas')
|
||||||
depends_on ('lapack')
|
depends_on('lapack')
|
||||||
depends_on ('parmetis')
|
depends_on('parmetis')
|
||||||
depends_on ('metis@5:')
|
depends_on('metis@5:')
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
def install(self, spec, prefix):
|
||||||
makefile_inc = []
|
makefile_inc = []
|
||||||
makefile_inc.extend([
|
makefile_inc.extend([
|
||||||
'PLAT = _mac_x',
|
'PLAT = _mac_x',
|
||||||
'DSuperLUroot = %s' % self.stage.source_path, #self.stage.path, prefix
|
'DSuperLUroot = %s' % self.stage.source_path,
|
||||||
'DSUPERLULIB = $(DSuperLUroot)/lib/libsuperlu_dist.a',
|
'DSUPERLULIB = $(DSuperLUroot)/lib/libsuperlu_dist.a',
|
||||||
'BLASDEF = -DUSE_VENDOR_BLAS',
|
'BLASDEF = -DUSE_VENDOR_BLAS',
|
||||||
'BLASLIB = -L%s -llapack %s -lblas' % (spec['lapack'].prefix.lib, spec['blas'].prefix.lib), # FIXME: avoid hardcoding blas/lapack lib names
|
'BLASLIB = %s %s' %
|
||||||
|
(to_link_flags(spec['lapack'].lapack_shared_lib),
|
||||||
|
to_link_flags(spec['blas'].blas_shared_lib)),
|
||||||
'METISLIB = -L%s -lmetis' % spec['metis'].prefix.lib,
|
'METISLIB = -L%s -lmetis' % spec['metis'].prefix.lib,
|
||||||
'PARMETISLIB = -L%s -lparmetis' % spec['parmetis'].prefix.lib,
|
'PARMETISLIB = -L%s -lparmetis' % spec['parmetis'].prefix.lib,
|
||||||
'FLIBS =',
|
'FLIBS =',
|
||||||
'LIBS = $(DSUPERLULIB) $(BLASLIB) $(PARMETISLIB) $(METISLIB)',
|
'LIBS = $(DSUPERLULIB) $(BLASLIB) $(PARMETISLIB) $(METISLIB)', # NOQA: ignore=E501
|
||||||
'ARCH = ar',
|
'ARCH = ar',
|
||||||
'ARCHFLAGS = cr',
|
'ARCHFLAGS = cr',
|
||||||
'RANLIB = true',
|
'RANLIB = true',
|
||||||
'CC = mpicc', # FIXME avoid hardcoding MPI compiler names
|
'CC = %s' % spec['mpi'].mpicc,
|
||||||
'CFLAGS = -fPIC -std=c99 -O2 -I%s -I%s' %(spec['parmetis'].prefix.include, spec['metis'].prefix.include),
|
'CFLAGS = -fPIC -std=c99 -O2 -I%s -I%s' %
|
||||||
|
(spec['parmetis'].prefix.include,
|
||||||
|
spec['metis'].prefix.include),
|
||||||
'NOOPTS = -fPIC -std=c99',
|
'NOOPTS = -fPIC -std=c99',
|
||||||
'FORTRAN = mpif77',
|
'FORTRAN = %s' % spec['mpi'].mpif77,
|
||||||
'F90FLAGS = -O2',
|
'F90FLAGS = -O2',
|
||||||
'LOADER = mpif77',
|
'LOADER = %s' % spec['mpi'].mpif77,
|
||||||
'LOADOPTS =',
|
'LOADOPTS =',
|
||||||
'CDEFS = -DAdd_'
|
'CDEFS = -DAdd_'
|
||||||
])
|
])
|
||||||
|
|
||||||
#with working_dir('src'):
|
|
||||||
with open('make.inc', 'w') as fh:
|
with open('make.inc', 'w') as fh:
|
||||||
fh.write('\n'.join(makefile_inc))
|
fh.write('\n'.join(makefile_inc))
|
||||||
|
|
||||||
@ -83,9 +87,10 @@ def install(self, spec, prefix):
|
|||||||
mkdirp(headers_location)
|
mkdirp(headers_location)
|
||||||
mkdirp(prefix.lib)
|
mkdirp(prefix.lib)
|
||||||
|
|
||||||
headers = glob.glob(join_path(self.stage.source_path, 'SRC','*.h'))
|
headers = glob.glob(join_path(self.stage.source_path, 'SRC', '*.h'))
|
||||||
for h in headers:
|
for h in headers:
|
||||||
install(h,headers_location)
|
install(h, headers_location)
|
||||||
|
|
||||||
superludist_lib = join_path(self.stage.source_path, 'lib/libsuperlu_dist.a')
|
superludist_lib = join_path(self.stage.source_path,
|
||||||
install(superludist_lib,self.prefix.lib)
|
'lib/libsuperlu_dist.a')
|
||||||
|
install(superludist_lib, self.prefix.lib)
|
||||||
|
@ -45,6 +45,8 @@ class Trilinos(Package):
|
|||||||
homepage = "https://trilinos.org/"
|
homepage = "https://trilinos.org/"
|
||||||
url = "http://trilinos.csbsju.edu/download/files/trilinos-12.2.1-Source.tar.gz"
|
url = "http://trilinos.csbsju.edu/download/files/trilinos-12.2.1-Source.tar.gz"
|
||||||
|
|
||||||
|
version('12.6.3', '960f5f4d3f7c3da818e5a5fb4684559eff7e0c25f959ef576561b8a52f0e4d1e')
|
||||||
|
version('12.6.2', '0c076090508170ddee5efeed317745027f9418319720dc40a072e478775279f9')
|
||||||
version('12.6.1', 'adcf2d3aab74cdda98f88fee19cd1442604199b0515ee3da4d80cbe8f37d00e4')
|
version('12.6.1', 'adcf2d3aab74cdda98f88fee19cd1442604199b0515ee3da4d80cbe8f37d00e4')
|
||||||
version('12.4.2', '7c830f7f0f68b8ad324690603baf404e')
|
version('12.4.2', '7c830f7f0f68b8ad324690603baf404e')
|
||||||
version('12.2.1', '6161926ea247863c690e927687f83be9')
|
version('12.2.1', '6161926ea247863c690e927687f83be9')
|
||||||
@ -89,7 +91,8 @@ class Trilinos(Package):
|
|||||||
# work at the end. But let's avoid all this by simply using shared libs
|
# work at the end. But let's avoid all this by simply using shared libs
|
||||||
depends_on('mumps@5.0:+mpi+shared', when='+mumps')
|
depends_on('mumps@5.0:+mpi+shared', when='+mumps')
|
||||||
depends_on('scalapack', when='+mumps')
|
depends_on('scalapack', when='+mumps')
|
||||||
depends_on('superlu-dist', when='+superlu-dist')
|
depends_on('superlu-dist@:4.3', when='@:12.6.1+superlu-dist')
|
||||||
|
depends_on('superlu-dist', when='@12.6.2:+superlu-dist')
|
||||||
depends_on('hypre~internal-superlu', when='+hypre')
|
depends_on('hypre~internal-superlu', when='+hypre')
|
||||||
depends_on('hdf5+mpi', when='+hdf5')
|
depends_on('hdf5+mpi', when='+hdf5')
|
||||||
depends_on('python', when='+python')
|
depends_on('python', when='+python')
|
||||||
|
Loading…
Reference in New Issue
Block a user