43 #ifndef PANZER_MODEL_EVALUATOR_IMPL_HPP 44 #define PANZER_MODEL_EVALUATOR_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)
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;
115 ae_tm_.buildObjects(builder);
124 x_space_ = tof->getThyraDomainSpace();
125 f_space_ = tof->getThyraRangeSpace();
130 for(std::size_t i=0;i<p_names.size();i++)
138 template<
typename Scalar>
143 bool build_transient_support,
double t_init)
145 , num_me_parameters_(0)
146 , require_in_args_refresh_(true)
147 , require_out_args_refresh_(true)
149 , build_transient_support_(build_transient_support)
151 , solverFactory_(solverFactory)
152 , oneTimeDirichletBeta_on_(false)
153 , oneTimeDirichletBeta_(0.0)
156 using Teuchos::rcp_dynamic_cast;
167 x_space_ = tof->getThyraDomainSpace();
168 f_space_ = tof->getThyraRangeSpace();
178 template<
typename Scalar>
187 template<
typename Scalar>
195 template<
typename Scalar>
202 template<
typename Scalar>
207 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
209 if (i < Teuchos::as<int>(parameters_.size()))
210 return parameters_[i]->names;
211 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size())) {
213 int param_index = i-parameters_.size();
214 std::ostringstream ss;
215 ss <<
"TANGENT VECTOR: " << param_index;
216 names->push_back(ss.str());
219 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size())) {
221 int param_index = i-parameters_.size()-tangent_space_.size();
222 std::ostringstream ss;
223 ss <<
"TIME DERIVATIVE TANGENT VECTOR: " << param_index;
224 names->push_back(ss.str());
228 return Teuchos::null;
231 template<
typename Scalar>
236 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
238 if (i < Teuchos::as<int>(parameters_.size()))
239 return parameters_[i]->space;
240 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size()))
241 return tangent_space_[i-parameters_.size()];
242 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size()))
243 return tangent_space_[i-parameters_.size()-tangent_space_.size()];
245 return Teuchos::null;
248 template<
typename Scalar>
253 "panzer::ModelEvaluator::get_g_names: Requested response index out of range.");
258 template<
typename Scalar>
263 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
265 return responses_[i]->name;
268 template<
typename Scalar>
273 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
275 return responses_[i]->space;
278 template<
typename Scalar>
279 Thyra::ModelEvaluatorBase::InArgs<Scalar>
282 return getNominalValues();
285 template<
typename Scalar>
286 Thyra::ModelEvaluatorBase::InArgs<Scalar>
290 using Teuchos::rcp_dynamic_cast;
292 if(require_in_args_refresh_) {
293 typedef Thyra::ModelEvaluatorBase MEB;
300 MEB::InArgsSetup<Scalar> nomInArgs;
301 nomInArgs = nominalValues_;
302 nomInArgs.setSupports(nominalValues_);
305 nomInArgs.set_Np(num_me_parameters_);
306 for(std::size_t p=0;p<parameters_.size();p++) {
308 nomInArgs.set_p(p,parameters_[p]->initial_value);
314 nominalValues_ = nomInArgs;
318 require_in_args_refresh_ =
false;
320 return nominalValues_;
323 template<
typename Scalar>
327 typedef Thyra::ModelEvaluatorBase MEB;
333 MEB::InArgsSetup<Scalar> nomInArgs;
334 nomInArgs.setModelEvalDescription(this->description());
335 nomInArgs.setSupports(MEB::IN_ARG_x);
337 Thyra::assign(x_nom.
ptr(),0.0);
338 nomInArgs.set_x(x_nom);
339 if(build_transient_support_) {
340 nomInArgs.setSupports(MEB::IN_ARG_x_dot,
true);
341 nomInArgs.setSupports(MEB::IN_ARG_t,
true);
342 nomInArgs.setSupports(MEB::IN_ARG_alpha,
true);
343 nomInArgs.setSupports(MEB::IN_ARG_beta,
true);
344 nomInArgs.setSupports(MEB::IN_ARG_step_size,
true);
345 nomInArgs.setSupports(MEB::IN_ARG_stage_number,
true);
348 Thyra::assign(x_dot_nom.
ptr(),0.0);
349 nomInArgs.set_x_dot(x_dot_nom);
350 nomInArgs.set_t(t_init_);
351 nomInArgs.set_alpha(0.0);
352 nomInArgs.set_beta(0.0);
354 nomInArgs.set_step_size(0.0);
355 nomInArgs.set_stage_number(1.0);
359 nomInArgs.set_Np(num_me_parameters_);
360 std::size_t v_index = 0;
361 for(std::size_t p=0;p<parameters_.size();p++) {
362 nomInArgs.set_p(p,parameters_[p]->initial_value);
363 if (!parameters_[p]->is_distributed) {
365 Thyra::assign(v_nom_x.
ptr(),0.0);
366 nomInArgs.set_p(v_index+parameters_.size(),v_nom_x);
367 if (build_transient_support_) {
369 Thyra::assign(v_nom_xdot.
ptr(),0.0);
370 nomInArgs.set_p(v_index+parameters_.size()+tangent_space_.size(),v_nom_xdot);
376 nominalValues_ = nomInArgs;
379 template <
typename Scalar>
383 const std::vector<panzer::BC> & bcs,
390 bool writeGraph,
const std::string & graphPrefix,
412 ae_tm_.buildObjects(builder);
418 responseLibrary_->initialize(wc,
lof_->getRangeGlobalIndexer(),
lof_);
420 buildResponses(physicsBlocks,eqset_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Responses_");
421 buildDistroParamDfDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DfDp_");
422 buildDistroParamDgDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DgDp_");
425 fd_perturb_size_ = 1.0e-7;
426 if (me_params.
isParameter(
"FD Forward Sensitivities"))
427 do_fd_dfdp_ = me_params.
get<
bool>(
"FD Forward Sensitivities");
429 fd_perturb_size_ = me_params.
get<
double>(
"FD Perturbation Size");
432 template <
typename Scalar>
439 using Teuchos::rcp_dynamic_cast;
440 using Teuchos::rcp_const_cast;
443 typedef Thyra::ModelEvaluatorBase MEB;
447 ghostedContainer_ =
lof_->buildGhostedLinearObjContainer();
454 bool is_transient =
false;
455 if (inArgs.supports(MEB::IN_ARG_x_dot ))
459 xContainer_ =
lof_->buildDomainContainer();
461 xdotContainer_ =
lof_->buildDomainContainer();
468 "ModelEvaluator was not built with transient support enabled!");
472 ae_inargs.
alpha = 0.0;
473 ae_inargs.
beta = 1.0;
475 if (build_transient_support_) {
476 x_dot = inArgs.get_x_dot();
477 ae_inargs.
alpha = inArgs.get_alpha();
478 ae_inargs.
beta = inArgs.get_beta();
479 ae_inargs.
time = inArgs.get_t();
481 ae_inargs.
step_size= inArgs.get_step_size();
490 int num_param_vecs = parameters_.size();
491 for (
int i=0; i<num_param_vecs; i++) {
494 if ( paramVec!=Teuchos::null && !parameters_[i]->is_distributed) {
498 rcp_dynamic_cast<
const Thyra::SpmdVectorBase<Scalar> >(paramVec,
true)->getLocalData(Teuchos::ptrFromRef(p_data));
500 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
501 parameters_[i]->scalar_value[j].baseValue = p_data[j];
502 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(parameters_[i]->scalar_value[j].baseValue);
505 else if ( paramVec!=Teuchos::null && parameters_[i]->is_distributed) {
508 std::string key = (*parameters_[i]->names)[0];
516 if(loc_pair_ged!=Teuchos::null) {
523 ro_ged->setOwnedVector(paramVec);
550 xContainer_->setOwnedVector(x);
555 xdotContainer_->setOwnedVector(x_dot);
564 for (
int i=0; i<num_param_vecs; ++i) {
565 if (!parameters_[i]->is_distributed) {
568 if (dxdp != Teuchos::null) {
573 int num_params = parameters_[i]->scalar_value.size();
574 for (
int j=0; j<num_params; ++j) {
578 t_obj_container->set_x_th( dxdp_block->getNonconstVectorBlock(j) );
579 std::string name =
"X TANGENT GATHER CONTAINER: "+(*parameters_[i]->names)[j];
583 if (build_transient_support_) {
588 if (dxdotdp != Teuchos::null) {
591 int num_params = parameters_[i]->scalar_value.size();
592 for (
int j=0; j<num_params; ++j) {
596 t_obj_container->set_dxdt_th( dxdotdp_block->getNonconstVectorBlock(j) );
597 std::string name =
"DXDT TANGENT GATHER CONTAINER: "+(*parameters_[i]->names)[j];
610 template <
typename Scalar>
611 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
614 typedef Thyra::ModelEvaluatorBase MEB;
616 if(require_out_args_refresh_) {
617 MEB::OutArgsSetup<Scalar> outArgs;
618 outArgs.setModelEvalDescription(this->description());
619 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
620 outArgs.setSupports(MEB::OUT_ARG_f);
621 outArgs.setSupports(MEB::OUT_ARG_W_op);
624 for(std::size_t i=0;i<responses_.size();i++) {
629 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
630 if(respJacBase!=Teuchos::null) {
636 if(resp->supportsDerivative()) {
637 outArgs.setSupports(MEB::OUT_ARG_DgDx,i,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
640 for(std::size_t p=0;p<parameters_.size();p++) {
641 if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
642 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
643 if(!parameters_[p]->is_distributed)
644 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
651 for(std::size_t p=0;p<parameters_.size();p++) {
653 if(!parameters_[p]->is_distributed)
654 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
655 else if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
656 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
659 prototypeOutArgs_ = outArgs;
663 require_out_args_refresh_ =
false;
665 return prototypeOutArgs_;
668 template <
typename Scalar>
676 return tof->getThyraMatrix();
679 template <
typename Scalar>
684 return solverFactory_;
687 template <
typename Scalar>
693 using Teuchos::rcp_dynamic_cast;
695 typedef Thyra::ModelEvaluatorBase MEB;
707 if(require_out_args_refresh_) {
708 this->createOutArgs();
717 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_LINEAR_OP));
724 return response_jacobian->allocateJacobian();
727 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_MV_BY_COL));
730 return Thyra::createMember(*get_f_space());
736 return Teuchos::null;
739 template <
typename Scalar>
749 return addParameter(tmp_names,tmp_values);
752 template <
typename Scalar>
759 using Teuchos::rcp_dynamic_cast;
760 using Teuchos::ptrFromRef;
764 int parameter_index = parameters_.size();
768 parameters_.push_back(param);
772 Thyra::multiVectorProductVectorSpace(x_space_, param->names->size());
773 tangent_space_.push_back(tan_space);
777 num_me_parameters_ += 2;
778 if (build_transient_support_)
779 ++num_me_parameters_;
781 require_in_args_refresh_ =
true;
782 require_out_args_refresh_ =
true;
784 return parameter_index;
787 template <
typename Scalar>
795 distrParamGlobalEvaluationData_.addDataObject(key,ged);
797 int parameter_index = parameters_.size();
798 parameters_.push_back(createDistributedParameter(key,vs,initial,ugi));
799 ++num_me_parameters_;
801 require_in_args_refresh_ =
true;
802 require_out_args_refresh_ =
true;
804 return parameter_index;
807 template <
typename Scalar>
812 nonParamGlobalEvaluationData_.addDataObject(key,ged);
815 template <
typename Scalar>
818 const std::vector<WorksetDescriptor> & wkst_desc,
824 int respIndex = addResponse(responseName,wkst_desc,*builder);
827 responses_[respIndex]->builder = builder;
833 template <
typename Scalar>
841 using Teuchos::tuple;
842 using Teuchos::rcp_dynamic_cast;
846 ghostedContainer_ =
lof_->buildGhostedLinearObjContainer();
854 ae_inargs.
alpha = 0.0;
855 ae_inargs.
beta = 1.0;
877 Thyra::assign(thGhostedContainer->get_f_th().
ptr(),0.0);
886 thGlobalContainer->set_x_th(x);
890 = ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
897 thGlobalContainer->get_f_th());
903 lof_->applyDirichletBCs(*counter,*result);
906 template <
typename Scalar>
909 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
913 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 914 typedef Thyra::ModelEvaluatorBase MEB;
917 setParameters(inArgs);
920 std::string responseName = responses_[respIndex]->name;
923 responseLibrary_->getResponse<panzer::Traits::Hessian>(responseName));
924 resp->setDerivative(D2gDx2);
931 setupAssemblyInArgs(inArgs,ae_inargs);
933 ae_inargs.
beta = 1.0;
935 auto deltaXContainer =
lof_->buildDomainContainer();
936 deltaXContainer->setOwnedVector(delta_x);
940 responseLibrary_->addResponsesToInArgs<panzer::Traits::Hessian>(ae_inargs);
941 responseLibrary_->evaluate<panzer::Traits::Hessian>(ae_inargs);
950 template <
typename Scalar>
954 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
958 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 959 typedef Thyra::ModelEvaluatorBase MEB;
962 setParameters(inArgs);
965 std::string responseName = responses_[respIndex]->name;
968 responseLibrary_->getResponse<panzer::Traits::Hessian>(responseName));
969 resp->setDerivative(D2gDxDp);
976 setupAssemblyInArgs(inArgs,ae_inargs);
978 ae_inargs.
beta = 1.0;
981 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildDomainContainer();
982 deltaPContainer->setOwnedVector(delta_p);
986 responseLibrary_->addResponsesToInArgs<panzer::Traits::Hessian>(ae_inargs);
987 responseLibrary_->evaluate<panzer::Traits::Hessian>(ae_inargs);
996 template <
typename Scalar>
1000 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1004 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1005 typedef Thyra::ModelEvaluatorBase MEB;
1008 setParameters(inArgs);
1013 std::string responseName = responses_[respIndex]->name;
1016 rLibrary.
getResponse<panzer::Traits::Hessian>(responseName));
1017 resp->setDerivative(D2gDp2);
1024 setupAssemblyInArgs(inArgs,ae_inargs);
1031 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildDomainContainer();
1032 deltaPContainer->setOwnedVector(delta_p);
1037 rLibrary.
evaluate<panzer::Traits::Hessian>(ae_inargs);
1046 template <
typename Scalar>
1050 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1054 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1055 typedef Thyra::ModelEvaluatorBase MEB;
1058 setParameters(inArgs);
1063 std::string responseName = responses_[respIndex]->name;
1066 rLibrary.
getResponse<panzer::Traits::Hessian>(responseName));
1067 resp->setDerivative(D2gDpDx);
1074 setupAssemblyInArgs(inArgs,ae_inargs);
1081 auto deltaXContainer =
lof_->buildDomainContainer();
1082 deltaXContainer->setOwnedVector(delta_x);
1087 rLibrary.
evaluate<panzer::Traits::Hessian>(ae_inargs);
1096 template <
typename Scalar>
1102 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1107 using Teuchos::tuple;
1108 using Teuchos::rcp_dynamic_cast;
1110 typedef Thyra::ModelEvaluatorBase MEB;
1115 bool is_transient =
false;
1116 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1121 "ModelEvaluator was not built with transient support enabled!");
1132 setupAssemblyInArgs(inArgs,ae_inargs);
1134 auto deltaXContainer =
lof_->buildDomainContainer();
1135 deltaXContainer->setOwnedVector(delta_x);
1139 setParameters(inArgs);
1145 if(oneTimeDirichletBeta_on_) {
1149 oneTimeDirichletBeta_on_ =
false;
1159 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDx2)");
1163 thGlobalContainer->set_f_th(dummy_f);
1164 thGlobalContainer->set_A_th(W_out);
1167 thGhostedContainer->initializeMatrix(0.0);
1169 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1175 thGlobalContainer->set_A_th(Teuchos::null);
1181 thGlobalContainer->set_x_th(Teuchos::null);
1182 thGlobalContainer->set_dxdt_th(Teuchos::null);
1183 thGlobalContainer->set_f_th(Teuchos::null);
1184 thGlobalContainer->set_A_th(Teuchos::null);
1193 template <
typename Scalar>
1196 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1200 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1205 using Teuchos::tuple;
1206 using Teuchos::rcp_dynamic_cast;
1208 typedef Thyra::ModelEvaluatorBase MEB;
1213 bool is_transient =
false;
1214 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1219 "ModelEvaluator was not built with transient support enabled!");
1230 setupAssemblyInArgs(inArgs,ae_inargs);
1234 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildDomainContainer();
1235 deltaPContainer->setOwnedVector(delta_p);
1239 setParameters(inArgs);
1245 if(oneTimeDirichletBeta_on_) {
1249 oneTimeDirichletBeta_on_ =
false;
1259 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDxDp)");
1263 thGlobalContainer->set_f_th(dummy_f);
1264 thGlobalContainer->set_A_th(W_out);
1267 thGhostedContainer->initializeMatrix(0.0);
1269 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1275 thGlobalContainer->set_A_th(Teuchos::null);
1281 thGlobalContainer->set_x_th(Teuchos::null);
1282 thGlobalContainer->set_dxdt_th(Teuchos::null);
1283 thGlobalContainer->set_f_th(Teuchos::null);
1284 thGlobalContainer->set_A_th(Teuchos::null);
1293 template <
typename Scalar>
1296 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1300 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 1302 using Teuchos::rcp_dynamic_cast;
1303 using Teuchos::null;
1305 typedef Thyra::ModelEvaluatorBase MEB;
1319 response_hessian->setHessian(D2fDpDx);
1324 setupAssemblyInArgs(inArgs,ae_inargs);
1326 auto deltaXContainer =
lof_->buildDomainContainer();
1327 deltaXContainer->setOwnedVector(delta_x);
1336 rLibrary.
evaluate<Traits::Hessian>(ae_inargs);
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;
1354 typedef Thyra::ModelEvaluatorBase MEB;
1368 response_hessian->setHessian(D2fDp2);
1373 setupAssemblyInArgs(inArgs,ae_inargs);
1375 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildDomainContainer();
1376 deltaPContainer->setOwnedVector(delta_p);
1385 rLibrary.
evaluate<Traits::Hessian>(ae_inargs);
1391 template <
typename Scalar>
1394 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1396 evalModelImpl_basic(inArgs,outArgs);
1399 if(required_basic_g(outArgs))
1400 evalModelImpl_basic_g(inArgs,outArgs);
1403 if(required_basic_dgdx(outArgs))
1404 evalModelImpl_basic_dgdx(inArgs,outArgs);
1407 if(required_basic_dgdp_scalar(outArgs))
1408 evalModelImpl_basic_dgdp_scalar(inArgs,outArgs);
1411 if(required_basic_dgdp_distro(outArgs))
1412 evalModelImpl_basic_dgdp_distro(inArgs,outArgs);
1414 if(required_basic_dfdp_scalar(outArgs)) {
1416 evalModelImpl_basic_dfdp_scalar_fd(inArgs,outArgs);
1418 evalModelImpl_basic_dfdp_scalar(inArgs,outArgs);
1421 if(required_basic_dfdp_distro(outArgs))
1422 evalModelImpl_basic_dfdp_distro(inArgs,outArgs);
1425 template <
typename Scalar>
1428 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1433 using Teuchos::tuple;
1434 using Teuchos::rcp_dynamic_cast;
1436 typedef Thyra::ModelEvaluatorBase MEB;
1441 bool is_transient =
false;
1442 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1447 "ModelEvaluator was not built with transient support enabled!");
1464 setupAssemblyInArgs(inArgs,ae_inargs);
1467 setParameters(inArgs);
1473 if(oneTimeDirichletBeta_on_) {
1477 oneTimeDirichletBeta_on_ =
false;
1487 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
1493 thGlobalContainer->set_f_th(f_out);
1494 thGlobalContainer->set_A_th(W_out);
1497 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1498 thGhostedContainer->initializeMatrix(0.0);
1500 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1504 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
1509 thGlobalContainer->set_f_th(f_out);
1512 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1514 ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluate(ae_inargs);
1518 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
1525 thGlobalContainer->set_f_th(dummy_f);
1526 thGlobalContainer->set_A_th(W_out);
1529 thGhostedContainer->initializeMatrix(0.0);
1531 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1537 thGlobalContainer->set_A_th(Teuchos::null);
1543 thGlobalContainer->set_x_th(Teuchos::null);
1544 thGlobalContainer->set_dxdt_th(Teuchos::null);
1545 thGlobalContainer->set_f_th(Teuchos::null);
1546 thGlobalContainer->set_A_th(Teuchos::null);
1552 template <
typename Scalar>
1555 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1564 setupAssemblyInArgs(inArgs,ae_inargs);
1567 setParameters(inArgs);
1569 for(std::size_t i=0;i<responses_.size();i++) {
1571 if(vec!=Teuchos::null) {
1572 std::string responseName = responses_[i]->name;
1576 resp->setVector(vec);
1588 template <
typename Scalar>
1592 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1594 typedef Thyra::ModelEvaluatorBase MEB;
1600 setParameters(inArgs);
1602 for(std::size_t i=0;i<responses_.size();i++) {
1604 MEB::Derivative<Scalar> deriv = outArgs.get_DgDx(i);
1610 if(vec!=Teuchos::null) {
1612 std::string responseName = responses_[i]->name;
1616 resp->setDerivative(vec);
1624 setupAssemblyInArgs(inArgs,ae_inargs);
1634 template <
typename Scalar>
1638 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1642 using Teuchos::rcp_dynamic_cast;
1644 typedef Thyra::ModelEvaluatorBase MEB;
1650 std::vector<std::string> activeParameterNames;
1651 std::vector<int> activeParameters;
1652 int totalParameterCount = 0;
1653 for(std::size_t j=0; j<parameters_.size(); j++) {
1656 if(parameters_[j]->is_distributed)
1659 bool is_active =
false;
1660 for(std::size_t i=0;i<responses_.size(); i++) {
1662 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(i,j);
1667 if(vec!=Teuchos::null) {
1669 std::string responseName = responses_[i]->name;
1673 resp->setVector(vec);
1679 for (std::size_t k=0; k<parameters_[j]->scalar_value.size(); k++) {
1680 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[j]->names)[k];
1681 activeParameterNames.push_back(name);
1682 totalParameterCount++;
1684 activeParameters.push_back(j);
1690 setupAssemblyInArgs(inArgs,ae_inargs);
1699 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1700 const int j = activeParameters[ap];
1701 for (
unsigned int k=0; k < parameters_[j]->scalar_value.size(); k++) {
1703 p.fastAccessDx(paramIndex) = 1.0;
1704 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1713 if(totalParameterCount>0) {
1719 template <
typename Scalar>
1723 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1725 typedef Thyra::ModelEvaluatorBase MEB;
1734 for(std::size_t p=0;p<parameters_.size();p++) {
1738 if(!parameters_[p]->is_distributed)
1743 for(std::size_t r=0;r<responses_.size();r++) {
1745 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(r,p);
1751 if(vec!=Teuchos::null) {
1754 std::string responseName = responses_[r]->name;
1759 resp->setDerivative(vec);
1766 setupAssemblyInArgs(inArgs,ae_inargs);
1778 template <
typename Scalar>
1782 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1785 using Teuchos::rcp_dynamic_cast;
1787 typedef Thyra::ModelEvaluatorBase MEB;
1795 setupAssemblyInArgs(inArgs,ae_inargs);
1801 std::vector<std::string> activeParameters;
1803 int totalParameterCount = 0;
1804 for(std::size_t i=0; i < parameters_.size(); i++) {
1806 if(parameters_[i]->is_distributed)
1810 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1816 TEUCHOS_ASSERT(mVec->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1818 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1829 thGlobalContainer->set_f_th(vec);
1832 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[i]->names)[j];
1836 activeParameters.push_back(name);
1837 totalParameterCount++;
1854 for(std::size_t i=0; i < parameters_.size(); i++) {
1856 if(parameters_[i]->is_distributed)
1860 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1861 if(deriv.isEmpty()) {
1863 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1865 parameters_[i]->scalar_value[j].baseValue);
1866 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1872 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1874 parameters_[i]->scalar_value[j].baseValue);
1875 p.fastAccessDx(paramIndex) = 1.0;
1876 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1888 if(totalParameterCount>0) {
1889 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
1894 template <
typename Scalar>
1898 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 1900 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
1903 using Teuchos::rcp_dynamic_cast;
1905 typedef Thyra::ModelEvaluatorBase MEB;
1912 MEB::OutArgs<Scalar> outArgs_base = this->createOutArgs();
1913 if (outArgs.get_f() == Teuchos::null)
1914 outArgs_base.set_f(Thyra::createMember(this->get_f_space()));
1916 outArgs_base.set_f(outArgs.get_f());
1917 outArgs_base.set_W_op(outArgs.get_W_op());
1918 this->evalModel(inArgs, outArgs_base);
1922 if (inArgs.supports(MEB::IN_ARG_x_dot))
1923 x_dot = inArgs.get_x_dot();
1927 MEB::OutArgs<Scalar> outArgs_fd = this->createOutArgs();
1928 outArgs_fd.set_f(fd);
1932 if (x_dot != Teuchos::null)
1933 xd_dot = Thyra::createMember(this->get_x_space());
1934 MEB::InArgs<Scalar> inArgs_fd = this->createInArgs();
1935 inArgs_fd.setArgs(inArgs);
1936 inArgs_fd.set_x(xd);
1937 if (x_dot != Teuchos::null)
1938 inArgs_fd.set_x_dot(xd_dot);
1940 const double h = fd_perturb_size_;
1941 for(std::size_t i=0; i < parameters_.size(); i++) {
1944 if(parameters_[i]->is_distributed)
1948 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1954 TEUCHOS_ASSERT(dfdp->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1960 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_v,
true)->getMultiVector();
1963 if (x_dot != Teuchos::null) {
1964 dx_dot_v =inArgs.get_p(i+parameters_.size()+tangent_space_.size());
1966 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_dot_v,
true)->getMultiVector();
1971 inArgs_fd.set_p(i,pd);
1973 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1976 Thyra::copy(*p, pd.
ptr());
1977 Thyra::set_ele(j, Thyra::get_ele(*p,j)+h, pd.
ptr());
1980 Thyra::V_VpStV(xd.
ptr(), *x, h, *(dx)->col(j));
1981 if (x_dot != Teuchos::null)
1982 Thyra::V_VpStV(xd_dot.
ptr(), *x_dot, h, *(dx_dot)->col(j));
1985 Thyra::assign(fd.
ptr(), 0.0);
1986 this->evalModel(inArgs_fd, outArgs_fd);
1989 Thyra::V_StVpStV(dfdp->col(j).
ptr(), 1.0/h, *fd, -1.0/h, *f);
1992 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
1998 template <
typename Scalar>
2002 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const 2005 using Teuchos::rcp_dynamic_cast;
2006 using Teuchos::null;
2008 typedef Thyra::ModelEvaluatorBase MEB;
2016 for(std::size_t p=0;p<parameters_.size();p++) {
2020 if(!parameters_[p]->is_distributed)
2025 if(parameters_[p]->dfdp_rl==null)
2029 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2038 response_jacobian->setJacobian(deriv.getLinearOp());
2043 setupAssemblyInArgs(inArgs,ae_inargs);
2054 template <
typename Scalar>
2059 bool activeGArgs =
false;
2060 for(
int i=0;i<outArgs.Ng();i++)
2061 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
2063 return activeGArgs | required_basic_dgdx(outArgs);
2066 template <
typename Scalar>
2070 typedef Thyra::ModelEvaluatorBase MEB;
2073 bool activeGArgs =
false;
2074 for(
int i=0;i<outArgs.Ng();i++) {
2076 if(outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
2080 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
2086 template <
typename Scalar>
2090 typedef Thyra::ModelEvaluatorBase MEB;
2093 bool activeGArgs =
false;
2094 for(
int i=0;i<outArgs.Ng();i++) {
2095 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2098 if(parameters_[p]->is_distributed)
2102 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2105 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2112 template <
typename Scalar>
2116 typedef Thyra::ModelEvaluatorBase MEB;
2119 bool activeGArgs =
false;
2120 for(
int i=0;i<outArgs.Ng();i++) {
2121 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2124 if(!parameters_[p]->is_distributed)
2128 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2131 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2138 template <
typename Scalar>
2142 typedef Thyra::ModelEvaluatorBase MEB;
2145 bool activeFPArgs =
false;
2146 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2149 if(parameters_[i]->is_distributed)
2153 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2157 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2160 return activeFPArgs;
2163 template <
typename Scalar>
2167 typedef Thyra::ModelEvaluatorBase MEB;
2170 bool activeFPArgs =
false;
2171 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2174 if(!parameters_[i]->is_distributed)
2178 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2182 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2185 return activeFPArgs;
2188 template <
typename Scalar>
2193 const std::vector<panzer::BC> & bcs,
2199 const bool write_graphviz_file,
2200 const std::string& graphviz_file_prefix)
2204 using Teuchos::null;
2210 for(std::size_t p=0;p<parameters_.size();p++) {
2213 if(!parameters_[p]->is_distributed)
2218 if(parameters_[p]->global_indexer==null)
2224 parameters_[p]->global_indexer);
2230 rLibrary->buildResidualResponseEvaluators(physicsBlocks,eqset_factory,bcs,bc_factory,
2231 cm_factory,closure_models,user_data,
2232 write_graphviz_file,graphviz_file_prefix);
2235 parameters_[p]->dfdp_rl = rLibrary;
2239 template <
typename Scalar>
2244 const std::vector<panzer::BC> & bcs,
2250 const bool write_graphviz_file,
2251 const std::string& graphviz_file_prefix)
2255 using Teuchos::null;
2261 for(std::size_t p=0;p<parameters_.size();p++) {
2264 if(!parameters_[p]->is_distributed)
2269 if(parameters_[p]->global_indexer==null)
2283 for(std::size_t r=0;r<responses_.size();r++) {
2285 if(responses_[r]->builder==Teuchos::null)
2290 responses_[r]->builder->setDerivativeInformation(param_lof);
2293 rLibrary->addResponse(responses_[r]->name,
2294 responses_[r]->wkst_desc,
2295 *responses_[r]->builder);
2298 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2299 cm_factory,closure_models,user_data,
2300 write_graphviz_file,graphviz_file_prefix);
2303 parameters_[p]->dgdp_rl = rLibrary;
2307 template <
typename Scalar>
2311 oneTimeDirichletBeta_on_ =
true;
2312 oneTimeDirichletBeta_ = beta;
2315 template <
typename Scalar>
2323 using Teuchos::rcp_dynamic_cast;
2324 using Teuchos::ptrFromRef;
2338 paramObj->is_distributed =
false;
2341 for(
int i=0;i<in_names.
size();i++)
2349 Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(
2350 rcp(
new Teuchos::MpiComm<long int>(
lof_->getComm().getRawMpiComm())),paramObj->names->size());
2356 vec->getNonconstLocalData(ptrFromRef(data));
2357 for (
unsigned int i=0; i < paramObj->scalar_value.size(); i++)
2358 data[i] = in_values[i];
2360 paramObj->initial_value = initial_value;
2365 template <
typename Scalar>
2378 paramObj->is_distributed =
true;
2380 paramObj->names->push_back(key);
2381 paramObj->space = vs;
2382 paramObj->initial_value = initial;
2384 paramObj->global_indexer = ugi;
2389 template <
typename Scalar>
2394 for(std::size_t i=0; i < parameters_.size(); i++) {
2397 if(parameters_[i]->is_distributed)
2402 if (p != Teuchos::null) {
2403 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2404 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2411 template <
typename Scalar>
2416 for(std::size_t i=0; i < parameters_.size(); i++) {
2419 if(parameters_[i]->is_distributed)
2423 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2424 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*(parameters_[i]->initial_value),j));
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
PHX::MDField< ScalarT > vector
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Teuchos::RCP< panzer::GlobalData > global_data
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)
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