162 const Elem *
const elem,
163 const std::vector<Point> & qp,
166 std::vector<std::vector<OutputShape>> & dphidx,
167 std::vector<std::vector<OutputShape>> & dphidy,
168 std::vector<std::vector<OutputShape>> & dphidz)
const
174 libmesh_error_msg(
"These element transformations only make sense in 2D and 3D.");
181#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
189 "HDiv FE gradients on non-affine-mapped elements require second-derivative support");
190 auto n_qp = dxyz_dxi.size();
192 const std::vector<RealGradient> d2xyz_dxi2(n_qp,
RealGradient());
193 const std::vector<RealGradient> d2xyz_deta2(n_qp,
RealGradient());
194 const std::vector<RealGradient> d2xyz_dxideta(n_qp,
RealGradient());
208 const std::vector<std::vector<OutputShape>> & dphi_dxi = fe.
get_dphidxi();
209 const std::vector<std::vector<OutputShape>> & dphi_deta = fe.
get_dphideta();
220 const OutputShape phi_val =
221 hdiv_piola_map(dxyz_dxi[p], dxyz_deta[p], J[p], phi_ref);
225 J[p] * (dxi_dx[p]*d2xyz_dxi2[p](0) + deta_dx[p]*d2xyz_dxideta[p](0) +
226 dxi_dy[p]*d2xyz_dxi2[p](1) + deta_dy[p]*d2xyz_dxideta[p](1));
228 J[p] * (dxi_dx[p]*d2xyz_dxideta[p](0) + deta_dx[p]*d2xyz_deta2[p](0) +
229 dxi_dy[p]*d2xyz_dxideta[p](1) + deta_dy[p]*d2xyz_deta2[p](1));
231 dJ_dxi += J[p] * (dxi_dz[p]*d2xyz_dxi2[p](2) + deta_dz[p]*d2xyz_dxideta[p](2));
232 dJ_deta += J[p] * (dxi_dz[p]*d2xyz_dxideta[p](2) + deta_dz[p]*d2xyz_deta2[p](2));
235 for (
unsigned int k = 0; k < LIBMESH_DIM; ++k)
243 const Real phik = phi_val(k);
246 const Real d2xk_dxi2 = d2xyz_dxi2[p](k);
247 const Real d2xk_deta2 = d2xyz_deta2[p](k);
248 const Real d2xk_dxideta = d2xyz_dxideta[p](k);
250 const Real dphik_dxi_B = (d2xk_dxi2*phi_ref(0) + d2xk_dxideta*phi_ref(1))/J[p];
251 const Real dphik_deta_B = (d2xk_dxideta*phi_ref(0) + d2xk_deta2*phi_ref(1))/J[p];
254 const Real Fk_xi = dxyz_dxi[p](k);
255 const Real Fk_eta = dxyz_deta[p](k);
257 const Real dphik_dxi_C = (Fk_xi*dphi_dxi[i][p](0) + Fk_eta*dphi_dxi[i][p](1))/J[p];
258 const Real dphik_deta_C = (Fk_xi*dphi_deta[i][p](0) + Fk_eta*dphi_deta[i][p](1))/J[p];
260 const Real dphik_dxi_total = -phik*dJ_dxi/J[p] + dphik_dxi_B + dphik_dxi_C;
261 const Real dphik_deta_total = -phik*dJ_deta/J[p] + dphik_deta_B + dphik_deta_C;
263 dphidx[i][p](k) = dxi_dx[p]*dphik_dxi_total + deta_dx[p]*dphik_deta_total;
264 dphidy[i][p](k) = dxi_dy[p]*dphik_dxi_total + deta_dy[p]*dphik_deta_total;
266 dphidz[i][p](k) = dxi_dz[p]*dphik_dxi_total + deta_dz[p]*dphik_deta_total;
270 dphi[i][p].slice(0) = dphidx[i][p];
271 dphi[i][p].slice(1) = dphidy[i][p];
273 dphi[i][p].slice(2) = dphidz[i][p];
285#ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES
296 "HDiv FE gradients on non-affine-mapped elements require second-derivative support");
297 auto n_qp = dxyz_dxi.size();
299 const std::vector<RealGradient> d2xyz_dxi2(n_qp,
RealGradient());
300 const std::vector<RealGradient> d2xyz_deta2(n_qp,
RealGradient());
301 const std::vector<RealGradient> d2xyz_dzeta2(n_qp,
RealGradient());
302 const std::vector<RealGradient> d2xyz_dxideta(n_qp,
RealGradient());
303 const std::vector<RealGradient> d2xyz_dxidzeta(n_qp,
RealGradient());
304 const std::vector<RealGradient> d2xyz_detadzeta(n_qp,
RealGradient());
319 const std::vector<std::vector<OutputShape>> & dphi_dxi = fe.
get_dphidxi();
320 const std::vector<std::vector<OutputShape>> & dphi_deta = fe.
get_dphideta();
321 const std::vector<std::vector<OutputShape>> & dphi_dzeta = fe.
get_dphidzeta();
332 const OutputShape phi_val =
333 hdiv_piola_map(dxyz_dxi[p], dxyz_deta[p], dxyz_dzeta[p], J[p], phi_ref);
337 J[p] * (dxi_dx[p]*d2xyz_dxi2[p](0) + deta_dx[p]*d2xyz_dxideta[p](0) + dzeta_dx[p]*d2xyz_dxidzeta[p](0) +
338 dxi_dy[p]*d2xyz_dxi2[p](1) + deta_dy[p]*d2xyz_dxideta[p](1) + dzeta_dy[p]*d2xyz_dxidzeta[p](1) +
339 dxi_dz[p]*d2xyz_dxi2[p](2) + deta_dz[p]*d2xyz_dxideta[p](2) + dzeta_dz[p]*d2xyz_dxidzeta[p](2));
341 J[p] * (dxi_dx[p]*d2xyz_dxideta[p](0) + deta_dx[p]*d2xyz_deta2[p](0) + dzeta_dx[p]*d2xyz_detadzeta[p](0) +
342 dxi_dy[p]*d2xyz_dxideta[p](1) + deta_dy[p]*d2xyz_deta2[p](1) + dzeta_dy[p]*d2xyz_detadzeta[p](1) +
343 dxi_dz[p]*d2xyz_dxideta[p](2) + deta_dz[p]*d2xyz_deta2[p](2) + dzeta_dz[p]*d2xyz_detadzeta[p](2));
344 const Real dJ_dzeta =
345 J[p] * (dxi_dx[p]*d2xyz_dxidzeta[p](0) + deta_dx[p]*d2xyz_detadzeta[p](0) + dzeta_dx[p]*d2xyz_dzeta2[p](0) +
346 dxi_dy[p]*d2xyz_dxidzeta[p](1) + deta_dy[p]*d2xyz_detadzeta[p](1) + dzeta_dy[p]*d2xyz_dzeta2[p](1) +
347 dxi_dz[p]*d2xyz_dxidzeta[p](2) + deta_dz[p]*d2xyz_detadzeta[p](2) + dzeta_dz[p]*d2xyz_dzeta2[p](2));
349 for (
unsigned int k = 0; k < 3; ++k)
357 const Real phik = phi_val(k);
360 const Real d2xk_dxi2 = d2xyz_dxi2[p](k);
361 const Real d2xk_deta2 = d2xyz_deta2[p](k);
362 const Real d2xk_dzeta2 = d2xyz_dzeta2[p](k);
363 const Real d2xk_dxideta = d2xyz_dxideta[p](k);
364 const Real d2xk_dxidzeta = d2xyz_dxidzeta[p](k);
365 const Real d2xk_detadzeta = d2xyz_detadzeta[p](k);
367 const Real dphik_dxi_B = (d2xk_dxi2*phi_ref(0) + d2xk_dxideta*phi_ref(1) + d2xk_dxidzeta*phi_ref(2))/J[p];
368 const Real dphik_deta_B = (d2xk_dxideta*phi_ref(0) + d2xk_deta2*phi_ref(1) + d2xk_detadzeta*phi_ref(2))/J[p];
369 const Real dphik_dzeta_B = (d2xk_dxidzeta*phi_ref(0) + d2xk_detadzeta*phi_ref(1) + d2xk_dzeta2*phi_ref(2))/J[p];
372 const Real Fk_xi = dxyz_dxi[p](k);
373 const Real Fk_eta = dxyz_deta[p](k);
374 const Real Fk_zeta = dxyz_dzeta[p](k);
376 const Real dphik_dxi_C = (Fk_xi*dphi_dxi[i][p](0) + Fk_eta*dphi_dxi[i][p](1) + Fk_zeta*dphi_dxi[i][p](2))/J[p];
377 const Real dphik_deta_C = (Fk_xi*dphi_deta[i][p](0) + Fk_eta*dphi_deta[i][p](1) + Fk_zeta*dphi_deta[i][p](2))/J[p];
378 const Real dphik_dzeta_C = (Fk_xi*dphi_dzeta[i][p](0) + Fk_eta*dphi_dzeta[i][p](1) + Fk_zeta*dphi_dzeta[i][p](2))/J[p];
380 const Real dphik_dxi_total = -phik*dJ_dxi/J[p] + dphik_dxi_B + dphik_dxi_C;
381 const Real dphik_deta_total = -phik*dJ_deta/J[p] + dphik_deta_B + dphik_deta_C;
382 const Real dphik_dzeta_total = -phik*dJ_dzeta/J[p] + dphik_dzeta_B + dphik_dzeta_C;
384 dphidx[i][p](k) = dxi_dx[p]*dphik_dxi_total + deta_dx[p]*dphik_deta_total + dzeta_dx[p]*dphik_dzeta_total;
385 dphidy[i][p](k) = dxi_dy[p]*dphik_dxi_total + deta_dy[p]*dphik_deta_total + dzeta_dy[p]*dphik_dzeta_total;
386 dphidz[i][p](k) = dxi_dz[p]*dphik_dxi_total + deta_dz[p]*dphik_deta_total + dzeta_dz[p]*dphik_dzeta_total;
389 dphi[i][p].slice(0) = dphidx[i][p];
390 dphi[i][p].slice(1) = dphidy[i][p];
391 dphi[i][p].slice(2) = dphidz[i][p];
398 libmesh_error_msg(
"Invalid dim = " <<
dim);