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"
66 #include "Thyra_TpetraThyraWrappers.hpp"
67 #include "Thyra_SpmdVectorBase.hpp"
68 #include "Thyra_DefaultSpmdVector.hpp"
69 #include "Thyra_DefaultSpmdVectorSpace.hpp"
70 #include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
71 #include "Thyra_DefaultMultiVectorProductVector.hpp"
72 #include "Thyra_MultiVectorStdOps.hpp"
73 #include "Thyra_VectorStdOps.hpp"
76 #include "Thyra_ProductVectorBase.hpp"
77 #include "Thyra_BlockedLinearOpBase.hpp"
78 #include "Thyra_TpetraVector.hpp"
79 #include "Thyra_TpetraLinearOp.hpp"
80 #include "Tpetra_CrsMatrix.hpp"
84 template<
typename Scalar>
93 bool build_transient_support,
96 , num_me_parameters_(0)
98 , fd_perturb_size_(1e-7)
99 , require_in_args_refresh_(true)
100 , require_out_args_refresh_(true)
101 , responseLibrary_(rLibrary)
102 , global_data_(global_data)
103 , build_transient_support_(build_transient_support)
105 , solverFactory_(solverFactory)
106 , oneTimeDirichletBeta_on_(false)
107 , oneTimeDirichletBeta_(0.0)
108 , build_volume_field_managers_(true)
109 , build_bc_field_managers_(true)
110 , active_evaluation_types_(Sacado::mpl::size<panzer::
Traits::EvalTypes>::value, true)
111 , write_matrix_count_(0)
115 using Teuchos::rcp_dynamic_cast;
116 using Teuchos::tuple;
118 using Thyra::createMember;
123 ae_tm_.buildObjects(builder);
132 x_space_ = tof->getThyraDomainSpace();
133 f_space_ = tof->getThyraRangeSpace();
138 for(std::size_t i=0;i<p_names.size();i++)
146 template<
typename Scalar>
151 bool build_transient_support,
double t_init)
153 , num_me_parameters_(0)
155 , fd_perturb_size_(1e-7)
156 , require_in_args_refresh_(true)
157 , require_out_args_refresh_(true)
158 , global_data_(global_data)
159 , build_transient_support_(build_transient_support)
161 , solverFactory_(solverFactory)
162 , oneTimeDirichletBeta_on_(false)
163 , oneTimeDirichletBeta_(0.0)
164 , build_volume_field_managers_(true)
165 , build_bc_field_managers_(true)
166 , active_evaluation_types_(Sacado::mpl::size<panzer::
Traits::EvalTypes>::value, true)
167 , write_matrix_count_(0)
170 using Teuchos::rcp_dynamic_cast;
181 x_space_ = tof->getThyraDomainSpace();
182 f_space_ = tof->getThyraRangeSpace();
192 template<
typename Scalar>
201 template<
typename Scalar>
209 template<
typename Scalar>
216 template<
typename Scalar>
221 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
223 if (i < Teuchos::as<int>(parameters_.size()))
224 return parameters_[i]->names;
225 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size())) {
227 int param_index = i-parameters_.size();
228 std::ostringstream ss;
229 ss <<
"TANGENT VECTOR: " << param_index;
230 names->push_back(ss.str());
233 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size())) {
235 int param_index = i-parameters_.size()-tangent_space_.size();
236 std::ostringstream ss;
237 ss <<
"TIME DERIVATIVE TANGENT VECTOR: " << param_index;
238 names->push_back(ss.str());
242 return Teuchos::null;
245 template<
typename Scalar>
250 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
252 if (i < Teuchos::as<int>(parameters_.size()))
253 return parameters_[i]->space;
254 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size()))
255 return tangent_space_[i-parameters_.size()];
256 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size()))
257 return tangent_space_[i-parameters_.size()-tangent_space_.size()];
259 return Teuchos::null;
262 template<
typename Scalar>
267 "panzer::ModelEvaluator::get_g_names: Requested response index out of range.");
272 template<
typename Scalar>
277 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
279 return responses_[i]->name;
282 template<
typename Scalar>
287 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >::size_type>(i)<responses_.size());
289 return responses_[i]->space;
292 template<
typename Scalar>
293 Thyra::ModelEvaluatorBase::InArgs<Scalar>
296 return getNominalValues();
299 template<
typename Scalar>
300 Thyra::ModelEvaluatorBase::InArgs<Scalar>
304 using Teuchos::rcp_dynamic_cast;
306 if(require_in_args_refresh_) {
307 typedef Thyra::ModelEvaluatorBase MEB;
314 MEB::InArgsSetup<Scalar> nomInArgs;
315 nomInArgs = nominalValues_;
316 nomInArgs.setSupports(nominalValues_);
319 nomInArgs.set_Np(num_me_parameters_);
320 for(std::size_t p=0;p<parameters_.size();p++) {
322 nomInArgs.set_p(p,parameters_[p]->initial_value);
328 nominalValues_ = nomInArgs;
332 require_in_args_refresh_ =
false;
334 return nominalValues_;
337 template<
typename Scalar>
341 typedef Thyra::ModelEvaluatorBase MEB;
347 MEB::InArgsSetup<Scalar> nomInArgs;
348 nomInArgs.setModelEvalDescription(this->description());
349 nomInArgs.setSupports(MEB::IN_ARG_x);
351 Thyra::assign(x_nom.
ptr(),0.0);
352 nomInArgs.set_x(x_nom);
353 if(build_transient_support_) {
354 nomInArgs.setSupports(MEB::IN_ARG_x_dot,
true);
355 nomInArgs.setSupports(MEB::IN_ARG_t,
true);
356 nomInArgs.setSupports(MEB::IN_ARG_alpha,
true);
357 nomInArgs.setSupports(MEB::IN_ARG_beta,
true);
358 nomInArgs.setSupports(MEB::IN_ARG_step_size,
true);
359 nomInArgs.setSupports(MEB::IN_ARG_stage_number,
true);
362 Thyra::assign(x_dot_nom.
ptr(),0.0);
363 nomInArgs.set_x_dot(x_dot_nom);
364 nomInArgs.set_t(t_init_);
365 nomInArgs.set_alpha(0.0);
366 nomInArgs.set_beta(0.0);
368 nomInArgs.set_step_size(0.0);
369 nomInArgs.set_stage_number(1.0);
373 nomInArgs.set_Np(num_me_parameters_);
374 std::size_t v_index = 0;
375 for(std::size_t p=0;p<parameters_.size();p++) {
376 nomInArgs.set_p(p,parameters_[p]->initial_value);
377 if (!parameters_[p]->is_distributed) {
379 Thyra::assign(v_nom_x.
ptr(),0.0);
380 nomInArgs.set_p(v_index+parameters_.size(),v_nom_x);
381 if (build_transient_support_) {
383 Thyra::assign(v_nom_xdot.
ptr(),0.0);
384 nomInArgs.set_p(v_index+parameters_.size()+tangent_space_.size(),v_nom_xdot);
390 nominalValues_ = nomInArgs;
393 template <
typename Scalar>
397 build_volume_field_managers_ = value;
400 template <
typename Scalar>
404 build_bc_field_managers_ = value;
407 template <
typename Scalar>
411 const std::vector<panzer::BC> & bcs,
418 bool writeGraph,
const std::string & graphPrefix,
423 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::ModelEvaluator::setupModel()",setupModel);
431 PANZER_FUNC_TIME_MONITOR_DIFF(
"allocate FieldManagerBuilder",allocFMB);
436 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setWorksetContainer()",setupWorksets);
439 if (build_volume_field_managers_) {
440 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupVolumeFieldManagers()",setupVolumeFieldManagers);
443 if (build_bc_field_managers_) {
444 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupBCFieldManagers()",setupBCFieldManagers);
445 fmb->
setupBCFieldManagers(bcs,physicsBlocks,eqset_factory,bc_cm_factory,bc_factory,closure_models,*lof_,user_data);
450 if (build_volume_field_managers_)
452 if (build_bc_field_managers_)
457 PANZER_FUNC_TIME_MONITOR_DIFF(
"AssemblyEngine_TemplateBuilder::buildObjects()",AETM_BuildObjects);
459 ae_tm_.buildObjects(builder);
467 PANZER_FUNC_TIME_MONITOR_DIFF(
"build response library",buildResponses);
469 responseLibrary_->initialize(wc,lof_->getRangeGlobalIndexer(),lof_);
471 buildResponses(physicsBlocks,eqset_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Responses_");
472 buildDistroParamDfDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DfDp_");
473 buildDistroParamDgDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DgDp_");
476 fd_perturb_size_ = 1.0e-7;
477 if (me_params.
isParameter(
"FD Forward Sensitivities"))
478 do_fd_dfdp_ = me_params.
get<
bool>(
"FD Forward Sensitivities");
480 fd_perturb_size_ = me_params.
get<
double>(
"FD Perturbation Size");
484 template <
typename Scalar>
491 using Teuchos::rcp_dynamic_cast;
492 using Teuchos::rcp_const_cast;
493 typedef Thyra::ModelEvaluatorBase MEB;
497 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
504 bool is_transient =
false;
505 if (inArgs.supports(MEB::IN_ARG_x_dot ))
509 xContainer_ = lof_->buildReadOnlyDomainContainer();
511 xdotContainer_ = lof_->buildReadOnlyDomainContainer();
518 "ModelEvaluator was not built with transient support enabled!");
520 ae_inargs.
container_ = lof_->buildLinearObjContainer();
522 ae_inargs.
alpha = 0.0;
523 ae_inargs.
beta = 1.0;
525 if (build_transient_support_) {
526 x_dot = inArgs.get_x_dot();
527 ae_inargs.
alpha = inArgs.get_alpha();
528 ae_inargs.
beta = inArgs.get_beta();
529 ae_inargs.
time = inArgs.get_t();
531 ae_inargs.
step_size= inArgs.get_step_size();
540 int num_param_vecs = parameters_.size();
541 for (
int i=0; i<num_param_vecs; i++) {
544 if ( paramVec!=Teuchos::null && !parameters_[i]->is_distributed) {
548 rcp_dynamic_cast<
const Thyra::SpmdVectorBase<Scalar> >(paramVec,
true)->getLocalData(Teuchos::ptrFromRef(p_data));
550 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
551 parameters_[i]->scalar_value[j].baseValue = p_data[j];
552 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(parameters_[i]->scalar_value[j].baseValue);
555 else if ( paramVec!=Teuchos::null && parameters_[i]->is_distributed) {
558 std::string key = (*parameters_[i]->names)[0];
566 if(loc_pair_ged!=Teuchos::null) {
573 ro_ged->setOwnedVector(paramVec);
600 xContainer_->setOwnedVector(x);
605 xdotContainer_->setOwnedVector(x_dot);
615 for (
int i(0); i < num_param_vecs; ++i)
621 if (not parameters_[i]->is_distributed)
623 auto dxdp = rcp_const_cast<VectorBase<Scalar>>
624 (inArgs.get_p(vIndex + num_param_vecs));
625 if (not dxdp.is_null())
629 auto dxdpBlock = rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdp);
630 int numParams(parameters_[i]->scalar_value.size());
631 for (
int j(0); j < numParams; ++j)
633 RCP<ROVGED> dxdpContainer = lof_->buildReadOnlyDomainContainer();
634 dxdpContainer->setOwnedVector(dxdpBlock->getNonconstVectorBlock(j));
635 string name(
"X TANGENT GATHER CONTAINER: " +
636 (*parameters_[i]->names)[j]);
640 if (build_transient_support_)
644 auto dxdotdp = rcp_const_cast<VectorBase<Scalar>>
645 (inArgs.get_p(vIndex + num_param_vecs + tangent_space_.size()));
646 if (not dxdotdp.is_null())
649 rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdotdp);
650 int numParams(parameters_[i]->scalar_value.size());
651 for (
int j(0); j < numParams; ++j)
653 RCP<ROVGED> dxdotdpContainer = lof_->buildReadOnlyDomainContainer();
654 dxdotdpContainer->setOwnedVector(
655 dxdotdpBlock->getNonconstVectorBlock(j));
656 string name(
"DXDT TANGENT GATHER CONTAINER: " +
657 (*parameters_[i]->names)[j]);
670 template <
typename Scalar>
671 Thyra::ModelEvaluatorBase::OutArgs<Scalar>
674 typedef Thyra::ModelEvaluatorBase MEB;
676 if(require_out_args_refresh_) {
677 MEB::OutArgsSetup<Scalar> outArgs;
678 outArgs.setModelEvalDescription(this->description());
679 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
680 outArgs.setSupports(MEB::OUT_ARG_f);
681 outArgs.setSupports(MEB::OUT_ARG_W_op);
684 for(std::size_t i=0;i<responses_.size();i++) {
689 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
690 if(respJacBase!=Teuchos::null) {
696 if(resp->supportsDerivative()) {
697 outArgs.setSupports(MEB::OUT_ARG_DgDx,i,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
700 for(std::size_t p=0;p<parameters_.size();p++) {
701 if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
702 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
703 if(!parameters_[p]->is_distributed)
704 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
711 for(std::size_t p=0;p<parameters_.size();p++) {
713 if(!parameters_[p]->is_distributed)
714 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
715 else if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
716 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
719 prototypeOutArgs_ = outArgs;
723 require_out_args_refresh_ =
false;
725 return prototypeOutArgs_;
728 template <
typename Scalar>
733 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::create_W_op");
737 return tof->getThyraMatrix();
740 template <
typename Scalar>
745 return solverFactory_;
748 template <
typename Scalar>
754 using Teuchos::rcp_dynamic_cast;
756 typedef Thyra::ModelEvaluatorBase MEB;
768 if(require_out_args_refresh_) {
769 this->createOutArgs();
778 TEUCHOS_ASSERT(prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_LINEAR_OP));
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());
797 return Teuchos::null;
800 template <
typename Scalar>
810 return addParameter(tmp_names,tmp_values);
813 template <
typename Scalar>
820 using Teuchos::rcp_dynamic_cast;
821 using Teuchos::ptrFromRef;
825 int parameter_index = parameters_.size();
829 parameters_.push_back(param);
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>
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>
875 nonParamGlobalEvaluationData_.addDataObject(key,ged);
878 template <
typename Scalar>
881 const std::vector<WorksetDescriptor> & wkst_desc,
887 int respIndex = addResponse(responseName,wkst_desc,*builder);
890 responses_[respIndex]->builder = builder;
896 template <
typename Scalar>
904 using Teuchos::tuple;
905 using Teuchos::rcp_dynamic_cast;
909 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
915 ae_inargs.
container_ = lof_->buildLinearObjContainer();
917 ae_inargs.
alpha = 0.0;
918 ae_inargs.
beta = 1.0;
940 Thyra::assign(thGhostedContainer->get_f_th().
ptr(),0.0);
949 thGlobalContainer->set_x_th(x);
953 = ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
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;
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);
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;
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);
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;
1086 resp->setDerivative(D2gDp2);
1093 setupAssemblyInArgs(inArgs,ae_inargs);
1100 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1101 deltaPContainer->setOwnedVector(delta_p);
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;
1140 resp->setDerivative(D2gDpDx);
1147 setupAssemblyInArgs(inArgs,ae_inargs);
1154 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1155 deltaXContainer->setOwnedVector(delta_x);
1174 template <
typename Scalar>
1180 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
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 ))
1199 "ModelEvaluator was not built with transient support enabled!");
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;
1237 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDx2)");
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);
1257 thGlobalContainer->set_x_th(Teuchos::null);
1258 thGlobalContainer->set_dxdt_th(Teuchos::null);
1259 thGlobalContainer->set_f_th(Teuchos::null);
1260 thGlobalContainer->set_A_th(Teuchos::null);
1272 template <
typename Scalar>
1275 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1279 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
1284 using Teuchos::tuple;
1285 using Teuchos::rcp_dynamic_cast;
1287 typedef Thyra::ModelEvaluatorBase MEB;
1292 bool is_transient =
false;
1293 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1298 "ModelEvaluator was not built with transient support enabled!");
1309 setupAssemblyInArgs(inArgs,ae_inargs);
1313 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1314 deltaPContainer->setOwnedVector(delta_p);
1318 setParameters(inArgs);
1324 if(oneTimeDirichletBeta_on_) {
1328 oneTimeDirichletBeta_on_ =
false;
1338 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDxDp)");
1342 thGlobalContainer->set_f_th(dummy_f);
1343 thGlobalContainer->set_A_th(W_out);
1346 thGhostedContainer->initializeMatrix(0.0);
1348 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1354 thGlobalContainer->set_A_th(Teuchos::null);
1358 thGlobalContainer->set_x_th(Teuchos::null);
1359 thGlobalContainer->set_dxdt_th(Teuchos::null);
1360 thGlobalContainer->set_f_th(Teuchos::null);
1361 thGlobalContainer->set_A_th(Teuchos::null);
1374 template <
typename Scalar>
1377 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1381 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
1383 using Teuchos::rcp_dynamic_cast;
1384 using Teuchos::null;
1398 response_hessian->setHessian(D2fDpDx);
1403 setupAssemblyInArgs(inArgs,ae_inargs);
1405 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1406 deltaXContainer->setOwnedVector(delta_x);
1425 template <
typename Scalar>
1428 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1432 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
1434 using Teuchos::rcp_dynamic_cast;
1435 using Teuchos::null;
1449 response_hessian->setHessian(D2fDp2);
1454 setupAssemblyInArgs(inArgs,ae_inargs);
1456 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1457 deltaPContainer->setOwnedVector(delta_p);
1476 template <
typename Scalar>
1479 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1481 evalModelImpl_basic(inArgs,outArgs);
1484 if(required_basic_g(outArgs))
1485 evalModelImpl_basic_g(inArgs,outArgs);
1488 if(required_basic_dgdx(outArgs))
1489 evalModelImpl_basic_dgdx(inArgs,outArgs);
1492 if(required_basic_dgdp_scalar(outArgs))
1493 evalModelImpl_basic_dgdp_scalar(inArgs,outArgs);
1496 if(required_basic_dgdp_distro(outArgs))
1497 evalModelImpl_basic_dgdp_distro(inArgs,outArgs);
1499 if(required_basic_dfdp_scalar(outArgs)) {
1501 evalModelImpl_basic_dfdp_scalar_fd(inArgs,outArgs);
1503 evalModelImpl_basic_dfdp_scalar(inArgs,outArgs);
1506 if(required_basic_dfdp_distro(outArgs))
1507 evalModelImpl_basic_dfdp_distro(inArgs,outArgs);
1510 template <
typename Scalar>
1513 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1518 using Teuchos::tuple;
1519 using Teuchos::rcp_dynamic_cast;
1521 typedef Thyra::ModelEvaluatorBase MEB;
1526 bool is_transient =
false;
1527 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1532 "ModelEvaluator was not built with transient support enabled!");
1549 setupAssemblyInArgs(inArgs,ae_inargs);
1552 setParameters(inArgs);
1558 if(oneTimeDirichletBeta_on_) {
1562 oneTimeDirichletBeta_on_ =
false;
1572 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
1578 thGlobalContainer->set_f_th(f_out);
1579 thGlobalContainer->set_A_th(W_out);
1582 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1583 thGhostedContainer->initializeMatrix(0.0);
1585 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1589 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
1594 thGlobalContainer->set_f_th(f_out);
1597 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1599 ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluate(ae_inargs);
1603 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
1610 thGlobalContainer->set_f_th(dummy_f);
1611 thGlobalContainer->set_A_th(W_out);
1614 thGhostedContainer->initializeMatrix(0.0);
1616 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1622 thGlobalContainer->set_A_th(Teuchos::null);
1626 thGlobalContainer->set_x_th(Teuchos::null);
1627 thGlobalContainer->set_dxdt_th(Teuchos::null);
1628 thGlobalContainer->set_f_th(Teuchos::null);
1629 thGlobalContainer->set_A_th(Teuchos::null);
1634 const bool writeToFile =
false;
1635 if (writeToFile &&
nonnull(W_out)) {
1637 if (check_blocked) {
1638 const int numBlocks = check_blocked->productDomain()->numBlocks();
1639 const int rangeBlocks = check_blocked->productRange()->numBlocks();
1641 for (
int row=0; row < numBlocks; ++row) {
1642 for (
int col=0; col < numBlocks; ++col) {
1643 using LO = panzer::LocalOrdinal;
1644 using GO = panzer::GlobalOrdinal;
1646 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(check_blocked->getNonconstBlock(row,col),
true);
1647 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1648 tpetraCrsMatrix->print(std::cout);
1649 std::stringstream ss;
1650 ss <<
"W_out_" << write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".block_" << row <<
"_" << col <<
".txt";
1651 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1659 using LO = panzer::LocalOrdinal;
1660 using GO = panzer::GlobalOrdinal;
1662 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(W_out,
true);
1663 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1664 tpetraCrsMatrix->print(std::cout);
1665 std::stringstream ss;
1666 ss <<
"W_out_" << write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".txt";
1667 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1672 ++write_matrix_count_;
1677 template <
typename Scalar>
1680 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1689 setupAssemblyInArgs(inArgs,ae_inargs);
1692 setParameters(inArgs);
1694 for(std::size_t i=0;i<responses_.size();i++) {
1696 if(vec!=Teuchos::null) {
1697 std::string responseName = responses_[i]->name;
1701 resp->setVector(vec);
1713 template <
typename Scalar>
1717 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1719 typedef Thyra::ModelEvaluatorBase MEB;
1725 setParameters(inArgs);
1727 for(std::size_t i=0;i<responses_.size();i++) {
1729 MEB::Derivative<Scalar> deriv = outArgs.get_DgDx(i);
1735 if(vec!=Teuchos::null) {
1737 std::string responseName = responses_[i]->name;
1741 resp->setDerivative(vec);
1749 setupAssemblyInArgs(inArgs,ae_inargs);
1759 template <
typename Scalar>
1763 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1767 using Teuchos::rcp_dynamic_cast;
1769 typedef Thyra::ModelEvaluatorBase MEB;
1775 std::vector<std::string> activeParameterNames;
1776 std::vector<int> activeParameters;
1777 int totalParameterCount = 0;
1778 for(std::size_t j=0; j<parameters_.size(); j++) {
1781 if(parameters_[j]->is_distributed)
1784 bool is_active =
false;
1785 for(std::size_t i=0;i<responses_.size(); i++) {
1787 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(i,j);
1792 if(vec!=Teuchos::null) {
1794 std::string responseName = responses_[i]->name;
1798 resp->setVector(vec);
1804 for (std::size_t k=0; k<parameters_[j]->scalar_value.size(); k++) {
1805 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[j]->names)[k];
1806 activeParameterNames.push_back(name);
1807 totalParameterCount++;
1809 activeParameters.push_back(j);
1815 setupAssemblyInArgs(inArgs,ae_inargs);
1824 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1825 const int j = activeParameters[ap];
1826 for (
unsigned int k=0; k < parameters_[j]->scalar_value.size(); k++) {
1828 p.fastAccessDx(paramIndex) = 1.0;
1829 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1838 if(totalParameterCount>0) {
1844 template <
typename Scalar>
1848 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1850 typedef Thyra::ModelEvaluatorBase MEB;
1859 for(std::size_t p=0;p<parameters_.size();p++) {
1863 if(!parameters_[p]->is_distributed)
1868 for(std::size_t r=0;r<responses_.size();r++) {
1870 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(r,p);
1876 if(vec!=Teuchos::null) {
1879 std::string responseName = responses_[r]->name;
1884 resp->setDerivative(vec);
1891 setupAssemblyInArgs(inArgs,ae_inargs);
1903 template <
typename Scalar>
1907 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1910 using Teuchos::rcp_dynamic_cast;
1912 typedef Thyra::ModelEvaluatorBase MEB;
1920 setupAssemblyInArgs(inArgs,ae_inargs);
1926 std::vector<std::string> activeParameters;
1928 int totalParameterCount = 0;
1929 for(std::size_t i=0; i < parameters_.size(); i++) {
1931 if(parameters_[i]->is_distributed)
1935 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1941 TEUCHOS_ASSERT(mVec->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
1943 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
1954 thGlobalContainer->set_f_th(vec);
1957 std::string name =
"PARAMETER_SENSITIVIES: "+(*parameters_[i]->names)[j];
1961 activeParameters.push_back(name);
1962 totalParameterCount++;
1979 for(std::size_t i=0; i < parameters_.size(); i++) {
1981 if(parameters_[i]->is_distributed)
1985 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1986 if(deriv.isEmpty()) {
1988 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1990 parameters_[i]->scalar_value[j].baseValue);
1991 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
1997 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
1999 parameters_[i]->scalar_value[j].baseValue);
2000 p.fastAccessDx(paramIndex) = 1.0;
2001 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
2013 if(totalParameterCount>0) {
2014 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
2019 template <
typename Scalar>
2023 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2025 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(df/dp)");
2028 using Teuchos::rcp_dynamic_cast;
2030 typedef Thyra::ModelEvaluatorBase MEB;
2037 MEB::OutArgs<Scalar> outArgs_base = this->createOutArgs();
2038 if (outArgs.get_f() == Teuchos::null)
2039 outArgs_base.set_f(Thyra::createMember(this->get_f_space()));
2041 outArgs_base.set_f(outArgs.get_f());
2042 outArgs_base.set_W_op(outArgs.get_W_op());
2043 this->evalModel(inArgs, outArgs_base);
2047 if (inArgs.supports(MEB::IN_ARG_x_dot))
2048 x_dot = inArgs.get_x_dot();
2052 MEB::OutArgs<Scalar> outArgs_fd = this->createOutArgs();
2053 outArgs_fd.set_f(fd);
2057 if (x_dot != Teuchos::null)
2058 xd_dot = Thyra::createMember(this->get_x_space());
2059 MEB::InArgs<Scalar> inArgs_fd = this->createInArgs();
2060 inArgs_fd.setArgs(inArgs);
2061 inArgs_fd.set_x(xd);
2062 if (x_dot != Teuchos::null)
2063 inArgs_fd.set_x_dot(xd_dot);
2065 const double h = fd_perturb_size_;
2066 for(std::size_t i=0; i < parameters_.size(); i++) {
2069 if(parameters_[i]->is_distributed)
2073 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
2079 TEUCHOS_ASSERT(dfdp->domain()->dim()==Teuchos::as<int>(parameters_[i]->scalar_value.size()));
2085 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_v,
true)->
getMultiVector();
2088 if (x_dot != Teuchos::null) {
2089 dx_dot_v =inArgs.get_p(i+parameters_.size()+tangent_space_.size());
2091 rcp_dynamic_cast<
const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_dot_v,
true)->
getMultiVector();
2096 inArgs_fd.set_p(i,pd);
2098 for (std::size_t j=0; j < parameters_[i]->scalar_value.size(); j++) {
2101 Thyra::copy(*p, pd.
ptr());
2102 Thyra::set_ele(j, Thyra::get_ele(*p,j)+h, pd.
ptr());
2105 Thyra::V_VpStV(xd.
ptr(), *x, h, *(dx)->col(j));
2106 if (x_dot != Teuchos::null)
2107 Thyra::V_VpStV(xd_dot.
ptr(), *x_dot, h, *(dx_dot)->col(j));
2110 Thyra::assign(fd.
ptr(), 0.0);
2111 this->evalModel(inArgs_fd, outArgs_fd);
2114 Thyra::V_StVpStV(dfdp->col(j).
ptr(), 1.0/h, *fd, -1.0/h, *f);
2117 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2123 template <
typename Scalar>
2127 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2130 using Teuchos::rcp_dynamic_cast;
2131 using Teuchos::null;
2133 typedef Thyra::ModelEvaluatorBase MEB;
2141 for(std::size_t p=0;p<parameters_.size();p++) {
2145 if(!parameters_[p]->is_distributed)
2150 if(parameters_[p]->dfdp_rl==null)
2154 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2163 response_jacobian->setJacobian(deriv.getLinearOp());
2168 setupAssemblyInArgs(inArgs,ae_inargs);
2179 template <
typename Scalar>
2184 bool activeGArgs =
false;
2185 for(
int i=0;i<outArgs.Ng();i++)
2186 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
2188 return activeGArgs | required_basic_dgdx(outArgs);
2191 template <
typename Scalar>
2195 typedef Thyra::ModelEvaluatorBase MEB;
2198 bool activeGArgs =
false;
2199 for(
int i=0;i<outArgs.Ng();i++) {
2201 if(outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
2205 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
2211 template <
typename Scalar>
2215 typedef Thyra::ModelEvaluatorBase MEB;
2218 bool activeGArgs =
false;
2219 for(
int i=0;i<outArgs.Ng();i++) {
2220 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2223 if(parameters_[p]->is_distributed)
2227 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2230 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2237 template <
typename Scalar>
2241 typedef Thyra::ModelEvaluatorBase MEB;
2244 bool activeGArgs =
false;
2245 for(
int i=0;i<outArgs.Ng();i++) {
2246 for(
int p=0;p<Teuchos::as<int>(parameters_.size());p++) {
2249 if(!parameters_[p]->is_distributed)
2253 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2256 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2263 template <
typename Scalar>
2267 typedef Thyra::ModelEvaluatorBase MEB;
2270 bool activeFPArgs =
false;
2271 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2274 if(parameters_[i]->is_distributed)
2278 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2282 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2285 return activeFPArgs;
2288 template <
typename Scalar>
2292 typedef Thyra::ModelEvaluatorBase MEB;
2295 bool activeFPArgs =
false;
2296 for(
int i=0;i<Teuchos::as<int>(parameters_.size());i++) {
2299 if(!parameters_[i]->is_distributed)
2303 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2307 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2310 return activeFPArgs;
2313 template <
typename Scalar>
2318 const std::vector<panzer::BC> & bcs,
2324 const bool write_graphviz_file,
2325 const std::string& graphviz_file_prefix)
2329 using Teuchos::null;
2335 for(std::size_t p=0;p<parameters_.size();p++) {
2338 if(!parameters_[p]->is_distributed)
2343 if(parameters_[p]->global_indexer==null)
2349 parameters_[p]->global_indexer);
2355 rLibrary->buildResidualResponseEvaluators(physicsBlocks,eqset_factory,bcs,bc_factory,
2356 cm_factory,closure_models,user_data,
2357 write_graphviz_file,graphviz_file_prefix);
2360 parameters_[p]->dfdp_rl = rLibrary;
2364 template <
typename Scalar>
2369 const std::vector<panzer::BC>& ,
2375 const bool write_graphviz_file,
2376 const std::string& graphviz_file_prefix)
2380 using Teuchos::null;
2386 for(std::size_t p=0;p<parameters_.size();p++) {
2389 if(!parameters_[p]->is_distributed)
2394 if(parameters_[p]->global_indexer==null)
2408 for(std::size_t r=0;r<responses_.size();r++) {
2410 if(responses_[r]->builder==Teuchos::null)
2415 responses_[r]->builder->setDerivativeInformation(param_lof);
2418 rLibrary->addResponse(responses_[r]->name,
2419 responses_[r]->wkst_desc,
2420 *responses_[r]->builder);
2423 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2424 cm_factory,closure_models,user_data,
2425 write_graphviz_file,graphviz_file_prefix);
2428 parameters_[p]->dgdp_rl = rLibrary;
2432 template <
typename Scalar>
2436 oneTimeDirichletBeta_on_ =
true;
2437 oneTimeDirichletBeta_ = beta;
2440 template <
typename Scalar>
2448 using Teuchos::rcp_dynamic_cast;
2449 using Teuchos::ptrFromRef;
2463 paramObj->is_distributed =
false;
2466 for(
int i=0;i<in_names.
size();i++)
2474 Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(
2481 vec->getNonconstLocalData(ptrFromRef(data));
2482 for (
unsigned int i=0; i < paramObj->scalar_value.size(); i++)
2483 data[i] = in_values[i];
2485 paramObj->initial_value = initial_value;
2490 template <
typename Scalar>
2503 paramObj->is_distributed =
true;
2505 paramObj->names->push_back(key);
2506 paramObj->space = vs;
2507 paramObj->initial_value = initial;
2509 paramObj->global_indexer = ugi;
2514 template <
typename Scalar>
2519 for(std::size_t i=0; i < parameters_.size(); i++) {
2522 if(parameters_[i]->is_distributed)
2527 if (p != Teuchos::null) {
2528 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2529 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2536 template <
typename Scalar>
2541 for(std::size_t i=0; i < parameters_.size(); i++) {
2544 if(parameters_[i]->is_distributed)
2548 for (
unsigned int j=0; j < parameters_[i]->scalar_value.size(); j++) {
2549 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*(parameters_[i]->initial_value),j));
2555 #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.
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)
Allocates and initializes an equation set template manager.
bool evaluate_transient_terms
virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
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 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
void initializeNominalValues() const
Initialize the nominal values with good starting conditions.
void resetParameters() 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)
T & get(const std::string &name, T def_value)
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
bool is_null(const std::shared_ptr< T > &p)
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 writeVolumeGraphvizDependencyFiles(std::string filename_prefix, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const override
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) 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="")
Teuchos::RCP< LinearObjContainer > getGlobalLOC() const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const override
void evalModel_D2fDxDp(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDxDp) const
void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, panzer::AssemblyEngineInArgs &ae_inargs) const
void buildVolumeFieldManagers(const bool value)
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const override
void writeBCGraphvizDependencyFiles(std::string filename_prefix) const
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< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const override
void setOneTimeDirichletBeta(const Scalar &beta) 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 evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDx2) const
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
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.
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
const std::string & get_g_name(int i) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const override
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
void evaluate(const panzer::AssemblyEngineInArgs &input_args)
Teuchos::RCP< LinearObjContainer > getGhostedLOC() const
Teuchos::RCP< panzer::LinearObjContainer > container_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
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)
void setWorksetContainer(const Teuchos::RCP< WorksetContainer > &wc)
bool isParameter(const std::string &name) const
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.
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_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
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
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > lof_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const override
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const override
virtual void setDerivativeInformation(const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &linearObjFactory)=0
Teuchos::RCP< ResponseBase > getResponse(const std::string &responseName) const
virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) 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())
virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const override
bool nonnull(const boost::shared_ptr< T > &p)
void push_back(const value_type &x)
std::string first_sensitivities_name
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)
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.
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 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)
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) const
#define TEUCHOS_ASSERT(assertion_test)
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...
Tpetra::KokkosCompat::KokkosDeviceWrapperNode< PHX::Device > TpetraNodeType
void registerScalarParameter(const std::string name, panzer::ParamLib &pl, double realValue)
void setActiveEvaluationTypes(const std::vector< bool > &aet)
Set a vector of active evaluation types to allocate.
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void buildBCFieldManagers(const bool value)
int addParameter(const std::string &name, const Scalar &initial)