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>
53 typename LocalSolverT::data_type>
80 const typename GeometryT::constructor_value_type& construct_geom,
81 const typename LocalSolverT::constructor_value_type& construct_loc_sol)
84 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
85 "Hyperedge dimension of topology and geometry must be equal!");
86 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
87 "Space dimension of topology and geometry must be equal!");
88 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
89 "Hyperedge dimension of hypergraph and local solver must be equal!");
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!");
122 static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
123 "Hyperedge dimension of topology and geometry must be equal!");
124 static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
125 "Space dimension of topology and geometry must be equal!");
126 static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
127 "Hyperedge dimension of hypergraph and local solver must be equal!");
135 template <
typename hyNode_index_t = dof_index_t>
138 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
140 std::array<dof_index_t, LocalSolverT::n_glob_dofs_per_node()> dof_indices;
142 std::array<unsigned int, 2 * hyEdge_dim> hyNode_types;
145 hyNode_types = local_solver_.node_types(hyper_edge);
146 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
148 for (unsigned int i = 0; i < hyNode_types.size(); ++i)
149 if (hyNode_types[i] == 1)
151 hyper_graph_.hyNode_factory().get_dof_indices(hyEdge_hyNodes[i], dof_indices);
152 for (unsigned int j = 0; j < dof_indices.size(); ++j)
153 dirichlet_indices_.push_back(dof_indices[j]);
172 template <
typename hyNode_index_t = dof_index_t>
175 constexpr
unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
176 constexpr
unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
178 LargeVecT vec_Ax(x_vec.size(), 0.);
180 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
184 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](
auto hyper_edge) {
186 hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
187 for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
189 hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
190 hyEdge_dofs_old[hyNode]);
191 hyEdge_dofs_new[hyNode].fill(0.);
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()>&,
200 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
202 local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, sigma);
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, hyper_edge, sigma);
212 hy_assert(
false,
"Function seems not to be implemented!");
215 for (
unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.
size(); ++hyNode)
216 hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
217 hyEdge_dofs_new[hyNode]);
244 std::string
plot_option(
const std::string& option, std::string value =
"")
259 plot(hyper_graph_, local_solver_, lambda, plot_options, time);