54 #if defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC) 57 template <
typename ViewTypeA,
typename ViewTypeB,
typename ViewTypeC>
66 MatVec(
const ViewTypeA& A_,
const ViewTypeB& b_,
const ViewTypeC& c_) :
68 m(
A.extent(0)), n(
A.extent(1))
70 typedef typename ViewTypeC::execution_space execution_space;
71 Kokkos::parallel_for(Kokkos::RangePolicy<execution_space>(0,m), *
this);
75 void operator() (
const size_t i)
const {
76 typedef typename ViewTypeC::value_type scalar_type;
79 for (
size_t j=0; j<n; ++j)
86 template <
typename ViewTypeA,
typename ViewTypeB,
typename ViewTypeC>
87 void run_mat_vec(
const ViewTypeA&
A,
const ViewTypeB& b,
const ViewTypeC&
c)
89 MatVec<ViewTypeA,ViewTypeB,ViewTypeC> f(
A,b,
c);
94 template <
typename ViewTypeA,
typename ViewTypeB,
typename ViewTypeC>
103 MatVecDeriv(
const ViewTypeA& A_,
const ViewTypeB& b_,
const ViewTypeC& c_) :
105 m(
A.extent(0)), n(
A.extent(1)), p(
A.extent(2)-1)
107 typedef typename ViewTypeC::execution_space execution_space;
108 Kokkos::parallel_for(Kokkos::RangePolicy<execution_space>(0,m), *
this);
112 void operator() (
const size_t i)
const {
113 typedef typename ViewTypeC::value_type scalar_type;
116 for (
size_t k=0; k<p; ++k) {
118 for (
size_t j=0; j<n; ++j)
119 t +=
A(i,j,k)*b(j,p) +
A(i,j,p)*b(j,k);
125 for (
size_t j=0; j<n; ++j)
126 t +=
A(i,j,p)*b(j,p);
132 template <
typename ViewTypeA,
typename ViewTypeB,
typename ViewTypeC>
136 MatVecDeriv<ViewTypeA,ViewTypeB,ViewTypeC> f(
A,b,
c);
141 int main(
int argc,
char* argv[]) {
144 #if defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC) 146 Kokkos::initialize(argc, argv);
156 Kokkos::View<FadType**>
A(
"A",m,n,p+1);
157 Kokkos::View<FadType*> b(
"b",n,p+1);
158 Kokkos::View<FadType*>
c(
"c",m,p+1);
161 Kokkos::deep_copy(
A,
FadType(p, 0, 2.0) );
162 Kokkos::deep_copy( b,
FadType(p, 0, 3.0) );
163 Kokkos::deep_copy(
c, 0.0 );
169 std::cout <<
"\nc = A*b: Differentiated using Sacado:" << std::endl;
170 auto h_c = Kokkos::create_mirror_view(
c);
171 Kokkos::deep_copy(h_c,
c);
172 for (
size_t i=0; i<m; ++i)
173 std::cout <<
"\tc(" << i <<
") = " << h_c(i) << std::endl;
178 Kokkos::View<FadType*> c2(
"c",m,p+1);
179 Kokkos::View<double***> A_flat =
A;
180 Kokkos::View<double**> b_flat = b;
181 Kokkos::View<double**> c_flat = c2;
185 std::cout <<
"\nc = A*b: Differentiated analytically:" << std::endl;
186 auto h_c2 = Kokkos::create_mirror_view(c2);
187 Kokkos::deep_copy(h_c2, c2);
188 for (
size_t i=0; i<m; ++i)
189 std::cout <<
"\tc(" << i <<
") = " << h_c2(i) << std::endl;
193 for (
size_t i=0; i<m; ++i) {
194 for (
size_t k=0; k<p; ++k)
199 double tol = 1.0e-14;
202 std::cout <<
"\nExample passed!" << std::endl;
206 std::cout <<
"\nSomething is wrong, example failed!" << std::endl;
void run_mat_vec(const ViewTypeA &A, const ViewTypeB &b, const ViewTypeC &c)
Sacado::Fad::DFad< double > FadType
#define KOKKOS_INLINE_FUNCTION
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
int main(int argc, char *argv[])
void run_mat_vec_deriv(const ViewTypeA &A, const ViewTypeB &b, const ViewTypeC &c)