12#ifndef GENERATE_VTK_WITH_CURL_BASE
17 int *sense,
int *p,
double *
N,
double *diffN,
double *edge_n[],
18 double *diff_edge_n[],
int nb_integration_pts,
19 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
20 double *
L,
double *diffL,
24 const int edges_nodes[6][2] = {{0, 1}, {1, 2}, {2, 0},
25 {0, 3}, {1, 3}, {2, 3}};
27 for (
int ee = 0; ee != 6; ee++)
38 double edge_diff_ksi[6][3];
41 &edge_diff_ksi[0][2]),
43 &edge_diff_ksi[1][2]),
45 &edge_diff_ksi[2][2]),
47 &edge_diff_ksi[3][2]),
49 &edge_diff_ksi[4][2]),
51 &edge_diff_ksi[5][2])};
52 for (
int ee = 0; ee != 6; ee++) {
53 t_edge_diff_ksi[ee](
i) = (t_node_diff_ksi[edges_nodes[ee][1]](
i) -
54 t_node_diff_ksi[edges_nodes[ee][0]](
i)) *
73 &diff_edge_n[0][0], &diff_edge_n[0][3], &diff_edge_n[0][6],
74 &diff_edge_n[0][1], &diff_edge_n[0][4], &diff_edge_n[0][7],
75 &diff_edge_n[0][2], &diff_edge_n[0][5], &diff_edge_n[0][8], 9),
77 &diff_edge_n[1][0], &diff_edge_n[1][3], &diff_edge_n[1][6],
78 &diff_edge_n[1][1], &diff_edge_n[1][4], &diff_edge_n[1][7],
79 &diff_edge_n[1][2], &diff_edge_n[1][5], &diff_edge_n[1][8], 9),
81 &diff_edge_n[2][0], &diff_edge_n[2][3], &diff_edge_n[2][6],
82 &diff_edge_n[2][1], &diff_edge_n[2][4], &diff_edge_n[2][7],
83 &diff_edge_n[2][2], &diff_edge_n[2][5], &diff_edge_n[2][8], 9),
85 &diff_edge_n[3][0], &diff_edge_n[3][3], &diff_edge_n[3][6],
86 &diff_edge_n[3][1], &diff_edge_n[3][4], &diff_edge_n[3][7],
87 &diff_edge_n[3][2], &diff_edge_n[3][5], &diff_edge_n[3][8], 9),
89 &diff_edge_n[4][0], &diff_edge_n[4][3], &diff_edge_n[4][6],
90 &diff_edge_n[4][1], &diff_edge_n[4][4], &diff_edge_n[4][7],
91 &diff_edge_n[4][2], &diff_edge_n[4][5], &diff_edge_n[4][8], 9),
93 &diff_edge_n[5][0], &diff_edge_n[5][3], &diff_edge_n[5][6],
94 &diff_edge_n[5][1], &diff_edge_n[5][4], &diff_edge_n[5][7],
95 &diff_edge_n[5][2], &diff_edge_n[5][5], &diff_edge_n[5][8], 9)};
99 for (
int ii = 0; ii != nb_integration_pts; ii++) {
101 const int node_shift = ii * 4;
102 for (
int ee = 0; ee != 6; ee++) {
107 t_psi_e_0(
i) = (
N[node_shift + edges_nodes[ee][1]] *
108 t_node_diff_ksi[edges_nodes[ee][0]](
i) -
109 N[node_shift + edges_nodes[ee][0]] *
110 t_node_diff_ksi[edges_nodes[ee][1]](
i)) *
112 t_diff_psi_e_0(
i,
j) = (t_node_diff_ksi[edges_nodes[ee][1]](
j) *
113 t_node_diff_ksi[edges_nodes[ee][0]](
i) -
114 t_node_diff_ksi[edges_nodes[ee][0]](
j) *
115 t_node_diff_ksi[edges_nodes[ee][1]](
i)) *
118 t_psi_e_1(
i) =
N[node_shift + edges_nodes[ee][1]] *
119 t_node_diff_ksi[edges_nodes[ee][0]](
i) +
120 N[node_shift + edges_nodes[ee][0]] *
121 t_node_diff_ksi[edges_nodes[ee][1]](
i);
122 t_diff_psi_e_1(
i,
j) = t_node_diff_ksi[edges_nodes[ee][1]](
j) *
123 t_node_diff_ksi[edges_nodes[ee][0]](
i) +
124 t_node_diff_ksi[edges_nodes[ee][0]](
j) *
125 t_node_diff_ksi[edges_nodes[ee][1]](
i);
127 (t_edge_n[ee])(
i) = t_psi_e_0(
i);
129 (t_edge_n[ee])(
i) = t_psi_e_1(
i);
132 (t_diff_edge_n[ee])(
i,
j) = t_diff_psi_e_0(
i,
j);
133 ++(t_diff_edge_n[ee]);
134 (t_diff_edge_n[ee])(
i,
j) = t_diff_psi_e_1(
i,
j);
135 ++(t_diff_edge_n[ee]);
139 const double ksi_0i = (
N[node_shift + edges_nodes[ee][1]] -
140 N[node_shift + edges_nodes[ee][0]]) *
142 double psi_l[p[ee] + 1], diff_psi_l[3 * p[ee] + 3];
143 CHKERR base_polynomials(p[ee], ksi_0i, &edge_diff_ksi[ee][0], psi_l,
147 &diff_psi_l[0], &diff_psi_l[p[ee] + 1], &diff_psi_l[2 * p[ee] + 2],
150 for (
int ll = 2; ll != P[ee]; ll++) {
155 (t_edge_n[ee])(
i) =
a * psi_l[ll - 1] * t_psi_e_1(
i) -
156 b * psi_l[ll - 2] * t_psi_e_0(
i);
159 (t_diff_edge_n[ee])(
i,
j) =
160 -b * (t_diff_psi_l(
j) * t_psi_e_0(
i) +
161 psi_l[ll - 2] * t_diff_psi_e_0(
i,
j));
163 (t_diff_edge_n[ee])(
i,
j) +=
164 a * (t_diff_psi_l(
j) * t_psi_e_1(
i) +
165 psi_l[ll - 1] * t_diff_psi_e_1(
i,
j));
166 ++(t_diff_edge_n[ee]);
176 int sense,
int p,
double *
N,
double *diffN,
double *edge_n,
177 double *diff_edge_n,
int nb_integration_pts,
178 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
179 double *
L,
double *diffL,
185 if (diff_edge_n != NULL)
187 "Calculation of derivatives not implemented");
191 t_node_diff_ksi[0](0) = diffN[0];
192 t_node_diff_ksi[0](1) = 0;
193 t_node_diff_ksi[0](2) = 0;
194 t_node_diff_ksi[1](0) = diffN[1];
195 t_node_diff_ksi[1](1) = 0;
196 t_node_diff_ksi[1](2) = 0;
199 &edge_n[0], &edge_n[1], &edge_n[2]);
202 for (
int ii = 0; ii != nb_integration_pts; ii++) {
204 const int node_shift = ii * 2;
206 t_psi_e_0(
i) = (
N[node_shift + 1] * t_node_diff_ksi[0](
i) -
207 N[node_shift + 0] * t_node_diff_ksi[1](
i)) *
209 t_psi_e_1(
i) =
N[node_shift + 1] * t_node_diff_ksi[0](
i) +
210 N[node_shift + 0] * t_node_diff_ksi[1](
i);
212 t_edge_n(
i) = t_psi_e_0(
i);
215 t_edge_n(
i) = t_psi_e_1(
i);
220 const double ksi_0i = (
N[node_shift + 1] -
N[node_shift + 0]) * sense;
222 CHKERR base_polynomials(p, ksi_0i, NULL, psi_l, NULL, 3);
228 a * psi_l[ll - 1] * t_psi_e_1(
i) - b * psi_l[ll - 2] * t_psi_e_0(
i);
238 int *sense,
int *p,
double *
N,
double *diffN,
double *edge_n[],
239 double *diff_edge_n[],
int nb_integration_pts,
240 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
241 double *
L,
double *diffL,
248 const int edges_nodes[3][2] = {{0, 1}, {1, 2}, {2, 0}};
250 for (
int ee = 0; ee < 3; ee++)
290 for (
int ee = 0; ee != 3; ee++) {
294 const int node0 = edges_nodes[ee][0];
295 const int node1 = edges_nodes[ee][1];
296 const int sense_edge = sense[ee];
298 t_diff_psi_e_0(
i,
j) =
299 (t_node_diff_ksi[node0](
i) * t_2d_diff_ksi[node1](
j) -
300 t_node_diff_ksi[node1](
i) * t_2d_diff_ksi[node0](
j)) *
302 t_diff_psi_e_1(
i,
j) = t_node_diff_ksi[node0](
i) * t_2d_diff_ksi[node1](
j) +
303 t_node_diff_ksi[node1](
i) * t_2d_diff_ksi[node0](
j);
305 for (
int ii = 0; ii != nb_integration_pts; ii++) {
307 const int node_shift = ii * 3;
308 const double n0 =
N[node_shift + node0];
309 const double n1 =
N[node_shift + node1];
312 (n1 * t_node_diff_ksi[node0](
i) - n0 * t_node_diff_ksi[node1](
i)) *
315 n1 * t_node_diff_ksi[node0](
i) + n0 * t_node_diff_ksi[node1](
i);
317 (t_edge_n[ee])(
i) = t_psi_e_0(
i);
318 (t_diff_edge_n[ee])(
i,
j) = t_diff_psi_e_0(
i,
j);
320 ++(t_diff_edge_n[ee]);
321 (t_edge_n[ee])(
i) = t_psi_e_1(
i);
322 (t_diff_edge_n[ee])(
i,
j) = t_diff_psi_e_1(
i,
j);
324 ++(t_diff_edge_n[ee]);
327 const double ksi_0i = (n1 - n0) * sense_edge;
328 double diff_ksi_0i[] = {
329 ((t_2d_diff_ksi[node1])(0) - (t_2d_diff_ksi[node0])(0)) *
331 ((t_2d_diff_ksi[node1])(1) - (t_2d_diff_ksi[node0])(1)) *
334 double psi_l[p[ee] + 1], diff_psi_l[2 * p[ee] + 2];
336 base_polynomials(p[ee], ksi_0i, diff_ksi_0i, psi_l, diff_psi_l, 2);
339 &diff_psi_l[0 + 2 - 1], &diff_psi_l[p[ee] + 1 + 2 - 1], 1);
341 &diff_psi_l[0 + 2 - 2], &diff_psi_l[p[ee] + 1 + 2 - 2], 1);
342 for (
int ll = 2; ll != P[ee]; ll++) {
345 (t_edge_n[ee])(
i) =
a * psi_l[ll - 1] * t_psi_e_1(
i) -
346 b * psi_l[ll - 2] * t_psi_e_0(
i);
347 (t_diff_edge_n[ee])(
i,
j) =
a * t_psi_e_1(
i) * t_diff_psi_ll_m1(
j) +
348 a * psi_l[ll - 1] * t_diff_psi_e_1(
i,
j) -
349 b * t_psi_e_0(
i) * t_diff_psi_ll_m2(
j) -
350 b * psi_l[ll - 2] * t_diff_psi_e_0(
i,
j);
352 ++(t_diff_edge_n[ee]);
364 int *faces_nodes,
int *p,
double *
N,
double *diffN,
double *phi_f_e[4][3],
365 double *diff_phi_f_e[4][3],
int nb_integration_pts,
366 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
367 double *
L,
double *diffL,
371 const int edges[3][2] = {{0, 1}, {1, 2}, {2, 0}};
384 for (
int ff = 0; ff != 4; ff++) {
386 const int o_nodes[3] = {faces_nodes[3 * ff + 2], faces_nodes[3 * ff + 0],
387 faces_nodes[3 * ff + 1]};
390 &diffN[3 * o_nodes[0] + 1],
391 &diffN[3 * o_nodes[0] + 2]),
393 &diffN[3 * o_nodes[1] + 1],
394 &diffN[3 * o_nodes[1] + 2]),
396 &diffN[3 * o_nodes[2] + 1],
397 &diffN[3 * o_nodes[2] + 2])};
398 double psi_l[p[ff] + 1], diff_psi_l[3 * p[ff] + 3];
402 if (nb_base_fun_on_face == 0)
405 for (
int ee = 0; ee != 3; ee++) {
408 &phi_f_e[ff][ee][0], &phi_f_e[ff][ee][1], &phi_f_e[ff][ee][2], 3);
410 &diff_phi_f_e[ff][ee][0], &diff_phi_f_e[ff][ee][3],
411 &diff_phi_f_e[ff][ee][6], &diff_phi_f_e[ff][ee][1],
412 &diff_phi_f_e[ff][ee][4], &diff_phi_f_e[ff][ee][7],
413 &diff_phi_f_e[ff][ee][2], &diff_phi_f_e[ff][ee][5],
414 &diff_phi_f_e[ff][ee][8], 9);
415 const int en[] = {faces_nodes[3 * ff + edges[ee][0]],
416 faces_nodes[3 * ff + edges[ee][1]]};
418 t_node_diff_ksi[en[1]](
i) - t_node_diff_ksi[en[0]](
i);
420 for (
int ii = 0; ii != nb_integration_pts; ii++) {
422 const int node_shift = ii * 4;
423 const double n[] = {
N[node_shift + faces_nodes[3 * ff + edges[ee][0]]],
424 N[node_shift + faces_nodes[3 * ff + edges[ee][1]]]};
425 const double ksi_0i =
n[1] -
n[0];
426 CHKERR base_polynomials(p[ff], ksi_0i, &t_edge_diff_ksi(0), psi_l,
430 &diff_psi_l[0], &diff_psi_l[p[ff] + 1], &diff_psi_l[2 * p[ff] + 2],
433 const double beta_e =
n[0] *
n[1];
435 t_node_diff_ksi[en[0]](
j) *
n[1] +
n[0] * t_node_diff_ksi[en[1]](
j);
437 for (
int ll = 0; ll != nb_base_fun_on_face; ll++) {
440 t_face_edge_base(
i) =
441 beta_e * psi_l[ll] * t_opposite_node_diff[ee](
i);
444 t_diff_face_edge_base(
i,
j) =
445 (beta_e * t_diff_psi_l(
j) + t_diff_beta_e(
j) * psi_l[ll]) *
446 t_opposite_node_diff[ee](
i);
448 ++t_diff_face_edge_base;
459 int *faces_nodes,
int p,
double *
N,
double *diffN,
double *phi_f_e[3],
460 double *diff_phi_f_e[3],
int nb_integration_pts,
461 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
462 double *
L,
double *diffL,
468 if (nb_base_fun_on_face == 0)
471 const int edges[3][2] = {{0, 1}, {1, 2}, {2, 0}};
476 const int o_nodes[3] = {2, 0, 1};
478 diffN[2 * o_nodes[0] + 0], diffN[2 * o_nodes[0] + 1], 0.,
479 diffN[2 * o_nodes[1] + 0], diffN[2 * o_nodes[1] + 1], 0.,
480 diffN[2 * o_nodes[2] + 0], diffN[2 * o_nodes[2] + 1], 0.);
482 double diff_psi_l[2 * p + 2];
486 &phi_f_e[0][
HVEC2], 3),
488 &phi_f_e[1][
HVEC2], 3),
490 &phi_f_e[2][
HVEC2], 3),
493 t_diff_face_edge_base[3] = {
507 for (
int ee = 0; ee != 3; ee++) {
509 const int node0 = faces_nodes[edges[ee][0]];
510 const int node1 = faces_nodes[edges[ee][1]];
511 double diff_ksi0i[] = {diffN[2 * node1 + 0] - diffN[2 * node0 + 0],
512 diffN[2 * node1 + 1] - diffN[2 * node0 + 1]};
514 for (
int ii = 0; ii != nb_integration_pts; ii++) {
516 const int node_shift = ii * 3;
517 const double n0 =
N[node_shift + node0];
518 const double n1 =
N[node_shift + node1];
519 const double ksi_0i = n1 - n0;
520 CHKERR base_polynomials(p, ksi_0i, diff_ksi0i, psi_l, diff_psi_l, 2);
522 const double beta_e = n0 * n1;
524 diffN[2 * node0 + 0] * n1 + n0 * diffN[2 * node1 + 0],
525 diffN[2 * node0 + 1] * n1 + n0 * diffN[2 * node1 + 1]);
527 &diff_psi_l[p + 1], 1);
529 for (
int ll = 0; ll != nb_base_fun_on_face; ll++) {
530 t_face_edge_base[ee](
i) =
531 beta_e * psi_l[ll] * t_opposite_node_diff(ee,
i);
532 t_diff_face_edge_base[ee](
i,
j) =
533 beta_e * t_opposite_node_diff(ee,
i) * t_diff_psi_l(
j) +
534 psi_l[ll] * t_opposite_node_diff(ee,
i) * t_diff_beta_e(
j);
535 ++t_face_edge_base[ee];
536 ++t_diff_face_edge_base[ee];
546 int *faces_nodes,
int *p,
double *
N,
double *diffN,
double *phi_f[4],
547 double *diff_phi_f[4],
int nb_integration_pts,
548 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
549 double *
L,
double *diffL,
575 for (
int ff = 0; ff != 4; ff++) {
580 int n0 = faces_nodes[3 * ff + 0];
581 int n1 = faces_nodes[3 * ff + 1];
582 int n2 = faces_nodes[3 * ff + 2];
586 tou_0i(
i) = t_node_diff_ksi[n1](
i) - t_node_diff_ksi[n0](
i);
587 tou_0j(
i) = t_node_diff_ksi[n2](
i) - t_node_diff_ksi[n0](
i);
589 t_diff_ksi0i(
i) = t_node_diff_ksi[n1](
i) - t_node_diff_ksi[n0](
i);
590 t_diff_ksi0j(
i) = t_node_diff_ksi[n2](
i) - t_node_diff_ksi[n0](
i);
592 double psi_l_0i[p[ff] + 1], diff_psi_l_0i[3 * p[ff] + 3];
593 double psi_l_0j[p[ff] + 1], diff_psi_l_0j[3 * p[ff] + 3];
598 &diff_phi_f[ff][0], &diff_phi_f[ff][3], &diff_phi_f[ff][6],
599 &diff_phi_f[ff][1], &diff_phi_f[ff][4], &diff_phi_f[ff][7],
600 &diff_phi_f[ff][2], &diff_phi_f[ff][5], &diff_phi_f[ff][8], 9);
603 for (
int ii = 0; ii != nb_integration_pts; ii++) {
605 const int node_shift = ii * 4;
606 const double beta_0ij =
607 N[node_shift + n0] *
N[node_shift + n1] *
N[node_shift + n2];
609 t_node_diff_ksi[n0](
i) *
N[node_shift + n1] *
N[node_shift + n2] +
610 N[node_shift + n0] * t_node_diff_ksi[n1](
i) *
N[node_shift + n2] +
611 N[node_shift + n0] *
N[node_shift + n1] * t_node_diff_ksi[n2](
i);
613 const double ksi_0i =
N[node_shift + n1] -
N[node_shift + n0];
614 CHKERR base_polynomials(p[ff], ksi_0i, &t_diff_ksi0i(0), psi_l_0i,
617 const double ksi_0j =
N[node_shift + n2] -
N[node_shift + n0];
618 CHKERR base_polynomials(p[ff], ksi_0j, &t_diff_ksi0j(0), psi_l_0j,
622 for (
int oo = 0; oo <= (p[ff] - 3); oo++) {
624 &diff_psi_l_0i[0], &diff_psi_l_0i[p[ff] + 1],
625 &diff_psi_l_0i[2 * p[ff] + 2], 1);
626 for (
int pp0 = 0; pp0 <= oo; pp0++) {
627 const int pp1 = oo - pp0;
630 &diff_psi_l_0j[pp1], &diff_psi_l_0j[p[ff] + 1 + pp1],
631 &diff_psi_l_0j[2 * p[ff] + 2 + pp1], 1);
633 const double a = beta_0ij * psi_l_0i[pp0] * psi_l_0j[pp1];
634 t_phi_f(
i) =
a * tou_0i(
i);
637 t_phi_f(
i) =
a * tou_0j(
i);
641 t_b(
j) = diff_beta_0ij(
j) * psi_l_0i[pp0] * psi_l_0j[pp1] +
642 beta_0ij * t_diff_psi_l_0i(
j) * psi_l_0j[pp1] +
643 beta_0ij * psi_l_0i[pp0] * t_diff_psi_l_0j(
j);
644 t_diff_phi_f(
i,
j) = t_b(
j) * tou_0i(
i);
646 t_diff_phi_f(
i,
j) = t_b(
j) * tou_0j(
i);
653 if (cc != nb_base_fun_on_face) {
655 "Wrong number of base functions %d != %d", cc,
656 nb_base_fun_on_face);
664 int *faces_nodes,
int p,
double *
N,
double *diffN,
double *phi_f,
665 double *diff_phi_f,
int nb_integration_pts,
666 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
667 double *
L,
double *diffL,
674 &diffN[2], &diffN[3], &zero,
675 &diffN[4], &diffN[5], &zero);
687 const int node0 = faces_nodes[0];
688 const int node1 = faces_nodes[1];
689 const int node2 = faces_nodes[2];
694 tou_0i(
i) = t_node_diff_ksi(N1,
i) - t_node_diff_ksi(N0,
i);
696 tou_0j(
i) = t_node_diff_ksi(N2,
i) - t_node_diff_ksi(N0,
i);
699 double psi_l_0i[p + 1], psi_l_0j[p + 1];
700 double diff_psi_l_0i[2 * p + 2], diff_psi_l_0j[2 * p + 2];
706 double diff_ksi_0i[] = {t_node_diff_ksi(node1, 0) - t_node_diff_ksi(node0, 0),
707 t_node_diff_ksi(node1, 1) -
708 t_node_diff_ksi(node0, 1)};
709 double diff_ksi_0j[] = {t_node_diff_ksi(node2, 0) - t_node_diff_ksi(node0, 0),
710 t_node_diff_ksi(node2, 1) -
711 t_node_diff_ksi(node0, 1)};
713 for (
int ii = 0; ii != nb_integration_pts; ii++) {
715 const int node_shift = ii * 3;
716 const double n0 =
N[node_shift + node0];
717 const double n1 =
N[node_shift + node1];
718 const double n2 =
N[node_shift + node2];
720 const double beta_0ij = n0 * n1 * n2;
722 t_node_diff_ksi(node0, 0) * n1 * n2 +
723 n0 * t_node_diff_ksi(node1, 0) * n2 +
724 n0 * n1 * t_node_diff_ksi(node2, 0),
725 t_node_diff_ksi(node0, 1) * n1 * n2 +
726 n0 * t_node_diff_ksi(node1, 1) * n2 +
727 n0 * n1 * t_node_diff_ksi(node2, 1));
729 const double ksi_0i =
N[node_shift + node1] -
N[node_shift + node0];
730 CHKERR base_polynomials(p, ksi_0i, diff_ksi_0i, psi_l_0i, diff_psi_l_0i, 2);
732 const double ksi_0j =
N[node_shift + node2] -
N[node_shift + node0];
733 CHKERR base_polynomials(p, ksi_0j, diff_ksi_0j, psi_l_0j, diff_psi_l_0j, 2);
737 for (
int oo = 0; oo <= (p - 3); oo++) {
738 for (
int pp0 = 0; pp0 <= oo; pp0++) {
739 const int pp1 = oo - pp0;
742 diff_psi_l_0i[0 + pp0], diff_psi_l_0i[p + 1 + pp0]);
744 diff_psi_l_0j[0 + pp1], diff_psi_l_0j[p + 1 + pp1]);
745 const double a = beta_0ij * psi_l_0i[pp0] * psi_l_0j[pp1];
746 t_diff_a(
j) = diff_beta_0ij(
j) * psi_l_0i[pp0] * psi_l_0j[pp1] +
747 beta_0ij * psi_l_0i[pp0] * t_diff_psi_l_0j(
j) +
748 beta_0ij * psi_l_0j[pp1] * t_diff_psi_l_0i(
j);
750 t_phi_f(
i) =
a * tou_0i(
i);
751 t_diff_phi_f(
i,
j) = tou_0i(
i) * t_diff_a(
j);
755 t_phi_f(
i) =
a * tou_0j(
i);
756 t_diff_phi_f(
i,
j) = tou_0j(
i) * t_diff_a(
j);
765 if (cc != nb_base_fun_on_face) {
767 "Wrong number of base functions %d != %d", cc,
768 nb_base_fun_on_face);
776 int *faces_nodes,
int p,
double *
N,
double *diffN,
double *phi_v,
777 double *diff_phi_v,
int nb_integration_pts,
778 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
779 double *
L,
double *diffL,
787 const int face_opposite_nodes[] = {2, 0, 1, 3};
804 double *psi_l_0i[] = {&m_psi_l_0i(0, 0), &m_psi_l_0i(1, 0), &m_psi_l_0i(2, 0),
806 double *psi_l_0j[] = {&m_psi_l_0j(0, 0), &m_psi_l_0j(1, 0), &m_psi_l_0j(2, 0),
808 double *diff_psi_l_0i[] = {&m_diff_psi_l_0i(0, 0), &m_diff_psi_l_0i(1, 0),
809 &m_diff_psi_l_0i(2, 0), &m_diff_psi_l_0i(3, 0)};
810 double *diff_psi_l_0j[] = {&m_diff_psi_l_0j(0, 0), &m_diff_psi_l_0j(1, 0),
811 &m_diff_psi_l_0j(2, 0), &m_diff_psi_l_0j(3, 0)};
818 &diff_phi_v[0], &diff_phi_v[3], &diff_phi_v[6], &diff_phi_v[1],
819 &diff_phi_v[4], &diff_phi_v[7], &diff_phi_v[2], &diff_phi_v[5],
822 for (
int ii = 0; ii != nb_integration_pts; ii++) {
824 for (
int ff = 0; ff != 4; ff++) {
826 t_diff_ksi0i(
i) = t_node_diff_ksi[faces_nodes[3 * ff + 1]](
i) -
827 t_node_diff_ksi[faces_nodes[3 * ff + 0]](
i);
828 t_diff_ksi0j(
i) = t_node_diff_ksi[faces_nodes[3 * ff + 2]](
i) -
829 t_node_diff_ksi[faces_nodes[3 * ff + 0]](
i);
831 const int node_shift = ii * 4;
833 beta_f[ff] =
N[node_shift + faces_nodes[3 * ff + 0]] *
834 N[node_shift + faces_nodes[3 * ff + 1]] *
835 N[node_shift + faces_nodes[3 * ff + 2]];
837 t_diff_beta_f[ff](
j) = t_node_diff_ksi[faces_nodes[3 * ff + 0]](
j) *
838 N[node_shift + faces_nodes[3 * ff + 1]] *
839 N[node_shift + faces_nodes[3 * ff + 2]] +
840 N[node_shift + faces_nodes[3 * ff + 0]] *
841 t_node_diff_ksi[faces_nodes[3 * ff + 1]](
j) *
842 N[node_shift + faces_nodes[3 * ff + 2]] +
843 N[node_shift + faces_nodes[3 * ff + 0]] *
844 N[node_shift + faces_nodes[3 * ff + 1]] *
845 t_node_diff_ksi[faces_nodes[3 * ff + 2]](
j);
847 const double ksi_0i =
N[node_shift + faces_nodes[3 * ff + 1]] -
848 N[node_shift + faces_nodes[3 * ff + 0]];
849 CHKERR base_polynomials(p, ksi_0i, &t_diff_ksi0i(0), psi_l_0i[ff],
850 diff_psi_l_0i[ff], 3);
852 const double ksi_0j =
N[node_shift + faces_nodes[3 * ff + 2]] -
853 N[node_shift + faces_nodes[3 * ff + 0]];
854 CHKERR base_polynomials(p, ksi_0j, &t_diff_ksi0j(0), psi_l_0j[ff],
855 diff_psi_l_0j[ff], 3);
859 for (
int oo = 0; oo <= (p - 3); oo++) {
862 &diff_psi_l_0i[0][p + 1],
863 &diff_psi_l_0i[0][2 * p + 2], 1),
865 &diff_psi_l_0i[1][p + 1],
866 &diff_psi_l_0i[1][2 * p + 2], 1),
868 &diff_psi_l_0i[2][p + 1],
869 &diff_psi_l_0i[2][2 * p + 2], 1),
871 &diff_psi_l_0i[3][p + 1],
872 &diff_psi_l_0i[3][2 * p + 2], 1),
874 for (
int pp0 = 0; pp0 <= oo; pp0++) {
875 const int pp1 = oo - pp0;
877 for (
int ff = 0; ff != 4; ff++) {
879 &m_diff_psi_l_0j(ff, pp1), &m_diff_psi_l_0j(ff, p + 1 + pp1),
880 &m_diff_psi_l_0j(ff, 2 * p + 2 + pp1), 1);
881 const double t = psi_l_0i[ff][pp0] * psi_l_0j[ff][pp1];
882 const double a = beta_f[ff] *
t;
883 t_phi_v(
i) =
a * t_node_diff_ksi[face_opposite_nodes[ff]](
i);
887 (t_diff_beta_f[ff](
j) *
t +
888 beta_f[ff] * t_diff_psi_l_0i[ff](
j) * psi_l_0j[ff][pp1] +
889 beta_f[ff] * psi_l_0i[ff][pp0] * t_diff_psi_l_0j(
j)) *
890 t_node_diff_ksi[face_opposite_nodes[ff]](
i);
892 ++t_diff_psi_l_0i[ff];
899 if (cc != nb_base_fun_on_face) {
901 "Wrong number of base functions %d != %d", cc,
902 nb_base_fun_on_face);
910 int p,
double *
N,
double *diffN,
double *phi_v,
double *diff_phi_v,
911 int nb_integration_pts,
912 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
913 double *
L,
double *diffL,
933 double diff_ksi0i[3], diff_ksi0j[3], diff_ksi0k[3];
940 t_diff_ksi0i(
i) = t_node_diff_ksi[1](
i) - t_node_diff_ksi[0](
i);
941 t_diff_ksi0j(
i) = t_node_diff_ksi[2](
i) - t_node_diff_ksi[0](
i);
942 t_diff_ksi0k(
i) = t_node_diff_ksi[3](
i) - t_node_diff_ksi[0](
i);
944 std::vector<double> v_psi_l_0i(p + 1), v_diff_psi_l_0i(3 * p + 3);
945 std::vector<double> v_psi_l_0j(p + 1), v_diff_psi_l_0j(3 * p + 3);
946 std::vector<double> v_psi_l_0k(p + 1), v_diff_psi_l_0k(3 * p + 3);
947 double *psi_l_0i = &*v_psi_l_0i.begin();
948 double *diff_psi_l_0i = &*v_diff_psi_l_0i.begin();
949 double *psi_l_0j = &*v_psi_l_0j.begin();
950 double *diff_psi_l_0j = &*v_diff_psi_l_0j.begin();
951 double *psi_l_0k = &*v_psi_l_0k.begin();
952 double *diff_psi_l_0k = &*v_diff_psi_l_0k.begin();
956 &diff_phi_v[0], &diff_phi_v[3], &diff_phi_v[6], &diff_phi_v[1],
957 &diff_phi_v[4], &diff_phi_v[7], &diff_phi_v[2], &diff_phi_v[5],
961 for (
int ii = 0; ii != nb_integration_pts; ii++) {
963 const int node_shift = ii * 4;
964 const int n0 = node_shift + 0;
965 const int n1 = node_shift + 1;
966 const int n2 = node_shift + 2;
967 const int n3 = node_shift + 3;
969 const double beta_v =
N[n0] *
N[n1] *
N[n2] *
N[n3];
971 const double ksi_0i =
N[n1] -
N[n0];
972 CHKERR base_polynomials(p, ksi_0i, diff_ksi0i, psi_l_0i, diff_psi_l_0i, 3);
974 const double ksi_0j =
N[n2] -
N[n0];
975 CHKERR base_polynomials(p, ksi_0j, diff_ksi0j, psi_l_0j, diff_psi_l_0j, 3);
977 const double ksi_0k =
N[n3] -
N[n0];
978 CHKERR base_polynomials(p, ksi_0k, diff_ksi0k, psi_l_0k, diff_psi_l_0k, 3);
981 t_diff_beta_v(
j) = t_node_diff_ksi[0](
j) *
N[n1] *
N[n2] *
N[n3] +
982 N[n0] * t_node_diff_ksi[1](
j) *
N[n2] *
N[n3] +
983 N[n0] *
N[n1] * t_node_diff_ksi[2](
j) *
N[n3] +
984 N[n0] *
N[n1] *
N[n2] * t_node_diff_ksi[3](
j);
987 for (
int oo = 0; oo <= (p - 4); oo++) {
989 &diff_psi_l_0i[0], &diff_psi_l_0i[p + 1], &diff_psi_l_0i[2 * p + 2],
991 for (
int pp0 = 0; pp0 <= oo; pp0++) {
993 &diff_psi_l_0j[0], &diff_psi_l_0j[p + 1], &diff_psi_l_0j[2 * p + 2],
995 for (
int pp1 = 0; (pp0 + pp1) <= oo; pp1++) {
996 const int pp2 = oo - pp0 - pp1;
999 &diff_psi_l_0k[0 + pp2], &diff_psi_l_0k[p + 1 + pp2],
1000 &diff_psi_l_0k[2 * p + 2 + pp2], 1);
1001 const double t = psi_l_0i[pp0] * psi_l_0j[pp1] * psi_l_0k[pp2];
1002 const double a = beta_v *
t;
1019 t_diff_beta_v(
j) *
t +
1020 beta_v * (t_diff_psi_l_0i(
j) * psi_l_0j[pp1] * psi_l_0k[pp2] +
1021 psi_l_0i[pp0] * t_diff_psi_l_0j(
j) * psi_l_0k[pp2] +
1022 psi_l_0i[pp0] * psi_l_0j[pp1] * t_diff_psi_l_0k(
j));
1023 t_diff_phi_v(N0,
j) = t_b(
j);
1024 t_diff_phi_v(N1,
j) = 0;
1025 t_diff_phi_v(N2,
j) = 0;
1027 t_diff_phi_v(N0,
j) = 0;
1028 t_diff_phi_v(N1,
j) = t_b(
j);
1029 t_diff_phi_v(N2,
j) = 0;
1031 t_diff_phi_v(N0,
j) = 0;
1032 t_diff_phi_v(N1,
j) = 0;
1033 t_diff_phi_v(N2,
j) = t_b(
j);
1043 if (cc != nb_base_fun_on_face) {
1045 "Wrong number of base functions %d != %d", cc,
1046 nb_base_fun_on_face);
1053 int *face_nodes,
int *p,
double *
N,
double *diffN,
double *phi_f[4],
1054 double *diff_phi_f[4],
int nb_integration_pts,
1055 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
1056 double *
L,
double *diffL,
1065 double *phi_f_e[4][3];
1066 double *diff_phi_f_e[4][3];
1067 for (
int ff = 0; ff != 4; ff++) {
1069 for (
int ee = 0; ee != 3; ee++) {
1070 phi_f_e[ff][ee] = NULL;
1071 diff_phi_f_e[ff][ee] = NULL;
1074 base_face_edge_functions[ff].resize(
1076 diff_base_face_edge_functions[ff].resize(
1080 for (
int ee = 0; ee != 3; ee++) {
1081 phi_f_e[ff][ee] = &base_face_edge_functions[ff](ee, 0);
1082 diff_phi_f_e[ff][ee] = &diff_base_face_edge_functions[ff](ee, 0);
1087 face_nodes, p,
N, diffN, phi_f_e, diff_phi_f_e, nb_integration_pts,
1093 double *diff_phi_f_f[4];
1094 for (
int ff = 0; ff != 4; ff++) {
1098 diff_phi_f_f[ff] = NULL;
1100 base_face_bubble_functions[ff].resize(3 * nb_dofs * nb_integration_pts,
1102 diff_base_face_bubble_functions[ff].resize(
1103 9 * nb_dofs * nb_integration_pts,
false);
1104 phi_f_f[ff] = &*base_face_bubble_functions[ff].data().begin();
1105 diff_phi_f_f[ff] = &*diff_base_face_bubble_functions[ff].data().begin();
1109 face_nodes, p,
N, diffN, phi_f_f, diff_phi_f_f, nb_integration_pts,
1115 for (
int ff = 0; ff != 4; ff++) {
1122 &phi_f_e[ff][0][2], 3),
1124 &phi_f_e[ff][1][2], 3),
1126 &phi_f_e[ff][2][2], 3)};
1129 &diff_phi_f_e[ff][0][0], &diff_phi_f_e[ff][0][3],
1130 &diff_phi_f_e[ff][0][6], &diff_phi_f_e[ff][0][1],
1131 &diff_phi_f_e[ff][0][4], &diff_phi_f_e[ff][0][7],
1132 &diff_phi_f_e[ff][0][2], &diff_phi_f_e[ff][0][5],
1133 &diff_phi_f_e[ff][0][8], 9),
1135 &diff_phi_f_e[ff][1][0], &diff_phi_f_e[ff][1][3],
1136 &diff_phi_f_e[ff][1][6], &diff_phi_f_e[ff][1][1],
1137 &diff_phi_f_e[ff][1][4], &diff_phi_f_e[ff][1][7],
1138 &diff_phi_f_e[ff][1][2], &diff_phi_f_e[ff][1][5],
1139 &diff_phi_f_e[ff][1][8], 9),
1141 &diff_phi_f_e[ff][2][0], &diff_phi_f_e[ff][2][3],
1142 &diff_phi_f_e[ff][2][6], &diff_phi_f_e[ff][2][1],
1143 &diff_phi_f_e[ff][2][4], &diff_phi_f_e[ff][2][7],
1144 &diff_phi_f_e[ff][2][2], &diff_phi_f_e[ff][2][5],
1145 &diff_phi_f_e[ff][2][8], 9)};
1150 &diff_phi_f[ff][0], &diff_phi_f[ff][3], &diff_phi_f[ff][6],
1151 &diff_phi_f[ff][1], &diff_phi_f[ff][4], &diff_phi_f[ff][7],
1152 &diff_phi_f[ff][2], &diff_phi_f[ff][5], &diff_phi_f[ff][8], 9);
1156 &phi_f_f[ff][0], &phi_f_f[ff][1], &phi_f_f[ff][2], 3);
1158 &diff_phi_f_f[ff][0], &diff_phi_f_f[ff][3], &diff_phi_f_f[ff][6],
1159 &diff_phi_f_f[ff][1], &diff_phi_f_f[ff][4], &diff_phi_f_f[ff][7],
1160 &diff_phi_f_f[ff][2], &diff_phi_f_f[ff][5], &diff_phi_f_f[ff][8],
1162 for (
int ii = 0; ii != nb_integration_pts; ii++) {
1164 for (
int oo = 0; oo <= p[ff]; oo++) {
1167 for (
int ee = 0; ee != 3; ee++) {
1170 t_face_base(
i) = t_face_edge_base[ee](
i);
1173 ++t_face_edge_base[ee];
1174 t_diff_face_base(
i,
j) = t_diff_face_edge_base[ee](
i,
j);
1176 ++t_diff_face_edge_base[ee];
1186 t_face_base(
i) = t_face_face_base(
i);
1190 t_diff_face_base(
i,
j) = t_diff_face_face_base(
i,
j);
1192 ++t_diff_face_face_base;
1198 if (cc != nb_base_fun_on_face) {
1200 "Wrong number of base functions %d != %d", cc,
1201 nb_base_fun_on_face);
1205 for (
int ii = 0; ii != nb_integration_pts; ii++) {
1207 for (
int oo = 0; oo <= p[ff]; oo++) {
1210 for (
int ee = 0; ee != 3; ee++) {
1213 t_face_base(
i) = t_face_edge_base[ee](
i);
1216 ++t_face_edge_base[ee];
1217 t_diff_face_base(
i,
j) = t_diff_face_edge_base[ee](
i,
j);
1219 ++t_diff_face_edge_base[ee];
1228 if (cc != nb_base_fun_on_face) {
1230 "Wrong number of base functions %d != %d", cc,
1231 nb_base_fun_on_face);
1239 }
catch (std::exception &ex) {
1240 std::ostringstream ss;
1241 ss <<
"thorw in method: " << ex.what() <<
" at line " << __LINE__
1242 <<
" in file " << __FILE__;
1250 int *faces_nodes,
int p,
double *
N,
double *diffN,
double *phi_f,
1251 double *diff_phi_f,
int nb_integration_pts,
1252 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
1253 double *
L,
double *diffL,
1261 MatrixDouble base_face_edge_functions, diff_base_face_edge_functions;
1263 double *diff_phi_f_e[3];
1265 nb_integration_pts);
1266 diff_base_face_edge_functions.resize(
1269 for (
int ee = 0; ee != 3; ee++) {
1270 phi_f_e[ee] = &base_face_edge_functions(ee, 0);
1271 diff_phi_f_e[ee] = &diff_base_face_edge_functions(ee, 0);
1274 faces_nodes, p,
N, diffN, phi_f_e, diff_phi_f_e, nb_integration_pts,
1279 double *phi_f_f, *diff_phi_f_f;
1281 nb_integration_pts);
1282 diff_base_face_bubble_functions.resize(
1284 phi_f_f = &*base_face_bubble_functions.data().begin();
1285 diff_phi_f_f = &*diff_base_face_bubble_functions.data().begin();
1287 faces_nodes, p,
N, diffN, phi_f_f, diff_phi_f_f, nb_integration_pts,
1297 &phi_f_e[0][
HVEC2], 3),
1299 &phi_f_e[1][
HVEC2], 3),
1301 &phi_f_e[2][
HVEC2], 3)};
1303 t_diff_face_edge_base[] = {
1328 for (
int ii = 0; ii != nb_integration_pts; ii++) {
1330 for (
int oo = 0; oo <= p; oo++) {
1333 for (
int ee = 0; ee != 3; ee++) {
1336 t_face_base(
i) = t_face_edge_base[ee](
i);
1337 t_diff_face_base(
i,
j) = t_diff_face_edge_base[ee](
i,
j);
1340 ++t_face_edge_base[ee];
1342 ++t_diff_face_edge_base[ee];
1350 t_face_base(
i) = t_face_face_base(
i);
1351 t_diff_face_base(
i,
j) = t_diff_face_face_base(
i,
j);
1356 ++t_diff_face_face_base;
1362 if (cc != nb_base_fun_on_face) {
1364 "Wrong number of base functions %d != %d", cc,
1365 nb_base_fun_on_face);
1369 for (
int ii = 0; ii != nb_integration_pts; ii++) {
1371 for (
int oo = 0; oo <= p; oo++) {
1374 for (
int ee = 0; ee != 3; ee++) {
1377 t_face_base(
i) = t_face_edge_base[ee](
i);
1378 t_diff_face_base(
i,
j) = t_diff_face_edge_base[ee](
i,
j);
1381 ++t_face_edge_base[ee];
1383 ++t_diff_face_edge_base[ee];
1392 if (cc != nb_base_fun_on_face) {
1394 "Wrong number of base functions %d != %d", cc,
1395 nb_base_fun_on_face);
1404 int p,
double *
N,
double *diffN,
double *phi_v,
double *diff_phi_v,
1405 int nb_integration_pts,
1406 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
1407 double *
L,
double *diffL,
1418 double *phi_v_f = &*base_face_inetrior_functions.data().begin();
1419 double *diff_phi_v_f = &*diff_base_face_inetrior_functions.data().begin();
1420 int faces_nodes[] = {0, 1, 3, 1, 2, 3, 0, 2, 3, 0, 1, 2};
1422 faces_nodes, p,
N, diffN, phi_v_f, diff_phi_v_f, nb_integration_pts,
1426 nb_integration_pts);
1431 double *phi_v_v = &*base_interior_functions.data().begin();
1432 double *diff_phi_v_v = &*diff_base_interior_functions.data().begin();
1434 p,
N, diffN, phi_v_v, diff_phi_v_v, nb_integration_pts, base_polynomials);
1442 &diff_phi_v_f[0], &diff_phi_v_f[3], &diff_phi_v_f[6], &diff_phi_v_f[1],
1443 &diff_phi_v_f[4], &diff_phi_v_f[7], &diff_phi_v_f[2], &diff_phi_v_f[5],
1444 &diff_phi_v_f[8], 9);
1448 &diff_phi_v[0], &diff_phi_v[3], &diff_phi_v[6], &diff_phi_v[1],
1449 &diff_phi_v[4], &diff_phi_v[7], &diff_phi_v[2], &diff_phi_v[5],
1456 &diff_phi_v_v[0], &diff_phi_v_v[3], &diff_phi_v_v[6], &diff_phi_v_v[1],
1457 &diff_phi_v_v[4], &diff_phi_v_v[7], &diff_phi_v_v[2], &diff_phi_v_v[5],
1458 &diff_phi_v_v[8], 9);
1459 for (
int ii = 0; ii != nb_integration_pts; ii++) {
1461 for (
int oo = 0; oo <= p; oo++) {
1464 t_phi_v(
i) = t_face_interior(
i);
1468 t_diff_phi_v(
i,
j) = t_diff_face_interior(
i,
j);
1470 ++t_diff_face_interior;
1474 t_phi_v(
i) = t_volume_interior(
i);
1476 ++t_volume_interior;
1478 t_diff_phi_v(
i,
j) = t_diff_volume_interior(
i,
j);
1480 ++t_diff_volume_interior;
1485 if (cc != nb_base_fun_on_face) {
1487 "Wrong number of base functions %d != %d", cc,
1488 nb_base_fun_on_face);
1492 for (
int ii = 0; ii != nb_integration_pts; ii++) {
1494 for (
int oo = 0; oo <= p; oo++) {
1497 t_phi_v(
i) = t_face_interior(
i);
1501 t_diff_phi_v(
i,
j) = t_diff_face_interior(
i,
j);
1503 ++t_diff_face_interior;
1508 if (cc != nb_base_fun_on_face) {
1510 "Wrong number of base functions %d != %d", cc,
1511 nb_base_fun_on_face);
1521#ifdef GENERATE_VTK_WITH_CURL_BASE
1525using namespace MoFEM;
1526using namespace boost::numeric;
1528MoFEMErrorCode VTK_Ainsworth_Hcurl_MBTET(
const string file_name) {
1531 double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
1533 moab::Core core_ref;
1534 moab::Interface &moab_ref = core_ref;
1537 for (
int nn = 0; nn < 4; nn++) {
1538 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
1541 CHKERR moab_ref.create_element(MBTET, nodes, 4, tet);
1549 const int max_level = 4;
1550 for (
int ll = 0; ll != max_level; ll++) {
1553 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
1557 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
1562 CHKERR m_ref->addVerticesInTheMiddleOfEdges(edges,
1569 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(max_level),
1576 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
1577 CHKERR moab_ref.add_entities(meshset, tets);
1578 CHKERR moab_ref.convert_entities(meshset,
true,
false,
false);
1579 CHKERR moab_ref.delete_entities(&meshset, 1);
1583 CHKERR moab_ref.get_connectivity(tets, elem_nodes,
false);
1585 const int nb_gauss_pts = elem_nodes.size();
1588 Range::iterator nit = elem_nodes.begin();
1589 for (
int gg = 0; nit != elem_nodes.end(); nit++, gg++) {
1590 CHKERR moab_ref.get_coords(&*nit, 1, &gauss_pts(gg, 0));
1592 gauss_pts = trans(gauss_pts);
1595 shape_fun.resize(nb_gauss_pts, 4);
1597 &gauss_pts(1, 0), &gauss_pts(2, 0), nb_gauss_pts);
1599 double diff_shape_fun[12];
1603 const int order = 5;
1605 double def_val[] = {0, 0, 0, 0, 0, 0};
1607 int faces_nodes[] = {0, 1, 3, 1, 2, 3, 0, 2, 3, 0, 1, 2};
1751 cout <<
"NBFACETRI_AINSWORTH_FACE_HCURL "
1758 double *diff_phi_f[4];
1759 for (
int ff = 0; ff != 4; ff++) {
1760 phi_f[ff] = &base_face_bubble_functions(ff, 0);
1761 diff_phi_f[ff] = &diff_base_face_bubble_functions(ff, 0);
1765 faces_nodes, faces_order, &*shape_fun.data().begin(), diff_shape_fun,
1768 for (
int ff = 0; ff != 4; ff++) {
1770 std::ostringstream ss;
1771 ss <<
"curl_face_bubble_" << ff <<
"_" << ll;
1773 CHKERR moab_ref.tag_get_handle(ss.str().c_str(), 3, MB_TYPE_DOUBLE,
th,
1774 MB_TAG_CREAT | MB_TAG_SPARSE, def_val);
1775 std::ostringstream grad_ss;
1776 grad_ss <<
"grad_curl_face_bubble_" << ff <<
"_" << ll;
1778 CHKERR moab_ref.tag_get_handle(grad_ss.str().c_str(), 9, MB_TYPE_DOUBLE,
1779 th_grad, MB_TAG_CREAT | MB_TAG_SPARSE,
1783 for (Range::iterator nit = elem_nodes.begin(); nit != elem_nodes.end();
1786 CHKERR moab_ref.tag_set_data(
th, &*nit, 1, &(phi_f[ff][idx]));
1788 double grad[9] = {diff_phi_f[ff][sh + 0], diff_phi_f[ff][sh + 3],
1789 diff_phi_f[ff][sh + 6], diff_phi_f[ff][sh + 1],
1790 diff_phi_f[ff][sh + 4], diff_phi_f[ff][sh + 7],
1791 diff_phi_f[ff][sh + 2], diff_phi_f[ff][sh + 5],
1792 diff_phi_f[ff][sh + 8]};
1793 CHKERR moab_ref.tag_set_data(th_grad, &*nit, 1, grad);
1967 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
1968 CHKERR moab_ref.add_entities(meshset, tets);
1969 CHKERR moab_ref.write_file(file_name.c_str(),
"VTK",
"", &meshset, 1);
1976#ifndef GENERATE_VTK_WITH_CURL_BASE
1989 template <
int DIM,
bool CALCULATE_DIRVATIVES,
typename TPhi,
1992 calculate(
int p,
int nb_integration_pts,
int n0_idx,
int n1_idx,
double n[],
1994 TPhi &t_phi, TDiffPhi *t_diff_phi_ptr) {
2010 for (
int gg = 0; gg != nb_integration_pts; ++gg) {
2012 const int shift_n = (DIM + 1) * gg;
2013 const double n0 =
n[shift_n + n0_idx];
2014 const double n1 =
n[shift_n + n1_idx];
2016 tPhi0(
i) = n0 * t_grad_n1(
i) - n1 * t_grad_n0(
i);
2021 if constexpr (CALCULATE_DIRVATIVES) {
2024 t_grad_n0(
j) * t_grad_n1(
i) - t_grad_n1(
j) * t_grad_n0(
i);
2025 (*t_diff_phi_ptr)(
i,
j) = t_diff_phi0(
i,
j);
2026 ++(*t_diff_phi_ptr);
2031 if constexpr (CALCULATE_DIRVATIVES)
2034 &*
diffFi.data().begin(), DIM);
2037 &*
fI.data().begin(),
nullptr, DIM);
2042 for (
int oo = 1; oo <= p - 1; ++oo) {
2044 const double b = pow(n0 + n1, oo);
2047 if constexpr (CALCULATE_DIRVATIVES) {
2050 oo * pow(n0 + n1, oo - 1) * (t_grad_n0(
i) + t_grad_n1(
i));
2051 (*t_diff_phi_ptr)(
i,
j) = (b *
fI[oo]) * t_diff_phi0(
i,
j) +
2052 (b * t_diff_fi(
j)) *
tPhi0(
i) +
2055 ++(*t_diff_phi_ptr);
2066 template <
int DIM,
bool CALCULATE_DIRVATIVES,
typename TPhi>
2068 calculate(
int p,
int nb_integration_pts,
int n0_idx,
int n1_idx,
double n[],
2070 TPhi &t_phi, std::nullptr_t) {
2071 static_assert(!CALCULATE_DIRVATIVES,
2072 "nullptr diff tensor is only valid when derivatives are off");
2073 return calculate<DIM, CALCULATE_DIRVATIVES, TPhi, double>(
2074 p, nb_integration_pts, n0_idx, n1_idx,
n, t_grad_n, t_phi,
2075 static_cast<double *
>(
nullptr));
2080 int *sense,
int *p,
double *
n,
double *diff_n,
double *
phi[],
2081 double *diff_phi[],
int nb_integration_pts) {
2083 constexpr int e_nodes[6][2] = {{0, 1}, {1, 2}, {2, 0},
2084 {0, 3}, {1, 3}, {2, 3}};
2089 for (
int nn = 0; nn != 4; ++nn)
2091 diff_n[3 * nn + 0], diff_n[3 * nn + 1], diff_n[3 * nn + 2]);
2095 for (
int ee = 0; ee != 6; ++ee) {
2097 auto t_phi = getFTensor1FromPtr<3>(
phi[ee]);
2100 int n0_idx = e_nodes[ee][0];
2101 int n1_idx = e_nodes[ee][1];
2102 if (sense[ee] == -1) {
2108 CHKERR h_curl_base_on_edge.
calculate<3,
true>(p[ee], nb_integration_pts,
2109 n0_idx, n1_idx,
n, t_grad_n,
2110 t_phi, &t_diff_phi);
2117 int *sense,
int *p,
double *
n,
double *diff_n,
double *
phi[],
2118 double *diff_phi[],
int nb_integration_pts) {
2120 constexpr int e_nodes[3][2] = {{0, 1}, {1, 2}, {2, 0}};
2125 for (
int nn = 0; nn != 3; ++nn)
2131 for (
int ee = 0; ee != 3; ++ee) {
2135 auto t_phi = getFTensor1FromPtr<3>(
phi[ee]);
2138 int n0_idx = e_nodes[ee][0];
2139 int n1_idx = e_nodes[ee][1];
2140 if (sense[ee] == -1) {
2146 CHKERR h_curl_base_on_edge.
calculate<2,
true>(p[ee], nb_integration_pts,
2147 n0_idx, n1_idx,
n, t_grad_n,
2148 t_phi, &t_diff_phi);
2156 int sense,
int p,
double *
n,
double *diff_n,
double *
phi,
double *diff_phi,
2157 int nb_integration_pts) {
2161 for (
int nn = 0; nn != 2; ++nn)
2169 if (diff_phi != NULL)
2171 "Not implemented derivatives for edge for Hcurl Demkowicz base");
2182 p, nb_integration_pts, n0_idx, n1_idx,
n, t_grad_n, t_phi,
nullptr);
2196 template <
int DIM,
typename TPhi,
typename TDiffPhi>
2198 int p,
int nb_integration_pts,
int n0f0_idx,
int n1f0_idx,
int n2f0_idx,
2200 TPhi &t_phi, TDiffPhi &t_diff_phi) {
2210 double *f0_phi_ii = &*
f0PhiII.data().begin();
2211 double *diff_f0_phi_ii = &*
diffF0PhiII.data().begin();
2212 auto t_f0_phi_ii = getFTensor1FromPtr<3>(f0_phi_ii);
2213 auto t_diff_f0_phi_ii = getFTensor2FromPtr<3, DIM>(diff_f0_phi_ii);
2216 n0f0_idx, n1f0_idx,
n, t_grad_n,
2217 t_f0_phi_ii, &t_diff_f0_phi_ii);
2223 t_grad_n0f0_p_n1f0(
i) = t_grad_n0f0(
i) + t_grad_n1f0(
i) + t_grad_n2f0(
i);
2225 iFiF0.resize(p + 1,
false);
2229 double *ifif0 = &*
iFiF0.data().begin();
2230 double *diff_ifif0 = &*
diffIFiF0.data().begin();
2232 for (
int gg = 0; gg != nb_integration_pts; ++gg) {
2234 const int shift_n = (DIM + 1) * gg;
2235 const double n0f0 =
n[shift_n + n0f0_idx];
2236 const double n1f0 =
n[shift_n + n1f0_idx];
2237 const double n2f0 =
n[shift_n + n2f0_idx];
2242 for (
int oo = 2; oo <= p; ++oo) {
2244 auto t_f0_phi_ii = getFTensor1FromPtr<3>(&f0_phi_ii[phi_shift]);
2245 auto t_diff_f0_phi_ii =
2246 getFTensor2FromPtr<3, DIM>(&diff_f0_phi_ii[diff_phi_shift]);
2248 for (
int ii = 0; ii <= oo - 2; ii++) {
2250 int jj = oo - 2 - ii;
2254 jj + 1, 2 * ii + 1, n2f0, n0f0 + n1f0 + n2f0, &t_grad_n2f0(0),
2255 &t_grad_n0f0_p_n1f0(0), ifif0, diff_ifif0, DIM);
2257 diff_ifif0[0 + jj], diff_ifif0[(jj + 1) + jj],
2258 diff_ifif0[2 * (jj + 1) + jj]);
2259 t_phi(
i) = ifif0[jj] * t_f0_phi_ii(
i);
2260 t_diff_phi(
i,
j) = ifif0[jj] * t_diff_f0_phi_ii(
i,
j) +
2261 t_diff_ifif0(
j) * t_f0_phi_ii(
i);
2273 template <
int DIM,
typename TPhi,
typename TDiffPhi>
2276 int n2f0_idx,
int n0f1_idx,
int n1f1_idx,
int n2f1_idx,
2278 TPhi &t_phi, TDiffPhi &t_diff_phi) {
2292 double *f0_phi_ii = &*
f0PhiII.data().begin();
2293 double *diff_f0_phi_ii = &*
diffF0PhiII.data().begin();
2294 auto t_f0_phi_ii = getFTensor1FromPtr<3>(f0_phi_ii);
2295 auto t_diff_f0_phi_ii = getFTensor2FromPtr<3, DIM>(diff_f0_phi_ii);
2297 n0f0_idx, n1f0_idx,
n, t_grad_n,
2298 t_f0_phi_ii, &t_diff_f0_phi_ii);
2301 double *f1_phi_ii = &*
f1PhiII.data().begin();
2302 double *diff_f1_phi_ii = &*
diffF1PhiII.data().begin();
2303 auto t_f1_phi_ii = getFTensor1FromPtr<3>(f1_phi_ii);
2304 auto t_diff_f1_phi_ii = getFTensor2FromPtr<3, DIM>(diff_f1_phi_ii);
2306 n0f1_idx, n1f1_idx,
n, t_grad_n,
2307 t_f1_phi_ii, &t_diff_f1_phi_ii);
2313 t_grad_n0f0_p_n1f0(
i) = t_grad_n0f0(
i) + t_grad_n1f0(
i);
2319 t_grad_n0f1_p_n1f1(
i) = t_grad_n0f1(
i) + t_grad_n1f1(
i);
2321 iFiF0.resize(p + 1,
false);
2324 double *ifif0 = &*
iFiF0.data().begin();
2325 double *diff_ifif0 = &*
diffIFiF0.data().begin();
2326 iFiF1.resize(p + 1,
false);
2329 double *ifif1 = &*
iFiF1.data().begin();
2330 double *diff_ifif1 = &*
diffIFiF1.data().begin();
2332 for (
int gg = 0; gg != nb_integration_pts; ++gg) {
2334 const int shift_n = (DIM + 1) * gg;
2335 const double n0f0 =
n[shift_n + n0f0_idx];
2336 const double n1f0 =
n[shift_n + n1f0_idx];
2337 const double n2f0 =
n[shift_n + n2f0_idx];
2338 const double n0f1 =
n[shift_n + n0f1_idx];
2339 const double n1f1 =
n[shift_n + n1f1_idx];
2340 const double n2f1 =
n[shift_n + n2f1_idx];
2346 for (
int oo = 2; oo <= p; ++oo) {
2348 auto t_f0_phi_ii = getFTensor1FromPtr<3>(&f0_phi_ii[phi_shift]);
2349 auto t_diff_f0_phi_ii =
2350 getFTensor2FromPtr<3, DIM>(&diff_f0_phi_ii[diff_phi_shift]);
2351 auto t_f1_phi_ii = getFTensor1FromPtr<3>(&f1_phi_ii[phi_shift]);
2352 auto t_diff_f1_phi_ii =
2353 getFTensor2FromPtr<3, DIM>(&diff_f1_phi_ii[diff_phi_shift]);
2355 for (
int ii = 0; ii <= oo - 2; ii++) {
2357 int jj = oo - 2 - ii;
2361 jj + 1, 2 * ii + 1, n2f0, n0f0 + n1f0, &t_grad_n2f0(0),
2362 &t_grad_n0f0_p_n1f0(0), ifif0, diff_ifif0, 3);
2364 diff_ifif0[0 + jj], diff_ifif0[(jj + 1) + jj],
2365 diff_ifif0[2 * (jj + 1) + jj]);
2367 t_phi(
i) = ifif0[jj] * t_f0_phi_ii(
i);
2368 t_diff_phi(
i,
j) = ifif0[jj] * t_diff_f0_phi_ii(
i,
j) +
2369 t_diff_ifif0(
j) * t_f0_phi_ii(
i);
2379 jj + 1, 2 * ii + 1, n2f1, n0f1 + n1f1, &t_grad_n2f1(0),
2380 &t_grad_n0f1_p_n1f1(0), ifif1, diff_ifif1, 3);
2382 diff_ifif1[0 + jj], diff_ifif1[(jj + 1) + jj],
2383 diff_ifif1[2 * (jj + 1) + jj]);
2384 t_phi(
i) = ifif1[jj] * t_f1_phi_ii(
i);
2385 t_diff_phi(
i,
j) = ifif1[jj] * t_diff_f1_phi_ii(
i,
j) +
2386 t_diff_ifif1(
j) * t_f1_phi_ii(
i);
2396 "Wrong number of base functions");
2403 int *faces_nodes,
int *p,
double *
n,
double *diff_n,
double *
phi[],
2404 double *diff_phi[],
int nb_integration_pts) {
2408 for (
int nn = 0; nn != 4; ++nn) {
2410 diff_n[3 * nn + 0], diff_n[3 * nn + 1], diff_n[3 * nn + 2]);
2415 for (
int ff = 0; ff != 4; ++ff) {
2419 auto t_phi = getFTensor1FromPtr<3>(
phi[ff]);
2423 const int n0f0_idx = faces_nodes[3 * ff + 0];
2424 const int n1f0_idx = faces_nodes[3 * ff + 1];
2425 const int n2f0_idx = faces_nodes[3 * ff + 2];
2427 const int n0f1_idx = faces_nodes[3 * ff + 1];
2428 const int n1f1_idx = faces_nodes[3 * ff + 2];
2429 const int n2f1_idx = faces_nodes[3 * ff + 0];
2432 p[ff], nb_integration_pts, n0f0_idx, n1f0_idx, n2f0_idx, n0f1_idx,
2433 n1f1_idx, n2f1_idx,
n, t_grad_n, t_phi, t_diff_phi);
2441 int *faces_nodes,
int p,
double *
n,
double *diff_n,
double *
phi,
2442 double *diff_phi,
int nb_integration_pts) {
2446 for (
int nn = 0; nn != 3; ++nn) {
2455 auto t_phi = getFTensor1FromPtr<3>(
phi);
2459 const int n0f0_idx = faces_nodes[0];
2460 const int n1f0_idx = faces_nodes[1];
2461 const int n2f0_idx = faces_nodes[2];
2463 const int n0f1_idx = faces_nodes[1];
2464 const int n1f1_idx = faces_nodes[2];
2465 const int n2f1_idx = faces_nodes[0];
2468 p, nb_integration_pts, n0f0_idx, n1f0_idx, n2f0_idx, n0f1_idx, n1f1_idx,
2469 n2f1_idx,
n, t_grad_n, t_phi, t_diff_phi);
2476 int p,
double *
n,
double *diff_n,
double *
phi,
double *diff_phi,
2477 int nb_integration_pts) {
2479 constexpr int family[3][4] = {{0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}};
2487 auto t_phi = getFTensor1FromPtr<3>(
phi);
2491 for (
int nn = 0; nn != 4; ++nn) {
2493 diff_n[3 * nn + 0], diff_n[3 * nn + 1], diff_n[3 * nn + 2]);
2497 MatrixDouble phi_ij(3, 3 * nb_face_functions * nb_integration_pts);
2498 MatrixDouble diff_phi_ij(3, 9 * nb_face_functions * nb_integration_pts);
2504 for (
int ff = 0; ff != 3; ++ff) {
2505 double *phi_ij_ptr = &phi_ij(ff, 0);
2506 double *diff_phi_ij_ptr = &diff_phi_ij(ff, 0);
2508 auto t_phi_ij = getFTensor1FromPtr<3>(phi_ij_ptr);
2511 const int n0_idx = family[ff][0];
2512 const int n1_idx = family[ff][1];
2513 const int n2_idx = family[ff][2];
2516 p - 1, nb_integration_pts, n0_idx, n1_idx, n2_idx,
n, t_grad_n,
2517 t_phi_ij, t_diff_phi_ij);
2525 t_sum_f0(
i) = -t_grad_n3f0(
i);
2527 t_sum_f1(
i) = -t_grad_n3f1(
i);
2529 t_sum_f2(
i) = -t_grad_n3f2(
i);
2531 for (
int gg = 0; gg != nb_integration_pts; ++gg) {
2533 int shift_n = 4 * gg;
2535 double n3f0 =
n[shift_n + family[0][3]];
2536 double n3f1 =
n[shift_n + family[1][3]];
2537 double n3f2 =
n[shift_n + family[2][3]];
2540 for (
int oo = 3; oo <= p; ++oo) {
2542 int phi_shift = 3 * nb_face_functions * gg;
2543 int diff_phi_shift = 9 * nb_face_functions * gg;
2545 auto t_phi_face_f0 = getFTensor1FromPtr<3>(&phi_ij(0, phi_shift));
2546 auto t_diff_phi_face_f0 =
2548 auto t_phi_face_f1 = getFTensor1FromPtr<3>(&phi_ij(1, phi_shift));
2549 auto t_diff_phi_face_f1 =
2551 auto t_phi_face_f2 = getFTensor1FromPtr<3>(&phi_ij(2, phi_shift));
2552 auto t_diff_phi_face_f2 =
2556 for (
int oo_ij = 2; oo_ij != oo; ++oo_ij) {
2560 &t_grad_n3f0(0), &t_sum_f0(0),
2561 &fi_k(0, 0), &diff_fi_k(0, 0), 3);
2563 &t_grad_n3f1(0), &t_sum_f1(0),
2564 &fi_k(1, 0), &diff_fi_k(1, 0), 3);
2566 &t_grad_n3f2(0), &t_sum_f2(0),
2567 &fi_k(2, 0), &diff_fi_k(2, 0), 3);
2570 diff_fi_k(0, 0 +
k - 1), diff_fi_k(0,
k +
k - 1),
2571 diff_fi_k(0, 2 *
k +
k - 1));
2573 diff_fi_k(1, 0 +
k - 1), diff_fi_k(1,
k +
k - 1),
2574 diff_fi_k(1, 2 *
k +
k - 1));
2576 diff_fi_k(2, 0 +
k - 1), diff_fi_k(2,
k +
k - 1),
2577 diff_fi_k(2, 2 *
k +
k - 1));
2580 t_phi(
i) = fi_k(0,
k - 1) * t_phi_face_f0(
i);
2581 t_diff_phi(
i,
j) = t_diff_fi_k_f0(
j) * t_phi_face_f0(
i) +
2582 fi_k(0,
k - 1) * t_diff_phi_face_f0(
i,
j);
2586 ++t_diff_phi_face_f0;
2589 t_phi(
i) = fi_k(1,
k - 1) * t_phi_face_f1(
i);
2590 t_diff_phi(
i,
j) = t_diff_fi_k_f1(
j) * t_phi_face_f1(
i) +
2591 fi_k(1,
k - 1) * t_diff_phi_face_f1(
i,
j);
2595 ++t_diff_phi_face_f1;
2598 t_phi(
i) = fi_k(2,
k - 1) * t_phi_face_f2(
i);
2599 t_diff_phi(
i,
j) = t_diff_fi_k_f2(
j) * t_phi_face_f2(
i) +
2600 fi_k(2,
k - 1) * t_diff_phi_face_f2(
i,
j);
2604 ++t_diff_phi_face_f2;
2611 "Wrong number of base functions");
2620#ifdef GENERATE_VTK_WITH_CURL_BASE
2622MoFEMErrorCode VTK_Demkowicz_Hcurl_MBTET(
const string file_name) {
2625 double base_coords[] = {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1};
2627 moab::Core core_ref;
2628 moab::Interface &moab_ref = core_ref;
2631 for (
int nn = 0; nn < 4; nn++) {
2632 CHKERR moab_ref.create_vertex(&base_coords[3 * nn], nodes[nn]);
2635 CHKERR moab_ref.create_element(MBTET, nodes, 4, tet);
2643 const int max_level = 3;
2644 for (
int ll = 0; ll != max_level; ll++) {
2647 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
2651 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(ll),
2656 CHKERR m_ref->addVerticesInTheMiddleOfEdges(edges,
2663 ->getEntitiesByTypeAndRefLevel(
BitRefLevel().set(max_level),
2669 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
2670 CHKERR moab_ref.add_entities(meshset, tets);
2671 CHKERR moab_ref.convert_entities(meshset,
true,
false,
false);
2672 CHKERR moab_ref.delete_entities(&meshset, 1);
2676 CHKERR moab_ref.get_connectivity(tets, elem_nodes,
false);
2678 const int nb_gauss_pts = elem_nodes.size();
2681 Range::iterator nit = elem_nodes.begin();
2682 for (
int gg = 0; nit != elem_nodes.end(); nit++, gg++) {
2683 CHKERR moab_ref.get_coords(&*nit, 1, &gauss_pts(gg, 0));
2685 gauss_pts = trans(gauss_pts);
2688 shape_fun.resize(nb_gauss_pts, 4);
2690 &gauss_pts(1, 0), &gauss_pts(2, 0), nb_gauss_pts);
2692 double diff_shape_fun[12];
2695 int edge_sense[6] = {1, 1, 1, 1, 1, 1};
2696 const int order = 4;
2704 edge_diff_phi.clear();
2706 double *edge_phi_ptr[] = {&edge_phi(0, 0), &edge_phi(1, 0), &edge_phi(2, 0),
2707 &edge_phi(3, 0), &edge_phi(4, 0), &edge_phi(5, 0)};
2708 double *edge_diff_phi_ptr[] = {&edge_diff_phi(0, 0), &edge_diff_phi(1, 0),
2709 &edge_diff_phi(2, 0), &edge_diff_phi(3, 0),
2710 &edge_diff_phi(4, 0), &edge_diff_phi(5, 0)};
2713 edge_sense, edge_order, &*shape_fun.data().begin(), diff_shape_fun,
2714 edge_phi_ptr, edge_diff_phi_ptr, nb_gauss_pts);
2718 for (
int ee = 0; ee != 6; ++ee) {
2720 double def_val[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
2721 std::string tag_name =
"E" + boost::lexical_cast<std::string>(ee) +
"_" +
2722 boost::lexical_cast<std::string>(ll);
2724 CHKERR moab_ref.tag_get_handle(tag_name.c_str(), 3, MB_TYPE_DOUBLE,
th,
2725 MB_TAG_CREAT | MB_TAG_SPARSE, def_val);
2728 for (Range::iterator nit = elem_nodes.begin(); nit != elem_nodes.end();
2731 CHKERR moab_ref.tag_set_data(
th, &*nit, 1, &edge_phi(ee, idx));
2737 int faces_nodes[] = {0, 1, 3, 1, 2, 3, 0, 2, 3, 0, 1, 2};
2743 face_diff_phi.clear();
2745 double *face_phi_ptr[] = {&face_phi(0, 0), &face_phi(1, 0), &face_phi(2, 0),
2747 double *face_diff_phi_ptr[] = {&face_diff_phi(0, 0), &face_diff_phi(1, 0),
2748 &face_diff_phi(2, 0), &face_diff_phi(3, 0)};
2751 faces_nodes, faces_order, &*shape_fun.data().begin(), diff_shape_fun,
2752 face_phi_ptr, face_diff_phi_ptr, nb_gauss_pts);
2754 for (
int ff = 0; ff != 4; ++ff) {
2756 double def_val[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
2757 std::string tag_name =
"F" + boost::lexical_cast<std::string>(ff) +
"_" +
2758 boost::lexical_cast<std::string>(ll);
2760 CHKERR moab_ref.tag_get_handle(tag_name.c_str(), 3, MB_TYPE_DOUBLE,
th,
2761 MB_TAG_CREAT | MB_TAG_SPARSE, def_val);
2764 for (Range::iterator nit = elem_nodes.begin(); nit != elem_nodes.end();
2767 CHKERR moab_ref.tag_set_data(
th, &*nit, 1, &face_phi(ff, idx));
2777 order, &*shape_fun.data().begin(), diff_shape_fun, &vol_phi(0, 0),
2778 &diff_vol_phi(0, 0), nb_gauss_pts);
2781 double def_val[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
2782 std::string tag_name =
"V_" + boost::lexical_cast<std::string>(ll);
2784 CHKERR moab_ref.tag_get_handle(tag_name.c_str(), 3, MB_TYPE_DOUBLE,
th,
2785 MB_TAG_CREAT | MB_TAG_SPARSE, def_val);
2788 for (Range::iterator nit = elem_nodes.begin(); nit != elem_nodes.end();
2791 CHKERR moab_ref.tag_set_data(
th, &*nit, 1, &vol_phi(gg, idx));
2796 CHKERR moab_ref.create_meshset(MESHSET_SET, meshset);
2797 CHKERR moab_ref.add_entities(meshset, tets);
2798 CHKERR moab_ref.write_file(file_name.c_str(),
"VTK",
"", &meshset, 1);
2803static char help[] =
"...\n\n";
2805int main(
int argc,
char *argv[]) {
2812 CHKERR VTK_Demkowicz_Hcurl_MBTET(
"out_curl_vtk_demkowicz_base_on_tet.vtk");
Implementation of H-curl base function.
PetscErrorCode IntegratedJacobi_polynomials(int p, double alpha, double x, double t, double *diff_x, double *diff_t, double *L, double *diffL, const int dim)
Calculate integrated Jacobi approximation basis.
PetscErrorCode Jacobi_polynomials(int p, double alpha, double x, double t, double *diff_x, double *diff_t, double *L, double *diffL, const int dim)
Calculate Jacobi approximation basis.
#define CATCH_ERRORS
Catch errors.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_STD_EXCEPTION_THROW
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
PetscErrorCode Legendre_polynomials(int p, double s, double *diff_s, double *L, double *diffL, int dim)
Calculate Legendre approximation basis.
#define NBEDGE_DEMKOWICZ_HCURL(P)
#define NBVOLUMETET_AINSWORTH_TET_HCURL(P)
#define NBFACETRI_AINSWORTH_FACE_HCURL(P)
#define NBVOLUMETET_AINSWORTH_HCURL(P)
#define NBFACETRI_AINSWORTH_HCURL(P)
#define NBVOLUMETET_AINSWORTH_FACE_HCURL(P)
#define NBVOLUMETET_DEMKOWICZ_HCURL(P)
#define NBFACETRI_DEMKOWICZ_HCURL(P)
#define NBFACETRI_AINSWORTH_EDGE_HCURL(P)
#define NBEDGE_AINSWORTH_HCURL(P)
FTensor::Index< 'i', SPACE_DIM > i
const double n
refractive index of diffusive medium
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
implementation of Data Operators for Forces and Sources
MoFEMErrorCode Hcurl_Demkowicz_EdgeBaseFunctions_MBTRI(int *sense, int *p, double *n, double *diff_n, double *phi[], double *diff_phi[], int nb_integration_pts)
Edge based H-curl base functions on teriangle.
MoFEMErrorCode Hcurl_Ainsworth_EdgeBasedFaceFunctions_MBTET(int *faces_nodes, int *p, double *N, double *diffN, double *phi_f_e[4][3], double *diff_phi_f_e[4][3], int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face edge base functions of Hcurl space on tetrahedral.
MoFEMErrorCode Hcurl_Ainsworth_VolumeInteriorFunctions_MBTET(int p, double *N, double *diffN, double *phi_v, double *diff_phi_v, int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Volume interior function.
MoFEMErrorCode Hcurl_Ainsworth_FaceFunctions_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f, double *diff_phi_f, int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face H-curl functions.
MoFEMErrorCode Hcurl_Demkowicz_EdgeBaseFunctions_MBEDGE(int sense, int p, double *n, double *diff_n, double *phi, double *diff_phi, int nb_integration_pts)
Edge based H-curl base functions on edge.
auto getFTensor2HVecFromPtr< 3, 2 >(double *ptr)
MoFEMErrorCode Hcurl_Ainsworth_EdgeBaseFunctions_MBTET_ON_FACE(int *sense, int *p, double *N, double *diffN, double *edgeN[], double *diff_edgeN[], int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Edge based H-curl base functions on face.
MoFEMErrorCode Hcurl_Ainsworth_BubbleFaceFunctions_MBTET(int *faces_nodes, int *p, double *N, double *diffN, double *phi_f[4], double *diff_phi_f[4], int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face edge base functions of Hcurl space on face on tetrahedral.
auto getFTensor2HVecFromPtr< 3, 3 >(double *ptr)
MoFEMErrorCode Hcurl_Ainsworth_VolumeFunctions_MBTET(int p, double *N, double *diffN, double *phi_v, double *diff_phi_v, int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
H-curl volume base functions.
MoFEMErrorCode Hcurl_Ainsworth_FaceInteriorFunctions_MBTET(int *faces_nodes, int p, double *N, double *diffN, double *phi_v, double *diff_phi_v, int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face base interior function.
MoFEMErrorCode Hcurl_Ainsworth_EdgeBaseFunctions_MBTET(int *sense, int *p, double *N, double *diffN, double *edgeN[], double *diff_edgeN[], int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Edge based H-curl base functions on tetrahedral.
MoFEMErrorCode Hcurl_Demkowicz_FaceBaseFunctions_MBTRI(int *faces_nodes, int p, double *n, double *diff_n, double *phi, double *diff_phi, int nb_integration_pts)
Face base interior function.
MoFEMErrorCode Hcurl_Ainsworth_EdgeBasedFaceFunctions_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f_e[3], double *diff_phi_f_e[3], int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face edge base functions of Hcurl space.
MoFEMErrorCode Hcurl_Demkowicz_FaceBaseFunctions_MBTET(int *faces_nodes, int *p, double *n, double *diff_n, double *phi[], double *diff_phi[], int nb_integration_pts)
Face base interior function.
MoFEMErrorCode Hcurl_Demkowicz_VolumeBaseFunctions_MBTET(int p, double *n, double *diff_n, double *phi, double *diff_phi, int nb_integration_pts)
Volume base interior function.
MoFEMErrorCode Hcurl_Demkowicz_EdgeBaseFunctions_MBTET(int *sense, int *p, double *n, double *diff_n, double *phi[], double *diff_phi[], int nb_integration_pts)
Edge based H-curl base functions on tetrahedral.
MoFEMErrorCode Hcurl_Ainsworth_FaceFunctions_MBTET(int *face_nodes, int *p, double *N, double *diffN, double *phi_f[4], double *diff_phi_f[4], int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face H-curl functions.
MoFEMErrorCode Hcurl_Ainsworth_BubbleFaceFunctions_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f, double *diff_phi_f, int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face edge base functions of Hcurl space on face.
MoFEMErrorCode Hcurl_Ainsworth_EdgeBaseFunctions_MBTET_ON_EDGE(int sense, int p, double *N, double *diffN, double *edgeN, double *diff_edgeN, int nb_integration_pts, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Edge based H-curl base functions on edge.
constexpr double t
plate stiffness
FTensor::Tensor1< double, 3 > tDiffb
FTensor::Index< 'i', 3 > i
FTensor::Tensor1< double, 3 > tGradN0pN1
FTensor::Tensor1< double, 3 > tPhi0
MoFEMErrorCode calculate(int p, int nb_integration_pts, int n0_idx, int n1_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, TDiffPhi *t_diff_phi_ptr)
MoFEMErrorCode calculate(int p, int nb_integration_pts, int n0_idx, int n1_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, std::nullptr_t)
MoFEMErrorCode calculateTwoFamily(int p, int nb_integration_pts, int n0f0_idx, int n1f0_idx, int n2f0_idx, int n0f1_idx, int n1f1_idx, int n2f1_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, TDiffPhi &t_diff_phi)
HcurlEdgeBase hCurlBaseOnEdge
MoFEMErrorCode calculateOneFamily(int p, int nb_integration_pts, int n0f0_idx, int n1f0_idx, int n2f0_idx, double n[], FTensor::Tensor1< double, 3 > t_grad_n[], TPhi &t_phi, TDiffPhi &t_diff_phi)
FTensor::Index< 'i', 3 > i
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
Mesh refinement interface.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.