From 59da3d2e6697689c50d32b9cba6aebf1a73686ce Mon Sep 17 00:00:00 2001 From: "Dustin (Ting-Hsuan) Ma" Date: Wed, 10 Jul 2024 11:10:17 -0700 Subject: [PATCH] Turbulent inflow generation (patch) (#1665) * Generalized size of boxes. Start implementing CPB. Still need user input + .rst documentation * Added my own folder in Exec, ABL_perturbation_inflow * Generalized BPM so it can transform into CPM. Added more user input variables. Renamed BPM and CPM tags to source and direct to keep neutrality. Need to add Ec, tp, and cell_data equations for direction add. * manually got rid of tabs * added in calc_tpi_meanMag_firstCell() function and direct field add within TimeIntegration/ERF_Advance.cpp for CPM cases. Need to implement options to swap back and forth on use side between BPM and CPM. Switch gear and start runtime optimization. * amr.v=0 helps with runtime. Added random numbers for PB_intervals. Added outputs for PB_amplitude/PB_updateTime in seperate file when erf.v=1. Need to find a good way to generalize amplitude. Currently breaks code when amplitude is too large. CONTINUE with CPM debug, fast_rhs_fun debug with PB, and documentation with .rst file. * Fixed CUDA private member issue. CONTINUE with CPM debug, fast_rhs_fun debug with PB, and documentation with .rst file * Added output format into file + verbose tags. Fixed parallel issue of boxes. Added in perturbation inflow .rst documents. CONTINUE with CPM debug, fast_rhs_fun debug with PB. * Added output format into file + verbose tags. Fixed parallel issue of boxes. Added in perturbation inflow .rst documents. CONTINUE with CPM debug, fast_rhs_fun debug with PB. * Get rid of trailing white space. Added output format into file + verbose tags. Fixed parallel issue of boxes. Added in perturbation inflow .rst documents. CONTINUE with CPM debug, fast_rhs_fun debug with PB. * update DOI links for build-and-deploy fail test. * 404 Client Error: Not Found for url error fix. * 404 Client Error: Not Found for url error fix. * 404 Client Error: Not Found for url error fix. * Error 403 with Munoz-Esparza 2015 paper. Last attempt * Added in perturbation inflow .rst documents. CONTINUE with pb tests. Currently blows up after 1st update interval. * fix for doc push * manual rerun for DOI link in docs * link replacement for syntax error * manual check for munoz link * what is going on with these links? * using link I know that works * testing DeLeon link * DeLeon: maybe it's a syntax error? * DeLeon: Trying the other way of linking * maybe special character problem? * commented out links to DeLeon et al. (2018), and Munoz-Esparza et al. (2015). DOI links return Erorror 403, actual link returns Error 404. * testing perturbation inflow method, qualitativly for now * Added trigger tags for PBM in ERF.cpp. This should fix compile error in workflow. * Document update * resolved erroneous error with pseduo gravity (ignores scales with mechancial perturbation) * resolved erroneous error with pseduo gravity (ignores scales with mechancial perturbation) * updating PR * fixing codespell --------- Co-authored-by: Ting-Hsuan (Dustin) Ma --- Docs/sphinx_doc/BoundaryConditions.rst | 122 ++++++ Docs/sphinx_doc/figures/PBIllustration.png | Bin 0 -> 65947 bytes .../ABL_perturbation_inflow/CMakeLists.txt | 12 + .../ABL_perturbation_inflow/GNUmakefile | 34 ++ .../ABL_perturbation_inflow/Make.package | 2 + Exec/DevTests/ABL_perturbation_inflow/README | 7 + .../input_ReTau2000Ana_sounding.txt | 34 ++ .../input_ReTau2000Ana_sponge.txt | 33 ++ .../input_ReTau2000DNS_sounding.txt | 386 +++++++++++++++++ .../input_ReTau2000DNS_sponge.txt | 384 +++++++++++++++++ Exec/DevTests/ABL_perturbation_inflow/prob.H | 84 ++++ .../DevTests/ABL_perturbation_inflow/prob.cpp | 199 +++++++++ .../ABL_perturbation_inflow/sourceRun.sh | 1 + .../ABL_perturbation_inflow/toc_inout_inputs | 96 +++++ Exec/SpongeTest/inputs_sponge_test | 2 +- Source/DataStructs/DataStruct.H | 19 +- Source/DataStructs/TurbPertStruct.H | 397 ++++++++++++------ Source/ERF.H | 2 +- Source/ERF.cpp | 23 +- Source/ERF_make_new_arrays.cpp | 4 +- Source/Initialization/ERF_init_TurbPert.cpp | 32 +- Source/SourceTerms/ERF_make_sources.cpp | 8 +- Source/TimeIntegration/ERF_Advance.cpp | 26 +- Source/prob_common.H | 10 - 24 files changed, 1719 insertions(+), 198 deletions(-) create mode 100644 Docs/sphinx_doc/figures/PBIllustration.png create mode 100644 Exec/DevTests/ABL_perturbation_inflow/CMakeLists.txt create mode 100644 Exec/DevTests/ABL_perturbation_inflow/GNUmakefile create mode 100644 Exec/DevTests/ABL_perturbation_inflow/Make.package create mode 100644 Exec/DevTests/ABL_perturbation_inflow/README create mode 100644 Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sounding.txt create mode 100644 Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sponge.txt create mode 100644 Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sounding.txt create mode 100644 Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sponge.txt create mode 100644 Exec/DevTests/ABL_perturbation_inflow/prob.H create mode 100644 Exec/DevTests/ABL_perturbation_inflow/prob.cpp create mode 100644 Exec/DevTests/ABL_perturbation_inflow/sourceRun.sh create mode 100644 Exec/DevTests/ABL_perturbation_inflow/toc_inout_inputs diff --git a/Docs/sphinx_doc/BoundaryConditions.rst b/Docs/sphinx_doc/BoundaryConditions.rst index 5df9d59ae..b0f35a023 100644 --- a/Docs/sphinx_doc/BoundaryConditions.rst +++ b/Docs/sphinx_doc/BoundaryConditions.rst @@ -226,3 +226,125 @@ The sponge data is input as a text file with 3 columns containing :math:`z, u, v erf.sponge_strength = 1000.0 erf.use_xlo_sponge_damping = true erf.xlo_sponge_end = 4.0 + +Inflow turbulence generation +--------------------------- + +ERF provides the capability to apply a perturbation zone at the inflow domain boundary to mechanically trip turbulence into the domain. + +.. |PBinflw| image:: figures/PBIllustration.png + :width: 600 + +.. _fig:pb_fig: + +.. table:: Box perturbation method + + +-----------------------------------------------------+ + | |PBinflw| | + +-----------------------------------------------------+ + | Image taken from `DeLeon et al. (2018)` | + +-----------------------------------------------------+ + +Two different types of perturbation are currently available, ``source``, adopted from `DeLeon et al. (2018)`_ + +.. + _`DeLeon et al. (2018)`: https://doi.org/10.2514/1.J057245 + +and ``direct``, adopted from `Munoz-Esparza et al. (2015)`_. The ``source`` option applies the perturbation amplitude range, `\pm \Phi_{PB}`, to each cell within the perturbation box as a source term. It's important to note that while this perturbation starts as white noise, it becomes colored noise due to the eddy viscosity turbulence closure. Conversely, the ``direct`` option applies the calculated temperature difference directly onto the `\rho \theta field`. + +The current implementation only supports West and South face perturbations, specified by ``erf.perturbation_direction``, where the 3 integer inputs represent the `x`, `y`, and `z` directions, respectively. The flow perturbation method requires the dimensions of an individual box input through ``erf.perturbation_box_dim``, with 3 integer inputs representing `nx_{pb}`, `ny_{pb}`, and `nz_{pb}`, respectively. Following the guidance of `Ma and Senocak (2023)`_, + +.. _`Ma and Senocak (2023)`: https://link.springer.com/article/10.1007/s10546-023-00786-1 + +the general rule of thumb is to use `H_{PB} = 1/8 \delta` as the height of the perturbation box, where `\delta` is the boundary layer height. The length of the box in the x-direction should be `L_{PB} = 2H_{PB}`. Depending on the direction of the bulk flow, the width of the box in the y-direction should be defined as `W_{PB} = L_{PB} \tan{\theta_{inflow}}`. Note that the current implementation only accepts ``int`` entries. Therefore, considering the domain size and mesh resolution, the dimensions of a singular box can be determined. + +The specification of the number of layers and the offset into the domain of the perturbation boxes can be made through ``erf.perturbation_layers`` and ``erf.perturbation_offset``, respectively. + +:: + + erf.inlet_perturbation_type = "source" + + erf.perturbation_direction = 1 0 0 + erf.perturbation_box_dims = 8 8 4 + erf.perturbation_layers = 3 + erf.perturbation_offset = 1 + + erf.perturbation_nondimensional = 0.042 + erf.perturbation_T_infinity = 300.0 + erf.perturbation_T_intensity = 0.1 + +Before delving into the details, it's important to note that the two methods are interchangeable. While we adhere to the guidelines from the referenced publications, the use of ``direct`` type forcing is not restricted to having unity cell height, nor is ``source`` type forcing limited to boxes. We have generalized the perturbation methods to allow for flexibility in mixing and matching different types of turbulence generation. + +Source type forcing +------------------- + +The perturbation update interval is determined by the equation, + +.. math:: + + \frac{t_p \langle U(z) \rangle_{PB}}{D_{PB}} = 1, + +The change in the perturbation is defined as, + +.. math:: + + {Ri}_{PB} = \frac{g \beta \Delta \overline{\phi} H_{PB}}{{\langle U(z) \rangle}^2_{PB}}. + +The magnitude of the perturbation, ignoring the advection and diffusion effects in the transport equation can be made through a proportionality ratio between the update time and change in the box temperature, + +.. math:: + + \Phi_{PB} \propto \frac{\Delta \overliner{\phi}}{t_p} + +and the perturbation amplitude is determined by the equation, + +.. math:: + + \Phi_{PB} = \frac{Ri_{PB} {\langle U(z) \rangle}^3_{PB}}{g \beta D_{PB} H_{PB}}. + +The ``source`` type forcing can adopt the box perturbation method by having the following inputs list. + +:: + + erf.inlet_perturbation_type = "source" + + erf.perturbation_direction = 1 0 0 + erf.perturbation_box_dims = 8 8 4 + erf.perturbation_layers = 3 + erf.perturbation_offset = 1 + + erf.perturbation_nondimensional = 0.042 # Ri + erf.perturbation_T_infinity = 300.0 + erf.perturbation_T_intensity = 0.1 + +Direct type forcing +------------------- + +The perturbation update interval is determined by the equation, +.. math:: + + \frac{t_p U_{1}}{d_{c}} + +and the perturbation amplitude is determined by the equation, +.. math:: + + Ec = \frac{{U_g}^2}{\rho c_p \theta_{pm}}. + +The ``direct`` type forcing can adopt the cell perturbation method by having the following inputs list. +:: + + erf.inlet_perturbation_type = "direct" + + erf.perturbation_direction = 1 0 0 + erf.perturbation_box_dims = 8 8 1 + erf.perturbation_layers = 3 + erf.perturbation_offset = 1 + + erf.perturbation_nondimensional = 0.16 #Ec + erf.perturbation_rho_0 = 1.0 + erf.perturbation_cp = 1250 + +From `Munoz-Esparza et al. (2015)`_ the choice of the Eckert number is 0.16. + +.. + _`Munoz-Esparza et al. (2015)`: https://doi.org/10.1063/1.4913572 diff --git a/Docs/sphinx_doc/figures/PBIllustration.png b/Docs/sphinx_doc/figures/PBIllustration.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc4785b2fc5950725bb851f2e9ebef6aa9eb2d2 GIT binary patch literal 65947 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 G^Zy5Gyu2s? literal 0 HcmV?d00001 diff --git a/Exec/DevTests/ABL_perturbation_inflow/CMakeLists.txt b/Exec/DevTests/ABL_perturbation_inflow/CMakeLists.txt new file mode 100644 index 000000000..b3e8f8137 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/CMakeLists.txt @@ -0,0 +1,12 @@ +set(erf_exe_name erf_abl_perturbation_inflow) + +add_executable(${erf_exe_name} "") +target_sources(${erf_exe_name} + PRIVATE + prob.cpp +) + +target_include_directories(${erf_exe_name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +include(${CMAKE_SOURCE_DIR}/CMake/BuildERFExe.cmake) +build_erf_exe(${erf_exe_name}) diff --git a/Exec/DevTests/ABL_perturbation_inflow/GNUmakefile b/Exec/DevTests/ABL_perturbation_inflow/GNUmakefile new file mode 100644 index 000000000..b7ba1b593 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/GNUmakefile @@ -0,0 +1,34 @@ +# AMReX +COMP = gnu +PRECISION = DOUBLE + +# Profiling +PROFILE = FALSE +TINY_PROFILE = TRUE +COMM_PROFILE = FALSE +TRACE_PROFILE = FALSE +MEM_PROFILE = FALSE +USE_GPROF = FALSE + +# Performance +USE_MPI = TRUE +USE_OMP = FALSE + +USE_CUDA = FALSE +USE_HIP = FALSE +USE_SYCL = FALSE + +# Debugging +DEBUG = TRUE + +TEST = TRUE +USE_ASSERTION = TRUE + +#USE_POISSON_SOLVE = TRUE + +# GNU Make +Bpack := ./Make.package +Blocs := . +ERF_HOME := ../../.. +ERF_PROBLEM_DIR = $(ERF_HOME)/Exec/DevTests/ABL_perturbation_inflow +include $(ERF_HOME)/Exec/Make.ERF diff --git a/Exec/DevTests/ABL_perturbation_inflow/Make.package b/Exec/DevTests/ABL_perturbation_inflow/Make.package new file mode 100644 index 000000000..aeacb72f0 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/Make.package @@ -0,0 +1,2 @@ +CEXE_headers += prob.H +CEXE_sources += prob.cpp diff --git a/Exec/DevTests/ABL_perturbation_inflow/README b/Exec/DevTests/ABL_perturbation_inflow/README new file mode 100644 index 000000000..e21611c62 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/README @@ -0,0 +1,7 @@ +This problem setup is for simulation of the Atmospheric Boundary Layer (ABL) +using one of two turbulence schemes (Smagorinsky or Deardorff) and the bottom +boundary condition possibly specified by Monin Obukhov Similarity Theory (MOST). + +This version of the ABL problem initializes the data from an input sounding file, +and initializes turbulence at the inflow. The target is to transition turbulence +from coarse to fine grid interface. diff --git a/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sounding.txt b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sounding.txt new file mode 100644 index 000000000..00b7274fc --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sounding.txt @@ -0,0 +1,34 @@ +0.0 300.0 0.0 +1.00000000e-02 3.00000000e+02 0.00000000e+00 1.25066641e+01 0.00000000e+00 +3.22187500e-01 3.00000000e+02 0.00000000e+00 2.09762948e+01 0.00000000e+00 +6.34375000e-01 3.00000000e+02 0.00000000e+00 2.26287499e+01 0.00000000e+00 +9.46562500e-01 3.00000000e+02 0.00000000e+00 2.36048395e+01 0.00000000e+00 +1.25875000e+00 3.00000000e+02 0.00000000e+00 2.43000527e+01 0.00000000e+00 +1.57093750e+00 3.00000000e+02 0.00000000e+00 2.48404269e+01 0.00000000e+00 +1.88312500e+00 3.00000000e+02 0.00000000e+00 2.52825246e+01 0.00000000e+00 +2.19531250e+00 3.00000000e+02 0.00000000e+00 2.56566509e+01 0.00000000e+00 +2.50750000e+00 3.00000000e+02 0.00000000e+00 2.59809480e+01 0.00000000e+00 +2.81968750e+00 3.00000000e+02 0.00000000e+00 2.62671427e+01 0.00000000e+00 +3.13187500e+00 3.00000000e+02 0.00000000e+00 2.65232545e+01 0.00000000e+00 +3.44406250e+00 3.00000000e+02 0.00000000e+00 2.67550102e+01 0.00000000e+00 +3.75625000e+00 3.00000000e+02 0.00000000e+00 2.69666429e+01 0.00000000e+00 +4.06843750e+00 3.00000000e+02 0.00000000e+00 2.71613695e+01 0.00000000e+00 +4.38062500e+00 3.00000000e+02 0.00000000e+00 2.73416924e+01 0.00000000e+00 +4.69281250e+00 3.00000000e+02 0.00000000e+00 2.75095964e+01 0.00000000e+00 +5.00500000e+00 3.00000000e+02 0.00000000e+00 2.76666826e+01 0.00000000e+00 +5.31718750e+00 3.00000000e+02 0.00000000e+00 2.78142609e+01 0.00000000e+00 +5.62937500e+00 3.00000000e+02 0.00000000e+00 2.79534168e+01 0.00000000e+00 +5.94156250e+00 3.00000000e+02 0.00000000e+00 2.80850600e+01 0.00000000e+00 +6.25375000e+00 3.00000000e+02 0.00000000e+00 2.82099603e+01 0.00000000e+00 +6.56593750e+00 3.00000000e+02 0.00000000e+00 2.83287750e+01 0.00000000e+00 +6.87812500e+00 3.00000000e+02 0.00000000e+00 2.84420696e+01 0.00000000e+00 +7.19031250e+00 3.00000000e+02 0.00000000e+00 2.85503344e+01 0.00000000e+00 +7.50250000e+00 3.00000000e+02 0.00000000e+00 2.86539970e+01 0.00000000e+00 +7.81468750e+00 3.00000000e+02 0.00000000e+00 2.87534328e+01 0.00000000e+00 +8.12687500e+00 3.00000000e+02 0.00000000e+00 2.88489730e+01 0.00000000e+00 +8.43906250e+00 3.00000000e+02 0.00000000e+00 2.89409114e+01 0.00000000e+00 +8.75125000e+00 3.00000000e+02 0.00000000e+00 2.90295098e+01 0.00000000e+00 +9.06343750e+00 3.00000000e+02 0.00000000e+00 2.91150023e+01 0.00000000e+00 +9.37562500e+00 3.00000000e+02 0.00000000e+00 2.91975993e+01 0.00000000e+00 +9.68781250e+00 3.00000000e+02 0.00000000e+00 2.92774905e+01 0.00000000e+00 +1.00000000e+01 3.00000000e+02 0.00000000e+00 2.93548477e+01 0.00000000e+00 diff --git a/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sponge.txt b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sponge.txt new file mode 100644 index 000000000..f6c50f044 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000Ana_sponge.txt @@ -0,0 +1,33 @@ +1.00000000e-02 1.25066641e+01 0.00000000e+00 +3.22187500e-01 2.09762948e+01 0.00000000e+00 +6.34375000e-01 2.26287499e+01 0.00000000e+00 +9.46562500e-01 2.36048395e+01 0.00000000e+00 +1.25875000e+00 2.43000527e+01 0.00000000e+00 +1.57093750e+00 2.48404269e+01 0.00000000e+00 +1.88312500e+00 2.52825246e+01 0.00000000e+00 +2.19531250e+00 2.56566509e+01 0.00000000e+00 +2.50750000e+00 2.59809480e+01 0.00000000e+00 +2.81968750e+00 2.62671427e+01 0.00000000e+00 +3.13187500e+00 2.65232545e+01 0.00000000e+00 +3.44406250e+00 2.67550102e+01 0.00000000e+00 +3.75625000e+00 2.69666429e+01 0.00000000e+00 +4.06843750e+00 2.71613695e+01 0.00000000e+00 +4.38062500e+00 2.73416924e+01 0.00000000e+00 +4.69281250e+00 2.75095964e+01 0.00000000e+00 +5.00500000e+00 2.76666826e+01 0.00000000e+00 +5.31718750e+00 2.78142609e+01 0.00000000e+00 +5.62937500e+00 2.79534168e+01 0.00000000e+00 +5.94156250e+00 2.80850600e+01 0.00000000e+00 +6.25375000e+00 2.82099603e+01 0.00000000e+00 +6.56593750e+00 2.83287750e+01 0.00000000e+00 +6.87812500e+00 2.84420696e+01 0.00000000e+00 +7.19031250e+00 2.85503344e+01 0.00000000e+00 +7.50250000e+00 2.86539970e+01 0.00000000e+00 +7.81468750e+00 2.87534328e+01 0.00000000e+00 +8.12687500e+00 2.88489730e+01 0.00000000e+00 +8.43906250e+00 2.89409114e+01 0.00000000e+00 +8.75125000e+00 2.90295098e+01 0.00000000e+00 +9.06343750e+00 2.91150023e+01 0.00000000e+00 +9.37562500e+00 2.91975993e+01 0.00000000e+00 +9.68781250e+00 2.92774905e+01 0.00000000e+00 +1.00000000e+01 2.93548477e+01 0.00000000e+00 diff --git a/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sounding.txt b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sounding.txt new file mode 100644 index 000000000..ea1cf6cc4 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sounding.txt @@ -0,0 +1,386 @@ +0.0 300.0 0.0 0.0 0.0 +0.0 300.0 0.0 0.0 0.0 +1.217311652923492e-06 300.0 0.0 0.00011140613491415374 0.0 +6.086537518545931e-06 300.0 0.0 0.0005570274195276387 0.0 +1.704221791976046e-05 300.0 0.0 0.001559660241516003 0.0 +3.651878945154508e-05 300.0 0.0 0.0033420734502807845 0.0 +6.69505434929274e-05 300.0 0.0 0.0061269859333703105 0.0 +0.0001107715847206148 300.0 0.0 0.010137027830325164 0.0 +0.0001704157896263991 300.0 0.0 0.015594654328461917 0.0 +0.0002470994533848581 300.0 0.0 0.022610560551618166 0.0 +0.0003408212691252688 300.0 0.0 0.03118329599615294 0.0 +0.0004515796396062921 300.0 0.0 0.041309855577899 0.0 +0.000579372677243728 300.0 0.0 0.05298424056514345 0.0 +0.0007241982041420458 300.0 0.0 0.0661951414700109 0.0 +0.0008860537521320211 300.0 0.0 0.08092253985409509 0.0 +0.001064936562812813 300.0 0.0 0.0971331738653471 0.0 +0.001260843587598481 300.0 0.0 0.11477508395784822 0.0 +0.001473771487770281 300.0 0.0 0.1337718182129991 0.0 +0.001703716634533836 300.0 0.0 0.15401723219797894 0.0 +0.001950675109080202 300.0 0.0 0.17537202560217383 0.0 +0.002214642702653591 300.0 0.0 0.19766309500502766 0.0 +0.002495614916622313 300.0 0.0 0.22068641020278618 0.0 +0.002793586962555827 300.0 0.0 0.24421351408048736 0.0 +0.003108553762306454 300.0 0.0 0.26800106528869905 0.0 +0.003440509948095416 300.0 0.0 0.2918022762175396 0.0 +0.003789449862605099 300.0 0.0 0.3153787887917496 0.0 +0.00415536755907453 300.0 0.0 0.33851153352152946 0.0 +0.00453825680140163 300.0 0.0 0.3610093985843633 0.0 +0.004938111064248796 300.0 0.0 0.38271499588213365 0.0 +0.005354923533154365 300.0 0.0 0.40350732369344205 0.0 +0.005788687104649082 300.0 0.0 0.42330157619153297 0.0 +0.006239394386376662 300.0 0.0 0.44204666394902753 0.0 +0.006707037697219698 300.0 0.0 0.45972116053418083 0.0 +0.007191609067431326 300.0 0.0 0.4763283937977089 0.0 +0.007693100238770012 300.0 0.0 0.4918913001425068 0.0 +0.008211502664641435 300.0 0.0 0.5064475077163358 0.0 +0.008746807510242927 300.0 0.0 0.5200449482275936 0.0 +0.00929900565271502 300.0 0.0 0.532738144371353 0.0 +0.009868087681296545 300.0 0.0 0.5445852012395845 0.0 +0.01045404389748472 300.0 0.0 0.5556454604448817 0.0 +0.01105686431520103 300.0 0.0 0.5659777499855595 0.0 +0.01167653866096097 300.0 0.0 0.5756391497457344 0.0 +0.01231305637404945 300.0 0.0 0.5846841826152349 0.0 +0.01296640660670023 300.0 0.0 0.5931643403160594 0.0 +0.01363657822428155 300.0 0.0 0.601127860670266 0.0 +0.01432355980548528 300.0 0.0 0.608619682139255 0.0 +0.01502733964252179 300.0 0.0 0.6156815050972786 0.0 +0.01574790574131968 300.0 0.0 0.6223518994969911 0.0 +0.01648524582172972 300.0 0.0 0.6286664134066627 0.0 +0.01723934731773447 300.0 0.0 0.6346576755798535 0.0 +0.01801019737766241 300.0 0.0 0.6403555190005279 0.0 +0.01879778286440703 300.0 0.0 0.6457871582543366 0.0 +0.0196020903556503 300.0 0.0 0.6509774062824263 0.0 +0.02042310614409193 300.0 0.0 0.6559488584319104 0.0 +0.02126081623768261 300.0 0.0 0.6607220139669816 0.0 +0.02211520635986297 300.0 0.0 0.6653154146337487 0.0 +0.02298626194980602 300.0 0.0 0.6697458361665584 0.0 +0.02387396816266618 300.0 0.0 0.6740284263030051 0.0 +0.02477830986983187 300.0 0.0 0.6781767885643138 0.0 +0.02569927165918329 300.0 0.0 0.6822031020398561 0.0 +0.02663683783535509 300.0 0.0 0.6861182708699223 0.0 +0.02759099242000418 300.0 0.0 0.6899320475117866 0.0 +0.0285617191520815 300.0 0.0 0.6936531306253383 0.0 +0.02954900148810957 300.0 0.0 0.697289274391367 0.0 +0.03055282260246439 300.0 0.0 0.700847418877707 0.0 +0.03157316538766197 300.0 0.0 0.7043338036947433 0.0 +0.03261001245465012 300.0 0.0 0.7077540244565094 0.0 +0.0336633461331044 300.0 0.0 0.7111130669920873 0.0 +0.03473314847172981 300.0 0.0 0.7144153223784735 0.0 +0.03581940123856664 300.0 0.0 0.7176645942914638 0.0 +0.03692208592130042 300.0 0.0 0.7208641757417564 0.0 +0.03804118372757859 300.0 0.0 0.7240170305590236 0.0 +0.03917667558532989 300.0 0.0 0.7271259207331257 0.0 +0.04032854214308979 300.0 0.0 0.7301934033701646 0.0 +0.04149676377033007 300.0 0.0 0.7332217993282111 0.0 +0.0426813205577935 300.0 0.0 0.7362131455439986 0.0 +0.04388219231783319 300.0 0.0 0.7391692003300155 0.0 +0.04509935858475644 300.0 0.0 0.7420914852425665 0.0 +0.04633279861517381 300.0 0.0 0.744981308448903 0.0 +0.04758249138835247 300.0 0.0 0.74783985979067 0.0 +0.04884841560657416 300.0 0.0 0.7506683169127073 0.0 +0.05013054969549879 300.0 0.0 0.7534677877241249 0.0 +0.05142887180453171 300.0 0.0 0.7562393057597661 0.0 +0.0527433598071958 300.0 0.0 0.7589839217504151 0.0 +0.05407399130150936 300.0 0.0 0.7617025776963112 0.0 +0.0554207436103672 300.0 0.0 0.7643960083517222 0.0 +0.05678359378192743 300.0 0.0 0.767064808851985 0.0 +0.05816251859000254 300.0 0.0 0.7697095126185458 0.0 +0.05955749453445514 300.0 0.0 0.7723306799775616 0.0 +0.06096849784159863 300.0 0.0 0.7749288729908923 0.0 +0.0623955044646024 300.0 0.0 0.7775045817819957 0.0 +0.06383849008390119 300.0 0.0 0.7800581798693501 0.0 +0.06529743010761013 300.0 0.0 0.7825899146693549 0.0 +0.06677229967194354 300.0 0.0 0.7851000034346878 0.0 +0.06826307364163875 300.0 0.0 0.7875887752508794 0.0 +0.06976972661038428 300.0 0.0 0.790056636442802 0.0 +0.0712922329012533 300.0 0.0 0.7925039470154007 0.0 +0.0728305665671406 300.0 0.0 0.7949310784150017 0.0 +0.07438470139120534 300.0 0.0 0.7973383740665354 0.0 +0.07595461088731725 300.0 0.0 0.7997261358672254 0.0 +0.07754026830050886 300.0 0.0 0.8020946171335985 0.0 +0.0791416466074305 300.0 0.0 0.8044440152994246 0.0 +0.0807587185168116 300.0 0.0 0.8067745510976451 0.0 +0.08239145646992563 300.0 0.0 0.8090864392710908 0.0 +0.08403983264105919 300.0 0.0 0.8113798275537744 0.0 +0.08570381893798718 300.0 0.0 0.813654862706185 0.0 +0.08738338700245085 300.0 0.0 0.8159117995712017 0.0 +0.08907850821064123 300.0 0.0 0.8181509403346153 0.0 +0.09078915367368723 300.0 0.0 0.8203726239021643 0.0 +0.09251529423814753 300.0 0.0 0.8225771840577804 0.0 +0.09425690048650792 300.0 0.0 0.8247648350590637 0.0 +0.09601394273768227 300.0 0.0 0.8269356358581906 0.0 +0.0977863910475184 300.0 0.0 0.8290896245193335 0.0 +0.09957421520930865 300.0 0.0 0.8312269522374758 0.0 +0.1013773847543044 300.0 0.0 0.8333478232877262 0.0 +0.1031958689522353 300.0 0.0 0.8354524834137913 0.0 +0.1050296368118336 300.0 0.0 0.8375412599030938 0.0 +0.1068786570813612 300.0 0.0 0.83961441959534 0.0 +0.1087428982491435 300.0 0.0 0.8416721966590038 0.0 +0.1106223285441054 300.0 0.0 0.8437149645893851 0.0 +0.1125169159363132 300.0 0.0 0.8457432801955882 0.0 +0.1144266281375207 300.0 0.0 0.8477577405258729 0.0 +0.1163514326017191 300.0 0.0 0.8497587019453117 0.0 +0.1182912965256916 300.0 0.0 0.8517462535964925 0.0 +0.1202461868495729 300.0 0.0 0.8537202567648244 0.0 +0.1222160702574122 300.0 0.0 0.8556805376195089 0.0 +0.1242009131777411 300.0 0.0 0.8576270567655011 0.0 +0.1262006817841457 300.0 0.0 0.859559855276432 0.0 +0.1282153419958432 300.0 0.0 0.8614790240461743 0.0 +0.1302448594782628 300.0 0.0 0.8633846225241005 0.0 +0.1322891996436305 300.0 0.0 0.8652767796685787 0.0 +0.1343483276515588 300.0 0.0 0.8671557758829654 0.0 +0.1364222084096405 300.0 0.0 0.8690219114218987 0.0 +0.1385108065740466 300.0 0.0 0.8708755751778129 0.0 +0.1406140865501285 300.0 0.0 0.8727171398583112 0.0 +0.1427320124930254 300.0 0.0 0.8745467195850641 0.0 +0.1448645483082741 300.0 0.0 0.8763643014488819 0.0 +0.1470116576524249 300.0 0.0 0.8781699758162448 0.0 +0.1491733039336606 300.0 0.0 0.8799639277618019 0.0 +0.1513494503124202 300.0 0.0 0.8817463985307787 0.0 +0.153540059702027 300.0 0.0 0.8835175714281407 0.0 +0.1557450947693203 300.0 0.0 0.8852774162205512 0.0 +0.1579645179352918 300.0 0.0 0.8870258409101626 0.0 +0.1601982913757256 300.0 0.0 0.8887628179088204 0.0 +0.1624463770218439 300.0 0.0 0.8904884475714206 0.0 +0.1647087365609547 300.0 0.0 0.8922029687521473 0.0 +0.1669853314371051 300.0 0.0 0.8939065997698805 0.0 +0.1692761228517385 300.0 0.0 0.8955993471359808 0.0 +0.1715810717643558 300.0 0.0 0.8972811995622746 0.0 +0.1739001388931806 300.0 0.0 0.8989524583382827 0.0 +0.1762332847158286 300.0 0.0 0.9006136088702439 0.0 +0.1785804694699815 300.0 0.0 0.9022650177404423 0.0 +0.1809416531540645 300.0 0.0 0.9039068724805179 0.0 +0.1833167955279277 300.0 0.0 0.9055391459871299 0.0 +0.1857058561135323 300.0 0.0 0.9071619216229164 0.0 +0.1881087941956401 300.0 0.0 0.9087754003620085 0.0 +0.1905255688225079 300.0 0.0 0.9103796430584327 0.0 +0.1929561388065848 300.0 0.0 0.911974726776834 0.0 +0.1954004627252144 300.0 0.0 0.9135606970140512 0.0 +0.197858498921341 300.0 0.0 0.9151376855427551 0.0 +0.200330205504219 300.0 0.0 0.9167059711207346 0.0 +0.2028155403501273 300.0 0.0 0.9182657846303789 0.0 +0.2053144611030869 300.0 0.0 0.9198173470853775 0.0 +0.207826925175583 300.0 0.0 0.9213609272334615 0.0 +0.2103528897492902 300.0 0.0 0.9228967515020714 0.0 +0.2128923117758034 300.0 0.0 0.9244247852399078 0.0 +0.2154451479773698 300.0 0.0 0.9259447467445927 0.0 +0.2180113548476281 300.0 0.0 0.9274563490254334 0.0 +0.2205908886523488 300.0 0.0 0.9289594592760015 0.0 +0.2231837054301802 300.0 0.0 0.9304542478509127 0.0 +0.225789760993397 300.0 0.0 0.9319412509979282 0.0 +0.2284090109286542 300.0 0.0 0.9334209418746512 0.0 +0.231041410597743 300.0 0.0 0.9348934405590973 0.0 +0.2336869151383524 300.0 0.0 0.9363587405745076 0.0 +0.2363454794648333 300.0 0.0 0.9378168765599467 0.0 +0.2390170582689671 300.0 0.0 0.9392678950487781 0.0 +0.2417016060207376 300.0 0.0 0.940711651065673 0.0 +0.2443990769691072 300.0 0.0 0.9421480922469726 0.0 +0.2471094251427964 300.0 0.0 0.9435771784982919 0.0 +0.2498326043510675 300.0 0.0 0.9449989788097755 0.0 +0.2525685681845112 300.0 0.0 0.9464136839308143 0.0 +0.2553172700158386 300.0 0.0 0.9478212946302264 0.0 +0.2580786630006749 300.0 0.0 0.9492217782573125 0.0 +0.260852700078358 300.0 0.0 0.9506151056434238 0.0 +0.2636393339727408 300.0 0.0 0.9520012477347317 0.0 +0.2664385171929963 300.0 0.0 0.9533803786785173 0.0 +0.2692502020344277 300.0 0.0 0.9547527257046486 0.0 +0.2720743405792809 300.0 0.0 0.9561184544824323 0.0 +0.2749108846975613 300.0 0.0 0.9574778239110496 0.0 +0.2777597860478538 300.0 0.0 0.9588310450011877 0.0 +0.2806209960781473 300.0 0.0 0.9601782292274886 0.0 +0.2834944660266612 300.0 0.0 0.9615193317258413 0.0 +0.2863801469226772 300.0 0.0 0.9628543117952431 0.0 +0.2892779895873737 300.0 0.0 0.9641832258074391 0.0 +0.2921879446346636 300.0 0.0 0.9655061102311662 0.0 +0.2951099624720362 300.0 0.0 0.9668230776449845 0.0 +0.2980439933014026 300.0 0.0 0.9681343864045031 0.0 +0.3009899871199438 300.0 0.0 0.9694402639247923 0.0 +0.3039478937209633 300.0 0.0 0.9707406583504683 0.0 +0.3069176626947427 300.0 0.0 0.9720353354914428 0.0 +0.3098992434294008 300.0 0.0 0.9733242700142486 0.0 +0.3128925851117559 300.0 0.0 0.9746078536245253 0.0 +0.315897636728192 300.0 0.0 0.9758863402151784 0.0 +0.3189143470655283 300.0 0.0 0.9771595088146999 0.0 +0.3219426647118918 300.0 0.0 0.9784272185083719 0.0 +0.3249825380575933 300.0 0.0 0.9796896634251465 0.0 +0.3280339152960073 300.0 0.0 0.9809470023963451 0.0 +0.331096744424455 300.0 0.0 0.9821991054488802 0.0 +0.3341709732450902 300.0 0.0 0.9834459085225121 0.0 +0.3372565493657887 300.0 0.0 0.9846875264424727 0.0 +0.340353420201042 300.0 0.0 0.9859240938340674 0.0 +0.3434615329728526 300.0 0.0 0.9871555114571253 0.0 +0.346580834711634 300.0 0.0 0.9883813577755736 0.0 +0.3497112722571132 300.0 0.0 0.9896015762012266 0.0 +0.3528527922592367 300.0 0.0 0.99081652702429 0.0 +0.35600534117908 300.0 0.0 0.9920262495184689 0.0 +0.3591688652897594 300.0 0.0 0.993230638256614 0.0 +0.3623433106773484 300.0 0.0 0.9944297593668414 0.0 +0.3655286232417957 300.0 0.0 0.9956237661357139 0.0 +0.368724748697848 300.0 0.0 0.9968125901403091 0.0 +0.3719316325759746 300.0 0.0 0.9979960986578006 0.0 +0.3751492202232959 300.0 0.0 0.9991743889398924 0.0 +0.3783774568045147 300.0 0.0 1.000347647126256 0.0 +0.3816162873028511 300.0 0.0 1.0015161551437557 0.0 +0.3848656565209795 300.0 0.0 1.0026802169912563 0.0 +0.3881255090819695 300.0 0.0 1.0038399040764108 0.0 +0.3913957894302302 300.0 0.0 1.0049953033517267 0.0 +0.3946764418324564 300.0 0.0 1.0061465436252042 0.0 +0.3979674103785783 300.0 0.0 1.0072934019273698 0.0 +0.4012686389827149 300.0 0.0 1.0084356583504384 0.0 +0.4045800713841297 300.0 0.0 1.0095733545366574 0.0 +0.407901651148189 300.0 0.0 1.0107065890036997 0.0 +0.4112333216673243 300.0 0.0 1.0118354965139098 0.0 +0.4145750261619968 300.0 0.0 1.0129604734335742 0.0 +0.417926707681665 300.0 0.0 1.01408193425014 0.0 +0.4212883091057552 300.0 0.0 1.0152001565281163 0.0 +0.4246597731446353 300.0 0.0 1.0163153568916408 0.0 +0.4280410423405908 300.0 0.0 1.0174277213201164 0.0 +0.4314320590688043 300.0 0.0 1.0185370504195503 0.0 +0.4348327655383372 300.0 0.0 1.019642798230917 0.0 +0.4382431037931148 300.0 0.0 1.0207446730023402 0.0 +0.4416630157129143 300.0 0.0 1.021842575607473 0.0 +0.4450924430143548 300.0 0.0 1.0229366924786005 0.0 +0.4485313272518908 300.0 0.0 1.0240272160718744 0.0 +0.4519796098188085 300.0 0.0 1.025114058909379 0.0 +0.4554372319482241 300.0 0.0 1.0261971221111332 0.0 +0.4589041347140854 300.0 0.0 1.0272764190152335 0.0 +0.4623802590321769 300.0 0.0 1.0283518990674234 0.0 +0.4658655456611256 300.0 0.0 1.0294234657645767 0.0 +0.4693599352034108 300.0 0.0 1.0304910509800187 0.0 +0.4728633681063773 300.0 0.0 1.0315544822130562 0.0 +0.4763757846632491 300.0 0.0 1.0326136853060508 0.0 +0.4798971250141478 300.0 0.0 1.0336686031996722 0.0 +0.4834273291471126 300.0 0.0 1.034719017484392 0.0 +0.4869663368991224 300.0 0.0 1.035764937541362 0.0 +0.4905140879571221 300.0 0.0 1.0368066522595223 0.0 +0.4940705218590499 300.0 0.0 1.0378444141311418 0.0 +0.4976355779948676 300.0 0.0 1.0388782948008106 0.0 +0.5012091956075939 300.0 0.0 1.0399083596192416 0.0 +0.5047913137943398 300.0 0.0 1.040934710480001 0.0 +0.5083818715073465 300.0 0.0 1.041957200670301 0.0 +0.5119808075550254 300.0 0.0 1.0429757432947437 0.0 +0.5155880606030014 300.0 0.0 1.0439903805785498 0.0 +0.5192035691751582 300.0 0.0 1.0450011270368005 0.0 +0.5228272716546859 300.0 0.0 1.0460078719393338 0.0 +0.5264591062851307 300.0 0.0 1.0470107647095013 0.0 +0.5300990111714481 300.0 0.0 1.0480101158827408 0.0 +0.5337469242810573 300.0 0.0 1.0490061315131571 0.0 +0.5374027834448982 300.0 0.0 1.049998911149802 0.0 +0.5410665263584914 300.0 0.0 1.050988243436124 0.0 +0.5447380905829997 300.0 0.0 1.0519738732048172 0.0 +0.5484174135462924 300.0 0.0 1.0529556094998889 0.0 +0.5521044325440113 300.0 0.0 1.0539333034248877 0.0 +0.5557990847406399 300.0 0.0 1.054906913979975 0.0 +0.5595013071705737 300.0 0.0 1.0558764699979581 0.0 +0.5632110367391936 300.0 0.0 1.056841953521945 0.0 +0.566928210223941 300.0 0.0 1.057803534098425 0.0 +0.5706527642753958 300.0 0.0 1.0587614606663196 0.0 +0.5743846354183553 300.0 0.0 1.059715828358481 0.0 +0.5781237600529161 300.0 0.0 1.0606665001402922 0.0 +0.5818700744555583 300.0 0.0 1.0616132130578062 0.0 +0.5856235147802317 300.0 0.0 1.0625558983662156 0.0 +0.5893840170594431 300.0 0.0 1.063494846560091 0.0 +0.593151517205347 300.0 0.0 1.0644299677355376 0.0 +0.5969259510108379 300.0 0.0 1.0653606677605645 0.0 +0.6007072541506442 300.0 0.0 1.0662864526398241 0.0 +0.6044953621824245 300.0 0.0 1.0672069239093953 0.0 +0.6082902105478664 300.0 0.0 1.068121706922733 0.0 +0.6120917345737857 300.0 0.0 1.069030475813776 0.0 +0.6158998694732298 300.0 0.0 1.0699332520359268 0.0 +0.6197145503465804 300.0 0.0 1.0708301957020576 0.0 +0.6235357121826612 300.0 0.0 1.0717213344748797 0.0 +0.6273632898598445 300.0 0.0 1.072606627668974 0.0 +0.6311972181471613 300.0 0.0 1.0734860402254864 0.0 +0.6350374317054138 300.0 0.0 1.0743596894671337 0.0 +0.6388838650882879 300.0 0.0 1.0752276615613787 0.0 +0.6427364527434689 300.0 0.0 1.0760898693822198 0.0 +0.6465951290137593 300.0 0.0 1.0769462024979783 0.0 +0.6504598281381966 300.0 0.0 1.0777966835969708 0.0 +0.6543304842531749 300.0 0.0 1.0786414776539237 0.0 +0.6582070313935672 300.0 0.0 1.0794807554297583 0.0 +0.6620894034938494 300.0 0.0 1.0803144862152758 0.0 +0.6659775343892262 300.0 0.0 1.081142405143407 0.0 +0.6698713578167591 300.0 0.0 1.0819642509990406 0.0 +0.6737708074164952 300.0 0.0 1.0827800011152235 0.0 +0.6776758167325982 300.0 0.0 1.0835897104066905 0.0 +0.6815863192144815 300.0 0.0 1.0843930466102056 0.0 +0.6855022482179417 300.0 0.0 1.0851894824968071 0.0 +0.6894235370062947 300.0 0.0 1.0859787166491295 0.0 +0.6933501187515128 300.0 0.0 1.0867605762402337 0.0 +0.6972819265353641 300.0 0.0 1.0875350056888133 0.0 +0.7012188933505527 300.0 0.0 1.0883021422398613 0.0 +0.7051609521018602 300.0 0.0 1.0890621688129631 0.0 +0.7091080356072901 300.0 0.0 1.0898151747391618 0.0 +0.7130600765992119 300.0 0.0 1.0905611944494604 0.0 +0.7170170077255077 300.0 0.0 1.091300148925149 0.0 +0.7209787615507204 300.0 0.0 1.0920320104138537 0.0 +0.7249452705572028 300.0 0.0 1.0927568538290762 0.0 +0.7289164671462678 300.0 0.0 1.093474536386571 0.0 +0.732892283639341 300.0 0.0 1.0941846803820647 0.0 +0.7368726522791142 300.0 0.0 1.0948868827183935 0.0 +0.7408575052306994 300.0 0.0 1.095580974770836 0.0 +0.7448467745827856 300.0 0.0 1.0962669184077736 0.0 +0.7488403923487958 300.0 0.0 1.0969446208084177 0.0 +0.752838290468046 300.0 0.0 1.0976139980965551 0.0 +0.7568404008069043 300.0 0.0 1.098275128126286 0.0 +0.7608466551599531 300.0 0.0 1.0989282183752769 0.0 +0.7648569852511511 300.0 0.0 1.099573232042445 0.0 +0.7688713227349963 300.0 0.0 1.1002099041468754 0.0 +0.7728895991976916 300.0 0.0 1.100837950306941 0.0 +0.7769117461583105 300.0 0.0 1.1014572806798282 0.0 +0.7809376950699636 300.0 0.0 1.102067985604749 0.0 +0.7849673773209678 300.0 0.0 1.1026700407295404 0.0 +0.7890007242360147 300.0 0.0 1.1032633577234505 0.0 +0.7930376670773416 300.0 0.0 1.1038476708187197 0.0 +0.7970781370459026 300.0 0.0 1.104422738022161 0.0 +0.8011220652825412 300.0 0.0 1.1049885353023232 0.0 +0.8051693828691638 300.0 0.0 1.1055448470037688 0.0 +0.8092200208299145 300.0 0.0 1.1060914642390087 0.0 +0.8132739101323502 300.0 0.0 1.106628350311339 0.0 +0.8173309816886172 300.0 0.0 1.107155376545416 0.0 +0.8213911663566287 300.0 0.0 1.1076723185689001 0.0 +0.8254543949412434 300.0 0.0 1.1081788222016578 0.0 +0.829520598195444 300.0 0.0 1.1086746368493074 0.0 +0.8335897068215181 300.0 0.0 1.109159813164577 0.0 +0.8376616514722389 300.0 0.0 1.10963459018341 0.0 +0.841736362752047 300.0 0.0 1.1100991076017594 0.0 +0.845813771218233 300.0 0.0 1.1105533754453123 0.0 +0.8498938073821211 300.0 0.0 1.1109972049947676 0.0 +0.8539764017102535 300.0 0.0 1.1114303392667393 0.0 +0.858061484625575 300.0 0.0 1.1118526704412035 0.0 +0.8621489865086192 300.0 0.0 1.1122641279560428 0.0 +0.8662388376986945 300.0 0.0 1.1126647084118235 0.0 +0.8703309684950719 300.0 0.0 1.1130543228625418 0.0 +0.8744253091581722 300.0 0.0 1.1134329177305022 0.0 +0.8785217899107551 300.0 0.0 1.1138005472542447 0.0 +0.8826203409391081 300.0 0.0 1.1141571709007685 0.0 +0.8867208923942361 300.0 0.0 1.1145026282029389 0.0 +0.8908233743930521 300.0 0.0 1.1148367835748216 0.0 +0.8949277170195682 300.0 0.0 1.1151596154780363 0.0 +0.8990338503260868 300.0 0.0 1.1154711733828995 0.0 +0.9031417043343931 300.0 0.0 1.1157713200263766 0.0 +0.9072512090369473 300.0 0.0 1.11605972508053 0.0 +0.9113622943980779 300.0 0.0 1.116336144189679 0.0 +0.9154748903551754 300.0 0.0 1.1166005500083394 0.0 +0.9195889268198859 300.0 0.0 1.1168529115709196 0.0 +0.923704333679306 300.0 0.0 1.1170930843004574 0.0 +0.9278210407971776 300.0 0.0 1.1173210208729007 0.0 +0.9319389780150831 300.0 0.0 1.117536637160364 0.0 +0.9360580751536409 300.0 0.0 1.1177398284033127 0.0 +0.9401782620137019 300.0 0.0 1.1179305881024477 0.0 +0.9442994683775454 300.0 0.0 1.1181089069629575 0.0 +0.9484216240100758 300.0 0.0 1.1182746876473275 0.0 +0.9525446586600201 300.0 0.0 1.1184277273200767 0.0 +0.9566685020611244 300.0 0.0 1.1185678673511346 0.0 +0.9607930839333522 300.0 0.0 1.1186951599682844 0.0 +0.964918333984081 300.0 0.0 1.1188096901542868 0.0 +0.9690441819093016 300.0 0.0 1.118911351122682 0.0 +0.9731705573948156 300.0 0.0 1.1190000308462351 0.0 +0.9772973901174332 300.0 0.0 1.119075791838296 0.0 +0.9814246097461727 300.0 0.0 1.1191387316178165 0.0 +0.9855521459434584 300.0 0.0 1.1191889672245374 0.0 +0.9896799283663196 300.0 0.0 1.1192266886822442 0.0 +0.9938078866675891 300.0 0.0 1.119251954837764 0.0 +0.9979359504971027 300.0 0.0 1.1192646414784726 0.0 +1.0 300.0 0.0 1.1192646414784726 0.0 diff --git a/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sponge.txt b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sponge.txt new file mode 100644 index 000000000..737895f86 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/input_ReTau2000DNS_sponge.txt @@ -0,0 +1,384 @@ +0.0 0.0 0.0 +1.217311652923492e-06 0.00011140613491415374 0.0 +6.086537518545931e-06 0.0005570274195276387 0.0 +1.704221791976046e-05 0.001559660241516003 0.0 +3.651878945154508e-05 0.0033420734502807845 0.0 +6.69505434929274e-05 0.0061269859333703105 0.0 +0.0001107715847206148 0.010137027830325164 0.0 +0.0001704157896263991 0.015594654328461917 0.0 +0.0002470994533848581 0.022610560551618166 0.0 +0.0003408212691252688 0.03118329599615294 0.0 +0.0004515796396062921 0.041309855577899 0.0 +0.000579372677243728 0.05298424056514345 0.0 +0.0007241982041420458 0.0661951414700109 0.0 +0.0008860537521320211 0.08092253985409509 0.0 +0.001064936562812813 0.0971331738653471 0.0 +0.001260843587598481 0.11477508395784822 0.0 +0.001473771487770281 0.1337718182129991 0.0 +0.001703716634533836 0.15401723219797894 0.0 +0.001950675109080202 0.17537202560217383 0.0 +0.002214642702653591 0.19766309500502766 0.0 +0.002495614916622313 0.22068641020278618 0.0 +0.002793586962555827 0.24421351408048736 0.0 +0.003108553762306454 0.26800106528869905 0.0 +0.003440509948095416 0.2918022762175396 0.0 +0.003789449862605099 0.3153787887917496 0.0 +0.00415536755907453 0.33851153352152946 0.0 +0.00453825680140163 0.3610093985843633 0.0 +0.004938111064248796 0.38271499588213365 0.0 +0.005354923533154365 0.40350732369344205 0.0 +0.005788687104649082 0.42330157619153297 0.0 +0.006239394386376662 0.44204666394902753 0.0 +0.006707037697219698 0.45972116053418083 0.0 +0.007191609067431326 0.4763283937977089 0.0 +0.007693100238770012 0.4918913001425068 0.0 +0.008211502664641435 0.5064475077163358 0.0 +0.008746807510242927 0.5200449482275936 0.0 +0.00929900565271502 0.532738144371353 0.0 +0.009868087681296545 0.5445852012395845 0.0 +0.01045404389748472 0.5556454604448817 0.0 +0.01105686431520103 0.5659777499855595 0.0 +0.01167653866096097 0.5756391497457344 0.0 +0.01231305637404945 0.5846841826152349 0.0 +0.01296640660670023 0.5931643403160594 0.0 +0.01363657822428155 0.601127860670266 0.0 +0.01432355980548528 0.608619682139255 0.0 +0.01502733964252179 0.6156815050972786 0.0 +0.01574790574131968 0.6223518994969911 0.0 +0.01648524582172972 0.6286664134066627 0.0 +0.01723934731773447 0.6346576755798535 0.0 +0.01801019737766241 0.6403555190005279 0.0 +0.01879778286440703 0.6457871582543366 0.0 +0.0196020903556503 0.6509774062824263 0.0 +0.02042310614409193 0.6559488584319104 0.0 +0.02126081623768261 0.6607220139669816 0.0 +0.02211520635986297 0.6653154146337487 0.0 +0.02298626194980602 0.6697458361665584 0.0 +0.02387396816266618 0.6740284263030051 0.0 +0.02477830986983187 0.6781767885643138 0.0 +0.02569927165918329 0.6822031020398561 0.0 +0.02663683783535509 0.6861182708699223 0.0 +0.02759099242000418 0.6899320475117866 0.0 +0.0285617191520815 0.6936531306253383 0.0 +0.02954900148810957 0.697289274391367 0.0 +0.03055282260246439 0.700847418877707 0.0 +0.03157316538766197 0.7043338036947433 0.0 +0.03261001245465012 0.7077540244565094 0.0 +0.0336633461331044 0.7111130669920873 0.0 +0.03473314847172981 0.7144153223784735 0.0 +0.03581940123856664 0.7176645942914638 0.0 +0.03692208592130042 0.7208641757417564 0.0 +0.03804118372757859 0.7240170305590236 0.0 +0.03917667558532989 0.7271259207331257 0.0 +0.04032854214308979 0.7301934033701646 0.0 +0.04149676377033007 0.7332217993282111 0.0 +0.0426813205577935 0.7362131455439986 0.0 +0.04388219231783319 0.7391692003300155 0.0 +0.04509935858475644 0.7420914852425665 0.0 +0.04633279861517381 0.744981308448903 0.0 +0.04758249138835247 0.74783985979067 0.0 +0.04884841560657416 0.7506683169127073 0.0 +0.05013054969549879 0.7534677877241249 0.0 +0.05142887180453171 0.7562393057597661 0.0 +0.0527433598071958 0.7589839217504151 0.0 +0.05407399130150936 0.7617025776963112 0.0 +0.0554207436103672 0.7643960083517222 0.0 +0.05678359378192743 0.767064808851985 0.0 +0.05816251859000254 0.7697095126185458 0.0 +0.05955749453445514 0.7723306799775616 0.0 +0.06096849784159863 0.7749288729908923 0.0 +0.0623955044646024 0.7775045817819957 0.0 +0.06383849008390119 0.7800581798693501 0.0 +0.06529743010761013 0.7825899146693549 0.0 +0.06677229967194354 0.7851000034346878 0.0 +0.06826307364163875 0.7875887752508794 0.0 +0.06976972661038428 0.790056636442802 0.0 +0.0712922329012533 0.7925039470154007 0.0 +0.0728305665671406 0.7949310784150017 0.0 +0.07438470139120534 0.7973383740665354 0.0 +0.07595461088731725 0.7997261358672254 0.0 +0.07754026830050886 0.8020946171335985 0.0 +0.0791416466074305 0.8044440152994246 0.0 +0.0807587185168116 0.8067745510976451 0.0 +0.08239145646992563 0.8090864392710908 0.0 +0.08403983264105919 0.8113798275537744 0.0 +0.08570381893798718 0.813654862706185 0.0 +0.08738338700245085 0.8159117995712017 0.0 +0.08907850821064123 0.8181509403346153 0.0 +0.09078915367368723 0.8203726239021643 0.0 +0.09251529423814753 0.8225771840577804 0.0 +0.09425690048650792 0.8247648350590637 0.0 +0.09601394273768227 0.8269356358581906 0.0 +0.0977863910475184 0.8290896245193335 0.0 +0.09957421520930865 0.8312269522374758 0.0 +0.1013773847543044 0.8333478232877262 0.0 +0.1031958689522353 0.8354524834137913 0.0 +0.1050296368118336 0.8375412599030938 0.0 +0.1068786570813612 0.83961441959534 0.0 +0.1087428982491435 0.8416721966590038 0.0 +0.1106223285441054 0.8437149645893851 0.0 +0.1125169159363132 0.8457432801955882 0.0 +0.1144266281375207 0.8477577405258729 0.0 +0.1163514326017191 0.8497587019453117 0.0 +0.1182912965256916 0.8517462535964925 0.0 +0.1202461868495729 0.8537202567648244 0.0 +0.1222160702574122 0.8556805376195089 0.0 +0.1242009131777411 0.8576270567655011 0.0 +0.1262006817841457 0.859559855276432 0.0 +0.1282153419958432 0.8614790240461743 0.0 +0.1302448594782628 0.8633846225241005 0.0 +0.1322891996436305 0.8652767796685787 0.0 +0.1343483276515588 0.8671557758829654 0.0 +0.1364222084096405 0.8690219114218987 0.0 +0.1385108065740466 0.8708755751778129 0.0 +0.1406140865501285 0.8727171398583112 0.0 +0.1427320124930254 0.8745467195850641 0.0 +0.1448645483082741 0.8763643014488819 0.0 +0.1470116576524249 0.8781699758162448 0.0 +0.1491733039336606 0.8799639277618019 0.0 +0.1513494503124202 0.8817463985307787 0.0 +0.153540059702027 0.8835175714281407 0.0 +0.1557450947693203 0.8852774162205512 0.0 +0.1579645179352918 0.8870258409101626 0.0 +0.1601982913757256 0.8887628179088204 0.0 +0.1624463770218439 0.8904884475714206 0.0 +0.1647087365609547 0.8922029687521473 0.0 +0.1669853314371051 0.8939065997698805 0.0 +0.1692761228517385 0.8955993471359808 0.0 +0.1715810717643558 0.8972811995622746 0.0 +0.1739001388931806 0.8989524583382827 0.0 +0.1762332847158286 0.9006136088702439 0.0 +0.1785804694699815 0.9022650177404423 0.0 +0.1809416531540645 0.9039068724805179 0.0 +0.1833167955279277 0.9055391459871299 0.0 +0.1857058561135323 0.9071619216229164 0.0 +0.1881087941956401 0.9087754003620085 0.0 +0.1905255688225079 0.9103796430584327 0.0 +0.1929561388065848 0.911974726776834 0.0 +0.1954004627252144 0.9135606970140512 0.0 +0.197858498921341 0.9151376855427551 0.0 +0.200330205504219 0.9167059711207346 0.0 +0.2028155403501273 0.9182657846303789 0.0 +0.2053144611030869 0.9198173470853775 0.0 +0.207826925175583 0.9213609272334615 0.0 +0.2103528897492902 0.9228967515020714 0.0 +0.2128923117758034 0.9244247852399078 0.0 +0.2154451479773698 0.9259447467445927 0.0 +0.2180113548476281 0.9274563490254334 0.0 +0.2205908886523488 0.9289594592760015 0.0 +0.2231837054301802 0.9304542478509127 0.0 +0.225789760993397 0.9319412509979282 0.0 +0.2284090109286542 0.9334209418746512 0.0 +0.231041410597743 0.9348934405590973 0.0 +0.2336869151383524 0.9363587405745076 0.0 +0.2363454794648333 0.9378168765599467 0.0 +0.2390170582689671 0.9392678950487781 0.0 +0.2417016060207376 0.940711651065673 0.0 +0.2443990769691072 0.9421480922469726 0.0 +0.2471094251427964 0.9435771784982919 0.0 +0.2498326043510675 0.9449989788097755 0.0 +0.2525685681845112 0.9464136839308143 0.0 +0.2553172700158386 0.9478212946302264 0.0 +0.2580786630006749 0.9492217782573125 0.0 +0.260852700078358 0.9506151056434238 0.0 +0.2636393339727408 0.9520012477347317 0.0 +0.2664385171929963 0.9533803786785173 0.0 +0.2692502020344277 0.9547527257046486 0.0 +0.2720743405792809 0.9561184544824323 0.0 +0.2749108846975613 0.9574778239110496 0.0 +0.2777597860478538 0.9588310450011877 0.0 +0.2806209960781473 0.9601782292274886 0.0 +0.2834944660266612 0.9615193317258413 0.0 +0.2863801469226772 0.9628543117952431 0.0 +0.2892779895873737 0.9641832258074391 0.0 +0.2921879446346636 0.9655061102311662 0.0 +0.2951099624720362 0.9668230776449845 0.0 +0.2980439933014026 0.9681343864045031 0.0 +0.3009899871199438 0.9694402639247923 0.0 +0.3039478937209633 0.9707406583504683 0.0 +0.3069176626947427 0.9720353354914428 0.0 +0.3098992434294008 0.9733242700142486 0.0 +0.3128925851117559 0.9746078536245253 0.0 +0.315897636728192 0.9758863402151784 0.0 +0.3189143470655283 0.9771595088146999 0.0 +0.3219426647118918 0.9784272185083719 0.0 +0.3249825380575933 0.9796896634251465 0.0 +0.3280339152960073 0.9809470023963451 0.0 +0.331096744424455 0.9821991054488802 0.0 +0.3341709732450902 0.9834459085225121 0.0 +0.3372565493657887 0.9846875264424727 0.0 +0.340353420201042 0.9859240938340674 0.0 +0.3434615329728526 0.9871555114571253 0.0 +0.346580834711634 0.9883813577755736 0.0 +0.3497112722571132 0.9896015762012266 0.0 +0.3528527922592367 0.99081652702429 0.0 +0.35600534117908 0.9920262495184689 0.0 +0.3591688652897594 0.993230638256614 0.0 +0.3623433106773484 0.9944297593668414 0.0 +0.3655286232417957 0.9956237661357139 0.0 +0.368724748697848 0.9968125901403091 0.0 +0.3719316325759746 0.9979960986578006 0.0 +0.3751492202232959 0.9991743889398924 0.0 +0.3783774568045147 1.000347647126256 0.0 +0.3816162873028511 1.0015161551437557 0.0 +0.3848656565209795 1.0026802169912563 0.0 +0.3881255090819695 1.0038399040764108 0.0 +0.3913957894302302 1.0049953033517267 0.0 +0.3946764418324564 1.0061465436252042 0.0 +0.3979674103785783 1.0072934019273698 0.0 +0.4012686389827149 1.0084356583504384 0.0 +0.4045800713841297 1.0095733545366574 0.0 +0.407901651148189 1.0107065890036997 0.0 +0.4112333216673243 1.0118354965139098 0.0 +0.4145750261619968 1.0129604734335742 0.0 +0.417926707681665 1.01408193425014 0.0 +0.4212883091057552 1.0152001565281163 0.0 +0.4246597731446353 1.0163153568916408 0.0 +0.4280410423405908 1.0174277213201164 0.0 +0.4314320590688043 1.0185370504195503 0.0 +0.4348327655383372 1.019642798230917 0.0 +0.4382431037931148 1.0207446730023402 0.0 +0.4416630157129143 1.021842575607473 0.0 +0.4450924430143548 1.0229366924786005 0.0 +0.4485313272518908 1.0240272160718744 0.0 +0.4519796098188085 1.025114058909379 0.0 +0.4554372319482241 1.0261971221111332 0.0 +0.4589041347140854 1.0272764190152335 0.0 +0.4623802590321769 1.0283518990674234 0.0 +0.4658655456611256 1.0294234657645767 0.0 +0.4693599352034108 1.0304910509800187 0.0 +0.4728633681063773 1.0315544822130562 0.0 +0.4763757846632491 1.0326136853060508 0.0 +0.4798971250141478 1.0336686031996722 0.0 +0.4834273291471126 1.034719017484392 0.0 +0.4869663368991224 1.035764937541362 0.0 +0.4905140879571221 1.0368066522595223 0.0 +0.4940705218590499 1.0378444141311418 0.0 +0.4976355779948676 1.0388782948008106 0.0 +0.5012091956075939 1.0399083596192416 0.0 +0.5047913137943398 1.040934710480001 0.0 +0.5083818715073465 1.041957200670301 0.0 +0.5119808075550254 1.0429757432947437 0.0 +0.5155880606030014 1.0439903805785498 0.0 +0.5192035691751582 1.0450011270368005 0.0 +0.5228272716546859 1.0460078719393338 0.0 +0.5264591062851307 1.0470107647095013 0.0 +0.5300990111714481 1.0480101158827408 0.0 +0.5337469242810573 1.0490061315131571 0.0 +0.5374027834448982 1.049998911149802 0.0 +0.5410665263584914 1.050988243436124 0.0 +0.5447380905829997 1.0519738732048172 0.0 +0.5484174135462924 1.0529556094998889 0.0 +0.5521044325440113 1.0539333034248877 0.0 +0.5557990847406399 1.054906913979975 0.0 +0.5595013071705737 1.0558764699979581 0.0 +0.5632110367391936 1.056841953521945 0.0 +0.566928210223941 1.057803534098425 0.0 +0.5706527642753958 1.0587614606663196 0.0 +0.5743846354183553 1.059715828358481 0.0 +0.5781237600529161 1.0606665001402922 0.0 +0.5818700744555583 1.0616132130578062 0.0 +0.5856235147802317 1.0625558983662156 0.0 +0.5893840170594431 1.063494846560091 0.0 +0.593151517205347 1.0644299677355376 0.0 +0.5969259510108379 1.0653606677605645 0.0 +0.6007072541506442 1.0662864526398241 0.0 +0.6044953621824245 1.0672069239093953 0.0 +0.6082902105478664 1.068121706922733 0.0 +0.6120917345737857 1.069030475813776 0.0 +0.6158998694732298 1.0699332520359268 0.0 +0.6197145503465804 1.0708301957020576 0.0 +0.6235357121826612 1.0717213344748797 0.0 +0.6273632898598445 1.072606627668974 0.0 +0.6311972181471613 1.0734860402254864 0.0 +0.6350374317054138 1.0743596894671337 0.0 +0.6388838650882879 1.0752276615613787 0.0 +0.6427364527434689 1.0760898693822198 0.0 +0.6465951290137593 1.0769462024979783 0.0 +0.6504598281381966 1.0777966835969708 0.0 +0.6543304842531749 1.0786414776539237 0.0 +0.6582070313935672 1.0794807554297583 0.0 +0.6620894034938494 1.0803144862152758 0.0 +0.6659775343892262 1.081142405143407 0.0 +0.6698713578167591 1.0819642509990406 0.0 +0.6737708074164952 1.0827800011152235 0.0 +0.6776758167325982 1.0835897104066905 0.0 +0.6815863192144815 1.0843930466102056 0.0 +0.6855022482179417 1.0851894824968071 0.0 +0.6894235370062947 1.0859787166491295 0.0 +0.6933501187515128 1.0867605762402337 0.0 +0.6972819265353641 1.0875350056888133 0.0 +0.7012188933505527 1.0883021422398613 0.0 +0.7051609521018602 1.0890621688129631 0.0 +0.7091080356072901 1.0898151747391618 0.0 +0.7130600765992119 1.0905611944494604 0.0 +0.7170170077255077 1.091300148925149 0.0 +0.7209787615507204 1.0920320104138537 0.0 +0.7249452705572028 1.0927568538290762 0.0 +0.7289164671462678 1.093474536386571 0.0 +0.732892283639341 1.0941846803820647 0.0 +0.7368726522791142 1.0948868827183935 0.0 +0.7408575052306994 1.095580974770836 0.0 +0.7448467745827856 1.0962669184077736 0.0 +0.7488403923487958 1.0969446208084177 0.0 +0.752838290468046 1.0976139980965551 0.0 +0.7568404008069043 1.098275128126286 0.0 +0.7608466551599531 1.0989282183752769 0.0 +0.7648569852511511 1.099573232042445 0.0 +0.7688713227349963 1.1002099041468754 0.0 +0.7728895991976916 1.100837950306941 0.0 +0.7769117461583105 1.1014572806798282 0.0 +0.7809376950699636 1.102067985604749 0.0 +0.7849673773209678 1.1026700407295404 0.0 +0.7890007242360147 1.1032633577234505 0.0 +0.7930376670773416 1.1038476708187197 0.0 +0.7970781370459026 1.104422738022161 0.0 +0.8011220652825412 1.1049885353023232 0.0 +0.8051693828691638 1.1055448470037688 0.0 +0.8092200208299145 1.1060914642390087 0.0 +0.8132739101323502 1.106628350311339 0.0 +0.8173309816886172 1.107155376545416 0.0 +0.8213911663566287 1.1076723185689001 0.0 +0.8254543949412434 1.1081788222016578 0.0 +0.829520598195444 1.1086746368493074 0.0 +0.8335897068215181 1.109159813164577 0.0 +0.8376616514722389 1.10963459018341 0.0 +0.841736362752047 1.1100991076017594 0.0 +0.845813771218233 1.1105533754453123 0.0 +0.8498938073821211 1.1109972049947676 0.0 +0.8539764017102535 1.1114303392667393 0.0 +0.858061484625575 1.1118526704412035 0.0 +0.8621489865086192 1.1122641279560428 0.0 +0.8662388376986945 1.1126647084118235 0.0 +0.8703309684950719 1.1130543228625418 0.0 +0.8744253091581722 1.1134329177305022 0.0 +0.8785217899107551 1.1138005472542447 0.0 +0.8826203409391081 1.1141571709007685 0.0 +0.8867208923942361 1.1145026282029389 0.0 +0.8908233743930521 1.1148367835748216 0.0 +0.8949277170195682 1.1151596154780363 0.0 +0.8990338503260868 1.1154711733828995 0.0 +0.9031417043343931 1.1157713200263766 0.0 +0.9072512090369473 1.11605972508053 0.0 +0.9113622943980779 1.116336144189679 0.0 +0.9154748903551754 1.1166005500083394 0.0 +0.9195889268198859 1.1168529115709196 0.0 +0.923704333679306 1.1170930843004574 0.0 +0.9278210407971776 1.1173210208729007 0.0 +0.9319389780150831 1.117536637160364 0.0 +0.9360580751536409 1.1177398284033127 0.0 +0.9401782620137019 1.1179305881024477 0.0 +0.9442994683775454 1.1181089069629575 0.0 +0.9484216240100758 1.1182746876473275 0.0 +0.9525446586600201 1.1184277273200767 0.0 +0.9566685020611244 1.1185678673511346 0.0 +0.9607930839333522 1.1186951599682844 0.0 +0.964918333984081 1.1188096901542868 0.0 +0.9690441819093016 1.118911351122682 0.0 +0.9731705573948156 1.1190000308462351 0.0 +0.9772973901174332 1.119075791838296 0.0 +0.9814246097461727 1.1191387316178165 0.0 +0.9855521459434584 1.1191889672245374 0.0 +0.9896799283663196 1.1192266886822442 0.0 +0.9938078866675891 1.119251954837764 0.0 +0.9979359504971027 1.1192646414784726 0.0 diff --git a/Exec/DevTests/ABL_perturbation_inflow/prob.H b/Exec/DevTests/ABL_perturbation_inflow/prob.H new file mode 100644 index 000000000..ed45c8e3a --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/prob.H @@ -0,0 +1,84 @@ +#ifndef _PROB_H_ +#define _PROB_H_ + +#include + +#include "AMReX_REAL.H" + +#include "prob_common.H" + +struct ProbParm : ProbParmDefaults { + amrex::Real rho_0 = 0.0; + amrex::Real T_0 = 0.0; + amrex::Real A_0 = 1.0; + amrex::Real KE_0 = 0.1; + amrex::Real QKE_0 = 0.1; + + amrex::Real KE_decay_height = -1; + amrex::Real KE_decay_order = 1; + + amrex::Real U_0 = 0.0; + amrex::Real V_0 = 0.0; + amrex::Real W_0 = 0.0; + + // random initial perturbations (legacy code) + amrex::Real U_0_Pert_Mag = 0.0; + amrex::Real V_0_Pert_Mag = 0.0; + amrex::Real W_0_Pert_Mag = 0.0; + amrex::Real T_0_Pert_Mag = 0.0; // perturbation to rho*Theta + bool pert_rhotheta = true; + + // divergence-free initial perturbations + amrex::Real pert_deltaU = 0.0; + amrex::Real pert_deltaV = 0.0; + amrex::Real pert_periods_U = 5.0; + amrex::Real pert_periods_V = 5.0; + amrex::Real pert_ref_height = 100.0; + + // rayleigh damping + amrex::Real dampcoef = 0.2; // inverse time scale [1/s] + amrex::Real zdamp = 500.0; // damping depth [m] from model top + + // helper vars + amrex::Real aval; + amrex::Real bval; + amrex::Real ufac; + amrex::Real vfac; +}; // namespace ProbParm + +class Problem : public ProblemBase +{ +public: + Problem(const amrex::Real* problo, const amrex::Real* probhi); + +#include "Prob/init_constant_density_hse.H" +#include "Prob/init_rayleigh_damping.H" + + void init_custom_pert ( + const amrex::Box& bx, + const amrex::Box& xbx, + const amrex::Box& ybx, + const amrex::Box& zbx, + amrex::Array4 const& state, + amrex::Array4 const& state_pert, + amrex::Array4 const& x_vel_pert, + amrex::Array4 const& y_vel_pert, + amrex::Array4 const& z_vel_pert, + amrex::Array4 const& r_hse, + amrex::Array4 const& p_hse, + amrex::Array4 const& z_nd, + amrex::Array4 const& z_cc, + amrex::GeometryData const& geomdata, + amrex::Array4 const& mf_m, + amrex::Array4 const& mf_u, + amrex::Array4 const& mf_v, + const SolverChoice& sc) override; + +protected: + std::string name() override { return "ABL"; } + +private: + ProbParm parms; +}; + +#endif diff --git a/Exec/DevTests/ABL_perturbation_inflow/prob.cpp b/Exec/DevTests/ABL_perturbation_inflow/prob.cpp new file mode 100644 index 000000000..3e75681c2 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/prob.cpp @@ -0,0 +1,199 @@ +#include "prob.H" +#include "AMReX_Random.H" + +using namespace amrex; + +std::unique_ptr +amrex_probinit(const amrex_real* problo, const amrex_real* probhi) +{ + return std::make_unique(problo, probhi); +} + +Problem::Problem(const amrex::Real* problo, const amrex::Real* probhi) +{ + // Parse params + ParmParse pp("prob"); + pp.query("rho_0", parms.rho_0); + pp.query("T_0", parms.T_0); + pp.query("A_0", parms.A_0); + pp.query("KE_0", parms.KE_0); + pp.query("QKE_0", parms.QKE_0); + pp.query("KE_decay_height", parms.KE_decay_height); + pp.query("KE_decay_order", parms.KE_decay_order); + + pp.query("U_0", parms.U_0); + pp.query("V_0", parms.V_0); + pp.query("W_0", parms.W_0); + pp.query("U_0_Pert_Mag", parms.U_0_Pert_Mag); + pp.query("V_0_Pert_Mag", parms.V_0_Pert_Mag); + pp.query("W_0_Pert_Mag", parms.W_0_Pert_Mag); + pp.query("T_0_Pert_Mag", parms.T_0_Pert_Mag); + pp.query("pert_rhotheta", parms.pert_rhotheta); + + pp.query("pert_deltaU", parms.pert_deltaU); + pp.query("pert_deltaV", parms.pert_deltaV); + pp.query("pert_periods_U", parms.pert_periods_U); + pp.query("pert_periods_V", parms.pert_periods_V); + pp.query("pert_ref_height", parms.pert_ref_height); + parms.aval = parms.pert_periods_U * 2.0 * PI / (probhi[1] - problo[1]); + parms.bval = parms.pert_periods_V * 2.0 * PI / (probhi[0] - problo[0]); + parms.ufac = parms.pert_deltaU * std::exp(0.5) / parms.pert_ref_height; + parms.vfac = parms.pert_deltaV * std::exp(0.5) / parms.pert_ref_height; + + pp.query("dampcoef", parms.dampcoef); + pp.query("zdamp", parms.zdamp); + + init_base_parms(parms.rho_0, parms.T_0); +} + +void +Problem::init_custom_pert( + const amrex::Box& bx, + const amrex::Box& xbx, + const amrex::Box& ybx, + const amrex::Box& zbx, + amrex::Array4 const& /*state*/, + amrex::Array4 const& state_pert, + amrex::Array4 const& x_vel_pert, + amrex::Array4 const& y_vel_pert, + amrex::Array4 const& z_vel_pert, + amrex::Array4 const& r_hse, + amrex::Array4 const& /*p_hse*/, + amrex::Array4 const& z_nd, + amrex::Array4 const& z_cc, + amrex::GeometryData const& geomdata, + amrex::Array4 const& /*mf_m*/, + amrex::Array4 const& /*mf_u*/, + amrex::Array4 const& /*mf_v*/, + const SolverChoice& sc) +{ + const bool use_moisture = (sc.moisture_type != MoistureType::None); + + const bool use_terrain = sc.use_terrain; + + if (parms.KE_decay_height > 0) { + amrex::Print() << "Initial KE profile (order " << parms.KE_decay_order + << ") will extend up to " << parms.KE_decay_height + << std::endl; + } + + if (parms.pert_ref_height > 0) { + if ((parms.pert_deltaU != 0.0) || (parms.pert_deltaV != 0.0)) { + amrex::Print() << "Adding divergence-free perturbations " + << parms.pert_deltaU << " " << parms.pert_deltaV + << std::endl; + } + if (parms.U_0_Pert_Mag != 0.0) { + amrex::Print() << "Adding random x-velocity perturbations" << std::endl; + } + if (parms.V_0_Pert_Mag != 0.0) { + amrex::Print() << "Adding random y-velocity perturbations" << std::endl; + } + if (parms.T_0_Pert_Mag != 0.0) { + if (parms.pert_rhotheta) { + amrex::Print() << "Adding random rho*theta perturbations" << std::endl; + } else { + amrex::Print() << "Adding random theta perturbations" << std::endl; + } + } + } + + ParallelForRNG(bx, [=, parms=parms] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept { + // Geometry + const Real* prob_lo = geomdata.ProbLo(); + const Real* prob_hi = geomdata.ProbHi(); + const Real* dx = geomdata.CellSize(); + const Real x = prob_lo[0] + (i + 0.5) * dx[0]; + const Real y = prob_lo[1] + (j + 0.5) * dx[1]; + const Real z = use_terrain ? z_cc(i,j,k) : prob_lo[2] + (k + 0.5) * dx[2]; + + // Define a point (xc,yc,zc) at the center of the domain + const Real xc = 0.5 * (prob_lo[0] + prob_hi[0]); + const Real yc = 0.5 * (prob_lo[1] + prob_hi[1]); + const Real zc = 0.5 * (prob_lo[2] + prob_hi[2]); + + const Real r = std::sqrt((x-xc)*(x-xc) + (y-yc)*(y-yc) + (z-zc)*(z-zc)); + + // Add temperature perturbations + if ((z <= parms.pert_ref_height) && (parms.T_0_Pert_Mag != 0.0)) { + Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0 + state_pert(i, j, k, RhoTheta_comp) = (rand_double*2.0 - 1.0)*parms.T_0_Pert_Mag; + if (!parms.pert_rhotheta) { + // we're perturbing theta, not rho*theta + state_pert(i, j, k, RhoTheta_comp) *= r_hse(i,j,k); + } + } + }); + + // Set the x-velocity + ParallelForRNG(xbx, [=, parms=parms] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept { + const Real* prob_lo = geomdata.ProbLo(); + const Real* dx = geomdata.CellSize(); + const Real y = prob_lo[1] + (j + 0.5) * dx[1]; + const Real z = use_terrain ? 0.25*( z_nd(i,j ,k) + z_nd(i,j ,k+1) + + z_nd(i,j+1,k) + z_nd(i,j+1,k+1) ) + : prob_lo[2] + (k + 0.5) * dx[2]; + + // Set the x-velocity + x_vel_pert(i, j, k) = parms.U_0; + /*if ((z <= parms.pert_ref_height) && (parms.U_0_Pert_Mag != 0.0)) + { + Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0 + Real x_vel_prime = (rand_double*2.0 - 1.0)*parms.U_0_Pert_Mag; + x_vel_pert(i, j, k) += x_vel_prime; + } + if (parms.pert_deltaU != 0.0) + { + const amrex::Real yl = y - prob_lo[1]; + const amrex::Real zl = z / parms.pert_ref_height; + const amrex::Real damp = std::exp(-0.5 * zl * zl); + x_vel_pert(i, j, k) += parms.ufac * damp * z * std::cos(parms.aval * yl); + }*/ + }); + + // Set the y-velocity + ParallelForRNG(ybx, [=, parms=parms] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept { + const Real* prob_lo = geomdata.ProbLo(); + const Real* dx = geomdata.CellSize(); + const Real x = prob_lo[0] + (i + 0.5) * dx[0]; + const Real z = use_terrain ? 0.25*( z_nd(i ,j,k) + z_nd(i ,j,k+1) + + z_nd(i+1,j,k) + z_nd(i+1,j,k+1) ) + : prob_lo[2] + (k + 0.5) * dx[2]; + + // Set the y-velocity + y_vel_pert(i, j, k) = parms.V_0; + /*if ((z <= parms.pert_ref_height) && (parms.V_0_Pert_Mag != 0.0)) + { + Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0 + Real y_vel_prime = (rand_double*2.0 - 1.0)*parms.V_0_Pert_Mag; + y_vel_pert(i, j, k) += y_vel_prime; + } + if (parms.pert_deltaV != 0.0) + { + const amrex::Real xl = x - prob_lo[0]; + const amrex::Real zl = z / parms.pert_ref_height; + const amrex::Real damp = std::exp(-0.5 * zl * zl); + y_vel_pert(i, j, k) += parms.vfac * damp * z * std::cos(parms.bval * xl); + }*/ + }); + + /* + // Set the z-velocity + ParallelForRNG(zbx, [=, parms=parms] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept { + const int dom_lo_z = geomdata.Domain().smallEnd()[2]; + const int dom_hi_z = geomdata.Domain().bigEnd()[2]; + + // Set the z-velocity + if (k == dom_lo_z || k == dom_hi_z+1) + { + z_vel_pert(i, j, k) = 0.0; + } + else if (parms.W_0_Pert_Mag != 0.0) + { + Real rand_double = amrex::Random(engine); // Between 0.0 and 1.0 + Real z_vel_prime = (rand_double*2.0 - 1.0)*parms.W_0_Pert_Mag; + z_vel_pert(i, j, k) = parms.W_0 + z_vel_prime; + } + }); + */ +} diff --git a/Exec/DevTests/ABL_perturbation_inflow/sourceRun.sh b/Exec/DevTests/ABL_perturbation_inflow/sourceRun.sh new file mode 100644 index 000000000..8d62b4000 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/sourceRun.sh @@ -0,0 +1 @@ +mpiexec -n 4 ./ERF3d.gnu.DEBUG.TPROF.MPI.ex toc_inout_inputs > simulation.out diff --git a/Exec/DevTests/ABL_perturbation_inflow/toc_inout_inputs b/Exec/DevTests/ABL_perturbation_inflow/toc_inout_inputs new file mode 100644 index 000000000..c3a4aee68 --- /dev/null +++ b/Exec/DevTests/ABL_perturbation_inflow/toc_inout_inputs @@ -0,0 +1,96 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +start_time = 0. +stop_time = 35.0 +#stop_time = 10.0 + +#max_step = 1000 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +#geometry.prob_extent = 4. 1. 1. +#amr.n_cell = 128 32 32 + +geometry.prob_extent = 10. 1. 1. +#amr.n_cell = 128 16 16 +amr.n_cell = 128 16 64 + +geometry.is_periodic = 0 1 0 + +xlo.type = "Outflow" +xhi.type = "Outflow" +zlo.type = "NoSlipWall" +zhi.type = "SlipWall" + +# TIME STEP CONTROL +erf.no_substepping = 1 +erf.cfl = 0.5 + +erf.dynamicViscosity = 0.0001 # H = 1, therefore utau = 0.2 + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval = 1 # timesteps between computing mass +erf.pert_interval = 1 # timesteps between perturbation output message +erf.v = 1 # verbosity in ERF.cpp +amr.v = 0 # verbosity in Amr.cpp + +# REFINEMENT / REGRIDDING +amr.max_level = 0 # maximum level number allowed + +# PLOTFILES +erf.plot_file_1 = plt # prefix of plotfile name +#erf.plot_per_1 = 0.1 +erf.plot_int_1 = 10 +erf.plot_vars_1 = density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta + +# CHECKPOINT FILES +erf.check_file = chk # root name of checkpoint file +erf.check_per = 1.0 + +# Restart for data collection +#erf.restart = "/home/tma/Desktop/TurbChannel/SpinUp/chk233334" +#erf.data_log = "surf.txt" "mean.txt" "flux.txt" "subgrid.txt" +#erf.profile_int = 33334 + +# SOLVER CHOICE +erf.alpha_T = 0.0 +erf.alpha_C = 1.0 +erf.use_gravity = false + +erf.molec_diff_type = "None" +erf.les_type = "Smagorinsky" +erf.Cs = 0.1 + +erf.buoyancy_type = 1 + +# Initial condition for the entire field +erf.init_type = "input_sounding" +erf.input_sounding_file = "input_ReTau2000DNS_sounding.txt" + +# Inflow boundary condition +erf.sponge_type = "input_sponge" +erf.input_sponge_file = "input_ReTau2000DNS_sponge.txt" +erf.sponge_strength = 100000.0 +erf.use_xlo_sponge_damping = true +erf.xlo_sponge_end = 1.0 + +# Turbulent inflow generation +erf.perturbation_type = "source" +erf.perturbation_direction = 1 0 0 +erf.perturbation_layers = 3 +erf.perturbation_offset = 0 + +erf.perturbation_box_dims = 4 4 8 # 0.25 0.25 0.125 +erf.perturbation_nondimensional = 0.042 # Ri +erf.perturbation_T_infinity = 300.0 +erf.perturbation_T_intensity = 0.1 + +# PROBLEM PARAMETERS +prob.rho_0 = 1.0 +prob.A_0 = 1.0 +prob.U_0 = 0.0 +prob.V_0 = 0.0 +prob.W_0 = 0.0 +prob.T_0 = 300.0 diff --git a/Exec/SpongeTest/inputs_sponge_test b/Exec/SpongeTest/inputs_sponge_test index 8d72f7cfb..2ea3194ac 100644 --- a/Exec/SpongeTest/inputs_sponge_test +++ b/Exec/SpongeTest/inputs_sponge_test @@ -26,7 +26,7 @@ zhi.type = "Outflow" # SPONGE ZONE BCS erf.sponge_type = "input_sponge" -erf.input_sponge_file = "input_sponge_file.txt" +erf.input_sponge_file = "input_ReTau2000_loglaw.txt" erf.sponge_strength = 1000.0 erf.use_xlo_sponge_damping = true erf.xlo_sponge_end = 4.0 diff --git a/Source/DataStructs/DataStruct.H b/Source/DataStructs/DataStruct.H index 44a027b15..5482c212c 100644 --- a/Source/DataStructs/DataStruct.H +++ b/Source/DataStructs/DataStruct.H @@ -62,8 +62,7 @@ enum Sponge { }; enum struct PerturbationType { - BPM, CPM, None - // Box perturbation method, Cell perturbation method, None + perturbSource, perturbDirect, None }; /** @@ -238,18 +237,18 @@ struct SolverChoice { // Which type of inflow turbulent generation static std::string turb_pert_type_string = "None"; - pp.query("inlet_perturbation_type",turb_pert_type_string); - if (!turb_pert_type_string.compare("BoxPerturbation")) { - pert_type = PerturbationType::BPM; - amrex::Print() << "Box perturbation method selected\n"; - } else if (!turb_pert_type_string.compare("CellPerturbation")) { - pert_type = PerturbationType::CPM; - amrex::Print() << "Cell perturbation method selected\n"; + pp.query("perturbation_type",turb_pert_type_string); + if (!turb_pert_type_string.compare("source")) { + pert_type = PerturbationType::perturbSource; + amrex::Print() << "Perturb temperature via source term\n"; + } else if (!turb_pert_type_string.compare("direct")) { + pert_type = PerturbationType::perturbDirect; + amrex::Print() << "Perturb temperature via direct field add\n"; } else if (!turb_pert_type_string.compare("None")) { pert_type = PerturbationType::None; amrex::Print() << "No perturbation method selected\n"; } else { - amrex::Abort("Dont know this inlet_perturbation_type"); + amrex::Abort("Dont know this perturbation_type"); } amrex::Vector abl_pressure_grad_in = {0.0, 0.0, 0.0}; diff --git a/Source/DataStructs/TurbPertStruct.H b/Source/DataStructs/TurbPertStruct.H index 40224515c..6f4a1ddeb 100644 --- a/Source/DataStructs/TurbPertStruct.H +++ b/Source/DataStructs/TurbPertStruct.H @@ -3,6 +3,7 @@ #include #include +#include /** * Container holding quantities related to turbulent perturbation parameters @@ -12,47 +13,64 @@ struct TurbulentPerturbation { public: - ~TurbulentPerturbation () { - amrex::Print() << "~TurbulentPerturbation destructor\n"; - } - -//#define DIAGONAL_REF -#define LENGTH_REF - -/* void init_tpi_const(const amrex::Real T_0) - { - // Bulk Richardson number - tpi_nonDim = 0.042; - - // Ambient Temperature - tpi_Tinfty = T_0; - }*/ + ~TurbulentPerturbation () {} // Initializing Perturbation Region + // Currently only support perturbation in the x and y direction // Note: Box will always be initialized at cell centered void init_tpi (const int lev, const amrex::IntVect& nx, amrex::GpuArray const dx) { - // TODO: Use user Param to define this (Currently HARDCODED) - // Perturbation box region setup - int pertBox_offset = 0; - amrex::IntVect regionLo(0+pertBox_offset, 0, 0); - amrex::IntVect regionHi(7+pertBox_offset, nx[1], nx[2]); - amrex::IntVect boxSize(8,8,8); - //amrex::IntVect boxSize(4,4,4); // HACK - - // TODO: This will need to be changed later on - tpi_Lpb = 8*dx[0]; - tpi_Wpb = 8*dx[1]; - tpi_Hpb = 8*dx[2]; - - #ifdef DIAGONAL_REF - tpi_lref = sqrt(boxSize(0)*boxSize(0)*dx[0]*dx[0] + boxSize(1)*boxSize(1)*dx[1]*dx[1]); - #elif defined(LENGTH_REF) - tpi_lref = 8*dx[0]; - #endif + amrex::ParmParse pp(pp_prefix); + + // Reading inputs, and placing assertion for the perturbation inflow to work + pp.queryarr("perturbation_box_dims",tpi_boxDim); + pp.queryarr("perturbation_direction",tpi_direction); + pp.query("perturbation_layers",tpi_layers); + pp.query("perturbation_offset",tpi_offset); + + pp.query("perturbation_nondimensional",tpi_nonDim); + pp.query("perturbation_T_infinity",tpi_Tinf); + pp.query("perturbation_T_intensity",tpi_Ti); + pp.query("perturbation_rho_0",tpi_rho); + pp.query("perturbation_cp",tpi_cp); + + // Check variables message + if (tpi_layers < 0) { amrex::Abort("Please provide a valid perturbation layer value (ie. 3-5)"); } + if (tpi_offset < 0) { amrex::Abort("Please provide a valid inflow cell offset value for perturbation region (ie. 0-5)"); } + for (int i = 0; i < tpi_boxDim.size(); i++) { + if (tpi_boxDim[i] == 0) { amrex::Abort("Please provide valid dimensions for perturbation boxes."); } + } + if (tpi_nonDim < 0.) { amrex::Abort("Please provide a valid nondimensional number (ie. Ri = 0.042)"); } + if (tpi_Tinf < 0.) { amrex::Abort("Please provide a valid ambient temperature value (ie. T_0)"); } + if (tpi_Ti <= 0.) { amrex::Abort("Please provide a valid temperature intensity value (ie. 0-1.0)"); } + if (tpi_rho < 0.) { amrex::Abort("Please provide a valid density (ie. rho_0)"); } + if (tpi_cp < 0.) { amrex::Abort("Please provide a valid specific head capacity"); } + + // Creating perturbation region + amrex::IntVect regionLo; + amrex::IntVect regionHi; + amrex::IntVect boxSize(tpi_boxDim[0],tpi_boxDim[1],tpi_boxDim[2]); // boxSize for individual boxes + + // X-direction perturbation + if (tpi_direction[0]) { + amrex::IntVect tmpLo(0+tpi_offset, 0, 0); + amrex::IntVect tmpHi(((tpi_layers*tpi_boxDim[0])-1)+tpi_offset, nx[1], nx[2]); + regionLo = tmpLo; + regionHi = tmpHi; + } + + // Y-direction Perturbation + if (tpi_direction[1]) { + amrex::IntVect tmpLo(0, 0+tpi_offset, 0); + amrex::IntVect tmpHi(nx[0], ((tpi_layers*tpi_boxDim[1])-1)+tpi_offset, nx[2]); + regionLo = tmpLo; + regionHi = tmpHi; + } + + if(tpi_direction[2]) { amrex::Abort("Currently not supporting z-direction flow perturbation"); } // Creating structure box array for conserved quantity amrex::Box tmp_bx(regionLo, regionHi, amrex::IntVect(0,0,0)); @@ -64,21 +82,36 @@ struct TurbulentPerturbation { pb_mag.resize(pb_ba[lev].size(), 0.); // Set size of vector and initialize - pb_freq.resize(pb_ba[lev].size(), -1.0); + pb_interval.resize(pb_ba[lev].size(), -1.0); pb_local_etime.resize(pb_ba[lev].size(), 0.0); pb_amp.resize(pb_ba[lev].size(), 0.0); + // Computing perturbation reference length + tpi_Lpb = tpi_boxDim[0]*dx[0]; + tpi_Wpb = tpi_boxDim[1]*dx[1]; + tpi_Hpb = tpi_boxDim[2]*dx[2]; + tpi_lref = sqrt(tpi_Lpb*tpi_Lpb + tpi_Wpb*tpi_Wpb); + // Function check point message - amrex::Print() << "Turbulent perturbation region initialized with ba " << pb_ba[lev].size() << " boxes\n"; - - // Function method check point message - amrex::Print() << "Using "; - #ifdef DIAGONAL_REF - amrex::Print() << "box diagonal "; - #elif defined(LENGTH_REF) - amrex::Print() << "box length "; - #endif - amrex::Print() << "distance as reference for turbulent inlet perturbation: tpi_lref = " << tpi_lref << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_box_dims: " << tpi_boxDim[0] << " " + << tpi_boxDim[1] << " " + << tpi_boxDim[2] << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_direction: " << tpi_direction[0] << " " + << tpi_direction[1] << " " + << tpi_direction[2] << "\n\n"; + + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_layers: " << tpi_layers << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_offset: " << tpi_offset << "\n\n"; + + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_nondimensional: " << tpi_nonDim << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_T_infinity: " << tpi_Tinf << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_T_intensity: " << tpi_Ti << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_rho_0: " << tpi_rho << "\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "perturbation_cp: " << tpi_cp << "\n\n"; + + amrex::PrintToFile("BoxPerturbationOutput") << "Reference length per box = " << tpi_lref << "\n\n"; + + amrex::PrintToFile("BoxPerturbationOutput") << "Turbulent perturbation BoxArray:\n" << pb_ba[lev] << "\n"; } // Perturbation update frequency check. @@ -87,21 +120,24 @@ struct TurbulentPerturbation { void calc_tpi_update (const int lev, const amrex::Real dt, amrex::MultiFab& mf_xvel, - amrex::MultiFab& mf_yvel, - amrex::MultiFab& mf_cons) + amrex::MultiFab& mf_yvel) { + // Setting random number generator for update interval + srand( (unsigned) time(NULL) ); + for (int boxIdx = 0; boxIdx < pb_ba[lev].size(); boxIdx++) { - if ( pb_freq[boxIdx] <= pb_local_etime[boxIdx] ) { + if ( pb_interval[boxIdx] <= pb_local_etime[boxIdx] ) { // Compute mean velocity magnitude within perturbation box - calc_tpi_meanMag(boxIdx, lev, mf_xvel, mf_yvel, mf_cons); + calc_tpi_meanMag_perBox(boxIdx, lev, mf_xvel, mf_yvel); + //calc_tpi_meanMag_firstCell(boxIdx, lev, mf_xvel, mf_yvel); - // Ma and Senocak (2015) Eq. 15 if (pb_mag[boxIdx] !=0.) { - pb_freq[boxIdx] = tpi_lref / pb_mag[boxIdx]; + amrex::Real interval = tpi_lref / pb_mag[boxIdx]; + pb_interval[boxIdx] = RandomReal(0.9*interval,1.1*interval); // 10% variation } // Trigger amplitude calculation per perturbation box - calc_tpi_amp(boxIdx); + calc_tpi_amp(boxIdx, pb_interval[boxIdx]); // Reset local elapsed time pb_local_etime[boxIdx] = 0.; @@ -112,17 +148,81 @@ struct TurbulentPerturbation { } // for } +//#define ECKERT_FORMULATION +#define BULK_RICHARDSON_FORMULATION + + // Perturbation amplitude calculation + void calc_tpi_amp (const int boxIdx, const amrex::Real interval) + { + amrex::Real Um = pb_mag[boxIdx]; + pb_amp[boxIdx] = 0.; // Safety step + + #ifdef ECKERT_FORMULATION + // Muñoz-Esparza et al. (2015) Eq. 9 + pb_amp[boxIdx] = Um * Um / (tpi_rho * tpi_cp * tpi_nonDim); + #endif + + #ifdef BULK_RICHARDSON_FORMULATION + amrex::Real beta = 1./tpi_Tinf; + + // Pseudo Random temperature the ignores scale when mechanically tripping turbulence + amrex::Real g = (tpi_nonDim * Um * Um) / (tpi_Ti * tpi_Hpb); + //amrex::Real g = CONST_GRAV; + + // Ma and Senocak (2023) Eq. 8, solving for delta phi + if (g != 0) pb_amp[boxIdx] = (tpi_nonDim * Um * Um) / (g * beta * tpi_Hpb); + //amrex::Print()<<"tpi_nonDim: "<& src_arr) // Array to apply perturbation + { + for (int boxIdx = 0; boxIdx < pb_ba[lev].size(); boxIdx++) { + amrex::Box pbx = convert(pb_ba[lev][boxIdx], m_ixtype); + amrex::Box ubx = pbx & vbx; + if (ubx.ok()) { + amrex::Real amp_copy = pb_amp[boxIdx]; + ParallelForRNG(ubx, [=] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept { + // Random number generation between 0 and 1 + amrex::Real rand_double = amrex::Random(engine); + + // Rescale between -1 and 1 and multiple with amplitude + src_arr(i,j,k,comp) += (rand_double*2.0 - 1.0) * amp_copy; + + // For box region debug only + #ifdef INDEX_PERTURB + src_arr(i,j,k,comp) = (amrex::Real) (boxIdx + 5.); + #endif + }); + } + } + } + // TODO: Test the difference between these two //#define USE_SLAB_AVERAGE #define USE_VOLUME_AVERAGE // Perturbation box mean velocity magnitude calculation // This is pulled into the structure to also utilize during runtime - void calc_tpi_meanMag (const int boxIdx, - const int lev, - amrex::MultiFab& mf_xvel, - amrex::MultiFab& mf_yvel, - amrex::MultiFab& mf_cons) + void calc_tpi_meanMag_perBox (const int boxIdx, + const int lev, + amrex::MultiFab& mf_xvel, + amrex::MultiFab& mf_yvel) { // Creating local copy of PB box array and magnitude @@ -152,7 +252,7 @@ struct TurbulentPerturbation { amrex::Gpu::deviceReduceSum(&tmp[0], xvel_arry(i,j,k), handler); }); tmp[0] /= (amrex::Real) npts; - #endif + #endif // USE_VOLUME_AVERAGE #ifdef USE_SLAB_AVERAGE amrex::Box ubxSlab_lo = makeSlab(ubx,2,ubx.smallEnd(2)); @@ -173,7 +273,7 @@ struct TurbulentPerturbation { amrex::Gpu::deviceReduceSum(&tmp[2], xvel_arry(i,j,k), handler); }); tmp[2] /= (amrex::Real) npts_hi; - #endif + #endif // USE_SLAB_AVERAGE } // if } // MFIter @@ -194,7 +294,7 @@ struct TurbulentPerturbation { amrex::Gpu::deviceReduceSum(&tmp[1], yvel_arry(i,j,k), handler); }); tmp[1] /= (amrex::Real) npts; - #endif + #endif // USE_VOLUME_AVERAGE #ifdef USE_SLAB_AVERAGE amrex::Box ubxSlab_lo = makeSlab(ubx,2,ubx.smallEnd(2)); @@ -215,112 +315,141 @@ struct TurbulentPerturbation { amrex::Gpu::deviceReduceSum(&tmp[3], yvel_arry(i,j,k), handler); }); tmp[3] /= (amrex::Real) npts_hi; - #endif + #endif // USE_SLAB_AVERAGE } // if } // MFIter // Computing the average magnitude within PB - for (amrex::MFIter mfi(mf_cons, TileNoZ()); mfi.isValid(); ++mfi) { - amrex::Box const& vbx = mfi.validbox(); - amrex::Box pbx = convert(m_pb_ba[boxIdx], vbx.ixType()); - amrex::Box ubx = pbx & vbx; - if (ubx.ok()) { - #ifdef USE_SLAB_AVERAGE - m_pb_mag[boxIdx] = 0.5*(sqrt(tmp[0]*tmp[0] + tmp[1]*tmp[1]) + sqrt(tmp[2]*tmp[2] + tmp[3]*tmp[3])); - #endif - - #ifdef USE_VOLUME_AVERAGE - m_pb_mag[boxIdx] = sqrt(tmp[0]*tmp[0] + tmp[1]*tmp[1]); - #endif - } // if - } // MFIter + #ifdef USE_SLAB_AVERAGE + m_pb_mag[boxIdx] = 0.5*(sqrt(tmp[0]*tmp[0] + tmp[1]*tmp[1]) + sqrt(tmp[2]*tmp[2] + tmp[3]*tmp[3])); + #endif + #ifdef USE_VOLUME_AVERAGE + m_pb_mag[boxIdx] = sqrt(tmp[0]*tmp[0] + tmp[1]*tmp[1]); + #endif } -//#define ECKERT_FORMULATION -#define BULK_RICHARDSON_FORMULATION - - // Perturbation amplitude calculation - void calc_tpi_amp (const int boxIdx) + // This emulates calc_tpi_meanMag_perBox() but is heavily simplified for + // Eckert number formulation + void calc_tpi_meanMag_firstCell (const int boxIdx, + const int lev, + amrex::MultiFab& mf_xvel, + amrex::MultiFab& mf_yvel) { - amrex::Real g = CONST_GRAV; - amrex::Real beta = 1./tpi_Tinfty; - amrex::Real Um = pb_mag[boxIdx]; - - // Reset the perturbation amplitude - pb_amp[boxIdx] = 0.; - - #ifdef BULK_RICHARDSON_FORMULATION - // Ma and Senocak (2023) Eq. 17 - pb_amp[boxIdx] = tpi_nonDim * Um * Um * Um / (g * beta * tpi_lref * tpi_Hpb); - #endif - - } + // Creating local copy of PB box array and magnitude + const amrex::BoxArray m_pb_ba = pb_ba[lev]; + amrex::Real* m_pb_mag = get_pb_mag(); -//#define INDEX_PERTURB + // Storage of averages per PB + // Index: 0=u (vol/slab_lo), 1=v (vol/slab_lo) + amrex::Gpu::DeviceVector tmp_d(2,0.); + amrex::Real* tmp = tmp_d.data(); - // Applying perturbation amplitude onto source term (Umphrey and Senocak 2016) - // Random perturbation is applied as a white noise on the temperature source term - // it becomes colored through the filtering of temperature transport equation from - // the eddy diffusivity. - void apply_tpi (const int lev, - const amrex::Box& vbx, // box union from upper level - const int comp, // Component to modify - const amrex::IndexType m_ixtype, // IntVect type of src_arr - amrex::Array4 const& src_arr)// Source Array to apply perturbation - { - for (int boxIdx = 0; boxIdx < pb_ba[lev].size(); boxIdx++) { - amrex::Box pbx = convert(pb_ba[lev][boxIdx], m_ixtype); + // Averaging u components + for (amrex::MFIter mfi(mf_xvel, TileNoZ()) ; mfi.isValid(); ++mfi) { + const amrex::Box &vbx = mfi.validbox(); + // This is hardcoded so that it's always on the 1st cell level (May need to generalize for EB) + amrex::Box pbx(amrex::IntVect(m_pb_ba[boxIdx].smallEnd(0),m_pb_ba[boxIdx].smallEnd(1),0), + amrex::IntVect(m_pb_ba[boxIdx].bigEnd(0) ,m_pb_ba[boxIdx].bigEnd(1) ,1), + vbx.ixType()); amrex::Box ubx = pbx & vbx; + + // Operation over box union if (ubx.ok()) { - amrex::Real amp_copy = pb_amp[boxIdx]; // This exposes a copy so the GPU can capture by value - ParallelForRNG(ubx, [=] AMREX_GPU_DEVICE(int i, int j, int k, const amrex::RandomEngine& engine) noexcept { - // Random number generation between 0 and 1 - amrex::Real rand_double = amrex::Random(engine); + const amrex::Array4 &xvel_arry = mf_xvel.array(mfi); + int npts = ubx.numPts(); + ParallelFor(amrex::Gpu::KernelInfo().setReduction(true), ubx, [=] + AMREX_GPU_DEVICE(int i, int j, int k, amrex::Gpu::Handler const& handler) noexcept { + amrex::Gpu::deviceReduceSum(&tmp[0], xvel_arry(i,j,k), handler); + }); + tmp[0] /= (amrex::Real) npts; + } // if + } // MFIter - // Rescale between -1 and 1 and multiple with amplitude - src_arr(i,j,k,comp) = (rand_double*2.0 - 1.0) * amp_copy; + // Averaging v components + for (amrex::MFIter mfi(mf_yvel, TileNoZ()) ; mfi.isValid(); ++mfi) { + const amrex::Box &vbx = mfi.validbox(); + // This is hardcoded so that it's always on the 1st cell level (May need to generalize for EB) + amrex::Box pbx(amrex::IntVect(m_pb_ba[boxIdx].smallEnd(0),m_pb_ba[boxIdx].smallEnd(1),0), + amrex::IntVect(m_pb_ba[boxIdx].bigEnd(0) ,m_pb_ba[boxIdx].bigEnd(1) ,1), + vbx.ixType()); + amrex::Box ubx = pbx & vbx; - // For box region debug only - #ifdef INDEX_PERTURB - src_arr(i,j,k,comp) = (amrex::Real) (boxIdx + 1.); - #endif + // Operation over box union + if (ubx.ok()) { + const amrex::Array4 &yvel_arry = mf_yvel.array(mfi); + int npts = ubx.numPts(); + ParallelFor(amrex::Gpu::KernelInfo().setReduction(true), ubx, [=] + AMREX_GPU_DEVICE(int i, int j, int k, amrex::Gpu::Handler const& handler) noexcept { + amrex::Gpu::deviceReduceSum(&tmp[1], yvel_arry(i,j,k), handler); }); - } - } - } + tmp[1] /= (amrex::Real) npts; + } // if + } // MFIter + // Computing the average magnitude within 1st z level slab + m_pb_mag[boxIdx] = sqrt(tmp[0]*tmp[0] + tmp[1]*tmp[1]); + } // Quality of life function definitions amrex::Real* get_pb_mag() { return pb_mag.data(); } - void debug () + // Output debug message into a file + void debug (amrex::Real time) { + amrex::PrintToFile("BoxPerturbationOutput") << "#################### PB output at time = " + << time << " ####################\n"; + for (int i = 0; i < pb_mag.size(); i++) { - amrex::Print() << "[" << i<< "] pb_mag=" << pb_mag[i] - << " | pb_freq=" << pb_freq[i] - << " | pb_local_etime=" << pb_local_etime[i] <<"\n"; + amrex::PrintToFile("BoxPerturbationOutput") << "[" << i + << "] pb_Umag=" << pb_mag[i] + << " | pb_interval=" << pb_interval[i] + << " (" << pb_local_etime[i] + << ") | pb_amp=" << pb_amp[i] << "\n"; } + amrex::PrintToFile("BoxPerturbationOutput") << "\n"; } - // Public constant constants - amrex::Real tpi_Tinfty; // [K] - amrex::Real tpi_nonDim; + std::string pp_prefix {"erf"}; // Public data members - amrex::Vector pb_ba; // PB box array - amrex::Vector pb_mag; // BP mean magnitude [m/s] + amrex::Vector pb_ba; // PB box array + amrex::Vector pb_mag; // BP mean magnitude [m/s] private: - // Private constant constants - amrex::Real tpi_Hpb; // PB height [m] - amrex::Real tpi_Lpb; // PB length [m] - amrex::Real tpi_Wpb; // PB width [m] - amrex::Real tpi_lref; // PB reference length [m] + // Random number generation between range (used for interval calculation) + amrex::Real RandomReal (const amrex::Real min, const amrex::Real max) + { + amrex::Real r = (amrex::Real) rand() / (amrex::Real) RAND_MAX; + return min + r * (max - min); + } + + // Private data members + int tpi_layers; // Number of layers of perturbation boxes + int tpi_offset; // Cells to offset the start of the perturbation region + + amrex::Vector tpi_boxDim; // Dimensions of each perturbation box + amrex::Vector tpi_direction; // Direction of the peturbation + + amrex::Real tpi_nonDim; // Nondimensional Value + + // Richardson Formulation + amrex::Real tpi_Ti; // Temperature intensity value + amrex::Real tpi_Tinf; // Reference temperature [K] + + // Eckert Formulation + amrex::Real tpi_rho; // Reference density + amrex::Real tpi_cp; // Specific heat capaticty + + // Physical dimensions + amrex::Real tpi_Hpb; // PB height [m] + amrex::Real tpi_Lpb; // PB length [m] + amrex::Real tpi_Wpb; // PB width [m] + amrex::Real tpi_lref; // PB reference length [m] - // Storage Arrays - amrex::Vector pb_freq; // PB frequency [1/s] + // Perturbation data arrays + amrex::Vector pb_interval; // PB update time [s] amrex::Vector pb_local_etime; // PB local elapsed time [s] amrex::Vector pb_amp; // PB perturbation amplitude Ri:[K] Ec:[K/s] diff --git a/Source/ERF.H b/Source/ERF.H index 61134f455..ff0696c68 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -428,7 +428,6 @@ private: amrex::Vector& lev_old); // Initialize the Turbulent perturbation - void turbPert_constants (const int lev); void turbPert_update (const int lev, const amrex::Real dt); void turbPert_amplitude (const int lev); @@ -883,6 +882,7 @@ private: // Diagnostic output interval static int sum_interval; + static int pert_interval; static amrex::Real sum_per; // Native or NetCDF diff --git a/Source/ERF.cpp b/Source/ERF.cpp index 2c00edfc1..741c68296 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -46,6 +46,8 @@ int ERF::mg_verbose = 0; int ERF::sum_interval = -1; Real ERF::sum_per = -1.0; +int ERF::pert_interval = -1; + // Native AMReX vs NetCDF std::string ERF::plotfile_type = "amrex"; @@ -483,6 +485,13 @@ ERF::post_timestep (int nstep, Real time, Real dt_lev0) sum_integrated_quantities(time); } + if (solverChoice.pert_type == PerturbationType::perturbSource || + solverChoice.pert_type == PerturbationType::perturbDirect) { + if (is_it_time_for_action(nstep, time, dt_lev0, pert_interval, -1.)) { + turbPert.debug(time); + } + } + if (profile_int > 0 && (nstep+1) % profile_int == 0) { if (cc_profiles) { // all variables cell-centered @@ -809,6 +818,13 @@ ERF::InitData () sum_integrated_quantities(t_new[0]); } + if (solverChoice.pert_type == PerturbationType::perturbSource || + solverChoice.pert_type == PerturbationType::perturbDirect) { + if (is_it_time_for_action(istep[0], t_new[0], dt[0], pert_interval, -1.)) { + turbPert.debug(t_new[0]); + } + } + // We only write the file at level 0 for now if (output_bndry_planes) { @@ -1221,14 +1237,13 @@ ERF::init_only (int lev, Real time) } // Initialize turbulent perturbation - if (solverChoice.pert_type == PerturbationType::BPM) { + if (solverChoice.pert_type == PerturbationType::perturbSource || + solverChoice.pert_type == PerturbationType::perturbDirect) { if (lev == 0) { - turbPert_constants(lev); turbPert_update(lev, 0.); turbPert_amplitude(lev); } } - } // read in some parameters from inputs file @@ -1274,6 +1289,8 @@ ERF::ReadParameters () pp.query("sum_interval", sum_interval); pp.query("sum_period" , sum_per); + pp.query("pert_interval", pert_interval); + // Time step controls pp.query("cfl", cfl); pp.query("init_shrink", init_shrink); diff --git a/Source/ERF_make_new_arrays.cpp b/Source/ERF_make_new_arrays.cpp index cde26fb8e..35b15c9ec 100644 --- a/Source/ERF_make_new_arrays.cpp +++ b/Source/ERF_make_new_arrays.cpp @@ -308,7 +308,9 @@ ERF::init_stuff (int lev, const BoxArray& ba, const DistributionMapping& dm, // Turbulent perturbation region initialization //********************************************************* // TODO: Test perturbation on multiple levels - if (solverChoice.pert_type == PerturbationType::BPM) { + if (solverChoice.pert_type == PerturbationType::perturbSource || + solverChoice.pert_type == PerturbationType::perturbDirect) + { if (lev == 0) { turbPert.init_tpi(lev, geom[lev].Domain().bigEnd(), geom[lev].CellSizeArray()); } diff --git a/Source/Initialization/ERF_init_TurbPert.cpp b/Source/Initialization/ERF_init_TurbPert.cpp index 28aacd70e..cea297e9c 100644 --- a/Source/Initialization/ERF_init_TurbPert.cpp +++ b/Source/Initialization/ERF_init_TurbPert.cpp @@ -4,8 +4,6 @@ //DUSTIN MA: May 28th, 2024 -#define DEBUG_PERTBOX_MSG - #include #include #include @@ -13,12 +11,6 @@ using namespace amrex; -void -ERF::turbPert_constants(const int lev) -{ - prob->init_turbPert_const(turbPert); -} - void ERF::turbPert_update (const int lev, const Real local_dt) { @@ -26,22 +18,15 @@ ERF::turbPert_update (const int lev, const Real local_dt) auto& lev_new = vars_new[lev]; // Accessing local data - MultiFab cons_data(lev_new[Vars::cons].boxArray(), lev_new[Vars::cons].DistributionMap(), - lev_new[Vars::cons].nComp() , lev_new[Vars::cons].nGrow()); MultiFab xvel_data(lev_new[Vars::xvel].boxArray(), lev_new[Vars::xvel].DistributionMap(), 1, lev_new[Vars::xvel].nGrowVect()); MultiFab yvel_data(lev_new[Vars::yvel].boxArray(), lev_new[Vars::yvel].DistributionMap(), 1, lev_new[Vars::yvel].nGrowVect()); - MultiFab::Copy (cons_data, lev_new[Vars::cons], 0, 0, 1, lev_new[Vars::xvel].nGrowVect()); MultiFab::Copy (xvel_data, lev_new[Vars::xvel], 0, 0, 1, lev_new[Vars::xvel].nGrowVect()); MultiFab::Copy (yvel_data, lev_new[Vars::yvel], 0, 0, 1, lev_new[Vars::yvel].nGrowVect()); // Computing perturbation update time - turbPert.calc_tpi_update(lev, local_dt, xvel_data, yvel_data, cons_data); - - #ifdef DEBUG_PERTBOX_MSG - turbPert.debug(); - #endif + turbPert.calc_tpi_update(lev, local_dt, xvel_data, yvel_data); - Print() << "Turbulent perturbation update time and amplitude initialized\n"; + Print() << "Successfully initialized turbulent perturbation update time and amplitude\n"; } // Calculate the perturbation region amplitude. @@ -69,15 +54,6 @@ ERF::turbPert_amplitude (int lev) yvel_pert.setVal(0.); zvel_pert.setVal(0.); - int fix_random_seed = 0; - ParmParse pp("erf"); pp.query("fix_random_seed", fix_random_seed); - // Note that the value of 1024UL is not significant -- the point here is just to set the - // same seed for all MPI processes for the purpose of regression testing - if (fix_random_seed) { - Print() << "Fixing the random seed" << std::endl; - InitRandom(1024UL); - } - #ifdef _OPENMP #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) #endif @@ -104,13 +80,15 @@ ERF::turbPert_amplitude (int lev) Array4 r_hse_arr = r_hse.array(mfi); Array4 p_hse_arr = p_hse.array(mfi); - turbPert.apply_tpi(lev, bx, RhoTheta_comp, m_ixtype, cons_pert_arr); // Using boxArray + turbPert.apply_tpi(lev, bx, RhoTheta_comp, m_ixtype, cons_pert_arr); + prob->init_custom_pert(bx, xbx, ybx, zbx, cons_arr, cons_pert_arr, xvel_pert_arr, yvel_pert_arr, zvel_pert_arr, r_hse_arr, p_hse_arr, z_nd_arr, z_cc_arr, geom[lev].data(), mf_m, mf_u, mf_v, solverChoice); } // mfi + // This initialization adds the initial perturbation direction on the RhoTheta field MultiFab::Add(lev_new[Vars::cons], cons_pert, RhoTheta_comp, RhoTheta_comp, 1, cons_pert.nGrow()); } diff --git a/Source/SourceTerms/ERF_make_sources.cpp b/Source/SourceTerms/ERF_make_sources.cpp index 5b54a86bf..817fa2bdc 100644 --- a/Source/SourceTerms/ERF_make_sources.cpp +++ b/Source/SourceTerms/ERF_make_sources.cpp @@ -334,11 +334,9 @@ void make_sources (int level, // ************************************************************************************* // Add perturbation // ************************************************************************************* - if (solverChoice.pert_type == PerturbationType::BPM) { - auto m_ixtype = S_data[IntVars::cons].boxArray().ixType(); - - // Apply stored values onto cell_src - turbPert.apply_tpi(level, bx, RhoTheta_comp, m_ixtype, cell_src); + if (solverChoice.pert_type == PerturbationType::perturbSource) { + auto m_ixtype = S_data[IntVars::cons].boxArray().ixType(); // Conserved term + turbPert.apply_tpi(level, bx, RhoTheta_comp, m_ixtype, cell_src); // Applied as source term } } // mfi } // OMP diff --git a/Source/TimeIntegration/ERF_Advance.cpp b/Source/TimeIntegration/ERF_Advance.cpp index 02448f2bf..b74e4632d 100644 --- a/Source/TimeIntegration/ERF_Advance.cpp +++ b/Source/TimeIntegration/ERF_Advance.cpp @@ -36,14 +36,28 @@ ERF::Advance (int lev, Real time, Real dt_lev, int iteration, int /*ncycle*/) MultiFab& W_new = vars_new[lev][Vars::zvel]; // TODO: Can test on multiple levels later - // Only apply to level 0 - // DUSTIN MA - if (solverChoice.pert_type == PerturbationType::BPM) { - if (lev == 0) { - turbPert.calc_tpi_update(lev, dt_lev, U_old, V_old, S_old); - turbPert.debug(); + // Update the inflow perturbation update time and amplitude + if (lev == 0) { + if (solverChoice.pert_type == PerturbationType::perturbSource || + solverChoice.pert_type == PerturbationType::perturbDirect) + { + turbPert.calc_tpi_update(lev, dt_lev, U_old, V_old); + } + + // If perturbDirect is selected, directly add the computed perturbation + // on the conserved field + // XXX Currently gives "Erroneous arithmetic operation" error + if (solverChoice.pert_type == PerturbationType::perturbDirect) + { + auto m_ixtype = S_old.boxArray().ixType(); // Conserved term + for (MFIter mfi(S_old,TileNoZ()); mfi.isValid(); ++mfi) { + Box bx = mfi.tilebox(); + const Array4 & cell_data = S_old.array(mfi); + turbPert.apply_tpi(lev, bx, RhoTheta_comp, m_ixtype, cell_data); + } } } + // configure ABLMost params if used MostWall boundary condition if (phys_bc_type[Orientation(Direction::z,Orientation::low)] == ERF_BC::MOST) { if (m_most) { diff --git a/Source/prob_common.H b/Source/prob_common.H index 0107dcb18..dcdd4e0f4 100644 --- a/Source/prob_common.H +++ b/Source/prob_common.H @@ -445,16 +445,6 @@ public: }); } - /** - * Function to set constant values for turbulent perturbation calculation - */ - void - init_turbPert_const(TurbulentPerturbation& turbPert) - { - turbPert.tpi_Tinfty = base_parms.T_0; - turbPert.tpi_nonDim = 0.042; - } - protected: // Struct to store problem parameters ProbParmDefaults base_parms;