37 int nb_gauss_pts = pts.size2();
40 auto &ptr = data.getBBAlphaIndicesSharedPtr(
field_name);
54 auto &ptr = data.getBBDiffNSharedPtr(
field_name);
60 auto get_alpha_by_name_ptr =
62 const std::string &
field_name) -> boost::shared_ptr<MatrixInt> & {
63 return data.getBBAlphaIndicesSharedPtr(
field_name);
66 auto get_base_by_name_ptr =
68 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
72 auto get_diff_base_by_name_ptr =
74 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
78 auto get_alpha_by_order_ptr =
79 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixInt> & {
80 return data.getBBAlphaIndicesByOrderSharedPtr(o);
83 auto get_base_by_order_ptr =
84 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
85 return data.getBBNByOrderSharedPtr(o);
88 auto get_diff_base_by_order_ptr =
89 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
90 return data.getBBDiffNByOrderSharedPtr(o);
97 auto &n_ptr = ent_data.getBBNSharedPtr(
field_name);
100 for (
auto &ptr : ent_data.getBBNByOrderArray()) {
101 if (ptr && ptr.get() == n_ptr.get()) {
102 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
103 ent_data.getBBDiffNSharedPtr(
field_name).reset();
112 auto set_empty = [&](
auto &ent_data) {
114 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
115 get_base(ent_data).resize(nb_gauss_pts, 0,
false);
116 get_diff_base(ent_data).resize(nb_gauss_pts, 0,
false);
124 auto check_uniform_order = [&]() {
126 auto &node_order = data.
dataOnEntities[MBVERTEX][0].getBBNodeOrder();
127 if (node_order.size() != 3)
129 "Wrong number of vertex orders for BB base: %d",
130 static_cast<int>(node_order.size()));
132 for (
int n = 0;
n != 3; ++
n)
134 auto max_order_on = [&](
const EntityType
type) {
139 max_order_on(MBEDGE);
143 "Bernstein-Bezier H1 base requires approximation order >= 1");
144 if (
static_cast<size_t>(
order) >=
147 "Bernstein-Bezier order %d exceeds the supported maximum %d",
152 for (
int n = 0;
n != 3; ++
n)
153 if (node_order[
n] < 1)
155 "Bernstein-Bezier H1 base requires vertex order between 1 "
156 "and the element order %d; vertex %d has order %d",
158 auto check_type = [&](
const EntityType
type,
const int nb_dofs_at_order) {
164 if (ent_data.getOrder() !=
order)
166 "Bernstein-Bezier base in H1 space requires uniform "
167 "approximation order on the element: %s %d has order %d, "
168 "element order is %d. BB functions are not hierarchical, "
169 "so mixed degrees do not span a complete polynomial space. "
170 "Set one order for the whole H1 field (L2 fields are not "
172 moab::CN::EntityTypeName(
type), side, ent_data.getOrder(),
182 CHKERR check_uniform_order();
185 auto &vert_get_diff_n = get_diff_base(data.
dataOnEntities[MBVERTEX][0]);
186 vert_get_n.resize(nb_gauss_pts, 3,
false);
187 vert_get_diff_n.resize(nb_gauss_pts, 6,
false);
190 (
unsigned int)nb_gauss_pts)
192 "Base functions or nodes has wrong number of integration points "
198 vertex_alpha.resize(3, 3,
false);
199 vertex_alpha.clear();
200 for (
int n = 0;
n != 3; ++
n)
204 1,
lambda.size1(), vertex_alpha.size1(), &vertex_alpha(0, 0),
206 &vert_get_diff_n(0, 0));
207 for (
int n = 0;
n != 3; ++
n) {
208 const int f = boost::math::factorial<double>(
210 for (
int g = 0;
g != nb_gauss_pts; ++
g) {
211 vert_get_n(
g,
n) *= f;
212 for (
int d = 0; d != 2; ++d)
213 vert_get_diff_n(
g, 2 *
n + d) *= f;
221 "Wrong size of ent data");
223 constexpr int edges_nodes[3][2] = {{0, 1}, {1, 2}, {2, 0}};
224 for (
int ee = 0; ee != 3; ++ee) {
227 if (ent_data.getSense() == 0)
229 "Sense of the edge unknown");
231 const int sense = ent_data.getSense();
232 const int order = ent_data.getOrder();
233 const int nb_dofs =
NBEDGE_H1(ent_data.getOrder());
236 if (get_alpha_by_order_ptr(ent_data,
order)) {
238 get_alpha_by_order_ptr(ent_data,
order);
240 get_base_by_order_ptr(ent_data,
order);
241 get_diff_base_by_name_ptr(ent_data,
field_name) =
242 get_diff_base_by_order_ptr(ent_data,
order);
245 auto &get_n = get_base(ent_data);
246 auto &get_diff_n = get_diff_base(ent_data);
247 get_n.resize(nb_gauss_pts, nb_dofs,
false);
248 get_diff_n.resize(nb_gauss_pts, 2 * nb_dofs,
false);
250 auto &edge_alpha = get_alpha(ent_data);
251 edge_alpha.resize(nb_dofs, 3,
false);
255 for (
int i = 0;
i != edge_alpha.size1(); ++
i) {
256 int a = edge_alpha(
i, edges_nodes[ee][0]);
257 edge_alpha(
i, edges_nodes[ee][0]) =
258 edge_alpha(
i, edges_nodes[ee][1]);
259 edge_alpha(
i, edges_nodes[ee][1]) =
a;
263 order,
lambda.size1(), edge_alpha.size1(), &edge_alpha(0, 0),
267 get_alpha_by_order_ptr(ent_data,
order) =
269 get_base_by_order_ptr(ent_data,
order) =
271 get_diff_base_by_order_ptr(ent_data,
order) =
272 get_diff_base_by_name_ptr(ent_data,
field_name);
279 for (
int ee = 0; ee != 3; ++ee)
286 "Wrong size ent of ent data");
289 const int order = ent_data.getOrder();
291 if (get_alpha_by_order_ptr(ent_data,
order)) {
293 get_alpha_by_order_ptr(ent_data,
order);
295 get_base_by_order_ptr(ent_data,
order);
296 get_diff_base_by_name_ptr(ent_data,
field_name) =
297 get_diff_base_by_order_ptr(ent_data,
order);
301 auto &get_n = get_base(ent_data);
302 auto &get_diff_n = get_diff_base(ent_data);
303 get_n.resize(nb_gauss_pts, nb_dofs,
false);
304 get_diff_n.resize(nb_gauss_pts, 2 * nb_dofs,
false);
306 auto &tri_alpha = get_alpha(ent_data);
307 tri_alpha.resize(nb_dofs, 3,
false);
311 order,
lambda.size1(), tri_alpha.size1(), &tri_alpha(0, 0),
315 get_alpha_by_order_ptr(ent_data,
order) =
317 get_base_by_order_ptr(ent_data,
order) =
319 get_diff_base_by_order_ptr(ent_data,
order) =
320 get_diff_base_by_name_ptr(ent_data,
field_name);
322 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
340 "Polynomial type not set");
342 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
343 double *diffL,
const int dim) =
346 int nb_gauss_pts = pts.size2();
352 "expected size of data.dataOnEntities[MBEDGE] is 3");
354 int sense[3],
order[3];
355 double *H1edgeN[3], *diffH1edgeN[3];
356 for (
int ee = 0; ee < 3; ee++) {
360 "sense of the edge unknown");
365 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, nb_dofs,
367 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts,
369 H1edgeN[ee] = &*data.
dataOnEntities[MBEDGE][ee].getN(base).data().begin();
377 H1edgeN, diffH1edgeN, nb_gauss_pts, base_polynomials);
384 "expected that size data.dataOnEntities[MBTRI] is one");
388 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, nb_dofs,
392 const int face_nodes[] = {0, 1, 2};
399 nb_gauss_pts, base_polynomials);
431 "Polynomial type not set");
432 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
433 double *diffL,
const int dim) =
436 int nb_gauss_pts = pts.size2();
451 nb_gauss_pts, base_polynomials);
462 int nb_gauss_pts = pts.size2();
465 auto &ptr = data.getBBAlphaIndicesSharedPtr(
field_name);
479 auto &ptr = data.getBBDiffNSharedPtr(
field_name);
485 auto get_alpha_by_name_ptr =
487 const std::string &
field_name) -> boost::shared_ptr<MatrixInt> & {
488 return data.getBBAlphaIndicesSharedPtr(
field_name);
491 auto get_base_by_name_ptr =
493 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
497 auto get_diff_base_by_name_ptr =
499 const std::string &
field_name) -> boost::shared_ptr<MatrixDouble> & {
503 auto get_alpha_by_order_ptr =
504 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixInt> & {
505 return data.getBBAlphaIndicesByOrderSharedPtr(o);
508 auto get_base_by_order_ptr =
509 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
510 return data.getBBNByOrderSharedPtr(o);
513 auto get_diff_base_by_order_ptr =
514 [](
auto &data,
const size_t o) -> boost::shared_ptr<MatrixDouble> & {
515 return data.getBBDiffNByOrderSharedPtr(o);
520 auto make_own = [
field_name](
auto &ent_data) {
521 auto &n_ptr = ent_data.getBBNSharedPtr(
field_name);
524 for (
auto &ptr : ent_data.getBBNByOrderArray()) {
525 if (ptr && ptr.get() == n_ptr.get()) {
526 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
527 ent_data.getBBDiffNSharedPtr(
field_name).reset();
537 "Wrong size ent of ent data");
540 (
unsigned int)nb_gauss_pts)
542 "Base functions or nodes has wrong number of integration points "
548 const int order = ent_data.getOrder();
552 if (
order < 0 ||
static_cast<size_t>(
order) >=
555 "Bernstein-Bezier order %d is outside the supported range "
562 if (get_alpha_by_order_ptr(ent_data,
order)) {
564 get_alpha_by_order_ptr(ent_data,
order);
566 get_base_by_order_ptr(ent_data,
order);
567 get_diff_base_by_name_ptr(ent_data,
field_name) =
568 get_diff_base_by_order_ptr(ent_data,
order);
572 auto &get_n = get_base(ent_data);
573 auto &get_diff_n = get_diff_base(ent_data);
574 get_n.resize(nb_gauss_pts, nb_dofs,
false);
575 get_diff_n.resize(nb_gauss_pts, 2 * nb_dofs,
false);
582 "Inconsistent number of DOFs");
586 auto &tri_alpha = get_alpha(ent_data);
587 tri_alpha.resize(1, 3,
false);
589 std::fill(get_n.data().begin(), get_n.data().end(), 1.);
596 "Inconsistent number of DOFs");
598 auto &tri_alpha = get_alpha(ent_data);
599 tri_alpha.resize(nb_dofs, 3,
false);
606 std::array<int *, 3> face_edge_ptr{
610 face_n.data(), face_edge_ptr.data());
616 order,
lambda.size1(), tri_alpha.size1(), &tri_alpha(0, 0),
621 get_alpha_by_order_ptr(ent_data,
order) =
623 get_base_by_order_ptr(ent_data,
order) =
625 get_diff_base_by_order_ptr(ent_data,
order) =
626 get_diff_base_by_name_ptr(ent_data,
field_name);
632 ent_data.getBBAlphaIndicesSharedPtr(
field_name).reset();
633 get_base(ent_data).resize(nb_gauss_pts, 0,
false);
634 get_diff_base(ent_data).resize(nb_gauss_pts, 0,
false);
647 "Polynomial type not set");
648 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
649 double *diffL,
const int dim) =
652 int nb_gauss_pts = pts.size2();
660 auto nb_dofs_on_face =
665 if (nb_dofs_on_face) {
669 for (
int ee = 0; ee < 3; ee++) {
670 N_face_edge(0, ee).resize(nb_gauss_pts, 3 * face_edge_dofs,
false);
675 N_face_bubble[0].resize(nb_gauss_pts, 3 * face_bubble_dofs,
false);
678 int face_nodes[3] = {0, 1, 2};
683 &data.
dataOnEntities[MBVERTEX][0].getN(base)(0, 0), NULL, phi_f_e,
684 NULL, nb_gauss_pts, 3, base_polynomials);
685 if (face_bubble_dofs)
689 &data.
dataOnEntities[MBVERTEX][0].getN(base)(0, 0), NULL, phi_f, NULL,
690 nb_gauss_pts, 3, base_polynomials);
699 auto max_face_order =
704 for (
int oo = 0; oo < max_face_order; oo++) {
706 for (
int ee = 0; ee < 3; ee++) {
709 for (
int gg = 0; gg < nb_gauss_pts; gg++) {
719 for (
int gg = 0; gg < nb_gauss_pts; gg++) {
741 "This should be used only with DEMKOWICZ_JACOBI_BASE "
746 int nb_gauss_pts = pts.size2();
749 double *phi_f = &*data.
dataOnEntities[MBTRI][0].getN(base).data().begin();
752 int face_nodes[3] = {0, 1, 2};
756 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(), phi_f,
757 NULL, nb_gauss_pts, 3);
787 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
788 double *diffL,
const int dim) =
791 int nb_gauss_pts = pts.size2();
798 int sense[3],
order[3];
799 double *hcurl_edge_n[3];
800 double *diff_hcurl_edge_n[3];
801 for (
int ee = 0; ee < 3; ee++) {
804 "data inconsistency");
813 nb_gauss_pts, 2 * 3 * nb_dofs,
false);
816 diff_hcurl_edge_n[ee] =
823 hcurl_edge_n, diff_hcurl_edge_n, nb_gauss_pts, base_polynomials);
825 for (
int ee = 0; ee < 3; ee++) {
826 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
827 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
843 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
846 3 * 2 * nb_dofs,
false);
848 int face_nodes[] = {0, 1, 2};
855 nb_gauss_pts, base_polynomials);
858 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
859 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
874 PetscErrorCode (*base_polynomials)(
int p,
double s,
double *diff_s,
double *
L,
875 double *diffL,
const int dim) =
878 int nb_gauss_pts = pts.size2();
892 int nb_dofs = 3 * nb_edge_dofs + nb_dofs_face;
893 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
896 3 * 2 * nb_dofs,
false);
903 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
904 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
905 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false)};
907 std::array<double *, 3>
phi{&*edge_bases[0].data().begin(),
908 &*edge_bases[1].data().begin(),
909 &*edge_bases[2].data().begin()};
910 std::array<double *, 3> diff_phi{&*diff_edge_bases[0].data().begin(),
911 &*diff_edge_bases[1].data().begin(),
912 &*diff_edge_bases[2].data().begin()};
915 std::array<int, 3> edge_sense{1, 1, 1};
917 edge_sense.data(), edge_order.data(),
920 phi.data(), diff_phi.data(), nb_gauss_pts, base_polynomials);
922 MatrixDouble face_bases(nb_gauss_pts, 3 * nb_dofs_face,
false);
923 MatrixDouble diff_face_bases(nb_gauss_pts, 3 * 2 * nb_dofs_face,
false);
924 int face_nodes[] = {0, 1, 2};
929 &*face_bases.data().begin(), &*diff_face_bases.data().begin(),
930 nb_gauss_pts, base_polynomials);
934 decltype(getFTensor1FromPtr<3>(
static_cast<double *
>(
nullptr)));
935 Tensor1Ptr3 t_edge_base[] = {
936 getFTensor1FromPtr<3>(&*edge_bases[0].data().begin()),
937 getFTensor1FromPtr<3>(&*edge_bases[1].data().begin()),
938 getFTensor1FromPtr<3>(&*edge_bases[2].data().begin())};
945 auto t_vol_base = getFTensor1FromPtr<3>(&*face_bases.data().begin());
946 auto t_vol_diff_base =
949 auto t_base = getFTensor1FromPtr<3>(
957 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
958 for (
int oo = 0; oo <
order; oo++) {
962 for (
int ee = 0; ee != 3; ++ee) {
963 t_base(
i) = t_edge_base[ee](
i);
966 t_diff_base(
i,
j) = t_edge_diff_base[ee](
i,
j);
968 ++t_edge_diff_base[ee];
974 t_base(
i) = t_vol_base(
i);
977 t_diff_base(
i,
j) = t_vol_diff_base(
i,
j);
985 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
986 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
999 int nb_gauss_pts = pts.size2();
1006 "wrong number of data structures on edges, should be three but "
1010 int sense[3],
order[3];
1011 double *hcurl_edge_n[3];
1012 double *diff_hcurl_edge_n[3];
1014 for (
int ee = 0; ee != 3; ++ee) {
1018 "orientation (sense) of edge is not set");
1025 3 * nb_dofs,
false);
1027 nb_gauss_pts, 2 * 3 * nb_dofs,
false);
1031 diff_hcurl_edge_n[ee] =
1038 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1039 hcurl_edge_n, diff_hcurl_edge_n, nb_gauss_pts);
1045 for (
int ee = 0; ee != 3; ++ee) {
1046 data.
dataOnEntities[MBEDGE][ee].getN(base).resize(nb_gauss_pts, 0,
false);
1047 data.
dataOnEntities[MBEDGE][ee].getDiffN(base).resize(nb_gauss_pts, 0,
1057 "No data struture to keep base functions on face");
1061 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
1063 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts,
1064 3 * 2 * nb_dofs,
false);
1066 int face_nodes[] = {0, 1, 2};
1070 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1079 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
1080 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
1093 int nb_gauss_pts = pts.size2();
1100 "No data struture to keep base functions on face");
1105 int nb_dofs = 3 * nb_edge_dofs + nb_volume_dofs;
1106 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 3 * nb_dofs,
1108 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts,
1109 3 * 2 * nb_dofs,
false);
1116 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
1117 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false),
1118 MatrixDouble(nb_gauss_pts, 3 * 2 * nb_edge_dofs,
false)};
1121 std::array<int, 3> edge_sense{1, 1, 1};
1122 std::array<double *, 3>
phi{&*edge_bases[0].data().begin(),
1123 &*edge_bases[1].data().begin(),
1124 &*edge_bases[2].data().begin()};
1125 std::array<double *, 3> diff_phi{&*diff_edge_bases[0].data().begin(),
1126 &*diff_edge_bases[1].data().begin(),
1127 &*diff_edge_bases[2].data().begin()};
1129 edge_sense.data(), edge_order.data(),
1131 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1132 phi.data(), diff_phi.data(), nb_gauss_pts);
1134 MatrixDouble face_bases(nb_gauss_pts, 3 * nb_volume_dofs,
false);
1135 MatrixDouble diff_face_bases(nb_gauss_pts, 3 * 2 * nb_volume_dofs,
false);
1136 int face_nodes[] = {0, 1, 2};
1140 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin(),
1141 &*face_bases.data().begin(), &*diff_face_bases.data().begin(),
1146 decltype(getFTensor1FromPtr<3>(
static_cast<double *
>(
nullptr)));
1147 Tensor1Ptr3 t_edge_base[] = {
1148 getFTensor1FromPtr<3>(&*edge_bases[0].data().begin()),
1149 getFTensor1FromPtr<3>(&*edge_bases[1].data().begin()),
1150 getFTensor1FromPtr<3>(&*edge_bases[2].data().begin())};
1156 auto t_vol_base = getFTensor1FromPtr<3>(&*face_bases.data().begin());
1157 auto t_vol_diff_base =
1160 auto t_base = getFTensor1FromPtr<3>(
1169 for (
int gg = 0; gg != nb_gauss_pts; gg++) {
1170 for (
int oo = 0; oo <
order; oo++) {
1174 for (
int ee = 0; ee != 3; ++ee) {
1175 t_base(
i) = t_edge_base[ee](
i);
1178 t_diff_base(
i,
j) = t_edge_diff_base[ee](
i,
j);
1180 ++t_edge_diff_base[ee];
1186 t_base(
i) = t_vol_base(
i);
1189 t_diff_base(
i,
j) = t_vol_diff_base(
i,
j);
1200 data.
dataOnEntities[MBTRI][0].getN(base).resize(nb_gauss_pts, 0,
false);
1201 data.
dataOnEntities[MBTRI][0].getDiffN(base).resize(nb_gauss_pts, 0,
false);
1244 boost::shared_ptr<BaseFunctionCtx> ctx_ptr) {
1249 int nb_gauss_pts = pts.size2();
1250 if (!nb_gauss_pts) {
1254 if (pts.size1() < 2)
1257 "Wrong dimension of pts, should be at least 3 rows with coordinates");
1264 data.
dataOnEntities[MBVERTEX][0].getN(base).resize(nb_gauss_pts, 3,
1268 &pts(0, 0), &pts(1, 0), nb_gauss_pts);
1269 data.
dataOnEntities[MBVERTEX][0].getDiffN(base).resize(3, 2,
false);
1271 &*data.
dataOnEntities[MBVERTEX][0].getDiffN(base).data().begin());
1279 (
unsigned int)nb_gauss_pts) {
1281 "Base functions or nodes has wrong number of integration points "
1287 auto set_node_derivative_for_all_gauss_pts = [&]() {
1292 data.
dataOnEntities[MBVERTEX][0].getDiffN(base).resize(nb_gauss_pts, 6,
1294 for (
int gg = 0; gg != nb_gauss_pts; ++gg)
1301 CHKERR set_node_derivative_for_all_gauss_pts();
1342 switch (continuity) {
1357 "Unknown (or not implemented) continuity");
1371 auto set_ainsworth = [&dofs_side_map]() {
1374 dofs_side_map.clear();
1382 for (
int ee = 0; ee != 3; ++ee) {
1398 auto set_demkowicz = [&dofs_side_map]() {
1401 dofs_side_map.clear();
1409 for (
int ee = 0; ee != 3; ++ee) {
1425 switch (continuity) {
1440 "Unknown (or not implemented) continuity");
#define FTENSOR_INDEX(DIM, I)
FieldApproximationBase
approximation base
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ AINSWORTH_BERNSTEIN_BEZIER_BASE
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FieldSpace
approximation spaces
@ L2
field with C-1 continuity
@ HCURL
field with continuous tangents
@ HDIV
field with continuous normal traction
FieldContinuity
Field continuity.
@ CONTINUOUS
Regular field.
@ DISCONTINUOUS
Broken continuity (No effect on L2 space)
static const char *const FieldSpaceNames[]
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
static const char *const ApproximationBaseNames[]
#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 ...
#define NBEDGE_DEMKOWICZ_HCURL(P)
#define NBFACETRI_AINSWORTH_HCURL(P)
#define NBFACETRI_L2(P)
Number of base functions on triangle for L2 space.
#define NBEDGE_H1(P)
Number of base function on edge for H1 space.
#define NBFACETRI_DEMKOWICZ_HDIV(P)
PetscErrorCode L2_Ainsworth_ShapeFunctions_MBTRI(int p, double *N, double *diffN, double *L2N, double *diff_L2N, int GDIM, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Get base functions on triangle for L2 space.
#define NBFACETRI_DEMKOWICZ_HCURL(P)
PetscErrorCode H1_EdgeShapeFunctions_MBTRI(int *sense, int *p, double *N, double *diffN, double *edgeN[3], double *diff_edgeN[3], int GDIM, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
H1_EdgeShapeFunctions_MBTRI.
#define NBFACETRI_AINSWORTH_FACE_HDIV(P)
PetscErrorCode H1_FaceShapeFunctions_MBTRI(const int *face_nodes, int p, double *N, double *diffN, double *faceN, double *diff_faceN, int GDIM, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
#define NBFACETRI_AINSWORTH_EDGE_HDIV(P)
#define NBEDGE_AINSWORTH_HCURL(P)
#define NBFACETRI_H1(P)
Number of base function on triangle for H1 space.
#define NBFACETRI_AINSWORTH_HDIV(P)
FTensor::Index< 'i', SPACE_DIM > i
const double n
refractive index of diffusive medium
FTensor::Index< 'j', 3 > j
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasMatrix< double > MatrixDouble
UBlasMatrix< int > MatrixInt
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 Hdiv_Demkowicz_Face_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f, double *diff_phi_f, int gdim, int nb)
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.
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 Hdiv_Ainsworth_EdgeFaceShapeFunctions_MBTET_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f_e[3], double *diff_phi_f_e[3], int gdim, int nb, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Hdiv base functions, Edge-based face functions by Ainsworth .
MoFEMErrorCode Hdiv_Ainsworth_FaceBubbleShapeFunctions_ON_FACE(int *faces_nodes, int p, double *N, double *diffN, double *phi_f, double *diff_phi_f, int gdim, int nb, PetscErrorCode(*base_polynomials)(int p, double s, double *diff_s, double *L, double *diffL, const int dim))
Face bubble functions by Ainsworth .
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.
constexpr auto field_name
static boost::function< int(int)> broken_nbfacetri_face_hdiv
static boost::function< int(int)> broken_nbfacetri_edge_hdiv
multi_index_container< DofsSideMapData, indexed_by< ordered_non_unique< tag< TypeSide_mi_tag >, composite_key< DofsSideMapData, member< DofsSideMapData, EntityType, &DofsSideMapData::type >, member< DofsSideMapData, int, &DofsSideMapData::side > > >, ordered_unique< tag< EntDofIdx_mi_tag >, member< DofsSideMapData, int, &DofsSideMapData::dof > > > > DofsSideMap
Map entity stype and side to element/entity dof index.
static MoFEMErrorCode baseFunctionsTri(const int N, const int gdim, const int n_alpha, const int *alpha, const double *lambda, const double *grad_lambda, double *base, double *grad_base)
static MoFEMErrorCode generateIndicesVertexTri(const int N, int *alpha)
static MoFEMErrorCode generateIndicesTriTri(const int N, int *alpha)
static MoFEMErrorCode generateIndicesEdgeTri(const int N[], int *alpha[])
Class used to pass element data to calculate base functions on tet,triangle,edge.
const FieldApproximationBase copyNodeBase
const std::string fieldName
PetscErrorCode(* basePolynomialsType0)(int p, double s, double *diff_s, double *L, double *diffL, const int dim)
const FieldContinuity spaceContinuity
const FieldApproximationBase bAse
static constexpr size_t MaxBernsteinBezierOrder
data structure for finite element entity
std::array< std::bitset< LASTSPACE >, MBMAXTYPE > spacesOnEntities
spaces on entity types
std::array< boost::ptr_vector< EntData >, MBMAXTYPE > dataOnEntities
static constexpr int maxBrokenDofsOrder
Maximum order for broken space DOFs.
Calculate base functions on triangle.
MoFEMErrorCode getValueH1BernsteinBezierBase(MatrixDouble &pts)
MoFEMErrorCode getValueL2BernsteinBezierBase(MatrixDouble &pts)
MoFEMErrorCode getValueH1(MatrixDouble &pts)
MoFEMErrorCode getValueH1AinsworthBase(MatrixDouble &pts)
MoFEMErrorCode getValueL2(MatrixDouble &pts)
MoFEMErrorCode getValue(MatrixDouble &pts, boost::shared_ptr< BaseFunctionCtx > ctx_ptr)
ublas::matrix< MatrixDouble > N_face_edge
MoFEMErrorCode getValueHdivAinsworthBase(MatrixDouble &pts)
MoFEMErrorCode getValueHdivDemkowiczBase(MatrixDouble &pts)
MoFEMErrorCode query_interface(boost::typeindex::type_index type_index, UnknownInterface **iface) const
ublas::vector< MatrixDouble > N_face_bubble
MoFEMErrorCode getValueHcurlDemkowiczBase(MatrixDouble &pts)
MoFEMErrorCode getValueHcurl(MatrixDouble &pts)
static MoFEMErrorCode setDofsSideMapHcurl(const FieldSpace space, const FieldContinuity continuity, const FieldApproximationBase base, DofsSideMap &dofs_side_map)
static MoFEMErrorCode setDofsSideMap(const FieldSpace space, const FieldContinuity continuity, const FieldApproximationBase base, DofsSideMap &)
Set map of dof to side number.
EntPolynomialBaseCtx * cTx
MoFEMErrorCode getValueHcurlAinsworthBase(MatrixDouble &pts)
MoFEMErrorCode getValueHcurlAinsworthBrokenBase(MatrixDouble &pts)
MoFEMErrorCode getValueHdiv(MatrixDouble &pts)
MoFEMErrorCode getValueL2AinsworthBase(MatrixDouble &pts)
MoFEMErrorCode getValueHcurlDemkowiczBrokenBase(MatrixDouble &pts)
base class for all interface classes
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.