9 #ifndef TEMPUS_CDR_MODEL_TPETRA_IMPL_HPP
10 #define TEMPUS_CDR_MODEL_TPETRA_IMPL_HPP
15 #include "Kokkos_Core_fwd.hpp"
16 #include "Teuchos_Assert.hpp"
17 #include "Thyra_DefaultSerialDenseLinearOpWithSolveFactory.hpp"
18 #include "Thyra_DefaultSpmdVectorSpace.hpp"
19 #include "Thyra_DetachedMultiVectorView.hpp"
20 #include "Thyra_DetachedVectorView.hpp"
21 #include "Thyra_MultiVectorStdOps.hpp"
22 #include "Thyra_PreconditionerBase.hpp"
23 #include "Thyra_VectorStdOps.hpp"
26 #include "Thyra_TpetraLinearOp.hpp"
27 #include "Thyra_TpetraThyraWrappers.hpp"
28 #include "Tpetra_CrsGraph_def.hpp"
29 #include "Tpetra_CrsMatrix_def.hpp"
30 #include "Tpetra_Import_def.hpp"
31 #include "Tpetra_Map_def.hpp"
32 #include "Tpetra_Vector_def.hpp"
33 #include "impl/Kokkos_HostThreadTeam.hpp"
36 namespace Tempus_Test {
40 template <
typename SC,
typename LO,
typename GO,
typename Node>
43 const GO numGlobalElements,
const SC zMin,
const SC zMax,
const SC a,
46 numGlobalElements_(numGlobalElements),
51 showGetInvalidArg_(false)
55 using ::Thyra::VectorBase;
62 const auto myRank =
comm_->getRank();
69 if (
comm_->getSize() == 1) {
73 LO overlapNumMyElements;
74 GO overlapGetMinGLobalIndex;
75 overlapNumMyElements =
xOwnedMap_->getLocalNumElements() + 2;
76 if ((myRank == 0) || (myRank == (
comm_->getSize() - 1))) {
77 overlapNumMyElements--;
81 overlapGetMinGLobalIndex =
xOwnedMap_->getMinGlobalIndex();
84 overlapGetMinGLobalIndex =
xOwnedMap_->getMinGlobalIndex() - 1;
89 GO getGlobalElement = overlapGetMinGLobalIndex;
90 for (
auto &globalElem : overlapMyGlobalNodes) {
91 globalElem = overlapGetMinGLobalIndex;
109 V_S(
x0_.
ptr(), ST::zero());
119 const auto minGI =
xOwnedMap_->getMinGlobalIndex();
122 Kokkos::parallel_for(
"coords_fill",
xOwnedMap_->getLocalNumElements(),
128 MEB::InArgsSetup<SC> inArgs;
129 inArgs.setModelEvalDescription(this->
description());
130 inArgs.setSupports(MEB::IN_ARG_t);
131 inArgs.setSupports(MEB::IN_ARG_x);
132 inArgs.setSupports(MEB::IN_ARG_beta);
133 inArgs.setSupports(MEB::IN_ARG_x_dot);
134 inArgs.setSupports(MEB::IN_ARG_alpha);
137 MEB::OutArgsSetup<SC> outArgs;
138 outArgs.setModelEvalDescription(this->
description());
139 outArgs.setSupports(MEB::OUT_ARG_f);
140 outArgs.setSupports(MEB::OUT_ARG_W);
141 outArgs.setSupports(MEB::OUT_ARG_W_op);
142 outArgs.setSupports(MEB::OUT_ARG_W_prec);
149 auto x_dot_init = Thyra::createMember(this->
get_x_space());
150 Thyra::put_scalar(SC(0.0), x_dot_init.ptr());
156 template <
typename SC,
typename LO,
typename GO,
typename Node>
161 W_graph->resumeFill();
163 auto overlapNumMyElements =
164 static_cast<LO
>(xGhostedMap_->getLocalNumElements());
167 for (LO elem = 0; elem < overlapNumMyElements - 1; elem++) {
169 for (LO i = 0; i < 2; i++) {
170 auto row = xGhostedMap_->getGlobalElement(elem + i);
173 for (LO j = 0; j < 2; j++) {
175 if (xOwnedMap_->isNodeGlobalElement(row)) {
176 auto colIndex = xGhostedMap_->getGlobalElement(elem + j);
178 W_graph->insertGlobalIndices(row, column);
183 W_graph->fillComplete();
188 template <
typename SC,
typename LO,
typename GO,
typename Node>
196 x0.sv().values()().assign(x0_in);
199 template <
typename SC,
typename LO,
typename GO,
typename Node>
201 bool showGetInvalidArg)
203 showGetInvalidArg_ = showGetInvalidArg;
206 template <
typename SC,
typename LO,
typename GO,
typename Node>
208 const Teuchos::RCP<const ::Thyra::LinearOpWithSolveFactoryBase<SC>>
211 wFactory_ = W_factory;
216 template <
typename SC,
typename LO,
typename GO,
typename Node>
223 template <
typename SC,
typename LO,
typename GO,
typename Node>
230 template <
typename SC,
typename LO,
typename GO,
typename Node>
234 return nominalValues_;
237 template <
typename SC,
typename LO,
typename GO,
typename Node>
241 auto W_factory = this->get_W_factory();
244 is_null(W_factory), std::runtime_error,
245 "W_factory in CDR_Model_Tpetra has a null W_factory!");
247 auto matrix = this->create_W_op();
249 return Thyra::linearOpWithSolve<SC>(*W_factory, matrix);
252 template <
typename SC,
typename LO,
typename GO,
typename Node>
258 return Thyra::tpetraLinearOp<SC, LO, GO, Node>(fSpace_, xSpace_, W_tpetra);
261 template <
typename SC,
typename LO,
typename GO,
typename Node>
265 auto W_op = create_W_op();
268 prec->initializeRight(W_op);
273 template <
typename SC,
typename LO,
typename GO,
typename Node>
280 template <
typename SC,
typename LO,
typename GO,
typename Node>
284 return prototypeInArgs_;
289 template <
typename SC,
typename LO,
typename GO,
typename Node>
293 return prototypeOutArgs_;
296 template <
typename SC,
typename LO,
typename GO,
typename Node>
303 using Teuchos::rcp_dynamic_cast;
308 auto f_out = outArgs.
get_f();
319 f = tpetra_extract::getTpetraVector(outArgs.
get_f());
324 auto W_epetra = tpetra_extract::getTpetraOperator(W_out);
331 auto M_tpetra = tpetra_extract::getTpetraOperator(
332 W_prec_out->getNonconstRightPrecOp());
336 jDiag_->putScalar(0.0);
344 if (comm_->getRank() == 0) {
346 auto xVec = tpetra_extract::getTpetraVector(x);
347 auto xView = xVec->getLocalViewHost(Tpetra::Access::ReadWrite);
355 uPtr_->doImport(*(tpetra_extract::getConstTpetraVector(inArgs.
get_x())),
356 *importer_, Tpetra::INSERT);
363 *(tpetra_extract::getConstTpetraVector(inArgs.
get_x_dot())), *importer_,
368 xPtr_->doImport(*nodeCoordinates_, *importer_, Tpetra::INSERT);
371 auto overlapNumMyElements =
372 static_cast<LO
>(xGhostedMap_->getLocalNumElements());
380 J->setAllToScalar(0.0);
384 M_inv->setAllToScalar(0.0);
389 comm_->getRank(), a_, k_);
390 Kokkos::parallel_for(
"DfDp2EvaluatorFunctor", overlapNumMyElements - 1,
396 const auto beta = inArgs.
get_beta();
400 *J, *xPtr_, *uPtr_, *uDotPtr_, comm_->getRank(), a_, k_, alpha, beta);
403 Kokkos::parallel_for(
"JacobianEvaluatorFunctor", overlapNumMyElements - 1,
411 *M_inv, *xPtr_, *uPtr_, *uDotPtr_, comm_->getRank(), a_, k_, alpha,
415 Kokkos::parallel_for(
"PreconditionerEvaluatorFunctor",
416 overlapNumMyElements - 1, mFunctor);
418 M_inv->fillComplete();
423 auto &diag = *jDiag_;
424 M_inv->getLocalDiagCopy(diag);
425 diag.reciprocal(diag);
427 M_inv->rightScale(diag);
428 M_inv->rightScale(diag);
435 #endif // TEMPUS_CDR_MODEL_TPETRA_IMPL_HPP
Teuchos::RCP< const tpetra_map > xGhostedMap_
Teuchos::RCP<::Thyra::VectorBase< SC > > x0_
void evalModelImpl(const ::Thyra::ModelEvaluatorBase::InArgs< SC > &inArgs, const ::Thyra::ModelEvaluatorBase::OutArgs< SC > &outArgs) const
::Thyra::ModelEvaluatorBase::InArgs< SC > createInArgs() const
bool is_null(const boost::shared_ptr< T > &p)
::Thyra::ModelEvaluatorBase::InArgs< SC > prototypeInArgs_
RCP< const VectorBase< Scalar > > get_x_dot() const
Teuchos::RCP< const ::Thyra::VectorSpaceBase< SC > > xSpace_
Teuchos::RCP< const Tpetra::Import< LO, GO, Node > > importer_
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP<::Thyra::PreconditionerBase< SC > > create_W_prec() const
Evaluation< VectorBase< Scalar > > get_f() const
Tpetra::CrsGraph< LO, GO, Node > tpetra_graph
void set_x0(const Teuchos::ArrayView< const SC > &x0)
Teuchos::RCP< const ::Thyra::VectorSpaceBase< SC > > get_f_space() const
::Thyra::ModelEvaluatorBase::OutArgs< SC > createOutArgsImpl() const
Teuchos::RCP< const ::Thyra::VectorSpaceBase< SC > > get_x_space() const
void set_x(const RCP< const VectorBase< Scalar > > &x)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< const ::Thyra::VectorSpaceBase< SC > > fSpace_
void setShowGetInvalidArgs(bool showGetInvalidArg)
Teuchos::RCP< const tpetra_graph > wGraph_
Tpetra::Vector< SC, LO, GO, Node > tpetra_vec
Teuchos::RCP< Thyra::LinearOpWithSolveBase< double > > create_W() const
virtual std::string description() const
Teuchos::RCP< tpetra_vec > nodeCoordinates_
void set_x_dot(const RCP< const VectorBase< Scalar > > &x_dot)
Teuchos::RCP< const ::Thyra::LinearOpWithSolveFactoryBase< SC > > get_W_factory() const
void set_W_factory(const Teuchos::RCP< const ::Thyra::LinearOpWithSolveFactoryBase< SC >> &W_factory)
Teuchos::RCP< const tpetra_map > xOwnedMap_
bool nonnull(const boost::shared_ptr< T > &p)
Tpetra::Map< LO, GO, Node > tpetra_map
Teuchos::RCP< const tpetra_map > fOwnedMap_
const Teuchos::RCP< const Teuchos::Comm< int > > comm_
RCP< PreconditionerBase< Scalar > > get_W_prec() const
#define TEUCHOS_ASSERT(assertion_test)
::Thyra::ModelEvaluatorBase::InArgs< SC > nominalValues_
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
::Thyra::ModelEvaluatorBase::OutArgs< SC > prototypeOutArgs_
Tpetra::CrsMatrix< SC, LO, GO, Node > tpetra_matrix
RCP< LinearOpBase< Scalar > > get_W_op() const
const int numGlobalElements_
Teuchos::RCP<::Thyra::LinearOpBase< SC > > create_W_op() const
RCP< const VectorBase< Scalar > > get_x() const
virtual Teuchos::RCP< const Tpetra::CrsGraph< LO, GO, Node > > createGraph()
CDR_Model_Tpetra(const Teuchos::RCP< const Teuchos::Comm< int >> &comm, const GO numGlobalElements, const SC zMin, const SC zMax, const SC a, const SC k)
::Thyra::ModelEvaluatorBase::InArgs< SC > getNominalValues() const