DUNE-ACFEM (unstable)

Functions

template<class T0 , class T1 , class Sign0 , class E0 , class Pos0 , class Sign1 , class F1 , class Node10 , class Node11 , class Tag1 , class Sign , class F , class OuterTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, OperationPair< Sign, F, TreeData< Sign0, E0, Pos0 >, OperationPair< Sign1, F1, Node10, Node11, Tag1 >, OuterTag >)
 
template<class T0 , class T1 , class Sign0 , class F0 , class Node00 , class Node01 , class Tag0 , class Sign1 , class E1 , class Pos1 , class Sign , class F , class OuterTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, OperationPair< Sign, F, OperationPair< Sign0, F0, Node00, Node01, Tag0 >, TreeData< Sign1, E1, Pos1 >, OuterTag >)
 
template<class T0 , class T1 , class Sign , class Functor , class... LeftNode, class RightNode , class Tag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, OperationPair< Sign, Functor, MPL::TypeTuple< LeftNode... >, RightNode, Tag >)
 
template<class T0 , class T1 , class Sign , class Functor , class LeftNode , class... RightNode, class Tag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, OperationPair< Sign, Functor, LeftNode, MPL::TypeTuple< RightNode... >, Tag >)
 
template<class T0 , class T1 , class Arg , std::size_t I0, std::size_t... I, class F >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, TreeData< F, Arg, TreePosition< I0, I... > >)
 
template<class T0 , class T1 , class F0 , class E0 , class Pos0 , class F1 , class E1 , class Pos1 , class Sign , class F , class OptimizeTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, OperationPair< Sign, F, TreeData< F0, E0, Pos0 >, TreeData< F1, E1, Pos1 >, OptimizeTag >)
 
template<class T0 , class T1 , class Sign0 , class F0 , class Node00 , class Node01 , class Tag0 , class Sign1 , class F1 , class Node10 , class Node11 , class Tag1 , class Sign , class F , class OuterTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand (T0 &&t0, T1 &&t1, OperationPair< Sign, F, OperationPair< Sign0, F0, Node00, Node01, Tag0 >, OperationPair< Sign1, F1, Node10, Node11, Tag1 >, OuterTag >)
 
template<class T0 , class T1 , class LeftSum , class Last , class F , class Tag >
constexpr auto Dune::ACFem::Expressions::Sums::sumUpRecursion (T0 &&t0, T1 &&t1, LeftSum &&leftSum, MPL::TypeTuple< Last >, F &&f, Tag tag)
 
template<class T0 , class T1 , class LeftSum , class Tail0 , class Tail1 , class... Tail, class F , class Tag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::sumUpRecursion (T0 &&t0, T1 &&t1, LeftSum &&leftSum, MPL::TypeTuple< Tail0, Tail1, Tail... >, F &&f, Tag tag)
 
template<class T0 , class T1 , class Arg0 , class Arg1 , class... ArgRest, class F = JustForward, class Tag = DontOptimize>
constexpr auto Dune::ACFem::Expressions::Sums::sumUp (T0 &&t0, T1 &&t1, MPL::TypeTuple< Arg0, Arg1, ArgRest... >, Tag tag=Tag{}, F &&f=F{})
 
template<class T0 , class T1 , class Last , class F = JustForward, class Tag = OptimizeGeneric>
constexpr auto Dune::ACFem::Expressions::Sums::sumUp (T0 &&t0, T1 &&t1, MPL::TypeTuple< Last >, Tag=Tag{}, F &&f=F{})
 
template<class TreeData , class OptPair , ptrdiff_t OldDelta, class... Head, class Undo >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::tryAddSumOperand (MPL::TypeTuple<>, MPL::TypeTuple< Head... >, Undo)
 
template<class TreeData , class OptPair , ptrdiff_t OldDelta, class Tail0 , class... Tail, class... Head, class... UndoHead>
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::tryAddSumOperand (MPL::TypeTuple< Tail0, Tail... >, MPL::TypeTuple< Head... >, MPL::TypeTuple< UndoHead... >)
 
template<class TreeData , class Tail0 , class... Tail, class... Head>
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::tryAddSumOperand (MPL::TypeTuple< Tail0, Tail... >, MPL::TypeTuple< Head... >)
 

Variables

template<class F , class T0 , class T1 , class SFINAE = void>
constexpr bool Dune::ACFem::Expressions::Sums::IsBinaryOperationOnSumV
 Identify suboptimizable operations on left and right sums.
 
template<class F , class T , class SFINAE = void>
constexpr bool Dune::ACFem::Expressions::Sums::IsUnaryOperationOnSumV
 Identify suboptimizable operations on sums.
 

Detailed Description

Function Documentation

◆ getOperand() [1/7]

template<class T0 , class T1 , class Sign0 , class F0 , class Node00 , class Node01 , class Tag0 , class Sign1 , class F1 , class Node10 , class Node11 , class Tag1 , class Sign , class F , class OuterTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
OperationPair< Sign, F, OperationPair< Sign0, F0, Node00, Node01, Tag0 >, OperationPair< Sign1, F1, Node10, Node11, Tag1 >, OuterTag >   
)
constexpr

◆ getOperand() [2/7]

template<class T0 , class T1 , class Sign0 , class F0 , class Node00 , class Node01 , class Tag0 , class Sign1 , class E1 , class Pos1 , class Sign , class F , class OuterTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
OperationPair< Sign, F, OperationPair< Sign0, F0, Node00, Node01, Tag0 >, TreeData< Sign1, E1, Pos1 >, OuterTag >   
)
constexpr

◆ getOperand() [3/7]

template<class T0 , class T1 , class F0 , class E0 , class Pos0 , class F1 , class E1 , class Pos1 , class Sign , class F , class OptimizeTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
OperationPair< Sign, F, TreeData< F0, E0, Pos0 >, TreeData< F1, E1, Pos1 >, OptimizeTag  
)
constexpr

◆ getOperand() [4/7]

template<class T0 , class T1 , class Sign0 , class E0 , class Pos0 , class Sign1 , class F1 , class Node10 , class Node11 , class Tag1 , class Sign , class F , class OuterTag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
OperationPair< Sign, F, TreeData< Sign0, E0, Pos0 >, OperationPair< Sign1, F1, Node10, Node11, Tag1 >, OuterTag >   
)
constexpr

◆ getOperand() [5/7]

template<class T0 , class T1 , class Sign , class Functor , class LeftNode , class... RightNode, class Tag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
OperationPair< Sign, Functor, LeftNode, MPL::TypeTuple< RightNode... >, Tag >   
)
constexpr

◆ getOperand() [6/7]

template<class T0 , class T1 , class Sign , class Functor , class... LeftNode, class RightNode , class Tag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
OperationPair< Sign, Functor, MPL::TypeTuple< LeftNode... >, RightNode, Tag >   
)
constexpr

◆ getOperand() [7/7]

template<class T0 , class T1 , class Arg , std::size_t I0, std::size_t... I, class F >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::getOperand ( T0 &&  t0,
T1 &&  t1,
TreeData< F, Arg, TreePosition< I0, I... > >   
)
constexpr

Read from T0

◆ sumUp() [1/2]

template<class T0 , class T1 , class Arg0 , class Arg1 , class... ArgRest, class F = JustForward, class Tag = DontOptimize>
constexpr auto Dune::ACFem::Expressions::Sums::sumUp ( T0 &&  t0,
T1 &&  t1,
MPL::TypeTuple< Arg0, Arg1, ArgRest... >  ,
Tag  tag = Tag{},
F &&  f = F{} 
)
constexpr

Take the provide MPL::TypeTuple<> of expression trees (composed of TreeData and OperationPair) and assemble the actual expression, taking the referred-to operands from the given "real" expressions T0 and T1.

Parameters
T0The left operand of the original binary expression.
T1The right operand of the original binary expression.
Arg0,Arg1,ArgRest...Sum-operands as "tree-nodes".
FOptional functor to be applied to the individual sum-operands before summing them up.
TagOptimization-tag.
Note
The recursion results in a sum of the form:

\[ (\dots(\pm f(a_0) \pm f(a_1)) \pm \dots \pm f(a_n)) \]

◆ sumUp() [2/2]

template<class T0 , class T1 , class Last , class F = JustForward, class Tag = OptimizeGeneric>
constexpr auto Dune::ACFem::Expressions::Sums::sumUp ( T0 &&  t0,
T1 &&  t1,
MPL::TypeTuple< Last >  ,
Tag  = Tag{},
F &&  f = F{} 
)
constexpr

Special case of a "sum" with only one operand. This can happen.

Referenced by Dune::ACFem::Expressions::Sums::getOperand().

◆ sumUpRecursion() [1/2]

template<class T0 , class T1 , class LeftSum , class Last , class F , class Tag >
constexpr auto Dune::ACFem::Expressions::Sums::sumUpRecursion ( T0 &&  t0,
T1 &&  t1,
LeftSum &&  leftSum,
MPL::TypeTuple< Last >  ,
F &&  f,
Tag  tag 
)
constexpr

Recursion end-point, add the last operand with proper sign and return.

References Dune::ACFem::Expressions::Sums::getOperand(), and Dune::ACFem::Expressions::Sums::operate().

◆ sumUpRecursion() [2/2]

template<class T0 , class T1 , class LeftSum , class Tail0 , class Tail1 , class... Tail, class F , class Tag >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::sumUpRecursion ( T0 &&  t0,
T1 &&  t1,
LeftSum &&  leftSum,
MPL::TypeTuple< Tail0, Tail1, Tail... >  ,
F &&  f,
Tag  tag 
)
constexpr

◆ tryAddSumOperand() [1/3]

template<class TreeData , class Tail0 , class... Tail, class... Head>
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::tryAddSumOperand ( MPL::TypeTuple< Tail0, Tail... >  ,
MPL::TypeTuple< Head... >   
)
constexpr

Recursion work-horse as long as no optimizable operation has been found yet.

◆ tryAddSumOperand() [2/3]

template<class TreeData , class OptPair , ptrdiff_t OldDelta, class Tail0 , class... Tail, class... Head, class... UndoHead>
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::tryAddSumOperand ( MPL::TypeTuple< Tail0, Tail... >  ,
MPL::TypeTuple< Head... >  ,
MPL::TypeTuple< UndoHead... >   
)
constexpr

Recursion work-horse after finding one optimization, continue searching for a better one.

(+TreeData) + (+Tail0) -> TreeData + Tail0 (+TreeData) + (-Tail0) -> TreeData - Tail0 (-TreeData) + (+Tail0) -> +(Tail0 - TreeData) (-TreeData) + (-Tail0) -> -(Tail0 + TreeData)

◆ tryAddSumOperand() [3/3]

template<class TreeData , class OptPair , ptrdiff_t OldDelta, class... Head, class Undo >
constexpr decltype(auto) Dune::ACFem::Expressions::Sums::tryAddSumOperand ( MPL::TypeTuple<>  ,
MPL::TypeTuple< Head... >  ,
Undo   
)
constexpr

Recursion end-point, OptPair is the best optimization found

Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)