37 boost::multi_index::indexed_by<
39 boost::multi_index::hashed_unique<
44 member<BaseCacheItem, int, &BaseCacheItem::order>,
45 member<BaseCacheItem, int, &BaseCacheItem::nb_gauss_pts>>>>
51 boost::multi_index::indexed_by<
53 boost::multi_index::hashed_unique<
58 member<HDivBaseCacheItem, int, &HDivBaseCacheItem::order>,
60 &HDivBaseCacheItem::nb_gauss_pts>,
61 member<HDivBaseCacheItem, int, &HDivBaseCacheItem::n0>,
62 member<HDivBaseCacheItem, int, &HDivBaseCacheItem::n1>,
63 member<HDivBaseCacheItem, int, &HDivBaseCacheItem::n2>>>>
74 std::map<const void *, TetBaseCache::BaseCacheMI>
76 std::map<const void *, TetBaseCache::BaseCacheMI>
78 std::map<const void *, TetBaseCache::HDivBaseFaceCacheMI>
81 std::map<const void *, TetBaseCache::BaseCacheMI>
129 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
130 double *diffL,
const int dim) =
133 int nb_gauss_pts = pts.size2();
135 int sense[6],
order[6];
141 double *h1_edge_n[6], *diff_h1_egde_n[6];
142 for (
int ee = 0; ee != 6; ++ee) {
145 "data inconsistency");
150 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, nb_dofs,
152 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts,
163 h1_edge_n, diff_h1_egde_n, nb_gauss_pts, base_polynomials);
165 for (
int ee = 0; ee != 6; ++ee) {
167 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(0, 0,
false);
176 double *h1_face_n[4], *diff_h1_face_n[4];
177 for (
int ff = 0; ff != 4; ++ff) {
180 "data inconsistency");
184 data.
dataOnEntities[MBTRI][ff].getN(base).resize(nb_gauss_pts, nb_dofs,
186 data.
dataOnEntities[MBTRI][ff].getDiffN(base).resize(nb_gauss_pts,
203 h1_face_n, diff_h1_face_n, nb_gauss_pts, base_polynomials);
206 for (
int ff = 0; ff != 4; ++ff) {
208 data.
dataOnEntities[MBTRI][ff].getDiffN(base).resize(0, 0,
false);
216 data.
dataOnEntities[MBTET][0].getN(base).resize(nb_gauss_pts, nb_vol_dofs,
219 3 * nb_vol_dofs,
false);
226 nb_gauss_pts, base_polynomials);
241 const int nb_gauss_pts = pts.size2();
244 (
unsigned int)nb_gauss_pts)
246 "Base functions or nodes has wrong number of integration points "
252 auto &ptr = data.getBBAlphaIndicesSharedPtr(
field_name);
266 auto &ptr = data.getBBDiffNSharedPtr(
field_name);
272 auto get_alpha_by_name_ptr =
274 const std::string &
field_name) -> boost::shared_ptr<MatrixInt> & {
275 return data.getBBAlphaIndicesSharedPtr(
field_name);
278 auto get_base_by_name_ptr =
280 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
284 auto get_diff_base_by_name_ptr =
286 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
290 auto get_alpha_by_order_ptr =
291 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixInt> & {
292 return data.getBBAlphaIndicesByOrderSharedPtr(o);
295 auto get_base_by_order_ptr =
296 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
297 return data.getBBNByOrderSharedPtr(o);
300 auto get_diff_base_by_order_ptr =
301 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
302 return data.getBBDiffNByOrderSharedPtr(o);
306 auto &vertex_alpha = get_alpha(vert_ent_data);
307 vertex_alpha.resize(4, 4,
false);
308 vertex_alpha.clear();
309 for (
int n = 0;
n != 4; ++
n)
312 auto &vert_get_n = get_base(vert_ent_data);
313 auto &vert_get_diff_n = get_diff_base(vert_ent_data);
314 vert_get_n.resize(nb_gauss_pts, 4,
false);
315 vert_get_diff_n.resize(nb_gauss_pts, 12,
false);
317 1,
lambda.size1(), vertex_alpha.size1(), &vertex_alpha(0, 0),
319 &vert_get_diff_n(0, 0));
320 for (
int n = 0;
n != 4; ++
n) {
321 const double f = boost::math::factorial<double>(
323 for (
int g = 0;
g != nb_gauss_pts; ++
g) {
324 vert_get_n(
g,
n) *=
f;
325 for (
int d = 0;
d != 3; ++
d)
326 vert_get_diff_n(
g, 3 *
n +
d) *=
f;
334 "Wrong size of ent data");
336 constexpr
int edges_nodes[6][2] = {{0, 1}, {1, 2}, {2, 0},
337 {0, 3}, {1, 3}, {2, 3}};
338 for (
int ee = 0; ee != 6; ++ee) {
340 const int sense = ent_data.getSense();
343 "Sense of the edge unknown");
344 const int order = ent_data.getOrder();
348 if (get_alpha_by_order_ptr(ent_data,
order)) {
350 get_alpha_by_order_ptr(ent_data,
order);
352 get_base_by_order_ptr(ent_data,
order);
353 get_diff_base_by_name_ptr(ent_data,
field_name) =
354 get_diff_base_by_order_ptr(ent_data,
order);
356 auto &get_n = get_base(ent_data);
357 auto &get_diff_n = get_diff_base(ent_data);
358 get_n.resize(nb_gauss_pts, nb_dofs,
false);
359 get_diff_n.resize(nb_gauss_pts, 3 * nb_dofs,
false);
362 edge_alpha.resize(nb_dofs, 4,
false);
366 for (
int i = 0;
i != edge_alpha.size1(); ++
i) {
367 int a = edge_alpha(
i, edges_nodes[ee][0]);
368 edge_alpha(
i, edges_nodes[ee][0]) =
369 edge_alpha(
i, edges_nodes[ee][1]);
370 edge_alpha(
i, edges_nodes[ee][1]) =
a;
374 order,
lambda.size1(), edge_alpha.size1(), &edge_alpha(0, 0),
378 get_alpha_by_order_ptr(ent_data,
order) =
380 get_base_by_order_ptr(ent_data,
order) =
382 get_diff_base_by_order_ptr(ent_data,
order) =
383 get_diff_base_by_name_ptr(ent_data,
field_name);
388 for (
int ee = 0; ee != 6; ++ee) {
390 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
391 auto &get_n = get_base(ent_data);
392 auto &get_diff_n = get_diff_base(ent_data);
393 get_n.resize(nb_gauss_pts, 0,
false);
394 get_diff_n.resize(nb_gauss_pts, 0,
false);
402 "Wrong size of ent data");
408 for (
int ff = 0; ff != 4; ++ff) {
410 const int order = ent_data.getOrder();
414 if (get_alpha_by_order_ptr(ent_data,
order)) {
416 get_alpha_by_order_ptr(ent_data,
order);
418 get_base_by_order_ptr(ent_data,
order);
419 get_diff_base_by_name_ptr(ent_data,
field_name) =
420 get_diff_base_by_order_ptr(ent_data,
order);
423 auto &get_n = get_base(ent_data);
424 auto &get_diff_n = get_diff_base(ent_data);
425 get_n.resize(nb_gauss_pts, nb_dofs,
false);
426 get_diff_n.resize(nb_gauss_pts, 3 * nb_dofs,
false);
428 auto &face_alpha = get_alpha(ent_data);
429 face_alpha.resize(nb_dofs, 4,
false);
433 senseFaceAlpha.resize(face_alpha.size1(), face_alpha.size2(),
false);
435 constexpr
int tri_nodes[4][3] = {
436 {0, 1, 3}, {1, 2, 3}, {0, 2, 3}, {0, 1, 2}};
437 for (
int d = 0;
d != nb_dofs; ++
d)
438 for (
int n = 0;
n != 3; ++
n)
440 face_alpha(
d, tri_nodes[ff][
n]);
443 order,
lambda.size1(), face_alpha.size1(), &face_alpha(0, 0),
447 get_alpha_by_order_ptr(ent_data,
order) =
449 get_base_by_order_ptr(ent_data,
order) =
451 get_diff_base_by_order_ptr(ent_data,
order) =
452 get_diff_base_by_name_ptr(ent_data,
field_name);
457 for (
int ff = 0; ff != 4; ++ff) {
459 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
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, 0,
false);
463 get_diff_n.resize(nb_gauss_pts, 0,
false);
470 "Wrong size ent of ent data");
473 const int order = ent_data.getOrder();
475 if (get_alpha_by_order_ptr(ent_data,
order)) {
477 get_alpha_by_order_ptr(ent_data,
order);
479 get_base_by_order_ptr(ent_data,
order);
480 get_diff_base_by_name_ptr(ent_data,
field_name) =
481 get_diff_base_by_order_ptr(ent_data,
order);
484 auto &get_n = get_base(ent_data);
485 auto &get_diff_n = get_diff_base(ent_data);
486 get_n.resize(nb_gauss_pts, nb_dofs,
false);
487 get_diff_n.resize(nb_gauss_pts, 3 * nb_dofs,
false);
489 auto &tet_alpha = get_alpha(ent_data);
490 tet_alpha.resize(nb_dofs, 4,
false);
494 order,
lambda.size1(), tet_alpha.size1(), &tet_alpha(0, 0),
498 get_alpha_by_order_ptr(ent_data,
order) =
500 get_base_by_order_ptr(ent_data,
order) =
502 get_diff_base_by_order_ptr(ent_data,
order) =
503 get_diff_base_by_name_ptr(ent_data,
field_name);
508 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
509 auto &get_n = get_base(ent_data);
510 auto &get_diff_n = get_diff_base(ent_data);
511 get_n.resize(nb_gauss_pts, 0,
false);
512 get_diff_n.resize(nb_gauss_pts, 0,
false);
542 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
543 double *diffL,
const int dim) =
546 int nb_gauss_pts = pts.size2();
561 nb_gauss_pts, base_polynomials);
572 const int nb_gauss_pts = pts.size2();
575 (
unsigned int)nb_gauss_pts)
577 "Base functions or nodes has wrong number of integration points "
583 auto &ptr = data.getBBAlphaIndicesSharedPtr(
field_name);
597 auto &ptr = data.getBBDiffNSharedPtr(
field_name);
603 auto get_alpha_by_name_ptr =
605 const std::string &
field_name) -> boost::shared_ptr<MatrixInt> & {
606 return data.getBBAlphaIndicesSharedPtr(
field_name);
609 auto get_base_by_name_ptr =
611 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
615 auto get_diff_base_by_name_ptr =
617 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
621 auto get_alpha_by_order_ptr =
622 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixInt> & {
623 return data.getBBAlphaIndicesByOrderSharedPtr(o);
626 auto get_base_by_order_ptr =
627 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
628 return data.getBBNByOrderSharedPtr(o);
631 auto get_diff_base_by_order_ptr =
632 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
633 return data.getBBDiffNByOrderSharedPtr(o);
639 "Wrong size ent of ent data");
642 const int order = ent_data.getOrder();
645 if (get_alpha_by_order_ptr(ent_data,
order)) {
647 get_alpha_by_order_ptr(ent_data,
order);
649 get_base_by_order_ptr(ent_data,
order);
650 get_diff_base_by_name_ptr(ent_data,
field_name) =
651 get_diff_base_by_order_ptr(ent_data,
order);
654 auto &get_n = get_base(ent_data);
655 auto &get_diff_n = get_diff_base(ent_data);
656 get_n.resize(nb_gauss_pts, nb_dofs,
false);
657 get_diff_n.resize(nb_gauss_pts, 3 * nb_dofs,
false);
665 "Inconsistent number of DOFs");
667 auto &tri_alpha = get_alpha(ent_data);
678 "Inconsistent number of DOFs");
680 auto &tet_alpha = get_alpha(ent_data);
681 tet_alpha.resize(nb_dofs, 4,
false);
687 std::array<int *, 6> tet_edge_ptr{
695 tet_edge_ptr.data());
698 std::array<int *, 6> tet_face_ptr{
708 face_n.data(), tet_face_ptr.data());
718 order,
lambda.size1(), tet_alpha.size1(), &tet_alpha(0, 0),
722 get_alpha_by_order_ptr(ent_data,
order) =
724 get_base_by_order_ptr(ent_data,
order) =
726 get_diff_base_by_order_ptr(ent_data,
order) =
727 get_diff_base_by_name_ptr(ent_data,
field_name);
733 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
734 auto &get_n = get_base(ent_data);
735 auto &get_diff_n = get_diff_base(ent_data);
736 get_n.resize(nb_gauss_pts, 0,
false);
737 get_diff_n.resize(nb_gauss_pts, 0,
false);
749 int volume_order, std::array<int, 4> &faces_order,
750 std::array<int, 3 * 4> &faces_nodes
755 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
756 double *diffL,
const int dim) =
759 int nb_gauss_pts = pts.size2();
763 double *phi_f_e[4][3];
765 double *diff_phi_f_e[4][3];
766 double *diff_phi_f[4];
773 for (
int ff = 0; ff != 4; ++ff) {
775 for (
int ee = 0; ee < 3; ee++) {
782 phi_f_e[ff][ee] = &*
N_face_edge(ff, ee).data().begin();
796 faces_nodes.data(), faces_order.data(), &*shape_functions.data().begin(),
797 &*diff_shape_functions.data().begin(), phi_f_e, diff_phi_f_e,
798 nb_gauss_pts, base_polynomials);
801 faces_nodes.data(), faces_order.data(), &*shape_functions.data().begin(),
802 &*diff_shape_functions.data().begin(), phi_f, diff_phi_f, nb_gauss_pts,
810 double *diff_phi_v_e[6];
811 double *diff_phi_v_f[4];
816 for (
int ee = 0; ee != 6; ++ee) {
826 volume_order, &*shape_functions.data().begin(),
827 &*diff_shape_functions.data().begin(), phi_v_e, diff_phi_v_e,
828 nb_gauss_pts, base_polynomials);
832 for (
int ff = 0; ff != 4; ++ff) {
842 volume_order, &*shape_functions.data().begin(),
843 &*diff_shape_functions.data().begin(), phi_v_f, diff_phi_v_f,
844 nb_gauss_pts, base_polynomials);
854 volume_order, &*shape_functions.data().begin(),
855 &*diff_shape_functions.data().begin(), phi_v, diff_phi_v, nb_gauss_pts,
864 std::array<int, 4> faces_order;
865 std::array<int, 4 * 3> faces_nodes;
872 faces_nodes.begin());
873 for (
int ff = 0; ff != 4; ff++) {
880 faces_order, faces_nodes);
890 int nb_gauss_pts = pts.size2();
910 getFTensor1FromPtr<3>(&*(
N_face_edge(0, 0).data().begin())),
911 getFTensor1FromPtr<3>(&*(
N_face_edge(0, 1).data().begin())),
912 getFTensor1FromPtr<3>(&*(
N_face_edge(0, 2).data().begin())),
913 getFTensor1FromPtr<3>(&*(
N_face_edge(1, 0).data().begin())),
914 getFTensor1FromPtr<3>(&*(
N_face_edge(1, 1).data().begin())),
915 getFTensor1FromPtr<3>(&*(
N_face_edge(1, 2).data().begin())),
916 getFTensor1FromPtr<3>(&*(
N_face_edge(2, 0).data().begin())),
917 getFTensor1FromPtr<3>(&*(
N_face_edge(2, 1).data().begin())),
918 getFTensor1FromPtr<3>(&*(
N_face_edge(2, 2).data().begin())),
919 getFTensor1FromPtr<3>(&*(
N_face_edge(3, 0).data().begin())),
920 getFTensor1FromPtr<3>(&*(
N_face_edge(3, 1).data().begin())),
921 getFTensor1FromPtr<3>(&*(
N_face_edge(3, 2).data().begin()))};
936 for (
int ff = 0; ff != 4; ff++) {
945 double *diff_base_ptr =
947 auto t_base = getFTensor1FromPtr<3>(base_ptr);
950 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
951 for (
int oo = 0; oo != faces_order[ff]; oo++) {
956 for (
int ee = 0; ee != 3; ++ee) {
957 t_base(
i) = t_base_f_e[ff * 3 + ee](
i);
959 ++t_base_f_e[ff * 3 + ee];
961 for (
int ee = 0; ee != 3; ++ee) {
962 t_diff_base(
i,
j) = t_diff_base_f_e[ff * 3 + ee](
i,
j);
964 ++t_diff_base_f_e[ff * 3 + ee];
971 t_base(
i) = t_base_f_f[ff](
i);
974 t_diff_base(
i,
j) = t_diff_base_f_f[ff](
i,
j);
976 ++t_diff_base_f_f[ff];
990 double *diff_base_ptr =
992 auto t_base = getFTensor1FromPtr<3>(base_ptr);
1026 auto t_base_v = getFTensor1FromPtr<3>(base_ptr);
1029 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
1030 for (
int oo = 0; oo < volume_order; oo++) {
1035 for (
int ee = 0; ee < 6; ee++) {
1036 t_base(
i) = t_base_v_e[ee](
i);
1039 t_diff_base(
i,
j) = t_diff_base_v_e[ee](
i,
j);
1041 ++t_diff_base_v_e[ee];
1048 for (
int ff = 0; ff < 4; ff++) {
1049 t_base(
i) = t_base_v_f[ff](
i);
1052 t_diff_base(
i,
j) = t_diff_base_v_f[ff](
i,
j);
1054 ++t_diff_base_v_f[ff];
1061 t_base(
i) = t_base_v(
i);
1064 t_diff_base(
i,
j) = t_diff_base_v(
i,
j);
1091 int nb_gauss_pts = pts.size2();
1094 int nb_dofs = 4 * nb_dofs_face + nb_dofs_volume;
1095 data.
dataOnEntities[MBTET][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
1097 data.
dataOnEntities[MBTET][0].getDiffN(base).resize(nb_gauss_pts, 9 * nb_dofs,
1113 auto interior_cache_ptr = get_interior_cache();
1115 if (interior_cache_ptr) {
1117 interior_cache_ptr->find(boost::make_tuple(volume_order, nb_gauss_pts));
1118 if (it != interior_cache_ptr->end()) {
1120 noalias(data.
dataOnEntities[MBTET][0].getDiffN(base)) = it->diffN;
1125 std::array<int, 4 * 3> faces_nodes{
1135 std::array<int, 4> faces_order{volume_order, volume_order, volume_order,
1140 faces_order, faces_nodes);
1142 auto *base_ptr = &*data.
dataOnEntities[MBTET][0].getN(base).data().begin();
1143 auto *diff_base_ptr =
1145 auto t_base = getFTensor1FromPtr<3>(base_ptr);
1150 getFTensor1FromPtr<3>(&*(
N_face_edge(0, 0).data().begin())),
1151 getFTensor1FromPtr<3>(&*(
N_face_edge(0, 1).data().begin())),
1152 getFTensor1FromPtr<3>(&*(
N_face_edge(0, 2).data().begin())),
1153 getFTensor1FromPtr<3>(&*(
N_face_edge(1, 0).data().begin())),
1154 getFTensor1FromPtr<3>(&*(
N_face_edge(1, 1).data().begin())),
1155 getFTensor1FromPtr<3>(&*(
N_face_edge(1, 2).data().begin())),
1156 getFTensor1FromPtr<3>(&*(
N_face_edge(2, 0).data().begin())),
1157 getFTensor1FromPtr<3>(&*(
N_face_edge(2, 1).data().begin())),
1158 getFTensor1FromPtr<3>(&*(
N_face_edge(2, 2).data().begin())),
1159 getFTensor1FromPtr<3>(&*(
N_face_edge(3, 0).data().begin())),
1160 getFTensor1FromPtr<3>(&*(
N_face_edge(3, 1).data().begin())),
1161 getFTensor1FromPtr<3>(&*(
N_face_edge(3, 2).data().begin()))};
1181 getFTensor1FromPtr<3>(&*(
N_face_bubble[3].data().begin()))};
1219 auto t_base_v = getFTensor1FromPtr<3>(base_vol_ptr);
1224 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
1225 for (
int oo = 0; oo < volume_order; oo++) {
1230 for (
auto ff = 0; ff != 4; ++ff) {
1231 for (
int ee = 0; ee != 3; ++ee) {
1232 t_base(
i) = t_base_f_e[ff * 3 + ee](
i);
1234 ++t_base_f_e[ff * 3 + ee];
1237 for (
int ee = 0; ee != 3; ++ee) {
1238 t_diff_base(
i,
j) = t_diff_base_f_e[ff * 3 + ee](
i,
j);
1240 ++t_diff_base_f_e[ff * 3 + ee];
1248 for (
auto ff = 0; ff != 4; ++ff) {
1249 t_base(
i) = t_base_f_f[ff](
i);
1252 t_diff_base(
i,
j) = t_diff_base_f_f[ff](
i,
j);
1254 ++t_diff_base_f_f[ff];
1262 for (
int ee = 0; ee < 6; ee++) {
1263 t_base(
i) = t_base_v_e[ee](
i);
1266 t_diff_base(
i,
j) = t_diff_base_v_e[ee](
i,
j);
1268 ++t_diff_base_v_e[ee];
1275 for (
int ff = 0; ff < 4; ff++) {
1276 t_base(
i) = t_base_v_f[ff](
i);
1279 t_diff_base(
i,
j) = t_diff_base_v_f[ff](
i,
j);
1281 ++t_diff_base_v_f[ff];
1288 t_base(
i) = t_base_v(
i);
1291 t_diff_base(
i,
j) = t_diff_base_v(
i,
j);
1306 if (interior_cache_ptr) {
1307 auto p = interior_cache_ptr->emplace(
1323 "This should be used only with DEMKOWICZ_JACOBI_BASE "
1327 int nb_gauss_pts = pts.size2();
1333 double *diff_phi_f[4];
1345 auto face_cache_ptr = get_face_cache_ptr();
1348 for (
int ff = 0; ff != 4; ff++) {
1350 int order = volume_order > face_order ? volume_order : face_order;
1358 if (face_cache_ptr) {
1359 auto it = face_cache_ptr->find(boost::make_tuple(
1361 face_order, nb_gauss_pts,
1366 if (it != face_cache_ptr->end()) {
1368 noalias(data.
dataOnEntities[MBTRI][ff].getDiffN(base)) = it->diffN;
1374 phi_f[ff] = &*data.
dataOnEntities[MBTRI][ff].getN(base).data().begin();
1381 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1382 phi_f[ff], diff_phi_f[ff], nb_gauss_pts, 4);
1383 if (face_cache_ptr) {
1385 face_order, nb_gauss_pts, data.
facesNodes(ff, 0),
1402 auto interior_cache_ptr = get_interior_cache();
1411 for (
int v = 0;
v != 1; ++
v) {
1412 if (interior_cache_ptr) {
1413 auto it = interior_cache_ptr->find(
1414 boost::make_tuple(volume_order, nb_gauss_pts));
1415 if (it != interior_cache_ptr->end()) {
1417 noalias(data.
dataOnEntities[MBTET][0].getDiffN(base)) = it->diffN;
1422 double *phi_v = &*data.
dataOnEntities[MBTET][0].getN(base).data().begin();
1423 double *diff_phi_v =
1427 volume_order, &data.
dataOnEntities[MBVERTEX][0].getN(base)(0, 0),
1428 &data.
dataOnEntities[MBVERTEX][0].getDiffN(base)(0, 0), p_f, phi_f,
1429 diff_phi_f, phi_v, diff_phi_v, nb_gauss_pts);
1430 if (interior_cache_ptr) {
1431 auto p = interior_cache_ptr->emplace(
1440 for (
int ff = 0; ff != 4; ff++) {
1459 "This should be used only with DEMKOWICZ_JACOBI_BASE "
1463 int nb_gauss_pts = pts.size2();
1468 int nb_dofs = 4 * nb_dofs_face + nb_dofs_volume;
1469 data.
dataOnEntities[MBTET][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
1471 data.
dataOnEntities[MBTET][0].getDiffN(base).resize(nb_gauss_pts, 9 * nb_dofs,
1486 auto interior_cache_ptr = get_interior_cache();
1488 if (interior_cache_ptr) {
1490 interior_cache_ptr->find(boost::make_tuple(volume_order, nb_gauss_pts));
1491 if (it != interior_cache_ptr->end()) {
1493 noalias(data.
dataOnEntities[MBTET][0].getDiffN(base)) = it->diffN;
1498 std::array<MatrixDouble, 4> face_base_fun{
1503 std::array<MatrixDouble, 4> face_diff_base{
1509 int face_node[4][3] = {{0, 1, 3}, {1, 2, 3}, {0, 2, 3}, {0, 1, 2}};
1511 std::array<int, 4> p_f{volume_order, volume_order, volume_order,
1513 std::array<double *, 4> phi_f{
1514 &*face_base_fun[0].data().begin(), &*face_base_fun[1].data().begin(),
1515 &*face_base_fun[2].data().begin(), &*face_base_fun[3].data().begin()};
1516 std::array<double *, 4> diff_phi_f{
1517 &*face_diff_base[0].data().begin(), &*face_diff_base[1].data().begin(),
1518 &*face_diff_base[2].data().begin(), &*face_diff_base[3].data().begin()};
1521 for (
int ff = 0; ff != 4; ff++) {
1523 face_node[ff], p_f[ff],
1525 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1526 phi_f[ff], diff_phi_f[ff], nb_gauss_pts, 4);
1529 MatrixDouble vol_bases(nb_gauss_pts, 3 * nb_dofs_volume);
1530 MatrixDouble vol_diff_bases(nb_gauss_pts, 9 * nb_dofs_volume);
1531 auto *phi_v = &*vol_bases.data().begin();
1532 auto *diff_phi_v = &*vol_diff_bases.data().begin();
1534 volume_order, &data.
dataOnEntities[MBVERTEX][0].getN(base)(0, 0),
1535 &data.
dataOnEntities[MBVERTEX][0].getDiffN(base)(0, 0), p_f.data(),
1536 phi_f.data(), diff_phi_f.data(), phi_v, diff_phi_v, nb_gauss_pts);
1540 getFTensor1FromPtr<3>(phi_f[0]), getFTensor1FromPtr<3>(phi_f[1]),
1541 getFTensor1FromPtr<3>(phi_f[2]), getFTensor1FromPtr<3>(phi_f[3])};
1550 getFTensor1FromPtr<3>(&*vol_bases.data().begin());
1554 auto t_base = getFTensor1FromPtr<3>(
1562 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
1563 for (
int oo = 0; oo < volume_order; oo++) {
1567 for (
auto ff = 0; ff != 4; ++ff) {
1568 t_base(
i) = t_base_v_f[ff](
i);
1571 t_diff_base(
i,
j) = t_diff_base_v_f[ff](
i,
j);
1573 ++t_diff_base_v_f[ff];
1579 t_base(
i) = t_base_v(
i);
1582 t_diff_base(
i,
j) = t_diff_base_v(
i,
j);
1589 if (interior_cache_ptr) {
1590 auto p = interior_cache_ptr->emplace(
1639 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
1640 double *diffL,
const int dim) =
1643 int nb_gauss_pts = pts.size2();
1647 int sense[6],
order[6];
1651 double *hcurl_edge_n[6], *diff_hcurl_edge_n[6];
1652 for (
int ee = 0; ee != 6; ee++) {
1655 "data inconsistency");
1662 3 * nb_dofs,
false);
1663 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts,
1664 9 * nb_dofs,
false);
1667 diff_hcurl_edge_n[ee] =
1673 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1674 hcurl_edge_n, diff_hcurl_edge_n, nb_gauss_pts, base_polynomials);
1676 for (
int ee = 0; ee != 6; ee++) {
1677 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
1678 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
1690 double *hcurl_base_n[4], *diff_hcurl_base_n[4];
1691 for (
int ff = 0; ff != 4; ff++) {
1694 "data inconsistency");
1699 3 * nb_dofs,
false);
1700 data.
dataOnEntities[MBTRI][ff].getDiffN(base).resize(nb_gauss_pts,
1701 9 * nb_dofs,
false);
1704 diff_hcurl_base_n[ff] =
1716 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1717 hcurl_base_n, diff_hcurl_base_n, nb_gauss_pts, base_polynomials);
1719 for (
int ff = 0; ff != 4; ff++) {
1720 data.
dataOnEntities[MBTRI][ff].getN(base).resize(nb_gauss_pts, 0,
false);
1721 data.
dataOnEntities[MBTRI][ff].getDiffN(base).resize(nb_gauss_pts, 0,
1732 3 * nb_vol_dofs,
false);
1733 data.
dataOnEntities[MBTET][0].getDiffN(base).resize(nb_gauss_pts,
1734 9 * nb_vol_dofs,
false);
1738 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1741 nb_gauss_pts, base_polynomials);
1744 data.
dataOnEntities[MBTET][0].getN(base).resize(nb_gauss_pts, 0,
false);
1745 data.
dataOnEntities[MBTET][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
1759 "This should be used only with DEMKOWICZ_JACOBI_BASE "
1764 int nb_gauss_pts = pts.size2();
1768 int sense[6],
order[6];
1771 "wrong size of data structure, expected space for six edges "
1775 double *hcurl_edge_n[6], *diff_hcurl_edge_n[6];
1776 for (
int ee = 0; ee != 6; ee++) {
1779 "orintation of edges is not set");
1786 3 * nb_dofs,
false);
1787 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts,
1788 9 * nb_dofs,
false);
1791 diff_hcurl_edge_n[ee] =
1797 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1798 hcurl_edge_n, diff_hcurl_edge_n, nb_gauss_pts);
1802 for (
int ee = 0; ee != 6; ee++) {
1803 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
1804 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
1815 "data structure for storing face h-curl base have wrong size "
1816 "should be four but is %d",
1819 double *hcurl_base_n[4], *diff_hcurl_base_n[4];
1820 for (
int ff = 0; ff != 4; ff++) {
1823 "orintation of face is not set");
1828 3 * nb_dofs,
false);
1829 data.
dataOnEntities[MBTRI][ff].getDiffN(base).resize(nb_gauss_pts,
1830 9 * nb_dofs,
false);
1833 diff_hcurl_base_n[ff] =
1838 "data inconsistency, should be four faces");
1842 "data inconsistency, should be three nodes on face");
1847 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1848 hcurl_base_n, diff_hcurl_base_n, nb_gauss_pts);
1852 for (
int ff = 0; ff != 4; ff++) {
1853 data.
dataOnEntities[MBTRI][ff].getN(base).resize(nb_gauss_pts, 0,
false);
1854 data.
dataOnEntities[MBTRI][ff].getDiffN(base).resize(nb_gauss_pts, 0,
1864 3 * nb_vol_dofs,
false);
1865 data.
dataOnEntities[MBTET][0].getDiffN(base).resize(nb_gauss_pts,
1866 9 * nb_vol_dofs,
false);
1870 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1877 data.
dataOnEntities[MBTET][0].getN(base).resize(nb_gauss_pts, 0,
false);
1878 data.
dataOnEntities[MBTET][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
1904 boost::shared_ptr<BaseFunctionCtx> ctx_ptr) {
1909 int nb_gauss_pts = pts.size2();
1913 if (pts.size1() < 3)
1916 "Wrong dimension of pts, should be at least 3 rows with coordinates");
1922 data.
dataOnEntities[MBVERTEX][0].getN(base).resize(nb_gauss_pts, 4,
1926 &pts(0, 0), &pts(1, 0), &pts(2, 0), nb_gauss_pts);
1932 (
unsigned int)nb_gauss_pts) {
1934 "Base functions or nodes has wrong number of integration points "
1938 data.
dataOnEntities[MBVERTEX][0].getDiffN(base).resize(4, 3,
false);
1984 template <
typename T>
1986 auto it = cache.find(ptr);
1987 if (it != cache.end()) {
1990 <<
"Cache off " << cache_name <<
": " << it->second.size();
1996 <<
"Cache on " << cache_name;
2004 "hDivBaseFaceDemkowicz");
2009 "hdivBaseInteriorDemkowicz");
2015 "hdivBrokenBaseInteriorDemkowicz");
2019 for (
auto fe_ptr :
v) {
2033 for (
auto fe_ptr :
v) {
2049 "hdivBrokenBaseInteriorAinsworth");
2053 for (
auto fe_ptr :
v) {
2061 for (
auto fe_ptr :
v) {