635 auto& data = *
m_levels[
static_cast<std::size_t
>(level)];
638 "SBM M3 cannot advance before its static mapped measure is built");
640 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
645 std::string diagnostic;
647 method, stage, host_stage_interval, recipe, diagnostic)) {
648 amrex::Abort(
"SBM M3 stage recipe: " + diagnostic);
650 if (!std::isfinite(step_old_time) || !std::isfinite(input_time) ||
651 !std::isfinite(target_time)) {
652 amrex::Abort(
"SBM M3 received a nonfinite semantic time");
654 if (!state_manager.step_active(level)) {
655 amrex::Abort(
"SBM M3 stage requires a state-manager begin-step transition at ERF::Advance");
657 const MultiFab& spectrum = stage == 0
658 ? state_manager.old_state(level)
659 : state_manager.new_state(level);
660 const double spectrum_time = stage == 0
661 ? state_manager.old_time(level)
662 : state_manager.new_time(level);
663 const double expected_spectrum_time = stage == 0 ? step_old_time : input_time;
664 if (spectrum_time != expected_spectrum_time || input_time != spectrum_time) {
665 std::ostringstream message;
666 message.precision(17);
667 message <<
"SBM M3 spectral input time mismatch at level " << level
668 <<
" stage " << stage <<
": expected " << expected_spectrum_time
669 <<
" and requested input time " << input_time
670 <<
", got " << spectrum_time;
671 amrex::Abort(message.str());
683 conserved_input.nComp() >
Rho_comp &&
684 conserved_target.nComp() >
Rho_comp);
686 if (data.projected_ledger.step_active()) {
687 amrex::Abort(
"SBM M3 received stage 0 before the previous timestep "
690 MultiFab::Copy(data.anchor, spectrum, 0, 0,
m_layout.
ncomp(), 0);
691 }
else if (!data.projected_ledger.step_active() ||
692 data.projected_ledger.next_stage() != stage) {
693 amrex::Abort(
"SBM M3 stage arrived before stage 0 or out of order");
695 if (data.spectral_ledger.is_defined() &&
696 !data.spectral_ledger.begin_stage(method, stage, step_old_time,
697 recipe, diagnostic)) {
698 amrex::Abort(
"SBM M4a spectral face-ledger stage sequence: " + diagnostic);
701 const MultiFab& trial_state =
705 const MultiFab& trial_conserved =
711 amrex::Abort(
"SBM M3 target density: " + diagnostic);
714 build_intensive(data.input_intensive, spectrum, conserved_input,
715 geometry.periodicity(),
"input");
716 MultiFab::Copy(data.physical_input_intensive, data.input_intensive, 0, 0,
718 build_intensive(data.base_intensive, trial_state, trial_conserved,
719 geometry.periodicity(),
"limiter-trial base");
720 build_intensive(data.anchor_intensive, data.anchor, conserved_anchor,
721 geometry.periodicity(),
"old-step anchor");
726 data.invalid.setVal(
Real(0.0));
728 const int population_count =
730 for (amrex::MFIter mfi(data.input_intensive, amrex::TilingIfNotGPU());
731 mfi.isValid(); ++mfi) {
732 const amrex::Box bx = mfi.tilebox();
733 const auto input = data.input_intensive.array(mfi);
734 const auto invalid = data.invalid.array(mfi);
735 const auto endpoint_populations = populations;
737 bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
738 int cell_invalid = 0;
739 for (
int p = 0;
p < population_count; ++
p) {
740 const auto& pop = endpoint_populations[
p];
744 for (
int bin = 0; bin < pop.nbins; ++bin) {
745 const int mass_comp = pop.mass_offset + bin;
746 const int number_comp = pop.number_offset + bin;
749 input(i, j, k, number_comp),
750 input(i, j, k, mass_comp), pop.edges[bin],
751 pop.edges[bin + 1], endpoint)) {
754 input(i, j, k, mass_comp) = endpoint.L;
755 input(i, j, k, number_comp) = endpoint.H;
759 invalid(i, j, k, 0) =
static_cast<Real>(cell_invalid);
762 if (data.invalid.max(0) !=
Real(0.0)) {
763 amrex::Abort(
"SBM M3 input spectrum could not be represented in "
764 "endpoint-number coordinates");
766 data.input_intensive.FillBoundary(geometry.periodicity());
770 const auto inv_dx = geometry.InvCellSizeArray();
772 data.outgoing_demand.setVal(
Real(0.0));
773 for (amrex::MFIter mfi(data.outgoing_demand, amrex::TilingIfNotGPU());
774 mfi.isValid(); ++mfi) {
775 const amrex::Box bx = mfi.tilebox();
776 const auto fx = avg_xmom.const_array(mfi);
777 const auto fy = avg_ymom.const_array(mfi);
778 const auto fz = avg_zmom.const_array(mfi);
779 const auto rho = trial_conserved.const_array(mfi);
780 const auto omega = data.measure.const_array(mfi);
781 const auto out = data.outgoing_demand.array(mfi);
782 const auto dx_inv = inv_dx;
785 out(i, j, k, 0) = tau *
787 fx(i + 1, j, k, 0), fx(i, j, k, 0),
788 fy(i, j + 1, k, 0), fy(i, j, k, 0),
789 fz(i, j, k + 1, 0), fz(i, j, k, 0),
793 const Real max_outgoing = data.outgoing_demand.max(0);
794 const Real cfl_tolerance =
796 if (!std::isfinite(max_outgoing) ||
797 max_outgoing >
Real(1.0) + cfl_tolerance) {
798 std::ostringstream message;
799 message <<
"SBM M3 donor outgoing-demand condition failed: max="
800 << max_outgoing <<
" tau=" << tau
801 <<
" (no SBM subcycling is performed)";
802 amrex::Abort(message.str());
805 data.projected_rate.setVal(
Real(0.0));
810 std::vector<int> global_to_local(
812 for (std::size_t local = 0; local < chunk.components.size(); ++local) {
813 global_to_local[
static_cast<std::size_t
>(chunk.components[local])] =
814 static_cast<int>(local);
816 data.low_rate.setVal(
Real(0.0));
817 data.high_rate.setVal(
Real(0.0));
818 data.accepted_rate.setVal(
Real(0.0));
821 for (amrex::MFIter mfi(data.input_intensive, amrex::TilingIfNotGPU());
822 mfi.isValid(); ++mfi) {
823 const amrex::Box bx = mfi.tilebox();
824 const auto z = data.base_intensive.const_array(mfi);
825 const auto fd_x = avg_xmom.const_array(mfi);
826 const auto fd_y = avg_ymom.const_array(mfi);
827 const auto fd_z = avg_zmom.const_array(mfi);
828 auto low_x = data.low_rate.dir(0).array(mfi);
829 auto low_y = data.low_rate.dir(1).array(mfi);
830 auto low_z = data.low_rate.dir(2).array(mfi);
831 for (std::size_t local = 0; local < chunk.components.size();
833 const int component = chunk.components[local];
834 const int local_component =
static_cast<int>(local);
835 const amrex::Box xbx = amrex::surroundingNodes(bx, 0);
836 const amrex::Box ybx = amrex::surroundingNodes(bx, 1);
837 const amrex::Box zbx = amrex::surroundingNodes(bx, 2);
839 xbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
840 const Real carrier = fd_x(i, j, k, 0);
841 const Real donor = carrier >=
Real(0.0)
842 ?
z(i - 1, j, k, component)
843 :
z(i, j, k, component);
844 low_x(i, j, k, local_component) = carrier * donor;
847 ybx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
848 const Real carrier = fd_y(i, j, k, 0);
849 const Real donor = carrier >=
Real(0.0)
850 ?
z(i, j - 1, k, component)
851 :
z(i, j, k, component);
852 low_y(i, j, k, local_component) = carrier * donor;
855 zbx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
856 const Real carrier = fd_z(i, j, k, 0);
857 const Real donor = carrier >=
Real(0.0)
858 ?
z(i, j, k - 1, component)
859 :
z(i, j, k, component);
860 low_z(i, j, k, local_component) = carrier * donor;
868 for (amrex::MFIter mfi(data.input_intensive, amrex::TilingIfNotGPU());
869 mfi.isValid(); ++mfi) {
870 const amrex::Box bx = mfi.tilebox();
871 const GpuArray<const Array4<Real>, AMREX_SPACEDIM> flux_views{
872 {data.high_rate.dir(0).array(mfi),
873 data.high_rate.dir(1).array(mfi),
874 data.high_rate.dir(2).array(mfi)}};
875 for (std::size_t local = 0; local < chunk.components.size();
878 bx, data.input_intensive.const_array(mfi),
879 chunk.components[local], flux_views,
880 static_cast<int>(local), avg_xmom.const_array(mfi),
881 avg_ymom.const_array(mfi), avg_zmom.const_array(mfi),
892 for (
int bin = 0; bin < population.grid.nbins(); ++bin) {
893 const int mass_global = population.mass_offset + bin;
894 const int number_global = population.number_offset + bin;
895 const int mass_local =
896 global_to_local[
static_cast<std::size_t
>(mass_global)];
897 const int number_local =
898 global_to_local[
static_cast<std::size_t
>(number_global)];
899 if (mass_local < 0 || number_local < 0) {
903 population.grid.edges()[
static_cast<std::size_t
>(bin)];
905 population.grid.edges()[
static_cast<std::size_t
>(bin + 1)];
906 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
907 auto& face_rate = data.high_rate.dir(dir);
908 for (amrex::MFIter mfi(face_rate, amrex::TilingIfNotGPU());
909 mfi.isValid(); ++mfi) {
910 const amrex::Box bx = mfi.tilebox();
911 const auto flux = face_rate.array(mfi);
914 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
915 const Real blo = flux(i, j, k, mass_local);
916 const Real bhi = flux(i, j, k, number_local);
917 flux(i, j, k, mass_local) =
918 lower * blo + upper * bhi;
919 flux(i, j, k, number_local) = blo + bhi;
926 data.invalid.setVal(
Real(0.0));
927 data.cell_ratios.setVal(
Real(0.0));
928 for (
const int group_index : chunk.group_indices) {
929 const auto& group =
m_groups[
static_cast<std::size_t
>(group_index)];
930 const auto& group_device =
931 device.host_groups[
static_cast<std::size_t
>(group_index)];
935 group_device.ratio_offset <= data.cell_ratios.nComp());
937 group_device.ratio_count <=
938 data.cell_ratios.nComp() - group_device.ratio_offset);
942 for (
const int component : group.members) {
943 const int local_component =
944 global_to_local[
static_cast<std::size_t
>(component)];
946 for (amrex::MFIter mfi(data.low_trial_h,
947 amrex::TilingIfNotGPU());
948 mfi.isValid(); ++mfi) {
949 const amrex::Box bx = mfi.tilebox();
950 const auto u = trial_state.const_array(mfi);
951 const auto omega = data.measure.const_array(mfi);
952 const auto fx = data.low_rate.dir(0).const_array(mfi);
953 const auto fy = data.low_rate.dir(1).const_array(mfi);
954 const auto fz = data.low_rate.dir(2).const_array(mfi);
955 const auto hlow = data.low_trial_h.array(mfi);
956 const Real dx = inv_dx[0],
dy = inv_dx[1],
dz = inv_dx[2];
958 bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
961 fx(i + 1, j, k, local_component),
962 fx(i, j, k, local_component),
963 fy(i, j + 1, k, local_component),
964 fy(i, j, k, local_component),
965 fz(i, j, k + 1, local_component),
966 fz(i, j, k, local_component),
dx,
dy,
dz);
967 hlow(i, j, k, local_component) =
968 omega(i, j, k, 0) * u(i, j, k, component) -
974 const ConstraintDescriptor* local_constraints =
975 device.local_constraints.data();
976 const ConstraintTerm* local_terms = device.local_terms.data();
977 const LocalPropertySupport* local_supports =
978 device.local_supports.data();
979 for (amrex::MFIter mfi(data.cell_ratios, amrex::TilingIfNotGPU());
980 mfi.isValid(); ++mfi) {
981 const amrex::Box bx = mfi.tilebox();
982 const auto hlow = data.low_trial_h.const_array(mfi);
983 const FaceArraySet low_faces{
984 {data.low_rate.dir(0).const_array(mfi),
985 data.low_rate.dir(1).const_array(mfi),
986 data.low_rate.dir(2).const_array(mfi)}};
987 const FaceArraySet high_faces{
988 {data.high_rate.dir(0).const_array(mfi),
989 data.high_rate.dir(1).const_array(mfi),
990 data.high_rate.dir(2).const_array(mfi)}};
991 const auto base = data.base_intensive.const_array(mfi);
995 data.physical_input_intensive.const_array(mfi);
996 const auto anchor = data.anchor_intensive.const_array(mfi);
997 const auto ratios = data.cell_ratios.array(mfi);
998 const auto invalid = data.invalid.array(mfi);
999 const auto dx = inv_dx;
1001 const int linear_count = group_device.linear_constraint_count;
1006 group_device.canonical_reserve;
1008 group_device.canonical_mass_local;
1010 group_device.canonical_number_local;
1012 group_device.canonical_mass_coefficient;
1014 group_device.canonical_number_coefficient;
1015 const Real roundoff =
1020 for (
int ci = 0;
ci < linear_count; ++
ci) {
1028 const Real value = hlow(i, j, k, term.component);
1029 margin = std::fma(term.coefficient, value, margin);
1030 scale += amrex::Math::abs(term.coefficient * value);
1033 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1034 const Real left_delta = face_correction(
1035 descriptor, local_terms, low_faces, high_faces,
1036 i, j, k, dir, -1, tau,
dx);
1037 const Real right_delta = face_correction(
1038 descriptor, local_terms, low_faces, high_faces,
1039 i, j, k, dir, 1, tau,
dx);
1040 adverse += amrex::max(
Real(0.0), -left_delta) +
1041 amrex::max(
Real(0.0), -right_delta);
1043 if (!amrex::Math::isfinite(margin) ||
1044 !amrex::Math::isfinite(adverse) ||
1045 margin < -roundoff * scale) {
1050 ? clamp_unit(margin / adverse)
1055 const auto& support =
1057 Real donor_min = std::numeric_limits<Real>::infinity();
1058 Real donor_max = -std::numeric_limits<Real>::infinity();
1060 include_neighbourhood(base, i, j, k, support, donor_min,
1062 include_neighbourhood(input, i, j, k, support,
1063 donor_min, donor_max, found);
1064 include_neighbourhood(anchor, i, j, k, support,
1065 donor_min, donor_max, found);
1066 Real support_min = found != 0 ? donor_min :
Real(0.0);
1067 Real support_max = found != 0 ? donor_max :
Real(0.0);
1068 if (found != 0 && support.has_hard_min != 0) {
1070 amrex::max(support_min, support.hard_min);
1072 if (found != 0 && support.has_hard_max != 0) {
1074 amrex::min(support_max, support.hard_max);
1076 if (!amrex::Math::isfinite(support_min) ||
1077 !amrex::Math::isfinite(support_max) ||
1078 support_min > support_max) {
1082 const Real property =
1083 hlow(i, j, k, support.property_local);
1084 const Real carrier =
1085 hlow(i, j, k, support.carrier_local);
1086 for (
int side = 0; side < 2; ++side) {
1087 const bool upper = side != 0;
1089 upper ? support_max : support_min;
1091 upper ? slope * carrier - property
1092 :
property - slope * carrier;
1094 amrex::Math::abs(property) +
1095 amrex::Math::abs(slope * carrier);
1097 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1098 const Real left_delta =
1099 property_face_correction(
1100 support, low_faces, high_faces, i, j, k,
1101 dir, -1, tau,
dx, slope, upper);
1102 const Real right_delta =
1103 property_face_correction(
1104 support, low_faces, high_faces, i, j, k,
1105 dir, 1, tau,
dx, slope, upper);
1106 adverse += amrex::max(
Real(0.0), -left_delta) +
1107 amrex::max(
Real(0.0), -right_delta);
1109 if (!amrex::Math::isfinite(margin) ||
1110 !amrex::Math::isfinite(adverse) ||
1111 margin < -roundoff * scale) {
1114 const int ratio_component =
1116 ratios(i, j, k, ratio_component) =
1118 ? clamp_unit(margin / adverse)
1127 const Real reserve = std::fma(
1133 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1134 const Real left_delta =
1135 canonical_reserve_face_correction(
1140 high_faces, i, j, k, dir, -1, tau,
dx);
1141 const Real right_delta =
1142 canonical_reserve_face_correction(
1147 high_faces, i, j, k, dir, 1, tau,
dx);
1148 adverse += amrex::max(
Real(0.0), -left_delta) +
1149 amrex::max(
Real(0.0), -right_delta);
1151 const int ratio_component =
1153 if (!amrex::Math::isfinite(reserve) ||
1154 !amrex::Math::isfinite(adverse)) {
1156 ratios(i, j, k, ratio_component) =
Real(0.0);
1157 }
else if (reserve <=
Real(0.0)) {
1158 ratios(i, j, k, ratio_component) =
Real(0.0);
1159 }
else if (adverse <=
Real(0.0)) {
1160 ratios(i, j, k, ratio_component) =
Real(1.0);
1162 ratios(i, j, k, ratio_component) =
1163 clamp_unit(reserve / adverse);
1167 invalid(i, j, k, 0) =
Real(1.0);
1175 data.cell_ratios.FillBoundary(geometry.periodicity());
1176 if (data.invalid.max(0) !=
Real(0.0)) {
1177 amrex::Abort(
"SBM M3 donor low-order trial violates a linear or "
1178 "attached-property/canonical-reserve constraint");
1181 for (
const int group_index : chunk.group_indices) {
1182 const auto& group =
m_groups[
static_cast<std::size_t
>(group_index)];
1183 const auto& group_device =
1184 device.host_groups[
static_cast<std::size_t
>(group_index)];
1188 group_device.ratio_offset <= data.cell_ratios.nComp());
1190 group_device.ratio_count <=
1191 data.cell_ratios.nComp() - group_device.ratio_offset);
1195 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1196 auto& lambda_field = data.face_lambda.dir(dir);
1197 for (amrex::MFIter mfi(lambda_field, amrex::TilingIfNotGPU());
1198 mfi.isValid(); ++mfi) {
1199 const amrex::Box bx = mfi.tilebox();
1200 const auto ratios = data.cell_ratios.const_array(mfi);
1201 const auto lambda = lambda_field.array(mfi);
1205 int i,
int j,
int k) noexcept {
1206 int li = i, lj = j, lk = k;
1209 }
else if (dir == 1) {
1217 amrex::min(accepted,
1219 accepted = amrex::min(
1222 lambda(i, j, k, 0) = clamp_unit(accepted);
1227 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1228 auto& accepted_field = data.accepted_rate.dir(dir);
1229 const auto& low_field = data.low_rate.dir(dir);
1230 const auto& high_field = data.high_rate.dir(dir);
1231 const auto& lambda_field = data.face_lambda.dir(dir);
1232 for (amrex::MFIter mfi(accepted_field, amrex::TilingIfNotGPU());
1233 mfi.isValid(); ++mfi) {
1234 const amrex::Box bx = mfi.tilebox();
1235 const auto low = low_field.const_array(mfi);
1236 const auto high = high_field.const_array(mfi);
1237 const auto lambda = lambda_field.const_array(mfi);
1238 const auto accepted = accepted_field.array(mfi);
1239 for (
const int component : group.members) {
1240 const int local_component =
1241 global_to_local[
static_cast<std::size_t
>(
1246 [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) noexcept {
1248 accepted(i, j, k, local_component) =
1249 low(i, j, k, local_component) +
1250 alpha * (high(i, j, k, local_component) -
1251 low(i, j, k, local_component));
1260 if (group.population_id == projection_spec.population_id) {
1261 const int mass_component =
1263 const int local_mass =
1264 global_to_local[
static_cast<std::size_t
>(mass_component)];
1265 const int projected_component =
1266 group.bin < projection_spec.cloud_rain_split ? 0 : 1;
1267 for (
int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
1268 MultiFab::Saxpy(data.projected_rate.dir(dir),
Real(1.0),
1269 data.accepted_rate.dir(dir), local_mass,
1270 projected_component, 1, 0);
1277 for (std::size_t local = 0; local < chunk.components.size(); ++local) {
1278 const int component = chunk.components[local];
1281 context.
level = level;
1282 context.
stage = stage;
1287 context.
state_anchor = {&data.anchor, component, step_old_time};
1288 context.
state_input = {&spectrum, component, input_time};
1289 context.
state_target = {&data.target, component, target_time};
1296 context.
carrier = {&avg_xmom, &avg_ymom, &avg_zmom};
1298 context, data.accepted_rate, inv_dx,
static_cast<int>(local));
1301 if (data.spectral_ledger.is_defined()) {
1302 for (std::size_t local = 0; local < chunk.components.size(); ++local) {
1303 if (!data.spectral_ledger.accumulate_stage_component(
1304 data.accepted_rate,
static_cast<int>(local),
1305 chunk.components[local], diagnostic)) {
1306 amrex::Abort(
"SBM M4a spectral chunk-to-ledger mapping: " +
1317 const ConstraintDescriptor* global_constraints =
1318 device.global_constraints.data();
1319 const ConstraintTerm* global_terms = device.global_terms.data();
1320 const PopulationRemapView* remap_populations = device.populations.data();
1321 const int global_constraint_count =
1323 const int remap_population_count =
1325 data.invalid.setVal(
Real(0.0));
1326 for (amrex::MFIter mfi(data.target, amrex::TilingIfNotGPU()); mfi.isValid();
1328 const amrex::Box bx = mfi.tilebox();
1329 const auto candidate = data.target.const_array(mfi);
1330 const auto invalid = data.invalid.array(mfi);
1335 for (
int component = 0; component < state_components; ++component) {
1336 if (!amrex::Math::isfinite(candidate(i, j, k, component))) {
1340 const Real roundoff =
1342 for (
int ci = 0;
ci < global_constraint_count; ++
ci) {
1347 const auto& term = global_terms[
descriptor.term_offset +
t];
1348 const Real value = candidate(i, j, k, term.component);
1349 margin = std::fma(term.coefficient, value, margin);
1350 scale += amrex::Math::abs(term.coefficient * value);
1352 if (!amrex::Math::isfinite(margin) ||
1353 margin < -roundoff * scale)
1357 candidate, i, j, k};
1358 for (
int p = 0;
p < remap_population_count; ++
p) {
1359 const auto& population = remap_populations[
p];
1360 for (
int bin = 0; bin < population.nbins; ++bin) {
1362 population, bin, cell_state, state_components)) {
1367 invalid(i, j, k, 0) =
static_cast<Real>(bad);
1370 if (data.invalid.max(0) !=
Real(0.0)) {
1373 data.target,
m_layout, level, &reason);
1374 amrex::ignore_unused(host_admissible);
1375 if (reason.empty()) {
1376 reason =
"candidate failed device linear/canonical admission";
1378 amrex::Abort(
"SBM M3 candidate rejected before commit: " + reason);
1387 if (data.spectral_ledger.is_defined() &&
1388 !data.spectral_ledger.finish_stage(diagnostic)) {
1389 amrex::Abort(
"SBM M4a spectral face-ledger stage finish: " + diagnostic);
1393 if (!data.projected_ledger.accept_stage(method, stage, step_old_time,
1394 recipe, data.projected_rate,
1396 amrex::Abort(
"SBM M3 projected face-ledger stage sequence: " +
1399 MultiFab::Copy(state_manager.new_target_storage(level), data.target, 0, 0,
1401 const bool physical_step_complete =
1404 if (!state_manager.accept_stage_target(level, target_time,
1405 physical_step_complete, diagnostic)) {
1406 amrex::Abort(
"SBM M4a accepted-state lifecycle commit: " + diagnostic);
1408 state_manager.project_to_core(level, conserved_target, qc_component,
void BuildScalarAdvectionFluxes(const amrex::Box &bx, const amrex::Array4< const amrex::Real > &scalar, const int scalar_comp, const amrex::GpuArray< const amrex::Array4< amrex::Real >, AMREX_SPACEDIM > &flx_arr, const int flux_comp, const amrex::Array4< const amrex::Real > &avg_xmom, const amrex::Array4< const amrex::Real > &avg_ymom, const amrex::Array4< const amrex::Real > &avg_zmom, const AdvType horiz_adv_type, const AdvType vert_adv_type, const amrex::Real horiz_upw_frac, const amrex::Real vert_upw_frac)
Definition: ERF_AdvectionSrcForScalars.H:204
#define Rho_comp
Definition: ERF_IndexDefines.H:42
const Real dy
Definition: ERF_InitCustomPert_ABL.H:45
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
for(int i=0;i< m_num_species;i++)
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:48
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
int constraints_begin
Definition: ERF_SBMTransport.cpp:32
int ratio_count
Definition: ERF_SBMTransport.cpp:38
Real canonical_number_coefficient
Definition: ERF_SBMTransport.cpp:44
int canonical_mass_local
Definition: ERF_SBMTransport.cpp:41
int supports_begin
Definition: ERF_SBMTransport.cpp:34
int canonical_number_local
Definition: ERF_SBMTransport.cpp:42
int ratio_offset
Definition: ERF_SBMTransport.cpp:39
Real canonical_mass_coefficient
Definition: ERF_SBMTransport.cpp:43
int support_count
Definition: ERF_SBMTransport.cpp:35
int canonical_reserve
Definition: ERF_SBMTransport.cpp:40
int mass_offset(const int population) const
Definition: ERF_SBMLayout.cpp:179
const LiquidProjectionSpec & liquid_projection() const noexcept
Definition: ERF_SBMLayout.H:102
bool is_defined(int level) const
Definition: ERF_SBMTransport.cpp:1421
@ rho
Definition: ERF_Kessler.H:25
@ omega
Definition: ERF_Morrison.H:55
@ alpha
Definition: ERF_SLM.H:151
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
@ t
Definition: ERF_WSM6.H:272
void ApplyAuxiliaryMappedStage(const AuxiliaryStageContext &context, const MappedFaceFluxRate &rate, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv, const int rate_component)
Definition: ERF_AuxiliaryStage.cpp:169
bool MakeAuxiliaryStageRecipe(const HostIntegrator method, const int stage, const double host_stage_interval, AuxiliaryStageRecipe &recipe, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:67
bool ValidatePositiveFiniteComponent(const amrex::MultiFab &field, const int component, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:294
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ComputationalMappedDivergence(const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real dx_inv, const amrex::Real dy_inv, const amrex::Real dzeta_inv) noexcept
Definition: ERF_AuxiliaryMappedTransport.H:119
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real MappedOutgoingDemandRate(const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real measure, const amrex::Real density, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv) noexcept
Definition: ERF_AuxiliaryMappedTransport.H:136
bool SameCellLayout(const amrex::MultiFab &lhs, const amrex::MultiFab &rhs)
Definition: ERF_AuxiliaryMappedTransport.cpp:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool canonical_persisted_bin_state(const PopulationRemapView &population, const int bin, const amrex::Real *state, const int state_count) noexcept
Definition: ERF_SBMRemapping.H:475
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool try_two_moment_to_endpoints(const amrex::Real C, const amrex::Real M, const amrex::Real lower, const amrex::Real upper, EndpointTransform &result) noexcept
Definition: ERF_SpectralGrid.H:48
bool authoritative_state_admissible(const amrex::MultiFab &spectrum, const SBMLayout &layout, const int level, std::string *diagnostic)
Definition: ERF_SBMRestart.cpp:39
real(c_double), private ci
Definition: ERF_module_mp_morr_two_moment.F90:203
Definition: ERF_AuxiliaryStage.H:63
int level
Definition: ERF_AuxiliaryStage.H:65
ConstTimedFieldView rho_anchor
Definition: ERF_AuxiliaryStage.H:78
AuxiliaryStageRecipe recurrence
Definition: ERF_AuxiliaryStage.H:72
ConstTimedFieldView rho_input
Definition: ERF_AuxiliaryStage.H:79
int stage
Definition: ERF_AuxiliaryStage.H:66
ConstTimedFieldView measure_anchor
Definition: ERF_AuxiliaryStage.H:82
double input_time
Definition: ERF_AuxiliaryStage.H:69
ConstTimedFieldView measure_input
Definition: ERF_AuxiliaryStage.H:83
HostIntegrator method
Definition: ERF_AuxiliaryStage.H:64
ConstTimedFieldView state_input
Definition: ERF_AuxiliaryStage.H:75
double target_time
Definition: ERF_AuxiliaryStage.H:70
ConstTimedFieldView measure_target
Definition: ERF_AuxiliaryStage.H:84
double step_old_time
Definition: ERF_AuxiliaryStage.H:68
HostCarrierFluxView carrier
Definition: ERF_AuxiliaryStage.H:86
ConstTimedFieldView rho_target
Definition: ERF_AuxiliaryStage.H:80
MutableTimedFieldView state_target
Definition: ERF_AuxiliaryStage.H:76
ConstTimedFieldView state_anchor
Definition: ERF_AuxiliaryStage.H:74
Definition: ERF_AuxiliaryStage.H:41
double limiter_trial_interval
Definition: ERF_AuxiliaryStage.H:45
LimiterTrialBase limiter_trial_base
Definition: ERF_AuxiliaryStage.H:42
Definition: ERF_SBMRemapping.H:363