1 #ifndef ERF_TURB_PERT_STRUCT_H_
2 #define ERF_TURB_PERT_STRUCT_H_
5 #include <AMReX_MultiFabUtil.H>
30 const amrex::IntVect& valid_box_lo,
31 const amrex::IntVect& valid_box_hi,
32 const amrex::GpuArray<amrex::Real,3> dx,
33 const amrex::BoxArray& ba,
34 const amrex::DistributionMapping& dm,
35 const int ngrow_state,
36 std::string pp_prefix,
37 const amrex::Vector<amrex::IntVect> refRatio,
47 amrex::ParmParse
pp(pp_prefix);
57 pp.query(
"perturbation_T_intensity",
tpi_Ti);
60 if (
tpi_layers < 0) { amrex::Abort(
"Please provide a valid perturbation layer value (ie. 3-5)"); }
61 if (
tpi_offset < 0) { amrex::Abort(
"Please provide a valid inflow cell offset value for perturbation region (ie. 0-5)"); }
63 if (
tpi_boxDim[i] == 0) { amrex::Abort(
"Please provide valid dimensions for perturbation boxes."); }
65 if (
tpi_nonDim < 0.) { amrex::Abort(
"Please provide a valid nondimensional number (ie. Ri = 0.042)"); }
66 if (
tpi_Tinf < 0.) { amrex::Abort(
"Please provide a valid ambient temperature value (ie. T_0 = T_infty)"); }
67 if (
tpi_Ti < 0.) { amrex::Abort(
"Please provide a valid temperature intensity value (ie. 0-1.0)"); }
70 amrex::Box lo_x_bx(amrex::IntVect(0), amrex::IntVect(1), amrex::IntVect(0));
71 amrex::Box hi_x_bx(amrex::IntVect(0), amrex::IntVect(1), amrex::IntVect(0));
72 amrex::Box lo_y_bx(amrex::IntVect(0), amrex::IntVect(1), amrex::IntVect(0));
73 amrex::Box hi_y_bx(amrex::IntVect(0), amrex::IntVect(1), amrex::IntVect(0));
76 amrex::BoxList tmp_bl;
113 amrex::Box lo_x_lo_y_u = lo_x_bx & lo_y_bx;
114 lo_y_bx.setSmall(amrex::IntVect(lo_x_lo_y_u.bigEnd(0)+1, lo_x_lo_y_u.smallEnd(1), lo_x_lo_y_u.smallEnd(2)));
118 amrex::Box hi_x_lo_y_u = hi_x_bx & lo_y_bx;
119 lo_y_bx.setBig(amrex::IntVect(hi_x_lo_y_u.smallEnd(0)-1, hi_x_lo_y_u.bigEnd(1), hi_x_lo_y_u.bigEnd(2)));
123 amrex::Box lo_x_hi_y_u = lo_x_bx & hi_y_bx;
124 hi_y_bx.setSmall(amrex::IntVect(lo_x_hi_y_u.bigEnd(0)+1, lo_x_hi_y_u.smallEnd(1), lo_x_hi_y_u.smallEnd(2)));
128 amrex::Box hi_x_hi_y_u = hi_x_bx & hi_y_bx;
129 hi_y_bx.setBig(amrex::IntVect(hi_x_hi_y_u.smallEnd(0)-1, hi_x_hi_y_u.bigEnd(1), hi_x_hi_y_u.bigEnd(2)));
138 amrex::BoxArray tmp_ba(tmp_bl);
139 tmp_ba.maxSize(boxSize);
140 pb_ba.push_back(tmp_ba);
143 pb_mag.resize(max_level+1);
147 pb_amp.resize(max_level+1);
161 pb_cell[lev].define(ba, dm, 1, ngrow_state);
202 const amrex::Real dt,
203 amrex::MultiFab& mf_xvel,
204 amrex::MultiFab& mf_yvel,
205 amrex::MultiFab& mf_cons)
211 srand( (
unsigned) time(NULL) );
213 auto m_ixtype = mf_cons.boxArray().ixType();
215 for (
int boxIdx = 0; boxIdx <
pb_ba[lev].size(); boxIdx++) {
225 if (
pb_mag[lev][boxIdx] !=0.) {
254 for (
int boxIdx = 0; boxIdx <
pb_ba[lev].size(); boxIdx++) {
263 const amrex::Box& vbx,
265 const amrex::IndexType& m_ixtype,
266 const amrex::Array4<amrex::Real>& src_arr,
267 const amrex::Array4<amrex::Real const>& pert_cell)
269 for (
int boxIdx = 0; boxIdx <
pb_ba[lev].size(); boxIdx++) {
270 amrex::Box pbx = amrex::convert(
pb_ba[lev][boxIdx], m_ixtype);
271 amrex::Box ubx = pbx & vbx;
273 ParallelFor(ubx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
274 src_arr(i,j,k,comp) += pert_cell(i,j,k);
278 src_arr(i,j,k,comp) = (amrex::Real) (boxIdx + 5.);
288 const amrex::Real& interval)
290 amrex::Real Um =
pb_mag[lev][boxIdx];
298 int total_ref_ratio = 1;
299 for (
int level = lev; level >= 1; level--) {
300 total_ref_ratio *=
ref_ratio[level-1][2];
312 pb_amp[lev][boxIdx] /= interval;
321 const amrex::IndexType& m_ixtype)
324 int fix_random_seed = 0;
325 amrex::ParmParse
pp(
"erf");
pp.query(
"fix_random_seed", fix_random_seed);
326 if (fix_random_seed) {
327 amrex::InitRandom(1024UL);
330 for (amrex::MFIter mfi(
pb_cell[lev],
TileNoZ()); mfi.isValid(); ++mfi) {
331 amrex::Box vbx = mfi.validbox();
332 amrex::Box pbx = amrex::convert(
pb_ba[lev][boxIdx], m_ixtype);
333 amrex::Box ubx = pbx & vbx;
335 amrex::Real amp_copy =
pb_amp[lev][boxIdx];
336 const amrex::Array4<amrex::Real>& pert_cell =
pb_cell[lev].array(mfi);
337 ParallelForRNG(ubx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k,
const amrex::RandomEngine& engine) noexcept {
338 amrex::Real rand_double = amrex::Random(engine);
339 pert_cell(i,j,k) = (rand_double*2.0 - 1.0) * amp_copy;
350 const amrex::BoxArray m_pb_ba =
pb_ba[lev];
351 amrex::Real* m_pb_netZero =
pb_netZero[lev].data();
354 amrex::Vector<amrex::Real>
avg_h(1,0.);
355 amrex::Gpu::DeviceVector<amrex::Real> avg_d(1,0.);
356 amrex::Real* avg = avg_d.data();
359 for (amrex::MFIter mfi(
pb_cell[lev],
TileNoZ()) ; mfi.isValid(); ++mfi) {
360 const amrex::Box& vbx = mfi.validbox();
361 amrex::Box pbx = amrex::convert(m_pb_ba[boxIdx], vbx.ixType());
362 amrex::Box ubx = pbx & vbx;
364 const amrex::Array4<const amrex::Real>& pert_cell =
pb_cell[lev].const_array(mfi);
365 int npts = ubx.numPts();
366 amrex::Real norm = 1.0 / (amrex::Real) npts;
367 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubx, [=]
368 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
369 amrex::Gpu::deviceReduceSum(&avg[0], pert_cell(i,j,k)*norm, handler);
371 amrex::Gpu::copy(amrex::Gpu::deviceToHost, avg_d.begin(), avg_d.end(),
avg_h.begin());
374 m_pb_netZero[boxIdx] =
avg_h[0];
385 const amrex::BoxArray m_pb_ba =
pb_ba[lev];
386 for (amrex::MFIter mfi(
pb_cell[lev],
TileNoZ()) ; mfi.isValid(); ++mfi) {
387 const amrex::Box& vbx = mfi.validbox();
388 amrex::Box pbx = amrex::convert(m_pb_ba[boxIdx], vbx.ixType());
389 amrex::Box ubx = pbx & vbx;
392 const amrex::Array4<amrex::Real>& pert_cell =
pb_cell[lev].array(mfi);
393 ParallelFor(ubx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
394 pert_cell(i,j,k) -= adjust;
401 #define USE_VOLUME_AVERAGE
406 amrex::MultiFab& mf_cons,
407 amrex::MultiFab& mf_xvel,
408 amrex::MultiFab& mf_yvel)
412 const amrex::BoxArray m_pb_ba =
pb_ba[lev];
413 amrex::Real* m_pb_mag =
pb_mag[lev].data();
414 m_pb_mag[boxIdx] = 0.;
420 amrex::Vector<amrex::Real>
avg_h(n_avg,0.);
421 amrex::Gpu::DeviceVector<amrex::Real> avg_d(n_avg,0.);
422 amrex::Real* avg = avg_d.data();
425 for (amrex::MFIter mfi(mf_cons,
TileNoZ()); mfi.isValid(); ++mfi) {
428 const amrex::Box& vbx = mfi.validbox();
431 auto ixtype_u = mf_xvel.boxArray().ixType();
432 amrex::Box vbx_u = amrex::convert(vbx,ixtype_u);
433 amrex::Box pbx_u = amrex::convert(m_pb_ba[boxIdx], ixtype_u);
434 amrex::Box ubx_u = pbx_u & vbx_u;
437 auto ixtype_v = mf_yvel.boxArray().ixType();
438 amrex::Box vbx_v = amrex::convert(vbx,ixtype_v);
439 amrex::Box pbx_v = amrex::convert(m_pb_ba[boxIdx], ixtype_v);
440 amrex::Box ubx_v = pbx_v & vbx_v;
444 const amrex::Array4<const amrex::Real>& xvel_arry = mf_xvel.const_array(mfi);
446 #ifdef USE_VOLUME_AVERAGE
447 int npts = ubx_u.numPts();
448 amrex::Real norm = 1.0 / (amrex::Real) npts;
449 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubx_u, [=]
450 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
451 amrex::Gpu::deviceReduceSum(&avg[0], xvel_arry(i,j,k)*norm, handler);
455 #ifdef USE_SLAB_AVERAGE
456 amrex::Box ubxSlab_lo = makeSlab(ubx_u,2,ubx_u.smallEnd(2));
457 amrex::Box ubxSlab_hi = makeSlab(ubx_u,2,ubx_u.bigEnd(2));
458 int npts_lo = ubxSlab_lo.numPts();
459 int npts_hi = ubxSlab_hi.numPts();
460 amrex::Real norm_lo = 1.0 / (amrex::Real) npts_lo;
461 amrex::Real norm_hi = 1.0 / (amrex::Real) npts_hi;
464 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubxSlab_lo, [=]
465 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
466 amrex::Gpu::deviceReduceSum(&avg[0], xvel_arry(i,j,k)*norm_lo, handler);
470 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubxSlab_hi, [=]
471 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
472 amrex::Gpu::deviceReduceSum(&avg[2], xvel_arry(i,j,k)*norm_hi, handler);
479 const amrex::Array4<const amrex::Real>& yvel_arry = mf_yvel.const_array(mfi);
481 #ifdef USE_VOLUME_AVERAGE
482 int npts = ubx_v.numPts();
483 amrex::Real norm = 1.0 / (amrex::Real) npts;
484 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubx_v, [=]
485 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
486 amrex::Gpu::deviceReduceSum(&avg[1], yvel_arry(i,j,k)*norm, handler);
490 #ifdef USE_SLAB_AVERAGE
491 amrex::Box ubxSlab_lo = makeSlab(ubx_v,2,ubx_v.smallEnd(2));
492 amrex::Box ubxSlab_hi = makeSlab(ubx_v,2,ubx_v.bigEnd(2));
493 int npts_lo = ubxSlab_lo.numPts();
494 int npts_hi = ubxSlab_hi.numPts();
495 amrex::Real norm_lo = 1.0 / (amrex::Real) npts_lo;
496 amrex::Real norm_hi = 1.0 / (amrex::Real) npts_hi;
499 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubxSlab_lo, [=]
500 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
501 amrex::Gpu::deviceReduceSum(&avg[1], yvel_arry(i,j,k)*norm_lo, handler);
505 ParallelFor(amrex::Gpu::KernelInfo().setReduction(
true), ubxSlab_hi, [=]
506 AMREX_GPU_DEVICE(
int i,
int j,
int k, amrex::Gpu::Handler
const& handler) noexcept {
507 amrex::Gpu::deviceReduceSum(&avg[3], yvel_arry(i,j,k)*norm_hi, handler);
514 amrex::Gpu::copy(amrex::Gpu::deviceToHost, avg_d.begin(), avg_d.end(),
avg_h.begin());
517 #ifdef USE_VOLUME_AVERAGE
521 #ifdef USE_SLAB_AVERAGE
549 amrex::Vector<amrex::BoxArray>
pb_ba;
550 amrex::Vector<amrex::Vector<amrex::Real>>
pb_mag;
584 amrex::Vector<amrex::Vector<amrex::Real>>
pb_amp;
588 amrex::Real
RandomReal (
const amrex::Real min,
const amrex::Real max)
590 amrex::Real r = (amrex::Real) rand() / (amrex::Real) RAND_MAX;
591 return min + r * (max - min);
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:21
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pp(amrex::Real y)
Definition: ERF_MicrophysicsUtils.H:219
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real avg_h(amrex::Real XXXm, amrex::Real XXXp)
Definition: ERF_EBUtils.H:10
Definition: ERF_TurbPertStruct.H:18
amrex::Vector< amrex::MultiFab > pb_cell
Definition: ERF_TurbPertStruct.H:554
int tpi_layers
Definition: ERF_TurbPertStruct.H:559
void pseudoRandomPert(const int &boxIdx, const int &lev, const amrex::IndexType &m_ixtype)
Definition: ERF_TurbPertStruct.H:319
amrex::Real tpi_Tinf
Definition: ERF_TurbPertStruct.H:568
amrex::Real tpi_Wpb
Definition: ERF_TurbPertStruct.H:573
amrex::Real tpi_Lpb
Definition: ERF_TurbPertStruct.H:572
amrex::Vector< amrex::Vector< amrex::Real > > pb_local_etime
Definition: ERF_TurbPertStruct.H:583
amrex::Vector< amrex::IntVect > ref_ratio
Definition: ERF_TurbPertStruct.H:579
void calc_tpi_amp(const int &lev, const int &boxIdx, const amrex::Real &interval)
Definition: ERF_TurbPertStruct.H:286
amrex::Vector< amrex::BoxArray > pb_ba
Definition: ERF_TurbPertStruct.H:549
void netZeroBuoyantAdjust(const int &boxIdx, const int &lev)
Definition: ERF_TurbPertStruct.H:381
void calc_tpi_update(const int lev, const amrex::Real dt, amrex::MultiFab &mf_xvel, amrex::MultiFab &mf_yvel, amrex::MultiFab &mf_cons)
Definition: ERF_TurbPertStruct.H:201
amrex::Vector< amrex::Vector< amrex::Real > > pb_mag
Definition: ERF_TurbPertStruct.H:550
int tpi_offset
Definition: ERF_TurbPertStruct.H:560
amrex::Vector< amrex::Vector< amrex::Real > > pb_netZero
Definition: ERF_TurbPertStruct.H:585
amrex::Real tpi_Ti
Definition: ERF_TurbPertStruct.H:567
amrex::Real tpi_pert_adjust
Definition: ERF_TurbPertStruct.H:577
void debug(amrex::Real)
Definition: ERF_TurbPertStruct.H:528
amrex::Vector< amrex::Vector< amrex::Real > > pb_interval
Definition: ERF_TurbPertStruct.H:582
amrex::Real tpi_lref
Definition: ERF_TurbPertStruct.H:574
amrex::Vector< int > tpi_boxDim
Definition: ERF_TurbPertStruct.H:562
amrex::Real tpi_nonDim
Definition: ERF_TurbPertStruct.H:566
void calc_tpi_meanMag_perBox(const int &boxIdx, const int &lev, amrex::MultiFab &mf_cons, amrex::MultiFab &mf_xvel, amrex::MultiFab &mf_yvel)
Definition: ERF_TurbPertStruct.H:404
void init_tpi(const int lev, const amrex::IntVect &valid_box_lo, const amrex::IntVect &valid_box_hi, const amrex::GpuArray< amrex::Real, 3 > dx, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, const int ngrow_state, std::string pp_prefix, const amrex::Vector< amrex::IntVect > refRatio, const int max_level)
Definition: ERF_TurbPertStruct.H:29
void netZeroBuoyantAdd(const int &boxIdx, const int &lev)
Definition: ERF_TurbPertStruct.H:346
int pt_type
Definition: ERF_TurbPertStruct.H:546
~TurbulentPerturbation()
Definition: ERF_TurbPertStruct.H:22
amrex::Real RandomReal(const amrex::Real min, const amrex::Real max)
Definition: ERF_TurbPertStruct.H:588
amrex::Real tpi_net_buoyant
Definition: ERF_TurbPertStruct.H:576
void apply_tpi(const int &lev, const amrex::Box &vbx, const int &comp, const amrex::IndexType &m_ixtype, const amrex::Array4< amrex::Real > &src_arr, const amrex::Array4< amrex::Real const > &pert_cell)
Definition: ERF_TurbPertStruct.H:262
amrex::Real tpi_Hpb
Definition: ERF_TurbPertStruct.H:571
amrex::Vector< int > tpi_direction
Definition: ERF_TurbPertStruct.H:563
amrex::Vector< amrex::Vector< amrex::Real > > pb_amp
Definition: ERF_TurbPertStruct.H:584