Go to the documentation of this file. 1 #pragma once // Ensure that file is included only once in a single compilation.
18 #define prototype_mat_vec_multiply(fun_name, has_fun_name) \
20 LargeVecT vec_Ax(x_vec.size(), 0.); \
21 SmallVec<2 * hyEdge_dim, hyNode_index_t> hyNodes; \
22 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> dofs_old, dofs_new; \
24 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](auto hyper_edge) { \
25 hyNodes = hyper_edge.topology.get_hyNode_indices(); \
26 for (unsigned int node = 0; node < hyNodes.size(); ++node) \
28 hyper_graph_.hyNode_factory().get_dof_values(hyNodes[node], x_vec, dofs_old[node]); \
29 dofs_new[node].fill(0.); \
32 if constexpr (has_fun_name< \
34 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim>&( \
35 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim>&, \
36 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim>&, \
37 dof_value_t)>::value) \
38 local_solver_.fun_name(dofs_old, dofs_new, time); \
40 has_fun_name<LocalSolverT, \
41 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim>&( \
42 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim>&, \
43 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim>&, \
44 decltype(hyper_edge)&, dof_value_t)>::value) \
45 local_solver_.fun_name(dofs_old, dofs_new, hyper_edge, time); \
47 hy_assert(false, "Function seems not to be implemented!"); \
49 for (unsigned int node = 0; node < hyNodes.size(); ++node) \
50 hyper_graph_.hyNode_factory().add_to_dof_values(hyNodes[node], vec_Ax, dofs_new[node]); \
71 #define prototype_errors(fun_name, has_fun_name) \
73 typedef typename LocalSolverT::error_def::error_t error_t; \
74 error_t result = LocalSolverT::error_def::initial_error(); \
76 SmallVec<2 * hyEdge_dim, hyNode_index_t> hyNodes; \
77 std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> dofs; \
79 std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](auto hyper_edge) { \
80 hyNodes = hyper_edge.topology.get_hyNode_indices(); \
81 for (unsigned int node = 0; node < hyNodes.size(); ++node) \
82 hyper_graph_.hyNode_factory().get_dof_values(hyNodes[node], x_vec, dofs[node]); \
84 if constexpr (has_fun_name<LocalSolverT, \
85 error_t(std::array<std::array<dof_value_t, n_dofs_per_node>, \
87 dof_value_t)>::value) \
88 result = LocalSolverT::error_def::sum_error(result, local_solver_.fun_name(dofs, time)); \
89 else if constexpr (has_fun_name<LocalSolverT, \
90 error_t(std::array<std::array<dof_value_t, n_dofs_per_node>, \
92 decltype(hyper_edge)&, dof_value_t)>::value) \
93 result = LocalSolverT::error_def::sum_error( \
94 result, local_solver_.fun_name(dofs, hyper_edge, time)); \
96 hy_assert(false, "Function seems not to be ímplemented"); \
99 return LocalSolverT::error_def::postprocess_error(result); \