Stokhos Package Browser (Single Doxygen Collection)
Version of the Day
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
src
sacado
kokkos
pce
linalg
Kokkos_MV_UQ_PCE.hpp
Go to the documentation of this file.
1
// @HEADER
2
// ***********************************************************************
3
//
4
// Stokhos Package
5
// Copyright (2009) Sandia Corporation
6
//
7
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8
// license for use of this work by or on behalf of the U.S. Government.
9
//
10
// Redistribution and use in source and binary forms, with or without
11
// modification, are permitted provided that the following conditions are
12
// met:
13
//
14
// 1. Redistributions of source code must retain the above copyright
15
// notice, this list of conditions and the following disclaimer.
16
//
17
// 2. Redistributions in binary form must reproduce the above copyright
18
// notice, this list of conditions and the following disclaimer in the
19
// documentation and/or other materials provided with the distribution.
20
//
21
// 3. Neither the name of the Corporation nor the names of the
22
// contributors may be used to endorse or promote products derived from
23
// this software without specific prior written permission.
24
//
25
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
//
37
// Questions? Contact Eric T. Phipps (etphipp@sandia.gov).
38
//
39
// ***********************************************************************
40
// @HEADER
41
42
#ifndef KOKKOS_MV_UQ_PCE_HPP
43
#define KOKKOS_MV_UQ_PCE_HPP
44
45
#include "
Sacado_UQ_PCE.hpp
"
46
#include "
Kokkos_View_UQ_PCE.hpp
"
47
#include "
Kokkos_InnerProductSpaceTraits_UQ_PCE.hpp
"
48
#include "
Kokkos_Blas1_UQ_PCE.hpp
"
49
/*
50
//----------------------------------------------------------------------------
51
// Specializations of Kokkos Vector/MultiVector math functions
52
//----------------------------------------------------------------------------
53
54
namespace Kokkos {
55
56
// Rank-1 vector add with Sacado::UQ::PCE scalar type, constant a, b
57
template <typename RS, typename RL, typename RD, typename RM,
58
typename XS, typename XL, typename XD, typename XM,
59
typename YS, typename YL, typename YD, typename YM>
60
Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM>
61
V_Add( const Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM >& r,
62
const typename Sacado::UQ::PCE<XS>::value_type& av,
63
const Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM >& x,
64
const typename Sacado::UQ::PCE<XS>::value_type& bv,
65
const Kokkos::View< Sacado::UQ::PCE<YS>*, YL, YD, YM >& y,
66
int n = -1)
67
{
68
typedef Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM > RVector;
69
typedef Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM > XVector;
70
typedef Kokkos::View< Sacado::UQ::PCE<YS>*, YL, YD, YM > YVector;
71
72
typename RVector::flat_array_type r_flat = r;
73
typename XVector::flat_array_type x_flat = x;
74
typename YVector::flat_array_type y_flat = y;
75
if (n != -1) n = n * r.sacado_size();
76
77
V_Add( r_flat, av, x_flat, bv, y_flat, n );
78
79
return r;
80
}
81
82
// Rank-1 vector add with Sacado::UQ::PCE scalar type, non-constant a, b
83
template <typename RS, typename RL, typename RD, typename RM,
84
typename XS, typename XL, typename XD, typename XM,
85
typename YS, typename YL, typename YD, typename YM>
86
Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM>
87
V_Add( const Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM >& r,
88
const Sacado::UQ::PCE<XS>& av,
89
const Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM >& x,
90
const Sacado::UQ::PCE<XS>& bv,
91
const Kokkos::View< Sacado::UQ::PCE<YS>*, YL, YD, YM >& y,
92
int n = -1)
93
{
94
if (Sacado::is_constant(av) && Sacado::is_constant(bv)) {
95
return V_Add( r, av.fastAccessCoeff(0), x, bv.fastAccessCoeff(0), y, n );
96
}
97
else {
98
Impl::raise_error("V_Add not implemented for non-constant a or b");
99
}
100
return r;
101
}
102
103
// Rank-2 vector add with Sacado::UQ::PCE scalar type, constant a, b
104
template <typename RS, typename RL, typename RD, typename RM,
105
typename XS, typename XL, typename XD, typename XM,
106
typename YS, typename YL, typename YD, typename YM>
107
Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM>
108
MV_Add( const Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM >& r,
109
const typename Sacado::UQ::PCE<XS>::value_type& av,
110
const Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM >& x,
111
const typename Sacado::UQ::PCE<XS>::value_type& bv,
112
const Kokkos::View< Sacado::UQ::PCE<YS>**, YL, YD, YM >& y,
113
int n = -1)
114
{
115
typedef Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM > RVector;
116
typedef Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM > XVector;
117
typedef Kokkos::View< Sacado::UQ::PCE<YS>**, YL, YD, YM > YVector;
118
119
typename RVector::flat_array_type r_flat = r;
120
typename XVector::flat_array_type x_flat = x;
121
typename YVector::flat_array_type y_flat = y;
122
if (n != -1) n = n * r.sacado_size();
123
124
MV_Add( r_flat, av, x_flat, bv, y_flat, n );
125
126
return r;
127
}
128
129
// Rank-2 vector add with Sacado::UQ::PCE scalar type, non-constant a, b
130
template <typename RS, typename RL, typename RD, typename RM,
131
typename XS, typename XL, typename XD, typename XM,
132
typename YS, typename YL, typename YD, typename YM>
133
Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM>
134
MV_Add( const Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM >& r,
135
const Sacado::UQ::PCE<XS>& av,
136
const Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM >& x,
137
const Sacado::UQ::PCE<XS>& bv,
138
const Kokkos::View< Sacado::UQ::PCE<YS>**, YL, YD, YM >& y,
139
int n = -1)
140
{
141
if (Sacado::is_constant(av) && Sacado::is_constant(bv)) {
142
return MV_Add( r, av.fastAccessCoeff(0), x, bv.fastAccessCoeff(0), y, n );
143
}
144
else {
145
Impl::raise_error("MV_Add not implemented for non-constant a or b");
146
}
147
return r;
148
}
149
150
// Rank-1 dot product
151
template <typename XS, typename XL, typename XD, typename XM,
152
typename YS, typename YL, typename YD, typename YM>
153
typename Details::InnerProductSpaceTraits< Sacado::UQ::PCE<XS> >::dot_type
154
V_Dot( const Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM >& x,
155
const Kokkos::View< Sacado::UQ::PCE<YS>*, YL, YD, YM >& y,
156
int n = -1 )
157
{
158
typedef Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM > XVector;
159
typedef Kokkos::View< Sacado::UQ::PCE<YS>*, YL, YD, YM > YVector;
160
161
typename XVector::flat_array_type x_flat = x;
162
typename YVector::flat_array_type y_flat = y;
163
if (n != -1) n = n * x.sacado_size();
164
165
return V_Dot( x_flat, y_flat, n );
166
}
167
168
// Rank-2 dot product
169
template <typename rVector,
170
typename XS, typename XL, typename XD, typename XM,
171
typename YS, typename YL, typename YD, typename YM>
172
void
173
MV_Dot( const rVector& r,
174
const Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM >& x,
175
const Kokkos::View< Sacado::UQ::PCE<YS>**, YL, YD, YM >& y,
176
int n = -1 )
177
{
178
typedef Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM > XVector;
179
typedef Kokkos::View< Sacado::UQ::PCE<YS>**, YL, YD, YM > YVector;
180
181
typename XVector::flat_array_type x_flat = x;
182
typename YVector::flat_array_type y_flat = y;
183
if (n != -1) n = n * x.sacado_size();
184
185
MV_Dot( r, x_flat, y_flat, n );
186
}
187
188
template<class VT1, class VT2, class VT3>
189
struct MV_ElementWiseMultiplyFunctor;
190
191
template <typename CT, typename CD, typename CM,
192
typename AT, typename AD, typename AM,
193
typename BT, typename BD, typename BM>
194
struct MV_ElementWiseMultiplyFunctor<
195
View< CT,LayoutLeft,CD,CM,Impl::ViewPCEContiguous >,
196
View< AT,LayoutLeft,AD,AM,Impl::ViewPCEContiguous >,
197
View< BT,LayoutLeft,BD,BM,Impl::ViewPCEContiguous > >
198
{
199
typedef View< CT,LayoutLeft,CD,CM,Impl::ViewPCEContiguous > CVector;
200
typedef View< AT,LayoutLeft,AD,AM,Impl::ViewPCEContiguous > AVector;
201
typedef View< BT,LayoutLeft,BD,BM,Impl::ViewPCEContiguous > BVector;
202
203
typedef typename CVector::array_type CArray;
204
typedef typename AVector::array_type AArray;
205
typedef typename BVector::array_type BArray;
206
207
typedef typename CArray::execution_space execution_space;
208
typedef typename CArray::size_type size_type;
209
210
typename CArray::const_value_type m_c;
211
CArray m_C;
212
typename AArray::const_value_type m_ab;
213
typename AArray::const_type m_A ;
214
typename BArray::const_type m_B ;
215
const size_type m_n;
216
const size_type m_n_pce;
217
218
MV_ElementWiseMultiplyFunctor(typename CVector::const_value_type c,
219
CVector C,
220
typename AVector::const_value_type ab,
221
typename AVector::const_type A,
222
typename BVector::const_type B,
223
const size_type n) :
224
m_c(c.fastAccessCoeff(0)),
225
m_C(C),
226
m_ab(ab.fastAccessCoeff(0)),
227
m_A(A),
228
m_B(B),
229
m_n(n),
230
m_n_pce(C.sacado_size()) {}
231
232
KOKKOS_INLINE_FUNCTION
233
void operator()( const size_type i) const
234
{
235
// Currently specialized for use case where A is degree-0
236
typename AArray::const_value_type Ai = m_A(0,i);
237
for (size_type k=0; k<m_n; ++k) {
238
#ifdef KOKKOS_ENABLE_PRAGMA_IVDEP
239
#pragma ivdep
240
#endif
241
for (size_type l=0; l<m_n_pce; ++l)
242
m_C(l,i,k) = m_c*m_C(l,i,k) + m_ab*Ai*m_B(l,i,k);
243
}
244
}
245
};
246
247
template<class VT1, class VT2, class VT3>
248
struct V_ElementWiseMultiplyFunctor;
249
250
template <typename CT, typename CD, typename CM,
251
typename AT, typename AD, typename AM,
252
typename BT, typename BD, typename BM>
253
struct V_ElementWiseMultiplyFunctor<
254
View< CT,LayoutLeft,CD,CM,Impl::ViewPCEContiguous >,
255
View< AT,LayoutLeft,AD,AM,Impl::ViewPCEContiguous >,
256
View< BT,LayoutLeft,BD,BM,Impl::ViewPCEContiguous > >
257
{
258
typedef View< CT,LayoutLeft,CD,CM,Impl::ViewPCEContiguous > CVector;
259
typedef View< AT,LayoutLeft,AD,AM,Impl::ViewPCEContiguous > AVector;
260
typedef View< BT,LayoutLeft,BD,BM,Impl::ViewPCEContiguous > BVector;
261
262
typedef typename CVector::array_type CArray;
263
typedef typename AVector::array_type AArray;
264
typedef typename BVector::array_type BArray;
265
266
typedef typename CArray::execution_space execution_space;
267
typedef typename CArray::size_type size_type;
268
269
typename CArray::const_value_type m_c;
270
CArray m_C;
271
typename AArray::const_value_type m_ab;
272
typename AArray::const_type m_A ;
273
typename BArray::const_type m_B ;
274
const size_type m_n_pce;
275
276
V_ElementWiseMultiplyFunctor(typename CVector::const_value_type c,
277
CVector C,
278
typename AVector::const_value_type ab,
279
typename AVector::const_type A,
280
typename BVector::const_type B) :
281
m_c(c.fastAccessCoeff(0)),
282
m_C(C),
283
m_ab(ab.fastAccessCoeff(0)),
284
m_A(A),
285
m_B(B),
286
m_n_pce(C.sacado_size()) {}
287
288
KOKKOS_INLINE_FUNCTION
289
void operator()( const size_type i) const
290
{
291
// Currently specialized for use case where A is degree-0
292
typename AArray::const_value_type Ai = m_A(0,i);
293
#ifdef KOKKOS_ENABLE_PRAGMA_IVDEP
294
#pragma ivdep
295
#endif
296
for (size_type l=0; l<m_n_pce; ++l)
297
m_C(l,i) = m_c*m_C(l,i) + m_ab*Ai*m_B(l,i);
298
}
299
};
300
301
// Rank-1 vector multiply with Sacado::UQ::PCE scalar type, constant c, ab
302
template <typename CS, typename CL, typename CD, typename CM,
303
typename AS, typename AL, typename AD, typename AM,
304
typename BS, typename BL, typename BD, typename BM>
305
Kokkos::View< Sacado::UQ::PCE<CS>*, CL, CD, CM>
306
V_ElementWiseMultiply(
307
const typename Sacado::UQ::PCE<CS>::value_type& c,
308
const Kokkos::View< Sacado::UQ::PCE<CS>*, CL, CD, CM >& C,
309
const typename Sacado::UQ::PCE<AS>::value_type& ab,
310
const Kokkos::View< Sacado::UQ::PCE<AS>*, AL, AD, AM >& A,
311
const Kokkos::View< Sacado::UQ::PCE<BS>*, BL, BD, BM >& B )
312
{
313
typedef View< Sacado::UQ::PCE<CS>*, CL, CD, CM > CVector;
314
typedef View< Sacado::UQ::PCE<AS>*, AL, AD, AM > AVector;
315
typedef View< Sacado::UQ::PCE<BS>*, BL, BD, BM > BVector;
316
317
typedef View< typename CVector::data_type, typename CVector::array_layout, typename CVector::execution_space, typename CVector::memory_traits > CView;
318
typedef View< typename AVector::data_type, typename AVector::array_layout, typename AVector::execution_space, typename AVector::memory_traits > AView;
319
typedef View< typename BVector::data_type, typename BVector::array_layout, typename BVector::execution_space, typename BVector::memory_traits > BView;
320
321
V_ElementWiseMultiplyFunctor<CView,AView,BView> op(c,C,ab,A,B) ;
322
Kokkos::parallel_for( C.extent(0) , op );
323
return C;
324
}
325
326
// Rank-1 vector multiply with Sacado::UQ::PCE scalar type, non-constant c, ab
327
template <typename CS, typename CL, typename CD, typename CM,
328
typename AS, typename AL, typename AD, typename AM,
329
typename BS, typename BL, typename BD, typename BM>
330
Kokkos::View< Sacado::UQ::PCE<CS>*, CL, CD, CM>
331
V_ElementWiseMultiply(
332
const Sacado::UQ::PCE<CS>& c,
333
const Kokkos::View< Sacado::UQ::PCE<CS>*, CL, CD, CM >& C,
334
const Sacado::UQ::PCE<AS>& ab,
335
const Kokkos::View< Sacado::UQ::PCE<AS>*, AL, AD, AM >& A,
336
const Kokkos::View< Sacado::UQ::PCE<BS>*, BL, BD, BM >& B )
337
{
338
if (Sacado::is_constant(c) && Sacado::is_constant(ab)) {
339
return V_ElementWiseMultiply( c.fastAccessCoeff(0), C,
340
ab.fastAccessCoeff(0), A, B );
341
}
342
else {
343
Impl::raise_error(
344
"V_ElementWiseMultiply not implemented for non-constant c or ab");
345
}
346
return C;
347
}
348
349
// Rank-2 vector multiply with Sacado::UQ::PCE scalar type, constant c, ab
350
template <typename CS, typename CL, typename CD, typename CM,
351
typename AS, typename AL, typename AD, typename AM,
352
typename BS, typename BL, typename BD, typename BM>
353
Kokkos::View< Sacado::UQ::PCE<CS>**, CL, CD, CM>
354
MV_ElementWiseMultiply(
355
const typename Sacado::UQ::PCE<CS>::value_type& c,
356
const Kokkos::View< Sacado::UQ::PCE<CS>**, CL, CD, CM >& C,
357
const typename Sacado::UQ::PCE<AS>::value_type& ab,
358
const Kokkos::View< Sacado::UQ::PCE<AS>*, AL, AD, AM >& A,
359
const Kokkos::View< Sacado::UQ::PCE<BS>**, BL, BD, BM >& B )
360
{
361
typedef View< Sacado::UQ::PCE<CS>**, CL, CD, CM > CVector;
362
typedef View< Sacado::UQ::PCE<AS>*, AL, AD, AM > AVector;
363
typedef View< Sacado::UQ::PCE<BS>**, BL, BD, BM > BVector;
364
365
typedef View< typename CVector::data_type, typename CVector::array_layout, typename CVector::execution_space, typename CVector::memory_traits > CView;
366
typedef View< typename AVector::data_type, typename AVector::array_layout, typename AVector::execution_space, typename AVector::memory_traits > AView;
367
typedef View< typename BVector::data_type, typename BVector::array_layout, typename BVector::execution_space, typename BVector::memory_traits > BView;
368
369
MV_ElementWiseMultiplyFunctor<CView,AView,BView> op(c,C,ab,A,B,C.extent(1)) ;
370
Kokkos::parallel_for( C.extent(0) , op );
371
return C;
372
}
373
374
// Rank-2 vector multiply with Sacado::UQ::PCE scalar type, non-constant c, ab
375
template <typename CS, typename CL, typename CD, typename CM,
376
typename AS, typename AL, typename AD, typename AM,
377
typename BS, typename BL, typename BD, typename BM>
378
Kokkos::View< Sacado::UQ::PCE<CS>**, CL, CD, CM>
379
MV_ElementWiseMultiply(
380
const Sacado::UQ::PCE<CS>& c,
381
const Kokkos::View< Sacado::UQ::PCE<CS>**, CL, CD, CM >& C,
382
const Sacado::UQ::PCE<AS>& ab,
383
const Kokkos::View< Sacado::UQ::PCE<AS>*, AL, AD, AM >& A,
384
const Kokkos::View< Sacado::UQ::PCE<BS>**, BL, BD, BM >& B )
385
{
386
if (Sacado::is_constant(c) && Sacado::is_constant(ab)) {
387
return MV_ElementWiseMultiply( c.fastAccessCoeff(0), C,
388
ab.fastAccessCoeff(0), A, B );
389
}
390
else {
391
Impl::raise_error(
392
"MV_ElementWiseMultiply not implemented for non-constant c or ab");
393
}
394
return C;
395
}
396
397
// Rank-1 vector scale with Sacado::UQ::PCE scalar type, constant a, b
398
template <typename RS, typename RL, typename RD, typename RM,
399
typename XS, typename XL, typename XD, typename XM>
400
Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM>
401
V_MulScalar( const Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM >& r,
402
const typename Sacado::UQ::PCE<XS>::value_type& a,
403
const Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM >& x )
404
{
405
typedef Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM > RVector;
406
typedef Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM > XVector;
407
408
typename RVector::flat_array_type r_flat = r;
409
typename XVector::flat_array_type x_flat = x;
410
411
V_MulScalar( r_flat, a, x_flat );
412
413
return r;
414
}
415
416
// Rank-1 vector scale with Sacado::UQ::PCE scalar type, non-constant a, b
417
template <typename RS, typename RL, typename RD, typename RM,
418
typename XS, typename XL, typename XD, typename XM>
419
Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM>
420
V_MulScalar( const Kokkos::View< Sacado::UQ::PCE<RS>*, RL, RD, RM >& r,
421
const Sacado::UQ::PCE<XS>& a,
422
const Kokkos::View< Sacado::UQ::PCE<XS>*, XL, XD, XM >& x )
423
{
424
if (Sacado::is_constant(a)) {
425
return V_MulScalar( r, a.fastAccessCoeff(0), x );
426
}
427
else {
428
Impl::raise_error("V_MulScalar not implemented for non-constant a");
429
}
430
return r;
431
}
432
433
// Rank-2 vector scale with Sacado::UQ::PCE scalar type, constant a, b
434
template <typename RS, typename RL, typename RD, typename RM,
435
typename XS, typename XL, typename XD, typename XM>
436
Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM>
437
MV_MulScalar( const Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM >& r,
438
const typename Sacado::UQ::PCE<XS>::value_type& a,
439
const Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM >& x )
440
{
441
typedef Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM > RVector;
442
typedef Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM > XVector;
443
444
typename RVector::flat_array_type r_flat = r;
445
typename XVector::flat_array_type x_flat = x;
446
447
MV_MulScalar( r_flat, a, x_flat );
448
449
return r;
450
}
451
452
// Rank-2 vector scale with Sacado::UQ::PCE scalar type, non-constant a, b
453
template <typename RS, typename RL, typename RD, typename RM,
454
typename XS, typename XL, typename XD, typename XM>
455
Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM>
456
MV_MulScalar( const Kokkos::View< Sacado::UQ::PCE<RS>**, RL, RD, RM >& r,
457
const Sacado::UQ::PCE<XS>& a,
458
const Kokkos::View< Sacado::UQ::PCE<XS>**, XL, XD, XM >& x )
459
{
460
if (Sacado::is_constant(a)) {
461
return MV_MulScalar( r, a.fastAccessCoeff(0), x );
462
}
463
else {
464
Impl::raise_error("MV_MulScalar not implemented for non-constant a or b");
465
}
466
return r;
467
}
468
469
template <typename T>
470
struct V_ReciprocalThresholdSelfFunctor;
471
472
template <typename T, typename D, typename M>
473
struct V_ReciprocalThresholdSelfFunctor<
474
View< T,LayoutLeft,D,M,Impl::ViewPCEContiguous > >
475
{
476
typedef View< T,LayoutLeft,D,M,Impl::ViewPCEContiguous > XVector;
477
typedef typename XVector::array_type array_type;
478
479
typedef typename array_type::execution_space execution_space;
480
typedef typename array_type::size_type size_type;
481
typedef typename array_type::non_const_value_type value_type;
482
typedef Kokkos::Details::ArithTraits<value_type> KAT;
483
typedef typename KAT::mag_type mag_type;
484
485
const array_type m_x;
486
const value_type m_min_val;
487
const value_type m_min_val_mag;
488
const size_type m_n_pce;
489
490
V_ReciprocalThresholdSelfFunctor(
491
const XVector& x,
492
const typename XVector::non_const_value_type& min_val) :
493
m_x(x),
494
m_min_val(min_val.fastAccessCoeff(0)),
495
m_min_val_mag(KAT::abs(m_min_val)),
496
m_n_pce(x.sacado_size()) {}
497
//--------------------------------------------------------------------------
498
499
KOKKOS_INLINE_FUNCTION
500
void operator()( const size_type i) const
501
{
502
if (KAT::abs(m_x(0,i)) < m_min_val_mag)
503
m_x(0,i) = m_min_val;
504
else
505
m_x(0,i) = KAT::one() / m_x(0,i);
506
for (size_type l=1; l<m_n_pce; ++l)
507
m_x(l,i) = KAT::zero();
508
}
509
};
510
511
template <typename T>
512
struct MV_ReciprocalThresholdSelfFunctor;
513
514
template <typename T, typename D, typename M>
515
struct MV_ReciprocalThresholdSelfFunctor<
516
View< T,LayoutLeft,D,M,Impl::ViewPCEContiguous > >
517
{
518
typedef View< T,LayoutLeft,D,M,Impl::ViewPCEContiguous > XVector;
519
typedef typename XVector::array_type array_type;
520
521
typedef typename array_type::execution_space execution_space;
522
typedef typename array_type::size_type size_type;
523
typedef typename array_type::non_const_value_type value_type;
524
typedef Kokkos::Details::ArithTraits<value_type> KAT;
525
typedef typename KAT::mag_type mag_type;
526
527
const array_type m_x;
528
const value_type m_min_val;
529
const value_type m_min_val_mag;
530
const size_type m_n;
531
const size_type m_n_pce;
532
533
MV_ReciprocalThresholdSelfFunctor(
534
const XVector& x,
535
const typename XVector::non_const_value_type& min_val,
536
const size_type& n) :
537
m_x(x),
538
m_min_val(min_val.fastAccessCoeff(0)),
539
m_min_val_mag(KAT::abs(m_min_val)),
540
m_n(n),
541
m_n_pce(x.sacado_size()) {}
542
//--------------------------------------------------------------------------
543
544
KOKKOS_INLINE_FUNCTION
545
void operator()( const size_type i) const
546
{
547
for (size_type k=0; k<m_n; ++k) {
548
if (KAT::abs(m_x(0,i,k)) < m_min_val_mag)
549
m_x(0,i,k) = m_min_val;
550
else
551
m_x(0,i,k) = KAT::one() / m_x(0,i,k);
552
for (size_type l=1; l<m_n_pce; ++l)
553
m_x(l,i,k) = KAT::zero();
554
}
555
}
556
};
557
558
} // namespace Kokkos
559
*/
560
#endif
/* #ifndef KOKKOS_MV_UQ_PCE_HPP */
Kokkos_InnerProductSpaceTraits_UQ_PCE.hpp
Kokkos_Blas1_UQ_PCE.hpp
Sacado_UQ_PCE.hpp
Kokkos_View_UQ_PCE.hpp
Generated by
1.8.5