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>
58 static constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
62 static constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
77 typename LocalSolverT::data_type>
99 Parabolic(
const typename TopologyT::constructor_value_type& construct_topo,
100 const typename GeometryT::constructor_value_type& construct_geom,
101 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
104 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
105 "Hyperedge dimension of topology and geometry must be equal!");
106 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
107 "Space dimension of topology and geometry must be equal!");
108 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
109 "Hyperedge dimension of hypergraph and local solver must be equal!");
120 Parabolic(
const typename TopologyT::constructor_value_type& construct_topo,
121 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
124 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
125 "Hyperedge dimension of topology and geometry must be equal!");
126 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
127 "Space dimension of topology and geometry must be equal!");
128 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
129 "Hyperedge dimension of hypergraph and local solver must be equal!");
139 Parabolic(
const typename TopologyT::constructor_value_type& construct_topo)
142 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
143 "Hyperedge dimension of topology and geometry must be equal!");
144 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
145 "Space dimension of topology and geometry must be equal!");
146 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
147 "Hyperedge dimension of hypergraph and local solver must be equal!");
171 template <
typename hyNode_index_t = dof_index_t>
174 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
175 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
177 LargeVecT vec_Ax(x_vec.size(), 0.);
179 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 *
hyEdge_dim> hyEdge_dofs_old,
185 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
186 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
188 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
189 hyEdge_dofs_old[hyNode]);
190 hyEdge_dofs_new[hyNode].fill(0.);
197 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
198 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
199 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
201 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, time);
205 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
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()>&,
209 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, hyper_edge, time);
211 hy_assert(
false,
"Function seems not to be implemented!");
214 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
216 hyEdge_dofs_new[hyNode]);
234 template <
typename hyNode_index_t = dof_index_t>
235 std::vector<dof_value_t>
residual_flux(
const std::vector<dof_value_t>& x_vec,
238 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
239 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
241 LargeVecT vec_Ax(x_vec.size(), 0.);
243 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
247 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
249 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
250 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
252 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
253 hyEdge_dofs_old[hyNode]);
254 hyEdge_dofs_new[hyNode].fill(0.);
261 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
262 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
263 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
266 local_solver_.residual_flux(hyEdge_dofs_old, hyEdge_dofs_new, time);
271 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
272 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
273 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
276 local_solver_.residual_flux(hyEdge_dofs_old, hyEdge_dofs_new, hyper_edge, time);
279 hy_assert(
false,
"Function seems not to be implemented!");
282 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
283 hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
284 hyEdge_dofs_new[hyNode]);
295 template <
typename hyNode_index_t = dof_index_t>
298 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
299 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
302 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs;
305 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
307 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
308 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
309 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
310 hyEdge_dofs[hyNode]);
313 if constexpr (has_set_data<LocalSolverT,
314 void(std::array<std::array<dof_value_t, n_dofs_per_node>,
315 2 * TopologyT::hyEdge_dim()>&,
316 dof_value_t)>::value)
318 local_solver_.set_data(hyEdge_dofs, time);
320 else if constexpr (has_set_data<LocalSolverT,
321 void(std::array<std::array<dof_value_t, n_dofs_per_node>,
322 2 * TopologyT::hyEdge_dim()>&,
325 local_solver_.set_data(hyEdge_dofs, hyper_edge, time);
328 hy_assert(
false,
"Function seems not to be implemented!");
338 template <
typename hyNode_index_t = dof_index_t>
339 LargeVecT
make_initial(
const LargeVecT& x_vec,
const dof_index_t time = 0.)
341 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
342 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
344 std::vector<dof_value_t> vec_Ax(x_vec.size(), 0.);
346 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs;
349 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
351 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
352 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
353 hyEdge_dofs[hyNode].fill(0.);
356 if constexpr (has_make_initial<LocalSolverT,
357 std::array<std::array<dof_value_t, n_dofs_per_node>,
358 2 * TopologyT::hyEdge_dim()>&(
359 std::array<std::array<dof_value_t, n_dofs_per_node>,
360 2 * TopologyT::hyEdge_dim()>&,
361 dof_value_t)>::value)
363 local_solver_.make_initial(hyEdge_dofs, time);
365 else if constexpr (has_make_initial<LocalSolverT,
366 std::array<std::array<dof_value_t, n_dofs_per_node>,
367 2 * TopologyT::hyEdge_dim()>&(
368 std::array<std::array<dof_value_t, n_dofs_per_node>,
369 2 * TopologyT::hyEdge_dim()>&,
372 local_solver_.make_initial(hyEdge_dofs, hyper_edge, time);
375 hy_assert(
false,
"Function seems not to be implemented!");
378 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
379 hyper_graph_.hyNode_factory().set_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
380 hyEdge_dofs[hyNode]);
392 template <
typename hyNode_index_t = dof_index_t>
396 return std::vector<dof_value_t>(result.begin(), result.end());
420 std::string
plot_option(
const std::string& option, std::string value =
"")
435 plot(hyper_graph_, local_solver_, lambda, plot_options, time);