13#include <kernel/shape.hpp> 
   29        CUDA_HOST_DEVICE 
inline T_ p0(T_ x)
 
   31          return T_(0.5) * x * (x - T_(1));
 
   36        CUDA_HOST_DEVICE 
inline T_ p1(T_ x)
 
   38          return T_(0.5) * x * (x + T_(1));
 
   43        CUDA_HOST_DEVICE 
inline T_ p2(T_ x)
 
   45          return (T_(1) - x) * (T_(1) + x);
 
   51        CUDA_HOST_DEVICE 
inline T_ d1p0(T_ x)
 
   57        CUDA_HOST_DEVICE 
inline T_ d1p1(T_ x)
 
   63        CUDA_HOST_DEVICE 
inline T_ d1p2(T_ x)
 
   71        CUDA_HOST_DEVICE 
inline T_ d2p0(T_)
 
   77        CUDA_HOST_DEVICE 
inline T_ d2p1(T_)
 
   83        CUDA_HOST_DEVICE 
inline T_ d2p2(T_)
 
   92      template<
typename Po
intType_, 
typename DataType_, 
typename Shape_>
 
   95      template<
typename Po
intType_, 
typename DataType_>
 
   96      struct EvalHelper<PointType_, DataType_, Shape::Simplex<2>>
 
   98        typedef DataType_ DataType;
 
  100        CUDA_HOST_DEVICE 
static constexpr int get_num_local_dofs()
 
  105        template<
typename EvalData_>
 
  106        CUDA_HOST_DEVICE 
static inline void eval_ref_values(EvalData_& data, 
const PointType_& point)
 
  109            data.phi[0].ref_value = DataType(2) * (point[0] + point[1] - DataType(0.5)) * (point[0] + point[1] - DataType(1));
 
  110            data.phi[1].ref_value = DataType(2) * point[0] * (point[0] - DataType(0.5));
 
  111            data.phi[2].ref_value = DataType(2) * point[1] * (point[1] - DataType(0.5));
 
  113            data.phi[3].ref_value = DataType(4) * point[0] * point[1];
 
  114            data.phi[4].ref_value = DataType(4) * point[1] * (DataType(1) - point[0] - point[1]);
 
  115            data.phi[5].ref_value = DataType(4) * point[0] * (DataType(1) - point[0] - point[1]);
 
  118        template<
typename EvalData_>
 
  119        CUDA_HOST_DEVICE 
static inline void eval_ref_gradients(
 
  121          const PointType_& point)
 
  124          data.phi[0].ref_grad[0] = DataType(4) * (point[0] + point[1]) - DataType(3);
 
  125          data.phi[0].ref_grad[1] = DataType(4) * (point[0] + point[1]) - DataType(3);
 
  126          data.phi[1].ref_grad[0] = DataType(4) * point[0] - DataType(1);
 
  127          data.phi[1].ref_grad[1] = DataType(0);
 
  128          data.phi[2].ref_grad[0] = DataType(0);
 
  129          data.phi[2].ref_grad[1] = DataType(4) * point[1] - DataType(1);
 
  131          data.phi[3].ref_grad[0] = DataType(4) * point[1];
 
  132          data.phi[3].ref_grad[1] = DataType(4) * point[0];
 
  133          data.phi[4].ref_grad[0] = -DataType(4) * point[1];
 
  134          data.phi[4].ref_grad[1] = -DataType(4) * (DataType(2)*point[1] + point[0] - DataType(1));
 
  135          data.phi[5].ref_grad[0] = -DataType(4) * (DataType(2)*point[0] + point[1] - DataType(1));
 
  136          data.phi[5].ref_grad[1] = -DataType(4) * point[0];
 
  139        template<
typename EvalData_>
 
  140        CUDA_HOST_DEVICE 
static inline void eval_ref_hessians(
 
  142          const PointType_& DOXY(point))
 
  145          data.phi[0].ref_hess[0][0] = data.phi[0].ref_hess[1][1] =
 
  146          data.phi[0].ref_hess[0][1] = data.phi[0].ref_hess[1][0] = DataType(4);
 
  147          data.phi[1].ref_hess[0][0] = DataType(4);
 
  148          data.phi[1].ref_hess[1][1] = data.phi[1].ref_hess[0][1] = data.phi[1].ref_hess[1][0] = DataType(0);
 
  149          data.phi[2].ref_hess[1][1] = DataType(4);
 
  150          data.phi[2].ref_hess[0][0] = data.phi[2].ref_hess[0][1] = data.phi[2].ref_hess[1][0] = DataType(0);
 
  152          data.phi[3].ref_hess[0][0] = data.phi[3].ref_hess[1][1] = DataType(0);
 
  153          data.phi[3].ref_hess[0][1] = data.phi[3].ref_hess[1][0] = DataType(4);
 
  154          data.phi[4].ref_hess[0][0] = DataType(0);
 
  155          data.phi[4].ref_hess[1][1] = -DataType(8);
 
  156          data.phi[4].ref_hess[0][1] = data.phi[4].ref_hess[1][0] = -DataType(4);
 
  157          data.phi[5].ref_hess[0][0] = -DataType(8);
 
  158          data.phi[5].ref_hess[1][1] = DataType(0);
 
  159          data.phi[5].ref_hess[0][1] = data.phi[5].ref_hess[1][0] = -DataType(4);
 
  163      template<
typename Po
intType_, 
typename DataType_>
 
  166        typedef DataType_ DataType;
 
  168        CUDA_HOST_DEVICE 
static constexpr int get_num_local_dofs()
 
  173        template<
typename EvalData_>
 
  174        CUDA_HOST_DEVICE 
static inline void eval_ref_values(EvalData_& data, 
const PointType_& point)
 
  177          data.phi[0].ref_value = DataType(2) * (point[0] + point[1] + point[2] - DataType(0.5)) * (point[0] + point[1] + point[2] - DataType(1));
 
  178          data.phi[1].ref_value = DataType(2) * point[0] * (point[0] - DataType(0.5));
 
  179          data.phi[2].ref_value = DataType(2) * point[1] * (point[1] - DataType(0.5));
 
  180          data.phi[3].ref_value = DataType(2) * point[2] * (point[2] - DataType(0.5));
 
  182          data.phi[4].ref_value = DataType(4) * point[0] * (DataType(1) - point[0] - point[1] - point[2]);
 
  183          data.phi[5].ref_value = DataType(4) * point[1] * (DataType(1) - point[0] - point[1] - point[2]);
 
  184          data.phi[6].ref_value = DataType(4) * point[2] * (DataType(1) - point[0] - point[1] - point[2]);
 
  185          data.phi[7].ref_value = DataType(4) * point[0] * point[1];
 
  186          data.phi[8].ref_value = DataType(4) * point[0] * point[2];
 
  187          data.phi[9].ref_value = DataType(4) * point[1] * point[2];
 
  190        template<
typename EvalData_>
 
  191        CUDA_HOST_DEVICE 
static inline void eval_ref_gradients(
 
  193          const PointType_& point)
 
  196          data.phi[0].ref_grad[0] = DataType(4) * (point[0] + point[1] + point[2]) - DataType(3);
 
  197          data.phi[0].ref_grad[1] = DataType(4) * (point[0] + point[1] + point[2]) - DataType(3);
 
  198          data.phi[0].ref_grad[2] = DataType(4) * (point[0] + point[1] + point[2]) - DataType(3);
 
  199          data.phi[1].ref_grad[0] = DataType(4) * point[0] - DataType(1);
 
  200          data.phi[1].ref_grad[1] = DataType(0);
 
  201          data.phi[1].ref_grad[2] = DataType(0);
 
  202          data.phi[2].ref_grad[0] = DataType(0);
 
  203          data.phi[2].ref_grad[1] = DataType(4) * point[1] - DataType(1);
 
  204          data.phi[2].ref_grad[2] = DataType(0);
 
  205          data.phi[3].ref_grad[0] = DataType(0);
 
  206          data.phi[3].ref_grad[1] = DataType(0);
 
  207          data.phi[3].ref_grad[2] = DataType(4) * point[2] - DataType(1);
 
  209          data.phi[4].ref_grad[0] = -DataType(4) * (DataType(2)*point[0] + point[1] + point[2] - DataType(1));
 
  210          data.phi[4].ref_grad[1] = -DataType(4) * point[0];
 
  211          data.phi[4].ref_grad[2] = -DataType(4) * point[0];
 
  212          data.phi[5].ref_grad[0] = -DataType(4) * point[1];
 
  213          data.phi[5].ref_grad[1] = -DataType(4) * (DataType(2)*point[1] + point[0] + point[2] - DataType(1));
 
  214          data.phi[5].ref_grad[2] = -DataType(4) * point[1];
 
  215          data.phi[6].ref_grad[0] = -DataType(4) * point[2];
 
  216          data.phi[6].ref_grad[1] = -DataType(4) * point[2];
 
  217          data.phi[6].ref_grad[2] = -DataType(4) * (DataType(2)*point[2] + point[0] + point[1] - DataType(1));
 
  218          data.phi[7].ref_grad[0] = DataType(4) * point[1];
 
  219          data.phi[7].ref_grad[1] = DataType(4) * point[0];
 
  220          data.phi[7].ref_grad[2] = DataType(0);
 
  221          data.phi[8].ref_grad[0] = DataType(4) * point[2];
 
  222          data.phi[8].ref_grad[1] = DataType(0);
 
  223          data.phi[8].ref_grad[2] = DataType(4) * point[0];
 
  224          data.phi[9].ref_grad[0] = DataType(0);
 
  225          data.phi[9].ref_grad[1] = DataType(4) * point[2];
 
  226          data.phi[9].ref_grad[2] = DataType(4) * point[1];
 
  229        template<
typename EvalData_>
 
  230        CUDA_HOST_DEVICE 
static inline void eval_ref_hessians(
 
  232          const PointType_& DOXY(point))
 
  235          data.phi[0].ref_hess[0][0] = DataType(4);
 
  236          data.phi[0].ref_hess[1][1] = DataType(4);
 
  237          data.phi[0].ref_hess[2][2] = DataType(4);
 
  238          data.phi[0].ref_hess[0][1] = data.phi[0].ref_hess[1][0] = DataType(4);
 
  239          data.phi[0].ref_hess[0][2] = data.phi[0].ref_hess[2][0] = DataType(4);
 
  240          data.phi[0].ref_hess[1][2] = data.phi[0].ref_hess[2][1] = DataType(4);
 
  242          data.phi[1].ref_hess[0][0] = DataType(4);
 
  243          data.phi[1].ref_hess[1][1] = DataType(0);
 
  244          data.phi[1].ref_hess[2][2] = DataType(0);
 
  245          data.phi[1].ref_hess[0][1] = data.phi[1].ref_hess[1][0] = DataType(0);
 
  246          data.phi[1].ref_hess[0][2] = data.phi[1].ref_hess[2][0] = DataType(0);
 
  247          data.phi[1].ref_hess[1][2] = data.phi[1].ref_hess[2][1] = DataType(0);
 
  249          data.phi[2].ref_hess[0][0] = DataType(0);
 
  250          data.phi[2].ref_hess[1][1] = DataType(4);
 
  251          data.phi[2].ref_hess[2][2] = DataType(0);
 
  252          data.phi[2].ref_hess[0][1] = data.phi[2].ref_hess[1][0] = DataType(0);
 
  253          data.phi[2].ref_hess[0][2] = data.phi[2].ref_hess[2][0] = DataType(0);
 
  254          data.phi[2].ref_hess[1][2] = data.phi[2].ref_hess[2][1] = DataType(0);
 
  256          data.phi[3].ref_hess[0][0] = DataType(0);
 
  257          data.phi[3].ref_hess[1][1] = DataType(0);
 
  258          data.phi[3].ref_hess[2][2] = DataType(4);
 
  259          data.phi[3].ref_hess[0][1] = data.phi[3].ref_hess[1][0] = DataType(0);
 
  260          data.phi[3].ref_hess[0][2] = data.phi[3].ref_hess[2][0] = DataType(0);
 
  261          data.phi[3].ref_hess[1][2] = data.phi[3].ref_hess[2][1] = DataType(0);
 
  264          data.phi[4].ref_hess[0][0] = -DataType(8);
 
  265          data.phi[4].ref_hess[1][1] = DataType(0);
 
  266          data.phi[4].ref_hess[2][2] = DataType(0);
 
  267          data.phi[4].ref_hess[0][1] = data.phi[4].ref_hess[1][0] = -DataType(4);
 
  268          data.phi[4].ref_hess[0][2] = data.phi[4].ref_hess[2][0] = -DataType(4);
 
  269          data.phi[4].ref_hess[1][2] = data.phi[4].ref_hess[2][1] = DataType(0);
 
  271          data.phi[5].ref_hess[0][0] = DataType(0);
 
  272          data.phi[5].ref_hess[1][1] = -DataType(8);
 
  273          data.phi[5].ref_hess[2][2] = DataType(0);
 
  274          data.phi[5].ref_hess[0][1] = data.phi[5].ref_hess[1][0] = -DataType(4);
 
  275          data.phi[5].ref_hess[0][2] = data.phi[5].ref_hess[2][0] = DataType(0);
 
  276          data.phi[5].ref_hess[1][2] = data.phi[5].ref_hess[2][1] = -DataType(4);
 
  278          data.phi[6].ref_hess[0][0] = DataType(0);
 
  279          data.phi[6].ref_hess[1][1] = DataType(0);
 
  280          data.phi[6].ref_hess[2][2] = -DataType(8);
 
  281          data.phi[6].ref_hess[0][1] = data.phi[6].ref_hess[1][0] = DataType(0);
 
  282          data.phi[6].ref_hess[0][2] = data.phi[6].ref_hess[2][0] = -DataType(4);
 
  283          data.phi[6].ref_hess[1][2] = data.phi[6].ref_hess[2][1] = -DataType(4);
 
  285          data.phi[7].ref_hess[0][0] = DataType(0);
 
  286          data.phi[7].ref_hess[1][1] = DataType(0);
 
  287          data.phi[7].ref_hess[2][2] = DataType(0);
 
  288          data.phi[7].ref_hess[0][1] = data.phi[7].ref_hess[1][0] = DataType(4);
 
  289          data.phi[7].ref_hess[0][2] = data.phi[7].ref_hess[2][0] = DataType(0);
 
  290          data.phi[7].ref_hess[1][2] = data.phi[7].ref_hess[2][1] = DataType(0);
 
  292          data.phi[8].ref_hess[0][0] = DataType(0);
 
  293          data.phi[8].ref_hess[1][1] = DataType(0);
 
  294          data.phi[8].ref_hess[2][2] = DataType(0);
 
  295          data.phi[8].ref_hess[0][1] = data.phi[8].ref_hess[1][0] = DataType(0);
 
  296          data.phi[8].ref_hess[0][2] = data.phi[8].ref_hess[2][0] = DataType(4);
 
  297          data.phi[8].ref_hess[1][2] = data.phi[8].ref_hess[2][1] = DataType(0);
 
  299          data.phi[9].ref_hess[0][0] = DataType(0);
 
  300          data.phi[9].ref_hess[1][1] = DataType(0);
 
  301          data.phi[9].ref_hess[2][2] = DataType(0);
 
  302          data.phi[9].ref_hess[0][1] = data.phi[9].ref_hess[1][0] = DataType(0);
 
  303          data.phi[9].ref_hess[0][2] = data.phi[9].ref_hess[2][0] = DataType(0);
 
  304          data.phi[9].ref_hess[1][2] = data.phi[9].ref_hess[2][1] = DataType(4);
 
  308      template<
typename Po
intType_, 
typename DataType_>
 
  309      struct EvalHelper<PointType_, DataType_, Shape::Hypercube<1>>
 
  311        typedef DataType_ DataType;
 
  313        CUDA_HOST_DEVICE 
static constexpr int get_num_local_dofs()
 
  318        template<
typename EvalData_>
 
  319        CUDA_HOST_DEVICE 
static inline void eval_ref_values(EvalData_& data, 
const PointType_& point)
 
  321          data.phi[0].ref_value = Intern::p0(point[0]);
 
  322          data.phi[1].ref_value = Intern::p1(point[0]);
 
  323          data.phi[2].ref_value = Intern::p2(point[0]);
 
  326        template<
typename EvalData_>
 
  327        CUDA_HOST_DEVICE 
static inline void eval_ref_gradients(
 
  329          const PointType_& point)
 
  331          data.phi[0].ref_grad[0] = Intern::d1p0(point[0]);
 
  332          data.phi[1].ref_grad[0] = Intern::d1p1(point[0]);
 
  333          data.phi[2].ref_grad[0] = Intern::d1p2(point[0]);
 
  336        template<
typename EvalData_>
 
  337        CUDA_HOST_DEVICE 
static inline void eval_ref_hessians(
 
  339          const PointType_& point)
 
  341          data.phi[0].ref_hess[0][0] = Intern::d2p0(point[0]);
 
  342          data.phi[1].ref_hess[0][0] = Intern::d2p1(point[0]);
 
  343          data.phi[2].ref_hess[0][0] = Intern::d2p2(point[0]);
 
  347      template<
typename Po
intType_, 
typename DataType_>
 
  348      struct EvalHelper<PointType_, DataType_, Shape::Hypercube<2>>
 
  350        typedef DataType_ DataType;
 
  352        CUDA_HOST_DEVICE 
static constexpr int get_num_local_dofs()
 
  357        template<
typename EvalData_>
 
  358        CUDA_HOST_DEVICE 
static inline void eval_ref_values(EvalData_& data, 
const PointType_& point)
 
  360          using namespace Lagrange2::Intern;
 
  363          data.phi[0].ref_value = p0(point[0]) * p0(point[1]);
 
  364          data.phi[1].ref_value = p1(point[0]) * p0(point[1]);
 
  365          data.phi[2].ref_value = p0(point[0]) * p1(point[1]);
 
  366          data.phi[3].ref_value = p1(point[0]) * p1(point[1]);
 
  368          data.phi[4].ref_value = p2(point[0]) * p0(point[1]);
 
  369          data.phi[5].ref_value = p2(point[0]) * p1(point[1]);
 
  370          data.phi[6].ref_value = p0(point[0]) * p2(point[1]);
 
  371          data.phi[7].ref_value = p1(point[0]) * p2(point[1]);
 
  373          data.phi[8].ref_value = p2(point[0]) * p2(point[1]);
 
  376        template<
typename EvalData_>
 
  377        CUDA_HOST_DEVICE 
static inline void eval_ref_gradients(
 
  379          const PointType_& point)
 
  381          using namespace Lagrange2::Intern;
 
  384          data.phi[0].ref_grad[0] = d1p0(point[0]) * p0(point[1]);
 
  385          data.phi[0].ref_grad[1] = p0(point[0]) * d1p0(point[1]);
 
  386          data.phi[1].ref_grad[0] = d1p1(point[0]) * p0(point[1]);
 
  387          data.phi[1].ref_grad[1] = p1(point[0]) * d1p0(point[1]);
 
  388          data.phi[2].ref_grad[0] = d1p0(point[0]) * p1(point[1]);
 
  389          data.phi[2].ref_grad[1] = p0(point[0]) * d1p1(point[1]);
 
  390          data.phi[3].ref_grad[0] = d1p1(point[0]) * p1(point[1]);
 
  391          data.phi[3].ref_grad[1] = p1(point[0]) * d1p1(point[1]);
 
  393          data.phi[4].ref_grad[0] = d1p2(point[0]) * p0(point[1]);
 
  394          data.phi[4].ref_grad[1] = p2(point[0]) * d1p0(point[1]);
 
  395          data.phi[5].ref_grad[0] = d1p2(point[0]) * p1(point[1]);
 
  396          data.phi[5].ref_grad[1] = p2(point[0]) * d1p1(point[1]);
 
  397          data.phi[6].ref_grad[0] = d1p0(point[0]) * p2(point[1]);
 
  398          data.phi[6].ref_grad[1] = p0(point[0]) * d1p2(point[1]);
 
  399          data.phi[7].ref_grad[0] = d1p1(point[0]) * p2(point[1]);
 
  400          data.phi[7].ref_grad[1] = p1(point[0]) * d1p2(point[1]);
 
  402          data.phi[8].ref_grad[0] = d1p2(point[0]) * p2(point[1]);
 
  403          data.phi[8].ref_grad[1] = p2(point[0]) * d1p2(point[1]);
 
  406        template<
typename EvalData_>
 
  407        CUDA_HOST_DEVICE 
static inline void eval_ref_hessians(
 
  409          const PointType_& point)
 
  411          using namespace Lagrange2::Intern;
 
  414          data.phi[0].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]);
 
  415          data.phi[0].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]);
 
  416          data.phi[0].ref_hess[1][0] =
 
  417          data.phi[0].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]);
 
  418          data.phi[1].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]);
 
  419          data.phi[1].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]);
 
  420          data.phi[1].ref_hess[1][0] =
 
  421          data.phi[1].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]);
 
  422          data.phi[2].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]);
 
  423          data.phi[2].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]);
 
  424          data.phi[2].ref_hess[1][0] =
 
  425          data.phi[2].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]);
 
  426          data.phi[3].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]);
 
  427          data.phi[3].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]);
 
  428          data.phi[3].ref_hess[1][0] =
 
  429          data.phi[3].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]);
 
  431          data.phi[4].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]);
 
  432          data.phi[4].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]);
 
  433          data.phi[4].ref_hess[1][0] =
 
  434          data.phi[4].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]);
 
  435          data.phi[5].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]);
 
  436          data.phi[5].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]);
 
  437          data.phi[5].ref_hess[1][0] =
 
  438          data.phi[5].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]);
 
  439          data.phi[6].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]);
 
  440          data.phi[6].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]);
 
  441          data.phi[6].ref_hess[1][0] =
 
  442          data.phi[6].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]);
 
  443          data.phi[7].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]);
 
  444          data.phi[7].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]);
 
  445          data.phi[7].ref_hess[1][0] =
 
  446          data.phi[7].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]);
 
  448          data.phi[8].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]);
 
  449          data.phi[8].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]);
 
  450          data.phi[8].ref_hess[1][0] =
 
  451          data.phi[8].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]);
 
  455      template<
typename Po
intType_, 
typename DataType_>
 
  456      struct EvalHelper<PointType_, DataType_, Shape::Hypercube<3>>
 
  458        typedef DataType_ DataType;
 
  460        CUDA_HOST_DEVICE 
static constexpr int get_num_local_dofs()
 
  465        template<
typename EvalData_>
 
  466        CUDA_HOST_DEVICE 
static inline void eval_ref_values(EvalData_& data, 
const PointType_& point)
 
  468          using namespace Lagrange2::Intern;
 
  471          data.phi[0].ref_value = p0(point[0]) * p0(point[1]) * p0(point[2]);
 
  472          data.phi[1].ref_value = p1(point[0]) * p0(point[1]) * p0(point[2]);
 
  473          data.phi[2].ref_value = p0(point[0]) * p1(point[1]) * p0(point[2]);
 
  474          data.phi[3].ref_value = p1(point[0]) * p1(point[1]) * p0(point[2]);
 
  475          data.phi[4].ref_value = p0(point[0]) * p0(point[1]) * p1(point[2]);
 
  476          data.phi[5].ref_value = p1(point[0]) * p0(point[1]) * p1(point[2]);
 
  477          data.phi[6].ref_value = p0(point[0]) * p1(point[1]) * p1(point[2]);
 
  478          data.phi[7].ref_value = p1(point[0]) * p1(point[1]) * p1(point[2]);
 
  480          data.phi[ 8].ref_value = p2(point[0]) * p0(point[1]) * p0(point[2]);
 
  481          data.phi[ 9].ref_value = p2(point[0]) * p1(point[1]) * p0(point[2]);
 
  482          data.phi[10].ref_value = p2(point[0]) * p0(point[1]) * p1(point[2]);
 
  483          data.phi[11].ref_value = p2(point[0]) * p1(point[1]) * p1(point[2]);
 
  484          data.phi[12].ref_value = p0(point[0]) * p2(point[1]) * p0(point[2]);
 
  485          data.phi[13].ref_value = p1(point[0]) * p2(point[1]) * p0(point[2]);
 
  486          data.phi[14].ref_value = p0(point[0]) * p2(point[1]) * p1(point[2]);
 
  487          data.phi[15].ref_value = p1(point[0]) * p2(point[1]) * p1(point[2]);
 
  488          data.phi[16].ref_value = p0(point[0]) * p0(point[1]) * p2(point[2]);
 
  489          data.phi[17].ref_value = p1(point[0]) * p0(point[1]) * p2(point[2]);
 
  490          data.phi[18].ref_value = p0(point[0]) * p1(point[1]) * p2(point[2]);
 
  491          data.phi[19].ref_value = p1(point[0]) * p1(point[1]) * p2(point[2]);
 
  493          data.phi[20].ref_value = p2(point[0]) * p2(point[1]) * p0(point[2]);
 
  494          data.phi[21].ref_value = p2(point[0]) * p2(point[1]) * p1(point[2]);
 
  495          data.phi[22].ref_value = p2(point[0]) * p0(point[1]) * p2(point[2]);
 
  496          data.phi[23].ref_value = p2(point[0]) * p1(point[1]) * p2(point[2]);
 
  497          data.phi[24].ref_value = p0(point[0]) * p2(point[1]) * p2(point[2]);
 
  498          data.phi[25].ref_value = p1(point[0]) * p2(point[1]) * p2(point[2]);
 
  500          data.phi[26].ref_value = p2(point[0]) * p2(point[1]) * p2(point[2]);
 
  503        template<
typename EvalData_>
 
  504        CUDA_HOST_DEVICE 
static inline void eval_ref_gradients(
 
  506          const PointType_& point)
 
  508          using namespace Lagrange2::Intern;
 
  510          data.phi[0].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p0(point[2]);
 
  511          data.phi[0].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p0(point[2]);
 
  512          data.phi[0].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p0(point[2]);
 
  513          data.phi[1].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p0(point[2]);
 
  514          data.phi[1].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p0(point[2]);
 
  515          data.phi[1].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p0(point[2]);
 
  516          data.phi[2].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p0(point[2]);
 
  517          data.phi[2].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p0(point[2]);
 
  518          data.phi[2].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p0(point[2]);
 
  519          data.phi[3].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p0(point[2]);
 
  520          data.phi[3].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p0(point[2]);
 
  521          data.phi[3].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p0(point[2]);
 
  522          data.phi[4].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p1(point[2]);
 
  523          data.phi[4].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p1(point[2]);
 
  524          data.phi[4].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p1(point[2]);
 
  525          data.phi[5].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p1(point[2]);
 
  526          data.phi[5].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p1(point[2]);
 
  527          data.phi[5].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p1(point[2]);
 
  528          data.phi[6].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p1(point[2]);
 
  529          data.phi[6].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p1(point[2]);
 
  530          data.phi[6].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p1(point[2]);
 
  531          data.phi[7].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p1(point[2]);
 
  532          data.phi[7].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p1(point[2]);
 
  533          data.phi[7].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p1(point[2]);
 
  535          data.phi[ 8].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p0(point[2]);
 
  536          data.phi[ 8].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p0(point[2]);
 
  537          data.phi[ 8].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p0(point[2]);
 
  538          data.phi[ 9].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p0(point[2]);
 
  539          data.phi[ 9].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p0(point[2]);
 
  540          data.phi[ 9].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p0(point[2]);
 
  541          data.phi[10].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p1(point[2]);
 
  542          data.phi[10].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p1(point[2]);
 
  543          data.phi[10].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p1(point[2]);
 
  544          data.phi[11].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p1(point[2]);
 
  545          data.phi[11].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p1(point[2]);
 
  546          data.phi[11].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p1(point[2]);
 
  547          data.phi[12].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p0(point[2]);
 
  548          data.phi[12].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p0(point[2]);
 
  549          data.phi[12].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p0(point[2]);
 
  550          data.phi[13].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p0(point[2]);
 
  551          data.phi[13].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p0(point[2]);
 
  552          data.phi[13].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p0(point[2]);
 
  553          data.phi[14].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p1(point[2]);
 
  554          data.phi[14].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p1(point[2]);
 
  555          data.phi[14].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p1(point[2]);
 
  556          data.phi[15].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p1(point[2]);
 
  557          data.phi[15].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p1(point[2]);
 
  558          data.phi[15].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p1(point[2]);
 
  559          data.phi[16].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p2(point[2]);
 
  560          data.phi[16].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p2(point[2]);
 
  561          data.phi[16].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p2(point[2]);
 
  562          data.phi[17].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p2(point[2]);
 
  563          data.phi[17].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p2(point[2]);
 
  564          data.phi[17].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p2(point[2]);
 
  565          data.phi[18].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p2(point[2]);
 
  566          data.phi[18].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p2(point[2]);
 
  567          data.phi[18].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p2(point[2]);
 
  568          data.phi[19].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p2(point[2]);
 
  569          data.phi[19].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p2(point[2]);
 
  570          data.phi[19].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p2(point[2]);
 
  572          data.phi[20].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p0(point[2]);
 
  573          data.phi[20].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p0(point[2]);
 
  574          data.phi[20].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p0(point[2]);
 
  575          data.phi[21].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p1(point[2]);
 
  576          data.phi[21].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p1(point[2]);
 
  577          data.phi[21].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p1(point[2]);
 
  578          data.phi[22].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p2(point[2]);
 
  579          data.phi[22].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p2(point[2]);
 
  580          data.phi[22].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p2(point[2]);
 
  581          data.phi[23].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p2(point[2]);
 
  582          data.phi[23].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p2(point[2]);
 
  583          data.phi[23].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p2(point[2]);
 
  584          data.phi[24].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p2(point[2]);
 
  585          data.phi[24].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p2(point[2]);
 
  586          data.phi[24].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p2(point[2]);
 
  587          data.phi[25].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p2(point[2]);
 
  588          data.phi[25].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p2(point[2]);
 
  589          data.phi[25].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p2(point[2]);
 
  591          data.phi[26].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p2(point[2]);
 
  592          data.phi[26].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p2(point[2]);
 
  593          data.phi[26].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p2(point[2]);
 
  596        template<
typename EvalData_>
 
  597        CUDA_HOST_DEVICE 
static inline void eval_ref_hessians(
 
  599          const PointType_& point)
 
  601          using namespace Lagrange2::Intern;
 
  603          data.phi[ 0].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p0(point[2]);
 
  604          data.phi[ 0].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p0(point[2]);
 
  605          data.phi[ 0].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p0(point[2]);
 
  606          data.phi[ 0].ref_hess[1][0] =
 
  607          data.phi[ 0].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]) * p0(point[2]);
 
  608          data.phi[ 0].ref_hess[2][0] =
 
  609          data.phi[ 0].ref_hess[0][2] = d1p0(point[0]) * p0(point[1]) * d1p0(point[2]);
 
  610          data.phi[ 0].ref_hess[2][1] =
 
  611          data.phi[ 0].ref_hess[1][2] = p0(point[0]) * d1p0(point[1]) * d1p0(point[2]);
 
  612          data.phi[ 1].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p0(point[2]);
 
  613          data.phi[ 1].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p0(point[2]);
 
  614          data.phi[ 1].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p0(point[2]);
 
  615          data.phi[ 1].ref_hess[1][0] =
 
  616          data.phi[ 1].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]) * p0(point[2]);
 
  617          data.phi[ 1].ref_hess[2][0] =
 
  618          data.phi[ 1].ref_hess[0][2] = d1p1(point[0]) * p0(point[1]) * d1p0(point[2]);
 
  619          data.phi[ 1].ref_hess[2][1] =
 
  620          data.phi[ 1].ref_hess[1][2] = p1(point[0]) * d1p0(point[1]) * d1p0(point[2]);
 
  621          data.phi[ 2].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p0(point[2]);
 
  622          data.phi[ 2].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p0(point[2]);
 
  623          data.phi[ 2].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p0(point[2]);
 
  624          data.phi[ 2].ref_hess[1][0] =
 
  625          data.phi[ 2].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]) * p0(point[2]);
 
  626          data.phi[ 2].ref_hess[2][0] =
 
  627          data.phi[ 2].ref_hess[0][2] = d1p0(point[0]) * p1(point[1]) * d1p0(point[2]);
 
  628          data.phi[ 2].ref_hess[2][1] =
 
  629          data.phi[ 2].ref_hess[1][2] = p0(point[0]) * d1p1(point[1]) * d1p0(point[2]);
 
  630          data.phi[ 3].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p0(point[2]);
 
  631          data.phi[ 3].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p0(point[2]);
 
  632          data.phi[ 3].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p0(point[2]);
 
  633          data.phi[ 3].ref_hess[1][0] =
 
  634          data.phi[ 3].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]) * p0(point[2]);
 
  635          data.phi[ 3].ref_hess[2][0] =
 
  636          data.phi[ 3].ref_hess[0][2] = d1p1(point[0]) * p1(point[1]) * d1p0(point[2]);
 
  637          data.phi[ 3].ref_hess[2][1] =
 
  638          data.phi[ 3].ref_hess[1][2] = p1(point[0]) * d1p1(point[1]) * d1p0(point[2]);
 
  639          data.phi[ 4].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p1(point[2]);
 
  640          data.phi[ 4].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p1(point[2]);
 
  641          data.phi[ 4].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p1(point[2]);
 
  642          data.phi[ 4].ref_hess[1][0] =
 
  643          data.phi[ 4].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]) * p1(point[2]);
 
  644          data.phi[ 4].ref_hess[2][0] =
 
  645          data.phi[ 4].ref_hess[0][2] = d1p0(point[0]) * p0(point[1]) * d1p1(point[2]);
 
  646          data.phi[ 4].ref_hess[2][1] =
 
  647          data.phi[ 4].ref_hess[1][2] = p0(point[0]) * d1p0(point[1]) * d1p1(point[2]);
 
  648          data.phi[ 5].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p1(point[2]);
 
  649          data.phi[ 5].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p1(point[2]);
 
  650          data.phi[ 5].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p1(point[2]);
 
  651          data.phi[ 5].ref_hess[1][0] =
 
  652          data.phi[ 5].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]) * p1(point[2]);
 
  653          data.phi[ 5].ref_hess[2][0] =
 
  654          data.phi[ 5].ref_hess[0][2] = d1p1(point[0]) * p0(point[1]) * d1p1(point[2]);
 
  655          data.phi[ 5].ref_hess[2][1] =
 
  656          data.phi[ 5].ref_hess[1][2] = p1(point[0]) * d1p0(point[1]) * d1p1(point[2]);
 
  657          data.phi[ 6].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p1(point[2]);
 
  658          data.phi[ 6].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p1(point[2]);
 
  659          data.phi[ 6].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p1(point[2]);
 
  660          data.phi[ 6].ref_hess[1][0] =
 
  661          data.phi[ 6].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]) * p1(point[2]);
 
  662          data.phi[ 6].ref_hess[2][0] =
 
  663          data.phi[ 6].ref_hess[0][2] = d1p0(point[0]) * p1(point[1]) * d1p1(point[2]);
 
  664          data.phi[ 6].ref_hess[2][1] =
 
  665          data.phi[ 6].ref_hess[1][2] = p0(point[0]) * d1p1(point[1]) * d1p1(point[2]);
 
  666          data.phi[ 7].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p1(point[2]);
 
  667          data.phi[ 7].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p1(point[2]);
 
  668          data.phi[ 7].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p1(point[2]);
 
  669          data.phi[ 7].ref_hess[1][0] =
 
  670          data.phi[ 7].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]) * p1(point[2]);
 
  671          data.phi[ 7].ref_hess[2][0] =
 
  672          data.phi[ 7].ref_hess[0][2] = d1p1(point[0]) * p1(point[1]) * d1p1(point[2]);
 
  673          data.phi[ 7].ref_hess[2][1] =
 
  674          data.phi[ 7].ref_hess[1][2] = p1(point[0]) * d1p1(point[1]) * d1p1(point[2]);
 
  677          data.phi[ 8].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p0(point[2]);
 
  678          data.phi[ 8].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p0(point[2]);
 
  679          data.phi[ 8].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p0(point[2]);
 
  680          data.phi[ 8].ref_hess[1][0] =
 
  681          data.phi[ 8].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]) * p0(point[2]);
 
  682          data.phi[ 8].ref_hess[2][0] =
 
  683          data.phi[ 8].ref_hess[0][2] = d1p2(point[0]) * p0(point[1]) * d1p0(point[2]);
 
  684          data.phi[ 8].ref_hess[2][1] =
 
  685          data.phi[ 8].ref_hess[1][2] = p2(point[0]) * d1p0(point[1]) * d1p0(point[2]);
 
  686          data.phi[ 9].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p0(point[2]);
 
  687          data.phi[ 9].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p0(point[2]);
 
  688          data.phi[ 9].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p0(point[2]);
 
  689          data.phi[ 9].ref_hess[1][0] =
 
  690          data.phi[ 9].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]) * p0(point[2]);
 
  691          data.phi[ 9].ref_hess[2][0] =
 
  692          data.phi[ 9].ref_hess[0][2] = d1p2(point[0]) * p1(point[1]) * d1p0(point[2]);
 
  693          data.phi[ 9].ref_hess[2][1] =
 
  694          data.phi[ 9].ref_hess[1][2] = p2(point[0]) * d1p1(point[1]) * d1p0(point[2]);
 
  695          data.phi[10].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p1(point[2]);
 
  696          data.phi[10].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p1(point[2]);
 
  697          data.phi[10].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p1(point[2]);
 
  698          data.phi[10].ref_hess[1][0] =
 
  699          data.phi[10].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]) * p1(point[2]);
 
  700          data.phi[10].ref_hess[2][0] =
 
  701          data.phi[10].ref_hess[0][2] = d1p2(point[0]) * p0(point[1]) * d1p1(point[2]);
 
  702          data.phi[10].ref_hess[2][1] =
 
  703          data.phi[10].ref_hess[1][2] = p2(point[0]) * d1p0(point[1]) * d1p1(point[2]);
 
  704          data.phi[11].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p1(point[2]);
 
  705          data.phi[11].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p1(point[2]);
 
  706          data.phi[11].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p1(point[2]);
 
  707          data.phi[11].ref_hess[1][0] =
 
  708          data.phi[11].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]) * p1(point[2]);
 
  709          data.phi[11].ref_hess[2][0] =
 
  710          data.phi[11].ref_hess[0][2] = d1p2(point[0]) * p1(point[1]) * d1p1(point[2]);
 
  711          data.phi[11].ref_hess[2][1] =
 
  712          data.phi[11].ref_hess[1][2] = p2(point[0]) * d1p1(point[1]) * d1p1(point[2]);
 
  713          data.phi[12].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p0(point[2]);
 
  714          data.phi[12].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p0(point[2]);
 
  715          data.phi[12].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p0(point[2]);
 
  716          data.phi[12].ref_hess[1][0] =
 
  717          data.phi[12].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]) * p0(point[2]);
 
  718          data.phi[12].ref_hess[2][0] =
 
  719          data.phi[12].ref_hess[0][2] = d1p0(point[0]) * p2(point[1]) * d1p0(point[2]);
 
  720          data.phi[12].ref_hess[2][1] =
 
  721          data.phi[12].ref_hess[1][2] = p0(point[0]) * d1p2(point[1]) * d1p0(point[2]);
 
  722          data.phi[13].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p0(point[2]);
 
  723          data.phi[13].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p0(point[2]);
 
  724          data.phi[13].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p0(point[2]);
 
  725          data.phi[13].ref_hess[1][0] =
 
  726          data.phi[13].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]) * p0(point[2]);
 
  727          data.phi[13].ref_hess[2][0] =
 
  728          data.phi[13].ref_hess[0][2] = d1p1(point[0]) * p2(point[1]) * d1p0(point[2]);
 
  729          data.phi[13].ref_hess[2][1] =
 
  730          data.phi[13].ref_hess[1][2] = p1(point[0]) * d1p2(point[1]) * d1p0(point[2]);
 
  731          data.phi[14].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p1(point[2]);
 
  732          data.phi[14].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p1(point[2]);
 
  733          data.phi[14].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p1(point[2]);
 
  734          data.phi[14].ref_hess[1][0] =
 
  735          data.phi[14].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]) * p1(point[2]);
 
  736          data.phi[14].ref_hess[2][0] =
 
  737          data.phi[14].ref_hess[0][2] = d1p0(point[0]) * p2(point[1]) * d1p1(point[2]);
 
  738          data.phi[14].ref_hess[2][1] =
 
  739          data.phi[14].ref_hess[1][2] = p0(point[0]) * d1p2(point[1]) * d1p1(point[2]);
 
  740          data.phi[15].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p1(point[2]);
 
  741          data.phi[15].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p1(point[2]);
 
  742          data.phi[15].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p1(point[2]);
 
  743          data.phi[15].ref_hess[1][0] =
 
  744          data.phi[15].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]) * p1(point[2]);
 
  745          data.phi[15].ref_hess[2][0] =
 
  746          data.phi[15].ref_hess[0][2] = d1p1(point[0]) * p2(point[1]) * d1p1(point[2]);
 
  747          data.phi[15].ref_hess[2][1] =
 
  748          data.phi[15].ref_hess[1][2] = p1(point[0]) * d1p2(point[1]) * d1p1(point[2]);
 
  749          data.phi[16].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p2(point[2]);
 
  750          data.phi[16].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p2(point[2]);
 
  751          data.phi[16].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p2(point[2]);
 
  752          data.phi[16].ref_hess[1][0] =
 
  753          data.phi[16].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]) * p2(point[2]);
 
  754          data.phi[16].ref_hess[2][0] =
 
  755          data.phi[16].ref_hess[0][2] = d1p0(point[0]) * p0(point[1]) * d1p2(point[2]);
 
  756          data.phi[16].ref_hess[2][1] =
 
  757          data.phi[16].ref_hess[1][2] = p0(point[0]) * d1p0(point[1]) * d1p2(point[2]);
 
  758          data.phi[17].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p2(point[2]);
 
  759          data.phi[17].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p2(point[2]);
 
  760          data.phi[17].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p2(point[2]);
 
  761          data.phi[17].ref_hess[1][0] =
 
  762          data.phi[17].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]) * p2(point[2]);
 
  763          data.phi[17].ref_hess[2][0] =
 
  764          data.phi[17].ref_hess[0][2] = d1p1(point[0]) * p0(point[1]) * d1p2(point[2]);
 
  765          data.phi[17].ref_hess[2][1] =
 
  766          data.phi[17].ref_hess[1][2] = p1(point[0]) * d1p0(point[1]) * d1p2(point[2]);
 
  767          data.phi[18].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p2(point[2]);
 
  768          data.phi[18].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p2(point[2]);
 
  769          data.phi[18].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p2(point[2]);
 
  770          data.phi[18].ref_hess[1][0] =
 
  771          data.phi[18].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]) * p2(point[2]);
 
  772          data.phi[18].ref_hess[2][0] =
 
  773          data.phi[18].ref_hess[0][2] = d1p0(point[0]) * p1(point[1]) * d1p2(point[2]);
 
  774          data.phi[18].ref_hess[2][1] =
 
  775          data.phi[18].ref_hess[1][2] = p0(point[0]) * d1p1(point[1]) * d1p2(point[2]);
 
  776          data.phi[19].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p2(point[2]);
 
  777          data.phi[19].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p2(point[2]);
 
  778          data.phi[19].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p2(point[2]);
 
  779          data.phi[19].ref_hess[1][0] =
 
  780          data.phi[19].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]) * p2(point[2]);
 
  781          data.phi[19].ref_hess[2][0] =
 
  782          data.phi[19].ref_hess[0][2] = d1p1(point[0]) * p1(point[1]) * d1p2(point[2]);
 
  783          data.phi[19].ref_hess[2][1] =
 
  784          data.phi[19].ref_hess[1][2] = p1(point[0]) * d1p1(point[1]) * d1p2(point[2]);
 
  787          data.phi[20].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p0(point[2]);
 
  788          data.phi[20].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p0(point[2]);
 
  789          data.phi[20].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p0(point[2]);
 
  790          data.phi[20].ref_hess[1][0] =
 
  791          data.phi[20].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]) * p0(point[2]);
 
  792          data.phi[20].ref_hess[2][0] =
 
  793          data.phi[20].ref_hess[0][2] = d1p2(point[0]) * p2(point[1]) * d1p0(point[2]);
 
  794          data.phi[20].ref_hess[2][1] =
 
  795          data.phi[20].ref_hess[1][2] = p2(point[0]) * d1p2(point[1]) * d1p0(point[2]);
 
  796          data.phi[21].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p1(point[2]);
 
  797          data.phi[21].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p1(point[2]);
 
  798          data.phi[21].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p1(point[2]);
 
  799          data.phi[21].ref_hess[1][0] =
 
  800          data.phi[21].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]) * p1(point[2]);
 
  801          data.phi[21].ref_hess[2][0] =
 
  802          data.phi[21].ref_hess[0][2] = d1p2(point[0]) * p2(point[1]) * d1p1(point[2]);
 
  803          data.phi[21].ref_hess[2][1] =
 
  804          data.phi[21].ref_hess[1][2] = p2(point[0]) * d1p2(point[1]) * d1p1(point[2]);
 
  805          data.phi[22].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p2(point[2]);
 
  806          data.phi[22].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p2(point[2]);
 
  807          data.phi[22].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p2(point[2]);
 
  808          data.phi[22].ref_hess[1][0] =
 
  809          data.phi[22].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]) * p2(point[2]);
 
  810          data.phi[22].ref_hess[2][0] =
 
  811          data.phi[22].ref_hess[0][2] = d1p2(point[0]) * p0(point[1]) * d1p2(point[2]);
 
  812          data.phi[22].ref_hess[2][1] =
 
  813          data.phi[22].ref_hess[1][2] = p2(point[0]) * d1p0(point[1]) * d1p2(point[2]);
 
  814          data.phi[23].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p2(point[2]);
 
  815          data.phi[23].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p2(point[2]);
 
  816          data.phi[23].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p2(point[2]);
 
  817          data.phi[23].ref_hess[1][0] =
 
  818          data.phi[23].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]) * p2(point[2]);
 
  819          data.phi[23].ref_hess[2][0] =
 
  820          data.phi[23].ref_hess[0][2] = d1p2(point[0]) * p1(point[1]) * d1p2(point[2]);
 
  821          data.phi[23].ref_hess[2][1] =
 
  822          data.phi[23].ref_hess[1][2] = p2(point[0]) * d1p1(point[1]) * d1p2(point[2]);
 
  823          data.phi[24].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p2(point[2]);
 
  824          data.phi[24].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p2(point[2]);
 
  825          data.phi[24].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p2(point[2]);
 
  826          data.phi[24].ref_hess[1][0] =
 
  827          data.phi[24].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]) * p2(point[2]);
 
  828          data.phi[24].ref_hess[2][0] =
 
  829          data.phi[24].ref_hess[0][2] = d1p0(point[0]) * p2(point[1]) * d1p2(point[2]);
 
  830          data.phi[24].ref_hess[2][1] =
 
  831          data.phi[24].ref_hess[1][2] = p0(point[0]) * d1p2(point[1]) * d1p2(point[2]);
 
  832          data.phi[25].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p2(point[2]);
 
  833          data.phi[25].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p2(point[2]);
 
  834          data.phi[25].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p2(point[2]);
 
  835          data.phi[25].ref_hess[1][0] =
 
  836          data.phi[25].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]) * p2(point[2]);
 
  837          data.phi[25].ref_hess[2][0] =
 
  838          data.phi[25].ref_hess[0][2] = d1p1(point[0]) * p2(point[1]) * d1p2(point[2]);
 
  839          data.phi[25].ref_hess[2][1] =
 
  840          data.phi[25].ref_hess[1][2] = p1(point[0]) * d1p2(point[1]) * d1p2(point[2]);
 
  843          data.phi[26].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p2(point[2]);
 
  844          data.phi[26].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p2(point[2]);
 
  845          data.phi[26].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p2(point[2]);
 
  846          data.phi[26].ref_hess[1][0] =
 
  847          data.phi[26].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]) * p2(point[2]);
 
  848          data.phi[26].ref_hess[2][0] =
 
  849          data.phi[26].ref_hess[0][2] = d1p2(point[0]) * p2(point[1]) * d1p2(point[2]);
 
  850          data.phi[26].ref_hess[2][1] =
 
  851          data.phi[26].ref_hess[1][2] = p2(point[0]) * d1p2(point[1]) * d1p2(point[2]);