39 int nb_gauss_pts = pts.size2();
42 auto &ptr = data.getBBAlphaIndicesSharedPtr(
field_name);
56 auto &ptr = data.getBBDiffNSharedPtr(
field_name);
62 auto get_alpha_by_name_ptr =
64 const std::string &
field_name) -> boost::shared_ptr<MatrixInt> & {
65 return data.getBBAlphaIndicesSharedPtr(
field_name);
68 auto get_base_by_name_ptr =
70 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
74 auto get_diff_base_by_name_ptr =
76 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
80 auto get_alpha_by_order_ptr =
81 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixInt> & {
82 return data.getBBAlphaIndicesByOrderSharedPtr(o);
85 auto get_base_by_order_ptr =
86 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
87 return data.getBBNByOrderSharedPtr(o);
90 auto get_diff_base_by_order_ptr =
91 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
92 return data.getBBDiffNByOrderSharedPtr(o);
96 auto &vert_get_diff_n = get_diff_base(data.
dataOnEntities[MBVERTEX][0]);
97 vert_get_n.resize(nb_gauss_pts, 3,
false);
98 vert_get_diff_n.resize(nb_gauss_pts, 6,
false);
101 (
unsigned int)nb_gauss_pts)
103 "Base functions or nodes has wrong number of integration points "
109 vertex_alpha.resize(3, 3,
false);
110 vertex_alpha.clear();
111 for (
int n = 0;
n != 3; ++
n)
115 1,
lambda.size1(), vertex_alpha.size1(), &vertex_alpha(0, 0),
117 &vert_get_diff_n(0, 0));
118 for (
int n = 0;
n != 3; ++
n) {
119 const int f = boost::math::factorial<double>(
121 for (
int g = 0;
g != nb_gauss_pts; ++
g) {
122 vert_get_n(
g,
n) *=
f;
123 for (
int d = 0;
d != 2; ++
d)
124 vert_get_diff_n(
g, 2 *
n +
d) *=
f;
132 "Wrong size of ent data");
134 constexpr
int edges_nodes[3][2] = {{0, 1}, {1, 2}, {2, 0}};
135 for (
int ee = 0; ee != 3; ++ee) {
138 if (ent_data.getSense() == 0)
140 "Sense of the edge unknown");
142 const int sense = ent_data.getSense();
143 const int order = ent_data.getOrder();
144 const int nb_dofs =
NBEDGE_H1(ent_data.getOrder());
147 if (get_alpha_by_order_ptr(ent_data,
order)) {
149 get_alpha_by_order_ptr(ent_data,
order);
151 get_base_by_order_ptr(ent_data,
order);
152 get_diff_base_by_name_ptr(ent_data,
field_name) =
153 get_diff_base_by_order_ptr(ent_data,
order);
155 auto &get_n = get_base(ent_data);
156 auto &get_diff_n = get_diff_base(ent_data);
157 get_n.resize(nb_gauss_pts, nb_dofs,
false);
158 get_diff_n.resize(nb_gauss_pts, 2 * nb_dofs,
false);
161 edge_alpha.resize(nb_dofs, 3,
false);
165 for (
int i = 0;
i != edge_alpha.size1(); ++
i) {
166 int a = edge_alpha(
i, edges_nodes[ee][0]);
167 edge_alpha(
i, edges_nodes[ee][0]) =
168 edge_alpha(
i, edges_nodes[ee][1]);
169 edge_alpha(
i, edges_nodes[ee][1]) =
a;
173 order,
lambda.size1(), edge_alpha.size1(), &edge_alpha(0, 0),
177 get_alpha_by_order_ptr(ent_data,
order) =
179 get_base_by_order_ptr(ent_data,
order) =
181 get_diff_base_by_order_ptr(ent_data,
order) =
182 get_diff_base_by_name_ptr(ent_data,
field_name);
187 for (
int ee = 0; ee != 3; ++ee) {
189 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
190 auto &get_n = get_base(ent_data);
191 auto &get_diff_n = get_diff_base(ent_data);
192 get_n.resize(nb_gauss_pts, 0,
false);
193 get_diff_n.resize(nb_gauss_pts, 0,
false);
200 "Wrong size ent of ent data");
203 const int order = ent_data.getOrder();
205 if (get_alpha_by_order_ptr(ent_data,
order)) {
207 get_alpha_by_order_ptr(ent_data,
order);
209 get_base_by_order_ptr(ent_data,
order);
210 get_diff_base_by_name_ptr(ent_data,
field_name) =
211 get_diff_base_by_order_ptr(ent_data,
order);
214 auto &get_n = get_base(ent_data);
215 auto &get_diff_n = get_diff_base(ent_data);
216 get_n.resize(nb_gauss_pts, nb_dofs,
false);
217 get_diff_n.resize(nb_gauss_pts, 2 * nb_dofs,
false);
219 auto &tri_alpha = get_alpha(ent_data);
220 tri_alpha.resize(nb_dofs, 3,
false);
224 order,
lambda.size1(), tri_alpha.size1(), &tri_alpha(0, 0),
228 get_alpha_by_order_ptr(ent_data,
order) =
230 get_base_by_order_ptr(ent_data,
order) =
232 get_diff_base_by_order_ptr(ent_data,
order) =
233 get_diff_base_by_name_ptr(ent_data,
field_name);
238 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
239 auto &get_n = get_base(ent_data);
240 auto &get_diff_n = get_diff_base(ent_data);
241 get_n.resize(nb_gauss_pts, 0,
false);
242 get_diff_n.resize(nb_gauss_pts, 0,
false);
256 "Polynomial type not set");
258 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
259 double *diffL,
const int dim) =
262 int nb_gauss_pts = pts.size2();
268 "expected size of data.dataOnEntities[MBEDGE] is 3");
270 int sense[3],
order[3];
271 double *H1edgeN[3], *diffH1edgeN[3];
272 for (
int ee = 0; ee < 3; ee++) {
276 "sense of the edge unknown");
281 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, nb_dofs,
283 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts,
285 H1edgeN[ee] = &*data.
dataOnEntities[MBEDGE][ee].getN(base).data().begin();
293 H1edgeN, diffH1edgeN, nb_gauss_pts, base_polynomials);
300 "expected that size data.dataOnEntities[MBTRI] is one");
304 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, nb_dofs,
308 const int face_nodes[] = {0, 1, 2};
315 nb_gauss_pts, base_polynomials);
347 "Polynomial type not set");
348 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
349 double *diffL,
const int dim) =
352 int nb_gauss_pts = pts.size2();
367 nb_gauss_pts, base_polynomials);
378 int nb_gauss_pts = pts.size2();
381 auto &ptr = data.getBBAlphaIndicesSharedPtr(
field_name);
395 auto &ptr = data.getBBDiffNSharedPtr(
field_name);
401 auto get_alpha_by_name_ptr =
403 const std::string &
field_name) -> boost::shared_ptr<MatrixInt> & {
404 return data.getBBAlphaIndicesSharedPtr(
field_name);
407 auto get_base_by_name_ptr =
409 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
413 auto get_diff_base_by_name_ptr =
415 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
419 auto get_alpha_by_order_ptr =
420 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixInt> & {
421 return data.getBBAlphaIndicesByOrderSharedPtr(o);
424 auto get_base_by_order_ptr =
425 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
426 return data.getBBNByOrderSharedPtr(o);
429 auto get_diff_base_by_order_ptr =
430 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
431 return data.getBBDiffNByOrderSharedPtr(o);
437 "Wrong size ent of ent data");
440 (
unsigned int)nb_gauss_pts)
442 "Base functions or nodes has wrong number of integration points "
448 const int order = ent_data.getOrder();
451 if (get_alpha_by_order_ptr(ent_data,
order)) {
453 get_alpha_by_order_ptr(ent_data,
order);
455 get_base_by_order_ptr(ent_data,
order);
456 get_diff_base_by_name_ptr(ent_data,
field_name) =
457 get_diff_base_by_order_ptr(ent_data,
order);
460 auto &get_n = get_base(ent_data);
461 auto &get_diff_n = get_diff_base(ent_data);
462 get_n.resize(nb_gauss_pts, nb_dofs,
false);
463 get_diff_n.resize(nb_gauss_pts, 2 * nb_dofs,
false);
470 "Inconsistent number of DOFs");
472 auto &tri_alpha = get_alpha(ent_data);
481 "Inconsistent number of DOFs");
483 auto &tri_alpha = get_alpha(ent_data);
484 tri_alpha.resize(nb_dofs, 3,
false);
491 std::array<int *, 3> face_edge_ptr{
495 face_n.data(), face_edge_ptr.data());
501 order,
lambda.size1(), tri_alpha.size1(), &tri_alpha(0, 0),
506 get_alpha_by_order_ptr(ent_data,
order) =
508 get_base_by_order_ptr(ent_data,
order) =
510 get_diff_base_by_order_ptr(ent_data,
order) =
511 get_diff_base_by_name_ptr(ent_data,
field_name);
516 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
517 auto &get_n = get_base(ent_data);
518 auto &get_diff_n = get_diff_base(ent_data);
519 get_n.resize(nb_gauss_pts, 0,
false);
520 get_diff_n.resize(nb_gauss_pts, 0,
false);
533 "Polynomial type not set");
534 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
535 double *diffL,
const int dim) =
538 int nb_gauss_pts = pts.size2();
546 if (face_order > 0) {
548 for (
int ee = 0; ee < 3; ee++) {
557 int face_nodes[3] = {0, 1, 2};
559 face_nodes, face_order,
560 &data.
dataOnEntities[MBVERTEX][0].getN(base)(0, 0), NULL, phi_f_e, NULL,
561 nb_gauss_pts, 3, base_polynomials);
563 face_nodes, face_order,
564 &data.
dataOnEntities[MBVERTEX][0].getN(base)(0, 0), NULL, phi_f, NULL,
565 nb_gauss_pts, 3, base_polynomials);
574 for (
int oo = 0; oo < face_order; oo++) {
575 for (
int ee = 0; ee < 3; ee++) {
578 for (
int gg = 0; gg < nb_gauss_pts; gg++) {
586 for (
int gg = 0; gg < nb_gauss_pts; gg++) {
608 "This should be used only with DEMKOWICZ_JACOBI_BASE "
613 int nb_gauss_pts = pts.size2();
616 double *phi_f = &*data.
dataOnEntities[MBTRI][0].getN(base).data().begin();
619 int face_nodes[3] = {0, 1, 2};
623 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(), phi_f,
624 NULL, nb_gauss_pts, 3);
654 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
655 double *diffL,
const int dim) =
658 int nb_gauss_pts = pts.size2();
665 int sense[3],
order[3];
666 double *hcurl_edge_n[3];
667 double *diff_hcurl_edge_n[3];
668 for (
int ee = 0; ee < 3; ee++) {
671 "data inconsistency");
680 nb_gauss_pts, 2 * 3 * nb_dofs,
false);
683 diff_hcurl_edge_n[ee] =
690 hcurl_edge_n, diff_hcurl_edge_n, nb_gauss_pts, base_polynomials);
692 for (
int ee = 0; ee < 3; ee++) {
693 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
694 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
710 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
713 3 * 2 * nb_dofs,
false);
715 int face_nodes[] = {0, 1, 2};
722 nb_gauss_pts, base_polynomials);
725 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
726 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
741 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
742 double *diffL,
const int dim) =
745 int nb_gauss_pts = pts.size2();
759 int nb_dofs = 3 * nb_edge_dofs + nb_dofs_face;
760 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
763 3 * 2 * nb_dofs,
false);
770 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
771 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
772 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false)};
774 std::array<double *, 3>
phi{&*edge_bases[0].data().begin(),
775 &*edge_bases[1].data().begin(),
776 &*edge_bases[2].data().begin()};
777 std::array<double *, 3> diff_phi{&*diff_edge_bases[0].data().begin(),
778 &*diff_edge_bases[1].data().begin(),
779 &*diff_edge_bases[2].data().begin()};
782 std::array<int, 3> edge_sense{1, 1, 1};
784 edge_sense.data(), edge_order.data(),
787 phi.data(), diff_phi.data(), nb_gauss_pts, base_polynomials);
789 MatrixDouble face_bases(nb_gauss_pts, 3 * nb_dofs_face,
false);
790 MatrixDouble diff_face_bases(nb_gauss_pts, 3 * 2 * nb_dofs_face,
false);
791 int face_nodes[] = {0, 1, 2};
796 &*face_bases.data().begin(), &*diff_face_bases.data().begin(),
797 nb_gauss_pts, base_polynomials);
801 getFTensor1FromPtr<3>(&*edge_bases[0].data().begin()),
802 getFTensor1FromPtr<3>(&*edge_bases[1].data().begin()),
803 getFTensor1FromPtr<3>(&*edge_bases[2].data().begin())};
810 auto t_vol_base = getFTensor1FromPtr<3>(&*face_bases.data().begin());
811 auto t_vol_diff_base =
814 auto t_base = getFTensor1FromPtr<3>(
822 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
823 for (
int oo = 0; oo <
order; oo++) {
827 for (
int ee = 0; ee != 3; ++ee) {
828 t_base(
i) = t_edge_base[ee](
i);
831 t_diff_base(
i,
j) = t_edge_diff_base[ee](
i,
j);
833 ++t_edge_diff_base[ee];
839 t_base(
i) = t_vol_base(
i);
842 t_diff_base(
i,
j) = t_vol_diff_base(
i,
j);
850 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
851 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
864 int nb_gauss_pts = pts.size2();
872 "wrong number of data structures on edges, should be three but is %d",
875 int sense[3],
order[3];
876 double *hcurl_edge_n[3];
877 double *diff_hcurl_edge_n[3];
879 for (
int ee = 0; ee != 3; ++ee) {
883 "orientation (sense) of edge is not set");
892 nb_gauss_pts, 2 * 3 * nb_dofs,
false);
896 diff_hcurl_edge_n[ee] =
904 hcurl_edge_n, diff_hcurl_edge_n, nb_gauss_pts);
910 for (
int ee = 0; ee != 3; ++ee) {
911 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
912 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
922 "No data struture to keep base functions on face");
926 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
929 3 * 2 * nb_dofs,
false);
931 int face_nodes[] = {0, 1, 2};
944 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
945 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
958 int nb_gauss_pts = pts.size2();
965 "No data struture to keep base functions on face");
970 int nb_dofs = 3 * nb_edge_dofs + nb_volume_dofs;
971 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
974 3 * 2 * nb_dofs,
false);
981 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
982 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
983 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false)};
986 std::array<int, 3> edge_sense{1, 1, 1};
987 std::array<double *, 3>
phi{&*edge_bases[0].data().begin(),
988 &*edge_bases[1].data().begin(),
989 &*edge_bases[2].data().begin()};
990 std::array<double *, 3> diff_phi{&*diff_edge_bases[0].data().begin(),
991 &*diff_edge_bases[1].data().begin(),
992 &*diff_edge_bases[2].data().begin()};
994 edge_sense.data(), edge_order.data(),
997 phi.data(), diff_phi.data(), nb_gauss_pts);
999 MatrixDouble face_bases(nb_gauss_pts, 3 * nb_volume_dofs,
false);
1000 MatrixDouble diff_face_bases(nb_gauss_pts, 3 * 2 * nb_volume_dofs,
false);
1001 int face_nodes[] = {0, 1, 2};
1005 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1006 &*face_bases.data().begin(), &*diff_face_bases.data().begin(),
1011 getFTensor1FromPtr<3>(&*edge_bases[0].data().begin()),
1012 getFTensor1FromPtr<3>(&*edge_bases[1].data().begin()),
1013 getFTensor1FromPtr<3>(&*edge_bases[2].data().begin())};
1019 auto t_vol_base = getFTensor1FromPtr<3>(&*face_bases.data().begin());
1020 auto t_vol_diff_base =
1023 auto t_base = getFTensor1FromPtr<3>(
1031 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
1032 for (
int oo = 0; oo <
order; oo++) {
1036 for (
int ee = 0; ee != 3; ++ee) {
1037 t_base(
i) = t_edge_base[ee](
i);
1040 t_diff_base(
i,
j) = t_edge_diff_base[ee](
i,
j);
1042 ++t_edge_diff_base[ee];
1048 t_base(
i) = t_vol_base(
i);
1051 t_diff_base(
i,
j) = t_vol_diff_base(
i,
j);
1062 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
1063 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
1109 boost::shared_ptr<BaseFunctionCtx> ctx_ptr) {
1114 int nb_gauss_pts = pts.size2();
1115 if (!nb_gauss_pts) {
1119 if (pts.size1() < 2)
1122 "Wrong dimension of pts, should be at least 3 rows with coordinates");
1129 data.
dataOnEntities[MBVERTEX][0].getN(base).resize(nb_gauss_pts, 3,
1133 &pts(0, 0), &pts(1, 0), nb_gauss_pts);
1134 data.
dataOnEntities[MBVERTEX][0].getDiffN(base).resize(3, 2,
false);
1136 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin());
1144 (
unsigned int)nb_gauss_pts) {
1146 "Base functions or nodes has wrong number of integration points "
1151 auto set_node_derivative_for_all_gauss_pts = [&]() {
1156 data.
dataOnEntities[MBVERTEX][0].getDiffN(base).resize(nb_gauss_pts, 6,
1158 for (
int gg = 0; gg != nb_gauss_pts; ++gg)
1165 CHKERR set_node_derivative_for_all_gauss_pts();