int main() { typedef Kokkos::DefaultNode::DefaultNodeType Node; typedef KokkosExamples::EmptySparseKernel<void,Node> SOBASE; typedef SOBASE::graph<int,Node>::graph_type Graph; typedef SOBASE::bind_scalar<float>::other_type FloatOps; typedef FloatOps::matrix< float,int,Node>::matrix_type FMatrix; typedef SOBASE::bind_scalar<double>::other_type DoubleOps; typedef DoubleOps::matrix<double,int,Node>::matrix_type DMatrix; typedef Kokkos::MultiVector<double,Node> DoubleVec; typedef Kokkos::MultiVector<float,Node> FloatVec; std::cout << "Note, this class doesn't actually do anything. We are only testing that it compiles." << std::endl; // get a pointer to the default node Teuchos::RCP<Node> node = Kokkos::DefaultNode::getDefaultNode(); // create the graph G const int numRows = 5, numCols = 5; Teuchos::RCP<Graph> G = Teuchos::rcp(new Graph(numRows,numCols,node,Teuchos::null)); // create a double-valued matrix dM using the graph G Teuchos::RCP<DMatrix> dM = Teuchos::rcp(new DMatrix(G,Teuchos::null)); DoubleOps doubleKernel(node); // initialize it with G and dM DoubleOps::finalizeGraphAndMatrix(Teuchos::UNDEF_TRI,Teuchos::NON_UNIT_DIAG,*G,*dM,Teuchos::null); doubleKernel.setGraphAndMatrix(G,dM); // create double-valued vectors and initialize them DoubleVec dx(node), dy(node); // call the sparse kernel operator interfaces doubleKernel.multiply( Teuchos::NO_TRANS, 1.0, dx, dy); doubleKernel.multiply( Teuchos::NO_TRANS, 1.0, dx, 1.0, dy); doubleKernel.solve( Teuchos::NO_TRANS, dy, dx); // create a float-valued matrix fM using the graph G Teuchos::RCP<FMatrix> fM = Teuchos::rcp(new FMatrix(G,Teuchos::null)); // create a double-valued sparse kernel using the rebind functionality FloatOps floatKernel(node); // initialize it with G and fM FloatOps::finalizeMatrix(*G,*fM,Teuchos::null); floatKernel.setGraphAndMatrix(G,fM); // create float-valued vectors and initialize them FloatVec fx(node), fy(node); // call the sparse kernel operator interfaces floatKernel.multiply( Teuchos::NO_TRANS, 1.0f, fx, fy); floatKernel.multiply( Teuchos::NO_TRANS, 1.0f, fx, 1.0f, fy); floatKernel.solve( Teuchos::NO_TRANS, fy, fx); std::cout << "End Result: TEST PASSED" << std::endl; return 0; }
int main() { typedef Kokkos::DefaultNode::DefaultNodeType Node; typedef KokkosExamples::DummySparseKernel<Node> SparseOps; typedef Kokkos::CrsGraph < int,Node,SparseOps> Graph; typedef Kokkos::CrsMatrix<double,int,Node,SparseOps> DoubleMat; typedef Kokkos::CrsMatrix< float,int,Node,SparseOps> FloatMat; typedef Kokkos::MultiVector<double,Node> DoubleVec; typedef Kokkos::MultiVector<float,Node> FloatVec; std::cout << "Note, this class doesn't actually do anything. We are only testing that it compiles." << std::endl; // get a pointer to the default node Teuchos::RCP<Node> node = Kokkos::DefaultNode::getDefaultNode(); // create the graph G const size_t numRows = 5; Graph G(numRows,node); // create a double-valued matrix dM using the graph G DoubleMat dM(G); // create a double-valued sparse kernel using the rebind functionality SparseOps::rebind<double>::other doubleKernel(node); // initialize it with G and dM doubleKernel.initializeStructure(G); doubleKernel.initializeValues(dM); // create double-valued vectors and initialize them DoubleVec dx(node), dy(node); // test the sparse kernel operator interfaces doubleKernel.multiply( Teuchos::NO_TRANS, 1.0, dx, dy); doubleKernel.multiply( Teuchos::NO_TRANS, 1.0, dx, 1.0, dy); doubleKernel.solve( Teuchos::NO_TRANS, Teuchos::UPPER_TRI, Teuchos::UNIT_DIAG, dy, dx); // create a float-valued matrix fM using the graph G FloatMat fM(G); // create a double-valued sparse kernel using the rebind functionality SparseOps::rebind<float>::other floatKernel(node); // initialize it with G and fM floatKernel.initializeStructure(G); floatKernel.initializeValues(fM); // create float-valued vectors and initialize them FloatVec fx(node), fy(node); // test the sparse kernel operator interfaces floatKernel.multiply( Teuchos::NO_TRANS, 1.0f, fx, fy); floatKernel.multiply( Teuchos::NO_TRANS, 1.0f, fx, 1.0f, fy); floatKernel.solve( Teuchos::NO_TRANS, Teuchos::UPPER_TRI, Teuchos::UNIT_DIAG, fy, fx); std::cout << "End Result: TEST PASSED" << std::endl; return 0; }
int main() { typedef Kokkos::DefaultNode::DefaultNodeType Node; typedef KokkosExamples::EmptySparseKernel<void,Node> SOBASE; typedef SOBASE::graph<int,Node>::graph_type Graph; typedef SOBASE::bind_scalar<float>::other_type FloatOps; typedef FloatOps::matrix< float,int,Node>::matrix_type FMatrix; typedef SOBASE::bind_scalar<double>::other_type DoubleOps; typedef DoubleOps::matrix<double,int,Node>::matrix_type DMatrix; typedef Kokkos::MultiVector<double,Node> DoubleVec; typedef Kokkos::MultiVector<float,Node> FloatVec; std::cout << "Note, this class doesn't actually do anything. We are only testing that it compiles." << std::endl; // get a pointer to the default node Teuchos::RCP<Node> node = Kokkos::DefaultNode::getDefaultNode(); // create the graph G const int numRows = 5, numCols = 5; Teuchos::RCP<Graph> G = Teuchos::rcp(new Graph(numRows,numCols,node,Teuchos::null)); // create a double-valued matrix dM using the graph G Teuchos::RCP<DMatrix> dM = Teuchos::rcp(new DMatrix(G,Teuchos::null)); DoubleOps doubleKernel(node); // initialize it with G and dM DoubleOps::finalizeGraphAndMatrix(Teuchos::UNDEF_TRI,Teuchos::NON_UNIT_DIAG,*G,*dM,Teuchos::null); doubleKernel.setGraphAndMatrix(G,dM); // create double-valued vectors and initialize them DoubleVec dx(node), dy(node); // call the sparse kernel operator interfaces doubleKernel.multiply( Teuchos::NO_TRANS, 1.0, dx, dy); doubleKernel.multiply( Teuchos::NO_TRANS, 1.0, dx, 1.0, dy); doubleKernel.solve( Teuchos::NO_TRANS, dy, dx); // The Gauss-Seidel kernel asks the user to precompute the inverse // diagonal entries of the matrix (here, the vector D). We // demonstrate both sweep directions here. The local kernels don't // implement a "Symmetric" direction; Tpetra handles that. (This is // because for a matrix distributed over multiple processes, // symmetric Gauss-Seidel requires interprocess communication // between the forward and backward sweeps.) DoubleVec dd (node); doubleKernel.gaussSeidel (dy, dx, dd, 1.0, Kokkos::Forward); doubleKernel.gaussSeidel (dy, dx, dd, 1.0, Kokkos::Backward); // create a float-valued matrix fM using the graph G Teuchos::RCP<FMatrix> fM = Teuchos::rcp(new FMatrix(G,Teuchos::null)); // create a double-valued sparse kernel using the rebind functionality FloatOps floatKernel(node); // initialize it with G and fM FloatOps::finalizeMatrix(*G,*fM,Teuchos::null); floatKernel.setGraphAndMatrix(G,fM); // create float-valued vectors and initialize them FloatVec fx(node), fy(node); // call the sparse kernel operator interfaces floatKernel.multiply( Teuchos::NO_TRANS, 1.0f, fx, fy); floatKernel.multiply( Teuchos::NO_TRANS, 1.0f, fx, 1.0f, fy); floatKernel.solve( Teuchos::NO_TRANS, fy, fx); // Precomputed inverse diagonal entries of the sparse matrix. FloatVec fd (node); floatKernel.gaussSeidel (fy, fx, fd, (float) 1.0, Kokkos::Forward); floatKernel.gaussSeidel (fy, fx, fd, (float) 1.0, Kokkos::Backward); std::cout << "End Result: TEST PASSED" << std::endl; return 0; }