469 const int nb_gauss_pts = pts.size2();
471 auto ©_base_fun = data.dataOnEntities[MBVERTEX][0].getN(copy_base);
472 auto ©_diff_base_fun =
473 data.dataOnEntities[MBVERTEX][0].getDiffN(copy_base);
475 if (nb_gauss_pts != copy_base_fun.size1())
477 "Wrong number of gauss pts");
479 if (nb_gauss_pts != copy_diff_base_fun.size1())
481 "Wrong number of gauss pts");
484 if (data.spacesOnEntities[MBEDGE].test(
HCURL)) {
485 std::array<int, 12> sense;
486 std::array<int, 12>
order;
487 if (data.dataOnEntities[MBEDGE].size() != 12)
489 "Expected 12 edges data structures on Hex");
491 std::array<double *, 12> hcurl_edge_n;
492 std::array<double *, 12> diff_hcurl_edge_n;
493 bool sum_nb_dofs =
false;
495 for (
int ee = 0; ee != 12; ++ee) {
496 if (data.dataOnEntities[MBEDGE][ee].getSense() == 0)
498 "Sense on edge <%d> on Hex not set", ee);
500 sense[ee] = data.dataOnEntities[MBEDGE][ee].getSense();
501 order[ee] = data.dataOnEntities[MBEDGE][ee].getOrder();
503 data.dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts,
505 data.dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts,
508 &*data.dataOnEntities[MBEDGE][ee].getN(base).data().begin();
509 diff_hcurl_edge_n[ee] =
510 &*data.dataOnEntities[MBEDGE][ee].getDiffN(base).data().begin();
512 sum_nb_dofs |= (nb_dofs > 0);
517 sense.data(),
order.data(), &*copy_base_fun.data().begin(),
518 &*copy_diff_base_fun.data().begin(), hcurl_edge_n.data(),
519 diff_hcurl_edge_n.data(), nb_gauss_pts);
523 for (
int ee = 0; ee != 12; ee++) {
524 data.dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
525 data.dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
531 if (data.spacesOnEntities[MBQUAD].test(
HCURL)) {
533 if (data.dataOnEntities[MBQUAD].size() != 6)
535 "Expected six data structures on Hex");
537 std::array<int, 6>
order;
538 double *face_family_ptr[6][2];
539 double *diff_face_family_ptr[6][2];
541 bool sum_nb_dofs =
false;
542 for (
int ff = 0; ff != 6; ff++) {
543 if (data.dataOnEntities[MBQUAD][ff].getSense() == 0)
545 "Sense pn quad <%d> not set", ff);
547 order[ff] = data.dataOnEntities[MBQUAD][ff].getOrder();
548 if (data.facesNodes.size1() != 6)
550 "Expected six faces");
551 if (data.facesNodes.size2() != 4)
553 "Expected four nodes on face");
555 const int nb_family_dofs =
557 faceFamily[ff].resize(2, 3 * nb_family_dofs * nb_gauss_pts,
false);
558 diffFaceFamily[ff].resize(2, 9 * nb_family_dofs * nb_gauss_pts,
false);
560 if (nb_family_dofs) {
561 face_family_ptr[ff][0] = &(
faceFamily[ff](0, 0));
562 face_family_ptr[ff][1] = &(
faceFamily[ff](1, 0));
567 sum_nb_dofs |= (nb_family_dofs > 0);
572 &*data.facesNodes.data().begin(),
573 &*data.facesNodesOrder.data().begin(),
order.data(),
574 &*copy_base_fun.data().begin(), &*copy_diff_base_fun.data().begin(),
575 face_family_ptr, diff_face_family_ptr, nb_gauss_pts);
577 for (
int ff = 0; ff != 6; ++ff) {
583 auto &face_n = data.dataOnEntities[MBQUAD][ff].getN(base);
584 auto &diff_face_n = data.dataOnEntities[MBQUAD][ff].getDiffN(base);
585 face_n.resize(nb_gauss_pts, 3 * nb_dofs,
false);
586 diff_face_n.resize(nb_gauss_pts, 9 * nb_dofs,
false);
590 double *ptr = &face_n(0, 0);
592 for (
int j = 0;
j != 3; ++
j) {
597 for (
int j = 0;
j != 3; ++
j) {
606 double *diff_ptr = &diff_face_n(0, 0);
608 for (
int j = 0;
j != 9; ++
j) {
609 *diff_ptr = *diff_ptr_f0;
613 for (
int j = 0;
j != 9; ++
j) {
614 *diff_ptr = *diff_ptr_f1;
622 for (
int ff = 0; ff != 6; ff++) {
623 data.dataOnEntities[MBQUAD][ff].getN(base).resize(nb_gauss_pts, 0,
625 data.dataOnEntities[MBQUAD][ff].getDiffN(base).resize(nb_gauss_pts, 0,
631 for (
int ff = 0; ff != 6; ff++) {
632 data.dataOnEntities[MBQUAD][ff].getN(base).resize(nb_gauss_pts, 0,
false);
633 data.dataOnEntities[MBQUAD][ff].getDiffN(base).resize(nb_gauss_pts, 0,
639 if (data.spacesOnEntities[MBHEX].test(
HCURL)) {
641 const int order = data.dataOnEntities[MBHEX][0].getOrder();
644 volFamily.resize(3, 3 * nb_dofs * nb_gauss_pts);
650 std::array<double *, 3> diff_family_ptr = {
655 p.data(), &*copy_base_fun.data().begin(),
656 &*copy_diff_base_fun.data().begin(), family_ptr.data(),
657 diff_family_ptr.data(), nb_gauss_pts);
660 auto &face_n = data.dataOnEntities[MBHEX][0].getN(base);
661 auto &diff_face_n = data.dataOnEntities[MBHEX][0].getDiffN(base);
662 face_n.resize(nb_gauss_pts, 3 * nb_vol_dofs,
false);
663 diff_face_n.resize(nb_gauss_pts, 9 * nb_vol_dofs,
false);
668 double *ptr = &face_n(0, 0);
670 for (
int j = 0;
j != 3; ++
j) {
675 for (
int j = 0;
j != 3; ++
j) {
680 for (
int j = 0;
j != 3; ++
j) {
690 double *diff_ptr = &diff_face_n(0, 0);
692 for (
int j = 0;
j != 9; ++
j) {
693 *diff_ptr = *diff_ptr_f0;
697 for (
int j = 0;
j != 9; ++
j) {
698 *diff_ptr = *diff_ptr_f1;
702 for (
int j = 0;
j != 9; ++
j) {
703 *diff_ptr = *diff_ptr_f2;
709 data.dataOnEntities[MBHEX][0].getN(base).resize(nb_gauss_pts, 0,
false);
710 data.dataOnEntities[MBHEX][0].getDiffN(base).resize(nb_gauss_pts, 0,
715 data.dataOnEntities[MBHEX][0].getN(base).resize(nb_gauss_pts, 0,
false);
716 data.dataOnEntities[MBHEX][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
#define NBFACEQUAD_DEMKOWICZ_FAMILY_HCURL(P, Q)
Number of base functions on quad for Hcurl space.
#define NBEDGE_DEMKOWICZ_HCURL(P)
#define NBVOLUMEHEX_DEMKOWICZ_HCURL(P)
#define NBFACEQUAD_DEMKOWICZ_HCURL(P)
#define NBVOLUMEHEX_DEMKOWICZ_FAMILY_HCURL(P, Q, R)
FTensor::Index< 'j', 3 > j
MoFEMErrorCode Hcurl_EdgeShapeFunctions_ONHEX(int *sense, int *p, double *N, double *N_diff, double *edgeN[12], double *diff_edgeN[12], int nb_integration_pts)
MoFEMErrorCode Hcurl_FaceShapeFunctions_ONHEX(int *face_nodes, int *face_nodes_order, int *p, double *N, double *N_diff, double *faceN[6][2], double *diff_faceN[6][2], int nb_integration_pts)
MoFEMErrorCode Hcurl_InteriorShapeFunctions_ONHEX(int *p, double *N, double *N_diff, double *volN[3], double *diff_volN[3], int nb_integration_pts)
MatrixDouble diffVolFamily
std::array< MatrixDouble, 6 > faceFamily
std::array< MatrixDouble, 6 > diffFaceFamily