1 #pragma once // Ensure that file is included only once in a single compilation.
26 template <
class TopologyT,
28 class NodeDescriptorT,
30 typename LargeVecT = std::vector<double>,
31 typename dof_index_t =
unsigned int>
60 typename LocalSolverT::data_type>
83 const typename GeometryT::constructor_value_type& construct_geom,
84 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
87 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
88 "Hyperedge dimension of topology and geometry must be equal!");
89 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
90 "Space dimension of topology and geometry must be equal!");
91 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
92 "Hyperedge dimension of hypergraph and local solver must be equal!");
104 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
107 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
108 "Hyperedge dimension of topology and geometry must be equal!");
109 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
110 "Space dimension of topology and geometry must be equal!");
111 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
112 "Hyperedge dimension of hypergraph and local solver must be equal!");
125 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
126 "Hyperedge dimension of topology and geometry must be equal!");
127 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
128 "Space dimension of topology and geometry must be equal!");
129 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
130 "Hyperedge dimension of hypergraph and local solver must be equal!");
142 template <
typename hyNode_index_t = dof_index_t>
145 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
146 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
148 LargeVecT vec_Ax(x_vec.size(), 0.);
150 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
156 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
157 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
159 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
160 hyEdge_dofs_old[hyNode]);
161 hyEdge_dofs_new[hyNode].fill(0.);
168 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
169 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
170 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
172 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, eig);
176 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
177 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
178 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
180 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, hyper_edge, eig);
182 hy_assert(
false,
"Function seems not to be implemented!");
185 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
187 hyEdge_dofs_new[hyNode]);
204 template <
typename hyNode_index_t = dof_index_t>
207 const LargeVecT& x_val,
210 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
211 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
213 LargeVecT vec_Ax(x_vec.size(), 0.);
215 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
216 hyEdge_dofs_new, hyEdge_vals;
219 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
221 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
222 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
224 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
225 hyEdge_dofs_old[hyNode]);
226 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_val,
227 hyEdge_vals[hyNode]);
228 hyEdge_dofs_new[hyNode].fill(0.);
233 has_jacobian_of_trace_to_flux<
235 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
236 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
237 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
239 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
242 local_solver_.jacobian_of_trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, eig, hyEdge_vals,
246 has_jacobian_of_trace_to_flux<
248 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
249 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
250 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
252 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
255 local_solver_.jacobian_of_trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, eig, hyEdge_vals,
256 eig_val, hyper_edge);
259 hy_assert(
false,
"Function seems not to be implemented!");
262 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
263 hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
264 hyEdge_dofs_new[hyNode]);
276 template <
typename hyNode_index_t = dof_index_t>
279 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
280 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
282 LargeVecT vec_Ax(x_vec.size(), 0.);
284 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs;
287 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
289 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
290 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
291 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
292 hyEdge_dofs[hyNode]);
295 if constexpr (has_make_initial<LocalSolverT,
296 std::array<std::array<dof_value_t, n_dofs_per_node>,
297 2 * TopologyT::hyEdge_dim()>&(
298 std::array<std::array<dof_value_t, n_dofs_per_node>,
299 2 * TopologyT::hyEdge_dim()>&,
300 dof_value_t)>::value)
302 local_solver_.make_initial(hyEdge_dofs, eig);
304 else if constexpr (has_make_initial<LocalSolverT,
305 std::array<std::array<dof_value_t, n_dofs_per_node>,
306 2 * TopologyT::hyEdge_dim()>&(
307 std::array<std::array<dof_value_t, n_dofs_per_node>,
308 2 * TopologyT::hyEdge_dim()>&,
311 local_solver_.make_initial(hyEdge_dofs, hyper_edge, eig);
314 hy_assert(
false,
"Function seems not to be implemented!");
317 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
318 hyper_graph_.hyNode_factory().set_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
319 hyEdge_dofs[hyNode]);
347 std::string
plot_option(
const std::string& option, std::string value =
"")
362 plot(hyper_graph_, local_solver_, lambda, plot_options, time);