11#ifndef PANZER_STK_MODEL_EVALUATOR_FACTORY_HPP
12#define PANZER_STK_MODEL_EVALUATOR_FACTORY_HPP
18#include "Teuchos_RCP.hpp"
19#include "Teuchos_Ptr.hpp"
20#include "Teuchos_Comm.hpp"
21#include "Teuchos_DefaultMpiComm.hpp"
22#include "Teuchos_ParameterList.hpp"
23#include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
25#include "PanzerAdaptersSTK_config.hpp"
38#ifdef PANZER_HAVE_EPETRA_STACK
40#include "Thyra_EpetraModelEvaluator.hpp"
43#ifdef PANZER_HAVE_TEKO
44#include "Teko_RequestHandler.hpp"
48#ifdef PANZER_HAVE_TEMPUS
49 template <
typename ScalarT>
class TempusSolverForwardOnly;
54 template<
typename ScalarT>
class ModelEvaluator;
55 template<
typename ScalarT>
class LinearOpWithSolveFactoryBase;
72#ifdef PANZER_HAVE_TEMPUS
77 template<
typename ScalarT>
85 void setParameterList(Teuchos::RCP<Teuchos::ParameterList>
const& paramList);
106 void buildObjects(
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm,
107 const Teuchos::RCP<panzer::GlobalData>& global_data,
108 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
111 bool meConstructionOn=
true);
120 void setNOXObserverFactory(
const Teuchos::RCP<const panzer_stk::NOXObserverFactory>& nox_observer_factory);
122#ifdef PANZER_HAVE_TEMPUS
124 void setTempusObserverFactory(
const Teuchos::RCP<const panzer_stk::TempusObserverFactory>& tempus_observer_factory);
128 template <
typename BuilderT>
129 int addResponse(
const std::string & responseName,
const std::vector<panzer::WorksetDescriptor> & wkstDesc,
const BuilderT & builder);
133 template <
typename BuilderT>
134 int addResponseWithDerivatives(
const std::string & responseName,
const std::vector<panzer::WorksetDescriptor> & wkstDesc,BuilderT & builder);
138 const bool write_graphviz_file=
false,
139 const std::string& graphviz_file_prefix=
"");
145 Teuchos::RCP<Thyra::ModelEvaluator<ScalarT> >
147 const Teuchos::RCP<panzer::GlobalData>& global_data,
148#ifdef PANZER_HAVE_TEMPUS
149 const Teuchos::RCP<Piro::TempusSolverForwardOnly<ScalarT> > tempusSolver = Teuchos::null,
151 const Teuchos::Ptr<const panzer_stk::NOXObserverFactory> & in_nox_observer_factory=Teuchos::null
152#ifdef PANZER_HAVE_TEMPUS
153 ,
const Teuchos::Ptr<const panzer_stk::TempusObserverFactory> & in_tempus_observer_factory=Teuchos::null
166 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > &
getPhysicsBlocks()
const;
169 Teuchos::RCP<panzer_stk::STK_Interface>
getMesh()
const
195 Teuchos::RCP<Thyra::ModelEvaluator<double> >
197 const Teuchos::RCP<Teuchos::ParameterList> & physics_block_plist,
198 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
201 bool is_transient,
bool is_explicit,
202 const Teuchos::Ptr<const Teuchos::ParameterList> & bc_list=Teuchos::null,
210 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
213 const Teuchos::ParameterList & closure_pl,
214 const Teuchos::ParameterList & initial_cond_pl,
215 const Teuchos::ParameterList & user_data_pl,
216 bool write_dot_files,
const std::string & dot_file_prefix)
const;
222 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
223 const Teuchos::RCP<panzer::WorksetContainer> & wc,
224 const Teuchos::RCP<const panzer::GlobalIndexer> & ugi,
226 const Teuchos::RCP<panzer_stk::STK_Interface> & mesh,
228 const Teuchos::ParameterList & closure_model_pl,
229 const Teuchos::ParameterList & user_data_pl,
230 int workset_size)
const;
234 Teuchos::RCP<Thyra::ModelEvaluatorDefaultBase<double> >
236 const Teuchos::RCP<panzer::FieldManagerBuilder> & fmb,
239 const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > > & p_names,
240 const std::vector<Teuchos::RCP<Teuchos::Array<double> > > & p_values,
242 const Teuchos::RCP<panzer::GlobalData> & global_data,
243 bool is_transient,
double t_init)
const;
255 double getInitialTime(Teuchos::ParameterList& transient_ic_params,
259 Teuchos::RCP<Thyra::LinearOpWithSolveFactoryBase<double> >
261 const Teuchos::RCP<const panzer::GlobalIndexer> & globalIndexer,
262 const Teuchos::RCP<panzer::ConnManager> & conn_manager,
263 const Teuchos::RCP<panzer_stk::STK_Interface> & mesh,
265 #ifdef PANZER_HAVE_TEKO
266 ,
const Teuchos::RCP<Teko::RequestHandler> & req_handler=Teuchos::null
278 Teuchos::RCP<STK_MeshFactory>
buildSTKMeshFactory(
const Teuchos::ParameterList & mesh_params)
const;
282 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
289 Teuchos::RCP<panzer::FieldManagerBuilder>
291 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
292 const std::vector<panzer::BC> & bcs,
297 const Teuchos::ParameterList& closure_models,
299 const Teuchos::ParameterList& user_data,
300 bool writeGraph,
const std::string & graphPrefix,
301 bool write_field_managers,
const std::string & field_manager_prefix)
const;
306 const Teuchos::RCP<panzer::WorksetContainer> & wc,
307 const Teuchos::RCP<const panzer::GlobalIndexer> & ugi,
309 const Teuchos::RCP<panzer_stk::STK_Interface> & mesh)
const;
314 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
316 const Teuchos::ParameterList & closure_models,
317 int workset_size, Teuchos::ParameterList & user_data)
const;
325 Teuchos::RCP<Thyra::ModelEvaluator<ScalarT> >
m_rome_me;
330 Teuchos::RCP<panzer_stk::STK_Interface>
m_mesh;
341#ifdef PANZER_HAVE_TEMPUS
342 Teuchos::RCP<const panzer_stk::TempusObserverFactory> m_tempus_observer_factory;
351template<
typename ScalarT>
352template <
typename BuilderT>
354addResponse(
const std::string & responseName,
const std::vector<panzer::WorksetDescriptor> & wkstDesc,
const BuilderT & builder)
358#ifdef PANZER_HAVE_EPETRA_STACK
359 Teuchos::RCP<Thyra::EpetraModelEvaluator> thyra_ep_me = Teuchos::rcp_dynamic_cast<Thyra::EpetraModelEvaluator>(
m_physics_me);
360 Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(
m_physics_me);
362 if(thyra_ep_me!=Teuchos::null && panzer_me==Teuchos::null) {
364 Teuchos::RCP<EpetraExt::ModelEvaluator> ep_me = Teuchos::rcp_const_cast<EpetraExt::ModelEvaluator>(thyra_ep_me->getEpetraModel());
365 Teuchos::RCP<panzer::ModelEvaluator_Epetra> ep_panzer_me = Teuchos::rcp_dynamic_cast<panzer::ModelEvaluator_Epetra>(ep_me);
367 return ep_panzer_me->addResponse(responseName,wkstDesc,builder);
369 else if(panzer_me!=Teuchos::null && thyra_ep_me==Teuchos::null) {
370 return panzer_me->addResponse(responseName,wkstDesc,builder);
373 Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(
m_physics_me);
374 if(panzer_me!=Teuchos::null) {
375 return panzer_me->addResponse(responseName,wkstDesc,builder);
379 TEUCHOS_ASSERT(
false);
383template<
typename ScalarT>
384template <
typename BuilderT>
386addResponseWithDerivatives(
const std::string & responseName,
const std::vector<panzer::WorksetDescriptor> & wkstDesc,BuilderT & builder)
390 Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(
m_physics_me);
391 if(panzer_me!=Teuchos::null) {
392 return panzer_me->addFlexibleResponse(responseName,wkstDesc,Teuchos::rcpFromRef(builder));
395 TEUCHOS_ASSERT(
false);
A PHX::TemplateManager holding one panzer::ClosureModelFactory<EvalT> per evaluation type in Traits::...
Pure virtual base class for supplying mesh connectivity information to the DOF Manager.
Class that provides access to worksets on each element block and side set.
bool isTransient() const
Returns true if this a transient problem.
Teuchos::RCP< Thyra::LinearOpWithSolveFactoryBase< double > > buildLOWSFactory(bool blockedAssembly, const Teuchos::RCP< const panzer::GlobalIndexer > &globalIndexer, const Teuchos::RCP< panzer::ConnManager > &conn_manager, const Teuchos::RCP< panzer_stk::STK_Interface > &mesh, const Teuchos::RCP< const Teuchos::MpiComm< int > > &mpi_comm) const
Builds a Thyra LOWS (linear-op-with-solve) factory from this object's Stratimikos parameter list,...
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > getResponseLibrary()
Returns the response library used to build and evaluate registered responses.
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > initializeSolnWriterResponseLibrary(const Teuchos::RCP< panzer::WorksetContainer > &wc, const Teuchos::RCP< const panzer::GlobalIndexer > &ugi, const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &lof, const Teuchos::RCP< panzer_stk::STK_Interface > &mesh) const
Builds a response library configured to write the solution out to the STK mesh.
void registerMeshWithClosureModelFactories(const Teuchos::RCP< panzer_stk::STK_Interface > &mesh, panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &user_cm_factory)
Registers the given mesh with a closure model factory template manager, e.g. so its closure models ca...
Teuchos::RCP< panzer_stk::WorksetFactory > m_user_wkst_factory
Teuchos::RCP< panzer::FieldManagerBuilder > buildFieldManagerBuilder(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 panzer::LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data, bool writeGraph, const std::string &graphPrefix, bool write_field_managers, const std::string &field_manager_prefix) const
Builds the field manager builder used to register and evaluate the physics/BC/closure-model evaluator...
Teuchos::RCP< const panzer_stk::NOXObserverFactory > m_nox_observer_factory
Teuchos::RCP< panzer_stk::STK_Interface > m_mesh
double getInitialTime(Teuchos::ParameterList &transient_ic_params, const panzer_stk::STK_Interface &mesh) const
Gets the initial time from either the input parameter list or an exodus file.
void finalizeMeshConstruction(const STK_MeshFactory &mesh_factory, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const Teuchos::MpiComm< int > mpi_comm, STK_Interface &mesh) const
Commits the mesh's meta data, builds its bulk data, and writes it out if requested,...
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > getResponseOnlyModelEvaluator()
Returns the response-only model evaluator built by buildResponseOnlyModelEvaluator().
void buildObjects(const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP< panzer::GlobalData > &global_data, const Teuchos::RCP< const panzer::EquationSetFactory > &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, bool meConstructionOn=true)
Builds the model evaluators for a panzer assembly.
void addUserFieldsToMesh(panzer_stk::STK_Interface &mesh, const Teuchos::ParameterList &output_list) const
Add the user fields specified by output_list to the mesh.
Teuchos::RCP< panzer::GlobalIndexer > getGlobalIndexer() const
Get global indexer used to build model evaluator.
Teuchos::RCP< const panzer::EquationSetFactory > m_eqset_factory
Teuchos::RCP< Thyra::ModelEvaluator< double > > cloneWithNewPhysicsBlocks(const Teuchos::RCP< Thyra::LinearOpWithSolveFactoryBase< ScalarT > > &solverFactory, const Teuchos::RCP< Teuchos::ParameterList > &physics_block_plist, const Teuchos::RCP< const panzer::EquationSetFactory > &eqset_factory, const panzer::BCStrategyFactory &bc_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &user_cm_factory, bool is_transient, bool is_explicit, const Teuchos::Ptr< const Teuchos::ParameterList > &bc_list=Teuchos::null, const Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > &physics_me=Teuchos::null) const
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > m_response_library
Teuchos::RCP< panzer::WorksetContainer > getWorksetContainer() const
Get the workset container associated with the mesh database.
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > buildResponseOnlyModelEvaluator(const Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > &thyra_me, const Teuchos::RCP< panzer::GlobalData > &global_data, const Teuchos::Ptr< const panzer_stk::NOXObserverFactory > &in_nox_observer_factory=Teuchos::null)
Wraps the given physics model evaluator with a solver (e.g. NOX/Tempus), exposing only the registered...
Teuchos::RCP< panzer::ConnManager > m_conn_manager
bool useDynamicCoordinates_
void buildResponses(const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
Builds and registers the evaluators for all responses added via addResponse().
int addResponseWithDerivatives(const std::string &responseName, const std::vector< panzer::WorksetDescriptor > &wkstDesc, BuilderT &builder)
Add a response along with support for state and parameter derivatives and , respectively.
void setStratimikosList(const Teuchos::RCP< Teuchos::ParameterList > ¶mList)
Set the Stratimikos Linear Solver sublist used to create the LinearOpWithSolve factory.
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const ¶mList)
Sets and validates the top-level parameter list describing the physics, mesh, and solver setup.
bool isBlockedAssembly() const
Returns true if assembly is blocked.
void setupInitialConditions(Thyra::ModelEvaluator< ScalarT > &model, panzer::WorksetContainer &wkstContainer, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const panzer::LinearObjFactory< panzer::Traits > &lof, const Teuchos::ParameterList &closure_pl, const Teuchos::ParameterList &initial_cond_pl, const Teuchos::ParameterList &user_data_pl, bool write_dot_files, const std::string &dot_file_prefix) const
Setup the initial conditions in a model evaluator. Note that this is entirely self contained.
Teuchos::RCP< panzer::WorksetContainer > m_wkstContainer
bool useDynamicCoordinates() const
Should coordinates be recomputed dynamically (e.g. for a moving mesh) rather than cached once?
void setUserWorksetFactory(Teuchos::RCP< panzer_stk::WorksetFactory > &user_wkst_factory)
Set user defined workset factory.
const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > & getPhysicsBlocks() const
Returns the physics blocks built by buildObjects().
std::vector< Teuchos::RCP< panzer::PhysicsBlock > > m_physics_blocks
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > m_rome_me
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > getPhysicsModelEvaluator()
Returns the physics model evaluator built by buildObjects().
Teuchos::RCP< Teuchos::ParameterList > m_stratimikos_params
Teuchos::RCP< panzer_stk::STK_Interface > getMesh() const
Get mesh object used to build model evaluator.
Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > m_lin_obj_factory
Teuchos::RCP< panzer::GlobalIndexer > m_global_indexer
Teuchos::RCP< panzer::GlobalData > m_global_data
Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > getLinearObjFactory() const
Get linear object factory used to build model evaluator.
Teuchos::RCP< STK_MeshFactory > buildSTKMeshFactory(const Teuchos::ParameterList &mesh_params) const
build STK mesh factory from a mesh parameter list
void setNOXObserverFactory(const Teuchos::RCP< const panzer_stk::NOXObserverFactory > &nox_observer_factory)
Sets the factory used to build a NOX observer for the solver built by buildResponseOnlyModelEvaluator...
void finalizeSolnWriterResponseLibrary(panzer::ResponseLibrary< panzer::Traits > &rl, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, int workset_size, Teuchos::ParameterList &user_data) const
Builds and registers the evaluators needed by a solution-writer response library built with initializ...
Teuchos::RCP< Thyra::ModelEvaluatorDefaultBase< double > > buildPhysicsModelEvaluator(bool buildThyraME, 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< Thyra::LinearOpWithSolveFactoryBase< ScalarT > > &solverFactory, const Teuchos::RCP< panzer::GlobalData > &global_data, bool is_transient, double t_init) const
Teuchos::RCP< panzer::ConnManager > getConnManager() const
Get connection manager.
int addResponse(const std::string &responseName, const std::vector< panzer::WorksetDescriptor > &wkstDesc, const BuilderT &builder)
Registers a response to be built by buildResponses(), using the given response evaluator factory buil...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Returns the valid parameters (with defaults) for the top-level parameter list.
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > m_physics_me
void writeInitialConditions(const Thyra::ModelEvaluator< ScalarT > &model, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const Teuchos::RCP< panzer::WorksetContainer > &wc, const Teuchos::RCP< const panzer::GlobalIndexer > &ugi, const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &lof, const Teuchos::RCP< panzer_stk::STK_Interface > &mesh, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_model_pl, const Teuchos::ParameterList &user_data_pl, int workset_size) const
Write the initial conditions to exodus. Note that this is entirely self contained.
Abstract factory for building a NOX::Observer that has access to the STK mesh, DOF manager,...
A panzer::ConnManager implementation backed by an STK mesh, mapping local element IDs to global mesh-...
Abstract factory for building a Tempus integrator observer that has access to the STK mesh,...
Interface for constructing a BCStrategy_TemplateManager.
Allocates and initializes an equation set template manager.
Struct for global data to be stored.