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 #if defined(TPETRA_HAVE_KOKKOS_REFACTOR) 53 template <
class S,
class LO,
class GO,
class D>
56 const Teuchos::RCP<
const Tpetra::CrsMatrix<
Sacado::UQ::PCE<S>, LO, GO, Kokkos::Compat::KokkosDeviceWrapperNode<D> > >& A = Teuchos::null,
60 if (A != Teuchos::null) {
63 else if (X != Teuchos::null) {
66 else if (B != Teuchos::null) {
79 class Device,
template<
class,
class>
class ConcreteSolver>
80 class PCESolverAdapter :
81 public Solver< Tpetra::CrsMatrix<Sacado::UQ::PCE<Storage>,
84 Kokkos::Compat::KokkosDeviceWrapperNode<Device> >,
85 Tpetra::MultiVector<Sacado::UQ::PCE<Storage>,
88 Kokkos::Compat::KokkosDeviceWrapperNode<Device> >
94 typedef Kokkos::Compat::KokkosDeviceWrapperNode<Device>
Node;
95 typedef Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> Matrix;
99 typedef Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> Map;
100 typedef Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> FlatGraph;
101 typedef Tpetra::CrsMatrix<BaseScalar,LocalOrdinal,GlobalOrdinal,Node> FlatMatrix;
103 typedef ConcreteSolver<FlatMatrix,FlatVector> FlatConcreteSolver;
104 typedef Solver<FlatMatrix,FlatVector> FlatSolver;
106 typedef Solver<Matrix,Vector> solver_type;
107 typedef typename solver_type::type type;
108 typedef typename Scalar::cijk_type cijk_type;
112 const Teuchos::RCP<const Matrix>& A_,
113 const Teuchos::RCP<Vector>& X_,
114 const Teuchos::RCP<const Vector>& B_) :
115 A(A_), X(X_), B(B_) {
116 cijk = get_pce_cijk(A, X, B);
118 Stokhos::create_flat_pce_graph(*(A->getCrsGraph()),
124 if (A != Teuchos::null)
126 if (X != Teuchos::null)
128 if (B != Teuchos::null)
131 create_solver_with_supported_type<ConcreteSolver,FlatMatrix,FlatVector>::apply(flat_A, flat_X, flat_B);
144 virtual type& preOrdering(
void ) {
145 flat_solver->preOrdering();
155 virtual type& symbolicFactorization(
void ) {
156 flat_solver->symbolicFactorization();
173 virtual type& numericFactorization(
void ) {
174 flat_solver->numericFactorization();
191 virtual void solve(
void ) {
192 flat_solver->solve();
210 virtual void solve(
const Teuchos::Ptr<Vector> XX,
211 const Teuchos::Ptr<const Vector> BB)
const {
232 virtual void solve(Vector* XX,
const Vector* BB)
const {
257 virtual type& setParameters(
258 const Teuchos::RCP<Teuchos::ParameterList> & parameterList ) {
259 flat_solver->setParameters(parameterList);
268 virtual Teuchos::RCP<const Teuchos::ParameterList>
269 getValidParameters(
void )
const {
270 return flat_solver->getValidParameters();
299 virtual void setA(
const Teuchos::RCP<const Matrix> a,
300 EPhase keep_phase = CLEAN ) {
304 cijk = get_pce_cijk(A);
305 if (keep_phase <= CLEAN) {
306 flat_X_map = Teuchos::null;
307 flat_B_map = Teuchos::null;
308 flat_graph = Teuchos::null;
310 Stokhos::create_flat_pce_graph(*(A->getCrsGraph()),
317 if (keep_phase <= SYMBFACT)
320 flat_solver->setA(flat_A, keep_phase);
342 virtual void setA(
const Matrix* a, EPhase keep_phase = CLEAN ) {
343 this->setA(Teuchos::rcp(a,
false), keep_phase);
348 virtual bool matrixShapeOK(
void ) {
349 return flat_solver->matrixShapeOK();
354 virtual void setX(
const Teuchos::RCP<Vector>
x ) {
356 if (
x != Teuchos::null)
359 flat_X = Teuchos::null;
360 flat_solver->setX(flat_X);
365 virtual void setX( Vector*
x ) {
367 X = Teuchos::rcp(
x,
false);
372 flat_X = Teuchos::null;
374 flat_solver->setX(flat_X);
379 virtual const Teuchos::RCP<Vector> getX(
void ) {
385 virtual Vector* getXRaw(
void ) {
391 virtual void setB(
const Teuchos::RCP<const Vector> b ) {
393 if (b != Teuchos::null)
396 flat_B = Teuchos::null;
397 flat_solver->setB(flat_B);
402 virtual void setB(
const Vector* b ) {
404 B = Teuchos::rcp(b,
false);
409 flat_B = Teuchos::null;
411 flat_solver->setB(flat_B);
416 virtual const Teuchos::RCP<const Vector> getB(
void ) {
422 virtual const Vector* getBRaw(
void ) {
428 virtual Teuchos::RCP<const Teuchos::Comm<int> > getComm(
void )
const {
429 return flat_solver->getComm();
434 virtual Status& getStatus()
const {
435 return flat_solver->getStatus();
440 virtual std::string name(
void )
const {
441 return flat_solver->name();
451 virtual std::string description(
void )
const {
453 return flat_solver->description();
459 virtual void describe( Teuchos::FancyOStream &out,
460 const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default )
const {
461 flat_solver->describe(out, verbLevel);
471 virtual void printTiming( Teuchos::FancyOStream &out,
473 const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default )
const{
474 flat_solver->printTiming(out, verbLevel);
486 virtual void getTiming( Teuchos::ParameterList& timingParameterList )
const{
487 flat_solver->getTiming(timingParameterList);
494 Teuchos::RCP<const Matrix> A;
495 Teuchos::RCP<Vector> X;
496 Teuchos::RCP<const Vector> B;
497 Teuchos::RCP<const Map> flat_X_map, flat_B_map;
498 Teuchos::RCP<const FlatGraph> flat_graph, cijk_graph;
499 Teuchos::RCP<const FlatMatrix> flat_A;
500 Teuchos::RCP<FlatVector> flat_X;
501 Teuchos::RCP<const FlatVector> flat_B;
502 Teuchos::RCP<FlatSolver> flat_solver;
510 template <
template <
class,
class>
class ConcreteSolver,
511 class ST,
class LO,
class GO,
class D >
512 struct create_solver_with_supported_type<
514 Tpetra::CrsMatrix<Sacado::UQ::PCE<ST>,LO,GO,Kokkos::Compat::KokkosDeviceWrapperNode<D> >,
515 Tpetra::MultiVector<Sacado::UQ::PCE<ST>,LO,GO,Kokkos::Compat::KokkosDeviceWrapperNode<D> > > {
517 typedef Kokkos::Compat::KokkosDeviceWrapperNode<D>
NO;
518 typedef Tpetra::CrsMatrix<SC,LO,GO,NO> Matrix;
520 static Teuchos::RCP<Solver<Matrix,Vector> >
521 apply(Teuchos::RCP<const Matrix> A,
522 Teuchos::RCP<Vector> X,
523 Teuchos::RCP<const Vector> B )
527 typename MatrixTraits<Matrix>::scalar_t,
528 typename MultiVecAdapter<Vector>::scalar_t
530 > same_scalar_assertion;
531 (void)same_scalar_assertion;
534 return Teuchos::rcp(
new PCESolverAdapter<ST,LO,GO,D,ConcreteSolver>(A, X, B) );
541 template <
template <
class,
class>
class ConcreteSolver,
543 struct solver_supports_scalar<ConcreteSolver,
Sacado::UQ::PCE<Storage> > {
546 typedef typename solver_traits<ConcreteSolver>::supported_scalars supported_scalars;
547 static const bool value =
548 Meta::if_then_else<Meta::is_same<supported_scalars, Meta::nil_t>::value,
550 Meta::type_list_contains<supported_scalars,
551 BaseScalar> >::type::value;
558 #endif // AMESOS2_SOLVER_UQ_PCE_HPP
Stokhos::StandardStorage< int, double > Storage
const IndexType const IndexType const IndexType const IndexType const ValueType const ValueType * x
Teuchos::RCP< const Tpetra::MultiVector< typename Storage::value_type, LocalOrdinal, GlobalOrdinal, Node > > create_flat_vector_view(const Tpetra::MultiVector< Sacado::MP::Vector< Storage >, LocalOrdinal, GlobalOrdinal, Node > &vec_const, const Teuchos::RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &flat_map)
KokkosClassic::DefaultNode::DefaultNodeType Node
KOKKOS_INLINE_FUNCTION constexpr std::enable_if< is_view_uq_pce< View< T, P... > >::value, unsigned >::type dimension_scalar(const View< T, P... > &view)
Teuchos::RCP< Tpetra::CrsMatrix< typename Storage::value_type, LocalOrdinal, GlobalOrdinal, Node > > create_flat_matrix(const Tpetra::CrsMatrix< Sacado::MP::Vector< Storage >, LocalOrdinal, GlobalOrdinal, Node > &mat, const Teuchos::RCP< const Tpetra::CrsGraph< LocalOrdinal, GlobalOrdinal, Node > > &flat_graph, const LocalOrdinal block_size)
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)