22 #include "libmesh/fe.h" 
   23 #include "libmesh/elem.h" 
   34   libmesh_error_msg(
"Nedelec elements require the element type \nbecause edge orientation is needed.");
 
   45                                       const bool add_p_level)
 
   50   const Order totalorder = static_cast<Order>(order + add_p_level * elem->
p_level());
 
   62               libmesh_assert_less (i, 12);
 
   65               const Real eta  = p(1);
 
   66               const Real zeta = p(2);
 
   71               libmesh_assert_less_equal ( std::fabs(xi),   1.0+10*
TOLERANCE );
 
   72               libmesh_assert_less_equal ( std::fabs(eta),  1.0+10*
TOLERANCE );
 
   73               libmesh_assert_less_equal ( std::fabs(zeta), 1.0+10*
TOLERANCE );
 
   80                       return RealGradient( -0.125*(1.0-eta-zeta+eta*zeta), 0.0, 0.0 );
 
   82                       return RealGradient(  0.125*(1.0-eta-zeta+eta*zeta), 0.0, 0.0 );
 
   87                       return RealGradient( 0.0, -0.125*(1.0+xi-zeta-xi*zeta), 0.0 );
 
   89                       return RealGradient( 0.0,  0.125*(1.0+xi-zeta-xi*zeta), 0.0 );
 
   94                       return RealGradient(  0.125*(1.0+eta-zeta-eta*zeta), 0.0, 0.0 );
 
   96                       return RealGradient( -0.125*(1.0+eta-zeta-eta*zeta), 0.0, 0.0 );
 
  101                       return RealGradient( 0.0,  0.125*(1.0-xi-zeta+xi*zeta), 0.0 );
 
  103                       return RealGradient( 0.0, -0.125*(1.0-xi-zeta+xi*zeta), 0.0 );
 
  108                       return RealGradient( 0.0, 0.0, -0.125*(1.0-xi-eta+xi*eta) );
 
  110                       return RealGradient( 0.0, 0.0,  0.125*(1.0-xi-eta+xi*eta) );
 
  115                       return RealGradient( 0.0, 0.0, -0.125*(1.0+xi-eta-xi*eta) );
 
  117                       return RealGradient( 0.0, 0.0,  0.125*(1.0+xi-eta-xi*eta) );
 
  122                       return RealGradient( 0.0, 0.0, -0.125*(1.0+xi+eta+xi*eta) );
 
  124                       return RealGradient( 0.0, 0.0,  0.125*(1.0+xi+eta+xi*eta) );
 
  129                       return RealGradient( 0.0, 0.0, -0.125*(1.0-xi+eta-xi*eta) );
 
  131                       return RealGradient( 0.0, 0.0,  0.125*(1.0-xi+eta-xi*eta) );
 
  136                       return RealGradient( -0.125*(1.0-eta+zeta-eta*zeta), 0.0, 0.0 );
 
  138                       return RealGradient(  0.125*(1.0-eta+zeta-eta*zeta), 0.0, 0.0 );
 
  143                       return RealGradient( 0.0, -0.125*(1.0+xi+zeta+xi*zeta), 0.0 );
 
  145                       return RealGradient( 0.0,  0.125*(1.0+xi+zeta+xi*zeta), 0.0 );
 
  150                       return RealGradient( -0.125*(1.0+eta+zeta+eta*zeta), 0.0, 0.0 );
 
  152                       return RealGradient(  0.125*(1.0+eta+zeta+eta*zeta), 0.0, 0.0 );
 
  157                       return RealGradient( 0.0, -0.125*(1.0-xi+zeta-xi*zeta), 0.0 );
 
  159                       return RealGradient( 0.0,  0.125*(1.0-xi+zeta-xi*zeta), 0.0 );
 
  163                   libmesh_error_msg(
"Invalid i = " << i);
 
  171               libmesh_assert_less (i, 6);
 
  173               libmesh_not_implemented();
 
  178             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << elem->
type());
 
  184       libmesh_error_msg(
"ERROR: Unsupported 3D FE order!: " << totalorder);
 
  186 #else // LIBMESH_DIM != 3 
  188   libmesh_not_implemented();
 
  202   libmesh_error_msg(
"Nedelec elements require the element type \nbecause edge orientation is needed.");
 
  209                                             const unsigned int i,
 
  210                                             const unsigned int j,
 
  212                                             const bool add_p_level)
 
  216   libmesh_assert_less (j, 3);
 
  218   const Order totalorder = static_cast<Order>(order + add_p_level * elem->
p_level());
 
  224         switch (elem->
type())
 
  229               libmesh_assert_less (i, 12);
 
  231               const Real xi   = p(0);
 
  232               const Real eta  = p(1);
 
  233               const Real zeta = p(2);
 
  238               libmesh_assert_less_equal ( std::fabs(xi),   1.0+
TOLERANCE );
 
  239               libmesh_assert_less_equal ( std::fabs(eta),  1.0+
TOLERANCE );
 
  240               libmesh_assert_less_equal ( std::fabs(zeta), 1.0+
TOLERANCE );
 
  311                         libmesh_error_msg(
"Invalid i = " << i);
 
  383                         libmesh_error_msg(
"Invalid i = " << i);
 
  456                         libmesh_error_msg(
"Invalid i = " << i);
 
  462                   libmesh_error_msg(
"Invalid j = " << j);
 
  470               libmesh_assert_less (i, 6);
 
  472               libmesh_not_implemented();
 
  477             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << elem->
type());
 
  483       libmesh_error_msg(
"ERROR: Unsupported 3D FE order!: " << totalorder);
 
  486 #else // LIBMESH_DIM != 3 
  488   libmesh_not_implemented();
 
  494 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 
  502   libmesh_error_msg(
"Nedelec elements require the element type \nbecause edge orientation is needed.");
 
  511                                                    const unsigned int i,
 
  512                                                    const unsigned int j,
 
  513                                                    const Point & libmesh_dbg_var(p),
 
  514                                                    const bool add_p_level)
 
  526   libmesh_assert_less (j, 6);
 
  528   const Order totalorder = static_cast<Order>(order + add_p_level * elem->
p_level());
 
  535         switch (elem->
type())
 
  540               libmesh_assert_less (i, 12);
 
  543               const Real xi   = p(0);
 
  544               const Real eta  = p(1);
 
  545               const Real zeta = p(2);
 
  548               libmesh_assert_less_equal ( std::fabs(xi),   1.0+
TOLERANCE );
 
  549               libmesh_assert_less_equal ( std::fabs(eta),  1.0+
TOLERANCE );
 
  550               libmesh_assert_less_equal ( std::fabs(zeta), 1.0+
TOLERANCE );
 
  604                         libmesh_error_msg(
"Invalid i = " << i);
 
  660                         libmesh_error_msg(
"Invalid i = " << i);
 
  709                         libmesh_error_msg(
"Invalid i = " << i);
 
  722                   libmesh_error_msg(
"Invalid j = " << j);
 
  730               libmesh_assert_less (i, 6);
 
  732               libmesh_not_implemented();
 
  737             libmesh_error_msg(
"ERROR: Unsupported 3D element type!: " << elem->
type());
 
  744       libmesh_error_msg(
"ERROR: Unsupported 3D FE order!: " << totalorder);
 
  747 #else // LIBMESH_DIM != 3 
  750   libmesh_not_implemented();