11#ifndef PANZER_MODEL_EVALUATOR_EPETRA_HPP
12#define PANZER_MODEL_EVALUATOR_EPETRA_HPP
14#include "EpetraExt_ModelEvaluator.h"
16#include "Epetra_Map.h"
17#include "Epetra_Vector.h"
18#include "Epetra_Comm.h"
19#include "Epetra_CrsGraph.h"
21#include "Teuchos_RCP.hpp"
22#include "Teuchos_AbstractFactory.hpp"
31#include "Thyra_VectorBase.hpp"
39 class FieldManagerBuilder;
48 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
49 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
50 const Teuchos::RCP<panzer::GlobalData>& global_data,
51 bool build_transient_support);
56 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
57 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
58 const Teuchos::RCP<panzer::GlobalData>& global_data,
59 bool build_transient_support);
64 Teuchos::RCP<const Epetra_Map>
get_x_map()
const;
65 Teuchos::RCP<const Epetra_Map>
get_f_map()
const;
66 Teuchos::RCP<const Epetra_Vector>
get_x_init()
const;
69 Teuchos::RCP<Epetra_Operator>
create_W()
const;
70 Teuchos::RCP<const Epetra_Map>
get_p_map(
int l)
const;
71 Teuchos::RCP<const Teuchos::Array<std::string> >
get_p_names(
int l)
const;
72 Teuchos::RCP<const Epetra_Vector>
get_p_init(
int l)
const;
73 Teuchos::RCP<const Epetra_Map>
get_g_map(
int l)
const;
77 void evalModel(
const InArgs& inArgs,
const OutArgs& outArgs )
const;
119 const Teuchos::RCP<Epetra_Map>& global_map,
120 const Teuchos::RCP<Epetra_Import>& importer,
121 const Teuchos::RCP<Epetra_Vector>& ghosted_vector);
138 template <
typename ResponseEvaluatorFactory_BuilderT>
140 const std::vector<WorksetDescriptor> & wkst_desc,
141 const ResponseEvaluatorFactory_BuilderT & builder);
147 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
150 const Teuchos::ParameterList& closure_models,
151 const Teuchos::ParameterList& user_data,
152 const bool write_graphviz_file=
false,
153 const std::string& graphviz_file_prefix=
"")
154 {
responseLibrary_->buildResponseEvaluators(physicsBlocks,eqset_factory,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix); }
160 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
162 const Teuchos::ParameterList& closure_models,
163 const Teuchos::ParameterList& user_data,
164 const bool write_graphviz_file=
false,
165 const std::string& graphviz_file_prefix=
"")
166 {
responseLibrary_->buildResponseEvaluators(physicsBlocks,cm_factory,closure_models,user_data,write_graphviz_file,graphviz_file_prefix); }
198 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
199 const Teuchos::RCP<panzer::ParamLib>& parameter_library);
205 void evalModel_basic(
const InArgs& inArgs,
const OutArgs& outArgs )
const;
247 Teuchos::RCP<Epetra_Vector>
x0_;
254 Teuchos::RCP<panzer::FieldManagerBuilder>
fmb_;
259 std::vector<Teuchos::RCP<const Epetra_Map> >
g_map_;
263 std::vector<Teuchos::RCP<Epetra_Map> >
p_map_;
264 std::vector<Teuchos::RCP<Epetra_Vector> >
p_init_;
266 std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >
p_names_;
286 Teuchos::RCP<panzer::LinearObjFactory<panzer::Traits> >
lof_;
296 template <
typename ResponseEvaluatorFactory_BuilderT>
299 const std::vector<WorksetDescriptor> & wkst_desc,
300 const ResponseEvaluatorFactory_BuilderT & builder)
303 TEUCHOS_TEST_FOR_EXCEPTION(
responseLibrary_->responseEvaluatorsBuilt(),std::logic_error,
304 "panzer::ModelEvaluator_Epetra::addResponse: Response with name \"" << responseName <<
"\" "
305 "cannot be added to the model evaluator because evalModel has already been called!");
311 TEUCHOS_TEST_FOR_EXCEPTION(std::find(
g_names_.begin(),
g_names_.end(),responseName)!=
g_names_.end(),std::logic_error,
312 "panzer::ModelEvaluator_Epetra::addResponse: Response with name \"" << responseName <<
"\" "
313 "has already been added to the model evaluator!");
319 TEUCHOS_TEST_FOR_EXCEPTION(respBase==Teuchos::null,std::logic_error,
320 "panzer::ModelEvaluator_Epetra::addResponse: Response with name \"" << responseName <<
"\" "
321 "has no residual type! Not sure what is going on!");
324 Teuchos::RCP<panzer::ResponseMESupportBase<panzer::Traits::Residual> > resp = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<panzer::Traits::Residual> >(respBase);
325 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
326 "panzer::ModelEvaluator_Epetra::addResponse: Response with name \"" << responseName <<
"\" "
327 "resulted in bad cast to panzer::ResponseMESupportBase<Residual>, the type of the response is incompatible!");
330 Teuchos::RCP<const Epetra_Map> eMap = resp->getMap();
334 resp->setVector(Teuchos::rcp(
new Epetra_Vector(*eMap)));
339 if(respJacBase!=Teuchos::null) {
343 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respJacBase);
344 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
345 "panzer::ModelEvaluator_Epetra::addResponse: Response with name \"" << responseName <<
"\" "
346 "resulted in bad cast to panzer::ResponseMESupportBase<Jacobian>, the type of the response is incompatible!");
349 if(resp->supportsDerivative())
350 resp->setDerivative(resp->buildEpetraDerivative());
353#ifdef Panzer_BUILD_HESSIAN_SUPPORT
356 std::cout <<
"******************************************************" << std::endl;
357 std::cout <<
"EPETRA DOING IT " << respHesBase << std::endl;
358 std::cout <<
"******************************************************" << std::endl;
359 if(respHesBase!=Teuchos::null) {
363 Teuchos::RCP<panzer::ResponseMESupportBase<RespEvalT> > resp = Teuchos::rcp_dynamic_cast<panzer::ResponseMESupportBase<RespEvalT> >(respHesBase);
364 TEUCHOS_TEST_FOR_EXCEPTION(resp==Teuchos::null,std::logic_error,
365 "panzer::ModelEvaluator_Epetra::addResponse: Response with name \"" << responseName <<
"\" "
366 "resulted in bad cast to panzer::ResponseMESupportBase<Hessian>, the type of the response is incompatible!");
369 if(resp->supportsDerivative())
370 resp->setDerivative(resp->buildDerivative());
383 Teuchos::RCP<ModelEvaluator_Epetra>
387 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > >& p_names,
388 const std::vector<Teuchos::RCP<Teuchos::Array<double> > >& p_values,
389 const Teuchos::RCP<panzer::GlobalData>& global_data,
390 bool build_transient_support);
A PHX::TemplateManager holding one panzer::AssemblyEngine<EvalT> per evaluation type in Traits::EvalT...
A PHX::TemplateManager holding one panzer::ClosureModelFactory<EvalT> per evaluation type in Traits::...
Teuchos::RCP< const Epetra_Map > get_f_map() const
Teuchos::RCP< const Epetra_Map > get_x_map() const
OutArgs createOutArgs() const
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > getResponseLibrary() const
Get the response library used by this evaluator.
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
Teuchos::RCP< const Epetra_Map > get_p_map(int l) const
Teuchos::RCP< const Epetra_Vector > get_p_init(int l) const
Teuchos::RCP< Teuchos::AbstractFactory< Epetra_Operator > > epetraOperatorFactory_
void evalModel_basic_dgdx(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< const Epetra_Map > map_x_
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.
Teuchos::RCP< LinearObjContainer > ghostedContainer_
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.
Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > lof_
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)
int addResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const ResponseEvaluatorFactory_BuilderT &builder)
void evalModel_basic_g(AssemblyEngineInArgs ae_inargs, const InArgs &inArgs, const OutArgs &outArgs) const
Teuchos::RCP< panzer::FieldManagerBuilder > fmb_
double oneTimeDirichletBeta_
bool required_basic_dfdp(const OutArgs &outArgs) const
Are derivatives of the residual with respect to the parameters in the out args? DfDp.
std::vector< Teuchos::RCP< Epetra_Map > > p_map_
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)
Teuchos::RCP< Epetra_Vector > x0_
bool oneTimeDirichletBeta_on_
void buildResponses(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::EquationSetFactory &eqset_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const Teuchos::ParameterList &user_data, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
void copyEpetraIntoThyra(const Epetra_MultiVector &x, const Teuchos::Ptr< Thyra::VectorBase< double > > &thyraVec) const
Teuchos::RCP< panzer::GlobalData > global_data_
panzer::AssemblyEngine_TemplateManager< panzer::Traits > ae_tm_
std::vector< std::tuple< std::string, int, Teuchos::RCP< Epetra_Import >, Teuchos::RCP< Epetra_Vector > > > distributed_parameter_container_
Teuchos::RCP< Epetra_Vector > dummy_f_
std::vector< Teuchos::RCP< Epetra_Vector > > p_init_
std::vector< std::string > g_names_
std::vector< bool > is_distributed_parameter_
std::vector< Teuchos::RCP< const Epetra_Map > > g_map_
Teuchos::RCP< Epetra_Vector > x_dot_init_
void buildResponses(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, 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 applyDirichletBCs(const Teuchos::RCP< Thyra::VectorBase< double > > &x, const Teuchos::RCP< Thyra::VectorBase< double > > &f) const
bool build_transient_support_
std::vector< Teuchos::RCP< Teuchos::Array< std::string > > > p_names_
void copyThyraIntoEpetra(const Thyra::VectorBase< double > &thyraVec, Epetra_MultiVector &x) const
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > responseLibrary_
Teuchos::Array< panzer::ParamVec > parameter_vector_
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)
Allocates and initializes an equation set template manager.
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.