14#include <dune/localfunctions/utility/field.hh> 
   31  template <
class F,
int dimD,
unsigned int deriv>
 
   34    typedef LFETensor<F,dimD,deriv> This;
 
   35    typedef LFETensor<F,dimD-1,deriv> BaseDim;
 
   36    typedef LFETensor<F,dimD,deriv-1> BaseDeriv;
 
   40    static const unsigned int size = BaseDim::size+BaseDeriv::size;
 
   44    This &operator= ( 
const FF &f )
 
   46      block() = field_cast< F >( f );
 
   50    This &operator= ( 
const Block &b )
 
   56    This &operator*= ( 
const field_type &f )
 
   62    const field_type &operator[] ( 
const unsigned int i )
 const 
   67    field_type &operator[] ( 
const unsigned int i )
 
   76    const Block &block()
 const 
   80    void axpy(
const F& a, 
const This &y)
 
   82      block().axpy(a,y.block());
 
   85    void assign(
const LFETensor<Fy,dimD,deriv> &y)
 
   93  template <
class F,
int dimD,
unsigned int deriv>
 
   94  struct FieldTraits<LFETensor<F,dimD,deriv>>
 
   97    using real_type = 
typename FieldTraits<field_type>::real_type;
 
  101  template <
class F,
unsigned int deriv>
 
  102  struct LFETensor<F,0,deriv>
 
  104    static const int size = 0;
 
  108  struct LFETensor<F,0,0>
 
  110    static const int size = 1;
 
  113  template <
class F,
int dimD>
 
  114  class LFETensor<F,dimD,0>
 
  116    typedef LFETensor<F,dimD,0> This;
 
  119    typedef F field_type;
 
  120    static const int size = 1;
 
  124    This &operator= ( 
const FF &f )
 
  126      block() = field_cast< F >( f );
 
  130    This &operator= ( 
const Block &b )
 
  136    This &operator*= ( 
const field_type &f )
 
  142    const F &operator[] ( 
const unsigned int i )
 const 
  147    F &operator[] ( 
const unsigned int i )
 
  152    void axpy(
const F& a, 
const This &y)
 
  154      block().axpy(a,y.block());
 
  157    void assign(
const LFETensor<Fy,dimD,0> &y)
 
  166    const Block &block()
 const 
  175  namespace DerivativeLayoutNS {
 
  176    enum DerivativeLayout {value,derivative};
 
  178  template <
class F,
int dimD,
int dimR,
unsigned int deriv,
 
  179      DerivativeLayoutNS::DerivativeLayout layout>
 
  182  template <
class F,
int dimD,
int dimR,
unsigned int deriv,
 
  183      DerivativeLayoutNS::DerivativeLayout layout>
 
  184  struct FieldTraits<Derivatives<F,dimD,dimR,deriv,layout>>
 
  186    using field_type = F;
 
  187    using real_type = 
typename FieldTraits<field_type>::real_type;
 
  191  template <
class F,
int dimD,
int dimR,
unsigned int deriv>
 
  192  struct Derivatives<F,dimD,dimR,deriv,DerivativeLayoutNS::value>
 
  193    : 
public Derivatives<F,dimD,dimR,deriv-1,DerivativeLayoutNS::value>
 
  195    typedef Derivatives<F,dimD,dimR,deriv,DerivativeLayoutNS::value> This;
 
  196    typedef Derivatives<F,dimD,dimR,deriv-1,DerivativeLayoutNS::value> Base;
 
  197    typedef LFETensor<F,dimD,deriv> ThisLFETensor;
 
  200    typedef F field_type;
 
  202    static const DerivativeLayoutNS::DerivativeLayout layout = DerivativeLayoutNS::value;
 
  203    static const unsigned int dimDomain = dimD;
 
  204    static const unsigned int dimRange = dimR;
 
  205    constexpr static int size = Base::size+ThisLFETensor::size*dimR;
 
  208    This &operator=(
const F& f)
 
  218    template <
unsigned int dorder>
 
  221      tensor<dorder>() = t;
 
  224    This &operator=(
const Block &t)
 
  230    This &operator*= ( 
const field_type &f )
 
  236    void axpy(
const F &a, 
const This &y)
 
  238      block().
axpy(a,y.block());
 
  243    void assign(
const Derivatives<Fy,dimD,dimR,deriv,DerivativeLayoutNS::value> &y)
 
  249    void assign(
const Derivatives<Fy,dimD,dimR,deriv,DerivativeLayoutNS::derivative> &y)
 
  252      for (
int rr=0; rr<dimR; ++rr)
 
  253        tensor_[rr] = y[rr].
template tensor<deriv>()[0];
 
  256    template <
class Fy,
int dimRy>
 
  257    void assign(
const Derivatives<Fy,dimD,dimRy,deriv,DerivativeLayoutNS::value> &y,
unsigned int r)
 
  259      assign<Fy,dimRy>(y.block(),r);
 
  263    void assign(
unsigned int r,
const Derivatives<Fy,dimD,1,deriv,DerivativeLayoutNS::value> &y)
 
  268    void assign(
unsigned int r,
const Derivatives<Fy,dimD,1,deriv,DerivativeLayoutNS::derivative> &y)
 
  275      return reinterpret_cast<Block&
>(*this);
 
  277    const Block &block()
 const 
  279      return reinterpret_cast<const Block&
>(*this);
 
  282    template <
unsigned int dorder>
 
  286      const std::integral_constant<int,dorder> a = {};
 
  289    template <
unsigned int dorder>
 
  293      return tensor(std::integral_constant<int,dorder>());
 
  295    template <
unsigned int dorder>
 
  299      const std::integral_constant<int,dorder> a = {};
 
  302    template <
unsigned int dorder>
 
  306      const std::integral_constant<int,dorder> a = {};
 
  309    ThisLFETensor &operator[](
int r) {
 
  312    const ThisLFETensor &operator[](
int r)
 const {
 
  316    template <
class Fy,
int dimRy>
 
  317    void assign(
const FieldVector<Fy,size*dimRy> &y,
unsigned int r)
 
  319      Base::template assign<Fy,dimRy>(
reinterpret_cast<const FieldVector<Fy,Base::size*dimRy>&
>(y),r);
 
  320      tensor_[0] = 
reinterpret_cast<const FieldVector<Fy,ThisLFETensor::size>&
>(y[Base::size*dimRy+r*ThisLFETensor::size]);
 
  323    void assign(
unsigned int r,
const FieldVector<Fy,size/dimR> &y)
 
  325      Base::assign(r,
reinterpret_cast<const FieldVector<Fy,Base::size/dimR
>&>(y));
 
  326      tensor_[r] = 
reinterpret_cast<const FieldVector<Fy,ThisLFETensor::size>&
>(y[Base::size/dimR]);
 
  329    template <
class Fy,
unsigned int dy>
 
  330    void assign(
const Derivatives<Fy,dimD,dimR,dy,DerivativeLayoutNS::derivative> &y)
 
  333      for (
int rr=0; rr<dimR; ++rr)
 
  334        tensor_[rr] = y[rr].
template tensor<deriv>()[0];
 
  337    template <
int dorder>
 
  339    tensor(
const std::integral_constant<int,dorder> &dorderVar)
 const 
  341      return Base::tensor(dorderVar);
 
  344    tensor(
const std::integral_constant<int,deriv> &dorderVar)
 const 
  348    template <
int dorder>
 
  350    tensor(
const std::integral_constant<int,dorder> &dorderVar)
 
  352      return Base::tensor(dorderVar);
 
  355    tensor(
const std::integral_constant<int,deriv> &dorderVar)
 
  362  template <
class F,
int dimD,
int dimR>
 
  363  struct Derivatives<F,dimD,dimR,0,DerivativeLayoutNS::value>
 
  365    typedef Derivatives<F,dimD,dimR,0,DerivativeLayoutNS::value> This;
 
  366    typedef LFETensor<F,dimD,0> ThisLFETensor;
 
  369    typedef F field_type;
 
  371    static const DerivativeLayoutNS::DerivativeLayout layout = DerivativeLayoutNS::value;
 
  372    static const unsigned int dimDomain = dimD;
 
  373    static const unsigned int dimRange = dimR;
 
  374    constexpr static int size = ThisLFETensor::size*dimR;
 
  378    This &operator=(
const FF& f)
 
  380      for (
int r=0; r<dimR; ++r)
 
  381        tensor_[r] = field_cast<F>(f);
 
  390    This &operator=(
const Block &t)
 
  396    This &operator*= ( 
const field_type &f )
 
  402    void axpy(
const F &a, 
const This &y)
 
  404      block().
axpy(a,y.block());
 
  407    void assign(
const Derivatives<Fy,dimD,dimR,0,DerivativeLayoutNS::value> &y)
 
  412    void assign(
const Derivatives<Fy,dimD,dimR,0,DerivativeLayoutNS::derivative> &y)
 
  414      for (
int rr=0; rr<dimR; ++rr)
 
  415        tensor_[rr] = y[rr].
template tensor<0>()[0];
 
  417    template <
class Fy,
int dimRy>
 
  418    void assign(
const Derivatives<Fy,dimD,dimRy,0,DerivativeLayoutNS::value> &y,
unsigned int r)
 
  420      assign<Fy,dimRy>(y.block(),r);
 
  423    void assign(
unsigned int r,
const Derivatives<Fy,dimD,1,0,DerivativeLayoutNS::value> &y)
 
  425      tensor_[r].assign(y[0]);
 
  428    void assign(
unsigned int r,
const Derivatives<Fy,dimD,1,0,DerivativeLayoutNS::derivative> &y)
 
  430      tensor_[r].assign(y[0][0]);
 
  435      return reinterpret_cast<Block&
>(*this);
 
  437    const Block &block()
 const 
  439      return reinterpret_cast<const Block&
>(*this);
 
  442    ThisLFETensor &operator[](
int r) {
 
  445    const ThisLFETensor &operator[](
int r)
 const {
 
  448    template <
int dorder>
 
  457    template <
unsigned int dorder>
 
  461      const std::integral_constant<int,dorder> a = {};
 
  464    template <
unsigned int dorder>
 
  468      const std::integral_constant<int,dorder> a = {};
 
  474    tensor(
const std::integral_constant<int,0> &dorderVar)
 const 
  479    tensor(
const std::integral_constant<int,0> &dorderVar)
 
  483    template <
class Fy,
unsigned int dy>
 
  484    void assign(
const Derivatives<Fy,dimD,dimR,dy,DerivativeLayoutNS::derivative> &y)
 
  486      for (
int rr=0; rr<dimR; ++rr)
 
  487        tensor_[rr] = y[rr].
template tensor<0>()[0];
 
  489    template <
class Fy,
int dimRy>
 
  490    void assign(
const FieldVector<Fy,size*dimRy> &y,
unsigned int r)
 
  492      tensor_[0] = 
reinterpret_cast<const FieldVector<Fy,ThisLFETensor::size>&
>(y[r*ThisLFETensor::size]);
 
  495    void assign(
unsigned int r,
const FieldVector<Fy,size/dimR> &y)
 
  503  template <
class F,
int dimD,
int dimR,
unsigned int deriv>
 
  504  struct Derivatives<F,dimD,dimR,deriv,DerivativeLayoutNS::derivative>
 
  506    typedef Derivatives<F,dimD,dimR,deriv,DerivativeLayoutNS::derivative> This;
 
  507    typedef Derivatives<F,dimD,1,deriv,DerivativeLayoutNS::value> ScalarDeriv;
 
  510    typedef F field_type;
 
  512    static const DerivativeLayoutNS::DerivativeLayout layout = DerivativeLayoutNS::value;
 
  513    static const unsigned int dimDomain = dimD;
 
  514    static const unsigned int dimRange = dimR;
 
  515    constexpr static int size = ScalarDeriv::size*dimR;
 
  519    This &operator=(
const FF& f)
 
  521      block() = field_cast<F>(f);
 
  524    This &operator=(
const Block &t)
 
  530    This &operator*= ( 
const field_type &f )
 
  537    void axpy(
const FF &a, 
const This &y)
 
  539      block().axpy(field_cast<F>(a),y.block());
 
  543    void assign(
const Derivatives<Fy,dimD,dimR,deriv,DerivativeLayoutNS::derivative> &y)
 
  549    void assign(
const Derivatives<Fy,dimD,dimR,deriv,DerivativeLayoutNS::value> &y)
 
  551      for (
unsigned int rr=0; rr<dimR; ++rr)
 
  555    template <
class Fy,DerivativeLayoutNS::DerivativeLayout layouty>
 
  556    void assign(
unsigned int r,
const Derivatives<Fy,dimD,1,deriv,layouty> &y)
 
  558      deriv_[r].assign(r,y);
 
  563      return reinterpret_cast<Block&
>(*this);
 
  565    const Block &block()
 const 
  567      return reinterpret_cast<const Block&
>(*this);
 
  570    ScalarDeriv &operator[](
int r) {
 
  573    const ScalarDeriv &operator[](
int r)
 const {
 
  583  template <
class Vec1,
class Vec2,
unsigned int deriv>
 
  586    template <
class Field>
 
  587    static void apply(
unsigned int r,
const Field &a,
 
  588                      const Vec1 &x, Vec2 &y)
 
  593  template <
class F1,
int dimD,
int dimR,
 
  597  struct LFETensorAxpy<Derivatives<F1,dimD,dimR,d,DerivativeLayoutNS::value>,Vec2,deriv>
 
  599    typedef Derivatives<F1,dimD,dimR,d,DerivativeLayoutNS::value> Vec1;
 
  600    template <
class Field>
 
  601    static void apply(
unsigned int r,
const Field &a,
 
  602                      const Vec1 &x, Vec2 &y)
 
  604      const FieldVector<F1,Vec2::size> &xx = x.template block<deriv>();
 
  605      for (
int i=0; i<y.size; ++i)
 
  609  template <
class F1,
int dimD,
int dimR,
 
  613  struct LFETensorAxpy<Derivatives<F1,dimD,dimR,d,DerivativeLayoutNS::derivative>,Vec2,deriv>
 
  615    typedef Derivatives<F1,dimD,dimR,d,DerivativeLayoutNS::derivative> Vec1;
 
  616    template <
class Field>
 
  617    static void apply(
unsigned int r,
const Field &a,
 
  618                      const Vec1 &x, Vec2 &y)
 
  620      for (
int rr=0; rr<dimR; ++rr)
 
  621        LFETensorAxpy<Derivatives<F1,dimD,1,d,DerivativeLayoutNS::value>,
 
  622            Vec2,deriv>::apply(rr,a,x[rr],y);
 
  625  template <
class F1,
int dimD,
 
  629  struct LFETensorAxpy<Derivatives<F1,dimD,1,d,DerivativeLayoutNS::derivative>,Vec2,deriv>
 
  631    typedef Derivatives<F1,dimD,1,d,DerivativeLayoutNS::derivative> Vec1;
 
  632    template <
class Field>
 
  633    static void apply(
unsigned int r,
const Field &a,
 
  634                      const Vec1 &x, Vec2 &y)
 
  636      LFETensorAxpy<Derivatives<F1,dimD,1,d,DerivativeLayoutNS::value>,
 
  637          Vec2,deriv>::apply(r,a,x[0],y);
 
  640  template <
class F1,
int dimD,
 
  644  struct LFETensorAxpy<Derivatives<F1,dimD,1,d,DerivativeLayoutNS::value>,Vec2,deriv>
 
  646    typedef Derivatives<F1,dimD,1,d,DerivativeLayoutNS::value> Vec1;
 
  647    template <
class Field>
 
  648    static void apply(
unsigned int r,
const Field &a,
 
  649                      const Vec1 &x, Vec2 &y)
 
  651      typedef LFETensor<F1,dimD,deriv> LFETensorType;
 
  652      const unsigned int rr = r*LFETensorType::size;
 
  653      const FieldVector<F1,LFETensorType::size> &xx = x.template block<deriv>();
 
  654      for (
int i=0; i<FieldVector<F1,LFETensorType::size>::dimension; ++i)
 
  662  template <
class Vec1,
class Vec2>
 
  663  struct DerivativeAssign
 
  665    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  670  template <
int dimD,
int dimR,
unsigned int deriv, DerivativeLayoutNS::DerivativeLayout layout,
 
  672  struct DerivativeAssign<Derivatives<F1,dimD,dimR,deriv,layout>,
 
  673      Derivatives<F2,dimD,dimR,deriv,layout> >
 
  675    typedef Derivatives<F1,dimD,dimR,deriv,layout> Vec1;
 
  676    typedef Derivatives<F2,dimD,dimR,deriv,layout> Vec2;
 
  677    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  682  template <
int dimD,
int dimR,
unsigned int deriv,
 
  684  struct DerivativeAssign<Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::value>,
 
  685      Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::derivative> >
 
  687    typedef Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::value> Vec1;
 
  688    typedef Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::derivative> Vec2;
 
  689    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  694  template <
int dimD,
int dimR,
unsigned int deriv,
 
  696  struct DerivativeAssign<Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::derivative>,
 
  697      Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::value> >
 
  699    typedef Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::derivative> Vec1;
 
  700    typedef Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::value> Vec2;
 
  701    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  706  template <
int dimD,
int dimR,
unsigned int deriv,DerivativeLayoutNS::DerivativeLayout layout,
 
  708  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,layout>,
 
  709      Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::value> >
 
  711    typedef Derivatives<F1,dimD,1,deriv,layout> Vec1;
 
  712    typedef Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::value> Vec2;
 
  713    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  718  template <
int dimD,
int dimR,
unsigned int deriv,DerivativeLayoutNS::DerivativeLayout layout,
 
  720  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,layout>,
 
  721      Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::derivative> >
 
  723    typedef Derivatives<F1,dimD,1,deriv,layout> Vec1;
 
  724    typedef Derivatives<F2,dimD,dimR,deriv,DerivativeLayoutNS::derivative> Vec2;
 
  725    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  730  template <
int dimD,
unsigned int deriv,
 
  732  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value>,
 
  733      Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::value> >
 
  735    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value> Vec1;
 
  736    typedef Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::value> Vec2;
 
  737    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  742  template <
int dimD,
unsigned int deriv,
 
  744  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative>,
 
  745      Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::derivative> >
 
  747    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative> Vec1;
 
  748    typedef Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::derivative> Vec2;
 
  749    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  754  template <
int dimD,
unsigned int deriv,
 
  756  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative>,
 
  757      Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::value> >
 
  759    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative> Vec1;
 
  760    typedef Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::value> Vec2;
 
  761    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  766  template <
int dimD,
unsigned int deriv,
 
  768  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value>,
 
  769      Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::derivative> >
 
  771    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value> Vec1;
 
  772    typedef Derivatives<F2,dimD,1,deriv,DerivativeLayoutNS::derivative> Vec2;
 
  773    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  778  template <
int dimD,
unsigned int deriv,DerivativeLayoutNS::DerivativeLayout layout,
 
  780  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,layout>,
 
  783    typedef Derivatives<F1,dimD,1,deriv,layout> Vec1;
 
  785    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  790  template <
int dimD,
int dimR,
 
  791      class F1,
unsigned int deriv,
 
  793  struct DerivativeAssign<Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::value>,FieldVector<F2,dimR> >
 
  795    typedef Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::value> Vec1;
 
  796    typedef FieldVector<F2,dimR> Vec2;
 
  797    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  802  template <
int dimD,
int dimR,
 
  803      class F1,
unsigned int deriv,
 
  805  struct DerivativeAssign<Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::derivative>,FieldVector<F2,dimR> >
 
  807    typedef Derivatives<F1,dimD,dimR,deriv,DerivativeLayoutNS::derivative> Vec1;
 
  808    typedef FieldVector<F2,dimR> Vec2;
 
  809    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  811      for (
int rr=0; rr<dimR; ++rr)
 
  812        field_cast(vec1[rr].
template tensor<0>()[0].block(),vec2[rr]);
 
  816      class F1,
unsigned int deriv,
 
  818  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value>,FieldVector<F2,dimR> >
 
  820    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value> Vec1;
 
  821    typedef FieldVector<F2,dimR> Vec2;
 
  822    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  824      field_cast(vec1.template tensor<0>()[0].block(),vec2[r]);
 
  828      class F1,
unsigned int deriv,
 
  830  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative>,FieldVector<F2,dimR> >
 
  832    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative> Vec1;
 
  833    typedef FieldVector<F2,dimR> Vec2;
 
  834    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  836      field_cast(vec1[0].
template tensor<0>()[0].block(),vec2[r]);
 
  840      class F1,
unsigned int deriv,
 
  842  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value>,FieldVector<F2,1> >
 
  844    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::value> Vec1;
 
  845    typedef FieldVector<F2,1> Vec2;
 
  846    static void apply(
unsigned int r,
const Vec1 &vec1,Vec2 &vec2)
 
  848      field_cast(vec1.template tensor<0>()[0].block(),vec2);
 
  852      class F1,
unsigned int deriv,
 
  854  struct DerivativeAssign<Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative>,FieldVector<F2,1> >
 
  856    typedef Derivatives<F1,dimD,1,deriv,DerivativeLayoutNS::derivative> Vec1;
 
  857    typedef FieldVector<F2,1> Vec2;
 
  858    static void apply(
unsigned int ,
const Vec1 &vec1,Vec2 &vec2)
 
  860      field_cast(vec1[0].
template tensor<0>()[0].block(),vec2);
 
  867  template <
class F,
int dimD,
unsigned int deriv>
 
  868  std::ostream &operator<< ( std::ostream &out, 
const LFETensor< F,dimD,deriv > &tensor )
 
  870    return out << tensor.block();
 
  873  template <
class F,
int dimD,
unsigned int deriv>
 
  874  std::ostream &operator<< ( std::ostream &out, 
const ScalarDerivatives< F,dimD,deriv > &d )
 
  876    out << 
static_cast<const ScalarDerivatives< F,dimD,deriv-1 
> &>(d);
 
  877    out << 
" , " << d.tensor() << std::endl;
 
  880  template <
class F,
int dimD>
 
  881  std::ostream &operator<< ( std::ostream &out, 
const ScalarDerivatives< F,dimD,0 > &d )
 
  883    out << d.tensor() << std::endl;
 
  887  template <
class F,
int dimD,
int dimR,
unsigned int deriv>
 
  888  std::ostream &operator<< ( std::ostream &out, 
const Derivatives< F,dimD,dimR,deriv,DerivativeLayoutNS::derivative > &d )
 
  892    for (
int r=1; r<dimR; ++r)
 
  894      out << 
" , " << d[r];
 
  896    out << 
" ) " << std::endl;
 
  899  template <
class F,
int dimD,
int dimR,
unsigned int deriv>
 
  900  std::ostream &operator<< ( std::ostream &out, 
const Derivatives< F,dimD,dimR,deriv,DerivativeLayoutNS::value > &d )
 
  902    out << 
static_cast<const Derivatives< F,dimD,dimR,deriv-1,DerivativeLayoutNS::value 
> &>(d);
 
  905    for (
int r=1; r<dimR; ++r)
 
  907      out << 
" , " << d[r];
 
  909    out << 
" ) " << std::endl;
 
  912  template <
class F,
int dimD,
int dimR>
 
  913  std::ostream &operator<< ( std::ostream &out, 
const Derivatives< F,dimD,dimR,0,DerivativeLayoutNS::derivative > &d )
 
  917    for (
int r=1; r<dimR; ++r)
 
  919      out << 
" , " << d[r];
 
  921    out << 
" ) " << std::endl;
 
  924  template <
class F,
int dimD,
int dimR>
 
  925  std::ostream &operator<< ( std::ostream &out, 
const Derivatives< F,dimD,dimR,0,DerivativeLayoutNS::value > &d )
 
  929    for (
int r=1; r<dimR; ++r)
 
  931      out << 
" , " << d[r];
 
  933    out << 
" ) " << std::endl;
 
  936  template <
class F,
int dimD,
int dimR,
unsigned int deriv,DerivativeLayoutNS::DerivativeLayout layout>
 
  937  std::ostream &operator<< ( std::ostream &out, 
const std::vector<Derivatives< F,dimD,dimR,deriv,layout > > &y )
 
  939    out << 
"Number of basis functions: " << y.size() << std::endl;
 
  940    for (
unsigned int i=0; i<y.size(); ++i)
 
  942      out << 
"Base " << i << 
" : " << std::endl;
 
constexpr derived_type & axpy(const field_type &a, const DenseVector< Other > &x)
vector space axpy operation ( *this += a x )
Definition: densevector.hh:576
 
Implements a vector constructed from a given type representing a field and a compile-time given size.
 
Dune namespace.
Definition: alignedallocator.hh:13
 
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:160
 
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
 
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition: simd.hh:447