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 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
60 for (
int ifile = 0; ifile <
file_names.size(); ifile++) {
65 amrex::ParallelDescriptor::Bcast(&has_units,1,ioproc);
68 if (amrex::ParallelDescriptor::IOProcessor())
70 if (unit_str.find(
"days") == std::string::npos) {
71 amrex::Print() <<
"Units of ocean_time given as: " << unit_str << std::endl;
72 amrex::Abort(
"Units must be in days.");
76 amrex::Warning(
"Units attribute not found on time variable " +
time_name +
". Assuming days");
80 amrex::Vector<RARRAY> array_ts(1);
82 if (amrex::ParallelDescriptor::IOProcessor())
84 int ntimes_io = array_ts[0].get_vshape()[0];
85 for (
int nt(0); nt < ntimes_io; nt++)
88 bry_times.push_back((*(array_ts[0].get_data() + nt)) * amrex::Real(60.0) * amrex::Real(60.0) * amrex::Real(24.0));
97 if (amrex::ParallelDescriptor::IOProcessor()) {
100 amrex::Error(
"Time series of boundary data must be given at at least two times");
103 amrex::ParallelDescriptor::Bcast(&ntimes,1,ioproc);
104 if (!(amrex::ParallelDescriptor::IOProcessor())) {
113 const auto& lo =
domain.loVect();
114 const auto& hi =
domain.hiVect();
118 amrex::Box xhi_bx(amrex::IntVect(hi[0]+1 , lo[1]+
index_type[1]-1, lo[2]),
119 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
122 amrex::Box yhi_bx(amrex::IntVect(lo[0]+
index_type[0]-1, hi[1]+1 , lo[2]),
123 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
125 xlo_bx.makeSlab(2,0);
126 xhi_bx.makeSlab(2,0);
127 ylo_bx.makeSlab(2,0);
128 yhi_bx.makeSlab(2,0);
151 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
154 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
157 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
160 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
171 amrex::Arena* Arena_Used = amrex::The_Arena();
173 Arena_Used = amrex::The_Pinned_Arena();
180 for (
int nt=0; nt <
bry_times.size()-1; nt++) {
191 amrex::FArrayBox crse_xlo_dat;
192 amrex::FArrayBox crse_xhi_dat;
193 amrex::FArrayBox crse_ylo_dat;
194 amrex::FArrayBox crse_yhi_dat;
197 const auto& crse_lo =
m_geom[0].Domain().loVect();
198 const auto& crse_hi =
m_geom[0].Domain().hiVect();
200 amrex::Box crse_xlo_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_lo[1]+
index_type[1]-1, crse_lo[2]),
202 amrex::Box crse_xhi_bx(amrex::IntVect(crse_hi[0]+1 , crse_lo[1]+
index_type[1]-1, crse_lo[2]),
203 amrex::IntVect(crse_hi[0]+1 , crse_hi[1]+1 , crse_hi[2]),
index_type);
204 amrex::Box crse_ylo_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_lo[1]+
index_type[1]-1, crse_lo[2]),
206 amrex::Box crse_yhi_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_hi[1]+1 , crse_lo[2]),
207 amrex::IntVect(crse_hi[0]+1 , crse_hi[1]+1 , crse_hi[2]),
index_type);
209 crse_xlo_bx.makeSlab(2,0);
210 crse_xhi_bx.makeSlab(2,0);
211 crse_ylo_bx.makeSlab(2,0);
212 crse_yhi_bx.makeSlab(2,0);
215 crse_xlo_dat = amrex::FArrayBox(crse_xlo_bx, 1, Arena_Used);
216 crse_xhi_dat = amrex::FArrayBox(crse_xhi_bx, 1, Arena_Used);
217 crse_ylo_dat = amrex::FArrayBox(crse_ylo_bx, 1, Arena_Used);
218 crse_yhi_dat = amrex::FArrayBox(crse_yhi_bx, 1, Arena_Used);
228 amrex::Print() <<
"Reading in " <<
field_name <<
" at (after) time " << i_time_after << std::endl;
234 read_in_at_time(crse_xlo_dat, crse_xhi_dat, crse_ylo_dat, crse_yhi_dat, i_time_after);
249 amrex::Print() <<
"Reading in " <<
field_name <<
" at (after) time " << i_time_after << std::endl;
262 amrex::Print() <<
"Reading in " <<
field_name <<
" at time " << i_time_after << std::endl;
264 read_in_at_time(crse_xlo_dat, crse_xhi_dat, crse_ylo_dat, crse_yhi_dat, i_time_after);
276 amrex::Array4<amrex::Real> xlo_interp_arr =
xlo_dat_interp.array();
277 amrex::Array4<amrex::Real> xhi_interp_arr =
xhi_dat_interp.array();
278 amrex::Array4<amrex::Real> ylo_interp_arr =
ylo_dat_interp.array();
279 amrex::Array4<amrex::Real> yhi_interp_arr =
yhi_dat_interp.array();
281 amrex::Array4<amrex::Real> xlo_before_arr =
xlo_dat_before.array();
282 amrex::Array4<amrex::Real> xhi_before_arr =
xhi_dat_before.array();
283 amrex::Array4<amrex::Real> ylo_before_arr =
ylo_dat_before.array();
284 amrex::Array4<amrex::Real> yhi_before_arr =
yhi_dat_before.array();
286 amrex::Array4<amrex::Real> xlo_after_arr =
xlo_dat_after.array();
287 amrex::Array4<amrex::Real> xhi_after_arr =
xhi_dat_after.array();
288 amrex::Array4<amrex::Real> ylo_after_arr =
ylo_dat_after.array();
289 amrex::Array4<amrex::Real> yhi_after_arr =
yhi_dat_after.array();
291 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
292 amrex::ParallelFor(
xlo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
294 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;
298 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
299 amrex::ParallelFor(
xhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
301 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;
305 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
306 amrex::ParallelFor(
ylo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
308 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;
312 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
313 amrex::ParallelFor(
yhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
315 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;
328 amrex::FArrayBox& fab_xhi,
329 amrex::FArrayBox& fab_ylo,
330 amrex::FArrayBox& fab_yhi,
335 amrex::Print() <<
"Actually reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
341 if (amrex::ParallelDescriptor::IOProcessor())
345 int nx, ny, nz, n_plane;
346 int i, j, k, ioff, joff;
347 if (last4 ==
"west") {
348 amrex::Box my_box = fab_xlo.box();
351 ny = arrays[iv].get_vshape()[1];
353 nz = arrays[iv].get_vshape()[1];
354 ny = arrays[iv].get_vshape()[2];
357 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
359 i = my_box.smallEnd()[0];
360 joff = my_box.smallEnd()[1];
362 amrex::Array4<amrex::Real> fab_arr = fab_xlo.array();
364 for (
int n(0); n < n_plane; n++) {
367 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
369 }
else if (last4 ==
"east") {
370 amrex::Box my_box = fab_xhi.box();
373 ny = arrays[iv].get_vshape()[1];
375 nz = arrays[iv].get_vshape()[1];
376 ny = arrays[iv].get_vshape()[2];
379 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
381 i = my_box.smallEnd()[0];
382 joff = my_box.smallEnd()[1];
384 amrex::Array4<amrex::Real> fab_arr = fab_xhi.array();
385 for (
int n(0); n < n_plane; n++) {
388 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
390 }
else if (last5 ==
"south") {
391 amrex::Box my_box = fab_ylo.box();
394 nx = arrays[iv].get_vshape()[1];
396 nz = arrays[iv].get_vshape()[1];
397 nx = arrays[iv].get_vshape()[2];
400 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
402 j = my_box.smallEnd()[1];
403 ioff = my_box.smallEnd()[0];
405 amrex::Array4<amrex::Real> fab_arr = fab_ylo.array();
406 for (
int n(0); n < n_plane; n++) {
409 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
411 }
else if (last5 ==
"north") {
412 amrex::Box my_box = fab_yhi.box();
415 nx = arrays[iv].get_vshape()[1];
417 nz = arrays[iv].get_vshape()[1];
418 nx = arrays[iv].get_vshape()[2];
421 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
423 j = my_box.smallEnd()[1];
424 ioff = my_box.smallEnd()[0];
426 amrex::Array4<amrex::Real> fab_arr = fab_yhi.array();
427 for (
int n(0); n < n_plane; n++) {
430 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
436 amrex::ParallelDescriptor::Barrier();
441 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
442 amrex::ParallelDescriptor::Bcast(fab_xlo.dataPtr(),fab_xlo.box().numPts(),ioproc);
443 amrex::ParallelDescriptor::Bcast(fab_xhi.dataPtr(),fab_xhi.box().numPts(),ioproc);
444 amrex::ParallelDescriptor::Bcast(fab_ylo.dataPtr(),fab_ylo.box().numPts(),ioproc);
445 amrex::ParallelDescriptor::Bcast(fab_yhi.dataPtr(),fab_yhi.box().numPts(),ioproc);
447 amrex::Print() <<
"DONE reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
456 amrex::Array4<amrex::Real> crse_arr = dat_crse.array();
457 amrex::Array4<amrex::Real> fine_arr = dat_fine.array();
459 const auto& bhi = ubound(dat_crse.box());
464 amrex::Real xfac = 1.0 /
static_cast<amrex::Real
>(rx);
465 amrex::Real yfac = 1.0 /
static_cast<amrex::Real
>(ry);
468 if (dat_crse.box().length(0) == 1) {
470 if (dat_crse.box().ixType()[1] == 0) {
471 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
473 int i_f = (i == -1) ? -1 : rx*i;
475 fine_arr(i_f,j,k) = crse_arr(i,j,k);
477 fine_arr(i_f,ry*j ,k) = crse_arr(i,j,k);
479 for (
int n = 1; n < ry; n++) {
480 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));
486 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
488 int i_f = (i == -1) ? -1 : rx*i;
490 fine_arr(i_f,j,k) = crse_arr(i,j,k);
492 fine_arr(i_f,ry*j,k) = crse_arr(i,j,k);
494 for (
int n = 1; n < ry; n++) {
495 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));
501 }
else if (dat_crse.box().length(1) == 1) {
504 if (dat_crse.box().ixType()[0] == 0) {
505 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
507 int j_f = (j == -1) ? -1 : ry*j;
509 fine_arr(i,j_f,k) = crse_arr(i,j,k);
511 fine_arr(rx*i ,j_f,k) = crse_arr(i,j,k);
513 for (
int n = 1; n < rx; n++) {
514 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));
520 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
522 int j_f = (j == -1) ? -1 : ry*j;
524 fine_arr(i,j_f,k) = crse_arr(i,j,k);
526 fine_arr(rx*i,j_f,k) = crse_arr(i,j,k);
528 for (
int n = 1; n < rx; n++) {
529 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));
536 amrex::Abort(
" What am I doing here??");