3#include "dg/backend/config.h"
23 template<
class T1,
class T2>
32 template<
class T1,
class T2>
41 template<
class T1,
class T2>
50 template<
class T1,
class T2>
59 template<
class T1,
class T2>
75 template<
class T1,
class ...Ts>
81 return sum(
x, rest ...);
84 template<
class T1,
class ...Ts>
85DG_DEVICE auto sum( T1 x, Ts... rest)
const
87 return x + sum( rest...);
102 template<
class T1,
class ...Ts>
106 return prod(
x, rest...);
109 template<
class T1,
class ...Ts>
110DG_DEVICE auto prod( T1 x, Ts... rest)
const
112 return x * prod( rest...);
126 template<
class T1,
class T2,
class ...Ts>
129 return sum( a,
x, rest...);
132 template<
class T1,
class T2,
class ...Ts>
133DG_DEVICE auto sum( T1 alpha, T2 x, Ts... rest)
const
135 return DG_FMA( alpha, x, sum(rest...));
138 template<
class T1,
class T2>
148 template<
class T0,
class T1,
class T2,
class ...Ts>
151 return sum( a, x1, y1, rest...);
154 template<
class T0,
class T1,
class T2,
class ...Ts>
155DG_DEVICE auto sum( T0 alpha, T1 x, T2
y, Ts... rest)
const
157 return DG_FMA( alpha*x,
y, sum(rest...));
160 template<
class T0,
class T1,
class T2>
161DG_DEVICE auto sum( T0 alpha, T1 x, T2
y)
const
176 template<
class T1,
class ...Ts>
181 sum(
y, yt, rest...);
184 template<
class T1,
class ...Ts>
185DG_DEVICE void sum( T1& y_1, T1& yt_1, T1 b, T1 bt, T1 k, Ts... rest)
const
187 y_1 = DG_FMA( b, k, y_1);
188 yt_1 = DG_FMA( bt, k, yt_1);
189 sum( y_1, yt_1, rest...);
193DG_DEVICE void sum( T1& y_1, T1& yt_1, T1 b, T1 bt, T1 k)
const
195 y_1 = DG_FMA( b, k, y_1);
196 yt_1 = DG_FMA( bt, k, yt_1);
207template<
class BinarySub,
class Functor>
210 Evaluate( BinarySub sub, Functor g): m_f( sub), m_g( g) {}
218#pragma hd_warning_disable
220 template<
class T,
class... Ts>
221DG_DEVICE void operator() ( T& y, Ts... xs){
237 void operator()( T1& y)
const{
251 void operator()( T1& y)
const{
260template<
class T0,
class T1>
263 Axpby( T0 a, T1 b): m_a(a), m_b(b){}
264 template<
class T2,
class T3>
266 void operator()( T2 x, T3& y)
const {
268 y = DG_FMA( m_a, x, y);
276template<
class T0,
class T1>
279 AxyPby( T0 a, T1 b): m_a(a), m_b(b){}
280 template<
class T2,
class T3>
282 void operator()( T2 x, T3& y)
const {
285 y = DG_FMA( m_a*x, tmp, y);
293template<
class T0,
class T1,
class T2>
296 Axpbypgz( T0 a, T1 b, T2 g): m_a(a), m_b(b), m_g(g){}
297 template<
class T3,
class T4,
class T5>
299 void operator()( T3 x, T4 y, T5& z)
const{
301 z = DG_FMA( m_a, x, z);
302 z = DG_FMA( m_b, y, z);
311template<
class T0,
class T1>
314 PointwiseDot( T0 a, T1 b): m_a(a), m_b(b) {}
315 template<
class T3,
class T4,
class T5>
317DG_DEVICE void operator()( T3 x, T4 y, T5& z)
const{
319 z = DG_FMA( m_a*x, y, z);
322 template<
class T3,
class T4,
class T5,
class T6>
324 void operator()( T3 x1, T4 x2, T5 x3, T6& y)
const{
326 y = DG_FMA( m_a*x1, x2*x3, y);
333template<
class T0,
class T1,
class T2>
336 PointwiseDot2( T0 a, T1 b, T2 g): m_a(a), m_b(b), m_g(g) {}
338 template<
class T3,
class T4,
class T5,
class T6,
class T7>
340 void operator()( T3 x1, T4 y1, T5 x2, T6 y2, T7& z)
const{
342 z = DG_FMA( m_a*x1, y1, z);
343 z = DG_FMA( m_b*x2, y2, z);
354 template<
class T1,
class T2>
355DG_DEVICE auto operator()( T1 x1, T2 x2)
const
362template<
class T0,
class T1>
363struct PointwiseDivide
365 PointwiseDivide( T0 a, T1 b): m_a(a), m_b(b){}
367 template<
class T3,
class T4>
369 void operator()( T3 y, T4& z)
const{
372 z = DG_FMA( m_a, tmp/y, z);
374 template<
class T3,
class T4,
class T5>
376 void operator()( T3 x, T4 y, T5& z)
const{
378 z = DG_FMA( m_a, x/y, z);
386template<
class F,
class G>
389 Compose( F f, G g):m_f(f), m_g(g){}
390 template<
class ...Xs>
391 auto operator() ( Xs&& ... xs){
392 return m_f(m_g(std::forward<Xs>(xs)...));
394 template<
class ...Xs>
395 auto operator() ( Xs&& ... xs)
const {
396 return m_f(m_g(std::forward<Xs>(xs)...));
427template <
class UnaryOp,
class Functor>
429 return detail::Compose<UnaryOp,Functor>( f, g);
439template <
class UnaryOp,
typename... Functors>
Some utility functions for the dg::evaluate routines.
auto compose(UnaryOp f, Functor g)
Create Composition functor .
Definition subroutines.h:428
#define DG_DEVICE
Expands to __host__ __device__ if compiled with nvcc else is empty.
Definition dg_doc.h:378
This is the namespace for all functions and classes defined and used by the discontinuous Galerkin li...
Definition subroutines.h:174
DG_DEVICE void operator()(T1 &y, T1 &yt, T1 b, T1 bt, Ts... rest) const
Definition subroutines.h:177
Definition subroutines.h:11
DG_DEVICE T operator()(T x) const
Definition subroutines.h:13
Definition subroutines.h:124
DG_DEVICE auto operator()(T1 a, T2 x, Ts... rest) const
Definition subroutines.h:127
Definition subroutines.h:100
DG_DEVICE auto operator()(T1 x, Ts... rest) const
Definition subroutines.h:103
Definition subroutines.h:73
DG_DEVICE auto operator()(T1 x, Ts... rest) const
Definition subroutines.h:76
Definition subroutines.h:146
DG_DEVICE auto operator()(T0 a, T1 x1, T2 y1, Ts... rest) const
Definition subroutines.h:149
Definition subroutines.h:58
DG_DEVICE void operator()(T1 x, T2 &y) const
Definition subroutines.h:60
Definition subroutines.h:22
DG_DEVICE void operator()(T1 x, T2 &y) const
Definition subroutines.h:24
Definition subroutines.h:40
DG_DEVICE void operator()(T1 x, T2 &y) const
Definition subroutines.h:42
Definition subroutines.h:31
DG_DEVICE void operator()(T1 x, T2 &y) const
Definition subroutines.h:33
Definition subroutines.h:49
DG_DEVICE void operator()(T1 x, T2 &y) const
Definition subroutines.h:51