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));
90 if (amrex::ParallelDescriptor::IOProcessor()) {
93 amrex::Error(
"Time series of boundary data must be given at at least two times");
96 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
97 amrex::ParallelDescriptor::Bcast(&ntimes,1,ioproc);
98 if (!(amrex::ParallelDescriptor::IOProcessor())) {
107 const auto& lo =
domain.loVect();
108 const auto& hi =
domain.hiVect();
112 amrex::Box xhi_bx(amrex::IntVect(hi[0]+1 , lo[1]+
index_type[1]-1, lo[2]),
113 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
116 amrex::Box yhi_bx(amrex::IntVect(lo[0]+
index_type[0]-1, hi[1]+1 , lo[2]),
117 amrex::IntVect(hi[0]+1 , hi[1]+1 , hi[2]),
index_type);
119 xlo_bx.makeSlab(2,0);
120 xhi_bx.makeSlab(2,0);
121 ylo_bx.makeSlab(2,0);
122 yhi_bx.makeSlab(2,0);
145 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
148 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
151 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
154 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
165 amrex::Arena* Arena_Used = amrex::The_Arena();
167 Arena_Used = amrex::The_Pinned_Arena();
174 for (
int nt=0; nt <
bry_times.size()-1; nt++) {
185 amrex::FArrayBox crse_xlo_dat;
186 amrex::FArrayBox crse_xhi_dat;
187 amrex::FArrayBox crse_ylo_dat;
188 amrex::FArrayBox crse_yhi_dat;
191 const auto& crse_lo =
m_geom[0].Domain().loVect();
192 const auto& crse_hi =
m_geom[0].Domain().hiVect();
194 amrex::Box crse_xlo_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_lo[1]+
index_type[1]-1, crse_lo[2]),
196 amrex::Box crse_xhi_bx(amrex::IntVect(crse_hi[0]+1 , crse_lo[1]+
index_type[1]-1, crse_lo[2]),
197 amrex::IntVect(crse_hi[0]+1 , crse_hi[1]+1 , crse_hi[2]),
index_type);
198 amrex::Box crse_ylo_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_lo[1]+
index_type[1]-1, crse_lo[2]),
200 amrex::Box crse_yhi_bx(amrex::IntVect(crse_lo[0]+
index_type[0]-1, crse_hi[1]+1 , crse_lo[2]),
201 amrex::IntVect(crse_hi[0]+1 , crse_hi[1]+1 , crse_hi[2]),
index_type);
203 crse_xlo_bx.makeSlab(2,0);
204 crse_xhi_bx.makeSlab(2,0);
205 crse_ylo_bx.makeSlab(2,0);
206 crse_yhi_bx.makeSlab(2,0);
209 crse_xlo_dat = amrex::FArrayBox(crse_xlo_bx, 1, Arena_Used);
210 crse_xhi_dat = amrex::FArrayBox(crse_xhi_bx, 1, Arena_Used);
211 crse_ylo_dat = amrex::FArrayBox(crse_ylo_bx, 1, Arena_Used);
212 crse_yhi_dat = amrex::FArrayBox(crse_yhi_bx, 1, Arena_Used);
222 amrex::Print() <<
"Reading in " <<
field_name <<
" at (after) time " << i_time_after << std::endl;
228 read_in_at_time(crse_xlo_dat, crse_xhi_dat, crse_ylo_dat, crse_yhi_dat, i_time_after);
243 amrex::Print() <<
"Reading in " <<
field_name <<
" at (after) time " << i_time_after << std::endl;
256 amrex::Print() <<
"Reading in " <<
field_name <<
" at time " << i_time_after << std::endl;
258 read_in_at_time(crse_xlo_dat, crse_xhi_dat, crse_ylo_dat, crse_yhi_dat, i_time_after);
270 amrex::Array4<amrex::Real> xlo_interp_arr =
xlo_dat_interp.array();
271 amrex::Array4<amrex::Real> xhi_interp_arr =
xhi_dat_interp.array();
272 amrex::Array4<amrex::Real> ylo_interp_arr =
ylo_dat_interp.array();
273 amrex::Array4<amrex::Real> yhi_interp_arr =
yhi_dat_interp.array();
275 amrex::Array4<amrex::Real> xlo_before_arr =
xlo_dat_before.array();
276 amrex::Array4<amrex::Real> xhi_before_arr =
xhi_dat_before.array();
277 amrex::Array4<amrex::Real> ylo_before_arr =
ylo_dat_before.array();
278 amrex::Array4<amrex::Real> yhi_before_arr =
yhi_dat_before.array();
280 amrex::Array4<amrex::Real> xlo_after_arr =
xlo_dat_after.array();
281 amrex::Array4<amrex::Real> xhi_after_arr =
xhi_dat_after.array();
282 amrex::Array4<amrex::Real> ylo_after_arr =
ylo_dat_after.array();
283 amrex::Array4<amrex::Real> yhi_after_arr =
yhi_dat_after.array();
285 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
286 amrex::ParallelFor(
xlo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
288 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;
292 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
293 amrex::ParallelFor(
xhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
295 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;
299 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
300 amrex::ParallelFor(
ylo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
302 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;
306 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
307 amrex::ParallelFor(
yhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
309 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;
322 amrex::FArrayBox& fab_xhi,
323 amrex::FArrayBox& fab_ylo,
324 amrex::FArrayBox& fab_yhi,
329 amrex::Print() <<
"Actually reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
335 if (amrex::ParallelDescriptor::IOProcessor())
339 int nx, ny, nz, n_plane;
340 int i, j, k, ioff, joff;
341 if (last4 ==
"west") {
342 amrex::Box my_box = fab_xlo.box();
345 ny = arrays[iv].get_vshape()[1];
347 nz = arrays[iv].get_vshape()[1];
348 ny = arrays[iv].get_vshape()[2];
351 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
353 i = my_box.smallEnd()[0];
354 joff = my_box.smallEnd()[1];
356 amrex::Array4<amrex::Real> fab_arr = fab_xlo.array();
358 for (
int n(0); n < n_plane; n++) {
361 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
363 }
else if (last4 ==
"east") {
364 amrex::Box my_box = fab_xhi.box();
367 ny = arrays[iv].get_vshape()[1];
369 nz = arrays[iv].get_vshape()[1];
370 ny = arrays[iv].get_vshape()[2];
373 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
375 i = my_box.smallEnd()[0];
376 joff = my_box.smallEnd()[1];
378 amrex::Array4<amrex::Real> fab_arr = fab_xhi.array();
379 for (
int n(0); n < n_plane; n++) {
382 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
384 }
else if (last5 ==
"south") {
385 amrex::Box my_box = fab_ylo.box();
388 nx = arrays[iv].get_vshape()[1];
390 nz = arrays[iv].get_vshape()[1];
391 nx = arrays[iv].get_vshape()[2];
394 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
396 j = my_box.smallEnd()[1];
397 ioff = my_box.smallEnd()[0];
399 amrex::Array4<amrex::Real> fab_arr = fab_ylo.array();
400 for (
int n(0); n < n_plane; n++) {
403 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
405 }
else if (last5 ==
"north") {
406 amrex::Box my_box = fab_yhi.box();
409 nx = arrays[iv].get_vshape()[1];
411 nz = arrays[iv].get_vshape()[1];
412 nx = arrays[iv].get_vshape()[2];
415 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
417 j = my_box.smallEnd()[1];
418 ioff = my_box.smallEnd()[0];
420 amrex::Array4<amrex::Real> fab_arr = fab_yhi.array();
421 for (
int n(0); n < n_plane; n++) {
424 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
430 amrex::ParallelDescriptor::Barrier();
435 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
436 amrex::ParallelDescriptor::Bcast(fab_xlo.dataPtr(),fab_xlo.box().numPts(),ioproc);
437 amrex::ParallelDescriptor::Bcast(fab_xhi.dataPtr(),fab_xhi.box().numPts(),ioproc);
438 amrex::ParallelDescriptor::Bcast(fab_ylo.dataPtr(),fab_ylo.box().numPts(),ioproc);
439 amrex::ParallelDescriptor::Bcast(fab_yhi.dataPtr(),fab_yhi.box().numPts(),ioproc);
441 amrex::Print() <<
"DONE reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
450 amrex::Array4<amrex::Real> crse_arr = dat_crse.array();
451 amrex::Array4<amrex::Real> fine_arr = dat_fine.array();
453 const auto& bhi = ubound(dat_crse.box());
458 amrex::Real xfac = 1.0 /
static_cast<amrex::Real
>(rx);
459 amrex::Real yfac = 1.0 /
static_cast<amrex::Real
>(ry);
462 if (dat_crse.box().length(0) == 1) {
464 if (dat_crse.box().ixType()[1] == 0) {
465 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
467 int i_f = (i == -1) ? -1 : rx*i;
469 fine_arr(i_f,j,k) = crse_arr(i,j,k);
471 fine_arr(i_f,ry*j ,k) = crse_arr(i,j,k);
473 for (
int n = 1; n < ry; n++) {
474 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));
480 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
482 int i_f = (i == -1) ? -1 : rx*i;
484 fine_arr(i_f,j,k) = crse_arr(i,j,k);
486 fine_arr(i_f,ry*j,k) = crse_arr(i,j,k);
488 for (
int n = 1; n < ry; n++) {
489 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));
495 }
else if (dat_crse.box().length(1) == 1) {
498 if (dat_crse.box().ixType()[0] == 0) {
499 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
501 int j_f = (j == -1) ? -1 : ry*j;
503 fine_arr(i,j_f,k) = crse_arr(i,j,k);
505 fine_arr(rx*i ,j_f,k) = crse_arr(i,j,k);
507 for (
int n = 1; n < rx; n++) {
508 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));
514 amrex::ParallelFor(dat_crse.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
516 int j_f = (j == -1) ? -1 : ry*j;
518 fine_arr(i,j_f,k) = crse_arr(i,j,k);
520 fine_arr(rx*i,j_f,k) = crse_arr(i,j,k);
522 for (
int n = 1; n < rx; n++) {
523 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));
530 amrex::Abort(
" What am I doing here??");