5#ifndef DUNE_LOCALFUNCTIONS_LAGRANGE_LAGRANGEPRISM_HH 
    6#define DUNE_LOCALFUNCTIONS_LAGRANGE_LAGRANGEPRISM_HH 
   15#include <dune/geometry/referenceelements.hh> 
   17#include <dune/localfunctions/common/localbasis.hh> 
   18#include <dune/localfunctions/common/localfiniteelementtraits.hh> 
   19#include <dune/localfunctions/common/localkey.hh> 
   21namespace Dune { 
namespace Impl
 
   32  template<
class D, 
class R, 
unsigned int k>
 
   33  class LagrangePrismLocalBasis
 
   35    static constexpr std::size_t dim = 3;
 
   37    using Traits = LocalBasisTraits<D,dim,FieldVector<D,dim>,R,1,FieldVector<R,1>,FieldMatrix<R,1,dim> >;
 
   41    static constexpr unsigned int size ()
 
   48                          std::vector<typename Traits::RangeType>& out)
 const 
   61        out[0] = (1.0-in[0]-in[1])*(1.0-in[2]);
 
   62        out[1] = in[0]*(1-in[2]);
 
   63        out[2] = in[1]*(1-in[2]);
 
   64        out[3] = in[2]*(1.0-in[0]-in[1]);
 
   73        FieldVector<R,k+1> segmentShapeFunction;
 
   74        segmentShapeFunction[0] = 1 + in[2] * (-3 + 2*in[2]);
 
   75        segmentShapeFunction[1] =    in[2] * (4 - 4*in[2]);
 
   76        segmentShapeFunction[2] =    in[2] * (-1 + 2*in[2]);
 
   78        FieldVector<R, 6> triangleShapeFunction;
 
   79        triangleShapeFunction[0] = 2 * (1 - in[0] - in[1]) * (0.5 - in[0] - in[1]);
 
   80        triangleShapeFunction[1] = 2 * in[0] * (-0.5 + in[0]);
 
   81        triangleShapeFunction[2] = 2 * in[1] * (-0.5 + in[1]);
 
   82        triangleShapeFunction[3] = 4*in[0] * (1 - in[0] - in[1]);
 
   83        triangleShapeFunction[4] = 4*in[1] * (1 - in[0] - in[1]);
 
   84        triangleShapeFunction[5] = 4*in[0]*in[1];
 
   87        out[0] = triangleShapeFunction[0] * segmentShapeFunction[0];
 
   88        out[1] = triangleShapeFunction[1] * segmentShapeFunction[0];
 
   89        out[2] = triangleShapeFunction[2] * segmentShapeFunction[0];
 
   92        out[3] = triangleShapeFunction[0] * segmentShapeFunction[2];
 
   93        out[4] = triangleShapeFunction[1] * segmentShapeFunction[2];
 
   94        out[5] = triangleShapeFunction[2] * segmentShapeFunction[2];
 
   97        out[6] = triangleShapeFunction[0] * segmentShapeFunction[1];
 
   98        out[7] = triangleShapeFunction[1] * segmentShapeFunction[1];
 
   99        out[8] = triangleShapeFunction[2] * segmentShapeFunction[1];
 
  102        out[9] = triangleShapeFunction[3] * segmentShapeFunction[0];
 
  103        out[10] = triangleShapeFunction[4] * segmentShapeFunction[0];
 
  104        out[11] = triangleShapeFunction[5] * segmentShapeFunction[0];
 
  107        out[12] = triangleShapeFunction[3] * segmentShapeFunction[2];
 
  108        out[13] = triangleShapeFunction[4] * segmentShapeFunction[2];
 
  109        out[14] = triangleShapeFunction[5] * segmentShapeFunction[2];
 
  112        out[15] = triangleShapeFunction[3] * segmentShapeFunction[1];
 
  113        out[16] = triangleShapeFunction[4] * segmentShapeFunction[1];
 
  114        out[17] = triangleShapeFunction[5] * segmentShapeFunction[1];
 
  119      DUNE_THROW(NotImplemented, 
"LagrangePrismLocalBasis::evaluateFunction for order " << k);
 
  128                          std::vector<typename Traits::JacobianType>& out)
 const 
  135        std::fill(out[0][0].begin(), out[0][0].end(), 0);
 
  141        out[0][0] = {in[2]-1, in[2]-1, in[0]+in[1]-1};
 
  142        out[1][0] = {1-in[2],       0,        -in[0]};
 
  143        out[2][0] = {      0, 1-in[2],        -in[1]};
 
  144        out[3][0] = { -in[2],  -in[2], 1-in[0]-in[1]};
 
  145        out[4][0] = {  in[2],       0,         in[0]};
 
  146        out[5][0] = {      0,   in[2],         in[1]};
 
  154        FieldVector<R, 6> triangleShapeFunction;
 
  155        triangleShapeFunction[0] = 2 * (1 - in[0] - in[1]) * (0.5 - in[0] - in[1]);
 
  156        triangleShapeFunction[1] = 2 * in[0] * (-0.5 + in[0]);
 
  157        triangleShapeFunction[2] = 2 * in[1] * (-0.5 + in[1]);
 
  158        triangleShapeFunction[3] = 4*in[0] * (1 - in[0] - in[1]);
 
  159        triangleShapeFunction[4] = 4*in[1] * (1 - in[0] - in[1]);
 
  160        triangleShapeFunction[5] = 4*in[0]*in[1];
 
  162        std::array<std::array<R,2>,6> triangleShapeFunctionDer;
 
  163        triangleShapeFunctionDer[0] = {-3 + 4*(in[0] + in[1]), -3 + 4*(in[0] + in[1])};
 
  164        triangleShapeFunctionDer[1] = {          -1 + 4*in[0],                      0};
 
  165        triangleShapeFunctionDer[2] = {                     0,           -1 + 4*in[1]};
 
  166        triangleShapeFunctionDer[3] = { 4 - 8*in[0] - 4*in[1],               -4*in[0]};
 
  167        triangleShapeFunctionDer[4] = {              -4*in[1],  4 - 4*in[0] - 8*in[1]};
 
  168        triangleShapeFunctionDer[5] = {               4*in[1],                4*in[0]};
 
  171        FieldVector<R,k+1> segmentShapeFunction;
 
  172        segmentShapeFunction[0] = 1 + in[2] * (-3 + 2*in[2]);
 
  173        segmentShapeFunction[1] =     in[2] * ( 4 - 4*in[2]);
 
  174        segmentShapeFunction[2] =     in[2] * (-1 + 2*in[2]);
 
  176        FieldVector<R,k+1> segmentShapeFunctionDer;
 
  177        segmentShapeFunctionDer[0] = -3 + 4*in[2];
 
  178        segmentShapeFunctionDer[1] =  4 - 8*in[2];
 
  179        segmentShapeFunctionDer[2] = -1 + 4*in[2];
 
  182        out[0][0][0] = triangleShapeFunctionDer[0][0] * segmentShapeFunction[0];
 
  183        out[0][0][1] = triangleShapeFunctionDer[0][1] * segmentShapeFunction[0];
 
  184        out[0][0][2] = triangleShapeFunction[0]       * segmentShapeFunctionDer[0];
 
  186        out[1][0][0] = triangleShapeFunctionDer[1][0] * segmentShapeFunction[0];
 
  187        out[1][0][1] = triangleShapeFunctionDer[1][1] * segmentShapeFunction[0];
 
  188        out[1][0][2] = triangleShapeFunction[1]       * segmentShapeFunctionDer[0];
 
  190        out[2][0][0] = triangleShapeFunctionDer[2][0] * segmentShapeFunction[0];
 
  191        out[2][0][1] = triangleShapeFunctionDer[2][1] * segmentShapeFunction[0];
 
  192        out[2][0][2] = triangleShapeFunction[2]       * segmentShapeFunctionDer[0];
 
  195        out[3][0][0] = triangleShapeFunctionDer[0][0] * segmentShapeFunction[2];
 
  196        out[3][0][1] = triangleShapeFunctionDer[0][1] * segmentShapeFunction[2];
 
  197        out[3][0][2] = triangleShapeFunction[0]       * segmentShapeFunctionDer[2];
 
  199        out[4][0][0] = triangleShapeFunctionDer[1][0] * segmentShapeFunction[2];
 
  200        out[4][0][1] = triangleShapeFunctionDer[1][1] * segmentShapeFunction[2];
 
  201        out[4][0][2] = triangleShapeFunction[1]       * segmentShapeFunctionDer[2];
 
  203        out[5][0][0] = triangleShapeFunctionDer[2][0] * segmentShapeFunction[2];
 
  204        out[5][0][1] = triangleShapeFunctionDer[2][1] * segmentShapeFunction[2];
 
  205        out[5][0][2] = triangleShapeFunction[2]       * segmentShapeFunctionDer[2];
 
  208        out[6][0][0] = triangleShapeFunctionDer[0][0] * segmentShapeFunction[1];
 
  209        out[6][0][1] = triangleShapeFunctionDer[0][1] * segmentShapeFunction[1];
 
  210        out[6][0][2] = triangleShapeFunction[0]       * segmentShapeFunctionDer[1];
 
  212        out[7][0][0] = triangleShapeFunctionDer[1][0] * segmentShapeFunction[1];
 
  213        out[7][0][1] = triangleShapeFunctionDer[1][1] * segmentShapeFunction[1];
 
  214        out[7][0][2] = triangleShapeFunction[1]       * segmentShapeFunctionDer[1];
 
  216        out[8][0][0] = triangleShapeFunctionDer[2][0] * segmentShapeFunction[1];
 
  217        out[8][0][1] = triangleShapeFunctionDer[2][1] * segmentShapeFunction[1];
 
  218        out[8][0][2] = triangleShapeFunction[2]       * segmentShapeFunctionDer[1];
 
  221        out[9][0][0] = triangleShapeFunctionDer[3][0] * segmentShapeFunction[0];
 
  222        out[9][0][1] = triangleShapeFunctionDer[3][1] * segmentShapeFunction[0];
 
  223        out[9][0][2] = triangleShapeFunction[3]       * segmentShapeFunctionDer[0];
 
  225        out[10][0][0] = triangleShapeFunctionDer[4][0] * segmentShapeFunction[0];
 
  226        out[10][0][1] = triangleShapeFunctionDer[4][1] * segmentShapeFunction[0];
 
  227        out[10][0][2] = triangleShapeFunction[4]       * segmentShapeFunctionDer[0];
 
  229        out[11][0][0] = triangleShapeFunctionDer[5][0] * segmentShapeFunction[0];
 
  230        out[11][0][1] = triangleShapeFunctionDer[5][1] * segmentShapeFunction[0];
 
  231        out[11][0][2] = triangleShapeFunction[5]       * segmentShapeFunctionDer[0];
 
  234        out[12][0][0] = triangleShapeFunctionDer[3][0] * segmentShapeFunction[2];
 
  235        out[12][0][1] = triangleShapeFunctionDer[3][1] * segmentShapeFunction[2];
 
  236        out[12][0][2] = triangleShapeFunction[3]       * segmentShapeFunctionDer[2];
 
  238        out[13][0][0] = triangleShapeFunctionDer[4][0] * segmentShapeFunction[2];
 
  239        out[13][0][1] = triangleShapeFunctionDer[4][1] * segmentShapeFunction[2];
 
  240        out[13][0][2] = triangleShapeFunction[4]       * segmentShapeFunctionDer[2];
 
  242        out[14][0][0] = triangleShapeFunctionDer[5][0] * segmentShapeFunction[2];
 
  243        out[14][0][1] = triangleShapeFunctionDer[5][1] * segmentShapeFunction[2];
 
  244        out[14][0][2] = triangleShapeFunction[5]       * segmentShapeFunctionDer[2];
 
  247        out[15][0][0] = triangleShapeFunctionDer[3][0] * segmentShapeFunction[1];
 
  248        out[15][0][1] = triangleShapeFunctionDer[3][1] * segmentShapeFunction[1];
 
  249        out[15][0][2] = triangleShapeFunction[3]       * segmentShapeFunctionDer[1];
 
  251        out[16][0][0] = triangleShapeFunctionDer[4][0] * segmentShapeFunction[1];
 
  252        out[16][0][1] = triangleShapeFunctionDer[4][1] * segmentShapeFunction[1];
 
  253        out[16][0][2] = triangleShapeFunction[4]       * segmentShapeFunctionDer[1];
 
  255        out[17][0][0] = triangleShapeFunctionDer[5][0] * segmentShapeFunction[1];
 
  256        out[17][0][1] = triangleShapeFunctionDer[5][1] * segmentShapeFunction[1];
 
  257        out[17][0][2] = triangleShapeFunction[5]       * segmentShapeFunctionDer[1];
 
  262      DUNE_THROW(NotImplemented, 
"LagrangePrismLocalBasis::evaluateJacobian for order " << k);
 
  271    void partial(
const std::array<unsigned int,dim>& order,
 
  273                 std::vector<typename Traits::RangeType>& out)
 const 
  281        evaluateFunction(in, out);
 
  297          auto direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
 
  317              out[0] = in[0]+in[1]-1;
 
  320              out[3] = 1-in[0]-in[1];
 
  325              DUNE_THROW(RangeError, 
"Component out of range.");
 
  327        } 
else if (totalOrder == 2) {
 
  329          if (order[0] == 1 && order[2] == 1) {
 
  336          } 
else if (order[1] == 1 && order[2] == 1) {
 
  344            for (std::size_t i = 0; i < 
size(); ++i)
 
  349          std::fill(out.begin(), out.end(), 0.0);
 
  360          auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
 
  365            FieldVector<R,6> triangleShapeFunctionDerX;
 
  366            triangleShapeFunctionDerX[0] = -3 + 4*(in[0] +   in[1]);
 
  367            triangleShapeFunctionDerX[1] = -1 + 4* in[0];
 
  368            triangleShapeFunctionDerX[2] = 0;
 
  369            triangleShapeFunctionDerX[3] =  4 - 8* in[0] - 4*in[1];
 
  370            triangleShapeFunctionDerX[4] =                -4*in[1];
 
  371            triangleShapeFunctionDerX[5] =                 4*in[1];
 
  373            FieldVector<R,k+1> segmentShapeFunction;
 
  374            segmentShapeFunction[0] = 1 + in[2] * (-3 + 2*in[2]);
 
  375            segmentShapeFunction[1] =     in[2] * ( 4 - 4*in[2]);
 
  376            segmentShapeFunction[2] =     in[2] * (-1 + 2*in[2]);
 
  378            out[0]  = triangleShapeFunctionDerX[0] * segmentShapeFunction[0];
 
  379            out[1]  = triangleShapeFunctionDerX[1] * segmentShapeFunction[0];
 
  380            out[2]  = triangleShapeFunctionDerX[2] * segmentShapeFunction[0];
 
  381            out[3]  = triangleShapeFunctionDerX[0] * segmentShapeFunction[2];
 
  382            out[4]  = triangleShapeFunctionDerX[1] * segmentShapeFunction[2];
 
  383            out[5]  = triangleShapeFunctionDerX[2] * segmentShapeFunction[2];
 
  384            out[6]  = triangleShapeFunctionDerX[0] * segmentShapeFunction[1];
 
  385            out[7]  = triangleShapeFunctionDerX[1] * segmentShapeFunction[1];
 
  386            out[8]  = triangleShapeFunctionDerX[2] * segmentShapeFunction[1];
 
  387            out[9]  = triangleShapeFunctionDerX[3] * segmentShapeFunction[0];
 
  388            out[10] = triangleShapeFunctionDerX[4] * segmentShapeFunction[0];
 
  389            out[11] = triangleShapeFunctionDerX[5] * segmentShapeFunction[0];
 
  390            out[12] = triangleShapeFunctionDerX[3] * segmentShapeFunction[2];
 
  391            out[13] = triangleShapeFunctionDerX[4] * segmentShapeFunction[2];
 
  392            out[14] = triangleShapeFunctionDerX[5] * segmentShapeFunction[2];
 
  393            out[15] = triangleShapeFunctionDerX[3] * segmentShapeFunction[1];
 
  394            out[16] = triangleShapeFunctionDerX[4] * segmentShapeFunction[1];
 
  395            out[17] = triangleShapeFunctionDerX[5] * segmentShapeFunction[1];
 
  400            FieldVector<R,6> triangleShapeFunctionDerY;
 
  401            triangleShapeFunctionDerY[0] = -3 + 4*(in[0] +   in[1]);
 
  402            triangleShapeFunctionDerY[1] = 0;
 
  403            triangleShapeFunctionDerY[2] = -1 + 4*           in[1];
 
  404            triangleShapeFunctionDerY[3] =     -4* in[0];
 
  405            triangleShapeFunctionDerY[4] =  4 - 4* in[0] - 8*in[1];
 
  406            triangleShapeFunctionDerY[5] =      4* in[0];
 
  408            FieldVector<R,k+1> segmentShapeFunction;
 
  409            segmentShapeFunction[0] = 1 + in[2] * (-3 + 2*in[2]);
 
  410            segmentShapeFunction[1] =     in[2] * ( 4 - 4*in[2]);
 
  411            segmentShapeFunction[2] =     in[2] * (-1 + 2*in[2]);
 
  413            out[0]  = triangleShapeFunctionDerY[0] * segmentShapeFunction[0];
 
  414            out[1]  = triangleShapeFunctionDerY[1] * segmentShapeFunction[0];
 
  415            out[2]  = triangleShapeFunctionDerY[2] * segmentShapeFunction[0];
 
  416            out[3]  = triangleShapeFunctionDerY[0] * segmentShapeFunction[2];
 
  417            out[4]  = triangleShapeFunctionDerY[1] * segmentShapeFunction[2];
 
  418            out[5]  = triangleShapeFunctionDerY[2] * segmentShapeFunction[2];
 
  419            out[6]  = triangleShapeFunctionDerY[0] * segmentShapeFunction[1];
 
  420            out[7]  = triangleShapeFunctionDerY[1] * segmentShapeFunction[1];
 
  421            out[8]  = triangleShapeFunctionDerY[2] * segmentShapeFunction[1];
 
  422            out[9]  = triangleShapeFunctionDerY[3] * segmentShapeFunction[0];
 
  423            out[10] = triangleShapeFunctionDerY[4] * segmentShapeFunction[0];
 
  424            out[11] = triangleShapeFunctionDerY[5] * segmentShapeFunction[0];
 
  425            out[12] = triangleShapeFunctionDerY[3] * segmentShapeFunction[2];
 
  426            out[13] = triangleShapeFunctionDerY[4] * segmentShapeFunction[2];
 
  427            out[14] = triangleShapeFunctionDerY[5] * segmentShapeFunction[2];
 
  428            out[15] = triangleShapeFunctionDerY[3] * segmentShapeFunction[1];
 
  429            out[16] = triangleShapeFunctionDerY[4] * segmentShapeFunction[1];
 
  430            out[17] = triangleShapeFunctionDerY[5] * segmentShapeFunction[1];
 
  435            FieldVector<R, 6> triangleShapeFunction;
 
  436            triangleShapeFunction[0] = 2 * (1 - in[0] - in[1]) * (0.5 - in[0] - in[1]);
 
  437            triangleShapeFunction[1] = 2 * in[0] * (-0.5 + in[0]);
 
  438            triangleShapeFunction[2] = 2 * in[1] * (-0.5 + in[1]);
 
  439            triangleShapeFunction[3] = 4*in[0] * (1 - in[0] - in[1]);
 
  440            triangleShapeFunction[4] = 4*in[1] * (1 - in[0] - in[1]);
 
  441            triangleShapeFunction[5] = 4*in[0]*in[1];
 
  443            FieldVector<R,k+1> segmentShapeFunctionDer;
 
  444            segmentShapeFunctionDer[0] = -3 + 4*in[2];
 
  445            segmentShapeFunctionDer[1] =  4 - 8*in[2];
 
  446            segmentShapeFunctionDer[2] = -1 + 4*in[2];
 
  448            out[0]  = triangleShapeFunction[0] * segmentShapeFunctionDer[0];
 
  449            out[1]  = triangleShapeFunction[1] * segmentShapeFunctionDer[0];
 
  450            out[2]  = triangleShapeFunction[2] * segmentShapeFunctionDer[0];
 
  451            out[3]  = triangleShapeFunction[0] * segmentShapeFunctionDer[2];
 
  452            out[4]  = triangleShapeFunction[1] * segmentShapeFunctionDer[2];
 
  453            out[5]  = triangleShapeFunction[2] * segmentShapeFunctionDer[2];
 
  454            out[6]  = triangleShapeFunction[0] * segmentShapeFunctionDer[1];
 
  455            out[7]  = triangleShapeFunction[1] * segmentShapeFunctionDer[1];
 
  456            out[8]  = triangleShapeFunction[2] * segmentShapeFunctionDer[1];
 
  457            out[9]  = triangleShapeFunction[3] * segmentShapeFunctionDer[0];
 
  458            out[10] = triangleShapeFunction[4] * segmentShapeFunctionDer[0];
 
  459            out[11] = triangleShapeFunction[5] * segmentShapeFunctionDer[0];
 
  460            out[12] = triangleShapeFunction[3] * segmentShapeFunctionDer[2];
 
  461            out[13] = triangleShapeFunction[4] * segmentShapeFunctionDer[2];
 
  462            out[14] = triangleShapeFunction[5] * segmentShapeFunctionDer[2];
 
  463            out[15] = triangleShapeFunction[3] * segmentShapeFunctionDer[1];
 
  464            out[16] = triangleShapeFunction[4] * segmentShapeFunctionDer[1];
 
  465            out[17] = triangleShapeFunction[5] * segmentShapeFunctionDer[1];
 
  469              DUNE_THROW(RangeError, 
"Component out of range.");
 
  472          DUNE_THROW(NotImplemented, 
"Desired derivative order is not implemented");
 
  478      DUNE_THROW(NotImplemented, 
"LagrangePrismLocalBasis::partial not implemented for order " << k);
 
  482    static constexpr unsigned int order ()
 
  492  template<
unsigned int k>
 
  493  class LagrangePrismLocalCoefficients
 
  497    LagrangePrismLocalCoefficients ()
 
  502        localKeys_[0] = LocalKey(0,0,0);
 
  508        for (std::size_t i=0; i<
size(); i++)
 
  509          localKeys_[i] = LocalKey(i,3,0);
 
  516        localKeys_[0] = LocalKey(0,3,0);
 
  517        localKeys_[1] = LocalKey(1,3,0);
 
  518        localKeys_[2] = LocalKey(2,3,0);
 
  519        localKeys_[3] = LocalKey(3,3,0);
 
  520        localKeys_[4] = LocalKey(4,3,0);
 
  521        localKeys_[5] = LocalKey(5,3,0);
 
  524        localKeys_[6] = LocalKey(0,2,0);
 
  525        localKeys_[7] = LocalKey(1,2,0);
 
  526        localKeys_[8] = LocalKey(2,2,0);
 
  527        localKeys_[9] = LocalKey(3,2,0);
 
  528        localKeys_[10] = LocalKey(4,2,0);
 
  529        localKeys_[11] = LocalKey(5,2,0);
 
  530        localKeys_[12] = LocalKey(6,2,0);
 
  531        localKeys_[13] = LocalKey(7,2,0);
 
  532        localKeys_[14] = LocalKey(8,2,0);
 
  535        localKeys_[15] = LocalKey(0,1,0);
 
  536        localKeys_[16] = LocalKey(1,1,0);
 
  537        localKeys_[17] = LocalKey(2,1,0);
 
  543      DUNE_THROW(NotImplemented, 
"LagrangePrismLocalCoefficients not implemented for order " << k);
 
  548    static constexpr std::size_t 
size ()
 
  554    const LocalKey& localKey (std::size_t i)
 const 
  556      return localKeys_[i];
 
  560    std::vector<LocalKey> localKeys_;
 
  567  template<
class LocalBasis>
 
  568  class LagrangePrismLocalInterpolation
 
  579    template<
typename F, 
typename C>
 
  580    void interpolate (
const F& f, std::vector<C>& out)
 const 
  582      constexpr auto dim = LocalBasis::Traits::dimDomain;
 
  583      constexpr auto k = LocalBasis::order();
 
  584      using D = 
typename LocalBasis::Traits::DomainType;
 
  585      using DF = 
typename LocalBasis::Traits::DomainFieldType;
 
  587      out.resize(LocalBasis::size());
 
  600        for (
unsigned int i=0; i<LocalBasis::size(); i++)
 
  610        out[0]  = f( D( {0.0, 0.0, 0.0} ) );
 
  611        out[1]  = f( D( {1.0, 0.0, 0.0} ) );
 
  612        out[2]  = f( D( {0.0, 1.0, 0.0} ) );
 
  613        out[3]  = f( D( {0.0, 0.0, 1.0} ) );
 
  614        out[4]  = f( D( {1.0, 0.0, 1.0} ) );
 
  615        out[5]  = f( D( {0.0, 1.0, 1.0} ) );
 
  616        out[6]  = f( D( {0.0, 0.0, 0.5} ) );
 
  617        out[7]  = f( D( {1.0, 0.0, 0.5} ) );
 
  618        out[8]  = f( D( {0.0, 1.0, 0.5} ) );
 
  619        out[9]  = f( D( {0.5, 0.0, 0.0} ) );
 
  620        out[10] = f( D( {0.0, 0.5, 0.0} ) );
 
  621        out[11] = f( D( {0.5, 0.5, 0.0} ) );
 
  622        out[12] = f( D( {0.5, 0.0, 1.0} ) );
 
  623        out[13] = f( D( {0.0, 0.5, 1.0} ) );
 
  624        out[14] = f( D( {0.5, 0.5, 1.0} ) );
 
  625        out[15] = f( D( {0.5, 0.0, 0.5} ) );
 
  626        out[16] = f( D( {0.0, 0.5, 0.5} ) );
 
  627        out[17] = f( D( {0.5, 0.5, 0.5} ) );
 
  632      DUNE_THROW(NotImplemented, 
"LagrangePrismLocalInterpolation not implemented for order " << k);
 
  647  template<
class D, 
class R, 
int k>
 
  654                                            Impl::LagrangePrismLocalCoefficients<k>,
 
  655                                            Impl::LagrangePrismLocalInterpolation<Impl::LagrangePrismLocalBasis<D,R,k> > >;
 
  668      return coefficients_;
 
  675      return interpolation_;
 
  679    static constexpr std::size_t 
size ()
 
  692    Impl::LagrangePrismLocalBasis<D,R,k> basis_;
 
  693    Impl::LagrangePrismLocalCoefficients<k> coefficients_;
 
  694    Impl::LagrangePrismLocalInterpolation<Impl::LagrangePrismLocalBasis<D,R,k> > interpolation_;
 
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
 
Lagrange finite element for 3d prisms with arbitrary compile-time polynomial order.
Definition: lagrangeprism.hh:649
 
static constexpr std::size_t size()
The number of shape functions.
Definition: lagrangeprism.hh:679
 
const Traits::LocalInterpolationType & localInterpolation() const
Returns object that evaluates degrees of freedom.
Definition: lagrangeprism.hh:673
 
static constexpr GeometryType type()
The reference element that the local finite element is defined on.
Definition: lagrangeprism.hh:686
 
const Traits::LocalCoefficientsType & localCoefficients() const
Returns the assignment of the degrees of freedom to the element subentities.
Definition: lagrangeprism.hh:666
 
const Traits::LocalBasisType & localBasis() const
Returns the local basis, i.e., the set of shape functions.
Definition: lagrangeprism.hh:659
 
Implements a matrix constructed from a given type representing a field and compile-time given number ...
 
Implements a vector constructed from a given type representing a field and a compile-time given size.
 
static void interpolate(const GridFunction &u, DiscreteFunction &v)
perform native interpolation of a discrete function space
Definition: interpolate.hh:55
 
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
 
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:528
 
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition: type.hh:492
 
constexpr T accumulate(Range &&range, T value, F &&f)
Accumulate values.
Definition: hybridutilities.hh:280
 
Some useful basic math stuff.
 
Dune namespace.
Definition: alignedallocator.hh:13
 
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
 
static constexpr T binomial(const T &n, const T &k) noexcept
calculate the binomial coefficient n over k as a constexpr
Definition: math.hh:113
 
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:156
 
D DomainType
domain type
Definition: localbasis.hh:43
 
traits helper struct
Definition: localfiniteelementtraits.hh:13
 
LB LocalBasisType
Definition: localfiniteelementtraits.hh:16
 
LC LocalCoefficientsType
Definition: localfiniteelementtraits.hh:20
 
LI LocalInterpolationType
Definition: localfiniteelementtraits.hh:24