21 #ifndef FUB_CUTCELL_METHOD_MY_STABILISATION_HPP
22 #define FUB_CUTCELL_METHOD_MY_STABILISATION_HPP
54 template <
int Rank>
using Coordinates = Eigen::Matrix<double, Rank, 1>;
60 offset - 2.0 * offset.dot(boundary_normal) * boundary_normal;
69 for (
int d = 0; d < Rank; ++d) {
70 i[d] = std::floor(rel_x[d]);
84 template <
typename State, std::ptrdiff_t Rank>
87 nodeduce_t<
const Eigen::Matrix<double, Rank, 1>&> x) noexcept {
88 if constexpr (Rank == 2) {
90 [&x](
double& u,
auto&&... grad_x) {
95 }
else if constexpr (Rank == 3) {
97 [&x](
double& u,
auto&&... grad_x) {
101 u, grad[0], grad[1], grad[2]);
128 template <
typename Equation>
138 static constexpr
int Rank = Equation::Rank();
141 static constexpr
int kMaxSources = 6;
143 std::array<Index<Rank>, kMaxSources> sources{};
144 std::array<double, kMaxSources> start{};
145 std::array<double, kMaxSources> end{};
154 : equation_(equation) {}
160 [&](
double& grad_x,
double& grad_y,
double uM,
double u1,
double u2,
162 std::array<double, 2> grad{0.0, 0.0};
163 const std::array<double, 4> quantities{uM, u1, u2, u3};
164 Base::ComputeGradients(grad, quantities, x);
168 gradient[0], gradient[1], states[0], states[1], states[2], states[3]);
175 [&](
double& grad_x,
double& grad_y,
double uM,
double u1,
double u2,
176 double u3,
double u4) {
177 std::array<double, 2> grad{0.0, 0.0};
178 const std::array<double, 5> quantities{uM, u1, u2, u3, u4};
179 Base::ComputeGradients(grad, quantities, x);
183 gradient[0], gradient[1], states[0], states[1], states[2], states[3],
195 if constexpr (Rank == 2) {
196 std::array<Conservative, 2> gradient{equation_};
197 std::array<Conservative, 5> u;
210 Load(u[0], AsCons(states), {i - 1, j});
213 [&](
double& gradient,
double qL,
double qR) {
214 return gradient = 0.5 * (qR - qL) / dx[0];
216 gradient[0], u[0], u[1]);
220 [&](
double& gradient,
double qL,
double qR) {
221 return gradient = 0.5 * (qR - qL) / dx[1];
223 gradient[1], u[2], u[3]);
227 SetZero(gradient[0]);
228 SetZero(gradient[1]);
230 std::array<Index<Rank + 1>, 4> edges{
233 std::array<double, 4> betas{};
234 std::transform(edges.begin(), edges.end(), betas.begin(),
236 return geom.face_fractions[ijd[2]](ijd[0], ijd[1]);
238 std::array<Index<Rank>, 4> neighbors{
241 std::array<double, 4> alphas{};
242 std::transform(neighbors.begin(), neighbors.end(), alphas.begin(),
244 return geom.volume_fractions(ij);
246 std::array<int, 4> is{0, 1, 2, 3};
247 std::sort(is.begin(), is.end(), [&](
int i,
int j) {
248 return betas[i] >= betas[j] && alphas[i] >= alphas[j];
250 if (betas[is[2]] <= 0.0) {
253 FUB_ASSERT(betas[is[0]] > 0.0 && betas[is[1]] > 0.0);
254 FUB_ASSERT(edges[is[0]][2] != edges[is[1]][2]);
256 corner[edges[is[0]][2]] = neighbors[is[0]][edges[is[0]][2]];
257 corner[edges[is[1]][2]] = neighbors[is[1]][edges[is[1]][2]];
258 neighbors[is[2]] = corner;
263 std::array<Coordinates<Rank>, 4> xM;
284 }
else if (betas[is[3]] > 0.0) {
285 FUB_ASSERT(betas[is[0]] > 0.0 && betas[is[2]] > 0.0 &&
292 std::array<Coordinates<Rank>, 5> xM;
298 ComputeGradients(gradient, u, xM);
299 }
else if (betas[is[2]] > 0.0) {
300 FUB_ASSERT(betas[is[0]] > 0.0 && betas[is[1]] > 0.0);
305 std::array<Coordinates<Rank>, 4> xM;
313 Store(gradient_x, gradient[0], {i, j});
314 Store(gradient_y, gradient[1], {i, j});
315 Store(gradient_z, zero, {i, j});
321 std::array<StridedDataView<double, 2>, 2> grad_u{u_x.
Subview(box),
323 Base::LimitGradients(grad_u, u.
Subview(box), flags, geom, dx);
325 gradient_x, gradient_y, states);
333 double lower = std::numeric_limits<double>::lowest();
334 double upper = std::numeric_limits<double>::max();
335 for (
int d = 0; d < Rank; ++d) {
338 const double lambda_lower = (xM[d] - xB[d] - 0.5 * dx[d]) / slope[d];
340 const double lambda_upper = (0.5 * dx[d] + xM[d] - xB[d]) / slope[d];
342 upper = std::min(upper, lambda_upper);
343 lower = std::max(lower, lambda_lower);
345 upper = std::min(upper, lambda_lower);
346 lower = std::max(lower, lambda_upper);
348 }
else if (std::abs(xM[d] - xB[d]) > 0.5 * dx[d]) {
349 lower = std::numeric_limits<double>::max();
350 upper = std::numeric_limits<double>::lowest();
353 return {lower, upper};
356 double Length(
const std::array<double, 2>& interval) {
357 return interval[1] - interval[0];
362 for (
int d = 0; d < Rank; ++d) {
364 box.
upper[d] = 2 * signs[d] + 1;
367 box.lower[d] = 2 * signs[d];
374 std::array<int, AuxiliaryReconstructionData::kMaxSources> indices;
376 std::iota(indices.begin(), indices.begin() + count, 0);
377 std::sort(indices.begin(), indices.begin() + count, [&](
int i,
int j) {
378 return aux_data.start[i] < aux_data.start[j];
382 sorted_aux.xB = aux_data.
xB;
383 for (
int i = 0; i < count; ++i) {
384 sorted_aux.sources[i] = aux_data.
sources[indices[i]];
385 sorted_aux.start[i] = aux_data.
start[indices[i]];
386 sorted_aux.end[i] = aux_data.
end[indices[i]];
388 for (
int i = count; i < AuxiliaryReconstructionData::kMaxSources; ++i) {
389 sorted_aux.sources[i] = sorted_aux.sources[count - 1];
390 sorted_aux.start[i] = sorted_aux.end[count - 1];
391 sorted_aux.end[i] = sorted_aux.end[count - 1];
393 sorted_aux.n_sources = count;
397 std::array<AuxiliaryReconstructionData, 2>
399 std::array<AuxiliaryReconstructionData, 2> datas{};
400 datas[0].slope = aux.
slope;
401 datas[0].xB = aux.
xB;
402 datas[1].slope = aux.
slope;
403 datas[1].xB = aux.
xB;
405 while (i < AuxiliaryReconstructionData::kMaxSources) {
406 datas[0].sources[i] = aux.
sources[i];
407 datas[0].start[i] = aux.
start[i];
408 datas[0].n_sources = i + 1;
409 if (dx < aux.
end[i]) {
410 datas[0].end[i] = dx;
413 datas[0].end[i] = aux.
end[i];
417 datas[1].sources[0] = aux.
sources[i];
418 datas[1].start[0] = dx;
419 datas[1].end[0] = aux.
end[i];
420 for (
int j = i + 1; j < AuxiliaryReconstructionData::kMaxSources; ++j) {
421 datas[1].sources[j - i] = aux.
sources[j];
422 datas[1].start[j - i] = aux.
start[j];
423 datas[1].end[j - i] = aux.
end[j];
424 datas[1].n_sources = aux.
n_sources - datas[0].n_sources;
437 double required_length) {
439 for (
int d = 0; d < Rank; ++d) {
440 signs[d] = (slope[d] > 0.0) - (slope[d] < 0.0);
446 aux_data.
slope = slope;
452 const auto interval = FindAdmissibleInterval(xM, xB, slope, dx);
453 const auto [a, b] =
Intersect(interval, {0.0, required_length});
455 FUB_ASSERT(count < AuxiliaryReconstructionData::kMaxSources);
458 std::transform(i.begin(), i.end(),
index.begin(), global.begin(),
460 aux_data.sources[count] = global;
461 aux_data.start[count] = a;
462 aux_data.end[count] = b;
466 FUB_ASSERT(count > 0 && count <= AuxiliaryReconstructionData::kMaxSources);
467 aux_data.n_sources = count;
477 const int dir_v =
static_cast<int>(dir);
479 ((normal[dir_v] < 0) - (normal[dir_v] >= 0)) *
480 Eigen::Matrix<double, Rank, 1>::Unit(dir_v);
482 unit_vector - 2.0 * unit_vector.dot(normal) * normal;
483 return GetAuxiliaryData(
index, geom, dx, slope, dx[
int(dir)]);
488 for (
int i = 0; i < AuxiliaryReconstructionData::kMaxSources; ++i) {
489 total += aux.end[i] - aux.start[i];
503 for (
int i = 0; i < aux_data.
n_sources; ++i) {
514 0.5 * (aux_data.
start[i] + aux_data.
end[i]) * aux_data.
slope;
518 state_ += gradient_dir_;
520 const double length = aux_data.
end[i] - aux_data.
start[i];
522 [length, total_length](
auto&& u,
auto&& grad_u,
auto&& u_0,
524 u += length / total_length * u_0;
525 grad_u += length / total_length * grad_u_0;
527 integral, integral_gradient, state_, gradient_dir_);
545 const double total_length = TotalLength(aux_data);
546 return IntegrateCellState(integral, integral_gradient, states, gradient_x,
547 gradient_y, gradient_z, geom, aux_data, dx,
561 GetAuxiliaryData(cell, cutcell_data, dx, dir);
563 const int dir_v =
static_cast<int>(dir);
565 ((normal[dir_v] >= 0) - (normal[dir_v] < 0)) *
566 Eigen::Matrix<double, Rank, 1>::Unit(dir_v);
568 GetAuxiliaryData(cell, cutcell_data, dx, unit_vector, 2.0 * dx[dir_v]);
569 SetZero(boundary_state_);
570 SetZero(boundary_gradient_);
571 SetZero(interior_state_);
572 SetZero(interior_gradient_);
573 const int d =
static_cast<std::size_t
>(dir);
584 auto [laux1, raux1] = SplitAt(boundary_aux_data, (1.0 - d) * dx[d]);
585 auto [laux2, raux2] = SplitAt(interior_aux_data, d * dx[d]);
586 auto [interior_aux, raux3] = SplitAt(raux2, (1.0 + d) * dx[d]);
588 if (!IntegrateCellState(boundary_state_, boundary_gradient_, states,
589 gradient_x, gradient_y, gradient_z, cutcell_data,
592 SetZero(boundary_gradient_);
595 if (!IntegrateCellState(boundary_state_, boundary_gradient_, states,
596 gradient_x, gradient_y, gradient_z,
597 cutcell_data, laux2, dx, dx[d])) {
599 SetZero(boundary_gradient_);
602 Reflect(boundary_state_, boundary_state_, normal, equation_);
603 Reflect(boundary_gradient_, boundary_gradient_, normal, equation_);
606 h_grid_singly_shielded_gradients[0] = boundary_gradient_;
608 if (!IntegrateCellState(interior_state_, interior_gradient_, states,
609 gradient_x, gradient_y, gradient_z, cutcell_data,
612 SetZero(interior_gradient_);
616 h_grid_singly_shielded_gradients[1] = interior_gradient_;
618 }
else if (betaR < betaL) {
621 auto [laux1, raux1] = SplitAt(boundary_aux_data, (1.0 - d) * dx[d]);
622 auto [laux2, raux2] = SplitAt(interior_aux_data, d * dx[d]);
623 auto [interior_aux, raux3] = SplitAt(raux2, (1.0 + d) * dx[d]);
625 if (!IntegrateCellState(interior_state_, interior_gradient_, states,
626 gradient_x, gradient_y, gradient_z, cutcell_data,
629 SetZero(interior_gradient_);
635 h_grid_singly_shielded_gradients[0] = interior_gradient_;
637 if (!IntegrateCellState(boundary_state_, boundary_gradient_, states,
638 gradient_x, gradient_y, gradient_z, cutcell_data,
641 SetZero(boundary_gradient_);
644 if (!IntegrateCellState(boundary_state_, boundary_gradient_, states,
645 gradient_x, gradient_y, gradient_z,
646 cutcell_data, laux1, dx, dx[d])) {
648 SetZero(boundary_gradient_);
651 Reflect(boundary_state_, boundary_state_, normal, equation_);
652 Reflect(boundary_gradient_, boundary_gradient_, normal, equation_);
655 h_grid_singly_shielded_gradients[1] = boundary_gradient_;
669 GetAuxiliaryData(cell, cutcell_data, dx, dir);
671 const int dir_v =
static_cast<int>(dir);
673 ((normal[dir_v] >= 0) - (normal[dir_v] < 0)) *
674 Eigen::Matrix<double, Rank, 1>::Unit(dir_v);
676 GetAuxiliaryData(cell, cutcell_data, dx, unit_vector, dx[dir_v]);
677 SetZero(boundary_state_);
678 SetZero(boundary_gradient_);
679 if (!IntegrateCellState(boundary_state_, boundary_gradient_, states,
680 gradient_x, gradient_y, gradient_z, cutcell_data,
681 boundary_aux_data, dx)) {
683 SetZero(boundary_gradient_);
685 SetZero(interior_state_);
686 SetZero(interior_gradient_);
687 if (!IntegrateCellState(interior_state_, interior_gradient_, states,
688 gradient_x, gradient_y, gradient_z, cutcell_data,
689 interior_aux_data, dx)) {
690 interior_state_ = boundary_state_;
691 interior_gradient_ = boundary_gradient_;
693 const int d =
static_cast<std::size_t
>(dir);
699 Reflect(boundary_state_, boundary_state_, normal, equation_);
700 Reflect(boundary_gradient_, boundary_gradient_, normal, equation_);
706 h_grid_embedded_boundary_slopes[0] = boundary_gradient_;
708 h_grid_embedded_boundary_slopes[1] = interior_gradient_;
710 }
else if (betaR < betaL) {
714 h_grid_embedded_boundary_slopes[1] = boundary_gradient_;
716 h_grid_embedded_boundary_slopes[0] = interior_gradient_;
728 Eigen::Matrix<double, Rank, 1> dx,
740 Load(gradient_[0], gradient_x, iL);
741 Load(gradient_[1], gradient_y, iL);
742 Load(gradient_[2], gradient_z, iL);
748 state_ += gradient_dir_;
750 h_grid_regular_gradients[0] = gradient_[int(dir)];
753 Load(gradient_[0], gradient_x, iR);
754 Load(gradient_[1], gradient_y, iR);
755 Load(gradient_[2], gradient_z, iR);
759 state_ += gradient_dir_;
761 h_grid_regular_gradients[1] = gradient_[int(dir)];
768 std::array<Conservative, 4> stencil{
780 template <
typename EquationT,
typename FluxMethod,
781 typename HGridReconstruction =
782 ConservativeHGridReconstruction<EquationT>>
795 static constexpr
int Rank = Equation::Rank();
796 static constexpr std::size_t sRank =
static_cast<std::size_t
>(Rank);
797 static constexpr
int StencilWidth = FluxMethod::GetStencilWidth();
798 static_assert(StencilWidth > 0);
799 static constexpr std::size_t StencilSize =
800 static_cast<std::size_t
>(2 * StencilWidth);
812 using FluxMethod::ComputeStableDt;
836 const Eigen::Matrix<double, Rank, 1>& dx,
846 h_grid_reconstruction_.ComputeGradients(gradient_x, gradient_y, gradient_z,
847 states, flags, geom, dx);
854 std::array<Complete, 2> h_grid_eb_{};
855 std::array<Conservative, 2> h_grid_eb_gradients_{};
856 std::array<Complete, 2> h_grid_singly_shielded_{};
857 std::array<Conservative, 2> h_grid_singly_shielded_gradients_{};
858 std::array<Complete, 2> h_grid_regular_{};
859 std::array<Conservative, 2> h_grid_regular_gradients_{};
865 std::array<CompleteArray, StencilSize> stencil_array_{};
869 template <
typename Equation,
typename FluxMethod>
874 template <
typename Equation,
typename FluxMethod,
typename HGr
idReconstruction>
879 template <
typename Equation,
typename FluxMethod,
typename HGr
idReconstruction>
882 :
FluxMethod(flux_method), equation_(eq), h_grid_reconstruction_(eq) {
894 template <
typename Equation,
typename FluxMethod,
typename HGr
idReconstruction>
899 double min_dt = std::numeric_limits<double>::infinity();
900 static constexpr
int kWidth = StencilWidth;
906 const int d =
static_cast<int>(dir);
908 std::array<View<const Complete>, StencilSize> stencil_views;
909 std::array<ArrayView, StencilSize> stencil_volumes;
910 for (std::size_t i = 0; i < StencilSize; ++i) {
913 {
static_cast<std::ptrdiff_t
>(i),
914 static_cast<std::ptrdiff_t
>(StencilSize - i) - 1});
915 stencil_volumes[i] = volumes.Subview(
917 {
static_cast<std::ptrdiff_t
>(i),
918 static_cast<std::ptrdiff_t
>(StencilSize - i) - 1}));
920 std::tuple views = std::tuple_cat(std::tuple(faces),
AsTuple(stencil_volumes),
924 std::tuple args{rest...};
925 std::array<span<const double>, StencilSize> volumes =
926 AsArray(Take<StencilSize>(args));
927 std::array states = std::apply(
928 [](
const auto&... xs)
930 return {
Begin(xs)...};
932 Drop<StencilSize>(args));
933 std::array<Array1d, StencilSize> alphas;
934 alphas.fill(Array1d::Zero());
935 Array1d betas = Array1d::Zero();
936 int n =
static_cast<int>(faces.size());
938 betas = Array1d::Map(faces.data());
939 for (std::size_t i = 0; i < StencilSize; ++i) {
940 Load(stencil_array_[i], states[i]);
941 alphas[i] = Array1d::Map(volumes[i].data());
945 min_dt = std::min(min_dt, dts.minCoeff());
946 for (std::size_t i = 0; i < StencilSize; ++i) {
951 n =
static_cast<int>(faces.size());
953 std::copy_n(faces.data(), n, betas.data());
955 for (std::size_t i = 0; i < StencilSize; ++i) {
956 LoadN(stencil_array_[i], states[i], n);
957 std::copy_n(volumes[i].data(), n, alphas[i].data());
962 min_dt = std::min(min_dt, dts.minCoeff());
967 template <
typename Equation,
typename FluxMethod,
typename HGr
idReconstruction>
979 const int d =
static_cast<int>(dir);
980 ArrayView faces = cutcell_data.
face_fractions[d].Subview(fluxbox);
981 std::array<View<const Complete>, StencilSize> stencil_views;
982 std::array<ArrayView, StencilSize> stencil_volumes;
983 for (std::size_t i = 0; i < StencilSize; ++i) {
986 {
static_cast<std::ptrdiff_t
>(i),
987 static_cast<std::ptrdiff_t
>(StencilSize - i) - 1});
988 stencil_volumes[i] = volumes.Subview(
990 {
static_cast<std::ptrdiff_t
>(i),
991 static_cast<std::ptrdiff_t
>(StencilSize - i) - 1}));
994 std::tuple_cat(std::tuple(fluxes, faces),
AsTuple(stencil_volumes),
1001 std::tuple args{rest...};
1002 std::array<span<const double>, StencilSize> volumes =
1003 AsArray(Take<StencilSize>(args));
1004 std::array states = std::apply(
1005 [](
const auto&... xs)
1007 return {
Begin(xs)...};
1009 Drop<StencilSize>(args));
1010 std::array<Array1d, StencilSize> alphas;
1011 alphas.fill(Array1d::Zero());
1012 Array1d betas = Array1d::Zero();
1013 int n =
static_cast<int>(get<0>(fend) - get<0>(fit));
1015 betas = Array1d::Map(faces.data());
1016 for (std::size_t i = 0; i < StencilSize; ++i) {
1017 Load(stencil_array_[i], states[i]);
1018 alphas[i] = Array1d::Map(volumes[i].data());
1020 FluxMethod::ComputeNumericFlux(numeric_flux_array_, betas, stencil_array_,
1021 alphas, dt, dx, dir);
1022 for (
int i = 0; i < betas.size(); ++i) {
1024 [&](
auto&& flux [[maybe_unused]]) {
1026 (betas[i] > 0.0 && !std::isnan(flux[i])));
1028 numeric_flux_array_);
1030 Store(fit, numeric_flux_array_);
1032 for (std::size_t i = 0; i < StencilSize; ++i) {
1037 n =
static_cast<int>(get<0>(fend) - get<0>(fit));
1039 std::copy_n(faces.data(), n, betas.data());
1041 for (std::size_t i = 0; i < StencilSize; ++i) {
1042 LoadN(stencil_array_[i], states[i], n);
1043 std::copy_n(volumes[i].data(), n, alphas[i].data());
1046 FluxMethod::ComputeNumericFlux(numeric_flux_array_, betas, stencil_array_,
1047 alphas, dt, dx, dir);
1048 StoreN(fit, numeric_flux_array_, n);
1052 template <
typename Equation,
typename FluxMethod,
typename HGr
idReconstruction>
1065 const Eigen::Matrix<double, Rank, 1>& dx,
1077 const auto d =
static_cast<std::size_t
>(dir);
1085 const double betaL = betas(faceL);
1086 const double betaR = betas(faceR);
1087 const double betaUsL = betaUs(faceL);
1088 const double betaUsR = betaUs(faceR);
1089 if (betaL < betaR) {
1090 h_grid_reconstruction_.ReconstructEmbeddedBoundaryStencil(
1091 h_grid_eb_, h_grid_eb_gradients_, states, gradient_x, gradient_y,
1092 gradient_z, geom, cell, dt, dx, dir);
1093 FluxMethod::ComputeNumericFlux(boundary_flux_, h_grid_eb_,
1094 h_grid_eb_gradients_, dt, dx[d], dir);
1095 Store(boundary_fluxes, boundary_flux_, cell);
1097 h_grid_reconstruction_.ReconstructSinglyShieldedStencil(
1098 h_grid_singly_shielded_, h_grid_singly_shielded_gradients_, states,
1099 gradient_x, gradient_y, gradient_z, geom, cell, dt, dx, dir);
1100 FluxMethod::ComputeNumericFlux(
1101 singly_shielded_flux_, h_grid_singly_shielded_,
1102 h_grid_singly_shielded_gradients_, dt, dx[d], dir);
1103 if (
Contains(Box<0>(shielded_left_fluxes), faceR)) {
1104 Store(shielded_left_fluxes, singly_shielded_flux_, faceR);
1105 if (betaUsR > 0.0) {
1106 h_grid_reconstruction_.ReconstructRegularStencil(
1107 h_grid_regular_, h_grid_regular_gradients_, states, gradient_x,
1108 gradient_y, gradient_z, geom, faceR, dt, dx, dir);
1109 FluxMethod::ComputeNumericFlux(regular_flux_, h_grid_regular_,
1110 h_grid_regular_gradients_, dt, dx[d],
1112 Store(regular_fluxes, regular_flux_, faceR);
1115 }
else if (betaR < betaL) {
1116 h_grid_reconstruction_.ReconstructEmbeddedBoundaryStencil(
1117 h_grid_eb_, h_grid_eb_gradients_, states, gradient_x, gradient_y,
1118 gradient_z, geom, cell, dt, dx, dir);
1119 FluxMethod::ComputeNumericFlux(boundary_flux_, h_grid_eb_,
1120 h_grid_eb_gradients_, dt, dx[d], dir);
1121 Store(boundary_fluxes, boundary_flux_, cell);
1123 h_grid_reconstruction_.ReconstructSinglyShieldedStencil(
1124 h_grid_singly_shielded_, h_grid_singly_shielded_gradients_, states,
1125 gradient_x, gradient_y, gradient_z, geom, cell, dt, dx, dir);
1126 FluxMethod::ComputeNumericFlux(
1127 singly_shielded_flux_, h_grid_singly_shielded_,
1128 h_grid_singly_shielded_gradients_, dt, dx[d], dir);
1129 if (
Contains(Box<0>(shielded_right_fluxes), faceL)) {
1130 Store(shielded_right_fluxes, singly_shielded_flux_, faceL);
1131 if (betaUsL > 0.0) {
1132 h_grid_reconstruction_.ReconstructRegularStencil(
1133 h_grid_regular_, h_grid_regular_gradients_, states, gradient_x,
1134 gradient_y, gradient_z, geom, faceL, dt, dx, dir);
1135 FluxMethod::ComputeNumericFlux(regular_flux_, h_grid_regular_,
1136 h_grid_regular_gradients_, dt, dx[d],
1138 Store(regular_fluxes, regular_flux_, faceL);
1150 shielded_right, regular, boundary,
1151 geom, dt, dx[d], dir);
1153 stabilised_fluxes, shielded_left_fluxes, shielded_right_fluxes,
1154 regular_fluxes, boundary_fluxes);
#define FUB_ASSERT(x)
Definition: assert.hpp:39
This class applies a base flux nethod on a view of states.
Definition: flux_method/FluxMethod.hpp:57
static constexpr int GetStencilWidth() noexcept
Returns the stencil width of this flux method.
Definition: flux_method/FluxMethod.hpp:183
meta::Equation< const BaseMethod & > Equation
Definition: flux_method/FluxMethod.hpp:59
double ComputeStableDt(const View< const Complete > &states, double dx, Direction dir)
This function computes a time step size such that no signal will leave any cell covered by this view.
Definition: flux_method/FluxMethod.hpp:318
Definition: MyStabilisation.hpp:783
std::array< Conservative, 2 > h_grid_singly_shielded_gradients_
Definition: MyStabilisation.hpp:857
std::array< Complete, 2 > h_grid_eb_
Definition: MyStabilisation.hpp:854
std::array< Complete, 2 > h_grid_singly_shielded_
Definition: MyStabilisation.hpp:856
MyCutCellMethod(const Equation &equation)
Constructs a CutCell method from a given base flux method.
Definition: MyStabilisation.hpp:875
::fub::Conservative< Equation > Conservative
Definition: MyStabilisation.hpp:788
::fub::Complete< Equation > Complete
Definition: MyStabilisation.hpp:790
::fub::CompleteArray< Equation > CompleteArray
Definition: MyStabilisation.hpp:791
HGridReconstruction h_grid_reconstruction_
Definition: MyStabilisation.hpp:852
void ComputeCutCellFluxes(const View< Conservative > &stabilised_fluxes, const View< Conservative > &shielded_left_fluxes, const View< Conservative > &shielded_right_fluxes, const View< Conservative > &doubly_shielded_fluxes, const View< Conservative > ®ular_fluxes, const View< Conservative > &boundary_fluxes, const View< const Conservative > &gradient_x, const View< const Conservative > &gradient_y, const View< const Conservative > &gradient_z, const View< const Complete > &states, const CutCellData< Rank > &geom, Duration dt, const Eigen::Matrix< double, Rank, 1 > &dx, Direction dir)
Definition: MyStabilisation.hpp:1054
std::array< CompleteArray, StencilSize > stencil_array_
Definition: MyStabilisation.hpp:865
Equation equation_
Definition: MyStabilisation.hpp:851
void ComputeGradients(const View< Conservative > &gradient_x, const View< Conservative > &gradient_y, const View< Conservative > &gradient_z, const View< const Conservative > &states, const StridedDataView< const char, Rank > &flags, const CutCellData< Rank > &geom, const Coordinates< Rank > &dx)
Definition: MyStabilisation.hpp:839
double ComputeStableDt(const View< const Complete > &states, double dx, Direction dir)
This function computes a time step size such that no signal will leave any cell covered by this view.
Definition: flux_method/FluxMethod.hpp:318
std::array< Conservative, 2 > h_grid_regular_gradients_
Definition: MyStabilisation.hpp:859
std::array< Conservative, 2 > h_grid_eb_gradients_
Definition: MyStabilisation.hpp:855
std::array< Complete, 2 > h_grid_regular_
Definition: MyStabilisation.hpp:858
void ComputeRegularFluxes(const View< Conservative > ®ular_fluxes, const View< const Complete > &states, const CutCellData< Rank > &cutcell_data, Duration dt, double dx, Direction dir)
Definition: MyStabilisation.hpp:969
A span is a view over a contiguous sequence of objects, the storage of which is owned by some other o...
Definition: span.hpp:81
constexpr pointer data() const noexcept
Returns the underlying pointer.
Definition: span.hpp:411
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
Function ForEachIndex(const layout_left::mapping< Extents > &mapping, Function function)
Iterate through the multi-dimensional index space descibed by mapping and invoke function for each su...
Definition: ForEach.hpp:74
FluxMethod(F &&) -> FluxMethod< execution::OpenMpSimdTag, std::decay_t< F >>
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
auto Shrink(const layout_left::mapping< Extent > &layout, Direction dir, std::ptrdiff_t n=1)
Definition: Equation.hpp:78
Eigen::Vector2d GetBoundaryNormal(const CutCellData< 2 > &ccdata, const std::array< std::ptrdiff_t, 2 > &index)
Eigen::Vector2d GetUnshieldedCentroid(const CutCellData< 2 > &geom, const Index< 2 > &face, const Eigen::Vector2d &dx, Direction dir)
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
View< State > Subview(const BasicView< State, Layout, Rank > &state, const IndexBox< Rank > &box)
Definition: Equation.hpp:86
Array< double, 1 > Array1d
Definition: Eigen.hpp:53
constexpr const int kDefaultChunkSize
Definition: Eigen.hpp:39
void ForEachVariable(F function, Ts &&... states)
Definition: State.hpp:89
void StoreN(nodeduce_t< ViewPointer< Conservative< Eq >>> pointer, const ConservativeArray< Eq > &state, int n)
Definition: StateArray.hpp:416
IndexBox< Rank > Grow(const IndexBox< Rank > &box, Direction dir, const std::array< std::ptrdiff_t, 2 > &shifts)
Definition: PatchDataView.hpp:106
std::array< std::ptrdiff_t, N > RightTo(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift=1)
Definition: PatchDataView.hpp:51
constexpr std::array< std::ptrdiff_t, Extents::rank()> AsArray(Extents e) noexcept
Definition: PatchDataView.hpp:154
void ForEachRow(const Tuple &views, Function f)
Definition: StateRow.hpp:172
typename nodeduce< T >::type nodeduce_t
Definition: type_traits.hpp:47
void Load(State &state, const BasicView< const State, Layout, Rank > &view, const std::array< std::ptrdiff_t, State::Equation::Rank()> &index)
Definition: State.hpp:640
ViewPointer< State > Begin(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:769
void LoadN(CompleteArray< Eq, N > &state, const BasicView< const Complete< Eq >, Layout, Rank > &view, int size, nodeduce_t< const std::array< std::ptrdiff_t, std::size_t(Rank)> & > pos)
Definition: StateArray.hpp:310
Coordinates< 2 > ComputeReflectedCoordinates(const Coordinates< 2 > &offset, const Coordinates< 2 > &boundary_normal)
Definition: MyStabilisation.hpp:57
Eigen::Vector2d GetBoundaryCentroid(const CutCellData< 2 > &ccdata, const std::array< std::ptrdiff_t, 2 > &index)
Index< Rank > RelativeCellIndex(const Coordinates< Rank > &x, const Coordinates< Rank > &dx)
Definition: MyStabilisation.hpp:65
Eigen::Matrix< double, Rank, 1 > GetAbsoluteBoundaryCentroid(const CutCellData< Rank > &geom, const Index< Rank > &index, const Eigen::Matrix< double, Rank, 1 > &dx)
Definition: CutCellData.hpp:120
Eigen::Matrix< double, Rank, 1 > GetAbsoluteVolumeCentroid(const CutCellData< Rank > &geom, const Index< Rank > &index, const Eigen::Matrix< double, Rank, 1 > &dx)
Definition: CutCellData.hpp:107
void MyStab_ComputeStableFluxComponents(const PatchDataView< double, 2, layout_stride > &stabilised_fluxes, const PatchDataView< double, 2, layout_stride > &shielded_left_fluxes, const PatchDataView< double, 2, layout_stride > &shielded_right_fluxes, const PatchDataView< const double, 2, layout_stride > ®ular_fluxes, const PatchDataView< const double, 2, layout_stride > &boundary_fluxes, const CutCellData< 2 > &geom, Duration dt, double dx, Direction dir)
void ApplyGradient(State &u, span< const State, Rank > grad, nodeduce_t< const Eigen::Matrix< double, Rank, 1 > & > x) noexcept
Definition: MyStabilisation.hpp:85
Direction
This is a type safe type to denote a dimensional split direction.
Definition: Direction.hpp:30
void Advance(ViewPointer< State > &pointer, std::ptrdiff_t n) noexcept
Definition: State.hpp:825
std::array< std::ptrdiff_t, static_cast< std::size_t >(Rank)> Index
Definition: PatchDataView.hpp:34
Index< Rank+1 > EmbedIndex(const Index< Rank > &index, Direction dir)
Definition: MyStabilisation.hpp:76
constexpr auto AsTuple(const TupleLike &t)
Definition: tuple.hpp:69
const Conservative< Eq > & AsCons(const Conservative< Eq > &x)
Definition: State.hpp:438
bool Contains(const IndexBox< Rank > &b1, const IndexBox< Rank > &b2)
Definition: PatchDataView.hpp:73
void Reflect(Complete< IdealGasMix< 1 >> &reflected, const Complete< IdealGasMix< 1 >> &state, const Eigen::Matrix< double, 1, 1 > &normal, const IdealGasMix< 1 > &gas)
Eigen::Matrix< double, Rank, 1 > Coordinates
Definition: MyStabilisation.hpp:54
void Store(const BasicView< Conservative< Eq >, Layout, Eq::Rank()> &view, const Conservative< Eq > &state, const std::array< std::ptrdiff_t, Eq::Rank()> &index)
Definition: State.hpp:663
ViewPointer< State > End(const BasicView< State, Layout, Rank > &view)
Definition: State.hpp:782
std::array< double, 2 > Intersect(const std::array< double, 2 > &i1, const std::array< double, 2 > &i2)
Definition: CutCellData.hpp:29
void ForEachComponent(F function, Ts &&... states)
Definition: State.hpp:624
std::array< std::ptrdiff_t, N > Shift(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift)
Definition: PatchDataView.hpp:37
MyCutCellMethod(const Equation &, const FluxMethod &) -> MyCutCellMethod< Equation, FluxMethod >
std::ptrdiff_t index
Definition: type_traits.hpp:179
std::array< std::ptrdiff_t, N > LeftTo(const std::array< std::ptrdiff_t, N > &idx, Direction dir, std::ptrdiff_t shift=1)
Definition: PatchDataView.hpp:45
Definition: MyStabilisation.hpp:105
void LimitGradientsAtIndex(const std::array< StridedDataView< double, Rank >, Rank > &grad_u, StridedDataView< const double, Rank > u, const CutCellData< Rank > &geom, const Index< Rank > &index, const Coordinates< Rank > &dx) const
void ComputeGradients(span< double, 2 > gradient, span< const double, 5 > states, span< const Coordinates< Rank >, 5 > x)
void LimitGradients(const std::array< StridedDataView< double, Rank >, Rank > &grad_u, StridedDataView< const double, Rank > u, StridedDataView< const char, Rank > needs_limiter, const CutCellData< Rank > &geom, const Coordinates< Rank > &dx) const
void ComputeGradients(span< double, 2 > gradient, span< const double, 4 > states, span< const Coordinates< Rank >, 4 > x)
Definition: State.hpp:403
Definition: MyStabilisation.hpp:140
Coordinates< Rank > slope
Definition: MyStabilisation.hpp:149
std::array< Index< Rank >, kMaxSources > sources
Definition: MyStabilisation.hpp:143
int n_sources
Definition: MyStabilisation.hpp:147
std::array< double, kMaxSources > end
Definition: MyStabilisation.hpp:145
Coordinates< Rank > xB
Definition: MyStabilisation.hpp:150
std::array< double, kMaxSources > start
Definition: MyStabilisation.hpp:144
Definition: MyStabilisation.hpp:130
void ComputeGradients(span< Conservative, 2 > gradient, span< const Conservative, 5 > states, span< const Coordinates< Rank >, 5 > x)
Definition: MyStabilisation.hpp:171
void ComputeGradients(span< Conservative, 2 > gradient, span< const Conservative, 4 > states, span< const Coordinates< Rank >, 4 > x)
Definition: MyStabilisation.hpp:156
std::array< AuxiliaryReconstructionData, 2 > SplitAt(const AuxiliaryReconstructionData &aux, double dx)
Definition: MyStabilisation.hpp:398
void ReconstructEmbeddedBoundaryStencil(span< Complete, 2 > h_grid_embedded_boundary, span< Conservative, 2 > h_grid_embedded_boundary_slopes, const View< const Complete > &states, const View< const Conservative > &gradient_x, const View< const Conservative > &gradient_y, const View< const Conservative > &gradient_z, const CutCellData< Rank > &cutcell_data, const Index< Rank > &cell, Duration, Eigen::Matrix< double, Rank, 1 > dx, Direction dir)
Definition: MyStabilisation.hpp:659
double Length(const std::array< double, 2 > &interval)
Definition: MyStabilisation.hpp:356
ConservativeHGridReconstruction(const Equation &equation)
Definition: MyStabilisation.hpp:153
void SetZero(Conservative &cons)
Definition: MyStabilisation.hpp:429
AuxiliaryReconstructionData Sort(const AuxiliaryReconstructionData &aux_data)
Definition: MyStabilisation.hpp:373
AuxiliaryReconstructionData GetAuxiliaryData(const Index< Rank > &index, const CutCellData< Rank > &geom, const Coordinates< Rank > &dx, const Coordinates< Rank > &slope, double required_length)
Definition: MyStabilisation.hpp:433
double TotalLength(const AuxiliaryReconstructionData &aux) noexcept
Definition: MyStabilisation.hpp:486
void ReconstructRegularStencil(span< Complete, 2 > h_grid_regular, span< Conservative, 2 > h_grid_regular_gradients, const View< const Complete > &states, const View< const Conservative > &gradient_x, const View< const Conservative > &gradient_y, const View< const Conservative > &gradient_z, const CutCellData< Rank > &geom, const Index< Rank > &face, Duration, Eigen::Matrix< double, Rank, 1 > dx, Direction dir)
Definition: MyStabilisation.hpp:720
Equation equation_
Definition: MyStabilisation.hpp:764
bool IntegrateCellState(Conservative &integral, Conservative &integral_gradient, const View< const Conservative > &states, const View< const Conservative > &gradient_x, const View< const Conservative > &gradient_y, const View< const Conservative > &gradient_z, const CutCellData< Rank > &geom, const AuxiliaryReconstructionData &aux_data, const Coordinates< Rank > &dx, double total_length)
Definition: MyStabilisation.hpp:494
bool IntegrateCellState(Conservative &integral, Conservative &integral_gradient, const View< const Conservative > &states, const View< const Conservative > &gradient_x, const View< const Conservative > &gradient_y, const View< const Conservative > &gradient_z, const CutCellData< Rank > &geom, const AuxiliaryReconstructionData &aux_data, const Coordinates< Rank > &dx)
Definition: MyStabilisation.hpp:536
std::array< double, 2 > FindAdmissibleInterval(const Coordinates< Rank > &xM, const Coordinates< Rank > &xB, const Coordinates< Rank > &slope, const Coordinates< Rank > &dx)
Definition: MyStabilisation.hpp:329
void ComputeGradients(const View< Conservative > &gradient_x, const View< Conservative > &gradient_y, const View< Conservative > &gradient_z, const View< const Conservative > &states, const StridedDataView< const char, Rank > &flags, const CutCellData< Rank > &geom, const Coordinates< Rank > &dx)
Definition: MyStabilisation.hpp:187
void ReconstructSinglyShieldedStencil(span< Complete, 2 > h_grid_singly_shielded, span< Conservative, 2 > h_grid_singly_shielded_gradients, const View< const Complete > &states, const View< const Conservative > &gradient_x, const View< const Conservative > &gradient_y, const View< const Conservative > &gradient_z, const CutCellData< Rank > &cutcell_data, const Index< Rank > &cell, Duration, const Coordinates< Rank > &dx, Direction dir)
Definition: MyStabilisation.hpp:551
IndexBox< Rank > MakeIndexBox(const Index< Rank > &signs) noexcept
Definition: MyStabilisation.hpp:360
AuxiliaryReconstructionData GetAuxiliaryData(const Index< Rank > &index, const CutCellData< Rank > &geom, const Coordinates< Rank > &dx, Direction dir)
Definition: MyStabilisation.hpp:472
Definition: CutCellData.hpp:34
std::array< PatchDataView< const double, Rank >, sRank > unshielded_fractions
Definition: CutCellData.hpp:46
PatchDataView< const double, Rank > volume_fractions
Definition: CutCellData.hpp:38
PatchDataView< const double, Rank+1 > boundary_centeroids
Definition: CutCellData.hpp:42
std::array< PatchDataView< const double, Rank >, sRank > face_fractions
Definition: CutCellData.hpp:40
Definition: PatchDataView.hpp:56
Index< Rank > upper
Definition: PatchDataView.hpp:59
Definition: PatchDataView.hpp:201
PatchDataView< T, R, layout_stride > Subview(const IndexBox< R > &box) const
Definition: PatchDataView.hpp:245
Definition: StateRow.hpp:51
Definition: State.hpp:750