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 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::low)] ==
true) {
192 amrex::ParallelFor(
xlo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
194 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;
198 if (
var_need_data[amrex::Orientation(amrex::Direction::x,amrex::Orientation::high)] ==
true) {
199 amrex::ParallelFor(
xhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
201 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;
205 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::low)] ==
true) {
206 amrex::ParallelFor(
ylo_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
208 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;
212 if (
var_need_data[amrex::Orientation(amrex::Direction::y,amrex::Orientation::high)] ==
true) {
213 amrex::ParallelFor(
yhi_dat_interp.box(), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
215 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;
228 amrex::FArrayBox& fab_xhi,
229 amrex::FArrayBox& fab_ylo,
230 amrex::FArrayBox& fab_yhi,
238 amrex::Print() <<
"Reading in " <<
field_name <<
" at time " <<
bry_times[itime] << std::endl;
244 if (amrex::ParallelDescriptor::IOProcessor())
248 int nx, ny, nz, n_plane;
249 int i, j, k, ioff, joff;
250 if (last4 ==
"west") {
251 amrex::Box my_box = fab_xlo.box();
254 ny = arrays[iv].get_vshape()[1];
256 nz = arrays[iv].get_vshape()[1];
257 ny = arrays[iv].get_vshape()[2];
260 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
262 i = my_box.smallEnd()[0];
263 joff = my_box.smallEnd()[1];
265 amrex::Array4<amrex::Real> fab_arr = fab_xlo.array();
266 for (
int n(0); n < n_plane; n++) {
269 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
271 }
else if (last4 ==
"east") {
272 amrex::Box my_box = fab_xhi.box();
275 ny = arrays[iv].get_vshape()[1];
277 nz = arrays[iv].get_vshape()[1];
278 ny = arrays[iv].get_vshape()[2];
281 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
283 i = my_box.smallEnd()[0];
284 joff = my_box.smallEnd()[1];
286 amrex::Array4<amrex::Real> fab_arr = fab_xhi.array();
287 for (
int n(0); n < n_plane; n++) {
290 fab_arr(i, j+joff, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
292 }
else if (last5 ==
"south") {
293 amrex::Box my_box = fab_ylo.box();
296 nx = arrays[iv].get_vshape()[1];
298 nz = arrays[iv].get_vshape()[1];
299 nx = arrays[iv].get_vshape()[2];
302 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
304 j = my_box.smallEnd()[1];
305 ioff = my_box.smallEnd()[0];
307 amrex::Array4<amrex::Real> fab_arr = fab_ylo.array();
308 for (
int n(0); n < n_plane; n++) {
311 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
313 }
else if (last5 ==
"north") {
314 amrex::Box my_box = fab_yhi.box();
317 nx = arrays[iv].get_vshape()[1];
319 nz = arrays[iv].get_vshape()[1];
320 nx = arrays[iv].get_vshape()[2];
323 AMREX_ALWAYS_ASSERT(my_box.numPts() == n_plane);
325 j = my_box.smallEnd()[1];
326 ioff = my_box.smallEnd()[0];
328 amrex::Array4<amrex::Real> fab_arr = fab_yhi.array();
329 for (
int n(0); n < n_plane; n++) {
332 fab_arr(i+ioff, j, k, 0) =
static_cast<amrex::Real
>(*(arrays[iv].get_data() + n));
338 amrex::ParallelDescriptor::Barrier();
343 int ioproc = amrex::ParallelDescriptor::IOProcessorNumber();
344 amrex::ParallelDescriptor::Bcast(fab_xlo.dataPtr(),fab_xlo.box().numPts(),ioproc);
345 amrex::ParallelDescriptor::Bcast(fab_xhi.dataPtr(),fab_xhi.box().numPts(),ioproc);
346 amrex::ParallelDescriptor::Bcast(fab_ylo.dataPtr(),fab_ylo.box().numPts(),ioproc);
347 amrex::ParallelDescriptor::Bcast(fab_yhi.dataPtr(),fab_yhi.box().numPts(),ioproc);