Merge pull request #1053 from davydden/pkg/dealii_suite_update

update Petsc, Slepc, Trilinos, Superlu-dist and deal.II
This commit is contained in:
Todd Gamblin 2016-06-20 10:32:52 -07:00 committed by GitHub
commit c09111bbef
6 changed files with 133 additions and 93 deletions

View File

@ -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.

View File

@ -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')

View File

@ -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:

View File

@ -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')

View File

@ -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)

View File

@ -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')