30 const int tot_size = nx*ny*nz;
32 amrex::Gpu::DeviceVector<Real> latvec_d(nx*ny), lonvec_d(nx*ny), zvec_d(nz);
33 amrex::Gpu::DeviceVector<Real> rho_d(tot_size), uvel_d(tot_size),
34 vvel_d(tot_size), wvel_d(tot_size), theta_d(tot_size),
35 qv_d(tot_size), qc_d(tot_size), qr_d(tot_size);
37 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, latvec_h.begin(), latvec_h.end(), latvec_d.begin());
38 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, lonvec_h.begin(), lonvec_h.end(), lonvec_d.begin());
39 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, zvec_h.begin(), zvec_h.end(), zvec_d.begin());
40 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, rho_h.begin(), rho_h.end(), rho_d.begin());
41 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, theta_h.begin(), theta_h.end(), theta_d.begin());
42 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, uvel_h.begin(), uvel_h.end(), uvel_d.begin());
43 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, vvel_h.begin(), vvel_h.end(), vvel_d.begin());
44 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, wvel_h.begin(), wvel_h.end(), wvel_d.begin());
45 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, qv_h.begin(), qv_h.end(), qv_d.begin());
46 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, qc_h.begin(), qc_h.end(), qc_d.begin());
47 amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, qr_h.begin(), qr_h.end(), qr_d.begin());
49 Real* latvec_d_ptr = latvec_d.data();
50 Real* lonvec_d_ptr = lonvec_d.data();
51 Real* zvec_d_ptr = zvec_d.data();
52 Real* rho_d_ptr = rho_d.data();
53 Real* uvel_d_ptr = uvel_d.data();
54 Real* vvel_d_ptr = vvel_d.data();
55 Real* wvel_d_ptr = wvel_d.data();
56 Real* theta_d_ptr = theta_d.data();
57 Real* qv_d_ptr = qv_d.data();
58 Real* qc_d_ptr = qc_d.data();
59 Real* qr_d_ptr = qr_d.data();
61 const auto prob_lo = geom_weather.ProbLoArray();
62 const auto dx = geom_weather.CellSizeArray();
64 for (MFIter mfi(mf, TilingIfNotGPU()); mfi.isValid(); ++mfi)
66 const Box& bx = mfi.nodaltilebox();
67 Array4<Real>
const& arr = mf.array(mfi);
69 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
71 const Real
z = prob_lo[2] + k * dx[2];
73 for (
int kk = 0; kk < nz_d; kk++) {
74 if (zvec_d_ptr[kk] > z) {
82 Real dz = zvec_d_ptr[kloc] - zvec_d_ptr[kloc-1];
83 Real fac = (
z-zvec_d_ptr[kloc-1])/dz;
84 arr(i,j,k,0) = rho_d_ptr[idx1] + fac*(rho_d_ptr[idx2]-rho_d_ptr[idx1]);
85 arr(i,j,k,1) = uvel_d_ptr[idx1] + fac*(uvel_d_ptr[idx2]-uvel_d_ptr[idx1]);
86 arr(i,j,k,2) = vvel_d_ptr[idx1] + fac*(vvel_d_ptr[idx2]-vvel_d_ptr[idx1]);
87 arr(i,j,k,3) = wvel_d_ptr[idx1] + fac*(wvel_d_ptr[idx2]-wvel_d_ptr[idx1]);
88 arr(i,j,k,4) = theta_d_ptr[idx1] + fac*(theta_d_ptr[idx2]-theta_d_ptr[idx1]);
89 arr(i,j,k,5) = qv_d_ptr[idx1] + fac*(qv_d_ptr[idx2]-qv_d_ptr[idx1]);
90 arr(i,j,k,6) = qc_d_ptr[idx1] + fac*(qc_d_ptr[idx2]-qc_d_ptr[idx1]);
91 arr(i,j,k,7) = qr_d_ptr[idx1] + fac*(qr_d_ptr[idx2]-qr_d_ptr[idx1]);
93 arr(i,j,k,8) = latvec_d_ptr[idx1];
94 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