Real FE<3,HERMITE>::shape(const Elem* elem, const Order order, const unsigned int i, const Point& p) { libmesh_assert(elem); std::vector<std::vector<Real> > dxdxi(3, std::vector<Real>(2, 0)); #ifdef DEBUG std::vector<Real> dydxi(2), dzdeta(2), dxdzeta(2); std::vector<Real> dzdxi(2), dxdeta(2), dydzeta(2); #endif //DEBUG hermite_compute_coefs(elem, dxdxi #ifdef DEBUG , dydxi, dzdeta, dxdzeta, dzdxi, dxdeta, dydzeta #endif ); const ElemType type = elem->type(); const Order totalorder = static_cast<Order>(order + elem->p_level()); switch (totalorder) { // 3rd-order tricubic Hermite functions case THIRD: { switch (type) { case HEX8: case HEX20: case HEX27: { libmesh_assert_less (i, 64); std::vector<unsigned int> bases1D; Real coef = hermite_bases_3D(bases1D, dxdxi, totalorder, i); return coef * FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape(bases1D[2],p(2)); } default: libMesh::err << "ERROR: Unsupported element type!" << std::endl; libmesh_error(); } } // by default throw an error default: libMesh::err << "ERROR: Unsupported polynomial order!" << std::endl; libmesh_error(); } libmesh_error(); return 0.; }
Real FE<2,HERMITE>::shape_second_deriv(const Elem* elem, const Order order, const unsigned int i, const unsigned int j, const Point& p) { libmesh_assert(elem); libmesh_assert (j == 0 || j == 1 || j == 2); hermite_compute_coefs(elem); #ifdef LIBMESH_HAVE_TBB_API std::vector<std::vector<Real> > & dxdxi = dxdxi_tls.local(); #endif // LIBMESH_HAVE_TBB_API const ElemType type = elem->type(); const Order totalorder = static_cast<Order>(order + elem->p_level()); switch (type) { case QUAD4: libmesh_assert_less (totalorder, 4); case QUAD8: case QUAD9: { libmesh_assert_less (i, (totalorder+1u)*(totalorder+1u)); std::vector<unsigned int> bases1D; Real coef = hermite_bases_2D(bases1D, dxdxi, totalorder, i); switch (j) { case 0: return coef * FEHermite<1>::hermite_raw_shape_second_deriv(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)); case 1: return coef * FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1)); case 2: return coef * FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape_second_deriv(bases1D[1],p(1)); default: libmesh_error(); } } default: libMesh::err << "ERROR: Unsupported element type!" << std::endl; libmesh_error(); } libmesh_error(); return 0.; }
Real FE<3,HERMITE>::shape_second_deriv(const Elem* elem, const Order order, const unsigned int i, const unsigned int j, const Point& p) { libmesh_assert(elem); hermite_compute_coefs(elem); #ifdef LIBMESH_HAVE_TBB_API std::vector<std::vector<Real> > & dxdxi = dxdxi_tls.local(); #endif const ElemType type = elem->type(); const Order totalorder = static_cast<Order>(order + elem->p_level()); switch (totalorder) { // 3rd-order tricubic Hermite functions case THIRD: { switch (type) { case HEX8: case HEX20: case HEX27: { libmesh_assert_less (i, 64); std::vector<unsigned int> bases1D; Real coef = hermite_bases_3D(bases1D, dxdxi, totalorder, i); switch (j) // Derivative type { case 0: return coef * FEHermite<1>::hermite_raw_shape_second_deriv(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape(bases1D[2],p(2)); break; case 1: return coef * FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape(bases1D[2],p(2)); break; case 2: return coef * FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape_second_deriv(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape(bases1D[2],p(2)); break; case 3: return coef * FEHermite<1>::hermite_raw_shape_deriv(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape_deriv(bases1D[2],p(2)); break; case 4: return coef * FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape_deriv(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape_deriv(bases1D[2],p(2)); break; case 5: return coef * FEHermite<1>::hermite_raw_shape(bases1D[0],p(0)) * FEHermite<1>::hermite_raw_shape(bases1D[1],p(1)) * FEHermite<1>::hermite_raw_shape_second_deriv(bases1D[2],p(2)); break; } } default: libMesh::err << "ERROR: Unsupported element type!" << std::endl; libmesh_error(); } } // by default throw an error default: libMesh::err << "ERROR: Unsupported polynomial order!" << std::endl; libmesh_error(); } libmesh_error(); return 0.; }