24 std::vector<FluxVectorType>
const& ip_flux_vector,
25 Eigen::MatrixBase<Derived>& laplacian_matrix)
27 auto const& Ns = shape_matrix_cache.
NsHigherOrder<MeshElementType>();
29 for (std::size_t ip = 0; ip < ip_flux_vector.size(); ++ip)
31 auto const& ip_data = ip_data_vector[ip];
32 auto const w = ip_data.integration_weight;
33 auto const& dNdx = ip_data.dNdx;
34 auto const&
N = Ns[ip];
35 laplacian_matrix.noalias() +=
36 (
N.transpose() * ip_flux_vector[ip].transpose() * dNdx * w)
37#if defined(__GNUC__) && (__GNUC__ == 14) && (__GNUC_MINOR__ == 2) && \
38 (__GNUC_PATCHLEVEL__ == 1)
47 std::vector<FluxVectorType>
const& ip_flux_vector,
48 Eigen::MatrixBase<Derived>& laplacian_matrix)
50 for (std::size_t ip = 0; ip < ip_flux_vector.size(); ++ip)
52 auto const& ip_data = ip_data_vector[ip];
53 auto const w = ip_data.integration_weight;
54 auto const&
N = ip_data.N;
55 auto const& dNdx = ip_data.dNdx;
56 laplacian_matrix.noalias() +=
57 N.transpose() * ip_flux_vector[ip].transpose() * dNdx * w;
63 Eigen::MatrixBase<Derived>& laplacian_matrix)
65 Eigen::VectorXd
const down_mask =
66 (quasi_nodal_flux.array() < 0).cast<
double>();
67 Eigen::VectorXd
const down = quasi_nodal_flux.cwiseProduct(down_mask);
69 double const q_in = -down.sum();
70 if (q_in < std::numeric_limits<double>::epsilon())
75 Eigen::VectorXd
const up_mask =
76 (quasi_nodal_flux.array() >= 0).cast<
double>();
77 Eigen::VectorXd
const up = quasi_nodal_flux.cwiseProduct(up_mask);
79 laplacian_matrix.diagonal().noalias() += up;
80 laplacian_matrix.noalias() += down * up.transpose() / q_in;
85 std::vector<FluxVectorType>
const& ip_flux_vector,
86 Eigen::MatrixBase<Derived>& laplacian_matrix)
88 Eigen::VectorXd quasi_nodal_flux =
89 Eigen::VectorXd::Zero(laplacian_matrix.rows());
91 for (std::size_t ip = 0; ip < ip_flux_vector.size(); ++ip)
93 auto const& ip_data = ip_data_vector[ip];
94 auto const w = ip_data.integration_weight;
95 auto const& dNdx = ip_data.dNdx;
97 quasi_nodal_flux.noalias() -= ip_flux_vector[ip].transpose() * dNdx * w;
109 IPData
const& ip_data_vector,
111 std::vector<FluxVectorType>
const& ip_flux_vector,
112 double const average_velocity,
113 Eigen::MatrixBase<Derived>& laplacian_matrix)
116 [&](
auto&& stabilizer)
118 using Stabilizer = std::decay_t<
decltype(stabilizer)>;
119 if constexpr (std::is_same_v<Stabilizer, FullUpwind>)
121 if (average_velocity > stabilizer.getCutoffVelocity())
130 ip_data_vector, shape_matrix_cache, ip_flux_vector,
138 IPData
const& ip_data_vector,
139 std::vector<FluxVectorType>
const& ip_flux_vector,
140 double const average_velocity,
141 Eigen::MatrixBase<Derived>& laplacian_matrix)
144 [&](
auto&& stabilizer)
146 using Stabilizer = std::decay_t<
decltype(stabilizer)>;
147 if constexpr (std::is_same_v<Stabilizer, FullUpwind>)
149 if (average_velocity > stabilizer.getCutoffVelocity())
158 ip_data_vector, ip_flux_vector, laplacian_matrix);