11#ifndef __Panzer_ModelEvaluator_impl_hpp__
12#define __Panzer_ModelEvaluator_impl_hpp__
14#include "Teuchos_DefaultComm.hpp"
15#include "Teuchos_ArrayRCP.hpp"
17#include "PanzerDiscFE_config.hpp"
34#include "Thyra_TpetraThyraWrappers.hpp"
35#include "Thyra_SpmdVectorBase.hpp"
36#include "Thyra_DefaultSpmdVector.hpp"
37#include "Thyra_DefaultSpmdVectorSpace.hpp"
38#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
39#include "Thyra_DefaultMultiVectorProductVector.hpp"
40#include "Thyra_MultiVectorStdOps.hpp"
41#include "Thyra_VectorStdOps.hpp"
44#include "Thyra_ProductVectorBase.hpp"
45#include "Thyra_BlockedLinearOpBase.hpp"
46#include "Thyra_TpetraVector.hpp"
47#include "Thyra_TpetraLinearOp.hpp"
48#include "Tpetra_CrsMatrix.hpp"
52template<
typename Scalar>
54ModelEvaluator(
const Teuchos::RCP<panzer::FieldManagerBuilder>& fmb,
57 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
58 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
60 const Teuchos::RCP<panzer::GlobalData>& global_data,
61 bool build_transient_support,
64 , num_me_parameters_(0)
66 , fd_perturb_size_(1e-7)
67 , require_in_args_refresh_(true)
68 , require_out_args_refresh_(true)
69 , responseLibrary_(rLibrary)
70 , global_data_(global_data)
71 , build_transient_support_(build_transient_support)
73 , solverFactory_(solverFactory)
74 , oneTimeDirichletBeta_on_(false)
75 , oneTimeDirichletBeta_(0.0)
76 , build_volume_field_managers_(true)
77 , build_bc_field_managers_(true)
78 , active_evaluation_types_(Sacado::mpl::size<
panzer::
Traits::EvalTypes>::value, true)
79 , write_matrix_count_(0)
83 using Teuchos::rcp_dynamic_cast;
86 using Thyra::createMember;
88 TEUCHOS_ASSERT(
lof_!=Teuchos::null);
91 ae_tm_.buildObjects(builder);
98 RCP<const ThyraObjFactory<Scalar> > tof = rcp_dynamic_cast<const ThyraObjFactory<Scalar> >(lof,
true);
100 x_space_ = tof->getThyraDomainSpace();
101 f_space_ = tof->getThyraRangeSpace();
106 for(std::size_t i=0;i<p_names.size();i++)
114template<
typename Scalar>
118 const Teuchos::RCP<panzer::GlobalData>& global_data,
119 bool build_transient_support,
double t_init)
121 , num_me_parameters_(0)
123 , fd_perturb_size_(1e-7)
124 , require_in_args_refresh_(true)
125 , require_out_args_refresh_(true)
126 , global_data_(global_data)
127 , build_transient_support_(build_transient_support)
129 , solverFactory_(solverFactory)
130 , oneTimeDirichletBeta_on_(false)
131 , oneTimeDirichletBeta_(0.0)
132 , build_volume_field_managers_(true)
133 , build_bc_field_managers_(true)
134 , active_evaluation_types_(Sacado::mpl::size<
panzer::
Traits::EvalTypes>::value, true)
135 , write_matrix_count_(0)
138 using Teuchos::rcp_dynamic_cast;
140 TEUCHOS_ASSERT(
lof_!=Teuchos::null);
147 RCP<const ThyraObjFactory<Scalar> > tof = rcp_dynamic_cast<const ThyraObjFactory<Scalar> >(
lof_,
true);
149 x_space_ = tof->getThyraDomainSpace();
150 f_space_ = tof->getThyraRangeSpace();
160template<
typename Scalar>
164 TEUCHOS_ASSERT(
false);
169template<
typename Scalar>
170Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
177template<
typename Scalar>
178Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
184template<
typename Scalar>
185Teuchos::RCP<const Teuchos::Array<std::string> >
188 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<num_me_parameters_),std::runtime_error,
189 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
191 if (i < Teuchos::as<int>(parameters_.size()))
192 return parameters_[i]->names;
193 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size())) {
194 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
195 int param_index = i-parameters_.size();
196 std::ostringstream ss;
197 ss <<
"TANGENT VECTOR: " << param_index;
198 names->push_back(ss.str());
201 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size())) {
202 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
203 int param_index = i-parameters_.size()-tangent_space_.size();
204 std::ostringstream ss;
205 ss <<
"TIME DERIVATIVE TANGENT VECTOR: " << param_index;
206 names->push_back(ss.str());
210 return Teuchos::null;
213template<
typename Scalar>
214Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
217 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<num_me_parameters_),std::runtime_error,
218 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
220 if (i < Teuchos::as<int>(parameters_.size()))
221 return parameters_[i]->space;
222 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size()))
223 return tangent_space_[i-parameters_.size()];
224 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size()))
225 return tangent_space_[i-parameters_.size()-tangent_space_.size()];
227 return Teuchos::null;
230template<
typename Scalar>
231Teuchos::ArrayView<const std::string>
234 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<Teuchos::as<int>(responses_.size())),std::runtime_error,
235 "panzer::ModelEvaluator::get_g_names: Requested response index out of range.");
237 return Teuchos::ArrayView<const std::string>(&(responses_[i]->name),1);
240template<
typename Scalar>
244 TEUCHOS_ASSERT(i>=0 &&
245 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
247 return responses_[i]->name;
250template<
typename Scalar>
251Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
254 TEUCHOS_ASSERT(i>=0 &&
255 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
257 return responses_[i]->space;
260template<
typename Scalar>
261Thyra::ModelEvaluatorBase::InArgs<Scalar>
264 return getNominalValues();
267template<
typename Scalar>
268Thyra::ModelEvaluatorBase::InArgs<Scalar>
272 using Teuchos::rcp_dynamic_cast;
274 if(require_in_args_refresh_) {
275 typedef Thyra::ModelEvaluatorBase MEB;
282 MEB::InArgsSetup<Scalar> nomInArgs;
283 nomInArgs = nominalValues_;
284 nomInArgs.setSupports(nominalValues_);
287 nomInArgs.set_Np(num_me_parameters_);
288 for(std::size_t p=0;p<parameters_.size();p++) {
290 nomInArgs.set_p(p,parameters_[p]->initial_value);
296 nominalValues_ = nomInArgs;
300 require_in_args_refresh_ =
false;
302 return nominalValues_;
305template<
typename Scalar>
309 typedef Thyra::ModelEvaluatorBase MEB;
315 MEB::InArgsSetup<Scalar> nomInArgs;
316 nomInArgs.setModelEvalDescription(this->description());
317 nomInArgs.setSupports(MEB::IN_ARG_x);
318 Teuchos::RCP<Thyra::VectorBase<Scalar> > x_nom = Thyra::createMember(x_space_);
319 Thyra::assign(x_nom.ptr(),0.0);
320 nomInArgs.set_x(x_nom);
321 if(build_transient_support_) {
322 nomInArgs.setSupports(MEB::IN_ARG_x_dot,
true);
323 nomInArgs.setSupports(MEB::IN_ARG_t,
true);
324 nomInArgs.setSupports(MEB::IN_ARG_alpha,
true);
325 nomInArgs.setSupports(MEB::IN_ARG_beta,
true);
326 nomInArgs.setSupports(MEB::IN_ARG_step_size,
true);
327 nomInArgs.setSupports(MEB::IN_ARG_stage_number,
true);
329 Teuchos::RCP<Thyra::VectorBase<Scalar> > x_dot_nom = Thyra::createMember(x_space_);
330 Thyra::assign(x_dot_nom.ptr(),0.0);
331 nomInArgs.set_x_dot(x_dot_nom);
332 nomInArgs.set_t(t_init_);
333 nomInArgs.set_alpha(0.0);
334 nomInArgs.set_beta(0.0);
336 nomInArgs.set_step_size(0.0);
337 nomInArgs.set_stage_number(1.0);
341 nomInArgs.set_Np(num_me_parameters_);
342 std::size_t v_index = 0;
343 for(std::size_t p=0;p<parameters_.size();p++) {
344 nomInArgs.set_p(p,parameters_[p]->initial_value);
345 if (!parameters_[p]->is_distributed) {
346 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_x = Thyra::createMember(*tangent_space_[v_index]);
347 Thyra::assign(v_nom_x.ptr(),0.0);
348 nomInArgs.set_p(v_index+parameters_.size(),v_nom_x);
349 if (build_transient_support_) {
350 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_xdot = Thyra::createMember(*tangent_space_[v_index]);
351 Thyra::assign(v_nom_xdot.ptr(),0.0);
352 nomInArgs.set_p(v_index+parameters_.size()+tangent_space_.size(),v_nom_xdot);
358 nominalValues_ = nomInArgs;
361template <
typename Scalar>
365 build_volume_field_managers_ = value;
368template <
typename Scalar>
372 build_bc_field_managers_ = value;
375template <
typename Scalar>
377setupModel(
const Teuchos::RCP<panzer::WorksetContainer> & wc,
378 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
379 const std::vector<panzer::BC> & bcs,
384 const Teuchos::ParameterList& closure_models,
385 const Teuchos::ParameterList& user_data,
386 bool writeGraph,
const std::string & graphPrefix,
387 const Teuchos::ParameterList& me_params)
391 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::ModelEvaluator::setupModel()",setupModel);
397 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
399 PANZER_FUNC_TIME_MONITOR_DIFF(
"allocate FieldManagerBuilder",allocFMB);
401 fmb->setActiveEvaluationTypes(active_evaluation_types_);
404 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setWorksetContainer()",setupWorksets);
405 fmb->setWorksetContainer(wc);
407 if (build_volume_field_managers_) {
408 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupVolumeFieldManagers()",setupVolumeFieldManagers);
409 fmb->setupVolumeFieldManagers(physicsBlocks,volume_cm_factory,closure_models,*lof_,user_data);
411 if (build_bc_field_managers_) {
412 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupBCFieldManagers()",setupBCFieldManagers);
413 fmb->setupBCFieldManagers(bcs,physicsBlocks,eqset_factory,bc_cm_factory,bc_factory,closure_models,*lof_,user_data);
418 if (build_volume_field_managers_)
419 fmb->writeVolumeGraphvizDependencyFiles(graphPrefix, physicsBlocks);
420 if (build_bc_field_managers_)
421 fmb->writeBCGraphvizDependencyFiles(graphPrefix+
"BC_");
425 PANZER_FUNC_TIME_MONITOR_DIFF(
"AssemblyEngine_TemplateBuilder::buildObjects()",AETM_BuildObjects);
427 ae_tm_.buildObjects(builder);
435 PANZER_FUNC_TIME_MONITOR_DIFF(
"build response library",buildResponses);
437 responseLibrary_->initialize(wc,lof_->getRangeGlobalIndexer(),lof_);
439 buildResponses(physicsBlocks,eqset_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Responses_");
440 buildDistroParamDfDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DfDp_");
441 buildDistroParamDgDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DgDp_");
444 fd_perturb_size_ = 1.0e-7;
445 if (me_params.isParameter(
"FD Forward Sensitivities"))
446 do_fd_dfdp_ = me_params.get<
bool>(
"FD Forward Sensitivities");
447 if (me_params.isParameter(
"FD Perturbation Size"))
448 fd_perturb_size_ = me_params.get<
double>(
"FD Perturbation Size");
452template <
typename Scalar>
459 using Teuchos::rcp_dynamic_cast;
460 using Teuchos::rcp_const_cast;
461 typedef Thyra::ModelEvaluatorBase MEB;
464 if(Teuchos::is_null(ghostedContainer_)) {
465 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
472 bool is_transient =
false;
473 if (inArgs.supports(MEB::IN_ARG_x_dot ))
474 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
476 if(Teuchos::is_null(xContainer_))
477 xContainer_ = lof_->buildReadOnlyDomainContainer();
478 if(Teuchos::is_null(xdotContainer_) && is_transient)
479 xdotContainer_ = lof_->buildReadOnlyDomainContainer();
481 const RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
482 RCP<const Thyra::VectorBase<Scalar> > x_dot;
485 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
486 "ModelEvaluator was not built with transient support enabled!");
488 ae_inargs.
container_ = lof_->buildLinearObjContainer();
490 ae_inargs.
alpha = 0.0;
491 ae_inargs.
beta = 1.0;
493 if (build_transient_support_) {
494 x_dot = inArgs.get_x_dot();
495 ae_inargs.
alpha = inArgs.get_alpha();
496 ae_inargs.
beta = inArgs.get_beta();
497 ae_inargs.
time = inArgs.get_t();
499 ae_inargs.
step_size= inArgs.get_step_size();
508 int num_param_vecs = parameters_.size();
509 for (
int i=0; i<num_param_vecs; i++) {
511 RCP<const Thyra::VectorBase<Scalar> > paramVec = inArgs.get_p(i);
512 if ( paramVec!=Teuchos::null && !parameters_[i]->is_distributed) {
515 Teuchos::ArrayRCP<const Scalar> p_data;
516 rcp_dynamic_cast<const Thyra::SpmdVectorBase<Scalar> >(paramVec,
true)->getLocalData(Teuchos::ptrFromRef(p_data));
518 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
519 parameters_[i]->scalar_value[j].baseValue = p_data[j];
520 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(parameters_[i]->scalar_value[j].baseValue);
523 else if ( paramVec!=Teuchos::null && parameters_[i]->is_distributed) {
526 std::string key = (*parameters_[i]->names)[0];
527 RCP<GlobalEvaluationData> ged = distrParamGlobalEvaluationData_.getDataObject(key);
529 TEUCHOS_ASSERT(ged!=Teuchos::null);
532 RCP<LOCPair_GlobalEvaluationData> loc_pair_ged = rcp_dynamic_cast<LOCPair_GlobalEvaluationData>(ged);
533 RCP<ReadOnlyVector_GlobalEvaluationData> ro_ged = rcp_dynamic_cast<ReadOnlyVector_GlobalEvaluationData>(ged);
534 if(loc_pair_ged!=Teuchos::null) {
536 RCP<ThyraObjContainer<Scalar> > th_ged = rcp_dynamic_cast<ThyraObjContainer<Scalar> >(loc_pair_ged->getGlobalLOC(),
true);
540 TEUCHOS_ASSERT(ro_ged!=Teuchos::null);
541 ro_ged->setOwnedVector(paramVec);
549 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
550 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
552 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
568 xContainer_->setOwnedVector(x);
573 xdotContainer_->setOwnedVector(x_dot);
583 for (
int i(0); i < num_param_vecs; ++i)
589 if (not parameters_[i]->is_distributed)
591 auto dxdp = rcp_const_cast<VectorBase<Scalar>>
592 (inArgs.get_p(vIndex + num_param_vecs));
593 if (not dxdp.is_null())
597 auto dxdpBlock = rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdp);
598 int numParams(parameters_[i]->scalar_value.size());
599 for (
int j(0); j < numParams; ++j)
601 RCP<ROVGED> dxdpContainer = lof_->buildReadOnlyDomainContainer();
602 dxdpContainer->setOwnedVector(dxdpBlock->getNonconstVectorBlock(j));
603 string name(
"X TANGENT GATHER CONTAINER: " +
604 (*parameters_[i]->names)[j]);
608 if (build_transient_support_)
612 auto dxdotdp = rcp_const_cast<VectorBase<Scalar>>
613 (inArgs.get_p(vIndex + num_param_vecs + tangent_space_.size()));
614 if (not dxdotdp.is_null())
617 rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdotdp);
618 int numParams(parameters_[i]->scalar_value.size());
619 for (
int j(0); j < numParams; ++j)
621 RCP<ROVGED> dxdotdpContainer = lof_->buildReadOnlyDomainContainer();
622 dxdotdpContainer->setOwnedVector(
623 dxdotdpBlock->getNonconstVectorBlock(j));
624 string name(
"DXDT TANGENT GATHER CONTAINER: " +
625 (*parameters_[i]->names)[j]);
638template <
typename Scalar>
639Thyra::ModelEvaluatorBase::OutArgs<Scalar>
642 typedef Thyra::ModelEvaluatorBase MEB;
644 if(require_out_args_refresh_) {
645 MEB::OutArgsSetup<Scalar> outArgs;
646 outArgs.setModelEvalDescription(this->description());
647 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
648 outArgs.setSupports(MEB::OUT_ARG_f);
649 outArgs.setSupports(MEB::OUT_ARG_W_op);
652 for(std::size_t i=0;i<responses_.size();i++) {
656 Teuchos::RCP<panzer::ResponseBase> respJacBase
657 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
658 if(respJacBase!=Teuchos::null) {
660 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp
661 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
664 if(resp->supportsDerivative()) {
665 outArgs.setSupports(MEB::OUT_ARG_DgDx,i,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
668 for(std::size_t p=0;p<parameters_.size();p++) {
669 if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
670 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
671 if(!parameters_[p]->is_distributed)
672 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
679 for(std::size_t p=0;p<parameters_.size();p++) {
681 if(!parameters_[p]->is_distributed)
682 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
683 else if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
684 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
687 prototypeOutArgs_ = outArgs;
691 require_out_args_refresh_ =
false;
693 return prototypeOutArgs_;
696template <
typename Scalar>
697Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
701 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::create_W_op");
702 Teuchos::RCP<const ThyraObjFactory<Scalar> > tof
703 = Teuchos::rcp_dynamic_cast<const ThyraObjFactory<Scalar> >(lof_,
true);
705 return tof->getThyraMatrix();
708template <
typename Scalar>
709Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> >
713 return solverFactory_;
716template <
typename Scalar>
717Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
722 using Teuchos::rcp_dynamic_cast;
724 typedef Thyra::ModelEvaluatorBase MEB;
736 if(require_out_args_refresh_) {
737 this->createOutArgs();
740 TEUCHOS_ASSERT(0<=p && p<Teuchos::as<int>(parameters_.size()));
746 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_LINEAR_OP));
750 RCP<Response_Residual<Traits::Jacobian> > response_jacobian
751 = rcp_dynamic_cast<Response_Residual<Traits::Jacobian> >(po.
dfdp_rl->template getResponse<Traits::Jacobian>(
"RESIDUAL"));
753 return response_jacobian->allocateJacobian();
756 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_MV_BY_COL));
759 return Thyra::createMember(*get_f_space());
763 TEUCHOS_ASSERT(
false);
765 return Teuchos::null;
768template <
typename Scalar>
770addParameter(
const std::string & name,
const Scalar & initialValue)
772 Teuchos::Array<std::string> tmp_names;
773 tmp_names.push_back(name);
775 Teuchos::Array<Scalar> tmp_values;
776 tmp_values.push_back(initialValue);
778 return addParameter(tmp_names,tmp_values);
781template <
typename Scalar>
784 const Teuchos::Array<Scalar> & initialValues)
788 using Teuchos::rcp_dynamic_cast;
789 using Teuchos::ptrFromRef;
791 TEUCHOS_ASSERT(names.size()==initialValues.size());
793 int parameter_index = parameters_.size();
796 RCP<ParameterObject> param = createScalarParameter(names,initialValues);
797 parameters_.push_back(param);
800 RCP< Thyra::VectorSpaceBase<double> > tan_space =
801 Thyra::multiVectorProductVectorSpace(x_space_, param->names->size());
802 tangent_space_.push_back(tan_space);
806 num_me_parameters_ += 2;
807 if (build_transient_support_)
808 ++num_me_parameters_;
810 require_in_args_refresh_ =
true;
811 require_out_args_refresh_ =
true;
812 this->resetDefaultBase();
814 return parameter_index;
817template <
typename Scalar>
821 const Teuchos::RCP<GlobalEvaluationData> & ged,
823 const Teuchos::RCP<const GlobalIndexer> & ugi)
825 distrParamGlobalEvaluationData_.addDataObject(key,ged);
827 int parameter_index = parameters_.size();
828 parameters_.push_back(createDistributedParameter(key,vs,initial,ugi));
829 ++num_me_parameters_;
831 require_in_args_refresh_ =
true;
832 require_out_args_refresh_ =
true;
833 this->resetDefaultBase();
835 return parameter_index;
838template <
typename Scalar>
841 const Teuchos::RCP<GlobalEvaluationData> & ged)
843 nonParamGlobalEvaluationData_.addDataObject(key,ged);
846template <
typename Scalar>
849 const std::vector<WorksetDescriptor> & wkst_desc,
850 const Teuchos::RCP<ResponseMESupportBuilderBase> & builder)
853 builder->setDerivativeInformation(lof_);
855 int respIndex = addResponse(responseName,wkst_desc,*builder);
858 responses_[respIndex]->builder = builder;
864template <
typename Scalar>
870 using Teuchos::ArrayRCP;
871 using Teuchos::Array;
872 using Teuchos::tuple;
873 using Teuchos::rcp_dynamic_cast;
876 if(Teuchos::is_null(ghostedContainer_)) {
877 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
883 ae_inargs.
container_ = lof_->buildLinearObjContainer();
885 ae_inargs.
alpha = 0.0;
886 ae_inargs.
beta = 1.0;
898 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
899 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
901 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
906 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
907 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
908 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
917 thGlobalContainer->set_x_th(x);
920 RCP<panzer::LinearObjContainer> counter
921 = ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
924 RCP<panzer::LinearObjContainer>
result = lof_->buildLinearObjContainer();
927 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(counter)->set_f_th(
928 thGlobalContainer->get_f_th());
931 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(
result)->set_f_th(f);
934 lof_->applyDirichletBCs(*counter,*
result);
937template <
typename Scalar>
940 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
944#ifdef Panzer_BUILD_HESSIAN_SUPPORT
947 setParameters(inArgs);
950 std::string responseName = responses_[respIndex]->name;
951 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
952 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
954 resp->setDerivative(D2gDx2);
961 setupAssemblyInArgs(inArgs,ae_inargs);
963 ae_inargs.
beta = 1.0;
965 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
966 deltaXContainer->setOwnedVector(delta_x);
980 TEUCHOS_ASSERT(
false);
984template <
typename Scalar>
988 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
992#ifdef Panzer_BUILD_HESSIAN_SUPPORT
995 setParameters(inArgs);
998 std::string responseName = responses_[respIndex]->name;
999 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1000 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
1002 resp->setDerivative(D2gDxDp);
1009 setupAssemblyInArgs(inArgs,ae_inargs);
1011 ae_inargs.
beta = 1.0;
1014 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1015 deltaPContainer->setOwnedVector(delta_p);
1030 TEUCHOS_ASSERT(
false);
1034template <
typename Scalar>
1038 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1042#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1045 setParameters(inArgs);
1050 std::string responseName = responses_[respIndex]->name;
1051 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1052 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
1054 resp->setDerivative(D2gDp2);
1061 setupAssemblyInArgs(inArgs,ae_inargs);
1068 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1069 deltaPContainer->setOwnedVector(delta_p);
1084 TEUCHOS_ASSERT(
false);
1088template <
typename Scalar>
1092 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1096#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1099 setParameters(inArgs);
1104 std::string responseName = responses_[respIndex]->name;
1105 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1106 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
1108 resp->setDerivative(D2gDpDx);
1115 setupAssemblyInArgs(inArgs,ae_inargs);
1122 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1123 deltaXContainer->setOwnedVector(delta_x);
1138 TEUCHOS_ASSERT(
false);
1142template <
typename Scalar>
1148#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1151 using Teuchos::ArrayRCP;
1152 using Teuchos::Array;
1153 using Teuchos::tuple;
1154 using Teuchos::rcp_dynamic_cast;
1156 typedef Thyra::ModelEvaluatorBase MEB;
1161 bool is_transient =
false;
1162 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1163 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1166 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1167 "ModelEvaluator was not built with transient support enabled!");
1172 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDx2;
1178 setupAssemblyInArgs(inArgs,ae_inargs);
1180 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1181 deltaXContainer->setOwnedVector(delta_x);
1185 setParameters(inArgs);
1191 if(oneTimeDirichletBeta_on_) {
1195 oneTimeDirichletBeta_on_ =
false;
1199 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1200 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
1201 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1202 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
1205 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDx2)");
1208 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(f_space_);
1209 thGlobalContainer->set_f_th(dummy_f);
1210 thGlobalContainer->set_A_th(W_out);
1213 thGhostedContainer->initializeMatrix(0.0);
1215 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1221 thGlobalContainer->set_A_th(Teuchos::null);
1225 thGlobalContainer->set_x_th(Teuchos::null);
1226 thGlobalContainer->set_dxdt_th(Teuchos::null);
1227 thGlobalContainer->set_f_th(Teuchos::null);
1228 thGlobalContainer->set_A_th(Teuchos::null);
1236 TEUCHOS_ASSERT(
false);
1240template <
typename Scalar>
1243 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1247#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1250 using Teuchos::ArrayRCP;
1251 using Teuchos::Array;
1252 using Teuchos::tuple;
1253 using Teuchos::rcp_dynamic_cast;
1255 typedef Thyra::ModelEvaluatorBase MEB;
1260 bool is_transient =
false;
1261 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1262 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1265 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1266 "ModelEvaluator was not built with transient support enabled!");
1271 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDxDp;
1277 setupAssemblyInArgs(inArgs,ae_inargs);
1281 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1282 deltaPContainer->setOwnedVector(delta_p);
1286 setParameters(inArgs);
1292 if(oneTimeDirichletBeta_on_) {
1296 oneTimeDirichletBeta_on_ =
false;
1300 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1301 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
1302 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1303 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
1306 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDxDp)");
1309 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(f_space_);
1310 thGlobalContainer->set_f_th(dummy_f);
1311 thGlobalContainer->set_A_th(W_out);
1314 thGhostedContainer->initializeMatrix(0.0);
1316 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1322 thGlobalContainer->set_A_th(Teuchos::null);
1326 thGlobalContainer->set_x_th(Teuchos::null);
1327 thGlobalContainer->set_dxdt_th(Teuchos::null);
1328 thGlobalContainer->set_f_th(Teuchos::null);
1329 thGlobalContainer->set_A_th(Teuchos::null);
1338 TEUCHOS_ASSERT(
false);
1342template <
typename Scalar>
1345 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1349#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1351 using Teuchos::rcp_dynamic_cast;
1352 using Teuchos::null;
1355 TEUCHOS_ASSERT(parameters_[pIndex]->is_distributed);
1359 TEUCHOS_ASSERT(parameters_[pIndex]->dfdp_rl!=null);
1364 RCP<Response_Residual<Traits::Hessian> > response_hessian =
1366 response_hessian->setHessian(D2fDpDx);
1371 setupAssemblyInArgs(inArgs,ae_inargs);
1373 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1374 deltaXContainer->setOwnedVector(delta_x);
1389 TEUCHOS_ASSERT(
false);
1393template <
typename Scalar>
1396 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1400#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1402 using Teuchos::rcp_dynamic_cast;
1403 using Teuchos::null;
1406 TEUCHOS_ASSERT(parameters_[pIndex]->is_distributed);
1410 TEUCHOS_ASSERT(parameters_[pIndex]->dfdp_rl!=null);
1415 RCP<Response_Residual<Traits::Hessian> > response_hessian =
1417 response_hessian->setHessian(D2fDp2);
1422 setupAssemblyInArgs(inArgs,ae_inargs);
1424 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1425 deltaPContainer->setOwnedVector(delta_p);
1440 TEUCHOS_ASSERT(
false);
1444template <
typename Scalar>
1446evalModelImpl(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
1447 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1449 evalModelImpl_basic(inArgs,outArgs);
1452 if(required_basic_g(outArgs))
1453 evalModelImpl_basic_g(inArgs,outArgs);
1456 if(required_basic_dgdx(outArgs))
1457 evalModelImpl_basic_dgdx(inArgs,outArgs);
1460 if(required_basic_dgdp_scalar(outArgs))
1461 evalModelImpl_basic_dgdp_scalar(inArgs,outArgs);
1464 if(required_basic_dgdp_distro(outArgs))
1465 evalModelImpl_basic_dgdp_distro(inArgs,outArgs);
1467 if(required_basic_dfdp_scalar(outArgs)) {
1469 evalModelImpl_basic_dfdp_scalar_fd(inArgs,outArgs);
1471 evalModelImpl_basic_dfdp_scalar(inArgs,outArgs);
1474 if(required_basic_dfdp_distro(outArgs))
1475 evalModelImpl_basic_dfdp_distro(inArgs,outArgs);
1478template <
typename Scalar>
1481 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1484 using Teuchos::ArrayRCP;
1485 using Teuchos::Array;
1486 using Teuchos::tuple;
1487 using Teuchos::rcp_dynamic_cast;
1489 typedef Thyra::ModelEvaluatorBase MEB;
1494 bool is_transient =
false;
1495 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1496 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1499 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1500 "ModelEvaluator was not built with transient support enabled!");
1505 const RCP<Thyra::VectorBase<Scalar> > f_out = outArgs.get_f();
1506 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
1509 if(Teuchos::is_null(f_out) && Teuchos::is_null(W_out) ) {
1517 setupAssemblyInArgs(inArgs,ae_inargs);
1520 setParameters(inArgs);
1526 if(oneTimeDirichletBeta_on_) {
1530 oneTimeDirichletBeta_on_ =
false;
1534 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1535 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
1536 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1537 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
1539 if (!Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
1540 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
1546 thGlobalContainer->set_f_th(f_out);
1547 thGlobalContainer->set_A_th(W_out);
1550 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1551 thGhostedContainer->initializeMatrix(0.0);
1553 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1555 else if(!Teuchos::is_null(f_out) && Teuchos::is_null(W_out)) {
1557 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
1562 thGlobalContainer->set_f_th(f_out);
1565 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1567 ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluate(ae_inargs);
1569 else if(Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
1571 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
1577 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(f_space_);
1578 thGlobalContainer->set_f_th(dummy_f);
1579 thGlobalContainer->set_A_th(W_out);
1582 thGhostedContainer->initializeMatrix(0.0);
1584 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1590 thGlobalContainer->set_A_th(Teuchos::null);
1594 thGlobalContainer->set_x_th(Teuchos::null);
1595 thGlobalContainer->set_dxdt_th(Teuchos::null);
1596 thGlobalContainer->set_f_th(Teuchos::null);
1597 thGlobalContainer->set_A_th(Teuchos::null);
1602 const bool writeToFile =
false;
1603 if (writeToFile && nonnull(W_out)) {
1604 const auto check_blocked = Teuchos::rcp_dynamic_cast<::Thyra::BlockedLinearOpBase<double> >(W_out,
false);
1605 if (check_blocked) {
1606 const int numBlocks = check_blocked->productDomain()->numBlocks();
1607 const int rangeBlocks = check_blocked->productRange()->numBlocks();
1608 TEUCHOS_ASSERT(numBlocks == rangeBlocks);
1609 for (
int row=0; row < numBlocks; ++row) {
1610 for (
int col=0; col < numBlocks; ++col) {
1611 using LO = panzer::LocalOrdinal;
1612 using GO = panzer::GlobalOrdinal;
1614 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(check_blocked->getNonconstBlock(row,col),
true);
1615 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1616 tpetraCrsMatrix->print(std::cout);
1617 std::stringstream ss;
1618 ss <<
"W_out_" << write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".block_" << row <<
"_" << col <<
".txt";
1619 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1620 Teuchos::FancyOStream fos(Teuchos::rcpFromRef(fs));
1621 tpetraCrsMatrix->describe(fos,Teuchos::VERB_EXTREME);
1627 using LO = panzer::LocalOrdinal;
1628 using GO = panzer::GlobalOrdinal;
1630 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(W_out,
true);
1631 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1632 tpetraCrsMatrix->print(std::cout);
1633 std::stringstream ss;
1634 ss <<
"W_out_" << write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".txt";
1635 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1636 Teuchos::FancyOStream fos(Teuchos::rcpFromRef(fs));
1637 tpetraCrsMatrix->describe(fos,Teuchos::VERB_EXTREME);
1640 ++write_matrix_count_;
1645template <
typename Scalar>
1648 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1650 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_g()");
1658 setupAssemblyInArgs(inArgs,ae_inargs);
1661 setParameters(inArgs);
1663 for(std::size_t i=0;i<responses_.size();i++) {
1664 Teuchos::RCP<Thyra::VectorBase<Scalar> > vec = outArgs.get_g(i);
1665 if(vec!=Teuchos::null) {
1666 std::string responseName = responses_[i]->name;
1667 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp
1668 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(
1670 resp->setVector(vec);
1682template <
typename Scalar>
1686 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1688 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dgdx()");
1689 typedef Thyra::ModelEvaluatorBase MEB;
1692 TEUCHOS_ASSERT(required_basic_dgdx(outArgs));
1695 setParameters(inArgs);
1697 for(std::size_t i=0;i<responses_.size();i++) {
1699 MEB::Derivative<Scalar> deriv = outArgs.get_DgDx(i);
1703 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1705 if(vec!=Teuchos::null) {
1707 std::string responseName = responses_[i]->name;
1708 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
1709 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> >(
1711 resp->setDerivative(vec);
1719 setupAssemblyInArgs(inArgs,ae_inargs);
1729template <
typename Scalar>
1733 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1735 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dgdp_scalar()");
1738 using Teuchos::rcp_dynamic_cast;
1740 typedef Thyra::ModelEvaluatorBase MEB;
1743 TEUCHOS_ASSERT(required_basic_dgdp_scalar(outArgs));
1746 std::vector<std::string> activeParameterNames;
1747 std::vector<int> activeParameters;
1748 int totalParameterCount = 0;
1749 for(std::size_t j=0; j<parameters_.size(); j++) {
1752 if(parameters_[j]->is_distributed)
1755 bool is_active =
false;
1756 for(std::size_t i=0;i<responses_.size(); i++) {
1758 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(i,j);
1762 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1763 if(vec!=Teuchos::null) {
1765 std::string responseName = responses_[i]->name;
1766 RCP<panzer::ResponseMESupportBase<panzer::Traits::Tangent> > resp =
1767 rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Tangent> >(
1770 if (nonnull(resp)) {
1771 resp->setVector(vec);
1778 for (std::size_t k=0; k<parameters_[j]->scalar_value.size(); k++) {
1779 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[j]->names)[k];
1780 activeParameterNames.push_back(name);
1781 totalParameterCount++;
1783 activeParameters.push_back(j);
1789 setupAssemblyInArgs(inArgs,ae_inargs);
1792 RCP<panzer::GlobalEvaluationData> ged_activeParameters =
1798 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1799 const int j = activeParameters[ap];
1800 for (
unsigned int k=0; k < parameters_[j]->scalar_value.size(); k++) {
1802 p.fastAccessDx(paramIndex) = 1.0;
1803 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1809 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
1812 if(totalParameterCount>0) {
1818template <
typename Scalar>
1822 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1824 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dgdp_distro()");
1825 typedef Thyra::ModelEvaluatorBase MEB;
1828 TEUCHOS_ASSERT(required_basic_dgdp_distro(outArgs));
1834 for(std::size_t p=0;p<parameters_.size();p++) {
1838 if(!parameters_[p]->is_distributed)
1843 for(std::size_t r=0;r<responses_.size();r++) {
1845 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(r,p);
1849 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1851 if(vec!=Teuchos::null) {
1854 std::string responseName = responses_[r]->name;
1855 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
1856 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> >(
1859 resp->setDerivative(vec);
1866 setupAssemblyInArgs(inArgs,ae_inargs);
1878template <
typename Scalar>
1882 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1884 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dfdp_scalar()");
1886 using Teuchos::rcp_dynamic_cast;
1888 typedef Thyra::ModelEvaluatorBase MEB;
1890 TEUCHOS_ASSERT(required_basic_dfdp_scalar(outArgs));
1896 setupAssemblyInArgs(inArgs,ae_inargs);
1902 std::vector<std::string> activeParameters;
1904 int totalParameterCount = 0;
1905 for(std::size_t i=0; i < parameters_.size(); i++) {
1907 if(parameters_[i]->is_distributed)
1911 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1916 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > mVec = deriv.getMultiVector();
1917 TEUCHOS_ASSERT(mVec->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1919 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1922 RCP<LOCPair_GlobalEvaluationData> loc_pair
1924 RCP<LinearObjContainer> globalContainer = loc_pair->getGlobalLOC();
1927 RCP<Thyra::VectorBase<Scalar> > vec = mVec->col(j);
1928 RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1929 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(globalContainer);
1930 thGlobalContainer->set_f_th(vec);
1933 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[i]->names)[j];
1937 activeParameters.push_back(name);
1938 totalParameterCount++;
1946 RCP<GlobalEvaluationData> ged_activeParameters
1955 for(std::size_t i=0; i < parameters_.size(); i++) {
1957 if(parameters_[i]->is_distributed)
1961 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1962 if(deriv.isEmpty()) {
1964 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1966 parameters_[i]->scalar_value[j].baseValue);
1967 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1973 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1975 parameters_[i]->scalar_value[j].baseValue);
1976 p.fastAccessDx(paramIndex) = 1.0;
1977 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1984 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
1989 if(totalParameterCount>0) {
1990 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::ModelEvaluator::evalModel(df/dp)",dfdp_eval);
1995template <
typename Scalar>
1999 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2001 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dfdp_scalar_fd()");
2004 using Teuchos::rcp_dynamic_cast;
2006 typedef Thyra::ModelEvaluatorBase MEB;
2008 TEUCHOS_ASSERT(required_basic_dfdp_scalar(outArgs));
2013 MEB::OutArgs<Scalar> outArgs_base = this->createOutArgs();
2014 if (outArgs.get_f() == Teuchos::null)
2015 outArgs_base.set_f(Thyra::createMember(this->get_f_space()));
2017 outArgs_base.set_f(outArgs.get_f());
2018 outArgs_base.set_W_op(outArgs.get_W_op());
2019 this->evalModel(inArgs, outArgs_base);
2020 RCP<const Thyra::VectorBase<Scalar> > f = outArgs_base.get_f();
2021 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
2022 RCP<const Thyra::VectorBase<Scalar> > x_dot;
2023 if (inArgs.supports(MEB::IN_ARG_x_dot))
2024 x_dot = inArgs.get_x_dot();
2027 RCP<Thyra::VectorBase<Scalar> > fd = Thyra::createMember(this->get_f_space());
2028 MEB::OutArgs<Scalar> outArgs_fd = this->createOutArgs();
2029 outArgs_fd.set_f(fd);
2031 RCP<Thyra::VectorBase<Scalar> > xd = Thyra::createMember(this->get_x_space());
2032 RCP<Thyra::VectorBase<Scalar> > xd_dot;
2033 if (x_dot != Teuchos::null)
2034 xd_dot = Thyra::createMember(this->get_x_space());
2035 MEB::InArgs<Scalar> inArgs_fd = this->createInArgs();
2036 inArgs_fd.setArgs(inArgs);
2037 inArgs_fd.set_x(xd);
2038 if (x_dot != Teuchos::null)
2039 inArgs_fd.set_x_dot(xd_dot);
2041 const double h = fd_perturb_size_;
2042 for(std::size_t i=0; i < parameters_.size(); i++) {
2045 if(parameters_[i]->is_distributed)
2049 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
2054 RCP<Thyra::MultiVectorBase<Scalar> > dfdp = deriv.getMultiVector();
2055 TEUCHOS_ASSERT(dfdp->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
2058 RCP<const Thyra::VectorBase<Scalar> > p = inArgs.get_p(i);
2059 RCP<const Thyra::VectorBase<Scalar> > dx_v = inArgs.get_p(i+parameters_.size());
2060 RCP<const Thyra::MultiVectorBase<Scalar> > dx =
2061 rcp_dynamic_cast<const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_v,
true)->getMultiVector();
2062 RCP<const Thyra::VectorBase<Scalar> > dx_dot_v;
2063 RCP<const Thyra::MultiVectorBase<Scalar> > dx_dot;
2064 if (x_dot != Teuchos::null) {
2065 dx_dot_v =inArgs.get_p(i+parameters_.size()+tangent_space_.size());
2067 rcp_dynamic_cast<const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_dot_v,
true)->getMultiVector();
2071 RCP<Thyra::VectorBase<Scalar> > pd = Thyra::createMember(this->get_p_space(i));
2072 inArgs_fd.set_p(i,pd);
2074 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
2077 Thyra::copy(*p, pd.ptr());
2078 Thyra::set_ele(j, Thyra::get_ele(*p,j)+h, pd.ptr());
2081 Thyra::V_VpStV(xd.ptr(), *x, h, *(dx)->col(j));
2082 if (x_dot != Teuchos::null)
2083 Thyra::V_VpStV(xd_dot.ptr(), *x_dot, h, *(dx_dot)->col(j));
2086 Thyra::assign(fd.ptr(), 0.0);
2087 this->evalModel(inArgs_fd, outArgs_fd);
2090 Thyra::V_StVpStV(dfdp->col(j).ptr(), 1.0/h, *fd, -1.0/h, *f);
2093 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2099template <
typename Scalar>
2103 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2105 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dfdp_distro()");
2107 using Teuchos::rcp_dynamic_cast;
2108 using Teuchos::null;
2110 typedef Thyra::ModelEvaluatorBase MEB;
2112 TEUCHOS_ASSERT(required_basic_dfdp_distro(outArgs));
2118 for(std::size_t p=0;p<parameters_.size();p++) {
2122 if(!parameters_[p]->is_distributed)
2127 if(parameters_[p]->dfdp_rl==null)
2131 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2138 RCP<Response_Residual<Traits::Jacobian> > response_jacobian =
2140 response_jacobian->setJacobian(deriv.getLinearOp());
2145 setupAssemblyInArgs(inArgs,ae_inargs);
2156template <
typename Scalar>
2158required_basic_g(
const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2161 bool activeGArgs =
false;
2162 for(
int i=0;i<outArgs.Ng();i++)
2163 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
2165 return activeGArgs | required_basic_dgdx(outArgs);
2168template <
typename Scalar>
2172 typedef Thyra::ModelEvaluatorBase MEB;
2175 bool activeGArgs =
false;
2176 for(
int i=0;i<outArgs.Ng();i++) {
2178 if(outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
2182 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
2188template <
typename Scalar>
2192 typedef Thyra::ModelEvaluatorBase MEB;
2195 bool activeGArgs =
false;
2196 for(
int i=0;i<outArgs.Ng();i++) {
2197 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2200 if(parameters_[p]->is_distributed)
2204 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2207 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2214template <
typename Scalar>
2218 typedef Thyra::ModelEvaluatorBase MEB;
2221 bool activeGArgs =
false;
2222 for(
int i=0;i<outArgs.Ng();i++) {
2223 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2226 if(!parameters_[p]->is_distributed)
2230 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2233 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2240template <
typename Scalar>
2244 typedef Thyra::ModelEvaluatorBase MEB;
2247 bool activeFPArgs =
false;
2248 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2251 if(parameters_[i]->is_distributed)
2255 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2259 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2262 return activeFPArgs;
2265template <
typename Scalar>
2269 typedef Thyra::ModelEvaluatorBase MEB;
2272 bool activeFPArgs =
false;
2273 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2276 if(!parameters_[i]->is_distributed)
2280 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2284 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2287 return activeFPArgs;
2290template <
typename Scalar>
2293 const Teuchos::RCP<panzer::WorksetContainer> & wc,
2294 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
2295 const std::vector<panzer::BC> & bcs,
2299 const Teuchos::ParameterList& closure_models,
2300 const Teuchos::ParameterList& user_data,
2301 const bool write_graphviz_file,
2302 const std::string& graphviz_file_prefix)
2306 using Teuchos::null;
2312 for(std::size_t p=0;p<parameters_.size();p++) {
2315 if(!parameters_[p]->is_distributed)
2320 if(parameters_[p]->global_indexer==null)
2326 parameters_[p]->global_indexer);
2329 RCP<ResponseLibrary<Traits> > rLibrary
2332 rLibrary->buildResidualResponseEvaluators(physicsBlocks,eqset_factory,bcs,bc_factory,
2333 cm_factory,closure_models,user_data,
2334 write_graphviz_file,graphviz_file_prefix);
2337 parameters_[p]->dfdp_rl = rLibrary;
2341template <
typename Scalar>
2344 const Teuchos::RCP<panzer::WorksetContainer> & wc,
2345 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
2346 const std::vector<panzer::BC>& ,
2350 const Teuchos::ParameterList& closure_models,
2351 const Teuchos::ParameterList& user_data,
2352 const bool write_graphviz_file,
2353 const std::string& graphviz_file_prefix)
2357 using Teuchos::null;
2363 for(std::size_t p=0;p<parameters_.size();p++) {
2366 if(!parameters_[p]->is_distributed)
2371 if(parameters_[p]->global_indexer==null)
2376 RCP<const LinearObjFactory<Traits> > param_lof = parameters_[p]->dfdp_rl->getLinearObjFactory();
2377 RCP<const GlobalIndexer > param_ugi = parameters_[p]->global_indexer;
2380 RCP<ResponseLibrary<Traits> > rLibrary
2385 for(std::size_t r=0;r<responses_.size();r++) {
2387 if(responses_[r]->builder==Teuchos::null)
2392 responses_[r]->builder->setDerivativeInformation(param_lof);
2395 rLibrary->addResponse(responses_[r]->name,
2396 responses_[r]->wkst_desc,
2397 *responses_[r]->builder);
2400 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2401 cm_factory,closure_models,user_data,
2402 write_graphviz_file,graphviz_file_prefix);
2405 parameters_[p]->dgdp_rl = rLibrary;
2409template <
typename Scalar>
2413 oneTimeDirichletBeta_on_ =
true;
2414 oneTimeDirichletBeta_ = beta;
2417template <
typename Scalar>
2418Teuchos::RCP<typename panzer::ModelEvaluator<Scalar>::ParameterObject>
2421 const Teuchos::Array<Scalar> & in_values)
const
2425 using Teuchos::rcp_dynamic_cast;
2426 using Teuchos::ptrFromRef;
2428 TEUCHOS_ASSERT(in_names.size()==in_values.size());
2439 paramObj->names = rcp(
new Teuchos::Array<std::string>(in_names));
2440 paramObj->is_distributed =
false;
2443 for(
int i=0;i<in_names.size();i++)
2451 Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(
2455 Teuchos::ArrayRCP<Scalar> data;
2456 RCP<Thyra::VectorBase<Scalar> > initial_value = Thyra::createMember(paramObj->space);
2457 RCP<Thyra::SpmdVectorBase<Scalar> > vec = rcp_dynamic_cast<Thyra::SpmdVectorBase<Scalar> >(initial_value);
2458 vec->getNonconstLocalData(ptrFromRef(data));
2459 for (
unsigned int i=0; i < paramObj->scalar_value.size(); i++)
2460 data[i] = in_values[i];
2462 paramObj->initial_value = initial_value;
2467template <
typename Scalar>
2468Teuchos::RCP<typename panzer::ModelEvaluator<Scalar>::ParameterObject>
2473 const Teuchos::RCP<const GlobalIndexer> & ugi)
const
2480 paramObj->is_distributed =
true;
2481 paramObj->names = rcp(
new Teuchos::Array<std::string>());
2482 paramObj->names->push_back(key);
2483 paramObj->space = vs;
2484 paramObj->initial_value = initial;
2486 paramObj->global_indexer = ugi;
2491template <
typename Scalar>
2494setParameters(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs)
const
2496 for(std::size_t i=0; i < parameters_.size(); i++) {
2499 if(parameters_[i]->is_distributed)
2503 Teuchos::RCP<const Thyra::VectorBase<Scalar> > p = inArgs.get_p(i);
2504 if (p != Teuchos::null) {
2505 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2506 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2513template <
typename Scalar>
2518 for(std::size_t i=0; i < parameters_.size(); i++) {
2521 if(parameters_[i]->is_distributed)
2525 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2526 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*(parameters_[i]->initial_value),j));
PHX::MDField< ScalarT, panzer::Cell, panzer::IP > result
A field that will be used to build up the result of the integral we're performing.
Builder functor used with Sacado::mpl::TemplateManager to construct one panzer::AssemblyEngine<EvalT>...
std::vector< double > gather_seeds
void addGlobalEvaluationData(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
bool apply_dirichlet_beta
std::string second_sensitivities_name
bool evaluate_transient_terms
Teuchos::RCP< panzer::LinearObjContainer > container_
std::string first_sensitivities_name
A PHX::TemplateManager holding one panzer::ClosureModelFactory<EvalT> per evaluation type in Traits::...
virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void setOneTimeDirichletBeta(const Scalar &beta) const
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, panzer::AssemblyEngineInArgs &ae_inargs) const
void setupModel(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &volume_cm_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &bc_cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, bool writeGraph=false, const std::string &graphPrefix="", const Teuchos::ParameterList &me_params=Teuchos::ParameterList())
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const override
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
void evalModel_D2fDp2(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDp2) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const override
virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
void buildDistroParamDfDp_RL(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const override
void resetParameters() const
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
Teuchos::RCP< ParameterObject > createDistributedParameter(const std::string &key, const Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > &vs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &initial, const Teuchos::RCP< const GlobalIndexer > &ugi) const
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
bool required_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the scalar parameters in the out args?...
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const override
virtual void evalModelImpl_basic_g(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Construct a simple response dicatated by this set of out args.
void evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDx2) const
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const override
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const override
void evalModel_D2fDpDx(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDpDx) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const override
void buildVolumeFieldManagers(const bool value)
virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void evalModel_D2gDxDp(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDxDp) const
int addDistributedParameter(const std::string &name, const Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > &vs, const Teuchos::RCP< GlobalEvaluationData > &ged, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &initial, const Teuchos::RCP< const GlobalIndexer > &ugi=Teuchos::null)
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
int addParameter(const std::string &name, const Scalar &initial)
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const override
const std::string & get_g_name(int i) const
void buildDistroParamDgDp_RL(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int i) const override
Teuchos::ArrayView< const std::string > get_g_names(int i) const override
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const override
int addFlexibleResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const Teuchos::RCP< ResponseMESupportBuilderBase > &builder)
void evalModel_D2gDpDx(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDpDx) const
void buildBCFieldManagers(const bool value)
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > lof_
virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void evalModel_D2fDxDp(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDxDp) const
void evalModel_D2gDx2(int rIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDx2) const
virtual void evalModelImpl_basic(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Evaluate a simple model, meaning a residual and a jacobian, no fancy stochastic galerkin or multipoin...
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const override
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
void evalModel_D2gDp2(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDp2) const
bool required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the distributed parameters in the out args?...
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const override
void addNonParameterGlobalEvaluationData(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
void initializeNominalValues() const
Initialize the nominal values with good starting conditions.
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) const
Teuchos::RCP< ResponseBase > getResponse(const std::string &responseName) const
void evaluate(const panzer::AssemblyEngineInArgs &input_args)
void addResponsesToInArgs(panzer::AssemblyEngineInArgs &input_args) const
Teuchos::RCP< const LinearObjFactory< panzer::Traits > > cloneWithNewDomain(const LinearObjFactory< panzer::Traits > &lof, const Teuchos::RCP< const GlobalIndexer > &dUgi)
Clone a linear object factory, but using a different domain.
Tpetra::KokkosCompat::KokkosDeviceWrapperNode< PHX::Device > TpetraNodeType
The Kokkos node type used to instantiate all Tpetra objects (Map, MultiVector, CrsGraph,...
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
A vector of named scalar parameter entries drawn from a ParamLib, e.g. for use as LOCA continuation/b...
void registerScalarParameter(const std::string name, panzer::ParamLib &pl, double realValue)
Interface for constructing a BCStrategy_TemplateManager.
Allocates and initializes an equation set template manager.
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dfdp_rl
Teuchos::RCP< const GlobalIndexer > global_indexer
Evaluation type for computing second derivatives, using HessianType as the scalar type....
Evaluation type for computing the residual and its Jacobian, using FadType as the scalar type.
Evaluation type for computing the residual only, using RealType as the scalar type.
Evaluation type for computing directional derivatives (e.g. parameter sensitivities),...
Panzer's specialization of the Phalanx traits class.
PANZER_FADTYPE FadType
Sacado forward-mode AD scalar type used for the Jacobian and Tangent evaluation types.