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,
66 , num_me_parameters_(0)
68 , fd_perturb_size_(1e-7)
69 , require_in_args_refresh_(true)
70 , require_out_args_refresh_(true)
71 , responseLibrary_(rLibrary)
72 , global_data_(global_data)
73 , build_transient_support_(build_transient_support)
75 , solverFactory_(solverFactory)
76 , oneTimeDirichletBeta_on_(false)
77 , oneTimeDirichletBeta_(0.0)
78 , build_volume_field_managers_(true)
79 , build_bc_field_managers_(true)
80 , active_evaluation_types_(Sacado::mpl::size<
panzer::
Traits::EvalTypes>::value, true)
81 , write_matrix_count_(0)
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)
123 , num_me_parameters_(0)
125 , fd_perturb_size_(1e-7)
126 , require_in_args_refresh_(true)
127 , require_out_args_refresh_(true)
128 , global_data_(global_data)
129 , build_transient_support_(build_transient_support)
131 , solverFactory_(solverFactory)
132 , oneTimeDirichletBeta_on_(false)
133 , oneTimeDirichletBeta_(0.0)
134 , build_volume_field_managers_(true)
135 , build_bc_field_managers_(true)
136 , active_evaluation_types_(Sacado::mpl::size<
panzer::
Traits::EvalTypes>::value, true)
137 , write_matrix_count_(0)
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> >
190 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<num_me_parameters_),std::runtime_error,
191 "panzer::ModelEvaluator::get_p_names: Requested parameter index out of range.");
193 if (i < Teuchos::as<int>(parameters_.size()))
194 return parameters_[i]->names;
195 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size())) {
196 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
197 int param_index = i-parameters_.size();
198 std::ostringstream ss;
199 ss <<
"TANGENT VECTOR: " << param_index;
200 names->push_back(ss.str());
203 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size())) {
204 Teuchos::RCP<Teuchos::Array<std::string> > names = rcp(
new Teuchos::Array<std::string>);
205 int param_index = i-parameters_.size()-tangent_space_.size();
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> >
219 TEUCHOS_TEST_FOR_EXCEPTION(!(i>=0 && i<num_me_parameters_),std::runtime_error,
220 "panzer::ModelEvaluator::get_p_space: Requested parameter index out of range.");
222 if (i < Teuchos::as<int>(parameters_.size()))
223 return parameters_[i]->space;
224 else if (i < Teuchos::as<int>(parameters_.size()+tangent_space_.size()))
225 return tangent_space_[i-parameters_.size()];
226 else if (build_transient_support_ && i < Teuchos::as<int>(parameters_.size()+2*tangent_space_.size()))
227 return tangent_space_[i-parameters_.size()-tangent_space_.size()];
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());
249 return responses_[i]->name;
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());
259 return responses_[i]->space;
262template<
typename Scalar>
263Thyra::ModelEvaluatorBase::InArgs<Scalar>
266 return getNominalValues();
269template<
typename Scalar>
270Thyra::ModelEvaluatorBase::InArgs<Scalar>
274 using Teuchos::rcp_dynamic_cast;
276 if(require_in_args_refresh_) {
277 typedef Thyra::ModelEvaluatorBase MEB;
284 MEB::InArgsSetup<Scalar> nomInArgs;
285 nomInArgs = nominalValues_;
286 nomInArgs.setSupports(nominalValues_);
289 nomInArgs.set_Np(num_me_parameters_);
290 for(std::size_t p=0;p<parameters_.size();p++) {
292 nomInArgs.set_p(p,parameters_[p]->initial_value);
298 nominalValues_ = nomInArgs;
302 require_in_args_refresh_ =
false;
304 return nominalValues_;
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);
323 if(build_transient_support_) {
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);
334 nomInArgs.set_t(t_init_);
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);
343 nomInArgs.set_Np(num_me_parameters_);
344 std::size_t v_index = 0;
345 for(std::size_t p=0;p<parameters_.size();p++) {
346 nomInArgs.set_p(p,parameters_[p]->initial_value);
347 if (!parameters_[p]->is_distributed) {
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);
351 if (build_transient_support_) {
352 Teuchos::RCP<Thyra::VectorBase<Scalar> > v_nom_xdot = Thyra::createMember(*tangent_space_[v_index]);
353 Thyra::assign(v_nom_xdot.ptr(),0.0);
354 nomInArgs.set_p(v_index+parameters_.size()+tangent_space_.size(),v_nom_xdot);
360 nominalValues_ = nomInArgs;
363template <
typename Scalar>
367 build_volume_field_managers_ = value;
370template <
typename Scalar>
374 build_bc_field_managers_ = value;
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);
403 fmb->setActiveEvaluationTypes(active_evaluation_types_);
406 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setWorksetContainer()",setupWorksets);
407 fmb->setWorksetContainer(wc);
409 if (build_volume_field_managers_) {
410 PANZER_FUNC_TIME_MONITOR_DIFF(
"fmb->setupVolumeFieldManagers()",setupVolumeFieldManagers);
411 fmb->setupVolumeFieldManagers(physicsBlocks,volume_cm_factory,closure_models,*lof_,user_data);
413 if (build_bc_field_managers_) {
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);
420 if (build_volume_field_managers_)
421 fmb->writeVolumeGraphvizDependencyFiles(graphPrefix, physicsBlocks);
422 if (build_bc_field_managers_)
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);
439 responseLibrary_->initialize(wc,lof_->getRangeGlobalIndexer(),lof_);
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_");
446 fd_perturb_size_ = 1.0e-7;
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"))
450 fd_perturb_size_ = me_params.get<
double>(
"FD Perturbation Size");
454template <
typename Scalar>
461 using Teuchos::rcp_dynamic_cast;
462 using Teuchos::rcp_const_cast;
463 typedef Thyra::ModelEvaluatorBase MEB;
466 if(Teuchos::is_null(ghostedContainer_)) {
467 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
474 bool is_transient =
false;
475 if (inArgs.supports(MEB::IN_ARG_x_dot ))
476 is_transient = !Teuchos::is_null(inArgs.get_x_dot());
478 if(Teuchos::is_null(xContainer_))
479 xContainer_ = lof_->buildReadOnlyDomainContainer();
480 if(Teuchos::is_null(xdotContainer_) && is_transient)
481 xdotContainer_ = lof_->buildReadOnlyDomainContainer();
483 const RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
484 RCP<const Thyra::VectorBase<Scalar> > x_dot;
487 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
488 "ModelEvaluator was not built with transient support enabled!");
490 ae_inargs.
container_ = lof_->buildLinearObjContainer();
492 ae_inargs.
alpha = 0.0;
493 ae_inargs.
beta = 1.0;
495 if (build_transient_support_) {
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();
510 int num_param_vecs = parameters_.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) {
528 std::string key = (*parameters_[i]->names)[0];
529 RCP<GlobalEvaluationData> ged = distrParamGlobalEvaluationData_.getDataObject(key);
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));
571 xContainer_->setOwnedVector(x);
576 xdotContainer_->setOwnedVector(x_dot);
586 for (
int i(0); i < num_param_vecs; ++i)
592 if (not parameters_[i]->is_distributed)
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: " +
608 (*parameters_[i]->names)[j]);
612 if (build_transient_support_)
616 auto dxdotdp = rcp_const_cast<VectorBase<Scalar>>
617 (inArgs.get_p(vIndex + num_param_vecs + tangent_space_.size()));
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: " +
629 (*parameters_[i]->names)[j]);
642template <
typename Scalar>
643Thyra::ModelEvaluatorBase::OutArgs<Scalar>
646 typedef Thyra::ModelEvaluatorBase MEB;
648 if(require_out_args_refresh_) {
649 MEB::OutArgsSetup<Scalar> outArgs;
650 outArgs.setModelEvalDescription(this->description());
651 outArgs.set_Np_Ng(num_me_parameters_, responses_.size());
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
662 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
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));
675 for(std::size_t p=0;p<parameters_.size();p++) {
676 if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
677 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_GRADIENT_FORM));
687 Teuchos::RCP<panzer::ResponseBase> respTanBase
688 = responseLibrary_->getResponse<RespEvalT>(responses_[i]->name);
689 if(respTanBase!=Teuchos::null) {
690 for(std::size_t p=0;p<parameters_.size();p++) {
691 if(!parameters_[p]->is_distributed)
692 outArgs.setSupports(MEB::OUT_ARG_DgDp,i,p,MEB::DerivativeSupport(MEB::DERIV_MV_JACOBIAN_FORM));
699 for(std::size_t p=0;p<parameters_.size();p++) {
701 if(!parameters_[p]->is_distributed)
702 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_MV_BY_COL));
703 else if(parameters_[p]->is_distributed && parameters_[p]->global_indexer!=Teuchos::null)
704 outArgs.setSupports(MEB::OUT_ARG_DfDp,p,MEB::DerivativeSupport(MEB::DERIV_LINEAR_OP));
707 prototypeOutArgs_ = outArgs;
711 require_out_args_refresh_ =
false;
713 return prototypeOutArgs_;
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> >
733 return solverFactory_;
736template <
typename Scalar>
737Teuchos::RCP<Thyra::LinearOpBase<Scalar> >
742 using Teuchos::rcp_dynamic_cast;
744 typedef Thyra::ModelEvaluatorBase MEB;
756 if(require_out_args_refresh_) {
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));
779 return Thyra::createMember(*get_f_space());
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);
798 return addParameter(tmp_names,tmp_values);
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());
813 int parameter_index = parameters_.size();
816 RCP<ParameterObject> param = createScalarParameter(names,initialValues);
817 parameters_.push_back(param);
820 RCP< Thyra::VectorSpaceBase<double> > tan_space =
821 Thyra::multiVectorProductVectorSpace(x_space_, param->names->size());
822 tangent_space_.push_back(tan_space);
826 num_me_parameters_ += 2;
827 if (build_transient_support_)
828 ++num_me_parameters_;
830 require_in_args_refresh_ =
true;
831 require_out_args_refresh_ =
true;
832 this->resetDefaultBase();
834 return parameter_index;
837template <
typename Scalar>
841 const Teuchos::RCP<GlobalEvaluationData> & ged,
843 const Teuchos::RCP<const GlobalIndexer> & ugi)
845 distrParamGlobalEvaluationData_.addDataObject(key,ged);
847 int parameter_index = parameters_.size();
848 parameters_.push_back(createDistributedParameter(key,vs,initial,ugi));
849 ++num_me_parameters_;
851 require_in_args_refresh_ =
true;
852 require_out_args_refresh_ =
true;
853 this->resetDefaultBase();
855 return parameter_index;
858template <
typename Scalar>
861 const Teuchos::RCP<GlobalEvaluationData> & ged)
863 nonParamGlobalEvaluationData_.addDataObject(key,ged);
866template <
typename Scalar>
869 const Teuchos::RCP<GlobalEvaluationData> & ged)
871 assemblyGlobalEvaluationData_.addDataObject(key, 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;
904 if(Teuchos::is_null(ghostedContainer_)) {
905 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
911 ae_inargs.
container_ = lof_->buildLinearObjContainer();
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
975 setParameters(inArgs);
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);
989 setupAssemblyInArgs(inArgs,ae_inargs);
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
1023 setParameters(inArgs);
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);
1037 setupAssemblyInArgs(inArgs,ae_inargs);
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
1073 setParameters(inArgs);
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);
1089 setupAssemblyInArgs(inArgs,ae_inargs);
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
1127 setParameters(inArgs);
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);
1143 setupAssemblyInArgs(inArgs,ae_inargs);
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());
1194 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1195 "ModelEvaluator was not built with transient support enabled!");
1200 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDx2;
1206 setupAssemblyInArgs(inArgs,ae_inargs);
1208 auto deltaXContainer = lof_->buildReadOnlyDomainContainer();
1209 deltaXContainer->setOwnedVector(delta_x);
1213 setParameters(inArgs);
1219 if(oneTimeDirichletBeta_on_) {
1223 oneTimeDirichletBeta_on_ =
false;
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());
1293 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
1294 "ModelEvaluator was not built with transient support enabled!");
1299 const RCP<Thyra::LinearOpBase<Scalar> > W_out = D2fDxDp;
1305 setupAssemblyInArgs(inArgs,ae_inargs);
1309 auto deltaPContainer = parameters_[pIndex]->dfdp_rl->getLinearObjFactory()->buildReadOnlyDomainContainer();
1310 deltaPContainer->setOwnedVector(delta_p);
1314 setParameters(inArgs);
1320 if(oneTimeDirichletBeta_on_) {
1324 oneTimeDirichletBeta_on_ =
false;
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);
1399 setupAssemblyInArgs(inArgs,ae_inargs);
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);
1450 setupAssemblyInArgs(inArgs,ae_inargs);
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
1477 evalModelImpl_basic(inArgs,outArgs);
1480 if(required_basic_g(outArgs))
1481 evalModelImpl_basic_g(inArgs,outArgs);
1484 if(required_basic_dgdx(outArgs))
1485 evalModelImpl_basic_dgdx(inArgs,outArgs);
1488 if(required_basic_dgdp_scalar(outArgs))
1489 evalModelImpl_basic_dgdp_scalar(inArgs,outArgs);
1492 if(required_basic_dgdp_distro(outArgs))
1493 evalModelImpl_basic_dgdp_distro(inArgs,outArgs);
1495 if(required_basic_dfdp_scalar(outArgs)) {
1497 evalModelImpl_basic_dfdp_scalar_fd(inArgs,outArgs);
1499 evalModelImpl_basic_dfdp_scalar(inArgs,outArgs);
1502 if(required_basic_dfdp_distro(outArgs))
1503 evalModelImpl_basic_dfdp_distro(inArgs,outArgs);
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());
1527 TEUCHOS_TEST_FOR_EXCEPTION(is_transient && !build_transient_support_, std::runtime_error,
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) ) {
1545 setupAssemblyInArgs(inArgs,ae_inargs);
1548 setParameters(inArgs);
1554 if(oneTimeDirichletBeta_on_) {
1558 oneTimeDirichletBeta_on_ =
false;
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);
1668 ++write_matrix_count_;
1673template <
typename Scalar>
1676 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> &outArgs)
const
1678 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModelImpl_basic_g()");
1686 setupAssemblyInArgs(inArgs,ae_inargs);
1689 setParameters(inArgs);
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;
1720 TEUCHOS_ASSERT(required_basic_dgdx(outArgs));
1723 setParameters(inArgs);
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);
1749 setupAssemblyInArgs(inArgs,ae_inargs);
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;
1773 TEUCHOS_ASSERT(required_basic_dgdp_scalar(outArgs));
1776 std::vector<std::string> activeParameterNames;
1777 std::vector<int> activeParameters;
1778 int totalParameterCount = 0;
1779 for(std::size_t j=0; j<parameters_.size(); j++) {
1782 if(parameters_[j]->is_distributed)
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);
1821 setupAssemblyInArgs(inArgs,ae_inargs);
1824 RCP<panzer::GlobalEvaluationData> ged_activeParameters =
1830 for (std::size_t ap=0; ap<activeParameters.size(); ++ap) {
1831 const int j = activeParameters[ap];
1832 for (
unsigned int k=0; k < parameters_[j]->scalar_value.size(); k++) {
1834 p.fastAccessDx(paramIndex) = 1.0;
1835 parameters_[j]->scalar_value[k].family->template setValue<panzer::Traits::Tangent>(p);
1841 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
1844 if(totalParameterCount>0) {
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;
1860 TEUCHOS_ASSERT(required_basic_dgdp_distro(outArgs));
1866 for(std::size_t p=0;p<parameters_.size();p++) {
1870 if(!parameters_[p]->is_distributed)
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);
1898 setupAssemblyInArgs(inArgs,ae_inargs);
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;
1922 TEUCHOS_ASSERT(required_basic_dfdp_scalar(outArgs));
1928 setupAssemblyInArgs(inArgs,ae_inargs);
1934 std::vector<std::string> activeParameters;
1936 int totalParameterCount = 0;
1937 for(std::size_t i=0; i < parameters_.size(); i++) {
1939 if(parameters_[i]->is_distributed)
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++) {
1989 if(parameters_[i]->is_distributed)
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++) {
1998 parameters_[i]->scalar_value[j].baseValue);
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++) {
2007 parameters_[i]->scalar_value[j].baseValue);
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;
2040 TEUCHOS_ASSERT(required_basic_dfdp_scalar(outArgs));
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());
2067 MEB::InArgs<Scalar> inArgs_fd = this->createInArgs();
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);
2073 const double h = fd_perturb_size_;
2074 for(std::size_t i=0; i < parameters_.size(); i++) {
2077 if(parameters_[i]->is_distributed)
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) {
2097 dx_dot_v =inArgs.get_p(i+parameters_.size()+tangent_space_.size());
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;
2144 TEUCHOS_ASSERT(required_basic_dfdp_distro(outArgs));
2150 for(std::size_t p=0;p<parameters_.size();p++) {
2154 if(!parameters_[p]->is_distributed)
2159 if(parameters_[p]->dfdp_rl==null)
2163 MEB::Derivative<Scalar> deriv = outArgs.get_DfDp(p);
2170 RCP<Response_Residual<Traits::Jacobian> > response_jacobian =
2172 response_jacobian->setJacobian(deriv.getLinearOp());
2177 setupAssemblyInArgs(inArgs,ae_inargs);
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);
2197 return activeGArgs | required_basic_dgdx(outArgs);
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++) {
2232 if(parameters_[p]->is_distributed)
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++) {
2258 if(!parameters_[p]->is_distributed)
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++) {
2283 if(parameters_[i]->is_distributed)
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++) {
2308 if(!parameters_[i]->is_distributed)
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;
2344 for(std::size_t p=0;p<parameters_.size();p++) {
2347 if(!parameters_[p]->is_distributed)
2352 if(parameters_[p]->global_indexer==null)
2358 parameters_[p]->global_indexer);
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);
2369 parameters_[p]->dfdp_rl = rLibrary;
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;
2395 for(std::size_t p=0;p<parameters_.size();p++) {
2398 if(!parameters_[p]->is_distributed)
2403 if(parameters_[p]->global_indexer==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++) {
2419 if(responses_[r]->builder==Teuchos::null)
2424 responses_[r]->builder->setDerivativeInformation(param_lof);
2427 rLibrary->addResponse(responses_[r]->name,
2428 responses_[r]->wkst_desc,
2429 *responses_[r]->builder);
2432 rLibrary->buildResponseEvaluators(physicsBlocks,eqset_factory,
2433 cm_factory,closure_models,user_data,
2434 write_graphviz_file,graphviz_file_prefix);
2437 parameters_[p]->dgdp_rl = rLibrary;
2441template <
typename Scalar>
2445 oneTimeDirichletBeta_on_ =
true;
2446 oneTimeDirichletBeta_ = beta;
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++) {
2531 if(parameters_[i]->is_distributed)
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++) {
2553 if(parameters_[i]->is_distributed)
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));
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.
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
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())
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
void resetParameters() const
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
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?...
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.
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
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
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 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
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
int addFlexibleResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const Teuchos::RCP< ResponseMESupportBuilderBase > &builder)
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_
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< Thyra::LinearOpBase< Scalar > > create_W_op() const override
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
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 required_basic_dfdp_distro(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Are derivatives of the residual with respect to the distributed parameters in the out args?...
Teuchos::RCP< const 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.
Tpetra::KokkosCompat::KokkosDeviceWrapperNode< PHX::Device > TpetraNodeType
The Kokkos node type used to instantiate all Tpetra objects (Map, MultiVector, CrsGraph,...
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)
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.