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
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.");
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>
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());
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])
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;
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++) {
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++) {
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++) {
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;
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));
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;
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.
Teuchos::RCP< Epetra_MultiVector > getMultiVector() const
int NumMyElements() const
const Epetra_BlockMap & Map() const
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)