251 lines
11 KiB
Python
251 lines
11 KiB
Python
# Copyright 2013-2024 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 os.path import join as pjoin
|
|
|
|
from spack.package import *
|
|
|
|
|
|
class Flamemaster(CMakePackage):
|
|
"""
|
|
FlameMaster is an open source C++ program package for 0D combustion
|
|
and 1D laminar flame calculations. FlameMaster is written by Heinz Pitsch.
|
|
"""
|
|
|
|
homepage = "https://www.itv.rwth-aachen.de/downloads/flamemaster/"
|
|
url = "file://{0}/flamemaster-4.3.1.tar.gz".format(os.getcwd())
|
|
manual_download = True
|
|
|
|
maintainers("amd-toolchain-support")
|
|
|
|
version("4.3.1", sha256="8ff382f098e44a7978fe1bcc688272d65f0b374487af4523d94cca983dc57378")
|
|
|
|
variant(
|
|
"build_type",
|
|
default="Release",
|
|
description="The build type to build",
|
|
values=("None", "Debug", "Release", "RelWithDebInfo", "MinSizeRel"),
|
|
)
|
|
variant(
|
|
"bilin_omega",
|
|
default=True,
|
|
description="Compile with bilinear interpolation" "for collision integrals (omega)",
|
|
)
|
|
variant(
|
|
"combustion",
|
|
default=False,
|
|
description="Integrate comustion libraries" "for kinetics, thermodynamics, and transport",
|
|
)
|
|
variant(
|
|
"fortran_code",
|
|
default=False,
|
|
description="Compile optional fortran code like dassl, the adiabatic"
|
|
"flame temperature module, and a mechanism converter tool",
|
|
)
|
|
variant("scanmannew", default=False, description="Compile the new ScanMan")
|
|
variant(
|
|
"dco_chunk_tape", default=False, description="Dynamically allocate memory for the dco tape"
|
|
)
|
|
variant(
|
|
"troe",
|
|
default=False,
|
|
description="FlameMaster mechanism format allows for specifying"
|
|
"an additional parameter. This option disables the use of the"
|
|
"paramter which is currently required to run adjoint sensitivity analysis.",
|
|
)
|
|
variant("jl_debug", default=False, description="Debug mode during development(Johannes Lotz)")
|
|
variant(
|
|
"flux_bc",
|
|
default=False,
|
|
description="Specify boundary conditions as velocity [m/s]"
|
|
"or massflux in Counterflow (Physical Coord.)",
|
|
)
|
|
variant("full_diffusion", default=False, description="Compile with multi-component diffusion")
|
|
variant("intel_prof", default=False, description="Enable -prof-gen and -prof-use")
|
|
variant("soot_lib", default=False, description="Soot library with moment equation solving")
|
|
variant(
|
|
"newton_perf",
|
|
default=False,
|
|
description="Compile with time measurement of each Newton step",
|
|
)
|
|
variant("optima", default=False, description="Include code for Optima++ features")
|
|
variant("opt_reaction_rates", default=True, description="Fast computation of reaction rates.")
|
|
variant(
|
|
"prem_upwind_convec",
|
|
default=True,
|
|
description="Use upwind scheme for the convective term.",
|
|
)
|
|
variant(
|
|
"sundials_hint",
|
|
default=False,
|
|
description="No hints on how FlameMaster can install sundials.",
|
|
)
|
|
variant("simd_kinetics", default=False, description="WITH SIMD_KINETICS")
|
|
variant(
|
|
"solve_mom_log",
|
|
default=False,
|
|
description="Solve the soot Moments equation with logarithms",
|
|
)
|
|
variant(
|
|
"solve_with_z",
|
|
default=True,
|
|
description="Counter flow diffusion flame implementation includes"
|
|
"a solution of the mixture fraction equation",
|
|
)
|
|
variant("sundials_lapack", default=False, description="Link LAPACK in sundials")
|
|
variant(
|
|
"sundials_no_idas_search",
|
|
default=False,
|
|
description="Do not search for IDAS (part of sundials).",
|
|
)
|
|
variant(
|
|
"sundials_use_static_lib",
|
|
default=True,
|
|
description="Use static linking for sundials libraries",
|
|
)
|
|
variant("sundials_diagnos", default=False, description="Only for troubleshooting")
|
|
variant(
|
|
"tests",
|
|
default=False,
|
|
description="Install google-test framework for unit tests" "and enable units tests.",
|
|
)
|
|
variant(
|
|
"third_party_in_build_dir",
|
|
default=True,
|
|
description="Compile third party libraries and tools in build diretory",
|
|
)
|
|
variant("local_lewis", default=False, description="Write Lewis numbers at every grid point")
|
|
variant(
|
|
"flamemaster_prefix",
|
|
default=True,
|
|
description="Used to modify the installation directories",
|
|
)
|
|
variant("openmp", default=True, description="Build with OpenMP")
|
|
variant("eigen", default=False, description="Build with Eigen Integration")
|
|
variant("eglib", default=False, description="Build with EG lib")
|
|
variant("sundials", default=True, description="with sundials")
|
|
|
|
depends_on("blas")
|
|
depends_on("lapack")
|
|
depends_on("cmake@3.12", type="build")
|
|
depends_on("bison")
|
|
depends_on("flex")
|
|
|
|
root_cmakelists_dir = "Repository"
|
|
|
|
def setup_build_environment(self, env):
|
|
env.set("LAPACK_HOME", self.spec["lapack"].prefix)
|
|
env.set("BLIS_HOME", self.spec["blas"].prefix)
|
|
|
|
if self.spec.satisfies("%aocc"):
|
|
env.append_flags(
|
|
"LDFLAGS",
|
|
"-L{0} -lalm -lm -lstdc++".format(
|
|
pjoin(os.path.dirname(os.path.dirname(self.compiler.cxx)), "lib")
|
|
),
|
|
)
|
|
|
|
def cmake_args(self):
|
|
spec = self.spec
|
|
|
|
args = ["-DCMAKE_C_COMPILER=%s" % spack_cc, "-DCMAKE_CXX_COMPILER=%s" % spack_cxx]
|
|
|
|
if spec.variants["build_type"].value == "Release":
|
|
cxx_flags_release = []
|
|
c_flags_release = []
|
|
fortran_flags_release = []
|
|
if self.spec.satisfies("%aocc") or self.spec.satisfies("%gcc"):
|
|
cxx_flags_release.extend(["-Ofast", "-ffast-math"])
|
|
c_flags_release.extend(["-Ofast", "-ffast-math"])
|
|
fortran_flags_release.extend(["-Ofast"])
|
|
args.extend(
|
|
[
|
|
self.define("CMAKE_CXX_FLAGS_RELEASE", " ".join(cxx_flags_release)),
|
|
self.define("CMAKE_C_FLAGS_RELEASE", " ".join(c_flags_release)),
|
|
self.define("CMAKE_Fortran_FLAGS_RELEASE", " ".join(fortran_flags_release)),
|
|
]
|
|
)
|
|
if self.spec.satisfies("%icc"):
|
|
cxxflags = "-Ofast -ffast-math -DNDEBUG -march=native\
|
|
-mtune=native -funroll-all-loops\
|
|
-qopt-multi-version-aggressive -ipo -parallel"
|
|
cflags = "-Ofast -ffast-math -DNDEBUG -march=native\
|
|
-mtune=native -funroll-all-loops -ipo -parallel"
|
|
fcflags = "-Ofast -march=native -mtune=native -ipo -parallel"
|
|
args.extend(
|
|
[
|
|
"-DCMAKE_CXX_FLAGS_RELEASE=%s" % cxxflags,
|
|
"-DCMAKE_C_FLAGS_RELEASE=%s" % cflags,
|
|
"-DCMAKE_Fortran_FLAGS_RELEASE=%s" % fcflags,
|
|
]
|
|
)
|
|
|
|
if self.spec.satisfies("%aocc"):
|
|
OpenMP_CXX_FLAGS = "-fopenmp=libomp"
|
|
clang = self.compiler.cc
|
|
clang_bin = os.path.dirname(clang)
|
|
clang_root = os.path.dirname(clang_bin)
|
|
args.extend(
|
|
[
|
|
"-DOpenMP_CXX_FLAGS=%s" % OpenMP_CXX_FLAGS,
|
|
"-DOpenMP_C_FLAGS=%s" % OpenMP_CXX_FLAGS,
|
|
"-DOpenMP_C_LIB_NAMES=libomp",
|
|
"-DOpenMP_CXX_LIB_NAMES=libomp",
|
|
"-DOpenMP_libomp_LIBRARY={0}/lib/libomp.so".format(clang_root),
|
|
]
|
|
)
|
|
|
|
args.append(self.define_from_variant("BILIN_OMEGA", "bilin_omega"))
|
|
args.append(self.define_from_variant("COMBUSTION_LIBS", "combustion"))
|
|
args.append(self.define_from_variant("COMPILE_FORTRAN_SRC", "fortran_code"))
|
|
args.append(self.define_from_variant("COMPILE_SCANMANNEW", "scanmannew"))
|
|
args.append(self.define_from_variant("DCO_CHUNK_TAPE", "dco_chunk_tape"))
|
|
args.append(self.define_from_variant("CHEMKIN_TROE", "troe"))
|
|
args.append(self.define_from_variant("JL_DEBUG", "jl_debug"))
|
|
args.append(self.define_from_variant("FLUX_BC_COUNTERFLOW", "flux_bc"))
|
|
args.append(self.define_from_variant("FULL_DIFFUSION", "full_diffusion"))
|
|
args.append(self.define_from_variant("ITV_SOOT_LIB", "soot_lib"))
|
|
args.append(self.define_from_variant("NEWTON_PERFORMANCE", "newton_perf"))
|
|
args.append(self.define_from_variant("OPTIMAPP", "optima"))
|
|
args.append(self.define_from_variant("OPT_REACTION_RATES", "opt_reaction_rates"))
|
|
args.append(self.define_from_variant("PREM_UPWIND_CONVEC", "prem_upwind_convec"))
|
|
args.append(self.define_from_variant("SILENCE_SUNDIALS_HINT", "sundials_hint"))
|
|
args.append(self.define_from_variant("SIMD_KINETICS", "simd_kinetics"))
|
|
args.append(self.define_from_variant("SOLVE_MOM_LOG", "solve_mom_log"))
|
|
args.append(self.define_from_variant("SOLVE_WITH_Z", "solve_with_z"))
|
|
args.append(self.define_from_variant("SUNDIALS_LAPACK", "sundials_lapack"))
|
|
args.append(self.define_from_variant("SUNDIALS_NO_IDAS_SEARCH", "sundials_no_idas_search"))
|
|
args.append(
|
|
self.define_from_variant("SUNDIALS_USE_STATIC_LIBRARIES", "sundials_use_static_lib")
|
|
)
|
|
args.append(self.define_from_variant("TESTS", "tests"))
|
|
args.append(
|
|
self.define_from_variant("THIRD_PARTY_IN_BUILD_DIR", "third_party_in_build_dir")
|
|
)
|
|
args.append(self.define_from_variant("WRITE_LOCAL_LEWIS", "local_lewis"))
|
|
args.append(self.define_from_variant("USE_FLAMEMASTER_PREFIX", "flamemaster_prefix"))
|
|
args.append(self.define_from_variant("WITH_EG", "eglib"))
|
|
args.append(self.define_from_variant("INSTALL_SUNDIALS", "sundials"))
|
|
args.append("-DINTEL_PROF_GEN:BOOL=%s" % ("ON" if "+intel_prof" in spec else "OFF"))
|
|
args.append("-DINTEL_PROF_USE:BOOL=%s" % ("ON" if "+intel_prof" in spec else "OFF"))
|
|
args.append(
|
|
"-DSUNDI_DIAGNOS_SEARCH_HEADER_FILES:BOOL=%s"
|
|
% ("ON" if "+sundials_diagnos" in spec else "OFF")
|
|
)
|
|
args.append(
|
|
"-DSUNDI_DIAGNOS_SEARCH_LIB_FILES:BOOL=%s"
|
|
% ("ON" if "+sundials_diagnos" in spec else "OFF")
|
|
)
|
|
args.append("-DEIGEN_INTEGRATION:BOOL=%s" % ("ON" if "+eigen" in spec else "OFF"))
|
|
args.append("-DINSTALL_EIGEN:BOOL=%s" % ("ON" if "+eigen" in spec else "OFF"))
|
|
|
|
if "^amdlibflame" in spec:
|
|
args.append("-DBLA_VENDOR=FLAME")
|
|
|
|
args.append("-DFLAMEMASTER_INSTALL_PREFIX:PATH={0}".format(spec.prefix))
|
|
|
|
return args
|