# 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) from spack.package import * class Flexi(CMakePackage): """Open Source High-Order Unstructured Discontinuous Galerkin Fluid Dynamics Solver""" homepage = "https://www.flexi-project.org/" git = "https://github.com/flexi-framework/flexi.git" license("GPL-3.0-or-later") version("master", preferred=True) version("21.03.0", tag="v21.03.0", commit="d061978e5d96cfc96c06edc1bae9d92cbe540c18") patch("for_aarch64.patch", when="target=aarch64:") variant("mpi", default=True, description="Enable MPI") variant( "2d", default=False, description="If set to True the code will run in two-dimensional mode" ) variant( "eqnsysname", default="navierstokes", values=("navierstokes", "linearscalaradvection", "rans_sa"), multi=False, description="Defines the equation system", ) variant( "fv", default=False, description="Enables the usage of the finite volume subcell shock capturing mechanism", ) variant( "lifting", default="br1", values=("br1", "br2"), multi=False, description=( "Two different lifting methods for the parabolic part of " "the equation system available" ), ) variant( "nodetype", default="GAUSS", values=("GAUSS", "GAUSS-LOBATTO"), multi=False, description="Space discretization basis function", ) variant( "split", default=False, description="Split form of the discontinuous Galerkin operator" ) variant( "parabolic", default=True, description=( "Defines whether the parabolic part of the chosen system " "should be included or not" ), ) variant( "testcase", default="default", values=("default", "taylorgreenvortex", "phill", "channel", "riemann2d"), multi=False, description="Defines the used test case", ) variant( "viscosity", default="constant", values=("constant", "sutherland", "powerlaw"), multi=False, description="Defines modeling approach for viscosity", ) variant("eddy_viscosity", default=False, description="Enable eddy viscosity") # Available Tools variant("visu", default=True, description="Enable posti_visu") variant("swapmesg", default=False, description="Enable posti_swapmesh") variant("preparerecordpoints", default=False, description="Enable posti_preparerecordpoints") variant( "visualizerecordpoints", default=False, description="Enable posti_visualizerecordpoints" ) variant("evaluaterecordpoints", default=False, description="Enable posti_evaluaterecordpoints") variant("mergetimeaverages", default=False, description="Enable posti_mergetimeaverages") variant("channel_fft", default=False, description="Enable posti_channel_fft") variant("to3d", default=False, description="Enable posti_to3d") variant("avg2d", default=False, description="Enable posti_avg2d") conflicts("+to3d", when="@:21.03.0", msg="Only available in newer releases") conflicts("nodetype=GAUSS", when="+split", msg="Only available for Gauss-Lobatto nodes") depends_on("mpi", when="+mpi") depends_on("hdf5+fortran+mpi", when="+mpi") depends_on("hdf5+fortran~mpi", when="~mpi") depends_on("lapack") depends_on("zlib-api") depends_on("fftw", when="+channel_fft") def flag_handler(self, name, flags): if name == "fflags": if self.spec.satisfies("%gcc@10:"): if flags is None: flags = [] flags.append("-fallow-argument-mismatch") return (flags, None, None) def cmake_args(self): args = [ "-DLIBS_BUILD_HDF5:BOOL=OFF", self.define_from_variant("LIBS_USE_MPI", "mpi"), self.define_from_variant("FLEXI_2D", "2d"), self.define_from_variant("FLEXI_EQNSYSNAME", "eqnsysname"), self.define_from_variant("FLEXI_FV", "fv"), self.define_from_variant("FLEXI_LIFTING", "lifting"), self.define_from_variant("FLEXI_NODETYPE", "nodetype"), self.define_from_variant("FLEXI_SPLIT_DG", "split"), self.define_from_variant("FLEXI_PARABOLIC", "parabolic"), self.define_from_variant("FLEXI_TESTCASE", "testcase"), self.define_from_variant("FLEXI_VISCOSITY", "viscosity"), self.define_from_variant("FLEXI_EDDYVISCOSITY", "eddy_viscosity"), self.define_from_variant("POSTI_VISU", "visu"), self.define_from_variant("POSTI_SWAPMESH", "swapmesg"), self.define_from_variant("POSTI_RP_VISUALIZE", "visualizerecordpoints"), self.define_from_variant("POSTI_RP_EVALUATE", "evaluaterecordpoints"), self.define_from_variant("POSTI_MERGETIMEAVERAGES", "mergetimeaverages"), self.define_from_variant("POSTI_CHANNEL_FFT", "channel_fft"), self.define_from_variant("POSTI_TO3D", "to3d"), self.define_from_variant("POSTI_AVG2D", "avg2d"), ] if self.spec.satisfies("@:21.03.0"): args.append(self.define_from_variant("POSTI_RP_PREPARERE", "preparerecordpoints")) else: args.append(self.define_from_variant("POSTI_RP_PREPARE", "preparerecordpoints")) return args