176 lines
6.9 KiB
Python
176 lines
6.9 KiB
Python
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
import os
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Ffb(MakefilePackage):
|
|
"""Computational Fluid Dynamics Software for aeroacoustics"""
|
|
|
|
homepage = "http://www.ciss.iis.u-tokyo.ac.jp/dl/index.php"
|
|
url = "file://{0}/FrontFlow_blue.8.1.tar.gz".format(os.getcwd())
|
|
manual_download = True
|
|
|
|
version("8.1", sha256="1ad008c909152b6c27668bafbad820da3e6ec3309c7e858ddb785f0a3d6e43ae")
|
|
|
|
patch("revocap_refiner.patch")
|
|
patch("revocap_refiner-size_t.patch")
|
|
patch("fortran-format.patch")
|
|
patch("xvx.patch")
|
|
patch("gffv3tr.patch")
|
|
|
|
depends_on("c", type="build")
|
|
depends_on("cxx", type="build")
|
|
depends_on("fortran", type="build")
|
|
|
|
depends_on("mpi")
|
|
depends_on("blas")
|
|
depends_on("scalapack")
|
|
|
|
parallel = False
|
|
|
|
def flag_handler(self, name, flags):
|
|
opt_flag_found = any(f in self.compiler.opt_flags for f in flags)
|
|
if name == "cflags":
|
|
if not opt_flag_found:
|
|
flags.append("-O3")
|
|
elif name == "cxxflags":
|
|
if not opt_flag_found:
|
|
flags.append("-O2")
|
|
flags.append(self.compiler.cxx_pic_flag)
|
|
if name == "fflags":
|
|
if not opt_flag_found:
|
|
flags.append("-O3")
|
|
flags.append("-mcmodel=large")
|
|
if name in ("cflags", "cxxflags", "fflags"):
|
|
return (None, flags, None)
|
|
else:
|
|
return (flags, None, flags)
|
|
|
|
def edit(self, spec, prefix):
|
|
workdir = os.getcwd()
|
|
cflags = env["CFLAGS"]
|
|
cxxflags = env["CXXFLAGS"]
|
|
fflags = env["FFLAGS"]
|
|
|
|
make = join_path("make", "makefile")
|
|
m = FileFilter(make)
|
|
m.filter(r"#LES3DHOME =", "LES3DHOME= {0}\n".format(workdir))
|
|
make = join_path("make", "OPTION")
|
|
m = FileFilter(make)
|
|
m.filter(r"CPP\s*=.*$", "CPP = /usr/bin/cpp")
|
|
m.filter(r"CCOM\s*=.*$", "CCOM = {0}".format(spack_cc))
|
|
m.filter(r"COPT\s*=.*$", "COPT = {0}".format(cflags))
|
|
m.filter(r"FCOM\s*=.*$", "FCOM = {0}\n".format(spack_fc))
|
|
m.filter(r"FOPT\s*=.*$", "FOPT = {0}\n".format(fflags))
|
|
m.filter(r"INCDIR\s*=.*$", "INCDIR = {0}\n".format(spec["mpi"].headers.directories[0]))
|
|
m.filter(r"LIBDIR\s*=.*$", "LIBDIR = {0}\n".format(spec["mpi"].libs.directories[0]))
|
|
|
|
srcdir = join_path("lib", "src")
|
|
utildir = join_path(workdir, "util")
|
|
with open(join_path("make", "Makeall"), "w") as m:
|
|
m.write("#!/bin/csh -f\n")
|
|
m.write("setenv LES3DHOME {0}\n".format(workdir))
|
|
m.write("cd {0}\n".format(srcdir))
|
|
m.write("./Makeall\n")
|
|
m.write("cd {0}\n".format(utildir))
|
|
m.write("./Makeall\n")
|
|
|
|
makeall = join_path("lib", "src", "dd_mpi", "Makeall")
|
|
dd_mpi_dir = join_path("lib", "src", "dd_mpi")
|
|
with open(makeall, "w") as m:
|
|
m.write("#!/bin/csh -f\n")
|
|
m.write("setenv LES3DHOME {0}\n".format(workdir))
|
|
m.write("cd {0}\n".format(dd_mpi_dir))
|
|
m.write("make lib FCOM={0}\n".format(spec["mpi"].mpifc))
|
|
os.chmod(makeall, 0o755)
|
|
|
|
makeall = join_path(".", "Makeall.les")
|
|
les3d_dir = join_path("util", "les3d.mpi")
|
|
les3c_dir = join_path("util", "les3c.mpi")
|
|
les3ct_dir = join_path("util", "les3ct.mpi")
|
|
les3x_dir = join_path("util", "les3x.mpi")
|
|
with open(makeall, "w") as m:
|
|
m.write("#!/bin/csh -f\n")
|
|
m.write("setenv LES3DHOME {0}\n".format(workdir))
|
|
m.write("cd {0}\n".format(join_path(workdir, les3d_dir)))
|
|
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
|
|
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
|
|
m.write("cd {0}\n".format(join_path(workdir, les3c_dir)))
|
|
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
|
|
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
|
|
m.write("cd {0}\n".format(join_path(workdir, les3ct_dir)))
|
|
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
|
|
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
|
|
m.write("cd {0}\n".format(join_path(workdir, les3x_dir)))
|
|
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
|
|
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
|
|
|
|
for d in [les3c_dir, les3ct_dir, les3d_dir]:
|
|
editfile = join_path(d, "FILES")
|
|
m = FileFilter(editfile)
|
|
m.filter(r"-lmpi_f77", "")
|
|
os.chmod(makeall, 0o755)
|
|
|
|
editfile = join_path("lib", "src", "Makeall")
|
|
m = FileFilter(editfile)
|
|
m.filter(r"x86_64-linux", "{0}-linux".format(spec.target.family))
|
|
|
|
editfile = join_path("lib", "src", "REVOCAP_Refiner-0.4.3", "OPTIONS")
|
|
m = FileFilter(editfile)
|
|
m.filter(r"ARCH\s*=.*$", "ARCH= $(shell arch)-linux")
|
|
m.filter(r"CC\s*=.*$", "CC={0}".format(spack_cc))
|
|
m.filter(r"CFLAGS\s*=.*$", "CFLAGS={0}".format(cflags))
|
|
m.filter(r"CXX\s*=.*$", "CXX={0}".format(spack_cxx))
|
|
m.filter(r"CXXFLAGS\s*=.*$", "CXXFLAGS={0}".format(cxxflags))
|
|
m.filter(r"F90\s*=.*$", "CC={0}".format(spack_fc))
|
|
m.filter(r"LD\s*=.*$", "LD={0}".format(spack_fc))
|
|
m.filter(r"LIBPATH\s*=.*$", "LIBPATH= ")
|
|
m.filter(r"FFLAGS\s*=.*$", "FFLAGS={0}".format(fflags))
|
|
m.filter(r"LDFLAGS\s*=.*$", "LDFLAGS={0}".format(fflags))
|
|
|
|
editfile = join_path("lib", "src", "ParMetis-3.1", "Makefile.in")
|
|
m = FileFilter(editfile)
|
|
m.filter(r"CC \s*=.*$", "CC ={0}".format(spack_cc))
|
|
m.filter(r"INCDIR\s*=.*$", "INCDIR = \n")
|
|
|
|
editfile = join_path("util", "xvx2gf", "Makefile")
|
|
m = FileFilter(editfile)
|
|
m.filter(r"#LES3DHOME =", "LES3DHOME= {0}\n".format(workdir))
|
|
m.filter(r"g\+\+", (spack_cxx))
|
|
|
|
editfile = join_path("util", "les3x.mpi", "FILES")
|
|
m = FileFilter(editfile)
|
|
m.filter(r"LIBS = -lfort -lgf2 -ldd_mpi -lmpi_f77", "LIBS = -lfort -lgf2 -ldd_mpi")
|
|
|
|
editfile = join_path("util", "xvx2gf", "FILES")
|
|
cxx_fortran_flags = []
|
|
if spec.satisfies("%gcc"):
|
|
cxx_fortran_flags.append("-lgfortran")
|
|
m = FileFilter(editfile)
|
|
m.filter("-lifcore -limf", " ".join(cxx_fortran_flags))
|
|
elif spec.satisfies("%fj"):
|
|
cxx_fortran_flags.append("--linkfortran")
|
|
m = FileFilter(editfile)
|
|
m.filter("-lifcore -limf", " ".join(cxx_fortran_flags))
|
|
elif spec.satisfies("%intel"):
|
|
pass
|
|
|
|
def build(self, spec, prefix):
|
|
for m in [
|
|
join_path("make", "Makeall"),
|
|
join_path("lib", "src", "dd_mpi", "Makeall"),
|
|
join_path(".", "Makeall.les"),
|
|
]:
|
|
Executable(m)()
|
|
|
|
def install(self, spec, prefix):
|
|
install_tree("bin", prefix.bin)
|
|
install_tree("macro", prefix.macro)
|
|
|
|
def setup_run_environment(self, env):
|
|
env.prepend_path("PATH", prefix.macro)
|