# 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