42#ifndef AMESOS2_SOLVER_UQ_PCE_HPP
43#define AMESOS2_SOLVER_UQ_PCE_HPP
45#include "Amesos2_Solver.hpp"
46#include "Amesos2_Factory.hpp"
52 template <
class S,
class LO,
class GO,
class D>
55 const Teuchos::RCP<
const Tpetra::CrsMatrix<
Sacado::UQ::PCE<S>, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode<D> > >& A = Teuchos::null,
56 const Teuchos::RCP<Tpetra::MultiVector<
Sacado::UQ::PCE<S>, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode<D> > >& X = Teuchos::null,
57 const Teuchos::RCP<
const Tpetra::MultiVector<
Sacado::UQ::PCE<S>, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode<D> > >& B = Teuchos::null)
59 if (A != Teuchos::null) {
60 return Kokkos::cijk(A->getLocalValuesDevice(Tpetra::Access::ReadOnly));
62 else if (X != Teuchos::null) {
63 return Kokkos::cijk(X->getLocalViewDevice(Tpetra::Access::ReadOnly));
65 else if (B != Teuchos::null) {
66 return Kokkos::cijk(B->getLocalViewDevice(Tpetra::Access::ReadOnly));
78 class Device,
template<
class,
class>
class ConcreteSolver>
80 public Solver< Tpetra::CrsMatrix<Sacado::UQ::PCE<Storage>,
83 Kokkos::Compat::KokkosDeviceWrapperNode<Device> >,
84 Tpetra::MultiVector<Sacado::UQ::PCE<Storage>,
87 Kokkos::Compat::KokkosDeviceWrapperNode<Device> >
93 typedef Kokkos::Compat::KokkosDeviceWrapperNode<Device>
Node;
94 typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>
Matrix;
95 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>
Vector;
98 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node>
Map;
99 typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node>
FlatGraph;
100 typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node>
FlatMatrix;
101 typedef Tpetra::MultiVector<BaseScalar,LocalOrdinal,GlobalOrdinal,Node>
FlatVector;
106 typedef typename solver_type::type
type;
111 const Teuchos::RCP<const Matrix>& A_,
112 const Teuchos::RCP<Vector>& X_,
113 const Teuchos::RCP<const Vector>& B_) :
114 A(A_),
X(X_),
B(B_) {
116 const size_t pce_size =
125 if (
A != Teuchos::null)
127 if (
X != Teuchos::null)
129 if (
B != Teuchos::null)
132 create_solver_with_supported_type<ConcreteSolver,FlatMatrix,FlatVector>::apply(
flat_A,
flat_X,
flat_B);
211 virtual void solve(
const Teuchos::Ptr<Vector> XX,
212 const Teuchos::Ptr<const Vector> BB)
const {
259 const Teuchos::RCP<Teuchos::ParameterList> & parameterList ) {
269 virtual Teuchos::RCP<const Teuchos::ParameterList>
300 virtual void setA(
const Teuchos::RCP<const Matrix> a,
301 EPhase keep_phase = CLEAN ) {
306 if (keep_phase <= CLEAN) {
318 if (keep_phase <= SYMBFACT)
343 virtual void setA(
const Matrix* a, EPhase keep_phase = CLEAN ) {
344 this->
setA(Teuchos::rcp(a,
false), keep_phase);
355 virtual void setX(
const Teuchos::RCP<Vector> x ) {
357 if (x != Teuchos::null)
368 X = Teuchos::rcp(x,
false);
380 virtual const Teuchos::RCP<Vector>
getX(
void ) {
392 virtual void setB(
const Teuchos::RCP<const Vector> b ) {
394 if (b != Teuchos::null)
405 B = Teuchos::rcp(b,
false);
417 virtual const Teuchos::RCP<const Vector>
getB(
void ) {
429 virtual Teuchos::RCP<const Teuchos::Comm<int> >
getComm(
void )
const {
441 virtual std::string
name(
void )
const {
461 const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default )
const {
474 const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default )
const{
487 virtual void getTiming( Teuchos::ParameterList& timingParameterList )
const{
495 Teuchos::RCP<const Matrix>
A;
496 Teuchos::RCP<Vector>
X;
497 Teuchos::RCP<const Vector>
B;
511 template <
template <
class,
class>
class ConcreteSolver,
512 class ST,
class LO,
class GO,
class D >
513 struct create_solver_with_supported_type<
515 Tpetra::CrsMatrix<Sacado::UQ::PCE<ST>,LO,GO,Kokkos::Compat::KokkosDeviceWrapperNode<D> >,
516 Tpetra::MultiVector<Sacado::UQ::PCE<ST>,LO,GO,Kokkos::Compat::KokkosDeviceWrapperNode<D> > > {
518 typedef Kokkos::Compat::KokkosDeviceWrapperNode<D>
NO;
519 typedef Tpetra::CrsMatrix<SC,LO,GO,NO>
Matrix;
520 typedef Tpetra::MultiVector<SC,LO,GO,NO>
Vector;
521 static Teuchos::RCP<Solver<Matrix,Vector> >
523 Teuchos::RCP<Vector> X,
524 Teuchos::RCP<const Vector> B )
528 typename MatrixTraits<Matrix>::scalar_t,
529 typename MultiVecAdapter<Vector>::scalar_t
531 > same_scalar_assertion;
532 (void)same_scalar_assertion;
535 return Teuchos::rcp(
new PCESolverAdapter<ST,LO,GO,D,ConcreteSolver>(A, X, B) );
542 template <
template <
class,
class>
class ConcreteSolver,
544 struct solver_supports_scalar<ConcreteSolver,
Sacado::UQ::PCE<Storage> > {
548 static const bool value =
549 Meta::if_then_else<Meta::is_same<supported_scalars, Meta::nil_t>::value,
Amesos2 solver adapter for UQ::PCE scalar type.
virtual void setX(const Teuchos::RCP< Vector > x)
Sets the LHS vector X.
virtual std::string name(void) const
Return the name of this solver.
virtual Teuchos::RCP< const Teuchos::ParameterList > getValidParameters(void) const
Return a const parameter list of all of the valid parameters that this->setParameterList(....
Tpetra::MultiVector< BaseScalar, LocalOrdinal, GlobalOrdinal, Node > FlatVector
Teuchos::RCP< const Vector > B
Teuchos::RCP< const FlatGraph > cijk_graph
Tpetra::CrsMatrix< BaseScalar, LocalOrdinal, GlobalOrdinal, Node > FlatMatrix
virtual void getTiming(Teuchos::ParameterList &timingParameterList) const
Extracts timing information from the current solver.
virtual type & numericFactorization(void)
Performs numeric factorization on the matrix.
virtual void setB(const Teuchos::RCP< const Vector > b)
Sets the RHS vector B.
Teuchos::RCP< const Map > flat_B_map
virtual Vector * getXRaw(void)
Returns a raw pointer to the LHS of the linear system.
virtual void solve(Vector *XX, const Vector *BB) const
Solve using the given X and B vectors.
virtual bool matrixShapeOK(void)
Returns true if the solver can handle the matrix shape.
Teuchos::RCP< const FlatGraph > flat_graph
Scalar::value_type BaseScalar
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Teuchos::RCP< const FlatMatrix > flat_A
Teuchos::RCP< const Matrix > A
ConcreteSolver< FlatMatrix, FlatVector > FlatConcreteSolver
Teuchos::RCP< const FlatVector > flat_B
virtual type & setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Set/update internal variables and solver options.
virtual void solve(void)
Solves (or )
virtual type & symbolicFactorization(void)
Performs symbolic factorization on the matrix.
virtual const Vector * getBRaw(void)
Returns a raw pointer to the RHS of the linear system.
virtual void printTiming(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Prints timing information about the current solver.
virtual Status & getStatus() const
Returns a reference to this solver's internal status object.
virtual type & preOrdering(void)
Pre-orders the matrix.
Teuchos::RCP< FlatVector > flat_X
virtual void setA(const Matrix *a, EPhase keep_phase=CLEAN)
Sets the matrix A of this solver.
Tpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > Matrix
Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > Map
PCESolverAdapter(const Teuchos::RCP< const Matrix > &A_, const Teuchos::RCP< Vector > &X_, const Teuchos::RCP< const Vector > &B_)
Constructor.
virtual void solve(const Teuchos::Ptr< Vector > XX, const Teuchos::Ptr< const Vector > BB) const
Solve using the given X and B vectors.
Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > FlatGraph
Scalar::cijk_type cijk_type
Sacado::UQ::PCE< Storage > Scalar
virtual std::string description(void) const
Returns a short description of this Solver.
virtual void setX(Vector *x)
Sets the LHS vector X using a raw pointer.
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm(void) const
Returns a pointer to the Teuchos::Comm communicator with this matrix.
Teuchos::RCP< const Map > flat_X_map
virtual void setA(const Teuchos::RCP< const Matrix > a, EPhase keep_phase=CLEAN)
Sets the matrix A of this solver.
virtual const Teuchos::RCP< const Vector > getB(void)
Returns the vector that is the RHS of the linear system.
Solver< FlatMatrix, FlatVector > FlatSolver
virtual const Teuchos::RCP< Vector > getX(void)
Returns the vector that is the LHS of the linear system.
virtual void setB(const Vector *b)
Sets the RHS vector B using a raw pointer.
Solver< Matrix, Vector > solver_type
Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > Vector
Kokkos::Compat::KokkosDeviceWrapperNode< Device > Node
Teuchos::RCP< FlatSolver > flat_solver
Stokhos::StandardStorage< int, double > Storage
Sacado::UQ::PCE< S >::cijk_type get_pce_cijk(const Teuchos::RCP< const Tpetra::CrsMatrix< Sacado::UQ::PCE< S >, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode< D > > > &A=Teuchos::null, const Teuchos::RCP< Tpetra::MultiVector< Sacado::UQ::PCE< S >, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode< D > > > &X=Teuchos::null, const Teuchos::RCP< const Tpetra::MultiVector< Sacado::UQ::PCE< S >, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode< D > > > &B=Teuchos::null)
KOKKOS_INLINE_FUNCTION constexpr std::enable_if< is_view_uq_pce< View< T, P... > >::value, unsigned >::type dimension_scalar(const View< T, P... > &view)
KOKKOS_INLINE_FUNCTION constexpr std::enable_if< is_view_uq_pce< view_type >::value, typenameCijkType< view_type >::type >::type cijk(const view_type &view)
Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > create_flat_pce_graph(const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > &graph, const CijkType &cijk, Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > &flat_domain_map, Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > &flat_range_map, Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > &cijk_graph, const size_t matrix_pce_size)
Teuchos::RCP< const Tpetra::MultiVector< typename Storage::value_type, LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > create_flat_vector_view(const Tpetra::MultiVector< Sacado::UQ::PCE< Storage >, LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > &vec, const Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > &flat_map)
Teuchos::RCP< Tpetra::CrsMatrix< typename Storage::value_type, LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > create_flat_matrix(const Tpetra::CrsMatrix< Sacado::UQ::PCE< Storage >, LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > &mat, const Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > &flat_graph, const Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Kokkos::Compat::KokkosDeviceWrapperNode< Device > > > &cijk_graph, const CijkType &cijk_dev)
Tpetra::CrsMatrix< SC, LO, GO, NO > Matrix
Kokkos::Compat::KokkosDeviceWrapperNode< D > NO
Tpetra::MultiVector< SC, LO, GO, NO > Vector
static Teuchos::RCP< Solver< Matrix, Vector > > apply(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Scalar::value_type BaseScalar
solver_traits< ConcreteSolver >::supported_scalars supported_scalars
Sacado::UQ::PCE< Storage > Scalar