100 {
102
103 auto fe_ptr = static_cast<FlatPrismElementForcesAndSourcesCore *>(fe_raw_ptr);
104 const int rule =
funRule(std::max(order_data, std::max(order_row, order_col)));
105
108 "-tie_ref_level has to be >= 0");
109 }
110
113 "Triangle quadrature rule %d is not available for TIE prism face "
114 "integration",
115 rule);
116 }
117
120 "Expected 2D quadrature for TIE prism face integration");
121 }
122
125 "Wrong quadrature order %d < %d for TIE prism face integration",
127 }
128
130
132 const auto cache_key = std::make_pair(rule,
tieRefLevel);
139 }
140 fe_ptr->gaussPts = it->second;
141 }
142
144 const auto nb_gauss_pts = slave_gauss_pts.size2();
145
146 auto &moab = fe_ptr->mField.get_moab();
147 auto get_prism_face_coords = [&](const int side, std::array<double, 9> &coords) {
151 int num_prism_nodes = 0;
152 CHKERR moab.get_connectivity(prism, prism_conn, num_prism_nodes,
true);
153 if (num_prism_nodes != 6) {
155 "TIE prism is expected to have 6 nodes");
156 }
157
158 std::array<EntityHandle, 3> face_conn;
159 switch (side) {
161 face_conn = {prism_conn[0], prism_conn[1], prism_conn[2]};
162 break;
164 face_conn = {prism_conn[3], prism_conn[4], prism_conn[5]};
165 break;
166 default:
168 "Unsupported TIE prism triangle side %d", side);
169 }
170
171 CHKERR moab.get_coords(face_conn.data(), 3, coords.data());
173 };
174
175 std::array<double, 9> slave_coords;
176 std::array<double, 9> master_coords;
179
180 MatrixDouble slave_global_coords(nb_gauss_pts, 3,
false);
181 MatrixDouble master_global_coords(nb_gauss_pts, 3,
false);
184 &slave_gauss_pts(1, 0), nb_gauss_pts);
185 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
186 for (
int dd = 0;
dd != 3; ++
dd) {
187 slave_global_coords(gg, dd) =
188 slave_shape(gg, 0) * slave_coords[0 +
dd] +
189 slave_shape(gg, 1) * slave_coords[3 +
dd] +
190 slave_shape(gg, 2) * slave_coords[6 +
dd];
191 }
192 }
193
195 slave_global_coords,
196 master_global_coords);
197
198 MatrixDouble master_local_coords(nb_gauss_pts, 2,
false);
199 CHKERR Tools::getLocalCoordinatesOnReferenceThreeNodeTri(
200 master_coords.data(), &master_global_coords(0, 0),
201 master_global_coords.size1(), &master_local_coords(0, 0));
202
203 MatrixDouble combined_gauss_pts(3, 2 * nb_gauss_pts,
false);
204 for (size_t gg = 0; gg != nb_gauss_pts; ++gg) {
205 const bool valid_master_point =
207 master_local_coords(gg, 1));
208 const double paired_weight = valid_master_point ? slave_gauss_pts(2, gg) : 0.;
209
210 combined_gauss_pts(0, gg) = slave_gauss_pts(0, gg);
211 combined_gauss_pts(1, gg) = slave_gauss_pts(1, gg);
212 combined_gauss_pts(2, gg) = paired_weight;
213
214 combined_gauss_pts(0, gg + nb_gauss_pts) = master_local_coords(gg, 0);
215 combined_gauss_pts(1, gg + nb_gauss_pts) = master_local_coords(gg, 1);
216 combined_gauss_pts(2, gg + nb_gauss_pts) = paired_weight;
217 }
218 fe_ptr->gaussPts.swap(combined_gauss_pts);
219
221 }
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
bool isInsideReferenceTriangle(const double xi, const double eta, const double tol=1e-8)
constexpr int MASTER_FACE_SIDE
constexpr int SLAVE_FACE_SIDE
const Tensor2_symmetric_Expr< const ddTensor0< T, Dim, i, j >, typename promote< T, double >::V, Dim, i, j > dd(const Tensor0< T * > &a, const Index< i, Dim > index1, const Index< j, Dim > index2, const Tensor1< int, Dim > &d_ijk, const Tensor1< double, Dim > &d_xyz)
UBlasMatrix< double > MatrixDouble
#define QUAD_2D_TABLE_SIZE
static QUAD *const QUAD_2D_TABLE[]
static MoFEMErrorCode setBaseQuadrature(FlatPrismElementForcesAndSourcesCore &fe, const int rule)
static MoFEMErrorCode projectSlavePointsToMasterPlane(const double *master_coords, const MatrixDouble &slave_global_coords, MatrixDouble &master_global_coords)
static std::map< std::pair< int, int >, MatrixDouble > mapRefCoords
static MoFEMErrorCode refineQuadrature(FlatPrismElementForcesAndSourcesCore &fe, const int refinement_levels, MatrixDouble &ref_gauss_pts)