REMORA
Regional Modeling of Oceans Refined Adaptively
Loading...
Searching...
No Matches
REMORA_init_bcs.cpp
Go to the documentation of this file.
1#include <AMReX_Vector.H>
2#include <AMReX_BC_TYPES.H>
3#include <AMReX_ParmParse.H>
4
5#include <REMORA.H>
6
7using namespace amrex;
8
10{
11 const int xvel_bc_idx = xvel_bc();
12 const int yvel_bc_idx = yvel_bc();
13 const int zvel_bc_idx = zvel_bc();
14 const int ubar_bc_idx = ubar_bc();
15 const int vbar_bc_idx = vbar_bc();
16 const int zeta_bc_idx = zeta_bc();
17 const int tke_bc_idx = tke_bc();
19 const int foextrap_bc_idx = foextrap_bc();
20 const int u2d_simple_bc_idx = u2d_simple_bc();
21 const int v2d_simple_bc_idx = v2d_simple_bc();
22
23 // Every cell-centered tracer is named for itself, so temp, salt, and each additional
24 // passive or biology scalar can be configured independently. cons_names is
25 // {"temp", "salt", <scalar names>} and is filled by init_scalar_metadata.
26 std::vector<std::string> bcvar_names(BCVars::NumTypes(ncons),"");
27 for (int icomp = 0; icomp < ncons; ++icomp) {
29 }
33 bcvar_names[ubar_bc_idx] = "ubar";
34 bcvar_names[vbar_bc_idx] = "vbar";
35 bcvar_names[zeta_bc_idx] = "zeta";
36 bcvar_names[tke_bc_idx] = "tke";
37
38 phys_bc_type.assign(num_bc_vars(), {});
39 m_bc_extdir_vals.assign(num_bc_vars(), {});
40
41 // One entry per BdyVars slot plus a trailing scratch slot for the variables that
42 // have no NetCDF boundary lane at all (see the bdy_index assignment below)
43 phys_bc_need_data.assign(num_bdy_vars()+1, {});
44
45 auto uses_velocity_input = [=] (int bcvar_type) noexcept {
47 };
48
49 // Every tracer takes an inflow value; Tracer_comp starts the tracers past salt, not the tracers.
50 auto uses_tracer_input = [this] (int bcvar_type) noexcept {
52 };
53
54 // prefix_is_side: pp is prefixed by a side (remora.bc.xlo), not a variable (remora.bc.temp),
55 // which decides how a value under it is keyed. Not set_bcs_by_var -- the z faces take the
56 // side form in both modes.
58 (ParmParse& pp, int bcvar_type, Orientation ori, const std::string& bc_type_string,
59 bool prefix_is_side) {
60 // A side keyword means the same thing for every variable it covers: no tracer,
61 // dye or biology, is quietly given a different condition than the one asked
62 // for. A file-driven side therefore expects boundary data for each tracer the
63 // run carries, named as ROMS names it (tracer_west, NO3_west, ...), and
64 // NCTimeSeriesBoundary aborts by name if the file has none. Runs whose
65 // boundary file covers temp and salt alone either drop the extra tracers
66 // (remora.nscalar = 0) or move to remora.boundary_per_variable = true, where
67 // each tracer's condition is stated outright.
68
69 if (bc_type_string == "symmetry")
70 {
73 domain_bc_type[ori] = "Symmetry";
74 }
75 else if (bc_type_string == "outflow")
76 {
79 domain_bc_type[ori] = "Outflow";
80 }
81 else if (bc_type_string == "inflow")
82 {
85 domain_bc_type[ori] = "Inflow";
86
88 std::vector<Real> v;
89 pp.getarr("velocity", v, 0, AMREX_SPACEDIM);
91 } else if (uses_tracer_input(bcvar_type)) {
92 // A side covers every tracer, so each is named outright and there is no keyword
93 // standing in for "the rest": a value always says which tracer it is for. A
94 // variable prefix names one already, so the bare keyword serves there.
95 std::string const value_key = prefix_is_side ? bcvar_names[bcvar_type] : "value";
96 Real tracer_in = zero;
97 // Value a tracer takes on an inflow face: keyed by the tracer's own name under a
98 // side prefix (remora.bc.xlo.temp), and by "value" under a variable prefix.
99 bool have_value = pp.query(value_key, tracer_in);
100 // Without a value the ext_dir fill would write the placeholder below into the
101 // ghost cells. Velocity inflow already insists on one: the getarr above aborts.
102 if (!have_value) {
103 amrex::Abort("Inflow boundary for " + bcvar_names[bcvar_type] +
104 " needs an inflow value: set " + pp.prefixedName(value_key));
105 }
107 }
108 }
109 else if (bc_type_string == "noslipwall")
110 {
113 domain_bc_type[ori] = "NoSlipWall";
114
116 std::vector<Real> v;
117
118 // Velocity components at the face, one per dimension. Required on an inflow face;
119 // optional on a no-slip wall, where leaving it out keeps the zero default. The
120 // normal component is zeroed either way, so only tangential values take effect.
121 if (pp.queryarr("velocity", v, 0, AMREX_SPACEDIM))
122 {
123 v[ori.coordDir()] = zero;
125 }
126 }
127 }
128 else if (bc_type_string == "slipwall")
129 {
132 domain_bc_type[ori] = "SlipWall";
133 }
134 else if (bc_type_string == "clamped")
135 {
138 domain_bc_type[ori] = "Clamped";
140 }
141 else if (bc_type_string == "chapman")
142 {
145 domain_bc_type[ori] = "Chapman";
147
148 if (bcvar_type != zeta_bc_idx) {
149 amrex::Abort("Chapman BC can only be applied to zeta");
150 }
151 }
152 else if (bc_type_string == "flather")
153 {
156 domain_bc_type[ori] = "Flather";
158
160 amrex::Abort("Flather BC can only be applied to ubar or vbar");
161 }
162 }
163 else if (bc_type_string == "orlanski_rad")
164 {
167 domain_bc_type[ori] = "Orlanski Radiation";
168 }
169 else if (bc_type_string == "orlanski_rad_nudg")
170 {
173 domain_bc_type[ori] = "Orlanski Radiation with nudging";
175 }
176 else if (bc_type_string == "periodic")
177 {
178 if (!geom[0].isPeriodic(ori.coordDir())) {
179 amrex::Abort("Periodic boundary specified in a non-periodic direction");
180 }
183 domain_bc_type[ori] = "Periodic";
184 }
185 else
186 {
189 }
190
191 if (geom[0].isPeriodic(ori.coordDir()))
192 {
193 domain_bc_type[ori] = "Periodic";
195 {
199 amrex::Abort("Wrong BC type for periodic boundary");
200 }
201 }
202
204 {
205 amrex::Print() << "BC Type specified for variable " << bcvar_names[bcvar_type] << " is " << bc_type_string << std::endl;
206 amrex::Abort("This BC type is unknown");
207 }
208 };
209
210 auto f_by_side = [this, &f_set_var_bc] (std::string const& bcid, Orientation ori)
211 {
212 ParmParse pp("remora.bc."+bcid);
213 std::string bc_type_in = "null";
214 // Default z directions to slipwall
215 if (bcid=="zlo" or bcid=="zhi") bc_type_in = "slipwall";
216 pp.queryAdd("type", bc_type_in);
217 std::string bc_type = amrex::toLower(bc_type_in);
218
219 for (int icomp = 0; icomp < num_bc_vars(); ++icomp) {
220 f_set_var_bc(pp, icomp, ori, bc_type, true);
221 }
222 };
223
224 auto f_by_var = [this, &f_set_var_bc, zvel_bc_idx] (std::string const& varname, int bcvar_type,
225 std::string const& fallback_varname = "")
226 {
227 amrex::Vector<Orientation> orientations = {Orientation(Direction::x,Orientation::low), Orientation(Direction::y,Orientation::low),Orientation(Direction::x,Orientation::high),Orientation(Direction::y,Orientation::high)}; // west, south, east, north [matches ROMS]
228 std::vector<std::string> bc_types = {"null","null","null","null"};
229
230 // Additional scalars are addressable by their own name, but fall back to the
231 // shared "scalar" keyword when no per-tracer entry is given so that inputs
232 // written before tracers were individually addressable keep working
233 std::string prefix = "remora.bc." + varname;
234 if (!fallback_varname.empty() && !ParmParse(prefix).contains("type")) {
235 prefix = "remora.bc." + fallback_varname;
236 }
238 std::string bc_type_in = "null";
239 // default zvel to outflow
240 if (bcvar_type == zvel_bc_idx) {
241 bc_types = {"outflow","outflow","outflow","outflow"};
242 for (int i=0; i<4; i++) {
243 auto ori = orientations[i];
244 if (geom[0].isPeriodic(ori.coordDir())) {
245 bc_types[i] = "periodic";
246 }
247 }
248 }
249 pp.queryarr("type", bc_types);
250 // queryarr resizes bc_types to however many tokens the input carries, and the loop
251 // below reads four of them by position, so a short list would run off the end. It has
252 // to abort rather than assert: assertions are compiled out in this build.
253 if (bc_types.size() != 4) {
254 amrex::Abort(pp.prefixedName("type") + " needs four entries, one per side in the "
255 "order West South East North; got " + std::to_string(bc_types.size()));
256 }
257 for (int i=0; i<4; i++) {
258 std::string bc_type = amrex::toLower(bc_types[i]);
259 auto ori = orientations[i];
261 }
262 };
263
264 // Variables with no entry here point at the trailing scratch slot of
265 // phys_bc_need_data, which means "this variable never reads boundary data from file"
267 for (int icomp = 0; icomp < ncons; ++icomp) {
269 }
275
276 for (OrientationIter oit; oit; ++oit) {
277 Orientation ori = oit();
278 // These are simply defaults for Dirichlet faces -- they should be over-written below if needed.
279 // Tracers reach ext_dir only through inflow, which now aborts without a value.
282 for (int icomp = Tracer_comp; icomp < ncons; ++icomp) {
283 m_bc_extdir_vals[icomp][ori] = Real(1.e21) + static_cast<Real>(icomp - Tracer_comp);
284 }
285
286 m_bc_extdir_vals[xvel_bc_idx][ori] = zero; // default
289
290 m_bc_extdir_vals[ubar_bc_idx][ori] = zero; // default
294 }
295
296 // Whether to specify boundary conditions by variable (then side).
297 // Alternative is to do it by side by indicating keywords that indicate multiple variables
298 set_bcs_by_var = false;
299
300 ParmParse pp("remora");
301 pp.queryAdd("boundary_per_variable", set_bcs_by_var);
302 // Any tracer named for itself counts as a per-variable specification too
303 bool any_cons_bc_specified = false;
304 for (int icomp = 0; icomp < ncons; ++icomp) {
305 any_cons_bc_specified = any_cons_bc_specified || pp.contains(("bc."+cons_names[icomp]+".type").c_str());
306 }
307 // Check whether variable specification matches flag in inputs file
309 pp.contains("bc.scalar.type") ||
310 pp.contains("bc.u.type") ||
311 pp.contains("bc.v.type") ||
312 pp.contains("bc.w.type") ||
313 pp.contains("bc.ubar.type") ||
314 pp.contains("bc.vbar.type") ||
315 pp.contains("bc.zeta.type") ||
316 pp.contains("bc.tke.type"))) {
317 amrex::Abort("boundary_per_variable set to false, but per-variable boundary conditions are specified. Use bc.{x,y}{lo,hi}.type instead");
318 }
319 if (set_bcs_by_var && (pp.contains("bc.xlo.type") ||
320 pp.contains("bc.xhi.type") ||
321 pp.contains("bc.ylo.type") ||
322 pp.contains("bc.yhi.type"))) {
323 amrex::Abort("boundary_per_variable set to true, but per-side boundary conditions are specified. Use bc.{temp,salt,etc}.type instead");
324 }
325 if (!set_bcs_by_var) {
326 f_by_side("xlo", Orientation(Direction::x,Orientation::low));
327 f_by_side("xhi", Orientation(Direction::x,Orientation::high));
328 f_by_side("ylo", Orientation(Direction::y,Orientation::low));
329 f_by_side("yhi", Orientation(Direction::y,Orientation::high));
330 } else {
333 for (int icomp = Tracer_comp; icomp < ncons; ++icomp) {
334 f_by_var(cons_names[icomp], icomp, "scalar");
335 }
336 f_by_var("u", xvel_bc_idx);
337 f_by_var("v", yvel_bc_idx);
338 f_by_var("w", zvel_bc_idx);
339 f_by_var("ubar", ubar_bc_idx);
340 f_by_var("vbar", vbar_bc_idx);
341 f_by_var("zeta", zeta_bc_idx);
342 f_by_var("tke", tke_bc_idx);
343 }
344
345 // Always specify z direction by side keyword
346 f_by_side("zlo", Orientation(Direction::z,Orientation::low));
347 f_by_side("zhi", Orientation(Direction::z,Orientation::high));
348
349 // *****************************************************************************
350 //
351 // Here we translate the physical boundary conditions -- one type per face --
352 // into logical boundary conditions for each velocity component
353 //
354 // *****************************************************************************
355 {
358
359 for (OrientationIter oit; oit; ++oit) {
360 Orientation ori = oit();
361 int dir = ori.coordDir();
362 Orientation::Side side = ori.faceDir();
363 // only do this for xvel and yvel
364 for (int i = 0; i < 2; i++) {
365 auto const bct = phys_bc_type[xvel_bc_idx+i][ori];
366 if ( bct == REMORA_BC::symmetry )
367 {
368 if (side == Orientation::low) {
370 if (i==1)
372 } else {
374 if (i==1)
376 }
377 }
378 else if (bct == REMORA_BC::outflow)
379 {
380 if (side == Orientation::low) {
382 } else {
384 }
385 }
386 else if (bct == REMORA_BC::inflow)
387 {
388 if (side == Orientation::low) {
390 } else {
392 }
393 }
394 else if (bct == REMORA_BC::no_slip_wall)
395 {
396 if (side == Orientation::low) {
398 } else {
400 }
401 }
402 else if (bct == REMORA_BC::slip_wall)
403 {
404 if (side == Orientation::low) {
406 if (i==1) {
407 // Only normal direction has ext_dir
409 }
410
411 } else {
413 if (i==1) {
414 // Only normal direction has ext_dir
416 }
417 }
418 }
419 else if (bct == REMORA_BC::periodic)
420 {
421 if (side == Orientation::low) {
423 } else {
425 }
426 }
427 else if (bct == REMORA_BC::clamped)
428 {
429 if (side == Orientation::low) {
431 } else {
433 }
434 }
435 else if (bct == REMORA_BC::orlanski_rad)
436 {
437 if (side == Orientation::low) {
439 } else {
441 }
442 }
444 {
445 if (side == Orientation::low) {
447 } else {
449 }
450 }
451 else
452 {
453 amrex::Abort("Velocity boundary condition not validly specified");
454 }
455 }
456
457 // Always set zvel_bc to foextrap
458 if (side == Orientation::low) {
460 } else {
462 }
463 }
464 }
465
466 // *****************************************************************************
467 //
468 // Here we translate the physical boundary conditions -- one type per face --
469 // into logical boundary conditions for each cell-centered variable
470 //
471 // *****************************************************************************
472 {
473 for (OrientationIter oit; oit; ++oit) {
474 Orientation ori = oit();
475 int dir = ori.coordDir();
476 Orientation::Side side = ori.faceDir();
477 for (int i = 0; i < ncons; i++) {
478 auto const bct = phys_bc_type[BCVars::cons_bc+i][ori];
479 if ( bct == REMORA_BC::symmetry )
480 {
481 if (side == Orientation::low) {
483 } else {
485 }
486 }
487 else if ( bct == REMORA_BC::outflow)
488 {
489 if (side == Orientation::low) {
491 } else {
493 }
494 }
495 else if ( bct == REMORA_BC::no_slip_wall)
496 {
497 if (side == Orientation::low) {
499 } else {
501 }
502 }
503 else if (bct == REMORA_BC::slip_wall)
504 {
505 if (side == Orientation::low) {
507 } else {
509 }
510 }
511 else if (bct == REMORA_BC::inflow)
512 {
513 if (side == Orientation::low) {
515 } else {
517 }
518 }
519 else if (bct == REMORA_BC::periodic)
520 {
521 if (side == Orientation::low) {
523 } else {
525 }
526 }
527 else if ( bct == REMORA_BC::clamped)
528 {
529 if (side == Orientation::low) {
531 } else {
533 }
534 }
535 else if ( bct == REMORA_BC::orlanski_rad)
536 {
537 if (side == Orientation::low) {
539 } else {
541 }
542 }
544 {
545 if (side == Orientation::low) {
547 } else {
549 }
550 }
551 else
552 {
553 amrex::Abort("Scalar/tracer boundary condition not validly specified");
554 }
555 }
556 }
557 }
558
559 // *****************************************************************************
560 //
561 // Here we translate the physical boundary conditions -- one type per face --
562 // into logical boundary conditions for ubar and vbar. Also add simplified
563 // 2d boundary condition (corresponding to BCs in bc_2d.F
564 //
565 // *****************************************************************************
566 {
567 for (OrientationIter oit; oit; ++oit) {
568 Orientation ori = oit();
569 int dir = ori.coordDir();
570 Orientation::Side side = ori.faceDir();
571 for (int i = 0; i < 2; i++) {
572 auto const bct = phys_bc_type[ubar_bc_idx+i][ori];
573 if ( bct == REMORA_BC::symmetry )
574 {
575 if (side == Orientation::low) {
578 if (i==1 and dir!=2) {
581 }
582 } else {
585 if (i==1 and dir!=2) {
588 }
589 }
590 }
591 else if (bct == REMORA_BC::outflow)
592 {
593 if (side == Orientation::low) {
596 } else {
599 }
600 }
601 else if (bct == REMORA_BC::inflow)
602 {
603 if (side == Orientation::low) {
606 } else {
609 }
610 }
611 else if (bct == REMORA_BC::no_slip_wall)
612 {
613 if (side == Orientation::low) {
616 } else {
619 }
620 }
621 else if (bct == REMORA_BC::slip_wall)
622 {
623 if (side == Orientation::low) {
626 if (i==1 and dir!=2) {
627 // Only normal direction has ext_dir
630 }
631
632 } else {
635 if (i==1 and dir!=2) {
636 // Only normal direction has ext_dir
639 }
640 }
641 }
642 else if (bct == REMORA_BC::periodic)
643 {
644 if (side == Orientation::low) {
647 } else {
650 }
651 }
652 else if (bct == REMORA_BC::clamped)
653 {
654 if (side == Orientation::low) {
657 } else {
660 }
661 }
662 else if (bct == REMORA_BC::flather)
663 {
664 if (side == Orientation::low) {
667 if (i==1 and dir!=2) {
668 // Only normal direction has Flather
671 }
672
673 } else {
676 if (i==1 and dir!=2) {
677 // Only normal direction has Flather
680 }
681 }
682 }
683 else if (bct == REMORA_BC::orlanski_rad)
684 {
685 if (side == Orientation::low) {
688 } else {
691 }
692 }
694 {
695 if (side == Orientation::low) {
698 } else {
701 }
702 }
703 else
704 {
705 amrex::Abort("ubar or vbar boundary condition not validly specified");
706 }
707 }
708 }
709 }
710
711 // *****************************************************************************
712 //
713 // Here we translate the physical boundary conditions -- one type per face --
714 // into logical boundary conditions for zeta and tke
715 //
716 // *****************************************************************************
717 {
718 for (OrientationIter oit; oit; ++oit) {
719 Orientation ori = oit();
720 int dir = ori.coordDir();
721 Orientation::Side side = ori.faceDir();
722 for (int i = 0; i < 2; i++) {
723 auto const bct = phys_bc_type[zeta_bc_idx+i][ori];
724 if ( bct == REMORA_BC::symmetry )
725 {
726 if (side == Orientation::low) {
728 } else {
730 }
731 }
732 else if ( bct == REMORA_BC::outflow)
733 {
734 if (side == Orientation::low) {
736 } else {
738 }
739 }
740 else if ( bct == REMORA_BC::no_slip_wall)
741 {
742 if (side == Orientation::low) {
744 } else {
746 }
747 }
748 else if (bct == REMORA_BC::slip_wall)
749 {
750 if (side == Orientation::low) {
752 } else {
754 }
755 }
756 else if (bct == REMORA_BC::inflow)
757 {
758 if (side == Orientation::low) {
760 } else {
762 }
763 }
764 else if (bct == REMORA_BC::periodic)
765 {
766 if (side == Orientation::low) {
768 } else {
770 }
771 }
772 else if (bct == REMORA_BC::chapman)
773 {
774 if (side == Orientation::low) {
776 } else {
778 }
779 }
780 else if ( bct == REMORA_BC::clamped)
781 {
782 if (side == Orientation::low) {
784 } else {
786 }
787 }
788 else if ( bct == REMORA_BC::orlanski_rad)
789 {
790 if (side == Orientation::low) {
792 } else {
794 }
795 }
797 {
798 if (side == Orientation::low) {
800 } else {
802 }
803 }
804 else
805 {
806 amrex::Abort("Free surface (zeta) boundary condition not validly specified");
807 }
808 }
809 }
810 }
811
812 // *****************************************************************************
813 //
814 // Here we define a boundary condition that will foextrap while respecting periodicity
815 // This is used as a "null BC"
816 //
817 // *****************************************************************************
818 {
819 for (OrientationIter oit; oit; ++oit) {
820 Orientation ori = oit();
821 int dir = ori.coordDir();
822 Orientation::Side side = ori.faceDir();
823 if (side == Orientation::low) {
825 } else {
827 }
828 }
829 }
830
831 // *****************************************************************************
832 //
833 // Here we define a boundary condition that will unconditionally foextrap
834 //
835 // *****************************************************************************
836 {
837 for (OrientationIter oit; oit; ++oit) {
838 Orientation ori = oit();
839 int dir = ori.coordDir();
840 Orientation::Side side = ori.faceDir();
841 if (side == Orientation::low) {
843 } else {
845 }
846 }
847 }
848
849
850#ifdef AMREX_USE_GPU
851 Gpu::htod_memcpy
852 (domain_bcs_type_d.data(), domain_bcs_type.data(),
853 sizeof(amrex::BCRec)*num_bc_vars());
854#else
855 std::memcpy
856 (domain_bcs_type_d.data(), domain_bcs_type.data(),
857 sizeof(amrex::BCRec)*num_bc_vars());
858#endif
859}
constexpr amrex::Real zero
@ orlanski_rad_nudge
#define Tracer_comp
mf_h setVal(geomdata.ProbHi(2))
int foextrap_periodic_bc() const noexcept
Definition REMORA.H:1320
int ncons
Number of conserved scalars in the state (temperature + salt + passive scalars + biology tracers)
Definition REMORA.H:1644
int zvel_bc() const noexcept
Definition REMORA.H:1315
void init_bcs()
Read in boundary parameters from input file and set up data structures.
int xvel_bc() const noexcept
Definition REMORA.H:1313
amrex::Vector< amrex::BCRec > domain_bcs_type
vector (over BCVars) of BCRecs
Definition REMORA.H:1578
bool set_bcs_by_var
whether to set boundary conditions by variable rather than just by side
Definition REMORA.H:1563
amrex::Vector< std::string > cons_names
Names of scalars for plotfile output.
Definition REMORA.H:1709
int tke_bc() const noexcept
Definition REMORA.H:1319
int num_bc_vars() const noexcept
Definition REMORA.H:1324
int yvel_bc() const noexcept
Definition REMORA.H:1314
int foextrap_bc() const noexcept
Definition REMORA.H:1321
int v2d_simple_bc() const noexcept
Definition REMORA.H:1323
int zeta_bc() const noexcept
Definition REMORA.H:1318
amrex::Vector< amrex::GpuArray< REMORA_BC, AMREX_SPACEDIM *2 > > phys_bc_type
Array holding the "physical" boundary condition types (e.g. "inflow")
Definition REMORA.H:1589
amrex::Vector< int > bdy_index
Container to connect boundary data being read in boundary condition containers.
Definition REMORA.H:1602
int num_bdy_vars() const noexcept
Definition REMORA.H:1332
int u2d_simple_bc() const noexcept
Definition REMORA.H:1322
int bdy_zeta() const noexcept
Definition REMORA.H:1331
int bdy_vbar() const noexcept
Definition REMORA.H:1330
static SolverChoice solverChoice
Container for algorithmic choices.
Definition REMORA.H:1717
int bdy_ubar() const noexcept
Definition REMORA.H:1329
int ubar_bc() const noexcept
Definition REMORA.H:1316
int vbar_bc() const noexcept
Definition REMORA.H:1317
amrex::Array< std::string, 2 *AMREX_SPACEDIM > domain_bc_type
Array of strings describing domain boundary conditions.
Definition REMORA.H:1583
amrex::Vector< amrex::GpuArray< bool, AMREX_SPACEDIM *2 > > phys_bc_need_data
These are flags that indicate whether we need to read in boundary data from file.
Definition REMORA.H:1596
amrex::Vector< amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > > m_bc_extdir_vals
Array holding the Dirichlet values at walls which need them.
Definition REMORA.H:1586
amrex::Gpu::DeviceVector< amrex::BCRec > domain_bcs_type_d
GPU vector (over BCVars) of BCRecs.
Definition REMORA.H:1580
int NumTypes(int ncons) noexcept
static constexpr int cons_bc
static constexpr int Salt_bc_comp
static constexpr int Temp_bc_comp
static constexpr int u
static constexpr int v
int cons(int icomp) noexcept