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" 76 #include "Tpetra_CrsMatrix.hpp" 80 template<
typename Scalar>
89 bool build_transient_support,
92 , num_me_parameters_(0)
93 , require_in_args_refresh_(true)
94 , require_out_args_refresh_(true)
95 , responseLibrary_(rLibrary)
96 , global_data_(global_data)
97 , build_transient_support_(build_transient_support)
99 , solverFactory_(solverFactory)
100 , oneTimeDirichletBeta_on_(false)
101 , oneTimeDirichletBeta_(0.0)
105 using Teuchos::rcp_dynamic_cast;
106 using Teuchos::tuple;
108 using Thyra::createMember;
113 ae_tm_.buildObjects(builder);
122 x_space_ = tof->getThyraDomainSpace();
123 f_space_ = tof->getThyraRangeSpace();
128 for(std::size_t i=0;i<p_names.size();i++)
136 template<
typename Scalar>
141 bool build_transient_support,
double t_init)
143 , num_me_parameters_(0)
144 , require_in_args_refresh_(true)
145 , require_out_args_refresh_(true)
146 , global_data_(global_data)
147 , build_transient_support_(build_transient_support)
149 , solverFactory_(solverFactory)
150 , oneTimeDirichletBeta_on_(false)
151 , oneTimeDirichletBeta_(0.0)
154 using Teuchos::rcp_dynamic_cast;
165 x_space_ = tof->getThyraDomainSpace();
166 f_space_ = tof->getThyraRangeSpace();
176 template<
typename Scalar>
185 template<
typename Scalar>
193 template<
typename Scalar>
200 template<
typename Scalar>
205 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
207 if (i < Teuchos::as<int>(parameters_.size()))
208 return parameters_[i]->names;
209 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size())) {
211 int param_index = i-parameters_.size();
212 std::ostringstream ss;
213 ss <<
"TANGENT VECTOR: " << param_index;
214 names->push_back(ss.str());
217 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size())) {
219 int param_index = i-parameters_.size()-tangent_space_.size();
220 std::ostringstream ss;
221 ss <<
"TIME DERIVATIVE TANGENT VECTOR: " << param_index;
222 names->push_back(ss.str());
226 return Teuchos::null;
229 template<
typename Scalar>
234 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
236 if (i < Teuchos::as<int>(parameters_.size()))
237 return parameters_[i]->space;
238 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size()))
239 return tangent_space_[i-parameters_.size()];
240 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size()))
241 return tangent_space_[i-parameters_.size()-tangent_space_.size()];
243 return Teuchos::null;
246 template<
typename Scalar>
251 "panzer::ModelEvaluator::get_g_names: Requested response index out of range.");
256 template<
typename Scalar>
261 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
263 return responses_[i]->name;
266 template<
typename Scalar>
271 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
273 return responses_[i]->space;
276 template<
typename Scalar>
277 Thyra::ModelEvaluatorBase::InArgs<Scalar>
280 return getNominalValues();
283 template<
typename Scalar>
284 Thyra::ModelEvaluatorBase::InArgs<Scalar>
288 using Teuchos::rcp_dynamic_cast;
290 if(require_in_args_refresh_) {
291 typedef Thyra::ModelEvaluatorBase MEB;
298 MEB::InArgsSetup<Scalar> nomInArgs;
299 nomInArgs = nominalValues_;
300 nomInArgs.setSupports(nominalValues_);
303 nomInArgs.set_Np(num_me_parameters_);
304 for(std::size_t p=0;p<parameters_.size();p++) {
306 nomInArgs.set_p(p,parameters_[p]->initial_value);
312 nominalValues_ = nomInArgs;
316 require_in_args_refresh_ =
false;
318 return nominalValues_;
321 template<
typename Scalar>
325 typedef Thyra::ModelEvaluatorBase MEB;
331 MEB::InArgsSetup<Scalar> nomInArgs;
332 nomInArgs.setModelEvalDescription(this->description());
333 nomInArgs.setSupports(MEB::IN_ARG_x);
335 Thyra::assign(x_nom.
ptr(),0.0);
336 nomInArgs.set_x(x_nom);
337 if(build_transient_support_) {
338 nomInArgs.setSupports(MEB::IN_ARG_x_dot,
true);
339 nomInArgs.setSupports(MEB::IN_ARG_t,
true);
340 nomInArgs.setSupports(MEB::IN_ARG_alpha,
true);
341 nomInArgs.setSupports(MEB::IN_ARG_beta,
true);
342 nomInArgs.setSupports(MEB::IN_ARG_step_size,
true);
343 nomInArgs.setSupports(MEB::IN_ARG_stage_number,
true);
346 Thyra::assign(x_dot_nom.
ptr(),0.0);
347 nomInArgs.set_x_dot(x_dot_nom);
348 nomInArgs.set_t(t_init_);
349 nomInArgs.set_alpha(0.0);
350 nomInArgs.set_beta(0.0);
352 nomInArgs.set_step_size(0.0);
353 nomInArgs.set_stage_number(1.0);
357 nomInArgs.set_Np(num_me_parameters_);
358 std::size_t v_index = 0;
359 for(std::size_t p=0;p<parameters_.size();p++) {
360 nomInArgs.set_p(p,parameters_[p]->initial_value);
361 if (!parameters_[p]->is_distributed) {
363 Thyra::assign(v_nom_x.
ptr(),0.0);
364 nomInArgs.set_p(v_index+parameters_.size(),v_nom_x);
365 if (build_transient_support_) {
367 Thyra::assign(v_nom_xdot.
ptr(),0.0);
368 nomInArgs.set_p(v_index+parameters_.size()+tangent_space_.size(),v_nom_xdot);
374 nominalValues_ = nomInArgs;
377 template <
typename Scalar>
381 const std::vector<panzer::BC> & bcs,
388 bool writeGraph,
const std::string & graphPrefix,
410 ae_tm_.buildObjects(builder);
416 responseLibrary_->initialize(wc,
lof_->getRangeGlobalIndexer(),
lof_);
418 buildResponses(physicsBlocks,eqset_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Responses_");
419 buildDistroParamDfDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DfDp_");
420 buildDistroParamDgDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DgDp_");
423 fd_perturb_size_ = 1.0e-7;
424 if (me_params.
isParameter(
"FD Forward Sensitivities"))
425 do_fd_dfdp_ = me_params.
get<
bool>(
"FD Forward Sensitivities");
427 fd_perturb_size_ = me_params.
get<
double>(
"FD Perturbation Size");
430 template <
typename Scalar>
437 using Teuchos::rcp_dynamic_cast;
438 using Teuchos::rcp_const_cast;
439 typedef Thyra::ModelEvaluatorBase MEB;
443 ghostedContainer_ =
lof_->buildGhostedLinearObjContainer();
450 bool is_transient =
false;
451 if (inArgs.supports(MEB::IN_ARG_x_dot ))
455 xContainer_ =
lof_->buildReadOnlyDomainContainer();
457 xdotContainer_ =
lof_->buildReadOnlyDomainContainer();
464 "ModelEvaluator was not built with transient support enabled!");
468 ae_inargs.
alpha = 0.0;
469 ae_inargs.
beta = 1.0;
471 if (build_transient_support_) {
472 x_dot = inArgs.get_x_dot();
473 ae_inargs.
alpha = inArgs.get_alpha();
474 ae_inargs.
beta = inArgs.get_beta();
475 ae_inargs.
time = inArgs.get_t();
477 ae_inargs.
step_size= inArgs.get_step_size();
486 int num_param_vecs = parameters_.size();
487 for (
int i=0; i<num_param_vecs; i++) {
490 if ( paramVec!=Teuchos::null && !parameters_[i]->is_distributed) {
494 rcp_dynamic_cast<
const Thyra::SpmdVectorBase<Scalar> >(paramVec,
true)->getLocalData(Teuchos::ptrFromRef(p_data));
496 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
497 parameters_[i]->scalar_value[j].baseValue = p_data[j];
498 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(parameters_[i]->scalar_value[j].baseValue);
501 else if ( paramVec!=Teuchos::null && parameters_[i]->is_distributed) {
504 std::string key = (*parameters_[i]->names)[0];
512 if(loc_pair_ged!=Teuchos::null) {
519 ro_ged->setOwnedVector(paramVec);
546 xContainer_->setOwnedVector(x);
551 xdotContainer_->setOwnedVector(x_dot);
561 for (
int i(0); i < num_param_vecs; ++i)
567 if (not parameters_[i]->is_distributed)
569 auto dxdp = rcp_const_cast<VectorBase<Scalar>>
570 (inArgs.get_p(vIndex + num_param_vecs));
571 if (not dxdp.is_null())
575 auto dxdpBlock = rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdp);
576 int numParams(parameters_[i]->scalar_value.size());
577 for (
int j(0); j < numParams; ++j)
580 dxdpContainer->setOwnedVector(dxdpBlock->getNonconstVectorBlock(j));
581 string name(
"X TANGENT GATHER CONTAINER: " +
582 (*parameters_[i]->names)[j]);
586 if (build_transient_support_)
590 auto dxdotdp = rcp_const_cast<VectorBase<Scalar>>
591 (inArgs.get_p(vIndex + num_param_vecs + tangent_space_.size()));
592 if (not dxdotdp.is_null())
595 rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdotdp);
596 int numParams(parameters_[i]->scalar_value.size());
597 for (
int j(0); j < numParams; ++j)
600 dxdotdpContainer->setOwnedVector(
601 dxdotdpBlock->getNonconstVectorBlock(j));
602 string name(
"DXDT TANGENT GATHER CONTAINER: " +
603 (*parameters_[i]->names)[j]);
616 template <
typename Scalar>
617 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
620 typedef Thyra::ModelEvaluatorBase MEB;
622 if(require_out_args_refresh_) {
623 MEB::OutArgsSetup<Scalar> outArgs;
624 outArgs.setModelEvalDescription(this->description());
625 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
626 outArgs.setSupports(MEB::OUT_ARG_f);
627 outArgs.setSupports(MEB::OUT_ARG_W_op);
630 for(std::size_t i=0;i<responses_.size();i++) {
635 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
636 if(respJacBase!=Teuchos::null) {
642 if(resp->supportsDerivative()) {
643 outArgs.setSupports(MEB::OUT_ARG_DgDx,i,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
646 for(std::size_t p=0;p<parameters_.size();p++) {
647 if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
648 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
649 if(!parameters_[p]->is_distributed)
650 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
657 for(std::size_t p=0;p<parameters_.size();p++) {
659 if(!parameters_[p]->is_distributed)
660 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
661 else if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
662 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
665 prototypeOutArgs_ = outArgs;
669 require_out_args_refresh_ =
false;
671 return prototypeOutArgs_;
674 template <
typename Scalar>
682 return tof->getThyraMatrix();
685 template <
typename Scalar>
690 return solverFactory_;
693 template <
typename Scalar>
699 using Teuchos::rcp_dynamic_cast;
701 typedef Thyra::ModelEvaluatorBase MEB;
713 if(require_out_args_refresh_) {
714 this->createOutArgs();
723 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_LINEAR_OP));
730 return response_jacobian->allocateJacobian();
733 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_MV_BY_COL));
736 return Thyra::createMember(*get_f_space());
742 return Teuchos::null;
745 template <
typename Scalar>
755 return addParameter(tmp_names,tmp_values);
758 template <
typename Scalar>
765 using Teuchos::rcp_dynamic_cast;
766 using Teuchos::ptrFromRef;
770 int parameter_index = parameters_.size();
774 parameters_.push_back(param);
778 Thyra::multiVectorProductVectorSpace(x_space_, param->names->size());
779 tangent_space_.push_back(tan_space);
783 num_me_parameters_ += 2;
784 if (build_transient_support_)
785 ++num_me_parameters_;
787 require_in_args_refresh_ =
true;
788 require_out_args_refresh_ =
true;
790 return parameter_index;
793 template <
typename Scalar>
801 distrParamGlobalEvaluationData_.addDataObject(key,ged);
803 int parameter_index = parameters_.size();
804 parameters_.push_back(createDistributedParameter(key,vs,initial,ugi));
805 ++num_me_parameters_;
807 require_in_args_refresh_ =
true;
808 require_out_args_refresh_ =
true;
810 return parameter_index;
813 template <
typename Scalar>
818 nonParamGlobalEvaluationData_.addDataObject(key,ged);
821 template <
typename Scalar>
824 const std::vector<WorksetDescriptor> & wkst_desc,
830 int respIndex = addResponse(responseName,wkst_desc,*builder);
833 responses_[respIndex]->builder = builder;
839 template <
typename Scalar>
847 using Teuchos::tuple;
848 using Teuchos::rcp_dynamic_cast;
852 ghostedContainer_ =
lof_->buildGhostedLinearObjContainer();
860 ae_inargs.
alpha = 0.0;
861 ae_inargs.
beta = 1.0;
883 Thyra::assign(thGhostedContainer->get_f_th().
ptr(),0.0);
892 thGlobalContainer->set_x_th(x);
896 = ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
903 thGlobalContainer->get_f_th());
912 template <
typename Scalar>
915 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
919 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 922 setParameters(inArgs);
925 std::string responseName = responses_[respIndex]->name;
929 resp->setDerivative(D2gDx2);
936 setupAssemblyInArgs(inArgs,ae_inargs);
938 ae_inargs.
beta = 1.0;
940 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
941 deltaXContainer->setOwnedVector(delta_x);
955 template <
typename Scalar>
959 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
963 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 966 setParameters(inArgs);
969 std::string responseName = responses_[respIndex]->name;
973 resp->setDerivative(D2gDxDp);
980 setupAssemblyInArgs(inArgs,ae_inargs);
982 ae_inargs.
beta = 1.0;
985 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
986 deltaPContainer->setOwnedVector(delta_p);
1000 template <
typename Scalar>
1004 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1008 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1011 setParameters(inArgs);
1016 std::string responseName = responses_[respIndex]->name;
1020 resp->setDerivative(D2gDp2);
1027 setupAssemblyInArgs(inArgs,ae_inargs);
1034 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1035 deltaPContainer->setOwnedVector(delta_p);
1049 template <
typename Scalar>
1053 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1057 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1060 setParameters(inArgs);
1065 std::string responseName = responses_[respIndex]->name;
1069 resp->setDerivative(D2gDpDx);
1076 setupAssemblyInArgs(inArgs,ae_inargs);
1083 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
1084 deltaXContainer->setOwnedVector(delta_x);
1098 template <
typename Scalar>
1104 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1109 using Teuchos::tuple;
1110 using Teuchos::rcp_dynamic_cast;
1112 typedef Thyra::ModelEvaluatorBase MEB;
1117 bool is_transient =
false;
1118 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1123 "ModelEvaluator was not built with transient support enabled!");
1134 setupAssemblyInArgs(inArgs,ae_inargs);
1136 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
1137 deltaXContainer->setOwnedVector(delta_x);
1141 setParameters(inArgs);
1147 if(oneTimeDirichletBeta_on_) {
1151 oneTimeDirichletBeta_on_ =
false;
1161 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDx2)");
1165 thGlobalContainer->set_f_th(dummy_f);
1166 thGlobalContainer->set_A_th(W_out);
1169 thGhostedContainer->initializeMatrix(0.0);
1171 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1177 thGlobalContainer->set_A_th(Teuchos::null);
1183 thGlobalContainer->set_x_th(Teuchos::null);
1184 thGlobalContainer->set_dxdt_th(Teuchos::null);
1185 thGlobalContainer->set_f_th(Teuchos::null);
1186 thGlobalContainer->set_A_th(Teuchos::null);
1195 template <
typename Scalar>
1198 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1202 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1207 using Teuchos::tuple;
1208 using Teuchos::rcp_dynamic_cast;
1210 typedef Thyra::ModelEvaluatorBase MEB;
1215 bool is_transient =
false;
1216 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1221 "ModelEvaluator was not built with transient support enabled!");
1232 setupAssemblyInArgs(inArgs,ae_inargs);
1236 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1237 deltaPContainer->setOwnedVector(delta_p);
1241 setParameters(inArgs);
1247 if(oneTimeDirichletBeta_on_) {
1251 oneTimeDirichletBeta_on_ =
false;
1261 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDxDp)");
1265 thGlobalContainer->set_f_th(dummy_f);
1266 thGlobalContainer->set_A_th(W_out);
1269 thGhostedContainer->initializeMatrix(0.0);
1271 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1277 thGlobalContainer->set_A_th(Teuchos::null);
1283 thGlobalContainer->set_x_th(Teuchos::null);
1284 thGlobalContainer->set_dxdt_th(Teuchos::null);
1285 thGlobalContainer->set_f_th(Teuchos::null);
1286 thGlobalContainer->set_A_th(Teuchos::null);
1295 template <
typename Scalar>
1298 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1302 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1304 using Teuchos::rcp_dynamic_cast;
1305 using Teuchos::null;
1319 response_hessian->setHessian(D2fDpDx);
1324 setupAssemblyInArgs(inArgs,ae_inargs);
1326 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
1327 deltaXContainer->setOwnedVector(delta_x);
1342 template <
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;
1366 response_hessian->setHessian(D2fDp2);
1371 setupAssemblyInArgs(inArgs,ae_inargs);
1373 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1374 deltaPContainer->setOwnedVector(delta_p);
1389 template <
typename Scalar>
1392 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1394 evalModelImpl_basic(inArgs,outArgs);
1397 if(required_basic_g(outArgs))
1398 evalModelImpl_basic_g(inArgs,outArgs);
1401 if(required_basic_dgdx(outArgs))
1402 evalModelImpl_basic_dgdx(inArgs,outArgs);
1405 if(required_basic_dgdp_scalar(outArgs))
1406 evalModelImpl_basic_dgdp_scalar(inArgs,outArgs);
1409 if(required_basic_dgdp_distro(outArgs))
1410 evalModelImpl_basic_dgdp_distro(inArgs,outArgs);
1412 if(required_basic_dfdp_scalar(outArgs)) {
1414 evalModelImpl_basic_dfdp_scalar_fd(inArgs,outArgs);
1416 evalModelImpl_basic_dfdp_scalar(inArgs,outArgs);
1419 if(required_basic_dfdp_distro(outArgs))
1420 evalModelImpl_basic_dfdp_distro(inArgs,outArgs);
1423 template <
typename Scalar>
1426 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1431 using Teuchos::tuple;
1432 using Teuchos::rcp_dynamic_cast;
1434 typedef Thyra::ModelEvaluatorBase MEB;
1439 bool is_transient =
false;
1440 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1445 "ModelEvaluator was not built with transient support enabled!");
1462 setupAssemblyInArgs(inArgs,ae_inargs);
1465 setParameters(inArgs);
1471 if(oneTimeDirichletBeta_on_) {
1475 oneTimeDirichletBeta_on_ =
false;
1485 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
1491 thGlobalContainer->set_f_th(f_out);
1492 thGlobalContainer->set_A_th(W_out);
1495 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1496 thGhostedContainer->initializeMatrix(0.0);
1498 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1502 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
1507 thGlobalContainer->set_f_th(f_out);
1510 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1512 ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluate(ae_inargs);
1516 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
1523 thGlobalContainer->set_f_th(dummy_f);
1524 thGlobalContainer->set_A_th(W_out);
1527 thGhostedContainer->initializeMatrix(0.0);
1529 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1535 thGlobalContainer->set_A_th(Teuchos::null);
1541 thGlobalContainer->set_x_th(Teuchos::null);
1542 thGlobalContainer->set_dxdt_th(Teuchos::null);
1543 thGlobalContainer->set_f_th(Teuchos::null);
1544 thGlobalContainer->set_A_th(Teuchos::null);
1550 template <
typename Scalar>
1553 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1562 setupAssemblyInArgs(inArgs,ae_inargs);
1565 setParameters(inArgs);
1567 for(std::size_t i=0;i<responses_.size();i++) {
1569 if(vec!=Teuchos::null) {
1570 std::string responseName = responses_[i]->name;
1574 resp->setVector(vec);
1586 template <
typename Scalar>
1590 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1592 typedef Thyra::ModelEvaluatorBase MEB;
1598 setParameters(inArgs);
1600 for(std::size_t i=0;i<responses_.size();i++) {
1602 MEB::Derivative<Scalar> deriv = outArgs.get_DgDx(i);
1608 if(vec!=Teuchos::null) {
1610 std::string responseName = responses_[i]->name;
1614 resp->setDerivative(vec);
1622 setupAssemblyInArgs(inArgs,ae_inargs);
1632 template <
typename Scalar>
1636 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1640 using Teuchos::rcp_dynamic_cast;
1642 typedef Thyra::ModelEvaluatorBase MEB;
1648 std::vector<std::string> activeParameterNames;
1649 std::vector<int> activeParameters;
1650 int totalParameterCount = 0;
1651 for(std::size_t j=0; j<parameters_.size(); j++) {
1654 if(parameters_[j]->is_distributed)
1657 bool is_active =
false;
1658 for(std::size_t i=0;i<responses_.size(); i++) {
1660 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(i,j);
1665 if(vec!=Teuchos::null) {
1667 std::string responseName = responses_[i]->name;
1671 resp->setVector(vec);
1677 for (std::size_t k=0; k<parameters_[j]->scalar_value.size(); k++) {
1678 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[j]->names)[k];
1679 activeParameterNames.push_back(name);
1680 totalParameterCount++;
1682 activeParameters.push_back(j);
1688 setupAssemblyInArgs(inArgs,ae_inargs);
1697 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1698 const int j = activeParameters[ap];
1699 for (
unsigned int k=0; k < parameters_[j]->scalar_value.size(); k++) {
1701 p.fastAccessDx(paramIndex) = 1.0;
1702 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1711 if(totalParameterCount>0) {
1717 template <
typename Scalar>
1721 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1723 typedef Thyra::ModelEvaluatorBase MEB;
1732 for(std::size_t p=0;p<parameters_.size();p++) {
1736 if(!parameters_[p]->is_distributed)
1741 for(std::size_t r=0;r<responses_.size();r++) {
1743 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(r,p);
1749 if(vec!=Teuchos::null) {
1752 std::string responseName = responses_[r]->name;
1757 resp->setDerivative(vec);
1764 setupAssemblyInArgs(inArgs,ae_inargs);
1776 template <
typename Scalar>
1780 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1783 using Teuchos::rcp_dynamic_cast;
1785 typedef Thyra::ModelEvaluatorBase MEB;
1793 setupAssemblyInArgs(inArgs,ae_inargs);
1799 std::vector<std::string> activeParameters;
1801 int totalParameterCount = 0;
1802 for(std::size_t i=0; i < parameters_.size(); i++) {
1804 if(parameters_[i]->is_distributed)
1808 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1814 TEUCHOS_ASSERT(mVec->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1816 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1827 thGlobalContainer->set_f_th(vec);
1830 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[i]->names)[j];
1834 activeParameters.push_back(name);
1835 totalParameterCount++;
1852 for(std::size_t i=0; i < parameters_.size(); i++) {
1854 if(parameters_[i]->is_distributed)
1858 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1859 if(deriv.isEmpty()) {
1861 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1863 parameters_[i]->scalar_value[j].baseValue);
1864 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1870 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1872 parameters_[i]->scalar_value[j].baseValue);
1873 p.fastAccessDx(paramIndex) = 1.0;
1874 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1886 if(totalParameterCount>0) {
1887 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
1892 template <
typename Scalar>
1896 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1898 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
1901 using Teuchos::rcp_dynamic_cast;
1903 typedef Thyra::ModelEvaluatorBase MEB;
1910 MEB::OutArgs<Scalar> outArgs_base = this->createOutArgs();
1911 if (outArgs.get_f() == Teuchos::null)
1912 outArgs_base.set_f(Thyra::createMember(this->get_f_space()));
1914 outArgs_base.set_f(outArgs.get_f());
1915 outArgs_base.set_W_op(outArgs.get_W_op());
1916 this->evalModel(inArgs, outArgs_base);
1920 if (inArgs.supports(MEB::IN_ARG_x_dot))
1921 x_dot = inArgs.get_x_dot();
1925 MEB::OutArgs<Scalar> outArgs_fd = this->createOutArgs();
1926 outArgs_fd.set_f(fd);
1930 if (x_dot != Teuchos::null)
1931 xd_dot = Thyra::createMember(this->get_x_space());
1932 MEB::InArgs<Scalar> inArgs_fd = this->createInArgs();
1933 inArgs_fd.setArgs(inArgs);
1934 inArgs_fd.set_x(xd);
1935 if (x_dot != Teuchos::null)
1936 inArgs_fd.set_x_dot(xd_dot);
1938 const double h = fd_perturb_size_;
1939 for(std::size_t i=0; i < parameters_.size(); i++) {
1942 if(parameters_[i]->is_distributed)
1946 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1952 TEUCHOS_ASSERT(dfdp->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1958 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_v,
true)->getMultiVector();
1961 if (x_dot != Teuchos::null) {
1962 dx_dot_v =inArgs.get_p(i+parameters_.size()+tangent_space_.size());
1964 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_dot_v,
true)->getMultiVector();
1969 inArgs_fd.set_p(i,pd);
1971 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1974 Thyra::copy(*p, pd.
ptr());
1975 Thyra::set_ele(j, Thyra::get_ele(*p,j)+h, pd.
ptr());
1978 Thyra::V_VpStV(xd.
ptr(), *x, h, *(dx)->col(j));
1979 if (x_dot != Teuchos::null)
1980 Thyra::V_VpStV(xd_dot.
ptr(), *x_dot, h, *(dx_dot)->col(j));
1983 Thyra::assign(fd.
ptr(), 0.0);
1984 this->evalModel(inArgs_fd, outArgs_fd);
1987 Thyra::V_StVpStV(dfdp->col(j).
ptr(), 1.0/h, *fd, -1.0/h, *f);
1990 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
1996 template <
typename Scalar>
2000 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 2003 using Teuchos::rcp_dynamic_cast;
2004 using Teuchos::null;
2006 typedef Thyra::ModelEvaluatorBase MEB;
2014 for(std::size_t p=0;p<parameters_.size();p++) {
2018 if(!parameters_[p]->is_distributed)
2023 if(parameters_[p]->dfdp_rl==null)
2027 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2036 response_jacobian->setJacobian(deriv.getLinearOp());
2041 setupAssemblyInArgs(inArgs,ae_inargs);
2052 template <
typename Scalar>
2057 bool activeGArgs =
false;
2058 for(
int i=0;i<outArgs.Ng();i++)
2059 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
2061 return activeGArgs | required_basic_dgdx(outArgs);
2064 template <
typename Scalar>
2068 typedef Thyra::ModelEvaluatorBase MEB;
2071 bool activeGArgs =
false;
2072 for(
int i=0;i<outArgs.Ng();i++) {
2074 if(outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
2078 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
2084 template <
typename Scalar>
2088 typedef Thyra::ModelEvaluatorBase MEB;
2091 bool activeGArgs =
false;
2092 for(
int i=0;i<outArgs.Ng();i++) {
2093 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2096 if(parameters_[p]->is_distributed)
2100 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2103 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2110 template <
typename Scalar>
2114 typedef Thyra::ModelEvaluatorBase MEB;
2117 bool activeGArgs =
false;
2118 for(
int i=0;i<outArgs.Ng();i++) {
2119 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2122 if(!parameters_[p]->is_distributed)
2126 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2129 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2136 template <
typename Scalar>
2140 typedef Thyra::ModelEvaluatorBase MEB;
2143 bool activeFPArgs =
false;
2144 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2147 if(parameters_[i]->is_distributed)
2151 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2155 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2158 return activeFPArgs;
2161 template <
typename Scalar>
2165 typedef Thyra::ModelEvaluatorBase MEB;
2168 bool activeFPArgs =
false;
2169 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2172 if(!parameters_[i]->is_distributed)
2176 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2180 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2183 return activeFPArgs;
2186 template <
typename Scalar>
2191 const std::vector<panzer::BC> & bcs,
2197 const bool write_graphviz_file,
2198 const std::string& graphviz_file_prefix)
2202 using Teuchos::null;
2208 for(std::size_t p=0;p<parameters_.size();p++) {
2211 if(!parameters_[p]->is_distributed)
2216 if(parameters_[p]->global_indexer==null)
2222 parameters_[p]->global_indexer);
2228 rLibrary->buildResidualResponseEvaluators(physicsBlocks,eqset_factory,bcs,bc_factory,
2229 cm_factory,closure_models,user_data,
2230 write_graphviz_file,graphviz_file_prefix);
2233 parameters_[p]->dfdp_rl = rLibrary;
2237 template <
typename Scalar>
2242 const std::vector<panzer::BC>& ,
2248 const bool write_graphviz_file,
2249 const std::string& graphviz_file_prefix)
2253 using Teuchos::null;
2259 for(std::size_t p=0;p<parameters_.size();p++) {
2262 if(!parameters_[p]->is_distributed)
2267 if(parameters_[p]->global_indexer==null)
2281 for(std::size_t r=0;r<responses_.size();r++) {
2283 if(responses_[r]->builder==Teuchos::null)
2288 responses_[r]->builder->setDerivativeInformation(param_lof);
2291 rLibrary->addResponse(responses_[r]->name,
2292 responses_[r]->wkst_desc,
2293 *responses_[r]->builder);
2296 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2297 cm_factory,closure_models,user_data,
2298 write_graphviz_file,graphviz_file_prefix);
2301 parameters_[p]->dgdp_rl = rLibrary;
2305 template <
typename Scalar>
2309 oneTimeDirichletBeta_on_ =
true;
2310 oneTimeDirichletBeta_ = beta;
2313 template <
typename Scalar>
2321 using Teuchos::rcp_dynamic_cast;
2322 using Teuchos::ptrFromRef;
2336 paramObj->is_distributed =
false;
2339 for(
int i=0;i<in_names.
size();i++)
2347 Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(
2354 vec->getNonconstLocalData(ptrFromRef(data));
2355 for (
unsigned int i=0; i < paramObj->scalar_value.size(); i++)
2356 data[i] = in_values[i];
2358 paramObj->initial_value = initial_value;
2363 template <
typename Scalar>
2376 paramObj->is_distributed =
true;
2378 paramObj->names->push_back(key);
2379 paramObj->space = vs;
2380 paramObj->initial_value = initial;
2382 paramObj->global_indexer = ugi;
2387 template <
typename Scalar>
2392 for(std::size_t i=0; i < parameters_.size(); i++) {
2395 if(parameters_[i]->is_distributed)
2400 if (p != Teuchos::null) {
2401 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2402 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2409 template <
typename Scalar>
2414 for(std::size_t i=0; i < parameters_.size(); i++) {
2417 if(parameters_[i]->is_distributed)
2421 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2422 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*(parameters_[i]->initial_value),j));
2428 #endif // __Panzer_ModelEvaluator_impl_hpp__
Interface for constructing a BCStrategy_TemplateManager.
Teuchos::RCP< const LinearObjFactory< TraitsT > > lof_
void setupVolumeFieldManagers(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data)
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
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dfdp_rl
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const
void addResponsesToInArgs(panzer::AssemblyEngineInArgs &input_args) const
void writeVolumeGraphvizDependencyFiles(std::string filename_prefix, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks) const
int addFlexibleResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const Teuchos::RCP< ResponseMESupportBuilderBase > &builder)
T & get(const std::string &name, T def_value)
const std::string & get_g_name(int i) const
bool is_null(const std::shared_ptr< T > &p)
Teuchos::RCP< ResponseBase > getResponse(const std::string &responseName) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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="")
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 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 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
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.
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Teuchos::RCP< const LinearObjFactory< panzer::Traits > > cloneWithNewDomain(const LinearObjFactory< panzer::Traits > &lof, const Teuchos::RCP< const UniqueGlobalIndexerBase > &dUgi)
Clone a linear object factory, but using a different domain.
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
std::vector< double > gather_seeds
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
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
void addGlobalEvaluationData(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< const UniqueGlobalIndexerBase > global_indexer
void setWorksetContainer(const Teuchos::RCP< WorksetContainer > &wc)
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.
Teuchos::RCP< LinearObjContainer > getGlobalLOC() 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_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void writeBCGraphvizDependencyFiles(std::string filename_prefix) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > lof_
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) 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 UniqueGlobalIndexerBase > &ugi) const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int i) const
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
virtual void setDerivativeInformation(const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &linearObjFactory)=0
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() 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="")
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() 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())
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
Teuchos::RCP< LinearObjContainer > getGhostedLOC() const
void push_back(const value_type &x)
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.
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() 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 UniqueGlobalIndexerBase > &ugi=Teuchos::null)
std::string first_sensitivities_name
void setOneTimeDirichletBeta(const Scalar &beta) const
bool apply_dirichlet_beta
bool isParameter(const std::string &name) const
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...
void setupBCFieldManagers(const std::vector< panzer::BC > &bcs, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::EquationSetFactory &eqset_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const panzer::BCStrategyFactory &bc_factory, const Teuchos::ParameterList &closure_models, const LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data)
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
#define TEUCHOS_ASSERT(assertion_test)
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.
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