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