1 #pragma once // Ensure that file is included only once in a single compilation.
19 template <
unsigned int space_dimT,
typename param_
float_t =
double>
20 struct Bilaplacian_parameters_default
33 static constexpr std::array<unsigned int, 0U>
neumann_nodes{};
42 const param_float_t = 0.)
50 const param_float_t = 0.)
58 const param_float_t = 0.)
66 const param_float_t = 0.)
74 const param_float_t = 0.)
82 const param_float_t = 0.)
90 const param_float_t = 0.)
115 template <
unsigned int hyEdge_dimT,
116 unsigned int poly_deg,
117 unsigned int quad_deg,
118 template <
unsigned int,
typename>
typename parametersT = Bilaplacian_parameters_default,
119 typename lSol_float_t =
double>
152 std::array<lSol_float_t, 1U> summed_error;
153 summed_error.fill(0.);
161 for (
unsigned int k = 0; k < summed_error.size(); ++k)
162 summed_error[k] += new_error[k];
170 for (
unsigned int k = 0; k < summed_error.size(); ++k)
171 summed_error[k] = std::sqrt(summed_error[k]);
183 static constexpr
unsigned int hyEdge_dim() {
return hyEdge_dimT; }
237 template <
typename parameters>
240 return std::find(parameters::dirichlet_nodes.begin(), parameters::dirichlet_nodes.end(),
241 node_type) != parameters::dirichlet_nodes.end();
243 template <
typename parameters>
246 return std::find(parameters::dirichlet_laplacian_nodes.begin(),
247 parameters::dirichlet_laplacian_nodes.end(),
248 node_type) != parameters::dirichlet_laplacian_nodes.end();
281 template <
typename hyEdgeT>
283 assemble_loc_matrix(
const lSol_float_t tau, hyEdgeT& hyper_edge,
const lSol_float_t time)
const;
304 template <
typename hyEdgeT,
typename SmallMatT>
306 const SmallMatT& lambda_values,
307 hyEdgeT& hyper_edge)
const;
326 template <
typename hyEdgeT>
329 const lSol_float_t time)
const;
348 template <
typename hyEdgeT>
350 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
351 hyEdgeT& hyper_edge)
const;
363 template <
typename hyEdgeT,
typename SmallMatT>
365 const unsigned int solution_type,
367 const lSol_float_t time)
const
372 if (solution_type == 0)
374 else if (solution_type == 1)
378 hy_assert(0 == 1,
"This has not been implemented!");
384 <<
"This can happen if quadrature is too inaccurate!");
399 template <
typename hyEdgeT>
401 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
403 const lSol_float_t time)
const
413 <<
"This can happen if quadrature is too inaccurate!");
422 template <
typename hyEdgeT>
424 const std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT>& lambda_values,
425 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
427 const lSol_float_t delta_time,
428 const lSol_float_t time)
const
441 <<
"This can happen if quadrature is too inaccurate!");
456 template <
typename hyEdgeT>
457 inline std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT>
primal_at_boundary(
458 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
459 hyEdgeT& hyper_edge)
const;
471 template <
typename hyEdgeT>
472 inline std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT>
dual_at_boundary(
473 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
474 hyEdgeT& hyper_edge)
const;
508 template <
class hyEdgeT,
typename SmallMatInT,
typename SmallMatOutT>
510 SmallMatOutT& lambda_values_out,
512 const lSol_float_t time = 0.)
const
514 hy_assert(lambda_values_in.size() == lambda_values_out.size() &&
515 lambda_values_in.size() == 2 * hyEdge_dimT,
516 "Both matrices must be of same size which corresponds to the number of faces!");
517 for (
unsigned int i = 0; i < lambda_values_in.size(); ++i)
519 lambda_values_in[i].size() == lambda_values_out[i].size() &&
521 "Both matrices must be of same size which corresponds to the number of dofs per face!");
524 std::array<lSol_float_t, n_loc_dofs_> coeffs =
527 std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT> primals(
531 for (
unsigned int i = 0; i < lambda_values_out.size(); ++i)
533 for (
unsigned int j = 0; j < lambda_values_out[i].size(); ++j)
534 lambda_values_out[i][j] =
535 duals[i][j] +
tau_ * primals[i][j] -
537 hyper_edge.geometry.face_area(i);
538 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[i]))
539 for (
unsigned int j = 0; j < lambda_values_out[i].size() / 2; ++j)
540 lambda_values_out[i][j] = 0.;
541 if (is_dirichlet_laplacian<parameters>(hyper_edge.node_descriptor[i]))
542 for (
unsigned int j = lambda_values_out[i].size() / 2; j < lambda_values_out[i].size(); ++j)
543 lambda_values_out[i][j] = 0.;
546 return lambda_values_out;
551 template <
class hyEdgeT>
552 std::array<unsigned int, 2 * hyEdge_dimT>
node_types(hyEdgeT& hyper_edge)
const
556 std::array<unsigned int, 2 * hyEdge_dimT> result;
559 for (
unsigned int i = 0; i < 2 * hyEdge_dimT; ++i)
560 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[i]))
577 template <
class hyEdgeT,
typename SmallMatInT,
typename SmallMatOutT>
579 SmallMatOutT& lambda_values_out,
581 const lSol_float_t time = 0.)
const
583 hy_assert(lambda_values_in.size() == lambda_values_out.size() &&
584 lambda_values_in.size() == 2 * hyEdge_dimT,
585 "Both matrices must be of same size which corresponds to the number of faces!");
586 for (
unsigned int i = 0; i < lambda_values_in.size(); ++i)
588 lambda_values_in[i].size() == lambda_values_out[i].size() &&
590 "Both matrices must be of same size which corresponds to the number of dofs per face!");
593 std::array<lSol_float_t, n_loc_dofs_> coeffs =
596 std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT> primals(
600 for (
unsigned int i = 0; i < lambda_values_out.size(); ++i)
602 for (
unsigned int j = 0; j < lambda_values_out[i].size(); ++j)
603 lambda_values_out[i][j] = duals[i][j] +
tau_ * primals[i][j] -
604 tau_ * lambda_values_in[i][j] * hyper_edge.geometry.face_area(i);
605 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[i]))
606 for (
unsigned int j = 0; j < lambda_values_out[i].size() / 2; ++j)
607 lambda_values_out[i][j] = 0.;
608 if (is_dirichlet_laplacian<parameters>(hyper_edge.node_descriptor[i]))
609 for (
unsigned int j = lambda_values_out[i].size() / 2; j < lambda_values_out[i].size(); ++j)
610 lambda_values_out[i][j] = 0.;
613 return lambda_values_out;
627 template <
class hyEdgeT,
typename SmallMatT>
630 const lSol_float_t time = 0.)
const
634 for (
unsigned int i = 0; i < lambda_values.size(); ++i)
636 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[i]))
637 for (
unsigned int j = 0; j < lambda_values[i].size(); ++j)
638 lambda_values[i][j] = 0.;
641 for (
unsigned int j = 0; j < lambda_values[i].size() / 2; ++j)
642 lambda_values[i][j] =
644 parameters::initial>(
645 i, j, hyper_edge.geometry, time);
646 for (
unsigned int j = lambda_values[i].size() / 2; j < lambda_values[i].size(); ++j)
647 lambda_values[i][j] =
649 parameters::initial_laplace>(
650 i, j, hyper_edge.geometry, time);
654 return lambda_values;
673 template <
typename hyEdgeT,
typename SmallMatInT,
typename SmallMatOutT>
675 SmallMatOutT& lambda_values_out,
677 const lSol_float_t time = 0.)
const
679 hy_assert(lambda_values_in.size() == lambda_values_out.size() &&
680 lambda_values_in.size() == 2 * hyEdge_dimT,
681 "Both matrices must be of same size which corresponds to the number of faces!");
682 for (
unsigned int i = 0; i < lambda_values_in.size(); ++i)
684 lambda_values_in[i].size() == lambda_values_out[i].size() &&
686 "Both matrices must be of same size which corresponds to the number of dofs per face!");
689 std::array<lSol_float_t, n_loc_dofs_> coeffs =
693 std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT> primals(
697 for (
unsigned int i = 0; i < lambda_values_out.size(); ++i)
699 for (
unsigned int j = 0; j < lambda_values_out[i].size(); ++j)
700 lambda_values_out[i][j] = duals[i][j] +
tau_ * primals[i][j];
701 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[i]))
702 for (
unsigned int j = 0; j < lambda_values_out[i].size() / 2; ++j)
703 lambda_values_out[i][j] = 0.;
704 if (is_dirichlet_laplacian<parameters>(hyper_edge.node_descriptor[i]))
705 for (
unsigned int j = lambda_values_out[i].size() / 2; j < lambda_values_out[i].size(); ++j)
706 lambda_values_out[i][j] = 0.;
709 return lambda_values_out;
728 template <
class hyEdgeT,
typename SmallMatInT,
typename SmallMatOutT>
730 SmallMatOutT& lambda_values_out,
732 const lSol_float_t time = 0.)
const
734 hy_assert(lambda_values_in.size() == lambda_values_out.size() &&
735 lambda_values_in.size() == 2 * hyEdge_dimT,
736 "Both matrices must be of same size which corresponds to the number of faces!");
737 for (
unsigned int i = 0; i < lambda_values_in.size(); ++i)
739 lambda_values_in[i].size() == lambda_values_out[i].size() &&
741 "Both matrices must be of same size which corresponds to the number of dofs per face!");
744 std::array<lSol_float_t, n_loc_dofs_> coeffs =
748 std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT> primals(
752 for (
unsigned int i = 0; i < lambda_values_out.size(); ++i)
754 for (
unsigned int j = 0; j < lambda_values_out[i].size(); ++j)
755 lambda_values_out[i][j] = duals[i][j] +
tau_ * primals[i][j];
756 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[i]))
757 for (
unsigned int j = 0; j < lambda_values_out[i].size() / 2; ++j)
758 lambda_values_out[i][j] = 0.;
759 if (is_dirichlet_laplacian<parameters>(hyper_edge.node_descriptor[i]))
760 for (
unsigned int j = lambda_values_out[i].size() / 2; j < lambda_values_out[i].size(); ++j)
761 lambda_values_out[i][j] = 0.;
764 return lambda_values_out;
851 template <
class hyEdgeT,
typename SmallMatT>
852 std::array<lSol_float_t, 1U>
errors(
const SmallMatT& lambda_values,
854 const lSol_float_t time = 0.)
const
858 for (
unsigned int i = 0; i < lambda_values.size(); ++i)
859 for (
unsigned int j = 0; j < lambda_values[i].size(); ++j)
860 hy_assert(lambda_values[i][j] == lambda_values[i][j],
861 "Lambda value wit index " << i <<
"," << j <<
" is NaN!");
863 std::array<lSol_float_t, n_loc_dofs_> coefficients =
865 std::array<lSol_float_t, n_shape_fct_> coeffs;
866 for (
unsigned int i = 0; i < coeffs.size(); ++i)
867 coeffs[i] = coefficients[i + hyEdge_dimT *
n_shape_fct_];
869 for (
unsigned int i = 0; i < coeffs.size(); ++i)
870 hy_assert(coeffs[i] == coeffs[i],
"The " << i <<
"-th coeff is NaN!");
872 lSol_float_t result = integrator::template integrate_vol_diffsquare_discana<
876 hy_assert(result >= 0.,
"The squared error must be non-negative, but was " << result);
877 return std::array<lSol_float_t, 1U>({result});
893 template <
class hyEdgeT,
typename SmallMatT>
895 const SmallMatT& lambda_values_old,
897 const lSol_float_t delta_t,
898 const lSol_float_t time)
const
902 std::array<lSol_float_t, n_loc_dofs_> coeffs_new =
904 std::array<lSol_float_t, n_loc_dofs_> coeffs_old =
906 for (
unsigned int i = 0; i < coeffs_old.size(); ++i)
907 coeffs_old[i] = (coeffs_old[i] - coeffs_new[i]);
909 std::array<lSol_float_t, n_loc_dofs_> coefficients =
911 std::array<lSol_float_t, n_shape_fct_> coeffs;
912 for (
unsigned int i = 0; i < coeffs.size(); ++i)
913 coeffs[i] = coefficients[i + hyEdge_dimT *
n_shape_fct_];
914 return integrator::template integrate_vol_diffsquare_discana<decltype(
hyEdgeT::geometry),
915 parameters::analytic_result>(
916 coeffs, hy_edge.geometry, time);
931 template <
typename abscissa_
float_t, std::
size_t sizeT,
class input_array_t,
class hyEdgeT>
933 const std::array<abscissa_float_t, sizeT>& abscissas,
934 const input_array_t& lambda_values,
936 const lSol_float_t time = 0.)
const;
955 template <
unsigned int hyEdge_dimT,
956 unsigned int poly_deg,
957 unsigned int quad_deg,
958 template <
unsigned int,
typename>
959 typename parametersT,
960 typename lSol_float_t>
961 template <
typename hyEdgeT>
966 const lSol_float_t tau,
968 const lSol_float_t time)
const
971 constexpr
unsigned int n_dofs_lap = n_loc_dofs_ / 2;
974 lSol_float_t vol_integral, vol_func_integral, face_integral, helper;
977 for (
unsigned int i = 0; i < n_shape_fct_; ++i)
979 for (
unsigned int j = 0; j < n_shape_fct_; ++j)
982 vol_integral = integrator::template integrate_vol_phiphi(i, j, hyper_edge.geometry);
983 vol_func_integral = integrator::template integrate_vol_phiphifunc<
985 parameters::inverse_bilaplacian_coefficient,
Point<hyEdge_dimT, lSol_float_t>>(
990 integrator::template integrate_vol_nablaphiphi<SmallVec<hyEdge_dimT, lSol_float_t>,
992 i, j, hyper_edge.geometry);
996 for (
unsigned int face = 0; face < 2 * hyEdge_dimT; ++face)
998 helper = integrator::template integrate_bdr_phiphi<decltype(hyEdgeT::geometry)>(
999 i, j, face, hyper_edge.geometry);
1000 face_integral += helper;
1001 for (
unsigned int dim = 0; dim < hyEdge_dimT; ++dim)
1002 normal_int_vec[dim] += hyper_edge.geometry.local_normal(face).operator[](dim) * helper;
1005 local_mat(hyEdge_dimT * n_shape_fct_ + i, n_dofs_lap + hyEdge_dimT * n_shape_fct_ + j) -=
1008 local_mat(hyEdge_dimT * n_shape_fct_ + i, hyEdge_dimT * n_shape_fct_ + j) +=
1009 tau * face_integral;
1010 local_mat(n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i,
1011 n_dofs_lap + hyEdge_dimT * n_shape_fct_ + j) += tau * face_integral;
1013 for (
unsigned int dim = 0; dim < hyEdge_dimT; ++dim)
1015 local_mat(dim * n_shape_fct_ + i, dim * n_shape_fct_ + j) += vol_integral;
1016 local_mat(n_dofs_lap + dim * n_shape_fct_ + i, n_dofs_lap + dim * n_shape_fct_ + j) +=
1019 local_mat(hyEdge_dimT * n_shape_fct_ + i, dim * n_shape_fct_ + j) -= grad_int_vec[dim];
1020 local_mat(dim * n_shape_fct_ + i, hyEdge_dimT * n_shape_fct_ + j) -= grad_int_vec[dim];
1021 local_mat(n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i,
1022 n_dofs_lap + dim * n_shape_fct_ + j) -= grad_int_vec[dim];
1023 local_mat(n_dofs_lap + dim * n_shape_fct_ + i,
1024 n_dofs_lap + hyEdge_dimT * n_shape_fct_ + j) -= grad_int_vec[dim];
1026 local_mat(hyEdge_dimT * n_shape_fct_ + i, dim * n_shape_fct_ + j) += normal_int_vec[dim];
1027 local_mat(n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i,
1028 n_dofs_lap + dim * n_shape_fct_ + j) += normal_int_vec[dim];
1040 template <
unsigned int hyEdge_dimT,
1041 unsigned int poly_deg,
1042 unsigned int quad_deg,
1043 template <
unsigned int,
typename>
1044 typename parametersT,
1045 typename lSol_float_t>
1046 template <
typename hyEdgeT,
typename SmallMatT>
1051 const SmallMatT& lambda_values,
1052 hyEdgeT& hyper_edge)
const
1054 constexpr
unsigned int n_dofs_lap = n_loc_dofs_ / 2;
1055 hy_assert(lambda_values.size() == 2 * hyEdge_dimT,
1056 "The size of the lambda values should be twice the dimension of a hyperedge.");
1057 for (
unsigned int i = 0; i < 2 * hyEdge_dimT; ++i)
1058 hy_assert(lambda_values[i].size() == 2 * n_shape_bdr_,
1059 "The size of lambda should be the amount of ansatz functions at boundary.");
1062 lSol_float_t integral;
1064 for (
unsigned int i = 0; i < n_shape_fct_; ++i)
1065 for (
unsigned int j = 0; j < n_shape_bdr_; ++j)
1066 for (
unsigned int face = 0; face < 2 * hyEdge_dimT; ++face)
1068 integral = integrator::template integrate_bdr_phipsi<decltype(hyEdgeT::geometry)>(
1069 i, j, face, hyper_edge.geometry);
1070 right_hand_side[hyEdge_dimT * n_shape_fct_ + i] += tau_ * lambda_values[face][j] * integral;
1071 right_hand_side[n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i] +=
1072 tau_ * lambda_values[face][n_shape_bdr_ + j] * integral;
1074 for (
unsigned int dim = 0; dim < hyEdge_dimT; ++dim)
1076 right_hand_side[dim * n_shape_fct_ + i] -=
1077 hyper_edge.geometry.local_normal(face).operator[](dim) * lambda_values[face][j] *
1079 right_hand_side[n_dofs_lap + dim * n_shape_fct_ + i] -=
1080 hyper_edge.geometry.local_normal(face).operator[](dim) *
1081 lambda_values[face][n_shape_bdr_ + j] * integral;
1085 return right_hand_side;
1092 template <
unsigned int hyEdge_dimT,
1093 unsigned int poly_deg,
1094 unsigned int quad_deg,
1095 template <
unsigned int,
typename>
1096 typename parametersT,
1097 typename lSol_float_t>
1098 template <
typename hyEdgeT>
1106 constexpr
unsigned int n_dofs_lap = n_loc_dofs_ / 2;
1108 lSol_float_t integral;
1109 for (
unsigned int i = 0; i < n_shape_fct_; ++i)
1111 right_hand_side[n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i] =
1112 integrator::template integrate_vol_phifunc<
1116 for (
unsigned int face = 0; face < 2 * hyEdge_dimT; ++face)
1118 if (is_dirichlet<parameters>(hyper_edge.node_descriptor[face]))
1120 integral = integrator::template integrate_bdr_phifunc<
1123 Point<hyEdge_dimT, lSol_float_t>>(i, face, hyper_edge.
geometry, time);
1124 right_hand_side[hyEdge_dimT * n_shape_fct_ + i] += tau_ * integral;
1125 for (
unsigned int dim = 0; dim < hyEdge_dimT; ++dim)
1126 right_hand_side[dim * n_shape_fct_ + i] -=
1127 hyper_edge.geometry.local_normal(face).operator[](dim) * integral;
1129 if (is_dirichlet_laplacian<parameters>(hyper_edge.node_descriptor[face]))
1131 integral = integrator::template integrate_bdr_phifunc<
1134 Point<hyEdge_dimT, lSol_float_t>>(i, face, hyper_edge.
geometry, time);
1135 right_hand_side[n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i] += tau_ * integral;
1136 for (
unsigned int dim = 0; dim < hyEdge_dimT; ++dim)
1137 right_hand_side[n_dofs_lap + dim * n_shape_fct_ + i] -=
1138 hyper_edge.geometry.local_normal(face).operator[](dim) * integral;
1142 return right_hand_side;
1149 template <
unsigned int hyEdge_dimT,
1150 unsigned int poly_deg,
1151 unsigned int quad_deg,
1152 template <
unsigned int,
typename>
1153 typename parametersT,
1154 typename lSol_float_t>
1155 template <
typename hyEdgeT>
1163 hyEdgeT& hyper_edge)
const
1166 for (
unsigned int i = 0; i < n_shape_fct_; ++i)
1167 for (
unsigned int j = 0; j < n_shape_fct_; ++j)
1169 right_hand_side[n_loc_dofs_ / 2 + hyEdge_dimT * n_shape_fct_ + i] +=
1170 coeffs[hyEdge_dimT * n_shape_fct_ + j] *
1171 integrator::template integrate_vol_phiphi(i, j, hyper_edge.geometry);
1174 return right_hand_side;
1181 template <
unsigned int hyEdge_dimT,
1182 unsigned int poly_deg,
1183 unsigned int quad_deg,
1184 template <
unsigned int,
typename>
1185 typename parametersT,
1186 typename lSol_float_t>
1187 template <
typename hyEdgeT>
1194 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
1195 hyEdgeT& hyper_edge)
const
1197 constexpr
unsigned int n_dofs_lap = n_loc_dofs_ / 2;
1198 std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT> bdr_values;
1200 for (
unsigned int dim_n = 0; dim_n < 2 * hyEdge_dimT; ++dim_n)
1201 bdr_values[dim_n].fill(0.);
1203 for (
unsigned int i = 0; i < n_shape_fct_; ++i)
1204 for (
unsigned int j = 0; j < n_shape_bdr_; ++j)
1205 for (
unsigned int face = 0; face < 2 * hyEdge_dimT; ++face)
1207 bdr_values[face][n_shape_bdr_ + j] +=
1208 coeffs[hyEdge_dimT * n_shape_fct_ + i] *
1209 integrator::template integrate_bdr_phipsi<decltype(hyEdgeT::geometry)>(
1210 i, j, face, hyper_edge.geometry);
1212 bdr_values[face][j] +=
1213 coeffs[n_dofs_lap + hyEdge_dimT * n_shape_fct_ + i] *
1214 integrator::template integrate_bdr_phipsi<decltype(hyEdgeT::geometry)>(
1215 i, j, face, hyper_edge.geometry);
1225 template <
unsigned int hyEdge_dimT,
1226 unsigned int poly_deg,
1227 unsigned int quad_deg,
1228 template <
unsigned int,
typename>
1229 typename parametersT,
1230 typename lSol_float_t>
1231 template <
typename hyEdgeT>
1238 const std::array<lSol_float_t, n_loc_dofs_>& coeffs,
1239 hyEdgeT& hyper_edge)
const
1241 constexpr
unsigned int n_dofs_lap = n_loc_dofs_ / 2;
1242 std::array<std::array<lSol_float_t, 2 * n_shape_bdr_>, 2 * hyEdge_dimT> bdr_values;
1243 lSol_float_t integral;
1245 for (
unsigned int dim_n = 0; dim_n < 2 * hyEdge_dimT; ++dim_n)
1246 bdr_values[dim_n].fill(0.);
1248 for (
unsigned int i = 0; i < n_shape_fct_; ++i)
1249 for (
unsigned int j = 0; j < n_shape_bdr_; ++j)
1250 for (
unsigned int face = 0; face < 2 * hyEdge_dimT; ++face)
1252 integral = integrator::template integrate_bdr_phipsi<decltype(hyEdgeT::geometry)>(
1253 i, j, face, hyper_edge.geometry);
1254 for (
unsigned int dim = 0; dim < hyEdge_dimT; ++dim)
1256 bdr_values[face][n_shape_bdr_ + j] +=
1257 hyper_edge.geometry.local_normal(face).operator[](dim) * integral *
1258 coeffs[dim * n_shape_fct_ + i];
1260 bdr_values[face][j] += hyper_edge.geometry.local_normal(face).operator[](dim) * integral *
1261 coeffs[n_dofs_lap + dim * n_shape_fct_ + i];
1272 template <
unsigned int hyEdge_dimT,
1273 unsigned int poly_deg,
1274 unsigned int quad_deg,
1275 template <
unsigned int,
typename>
1276 typename parametersT,
1277 typename lSol_float_t>
1278 template <
typename abscissa_
float_t, std::
size_t sizeT,
class input_array_t,
typename hyEdgeT>
1279 std::array<std::array<lSol_float_t, Hypercube<hyEdge_dimT>::pow(sizeT)>,
1282 const std::array<abscissa_float_t, sizeT>& abscissas,
1283 const input_array_t& lambda_values,
1284 hyEdgeT& hyper_edge,
1285 const lSol_float_t time)
const
1288 solve_local_problem(lambda_values, 1U, hyper_edge, time);
1292 std::array<std::array<lSol_float_t, Hypercube<hyEdge_dimT>::pow(sizeT)>,
1296 for (
unsigned int d = 0; d < system_dim; ++d)
1298 for (
unsigned int i = 0; i < coeffs.
size(); ++i)
1299 coeffs[i] = coefficients[d * n_shape_fct_ + i];
1300 for (
unsigned int pt = 0; pt < Hypercube<hyEdge_dimT>::pow(sizeT); ++pt)
1301 point_vals[d][pt] = integrator::shape_fun_t::template lin_comb_fct_val<float>(