Ejemplo n.º 1
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);

  // 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;
}
Ejemplo n.º 3
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;
}