From b0067918a8706321a2c6537fc95f5b89d73e00ef Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 30 Jun 2023 12:01:51 +0200 Subject: [PATCH 01/18] Typo on RegTests --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01f94cd6..48c73891 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ For instance, to compile the executable for the case of a rising hot bubble, move into the `HotBubble` folder: ``` -cd PeleLMeX/Exec/RegTest/HotBubble +cd PeleLMeX/Exec/RegTests/HotBubble ``` If this is a clean install, you will need to make the third party libraries with: `make TPL` (note: if on macOS, you might need to specify `COMP=llvm` in the `make` statements). From 75754ebb63f5f62e44c1e719b811d5f6d7b06515 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 30 Jun 2023 12:52:33 +0200 Subject: [PATCH 02/18] Update README with better overview, explicit requirements and clearer get help instructions. --- README.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 48c73891..6e3f913f 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,15 @@ [![Language: C++17](https://img.shields.io/badge/language-C%2B%2B17-blue)](https://isocpp.org/) [![JOSS](https://joss.theoj.org/papers/6142eb838783b07fce14450fefe21e07/status.svg)](https://joss.theoj.org/papers/6142eb838783b07fce14450fefe21e07) -## Overview - ![CUDA build](https://github.com/AMReX-Combustion/PeleLMeX/workflows/PeleLMeX_Cuda/badge.svg) ![HIP build](https://github.com/AMReX-Combustion/PeleLMeX/workflows/PeleLMeX_Hip/badge.svg) ![SYCL build](https://github.com/AMReX-Combustion/PeleLMeX/workflows/PeleLMeX_Intel/badge.svg) -*PeleLMeX* is a non-subcycling version of [*PeleLM*](https://github.com/AMReX-Combustion/PeleLM) based on AMReX's [AmrCore](https://amrex-codes.github.io/amrex/docs_html/AmrCore.html) and borrowing from the incompressible solver [incflo](https://github.com/AMReX-Codes/incflo). It is designed to run efficiently on small workstations as well as the largest ExaScale platforms currently available. +## Overview + +*PeleLMeX* is a solver for high fidelity reactive flow simulations, namely direct numerical simulation (DNS) and large eddy simulation (LES). +The solver combines a low Mach number approach, adaptive mesh refinement (AMR) and high performance computing (HPC) to provide +a flexible tool to address research questions on platforms ranging from small workstations to the world's largest GPU-accelerated supercomputers. *PeleLMeX* is part of the [Pele combustion Suite](https://amrex-combustion.github.io/). @@ -19,7 +21,11 @@ ![Documentation](https://github.com/AMReX-Combustion/PeleLMeX/workflows/PeleLMeX-Docs/badge.svg) -*PeleLMeX* solves of the multispecies reactive Navier-Stokes equations in the low Mach number limit as described in the [documentation](https://amrex-combustion.github.io/PeleLMeX/manual/html/index.html). It inherits most of *PeleLM* algorithmic features, but differs significantly in its implementation stemming from the non-subcycling approach. +*PeleLMeX* is a non-subcycling version of [*PeleLM*](https://github.com/AMReX-Combustion/PeleLM) based on AMReX's +[AmrCore](https://amrex-codes.github.io/amrex/docs_html/AmrCore.html) and borrowing from the incompressible +solver [incflo](https://github.com/AMReX-Codes/incflo). It solves of the multispecies reactive Navier-Stokes equations +in the low Mach number limit as described in the [documentation](https://amrex-combustion.github.io/PeleLMeX/manual/html/index.html). +It inherits most of *PeleLM* algorithmic features, but differs significantly in its implementation stemming from the non-subcycling approach. A overview of *PeleLMeX* controls is provided in the [documentation](https://amrex-combustion.github.io/PeleLMeX/manual/html/LMeXControls.html). @@ -39,6 +45,17 @@ https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials.html ## Installation +### Requirements + +The compilations of *PeleLMeX* requires a C++17 compatible compiler (GCC >= 8 or Clang >= 3.6) as +well as cmake >= 3.23 for compiling the [SUNDIALS](https://github.com/LLNL/sundials) third party library. + +Most of the examples provided hereafter and in the [tutorials](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials.html) +will use MPI. Although not mandatory, it is advised to build *PeleLMeX* with MPI support from the get go if your +more than a single core is available to you. + +Finally, when building with GPU support, CUDA >= 11 is required with NVIDIA GPUs and ROCm >= 5.2 is required with AMD GPUs. + ### Download The prefered method consist in cloning the *PeleLMeX* and its submodules using a recursive `git clone`: @@ -89,7 +106,10 @@ Then build the executable: cmake --build buildHotBubble --parallel 4 ``` -## Contributing +## Getting help, contributing + +Do you have a question ? Found an issue ? Please use the [GitHub Discussions](https://github.com/AMReX-Combustion/PeleLMeX/discussions) to engage +with the development team or open a new [GitHub issue](https://github.com/AMReX-Combustion/PeleLMeX/issues) to report a bug. New contributions to *PeleLMeX* are welcome ! Contributing Guidelines are provided in [CONTRIBUTING.md](CONTRIBUTING.md). From d92e96dc183390d8372fb07de52755c1a5b4f103 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 14 Jul 2023 20:40:31 +0200 Subject: [PATCH 03/18] Remove a couple of typos in FlameSheet turorial. --- Docs/source/manual/Tutorials_FlameSheet.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Docs/source/manual/Tutorials_FlameSheet.rst b/Docs/source/manual/Tutorials_FlameSheet.rst index e1cd8433..ce5f0adf 100644 --- a/Docs/source/manual/Tutorials_FlameSheet.rst +++ b/Docs/source/manual/Tutorials_FlameSheet.rst @@ -16,7 +16,7 @@ the case of a 2D laminar methane/hydrogen/air premixed flame, perturbed using ha on the initial conditions. The goal of this tutorial is to demonstrate `PeleLMeX` basic controls when dealing with reactive simulations. -This document provides step by step instruction reviewing how to set-up the domain and boundary conditions, +This document provides step by step instructions reviewing how to set-up the domain and boundary conditions, and to construct an initial solution. .. _sec:TUTO_FS::PrepStep: @@ -57,7 +57,7 @@ Case setup ---------- A `PeleLMeX` case folder generally contains a minimal set of files to enable compilation, -provide user-defined function defining initial and boundary conditions, input file(s) and +provide user-defined functions defining initial and boundary conditions, input file(s) and any additional files necessary for the simulation (solution of a Cantera 1D flame for instance). The following three files in particular are necessary: :: @@ -105,7 +105,7 @@ used here. All of the above information is provided in the first two blocks of t The base grid is decomposed into a 32x64 cells array, and initially 2 levels of refinement are used. When running serial, a single box is used on the base level as the ``amr.max_grid_size`` exceeds the number of cells in each direction. When running parallel, the base grid will be chopped into smaller -boxes in the limit that no box smaller than the ``amr.blocking_factor`` can be created (16:math:`^3` here). +boxes in the limit that no box smaller than the ``amr.blocking_factor`` can be created (16 :math:`^2` here). The refinement ratio between each level is set to 2 and `PeleLMeX` currently does not support refinement ratio of 4. Regrid operation will be performed every 5 steps. ``amr.n_error_buf`` specifies, @@ -152,8 +152,8 @@ periodicity of the initial solution. .. note:: The ``P_mean`` parameters, providing the initial thermodynamic pressure, is always needed in the ProbParm struct. -Looking now into ``pelelm_prob.cpp``, we can see how the user can overwrite the default values of the parameters -contained in `ProbParm` using AMReX's ParmParse: :: +Looking now into ``pelelm_prob.cpp``, we can see how the developer can provide access to the `ProbParm` parameters +to overwrite the default values using AMReX's ParmParse: :: void PeleLM::readProbParm() { @@ -201,7 +201,7 @@ Finally, ``pelelm_prob.H`` defines the two functions effectively filling the ini * ``pele::physics::PMF::PmfData::DataContainer const * pmf_data`` : the Cantera solution data struct -The reader is encouraged to look into the body of the `pelelm_initdata` function for more details, a skelettal +The reader is encouraged to look into the body of the `pelelm_initdata` function for more details, a skeletal version of the function reads: * Compute the coordinate of the cell center using the cell indices and the `geomdata`. @@ -227,7 +227,7 @@ A last function, ``zero_visc``, is included in ``pelelm_prob.H`` but is not used Numerical parameters ^^^^^^^^^^^^^^^^^^^^ -The ``PeleLM CONTROL`` block contains a few of the `PeleLMeX` algorithmic parameters. Many more +The ``PeleLMeX CONTROL`` block contains a few of the `PeleLMeX` algorithmic parameters. Many more unspecified parameters are relying on their default values which can be found in :doc:`LMeXControls`. Of particular interest are the ``peleLM.sdc_iterMax`` parameter controlling the number of SDC iterations (see :doc:`Model` for more details on SDC in `PeleLMeX`) and the @@ -351,7 +351,7 @@ the initialization process and the solution will rapidly relax to adapt to the ` Let's now play with the problem parameters to see how the initial solution changes. For instance, decrease the amplitude of the perturbation, change the ``standoff`` parameter or deactivate the -initial projection by adding ``peleLM.do_init_proj=0`` to the ``PeleLM CONTROL`` block. Examples +initial projection by adding ``peleLM.do_init_proj=0`` to the ``PeleLMeX CONTROL`` block. Examples of the initial solution varying these parameters are displayed in :numref:`FS_InitTweaks`. .. figure:: images/tutorials/FS_InitSolTweaks.png From 9d47b24fc8179a25c9093a1ef6fc9c65b8da87d4 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 14 Jul 2023 21:25:52 +0200 Subject: [PATCH 04/18] Reduce duality between the use of PeleLM and PeleLMeX. Profiling now use PeleLMeX. --- README.md | 6 ++--- Source/Efield/PeleLMEFNLSolve.cpp | 8 +++---- Source/Efield/PeleLMEFPoisson.cpp | 2 +- Source/Efield/PeleLMEFTransport.cpp | 2 +- Source/PeleLMAdvance.cpp | 22 +++++++++--------- Source/PeleLMBC.cpp | 18 +++++++-------- Source/PeleLMDiagnostics.cpp | 2 +- Source/PeleLMDiffusion.cpp | 14 ++++++------ Source/PeleLMEB.cpp | 12 +++++----- Source/PeleLMEos.cpp | 10 ++++----- Source/PeleLMEvaluate.cpp | 2 +- Source/PeleLMEvolve.cpp | 2 +- Source/PeleLMForces.cpp | 2 +- Source/PeleLMInit.cpp | 10 ++++----- Source/PeleLMPlot.cpp | 8 +++---- Source/PeleLMProjection.cpp | 6 ++--- Source/PeleLMReactions.cpp | 8 +++---- Source/PeleLMRegrid.cpp | 8 +++---- Source/PeleLMSetup.cpp | 16 +++++++------- Source/PeleLMTagging.cpp | 2 +- Source/PeleLMTimestep.cpp | 4 ++-- Source/PeleLMTransportProp.cpp | 8 +++---- Source/PeleLMUMac.cpp | 8 +++---- Source/PeleLMUtils.cpp | 32 +++++++++++++-------------- Source/Spray/PeleLMSprayParticles.cpp | 12 +++++----- Source/main.cpp | 18 +++++++-------- 26 files changed, 121 insertions(+), 121 deletions(-) diff --git a/README.md b/README.md index 6e3f913f..196fff69 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The compilations of *PeleLMeX* requires a C++17 compatible compiler (GCC >= 8 or well as cmake >= 3.23 for compiling the [SUNDIALS](https://github.com/LLNL/sundials) third party library. Most of the examples provided hereafter and in the [tutorials](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials.html) -will use MPI. Although not mandatory, it is advised to build *PeleLMeX* with MPI support from the get go if your +will use MPI. Although not mandatory, it is advised to build *PeleLMeX* with MPI support from the get go if more than a single core is available to you. Finally, when building with GPU support, CUDA >= 11 is required with NVIDIA GPUs and ROCm >= 5.2 is required with AMD GPUs. @@ -66,7 +66,7 @@ git clone --recursive https://github.com/AMReX-Combustion/PeleLMeX.git ``` Alternatively, you can use separate `git clone` of the each of the submodules. -The default location for *PeleLMeX* dependencies is the `Submodule` folder but you optionnally +The default location for *PeleLMeX* dependencies is the `Submodules` folder but you optionnally setup the following environment variables (e.g. using bash) to an other location: ``` @@ -81,7 +81,7 @@ export PELEMP_HOME=${PELELMEX_HOME}/Submodules/PeleMP Both GNUmake and CMake can be used to build a *PeleLMeX* executable, but GNUmake is the prefered choice. The code handling the initial condition and boundary conditions is unique to each case, -and subfolders in the `Exec` directory provide a number of example. +and subfolders in the `Exec` directory provide a number of examples. For instance, to compile the executable for the case of a rising hot bubble, move into the `HotBubble` folder: diff --git a/Source/Efield/PeleLMEFNLSolve.cpp b/Source/Efield/PeleLMEFNLSolve.cpp index c9fbd3a9..cdcfb3df 100644 --- a/Source/Efield/PeleLMEFNLSolve.cpp +++ b/Source/Efield/PeleLMEFNLSolve.cpp @@ -20,7 +20,7 @@ void PeleLM::implicitNonLinearSolve(int sdcIter, std::unique_ptr &diffData, std::unique_ptr &advData) { - BL_PROFILE_VAR("PeleLM::implicitNonLinearSolve()", implicitNonLinearSolve); + BL_PROFILE_VAR("PeleLMeX::implicitNonLinearSolve()", implicitNonLinearSolve); const Real strt_time = ParallelDescriptor::second(); @@ -196,7 +196,7 @@ void PeleLM::implicitNonLinearSolve(int sdcIter, Real avgGMRES = (float)GMRES_tot_count/(float)NK_tot_count; amrex::Print() << " [" << sdcIter << "] dt: " << a_dt << " - Avg GMRES/Newton: " << avgGMRES << "\n"; } - amrex::Print() << " >> PeleLM::implicitNLSolve() " << run_time << "\n"; + amrex::Print() << " >> PeleLMeX::implicitNLSolve() " << run_time << "\n"; } //VisMF::Write(advData->Forcing[0],"ForcingNE"); @@ -813,7 +813,7 @@ void PeleLM::getAdvectionFluxes(int lev, void PeleLM::setUpPrecond(const Real &a_dt, const Vector &a_nE) { - BL_PROFILE("PeleLM::setUpPrecond()"); + BL_PROFILE("PeleLMeX::setUpPrecond()"); // Udpate LinearOps defs if needed -> done internally by the getPrecondOp() func @@ -1064,7 +1064,7 @@ void PeleLM::jTimesV(const Vector &a_v, void PeleLM::applyPrecond(const Vector &a_v, const Vector &a_Pv) { - BL_PROFILE("PeleLM::applyPrecond()"); + BL_PROFILE("PeleLMeX::applyPrecond()"); // Setup aliases and temps Vector nE_al; diff --git a/Source/Efield/PeleLMEFPoisson.cpp b/Source/Efield/PeleLMEFPoisson.cpp index 1d3d3e11..fab50506 100644 --- a/Source/Efield/PeleLMEFPoisson.cpp +++ b/Source/Efield/PeleLMEFPoisson.cpp @@ -7,7 +7,7 @@ using namespace amrex; void PeleLM::poissonSolveEF(const TimeStamp &a_time) { - BL_PROFILE_VAR("PeleLM::poissonSolveEF()", poissonSolveEF); + BL_PROFILE("PeleLMeX::poissonSolveEF()"); if (ef_verbose) { Print() << " EF Poisson solve \n"; } diff --git a/Source/Efield/PeleLMEFTransport.cpp b/Source/Efield/PeleLMEFTransport.cpp index 055cf390..70325da9 100644 --- a/Source/Efield/PeleLMEFTransport.cpp +++ b/Source/Efield/PeleLMEFTransport.cpp @@ -4,7 +4,7 @@ using namespace amrex; void PeleLM::calcEFTransport(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::calcEFTransport()"); + BL_PROFILE("PeleLMeX::calcEFTransport()"); for (int lev = 0; lev <= finest_level; ++lev) { diff --git a/Source/PeleLMAdvance.cpp b/Source/PeleLMAdvance.cpp index 73d78b1d..68499e67 100644 --- a/Source/PeleLMAdvance.cpp +++ b/Source/PeleLMAdvance.cpp @@ -5,7 +5,7 @@ using namespace amrex; void PeleLM::Advance(int is_initIter) { - BL_PROFILE("PeleLM::Advance()"); + BL_PROFILE("PeleLMeX::Advance()"); #ifdef AMREX_MEM_PROFILING // Memory profiler if compiled @@ -16,7 +16,7 @@ void PeleLM::Advance(int is_initIter) { Real strt_time = ParallelDescriptor::second(); //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::setup", PLM_SETUP); + BL_PROFILE_VAR("PeleLMeX::advance::setup", PLM_SETUP); //---------------------------------------------------------------- // Deal with ambient pressure @@ -121,11 +121,11 @@ void PeleLM::Advance(int is_initIter) { floorSpecies(AmrOldTime); //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::mac", PLM_MAC); + BL_PROFILE_VAR("PeleLMeX::advance::mac", PLM_MAC); setThermoPress(AmrOldTime); BL_PROFILE_VAR_STOP(PLM_MAC); //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::diffusion", PLM_DIFF); + BL_PROFILE_VAR("PeleLMeX::advance::diffusion", PLM_DIFF); computeDifferentialDiffusionTerms(AmrOldTime,diffData); BL_PROFILE_VAR_STOP(PLM_DIFF); //---------------------------------------------------------------- @@ -192,7 +192,7 @@ void PeleLM::Advance(int is_initIter) { //---------------------------------------------------------------- //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::velocity", PLM_VEL); + BL_PROFILE_VAR("PeleLMeX::advance::velocity", PLM_VEL); // Velocity advance Real VelAdvStart = 0.0; if (m_verbose > 1) { @@ -235,7 +235,7 @@ void PeleLM::Advance(int is_initIter) { { Real run_time = ParallelDescriptor::second() - strt_time; ParallelDescriptor::ReduceRealMax(run_time, ParallelDescriptor::IOProcessorNumber()); - amrex::Print() << " >> PeleLM::Advance() --> Time: " << run_time << "\n"; + amrex::Print() << " >> PeleLMeX::Advance() --> Time: " << run_time << "\n"; } } @@ -243,7 +243,7 @@ void PeleLM::oneSDC(int sdcIter, std::unique_ptr &advData, std::unique_ptr &diffData) { - BL_PROFILE("PeleLM::oneSDC()"); + BL_PROFILE("PeleLMeX::oneSDC()"); m_sdcIter = sdcIter; if (m_verbose > 0) { @@ -290,7 +290,7 @@ void PeleLM::oneSDC(int sdcIter, //---------------------------------------------------------------- // Get u MAC //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::mac", PLM_MAC); + BL_PROFILE_VAR("PeleLMeX::advance::mac", PLM_MAC); Real MACStart = 0.0; if (m_verbose > 1) { MACStart = ParallelDescriptor::second(); @@ -318,7 +318,7 @@ void PeleLM::oneSDC(int sdcIter, //---------------------------------------------------------------- // Scalar advections //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::scalars_adv", PLM_SADV); + BL_PROFILE_VAR("PeleLMeX::advance::scalars_adv", PLM_SADV); Real ScalAdvStart = 0.0; if (m_verbose > 1) { ScalAdvStart = ParallelDescriptor::second(); @@ -349,7 +349,7 @@ void PeleLM::oneSDC(int sdcIter, //---------------------------------------------------------------- // Scalar diffusion //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::diffusion", PLM_DIFF); + BL_PROFILE_VAR("PeleLMeX::advance::diffusion", PLM_DIFF); Real ScalDiffStart = 0.0; if (m_verbose > 1) { ScalDiffStart = ParallelDescriptor::second(); @@ -378,7 +378,7 @@ void PeleLM::oneSDC(int sdcIter, //---------------------------------------------------------------- // Reaction //---------------------------------------------------------------- - BL_PROFILE_VAR("PeleLM::advance::reactions", PLM_REAC); + BL_PROFILE_VAR("PeleLMeX::advance::reactions", PLM_REAC); Real ScalReacStart = 0.0; if (m_verbose > 1) { ScalReacStart = ParallelDescriptor::second(); diff --git a/Source/PeleLMBC.cpp b/Source/PeleLMBC.cpp index 7154a522..031512d3 100644 --- a/Source/PeleLMBC.cpp +++ b/Source/PeleLMBC.cpp @@ -239,7 +239,7 @@ PeleLM::fetchBCRecArray(int scomp, int ncomp) { // Fill the entire class state at once void PeleLM::fillPatchState(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::fillPatchState()"); + BL_PROFILE("PeleLMeX::fillPatchState()"); for (int lev = 0; lev <= finest_level; lev++) { fillPatchState(lev,a_time); } @@ -247,7 +247,7 @@ void PeleLM::fillPatchState(const TimeStamp &a_time) { // Fill the a given level class state void PeleLM::fillPatchState(int lev, const TimeStamp &a_time) { - BL_PROFILE("PeleLM::fillPatchStateLev()"); + BL_PROFILE("PeleLMeX::fillPatchStateLev()"); auto ldata_p = getLevelDataPtr(lev,a_time); Real time = getTime(lev, a_time); @@ -262,7 +262,7 @@ void PeleLM::fillPatchState(int lev, const TimeStamp &a_time) { // Fill a state components void PeleLM::fillPatchDensity(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::fillPatchDensity()"); + BL_PROFILE("PeleLMeX::fillPatchDensity()"); for (int lev = 0; lev <= finest_level; lev++) { auto ldata_p = getLevelDataPtr(lev,a_time); Real time = getTime(lev, a_time); @@ -271,7 +271,7 @@ void PeleLM::fillPatchDensity(const TimeStamp &a_time) { } void PeleLM::fillPatchSpecies(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::fillPatchSpecies()"); + BL_PROFILE("PeleLMeX::fillPatchSpecies()"); for (int lev = 0; lev <= finest_level; lev++) { auto ldata_p = getLevelDataPtr(lev,a_time); Real time = getTime(lev, a_time); @@ -280,7 +280,7 @@ void PeleLM::fillPatchSpecies(const TimeStamp &a_time) { } void PeleLM::fillPatchTemp(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::fillPatchTemp()"); + BL_PROFILE("PeleLMeX::fillPatchTemp()"); for (int lev = 0; lev <= finest_level; lev++) { auto ldata_p = getLevelDataPtr(lev,a_time); Real time = getTime(lev, a_time); @@ -290,7 +290,7 @@ void PeleLM::fillPatchTemp(const TimeStamp &a_time) { #ifdef PELE_USE_EFIELD void PeleLM::fillPatchPhiV(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::fillPatchPhiV()"); + BL_PROFILE("PeleLMeX::fillPatchPhiV()"); for (int lev = 0; lev <= finest_level; lev++) { auto ldata_p = getLevelDataPtr(lev,a_time); Real time = getTime(lev, a_time); @@ -305,7 +305,7 @@ void PeleLM::fillPatchPhiV(const TimeStamp &a_time) { // Fill the entire state at once std::unique_ptr PeleLM::fillPatchState(int lev, Real a_time, int nGrow) { - BL_PROFILE("PeleLM::fillPatchState()"); + BL_PROFILE("PeleLMeX::fillPatchState()"); std::unique_ptr mf; if ( m_incompressible ) { @@ -320,7 +320,7 @@ PeleLM::fillPatchState(int lev, Real a_time, int nGrow) { std::unique_ptr PeleLM::fillPatchReact(int lev, Real a_time, int nGrow) { - BL_PROFILE("PeleLM::fillPatchReact()"); + BL_PROFILE("PeleLMeX::fillPatchReact()"); int IRsize = NUM_SPECIES; #ifdef PELE_USE_EFIELD @@ -797,7 +797,7 @@ void PeleLM::fillcoarsepatch_chemFunctCall(int lev, void PeleLM::setInflowBoundaryVel(MultiFab &a_vel, int lev, TimeStamp a_time) { - BL_PROFILE_VAR("PeleLM::setInflowBoundaryVel()", setInflowBoundaryVel); + BL_PROFILE("PeleLMeX::setInflowBoundaryVel()"); Real time = getTime(lev, a_time); diff --git a/Source/PeleLMDiagnostics.cpp b/Source/PeleLMDiagnostics.cpp index 7037c35b..46a0f7e1 100644 --- a/Source/PeleLMDiagnostics.cpp +++ b/Source/PeleLMDiagnostics.cpp @@ -62,7 +62,7 @@ PeleLM::updateDiagnostics() void PeleLM::doDiagnostics() { - BL_PROFILE("PeleLM::doDiagnostics()"); + BL_PROFILE("PeleLMeX::doDiagnostics()"); // Assemble a vector of MF containing the requested data Vector > diagMFVec(finestLevel()+1); for (int lev{0}; lev <= finestLevel(); ++lev) { diff --git a/Source/PeleLMDiffusion.cpp b/Source/PeleLMDiffusion.cpp index 0ba212bd..8299a180 100644 --- a/Source/PeleLMDiffusion.cpp +++ b/Source/PeleLMDiffusion.cpp @@ -36,7 +36,7 @@ void PeleLM::computeDifferentialDiffusionTerms(const TimeStamp &a_time, std::unique_ptr &diffData, int is_init) { - BL_PROFILE("PeleLM::computeDifferentialDiffusionTerms()"); + BL_PROFILE("PeleLMeX::computeDifferentialDiffusionTerms()"); //---------------------------------------------------------------- // Checks @@ -198,7 +198,7 @@ void PeleLM::computeDifferentialDiffusionFluxes(const TimeStamp &a_time, const Vector > &a_wbarfluxes, const Vector > &a_soretfluxes) { - BL_PROFILE("PeleLM::computeDifferentialDiffusionFluxes()"); + BL_PROFILE("PeleLMeX::computeDifferentialDiffusionFluxes()"); #ifdef AMREX_USE_EB int have_EBfluxes = (a_EBfluxes.empty()) ? 0 : 1; @@ -614,7 +614,7 @@ void PeleLM::adjustSpeciesFluxes(const Vector > Vector const &a_spec) { - BL_PROFILE("PeleLM::adjustSpeciesFluxes()"); + BL_PROFILE("PeleLMeX::adjustSpeciesFluxes()"); // Get the species BCRec auto bcRecSpec = fetchBCRecArray(FIRSTSPEC,NUM_SPECIES); @@ -710,7 +710,7 @@ void PeleLM::computeSpeciesEnthalpyFlux(const Vector const &a_temp) { - BL_PROFILE("PeleLM::computeSpeciesEnthalpyFlux()"); + BL_PROFILE("PeleLMeX::computeSpeciesEnthalpyFlux()"); // Get the species BCRec auto bcRecSpec = fetchBCRecArray(FIRSTSPEC,NUM_SPECIES); @@ -798,7 +798,7 @@ void PeleLM::computeSpeciesEnthalpyFlux(const Vector &advData, std::unique_ptr &diffData) { - BL_PROFILE("PeleLM::differentialDiffusionUpdate()"); + BL_PROFILE("PeleLMeX::differentialDiffusionUpdate()"); //------------------------------------------------------------------------ // Setup fluxes @@ -1374,7 +1374,7 @@ void PeleLM::computeDivTau(const TimeStamp &a_time, int use_density, Real scale) { - BL_PROFILE("PeleLM::computeDivTau()"); + BL_PROFILE("PeleLMeX::computeDivTau()"); // Get the density component BCRec to get viscosity on faces auto bcRec = fetchBCRecArray(DENSITY,1); @@ -1395,7 +1395,7 @@ void PeleLM::computeDivTau(const TimeStamp &a_time, void PeleLM::diffuseVelocity() { - BL_PROFILE("PeleLM::diffuseVelocity()"); + BL_PROFILE("PeleLMeX::diffuseVelocity()"); // Get the density component BCRec to get viscosity on faces auto bcRec = fetchBCRecArray(DENSITY,1); diff --git a/Source/PeleLMEB.cpp b/Source/PeleLMEB.cpp index afc4c9be..9a97d6cd 100644 --- a/Source/PeleLMEB.cpp +++ b/Source/PeleLMEB.cpp @@ -13,7 +13,7 @@ using namespace amrex; void PeleLM::makeEBGeometry() { - BL_PROFILE("PeleLM::makeEBGeometry()"); + BL_PROFILE("PeleLMeX::makeEBGeometry()"); int max_coarsening_level = 100; int req_coarsening_level = geom.size()-1; @@ -59,7 +59,7 @@ void PeleLM::redistributeAofS(int a_lev, const BCRec * d_bc, const Geometry &a_geom) { - BL_PROFILE("PeleLM::redistributeAofS()"); + BL_PROFILE("PeleLMeX::redistributeAofS()"); AMREX_ASSERT(a_tmpDiv.nComp() >= div_comp+ncomp); AMREX_ASSERT(a_AofS.nComp() >= aofs_comp+ncomp); AMREX_ASSERT(a_state.nComp() >= state_comp+ncomp); @@ -183,7 +183,7 @@ void PeleLM::redistributeDiff(int a_lev, const BCRec * d_bc, const Geometry &a_geom) { - BL_PROFILE("PeleLM::redistributeDiff()"); + BL_PROFILE("PeleLMeX::redistributeDiff()"); AMREX_ASSERT(a_tmpDiv.nComp() >= div_comp+ncomp); AMREX_ASSERT(a_diff.nComp() >= diff_comp+ncomp); AMREX_ASSERT(a_state.nComp() >= state_comp+ncomp); @@ -279,7 +279,7 @@ void PeleLM::initCoveredState() void PeleLM::setCoveredState(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::setCoveredState()"); + BL_PROFILE("PeleLMeX::setCoveredState()"); for (int lev = 0; lev <= finest_level; lev++) { setCoveredState(lev,a_time); } @@ -379,7 +379,7 @@ void PeleLM::initialRedistribution() void PeleLM::getEBDistance(int a_lev, MultiFab &a_signDistLev) { - BL_PROFILE("PeleLM::getEBDistance()"); + BL_PROFILE("PeleLMeX::getEBDistance()"); if (a_lev == 0) { MultiFab::Copy(a_signDistLev,*m_signedDist0,0,0,1,0); @@ -566,7 +566,7 @@ void PeleLM::correct_vel_small_cells (Vector const& a_vel, Vector > const& a_umac) { - BL_PROFILE("PeleLM::correct_vel_small_cells"); + BL_PROFILE("PeleLMeX::correct_vel_small_cells"); for (int lev = 0; lev <= finest_level; lev++) { diff --git a/Source/PeleLMEos.cpp b/Source/PeleLMEos.cpp index 445d340d..dfd6857e 100644 --- a/Source/PeleLMEos.cpp +++ b/Source/PeleLMEos.cpp @@ -4,7 +4,7 @@ using namespace amrex; void PeleLM::setThermoPress(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::setThermoPress()"); + BL_PROFILE("PeleLMeX::setThermoPress()"); AMREX_ASSERT(a_time == AmrOldTime || a_time == AmrNewTime); @@ -38,7 +38,7 @@ void PeleLM::calcDivU(int is_init, const TimeStamp &a_time, std::unique_ptr &diffData) { - BL_PROFILE("PeleLM::calcDivU()"); + BL_PROFILE("PeleLMeX::calcDivU()"); AMREX_ASSERT(a_time == AmrOldTime || a_time == AmrNewTime); @@ -181,7 +181,7 @@ void PeleLM::setRhoToSumRhoY(int lev, const TimeStamp &a_time) { } void PeleLM::setTemperature(const TimeStamp &a_time) { - BL_PROFILE_VAR("PeleLM::setTemperature()", setTemperature); + BL_PROFILE_VAR("PeleLMeX::setTemperature()", setTemperature); AMREX_ASSERT(a_time == AmrOldTime || a_time == AmrNewTime); @@ -213,7 +213,7 @@ void PeleLM::setTemperature(int lev, const TimeStamp &a_time) { void PeleLM::calc_dPdt(const TimeStamp &a_time, const Vector &a_dPdt) { - BL_PROFILE("PeleLM::calc_dPdt()"); + BL_PROFILE("PeleLMeX::calc_dPdt()"); AMREX_ASSERT(a_time == AmrOldTime || a_time == AmrNewTime); @@ -253,7 +253,7 @@ void PeleLM::calc_dPdt(int lev, Real PeleLM::adjustPandDivU(std::unique_ptr &advData) { - BL_PROFILE("PeleLM::adjustPandDivU()"); + BL_PROFILE("PeleLMeX::adjustPandDivU()"); Vector> ThetaHalft(finest_level+1); diff --git a/Source/PeleLMEvaluate.cpp b/Source/PeleLMEvaluate.cpp index a24b90e9..9a728a71 100644 --- a/Source/PeleLMEvaluate.cpp +++ b/Source/PeleLMEvaluate.cpp @@ -4,7 +4,7 @@ using namespace amrex; void PeleLM::Evaluate() { - BL_PROFILE("PeleLM::Evaluate()"); + BL_PROFILE("PeleLMeX::Evaluate()"); //---------------------------------------------------------------- // Check that requested evaluate entries exist and determine the size diff --git a/Source/PeleLMEvolve.cpp b/Source/PeleLMEvolve.cpp index 5da81fc3..0b5de7fe 100644 --- a/Source/PeleLMEvolve.cpp +++ b/Source/PeleLMEvolve.cpp @@ -3,7 +3,7 @@ using namespace amrex; void PeleLM::Evolve() { - BL_PROFILE("PeleLM::Evolve()"); + BL_PROFILE("PeleLMeX::Evolve()"); bool do_not_evolve = ( (m_max_step == 0) || ((m_stop_time >= 0.) && (m_cur_time > m_stop_time)) ); diff --git a/Source/PeleLMForces.cpp b/Source/PeleLMForces.cpp index af4cad8d..ecd456af 100644 --- a/Source/PeleLMForces.cpp +++ b/Source/PeleLMForces.cpp @@ -12,7 +12,7 @@ void PeleLM::getVelForces(const TimeStamp &a_time, int nGrowForce, int add_gradP) { - BL_PROFILE("PeleLM::getVelForces()"); + BL_PROFILE("PeleLMeX::getVelForces()"); int has_divTau = (!a_divTau.empty()); for (int lev = 0; lev <= finest_level; ++lev) { diff --git a/Source/PeleLMInit.cpp b/Source/PeleLMInit.cpp index ca7884ea..dc4d9194 100644 --- a/Source/PeleLMInit.cpp +++ b/Source/PeleLMInit.cpp @@ -7,7 +7,7 @@ using namespace amrex; void PeleLM::Init() { - BL_PROFILE_VAR("PeleLM::Init()", Init); + BL_PROFILE("PeleLMeX::Init()"); // Open temporals file openTempFile(); @@ -23,7 +23,7 @@ void PeleLM::MakeNewLevelFromScratch( int lev, amrex::Real time, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm) { - BL_PROFILE_VAR("PeleLM::MakeNewLevelFromScratch()", MakeNewLevelFromScratch); + BL_PROFILE("PeleLMeX::MakeNewLevelFromScratch()"); if (m_verbose > 0) { amrex::Print() << " Making new level " << lev << " from scratch" << std::endl; @@ -147,7 +147,7 @@ void PeleLM::MakeNewLevelFromScratch( int lev, } void PeleLM::initData() { - BL_PROFILE_VAR("PeleLM::initData()", initData); + BL_PROFILE("PeleLMeX::initData()"); if (m_restart_chkfile.empty()) { //---------------------------------------------------------------- @@ -289,7 +289,7 @@ void PeleLM::initData() { } void PeleLM::initLevelData(int lev) { - BL_PROFILE_VAR("PeleLM::initLevelData()", initLevelData); + BL_PROFILE("PeleLMeX::initLevelData()"); // Get level data auto ldata_p = getLevelDataPtr(lev,AmrNewTime); @@ -434,7 +434,7 @@ void PeleLM::projectInitSolution() } void PeleLM::initialIterations() { - BL_PROFILE_VAR("PeleLM::initialIterations()", initialIterations); + BL_PROFILE("PeleLMeX::initialIterations()"); if (m_verbose > 0 && m_init_iter > 0) { amrex::Print() << "\n Doing initial pressure iteration(s) \n"; diff --git a/Source/PeleLMPlot.cpp b/Source/PeleLMPlot.cpp index 5d1e3c8a..ecfe0df9 100644 --- a/Source/PeleLMPlot.cpp +++ b/Source/PeleLMPlot.cpp @@ -48,7 +48,7 @@ void PeleLM::WriteDebugPlotFile(const Vector &a_MF, } void PeleLM::WritePlotFile() { - BL_PROFILE("PeleLM::WritePlotFile()"); + BL_PROFILE("PeleLMeX::WritePlotFile()"); const std::string& plotfilename = amrex::Concatenate(m_plot_file, m_nstep, m_ioDigits); @@ -443,7 +443,7 @@ void PeleLM::WriteHeader(const std::string& name, bool is_checkpoint) const void PeleLM::WriteCheckPointFile() { - BL_PROFILE("PeleLM::WriteCheckPointFile()"); + BL_PROFILE("PeleLMeX::WriteCheckPointFile()"); const std::string& checkpointname = amrex::Concatenate(m_check_file, m_nstep, m_ioDigits); @@ -492,7 +492,7 @@ void PeleLM::WriteCheckPointFile() void PeleLM::ReadCheckPointFile() { - BL_PROFILE("PeleLM::ReadCheckPointFile()"); + BL_PROFILE("PeleLMeX::ReadCheckPointFile()"); amrex::Print() << "Restarting from checkpoint " << m_restart_chkfile << "\n"; @@ -501,7 +501,7 @@ void PeleLM::ReadCheckPointFile() /*************************************************************************** ** Load header: set up problem domain (including BoxArray) * - ** allocate PeleLM memory (PeleLM::AllocateArrays) * + ** allocate PeleLMeX memory (PeleLM::AllocateArrays) * ** (by calling MakeNewLevelFromScratch) * ****************************************************************************/ diff --git a/Source/PeleLMProjection.cpp b/Source/PeleLMProjection.cpp index 58c3db8d..4f97330f 100644 --- a/Source/PeleLMProjection.cpp +++ b/Source/PeleLMProjection.cpp @@ -4,7 +4,7 @@ using namespace amrex; void PeleLM::initialProjection() { - BL_PROFILE_VAR("PeleLM::initialProjection()", initialProjection); + BL_PROFILE("PeleLMeX::initialProjection()"); if (m_verbose) { Vector velMax(AMREX_SPACEDIM); @@ -111,7 +111,7 @@ void PeleLM::initialProjection() void PeleLM::initialPressProjection() { - BL_PROFILE_VAR("PeleLM::initialPressProjection()", initialProjection); + BL_PROFILE("PeleLMeX::initialPressProjection()"); if (m_verbose) { amrex::Print() << " Initial pressure projection \n"; @@ -167,7 +167,7 @@ void PeleLM::velocityProjection(int is_initIter, const TimeStamp &a_rhoTime, const Real &a_dt) { - BL_PROFILE_VAR("PeleLM::velocityProjection()", velocityProjection); + BL_PROFILE("PeleLMeX::velocityProjection()"); int nGhost = 0; int incremental = (is_initIter) ? 1 : 0; diff --git a/Source/PeleLMReactions.cpp b/Source/PeleLMReactions.cpp index 33439954..2c16d99c 100644 --- a/Source/PeleLMReactions.cpp +++ b/Source/PeleLMReactions.cpp @@ -8,7 +8,7 @@ using namespace amrex; void PeleLM::advanceChemistry(std::unique_ptr &advData) { - BL_PROFILE("PeleLM::advanceChemistry()"); + BL_PROFILE("PeleLMeX::advanceChemistry()"); for (int lev = finest_level; lev >= 0; --lev) { if (lev != finest_level) { @@ -30,7 +30,7 @@ void PeleLM::advanceChemistry(int lev, const Real &a_dt, MultiFab &a_extForcing) { - BL_PROFILE("PeleLM::advanceChemistry_Lev"+std::to_string(lev)+"()"); + BL_PROFILE("PeleLMeX::advanceChemistry_Lev"+std::to_string(lev)+"()"); auto ldataOld_p = getLevelDataPtr(lev,AmrOldTime); auto ldataNew_p = getLevelDataPtr(lev,AmrNewTime); @@ -175,7 +175,7 @@ void PeleLM::advanceChemistryBAChem(int lev, const Real &a_dt, MultiFab &a_extForcing) { - BL_PROFILE("PeleLM::advanceChemistry_Lev"+std::to_string(lev)+"()"); + BL_PROFILE("PeleLMeX::advanceChemistry_Lev"+std::to_string(lev)+"()"); auto ldataOld_p = getLevelDataPtr(lev,AmrOldTime); auto ldataNew_p = getLevelDataPtr(lev,AmrNewTime); @@ -374,7 +374,7 @@ void PeleLM::computeInstantaneousReactionRate(int lev, const TimeStamp &a_time, MultiFab* a_I_R) { - BL_PROFILE("PeleLM::computeInstantaneousReactionRate()"); + BL_PROFILE("PeleLMeX::computeInstantaneousReactionRate()"); auto ldata_p = getLevelDataPtr(lev,a_time); #ifdef AMREX_USE_EB diff --git a/Source/PeleLMRegrid.cpp b/Source/PeleLMRegrid.cpp index 7cf8bb35..d6ea054b 100644 --- a/Source/PeleLMRegrid.cpp +++ b/Source/PeleLMRegrid.cpp @@ -6,7 +6,7 @@ void PeleLM::regrid(int lbase, amrex::Real time, bool initial) { - BL_PROFILE("PeleLM::regrid()"); + BL_PROFILE("PeleLMeX::regrid()"); if (!m_doLoadBalance && lbase >= max_level) return; @@ -260,7 +260,7 @@ void PeleLM::MakeNewLevelFromCoarse( int lev, amrex::Real time, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm) { - BL_PROFILE_VAR("PeleLM::MakeNewLevelFromCoarse()", MakeNewLevelFromCoarse); + BL_PROFILE("PeleLMeX::MakeNewLevelFromCoarse()"); if (m_verbose > 0) { Print() << " Making new level " << lev << " from coarse\n"; @@ -362,7 +362,7 @@ void PeleLM::RemakeLevel( int lev, amrex::Real time, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm) { - BL_PROFILE_VAR("PeleLM::RemakeLevel()", RemakeLevel); + BL_PROFILE("PeleLMeX::RemakeLevel()"); if (m_verbose > 0) { Print() << " Remaking level " << lev << "\n"; @@ -461,7 +461,7 @@ void PeleLM::RemakeLevel( int lev, } void PeleLM::ClearLevel(int lev) { - BL_PROFILE_VAR("PeleLM::ClearLevel()", ClearLevel); + BL_PROFILE("PeleLMeX::ClearLevel()"); m_leveldata_old[lev].reset(); m_leveldata_new[lev].reset(); diff --git a/Source/PeleLMSetup.cpp b/Source/PeleLMSetup.cpp index a86ed7a0..c64790f8 100644 --- a/Source/PeleLMSetup.cpp +++ b/Source/PeleLMSetup.cpp @@ -20,7 +20,7 @@ static Box the_same_box (const Box& b) { return b; } static Box grow_box_by_two (const Box& b) { return amrex::grow(b,2); } void PeleLM::Setup() { - BL_PROFILE("PeleLM::Setup()"); + BL_PROFILE("PeleLMeX::Setup()"); m_wall_start = amrex::ParallelDescriptor::second(); @@ -45,7 +45,7 @@ void PeleLM::Setup() { soot_model = new SootModel{}; #endif - // Read PeleLM parameters + // Read PeleLMeX parameters readParameters(); #ifdef AMREX_USE_EB @@ -146,7 +146,7 @@ void PeleLM::Setup() { } void PeleLM::readParameters() { - BL_PROFILE("PeleLM::readParameters()"); + BL_PROFILE("PeleLMeX::readParameters()"); readIOParameters(); @@ -554,7 +554,7 @@ void PeleLM::readParameters() { } void PeleLM::readIOParameters() { - BL_PROFILE_VAR("PeleLM::readIOParameters()", readIOParameters); + BL_PROFILE_VAR("PeleLMeX::readIOParameters()", readIOParameters); ParmParse pp("amr"); @@ -597,7 +597,7 @@ void PeleLM::readIOParameters() { } void PeleLM::variablesSetup() { - BL_PROFILE("PeleLM::variablesSetup()"); + BL_PROFILE("PeleLMeX::variablesSetup()"); //---------------------------------------------------------------- // Variables ordering is defined through compiler macro in PeleLM_Index.H @@ -783,7 +783,7 @@ void PeleLM::readGridFile(std::string grid_file, void PeleLM::derivedSetup() { - BL_PROFILE("PeleLM::derivedSetup()"); + BL_PROFILE("PeleLMeX::derivedSetup()"); if (!m_incompressible) { @@ -929,7 +929,7 @@ void PeleLM::derivedSetup() void PeleLM::evaluateSetup() { - BL_PROFILE("PeleLM::evaluateSetup()"); + BL_PROFILE("PeleLMeX::evaluateSetup()"); // Get species names Vector spec_names; @@ -1020,7 +1020,7 @@ void PeleLM::evaluateSetup() void PeleLM::taggingSetup() { - BL_PROFILE("PeleLM::taggingSetup()"); + BL_PROFILE("PeleLMeX::taggingSetup()"); std::string amr_prefix = "amr"; ParmParse ppamr(amr_prefix); diff --git a/Source/PeleLMTagging.cpp b/Source/PeleLMTagging.cpp index 9cd3f6e3..0fb54f5c 100644 --- a/Source/PeleLMTagging.cpp +++ b/Source/PeleLMTagging.cpp @@ -12,7 +12,7 @@ PeleLM::ErrorEst( int lev, Real time, int /*ng*/) { - BL_PROFILE_VAR("PeleLM::ErrorEst()", ErrorEst); + BL_PROFILE("PeleLMeX::ErrorEst()"); #ifdef AMREX_USE_EB // Tag EB up to m_EB_refine_LevMax-1 if Static or diff --git a/Source/PeleLMTimestep.cpp b/Source/PeleLMTimestep.cpp index 3fed3b23..dd1f2801 100644 --- a/Source/PeleLMTimestep.cpp +++ b/Source/PeleLMTimestep.cpp @@ -7,7 +7,7 @@ Real PeleLM::computeDt(int is_init, const TimeStamp &a_time) { - BL_PROFILE("PeleLM::computeDt()"); + BL_PROFILE("PeleLMeX::computeDt()"); Real estdt = 1.0e200; @@ -220,7 +220,7 @@ void PeleLM::checkDt(const TimeStamp &a_time, const Real &a_dt) { - BL_PROFILE("PeleLM::checkDt()"); + BL_PROFILE("PeleLMeX::checkDt()"); if (m_fixed_dt > 0.0 || !m_divu_checkFlag) { return; diff --git a/Source/PeleLMTransportProp.cpp b/Source/PeleLMTransportProp.cpp index 1949f6f8..4851376d 100644 --- a/Source/PeleLMTransportProp.cpp +++ b/Source/PeleLMTransportProp.cpp @@ -9,7 +9,7 @@ using namespace amrex; void PeleLM::calcTurbViscosity(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::calcTurbViscosity()"); + BL_PROFILE("PeleLMeX::calcTurbViscosity()"); // We shouldn't be here unless we're doing LES AMREX_ALWAYS_ASSERT(m_do_les); @@ -218,7 +218,7 @@ void PeleLM::calcTurbViscosity(const TimeStamp &a_time) { } void PeleLM::calcViscosity(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::calcViscosity()"); + BL_PROFILE("PeleLMeX::calcViscosity()"); for (int lev = 0; lev <= finest_level; ++lev) { @@ -250,7 +250,7 @@ void PeleLM::calcViscosity(const TimeStamp &a_time) { } void PeleLM::calcDiffusivity(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::calcDiffusivity()"); + BL_PROFILE("PeleLMeX::calcDiffusivity()"); for (int lev = 0; lev <= finest_level; ++lev) { @@ -325,7 +325,7 @@ PeleLM::getDiffusivity(int lev, int beta_comp, int ncomp, int doZeroVisc, MultiFab const& beta_cc, int addTurbContrib) { - BL_PROFILE("PeleLM::getDiffusivity()"); + BL_PROFILE("PeleLMeX::getDiffusivity()"); AMREX_ASSERT(bcrec.size() >= ncomp); AMREX_ASSERT(beta_cc.nComp() >= beta_comp+ncomp); diff --git a/Source/PeleLMUMac.cpp b/Source/PeleLMUMac.cpp index 8cf9b9d2..2d551aea 100644 --- a/Source/PeleLMUMac.cpp +++ b/Source/PeleLMUMac.cpp @@ -8,7 +8,7 @@ using namespace amrex; void PeleLM::predictVelocity(std::unique_ptr &advData) { - BL_PROFILE("PeleLM::predictVelocity()"); + BL_PROFILE("PeleLMeX::predictVelocity()"); // set umac boundaries to zero if ( advData->umac[0][0].nGrow() > 0 ) { @@ -69,7 +69,7 @@ void PeleLM::predictVelocity(std::unique_ptr &advData) void PeleLM::createMACRHS(std::unique_ptr &advData) { - BL_PROFILE("PeleLM::createMACRHS()"); + BL_PROFILE("PeleLMeX::createMACRHS()"); for (int lev = 0; lev <= finest_level; ++lev) { Real halftime = 0.5 * (m_t_old[lev] + m_t_new[lev]); @@ -81,7 +81,7 @@ void PeleLM::addChiIncrement(int a_sdcIter, const TimeStamp &a_time, std::unique_ptr &advData) { - BL_PROFILE("PeleLM::addChiIncrement()"); + BL_PROFILE("PeleLMeX::addChiIncrement()"); int nGrow = m_nGrowAdv; Vector chiIncr(finest_level+1); @@ -125,7 +125,7 @@ void PeleLM::macProject(const TimeStamp &a_time, std::unique_ptr &advData, const Vector &a_divu) { - BL_PROFILE("PeleLM::macProject()"); + BL_PROFILE("PeleLMeX::macProject()"); int has_divu = (!a_divu.empty()); diff --git a/Source/PeleLMUtils.cpp b/Source/PeleLMUtils.cpp index c1896591..cb2b78c9 100644 --- a/Source/PeleLMUtils.cpp +++ b/Source/PeleLMUtils.cpp @@ -15,7 +15,7 @@ void PeleLM::fluxDivergence(const Vector &a_divergence, int intensiveFluxes, Real scale) { - BL_PROFILE("PeleLM::fluxDivergence()"); + BL_PROFILE("PeleLMeX::fluxDivergence()"); if (intensiveFluxes) { // Fluxes are intensive -> need area scaling in div for (int lev = 0; lev <= finest_level; ++lev) { intFluxDivergenceLevel(lev,*a_divergence[lev], div_comp, a_fluxes[lev], flux_comp, @@ -39,7 +39,7 @@ void PeleLM::fluxDivergence(const Vector &a_divergence, int intensiveFluxes, Real scale) { - BL_PROFILE("PeleLM::fluxDivergence()"); + BL_PROFILE("PeleLMeX::fluxDivergence()"); if (intensiveFluxes) { // Fluxes are intensive -> need area scaling in div for (int lev = 0; lev <= finest_level; ++lev) { intFluxDivergenceLevelEB(lev,*a_divergence[lev], div_comp, a_fluxes[lev], flux_comp, @@ -67,7 +67,7 @@ void PeleLM::fluxDivergenceRD(const Vector &a_state, const Real &scale, const Real &a_dt) { - BL_PROFILE("PeleLM::fluxDivergenceRD()"); + BL_PROFILE("PeleLMeX::fluxDivergenceRD()"); #ifdef AMREX_USE_EB int have_ebfluxes = (a_EBfluxes.empty()) ? 0 : 1; for (int lev = 0; lev <= finest_level; ++lev) { @@ -437,7 +437,7 @@ void PeleLM::advFluxDivergence(int a_lev, amrex::Real scale, bool fluxes_are_area_weighted) { - BL_PROFILE("PeleLM::advFluxDivergence()"); + BL_PROFILE("PeleLMeX::advFluxDivergence()"); AMREX_ASSERT(a_divergence.nComp() >= div_comp+ncomp); AMREX_ASSERT(a_fluxes[0]->nComp() >= flux_comp+ncomp); @@ -561,7 +561,7 @@ void PeleLM::advFluxDivergence(int a_lev, void PeleLM::floorSpecies(const TimeStamp &a_time) { - BL_PROFILE("PeleLM::floorSpecies()"); + BL_PROFILE("PeleLMeX::floorSpecies()"); AMREX_ASSERT(a_time == AmrOldTime || a_time == AmrNewTime); if (!m_floor_species) { return; @@ -602,7 +602,7 @@ PeleLM::floorSpecies(const TimeStamp &a_time) void PeleLM::resetCoveredMask() { - BL_PROFILE("PeleLM::resetCoveredMask()"); + BL_PROFILE("PeleLMeX::resetCoveredMask()"); if (m_resetCoveredMask) { if (m_verbose) Print() << " Resetting fine-covered cells mask \n"; @@ -785,7 +785,7 @@ PeleLM::derive(const std::string &a_name, int lev, int nGrow) { - BL_PROFILE("PeleLM::derive()"); + BL_PROFILE("PeleLMeX::derive()"); AMREX_ASSERT(nGrow >= 0); std::unique_ptr mf; @@ -841,7 +841,7 @@ PeleLM::deriveComp(const std::string &a_name, int lev, int nGrow) { - BL_PROFILE("PeleLM::derive()"); + BL_PROFILE("PeleLMeX::derive()"); AMREX_ASSERT(nGrow >= 0); std::unique_ptr mf; @@ -1002,7 +1002,7 @@ PeleLM::parseVars(const Vector &a_varsNames, Real PeleLM::MLNorm0(const Vector &a_MF) { - BL_PROFILE("PeleLM::MLNorm0()"); + BL_PROFILE("PeleLMeX::MLNorm0()"); Real r = 0.0; for (int lev = 0; lev < a_MF.size(); ++lev) { if (lev != finest_level) { @@ -1019,7 +1019,7 @@ Vector PeleLM::MLNorm0(const Vector &a_MF, int startcomp, int ncomp) { - BL_PROFILE("PeleLM::MLNorm0()"); + BL_PROFILE("PeleLMeX::MLNorm0()"); AMREX_ASSERT(a_MF[0]->nComp() >= startcomp+ncomp); Vector r(ncomp); for (int n = 0; n < ncomp; n++) { @@ -1125,7 +1125,7 @@ PeleLM::fetchDiffTypeArray(int scomp, int ncomp) Real PeleLM::MFSum (const Vector &a_mf, int comp) { - BL_PROFILE("PeleLM::MFSum()"); + BL_PROFILE("PeleLMeX::MFSum()"); // Get the integral of the MF, not including the fine-covered and // EB-covered cells @@ -1307,7 +1307,7 @@ PeleLM::MFmax(const MultiFab *a_MF, const iMultiFab &a_mask, int comp) { - BL_PROFILE("PeleLM::MFmax()"); + BL_PROFILE("PeleLMeX::MFmax()"); Real mx = std::numeric_limits::lowest(); #ifdef AMREX_USE_EB @@ -1397,7 +1397,7 @@ PeleLM::MFmin(const MultiFab *a_MF, const iMultiFab &a_mask, int comp) { - BL_PROFILE("PeleLM::MFmin()"); + BL_PROFILE("PeleLMeX::MFmin()"); Real mn = std::numeric_limits::max(); #ifdef AMREX_USE_EB @@ -1486,7 +1486,7 @@ Vector PeleLM::MLmax(const Vector &a_MF, int scomp, int ncomp) { - BL_PROFILE("PeleLM::MLmax()"); + BL_PROFILE("PeleLMeX::MLmax()"); AMREX_ASSERT(a_MF[0]->nComp() >= scomp+ncomp); Vector nmax(ncomp,AMREX_REAL_LOWEST); @@ -1512,7 +1512,7 @@ Vector PeleLM::MLmin(const Vector &a_MF, int scomp, int ncomp) { - BL_PROFILE("PeleLM::MLmin()"); + BL_PROFILE("PeleLMeX::MLmin()"); AMREX_ASSERT(a_MF[0]->nComp() >= scomp+ncomp); Vector nmin(ncomp,AMREX_REAL_MAX); @@ -1717,7 +1717,7 @@ PeleLM::parseComposition(Vector compositionIn, void PeleLM::extendSignedDistance(MultiFab *a_signDist, Real a_extendFactor) { - BL_PROFILE("PeleLM::extendSignedDistance()"); + BL_PROFILE("PeleLMeX::extendSignedDistance()"); // This is a not-so-pretty piece of code that'll take AMReX cell-averaged // signed distance and propagates it manually up to the point where we need to have it // for derefining. diff --git a/Source/Spray/PeleLMSprayParticles.cpp b/Source/Spray/PeleLMSprayParticles.cpp index 34b9cee3..6077fb5a 100644 --- a/Source/Spray/PeleLMSprayParticles.cpp +++ b/Source/Spray/PeleLMSprayParticles.cpp @@ -38,7 +38,7 @@ PeleLM::SprayEstDt() if (!do_spray_particles || SprayPC == nullptr) { return estdt; } - BL_PROFILE("PeleLM::SprayEstDt()"); + BL_PROFILE("PeleLMeX::SprayEstDt()"); for (int lev = 0; lev <= finest_level; ++lev) { Real estdt_lev = SprayPC->estTimestep(lev); if (estdt_lev > 0. && estdt_lev < estdt) { @@ -95,7 +95,7 @@ PeleLM::SpraySetup() void PeleLM::setupVirtualParticles(const int level) { - BL_PROFILE("PeleLM::setupVirtualParticles()"); + BL_PROFILE("PeleLMeX::setupVirtualParticles()"); if (SprayPC != nullptr) { if (level < finest_level) { SprayParticleContainer::AoS virts; @@ -120,7 +120,7 @@ PeleLM::removeVirtualParticles(const int level) void PeleLM::setupGhostParticles(const int ngrow, const int level) { - BL_PROFILE("PeleLM::setupGhostParticles()"); + BL_PROFILE("PeleLMeX::setupGhostParticles()"); AMREX_ASSERT(level < finest_level); if (SprayPC != nullptr) { SprayParticleContainer::AoS ghosts; @@ -149,7 +149,7 @@ PeleLM::SprayCreateData() void PeleLM::SprayInit() { - BL_PROFILE("PeleLM::SprayInit()"); + BL_PROFILE("PeleLMeX::SprayInit()"); if (!do_spray_particles) { return; @@ -272,7 +272,7 @@ PeleLM::SprayMKD(const Real time, const Real dt) if (spray_verbose) { Print() << "moveKickDrift ... updating particle positions and velocity\n"; } - BL_PROFILE("PeleLM::SprayMKD()"); + BL_PROFILE("PeleLMeX::SprayMKD()"); // Setup the virtual particles that represent particles on finer levels setupVirtualParticles(0); for (int lev = 0; lev <= finest_level; ++lev) { @@ -367,7 +367,7 @@ PeleLM::SprayPostRegrid() void PeleLM::SprayInjectRedist() { - BL_PROFILE("PeleLM::SprayInjectRedist"); + BL_PROFILE("PeleLMeX::SprayInjectRedist"); Long prev_count = 0; if (spray_verbose >= 3) { prev_count = SprayPC->TotalNumberOfParticles(true, false); diff --git a/Source/main.cpp b/Source/main.cpp index e62d8a97..ab050af0 100644 --- a/Source/main.cpp +++ b/Source/main.cpp @@ -23,31 +23,31 @@ int main(int argc, char* argv[]) { } // timer for profiling - BL_PROFILE_VAR("PeleLM::main()", main); + BL_PROFILE_VAR("PeleLMeX::main()", main); // wallclock time const Real strt_total = ParallelDescriptor::second(); { - // declare an PeleLM object to manage multilevel data - PeleLM pelelm; + // declare an PeleLMeX object to manage multilevel data + PeleLM pelelmex; // Description Setup - pelelm.Setup(); + pelelmex.Setup(); // Description Init - pelelm.Init(); + pelelmex.Init(); // Switch between Evolve and UnitTest mode - if ( pelelm.runMode() == "normal" ) { + if ( pelelmex.runMode() == "normal" ) { // Advance solution to final time - pelelm.Evolve(); + pelelmex.Evolve(); - } else if ( pelelm.runMode() == "evaluate" ) { + } else if ( pelelmex.runMode() == "evaluate" ) { // - pelelm.Evaluate(); + pelelmex.Evaluate(); } else { Abort(" Wrong peleLM.run_mode ! It can only be 'normal' (D) or 'evaluate'"); From 834a1b300b9649ccd84b3d1fbe1b02dba34bd714 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 14 Jul 2023 21:27:20 +0200 Subject: [PATCH 05/18] Update the scaling script with new TPROF region names. --- .../Scaling/WeakScaling/ExtractScalingData.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Utils/RunScripts/Scaling/WeakScaling/ExtractScalingData.py b/Utils/RunScripts/Scaling/WeakScaling/ExtractScalingData.py index e5b26776..9c841467 100755 --- a/Utils/RunScripts/Scaling/WeakScaling/ExtractScalingData.py +++ b/Utils/RunScripts/Scaling/WeakScaling/ExtractScalingData.py @@ -74,27 +74,27 @@ def parse_args(arg_string=None): currRunTime = procRunTime.communicate()[0].decode("utf-8").strip() runTimes.append(currRunTime) # Get component times: reaction, diffusion, MacProj, NodalProj, ScalAdv, VelAdv, Sync - cmd = "cat {}".format(logfile)+" | grep 'PeleLM::advance::reactions' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" + cmd = "cat {}".format(logfile)+" | grep 'PeleLMeX::advance::reactions' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" procRunTime = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) currReactTime = procRunTime.communicate()[0].decode("utf-8").strip() reactionTimes.append(currReactTime) - cmd = "cat {}".format(logfile)+" | grep 'PeleLM::advance::diffusion' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" + cmd = "cat {}".format(logfile)+" | grep 'PeleLMeX::advance::diffusion' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" procRunTime = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) currDiffTime = procRunTime.communicate()[0].decode("utf-8").strip() diffusionTimes.append(currDiffTime) - cmd = "cat {}".format(logfile)+" | grep 'PeleLM::advance::mac' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" + cmd = "cat {}".format(logfile)+" | grep 'PeleLMeX::advance::mac' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" procRunTime = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) currMACTime = procRunTime.communicate()[0].decode("utf-8").strip() MacProjTimes.append(currMACTime) - cmd = "cat {}".format(logfile)+" | grep 'PeleLM::velocityProjection()' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" + cmd = "cat {}".format(logfile)+" | grep 'PeleLMeX::velocityProjection()' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" procRunTime = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) currProjTime = procRunTime.communicate()[0].decode("utf-8").strip() NodalProjTimes.append(currProjTime) - cmd = "cat {}".format(logfile)+" | grep 'PeleLM::advance::scalars_adv' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" + cmd = "cat {}".format(logfile)+" | grep 'PeleLMeX::advance::scalars_adv' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" procRunTime = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) currScalAdvTime = procRunTime.communicate()[0].decode("utf-8").strip() ScalAdvTimes.append(currScalAdvTime) - cmd = "cat {}".format(logfile)+" | grep 'PeleLM::advance::velocity' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" + cmd = "cat {}".format(logfile)+" | grep 'PeleLMeX::advance::velocity' | awk 'NR%2==0' | awk 'NR%2!=0' | awk '{print $4}'" procRunTime = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) currVelAdvTime = procRunTime.communicate()[0].decode("utf-8").strip() VelAdvTimes.append(currVelAdvTime) From fe5e12a45f0efb7aa59e50b617a9c03a010ad549 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 14 Jul 2023 22:01:48 +0200 Subject: [PATCH 06/18] Couple of updates in the FS tuto. --- Docs/source/manual/Tutorials_FlameSheet.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Docs/source/manual/Tutorials_FlameSheet.rst b/Docs/source/manual/Tutorials_FlameSheet.rst index ce5f0adf..8185d89f 100644 --- a/Docs/source/manual/Tutorials_FlameSheet.rst +++ b/Docs/source/manual/Tutorials_FlameSheet.rst @@ -25,7 +25,9 @@ Setting-up your environment --------------------------- Getting a functioning environment in which to compile and run `PeleLMeX` is the first step of this tutorial. -Follow the steps listed below to get to this point: +Please review the requirements listed on the `PeleLMeX README `_ to ensure +you have a suitable compiler suite to build `PeleLMeX`. +Follow the steps listed below to get the source code and its dependent libraries: #. The first step consist in getting `PeleLMeX` and its dependencies. To do so, use a recursive *git clone*: :: @@ -259,7 +261,10 @@ The next few lines specify AMReX compilation options and compiler selection: :: USE_CUDA = FALSE USE_HIP = FALSE -It allows users to specify the number of spatial dimensions (2D), trigger debug compilation and other AMReX options. The compiler (``gnu``) and the parallelism paradigm (in the present case only MPI is used) are then selected. Note that on OSX platform, one should update the compiler to ``llvm``. +It allows users to specify the number of spatial dimensions (2D), trigger debug compilation and other AMReX options. +The compiler (``gnu``) and the parallelism paradigm (in the present case only MPI is used) are then selected. If MPI is not available on your +platform, please set ``USE_MPI = FALSE``. +Note that on OSX platform, one should update the compiler to ``llvm``. In `PeleLMeX`, the chemistry model (set of species, their thermodynamic and transport properties as well as the description of their of chemical interactions) is specified at compile time. Chemistry models available in `PelePhysics` can used in `PeleLMeX` by specifying the name of the folder in `PelePhysics/Support/Mechanisms/Models` containing the relevant files, for example: :: @@ -278,7 +283,7 @@ Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE Date: Fri, 14 Jul 2023 22:02:23 +0200 Subject: [PATCH 07/18] Explicitly point to open source MPI distributions in the README. --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 196fff69..dfda6990 100644 --- a/README.md +++ b/README.md @@ -48,11 +48,12 @@ https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials.html ### Requirements The compilations of *PeleLMeX* requires a C++17 compatible compiler (GCC >= 8 or Clang >= 3.6) as -well as cmake >= 3.23 for compiling the [SUNDIALS](https://github.com/LLNL/sundials) third party library. +well as [CMake](https://cmake.org/download/) >= 3.23 for compiling the [SUNDIALS](https://github.com/LLNL/sundials) third party library. Most of the examples provided hereafter and in the [tutorials](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials.html) -will use MPI. Although not mandatory, it is advised to build *PeleLMeX* with MPI support from the get go if -more than a single core is available to you. +will use MPI to run in parallel. Although not mandatory, it is advised to build *PeleLMeX* with MPI support from the get go if +more than a single core is available to you. Any of [mpich](https://www.mpich.org/downloads/) or +[open-mpi](https://www.open-mpi.org/software/ompi/v4.1/) is a suitable option if MPI is not already available on your platform. Finally, when building with GPU support, CUDA >= 11 is required with NVIDIA GPUs and ROCm >= 5.2 is required with AMD GPUs. From d336d6920d3a8c6a2956bb4384f51508668cfc89 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Fri, 14 Jul 2023 22:03:04 +0200 Subject: [PATCH 08/18] Small comment update. --- Exec/RegTests/FlameSheet/input.2d-regt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Exec/RegTests/FlameSheet/input.2d-regt b/Exec/RegTests/FlameSheet/input.2d-regt index b8a60b79..f1f12d6e 100644 --- a/Exec/RegTests/FlameSheet/input.2d-regt +++ b/Exec/RegTests/FlameSheet/input.2d-regt @@ -28,7 +28,7 @@ prob.pertmag = 0.00045 prob.pertlength = 0.016 pmf.datafile = "drm19_pmf.dat" -#---------------------- PeleLM CONTROL --------------------------- +#---------------------- PeleLMeX CONTROL ------------------------- peleLM.v = 1 # PeleLMeX version peleLM.use_wbar = 1 # Include Wbar term in species diffusion fluxes peleLM.sdc_iterMax = 2 # Number of SDC iterations From b0a252c83b1f721625e9d2d1d57d7e9941f78421 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Tue, 29 Aug 2023 10:41:52 +0200 Subject: [PATCH 09/18] Update the RegTests README. --- Exec/RegTests/EB_BackwardStepFlame/README.md | 3 ++ Exec/RegTests/EB_EnclosedFlame/README.md | 2 + Exec/RegTests/EB_EnclosedVortex/README.md | 2 + Exec/RegTests/EB_FlowPastCylinder/README.md | 4 ++ Exec/RegTests/EB_PipeFlow/README.md | 5 ++ Exec/RegTests/EnclosedFlame/README.md | 2 + Exec/RegTests/EnclosedInjection/README.md | 2 + Exec/RegTests/FlameSheet/README.md | 7 +++ Exec/RegTests/HITDecay/README.md | 3 ++ Exec/RegTests/HotBubble/README.md | 3 ++ Exec/RegTests/PeriodicCases/README.md | 4 ++ Exec/RegTests/README.md | 53 ++------------------ Exec/RegTests/SprayTest/README.md | 2 + Exec/RegTests/TaylorGreen/Readme.md | 2 + Exec/RegTests/TripleFlame/README.md | 3 ++ Exec/RegTests/TurbInflow/README.md | 3 ++ 16 files changed, 50 insertions(+), 50 deletions(-) create mode 100644 Exec/RegTests/EB_BackwardStepFlame/README.md create mode 100644 Exec/RegTests/EB_EnclosedFlame/README.md create mode 100644 Exec/RegTests/EB_EnclosedVortex/README.md create mode 100644 Exec/RegTests/EB_FlowPastCylinder/README.md create mode 100644 Exec/RegTests/EB_PipeFlow/README.md create mode 100644 Exec/RegTests/EnclosedFlame/README.md create mode 100644 Exec/RegTests/EnclosedInjection/README.md create mode 100644 Exec/RegTests/FlameSheet/README.md create mode 100644 Exec/RegTests/HITDecay/README.md create mode 100644 Exec/RegTests/HotBubble/README.md create mode 100644 Exec/RegTests/PeriodicCases/README.md create mode 100644 Exec/RegTests/SprayTest/README.md create mode 100644 Exec/RegTests/TripleFlame/README.md create mode 100644 Exec/RegTests/TurbInflow/README.md diff --git a/Exec/RegTests/EB_BackwardStepFlame/README.md b/Exec/RegTests/EB_BackwardStepFlame/README.md new file mode 100644 index 00000000..93eddf09 --- /dev/null +++ b/Exec/RegTests/EB_BackwardStepFlame/README.md @@ -0,0 +1,3 @@ +## EB\_BackwardStepFlame + +This folder implement the case of a laminar flame stabilized behind a backward facing step. It is intended to test integrated EB representation with reactive flow. More details on this case and step-by-step instructions can be found in this [tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_BFSFlame.html) diff --git a/Exec/RegTests/EB_EnclosedFlame/README.md b/Exec/RegTests/EB_EnclosedFlame/README.md new file mode 100644 index 00000000..1e223d16 --- /dev/null +++ b/Exec/RegTests/EB_EnclosedFlame/README.md @@ -0,0 +1,2 @@ +## EB\_EnclosedFlame +A 2D (or 3D) cylindrical flame enclosed in a cylindrical EB chamber. Testing the closed chamber algorithm with EB. diff --git a/Exec/RegTests/EB_EnclosedVortex/README.md b/Exec/RegTests/EB_EnclosedVortex/README.md new file mode 100644 index 00000000..ac52e0fa --- /dev/null +++ b/Exec/RegTests/EB_EnclosedVortex/README.md @@ -0,0 +1,2 @@ +## EB\_EnclosedVortex +A 2D (or 3D) vortex enclosed in a cylindrical EB chamber. Testing EB for pure incompressible flows. diff --git a/Exec/RegTests/EB_FlowPastCylinder/README.md b/Exec/RegTests/EB_FlowPastCylinder/README.md new file mode 100644 index 00000000..47be75c4 --- /dev/null +++ b/Exec/RegTests/EB_FlowPastCylinder/README.md @@ -0,0 +1,4 @@ +## EB\_FlowPastCylinder +A 2D (or 3D) inflow/outflow setup with either an EB cylinder in the middle of the flow or an EB +bump on a WallNoSlipAdiab domain boundary. Testing EB for incompressible flows and pure mixing cases (no reactions). +More details and step-by-step instructions can be found in this [tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_FlowPastCyl.html). diff --git a/Exec/RegTests/EB_PipeFlow/README.md b/Exec/RegTests/EB_PipeFlow/README.md new file mode 100644 index 00000000..2c2a1de9 --- /dev/null +++ b/Exec/RegTests/EB_PipeFlow/README.md @@ -0,0 +1,5 @@ +## EB\_PipeFlow +2D and 3D setup of both channel and pipe flow, either in an inflow/outflow setup or a +periodc setup driven by a background pressure gradient. + +Poiseuille flow results with PeleLMeX can be found [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#laminar-poiseuille-flow). diff --git a/Exec/RegTests/EnclosedFlame/README.md b/Exec/RegTests/EnclosedFlame/README.md new file mode 100644 index 00000000..6d26c5d4 --- /dev/null +++ b/Exec/RegTests/EnclosedFlame/README.md @@ -0,0 +1,2 @@ +## EnclosedFlame +A 2D (or 3D) cylindrical flame enclosed in a square (rectangular) domain. Testing the closed chamber algorithm. diff --git a/Exec/RegTests/EnclosedInjection/README.md b/Exec/RegTests/EnclosedInjection/README.md new file mode 100644 index 00000000..71dbd903 --- /dev/null +++ b/Exec/RegTests/EnclosedInjection/README.md @@ -0,0 +1,2 @@ +## EnclosedInjection +A simple jet injection into an EB cylindrical chamber. Testing the closed chamber algorithm with mass injection and EB. diff --git a/Exec/RegTests/FlameSheet/README.md b/Exec/RegTests/FlameSheet/README.md new file mode 100644 index 00000000..50a18108 --- /dev/null +++ b/Exec/RegTests/FlameSheet/README.md @@ -0,0 +1,7 @@ +## FlameSheet +A 2D (3D) harmonically perturbed flame sheet, initial solution from a Cantera simulation provided for 3 mechanisms +(drm19, dodecane\_lu and dodecane\_lu\_qss). This is the basis for [weak scaling studies](https://amrex-combustion.github.io/PeleLMeX/manual/html/Performances.html) in PeleLMeX and test all the +reactive pieces of the algorithm as well as transport options (Unity Lewis number, Soret effect, ...). +More detqils on the cqse setup qnd step-by-step instructions cqn be found in this [tutoriql](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_FlameSheet.html). + +Comparisons of PeleLMeX results on a methane/air flame against Cantera at several resolution are reported [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#laminar-premixed-flame). diff --git a/Exec/RegTests/HITDecay/README.md b/Exec/RegTests/HITDecay/README.md new file mode 100644 index 00000000..b92fb27f --- /dev/null +++ b/Exec/RegTests/HITDecay/README.md @@ -0,0 +1,3 @@ +## HITDecay +A 3D decaying HIT case, where the initial solution is generated with a Passot-Pouquet spectrum. Testing basic incompressible +integration algorithm and Large Eddy Simulation implementation. diff --git a/Exec/RegTests/HotBubble/README.md b/Exec/RegTests/HotBubble/README.md new file mode 100644 index 00000000..bf982161 --- /dev/null +++ b/Exec/RegTests/HotBubble/README.md @@ -0,0 +1,3 @@ +## HotBubble +Case of a 2D/2D-RZ/3D bubble of light gases (either hotter or lighter mixture composition) lifted under the effect of +a gravity field. Testing of RZ algorthim and gravity forces. diff --git a/Exec/RegTests/PeriodicCases/README.md b/Exec/RegTests/PeriodicCases/README.md new file mode 100644 index 00000000..05971f71 --- /dev/null +++ b/Exec/RegTests/PeriodicCases/README.md @@ -0,0 +1,4 @@ +## PeriodicCases +A set of 2D/3D periodic cases: convected vortex in different directions, convected temperature/mixture Gaussian bump, +pure diffusion of species/temperature. This is the base case to test PeleLMeX accuracy and order of convergence of +the spatial and temporal schemes. diff --git a/Exec/RegTests/README.md b/Exec/RegTests/README.md index b40acc37..f94c0035 100644 --- a/Exec/RegTests/README.md +++ b/Exec/RegTests/README.md @@ -1,53 +1,6 @@ # PeleLMeX testing This folder contains a set of small-scale cases testing the various functionalities of PeleLMeX. -A number of these cases are automatically compiled or compiled & run upon pull request into the development branch, -The following provide a brief summary of each case and its intended purpose. - -## EB\_EnclosedFlame -A 2D (3D) cylindrical flame enclosed in a cylindrical EB chamber. Testing the closed chamber algorithm with EB. - -## EB\_EnclosedVortex -A 2D (3D) vortex enclosed in a cylindrical EB chamber. Testing EB for pure incompressible flows. - -## EB\_FlowPastCylinder -A 2D (3D) inflow/outflow setup with either an EB cylinder in the middle of the flow or an EB -bump on a WallNoSlipAdiab domain boundary. Testing EB for incompressible flows and pure mixing cases (no reactions). - -## EB\_PipeFlow -2D and 3D setup of both channel and pipe flow, either in an inflow/outflow setup or a -periodc setup driven by a background pressure gradient. - -## EnclosedFlame -A 2D (3D) cylindrical flame enclosed in a square (rectangular) domain. Testing the closed chamber algorithm. - -## EnclosedInjection -A simple jet injection into an EB cylindrical chamber. Testing the closed chamber algorithm with mass injection. - -## FlameSheet -A 2D (3D) harmonically perturbed flame sheet, initial solution from a Cantera simulation provided for 3 mechanisms -(drm19, dodecane\_lu and dodecane\_lu\_qss). This is the basis for weak scaling studies in PeleLMeX and test all the -reactive pieces of the algorithm as well as transport options (Unity Lewis number, Soret effect, ...) - -## HITDecay -A 3D decaying HIT case, where the initial solution is generated with a Passot-Pouquet spectrum. Testing basic incompressible -integration algorithm and Large Eddy Simulation implementation. - -## HotBubble -Case of a 2D/2D-RZ/3D bubble of light gases (either hotter or lighter mixture composition) lifted under the effect of -a gravity field. Testing of RZ algorthim and gravity forces. - -## PeriodicCases -A set of 2D/3D periodic cases: convected vortex in different directions, convected temperature/mixture Gaussian bump, -pure diffusion of species/temperature. This is the base case to test PeleLMeX accuracy and order of convergence of -the spatial and temporal schemes. - -## SprayTest -Basic testing of the coupling between PeleLMeX and PeleMP Lagrangian particle module. - -## TaylorGreen -3D Taylor-Green vortex case. Enable testing of the different advection schemes available in PeleLMeX. - -## TurbInflow -Injection of a 3D precomputed turbulent velocity field at the boundary of a PeleLMeX simulation. Testing the -turbulence injection functionality. +A number of these cases are automatically compiled or compiled & run upon pull requests into the development branch, +A short description of all the case is provided in the README file of each folder, stating the tested PeleLMeX capabilities and +,when available, point towards a tutorial or documentation page. diff --git a/Exec/RegTests/SprayTest/README.md b/Exec/RegTests/SprayTest/README.md new file mode 100644 index 00000000..53cb8c2b --- /dev/null +++ b/Exec/RegTests/SprayTest/README.md @@ -0,0 +1,2 @@ +## SprayTest +Basic testing of the coupling between PeleLMeX and PeleMP Lagrangian particle module. diff --git a/Exec/RegTests/TaylorGreen/Readme.md b/Exec/RegTests/TaylorGreen/Readme.md index 2294c207..cbf22376 100644 --- a/Exec/RegTests/TaylorGreen/Readme.md +++ b/Exec/RegTests/TaylorGreen/Readme.md @@ -17,3 +17,5 @@ script. Note that these commands provide adimentional results, with t\* = t/(L\_0/V\_0), E\_k\* = E\_k / ( rho\_0 * V\_0 * V\_0) and psi\* = psi / (V\_0/L\_0)^2 + +PeleLMeX results can be found in [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#taylor-green-vortex-breakdown). diff --git a/Exec/RegTests/TripleFlame/README.md b/Exec/RegTests/TripleFlame/README.md new file mode 100644 index 00000000..537c68c9 --- /dev/null +++ b/Exec/RegTests/TripleFlame/README.md @@ -0,0 +1,3 @@ +## Triple flame +2D case of a methane/air triple flame propagating into a mixing layer and stabilized using PeleLMeX active control capabilities. +More details and step-by-step instructions on this case are available in this [tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_TripleFlame.html). diff --git a/Exec/RegTests/TurbInflow/README.md b/Exec/RegTests/TurbInflow/README.md new file mode 100644 index 00000000..d01cbf2d --- /dev/null +++ b/Exec/RegTests/TurbInflow/README.md @@ -0,0 +1,3 @@ +## TurbInflow +Injection of a 3D precomputed turbulent velocity field at the boundary of a PeleLMeX simulation. Testing the +turbulence injection functionality. From 61a1ce4a3048439afb122bdeb365320b47fa3dbe Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Tue, 29 Aug 2023 15:40:27 +0200 Subject: [PATCH 10/18] Update the HotBubble input files for the tutorial. --- Exec/RegTests/HotBubble/input.2d-regt_sym | 85 +++++++++----------- Exec/RegTests/HotBubble/input.2d-regt_symRZ | 89 +++++++++------------ 2 files changed, 72 insertions(+), 102 deletions(-) diff --git a/Exec/RegTests/HotBubble/input.2d-regt_sym b/Exec/RegTests/HotBubble/input.2d-regt_sym index 978e355f..ae3099e3 100644 --- a/Exec/RegTests/HotBubble/input.2d-regt_sym +++ b/Exec/RegTests/HotBubble/input.2d-regt_sym @@ -1,80 +1,66 @@ -#----------------------DOMAIN DEFINITION------------------------ -geometry.is_periodic = 0 0 # For each dir, 0: non-perio, 1: periodic -geometry.coord_sys = 0 # 0 => cart, 1 => RZ -geometry.prob_lo = 0.0 0.0 0.0 # x_lo y_lo (z_lo) -geometry.prob_hi = 0.016 0.032 0.016 # x_hi y_hi (z_hi) +#---------------------- DOMAIN DEFINITION ------------------------ +geometry.is_periodic = 0 0 # For each dir, 0: non-perio, 1: periodic +geometry.coord_sys = 0 # 0 => cart, 1 => RZ +geometry.prob_lo = 0.0 0.0 # x_lo y_lo (z_lo) +geometry.prob_hi = 0.016 0.032 # x_hi y_hi (z_hi) -# >>>>>>>>>>>>> BC FLAGS <<<<<<<<<<<<<<<< +#---------------------- BC FLAGS --------------------------------- # Interior, Inflow, Outflow, Symmetry, # SlipWallAdiab, NoSlipWallAdiab, SlipWallIsotherm, NoSlipWallIsotherm peleLM.lo_bc = Symmetry SlipWallAdiab peleLM.hi_bc = SlipWallAdiab Outflow - -#-------------------------AMR CONTROL---------------------------- -amr.n_cell = 32 64 32 # Level 0 number of cells in each direction -amr.n_cell = 64 128 32 # Level 0 number of cells in each direction -amr.v = 1 # AMR verbose -amr.max_level = 1 # maximum level number allowed -amr.ref_ratio = 2 2 2 2 # refinement ratio -amr.regrid_int = 5 # how often to regrid -amr.n_error_buf = 1 1 2 2 # number of buffer cells in error est -amr.grid_eff = 0.7 # what constitutes an efficient grid -amr.blocking_factor = 16 # block factor in grid generation (min box size) +#---------------------- AMR CONTROL ------------------------------ +amr.n_cell = 64 128 # Level 0 number of cells in each direction +amr.v = 1 # AMR verbose +amr.max_level = 2 # maximum level number allowed +amr.ref_ratio = 2 2 2 2 # refinement ratio +amr.regrid_int = 5 # how often to regrid +amr.n_error_buf = 1 1 2 2 # number of buffer cells in error est +amr.grid_eff = 0.7 # what constitutes an efficient grid +amr.blocking_factor = 16 # block factor in grid generation (min box size) amr.max_grid_size = 128 # max box size -#--------------------------- Problem ------------------------------- +#---------------------- Problem ---------------------------------- prob.P_mean = 101325.0 prob.T_bubble = 450.0 prob.bubble_radius = 0.003 prob.bubble_y0 = 0.01 prob.use_symmetry = 1 -#-------------------------PeleLM CONTROL---------------------------- +#---------------------- PeleLMeX CONTROL ------------------------- peleLM.v = 1 peleLM.gravity = 0.0 -9.81 0.0 peleLM.use_wbar = 0 peleLM.sdc_iterMax = 1 -peleLM.floor_species = 0 peleLM.num_init_iter = 2 -#peleLM.num_divu_iter = 0 -#peleLM.advection_scheme = "Godunov_PLM" -peleLM.deltaT_verbose = 1 +#---------------------- Time Stepping CONTROL -------------------- +amr.max_step = 400 +amr.stop_time = 0.07 +amr.cfl = 0.2 +amr.dt_shrink = 1.0 + +#---------------------- IO CONTROL ------------------------------- #amr.restart = chk00005 #amr.check_int = 2000 amr.plot_int = 2000 -amr.max_step = 2000 -amr.dt_shrink = 1.0 -#amr.init_dt = 0.0001 -amr.stop_time = 0.07 -amr.cfl = 0.2 amr.derive_plot_vars = avg_pressure mag_vort mass_fractions -cvode.solve_type = dense # CVODE Linear solve type (for Newton direction) -ode.analytical_jacobian = 0 # Provide analytical jacobian (from Fuego) -nodal_proj.verbose = 0 -#nodal_proj.rtol = 1e-13 -#mac_proj.rtol = 1e-12 -mac_proj.verbose = 0 - -#------------ INPUTS TO CONSTANT TRANSPORT ----------------- -transport.const_viscosity = 0.0 -transport.const_bulk_viscosity = 0.0 -transport.const_conductivity = 0.0 -transport.const_diffusivity = 0.0 +#---------------------- Reactor CONTROL -------------------------- +peleLM.chem_integrator = "ReactorNull" -#--------------------REFINEMENT CONTROL------------------------ -#amr.refinement_indicators = temp -#amr.temp.max_level = 1 -#amr.temp.value_greater = 305 -#amr.temp.field_name = temp +#---------------------- Constant Transport ----------------------- +transport.const_viscosity = 0.0 +transport.const_bulk_viscosity = 0.0 +transport.const_conductivity = 0.0 +transport.const_diffusivity = 0.0 -#amr.refinement_indicators = magVort -#amr.magVort.max_level = 1 -#amr.magVort.value_greater = 500.0 -#amr.magVort.field_name = mag_vort +#---------------------- Linear solver CONTROL -------------------- +mac_proj.verbose = 0 +nodal_proj.verbose = 0 +#---------------------- Refinement CONTROL------------------------ amr.refinement_indicators = temp gtemp amr.temp.max_level = 2 amr.temp.value_greater = 350.0 @@ -84,6 +70,7 @@ amr.gtemp.max_level = 4 amr.gtemp.adjacent_difference_greater = 10.0 amr.gtemp.field_name = temp +#---------------------- Debug/HPC CONTROL------------------------- #amrex.fpe_trap_invalid = 1 #amrex.fpe_trap_zero = 1 #amrex.fpe_trap_overflow = 1 diff --git a/Exec/RegTests/HotBubble/input.2d-regt_symRZ b/Exec/RegTests/HotBubble/input.2d-regt_symRZ index 515d34e5..86e26dbc 100644 --- a/Exec/RegTests/HotBubble/input.2d-regt_symRZ +++ b/Exec/RegTests/HotBubble/input.2d-regt_symRZ @@ -1,81 +1,66 @@ -#----------------------DOMAIN DEFINITION------------------------ -geometry.is_periodic = 0 0 # For each dir, 0: non-perio, 1: periodic -geometry.coord_sys = 1 # 0 => cart, 1 => RZ -geometry.prob_lo = 0.000 0.0 0.0 # x_lo y_lo (z_lo) -geometry.prob_hi = 0.016 0.032 0.016 # x_hi y_hi (z_hi) +#---------------------- DOMAIN DEFINITION ------------------------ +geometry.is_periodic = 0 0 # For each dir, 0: non-perio, 1: periodic +geometry.coord_sys = 1 # 0 => cart, 1 => RZ +geometry.prob_lo = 0.0 0.0 # x_lo y_lo (z_lo) +geometry.prob_hi = 0.016 0.032 # x_hi y_hi (z_hi) -# >>>>>>>>>>>>> BC FLAGS <<<<<<<<<<<<<<<< +#---------------------- BC FLAGS --------------------------------- # Interior, Inflow, Outflow, Symmetry, # SlipWallAdiab, NoSlipWallAdiab, SlipWallIsotherm, NoSlipWallIsotherm peleLM.lo_bc = Symmetry SlipWallAdiab peleLM.hi_bc = SlipWallAdiab Outflow - -#-------------------------AMR CONTROL---------------------------- -amr.n_cell = 32 64 32 # Level 0 number of cells in each direction -amr.n_cell = 64 128 32 # Level 0 number of cells in each direction -amr.v = 1 # AMR verbose -amr.max_level = 1 # maximum level number allowed -amr.ref_ratio = 2 2 2 2 # refinement ratio -amr.regrid_int = 5 # how often to regrid -amr.n_error_buf = 1 1 2 2 # number of buffer cells in error est -amr.grid_eff = 0.7 # what constitutes an efficient grid -amr.blocking_factor = 16 # block factor in grid generation (min box size) +#---------------------- AMR CONTROL ------------------------------ +amr.n_cell = 64 128 # Level 0 number of cells in each direction +amr.v = 1 # AMR verbose +amr.max_level = 2 # maximum level number allowed +amr.ref_ratio = 2 2 2 2 # refinement ratio +amr.regrid_int = 5 # how often to regrid +amr.n_error_buf = 1 1 2 2 # number of buffer cells in error est +amr.grid_eff = 0.7 # what constitutes an efficient grid +amr.blocking_factor = 16 # block factor in grid generation (min box size) amr.max_grid_size = 128 # max box size -#--------------------------- Problem ------------------------------- +#---------------------- Problem ---------------------------------- prob.P_mean = 101325.0 prob.T_bubble = 450.0 prob.bubble_radius = 0.003 prob.bubble_y0 = 0.01 prob.use_symmetry = 1 -#-------------------------PeleLM CONTROL---------------------------- +#---------------------- PeleLMeX CONTROL ------------------------- peleLM.v = 1 peleLM.gravity = 0.0 -9.81 0.0 peleLM.use_wbar = 0 peleLM.sdc_iterMax = 1 -peleLM.floor_species = 0 peleLM.num_init_iter = 2 -#peleLM.num_divu_iter = 0 -#peleLM.advection_scheme = "Godunov_PLM" -peleLM.deltaT_verbose = 1 +#---------------------- Time Stepping CONTROL -------------------- +amr.max_step = 400 +amr.stop_time = 0.07 +amr.cfl = 0.2 +amr.dt_shrink = 1.0 + +#---------------------- IO CONTROL ------------------------------- #amr.restart = chk00005 #amr.check_int = 2000 amr.plot_int = 2000 -amr.max_step = 2000 -amr.dt_shrink = 1.0 -#amr.init_dt = 0.0001 -amr.stop_time = 0.07 -amr.cfl = 0.2 amr.derive_plot_vars = avg_pressure mag_vort mass_fractions -cvode.solve_type = dense # CVODE Linear solve type (for Newton direction) -ode.analytical_jacobian = 0 # Provide analytical jacobian (from Fuego) -nodal_proj.verbose = 0 -nodal_proj.rtol = 1e-13 -mac_proj.rtol = 1e-12 -mac_proj.atol = 1e-16 -mac_proj.verbose = 0 - -#------------ INPUTS TO CONSTANT TRANSPORT ----------------- -transport.const_viscosity = 0.0 -transport.const_bulk_viscosity = 0.0 -transport.const_conductivity = 0.0 -transport.const_diffusivity = 0.0 +#---------------------- Reactor CONTROL -------------------------- +peleLM.chem_integrator = "ReactorNull" -#--------------------REFINEMENT CONTROL------------------------ -#amr.refinement_indicators = temp -#amr.temp.max_level = 1 -#amr.temp.value_greater = 305 -#amr.temp.field_name = temp +#---------------------- Constant Transport ----------------------- +transport.const_viscosity = 0.0 +transport.const_bulk_viscosity = 0.0 +transport.const_conductivity = 0.0 +transport.const_diffusivity = 0.0 -#amr.refinement_indicators = magVort -#amr.magVort.max_level = 1 -#amr.magVort.value_greater = 500.0 -#amr.magVort.field_name = mag_vort +#---------------------- Linear solver CONTROL -------------------- +mac_proj.verbose = 0 +nodal_proj.verbose = 0 +#---------------------- Refinement CONTROL------------------------ amr.refinement_indicators = temp gtemp amr.temp.max_level = 2 amr.temp.value_greater = 350.0 @@ -85,9 +70,7 @@ amr.gtemp.max_level = 4 amr.gtemp.adjacent_difference_greater = 10.0 amr.gtemp.field_name = temp -diffusion.verbose = 0 -tensor_diffusion.verbose = 0 - +#---------------------- Debug/HPC CONTROL------------------------- #amrex.fpe_trap_invalid = 1 #amrex.fpe_trap_zero = 1 #amrex.fpe_trap_overflow = 1 From c1224025c79febc3b4672be08169d4d77e3692cf Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Tue, 29 Aug 2023 15:41:42 +0200 Subject: [PATCH 11/18] Remove deprecated line in GNUmakefile. --- Exec/RegTests/HotBubble/GNUmakefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Exec/RegTests/HotBubble/GNUmakefile b/Exec/RegTests/HotBubble/GNUmakefile index f57c6023..e654758f 100644 --- a/Exec/RegTests/HotBubble/GNUmakefile +++ b/Exec/RegTests/HotBubble/GNUmakefile @@ -26,6 +26,4 @@ Chemistry_Model = air Eos_Model = Fuego Transport_Model = Constant -USE_SUNDIALS_PP = TRUE - include $(PELELMEX_HOME)/Utils/Make.PeleLMeX From dae79173a5d59b9a46dec446dc4565d8cb526302 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Tue, 29 Aug 2023 15:42:47 +0200 Subject: [PATCH 12/18] Remove tws. --- Exec/RegTests/HotBubble/input.2d-regt_sym | 10 +++++----- Exec/RegTests/HotBubble/input.2d-regt_symRZ | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Exec/RegTests/HotBubble/input.2d-regt_sym b/Exec/RegTests/HotBubble/input.2d-regt_sym index ae3099e3..381c66ca 100644 --- a/Exec/RegTests/HotBubble/input.2d-regt_sym +++ b/Exec/RegTests/HotBubble/input.2d-regt_sym @@ -11,7 +11,7 @@ peleLM.lo_bc = Symmetry SlipWallAdiab peleLM.hi_bc = SlipWallAdiab Outflow #---------------------- AMR CONTROL ------------------------------ -amr.n_cell = 64 128 # Level 0 number of cells in each direction +amr.n_cell = 64 128 # Level 0 number of cells in each direction amr.v = 1 # AMR verbose amr.max_level = 2 # maximum level number allowed amr.ref_ratio = 2 2 2 2 # refinement ratio @@ -51,10 +51,10 @@ amr.derive_plot_vars = avg_pressure mag_vort mass_fractions peleLM.chem_integrator = "ReactorNull" #---------------------- Constant Transport ----------------------- -transport.const_viscosity = 0.0 -transport.const_bulk_viscosity = 0.0 -transport.const_conductivity = 0.0 -transport.const_diffusivity = 0.0 +transport.const_viscosity = 0.0 +transport.const_bulk_viscosity = 0.0 +transport.const_conductivity = 0.0 +transport.const_diffusivity = 0.0 #---------------------- Linear solver CONTROL -------------------- mac_proj.verbose = 0 diff --git a/Exec/RegTests/HotBubble/input.2d-regt_symRZ b/Exec/RegTests/HotBubble/input.2d-regt_symRZ index 86e26dbc..04c2cd33 100644 --- a/Exec/RegTests/HotBubble/input.2d-regt_symRZ +++ b/Exec/RegTests/HotBubble/input.2d-regt_symRZ @@ -11,7 +11,7 @@ peleLM.lo_bc = Symmetry SlipWallAdiab peleLM.hi_bc = SlipWallAdiab Outflow #---------------------- AMR CONTROL ------------------------------ -amr.n_cell = 64 128 # Level 0 number of cells in each direction +amr.n_cell = 64 128 # Level 0 number of cells in each direction amr.v = 1 # AMR verbose amr.max_level = 2 # maximum level number allowed amr.ref_ratio = 2 2 2 2 # refinement ratio @@ -51,10 +51,10 @@ amr.derive_plot_vars = avg_pressure mag_vort mass_fractions peleLM.chem_integrator = "ReactorNull" #---------------------- Constant Transport ----------------------- -transport.const_viscosity = 0.0 -transport.const_bulk_viscosity = 0.0 -transport.const_conductivity = 0.0 -transport.const_diffusivity = 0.0 +transport.const_viscosity = 0.0 +transport.const_bulk_viscosity = 0.0 +transport.const_conductivity = 0.0 +transport.const_diffusivity = 0.0 #---------------------- Linear solver CONTROL -------------------- mac_proj.verbose = 0 From 1c6951e1fc04e626d9c4befb2fc178da1170aee0 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Tue, 29 Aug 2023 15:43:19 +0200 Subject: [PATCH 13/18] Add a short HotBubble tutorial. --- Docs/source/manual/Tutorials.rst | 1 + Docs/source/manual/Tutorials_HotBubble.rst | 349 ++++++++++++++++++ .../images/tutorials/HB_400steps2lvl.png | Bin 0 -> 139592 bytes .../manual/images/tutorials/HB_InitSol.png | Bin 0 -> 69823 bytes 4 files changed, 350 insertions(+) create mode 100644 Docs/source/manual/Tutorials_HotBubble.rst create mode 100644 Docs/source/manual/images/tutorials/HB_400steps2lvl.png create mode 100644 Docs/source/manual/images/tutorials/HB_InitSol.png diff --git a/Docs/source/manual/Tutorials.rst b/Docs/source/manual/Tutorials.rst index 2f58fe52..8b4d5bb6 100644 --- a/Docs/source/manual/Tutorials.rst +++ b/Docs/source/manual/Tutorials.rst @@ -11,6 +11,7 @@ This sections includes several self-contained tutorials. .. toctree:: :maxdepth: 1 + Tutorials_HotBubble.rst Tutorials_FlameSheet.rst Tutorials_FlowPastCyl.rst Tutorials_BFSFlame.rst diff --git a/Docs/source/manual/Tutorials_HotBubble.rst b/Docs/source/manual/Tutorials_HotBubble.rst new file mode 100644 index 00000000..d70fd0de --- /dev/null +++ b/Docs/source/manual/Tutorials_HotBubble.rst @@ -0,0 +1,349 @@ +.. highlight:: rst + +.. _sec:tutorialHB: + +Rising light bubble +=================== + +.. _sec:TUTO_HB::Intro: + +Introduction +------------ + +At the core of `PeleLMeX` algorithm is a variable-density, low Mach number Navier-Stokes solver based +on a fractional step approach. This short tutorial presents the case of a rising light bubble under +the influence of a gravity field, which exercice this algorithm without the added complexity +of chemical reactions or embedded boundaries. + +.. _sec:TUTO_HB::PrepStep: + +Setting-up your environment +--------------------------- + +Getting a functioning environment in which to compile and run `PeleLMeX` is the first step of this tutorial. +Follow the steps listed below to get to this point: + +#. The first step is to get `PeleLMeX` and its dependencies. To do so, use a recursive *git clone*: :: + + git clone --recursive https://github.com/AMReX-Combustion/PeleLMeX.git + +#. Move into the Exec folder containing the ``HotBubble``. To do so: :: + + cd PeleLMeX/Exec/RegTests/HotBubble + +Note that the makefile system is set up such that default paths are automatically set to the +submodules obtained with the recursive *git clone*, however the user can set its own dependencies +in the `GNUmakefile` by updating the top-most lines as follows: :: + + PELELMEX_HOME = + AMREX_HOME = + AMREX_HYDRO_HOME = + PELE_PHYSICS_HOME = + +or directly through shell environement variables (using *bash* for instance): :: + + export PELELMEX_HOME= + export AMREX_HOME= + export AMREX_HYDRO_HOME= + export PELE_PHYSICS_HOME= + +You're good to go ! + +Case setup +---------- + +A `PeleLMeX` case folder contains a minimal set of files to enable compilation, +and the reader is referred to the FlameSheet tutorial :doc:`Tutorials_FlameSheet` for a +more detailed description of `PeleLMeX` case setup. The case of interest for this +tutorial can be found in `PeleLMeX` Exec folder: :: + + Exec/RegTests/HotBubble + +Geometry, grid and boundary conditions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This simulation is performed on a 0.016x0.032 :math:`m^2` 2D computational domain, +with the bottom left corner located at (0.0:0.0) and the top right corner at (0.016:0.032). +Two versions of that domain will be considered: 1) a 2D-cartesian case, 2) a 2D-RZ +case where the :math:`x`-low is the symmetry axis of the azimuthally homogeneous case. In both cases, the +:math:`x`-low boundary is treated as symmetry BC while :math:`x`-high is treated as an adiabatic slip wall, +the :math:`y`-low boundary is treated as an adiabatic slip wall, while the :math:`y`-high boundary is an ``Outflow``. + +All of the geometrical information can be specified the first two blocks of the input file (`input.2d-regt_sym`): :: + + #----------------------DOMAIN DEFINITION------------------------ + geometry.is_periodic = 0 0 # For each dir, 0: non-perio, 1: periodic + geometry.coord_sys = 0 # 0 => cart, 1 => RZ + geometry.prob_lo = 0.0 0.0 # x_lo y_lo (z_lo) + geometry.prob_hi = 0.016 0.032 # x_hi y_hi (z_hi) + + # >>>>>>>>>>>>> BC FLAGS <<<<<<<<<<<<<<<< + # Interior, Inflow, Outflow, Symmetry, + # SlipWallAdiab, NoSlipWallAdiab, SlipWallIsotherm, NoSlipWallIsotherm + peleLM.lo_bc = Symmetry SlipWallAdiab + peleLM.hi_bc = SlipWallAdiab Outflow + + +In the 2D-RZ case (`input.2d-regt_symRZ`), the ``geometry.coord_sys`` is updated to ``1`` to trigger the use of a polar +coordinates system. + +.. note:: + Note that when running 2D simulations, it is not necessary to specify entries for the third dimension. + +The base grid is decomposed into a 64x128 cell array with AMR triggered up to level 2. + +The refinement ratio between each level is set to 2 and `PeleLMeX` currently does not support +refinement ratio of 4. Regrid operation will be performed every 5 steps. ``amr.n_error_buf`` specifies, +for each level, the number of buffer cells used around the cell tagged for refinement, while ``amr.grid_eff`` +describes the grid efficiency, i.e. how much of the new grid contains tagged cells. Higher values lead +to tighter grids around the tagged cells. For more information on how these parameters affect grid generation, +see the `AMReX documentation `_. + +All of those parameters are specified in the `AMR CONTROL` block: :: + + #------------------------- AMR CONTROL ---------------------------- + amr.n_cell = 64 128 # Level 0 number of cells in each direction + amr.v = 1 # AMR verbose + amr.max_level = 2 # maximum level number allowed + amr.ref_ratio = 2 2 2 2 # refinement ratio + amr.regrid_int = 5 # how often to regrid + amr.n_error_buf = 1 1 2 2 # number of buffer cells in error est + amr.grid_eff = 0.7 # what constitutes an efficient grid + amr.blocking_factor = 16 # block factor in grid generation (min box size) + amr.max_grid_size = 128 # max box size + +Problem specifications +^^^^^^^^^^^^^^^^^^^^^^ + +.. _sec:TUTO_HB::Problem: + +The problem setup is mostly contained in the three C++ source/header files described in :doc:`Tutorials_FlameSheet`. +The user parameters are gathered in the struct defined in ``pelelm_prob_parm.H``: :: + + struct ProbParm + { + amrex::Real P_mean = 101325.0_rt; + amrex::Real T_mean = 300.0_rt; + amrex::Real T_bubble = 600.0_rt; + amrex::Real bubble_rad = 0.005_rt; + amrex::Real bubble_y0 = 0.01; + int bubble_is_mix = 0; + int is_sym = 0; + }; + +* ``P_mean`` : initial thermodynamic pressure + +* ``T_mean`` : the ambient gas temperature + +* ``T_bubble`` : the bubble gas temperature + +* ``bubble_rad`` : the radius of the light bubble + +* ``bubble_y0`` : the initial position of the bubble in the :math:`y` direction + +* ``bubble_is_mix`` : a flag to switch to a mixture-based density change in the bubble + +* ``is_sym`` : a flag to indicate that the initial conditions are for a :math:`x`-low symmetric case. + +The initial solution consists of air at the pressure/temperature specified by the user, with a bubble +of a different temperature/mixture intended to be lighter such that the bubble will rise under the +influence of gravity. Note that the user can easily reverse the problem with a heavier bubble. +The default parameters provided above are overwritten using AMReX ParmParse in ``pelelm_prob.cpp`` +and the initial/boundary conditions implemented in ``pelelm_prob.H``. Because this case do not feature +any dirichlet BC on the state variables, the ``bcnormal`` function in ``pelelm_prob.H`` will not be called +and can thus be left empty (but its definition is still required). + +The interesting aspect of this case reside in the inclusion of buoyancy effects in the presence of gravity. +To trigger gravity the following input key is required: :: + + peleLM.gravity = 0.0 -9.81 0.0 + + +which in this case define an usual Earth-like gravity oriented towards :math:`y`-low. + +.. note:: + At the moment, the hydrostatic outflow boundqry conditions qre not qvqilqble in PeleLMeX such Outflow should not be + employed in the direction trqnsverse to the grqvity vector ! + + +Numerical parameters +^^^^^^^^^^^^^^^^^^^^ + +The ``PeleLM CONTROL`` block contains a few of the `PeleLMeX` algorithmic parameters. Many more +unspecified parameters are relying on their default values which can be found in :doc:`LMeXControls`. +Of particular interest are the ``peleLM.sdc_iterMax`` parameter controlling the number of +SDC iterations (see :doc:`Model` for more details on SDC in `PeleLMeX`) and the +``peleLM.num_init_iter`` one controlling the number of initial iteration the solver will do +after initialization to obtain a consistent pressure and velocity field. + +Building the executable +----------------------- + +Now that we have reviewed the basic ingredients required to setup the case, it is time to build the `PeleLMeX` executable. +Although both GNUmake and CMake are available, it is advised to use GNUmake. The ``GNUmakefile`` file provides some compile-time options +regarding the simulation we want to perform. +The first few lines specify the paths towards the source codes of `PeleLMeX`, `AMReX`, `AMReX-Hydro` and `PelePhysics`, overwritting +any environment variable if necessary, and might have been already updated in :ref:`sec:TUTO_HB::PrepStep` earlier. + +The next few lines specify AMReX compilation options and compiler selection: :: + + # AMREX + DIM = 2 + DEBUG = FALSE + PRECISION = DOUBLE + VERBOSE = FALSE + TINY_PROFILE = FALSE + + # Compilation + COMP = gnu + USE_MPI = TRUE + USE_OMP = FALSE + USE_CUDA = FALSE + USE_HIP = FALSE + USE_SYCL = FALSE + +It allows users to specify the number of spatial dimensions (2D), +trigger debug compilation and other AMReX options. The compiler (``gnu``) and the parallelism paradigm +(in the present case only MPI is used) are then selected. Note that on OSX platform, one should update the compiler to ``llvm``. + +In `PeleLMeX`, the chemistry model (set of species, their thermodynamic and transport properties as well as the description +of their of chemical interactions) is specified at compile time. Chemistry models available in +`PelePhysics` can used in `PeleLMeX` by specifying the name of the folder in `PelePhysics/Support/Mechanisms/Models` containing +the relevant files, for example: :: + + Chemistry_Model = air + +Here, the model ``air`` contains only 2 species (O2 and N2) without any reactions. A constant transport model is used +and transport properties are set to zero in the input files which is effectively equivalent to solving the variable-density +Euler equations. +The user is referred to the `PelePhysics `_ documentation for a +list of available mechanisms and more information regarding the EOS, chemistry and transport models specified: :: + + Eos_Model := Fuego + Transport_Model := Constant + +Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This Third Party Librabry (TPL) is not shipped with the `PeleLMeX` distribution but can be readily installed through the makefile system of `PeleLMeX`. Note that compiling Sundials is necessary even if the simualtion does not involve reactions. To do so, type in the following command: :: + + make -j4 TPL + +Note that the installation of `CVODE` requires CMake 3.17.1 or higher. + +You are now ready to build your first `PeleLMeX` executable!! Type in: :: + + make -j4 + +The option here tells `make` to use up to 4 processors to create the executable (internally, `make` follows a dependency graph to ensure any required ordering in the build is satisfied). This step should generate the following file (providing that the build configuration you used matches the one above): :: + + PeleLMeX2d.gnu.MPI.ex + +You're good to go! + +Checking the initial conditions +------------------------------- + +It is always a good practice to check the initial conditions. To do so, run the simulation specifying +an ``amr.max_step`` of 0. Open the ``input.2d-regt_sym`` with your favorite editor and update the following parameters :: + + #---------------------- Time Stepping CONTROL -------------------- + amr.max_step = 0 # Maximum number of time steps + + +Since we've set the maximum number of steps to 0, the solver will exit after +the initial solution is obtained. Let's run the simulation with the default problem parameter +listed in the input file. To do so, use: :: + + ./PeleLMeX2d.gnu.MPI.ex input.2d-regt + +A variety of information is printed to the screen: + +#. AMReX/SUNDIALs initialization along with the git hashes of the various subrepositories + +#. A summary of the `PeleLMeX` state components + +#. Initial projection and initial iterations. + +#. Saving the initial solution to `plt00000` file. + +Use Amrvis, Paraview or yt to visualize the plot file. Using Amrvis, the solution should look +similar to :numref:`HB_InitSol`. + +.. figure:: images/tutorials/HB_InitSol.png + :name: HB_InitSol + :align: center + :figwidth: 95% + + : Contour plots of density, temperature, cell-averaged pressure after initialization. + +The cell-averaged pressure (the perturbational pressure in node-centered in the projection-based scheme +employed in PeleLMeX, see `Almgren `_ for more details) +clearly shows the effect of the gravity field with the presence of an hydrostatic pressure gradient. + +Advance the solution +-------------------- + +Let's now advance the solution for 400 steps, using the base grid and 2 AMR level and the default time stepping +parameters. To do so, ensure that: :: + + amr.max_step = 400 + +Additionally, make sure that ``amr.check_int`` is set to a positive value to trigger writing a +checkpoint file from which to later restart the simulation. If available, use more than one MPI +rank to run the simulation and redirect the standard output to a log file using: :: + + mpirun -n 4 ./PeleLMeX2d.gnu.MPI.ex input.2d-regt_sym > logInit.dat & + +A typical `PeleLMeX` stdout for a time step now looks like: :: + + ==================== NEW TIME STEP ==================== + Est. time step - Conv: 7.249645299e-05, divu: 1e+20 + STEP [384] - Time: 0.05931322581, dt 7.249645299e-05 + SDC iter [1] + >> PeleLMeX::Advance() --> Time: 0.2141339779 + +clearly showing the use of 1 SDC iterations. The first line at each step provides +the time step contraint from the CFL +condition (``Conv:``) and from the density change condition (``divu:``). +In the absence of reaction and diffusion, the ``divu:`` constraint is irrelevant and set to a +large value. + +Visualizing the `plt00400` file, we can see that the solution has evolved. The light bubble started rising +under the effect of buoyancy, resulting in a shear layer at the interface of between the hot and cold gases. +Vorticies appears in the shear layer, wrinking the interface. Smearing of the temperature gradient at the interface +is induced by the numerical scheme diffusion, but appearances of local extremas are very limited. + +.. figure:: images/tutorials/HB_400steps2lvl.png + :name: HB_400steps2lvl + :align: center + :figwidth: 95% + + : Contour plots of density, both velocity components and vorticity after 400 steps. + +In order to compare 2D-cartesian and 2D-RZ, you can now start another simulation using `input.2d-regt_symRZ`. To insure +both simulations evolved for the same physical time, set the final time of the 2D-RZ simulation to that of the first run: :: + + amr.max_step = 1000 + amr.stop_time = 0.060458236391426 + + +and change the prefix of the plotfile output for clarity: :: + + amr.plot_file = "pltRZ" + +then start the 2D-RZ run: :: + + mpirun -n 4 ./PeleLMeX2d.gnu.MPI.ex input.2d-regt_symRZ > logInitRZ.dat & + +The 2D-RZ simulation is found to have smaller time step size resulting from the stronger acceleration of the bubble. Indeed, +in the 2D-cartesian case, the hot region is actually a infinitely long cylinder which inertia is larger than that of the +bubble effectively represented in the 2D-RZ case. + +This is end of the guided section of this tutorial. Interested users can explore the effects of the following parameters +on the simulation results since the computational time is minimal: + +* Spatial resolution: increase the maximum number of AMR levels, ensuring that the simulation final time match that of the initial run. What is the effect on the bubble rising velocity and shape ? + +* Switch to a mixture composition change instead of a temperature one or reverse the problem by using a bubble temperature lower than that of the ambient air. + +* Switch to a different advection scheme (see the :doc:`LMeXControls` page for a list of available schemes). What is the effect on the interface wrinkling and smearing ? + +* If your computational resources allows, build the 3D version of the case and compare the 2D-RZ and 3D results. diff --git a/Docs/source/manual/images/tutorials/HB_400steps2lvl.png b/Docs/source/manual/images/tutorials/HB_400steps2lvl.png new file mode 100644 index 0000000000000000000000000000000000000000..cc05bc6b76ef4ea7204a6e8bf316572b64f3bf11 GIT binary patch literal 139592 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 literal 0 HcmV?d00001 From 2e405a6c7c1dd02cfb089c421cabe57381f8d534 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Tue, 29 Aug 2023 16:03:16 +0200 Subject: [PATCH 14/18] Update submods. --- Submodules/AMReX-Hydro | 2 +- Submodules/PelePhysics | 2 +- Submodules/amrex | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Submodules/AMReX-Hydro b/Submodules/AMReX-Hydro index f24f4a6f..bc4e5f64 160000 --- a/Submodules/AMReX-Hydro +++ b/Submodules/AMReX-Hydro @@ -1 +1 @@ -Subproject commit f24f4a6f00b93d79e9772100e620d219be7787cb +Subproject commit bc4e5f64c9ac3072793ebf426b422be91231652c diff --git a/Submodules/PelePhysics b/Submodules/PelePhysics index 5a99c923..b6aa6899 160000 --- a/Submodules/PelePhysics +++ b/Submodules/PelePhysics @@ -1 +1 @@ -Subproject commit 5a99c9237886a8d113a4de251437ea749c0a92c6 +Subproject commit b6aa6899850154142bbd8dd9c7485c645ce17d05 diff --git a/Submodules/amrex b/Submodules/amrex index 9fc63542..22908d8a 160000 --- a/Submodules/amrex +++ b/Submodules/amrex @@ -1 +1 @@ -Subproject commit 9fc635426caeef7d2c0b6bf7ae7700bd5e6600ec +Subproject commit 22908d8ad2141ed096401e9be9f067e8e589ec31 From 00bb8e17000547aad64fb12dc75bc9f72608ff0d Mon Sep 17 00:00:00 2001 From: Bruce Perry Date: Tue, 29 Aug 2023 15:47:32 -0600 Subject: [PATCH 15/18] Add SUNDIALS path to readme and tutorials --- Docs/source/manual/Tutorials_BFSFlame.rst | 7 ++++- Docs/source/manual/Tutorials_FlameSheet.rst | 7 ++++- Docs/source/manual/Tutorials_FlowPastCyl.rst | 28 ++++++++++---------- Docs/source/manual/Tutorials_HotBubble.rst | 7 ++++- Docs/source/manual/Tutorials_TripleFlame.rst | 8 ++++-- README.md | 3 ++- 6 files changed, 40 insertions(+), 20 deletions(-) diff --git a/Docs/source/manual/Tutorials_BFSFlame.rst b/Docs/source/manual/Tutorials_BFSFlame.rst index ff32a335..c907ddd2 100644 --- a/Docs/source/manual/Tutorials_BFSFlame.rst +++ b/Docs/source/manual/Tutorials_BFSFlame.rst @@ -34,13 +34,14 @@ Follow the steps listed below to get to this point: cd PeleLMeX/Exec/RegTests/EB_BackwardStepFlame Note that the makefile system is set up such that default paths are automatically set to the -submodules obtained with the recursive *git clone*, however the user can set its own dependencies +submodules obtained with the recursive *git clone*, however the user can set their own dependencies in the `GNUmakefile` by updating the top-most lines as follows: :: PELELMEX_HOME = AMREX_HOME = AMREX_HYDRO_HOME = PELE_PHYSICS_HOME = + SUNDIALS_HOME = or directly through shell environement variables (using *bash* for instance): :: @@ -48,6 +49,10 @@ or directly through shell environement variables (using *bash* for instance): :: export AMREX_HOME= export AMREX_HYDRO_HOME= export PELE_PHYSICS_HOME= + export SUNDIALS_HOME= + +Note that using the first option will overwrite any +environement variables you might have previously defined when using this `GNUmakefile`. You're good to go ! diff --git a/Docs/source/manual/Tutorials_FlameSheet.rst b/Docs/source/manual/Tutorials_FlameSheet.rst index c9862341..5710dcf8 100644 --- a/Docs/source/manual/Tutorials_FlameSheet.rst +++ b/Docs/source/manual/Tutorials_FlameSheet.rst @@ -38,13 +38,14 @@ Follow the steps listed below to get the source code and its dependent libraries cd PeleLMeX/Exec/RegTests/FlameSheet Note that the makefile system is set up such that default paths are automatically set to the -submodules obtained with the recursive *git clone*, however the user can set its own dependencies +submodules obtained with the recursive *git clone*, however the user can set their own dependencies in the `GNUmakefile` by updating the top-most lines as follows: :: PELELMEX_HOME = AMREX_HOME = AMREX_HYDRO_HOME = PELE_PHYSICS_HOME = + SUNDIALS_HOME = or directly through shell environement variables (using *bash* for instance): :: @@ -52,6 +53,10 @@ or directly through shell environement variables (using *bash* for instance): :: export AMREX_HOME= export AMREX_HYDRO_HOME= export PELE_PHYSICS_HOME= + export SUNDIALS_HOME= + +Note that using the first option will overwrite any +environement variables you might have previously defined when using this `GNUmakefile`. You're good to go ! diff --git a/Docs/source/manual/Tutorials_FlowPastCyl.rst b/Docs/source/manual/Tutorials_FlowPastCyl.rst index 05d86c21..7c2207de 100644 --- a/Docs/source/manual/Tutorials_FlowPastCyl.rst +++ b/Docs/source/manual/Tutorials_FlowPastCyl.rst @@ -35,26 +35,26 @@ Follow the steps listed below to get to this point: cd PeleLMeX/Exec/RegTests/EB_FlowPastCylinder -#. Finally, setup the environment variables providing paths to `PeleLMeX` and its dependencies. This can done in - one of two ways: - - #. Directly into the `GNUmakefile` by updating the top-most lines as follows: :: +Note that the makefile system is set up such that default paths are automatically set to the +submodules obtained with the recursive *git clone*, however the user can set their own dependencies +in the `GNUmakefile` by updating the top-most lines as follows: :: PELELMEX_HOME = - AMREX_HOME =${PELELMEX_HOME}/Submodules/amrex - AMREX_HYDRO_HOME =${PELELMEX_HOME}/Submodules/AMReX-Hydro - PELE_PHYSICS_HOME =${PELELMEX_HOME}/Submodules/PelePhysics - + AMREX_HOME = + AMREX_HYDRO_HOME = + PELE_PHYSICS_HOME = + SUNDIALS_HOME = - #. Exporting shell environement variables (using *bash* for instance): :: +or directly through shell environement variables (using *bash* for instance): :: export PELELMEX_HOME= - export AMREX_HOME=${PELELMEX_HOME}/Submodules/amrex - export AMREX_HYDRO_HOME=${PELELMEX_HOME}/Submodules/AMReX-Hydro - export PELE_PHYSICS_HOME=${PELELMEX_HOME}/Submodules/PelePhysics + export AMREX_HOME= + export AMREX_HYDRO_HOME= + export PELE_PHYSICS_HOME= + export SUNDIALS_HOME= - Both options require to provide the path to where you cloned `PeleLMeX`. Note that using the first option will overwrite any - environement variables you might have previously defined when using this `GNUmakefile`. +Note that using the first option will overwrite any +environement variables you might have previously defined when using this `GNUmakefile`. You're good to go ! diff --git a/Docs/source/manual/Tutorials_HotBubble.rst b/Docs/source/manual/Tutorials_HotBubble.rst index d70fd0de..248bd9f6 100644 --- a/Docs/source/manual/Tutorials_HotBubble.rst +++ b/Docs/source/manual/Tutorials_HotBubble.rst @@ -32,13 +32,14 @@ Follow the steps listed below to get to this point: cd PeleLMeX/Exec/RegTests/HotBubble Note that the makefile system is set up such that default paths are automatically set to the -submodules obtained with the recursive *git clone*, however the user can set its own dependencies +submodules obtained with the recursive *git clone*, however the user can set their own dependencies in the `GNUmakefile` by updating the top-most lines as follows: :: PELELMEX_HOME = AMREX_HOME = AMREX_HYDRO_HOME = PELE_PHYSICS_HOME = + SUNDIALS_HOME = or directly through shell environement variables (using *bash* for instance): :: @@ -46,6 +47,10 @@ or directly through shell environement variables (using *bash* for instance): :: export AMREX_HOME= export AMREX_HYDRO_HOME= export PELE_PHYSICS_HOME= + export SUNDIALS_HOME= + +Note that using the first option will overwrite any +environement variables you might have previously defined when using this `GNUmakefile`. You're good to go ! diff --git a/Docs/source/manual/Tutorials_TripleFlame.rst b/Docs/source/manual/Tutorials_TripleFlame.rst index 65a0aa28..b44dcd6c 100644 --- a/Docs/source/manual/Tutorials_TripleFlame.rst +++ b/Docs/source/manual/Tutorials_TripleFlame.rst @@ -53,13 +53,14 @@ Follow the steps listed below to get to this point: cd PeleLMeX/Exec/RegTests/TripleFLame Note that the makefile system is set up such that default paths are automatically set to the -submodules obtained with the recursive *git clone*, however the user can set its own dependencies +submodules obtained with the recursive *git clone*, however the user can set their own dependencies in the `GNUmakefile` by updating the top-most lines as follows: :: PELELMEX_HOME = AMREX_HOME = AMREX_HYDRO_HOME = PELE_PHYSICS_HOME = + SUNDIALS_HOME = or directly through shell environement variables (using *bash* for instance): :: @@ -67,6 +68,10 @@ or directly through shell environement variables (using *bash* for instance): :: export AMREX_HOME= export AMREX_HYDRO_HOME= export PELE_PHYSICS_HOME= + export SUNDIALS_HOME= + +Note that using the first option will overwrite any +environement variables you might have previously defined when using this `GNUmakefile`. You're good to go ! @@ -560,4 +565,3 @@ At this point, the simulation is considered complete. .. [PCI2007] S. Chung, Stabilization, propagation and instability of tribrachial triple flames, Proceedings of the Combustion Institute 31 (2007) 877–892 .. [CF1990] R. Bilger, S. Starner, R. Kee, On reduced mechanisms for methane-air combustion in nonpremixed flames, Combustion and Flames 80 (1990) 135-149 .. [CAMCS2006] J. Bell, M. Day, J. Grcar, M. Lijewski, Active Control for Statistically Stationary Turbulent PremixedFlame Simulations, Communications in Applied Mathematics and Computational Science 1 (2006) 29-51 - diff --git a/README.md b/README.md index 41b35baf..910d12d5 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Finally, when building with GPU support, CUDA >= 11 is required with NVIDIA GPUs ### Download The prefered method consist in cloning the *PeleLMeX* and its submodules using a recursive `git clone`: -([amrex](https://github.com/AMReX-Codes/amrex), [AMReX-Hydro](https://github.com/AMReX-Codes/AMReX-Hydro) and [PelePhysics](https://github.com/AMReX-Combustion/PelePhysics), [PeleMP](https://github.com/AMReX-Combustion/PeleMP)) using: +([amrex](https://github.com/AMReX-Codes/amrex), [AMReX-Hydro](https://github.com/AMReX-Codes/AMReX-Hydro), [PelePhysics](https://github.com/AMReX-Combustion/PelePhysics), [PeleMP](https://github.com/AMReX-Combustion/PeleMP)), and [SUNDIALS](https://github.com/LLNL/sundials) using: ``` git clone --recursive https://github.com/AMReX-Combustion/PeleLMeX.git @@ -76,6 +76,7 @@ export AMREX_HOME=${PELELMEX_HOME}/Submodules/amrex export AMREX_HYDRO_HOME=${PELELMEX_HOME}/Submodules/AMReX-Hydro export PELE_PHYSICS_HOME=${PELELMEX_HOME}/Submodules/PelePhysics export PELEMP_HOME=${PELELMEX_HOME}/Submodules/PeleMP +export SUNDIALS_HOME=${PELELMEX_HOME}/Submodules/sundials ``` ### Compilation From 4e8164ebbed45c416480931961e8c38a2c2ec420 Mon Sep 17 00:00:00 2001 From: Bruce Perry Date: Tue, 29 Aug 2023 17:07:11 -0600 Subject: [PATCH 16/18] typo fixes and minor changes in Docs and Readmes --- Docs/source/manual/Tutorials_BFSFlame.rst | 10 ++++--- Docs/source/manual/Tutorials_FlameSheet.rst | 11 +++---- Docs/source/manual/Tutorials_FlowPastCyl.rst | 10 ++++--- Docs/source/manual/Tutorials_HotBubble.rst | 30 +++++++++++--------- Docs/source/manual/Tutorials_TripleFlame.rst | 8 +++--- Exec/RegTests/EB_BackwardStepFlame/README.md | 2 +- Exec/RegTests/FlameSheet/README.md | 8 +++--- Exec/RegTests/HITDecay/README.md | 2 +- Exec/RegTests/PeriodicCases/README.md | 2 +- Exec/RegTests/README.md | 6 ++-- Exec/RegTests/TaylorGreen/README.md~ | 21 ++++++++++++++ Exec/RegTests/TaylorGreen/Readme.md | 6 ++-- README.md | 21 +++++++++----- 13 files changed, 86 insertions(+), 51 deletions(-) create mode 100644 Exec/RegTests/TaylorGreen/README.md~ diff --git a/Docs/source/manual/Tutorials_BFSFlame.rst b/Docs/source/manual/Tutorials_BFSFlame.rst index c907ddd2..0c1a997c 100644 --- a/Docs/source/manual/Tutorials_BFSFlame.rst +++ b/Docs/source/manual/Tutorials_BFSFlame.rst @@ -43,7 +43,7 @@ in the `GNUmakefile` by updating the top-most lines as follows: :: PELE_PHYSICS_HOME = SUNDIALS_HOME = -or directly through shell environement variables (using *bash* for instance): :: +or directly through shell environment variables (using *bash* for instance): :: export PELELMEX_HOME= export AMREX_HOME= @@ -52,7 +52,7 @@ or directly through shell environement variables (using *bash* for instance): :: export SUNDIALS_HOME= Note that using the first option will overwrite any -environement variables you might have previously defined when using this `GNUmakefile`. +environment variables you might have previously defined when using this `GNUmakefile`. You're good to go ! @@ -267,11 +267,13 @@ list of available mechanisms and more information regarding the EOS, chemistry a Eos_Model := Fuego Transport_Model := Simple -Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This Third Party Librabry (TPL) is not shipped with the `PeleLMeX` distribution but can be readily installed through the makefile system of `PeleLMeX`. Note that compiling Sundials is necessary even if the simualtion does not involve reactions. To do so, type in the following command: :: +Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This +Third Party Librabry (TPL) is shipped as a submodule of the `PeleLMeX` distribution and can be readily installed through the makefile system +of `PeleLMeX`. To do so, type in the following command: :: make -j4 TPL -Note that the installation of `CVODE` requires CMake 3.17.1 or higher. +Note that the installation of `CVODE` requires CMake 3.23.1 or higher. You are now ready to build your first `PeleLMeX` executable!! Type in: :: diff --git a/Docs/source/manual/Tutorials_FlameSheet.rst b/Docs/source/manual/Tutorials_FlameSheet.rst index 5710dcf8..1da862df 100644 --- a/Docs/source/manual/Tutorials_FlameSheet.rst +++ b/Docs/source/manual/Tutorials_FlameSheet.rst @@ -9,7 +9,6 @@ Premixed flame sheet with harmonic perturbations Introduction ------------ - `PeleLMeX` primary objective is to enable simulation of reactive flows on platforms ranging from small personal computer to Exascale supercomputer. This short tutorial describes the case of a 2D laminar methane/hydrogen/air premixed flame, perturbed using harmonic fluctuations @@ -17,7 +16,7 @@ on the initial conditions. The goal of this tutorial is to demonstrate `PeleLMeX` basic controls when dealing with reactive simulations. This document provides step by step instructions reviewing how to set-up the domain and boundary conditions, -and to construct an initial solution. +and how to construct an initial solution. .. _sec:TUTO_FS::PrepStep: @@ -47,7 +46,7 @@ in the `GNUmakefile` by updating the top-most lines as follows: :: PELE_PHYSICS_HOME = SUNDIALS_HOME = -or directly through shell environement variables (using *bash* for instance): :: +or directly through shell environment variables (using *bash* for instance): :: export PELELMEX_HOME= export AMREX_HOME= @@ -56,7 +55,7 @@ or directly through shell environement variables (using *bash* for instance): :: export SUNDIALS_HOME= Note that using the first option will overwrite any -environement variables you might have previously defined when using this `GNUmakefile`. +environment variables you might have previously defined when using this `GNUmakefile`. You're good to go ! @@ -285,7 +284,9 @@ list of available mechanisms and more information regarding the EOS, chemistry a Note that the ``Chemistry_Model`` must be similar to the one used to generate the Cantera solution. -Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This Third Party Librabry (TPL) is not shipped with the `PeleLMeX` distribution but can be readily installed through the makefile system of `PeleLMeX`. Note that compiling Sundials is necessary even if the simualtion do not involve reactions. To do so, type in the following command: :: +Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This +Third Party Librabry (TPL) is shipped as a submodule of the `PeleLMeX` distribution and can be readily installed through the makefile system +of `PeleLMeX`. To do so, type in the following command: :: make -j4 TPL diff --git a/Docs/source/manual/Tutorials_FlowPastCyl.rst b/Docs/source/manual/Tutorials_FlowPastCyl.rst index 7c2207de..8ea714a2 100644 --- a/Docs/source/manual/Tutorials_FlowPastCyl.rst +++ b/Docs/source/manual/Tutorials_FlowPastCyl.rst @@ -45,7 +45,7 @@ in the `GNUmakefile` by updating the top-most lines as follows: :: PELE_PHYSICS_HOME = SUNDIALS_HOME = -or directly through shell environement variables (using *bash* for instance): :: +or directly through shell environment variables (using *bash* for instance): :: export PELELMEX_HOME= export AMREX_HOME= @@ -54,7 +54,7 @@ or directly through shell environement variables (using *bash* for instance): :: export SUNDIALS_HOME= Note that using the first option will overwrite any -environement variables you might have previously defined when using this `GNUmakefile`. +environment variables you might have previously defined when using this `GNUmakefile`. You're good to go ! @@ -212,11 +212,13 @@ Here, the model ``air``, only contains 2 species (O2 and N2). The user is referr Eos_Model := Fuego Transport_Model := Constant -Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This Third Party Librabry (TPL) is not shipped with the `PeleLMeX` distribution but can be readily installed through the makefile system of `PeleLMeX`. Note that compiling Sundials is necessary even if the simualtion do not involve reactions. To do so, type in the following command: :: +Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This +Third Party Librabry (TPL) is shipped as a submodule of the `PeleLMeX` distribution and can be readily installed through the makefile system +of `PeleLMeX`. To do so, type in the following command: :: make -j4 TPL -Note that the installation of `CVODE` requires CMake 3.12.1 or higher. +Note that the installation of `CVODE` requires CMake 3.23.1 or higher. You are now ready to build your first `PeleLMeX` executable !! Type in: :: diff --git a/Docs/source/manual/Tutorials_HotBubble.rst b/Docs/source/manual/Tutorials_HotBubble.rst index 248bd9f6..4ba5d541 100644 --- a/Docs/source/manual/Tutorials_HotBubble.rst +++ b/Docs/source/manual/Tutorials_HotBubble.rst @@ -41,7 +41,7 @@ in the `GNUmakefile` by updating the top-most lines as follows: :: PELE_PHYSICS_HOME = SUNDIALS_HOME = -or directly through shell environement variables (using *bash* for instance): :: +or directly through shell environment variables (using *bash* for instance): :: export PELELMEX_HOME= export AMREX_HOME= @@ -50,7 +50,7 @@ or directly through shell environement variables (using *bash* for instance): :: export SUNDIALS_HOME= Note that using the first option will overwrite any -environement variables you might have previously defined when using this `GNUmakefile`. +environment variables you might have previously defined when using this `GNUmakefile`. You're good to go ! @@ -154,21 +154,21 @@ The initial solution consists of air at the pressure/temperature specified by th of a different temperature/mixture intended to be lighter such that the bubble will rise under the influence of gravity. Note that the user can easily reverse the problem with a heavier bubble. The default parameters provided above are overwritten using AMReX ParmParse in ``pelelm_prob.cpp`` -and the initial/boundary conditions implemented in ``pelelm_prob.H``. Because this case do not feature +and the initial/boundary conditions implemented in ``pelelm_prob.H``. Because this case does not feature any dirichlet BC on the state variables, the ``bcnormal`` function in ``pelelm_prob.H`` will not be called and can thus be left empty (but its definition is still required). -The interesting aspect of this case reside in the inclusion of buoyancy effects in the presence of gravity. +The interesting aspect of this case is the inclusion of buoyancy effects in the presence of gravity. To trigger gravity the following input key is required: :: peleLM.gravity = 0.0 -9.81 0.0 -which in this case define an usual Earth-like gravity oriented towards :math:`y`-low. +which in this case defines an usual Earth-like gravity oriented towards :math:`y`-low. .. note:: - At the moment, the hydrostatic outflow boundqry conditions qre not qvqilqble in PeleLMeX such Outflow should not be - employed in the direction trqnsverse to the grqvity vector ! + At the moment, the hydrostatic outflow boundqry conditions are not available in PeleLMeX, so Outflow should not be + employed in the direction transverse to the gravity vector ! Numerical parameters @@ -227,11 +227,13 @@ list of available mechanisms and more information regarding the EOS, chemistry a Eos_Model := Fuego Transport_Model := Constant -Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This Third Party Librabry (TPL) is not shipped with the `PeleLMeX` distribution but can be readily installed through the makefile system of `PeleLMeX`. Note that compiling Sundials is necessary even if the simualtion does not involve reactions. To do so, type in the following command: :: +Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This +Third Party Librabry (TPL) is shipped as a submodule of the `PeleLMeX` distribution and can be readily installed through the makefile system +of `PeleLMeX`. To do so, type in the following command: :: make -j4 TPL -Note that the installation of `CVODE` requires CMake 3.17.1 or higher. +Note that the installation of `CVODE` requires CMake 3.23.1 or higher. You are now ready to build your first `PeleLMeX` executable!! Type in: :: @@ -305,7 +307,7 @@ A typical `PeleLMeX` stdout for a time step now looks like: :: SDC iter [1] >> PeleLMeX::Advance() --> Time: 0.2141339779 -clearly showing the use of 1 SDC iterations. The first line at each step provides +clearly showing the use of 1 SDC iteration. The first line at each step provides the time step contraint from the CFL condition (``Conv:``) and from the density change condition (``divu:``). In the absence of reaction and diffusion, the ``divu:`` constraint is irrelevant and set to a @@ -314,7 +316,7 @@ large value. Visualizing the `plt00400` file, we can see that the solution has evolved. The light bubble started rising under the effect of buoyancy, resulting in a shear layer at the interface of between the hot and cold gases. Vorticies appears in the shear layer, wrinking the interface. Smearing of the temperature gradient at the interface -is induced by the numerical scheme diffusion, but appearances of local extremas are very limited. +is induced by the numerical scheme diffusion, but appearances of local extrema are very limited. .. figure:: images/tutorials/HB_400steps2lvl.png :name: HB_400steps2lvl @@ -338,14 +340,14 @@ then start the 2D-RZ run: :: mpirun -n 4 ./PeleLMeX2d.gnu.MPI.ex input.2d-regt_symRZ > logInitRZ.dat & -The 2D-RZ simulation is found to have smaller time step size resulting from the stronger acceleration of the bubble. Indeed, -in the 2D-cartesian case, the hot region is actually a infinitely long cylinder which inertia is larger than that of the +The 2D-RZ simulation is found to have a smaller time step size resulting from the stronger acceleration of the bubble. Indeed, +in the 2D-cartesian case, the hot region is actually an infinitely long cylinder which has inertia larger than that of the bubble effectively represented in the 2D-RZ case. This is end of the guided section of this tutorial. Interested users can explore the effects of the following parameters on the simulation results since the computational time is minimal: -* Spatial resolution: increase the maximum number of AMR levels, ensuring that the simulation final time match that of the initial run. What is the effect on the bubble rising velocity and shape ? +* Spatial resolution: increase the maximum number of AMR levels, ensuring that the simulation final time matches that of the initial run. What is the effect on the rising bubble's velocity and shape ? * Switch to a mixture composition change instead of a temperature one or reverse the problem by using a bubble temperature lower than that of the ambient air. diff --git a/Docs/source/manual/Tutorials_TripleFlame.rst b/Docs/source/manual/Tutorials_TripleFlame.rst index b44dcd6c..7718309d 100644 --- a/Docs/source/manual/Tutorials_TripleFlame.rst +++ b/Docs/source/manual/Tutorials_TripleFlame.rst @@ -62,7 +62,7 @@ in the `GNUmakefile` by updating the top-most lines as follows: :: PELE_PHYSICS_HOME = SUNDIALS_HOME = -or directly through shell environement variables (using *bash* for instance): :: +or directly through shell environment variables (using *bash* for instance): :: export PELELMEX_HOME= export AMREX_HOME= @@ -71,7 +71,7 @@ or directly through shell environement variables (using *bash* for instance): :: export SUNDIALS_HOME= Note that using the first option will overwrite any -environement variables you might have previously defined when using this `GNUmakefile`. +environment variables you might have previously defined when using this `GNUmakefile`. You're good to go ! @@ -264,12 +264,12 @@ mechanisms and more information regarding the EOS, chemistry and transport model Transport_Model := Simple Finally, `PeleLMeX` utilizes the chemical kinetic ODE integrator `CVODE `_. This -Third Party Librabry (TPL) is not shipped with the `PeleLMeX` distribution but can be readily installed through the makefile system +Third Party Librabry (TPL) is shipped as a submodule of the `PeleLMeX` distribution and can be readily installed through the makefile system of `PeleLMeX`. To do so, type in the following command: :: make TPL -Note that the installation of `CVODE` requires CMake 3.17.1 or higher. +Note that the installation of `CVODE` requires CMake 3.23.1 or higher. You are now ready to build your first `PeleLMeX` executable !! Type in: :: diff --git a/Exec/RegTests/EB_BackwardStepFlame/README.md b/Exec/RegTests/EB_BackwardStepFlame/README.md index 93eddf09..77350143 100644 --- a/Exec/RegTests/EB_BackwardStepFlame/README.md +++ b/Exec/RegTests/EB_BackwardStepFlame/README.md @@ -1,3 +1,3 @@ ## EB\_BackwardStepFlame -This folder implement the case of a laminar flame stabilized behind a backward facing step. It is intended to test integrated EB representation with reactive flow. More details on this case and step-by-step instructions can be found in this [tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_BFSFlame.html) +This folder implements the case of a laminar flame stabilized behind a backward facing step. It is intended to test integrated EB representation with reactive flow. More details on this case and step-by-step instructions can be found in this [tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_BFSFlame.html) diff --git a/Exec/RegTests/FlameSheet/README.md b/Exec/RegTests/FlameSheet/README.md index 50a18108..4ccad320 100644 --- a/Exec/RegTests/FlameSheet/README.md +++ b/Exec/RegTests/FlameSheet/README.md @@ -1,7 +1,7 @@ ## FlameSheet -A 2D (3D) harmonically perturbed flame sheet, initial solution from a Cantera simulation provided for 3 mechanisms -(drm19, dodecane\_lu and dodecane\_lu\_qss). This is the basis for [weak scaling studies](https://amrex-combustion.github.io/PeleLMeX/manual/html/Performances.html) in PeleLMeX and test all the +A 2D (or 3D) harmonically perturbed flame sheet, initial solution from a Cantera simulation provided for 3 mechanisms +(drm19, dodecane\_lu and dodecane\_lu\_qss). This is the basis for [weak scaling studies](https://amrex-combustion.github.io/PeleLMeX/manual/html/Performances.html) in PeleLMeX and tests all the reactive pieces of the algorithm as well as transport options (Unity Lewis number, Soret effect, ...). -More detqils on the cqse setup qnd step-by-step instructions cqn be found in this [tutoriql](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_FlameSheet.html). +More details on the case setup and step-by-step instructions can be found in this [tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_FlameSheet.html). -Comparisons of PeleLMeX results on a methane/air flame against Cantera at several resolution are reported [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#laminar-premixed-flame). +Comparisons of PeleLMeX results for a methane/air flame against Cantera at several resolutions are reported [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#laminar-premixed-flame). diff --git a/Exec/RegTests/HITDecay/README.md b/Exec/RegTests/HITDecay/README.md index b92fb27f..d6fab358 100644 --- a/Exec/RegTests/HITDecay/README.md +++ b/Exec/RegTests/HITDecay/README.md @@ -1,3 +1,3 @@ ## HITDecay -A 3D decaying HIT case, where the initial solution is generated with a Passot-Pouquet spectrum. Testing basic incompressible +A 3D decaying Homogeneous Isotropic Turbulence (HIT) case, where the initial solution is generated with a Passot-Pouquet spectrum. Testing the basic incompressible integration algorithm and Large Eddy Simulation implementation. diff --git a/Exec/RegTests/PeriodicCases/README.md b/Exec/RegTests/PeriodicCases/README.md index 05971f71..aaebf7e9 100644 --- a/Exec/RegTests/PeriodicCases/README.md +++ b/Exec/RegTests/PeriodicCases/README.md @@ -1,4 +1,4 @@ ## PeriodicCases -A set of 2D/3D periodic cases: convected vortex in different directions, convected temperature/mixture Gaussian bump, +A set of 2D/3D periodic cases: convected vortex in different directions, convected temperature/mixture Gaussian bump, and pure diffusion of species/temperature. This is the base case to test PeleLMeX accuracy and order of convergence of the spatial and temporal schemes. diff --git a/Exec/RegTests/README.md b/Exec/RegTests/README.md index f94c0035..4f0bc170 100644 --- a/Exec/RegTests/README.md +++ b/Exec/RegTests/README.md @@ -1,6 +1,6 @@ # PeleLMeX testing This folder contains a set of small-scale cases testing the various functionalities of PeleLMeX. -A number of these cases are automatically compiled or compiled & run upon pull requests into the development branch, -A short description of all the case is provided in the README file of each folder, stating the tested PeleLMeX capabilities and -,when available, point towards a tutorial or documentation page. +A number of these cases are automatically compiled or compiled & run upon pull requests into the development branch. +A short description of all the case is provided in the README file in each folder, stating the tested PeleLMeX capabilities and, +when available, pointing towards a tutorial or documentation page. diff --git a/Exec/RegTests/TaylorGreen/README.md~ b/Exec/RegTests/TaylorGreen/README.md~ new file mode 100644 index 00000000..cbf22376 --- /dev/null +++ b/Exec/RegTests/TaylorGreen/README.md~ @@ -0,0 +1,21 @@ +# Taylor-Green Vortex (pulled from PeleC) + +This setup is one of the test problems outlined by [the High-Order CFD workshop](https://www.grc.nasa.gov/hiocfd/). + +A complete description of the problem can be found +[here](https://www.grc.nasa.gov/hiocfd/wp-content/uploads/sites/22/case_c3.3.pdf) and +the reference data is found +[here](https://www.grc.nasa.gov/wp-content/uploads/sites/22/C3.3_datafiles.zip). More +details of the problem and methods used to obtain the reference data +can be found in Bull and Jameson (2014) 7th AIAA Theoretical Fluid +Mechanics Conference (doi: 10.2514/6.2014-3210) and DeBonis (2013) +51st AIAA Aerospace Sciences Meeting (doi:10.2514/6.2013-382). + +To directly plot the evolution of integrated kinetic energy and enstrophy, use +the data provided in temporals/tempState with the help of the processTGdata.py +script. + +Note that these commands provide adimentional results, with t\* = t/(L\_0/V\_0), +E\_k\* = E\_k / ( rho\_0 * V\_0 * V\_0) and psi\* = psi / (V\_0/L\_0)^2 + +PeleLMeX results can be found in [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#taylor-green-vortex-breakdown). diff --git a/Exec/RegTests/TaylorGreen/Readme.md b/Exec/RegTests/TaylorGreen/Readme.md index cbf22376..fcbc3736 100644 --- a/Exec/RegTests/TaylorGreen/Readme.md +++ b/Exec/RegTests/TaylorGreen/Readme.md @@ -2,7 +2,7 @@ This setup is one of the test problems outlined by [the High-Order CFD workshop](https://www.grc.nasa.gov/hiocfd/). -A complete description of the problem can be found +A complete description of the problem can be found [here](https://www.grc.nasa.gov/hiocfd/wp-content/uploads/sites/22/case_c3.3.pdf) and the reference data is found [here](https://www.grc.nasa.gov/wp-content/uploads/sites/22/C3.3_datafiles.zip). More @@ -15,7 +15,7 @@ To directly plot the evolution of integrated kinetic energy and enstrophy, use the data provided in temporals/tempState with the help of the processTGdata.py script. -Note that these commands provide adimentional results, with t\* = t/(L\_0/V\_0), +Note that these commands provide dimensional results, with t\* = t/(L\_0/V\_0), E\_k\* = E\_k / ( rho\_0 * V\_0 * V\_0) and psi\* = psi / (V\_0/L\_0)^2 -PeleLMeX results can be found in [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#taylor-green-vortex-breakdown). +PeleLMeX results can be found [here](https://amrex-combustion.github.io/PeleLMeX/manual/html/Validation.html#taylor-green-vortex-breakdown). diff --git a/README.md b/README.md index 910d12d5..5ec903e7 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ ## Overview *PeleLMeX* is a solver for high fidelity reactive flow simulations, namely direct numerical simulation (DNS) and large eddy simulation (LES). -The solver combines a low Mach number approach, adaptive mesh refinement (AMR) and high performance computing (HPC) to provide +The solver combines a low Mach number approach, adaptive mesh refinement (AMR), embedded boundary (EB) geometry treatment and high performance +computing (HPC) to provide a flexible tool to address research questions on platforms ranging from small workstations to the world's largest GPU-accelerated supercomputers. *PeleLMeX* is part of the [Pele combustion Suite](https://amrex-combustion.github.io/). @@ -26,6 +27,9 @@ a flexible tool to address research questions on platforms ranging from small wo solver [incflo](https://github.com/AMReX-Codes/incflo). It solves of the multispecies reactive Navier-Stokes equations in the low Mach number limit as described in the [documentation](https://amrex-combustion.github.io/PeleLMeX/manual/html/index.html). It inherits most of *PeleLM* algorithmic features, but differs significantly in its implementation stemming from the non-subcycling approach. +*PeleLM* is no longer under active development; *PeleLMeX* should be used for simulations of low Mach number reacting flows and +[*PeleC*](https://github.com/AMReX-Combustion/PeleC) for simulations of flows with higher Mach numbers where compressibility effects are +significant. A overview of *PeleLMeX* controls is provided in the [documentation](https://amrex-combustion.github.io/PeleLMeX/manual/html/LMeXControls.html). @@ -59,16 +63,16 @@ Finally, when building with GPU support, CUDA >= 11 is required with NVIDIA GPUs ### Download -The prefered method consist in cloning the *PeleLMeX* and its submodules using a recursive `git clone`: -([amrex](https://github.com/AMReX-Codes/amrex), [AMReX-Hydro](https://github.com/AMReX-Codes/AMReX-Hydro), [PelePhysics](https://github.com/AMReX-Combustion/PelePhysics), [PeleMP](https://github.com/AMReX-Combustion/PeleMP)), and [SUNDIALS](https://github.com/LLNL/sundials) using: +The prefered method consists of cloning *PeleLMeX* and its submodules +([amrex](https://github.com/AMReX-Codes/amrex), [AMReX-Hydro](https://github.com/AMReX-Codes/AMReX-Hydro), [PelePhysics](https://github.com/AMReX-Combustion/PelePhysics), [PeleMP](https://github.com/AMReX-Combustion/PeleMP)), and [SUNDIALS](https://github.com/LLNL/sundials) using a recursive `git clone`: ``` git clone --recursive https://github.com/AMReX-Combustion/PeleLMeX.git ``` -Alternatively, you can use separate `git clone` of the each of the submodules. +Alternatively, you can use a separate `git clone` of the each of the submodules. The default location for *PeleLMeX* dependencies is the `Submodules` folder but you optionnally -setup the following environment variables (e.g. using bash) to an other location: +setup the following environment variables (e.g. using bash) to any other location: ``` export PELELMEX_HOME= @@ -94,7 +98,7 @@ cd PeleLMeX/Exec/RegTests/HotBubble If this is a clean install, you will need to make the third party libraries with: `make TPL` (note: if on macOS, you might need to specify `COMP=llvm` in the `make` statements). -Finally, make with: `make -j`, or if on macOS: `make -j COMP=llvm`. To clean the installation, use either `make clean` or `make realclean`. If running into compile errors after changing compile time options in PeleLMeX (e.g., the chemical mechanism), the first thing to try is to clean your build by running `make TPLrealclean && make realclean`, then try to rebuild the third party libraries and PeleLMeX with `make TPL && make -j`. +Finally, make with: `make -j`, or if on macOS: `make -j COMP=llvm`. To clean the installation, use either `make clean` or `make realclean`. If running into compile errors after changing compile time options in PeleLMeX (e.g., the chemical mechanism), the first thing to try is to clean your build by running `make TPLrealclean && make realclean`, then try to rebuild the third party libraries and PeleLMeX with `make TPL && make -j`. See the [Tutorial](https://amrex-combustion.github.io/PeleLMeX/manual/html/Tutorials_HotBubble.html) for this case for instructions on how to compile with different options (for example, to compile without MPI support or to compile for GPUs) and how to run the code once compiled. When using CMake (cmake version >= 3.23 is required), first configure CMake directly in *PeleLMeX* root folder: @@ -111,7 +115,10 @@ cmake --build buildHotBubble --parallel 4 ## Getting help, contributing Do you have a question ? Found an issue ? Please use the [GitHub Discussions](https://github.com/AMReX-Combustion/PeleLMeX/discussions) to engage -with the development team or open a new [GitHub issue](https://github.com/AMReX-Combustion/PeleLMeX/issues) to report a bug. +with the development team or open a new [GitHub issue](https://github.com/AMReX-Combustion/PeleLMeX/issues) to report a bug. The developmemt team +also encourages users to take an active role in respectfully answering each other's questions in these spaces. When reporting a bug, it is helpful +to provide as much detail as possible, including a case description and the major compile and runtime options being used. Though not required, +it is most effective to create a fork of this repository and share a branch of that fork with a case that minimally reproduces the error. New contributions to *PeleLMeX* are welcome ! Contributing Guidelines are provided in [CONTRIBUTING.md](CONTRIBUTING.md). From 0eddfa3a70658ae7b1d08e946eaf9251f64a5f44 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Wed, 30 Aug 2023 22:24:13 +0200 Subject: [PATCH 17/18] One less typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ec903e7..361c8d17 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ The prefered method consists of cloning *PeleLMeX* and its submodules git clone --recursive https://github.com/AMReX-Combustion/PeleLMeX.git ``` -Alternatively, you can use a separate `git clone` of the each of the submodules. +Alternatively, you can use a separate `git clone` of each of the submodules. The default location for *PeleLMeX* dependencies is the `Submodules` folder but you optionnally setup the following environment variables (e.g. using bash) to any other location: From d1b97adc231415bd329bb8e93618e4248f7c9bc2 Mon Sep 17 00:00:00 2001 From: Lucas Esclapez Date: Wed, 13 Sep 2023 22:24:22 +0200 Subject: [PATCH 18/18] Add a couple of examples of PeleLMeX application to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 361c8d17..aedc5110 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ The solver combines a low Mach number approach, adaptive mesh refinement (AMR), embedded boundary (EB) geometry treatment and high performance computing (HPC) to provide a flexible tool to address research questions on platforms ranging from small workstations to the world's largest GPU-accelerated supercomputers. +*PeleLMeX* has been used to study complex flame/turbulence interactions in [RCCI engines](https://gfm.aps.org/meetings/dfd-2022/63236765199e4c2c0873f9f6) and +[hydrogen combustion](https://www.sciencedirect.com/science/article/pii/S001021802300192X) or [the effect of sustainable aviation fuel +on gas turbine combustion](https://www.osti.gov/biblio/1995457). *PeleLMeX* is part of the [Pele combustion Suite](https://amrex-combustion.github.io/).