43 #ifndef __Panzer_ModelEvaluator_impl_hpp__ 44 #define __Panzer_ModelEvaluator_impl_hpp__ 46 #include "Teuchos_DefaultComm.hpp" 47 #include "Teuchos_ArrayRCP.hpp" 49 #include "PanzerDiscFE_config.hpp" 67 #include "Thyra_TpetraThyraWrappers.hpp" 68 #include "Thyra_SpmdVectorBase.hpp" 69 #include "Thyra_DefaultSpmdVector.hpp" 70 #include "Thyra_DefaultSpmdVectorSpace.hpp" 71 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp" 72 #include "Thyra_DefaultMultiVectorProductVector.hpp" 73 #include "Thyra_MultiVectorStdOps.hpp" 74 #include "Thyra_VectorStdOps.hpp" 77 #include "Thyra_ProductVectorBase.hpp" 78 #include "Thyra_BlockedLinearOpBase.hpp" 79 #include "Thyra_TpetraVector.hpp" 80 #include "Thyra_TpetraLinearOp.hpp" 81 #include "Tpetra_CrsMatrix.hpp" 85 template<
typename Scalar>
90 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
91 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
93 const Teuchos::RCP<panzer::GlobalData>& global_data,
94 bool build_transient_support,
97 , num_me_parameters_(0)
99 , fd_perturb_size_(1e-7)
100 , require_in_args_refresh_(true)
101 , require_out_args_refresh_(true)
102 , responseLibrary_(rLibrary)
103 , global_data_(global_data)
104 , build_transient_support_(build_transient_support)
106 , solverFactory_(solverFactory)
107 , oneTimeDirichletBeta_on_(false)
108 , oneTimeDirichletBeta_(0.0)
109 , build_volume_field_managers_(true)
110 , build_bc_field_managers_(true)
111 , active_evaluation_types_(Sacado::mpl::size<
panzer::
Traits::EvalTypes>::value, true)
112 , write_matrix_count_(0)
116 using Teuchos::rcp_dynamic_cast;
117 using Teuchos::tuple;
119 using Thyra::createMember;
121 TEUCHOS_ASSERT(
lof_!=Teuchos::null);
124 ae_tm_.buildObjects(builder);
133 x_space_ = tof->getThyraDomainSpace();
134 f_space_ = tof->getThyraRangeSpace();
139 for(std::size_t i=0;i<p_names.size();i++)
147 template<
typename Scalar>
151 const Teuchos::RCP<panzer::GlobalData>& global_data,
152 bool build_transient_support,
double t_init)
154 , num_me_parameters_(0)
156 , fd_perturb_size_(1e-7)
157 , require_in_args_refresh_(true)
158 , require_out_args_refresh_(true)
159 , global_data_(global_data)
160 , build_transient_support_(build_transient_support)
162 , solverFactory_(solverFactory)
163 , oneTimeDirichletBeta_on_(false)
164 , oneTimeDirichletBeta_(0.0)
165 , build_volume_field_managers_(true)
166 , build_bc_field_managers_(true)
167 , active_evaluation_types_(Sacado::mpl::size<
panzer::
Traits::EvalTypes>::value, true)
168 , write_matrix_count_(0)
171 using Teuchos::rcp_dynamic_cast;
173 TEUCHOS_ASSERT(
lof_!=Teuchos::null);
182 x_space_ = tof->getThyraDomainSpace();
183 f_space_ = tof->getThyraRangeSpace();
193 template<
typename Scalar>
197 TEUCHOS_ASSERT(
false);
202 template<
typename Scalar>
203 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
210 template<
typename Scalar>
211 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
217 template<
typename Scalar>
218 Teuchos::RCP<const Teuchos::Array<std::string> >
221 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<num_me_parameters_),std::runtime_error,
222 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
224 if (i < Teuchos::as<int>(parameters_.size()))
225 return parameters_[i]->names;
226 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size())) {
227 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
228 int param_index = i-parameters_.size();
229 std::ostringstream ss;
230 ss <<
"TANGENT VECTOR: " << param_index;
231 names->push_back(ss.str());
234 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size())) {
235 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
236 int param_index = i-parameters_.size()-tangent_space_.size();
237 std::ostringstream ss;
238 ss <<
"TIME DERIVATIVE TANGENT VECTOR: " << param_index;
239 names->push_back(ss.str());
243 return Teuchos::null;
246 template<
typename Scalar>
247 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
250 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<num_me_parameters_),std::runtime_error,
251 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
253 if (i < Teuchos::as<int>(parameters_.size()))
254 return parameters_[i]->space;
255 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size()))
256 return tangent_space_[i-parameters_.size()];
257 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size()))
258 return tangent_space_[i-parameters_.size()-tangent_space_.size()];
260 return Teuchos::null;
263 template<
typename Scalar>
264 Teuchos::ArrayView<const std::string>
267 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<Teuchos::as<int>(responses_.size())),std::runtime_error,
268 "panzer::ModelEvaluator::get_g_names: Requested response index out of range.");
270 return Teuchos::ArrayView<const std::string>(&(responses_[i]->name),1);
273 template<
typename Scalar>
277 TEUCHOS_ASSERT(i>=0 &&
278 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
280 return responses_[i]->name;
283 template<
typename Scalar>
284 Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
287 TEUCHOS_ASSERT(i>=0 &&
288 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
290 return responses_[i]->space;
293 template<
typename Scalar>
294 Thyra::ModelEvaluatorBase::InArgs<Scalar>
297 return getNominalValues();
300 template<
typename Scalar>
301 Thyra::ModelEvaluatorBase::InArgs<Scalar>
305 using Teuchos::rcp_dynamic_cast;
307 if(require_in_args_refresh_) {
308 typedef Thyra::ModelEvaluatorBase MEB;
315 MEB::InArgsSetup<Scalar> nomInArgs;
316 nomInArgs = nominalValues_;
317 nomInArgs.setSupports(nominalValues_);
320 nomInArgs.set_Np(num_me_parameters_);
321 for(std::size_t p=0;p<parameters_.size();p++) {
323 nomInArgs.set_p(p,parameters_[p]->initial_value);
329 nominalValues_ = nomInArgs;
333 require_in_args_refresh_ =
false;
335 return nominalValues_;
338 template<
typename Scalar>
342 typedef Thyra::ModelEvaluatorBase MEB;
348 MEB::InArgsSetup<Scalar> nomInArgs;
349 nomInArgs.setModelEvalDescription(this->description());
350 nomInArgs.setSupports(MEB::IN_ARG_x);
351 Teuchos::RCP<Thyra::VectorBase<Scalar> > x_nom = Thyra::createMember(x_space_);
352 Thyra::assign(x_nom.ptr(),0.0);
353 nomInArgs.set_x(x_nom);
354 if(build_transient_support_) {
355 nomInArgs.setSupports(MEB::IN_ARG_x_dot,
true);
356 nomInArgs.setSupports(MEB::IN_ARG_t,
true);
357 nomInArgs.setSupports(MEB::IN_ARG_alpha,
true);
358 nomInArgs.setSupports(MEB::IN_ARG_beta,
true);
359 nomInArgs.setSupports(MEB::IN_ARG_step_size,
true);
360 nomInArgs.setSupports(MEB::IN_ARG_stage_number,
true);
362 Teuchos::RCP<Thyra::VectorBase<Scalar> > x_dot_nom = Thyra::createMember(x_space_);
363 Thyra::assign(x_dot_nom.ptr(),0.0);
364 nomInArgs.set_x_dot(x_dot_nom);
365 nomInArgs.set_t(t_init_);
366 nomInArgs.set_alpha(0.0);
367 nomInArgs.set_beta(0.0);
369 nomInArgs.set_step_size(0.0);
370 nomInArgs.set_stage_number(1.0);
374 nomInArgs.set_Np(num_me_parameters_);
375 std::size_t v_index = 0;
376 for(std::size_t p=0;p<parameters_.size();p++) {
377 nomInArgs.set_p(p,parameters_[p]->initial_value);
378 if (!parameters_[p]->is_distributed) {
379 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_x = Thyra::createMember(*tangent_space_[v_index]);
380 Thyra::assign(v_nom_x.ptr(),0.0);
381 nomInArgs.set_p(v_index+parameters_.size(),v_nom_x);
382 if (build_transient_support_) {
383 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_xdot = Thyra::createMember(*tangent_space_[v_index]);
384 Thyra::assign(v_nom_xdot.ptr(),0.0);
385 nomInArgs.set_p(v_index+parameters_.size()+tangent_space_.size(),v_nom_xdot);
391 nominalValues_ = nomInArgs;
394 template <
typename Scalar>
398 build_volume_field_managers_ = value;
401 template <
typename Scalar>
405 build_bc_field_managers_ = value;
408 template <
typename Scalar>
410 setupModel(
const Teuchos::RCP<panzer::WorksetContainer> & wc,
411 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
412 const std::vector<panzer::BC> & bcs,
417 const Teuchos::ParameterList& closure_models,
418 const Teuchos::ParameterList& user_data,
419 bool writeGraph,
const std::string & graphPrefix,
420 const Teuchos::ParameterList& me_params)
424 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::ModelEvaluator::setupModel()",setupModel);
430 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
432 PANZER_FUNC_TIME_MONITOR_DIFF(
"allocate FieldManagerBuilder",allocFMB);
434 fmb->setActiveEvaluationTypes(active_evaluation_types_);
437 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setWorksetContainer()",setupWorksets);
438 fmb->setWorksetContainer(wc);
440 if (build_volume_field_managers_) {
441 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupVolumeFieldManagers()",setupVolumeFieldManagers);
442 fmb->setupVolumeFieldManagers(physicsBlocks,volume_cm_factory,closure_models,*lof_,user_data);
444 if (build_bc_field_managers_) {
445 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupBCFieldManagers()",setupBCFieldManagers);
446 fmb->setupBCFieldManagers(bcs,physicsBlocks,eqset_factory,bc_cm_factory,bc_factory,closure_models,*lof_,user_data);
451 if (build_volume_field_managers_)
452 fmb->writeVolumeGraphvizDependencyFiles(graphPrefix, physicsBlocks);
453 if (build_bc_field_managers_)
454 fmb->writeBCGraphvizDependencyFiles(graphPrefix+
"BC_");
458 PANZER_FUNC_TIME_MONITOR_DIFF(
"AssemblyEngine_TemplateBuilder::buildObjects()",AETM_BuildObjects);
460 ae_tm_.buildObjects(builder);
468 PANZER_FUNC_TIME_MONITOR_DIFF(
"build response library",buildResponses);
470 responseLibrary_->initialize(wc,lof_->getRangeGlobalIndexer(),lof_);
472 buildResponses(physicsBlocks,eqset_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Responses_");
473 buildDistroParamDfDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DfDp_");
474 buildDistroParamDgDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DgDp_");
477 fd_perturb_size_ = 1.0e-7;
478 if (me_params.isParameter(
"FD Forward Sensitivities"))
479 do_fd_dfdp_ = me_params.get<
bool>(
"FD Forward Sensitivities");
480 if (me_params.isParameter(
"FD Perturbation Size"))
481 fd_perturb_size_ = me_params.get<
double>(
"FD Perturbation Size");
485 template <
typename Scalar>
492 using Teuchos::rcp_dynamic_cast;
493 using Teuchos::rcp_const_cast;
494 typedef Thyra::ModelEvaluatorBase MEB;
497 if(Teuchos::is_null(ghostedContainer_)) {
498 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
505 bool is_transient =
false;
506 if (inArgs.supports(MEB::IN_ARG_x_dot ))
507 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
509 if(Teuchos::is_null(xContainer_))
510 xContainer_ = lof_->buildReadOnlyDomainContainer();
511 if(Teuchos::is_null(xdotContainer_) && is_transient)
512 xdotContainer_ = lof_->buildReadOnlyDomainContainer();
514 const RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
515 RCP<const Thyra::VectorBase<Scalar> > x_dot;
518 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
519 "ModelEvaluator was not built with transient support enabled!");
521 ae_inargs.
container_ = lof_->buildLinearObjContainer();
523 ae_inargs.
alpha = 0.0;
524 ae_inargs.
beta = 1.0;
526 if (build_transient_support_) {
527 x_dot = inArgs.get_x_dot();
528 ae_inargs.
alpha = inArgs.get_alpha();
529 ae_inargs.
beta = inArgs.get_beta();
530 ae_inargs.
time = inArgs.get_t();
532 ae_inargs.
step_size= inArgs.get_step_size();
541 int num_param_vecs = parameters_.size();
542 for (
int i=0; i<num_param_vecs; i++) {
544 RCP<const Thyra::VectorBase<Scalar> > paramVec = inArgs.get_p(i);
545 if ( paramVec!=Teuchos::null && !parameters_[i]->is_distributed) {
548 Teuchos::ArrayRCP<const Scalar> p_data;
549 rcp_dynamic_cast<
const Thyra::SpmdVectorBase<Scalar> >(paramVec,
true)->getLocalData(Teuchos::ptrFromRef(p_data));
551 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
552 parameters_[i]->scalar_value[j].baseValue = p_data[j];
553 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(parameters_[i]->scalar_value[j].baseValue);
556 else if ( paramVec!=Teuchos::null && parameters_[i]->is_distributed) {
559 std::string key = (*parameters_[i]->names)[0];
560 RCP<GlobalEvaluationData> ged = distrParamGlobalEvaluationData_.getDataObject(key);
562 TEUCHOS_ASSERT(ged!=Teuchos::null);
567 if(loc_pair_ged!=Teuchos::null) {
569 RCP<ThyraObjContainer<Scalar> > th_ged = rcp_dynamic_cast<
ThyraObjContainer<Scalar> >(loc_pair_ged->getGlobalLOC(),
true);
573 TEUCHOS_ASSERT(ro_ged!=Teuchos::null);
574 ro_ged->setOwnedVector(paramVec);
582 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
585 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
601 xContainer_->setOwnedVector(x);
606 xdotContainer_->setOwnedVector(x_dot);
616 for (
int i(0); i < num_param_vecs; ++i)
622 if (not parameters_[i]->is_distributed)
624 auto dxdp = rcp_const_cast<VectorBase<Scalar>>
625 (inArgs.get_p(vIndex + num_param_vecs));
626 if (not dxdp.is_null())
630 auto dxdpBlock = rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdp);
631 int numParams(parameters_[i]->scalar_value.size());
632 for (
int j(0); j < numParams; ++j)
634 RCP<ROVGED> dxdpContainer = lof_->buildReadOnlyDomainContainer();
635 dxdpContainer->
setOwnedVector(dxdpBlock->getNonconstVectorBlock(j));
636 string name(
"X TANGENT GATHER CONTAINER: " +
637 (*parameters_[i]->names)[j]);
641 if (build_transient_support_)
645 auto dxdotdp = rcp_const_cast<VectorBase<Scalar>>
646 (inArgs.get_p(vIndex + num_param_vecs + tangent_space_.size()));
647 if (not dxdotdp.is_null())
650 rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdotdp);
651 int numParams(parameters_[i]->scalar_value.size());
652 for (
int j(0); j < numParams; ++j)
654 RCP<ROVGED> dxdotdpContainer = lof_->buildReadOnlyDomainContainer();
655 dxdotdpContainer->setOwnedVector(
656 dxdotdpBlock->getNonconstVectorBlock(j));
657 string name(
"DXDT TANGENT GATHER CONTAINER: " +
658 (*parameters_[i]->names)[j]);
671 template <
typename Scalar>
672 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
675 typedef Thyra::ModelEvaluatorBase MEB;
677 if(require_out_args_refresh_) {
678 MEB::OutArgsSetup<Scalar> outArgs;
679 outArgs.setModelEvalDescription(this->description());
680 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
681 outArgs.setSupports(MEB::OUT_ARG_f);
682 outArgs.setSupports(MEB::OUT_ARG_W_op);
685 for(std::size_t i=0;i<responses_.size();i++) {
689 Teuchos::RCP<panzer::ResponseBase> respJacBase
690 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
691 if(respJacBase!=Teuchos::null) {
693 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp
697 if(resp->supportsDerivative()) {
698 outArgs.setSupports(MEB::OUT_ARG_DgDx,i,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
701 for(std::size_t p=0;p<parameters_.size();p++) {
702 if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
703 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
704 if(!parameters_[p]->is_distributed)
705 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
712 for(std::size_t p=0;p<parameters_.size();p++) {
714 if(!parameters_[p]->is_distributed)
715 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
716 else if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
717 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
720 prototypeOutArgs_ = outArgs;
724 require_out_args_refresh_ =
false;
726 return prototypeOutArgs_;
729 template <
typename Scalar>
730 Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
734 Teuchos::RCP<const ThyraObjFactory<Scalar> > tof
740 template <
typename Scalar>
741 Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> >
745 return solverFactory_;
748 template <
typename Scalar>
749 Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
754 using Teuchos::rcp_dynamic_cast;
756 typedef Thyra::ModelEvaluatorBase MEB;
768 if(require_out_args_refresh_) {
769 this->createOutArgs();
772 TEUCHOS_ASSERT(0<=p && p<Teuchos::as<int>(parameters_.size()));
778 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_LINEAR_OP));
782 RCP<Response_Residual<Traits::Jacobian> > response_jacobian
785 return response_jacobian->allocateJacobian();
788 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_MV_BY_COL));
791 return Thyra::createMember(*get_f_space());
795 TEUCHOS_ASSERT(
false);
797 return Teuchos::null;
800 template <
typename Scalar>
804 Teuchos::Array<std::string> tmp_names;
805 tmp_names.push_back(name);
807 Teuchos::Array<Scalar> tmp_values;
808 tmp_values.push_back(initialValue);
810 return addParameter(tmp_names,tmp_values);
813 template <
typename Scalar>
816 const Teuchos::Array<Scalar> & initialValues)
820 using Teuchos::rcp_dynamic_cast;
821 using Teuchos::ptrFromRef;
823 TEUCHOS_ASSERT(names.size()==initialValues.size());
825 int parameter_index = parameters_.size();
828 RCP<ParameterObject> param = createScalarParameter(names,initialValues);
829 parameters_.push_back(param);
832 RCP< Thyra::VectorSpaceBase<double> > tan_space =
833 Thyra::multiVectorProductVectorSpace(x_space_, param->names->size());
834 tangent_space_.push_back(tan_space);
838 num_me_parameters_ += 2;
839 if (build_transient_support_)
840 ++num_me_parameters_;
842 require_in_args_refresh_ =
true;
843 require_out_args_refresh_ =
true;
844 this->resetDefaultBase();
846 return parameter_index;
849 template <
typename Scalar>
853 const Teuchos::RCP<GlobalEvaluationData> & ged,
855 const Teuchos::RCP<const GlobalIndexer> & ugi)
857 distrParamGlobalEvaluationData_.addDataObject(key,ged);
859 int parameter_index = parameters_.size();
860 parameters_.push_back(createDistributedParameter(key,vs,initial,ugi));
861 ++num_me_parameters_;
863 require_in_args_refresh_ =
true;
864 require_out_args_refresh_ =
true;
865 this->resetDefaultBase();
867 return parameter_index;
870 template <
typename Scalar>
873 const Teuchos::RCP<GlobalEvaluationData> & ged)
875 nonParamGlobalEvaluationData_.addDataObject(key,ged);
878 template <
typename Scalar>
881 const std::vector<WorksetDescriptor> & wkst_desc,
882 const Teuchos::RCP<ResponseMESupportBuilderBase> & builder)
885 builder->setDerivativeInformation(lof_);
887 int respIndex = addResponse(responseName,wkst_desc,*builder);
890 responses_[respIndex]->builder = builder;
896 template <
typename Scalar>
902 using Teuchos::ArrayRCP;
903 using Teuchos::Array;
904 using Teuchos::tuple;
905 using Teuchos::rcp_dynamic_cast;
908 if(Teuchos::is_null(ghostedContainer_)) {
909 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
915 ae_inargs.
container_ = lof_->buildLinearObjContainer();
917 ae_inargs.
alpha = 0.0;
918 ae_inargs.
beta = 1.0;
930 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
933 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
938 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
940 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
949 thGlobalContainer->set_x_th(x);
952 RCP<panzer::LinearObjContainer> counter
953 = ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
956 RCP<panzer::LinearObjContainer>
result = lof_->buildLinearObjContainer();
960 thGlobalContainer->get_f_th());
966 lof_->applyDirichletBCs(*counter,*
result);
969 template <
typename Scalar>
972 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
976 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 979 setParameters(inArgs);
982 std::string responseName = responses_[respIndex]->name;
983 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
986 resp->setDerivative(D2gDx2);
993 setupAssemblyInArgs(inArgs,ae_inargs);
995 ae_inargs.
beta = 1.0;
997 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
998 deltaXContainer->setOwnedVector(delta_x);
1012 TEUCHOS_ASSERT(
false);
1016 template <
typename Scalar>
1020 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1024 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1027 setParameters(inArgs);
1030 std::string responseName = responses_[respIndex]->name;
1031 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1034 resp->setDerivative(D2gDxDp);
1041 setupAssemblyInArgs(inArgs,ae_inargs);
1043 ae_inargs.
beta = 1.0;
1046 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1047 deltaPContainer->setOwnedVector(delta_p);
1062 TEUCHOS_ASSERT(
false);
1066 template <
typename Scalar>
1070 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1074 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1077 setParameters(inArgs);
1082 std::string responseName = responses_[respIndex]->name;
1083 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1086 resp->setDerivative(D2gDp2);
1093 setupAssemblyInArgs(inArgs,ae_inargs);
1100 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1101 deltaPContainer->setOwnedVector(delta_p);
1116 TEUCHOS_ASSERT(
false);
1120 template <
typename Scalar>
1124 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1128 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1131 setParameters(inArgs);
1136 std::string responseName = responses_[respIndex]->name;
1137 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1140 resp->setDerivative(D2gDpDx);
1147 setupAssemblyInArgs(inArgs,ae_inargs);
1154 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1155 deltaXContainer->setOwnedVector(delta_x);
1170 TEUCHOS_ASSERT(
false);
1174 template <
typename Scalar>
1180 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1183 using Teuchos::ArrayRCP;
1184 using Teuchos::Array;
1185 using Teuchos::tuple;
1186 using Teuchos::rcp_dynamic_cast;
1188 typedef Thyra::ModelEvaluatorBase MEB;
1193 bool is_transient =
false;
1194 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1195 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1198 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1199 "ModelEvaluator was not built with transient support enabled!");
1204 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDx2;
1210 setupAssemblyInArgs(inArgs,ae_inargs);
1212 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1213 deltaXContainer->setOwnedVector(delta_x);
1217 setParameters(inArgs);
1223 if(oneTimeDirichletBeta_on_) {
1227 oneTimeDirichletBeta_on_ =
false;
1231 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1233 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1237 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDx2)");
1240 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(f_space_);
1241 thGlobalContainer->set_f_th(dummy_f);
1242 thGlobalContainer->set_A_th(W_out);
1245 thGhostedContainer->initializeMatrix(0.0);
1247 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1253 thGlobalContainer->set_A_th(Teuchos::null);
1259 thGlobalContainer->set_x_th(Teuchos::null);
1260 thGlobalContainer->set_dxdt_th(Teuchos::null);
1261 thGlobalContainer->set_f_th(Teuchos::null);
1262 thGlobalContainer->set_A_th(Teuchos::null);
1270 TEUCHOS_ASSERT(
false);
1274 template <
typename Scalar>
1277 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1281 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1284 using Teuchos::ArrayRCP;
1285 using Teuchos::Array;
1286 using Teuchos::tuple;
1287 using Teuchos::rcp_dynamic_cast;
1289 typedef Thyra::ModelEvaluatorBase MEB;
1294 bool is_transient =
false;
1295 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1296 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1299 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1300 "ModelEvaluator was not built with transient support enabled!");
1305 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDxDp;
1311 setupAssemblyInArgs(inArgs,ae_inargs);
1315 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1316 deltaPContainer->setOwnedVector(delta_p);
1320 setParameters(inArgs);
1326 if(oneTimeDirichletBeta_on_) {
1330 oneTimeDirichletBeta_on_ =
false;
1334 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1336 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1340 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDxDp)");
1343 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(f_space_);
1344 thGlobalContainer->set_f_th(dummy_f);
1345 thGlobalContainer->set_A_th(W_out);
1348 thGhostedContainer->initializeMatrix(0.0);
1350 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1356 thGlobalContainer->set_A_th(Teuchos::null);
1362 thGlobalContainer->set_x_th(Teuchos::null);
1363 thGlobalContainer->set_dxdt_th(Teuchos::null);
1364 thGlobalContainer->set_f_th(Teuchos::null);
1365 thGlobalContainer->set_A_th(Teuchos::null);
1374 TEUCHOS_ASSERT(
false);
1378 template <
typename Scalar>
1381 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1385 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1387 using Teuchos::rcp_dynamic_cast;
1388 using Teuchos::null;
1391 TEUCHOS_ASSERT(parameters_[pIndex]->is_distributed);
1395 TEUCHOS_ASSERT(parameters_[pIndex]->dfdp_rl!=null);
1400 RCP<Response_Residual<Traits::Hessian> > response_hessian =
1402 response_hessian->setHessian(D2fDpDx);
1407 setupAssemblyInArgs(inArgs,ae_inargs);
1409 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1410 deltaXContainer->setOwnedVector(delta_x);
1425 TEUCHOS_ASSERT(
false);
1429 template <
typename Scalar>
1432 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1436 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1438 using Teuchos::rcp_dynamic_cast;
1439 using Teuchos::null;
1442 TEUCHOS_ASSERT(parameters_[pIndex]->is_distributed);
1446 TEUCHOS_ASSERT(parameters_[pIndex]->dfdp_rl!=null);
1451 RCP<Response_Residual<Traits::Hessian> > response_hessian =
1453 response_hessian->setHessian(D2fDp2);
1458 setupAssemblyInArgs(inArgs,ae_inargs);
1460 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1461 deltaPContainer->setOwnedVector(delta_p);
1476 TEUCHOS_ASSERT(
false);
1480 template <
typename Scalar>
1483 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1485 evalModelImpl_basic(inArgs,outArgs);
1488 if(required_basic_g(outArgs))
1489 evalModelImpl_basic_g(inArgs,outArgs);
1492 if(required_basic_dgdx(outArgs))
1493 evalModelImpl_basic_dgdx(inArgs,outArgs);
1496 if(required_basic_dgdp_scalar(outArgs))
1497 evalModelImpl_basic_dgdp_scalar(inArgs,outArgs);
1500 if(required_basic_dgdp_distro(outArgs))
1501 evalModelImpl_basic_dgdp_distro(inArgs,outArgs);
1503 if(required_basic_dfdp_scalar(outArgs)) {
1505 evalModelImpl_basic_dfdp_scalar_fd(inArgs,outArgs);
1507 evalModelImpl_basic_dfdp_scalar(inArgs,outArgs);
1510 if(required_basic_dfdp_distro(outArgs))
1511 evalModelImpl_basic_dfdp_distro(inArgs,outArgs);
1514 template <
typename Scalar>
1517 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1520 using Teuchos::ArrayRCP;
1521 using Teuchos::Array;
1522 using Teuchos::tuple;
1523 using Teuchos::rcp_dynamic_cast;
1525 typedef Thyra::ModelEvaluatorBase MEB;
1530 bool is_transient =
false;
1531 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1532 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1535 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1536 "ModelEvaluator was not built with transient support enabled!");
1541 const RCP<Thyra::VectorBase<Scalar> > f_out = outArgs.get_f();
1542 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
1545 if(Teuchos::is_null(f_out) && Teuchos::is_null(W_out) ) {
1553 setupAssemblyInArgs(inArgs,ae_inargs);
1556 setParameters(inArgs);
1562 if(oneTimeDirichletBeta_on_) {
1566 oneTimeDirichletBeta_on_ =
false;
1570 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1572 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1575 if (!Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
1576 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
1582 thGlobalContainer->set_f_th(f_out);
1583 thGlobalContainer->set_A_th(W_out);
1586 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1587 thGhostedContainer->initializeMatrix(0.0);
1589 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1591 else if(!Teuchos::is_null(f_out) && Teuchos::is_null(W_out)) {
1593 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
1598 thGlobalContainer->set_f_th(f_out);
1601 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1603 ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluate(ae_inargs);
1605 else if(Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
1607 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
1613 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(f_space_);
1614 thGlobalContainer->set_f_th(dummy_f);
1615 thGlobalContainer->set_A_th(W_out);
1618 thGhostedContainer->initializeMatrix(0.0);
1620 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1626 thGlobalContainer->set_A_th(Teuchos::null);
1632 thGlobalContainer->set_x_th(Teuchos::null);
1633 thGlobalContainer->set_dxdt_th(Teuchos::null);
1634 thGlobalContainer->set_f_th(Teuchos::null);
1635 thGlobalContainer->set_A_th(Teuchos::null);
1640 const bool writeToFile =
false;
1641 if (writeToFile && nonnull(W_out)) {
1643 if (check_blocked) {
1644 const int numBlocks = check_blocked->productDomain()->numBlocks();
1645 const int rangeBlocks = check_blocked->productRange()->numBlocks();
1646 TEUCHOS_ASSERT(numBlocks == rangeBlocks);
1647 for (
int row=0; row < numBlocks; ++row) {
1648 for (
int col=0; col < numBlocks; ++col) {
1649 using LO = panzer::LocalOrdinal;
1650 using GO = panzer::GlobalOrdinal;
1652 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(check_blocked->getNonconstBlock(row,col),
true);
1653 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1654 tpetraCrsMatrix->print(std::cout);
1655 std::stringstream ss;
1656 ss <<
"W_out_" << write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".block_" << row <<
"_" << col <<
".txt";
1657 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1658 Teuchos::FancyOStream fos(Teuchos::rcpFromRef(fs));
1665 using LO = panzer::LocalOrdinal;
1666 using GO = panzer::GlobalOrdinal;
1668 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(W_out,
true);
1669 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1670 tpetraCrsMatrix->print(std::cout);
1671 std::stringstream ss;
1672 ss <<
"W_out_" << write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".txt";
1673 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1674 Teuchos::FancyOStream fos(Teuchos::rcpFromRef(fs));
1678 ++write_matrix_count_;
1683 template <
typename Scalar>
1686 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1695 setupAssemblyInArgs(inArgs,ae_inargs);
1698 setParameters(inArgs);
1700 for(std::size_t i=0;i<responses_.size();i++) {
1701 Teuchos::RCP<Thyra::VectorBase<Scalar> > vec = outArgs.get_g(i);
1702 if(vec!=Teuchos::null) {
1703 std::string responseName = responses_[i]->name;
1704 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp
1707 resp->setVector(vec);
1719 template <
typename Scalar>
1723 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1725 typedef Thyra::ModelEvaluatorBase MEB;
1728 TEUCHOS_ASSERT(required_basic_dgdx(outArgs));
1731 setParameters(inArgs);
1733 for(std::size_t i=0;i<responses_.size();i++) {
1735 MEB::Derivative<Scalar> deriv = outArgs.get_DgDx(i);
1739 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1741 if(vec!=Teuchos::null) {
1743 std::string responseName = responses_[i]->name;
1744 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
1747 resp->setDerivative(vec);
1755 setupAssemblyInArgs(inArgs,ae_inargs);
1765 template <
typename Scalar>
1769 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1773 using Teuchos::rcp_dynamic_cast;
1775 typedef Thyra::ModelEvaluatorBase MEB;
1778 TEUCHOS_ASSERT(required_basic_dgdp_scalar(outArgs));
1781 std::vector<std::string> activeParameterNames;
1782 std::vector<int> activeParameters;
1783 int totalParameterCount = 0;
1784 for(std::size_t j=0; j<parameters_.size(); j++) {
1787 if(parameters_[j]->is_distributed)
1790 bool is_active =
false;
1791 for(std::size_t i=0;i<responses_.size(); i++) {
1793 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(i,j);
1797 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1798 if(vec!=Teuchos::null) {
1800 std::string responseName = responses_[i]->name;
1801 RCP<panzer::ResponseMESupportBase<panzer::Traits::Tangent> > resp =
1804 resp->setVector(vec);
1810 for (std::size_t k=0; k<parameters_[j]->scalar_value.size(); k++) {
1811 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[j]->names)[k];
1812 activeParameterNames.push_back(name);
1813 totalParameterCount++;
1815 activeParameters.push_back(j);
1821 setupAssemblyInArgs(inArgs,ae_inargs);
1824 RCP<panzer::GlobalEvaluationData> ged_activeParameters =
1830 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1831 const int j = activeParameters[ap];
1832 for (
unsigned int k=0; k < parameters_[j]->scalar_value.size(); k++) {
1834 p.fastAccessDx(paramIndex) = 1.0;
1835 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1841 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
1844 if(totalParameterCount>0) {
1850 template <
typename Scalar>
1854 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1856 typedef Thyra::ModelEvaluatorBase MEB;
1859 TEUCHOS_ASSERT(required_basic_dgdp_distro(outArgs));
1865 for(std::size_t p=0;p<parameters_.size();p++) {
1869 if(!parameters_[p]->is_distributed)
1874 for(std::size_t r=0;r<responses_.size();r++) {
1876 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(r,p);
1880 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1882 if(vec!=Teuchos::null) {
1885 std::string responseName = responses_[r]->name;
1886 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
1890 resp->setDerivative(vec);
1897 setupAssemblyInArgs(inArgs,ae_inargs);
1909 template <
typename Scalar>
1913 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1916 using Teuchos::rcp_dynamic_cast;
1918 typedef Thyra::ModelEvaluatorBase MEB;
1920 TEUCHOS_ASSERT(required_basic_dfdp_scalar(outArgs));
1926 setupAssemblyInArgs(inArgs,ae_inargs);
1932 std::vector<std::string> activeParameters;
1934 int totalParameterCount = 0;
1935 for(std::size_t i=0; i < parameters_.size(); i++) {
1937 if(parameters_[i]->is_distributed)
1941 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1946 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > mVec = deriv.getMultiVector();
1947 TEUCHOS_ASSERT(mVec->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1949 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1952 RCP<LOCPair_GlobalEvaluationData> loc_pair
1954 RCP<LinearObjContainer> globalContainer = loc_pair->getGlobalLOC();
1957 RCP<Thyra::VectorBase<Scalar> > vec = mVec->col(j);
1958 RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1963 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[i]->names)[j];
1967 activeParameters.push_back(name);
1968 totalParameterCount++;
1976 RCP<GlobalEvaluationData> ged_activeParameters
1985 for(std::size_t i=0; i < parameters_.size(); i++) {
1987 if(parameters_[i]->is_distributed)
1991 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1992 if(deriv.isEmpty()) {
1994 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1996 parameters_[i]->scalar_value[j].baseValue);
1997 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
2003 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2005 parameters_[i]->scalar_value[j].baseValue);
2006 p.fastAccessDx(paramIndex) = 1.0;
2007 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
2014 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
2019 if(totalParameterCount>0) {
2020 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
2025 template <
typename Scalar>
2029 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 2031 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
2034 using Teuchos::rcp_dynamic_cast;
2036 typedef Thyra::ModelEvaluatorBase MEB;
2038 TEUCHOS_ASSERT(required_basic_dfdp_scalar(outArgs));
2043 MEB::OutArgs<Scalar> outArgs_base = this->createOutArgs();
2044 if (outArgs.get_f() == Teuchos::null)
2045 outArgs_base.set_f(Thyra::createMember(this->get_f_space()));
2047 outArgs_base.set_f(outArgs.get_f());
2048 outArgs_base.set_W_op(outArgs.get_W_op());
2049 this->evalModel(inArgs, outArgs_base);
2050 RCP<const Thyra::VectorBase<Scalar> > f = outArgs_base.get_f();
2051 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
2052 RCP<const Thyra::VectorBase<Scalar> > x_dot;
2053 if (inArgs.supports(MEB::IN_ARG_x_dot))
2054 x_dot = inArgs.get_x_dot();
2057 RCP<Thyra::VectorBase<Scalar> > fd = Thyra::createMember(this->get_f_space());
2058 MEB::OutArgs<Scalar> outArgs_fd = this->createOutArgs();
2059 outArgs_fd.set_f(fd);
2061 RCP<Thyra::VectorBase<Scalar> > xd = Thyra::createMember(this->get_x_space());
2062 RCP<Thyra::VectorBase<Scalar> > xd_dot;
2063 if (x_dot != Teuchos::null)
2064 xd_dot = Thyra::createMember(this->get_x_space());
2065 MEB::InArgs<Scalar> inArgs_fd = this->createInArgs();
2066 inArgs_fd.setArgs(inArgs);
2067 inArgs_fd.set_x(xd);
2068 if (x_dot != Teuchos::null)
2069 inArgs_fd.set_x_dot(xd_dot);
2071 const double h = fd_perturb_size_;
2072 for(std::size_t i=0; i < parameters_.size(); i++) {
2075 if(parameters_[i]->is_distributed)
2079 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
2084 RCP<Thyra::MultiVectorBase<Scalar> > dfdp = deriv.getMultiVector();
2085 TEUCHOS_ASSERT(dfdp->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
2088 RCP<const Thyra::VectorBase<Scalar> > p = inArgs.get_p(i);
2089 RCP<const Thyra::VectorBase<Scalar> > dx_v = inArgs.get_p(i+parameters_.size());
2090 RCP<const Thyra::MultiVectorBase<Scalar> > dx =
2091 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_v,
true)->
getMultiVector();
2092 RCP<const Thyra::VectorBase<Scalar> > dx_dot_v;
2093 RCP<const Thyra::MultiVectorBase<Scalar> > dx_dot;
2094 if (x_dot != Teuchos::null) {
2095 dx_dot_v =inArgs.get_p(i+parameters_.size()+tangent_space_.size());
2097 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_dot_v,
true)->
getMultiVector();
2101 RCP<Thyra::VectorBase<Scalar> > pd = Thyra::createMember(this->get_p_space(i));
2102 inArgs_fd.set_p(i,pd);
2104 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
2107 Thyra::copy(*p, pd.ptr());
2108 Thyra::set_ele(j, Thyra::get_ele(*p,j)+h, pd.ptr());
2111 Thyra::V_VpStV(xd.ptr(), *x, h, *(dx)->col(j));
2112 if (x_dot != Teuchos::null)
2113 Thyra::V_VpStV(xd_dot.ptr(), *x_dot, h, *(dx_dot)->col(j));
2116 Thyra::assign(fd.ptr(), 0.0);
2117 this->evalModel(inArgs_fd, outArgs_fd);
2120 Thyra::V_StVpStV(dfdp->col(j).ptr(), 1.0/h, *fd, -1.0/h, *f);
2123 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2129 template <
typename Scalar>
2133 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 2136 using Teuchos::rcp_dynamic_cast;
2137 using Teuchos::null;
2139 typedef Thyra::ModelEvaluatorBase MEB;
2141 TEUCHOS_ASSERT(required_basic_dfdp_distro(outArgs));
2147 for(std::size_t p=0;p<parameters_.size();p++) {
2151 if(!parameters_[p]->is_distributed)
2156 if(parameters_[p]->dfdp_rl==null)
2160 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2167 RCP<Response_Residual<Traits::Jacobian> > response_jacobian =
2169 response_jacobian->setJacobian(deriv.getLinearOp());
2174 setupAssemblyInArgs(inArgs,ae_inargs);
2185 template <
typename Scalar>
2190 bool activeGArgs =
false;
2191 for(
int i=0;i<outArgs.Ng();i++)
2192 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
2194 return activeGArgs | required_basic_dgdx(outArgs);
2197 template <
typename Scalar>
2201 typedef Thyra::ModelEvaluatorBase MEB;
2204 bool activeGArgs =
false;
2205 for(
int i=0;i<outArgs.Ng();i++) {
2207 if(outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
2211 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
2217 template <
typename Scalar>
2221 typedef Thyra::ModelEvaluatorBase MEB;
2224 bool activeGArgs =
false;
2225 for(
int i=0;i<outArgs.Ng();i++) {
2226 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2229 if(parameters_[p]->is_distributed)
2233 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2236 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2243 template <
typename Scalar>
2247 typedef Thyra::ModelEvaluatorBase MEB;
2250 bool activeGArgs =
false;
2251 for(
int i=0;i<outArgs.Ng();i++) {
2252 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2255 if(!parameters_[p]->is_distributed)
2259 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2262 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2269 template <
typename Scalar>
2273 typedef Thyra::ModelEvaluatorBase MEB;
2276 bool activeFPArgs =
false;
2277 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2280 if(parameters_[i]->is_distributed)
2284 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2288 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2291 return activeFPArgs;
2294 template <
typename Scalar>
2298 typedef Thyra::ModelEvaluatorBase MEB;
2301 bool activeFPArgs =
false;
2302 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2305 if(!parameters_[i]->is_distributed)
2309 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2313 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2316 return activeFPArgs;
2319 template <
typename Scalar>
2322 const Teuchos::RCP<panzer::WorksetContainer> & wc,
2323 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
2324 const std::vector<panzer::BC> & bcs,
2328 const Teuchos::ParameterList& closure_models,
2329 const Teuchos::ParameterList& user_data,
2330 const bool write_graphviz_file,
2331 const std::string& graphviz_file_prefix)
2335 using Teuchos::null;
2341 for(std::size_t p=0;p<parameters_.size();p++) {
2344 if(!parameters_[p]->is_distributed)
2349 if(parameters_[p]->global_indexer==null)
2355 parameters_[p]->global_indexer);
2358 RCP<ResponseLibrary<Traits> > rLibrary
2361 rLibrary->buildResidualResponseEvaluators(physicsBlocks,eqset_factory,bcs,bc_factory,
2362 cm_factory,closure_models,user_data,
2363 write_graphviz_file,graphviz_file_prefix);
2366 parameters_[p]->dfdp_rl = rLibrary;
2370 template <
typename Scalar>
2373 const Teuchos::RCP<panzer::WorksetContainer> & wc,
2374 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
2375 const std::vector<panzer::BC>& ,
2379 const Teuchos::ParameterList& closure_models,
2380 const Teuchos::ParameterList& user_data,
2381 const bool write_graphviz_file,
2382 const std::string& graphviz_file_prefix)
2386 using Teuchos::null;
2392 for(std::size_t p=0;p<parameters_.size();p++) {
2395 if(!parameters_[p]->is_distributed)
2400 if(parameters_[p]->global_indexer==null)
2405 RCP<const LinearObjFactory<Traits> > param_lof = parameters_[p]->dfdp_rl->getLinearObjFactory();
2406 RCP<const GlobalIndexer > param_ugi = parameters_[p]->global_indexer;
2409 RCP<ResponseLibrary<Traits> > rLibrary
2414 for(std::size_t r=0;r<responses_.size();r++) {
2416 if(responses_[r]->builder==Teuchos::null)
2421 responses_[r]->builder->setDerivativeInformation(param_lof);
2424 rLibrary->addResponse(responses_[r]->name,
2425 responses_[r]->wkst_desc,
2426 *responses_[r]->builder);
2429 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2430 cm_factory,closure_models,user_data,
2431 write_graphviz_file,graphviz_file_prefix);
2434 parameters_[p]->dgdp_rl = rLibrary;
2438 template <
typename Scalar>
2442 oneTimeDirichletBeta_on_ =
true;
2443 oneTimeDirichletBeta_ = beta;
2446 template <
typename Scalar>
2447 Teuchos::RCP<typename panzer::ModelEvaluator<Scalar>::ParameterObject>
2450 const Teuchos::Array<Scalar> & in_values)
const 2454 using Teuchos::rcp_dynamic_cast;
2455 using Teuchos::ptrFromRef;
2457 TEUCHOS_ASSERT(in_names.size()==in_values.size());
2468 paramObj->names = rcp(
new Teuchos::Array<std::string>(in_names));
2469 paramObj->is_distributed =
false;
2472 for(
int i=0;i<in_names.size();i++)
2480 Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(
2484 Teuchos::ArrayRCP<Scalar> data;
2485 RCP<Thyra::VectorBase<Scalar> > initial_value = Thyra::createMember(paramObj->space);
2486 RCP<Thyra::SpmdVectorBase<Scalar> > vec = rcp_dynamic_cast<Thyra::SpmdVectorBase<Scalar> >(initial_value);
2487 vec->getNonconstLocalData(ptrFromRef(data));
2488 for (
unsigned int i=0; i < paramObj->scalar_value.size(); i++)
2489 data[i] = in_values[i];
2491 paramObj->initial_value = initial_value;
2496 template <
typename Scalar>
2497 Teuchos::RCP<typename panzer::ModelEvaluator<Scalar>::ParameterObject>
2502 const Teuchos::RCP<const GlobalIndexer> & ugi)
const 2509 paramObj->is_distributed =
true;
2510 paramObj->names = rcp(
new Teuchos::Array<std::string>());
2511 paramObj->names->push_back(key);
2512 paramObj->space = vs;
2513 paramObj->initial_value = initial;
2515 paramObj->global_indexer = ugi;
2520 template <
typename Scalar>
2525 for(std::size_t i=0; i < parameters_.size(); i++) {
2528 if(parameters_[i]->is_distributed)
2532 Teuchos::RCP<const Thyra::VectorBase<Scalar> > p = inArgs.get_p(i);
2533 if (p != Teuchos::null) {
2534 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2535 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2542 template <
typename Scalar>
2547 for(std::size_t i=0; i < parameters_.size(); i++) {
2550 if(parameters_[i]->is_distributed)
2554 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2555 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*(parameters_[i]->initial_value),j));
2561 #endif // __Panzer_ModelEvaluator_impl_hpp__ 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.
Interface for constructing a BCStrategy_TemplateManager.
virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Allocates and initializes an equation set template manager.
bool evaluate_transient_terms
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int i) const override
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dfdp_rl
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const override
Teuchos::RCP< const GlobalIndexer > global_indexer
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) 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)
void addResponsesToInArgs(panzer::AssemblyEngineInArgs &input_args) const
int addFlexibleResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const Teuchos::RCP< ResponseMESupportBuilderBase > &builder)
const std::string & get_g_name(int i) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const override
Teuchos::RCP< ResponseBase > getResponse(const std::string &responseName) const
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
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="")
virtual void set_x_th(const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &in)=0
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
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const override
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
void buildVolumeFieldManagers(const bool value)
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const override
void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, panzer::AssemblyEngineInArgs &ae_inargs) const
virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const override
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
void initializeNominalValues() const
Initialize the nominal values with good starting conditions.
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
Teuchos::RCP< Epetra_MultiVector > getMultiVector(const std::string &modelEvalDescription, const ModelEvaluator::Derivative &deriv, const std::string &derivName, const ModelEvaluator::EDerivativeMultiVectorOrientation mvOrientation)
std::vector< double > gather_seeds
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const override
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
void evaluate(const panzer::AssemblyEngineInArgs &input_args)
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
Teuchos::RCP< panzer::LinearObjContainer > container_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
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? DfDp.
Teuchos::ArrayView< const std::string > get_g_names(int i) const override
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const override
void addGlobalEvaluationData(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const override
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.
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 panzer::LinearObjFactory< panzer::Traits > > lof_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const override
virtual void set_f_th(const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &in)=0
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) const
Kokkos::Compat::KokkosDeviceWrapperNode< PHX::Device > TpetraNodeType
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const override
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
virtual Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const =0
Get a matrix operator.
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) const
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="")
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())
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
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
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
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const override
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
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.
std::string first_sensitivities_name
void setOneTimeDirichletBeta(const Scalar &beta) const
bool apply_dirichlet_beta
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
std::string second_sensitivities_name
void addNonParameterGlobalEvaluationData(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
void resetParameters() 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...
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void registerScalarParameter(const std::string name, panzer::ParamLib &pl, double realValue)
virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
void buildBCFieldManagers(const bool value)
int addParameter(const std::string &name, const Scalar &initial)
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
virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
virtual void setOwnedVector(const Teuchos::RCP< const Thyra::VectorBase< double > > &ownedVector)=0
Set the owned vector.