38 const int tot_size = nx*ny*nz;
40 amrex::Gpu::DeviceVector<Real> latvec_d(nx*ny), lonvec_d(nx*ny), zvec_d(nz);
41 amrex::Gpu::DeviceVector<Real> rho_d(tot_size), uvel_d(tot_size),
42 vvel_d(tot_size), wvel_d(tot_size), theta_d(tot_size),
43 qv_d(tot_size), qc_d(tot_size), qr_d(tot_size);
45 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, latvec_h.begin(), latvec_h.end(), latvec_d.begin());
46 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, lonvec_h.begin(), lonvec_h.end(), lonvec_d.begin());
47 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, zvec_h.begin(), zvec_h.end(), zvec_d.begin());
48 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, rho_h.begin(), rho_h.end(), rho_d.begin());
49 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, theta_h.begin(), theta_h.end(), theta_d.begin());
50 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, uvel_h.begin(), uvel_h.end(), uvel_d.begin());
51 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, vvel_h.begin(), vvel_h.end(), vvel_d.begin());
52 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, wvel_h.begin(), wvel_h.end(), wvel_d.begin());
53 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, qv_h.begin(), qv_h.end(), qv_d.begin());
54 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, qc_h.begin(), qc_h.end(), qc_d.begin());
55 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, qr_h.begin(), qr_h.end(), qr_d.begin());
57 Real* latvec_d_ptr = latvec_d.data();
58 Real* lonvec_d_ptr = lonvec_d.data();
59 Real* zvec_d_ptr = zvec_d.data();
60 Real* rho_d_ptr = rho_d.data();
61 Real* uvel_d_ptr = uvel_d.data();
62 Real* vvel_d_ptr = vvel_d.data();
63 Real* wvel_d_ptr = wvel_d.data();
64 Real* theta_d_ptr = theta_d.data();
65 Real* qv_d_ptr = qv_d.data();
66 Real* qc_d_ptr = qc_d.data();
67 Real* qr_d_ptr = qr_d.data();
69 const auto prob_lo = geom_weather.ProbLoArray();
70 const auto dx = geom_weather.CellSizeArray();
72 for (MFIter mfi(mf, TilingIfNotGPU()); mfi.isValid(); ++mfi)
74 const Box& bx = mfi.nodaltilebox();
75 Array4<Real>
const& arr = mf.array(mfi);
77 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
79 const Real z = prob_lo[2] + k * dx[2];
81 for (
int kk = 0; kk < nz_d; kk++) {
82 if (zvec_d_ptr[kk] > z) {
90 Real dz = zvec_d_ptr[kloc] - zvec_d_ptr[kloc-1];
91 Real fac = (
z-zvec_d_ptr[kloc-1])/dz;
92 arr(i,j,k,0) = rho_d_ptr[idx1] + fac*(rho_d_ptr[idx2]-rho_d_ptr[idx1]);
93 arr(i,j,k,1) = uvel_d_ptr[idx1] + fac*(uvel_d_ptr[idx2]-uvel_d_ptr[idx1]);
94 arr(i,j,k,2) = vvel_d_ptr[idx1] + fac*(vvel_d_ptr[idx2]-vvel_d_ptr[idx1]);
95 arr(i,j,k,3) = wvel_d_ptr[idx1] + fac*(wvel_d_ptr[idx2]-wvel_d_ptr[idx1]);
96 arr(i,j,k,4) = theta_d_ptr[idx1] + fac*(theta_d_ptr[idx2]-theta_d_ptr[idx1]);
97 arr(i,j,k,5) = qv_d_ptr[idx1] + fac*(qv_d_ptr[idx2]-qv_d_ptr[idx1]);
98 arr(i,j,k,6) = qc_d_ptr[idx1] + fac*(qc_d_ptr[idx2]-qc_d_ptr[idx1]);
99 arr(i,j,k,7) = qr_d_ptr[idx1] + fac*(qr_d_ptr[idx2]-qr_d_ptr[idx1]);
101 arr(i,j,k,8) = latvec_d_ptr[idx1];
102 arr(i,j,k,9) = lonvec_d_ptr[idx1];
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE int get_single_index(int i, int j, int k, int nx, int ny)
Definition: ERF_Interpolation_Bilinear.H:13
amrex::Real Real
Definition: ERF_ShocInterface.H:16