44 amrex::Arena* Arena_Used = amrex::The_Arena();
46 Arena_Used = amrex::The_Pinned_Arena();
50 amrex::Print() <<
"Setting up boundary data for " <<
field_name <<
" coming from NetCDF file " << std::endl;
59 for (
int ifile = 0; ifile <
file_names.size(); ifile++) {
63 if (amrex::ParallelDescriptor::IOProcessor())
65 if (unit_str.find(
"days") == std::string::npos) {
66 amrex::Print() <<
"Units of ocean_time given as: " << unit_str << std::endl;
67 amrex::Abort(
"Units must be in days.");
72 amrex::Vector<RARRAY> array_ts(1);
74 if (amrex::ParallelDescriptor::IOProcessor())
76 int ntimes_io = array_ts[0].get_vshape()[0];
77 for (
int nt(0); nt < ntimes_io; nt++)
80 bry_times.push_back((*(array_ts[0].get_data() + nt)) * amrex::Real(60.0) * amrex::Real(60.0) * amrex::Real(24.0));
91 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
92 amrex::ParallelDescriptor::Bcast(&ntimes,1,ioproc);
93 if (!(amrex::ParallelDescriptor::IOProcessor())) {
102 const auto& lo =
domain.loVect();
103 const auto& hi =
domain.hiVect();
107 amrex::Box xhi_bx(amrex::IntVect(hi[0]+1 , lo[1]+
index_type[1]-1, lo[2]),
108 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
111 amrex::Box yhi_bx(amrex::IntVect(lo[0]+
index_type[0]-1, hi[1]+1 , lo[2]),
112 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
114 xlo_bx.makeSlab(2,0);
115 xhi_bx.makeSlab(2,0);
116 ylo_bx.makeSlab(2,0);
117 yhi_bx.makeSlab(2,0);
140 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
143 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
146 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
149 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
160 amrex::Arena* Arena_Used = amrex::The_Arena();
162 Arena_Used = amrex::The_Pinned_Arena();
169 for (
int nt=0; nt <
bry_times.size()-1; nt++) {
180 amrex::FArrayBox crse_xlo_dat;
181 amrex::FArrayBox crse_xhi_dat;
182 amrex::FArrayBox crse_ylo_dat;
183 amrex::FArrayBox crse_yhi_dat;
186 const auto& crse_lo =
m_geom[0].Domain().loVect();
187 const auto& crse_hi =
m_geom[0].Domain().hiVect();
189 amrex::Box crse_xlo_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_lo[1]+
index_type[1]-1, crse_lo[2]),
191 amrex::Box crse_xhi_bx(amrex::IntVect(crse_hi[0]+1 , crse_lo[1]+
index_type[1]-1, crse_lo[2]),
192 amrex::IntVect(crse_hi[0]+1 , crse_hi[1]+1 , crse_hi[2]),
index_type);
193 amrex::Box crse_ylo_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_lo[1]+
index_type[1]-1, crse_lo[2]),
195 amrex::Box crse_yhi_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_hi[1]+1 , crse_lo[2]),
196 amrex::IntVect(crse_hi[0]+1 , crse_hi[1]+1 , crse_hi[2]),
index_type);
198 crse_xlo_bx.makeSlab(2,0);
199 crse_xhi_bx.makeSlab(2,0);
200 crse_ylo_bx.makeSlab(2,0);
201 crse_yhi_bx.makeSlab(2,0);
204 crse_xlo_dat = amrex::FArrayBox(crse_xlo_bx, 1, Arena_Used);
205 crse_xhi_dat = amrex::FArrayBox(crse_xhi_bx, 1, Arena_Used);
206 crse_ylo_dat = amrex::FArrayBox(crse_ylo_bx, 1, Arena_Used);
207 crse_yhi_dat = amrex::FArrayBox(crse_yhi_bx, 1, Arena_Used);
217 amrex::Print() <<
"Reading in " <<
field_name <<
" at (after) time " << i_time_after << std::endl;
223 read_in_at_time(crse_xlo_dat, crse_xhi_dat, crse_ylo_dat, crse_yhi_dat, i_time_after);
238 amrex::Print() <<
"Reading in " <<
field_name <<
" at (after) time " << i_time_after << std::endl;
251 amrex::Print() <<
"Reading in " <<
field_name <<
" at time " << i_time_after << std::endl;
253 read_in_at_time(crse_xlo_dat, crse_xhi_dat, crse_ylo_dat, crse_yhi_dat, i_time_after);
265 amrex::Array4<amrex::Real> xlo_interp_arr =
xlo_dat_interp.array();
266 amrex::Array4<amrex::Real> xhi_interp_arr =
xhi_dat_interp.array();
267 amrex::Array4<amrex::Real> ylo_interp_arr =
ylo_dat_interp.array();
268 amrex::Array4<amrex::Real> yhi_interp_arr =
yhi_dat_interp.array();
270 amrex::Array4<amrex::Real> xlo_before_arr =
xlo_dat_before.array();
271 amrex::Array4<amrex::Real> xhi_before_arr =
xhi_dat_before.array();
272 amrex::Array4<amrex::Real> ylo_before_arr =
ylo_dat_before.array();
273 amrex::Array4<amrex::Real> yhi_before_arr =
yhi_dat_before.array();
275 amrex::Array4<amrex::Real> xlo_after_arr =
xlo_dat_after.array();
276 amrex::Array4<amrex::Real> xhi_after_arr =
xhi_dat_after.array();
277 amrex::Array4<amrex::Real> ylo_after_arr =
ylo_dat_after.array();
278 amrex::Array4<amrex::Real> yhi_after_arr =
yhi_dat_after.array();
280 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
281 amrex::ParallelFor(
xlo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
283 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;
287 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
288 amrex::ParallelFor(
xhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
290 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;
294 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
295 amrex::ParallelFor(
ylo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
297 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;
301 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
302 amrex::ParallelFor(
yhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
304 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;
317 amrex::FArrayBox& fab_xhi,
318 amrex::FArrayBox& fab_ylo,
319 amrex::FArrayBox& fab_yhi,
324 amrex::Print() <<
"Actually reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
330 if (amrex::ParallelDescriptor::IOProcessor())
334 int nx, ny, nz, n_plane;
335 int i, j, k, ioff, joff;
336 if (last4 ==
"west") {
337 amrex::Box my_box = fab_xlo.box();
340 ny = arrays[iv].get_vshape()[1];
342 nz = arrays[iv].get_vshape()[1];
343 ny = arrays[iv].get_vshape()[2];
346 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
348 i = my_box.smallEnd()[0];
349 joff = my_box.smallEnd()[1];
351 amrex::Array4<amrex::Real> fab_arr = fab_xlo.array();
353 for (
int n(0); n < n_plane; n++) {
356 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
358 }
else if (last4 ==
"east") {
359 amrex::Box my_box = fab_xhi.box();
362 ny = arrays[iv].get_vshape()[1];
364 nz = arrays[iv].get_vshape()[1];
365 ny = arrays[iv].get_vshape()[2];
368 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
370 i = my_box.smallEnd()[0];
371 joff = my_box.smallEnd()[1];
373 amrex::Array4<amrex::Real> fab_arr = fab_xhi.array();
374 for (
int n(0); n < n_plane; n++) {
377 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
379 }
else if (last5 ==
"south") {
380 amrex::Box my_box = fab_ylo.box();
383 nx = arrays[iv].get_vshape()[1];
385 nz = arrays[iv].get_vshape()[1];
386 nx = arrays[iv].get_vshape()[2];
389 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
391 j = my_box.smallEnd()[1];
392 ioff = my_box.smallEnd()[0];
394 amrex::Array4<amrex::Real> fab_arr = fab_ylo.array();
395 for (
int n(0); n < n_plane; n++) {
398 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
400 }
else if (last5 ==
"north") {
401 amrex::Box my_box = fab_yhi.box();
404 nx = arrays[iv].get_vshape()[1];
406 nz = arrays[iv].get_vshape()[1];
407 nx = arrays[iv].get_vshape()[2];
410 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
412 j = my_box.smallEnd()[1];
413 ioff = my_box.smallEnd()[0];
415 amrex::Array4<amrex::Real> fab_arr = fab_yhi.array();
416 for (
int n(0); n < n_plane; n++) {
419 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
425 amrex::ParallelDescriptor::Barrier();
430 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
431 amrex::ParallelDescriptor::Bcast(fab_xlo.dataPtr(),fab_xlo.box().numPts(),ioproc);
432 amrex::ParallelDescriptor::Bcast(fab_xhi.dataPtr(),fab_xhi.box().numPts(),ioproc);
433 amrex::ParallelDescriptor::Bcast(fab_ylo.dataPtr(),fab_ylo.box().numPts(),ioproc);
434 amrex::ParallelDescriptor::Bcast(fab_yhi.dataPtr(),fab_yhi.box().numPts(),ioproc);
436 amrex::Print() <<
"DONE reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
445 amrex::Array4<amrex::Real> crse_arr = dat_crse.array();
446 amrex::Array4<amrex::Real> fine_arr = dat_fine.array();
448 const auto& bhi = ubound(dat_crse.box());
450 amrex::Real xfac = 1.0 /
static_cast<amrex::Real
>(
m_rx);
451 amrex::Real yfac = 1.0 /
static_cast<amrex::Real
>(
m_ry);
453 amrex::Real rx =
m_rx;
454 amrex::Real ry =
m_ry;
457 if (dat_crse.box().length(0) == 1) {
459 if (dat_crse.box().ixType()[1] == 0) {
460 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
462 int i_f = (i == -1) ? -1 : rx*i;
464 fine_arr(i_f,j,k) = crse_arr(i,j,k);
466 fine_arr(i_f,ry*j ,k) = crse_arr(i,j,k);
468 for (
int n = 1; n < ry; n++) {
469 fine_arr(i_f,ry*j+n,k) = crse_arr(i,j,k) + n * yfac * (crse_arr(i,j+1,k) - crse_arr(i,j,k));
475 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
477 int i_f = (i == -1) ? -1 : rx*i;
479 fine_arr(i_f,j,k) = crse_arr(i,j,k);
481 fine_arr(i_f,ry*j,k) = crse_arr(i,j,k);
483 for (
int n = 1; n < ry; n++) {
484 fine_arr(i_f,ry*j+n,k) = crse_arr(i,j,k) + n * yfac * (crse_arr(i,j+1,k) - crse_arr(i,j,k));
490 }
else if (dat_crse.box().length(1) == 1) {
493 if (dat_crse.box().ixType()[0] == 0) {
494 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
496 int j_f = (j == -1) ? -1 : ry*j;
498 fine_arr(i,j_f,k) = crse_arr(i,j,k);
500 fine_arr(rx*i ,j_f,k) = crse_arr(i,j,k);
502 for (
int n = 1; n < rx; n++) {
503 fine_arr(rx*i+n,j_f,k) = crse_arr(i,j,k) + n * xfac * (crse_arr(i+1,j,k) - crse_arr(i,j,k));
509 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
511 int j_f = (j == -1) ? -1 : ry*j;
513 fine_arr(i,j_f,k) = crse_arr(i,j,k);
515 fine_arr(rx*i,j_f,k) = crse_arr(i,j,k);
517 for (
int n = 1; n < rx; n++) {
518 fine_arr(rx*i+n,j_f,k) = crse_arr(i,j,k) + n * xfac * (crse_arr(i+1,j,k) - crse_arr(i,j,k));
525 amrex::Abort(
" What am I doing here??");