1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# Copyright 2013-2023 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)
import os
from spack.package import *
class T8code(AutotoolsPackage):
"""t8code is a C/C++ library to manage parallel adaptive meshes with various element types.
t8code uses a collection (a forest) of multiple connected adaptive space-trees in parallel
and scales to at least one million MPI ranks and over one Trillion mesh elements."""
homepage = "https://github.com/DLR-AMR/t8code"
url = "https://github.com/DLR-AMR/t8code/releases/download/v1.4.1/t8-1.4.1.tar.gz"
maintainers = ["Davknapp", "melven"]
version("1.4.1", sha256="b0ec0c9b4a182f8ac7e930ba80cd20e6dc5baefc328630e4a9dac8c688749e9a")
variant("mpi", default=True, description="Enable MPI parallel code")
variant("vtk", default=False, description="Enable vtk-dependent code")
variant("petsc", default=False, description="Enable PETSc-dependent code")
variant("netcdf", default=False, description="Enable NetCDF-dependent code")
variant("metis", default=False, description="Enable metis-dependent code")
depends_on("mpi", when="+mpi")
depends_on("vtk@9.1:", when="+vtk")
# t8code@1.4.1 doesn't build with petsc@3.19.1
depends_on("petsc@3.18", when="+petsc")
depends_on("netcdf-c~mpi", when="+netcdf~mpi")
depends_on("netcdf-c+mpi", when="+netcdf+mpi")
depends_on("metis", when="+metis")
# Per default, t8code uses hardcoded zlib library from vtk package
# The configure command is overwritten to choose the integrated spack package
def patch(self):
if "+vtk" in self.spec:
filter_file(r"vtkzlib-\$t8_vtk_version", "z", "configure")
def configure_args(self):
args = ["CFLAGS=-O3", "CXXFLAGS=-O3"]
spec = self.spec
if "+mpi" in spec:
args.append("--enable-mpi")
args.append("CC=mpicc")
args.append("CXX=mpicxx")
else:
args.append("--disable-mpi")
if "+vtk" in spec:
args.append("--with-vtk")
vtk_ver = spec["vtk"].version.up_to(2)
include_dir = os.path.join(spec["vtk"].headers.directories[0], f"vtk-{vtk_ver}")
lib_dir = spec["vtk"].prefix.lib
# vtk paths need to be passed to configure command
args.append(f"CPPFLAGS=-I{include_dir}")
args.append(f"LDFLAGS=-L{lib_dir}")
# Chosen vtk version number is needed for t8code to find the right version
args.append(f"--with-vtk_version_number={vtk_ver}")
if "+petsc" in spec:
args.append(f"--with-petsc={spec['petsc'].prefix}")
if "+netcdf" in spec:
args.append("--with-netcdf")
if "+metis" in spec:
args.append(f"--with-metis={spec['metis'].prefix}")
return args
|