Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_IntegratorPseudoTransientAdjointSensitivity_impl.hpp
Go to the documentation of this file.
1//@HEADER
2// *****************************************************************************
3// Tempus: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
11#define Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
12
13#include "Thyra_DefaultMultiVectorProductVector.hpp"
14#include "Thyra_VectorStdOps.hpp"
15#include "Thyra_MultiVectorStdOps.hpp"
17
19
20namespace Tempus {
21
22template <class Scalar>
25 Teuchos::RCP<Teuchos::ParameterList> inputPL,
26 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
27 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>&
28 adjoint_residual_model,
29 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_solve_model)
30{
31 model_ = model;
32 adjoint_residual_model_ = adjoint_residual_model;
33 adjoint_solve_model_ = adjoint_solve_model;
36 adjoint_solve_model_, inputPL);
42}
43
44template <class Scalar>
47 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
48 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>&
49 adjoint_residual_model,
50 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_solve_model,
51 std::string stepperType)
52{
53 model_ = model;
54 adjoint_residual_model_ = adjoint_residual_model;
55 adjoint_solve_model_ = adjoint_solve_model;
58 adjoint_solve_model_, Teuchos::null);
63}
64
65template <class Scalar>
68 Teuchos::RCP<Teuchos::ParameterList> inputPL,
69 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
70 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_model)
71 : IntegratorPseudoTransientAdjointSensitivity(inputPL, model, adjoint_model,
72 adjoint_model)
73{
74}
75
76template <class Scalar>
79 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
80 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_model,
81 std::string stepperType)
83 adjoint_model, stepperType)
84{
85}
86
87template <class Scalar>
90 Teuchos::RCP<Teuchos::ParameterList> inputPL,
91 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model)
93 inputPL, model, Thyra::implicitAdjointModelEvaluator(model))
94{
95}
96
97template <class Scalar>
100 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
101 std::string stepperType)
103 model, Thyra::implicitAdjointModelEvaluator(model), stepperType)
104{
105}
106
107template <class Scalar>
115
116template <class Scalar>
118{
119 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
120 return advanceTime(tfinal);
121}
122
123template <class Scalar>
125 const Scalar timeFinal)
126{
127 TEMPUS_FUNC_TIME_MONITOR_DIFF(
128 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime()",
129 TEMPUS_PTAS_AT);
130
131 using Teuchos::RCP;
132 using Thyra::VectorBase;
133 typedef Thyra::ModelEvaluatorBase MEB;
134
135 bool state_status = true;
137 TEMPUS_FUNC_TIME_MONITOR_DIFF(
138 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
139 "state",
140 TEMPUS_PTAS_AT_FWD);
141
142 // Run state integrator and get solution
144 state_status = state_integrator_->advanceTime(timeFinal);
145 }
146
147 bool sens_status = true;
149 TEMPUS_FUNC_TIME_MONITOR_DIFF(
150 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
151 "adjoint",
152 TEMPUS_PTAS_AT_ADJ);
153
154 // For at least some time-stepping methods, the time of the last time step
155 // may not be timeFinal (e.g., it may be greater by at most delta_t).
156 // But since the adjoint model requires timeFinal in its formulation, reset
157 // it to the achieved final time.
158 sens_model_->setFinalTime(state_integrator_->getTime());
159
160 // Set solution in sensitivity ME
161 sens_model_->setForwardSolutionHistory(
162 state_integrator_->getSolutionHistory());
163
164 // Run sensitivity integrator
166 sens_status = sens_integrator_->advanceTime(timeFinal);
167
168 // Compute final dg/dp, g which is computed by response 0, 1 of the adjoint
169 // model evaluator
170 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
171 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
172 inargs.set_t(sens_integrator_->getTime());
173 inargs.set_x(sens_integrator_->getX());
174 if (inargs.supports(MEB::IN_ARG_x_dot))
175 inargs.set_x_dot(sens_integrator_->getXDot());
176 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
177 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
178 RCP<VectorBase<Scalar>> G = dgdp_;
179 if (G == Teuchos::null) {
180 G = Thyra::createMember(sens_model_->get_g_space(0));
181 dgdp_ = Teuchos::rcp_dynamic_cast<DMVPV>(G);
182 }
183 if (g_ == Teuchos::null)
184 g_ = Thyra::createMember(sens_model_->get_g_space(1));
185 outargs.set_g(0, G);
186 outargs.set_g(1, g_);
187 sens_model_->evalModel(inargs, outargs);
188
190 }
191
192 return state_status && sens_status;
193}
194
195template <class Scalar>
197{
198 return solutionHistory_->getCurrentTime();
199}
200
201template <class Scalar>
203{
204 return solutionHistory_->getCurrentIndex();
205}
206
207template <class Scalar>
209{
210 Status state_status = state_integrator_->getStatus();
211 Status sens_status = sens_integrator_->getStatus();
212 if (state_status == FAILED || sens_status == FAILED) return FAILED;
213 if (state_status == WORKING || sens_status == WORKING) return WORKING;
214 return PASSED;
215}
216
217template <class Scalar>
219 const Status st)
220{
221 state_integrator_->setStatus(st);
222 sens_integrator_->setStatus(st);
223}
224
225template <class Scalar>
226Teuchos::RCP<Stepper<Scalar>>
231
232template <class Scalar>
233Teuchos::RCP<Stepper<Scalar>>
238
239template <class Scalar>
240Teuchos::RCP<Stepper<Scalar>>
245
246template <class Scalar>
247Teuchos::RCP<const SolutionHistory<Scalar>>
252
253template <class Scalar>
254Teuchos::RCP<const SolutionHistory<Scalar>>
260
261template <class Scalar>
262Teuchos::RCP<const SolutionHistory<Scalar>>
268
269template <class Scalar>
270Teuchos::RCP<SolutionHistory<Scalar>>
273{
274 return solutionHistory_;
275}
276
277template <class Scalar>
278Teuchos::RCP<const TimeStepControl<Scalar>>
283
284template <class Scalar>
285Teuchos::RCP<TimeStepControl<Scalar>>
288{
289 return state_integrator_->getNonConstTimeStepControl();
290}
291
292template <class Scalar>
293Teuchos::RCP<TimeStepControl<Scalar>>
296{
297 return state_integrator_->getNonConstTimeStepControl();
298}
299
300template <class Scalar>
301Teuchos::RCP<TimeStepControl<Scalar>>
304{
305 return sens_integrator_->getNonConstTimeStepControl();
306}
307
308template <class Scalar>
309Teuchos::RCP<IntegratorObserver<Scalar>>
314
315template <class Scalar>
317 Teuchos::RCP<IntegratorObserver<Scalar>> obs)
318{
319 state_integrator_->setObserver(obs);
320 sens_integrator_->setObserver(obs);
321}
322
323template <class Scalar>
326 Scalar t0, Teuchos::RCP<const Thyra::VectorBase<Scalar>> x0,
327 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdot0,
328 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdotdot0,
329 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> y0,
330 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> ydot0,
331 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> ydotdot0)
332{
333 using Teuchos::RCP;
334 using Teuchos::rcp_dynamic_cast;
335 using Thyra::assign;
336 using Thyra::createMember;
337 using Thyra::VectorSpaceBase;
338
339 //
340 // Create and initialize product X, Xdot, Xdotdot
341
342 RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
343 RCP<DMVPV> Y = rcp_dynamic_cast<DMVPV>(createMember(space));
344 RCP<DMVPV> Ydot = rcp_dynamic_cast<DMVPV>(createMember(space));
345 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
346 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
347
348 // y
349 if (y0 == Teuchos::null)
350 assign(Y->getNonconstMultiVector().ptr(), zero);
351 else
352 assign(Y->getNonconstMultiVector().ptr(), *y0);
353
354 // ydot
355 if (ydot0 == Teuchos::null)
356 assign(Ydot->getNonconstMultiVector().ptr(), zero);
357 else
358 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
359
360 // ydotdot
361 if (ydotdot0 == Teuchos::null)
362 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
363 else
364 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
365
366 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
367 sens_integrator_->initializeSolutionHistory(t0, Y, Ydot, Ydotdot);
368}
369
370template <class Scalar>
371Teuchos::RCP<const Thyra::VectorBase<Scalar>>
376
377template <class Scalar>
378Teuchos::RCP<const Thyra::VectorBase<Scalar>>
383
384template <class Scalar>
385Teuchos::RCP<const Thyra::VectorBase<Scalar>>
390
391template <class Scalar>
392Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
394{
395 using Teuchos::RCP;
396 using Teuchos::rcp_dynamic_cast;
397 RCP<const DMVPV> mvpv =
398 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX());
399 return mvpv->getMultiVector();
400}
401
402template <class Scalar>
403Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
405{
406 using Teuchos::RCP;
407 using Teuchos::rcp_dynamic_cast;
408 RCP<const DMVPV> mvpv =
409 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDot());
410 return mvpv->getMultiVector();
411}
412
413template <class Scalar>
414Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
416{
417 using Teuchos::RCP;
418 using Teuchos::rcp_dynamic_cast;
419 RCP<const DMVPV> mvpv =
420 rcp_dynamic_cast<const DMVPV>(sens_integrator_->getXDotDot());
421 return mvpv->getMultiVector();
422}
423
424template <class Scalar>
425Teuchos::RCP<const Thyra::VectorBase<Scalar>>
430
431template <class Scalar>
432Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
434{
435 return dgdp_->getMultiVector();
436}
437
438template <class Scalar>
440 const
441{
442 std::string name = "Tempus::IntegratorPseudoTransientAdjointSensitivity";
443 return (name);
444}
445
446template <class Scalar>
448 Teuchos::FancyOStream& out, const Teuchos::EVerbosityLevel verbLevel) const
449{
450 auto l_out = Teuchos::fancyOStream(out.getOStream());
451 Teuchos::OSTab ostab(*l_out, 2, this->description());
452 l_out->setOutputToRootOnly(0);
453
454 *l_out << description() << "::describe" << std::endl;
455 state_integrator_->describe(*l_out, verbLevel);
456 sens_integrator_->describe(*l_out, verbLevel);
457}
458
459template <class Scalar>
461 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
462{
463 // IntegratorBasic is no longer a Teuchos::ParameterListAcceptor.
464 // Since setting the ParameterList is essentially a complete reset,
465 // we will rebuild from scratch and reuse the ModelEvaluator.
466 auto model = Teuchos::rcp_const_cast<Thyra::ModelEvaluator<Scalar>>(
467 state_integrator_->getStepper()->getModel());
468 auto tmp_state_integrator = createIntegratorBasic<Scalar>(inputPL, model);
469 state_integrator_->copy(tmp_state_integrator);
470
471 model = Teuchos::rcp_const_cast<Thyra::ModelEvaluator<Scalar>>(
472 sens_integrator_->getStepper()->getModel());
473 auto tmp_sens_integrator =
475 sens_integrator_->copy(tmp_sens_integrator);
476}
477
478template <class Scalar>
479Teuchos::RCP<Teuchos::ParameterList>
481 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
482{
483 // The adjoint integrator uses a copy of the parameters, without the objects
484 // of the forward problem that the nonlinear solver of the forward stepper
485 // stores in them (e.g., for NOX row sum scaling), which do not apply to the
486 // adjoint problem (see removeIntegratorSolverObjects).
487 if (inputPL == Teuchos::null) return inputPL;
488 auto adjointPL = Teuchos::rcp(new Teuchos::ParameterList(*inputPL));
490 return adjointPL;
491}
492
493template <class Scalar>
494Teuchos::RCP<Teuchos::ParameterList>
496{
497 // IntegratorBasic is no longer a Teuchos::ParameterListAcceptor.
498 // We will treat unsetting the ParameterList as a reset to default
499 // settings, and reuse the ModelEvaluator.
500 auto tmp_state_integrator = createIntegratorBasic<Scalar>();
501 auto model = state_integrator_->getStepper()->getModel();
502 tmp_state_integrator->setModel(model);
503 state_integrator_->copy(tmp_state_integrator);
504
505 auto tmp_sens_integrator = createIntegratorBasic<Scalar>();
506 model = sens_integrator_->getStepper()->getModel();
507 tmp_sens_integrator->setModel(model);
508 sens_integrator_->copy(tmp_sens_integrator);
509
510 auto pl = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
511 sens_integrator_->getValidParameters());
512 return pl;
513}
514
515template <class Scalar>
516Teuchos::RCP<const Teuchos::ParameterList>
518{
519 Teuchos::RCP<Teuchos::ParameterList> pl =
520 Teuchos::rcp(new Teuchos::ParameterList);
521 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
522 state_integrator_->getValidParameters();
523 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
525 pl->setParameters(*integrator_pl);
526 pl->sublist("Sensitivities").setParameters(*sensitivity_pl);
527
528 return pl;
529}
530
531template <class Scalar>
532Teuchos::RCP<Teuchos::ParameterList>
534{
535 auto pl = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
536 state_integrator_->getValidParameters());
537 return pl;
538}
539
540template <class Scalar>
546
547template <class Scalar>
548Teuchos::RCP<AdjointSensitivityModelEvaluator<Scalar>>
550 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
551 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_residual_model,
552 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& /*adjoint_solve_model*/,
553 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
554{
555 using Teuchos::rcp;
556
557 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
558 if (inputPL != Teuchos::null) {
559 *pl = inputPL->sublist("Sensitivities");
560 }
561 const Scalar tinit = state_integrator_->getTimeStepControl()->getInitTime();
562 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
564 model, adjoint_residual_model, adjoint_solve_model_, tinit, tfinal, true,
565 pl));
566}
567
568template <class Scalar>
570{
571 using Teuchos::ParameterList;
572 using Teuchos::RCP;
573 using Teuchos::rcp;
574 using Teuchos::rcp_dynamic_cast;
575 using Thyra::assign;
576 using Thyra::defaultProductVector;
577 using Thyra::VectorBase;
578 using Thyra::VectorSpaceBase;
579 typedef Thyra::DefaultProductVector<Scalar> DPV;
580 typedef Thyra::DefaultProductVectorSpace<Scalar> DPVS;
581
582 // Create combined solution histories, first for the states with zero
583 // adjoint and then for the adjoint with frozen states
584 auto shPL = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
585 state_integrator_->getSolutionHistory()->getValidParameters());
587
588 RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
589 RCP<const VectorSpaceBase<Scalar>> adjoint_space = sens_model_->get_x_space();
590 Teuchos::Array<RCP<const VectorSpaceBase<Scalar>>> spaces(2);
591 spaces[0] = x_space;
592 spaces[1] = adjoint_space;
593 RCP<const DPVS> prod_space = Thyra::productVectorSpace(spaces());
594 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
595
596 RCP<const SolutionHistory<Scalar>> state_solution_history =
597 state_integrator_->getSolutionHistory();
598 int num_states = state_solution_history->getNumStates();
599 for (int i = 0; i < num_states; ++i) {
600 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
601
602 // X
603 RCP<DPV> x = defaultProductVector(prod_space);
604 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
605 assign(x->getNonconstVectorBlock(1).ptr(), zero);
606 RCP<VectorBase<Scalar>> x_b = x;
607
608 // X-Dot
609 RCP<VectorBase<Scalar>> x_dot_b;
610 if (state->getXDot() != Teuchos::null) {
611 RCP<DPV> x_dot = defaultProductVector(prod_space);
612 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
613 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
614 x_dot_b = x_dot;
615 }
616
617 // X-Dot-Dot
618 RCP<VectorBase<Scalar>> x_dot_dot_b;
619 if (state->getXDotDot() != Teuchos::null) {
620 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
621 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),
622 *(state->getXDotDot()));
623 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
624 x_dot_dot_b = x_dot_dot;
625 }
626
627 RCP<SolutionState<Scalar>> prod_state = state->clone();
628 prod_state->setX(x_b);
629 prod_state->setXDot(x_dot_b);
630 prod_state->setXDotDot(x_dot_dot_b);
631 solutionHistory_->addState(prod_state);
632 }
633
634 RCP<const VectorBase<Scalar>> frozen_x =
635 state_solution_history->getCurrentState()->getX();
636 RCP<const VectorBase<Scalar>> frozen_x_dot =
637 state_solution_history->getCurrentState()->getXDot();
638 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
639 state_solution_history->getCurrentState()->getXDotDot();
640 RCP<const SolutionHistory<Scalar>> sens_solution_history =
641 sens_integrator_->getSolutionHistory();
642 num_states = sens_solution_history->getNumStates();
643 for (int i = 0; i < num_states; ++i) {
644 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
645
646 // X
647 RCP<DPV> x = defaultProductVector(prod_space);
648 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
649 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
650 RCP<VectorBase<Scalar>> x_b = x;
651
652 // X-Dot
653 RCP<VectorBase<Scalar>> x_dot_b;
654 if (state->getXDot() != Teuchos::null) {
655 RCP<DPV> x_dot = defaultProductVector(prod_space);
656 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
657 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
658 x_dot_b = x_dot;
659 }
660
661 // X-Dot-Dot
662 RCP<VectorBase<Scalar>> x_dot_dot_b;
663 if (state->getXDotDot() != Teuchos::null) {
664 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
665 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
666 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),
667 *(state->getXDotDot()));
668 x_dot_dot_b = x_dot_dot;
669 }
670
671 RCP<SolutionState<Scalar>> prod_state = state->clone();
672 prod_state->setX(x_b);
673 prod_state->setXDot(x_dot_b);
674 prod_state->setXDotDot(x_dot_dot_b);
675 solutionHistory_->addState(prod_state, false);
676 }
677}
678
680template <class Scalar>
681Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
683 Teuchos::RCP<Teuchos::ParameterList> pList,
684 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model)
685{
686 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
688 pList, model));
689 return (integrator);
690}
691
693template <class Scalar>
694Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
696 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
697 std::string stepperType)
698{
699 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
701 model, stepperType));
702 return (integrator);
703}
704
706template <class Scalar>
707Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
709 Teuchos::RCP<Teuchos::ParameterList> pList,
710 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
711 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_model)
712{
713 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
715 pList, model, adjoint_model));
716 return (integrator);
717}
718
720template <class Scalar>
721Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
723 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
724 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_model,
725 std::string stepperType)
726{
727 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
729 model, adjoint_model, stepperType));
730 return (integrator);
731}
732
734template <class Scalar>
735Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
737 Teuchos::RCP<Teuchos::ParameterList> pList,
738 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
739 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_residual_model,
740 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_solve_model)
741{
742 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
744 pList, model, adjoint_residual_model, adjoint_solve_model));
745 return (integrator);
746}
747
749template <class Scalar>
750Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
752 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& model,
753 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_residual_model,
754 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>>& adjoint_solve_model,
755 std::string stepperType)
756{
757 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
759 model, adjoint_residual_model, adjoint_solve_model, stepperType));
760 return (integrator);
761}
762
764template <class Scalar>
765Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
767{
768 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
770 return (integrator);
771}
772
773} // namespace Tempus
774#endif // Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
ModelEvaluator for forming adjoint sensitivity equations.
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
IntegratorObserver class for time integrators.
Time integrator suitable for pseudotransient adjoint sensitivity analysis.
virtual Teuchos::RCP< SolutionHistory< Scalar > > getNonConstSolutionHistory() override
Get the SolutionHistory.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getY() const
Get the current adjoint solution, y.
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDot() const
Get the current time derivative of the adjoint solution, ydot.
Teuchos::RCP< AdjointSensitivityModelEvaluator< Scalar > > createSensitivityModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_residual_model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_solve_model, const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get the current second time derivative of the solution, xdotdot.
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
IntegratorPseudoTransientAdjointSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_residual_model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_solve_model)
Constructor with ParameterList and model, and will be fully initialized.
virtual void initializeSolutionHistory(Scalar t0, Teuchos::RCP< const Thyra::VectorBase< Scalar > > x0, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xdot0=Teuchos::null, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xdotdot0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > y0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > ydot0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > ydotdot0=Teuchos::null)
Set the initial state from Thyra::VectorBase(s).
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get the current time derivative of the solution, xdot.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl) override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return adjoint sensitivity stored in gradient format.
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get the current solution, x.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDotDot() const
Get the current second time derivative of the adjoint solution, ydotdot.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
static Teuchos::RCP< Teuchos::ParameterList > adjointParameters(const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Status
Status for the Integrator, the Stepper and the SolutionState.
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryPL(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember constructor from a ParameterList.
Teuchos::RCP< IntegratorBasic< Scalar > > createIntegratorBasic()
Nonmember constructor.
void removeIntegratorSolverObjects(Teuchos::ParameterList &tempusPL)
Same as removeStepperSolverObjects, for the stepper of the integrator selected by Tempus parameters (...
Teuchos::RCP< Tempus::IntegratorPseudoTransientAdjointSensitivity< Scalar > > integratorPseudoTransientAdjointSensitivity()
Nonmember constructor.