ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ThinBodyWallDist.cpp File Reference
#include <AMReX.H>
#include <AMReX_MultiFab.H>
Include dependency graph for ERF_ThinBodyWallDist.cpp:

Functions

void thinbody_wall_dist (std::unique_ptr< MultiFab > &wdist, Vector< IntVect > &xfaces, Vector< IntVect > &yfaces, Vector< IntVect > &zfaces, const Geometry &geomdata, std::unique_ptr< MultiFab > &z_phys_cc)
 

Function Documentation

◆ thinbody_wall_dist()

void thinbody_wall_dist ( std::unique_ptr< MultiFab > &  wdist,
Vector< IntVect > &  xfaces,
Vector< IntVect > &  yfaces,
Vector< IntVect > &  zfaces,
const Geometry &  geomdata,
std::unique_ptr< MultiFab > &  z_phys_cc 
)
18 {
19  BL_PROFILE("thinbody_wall_dist()");
20 
21  const Real* prob_lo = geomdata.ProbLo();
22  const Real* dx = geomdata.CellSize();
23 
24  const bool use_terrain = (z_phys_cc != nullptr);
25  if (use_terrain) {
26  Error("Thinbody wall dist calc not implemented for terrain yet");
27  }
28 
29  Gpu::DeviceVector<IntVect> xfaces_d(xfaces.size());
30  Gpu::DeviceVector<IntVect> yfaces_d(yfaces.size());
31  Gpu::DeviceVector<IntVect> zfaces_d(zfaces.size());
32  Gpu::copyAsync(Gpu::hostToDevice, xfaces.begin(), xfaces.end(), xfaces_d.begin());
33  Gpu::copyAsync(Gpu::hostToDevice, yfaces.begin(), yfaces.end(), yfaces_d.begin());
34  Gpu::copyAsync(Gpu::hostToDevice, zfaces.begin(), zfaces.end(), zfaces_d.begin());
35  auto const* xfaces_d_ptr = xfaces_d.data();
36  auto const* yfaces_d_ptr = yfaces_d.data();
37  auto const* zfaces_d_ptr = zfaces_d.data();
38  const auto n_xfaces = xfaces_d.size();
39  const auto n_yfaces = yfaces_d.size();
40  const auto n_zfaces = zfaces_d.size();
41 
42  for (MFIter mfi(*wdist); mfi.isValid(); ++mfi) {
43  const Box& bx = mfi.validbox();
44 
45  //const auto& z_cc = (use_terrain) ? z_phys_cc->const_array(mfi) : Array4<const Real>{};
46  auto wd_arr = wdist->array(mfi);
47 
48  if (!use_terrain) {
49  ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
50  Real xr = prob_lo[0] + (i + Real(0.5)) * dx[0];
51  Real yr = prob_lo[1] + (j + Real(0.5)) * dx[1];
52  Real zr = prob_lo[2] + (k + Real(0.5)) * dx[2];
53 
54  for (std::size_t iface=0; iface < n_xfaces; ++iface) {
55  int ii = xfaces_d_ptr[iface][0];
56  int jj = xfaces_d_ptr[iface][1];
57  int kk = xfaces_d_ptr[iface][2];
58  Real xfc = prob_lo[0] + ii * dx[0];
59  Real yfc = prob_lo[1] + (jj+Real(0.5)) * dx[1];
60  Real zfc = prob_lo[2] + (kk+Real(0.5)) * dx[2];
61  Real y0 = prob_lo[1] + jj * dx[1];
62  Real y1 = prob_lo[1] + (jj+1)* dx[1];
63  Real z0 = prob_lo[2] + kk * dx[2];
64  Real z1 = prob_lo[2] + (kk+1)* dx[2];
65  Real wd2 = wd_arr(i, j, k) * wd_arr(i, j, k);
66  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + (yfc-yr)*(yfc-yr) + (zfc-zr)*(zfc-zr));
67  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + ( y0-yr)*( y0-yr) + ( z0-zr)*( z0-zr));
68  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + ( y0-yr)*( y0-yr) + ( z1-zr)*( z1-zr));
69  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + ( y1-yr)*( y1-yr) + ( z0-zr)*( z0-zr));
70  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + ( y1-yr)*( y1-yr) + ( z1-zr)*( z1-zr));
71  wd_arr(i, j, k) = std::sqrt(wd2);
72  }
73 
74  for (std::size_t iface=0; iface < n_yfaces; ++iface) {
75  int ii = yfaces_d_ptr[iface][0];
76  int jj = yfaces_d_ptr[iface][1];
77  int kk = yfaces_d_ptr[iface][2];
78  Real xfc = prob_lo[0] + (ii+Real(0.5)) * dx[0];
79  Real yfc = prob_lo[1] + jj * dx[1];
80  Real zfc = prob_lo[2] + (kk+Real(0.5)) * dx[2];
81  Real x0 = prob_lo[0] + ii * dx[0];
82  Real x1 = prob_lo[0] + (ii+1) * dx[0];
83  Real z0 = prob_lo[2] + kk * dx[2];
84  Real z1 = prob_lo[2] + (kk+1) * dx[2];
85  Real wd2 = wd_arr(i, j, k) * wd_arr(i, j, k);
86  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + (yfc-yr)*(yfc-yr) + (zfc-zr)*(zfc-zr));
87  wd2 = min(wd2, ( x0-xr)*( x0-xr) + (yfc-yr)*(yfc-yr) + ( z0-zr)*( z0-zr));
88  wd2 = min(wd2, ( x0-xr)*( x0-xr) + (yfc-yr)*(yfc-yr) + ( z1-zr)*( z1-zr));
89  wd2 = min(wd2, ( x1-xr)*( x1-xr) + (yfc-yr)*(yfc-yr) + ( z0-zr)*( z0-zr));
90  wd2 = min(wd2, ( x1-xr)*( x1-xr) + (yfc-yr)*(yfc-yr) + ( z1-zr)*( z1-zr));
91  wd_arr(i, j, k) = std::sqrt(wd2);
92  }
93 
94  for (std::size_t iface=0; iface < n_zfaces; ++iface) {
95  int ii = zfaces_d_ptr[iface][0];
96  int jj = zfaces_d_ptr[iface][1];
97  int kk = zfaces_d_ptr[iface][2];
98  Real xfc = prob_lo[0] + (ii+Real(0.5)) * dx[0];
99  Real yfc = prob_lo[1] + (jj+Real(0.5)) * dx[1];
100  Real zfc = prob_lo[2] + kk * dx[2];
101  Real x0 = prob_lo[0] + ii * dx[0];
102  Real x1 = prob_lo[0] + (ii+1) * dx[0];
103  Real y0 = prob_lo[1] + jj * dx[1];
104  Real y1 = prob_lo[1] + (jj+1) * dx[1];
105  Real wd2 = wd_arr(i, j, k) * wd_arr(i, j, k);
106  wd2 = min(wd2, (xfc-xr)*(xfc-xr) + (yfc-yr)*(yfc-yr) + (zfc-zr)*(zfc-zr));
107  wd2 = min(wd2, ( x0-xr)*( x0-xr) + ( y0-yr)*( y0-yr) + (zfc-zr)*(zfc-zr));
108  wd2 = min(wd2, ( x0-xr)*( x0-xr) + ( y1-yr)*( y1-yr) + (zfc-zr)*(zfc-zr));
109  wd2 = min(wd2, ( x1-xr)*( x1-xr) + ( y1-yr)*( y1-yr) + (zfc-zr)*(zfc-zr));
110  wd2 = min(wd2, ( x1-xr)*( x1-xr) + ( y0-yr)*( y0-yr) + (zfc-zr)*(zfc-zr));
111  wd_arr(i, j, k) = std::sqrt(wd2);
112  }
113  });
114  }
115  }
116 }
Real z0
Definition: ERF_InitCustomPertVels_ScalarAdvDiff.H:8
const bool use_terrain
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:26
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
const GpuArray< Real, AMREX_SPACEDIM > prob_lo
Definition: ERF_InitCustomPert_CloudChamber.H:33
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
amrex::Real Real
Definition: ERF_ShocInterface.H:19

Referenced by ERF::InitData_post().

Here is the call graph for this function:
Here is the caller graph for this function: