1 #pragma once // Ensure that file is included only once in a single compilation.
27 template <
class TopologyT,
29 class NodeDescriptorT,
31 typename LargeVecT = std::vector<double>,
32 typename dof_index_t =
unsigned int>
57 typename LocalSolverT::data_type>
84 const typename GeometryT::constructor_value_type& construct_geom,
85 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
88 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
89 "Hyperedge dimension of topology and geometry must be equal!");
90 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
91 "Space dimension of topology and geometry must be equal!");
92 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
93 "Hyperedge dimension of hypergraph and local solver must be equal!");
105 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
108 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
109 "Hyperedge dimension of topology and geometry must be equal!");
110 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
111 "Space dimension of topology and geometry must be equal!");
112 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
113 "Hyperedge dimension of hypergraph and local solver must be equal!");
126 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
127 "Hyperedge dimension of topology and geometry must be equal!");
128 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
129 "Space dimension of topology and geometry must be equal!");
130 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
131 "Hyperedge dimension of hypergraph and local solver must be equal!");
139 template <
typename hyNode_index_t = dof_index_t>
142 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
144 std::array<dof_index_t, LocalSolverT::n_glob_dofs_per_node()> dof_indices;
146 std::array<unsigned int, 2 * hyEdge_dim> hyNode_types;
149 hyNode_types = local_solver_.node_types(hyper_edge);
150 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
152 for (unsigned int i = 0; i < hyNode_types.size(); ++i)
153 if (hyNode_types[i] == 1)
155 hyper_graph_.hyNode_factory().get_dof_indices(hyEdge_hyNodes[i], dof_indices);
156 for (unsigned int j = 0; j < dof_indices.size(); ++j)
157 dirichlet_indices_.push_back(dof_indices[j]);
180 template <
typename hyNode_index_t = dof_index_t>
183 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
184 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
186 LargeVecT vec_Ax(x_vec.size(), 0.);
188 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
192 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
194 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
195 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
197 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
198 hyEdge_dofs_old[hyNode]);
199 hyEdge_dofs_new[hyNode].fill(0.);
206 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
207 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
208 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
210 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, time);
214 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
215 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
216 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
218 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, hyper_edge, time);
220 hy_assert(
false,
"Function seems not to be implemented!");
223 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
224 hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
225 hyEdge_dofs_new[hyNode]);
241 template <
typename hyNode_index_t = dof_index_t>
244 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
245 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
247 LargeVecT vec_Ax(x_vec.size(), 0.);
249 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
253 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
255 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
256 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
258 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
259 hyEdge_dofs_old[hyNode]);
260 hyEdge_dofs_new[hyNode].fill(0.);
265 has_trace_to_mass_flux<
267 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
268 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
269 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
272 local_solver_.trace_to_mass_flux(hyEdge_dofs_old, hyEdge_dofs_new, time);
275 has_trace_to_mass_flux<
277 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
278 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
279 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
282 local_solver_.trace_to_mass_flux(hyEdge_dofs_old, hyEdge_dofs_new, hyper_edge, time);
285 hy_assert(
false,
"Function seems not to be implemented!");
288 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
289 hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
290 hyEdge_dofs_new[hyNode]);
317 std::string
plot_option(
const std::string& option, std::string value =
"")
332 plot(hyper_graph_, local_solver_, lambda, plot_options, time);