11#include "PanzerDiscFE_config.hpp"
23#include "Epetra_CrsMatrix.h"
24#include "Epetra_MpiComm.h"
25#include "Epetra_LocalMap.h"
27#include "Teuchos_ScalarTraits.hpp"
28#include "Teuchos_DefaultMpiComm.hpp"
29#include "Teuchos_TimeMonitor.hpp"
31#include "Thyra_EpetraOperatorWrapper.hpp"
32#include "Thyra_EpetraThyraWrappers.hpp"
33#include "Thyra_VectorStdOps.hpp"
34#include "Thyra_ProductVectorBase.hpp"
35#include "Thyra_SpmdVectorBase.hpp"
36#include "Thyra_DefaultProductVector.hpp"
37#include "Thyra_ProductVectorSpaceBase.hpp"
44class EpetraLOF_EOpFactory :
public Teuchos::AbstractFactory<Epetra_Operator> {
45 Teuchos::RCP<Epetra_CrsGraph> W_graph_;
48 : W_graph_(lof.getGraph(0,0)) {}
50 virtual Teuchos::RCP<Epetra_Operator> create()
const
51 {
return Teuchos::rcp(
new Epetra_CrsMatrix(::Copy,*W_graph_)); }
61 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
62 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
63 const Teuchos::RCP<panzer::GlobalData>& global_data,
64 bool build_transient_support)
67 , responseLibrary_(rLibrary)
69 , global_data_(global_data)
70 , build_transient_support_(build_transient_support)
72 , oneTimeDirichletBeta_on_(false)
73 , oneTimeDirichletBeta_(0.0)
76 using Teuchos::rcp_dynamic_cast;
79 ae_tm_.buildObjects(builder);
86 Teuchos::RCP<panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> > ep_lof =
87 Teuchos::rcp_dynamic_cast<panzer::BlockedEpetraLinearObjFactory<panzer::Traits,int> >(lof);
90 if(ep_lof!=Teuchos::null)
93 TEUCHOS_ASSERT(
false);
101 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
102 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
103 const Teuchos::RCP<panzer::GlobalData>& global_data,
104 bool build_transient_support)
107 , responseLibrary_(rLibrary)
109 , global_data_(global_data)
110 , build_transient_support_(build_transient_support)
112 , oneTimeDirichletBeta_on_(false)
113 , oneTimeDirichletBeta_(0.0)
116 using Teuchos::rcp_dynamic_cast;
119 ae_tm_.buildObjects(builder);
132 using Teuchos::rcp_dynamic_cast;
134 TEUCHOS_TEST_FOR_EXCEPTION(responseLibrary_==Teuchos::null,std::logic_error,
135 "panzer::ModelEvaluator_Epetra::initializeEpetraObjs: The response library "
136 "was not correctly initialized before calling initializeEpetraObjs.");
139 x0_ = rcp(
new Epetra_Vector(*map_x_));
140 x_dot_init_ = rcp(
new Epetra_Vector(*map_x_));
141 x_dot_init_->PutScalar(0.0);
144 for (
int i=0; i < parameter_vector_.size(); i++) {
145 RCP<Epetra_Map> local_map = rcp(
new Epetra_LocalMap(
static_cast<int>(parameter_vector_[i].size()), 0, map_x_->Comm())) ;
146 p_map_.push_back(local_map);
148 RCP<Epetra_Vector> ep_vec = rcp(
new Epetra_Vector(*local_map));
149 ep_vec->PutScalar(0.0);
151 for (
unsigned int j=0; j < parameter_vector_[i].size(); j++)
152 (*ep_vec)[j] = parameter_vector_[i][j].baseValue;
154 p_init_.push_back(ep_vec);
158 epetraOperatorFactory_ = Teuchos::rcp(
new EpetraLOF_EOpFactory(lof));
163 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
164 const Teuchos::RCP<panzer::ParamLib>& parameter_library)
166 parameter_vector_.resize(p_names.size());
167 is_distributed_parameter_.resize(p_names.size(),
false);
168 for (std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >::size_type p = 0;
169 p < p_names.size(); ++p) {
172 for(
int i=0;i<p_names[p]->size();i++)
177 for(
int i=0;i<p_names[p]->size();i++) {
178 parameter_vector_[p][i].baseValue = (*p_values[p])[i];
179 parameter_vector_[p][i].family->setRealValueForAllTypes((*p_values[p])[i]);
188 const Teuchos::RCP<Epetra_Map>& global_map,
189 const Teuchos::RCP<Epetra_Import>& importer,
190 const Teuchos::RCP<Epetra_Vector>& ghosted_vector)
193 int index =
static_cast<int>(p_map_.size());
195 p_map_.push_back(global_map);
196 Teuchos::RCP<Epetra_Vector> ep_vec = Teuchos::rcp(
new Epetra_Vector(*global_map));
197 ep_vec->PutScalar(0.0);
198 p_init_.push_back(ep_vec);
200 Teuchos::RCP<Teuchos::Array<std::string> > tmp_names =
201 Teuchos::rcp(
new Teuchos::Array<std::string>);
202 tmp_names->push_back(name);
203 p_names_.push_back(tmp_names);
205 is_distributed_parameter_.push_back(
true);
212 distributed_parameter_container_.push_back(std::make_tuple(name,index,importer,ghosted_vector));
219Teuchos::RCP<const Epetra_Map>
225Teuchos::RCP<const Epetra_Map>
231Teuchos::RCP<const Epetra_Vector>
237Teuchos::RCP<const Epetra_Vector>
249Teuchos::RCP<Epetra_Operator>
252 return epetraOperatorFactory_->create();
255Teuchos::RCP<const Epetra_Map>
261Teuchos::RCP<const Teuchos::Array<std::string> >
267Teuchos::RCP<const Epetra_Vector>
273Teuchos::RCP<const Epetra_Map>
279EpetraExt::ModelEvaluator::InArgs
283 inArgs.setModelEvalDescription(this->description());
284 inArgs.setSupports(IN_ARG_x,
true);
285 if (build_transient_support_) {
286 inArgs.setSupports(IN_ARG_x_dot,
true);
287 inArgs.setSupports(IN_ARG_t,
true);
288 inArgs.setSupports(IN_ARG_alpha,
true);
289 inArgs.setSupports(IN_ARG_beta,
true);
291 inArgs.set_Np(p_init_.size());
296EpetraExt::ModelEvaluator::OutArgs
299 OutArgsSetup outArgs;
300 outArgs.setModelEvalDescription(this->description());
301 outArgs.set_Np_Ng(p_init_.size(), g_map_.size());
302 outArgs.setSupports(OUT_ARG_f,
true);
303 outArgs.setSupports(OUT_ARG_W,
true);
304 outArgs.set_W_properties(
305 DerivativeProperties(
306 DERIV_LINEARITY_NONCONST
313 for(std::size_t i=0;i<p_init_.size();i++) {
314 if(!is_distributed_parameter_[i])
315 outArgs.setSupports(OUT_ARG_DfDp,i,EpetraExt::ModelEvaluator::DerivativeSupport(DERIV_MV_BY_COL));
319 for(std::size_t i=0;i<g_names_.size();i++) {
323 Teuchos::RCP<panzer::ResponseBase> respJacBase = responseLibrary_->getResponse<RespEvalT>(g_names_[i]);
324 if(respJacBase!=Teuchos::null) {
326 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
329 if(resp->supportsDerivative())
330 outArgs.setSupports(OUT_ARG_DgDx,i,DerivativeSupport(DERIV_TRANS_MV_BY_ROW));
343 using Teuchos::ArrayRCP;
344 using Teuchos::Array;
346 using Teuchos::rcp_dynamic_cast;
349 if(Teuchos::is_null(ghostedContainer_)) {
350 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
356 ae_inargs.
container_ = lof_->buildLinearObjContainer();
358 ae_inargs.
alpha = 0.0;
359 ae_inargs.
beta = 1.0;
366 const RCP<panzer::ThyraObjContainer<double> > thGlobalContainer =
367 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(ae_inargs.
container_,
true);
369 TEUCHOS_ASSERT(!Teuchos::is_null(thGlobalContainer));
374 const RCP<panzer::ThyraObjContainer<double> > thGhostedContainer =
375 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(ae_inargs.
ghostedContainer_,
true);
376 TEUCHOS_ASSERT(!Teuchos::is_null(thGhostedContainer));
377 Thyra::assign(thGhostedContainer->get_f_th().ptr(),0.0);
386 thGlobalContainer->set_x_th(x);
389 RCP<panzer::LinearObjContainer> counter = ae_tm_.getAsObject<
panzer::Traits::Residual>()->evaluateOnlyDirichletBCs(ae_inargs);
392 RCP<panzer::LinearObjContainer>
result = lof_->buildLinearObjContainer();
395 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(counter)->set_f_th(thGlobalContainer->get_f_th());
398 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(
result)->set_f_th(f);
401 lof_->applyDirichletBCs(*counter,*
result);
405 const OutArgs& outArgs )
const
408 using Teuchos::rcp_dynamic_cast;
410 evalModel_basic(inArgs,outArgs);
414 const OutArgs& outArgs )
const
417 using Teuchos::rcp_dynamic_cast;
422 bool has_x_dot =
false;
423 if (inArgs.supports(EpetraExt::ModelEvaluator::IN_ARG_x_dot ))
424 has_x_dot = nonnull(inArgs.get_x_dot());
427 TEUCHOS_TEST_FOR_EXCEPTION(has_x_dot && !build_transient_support_, std::runtime_error,
428 "ModelEvaluator was not built with transient support enabled!");
433 const RCP<Epetra_Vector> f_out = outArgs.get_f();
434 const RCP<Epetra_Operator> W_out = outArgs.get_W();
435 bool requiredResponses = required_basic_g(outArgs);
436 bool requiredSensitivities = required_basic_dfdp(outArgs);
439 if(Teuchos::is_null(f_out) && Teuchos::is_null(W_out) &&
440 !requiredResponses && !requiredSensitivities) {
448 if(Teuchos::is_null(ghostedContainer_)) {
449 ghostedContainer_ = lof_->buildGhostedLinearObjContainer();
459 const RCP<const Epetra_Vector> x = inArgs.get_x();
460 RCP<const Epetra_Vector> x_dot;
463 ae_inargs.
container_ = lof_->buildLinearObjContainer();
465 ae_inargs.
alpha = 0.0;
466 ae_inargs.
beta = 1.0;
468 if (build_transient_support_) {
469 x_dot = inArgs.get_x_dot();
470 ae_inargs.
alpha = inArgs.get_alpha();
471 ae_inargs.
beta = inArgs.get_beta();
472 ae_inargs.
time = inArgs.get_t();
481 if(oneTimeDirichletBeta_on_) {
485 oneTimeDirichletBeta_on_ =
false;
489 for (
int i=0; i<inArgs.Np(); i++) {
490 Teuchos::RCP<const Epetra_Vector> p = inArgs.get_p(i);
491 if ( nonnull(p) && !is_distributed_parameter_[i]) {
492 for (
unsigned int j=0; j < parameter_vector_[i].size(); j++) {
493 parameter_vector_[i][j].baseValue = (*p)[j];
498 for (Teuchos::Array<panzer::ParamVec>::size_type i=0; i < parameter_vector_.size(); i++) {
499 for (
unsigned int j=0; j < parameter_vector_[i].size(); j++) {
500 parameter_vector_[i][j].family->setRealValueForAllTypes(parameter_vector_[i][j].baseValue);
505 for (std::vector<std::tuple<std::string,
int,Teuchos::RCP<Epetra_Import>,Teuchos::RCP<Epetra_Vector> > >::const_iterator i =
506 distributed_parameter_container_.begin(); i != distributed_parameter_container_.end(); ++i) {
508 Teuchos::RCP<const Epetra_Vector> global_vec = inArgs.get_p(std::get<1>(*i));
509 if (nonnull(global_vec)) {
511 Teuchos::RCP<Epetra_Import> importer = std::get<2>(*i);
512 if (nonnull(importer))
513 std::get<3>(*i)->Import(*global_vec,*importer,Insert);
517 Teuchos::RCP<panzer::EpetraLinearObjContainer> container =
519 container->set_x(std::get<3>(*i));
524 const RCP<panzer::EpetraLinearObjContainer> epGlobalContainer =
525 Teuchos::rcp_dynamic_cast<panzer::EpetraLinearObjContainer>(ae_inargs.
container_);
527 TEUCHOS_ASSERT(!Teuchos::is_null(epGlobalContainer));
532 const RCP<panzer::EpetraLinearObjContainer> epGhostedContainer =
533 Teuchos::rcp_dynamic_cast<panzer::EpetraLinearObjContainer>(ae_inargs.
ghostedContainer_);
542 epGlobalContainer->set_x(Teuchos::rcp_const_cast<Epetra_Vector>(x));
544 epGlobalContainer->set_dxdt(Teuchos::rcp_const_cast<Epetra_Vector>(x_dot));
546 if (!Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
548 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f and J)");
551 epGlobalContainer->set_f(f_out);
552 epGlobalContainer->set_A(Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out));
555 epGhostedContainer->get_f()->PutScalar(0.0);
556 epGhostedContainer->get_A()->PutScalar(0.0);
560 else if(!Teuchos::is_null(f_out) && Teuchos::is_null(W_out)) {
562 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(f)");
564 epGlobalContainer->set_f(f_out);
567 epGhostedContainer->get_f()->PutScalar(0.0);
571 f_out->Update(1.0, *(epGlobalContainer->get_f()), 0.0);
573 else if(Teuchos::is_null(f_out) && !Teuchos::is_null(W_out)) {
575 PANZER_FUNC_TIME_MONITOR(
"panzer::ModelEvaluator::evalModel(J)");
578 if (Teuchos::is_null(dummy_f_))
579 dummy_f_ = Teuchos::rcp(
new Epetra_Vector(*(this->get_f_map())));
580 epGlobalContainer->set_f(dummy_f_);
581 epGlobalContainer->set_A(Teuchos::rcp_dynamic_cast<Epetra_CrsMatrix>(W_out));
584 epGhostedContainer->get_A()->PutScalar(0.0);
591 epGlobalContainer->set_A(Teuchos::null);
594 if(requiredResponses) {
595 evalModel_basic_g(ae_inargs,inArgs,outArgs);
598 if(required_basic_dgdx(outArgs))
599 evalModel_basic_dgdx(ae_inargs,inArgs,outArgs);
602 if(required_basic_dfdp(outArgs))
603 evalModel_basic_dfdp(ae_inargs,inArgs,outArgs);
607 epGlobalContainer->set_x(Teuchos::null);
608 epGlobalContainer->set_dxdt(Teuchos::null);
609 epGlobalContainer->set_f(Teuchos::null);
610 epGlobalContainer->set_A(Teuchos::null);
624 for(std::size_t i=0;i<g_names_.size();i++) {
625 Teuchos::RCP<Epetra_Vector> vec = outArgs.get_g(i);
626 if(vec!=Teuchos::null) {
627 std::string responseName = g_names_[i];
628 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp
629 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(responseLibrary_->getResponse<
panzer::Traits::Residual>(responseName));
630 resp->setVector(vec);
644 TEUCHOS_ASSERT(required_basic_dgdx(outArgs));
646 for(std::size_t i=0;i<g_names_.size();i++) {
648 EpetraExt::ModelEvaluator::Derivative deriv = outArgs.get_DgDx(i);
652 Teuchos::RCP<Epetra_MultiVector> vec = deriv.getMultiVector();
654 if(vec!=Teuchos::null) {
655 std::string responseName = g_names_[i];
656 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> > resp
657 = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Jacobian> >(responseLibrary_->getResponse<
panzer::Traits::Jacobian>(responseName));
658 resp->setDerivative(vec);
672 using Teuchos::rcp_dynamic_cast;
674 TEUCHOS_ASSERT(required_basic_dfdp(outArgs));
677 RCP<const Thyra::VectorSpaceBase<double> > glblVS = rcp_dynamic_cast<const ThyraObjFactory<double> >(lof_,
true)->getThyraRangeSpace();;
679 std::vector<std::string> activeParameters;
682 int totalParameterCount = 0;
683 for(Teuchos::Array<panzer::ParamVec>::size_type i=0; i < parameter_vector_.size(); i++) {
685 EpetraExt::ModelEvaluator::Derivative deriv = outArgs.get_DfDp(i);
690 Teuchos::RCP<Epetra_MultiVector> mVec = deriv.getMultiVector();
691 TEUCHOS_ASSERT(mVec->NumVectors()==
int(parameter_vector_[i].size()));
693 for (
unsigned int j=0; j < parameter_vector_[i].size(); j++) {
697 RCP<LinearObjContainer> globalContainer = loc_pair->getGlobalLOC();
700 RCP<Epetra_Vector> vec = Teuchos::rcpFromRef(*(*mVec)(j));
701 RCP<panzer::ThyraObjContainer<double> > thGlobalContainer =
702 Teuchos::rcp_dynamic_cast<panzer::ThyraObjContainer<double> >(globalContainer);
703 thGlobalContainer->set_f_th(Thyra::create_Vector(vec,glblVS));
706 std::string name =
"PARAMETER_SENSITIVIES: "+(*p_names_[i])[j];
710 activeParameters.push_back(name);
711 totalParameterCount++;
720 for (Teuchos::Array<panzer::ParamVec>::size_type i=0; i < parameter_vector_.size(); i++) {
722 EpetraExt::ModelEvaluator::Derivative deriv = outArgs.get_DfDp(i);
723 if(deriv.isEmpty()) {
725 for (
unsigned int j=0; j < parameter_vector_[i].size(); j++) {
733 for (
unsigned int j=0; j < parameter_vector_[i].size(); j++) {
735 p.fastAccessDx(paramIndex) = 1.0;
743 TEUCHOS_ASSERT(paramIndex==totalParameterCount);
745 if(totalParameterCount>0) {
753 bool activeGArgs =
false;
754 for(
int i=0;i<outArgs.Ng();i++)
755 activeGArgs |= (outArgs.get_g(i)!=Teuchos::null);
757 return activeGArgs | required_basic_dgdx(outArgs);
763 bool activeGArgs =
false;
764 for(
int i=0;i<outArgs.Ng();i++) {
766 if(outArgs.supports(OUT_ARG_DgDx,i).none())
770 activeGArgs |= (!outArgs.get_DgDx(i).isEmpty());
779 bool activeFPArgs =
false;
780 for(
int i=0;i<outArgs.Np();i++) {
782 if(outArgs.supports(OUT_ARG_DfDp,i).none())
786 activeFPArgs |= (!outArgs.get_DfDp(i).isEmpty());
801 using Teuchos::rcpFromRef;
802 using Teuchos::rcp_dynamic_cast;
804 using Teuchos::ArrayView;
805 using Teuchos::rcp_dynamic_cast;
807 const int numVecs = x.NumVectors();
809 TEUCHOS_TEST_FOR_EXCEPTION(numVecs != 1, std::runtime_error,
810 "epetraToThyra does not work with MV dimension != 1");
812 const RCP<const Thyra::ProductVectorBase<double> > prodThyraVec =
813 Thyra::castOrCreateProductVectorBase(rcpFromRef(thyraVec));
815 const Teuchos::ArrayView<double> epetraData(x[0], x.Map().NumMyElements());
818 std::size_t offset = 0;
819 const int numBlocks = prodThyraVec->productSpace()->numBlocks();
820 for (
int b = 0; b < numBlocks; ++b) {
821 const RCP<const Thyra::VectorBase<double> > vec_b = prodThyraVec->getVectorBlock(b);
822 const RCP<const Thyra::SpmdVectorBase<double> > spmd_b =
823 rcp_dynamic_cast<const Thyra::SpmdVectorBase<double> >(vec_b,
true);
825 Teuchos::ArrayRCP<const double> thyraData;
826 spmd_b->getLocalData(Teuchos::ptrFromRef(thyraData));
828 for (Teuchos::ArrayRCP<const double>::size_type i=0; i < thyraData.size(); ++i) {
829 epetraData[i+offset] = thyraData[i];
831 offset += thyraData.size();
841 using Teuchos::ArrayView;
842 using Teuchos::rcpFromPtr;
843 using Teuchos::rcp_dynamic_cast;
845 const int numVecs = x.NumVectors();
847 TEUCHOS_TEST_FOR_EXCEPTION(numVecs != 1, std::runtime_error,
848 "ModelEvaluator_Epetra::copyEpetraToThyra does not work with MV dimension != 1");
850 const RCP<Thyra::ProductVectorBase<double> > prodThyraVec =
851 Thyra::castOrCreateNonconstProductVectorBase(rcpFromPtr(thyraVec));
853 const Teuchos::ArrayView<const double> epetraData(x[0], x.Map().NumMyElements());
858 std::size_t offset = 0;
859 const int numBlocks = prodThyraVec->productSpace()->numBlocks();
860 for (
int b = 0; b < numBlocks; ++b) {
861 const RCP<Thyra::VectorBase<double> > vec_b = prodThyraVec->getNonconstVectorBlock(b);
862 const RCP<Thyra::SpmdVectorBase<double> > spmd_b =
863 rcp_dynamic_cast<Thyra::SpmdVectorBase<double> >(vec_b,
true);
865 Teuchos::ArrayRCP<double> thyraData;
866 spmd_b->getNonconstLocalData(Teuchos::ptrFromRef(thyraData));
868 for (Teuchos::ArrayRCP<double>::size_type i=0; i < thyraData.size(); ++i) {
869 thyraData[i] = epetraData[i+offset];
871 offset += thyraData.size();
877Teuchos::RCP<panzer::ModelEvaluator_Epetra>
881 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
882 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
883 const Teuchos::RCP<panzer::GlobalData>& global_data,
884 bool build_transient_support)
887 using Teuchos::rcp_dynamic_cast;
890 std::stringstream ss;
891 ss <<
"panzer::buildEpetraME: Linear object factory is incorrect type. Should be one of: ";
893 RCP<BlockedEpetraLinearObjFactory<panzer::Traits,int> > ep_lof
894 = rcp_dynamic_cast<BlockedEpetraLinearObjFactory<panzer::Traits,int> >(lof);
897 if(ep_lof!=Teuchos::null)
898 return rcp(
new ModelEvaluator_Epetra(fmb,rLibrary,ep_lof,p_names,p_values,global_data,build_transient_support));
900 ss <<
"\"BlockedEpetraLinearObjFactory\", ";
902 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,ss.str());
908 oneTimeDirichletBeta_on_ =
true;
909 oneTimeDirichletBeta_ = beta;
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>...
void addGlobalEvaluationData(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
bool apply_dirichlet_beta
bool evaluate_transient_terms
Teuchos::RCP< panzer::LinearObjContainer > container_
virtual const Teuchos::RCP< Epetra_Map > getMap(int i) const
get the map from the matrix
Teuchos::RCP< const Epetra_Map > get_f_map() const
Teuchos::RCP< const Epetra_Map > get_x_map() const
OutArgs createOutArgs() const
Teuchos::RCP< const Epetra_Vector > get_x_init() const
Teuchos::RCP< const Epetra_Vector > get_x_dot_init() const
Teuchos::RCP< Epetra_Operator > create_W() const
Teuchos::RCP< const Epetra_Map > get_g_map(int l) const
void evalModel(const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int l) const
void set_t_init(double t)
Set initial time value.
InArgs createInArgs() const
double get_t_init() const
ModelEvaluator_Epetra(const Teuchos::RCP< panzer::FieldManagerBuilder > &fmb, const Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > &rLibrary, const Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > &lof, const std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > &p_names, const std::vector< Teuchos::RCP< Teuchos::Array< double > > > &p_values, const Teuchos::RCP< panzer::GlobalData > &global_data, bool build_transient_support)
Teuchos::RCP< const Epetra_Map > get_p_map(int l) const
Teuchos::RCP< const Epetra_Vector > get_p_init(int l) const
void evalModel_basic_dgdx(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
void initializeEpetraObjs(panzer::BlockedEpetraLinearObjFactory< panzer::Traits, int > &lof)
void setOneTimeDirichletBeta(const double &beta) const
bool required_basic_dgdx(const OutArgs &outArgs) const
Are their required responses in the out args? DgDx.
void evalModel_basic_dfdp(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
bool required_basic_g(const OutArgs &outArgs) const
Are their required responses in the out args? g and DgDx.
int addDistributedParameter(const std::string name, const Teuchos::RCP< Epetra_Map > &global_map, const Teuchos::RCP< Epetra_Import > &importer, const Teuchos::RCP< Epetra_Vector > &ghosted_vector)
void evalModel_basic_g(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
bool required_basic_dfdp(const OutArgs &outArgs) const
Are derivatives of the residual with respect to the parameters in the out args? DfDp.
void evalModel_basic(const InArgs &inArgs, const OutArgs &outArgs) const
for evaluation and handling of normal quantities, x,f,W, etc
void initializeParameterVector(const std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > &p_names, const std::vector< Teuchos::RCP< Teuchos::Array< double > > > &p_values, const Teuchos::RCP< panzer::ParamLib > ¶meter_library)
void copyEpetraIntoThyra(const Epetra_MultiVector &x, const Teuchos::Ptr< Thyra::VectorBase< double > > &thyraVec) const
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
void applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< double > > &x, const Teuchos::RCP< Thyra::VectorBase< double > > &f) const
std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > p_names_
void copyThyraIntoEpetra(const Thyra::VectorBase< double > &thyraVec, Epetra_MultiVector &x) const
Teuchos::RCP< ModelEvaluator_Epetra > buildEpetraME(const Teuchos::RCP< FieldManagerBuilder > &fmb, const Teuchos::RCP< ResponseLibrary< panzer::Traits > > &rLibrary, const Teuchos::RCP< LinearObjFactory< panzer::Traits > > &lof, const std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > &p_names, const std::vector< Teuchos::RCP< Teuchos::Array< double > > > &p_values, const Teuchos::RCP< panzer::GlobalData > &global_data, bool build_transient_support)
void registerScalarParameter(const std::string name, panzer::ParamLib &pl, double realValue)
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_FADTYPE FadType
Sacado forward-mode AD scalar type used for the Jacobian and Tangent evaluation types.