20 #include "Tpetra_Core.hpp" 
   21 #include "Tpetra_Map.hpp" 
   22 #include "Tpetra_MultiVector.hpp" 
   23 #include "Tpetra_Vector.hpp" 
   24 #include "Tpetra_CrsGraph.hpp" 
   25 #include "Tpetra_CrsMatrix.hpp" 
   29 #ifdef HAVE_STOKHOS_BELOS 
   31 #include "BelosLinearProblem.hpp" 
   32 #include "BelosPseudoBlockGmresSolMgr.hpp" 
   33 #include "BelosPseudoBlockCGSolMgr.hpp" 
   37 #ifdef HAVE_STOKHOS_IFPACK2 
   39 #include "Ifpack2_Factory.hpp" 
   43 #ifdef HAVE_STOKHOS_MUELU 
   45 #include "MueLu_CreateTpetraPreconditioner.hpp" 
   49 #ifdef HAVE_STOKHOS_AMESOS2 
   51 #include "Amesos2_Factory.hpp" 
   64 #define USE_SCALAR_MEAN_BASED_PREC 1 
   66 template <
typename scalar, 
typename ordinal>
 
   70                                     const ordinal iColFEM,
 
   71                                     const ordinal iStoch )
 
   73   const scalar X_fem = 100.0 + scalar(iColFEM) / scalar(nFEM);
 
   74   const scalar X_stoch =  1.0 + scalar(iStoch) / scalar(nStoch);
 
   75   return X_fem + X_stoch;
 
   79 template <
typename scalar, 
typename ordinal>
 
   84                                           const ordinal iColFEM,
 
   88   const scalar X_fem  = 100.0  + scalar(iColFEM) / scalar(nFEM);
 
   89   const scalar X_stoch =  1.0  + scalar(iStoch)  / scalar(nStoch);
 
   90   const scalar X_col    = 0.01 + scalar(iVec)    / scalar(nVec);
 
   91   return X_fem + X_stoch + X_col;
 
   95 template <
typename scalar, 
typename ordinal>
 
   99                                     const ordinal iRowFEM,
 
  100                                     const ordinal iColFEM,
 
  101                                     const ordinal iStoch )
 
  103   const scalar A_fem = ( 10.0 + scalar(iRowFEM) / scalar(nFEM) ) +
 
  104     (  5.0 + scalar(iColFEM) / scalar(nFEM) );
 
  106   const scalar A_stoch = ( 1.0 + scalar(iStoch) / scalar(nStoch) );
 
  108   return A_fem + A_stoch;
 
  112 template <
typename kokkos_cijk_type, 
typename ordinal_type>
 
  128   Array< RCP<const one_d_basis> > bases(stoch_dim);
 
  130     bases[i] = 
rcp(
new legendre_basis(poly_ord, 
true));
 
  131   RCP<const product_basis> basis = 
rcp(
new product_basis(bases));
 
  134   RCP<Cijk> 
cijk = basis->computeTripleProductTensor();
 
  137   kokkos_cijk_type kokkos_cijk =
 
  138     Stokhos::create_product_tensor<execution_space>(*basis, *
cijk);
 
  165   typedef typename Scalar::cijk_type Cijk;
 
  168   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  169   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
  172   if ( !Kokkos::is_initialized() )
 
  173     Kokkos::initialize();
 
  181   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  185   RCP<const Tpetra_Map> map =
 
  186     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  188   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  189   const size_t num_my_row = myGIDs.size();
 
  192   RCP<Tpetra_Vector> x1 = Tpetra::createVector<Scalar>(map);
 
  193   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
  194   ArrayRCP<Scalar> x1_view = x1->get1dViewNonConst();
 
  195   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
  196   Scalar val1(cijk), val2(cijk);
 
  197   for (
size_t i=0; i<num_my_row; ++i) {
 
  200       val1.fastAccessCoeff(
j) = generate_vector_coefficient<BaseScalar,size_t>(nrow, pce_size, row, 
j);
 
  201       val2.fastAccessCoeff(
j) = 0.12345 * generate_vector_coefficient<BaseScalar,size_t>(nrow, pce_size, row, 
j);
 
  212   RCP<Tpetra_Vector> y = Tpetra::createVector<Scalar>(map);
 
  213   y->update(alpha, *x1, beta, *x2, 
Scalar(0.0));
 
  219   ArrayRCP<Scalar> y_view = y->get1dViewNonConst();
 
  221   BaseScalar tol = 1.0e-14;
 
  222   for (
size_t i=0; i<num_my_row; ++i) {
 
  225       BaseScalar v = generate_vector_coefficient<BaseScalar,size_t>(
 
  226         nrow, pce_size, row, 
j);
 
  227       val.fastAccessCoeff(
j) = alpha.coeff(0)*v + 0.12345*beta.coeff(0)*v;
 
  252   typedef typename Scalar::cijk_type Cijk;
 
  255   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  256   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
  257   typedef typename Tpetra_Vector::dot_type dot_type;
 
  260   if ( !Kokkos::is_initialized() )
 
  261     Kokkos::initialize();
 
  269   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  273   RCP<const Tpetra_Map> map =
 
  274     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  276   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  277   const size_t num_my_row = myGIDs.size();
 
  280   RCP<Tpetra_Vector> x1 = Tpetra::createVector<Scalar>(map);
 
  281   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
  282   ArrayRCP<Scalar> x1_view = x1->get1dViewNonConst();
 
  283   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
  284   Scalar val1(cijk), val2(cijk);
 
  285   for (
size_t i=0; i<num_my_row; ++i) {
 
  288       val1.fastAccessCoeff(
j) = generate_vector_coefficient<BaseScalar,size_t>(nrow, pce_size, row, 
j);
 
  289       val2.fastAccessCoeff(
j) = 0.12345 * generate_vector_coefficient<BaseScalar,size_t>(nrow, pce_size, row, 
j);
 
  298   dot_type 
dot = x1->dot(*x2);
 
  303   dot_type local_val(0);
 
  304   for (
size_t i=0; i<num_my_row; ++i) {
 
  307       BaseScalar v = generate_vector_coefficient<BaseScalar,size_t>(
 
  308         nrow, pce_size, row, 
j);
 
  309       local_val += 0.12345 * v * v;
 
  316                      Teuchos::outArg(val));
 
  318   out << 
"dot = " << dot << 
" expected = " << val << std::endl;
 
  320   BaseScalar tol = 1.0e-14;
 
  341   typedef typename Scalar::cijk_type Cijk;
 
  344   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  345   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_MultiVector;
 
  348   if ( !Kokkos::is_initialized() )
 
  349     Kokkos::initialize();
 
  357   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  361   RCP<const Tpetra_Map> map =
 
  362     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  364   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  365   const size_t num_my_row = myGIDs.size();
 
  369   RCP<Tpetra_MultiVector> x1 = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  370   RCP<Tpetra_MultiVector> x2 = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  371   ArrayRCP< ArrayRCP<Scalar> > x1_view = x1->get2dViewNonConst();
 
  372   ArrayRCP< ArrayRCP<Scalar> > x2_view = x2->get2dViewNonConst();
 
  373   Scalar val1(cijk), val2(cijk);
 
  374   for (
size_t i=0; i<num_my_row; ++i) {
 
  376     for (
size_t j=0; 
j<ncol; ++
j) {
 
  379           generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  380             nrow, ncol, pce_size, row, 
j, k);
 
  381         val1.fastAccessCoeff(k) = v;
 
  382         val2.fastAccessCoeff(k) = 0.12345 * v;
 
  384       x1_view[
j][i] = val1;
 
  385       x2_view[
j][i] = val2;
 
  394   RCP<Tpetra_MultiVector> y = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  395   y->update(alpha, *x1, beta, *x2, 
Scalar(0.0));
 
  401   ArrayRCP< ArrayRCP<Scalar> > y_view = y->get2dViewNonConst();
 
  403   BaseScalar tol = 1.0e-14;
 
  404   for (
size_t i=0; i<num_my_row; ++i) {
 
  406     for (
size_t j=0; 
j<ncol; ++
j) {
 
  408         BaseScalar v = generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  409           nrow, ncol, pce_size, row, 
j, k);
 
  410         val.fastAccessCoeff(k) = alpha.coeff(0)*v + 0.12345*beta.coeff(0)*v;
 
  415                                 val.fastAccessCoeff(k), tol );
 
  437   typedef typename Scalar::cijk_type Cijk;
 
  440   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  441   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_MultiVector;
 
  442   typedef typename Tpetra_MultiVector::dot_type dot_type;
 
  445   if ( !Kokkos::is_initialized() )
 
  446     Kokkos::initialize();
 
  454   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  458   RCP<const Tpetra_Map> map =
 
  459     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  461   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  462   const size_t num_my_row = myGIDs.size();
 
  466   RCP<Tpetra_MultiVector> x1 = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  467   RCP<Tpetra_MultiVector> x2 = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  468   ArrayRCP< ArrayRCP<Scalar> > x1_view = x1->get2dViewNonConst();
 
  469   ArrayRCP< ArrayRCP<Scalar> > x2_view = x2->get2dViewNonConst();
 
  470   Scalar val1(cijk), val2(cijk);
 
  471   for (
size_t i=0; i<num_my_row; ++i) {
 
  473     for (
size_t j=0; 
j<ncol; ++
j) {
 
  476           generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  477             nrow, ncol, pce_size, row, 
j, k);
 
  478         val1.fastAccessCoeff(k) = v;
 
  479         val2.fastAccessCoeff(k) = 0.12345 * v;
 
  481       x1_view[
j][i] = val1;
 
  482       x2_view[
j][i] = val2;
 
  489   Array<dot_type> dots(ncol);
 
  490   x1->dot(*x2, dots());
 
  495   Array<dot_type> local_vals(ncol, dot_type(0));
 
  496   for (
size_t i=0; i<num_my_row; ++i) {
 
  498     for (
size_t j=0; 
j<ncol; ++
j) {
 
  500         BaseScalar v = generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  501           nrow, ncol, pce_size, row, 
j, k);
 
  502         local_vals[
j] += 0.12345 * v * v;
 
  508   Array<dot_type> vals(ncol, dot_type(0));
 
  510                      local_vals.getRawPtr(), vals.getRawPtr());
 
  512   BaseScalar tol = 1.0e-14;
 
  513   for (
size_t j=0; 
j<ncol; ++
j) {
 
  514     out << 
"dots(" << 
j << 
") = " << dots[
j]
 
  515         << 
" expected(" << 
j << 
") = " << vals[
j] << std::endl;
 
  537   typedef typename Scalar::cijk_type Cijk;
 
  540   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  541   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_MultiVector;
 
  542   typedef typename Tpetra_MultiVector::dot_type dot_type;
 
  545   if ( !Kokkos::is_initialized() )
 
  546     Kokkos::initialize();
 
  554   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  558   RCP<const Tpetra_Map> map =
 
  559     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  561   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  562   const size_t num_my_row = myGIDs.size();
 
  566   RCP<Tpetra_MultiVector> x1 = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  567   RCP<Tpetra_MultiVector> x2 = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  568   ArrayRCP< ArrayRCP<Scalar> > x1_view = x1->get2dViewNonConst();
 
  569   ArrayRCP< ArrayRCP<Scalar> > x2_view = x2->get2dViewNonConst();
 
  570   Scalar val1(cijk), val2(cijk);
 
  571   for (
size_t i=0; i<num_my_row; ++i) {
 
  573     for (
size_t j=0; 
j<ncol; ++
j) {
 
  576           generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  577             nrow, ncol, pce_size, row, 
j, k);
 
  578         val1.fastAccessCoeff(k) = v;
 
  579         val2.fastAccessCoeff(k) = 0.12345 * v;
 
  581       x1_view[
j][i] = val1;
 
  582       x2_view[
j][i] = val2;
 
  591   cols[0] = 4; cols[1] = 2;
 
  592   RCP<const Tpetra_MultiVector> x1_sub = x1->subView(cols());
 
  593   RCP<const Tpetra_MultiVector> x2_sub = x2->subView(cols());
 
  596   Array<dot_type> dots(ncol_sub);
 
  597   x1_sub->dot(*x2_sub, dots());
 
  602   Array<dot_type> local_vals(ncol_sub, dot_type(0));
 
  603   for (
size_t i=0; i<num_my_row; ++i) {
 
  605     for (
size_t j=0; 
j<ncol_sub; ++
j) {
 
  607         BaseScalar v = generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  608           nrow, ncol, pce_size, row, cols[
j], k);
 
  609         local_vals[
j] += 0.12345 * v * v;
 
  615   Array<dot_type> vals(ncol_sub, dot_type(0));
 
  617                      Teuchos::as<int>(ncol_sub), local_vals.getRawPtr(),
 
  620   BaseScalar tol = 1.0e-14;
 
  621   for (
size_t j=0; 
j<ncol_sub; ++
j) {
 
  622     out << 
"dots(" << 
j << 
") = " << dots[
j]
 
  623         << 
" expected(" << 
j << 
") = " << vals[
j] << std::endl;
 
  645   typedef typename Scalar::cijk_type Cijk;
 
  648   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  649   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
  650   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
  651   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
  654   if ( !Kokkos::is_initialized() )
 
  655     Kokkos::initialize();
 
  664   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  665   RCP<const Tpetra_Map> map =
 
  666     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  668   RCP<Tpetra_CrsGraph> graph =
 
  669     rcp(
new Tpetra_CrsGraph(map, 
size_t(2)));
 
  670   Array<GlobalOrdinal> columnIndices(2);
 
  671   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  672   const size_t num_my_row = myGIDs.size();
 
  673   for (
size_t i=0; i<num_my_row; ++i) {
 
  675     columnIndices[0] = row;
 
  678       columnIndices[1] = row+1;
 
  681     graph->insertGlobalIndices(row, columnIndices(0,ncol));
 
  683   graph->fillComplete();
 
  684   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
  687   Array<Scalar> vals(2);
 
  689   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  691     const size_t num_col = row == nrow - 1 ? 1 : 2;
 
  692     for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
  694       columnIndices[local_col] = col;
 
  696         val.fastAccessCoeff(k) =
 
  697           generate_matrix_coefficient<BaseScalar,size_t>(
 
  698             nrow, pce_size, row, col, k);
 
  699       vals[local_col] = 
val;
 
  701     matrix->replaceGlobalValues(row, columnIndices(0,num_col), vals(0,num_col));
 
  703   matrix->fillComplete();
 
  706   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
  707   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
  708   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  711       val.fastAccessCoeff(
j) = generate_vector_coefficient<BaseScalar,size_t>(
 
  712         nrow, pce_size, row, 
j);
 
  713     x_view[local_row] = 
val;
 
  724   RCP<Tpetra_Vector> y = Tpetra::createVector<Scalar>(map);
 
  725   matrix->apply(*x, *y);
 
  731   ArrayRCP<Scalar> y_view = y->get1dViewNonConst();
 
  732   BaseScalar tol = 1.0e-14;
 
  733   typename Cijk::host_mirror_type host_cijk =
 
  736   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  738     const size_t num_col = row == nrow - 1 ? 1 : 2;
 
  740     for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
  744         const LocalOrdinal entry_beg = host_cijk.entry_begin(i);
 
  747         for (
LocalOrdinal entry = entry_beg; entry < entry_end; ++entry) {
 
  750           const BaseScalar a_j =
 
  751             generate_matrix_coefficient<BaseScalar,size_t>(
 
  752               nrow, pce_size, row, col, 
j);
 
  753           const BaseScalar a_k =
 
  754             generate_matrix_coefficient<BaseScalar,size_t>(
 
  755               nrow, pce_size, row, col, k);
 
  756           const BaseScalar x_j =
 
  757             generate_vector_coefficient<BaseScalar,size_t>(
 
  758               nrow, pce_size, col, 
j);
 
  759           const BaseScalar x_k =
 
  760             generate_vector_coefficient<BaseScalar,size_t>(
 
  761               nrow, pce_size, col, k);
 
  762           tmp += host_cijk.value(entry) * ( a_j * x_k + a_k * x_j );
 
  764         val.fastAccessCoeff(i) += tmp;
 
  770                               val.fastAccessCoeff(i), tol );
 
  791   typedef typename Scalar::cijk_type Cijk;
 
  794   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  795   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_MultiVector;
 
  796   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
  797   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
  800   if ( !Kokkos::is_initialized() )
 
  801     Kokkos::initialize();
 
  810   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  811   RCP<const Tpetra_Map> map =
 
  812     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  814   RCP<Tpetra_CrsGraph> graph =
 
  815     rcp(
new Tpetra_CrsGraph(map, 
size_t(2)));
 
  816   Array<GlobalOrdinal> columnIndices(2);
 
  817   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  818   const size_t num_my_row = myGIDs.size();
 
  819   for (
size_t i=0; i<num_my_row; ++i) {
 
  821     columnIndices[0] = row;
 
  824       columnIndices[1] = row+1;
 
  827     graph->insertGlobalIndices(row, columnIndices(0,ncol));
 
  829   graph->fillComplete();
 
  830   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
  833   Array<Scalar> vals(2);
 
  835   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  837     const size_t num_col = row == nrow - 1 ? 1 : 2;
 
  838     for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
  840       columnIndices[local_col] = col;
 
  842         val.fastAccessCoeff(k) =
 
  843           generate_matrix_coefficient<BaseScalar,size_t>(
 
  844             nrow, pce_size, row, col, k);
 
  845       vals[local_col] = 
val;
 
  847     matrix->replaceGlobalValues(row, columnIndices(0,num_col), vals(0,num_col));
 
  849   matrix->fillComplete();
 
  853   RCP<Tpetra_MultiVector> x = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  854   ArrayRCP< ArrayRCP<Scalar> > x_view = x->get2dViewNonConst();
 
  855   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  857     for (
size_t col=0; col<ncol; ++col) {
 
  860           generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  861             nrow, ncol, pce_size, row, col, k);
 
  862         val.fastAccessCoeff(k) = v;
 
  864       x_view[col][local_row] = 
val;
 
  876   RCP<Tpetra_MultiVector> y = Tpetra::createMultiVector<Scalar>(map, ncol);
 
  877   matrix->apply(*x, *y);
 
  883   ArrayRCP< ArrayRCP<Scalar> > y_view = y->get2dViewNonConst();
 
  884   BaseScalar tol = 1.0e-14;
 
  885   typename Cijk::host_mirror_type host_cijk =
 
  888   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  890     for (
size_t xcol=0; xcol<ncol; ++xcol) {
 
  891       const size_t num_col = row == nrow - 1 ? 1 : 2;
 
  893       for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
  897           const LocalOrdinal entry_beg = host_cijk.entry_begin(i);
 
  900           for (
LocalOrdinal entry = entry_beg; entry < entry_end; ++entry) {
 
  903             const BaseScalar a_j =
 
  904               generate_matrix_coefficient<BaseScalar,size_t>(
 
  905                 nrow, pce_size, row, col, 
j);
 
  906             const BaseScalar a_k =
 
  907               generate_matrix_coefficient<BaseScalar,size_t>(
 
  908                 nrow, pce_size, row, col, k);
 
  909             const BaseScalar x_j =
 
  910               generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  911                 nrow, ncol, pce_size, col, xcol, 
j);
 
  912             const BaseScalar x_k =
 
  913               generate_multi_vector_coefficient<BaseScalar,size_t>(
 
  914                 nrow, ncol, pce_size, col, xcol, k);
 
  915             tmp += host_cijk.value(entry) * ( a_j * x_k + a_k * x_j );
 
  917           val.fastAccessCoeff(i) += tmp;
 
  923                                 val.fastAccessCoeff(i), tol );
 
  945   typedef typename Scalar::cijk_type Cijk;
 
  948   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
  949   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
  950   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
  951   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
  953   typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
  954   typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
  957   if ( !Kokkos::is_initialized() )
 
  958     Kokkos::initialize();
 
  967   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
  968   RCP<const Tpetra_Map> map =
 
  969     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
  971   RCP<Tpetra_CrsGraph> graph =
 
  972     rcp(
new Tpetra_CrsGraph(map, 
size_t(2)));
 
  973   Array<GlobalOrdinal> columnIndices(2);
 
  974   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
  975   const size_t num_my_row = myGIDs.size();
 
  976   for (
size_t i=0; i<num_my_row; ++i) {
 
  978     columnIndices[0] = row;
 
  981       columnIndices[1] = row+1;
 
  984     graph->insertGlobalIndices(row, columnIndices(0,ncol));
 
  986   graph->fillComplete();
 
  987   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
  990   Array<Scalar> vals(2);
 
  992   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
  994     const size_t num_col = row == nrow - 1 ? 1 : 2;
 
  995     for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
  997       columnIndices[local_col] = col;
 
  999         val.fastAccessCoeff(k) =
 
 1000           generate_matrix_coefficient<BaseScalar,size_t>(
 
 1001             nrow, pce_size, row, col, k);
 
 1002       vals[local_col] = 
val;
 
 1004     matrix->replaceGlobalValues(row, columnIndices(0,num_col), vals(0,num_col));
 
 1006   matrix->fillComplete();
 
 1009   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 1011     ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 1012     for (
size_t i=0; i<num_my_row; ++i) {
 
 1015         val.fastAccessCoeff(
j) = generate_vector_coefficient<BaseScalar,size_t>(
 
 1016           nrow, pce_size, row, 
j);
 
 1022   RCP<Tpetra_Vector> y = Tpetra::createVector<Scalar>(map);
 
 1023   matrix->apply(*x, *y);
 
 1040   RCP<const Tpetra_Map> flat_x_map, flat_y_map;
 
 1041   RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 1044                                    cijk_graph, pce_size);
 
 1045   RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 1049   RCP<Tpetra_Vector> y2 = Tpetra::createVector<Scalar>(map);
 
 1051     RCP<Flat_Tpetra_Vector> flat_x =
 
 1053     RCP<Flat_Tpetra_Vector> flat_y =
 
 1055     flat_matrix->apply(*flat_x, *flat_y);
 
 1076   BaseScalar tol = 1.0e-14;
 
 1077   ArrayRCP<Scalar> y_view = y->get1dViewNonConst();
 
 1078   ArrayRCP<Scalar> y2_view = y2->get1dViewNonConst();
 
 1079   for (
size_t i=0; i<num_my_row; ++i) {
 
 1106   typedef typename Scalar::cijk_type Cijk;
 
 1109   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
 1110   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
 1111   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
 1112   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
 1115   if ( !Kokkos::is_initialized() )
 
 1116     Kokkos::initialize();
 
 1125   BaseScalar h = 1.0 / 
static_cast<BaseScalar
>(nrow-1);
 
 1126   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
 1127   RCP<const Tpetra_Map> map =
 
 1128     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
 1130   RCP<Tpetra_CrsGraph> graph =
 
 1131     rcp(
new Tpetra_CrsGraph(map, 
size_t(3)));
 
 1132   Array<GlobalOrdinal> columnIndices(3);
 
 1133   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
 1134   const size_t num_my_row = myGIDs.size();
 
 1135   for (
size_t i=0; i<num_my_row; ++i) {
 
 1137     if (row == 0 || row == nrow-1) { 
 
 1138       columnIndices[0] = row;
 
 1139       graph->insertGlobalIndices(row, columnIndices(0,1));
 
 1142       columnIndices[0] = row-1;
 
 1143       columnIndices[1] = row;
 
 1144       columnIndices[2] = row+1;
 
 1145       graph->insertGlobalIndices(row, columnIndices(0,3));
 
 1148   graph->fillComplete();
 
 1149   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
 1152   Array<Scalar> vals(3);
 
 1155     a_val.fastAccessCoeff(
j) =
 
 1156       BaseScalar(1.0) + BaseScalar(1.0) / BaseScalar(
j+1);
 
 1158   for (
size_t i=0; i<num_my_row; ++i) {
 
 1160     if (row == 0 || row == nrow-1) { 
 
 1161       columnIndices[0] = row;
 
 1163       matrix->replaceGlobalValues(row, columnIndices(0,1), vals(0,1));
 
 1166       columnIndices[0] = row-1;
 
 1167       columnIndices[1] = row;
 
 1168       columnIndices[2] = row+1;
 
 1169       vals[0] = 
Scalar(1.0) * a_val;
 
 1170       vals[1] = 
Scalar(-2.0) * a_val;
 
 1171       vals[2] = 
Scalar(1.0) * a_val;
 
 1172       matrix->replaceGlobalValues(row, columnIndices(0,3), vals(0,3));
 
 1175   matrix->fillComplete();
 
 1181   RCP<Tpetra_Vector> b = Tpetra::createVector<Scalar>(map);
 
 1183     ArrayRCP<Scalar> b_view = b->get1dViewNonConst();
 
 1186       b_val.fastAccessCoeff(
j) =
 
 1187         BaseScalar(2.0) - BaseScalar(1.0) / BaseScalar(
j+1);
 
 1189     for (
size_t i=0; i<num_my_row; ++i) {
 
 1191       if (row == 0 || row == nrow-1)
 
 1194         b_view[i] = b_val * (h*h);
 
 1202   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 1203 #if KOKKOS_VERSION >= 40799 
 1204   typedef KokkosKernels::ArithTraits<BaseScalar> BST;
 
 1206   typedef Kokkos::ArithTraits<BaseScalar> BST;
 
 1208   typedef typename BST::mag_type base_mag_type;
 
 1209   typedef typename Tpetra_Vector::mag_type mag_type;
 
 1210   base_mag_type btol = 1e-9;
 
 1211   mag_type tol = btol;
 
 1214                                   out.getOStream().get());
 
 1221   typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
 1222   typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
 1223   RCP<const Tpetra_Map> flat_x_map, flat_b_map;
 
 1224   RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 1227                                    cijk_graph, pce_size);
 
 1228   RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 1230   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
 1232     RCP<Flat_Tpetra_Vector> flat_x =
 
 1234     RCP<Flat_Tpetra_Vector> flat_b =
 
 1237                                          tol, max_its, out.getOStream().get());
 
 1238     TEST_EQUALITY_CONST( solved_flat, 
true );
 
 1242   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 1243   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
 1244   for (
size_t i=0; i<num_my_row; ++i) {
 
 1249     Scalar v = x_view[i];
 
 1250     Scalar v2 = x2_view[i];
 
 1252       if (
j < v.size() && 
BST::abs(v.coeff(
j)) < btol)
 
 1253         v.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1254       if (
j < v2.size() && 
BST::abs(v2.coeff(
j)) < btol)
 
 1255         v2.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1267 #if defined(HAVE_STOKHOS_MUELU) && defined(HAVE_STOKHOS_AMESOS2) && defined(HAVE_STOKHOS_IFPACK2) && defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) 
 1284   using Teuchos::getParametersFromXmlFile;
 
 1288   typedef typename Scalar::cijk_type Cijk;
 
 1291   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
 1292   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
 1293   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
 1294   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
 1297   if ( !Kokkos::is_initialized() )
 
 1298     Kokkos::initialize();
 
 1307   BaseScalar h = 1.0 / 
static_cast<BaseScalar
>(nrow-1);
 
 1308   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
 1309   RCP<const Tpetra_Map> map =
 
 1310     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
 1312   RCP<Tpetra_CrsGraph> graph =
 
 1313     rcp(
new Tpetra_CrsGraph(map, 
size_t(3)));
 
 1314   Array<GlobalOrdinal> columnIndices(3);
 
 1315   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
 1316   const size_t num_my_row = myGIDs.size();
 
 1317   for (
size_t i=0; i<num_my_row; ++i) {
 
 1319     if (row == 0 || row == nrow-1) { 
 
 1320       columnIndices[0] = row;
 
 1321       graph->insertGlobalIndices(row, columnIndices(0,1));
 
 1324       columnIndices[0] = row-1;
 
 1325       columnIndices[1] = row;
 
 1326       columnIndices[2] = row+1;
 
 1327       graph->insertGlobalIndices(row, columnIndices(0,3));
 
 1330   graph->fillComplete();
 
 1331   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
 1334   Array<Scalar> vals(3);
 
 1337     a_val.fastAccessCoeff(
j) =
 
 1338       BaseScalar(1.0) + BaseScalar(1.0) / BaseScalar(
j+1);
 
 1340   for (
size_t i=0; i<num_my_row; ++i) {
 
 1342     if (row == 0 || row == nrow-1) { 
 
 1343       columnIndices[0] = row;
 
 1345       matrix->replaceGlobalValues(row, columnIndices(0,1), vals(0,1));
 
 1348       columnIndices[0] = row-1;
 
 1349       columnIndices[1] = row;
 
 1350       columnIndices[2] = row+1;
 
 1351       vals[0] = 
Scalar(1.0) * a_val;
 
 1352       vals[1] = 
Scalar(-2.0) * a_val;
 
 1353       vals[2] = 
Scalar(1.0) * a_val;
 
 1354       matrix->replaceGlobalValues(row, columnIndices(0,3), vals(0,3));
 
 1357   matrix->fillComplete();
 
 1360   RCP<Tpetra_Vector> b = Tpetra::createVector<Scalar>(map);
 
 1362     ArrayRCP<Scalar> b_view = b->get1dViewNonConst();
 
 1365       b_val.fastAccessCoeff(
j) =
 
 1366         BaseScalar(2.0) - BaseScalar(1.0) / BaseScalar(
j+1);
 
 1368     for (
size_t i=0; i<num_my_row; ++i) {
 
 1370       if (row == 0 || row == nrow-1)
 
 1373         b_view[i] = b_val * (h*h);
 
 1377   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 1378 #if KOKKOS_VERSION >= 40799 
 1379   typedef KokkosKernels::ArithTraits<BaseScalar> BST;
 
 1381   typedef Kokkos::ArithTraits<BaseScalar> BST;
 
 1383   typedef typename BST::mag_type base_mag_type;
 
 1384   typedef typename Tpetra_Vector::mag_type mag_type;
 
 1385   base_mag_type btol = 1e-9;
 
 1386   mag_type tol = btol;
 
 1390     typedef Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> OP;
 
 1391     RCP<ParameterList> muelu_params =
 
 1392       getParametersFromXmlFile(
"muelu_cheby.xml");
 
 1393 #if USE_SCALAR_MEAN_BASED_PREC 
 1394     typedef Tpetra::Operator<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Scalar_OP;
 
 1395     typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Scalar_Tpetra_CrsMatrix;
 
 1396     RCP<Scalar_Tpetra_CrsMatrix> mean_matrix =
 
 1398     RCP<Scalar_OP> mean_matrix_op = mean_matrix;
 
 1399     RCP<Scalar_OP> M_s =
 
 1400       MueLu::CreateTpetraPreconditioner<BaseScalar,LocalOrdinal,GlobalOrdinal,Node>(mean_matrix_op, *muelu_params);
 
 1404       Stokhos::create_mean_based_product_tensor<typename Storage::execution_space,typename Storage::ordinal_type,BaseScalar>();
 
 1407     RCP<OP> mean_matrix_op = mean_matrix;
 
 1409       MueLu::CreateTpetraPreconditioner<Scalar,LocalOrdinal,GlobalOrdinal,Node>(mean_matrix_op, *muelu_params);
 
 1415                                    out.getOStream().get());
 
 1423   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
 1425     typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
 1426     typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
 1427     RCP<const Tpetra_Map> flat_x_map, flat_b_map;
 
 1428     RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 1431                                      cijk_graph, pce_size);
 
 1432     RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 1434     RCP<Flat_Tpetra_Vector> flat_x =
 
 1436     RCP<Flat_Tpetra_Vector> flat_b =
 
 1444                                          tol, max_its, out.getOStream().get());
 
 1449   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 1450   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
 1451   for (
size_t i=0; i<num_my_row; ++i) {
 
 1456     Scalar v = x_view[i];
 
 1457     Scalar v2 = x2_view[i];
 
 1459       if (
j < v.size() && 
BST::abs(v.coeff(
j)) < btol)
 
 1460         v.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1461       if (
j < v2.size() && 
BST::abs(v2.coeff(
j)) < btol)
 
 1462         v2.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1481 #if defined(HAVE_STOKHOS_BELOS) 
 1498   typedef typename Scalar::cijk_type Cijk;
 
 1501   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
 1502   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
 1503   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
 1504   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
 1507   if ( !Kokkos::is_initialized() )
 
 1508     Kokkos::initialize();
 
 1517   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
 1518   RCP<const Tpetra_Map> map =
 
 1519     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
 1521   RCP<Tpetra_CrsGraph> graph =
 
 1522     rcp(
new Tpetra_CrsGraph(map, 
size_t(2)));
 
 1523   Array<GlobalOrdinal> columnIndices(2);
 
 1524   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
 1525   const size_t num_my_row = myGIDs.size();
 
 1526   for (
size_t i=0; i<num_my_row; ++i) {
 
 1528     columnIndices[0] = row;
 
 1530     if (row != nrow-1) {
 
 1531       columnIndices[1] = row+1;
 
 1534     graph->insertGlobalIndices(row, columnIndices(0,ncol));
 
 1536   graph->fillComplete();
 
 1537   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
 1540   Array<Scalar> vals(2);
 
 1542   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
 1544     const size_t num_col = row == nrow - 1 ? 1 : 2;
 
 1545     for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
 1547       columnIndices[local_col] = col;
 
 1549         val.fastAccessCoeff(k) =
 
 1550           BaseScalar(1.0) + BaseScalar(1.0) / BaseScalar(k+1);
 
 1551       vals[local_col] = 
val;
 
 1553     matrix->replaceGlobalValues(row, columnIndices(0,num_col), vals(0,num_col));
 
 1555   matrix->fillComplete();
 
 1558   RCP<Tpetra_Vector> b = Tpetra::createVector<Scalar>(map);
 
 1560     ArrayRCP<Scalar> b_view = b->get1dViewNonConst();
 
 1561     for (
size_t i=0; i<num_my_row; ++i) {
 
 1568   typedef BaseScalar BelosScalar;
 
 1569   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> MV;
 
 1570   typedef Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> OP;
 
 1571   typedef Belos::LinearProblem<BelosScalar,MV,OP> BLinProb;
 
 1572   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 1573   RCP< BLinProb > problem = 
rcp(
new BLinProb(matrix, x, b));
 
 1574   RCP<ParameterList> belosParams = 
rcp(
new ParameterList);
 
 1575   typename ST::magnitudeType tol = 1e-9;
 
 1576   belosParams->set(
"Flexible Gmres", 
false);
 
 1577   belosParams->set(
"Num Blocks", 100);
 
 1578   belosParams->set(
"Convergence Tolerance", BelosScalar(tol));
 
 1579   belosParams->set(
"Maximum Iterations", 100);
 
 1580   belosParams->set(
"Verbosity", 33);
 
 1581   belosParams->set(
"Output Style", 1);
 
 1582   belosParams->set(
"Output Frequency", 1);
 
 1583   belosParams->set(
"Output Stream", out.getOStream());
 
 1584   RCP<Belos::SolverManager<BelosScalar,MV,OP> > solver =
 
 1585     rcp(
new Belos::PseudoBlockGmresSolMgr<BelosScalar,MV,OP>(problem, belosParams));
 
 1586   problem->setProblem();
 
 1587   Belos::ReturnType ret = solver->solve();
 
 1594   typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
 1595   typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
 1596   RCP<const Tpetra_Map> flat_x_map, flat_b_map;
 
 1597   RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 1600                                    cijk_graph, pce_size);
 
 1601   RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 1603   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
 1605     RCP<Flat_Tpetra_Vector> flat_x =
 
 1607     RCP<Flat_Tpetra_Vector> flat_b =
 
 1609     typedef Tpetra::MultiVector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FMV;
 
 1610     typedef Tpetra::Operator<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FOP;
 
 1611     typedef Belos::LinearProblem<BelosScalar,FMV,FOP> FBLinProb;
 
 1612     RCP< FBLinProb > flat_problem =
 
 1613       rcp(
new FBLinProb(flat_matrix, flat_x, flat_b));
 
 1614     RCP<Belos::SolverManager<BelosScalar,FMV,FOP> > flat_solver =
 
 1615       rcp(
new Belos::PseudoBlockGmresSolMgr<BelosScalar,FMV,FOP>(flat_problem,
 
 1617     flat_problem->setProblem();
 
 1618     Belos::ReturnType flat_ret = flat_solver->solve();
 
 1622   typename ST::magnitudeType btol = 100*tol;
 
 1623   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 1624   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
 1625   for (
size_t i=0; i<num_my_row; ++i) {
 
 1630     Scalar v = x_view[i];
 
 1631     Scalar v2 = x2_view[i];
 
 1633       if (
j < v.size() && ST::magnitude(v.coeff(
j)) < btol)
 
 1634         v.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1635       if (
j < v2.size() && ST::magnitude(v2.coeff(
j)) < btol)
 
 1636         v2.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1657 #if defined(HAVE_STOKHOS_BELOS) && defined(HAVE_STOKHOS_IFPACK2) 
 1675   typedef typename Scalar::cijk_type Cijk;
 
 1678   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
 1679   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
 1680   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
 1681   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
 1684   if ( !Kokkos::is_initialized() )
 
 1685     Kokkos::initialize();
 
 1694   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
 1695   RCP<const Tpetra_Map> map =
 
 1696     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
 1698   RCP<Tpetra_CrsGraph> graph =
 
 1699     rcp(
new Tpetra_CrsGraph(map, 
size_t(2)));
 
 1700   Array<GlobalOrdinal> columnIndices(2);
 
 1701   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
 1702   const size_t num_my_row = myGIDs.size();
 
 1703   for (
size_t i=0; i<num_my_row; ++i) {
 
 1705     columnIndices[0] = row;
 
 1707     if (row != nrow-1) {
 
 1708       columnIndices[1] = row+1;
 
 1711     graph->insertGlobalIndices(row, columnIndices(0,ncol));
 
 1713   graph->fillComplete();
 
 1714   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
 1717   Array<Scalar> vals(2);
 
 1719   for (
size_t local_row=0; local_row<num_my_row; ++local_row) {
 
 1721     const size_t num_col = row == nrow - 1 ? 1 : 2;
 
 1722     for (
size_t local_col=0; local_col<num_col; ++local_col) {
 
 1724       columnIndices[local_col] = col;
 
 1726         val.fastAccessCoeff(k) =
 
 1727           BaseScalar(1.0) + BaseScalar(1.0) / BaseScalar(k+1);
 
 1728       vals[local_col] = 
val;
 
 1730     matrix->replaceGlobalValues(row, columnIndices(0,num_col), vals(0,num_col));
 
 1732   matrix->fillComplete();
 
 1735   RCP<Tpetra_Vector> b = Tpetra::createVector<Scalar>(map);
 
 1737     ArrayRCP<Scalar> b_view = b->get1dViewNonConst();
 
 1738     for (
size_t i=0; i<num_my_row; ++i) {
 
 1743   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 1744   RCP<ParameterList> belosParams = 
rcp(
new ParameterList);
 
 1745   typedef BaseScalar BelosScalar;
 
 1747   typename ST::magnitudeType tol = 1e-9;
 
 1749     typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> MV;
 
 1750     typedef Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> OP;
 
 1751     typedef Belos::LinearProblem<BelosScalar,MV,OP> BLinProb;
 
 1753 #if USE_SCALAR_MEAN_BASED_PREC 
 1754     typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Scalar_Tpetra_CrsMatrix;
 
 1755     RCP<Scalar_Tpetra_CrsMatrix> mean_matrix =
 
 1757     typedef Ifpack2::Preconditioner<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Scalar_Prec;
 
 1758     Ifpack2::Factory factory;
 
 1759     RCP<Scalar_Prec> M_s = factory.create<Scalar_Tpetra_CrsMatrix>(
"RILUK", mean_matrix);
 
 1765     typedef Ifpack2::Preconditioner<Scalar,LocalOrdinal,GlobalOrdinal,Node> Prec;
 
 1766     Ifpack2::Factory factory;
 
 1767     RCP<Prec> M = factory.create<Tpetra_CrsMatrix>(
"RILUK", mean_matrix);
 
 1773     RCP< BLinProb > problem = 
rcp(
new BLinProb(matrix, x, b));
 
 1774     problem->setRightPrec(M);
 
 1775     problem->setProblem();
 
 1776     belosParams->set(
"Flexible Gmres", 
false);
 
 1777     belosParams->set(
"Num Blocks", 100);
 
 1778     belosParams->set(
"Convergence Tolerance", BelosScalar(tol));
 
 1779     belosParams->set(
"Maximum Iterations", 100);
 
 1780     belosParams->set(
"Verbosity", 33);
 
 1781     belosParams->set(
"Output Style", 1);
 
 1782     belosParams->set(
"Output Frequency", 1);
 
 1783     belosParams->set(
"Output Stream", out.getOStream());
 
 1785     RCP<Belos::SolverManager<BelosScalar,MV,OP> > solver =
 
 1786       rcp(
new Belos::PseudoBlockGmresSolMgr<BelosScalar,MV,OP>(problem, belosParams));
 
 1787     Belos::ReturnType ret = solver->solve();
 
 1792   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
 1794     typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
 1795     typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
 1796     RCP<const Tpetra_Map> flat_x_map, flat_b_map;
 
 1797     RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 1800                                      cijk_graph, pce_size);
 
 1801     RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 1803     RCP<Flat_Tpetra_Vector> flat_x =
 
 1805     RCP<Flat_Tpetra_Vector> flat_b =
 
 1807     typedef Tpetra::MultiVector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FMV;
 
 1808     typedef Tpetra::Operator<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FOP;
 
 1809     typedef Belos::LinearProblem<BelosScalar,FMV,FOP> FBLinProb;
 
 1810     RCP< FBLinProb > flat_problem =
 
 1811       rcp(
new FBLinProb(flat_matrix, flat_x, flat_b));
 
 1812     RCP<Belos::SolverManager<BelosScalar,FMV,FOP> > flat_solver =
 
 1813       rcp(
new Belos::PseudoBlockGmresSolMgr<BelosScalar,FMV,FOP>(flat_problem,
 
 1815     flat_problem->setProblem();
 
 1816     Belos::ReturnType flat_ret = flat_solver->solve();
 
 1820   typename ST::magnitudeType btol = 100*tol;
 
 1821   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 1822   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
 1823   for (
size_t i=0; i<num_my_row; ++i) {
 
 1828     Scalar v = x_view[i];
 
 1829     Scalar v2 = x2_view[i];
 
 1831       if (
j < v.size() && ST::magnitude(v.coeff(
j)) < btol)
 
 1832         v.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1833       if (
j < v2.size() && ST::magnitude(v2.coeff(
j)) < btol)
 
 1834         v2.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 1853 #if defined(HAVE_STOKHOS_BELOS) && defined(HAVE_STOKHOS_IFPACK2) && defined(HAVE_STOKHOS_MUELU) && defined(HAVE_STOKHOS_AMESOS2) && defined(HAVE_TPETRA_EXPLICIT_INSTANTIATION) 
 1870   using Teuchos::getParametersFromXmlFile;
 
 1874   typedef typename Scalar::cijk_type Cijk;
 
 1877   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
 1878   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
 1879   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
 1880   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
 1883   if ( !Kokkos::is_initialized() )
 
 1884     Kokkos::initialize();
 
 1893   BaseScalar h = 1.0 / 
static_cast<BaseScalar
>(nrow-1);
 
 1894   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
 1895   RCP<const Tpetra_Map> map =
 
 1896     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
 1898   RCP<Tpetra_CrsGraph> graph =
 
 1899     rcp(
new Tpetra_CrsGraph(map, 
size_t(3)));
 
 1900   Array<GlobalOrdinal> columnIndices(3);
 
 1901   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
 1902   const size_t num_my_row = myGIDs.size();
 
 1903   for (
size_t i=0; i<num_my_row; ++i) {
 
 1905     if (row == 0 || row == nrow-1) { 
 
 1906       columnIndices[0] = row;
 
 1907       graph->insertGlobalIndices(row, columnIndices(0,1));
 
 1910       columnIndices[0] = row-1;
 
 1911       columnIndices[1] = row;
 
 1912       columnIndices[2] = row+1;
 
 1913       graph->insertGlobalIndices(row, columnIndices(0,3));
 
 1916   graph->fillComplete();
 
 1917   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
 1920   Array<Scalar> vals(3);
 
 1923     a_val.fastAccessCoeff(
j) =
 
 1924       BaseScalar(1.0) + BaseScalar(1.0) / BaseScalar(
j+1);
 
 1926   for (
size_t i=0; i<num_my_row; ++i) {
 
 1928     if (row == 0 || row == nrow-1) { 
 
 1929       columnIndices[0] = row;
 
 1931       matrix->replaceGlobalValues(row, columnIndices(0,1), vals(0,1));
 
 1934       columnIndices[0] = row-1;
 
 1935       columnIndices[1] = row;
 
 1936       columnIndices[2] = row+1;
 
 1937       vals[0] = 
Scalar(1.0) * a_val;
 
 1938       vals[1] = 
Scalar(-2.0) * a_val;
 
 1939       vals[2] = 
Scalar(1.0) * a_val;
 
 1940       matrix->replaceGlobalValues(row, columnIndices(0,3), vals(0,3));
 
 1943   matrix->fillComplete();
 
 1946   RCP<Tpetra_Vector> b = Tpetra::createVector<Scalar>(map);
 
 1948     ArrayRCP<Scalar> b_view = b->get1dViewNonConst();
 
 1951       b_val.fastAccessCoeff(
j) =
 
 1952         BaseScalar(2.0) - BaseScalar(1.0) / BaseScalar(
j+1);
 
 1954     for (
size_t i=0; i<num_my_row; ++i) {
 
 1956       if (row == 0 || row == nrow-1)
 
 1959         b_view[i] = b_val * (h*h);
 
 1964   typedef Tpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node> OP;
 
 1965   RCP<ParameterList> muelu_params =
 
 1966     getParametersFromXmlFile(
"muelu_cheby.xml");
 
 1967 #if USE_SCALAR_MEAN_BASED_PREC 
 1968   typedef Tpetra::Operator<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Scalar_OP;
 
 1969   typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Scalar_Tpetra_CrsMatrix;
 
 1970   RCP<Scalar_Tpetra_CrsMatrix> mean_matrix =
 
 1972   RCP<Scalar_OP> mean_matrix_op = mean_matrix;
 
 1973   RCP<Scalar_OP> M_s =
 
 1974     MueLu::CreateTpetraPreconditioner<BaseScalar,LocalOrdinal,GlobalOrdinal,Node>(mean_matrix_op, *muelu_params);
 
 1978     Stokhos::create_mean_based_product_tensor<typename Storage::execution_space,typename Storage::ordinal_type,BaseScalar>();
 
 1981   RCP<OP> mean_matrix_op = mean_matrix;
 
 1983     MueLu::CreateTpetraPreconditioner<Scalar,LocalOrdinal,GlobalOrdinal,Node>(mean_matrix_op, *muelu_params);
 
 1989   typedef BaseScalar BelosScalar;
 
 1990   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> MV;
 
 1991   typedef Belos::LinearProblem<BelosScalar,MV,OP> BLinProb;
 
 1992   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 1993   RCP< BLinProb > problem = 
rcp(
new BLinProb(matrix, x, b));
 
 1994   problem->setRightPrec(M);
 
 1995   problem->setProblem();
 
 1996   RCP<ParameterList> belosParams = 
rcp(
new ParameterList);
 
 1997   typename ST::magnitudeType tol = 1e-9;
 
 1998   belosParams->set(
"Num Blocks", 100);
 
 1999   belosParams->set(
"Convergence Tolerance", BelosScalar(tol));
 
 2000   belosParams->set(
"Maximum Iterations", 100);
 
 2001   belosParams->set(
"Verbosity", 33);
 
 2002   belosParams->set(
"Output Style", 1);
 
 2003   belosParams->set(
"Output Frequency", 1);
 
 2004   belosParams->set(
"Output Stream", out.getOStream());
 
 2006   RCP<Belos::SolverManager<BelosScalar,MV,OP> > solver =
 
 2007     rcp(
new Belos::PseudoBlockGmresSolMgr<BelosScalar,MV,OP>(problem, belosParams));
 
 2010   Belos::ReturnType ret = solver->solve();
 
 2017   typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
 2018   typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
 2019   RCP<const Tpetra_Map> flat_x_map, flat_b_map;
 
 2020   RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 2023                                    cijk_graph, pce_size);
 
 2024   RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 2026   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
 2028     RCP<Flat_Tpetra_Vector> flat_x =
 
 2030     RCP<Flat_Tpetra_Vector> flat_b =
 
 2032     typedef Tpetra::MultiVector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FMV;
 
 2033     typedef Tpetra::Operator<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FOP;
 
 2034     typedef Belos::LinearProblem<BelosScalar,FMV,FOP> FBLinProb;
 
 2035     RCP< FBLinProb > flat_problem =
 
 2036       rcp(
new FBLinProb(flat_matrix, flat_x, flat_b));
 
 2037     RCP<Belos::SolverManager<BelosScalar,FMV,FOP> > flat_solver =
 
 2038       rcp(
new Belos::PseudoBlockGmresSolMgr<BelosScalar,FMV,FOP>(flat_problem,
 
 2043     flat_problem->setProblem();
 
 2044     Belos::ReturnType flat_ret = flat_solver->solve();
 
 2048   typename ST::magnitudeType btol = 100*tol;
 
 2049   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 2050   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
 2051   for (
size_t i=0; i<num_my_row; ++i) {
 
 2056     Scalar v = x_view[i];
 
 2057     Scalar v2 = x2_view[i];
 
 2059       if (
j < v.size() && ST::magnitude(v.coeff(
j)) < btol)
 
 2060         v.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 2061       if (
j < v2.size() && ST::magnitude(v2.coeff(
j)) < btol)
 
 2062         v2.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 2082 #if defined(HAVE_STOKHOS_AMESOS2) 
 2099   typedef typename Scalar::cijk_type Cijk;
 
 2102   typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Tpetra_Map;
 
 2103   typedef Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_Vector;
 
 2104   typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_MultiVector;
 
 2105   typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsMatrix;
 
 2106   typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> Tpetra_CrsGraph;
 
 2109   if ( !Kokkos::is_initialized() )
 
 2110     Kokkos::initialize();
 
 2119   BaseScalar h = 1.0 / 
static_cast<BaseScalar
>(nrow-1);
 
 2120   RCP<const Tpetra_Comm> comm = Tpetra::getDefaultComm();
 
 2121   RCP<const Tpetra_Map> map =
 
 2122     Tpetra::createUniformContigMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
 2124   RCP<Tpetra_CrsGraph> graph = Tpetra::createCrsGraph(map, 
size_t(3));
 
 2125   Array<GlobalOrdinal> columnIndices(3);
 
 2126   ArrayView<const GlobalOrdinal> myGIDs = map->getLocalElementList();
 
 2127   const size_t num_my_row = myGIDs.size();
 
 2128   for (
size_t i=0; i<num_my_row; ++i) {
 
 2130     if (row == 0 || row == nrow-1) { 
 
 2131       columnIndices[0] = row;
 
 2132       graph->insertGlobalIndices(row, columnIndices(0,1));
 
 2135       columnIndices[0] = row-1;
 
 2136       columnIndices[1] = row;
 
 2137       columnIndices[2] = row+1;
 
 2138       graph->insertGlobalIndices(row, columnIndices(0,3));
 
 2141   graph->fillComplete();
 
 2142   RCP<Tpetra_CrsMatrix> matrix = 
rcp(
new Tpetra_CrsMatrix(graph));
 
 2145   Array<Scalar> vals(3);
 
 2148     a_val.fastAccessCoeff(
j) =
 
 2149       BaseScalar(1.0) + BaseScalar(1.0) / BaseScalar(
j+1);
 
 2151   for (
size_t i=0; i<num_my_row; ++i) {
 
 2153     if (row == 0 || row == nrow-1) { 
 
 2154       columnIndices[0] = row;
 
 2156       matrix->replaceGlobalValues(row, columnIndices(0,1), vals(0,1));
 
 2159       columnIndices[0] = row-1;
 
 2160       columnIndices[1] = row;
 
 2161       columnIndices[2] = row+1;
 
 2162       vals[0] = 
Scalar(1.0) * a_val;
 
 2163       vals[1] = 
Scalar(-2.0) * a_val;
 
 2164       vals[2] = 
Scalar(1.0) * a_val;
 
 2165       matrix->replaceGlobalValues(row, columnIndices(0,3), vals(0,3));
 
 2168   matrix->fillComplete();
 
 2171   RCP<Tpetra_Vector> b = Tpetra::createVector<Scalar>(map);
 
 2173     ArrayRCP<Scalar> b_view = b->get1dViewNonConst();
 
 2176       b_val.fastAccessCoeff(
j) =
 
 2177         BaseScalar(2.0) - BaseScalar(1.0) / BaseScalar(
j+1);
 
 2179     for (
size_t i=0; i<num_my_row; ++i) {
 
 2181       if (row == 0 || row == nrow-1)
 
 2184         b_view[i] = b_val * (h*h);
 
 2189   typedef Amesos2::Solver<Tpetra_CrsMatrix,Tpetra_MultiVector> Solver;
 
 2190   RCP<Tpetra_Vector> x = Tpetra::createVector<Scalar>(map);
 
 2191   std::string solver_name;
 
 2192 #if defined(HAVE_AMESOS2_BASKER) 
 2193   solver_name = 
"basker";
 
 2194 #elif defined(HAVE_AMESOS2_KLU2) 
 2195   solver_name = 
"klu2";
 
 2196 #elif defined(HAVE_AMESOS2_SUPERLUDIST) 
 2197   solver_name = 
"superlu_dist";
 
 2198 #elif defined(HAVE_AMESOS2_SUPERLUMT) 
 2199   solver_name = 
"superlu_mt";
 
 2200 #elif defined(HAVE_AMESOS2_SUPERLU) 
 2201   solver_name = 
"superlu";
 
 2202 #elif defined(HAVE_AMESOS2_PARDISO_MKL) 
 2203   solver_name = 
"pardisomkl";
 
 2204 #elif defined(HAVE_AMESOS2_LAPACK) 
 2205   solver_name = 
"lapack";
 
 2206 #elif defined(HAVE_AMESOS2_CHOLMOD) && defined (HAVE_AMESOS2_EXPERIMENTAL) 
 2207   solver_name = 
"lapack";
 
 2213   out << 
"Solving linear system with " << solver_name << std::endl;
 
 2215     RCP<Solver> solver = Amesos2::create<Tpetra_CrsMatrix,Tpetra_MultiVector>(
 
 2216       solver_name, matrix, x, b);
 
 2223   typedef Tpetra::Vector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_Vector;
 
 2224   typedef Tpetra::MultiVector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_MultiVector;
 
 2225   typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> Flat_Tpetra_CrsMatrix;
 
 2226   RCP<const Tpetra_Map> flat_x_map, flat_b_map;
 
 2227   RCP<const Tpetra_CrsGraph> flat_graph, cijk_graph;
 
 2230                                    cijk_graph, pce_size);
 
 2231   RCP<Flat_Tpetra_CrsMatrix> flat_matrix =
 
 2233   RCP<Tpetra_Vector> x2 = Tpetra::createVector<Scalar>(map);
 
 2235     RCP<Flat_Tpetra_Vector> flat_x =
 
 2237     RCP<Flat_Tpetra_Vector> flat_b =
 
 2239     typedef Amesos2::Solver<Flat_Tpetra_CrsMatrix,Flat_Tpetra_MultiVector> Flat_Solver;
 
 2240     RCP<Flat_Solver> flat_solver =
 
 2241       Amesos2::create<Flat_Tpetra_CrsMatrix,Flat_Tpetra_MultiVector>(
 
 2242         solver_name, flat_matrix, flat_x, flat_b);
 
 2243     flat_solver->solve();
 
 2246 #if KOKKOS_VERSION >= 40799 
 2247   typedef KokkosKernels::ArithTraits<BaseScalar> ST;
 
 2249   typedef Kokkos::ArithTraits<BaseScalar> ST;
 
 2251   typename ST::mag_type btol = 1e-12;
 
 2252   ArrayRCP<Scalar> x_view = x->get1dViewNonConst();
 
 2253   ArrayRCP<Scalar> x2_view = x2->get1dViewNonConst();
 
 2254   for (
size_t i=0; i<num_my_row; ++i) {
 
 2259     Scalar v = x_view[i];
 
 2260     Scalar v2 = x2_view[i];
 
 2262       if (
j < v.size() && ST::magnitude(v.coeff(
j)) < btol)
 
 2263         v.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 2264       if (
j < v2.size() && ST::magnitude(v2.coeff(
j)) < btol)
 
 2265         v2.fastAccessCoeff(
j) = BaseScalar(0.0);
 
 2284 #define CRSMATRIX_UQ_PCE_TESTS_SLGN(S, LO, GO, N)                    \ 
 2285   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, VectorAdd, S, LO, GO, N ) \ 
 2286   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, VectorDot, S, LO, GO, N ) \ 
 2287   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, MultiVectorAdd, S, LO, GO, N ) \ 
 2288   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, MultiVectorDot, S, LO, GO, N ) \ 
 2289   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, MultiVectorDotSub, S, LO, GO, N ) \ 
 2290   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, MatrixVectorMultiply, S, LO, GO, N ) \ 
 2291   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, MatrixMultiVectorMultiply, S, LO, GO, N ) \ 
 2292   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, Flatten, S, LO, GO, N ) \ 
 2293   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, SimpleCG, S, LO, GO, N ) \ 
 2294   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, SimplePCG_Muelu, S, LO, GO, N ) \ 
 2295   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, BelosGMRES, S, LO, GO, N ) \ 
 2296   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, BelosGMRES_RILUK, S, LO, GO, N ) \ 
 2297   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, BelosCG_Muelu, S, LO, GO, N ) \ 
 2298   TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(Tpetra_CrsMatrix_PCE, Amesos2, S, LO, GO, N ) 
 2300 #define CRSMATRIX_UQ_PCE_TESTS_N(N)                                     \ 
 2301   typedef Stokhos::DeviceForNode2<N>::type Device;                      \ 
 2302   typedef Stokhos::DynamicStorage<int,double,Device::execution_space> DS; \ 
 2303   using default_local_ordinal_type = Tpetra::Map<>::local_ordinal_type; \ 
 2304   using default_global_ordinal_type = Tpetra::Map<>::global_ordinal_type; \ 
 2305   CRSMATRIX_UQ_PCE_TESTS_SLGN(DS, default_local_ordinal_type, default_global_ordinal_type, N) 
Teuchos::RCP< Tpetra::CrsMatrix< typename Storage::value_type, LocalOrdinal, GlobalOrdinal, Node > > create_flat_matrix(const Tpetra::CrsMatrix< Sacado::UQ::PCE< Storage >, LocalOrdinal, GlobalOrdinal, Node > &mat, const Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &flat_graph, const Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &cijk_graph, const CijkType &cijk_dev)
 
Teuchos::RCP< Tpetra::CrsMatrix< Scalar, LO, GO, N > > build_mean_matrix(const Tpetra::CrsMatrix< Scalar, LO, GO, N > &A)
 
bool CG_Solve(const Matrix &A, Vector &x, const Vector &b, typename Vector::mag_type tol, Ordinal max_its, std::ostream *out=0)
 
scalar generate_multi_vector_coefficient(const ordinal nFEM, const ordinal nVec, const ordinal nStoch, const ordinal iColFEM, const ordinal iVec, const ordinal iStoch)
 
TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(Tpetra_CrsMatrix_MP, VectorAdd, Storage, LocalOrdinal, GlobalOrdinal, Node)
 
Data structure storing a sparse 3-tensor C(i,j,k) in a a compressed format. 
 
#define TEST_EQUALITY_CONST(v1, v2)
 
Kokkos::DefaultExecutionSpace execution_space
 
Teuchos::RCP< const Tpetra::MultiVector< typename Storage::value_type, LocalOrdinal, GlobalOrdinal, Node > > create_flat_vector_view(const Tpetra::MultiVector< Sacado::UQ::PCE< Storage >, LocalOrdinal, GlobalOrdinal, Node > &vec, const Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &flat_map)
 
scalar generate_vector_coefficient(const ordinal nFEM, const ordinal nStoch, const ordinal iColFEM, const ordinal iStoch)
 
std::enable_if< Kokkos::is_view_uq_pce< Kokkos::View< XD, XP...> >::value &&Kokkos::is_view_uq_pce< Kokkos::View< YD, YP...> >::value, typename Kokkos::Details::InnerProductSpaceTraits< typename Kokkos::View< XD, XP...>::non_const_value_type >::dot_type >::type dot(const Kokkos::View< XD, XP...> &x, const Kokkos::View< YD, YP...> &y)
 
Stokhos::CrsMatrix< ValueType, Device, Layout >::host_mirror_type create_mirror_view(const Stokhos::CrsMatrix< ValueType, Device, Layout > &A)
 
Teuchos::RCP< Tpetra::CrsMatrix< typename Scalar::value_type, LO, GO, N > > build_mean_scalar_matrix(const Tpetra::CrsMatrix< Scalar, LO, GO, N > &A)
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
 
bool PCG_Solve(const Matrix &A, Vector &x, const Vector &b, const Prec &M, typename Vector::mag_type tol, Ordinal max_its, std::ostream *out=0)
 
void deep_copy(const Stokhos::CrsMatrix< ValueType, DstDevice, Layout > &dst, const Stokhos::CrsMatrix< ValueType, SrcDevice, Layout > &src)
 
KOKKOS_INLINE_FUNCTION PCE< Storage > abs(const PCE< Storage > &a)
 
expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 c fastAccessCoeff(j)-expr2.val(j)
 
void setGlobalCijkTensor(const cijk_type &cijk)
 
Multivariate orthogonal polynomial basis generated from a total-order complete-polynomial tensor prod...
 
kokkos_cijk_type build_cijk(ordinal_type stoch_dim, ordinal_type poly_ord)
 
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
 
KOKKOS_INLINE_FUNCTION constexpr std::enable_if< is_view_uq_pce< view_type >::value, typename CijkType< view_type >::type >::type cijk(const view_type &view)
 
Legendre polynomial basis. 
 
scalar generate_matrix_coefficient(const ordinal nFEM, const ordinal nStoch, const ordinal iRowFEM, const ordinal iColFEM, const ordinal iStoch)
 
Abstract base class for 1-D orthogonal polynomials. 
 
Tpetra::KokkosClassic::DefaultNode::DefaultNodeType Node
 
Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > create_flat_pce_graph(const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > &graph, const CijkType &cijk, Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &flat_domain_map, Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &flat_range_map, Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &cijk_graph, const size_t matrix_pce_size)
 
#define TEST_EQUALITY(v1, v2)