33 amrex::Print() <<
"Loading boundary data for " <<
field_name <<
" from NetCDF file " << std::endl;
42 for (
int ifile = 0; ifile <
file_names.size(); ifile++) {
46 if (amrex::ParallelDescriptor::IOProcessor())
48 if (unit_str.find(
"days") == std::string::npos) {
49 amrex::Print() <<
"Units of ocean_time given as: " << unit_str << std::endl;
50 amrex::Abort(
"Units must be in days.");
55 amrex::Vector<RARRAY> array_ts(1);
57 if (amrex::ParallelDescriptor::IOProcessor())
59 int ntimes_io = array_ts[0].get_vshape()[0];
60 for (
int nt(0); nt < ntimes_io; nt++)
63 bry_times.push_back((*(array_ts[0].get_data() + nt)) * amrex::Real(60.0) * amrex::Real(60.0) * amrex::Real(24.0));
74 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
75 amrex::ParallelDescriptor::Bcast(&ntimes,1,ioproc);
76 if (!(amrex::ParallelDescriptor::IOProcessor())) {
86 amrex::Arena* Arena_Used = amrex::The_Arena();
88 Arena_Used = amrex::The_Pinned_Arena();
90 const auto& lo =
domain.loVect();
91 const auto& hi =
domain.hiVect();
95 amrex::Box xhi_bx(amrex::IntVect(hi[0]+1 , lo[1]+
index_type[1]-1, lo[2]),
96 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
99 amrex::Box yhi_bx(amrex::IntVect(lo[0]+
index_type[0]-1, hi[1]+1 , lo[2]),
100 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
102 xlo_bx.makeSlab(2,0);
103 xhi_bx.makeSlab(2,0);
104 ylo_bx.makeSlab(2,0);
105 yhi_bx.makeSlab(2,0);
108 amrex::Print() << xlo_bx <<
" " << xhi_bx <<
" " << ylo_bx <<
" " << yhi_bx << std::endl;
128 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
131 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
134 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
137 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
150 for (
int nt=0; nt <
bry_times.size()-1; nt++) {
176 amrex::Array4<amrex::Real> xlo_interp_arr =
xlo_dat_interp.array();
177 amrex::Array4<amrex::Real> xhi_interp_arr =
xhi_dat_interp.array();
178 amrex::Array4<amrex::Real> ylo_interp_arr =
ylo_dat_interp.array();
179 amrex::Array4<amrex::Real> yhi_interp_arr =
yhi_dat_interp.array();
181 amrex::Array4<amrex::Real> xlo_before_arr =
xlo_dat_before.array();
182 amrex::Array4<amrex::Real> xhi_before_arr =
xhi_dat_before.array();
183 amrex::Array4<amrex::Real> ylo_before_arr =
ylo_dat_before.array();
184 amrex::Array4<amrex::Real> yhi_before_arr =
yhi_dat_before.array();
186 amrex::Array4<amrex::Real> xlo_after_arr =
xlo_dat_after.array();
187 amrex::Array4<amrex::Real> xhi_after_arr =
xhi_dat_after.array();
188 amrex::Array4<amrex::Real> ylo_after_arr =
ylo_dat_after.array();
189 amrex::Array4<amrex::Real> yhi_after_arr =
yhi_dat_after.array();
191 amrex::ParallelFor(
xlo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
193 xlo_interp_arr(i,j,k) = xlo_before_arr(i,j,k) + (time - time_before_copy) * (xlo_after_arr(i,j,k) - xlo_before_arr(i,j,k)) / dt;
196 amrex::ParallelFor(
xhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
198 xhi_interp_arr(i,j,k) = xhi_before_arr(i,j,k) + (time - time_before_copy) * (xhi_after_arr(i,j,k) - xhi_before_arr(i,j,k)) / dt;
201 amrex::ParallelFor(
ylo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
203 ylo_interp_arr(i,j,k) = ylo_before_arr(i,j,k) + (time - time_before_copy) * (ylo_after_arr(i,j,k) - ylo_before_arr(i,j,k)) / dt;
206 amrex::ParallelFor(
yhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
208 yhi_interp_arr(i,j,k) = yhi_before_arr(i,j,k) + (time - time_before_copy) * (yhi_after_arr(i,j,k) - yhi_before_arr(i,j,k)) / dt;
220 amrex::FArrayBox& fab_xhi,
221 amrex::FArrayBox& fab_ylo,
222 amrex::FArrayBox& fab_yhi,
230 amrex::Print() <<
"Reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
236 if (amrex::ParallelDescriptor::IOProcessor())
240 int nx, ny, nz, n_plane;
241 int i, j, k, ioff, joff;
242 if (last4 ==
"west") {
243 amrex::Box my_box = fab_xlo.box();
246 ny = arrays[iv].get_vshape()[1];
248 nz = arrays[iv].get_vshape()[1];
249 ny = arrays[iv].get_vshape()[2];
252 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
254 i = my_box.smallEnd()[0];
255 joff = my_box.smallEnd()[1];
257 amrex::Array4<amrex::Real> fab_arr = fab_xlo.array();
258 for (
int n(0); n < n_plane; n++) {
261 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
263 }
else if (last4 ==
"east") {
264 amrex::Box my_box = fab_xhi.box();
267 ny = arrays[iv].get_vshape()[1];
269 nz = arrays[iv].get_vshape()[1];
270 ny = arrays[iv].get_vshape()[2];
273 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
275 i = my_box.smallEnd()[0];
276 joff = my_box.smallEnd()[1];
278 amrex::Array4<amrex::Real> fab_arr = fab_xhi.array();
279 for (
int n(0); n < n_plane; n++) {
282 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
284 }
else if (last5 ==
"south") {
285 amrex::Box my_box = fab_ylo.box();
288 nx = arrays[iv].get_vshape()[1];
290 nz = arrays[iv].get_vshape()[1];
291 nx = arrays[iv].get_vshape()[2];
294 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
296 j = my_box.smallEnd()[1];
297 ioff = my_box.smallEnd()[0];
299 amrex::Array4<amrex::Real> fab_arr = fab_ylo.array();
300 for (
int n(0); n < n_plane; n++) {
303 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
305 }
else if (last5 ==
"north") {
306 amrex::Box my_box = fab_yhi.box();
309 nx = arrays[iv].get_vshape()[1];
311 nz = arrays[iv].get_vshape()[1];
312 nx = arrays[iv].get_vshape()[2];
315 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
317 j = my_box.smallEnd()[1];
318 ioff = my_box.smallEnd()[0];
320 amrex::Array4<amrex::Real> fab_arr = fab_yhi.array();
321 for (
int n(0); n < n_plane; n++) {
324 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
330 amrex::ParallelDescriptor::Barrier();
335 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
336 amrex::ParallelDescriptor::Bcast(fab_xlo.dataPtr(),fab_xlo.box().numPts(),ioproc);
337 amrex::ParallelDescriptor::Bcast(fab_xhi.dataPtr(),fab_xhi.box().numPts(),ioproc);
338 amrex::ParallelDescriptor::Bcast(fab_ylo.dataPtr(),fab_ylo.box().numPts(),ioproc);
339 amrex::ParallelDescriptor::Bcast(fab_yhi.dataPtr(),fab_yhi.box().numPts(),ioproc);