11#ifndef __Panzer_ModelEvaluator_impl_hpp__
12#define __Panzer_ModelEvaluator_impl_hpp__
14#include "Teuchos_DefaultComm.hpp"
15#include "Teuchos_ArrayRCP.hpp"
17#include "PanzerDiscFE_config.hpp"
34#include "Thyra_TpetraThyraWrappers.hpp"
35#include "Thyra_SpmdVectorBase.hpp"
36#include "Thyra_DefaultSpmdVector.hpp"
37#include "Thyra_DefaultSpmdVectorSpace.hpp"
38#include "Thyra_DefaultMultiVectorProductVectorSpace.hpp"
39#include "Thyra_DefaultMultiVectorProductVector.hpp"
40#include "Thyra_MultiVectorStdOps.hpp"
41#include "Thyra_VectorStdOps.hpp"
44#include "Thyra_ProductVectorBase.hpp"
45#include "Thyra_BlockedLinearOpBase.hpp"
46#include "Thyra_TpetraVector.hpp"
47#include "Thyra_TpetraLinearOp.hpp"
48#include "Tpetra_CrsMatrix.hpp"
50#include <Teuchos_RCPDecl.hpp>
54template<
typename Scalar>
56ModelEvaluator(
const Teuchos::RCP<panzer::FieldManagerBuilder>& fmb,
59 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
60 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
62 const Teuchos::RCP<panzer::GlobalData>& global_data,
63 bool build_transient_support,
85 using Teuchos::rcp_dynamic_cast;
88 using Thyra::createMember;
90 TEUCHOS_ASSERT(
lof_!=Teuchos::null);
93 ae_tm_.buildObjects(builder);
100 RCP<const ThyraObjFactory<Scalar> > tof = rcp_dynamic_cast<const ThyraObjFactory<Scalar> >(lof,
true);
102 x_space_ = tof->getThyraDomainSpace();
103 f_space_ = tof->getThyraRangeSpace();
108 for(std::size_t i=0;i<p_names.size();i++)
116template<
typename Scalar>
120 const Teuchos::RCP<panzer::GlobalData>& global_data,
121 bool build_transient_support,
double t_init)
140 using Teuchos::rcp_dynamic_cast;
142 TEUCHOS_ASSERT(
lof_!=Teuchos::null);
149 RCP<const ThyraObjFactory<Scalar> > tof = rcp_dynamic_cast<const ThyraObjFactory<Scalar> >(
lof_,
true);
151 x_space_ = tof->getThyraDomainSpace();
152 f_space_ = tof->getThyraRangeSpace();
162template<
typename Scalar>
166 TEUCHOS_ASSERT(
false);
171template<
typename Scalar>
172Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
179template<
typename Scalar>
180Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
186template<
typename Scalar>
187Teuchos::RCP<const Teuchos::Array<std::string> >
191 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
196 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
198 std::ostringstream ss;
199 ss <<
"TANGENT VECTOR: " << param_index;
200 names->push_back(ss.str());
204 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
206 std::ostringstream ss;
207 ss <<
"TIME DERIVATIVE TANGENT VECTOR: " << param_index;
208 names->push_back(ss.str());
212 return Teuchos::null;
215template<
typename Scalar>
216Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
220 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
229 return Teuchos::null;
232template<
typename Scalar>
233Teuchos::ArrayView<const std::string>
236 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<Teuchos::as<int>(
responses_.size())),std::runtime_error,
237 "panzer::ModelEvaluator::get_g_names: Requested response index out of range.");
239 return Teuchos::ArrayView<const std::string>(&(
responses_[i]->name),1);
242template<
typename Scalar>
246 TEUCHOS_ASSERT(i>=0 &&
247 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >
::size_type>(i)<
responses_.size());
252template<
typename Scalar>
253Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> >
256 TEUCHOS_ASSERT(i>=0 &&
257 static_cast<typename std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar>
> >
::size_type>(i)<
responses_.size());
262template<
typename Scalar>
263Thyra::ModelEvaluatorBase::InArgs<Scalar>
269template<
typename Scalar>
270Thyra::ModelEvaluatorBase::InArgs<Scalar>
274 using Teuchos::rcp_dynamic_cast;
277 typedef Thyra::ModelEvaluatorBase MEB;
284 MEB::InArgsSetup<Scalar> nomInArgs;
307template<
typename Scalar>
311 typedef Thyra::ModelEvaluatorBase MEB;
317 MEB::InArgsSetup<Scalar> nomInArgs;
318 nomInArgs.setModelEvalDescription(this->description());
319 nomInArgs.setSupports(MEB::IN_ARG_x);
320 Teuchos::RCP<Thyra::VectorBase<Scalar> > x_nom = Thyra::createMember(
x_space_);
321 Thyra::assign(x_nom.ptr(),0.0);
322 nomInArgs.set_x(x_nom);
324 nomInArgs.setSupports(MEB::IN_ARG_x_dot,
true);
325 nomInArgs.setSupports(MEB::IN_ARG_t,
true);
326 nomInArgs.setSupports(MEB::IN_ARG_alpha,
true);
327 nomInArgs.setSupports(MEB::IN_ARG_beta,
true);
328 nomInArgs.setSupports(MEB::IN_ARG_step_size,
true);
329 nomInArgs.setSupports(MEB::IN_ARG_stage_number,
true);
331 Teuchos::RCP<Thyra::VectorBase<Scalar> > x_dot_nom = Thyra::createMember(
x_space_);
332 Thyra::assign(x_dot_nom.ptr(),0.0);
333 nomInArgs.set_x_dot(x_dot_nom);
335 nomInArgs.set_alpha(0.0);
336 nomInArgs.set_beta(0.0);
338 nomInArgs.set_step_size(0.0);
339 nomInArgs.set_stage_number(1.0);
344 std::size_t v_index = 0;
348 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_x = Thyra::createMember(*
tangent_space_[v_index]);
349 Thyra::assign(v_nom_x.ptr(),0.0);
350 nomInArgs.set_p(v_index+
parameters_.size(),v_nom_x);
352 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_xdot = Thyra::createMember(*
tangent_space_[v_index]);
353 Thyra::assign(v_nom_xdot.ptr(),0.0);
363template <
typename Scalar>
370template <
typename Scalar>
377template <
typename Scalar>
379setupModel(
const Teuchos::RCP<panzer::WorksetContainer> & wc,
380 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
381 const std::vector<panzer::BC> & bcs,
386 const Teuchos::ParameterList& closure_models,
387 const Teuchos::ParameterList& user_data,
388 bool writeGraph,
const std::string & graphPrefix,
389 const Teuchos::ParameterList& me_params)
393 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::ModelEvaluator::setupModel()",
setupModel);
399 Teuchos::RCP<panzer::FieldManagerBuilder> fmb;
401 PANZER_FUNC_TIME_MONITOR_DIFF(
"allocate FieldManagerBuilder",allocFMB);
406 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setWorksetContainer()",setupWorksets);
407 fmb->setWorksetContainer(wc);
410 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupVolumeFieldManagers()",setupVolumeFieldManagers);
411 fmb->setupVolumeFieldManagers(physicsBlocks,volume_cm_factory,closure_models,*
lof_,user_data);
414 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupBCFieldManagers()",setupBCFieldManagers);
415 fmb->setupBCFieldManagers(bcs,physicsBlocks,eqset_factory,bc_cm_factory,bc_factory,closure_models,*
lof_,user_data);
421 fmb->writeVolumeGraphvizDependencyFiles(graphPrefix, physicsBlocks);
423 fmb->writeBCGraphvizDependencyFiles(graphPrefix+
"BC_");
427 PANZER_FUNC_TIME_MONITOR_DIFF(
"AssemblyEngine_TemplateBuilder::buildObjects()",AETM_BuildObjects);
429 ae_tm_.buildObjects(builder);
437 PANZER_FUNC_TIME_MONITOR_DIFF(
"build response library",
buildResponses);
441 buildResponses(physicsBlocks,eqset_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Responses_");
442 buildDistroParamDfDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DfDp_");
443 buildDistroParamDgDp_RL(wc,physicsBlocks,bcs,eqset_factory,bc_factory,volume_cm_factory,closure_models,user_data,writeGraph,graphPrefix+
"Response_DgDp_");
447 if (me_params.isParameter(
"FD Forward Sensitivities"))
448 do_fd_dfdp_ = me_params.get<
bool>(
"FD Forward Sensitivities");
449 if (me_params.isParameter(
"FD Perturbation Size"))
454template <
typename Scalar>
461 using Teuchos::rcp_dynamic_cast;
462 using Teuchos::rcp_const_cast;
463 typedef Thyra::ModelEvaluatorBase MEB;
474 bool is_transient =
false;
475 if (inArgs.supports(MEB::IN_ARG_x_dot ))
476 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
483 const RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
484 RCP<const Thyra::VectorBase<Scalar> > x_dot;
488 "ModelEvaluator was not built with transient support enabled!");
492 ae_inargs.
alpha = 0.0;
493 ae_inargs.
beta = 1.0;
496 x_dot = inArgs.get_x_dot();
497 ae_inargs.
alpha = inArgs.get_alpha();
498 ae_inargs.
beta = inArgs.get_beta();
499 ae_inargs.
time = inArgs.get_t();
501 ae_inargs.
step_size= inArgs.get_step_size();
511 for (
int i=0; i<num_param_vecs; i++) {
513 RCP<const Thyra::VectorBase<Scalar> > paramVec = inArgs.get_p(i);
514 if ( paramVec!=Teuchos::null && !
parameters_[i]->is_distributed) {
517 Teuchos::ArrayRCP<const Scalar> p_data;
518 rcp_dynamic_cast<const Thyra::SpmdVectorBase<Scalar> >(paramVec,
true)->getLocalData(Teuchos::ptrFromRef(p_data));
520 for (
unsigned int j=0; j <
parameters_[i]->scalar_value.size(); j++) {
521 parameters_[i]->scalar_value[j].baseValue = p_data[j];
522 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(
parameters_[i]->scalar_value[j].baseValue);
525 else if ( paramVec!=Teuchos::null &&
parameters_[i]->is_distributed) {
531 TEUCHOS_ASSERT(ged!=Teuchos::null);
534 RCP<LOCPair_GlobalEvaluationData> loc_pair_ged = rcp_dynamic_cast<LOCPair_GlobalEvaluationData>(ged);
535 RCP<ReadOnlyVector_GlobalEvaluationData> ro_ged = rcp_dynamic_cast<ReadOnlyVector_GlobalEvaluationData>(ged);
536 if(loc_pair_ged!=Teuchos::null) {
538 RCP<ThyraObjContainer<Scalar> > th_ged = rcp_dynamic_cast<ThyraObjContainer<Scalar> >(loc_pair_ged->getGlobalLOC(),
true);
542 TEUCHOS_ASSERT(ro_ged!=Teuchos::null);
543 ro_ged->setOwnedVector(paramVec);
552 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
553 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
555 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
586 for (
int i(0); i < num_param_vecs; ++i)
594 auto dxdp = rcp_const_cast<VectorBase<Scalar>>
595 (inArgs.get_p(vIndex + num_param_vecs));
596 if (not dxdp.is_null())
600 auto dxdpBlock = rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdp);
601 int numParams(
parameters_[i]->scalar_value.size());
602 for (
int j(0); j < numParams; ++j)
604 RCP<ROVGED> dxdpContainer =
lof_->buildReadOnlyDomainContainer();
605 dxdpContainer->setOwnedVector(dxdpBlock->getNonconstVectorBlock(j));
607 string name(
"X TANGENT GATHER CONTAINER: " +
616 auto dxdotdp = rcp_const_cast<VectorBase<Scalar>>
618 if (not dxdotdp.is_null())
621 rcp_dynamic_cast<ProductVectorBase<Scalar>>(dxdotdp);
622 int numParams(
parameters_[i]->scalar_value.size());
623 for (
int j(0); j < numParams; ++j)
625 RCP<ROVGED> dxdotdpContainer =
lof_->buildReadOnlyDomainContainer();
626 dxdotdpContainer->setOwnedVector(
627 dxdotdpBlock->getNonconstVectorBlock(j));
628 string name(
"DXDT TANGENT GATHER CONTAINER: " +
642template <
typename Scalar>
643Thyra::ModelEvaluatorBase::OutArgs<Scalar>
646 typedef Thyra::ModelEvaluatorBase MEB;
649 MEB::OutArgsSetup<Scalar> outArgs;
650 outArgs.setModelEvalDescription(this->description());
652 outArgs.setSupports(MEB::OUT_ARG_f);
653 outArgs.setSupports(MEB::OUT_ARG_W_op);
656 for(std::size_t i=0;i<
responses_.size();i++) {
661 Teuchos::RCP<panzer::ResponseBase> respJacBase
663 if(respJacBase!=Teuchos::null) {
665 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp
666 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
669 if(resp->supportsDerivative()) {
670 outArgs.setSupports(MEB::OUT_ARG_DgDx,i,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
677 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
687 Teuchos::RCP<panzer::ResponseBase> respTanBase
689 if(respTanBase!=Teuchos::null) {
692 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
702 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
704 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
716template <
typename Scalar>
717Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
721 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::create_W_op");
722 Teuchos::RCP<const ThyraObjFactory<Scalar> > tof
723 = Teuchos::rcp_dynamic_cast<const ThyraObjFactory<Scalar> >(
lof_,
true);
725 return tof->getThyraMatrix();
728template <
typename Scalar>
729Teuchos::RCP<const Thyra::LinearOpWithSolveFactoryBase<Scalar> >
736template <
typename Scalar>
737Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
742 using Teuchos::rcp_dynamic_cast;
744 typedef Thyra::ModelEvaluatorBase MEB;
757 this->createOutArgs();
760 TEUCHOS_ASSERT(0<=p && p<Teuchos::as<int>(
parameters_.size()));
766 TEUCHOS_ASSERT(
prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_LINEAR_OP));
770 RCP<Response_Residual<Traits::Jacobian> > response_jacobian
771 = rcp_dynamic_cast<Response_Residual<Traits::Jacobian> >(po.
dfdp_rl->template getResponse<Traits::Jacobian>(
"RESIDUAL"));
773 return response_jacobian->allocateJacobian();
776 TEUCHOS_ASSERT(
prototypeOutArgs_.supports(MEB::OUT_ARG_DfDp,p).supports(MEB::DERIV_MV_BY_COL));
783 TEUCHOS_ASSERT(
false);
785 return Teuchos::null;
788template <
typename Scalar>
790addParameter(
const std::string & name,
const Scalar & initialValue)
792 Teuchos::Array<std::string> tmp_names;
793 tmp_names.push_back(name);
795 Teuchos::Array<Scalar> tmp_values;
796 tmp_values.push_back(initialValue);
801template <
typename Scalar>
804 const Teuchos::Array<Scalar> & initialValues)
808 using Teuchos::rcp_dynamic_cast;
809 using Teuchos::ptrFromRef;
811 TEUCHOS_ASSERT(names.size()==initialValues.size());
820 RCP< Thyra::VectorSpaceBase<double> > tan_space =
821 Thyra::multiVectorProductVectorSpace(
x_space_, param->names->size());
832 this->resetDefaultBase();
834 return parameter_index;
837template <
typename Scalar>
841 const Teuchos::RCP<GlobalEvaluationData> & ged,
843 const Teuchos::RCP<const GlobalIndexer> & ugi)
853 this->resetDefaultBase();
855 return parameter_index;
858template <
typename Scalar>
861 const Teuchos::RCP<GlobalEvaluationData> & ged)
866template <
typename Scalar>
869 const Teuchos::RCP<GlobalEvaluationData> & ged)
874template <
typename Scalar>
877 const std::vector<WorksetDescriptor> & wkst_desc,
878 const Teuchos::RCP<ResponseMESupportBuilderBase> & builder)
881 builder->setDerivativeInformation(lof_);
883 int respIndex = addResponse(responseName,wkst_desc,*builder);
886 responses_[respIndex]->builder = builder;
892template <
typename Scalar>
898 using Teuchos::ArrayRCP;
899 using Teuchos::Array;
900 using Teuchos::tuple;
901 using Teuchos::rcp_dynamic_cast;
913 ae_inargs.
alpha = 0.0;
914 ae_inargs.
beta = 1.0;
926 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
927 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
929 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
934 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
935 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
936 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
945 thGlobalContainer->set_x_th(x);
948 RCP<panzer::LinearObjContainer> counter
949 =
ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
952 RCP<panzer::LinearObjContainer> result =
lof_->buildLinearObjContainer();
955 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(counter)->set_f_th(
956 thGlobalContainer->get_f_th());
959 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(result)->set_f_th(f);
962 lof_->applyDirichletBCs(*counter,*result);
965template <
typename Scalar>
968 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
972#ifdef Panzer_BUILD_HESSIAN_SUPPORT
978 std::string responseName =
responses_[respIndex]->name;
979 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
980 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
982 resp->setDerivative(D2gDx2);
991 ae_inargs.
beta = 1.0;
993 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
994 deltaXContainer->setOwnedVector(delta_x);
1008 TEUCHOS_ASSERT(
false);
1012template <
typename Scalar>
1016 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1020#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1026 std::string responseName =
responses_[respIndex]->name;
1027 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1028 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
1030 resp->setDerivative(D2gDxDp);
1039 ae_inargs.
beta = 1.0;
1042 auto deltaPContainer =
parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1043 deltaPContainer->setOwnedVector(delta_p);
1058 TEUCHOS_ASSERT(
false);
1062template <
typename Scalar>
1066 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1070#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1078 std::string responseName =
responses_[respIndex]->name;
1079 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1080 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
1082 resp->setDerivative(D2gDp2);
1096 auto deltaPContainer =
parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1097 deltaPContainer->setOwnedVector(delta_p);
1112 TEUCHOS_ASSERT(
false);
1116template <
typename Scalar>
1120 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1124#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1132 std::string responseName =
responses_[respIndex]->name;
1133 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Hessian> > resp
1134 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Hessian> >(
1136 resp->setDerivative(D2gDpDx);
1150 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
1151 deltaXContainer->setOwnedVector(delta_x);
1166 TEUCHOS_ASSERT(
false);
1170template <
typename Scalar>
1176#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1179 using Teuchos::ArrayRCP;
1180 using Teuchos::Array;
1181 using Teuchos::tuple;
1182 using Teuchos::rcp_dynamic_cast;
1184 typedef Thyra::ModelEvaluatorBase MEB;
1189 bool is_transient =
false;
1190 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1191 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1195 "ModelEvaluator was not built with transient support enabled!");
1200 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDx2;
1208 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
1209 deltaXContainer->setOwnedVector(delta_x);
1227 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1228 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
1229 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1230 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
1233 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDx2)");
1236 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(
f_space_);
1237 thGlobalContainer->set_f_th(dummy_f);
1238 thGlobalContainer->set_A_th(W_out);
1241 thGhostedContainer->initializeMatrix(0.0);
1243 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1249 thGlobalContainer->set_A_th(Teuchos::null);
1253 thGlobalContainer->set_x_th(Teuchos::null);
1254 thGlobalContainer->set_dxdt_th(Teuchos::null);
1255 thGlobalContainer->set_f_th(Teuchos::null);
1256 thGlobalContainer->set_A_th(Teuchos::null);
1264 TEUCHOS_ASSERT(
false);
1268template <
typename Scalar>
1271 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1275#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1278 using Teuchos::ArrayRCP;
1279 using Teuchos::Array;
1280 using Teuchos::tuple;
1281 using Teuchos::rcp_dynamic_cast;
1283 typedef Thyra::ModelEvaluatorBase MEB;
1288 bool is_transient =
false;
1289 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1290 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1294 "ModelEvaluator was not built with transient support enabled!");
1299 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDxDp;
1309 auto deltaPContainer =
parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1310 deltaPContainer->setOwnedVector(delta_p);
1328 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1329 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
1330 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1331 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
1334 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(D2fDxDp)");
1337 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(
f_space_);
1338 thGlobalContainer->set_f_th(dummy_f);
1339 thGlobalContainer->set_A_th(W_out);
1342 thGhostedContainer->initializeMatrix(0.0);
1344 ae_tm_.template getAsObject<panzer::Traits::Hessian>()->evaluate(ae_inargs);
1350 thGlobalContainer->set_A_th(Teuchos::null);
1354 thGlobalContainer->set_x_th(Teuchos::null);
1355 thGlobalContainer->set_dxdt_th(Teuchos::null);
1356 thGlobalContainer->set_f_th(Teuchos::null);
1357 thGlobalContainer->set_A_th(Teuchos::null);
1366 TEUCHOS_ASSERT(
false);
1370template <
typename Scalar>
1373 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1377#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1379 using Teuchos::rcp_dynamic_cast;
1380 using Teuchos::null;
1383 TEUCHOS_ASSERT(
parameters_[pIndex]->is_distributed);
1387 TEUCHOS_ASSERT(
parameters_[pIndex]->dfdp_rl!=null);
1392 RCP<Response_Residual<Traits::Hessian> > response_hessian =
1394 response_hessian->setHessian(D2fDpDx);
1401 auto deltaXContainer =
lof_->buildReadOnlyDomainContainer();
1402 deltaXContainer->setOwnedVector(delta_x);
1417 TEUCHOS_ASSERT(
false);
1421template <
typename Scalar>
1424 const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
1428#ifdef Panzer_BUILD_HESSIAN_SUPPORT
1430 using Teuchos::rcp_dynamic_cast;
1431 using Teuchos::null;
1434 TEUCHOS_ASSERT(
parameters_[pIndex]->is_distributed);
1438 TEUCHOS_ASSERT(
parameters_[pIndex]->dfdp_rl!=null);
1443 RCP<Response_Residual<Traits::Hessian> > response_hessian =
1445 response_hessian->setHessian(D2fDp2);
1452 auto deltaPContainer =
parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1453 deltaPContainer->setOwnedVector(delta_p);
1468 TEUCHOS_ASSERT(
false);
1472template <
typename Scalar>
1474evalModelImpl(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs,
1475 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1506template <
typename Scalar>
1509 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1512 using Teuchos::ArrayRCP;
1513 using Teuchos::Array;
1514 using Teuchos::tuple;
1515 using Teuchos::rcp_dynamic_cast;
1517 typedef Thyra::ModelEvaluatorBase MEB;
1522 bool is_transient =
false;
1523 if (inArgs.supports(MEB::IN_ARG_x_dot ))
1524 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
1528 "ModelEvaluator was not built with transient support enabled!");
1533 const RCP<Thyra::VectorBase<Scalar> > f_out = outArgs.get_f();
1534 const RCP<Thyra::LinearOpBase<Scalar> > W_out = outArgs.get_W_op();
1537 if(Teuchos::is_null(f_out) && Teuchos::is_null(W_out) ) {
1562 const RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1563 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
container_);
1564 const RCP<panzer::ThyraObjContainer<Scalar> > thGhostedContainer =
1565 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(ae_inargs.
ghostedContainer_);
1567 if (!Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
1568 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
1574 thGlobalContainer->set_f_th(f_out);
1575 thGlobalContainer->set_A_th(W_out);
1578 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1579 thGhostedContainer->initializeMatrix(0.0);
1581 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1583 else if(!Teuchos::is_null(f_out) && Teuchos::is_null(W_out)) {
1585 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
1590 thGlobalContainer->set_f_th(f_out);
1593 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
1595 ae_tm_.template getAsObject<panzer::Traits::Residual>()->evaluate(ae_inargs);
1597 else if(Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
1599 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
1605 RCP<Thyra::VectorBase<Scalar> > dummy_f = Thyra::createMember(
f_space_);
1606 thGlobalContainer->set_f_th(dummy_f);
1607 thGlobalContainer->set_A_th(W_out);
1610 thGhostedContainer->initializeMatrix(0.0);
1612 ae_tm_.template getAsObject<panzer::Traits::Jacobian>()->evaluate(ae_inargs);
1618 thGlobalContainer->set_A_th(Teuchos::null);
1622 thGlobalContainer->set_x_th(Teuchos::null);
1623 thGlobalContainer->set_dxdt_th(Teuchos::null);
1624 thGlobalContainer->set_f_th(Teuchos::null);
1625 thGlobalContainer->set_A_th(Teuchos::null);
1630 const bool writeToFile =
false;
1631 if (writeToFile && nonnull(W_out)) {
1632 const auto check_blocked = Teuchos::rcp_dynamic_cast<::Thyra::BlockedLinearOpBase<double> >(W_out,
false);
1633 if (check_blocked) {
1634 const int numBlocks = check_blocked->productDomain()->numBlocks();
1635 const int rangeBlocks = check_blocked->productRange()->numBlocks();
1636 TEUCHOS_ASSERT(numBlocks == rangeBlocks);
1637 for (
int row=0; row < numBlocks; ++row) {
1638 for (
int col=0; col < numBlocks; ++col) {
1639 using LO = panzer::LocalOrdinal;
1640 using GO = panzer::GlobalOrdinal;
1642 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(check_blocked->getNonconstBlock(row,col),
true);
1643 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1644 tpetraCrsMatrix->print(std::cout);
1645 std::stringstream ss;
1646 ss <<
"W_out_" <<
write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".block_" << row <<
"_" << col <<
".txt";
1647 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1648 Teuchos::FancyOStream fos(Teuchos::rcpFromRef(fs));
1649 tpetraCrsMatrix->describe(fos,Teuchos::VERB_EXTREME);
1655 using LO = panzer::LocalOrdinal;
1656 using GO = panzer::GlobalOrdinal;
1658 const auto thyraTpetraOperator = Teuchos::rcp_dynamic_cast<::Thyra::TpetraLinearOp<double,LO,GO,NodeT>>(W_out,
true);
1659 const auto tpetraCrsMatrix = Teuchos::rcp_dynamic_cast<Tpetra::CrsMatrix<double,LO,GO,NodeT>>(thyraTpetraOperator->getTpetraOperator(),
true);
1660 tpetraCrsMatrix->print(std::cout);
1661 std::stringstream ss;
1662 ss <<
"W_out_" <<
write_matrix_count_ <<
".rank_" << tpetraCrsMatrix->getMap()->getComm()->getRank() <<
".txt";
1663 std::fstream fs(ss.str().c_str(),std::fstream::out|std::fstream::trunc);
1664 Teuchos::FancyOStream fos(Teuchos::rcpFromRef(fs));
1665 tpetraCrsMatrix->describe(fos,Teuchos::VERB_EXTREME);
1673template <
typename Scalar>
1676 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1678 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_g()");
1691 for(std::size_t i=0;i<
responses_.size();i++) {
1692 Teuchos::RCP<Thyra::VectorBase<Scalar> > vec = outArgs.get_g(i);
1693 if(vec!=Teuchos::null) {
1694 std::string responseName =
responses_[i]->name;
1695 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp
1696 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(
1698 resp->setVector(vec);
1710template <
typename Scalar>
1714 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1716 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dgdx()");
1717 typedef Thyra::ModelEvaluatorBase MEB;
1725 for(std::size_t i=0;i<
responses_.size();i++) {
1727 if (outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
1729 MEB::Derivative<Scalar> deriv = outArgs.get_DgDx(i);
1733 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1735 if(vec!=Teuchos::null) {
1737 std::string responseName =
responses_[i]->name;
1738 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
1739 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> >(
1741 resp->setDerivative(vec);
1759template <
typename Scalar>
1763 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1765 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dgdp_scalar()");
1768 using Teuchos::rcp_dynamic_cast;
1770 typedef Thyra::ModelEvaluatorBase MEB;
1776 std::vector<std::string> activeParameterNames;
1777 std::vector<int> activeParameters;
1778 int totalParameterCount = 0;
1785 bool is_active =
false;
1786 for(std::size_t i=0;i<
responses_.size(); i++) {
1788 if (outArgs.supports(MEB::OUT_ARG_DgDp,i,j).none())
1790 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(i,j);
1794 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1795 if(vec!=Teuchos::null) {
1797 std::string responseName =
responses_[i]->name;
1798 RCP<panzer::ResponseMESupportBase<panzer::Traits::Tangent> > resp =
1799 rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Tangent> >(
1802 if (nonnull(resp)) {
1803 resp->setVector(vec);
1810 for (std::size_t k=0; k<
parameters_[j]->scalar_value.size(); k++) {
1811 std::string name =
"PARAMETER_SENSITIVIES: "+(*
parameters_[j]->names)[k];
1812 activeParameterNames.push_back(name);
1813 totalParameterCount++;
1815 activeParameters.push_back(j);
1824 RCP<panzer::GlobalEvaluationData> ged_activeParameters =
1830 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1831 const int j = activeParameters[ap];
1832 for (
unsigned int k=0; k <
parameters_[j]->scalar_value.size(); k++) {
1834 p.fastAccessDx(paramIndex) = 1.0;
1835 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1841 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
1844 if(totalParameterCount>0) {
1850template <
typename Scalar>
1854 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1856 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dgdp_distro()");
1857 typedef Thyra::ModelEvaluatorBase MEB;
1875 for(std::size_t r=0;r<
responses_.size();r++) {
1877 MEB::Derivative<Scalar> deriv = outArgs.get_DgDp(r,p);
1881 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > vec = deriv.getMultiVector();
1883 if(vec!=Teuchos::null) {
1886 std::string responseName =
responses_[r]->name;
1887 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
1888 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> >(
1891 resp->setDerivative(vec);
1910template <
typename Scalar>
1914 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1916 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dfdp_scalar()");
1918 using Teuchos::rcp_dynamic_cast;
1920 typedef Thyra::ModelEvaluatorBase MEB;
1934 std::vector<std::string> activeParameters;
1936 int totalParameterCount = 0;
1937 for(std::size_t i=0; i <
parameters_.size(); i++) {
1943 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1948 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> > mVec = deriv.getMultiVector();
1949 TEUCHOS_ASSERT(mVec->domain()->dim()==Teuchos::as<int>(
parameters_[i]->scalar_value.size()));
1951 for (std::size_t j=0; j <
parameters_[i]->scalar_value.size(); j++) {
1954 RCP<LOCPair_GlobalEvaluationData> loc_pair
1956 RCP<LinearObjContainer> globalContainer = loc_pair->getGlobalLOC();
1959 RCP<Thyra::VectorBase<Scalar> > vec = mVec->col(j);
1960 RCP<panzer::ThyraObjContainer<Scalar> > thGlobalContainer =
1961 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<Scalar> >(globalContainer);
1962 thGlobalContainer->set_f_th(vec);
1965 std::string name =
"PARAMETER_SENSITIVIES: "+(*
parameters_[i]->names)[j];
1969 activeParameters.push_back(name);
1970 totalParameterCount++;
1978 RCP<GlobalEvaluationData> ged_activeParameters
1987 for(std::size_t i=0; i <
parameters_.size(); i++) {
1993 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
1994 if(deriv.isEmpty()) {
1996 for (
unsigned int j=0; j <
parameters_[i]->scalar_value.size(); j++) {
1999 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
2005 for (
unsigned int j=0; j <
parameters_[i]->scalar_value.size(); j++) {
2008 p.fastAccessDx(paramIndex) = 1.0;
2009 parameters_[i]->scalar_value[j].family->template setValue<panzer::Traits::Tangent>(p);
2016 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
2021 if(totalParameterCount>0) {
2022 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::ModelEvaluator::evalModel(df/dp)",dfdp_eval);
2027template <
typename Scalar>
2031 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2033 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dfdp_scalar_fd()");
2036 using Teuchos::rcp_dynamic_cast;
2038 typedef Thyra::ModelEvaluatorBase MEB;
2045 MEB::OutArgs<Scalar> outArgs_base = this->createOutArgs();
2046 if (outArgs.get_f() == Teuchos::null)
2047 outArgs_base.set_f(Thyra::createMember(this->
get_f_space()));
2049 outArgs_base.set_f(outArgs.get_f());
2050 outArgs_base.set_W_op(outArgs.get_W_op());
2051 this->evalModel(inArgs, outArgs_base);
2052 RCP<const Thyra::VectorBase<Scalar> > f = outArgs_base.get_f();
2053 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
2054 RCP<const Thyra::VectorBase<Scalar> > x_dot;
2055 if (inArgs.supports(MEB::IN_ARG_x_dot))
2056 x_dot = inArgs.get_x_dot();
2059 RCP<Thyra::VectorBase<Scalar> > fd = Thyra::createMember(this->
get_f_space());
2060 MEB::OutArgs<Scalar> outArgs_fd = this->createOutArgs();
2061 outArgs_fd.set_f(fd);
2063 RCP<Thyra::VectorBase<Scalar> > xd = Thyra::createMember(this->
get_x_space());
2064 RCP<Thyra::VectorBase<Scalar> > xd_dot;
2065 if (x_dot != Teuchos::null)
2066 xd_dot = Thyra::createMember(this->
get_x_space());
2068 inArgs_fd.setArgs(inArgs);
2069 inArgs_fd.set_x(xd);
2070 if (x_dot != Teuchos::null)
2071 inArgs_fd.set_x_dot(xd_dot);
2074 for(std::size_t i=0; i <
parameters_.size(); i++) {
2081 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(i);
2086 RCP<Thyra::MultiVectorBase<Scalar> > dfdp = deriv.getMultiVector();
2087 TEUCHOS_ASSERT(dfdp->domain()->dim()==Teuchos::as<int>(
parameters_[i]->scalar_value.size()));
2090 RCP<const Thyra::VectorBase<Scalar> > p = inArgs.get_p(i);
2091 RCP<const Thyra::VectorBase<Scalar> > dx_v = inArgs.get_p(i+
parameters_.size());
2092 RCP<const Thyra::MultiVectorBase<Scalar> > dx =
2093 rcp_dynamic_cast<const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_v,
true)->getMultiVector();
2094 RCP<const Thyra::VectorBase<Scalar> > dx_dot_v;
2095 RCP<const Thyra::MultiVectorBase<Scalar> > dx_dot;
2096 if (x_dot != Teuchos::null) {
2099 rcp_dynamic_cast<const Thyra::DefaultMultiVectorProductVector<Scalar> >(dx_dot_v,
true)->getMultiVector();
2103 RCP<Thyra::VectorBase<Scalar> > pd = Thyra::createMember(this->
get_p_space(i));
2104 inArgs_fd.set_p(i,pd);
2106 for (std::size_t j=0; j <
parameters_[i]->scalar_value.size(); j++) {
2109 Thyra::copy(*p, pd.ptr());
2110 Thyra::set_ele(j, Thyra::get_ele(*p,j)+h, pd.ptr());
2113 Thyra::V_VpStV(xd.ptr(), *x, h, *(dx)->col(j));
2114 if (x_dot != Teuchos::null)
2115 Thyra::V_VpStV(xd_dot.ptr(), *x_dot, h, *(dx_dot)->col(j));
2118 Thyra::assign(fd.ptr(), 0.0);
2119 this->evalModel(inArgs_fd, outArgs_fd);
2122 Thyra::V_StVpStV(dfdp->col(j).ptr(), 1.0/h, *fd, -1.0/h, *f);
2125 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2131template <
typename Scalar>
2135 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2137 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_dfdp_distro()");
2139 using Teuchos::rcp_dynamic_cast;
2140 using Teuchos::null;
2142 typedef Thyra::ModelEvaluatorBase MEB;
2163 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2170 RCP<Response_Residual<Traits::Jacobian> > response_jacobian =
2172 response_jacobian->setJacobian(deriv.getLinearOp());
2188template <
typename Scalar>
2190required_basic_g(
const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
2193 bool activeGArgs =
false;
2194 for(
int i=0;i<outArgs.Ng();i++)
2195 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
2200template <
typename Scalar>
2204 typedef Thyra::ModelEvaluatorBase MEB;
2207 bool activeGArgs =
false;
2208 for(
int i=0;i<outArgs.Ng();i++) {
2210 if(outArgs.supports(MEB::OUT_ARG_DgDx,i).none())
2214 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
2220template <
typename Scalar>
2224 typedef Thyra::ModelEvaluatorBase MEB;
2227 bool activeGArgs =
false;
2228 for(
int i=0;i<outArgs.Ng();i++) {
2229 for(
int p=0;p<Teuchos::as<int>(
parameters_.size());p++) {
2236 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2239 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2246template <
typename Scalar>
2250 typedef Thyra::ModelEvaluatorBase MEB;
2253 bool activeGArgs =
false;
2254 for(
int i=0;i<outArgs.Ng();i++) {
2255 for(
int p=0;p<Teuchos::as<int>(
parameters_.size());p++) {
2262 if(outArgs.supports(MEB::OUT_ARG_DgDp,i,p).none())
2265 activeGArgs |= (!outArgs.get_DgDp(i,p).isEmpty());
2272template <
typename Scalar>
2276 typedef Thyra::ModelEvaluatorBase MEB;
2279 bool activeFPArgs =
false;
2280 for(
int i=0;i<Teuchos::as<int>(
parameters_.size());i++) {
2287 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2291 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2294 return activeFPArgs;
2297template <
typename Scalar>
2301 typedef Thyra::ModelEvaluatorBase MEB;
2304 bool activeFPArgs =
false;
2305 for(
int i=0;i<Teuchos::as<int>(
parameters_.size());i++) {
2312 if(outArgs.supports(MEB::OUT_ARG_DfDp,i).none())
2316 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
2319 return activeFPArgs;
2322template <
typename Scalar>
2325 const Teuchos::RCP<panzer::WorksetContainer> & wc,
2326 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
2327 const std::vector<panzer::BC> & bcs,
2331 const Teuchos::ParameterList& closure_models,
2332 const Teuchos::ParameterList& user_data,
2333 const bool write_graphviz_file,
2334 const std::string& graphviz_file_prefix)
2338 using Teuchos::null;
2361 RCP<ResponseLibrary<Traits> > rLibrary
2364 rLibrary->buildResidualResponseEvaluators(physicsBlocks,eqset_factory,bcs,bc_factory,
2365 cm_factory,closure_models,user_data,
2366 write_graphviz_file,graphviz_file_prefix);
2373template <
typename Scalar>
2376 const Teuchos::RCP<panzer::WorksetContainer> & wc,
2377 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
2378 const std::vector<panzer::BC>& ,
2382 const Teuchos::ParameterList& closure_models,
2383 const Teuchos::ParameterList& user_data,
2384 const bool write_graphviz_file,
2385 const std::string& graphviz_file_prefix)
2389 using Teuchos::null;
2408 RCP<const LinearObjFactory<Traits> > param_lof =
parameters_[p]->dfdp_rl->getLinearObjFactory();
2409 RCP<const GlobalIndexer > param_ugi =
parameters_[p]->global_indexer;
2412 RCP<ResponseLibrary<Traits> > rLibrary
2417 for(std::size_t r=0;r<
responses_.size();r++) {
2424 responses_[r]->builder->setDerivativeInformation(param_lof);
2432 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2433 cm_factory,closure_models,user_data,
2434 write_graphviz_file,graphviz_file_prefix);
2441template <
typename Scalar>
2449template <
typename Scalar>
2450Teuchos::RCP<typename panzer::ModelEvaluator<Scalar>::ParameterObject>
2453 const Teuchos::Array<Scalar> & in_values)
const
2457 using Teuchos::rcp_dynamic_cast;
2458 using Teuchos::ptrFromRef;
2460 TEUCHOS_ASSERT(in_names.size()==in_values.size());
2471 paramObj->names = rcp(
new Teuchos::Array<std::string>(in_names));
2472 paramObj->is_distributed =
false;
2475 for(
int i=0;i<in_names.size();i++)
2483 Thyra::locallyReplicatedDefaultSpmdVectorSpace<Scalar>(
2487 Teuchos::ArrayRCP<Scalar> data;
2488 RCP<Thyra::VectorBase<Scalar> > initial_value = Thyra::createMember(paramObj->space);
2489 RCP<Thyra::SpmdVectorBase<Scalar> > vec = rcp_dynamic_cast<Thyra::SpmdVectorBase<Scalar> >(initial_value);
2490 vec->getNonconstLocalData(ptrFromRef(data));
2491 for (
unsigned int i=0; i < paramObj->scalar_value.size(); i++)
2492 data[i] = in_values[i];
2494 paramObj->initial_value = initial_value;
2499template <
typename Scalar>
2500Teuchos::RCP<typename panzer::ModelEvaluator<Scalar>::ParameterObject>
2505 const Teuchos::RCP<const GlobalIndexer> & ugi)
const
2512 paramObj->is_distributed =
true;
2513 paramObj->names = rcp(
new Teuchos::Array<std::string>());
2514 paramObj->names->push_back(key);
2515 paramObj->space = vs;
2516 paramObj->initial_value = initial;
2518 paramObj->global_indexer = ugi;
2523template <
typename Scalar>
2526setParameters(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs)
const
2528 for(std::size_t i=0; i <
parameters_.size(); i++) {
2535 Teuchos::RCP<const Thyra::VectorBase<Scalar> > p = inArgs.get_p(i);
2536 if (p != Teuchos::null) {
2537 for (
unsigned int j=0; j <
parameters_[i]->scalar_value.size(); j++) {
2538 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*p,j));
2545template <
typename Scalar>
2550 for(std::size_t i=0; i <
parameters_.size(); i++) {
2557 for (
unsigned int j=0; j <
parameters_[i]->scalar_value.size(); j++) {
2558 parameters_[i]->scalar_value[j].family->setRealValueForAllTypes(Thyra::get_ele(*(
parameters_[i]->initial_value),j));
Builder functor used with Sacado::mpl::TemplateManager to construct one panzer::AssemblyEngine<EvalT>...
std::vector< double > gather_seeds
void addGlobalEvaluationData(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
bool apply_dirichlet_beta
std::string second_sensitivities_name
bool evaluate_transient_terms
Teuchos::RCP< panzer::LinearObjContainer > container_
std::string first_sensitivities_name
A PHX::TemplateManager holding one panzer::ClosureModelFactory<EvalT> per evaluation type in Traits::...
virtual void evalModelImpl_basic_dfdp_scalar_fd(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void setOneTimeDirichletBeta(const Scalar &beta) const
virtual void evalModelImpl_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void setupAssemblyInArgs(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, panzer::AssemblyEngineInArgs &ae_inargs) const
std::vector< bool > active_evaluation_types_
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())
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
unsigned long long write_matrix_count_
Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > xContainer_
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const override
bool required_basic_g(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Does this set of out args require a simple response?
void evalModel_D2fDp2(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDp2) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DfDp_op(int i) const override
virtual void evalModelImpl_basic_dgdx(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > f_space_
void buildDistroParamDfDp_RL(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const override
std::vector< Teuchos::RCP< ParameterObject > > parameters_
bool oneTimeDirichletBeta_on_
void resetParameters() const
std::vector< Teuchos::RCP< ResponseObject > > responses_
void setParameters(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
Teuchos::RCP< ParameterObject > createDistributedParameter(const std::string &key, const Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > &vs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &initial, const Teuchos::RCP< const GlobalIndexer > &ugi) const
std::vector< Teuchos::RCP< Thyra::VectorSpaceBase< double > > > tangent_space_
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
virtual void evalModelImpl_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
bool required_basic_dfdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the scalar parameters in the out args?...
GlobalEvaluationDataContainer assemblyGlobalEvaluationData_
bool build_bc_field_managers_
bool require_in_args_refresh_
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > solverFactory_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > x_space_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int i) const override
virtual void evalModelImpl_basic_g(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Construct a simple response dicatated by this set of out args.
Thyra::ModelEvaluatorBase::InArgs< Scalar > nominalValues_
void evalModel_D2fDx2(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDx2) const
bool required_basic_dgdx(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDx.
bool required_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const override
virtual void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const override
Thyra::ModelEvaluatorBase::OutArgs< Scalar > prototypeOutArgs_
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
GlobalEvaluationDataContainer nonParamGlobalEvaluationData_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const override
void buildVolumeFieldManagers(const bool value)
virtual void evalModelImpl_basic_dgdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void evalModel_D2gDxDp(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDxDp) const
int addDistributedParameter(const std::string &name, const Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > &vs, const Teuchos::RCP< GlobalEvaluationData > &ged, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &initial, const Teuchos::RCP< const GlobalIndexer > &ugi=Teuchos::null)
bool build_transient_support_
bool required_basic_dgdp_scalar(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are their required responses in the out args? DgDp.
int addParameter(const std::string &name, const Scalar &initial)
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const override
Scalar oneTimeDirichletBeta_
const std::string & get_g_name(int i) const
void buildDistroParamDgDp_RL(const Teuchos::RCP< panzer::WorksetContainer > &wc, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< panzer::BC > &bcs, const panzer::EquationSetFactory &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
void addGlobalEvaluationDataToAssemblyInArgs(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int i) const override
Teuchos::ArrayView< const std::string > get_g_names(int i) const override
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &f) const
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const override
GlobalEvaluationDataContainer distrParamGlobalEvaluationData_
void evalModel_D2gDpDx(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDpDx) const
void buildBCFieldManagers(const bool value)
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > lof_
void buildResponses(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::EquationSetFactory &eqset_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
virtual void evalModelImpl_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
void evalModel_D2fDxDp(int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_p, const Teuchos::RCP< Thyra::LinearOpBase< Scalar > > &D2fDxDp) const
void evalModel_D2gDx2(int rIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDx2) const
virtual void evalModelImpl_basic(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Evaluate a simple model, meaning a residual and a jacobian, no fancy stochastic galerkin or multipoin...
Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > xdotContainer_
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const override
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
bool require_out_args_refresh_
void evalModel_D2gDp2(int rIndex, int pIndex, const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &delta_x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &D2gDp2) const
bool build_volume_field_managers_
bool required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the distributed parameters in the out args?...
Teuchos::RCP< panzer::GlobalData > global_data_
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int i) const override
void addNonParameterGlobalEvaluationData(const std::string &name, const Teuchos::RCP< GlobalEvaluationData > &ged)
void initializeNominalValues() const
Initialize the nominal values with good starting conditions.
Teuchos::RCP< ParameterObject > createScalarParameter(const Teuchos::Array< std::string > &names, const Teuchos::Array< Scalar > &in_values) const
Teuchos::RCP< ResponseBase > getResponse(const std::string &responseName) const
void evaluate(const panzer::AssemblyEngineInArgs &input_args)
void addResponsesToInArgs(panzer::AssemblyEngineInArgs &input_args) const
Teuchos::RCP< const LinearObjFactory< panzer::Traits > > cloneWithNewDomain(const LinearObjFactory< panzer::Traits > &lof, const Teuchos::RCP< const GlobalIndexer > &dUgi)
Clone a linear object factory, but using a different domain.
Sacado::ScalarParameterVector< panzer::EvaluationTraits > ParamVec
A vector of named scalar parameter entries drawn from a ParamLib, e.g. for use as LOCA continuation/b...
void registerScalarParameter(const std::string name, panzer::ParamLib &pl, double realValue)
Tpetra::KokkosCompat::KokkosDeviceWrapperNode< PHX::ExecutionSpace, PHX::MemorySpace > TpetraNodeType
The Kokkos node type used to instantiate all Tpetra objects (Map, MultiVector, CrsGraph,...
Interface for constructing a BCStrategy_TemplateManager.
Allocates and initializes an equation set template manager.
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > dfdp_rl
Teuchos::RCP< const GlobalIndexer > global_indexer
Evaluation type for computing second derivatives, using HessianType as the scalar type....
Evaluation type for computing the residual and its Jacobian, using FadType as the scalar type.
Evaluation type for computing the residual only, using RealType as the scalar type.
Evaluation type for computing directional derivatives (e.g. parameter sensitivities),...
Panzer's specialization of the Phalanx traits class.
PANZER_FADTYPE FadType
Sacado forward-mode AD scalar type used for the Jacobian and Tangent evaluation types.