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 {
284 y = DG_FMA( m_a*x, y, y);
292template<
class T0,
class T1,
class T2>
295 Axpbypgz( T0 a, T1 b, T2 g): m_a(a), m_b(b), m_g(g){}
296 template<
class T3,
class T4,
class T5>
298 void operator()( T3 x, T4 y, T5& z)
const{
300 z = DG_FMA( m_a, x, z);
301 z = DG_FMA( m_b, y, z);
310template<
class T0,
class T1>
313 PointwiseDot( T0 a, T1 b): m_a(a), m_b(b) {}
314 template<
class T3,
class T4,
class T5>
316DG_DEVICE void operator()( T3 x, T4 y, T5& z)
const{
318 z = DG_FMA( m_a*x, y, z);
321 template<
class T3,
class T4,
class T5,
class T6>
323 void operator()( T3 x1, T4 x2, T5 x3, T6& y)
const{
325 y = DG_FMA( m_a*x1, x2*x3, y);
332template<
class T0,
class T1,
class T2>
335 PointwiseDot2( T0 a, T1 b, T2 g): m_a(a), m_b(b), m_g(g) {}
337 template<
class T3,
class T4,
class T5,
class T6,
class T7>
339 void operator()( T3 x1, T4 y1, T5 x2, T6 y2, T7& z)
const{
341 z = DG_FMA( m_a*x1, y1, z);
342 z = DG_FMA( m_b*x2, y2, z);
353 template<
class T1,
class T2>
354DG_DEVICE auto operator()( T1 x1, T2 x2)
const
361template<
class T0,
class T1>
362struct PointwiseDivide
364 PointwiseDivide( T0 a, T1 b): m_a(a), m_b(b){}
366 template<
class T3,
class T4>
368 void operator()( T3 y, T4& z)
const{
370 z = DG_FMA( m_a, z/y, z);
372 template<
class T3,
class T4,
class T5>
374 void operator()( T3 x, T4 y, T5& z)
const{
376 z = DG_FMA( m_a, x/y, z);
384template<
class F,
class G>
387 Compose( F f, G g):m_f(f), m_g(g){}
388 template<
class ...Xs>
389 auto operator() ( Xs&& ... xs){
390 return m_f(m_g(std::forward<Xs>(xs)...));
392 template<
class ...Xs>
393 auto operator() ( Xs&& ... xs)
const {
394 return m_f(m_g(std::forward<Xs>(xs)...));
425template <
class UnaryOp,
class Functor>
427 return detail::Compose<UnaryOp,Functor>( f, g);
437template <
class UnaryOp,
typename... Functors>
Some utility functions for the dg::evaluate routines.
auto compose(UnaryOp f, Functor g)
Create Composition functor .
Definition subroutines.h:426
#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