Panzer  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Panzer_STK_ModelEvaluatorFactory.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Panzer: A partial differential equation assembly
4 // engine for strongly coupled complex multiphysics systems
5 //
6 // Copyright 2011 NTESS and the Panzer contributors.
7 // SPDX-License-Identifier: BSD-3-Clause
8 // *****************************************************************************
9 // @HEADER
10 
11 #ifndef PANZER_STK_MODEL_EVALUATOR_FACTORY_HPP
12 #define PANZER_STK_MODEL_EVALUATOR_FACTORY_HPP
13 
14 #include <iostream>
15 #include <string>
16 #include <map>
17 
18 #include "Teuchos_RCP.hpp"
19 #include "Teuchos_Ptr.hpp"
20 #include "Teuchos_Comm.hpp"
23 #include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
24 
25 #include "PanzerAdaptersSTK_config.hpp"
26 #include "Panzer_PhysicsBlock.hpp"
28 #include "Panzer_STK_Interface.hpp"
35 
36 #include "Panzer_NodeType.hpp"
37 
38 #ifdef PANZER_HAVE_EPETRA_STACK
40 #include "Thyra_EpetraModelEvaluator.hpp"
41 #endif
42 
43 #ifdef PANZER_HAVE_TEKO
44 #include "Teko_RequestHandler.hpp"
45 #endif
46 
47 namespace Piro {
48 #ifdef PANZER_HAVE_TEMPUS
49  template <typename ScalarT> class TempusSolverForwardOnly;
50 #endif
51 }
52 
53 namespace Thyra {
54  template<typename ScalarT> class ModelEvaluator;
55  template<typename ScalarT> class LinearOpWithSolveFactoryBase;
56 }
57 
58 namespace panzer {
59  struct GlobalData;
60  class GlobalIndexer;
61  template <typename> class LinearObjFactory;
62 
63  class BlockedDOFManager;
64  class DOFManager;
65  class ConnManager;
66 }
67 
68 namespace panzer_stk {
69 
70  class STKConnManager;
71  class NOXObserverFactory;
72 #ifdef PANZER_HAVE_TEMPUS
73  class TempusObserverFactory;
74 #endif
75  class WorksetFactory;
76 
77  template<typename ScalarT>
79 
80  public:
81 
87 
96 
104  void buildObjects(const Teuchos::RCP<const Teuchos::Comm<int> >& comm,
105  const Teuchos::RCP<panzer::GlobalData>& global_data,
107  const panzer::BCStrategyFactory & bc_factory,
109  bool meConstructionOn=true);
110 
112 
115 
117 
118 #ifdef PANZER_HAVE_TEMPUS
119  void setTempusObserverFactory(const Teuchos::RCP<const panzer_stk::TempusObserverFactory>& tempus_observer_factory);
120 #endif
121 
122  template <typename BuilderT>
123  int addResponse(const std::string & responseName,const std::vector<panzer::WorksetDescriptor> & wkstDesc,const BuilderT & builder);
124 
126  const bool write_graphviz_file=false,
127  const std::string& graphviz_file_prefix="");
128 
130 
133  const Teuchos::RCP<panzer::GlobalData>& global_data,
134 #ifdef PANZER_HAVE_TEMPUS
135  const Teuchos::RCP<Piro::TempusSolverForwardOnly<ScalarT> > tempusSolver = Teuchos::null,
136 #endif
137  const Teuchos::Ptr<const panzer_stk::NOXObserverFactory> & in_nox_observer_factory=Teuchos::null
138 #ifdef PANZER_HAVE_TEMPUS
139  , const Teuchos::Ptr<const panzer_stk::TempusObserverFactory> & in_tempus_observer_factory=Teuchos::null
140 #endif
141  );
142 
144 
147 
149 
150  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & getPhysicsBlocks() const;
151 
154  { return m_mesh; }
155 
158  { return m_global_indexer; }
159 
162  { return m_conn_manager; }
163 
165  bool isBlockedAssembly() const
166  { return m_blockedAssembly; }
167 
170  { return m_lin_obj_factory; }
171 
172  bool isTransient() const
173  { return m_is_transient; }
174 
180  const Teuchos::RCP<Teuchos::ParameterList> & physics_block_plist,
182  const panzer::BCStrategyFactory & bc_factory,
184  bool is_transient,bool is_explicit,
185  const Teuchos::Ptr<const Teuchos::ParameterList> & bc_list=Teuchos::null,
186  const Teuchos::RCP<Thyra::ModelEvaluator<ScalarT> > & physics_me=Teuchos::null) const;
187 
192  panzer::WorksetContainer & wkstContainer,
193  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
196  const Teuchos::ParameterList & closure_pl,
197  const Teuchos::ParameterList & initial_cond_pl,
198  const Teuchos::ParameterList & user_data_pl,
199  bool write_dot_files,const std::string & dot_file_prefix) const;
200 
205  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
211  const Teuchos::ParameterList & closure_model_pl,
212  const Teuchos::ParameterList & user_data_pl,
213  int workset_size) const;
214 
218  buildPhysicsModelEvaluator(bool buildThyraME,
222  const std::vector<Teuchos::RCP<Teuchos::Array<std::string> > > & p_names,
223  const std::vector<Teuchos::RCP<Teuchos::Array<double> > > & p_values,
225  const Teuchos::RCP<panzer::GlobalData> & global_data,
226  bool is_transient,double t_init) const;
227 
228 
230  { return useDynamicCoordinates_; }
231 
237  double getInitialTime(Teuchos::ParameterList& transient_ic_params,
238  const panzer_stk::STK_Interface& mesh) const;
239 
241  buildLOWSFactory(bool blockedAssembly,
242  const Teuchos::RCP<const panzer::GlobalIndexer> & globalIndexer,
243  const Teuchos::RCP<panzer::ConnManager> & conn_manager,
245  const Teuchos::RCP<const Teuchos::MpiComm<int> > & mpi_comm
246  #ifdef PANZER_HAVE_TEKO
247  , const Teuchos::RCP<Teko::RequestHandler> & req_handler=Teuchos::null
248  #endif
249  ) const;
250 
253  { return m_wkstContainer; }
254 
256  void addUserFieldsToMesh(panzer_stk::STK_Interface & mesh,const Teuchos::ParameterList & output_list) const;
257 
260 
261  void finalizeMeshConstruction(const STK_MeshFactory & mesh_factory,
262  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
263  const Teuchos::MpiComm<int> mpi_comm,
264  STK_Interface & mesh) const;
265 
266  protected:
267 
270  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
271  const std::vector<panzer::BC> & bcs,
272  const panzer::EquationSetFactory & eqset_factory,
273  const panzer::BCStrategyFactory& bc_factory,
276  const Teuchos::ParameterList& closure_models,
277  const panzer::LinearObjFactory<panzer::Traits> & lo_factory,
278  const Teuchos::ParameterList& user_data,
279  bool writeGraph,const std::string & graphPrefix,
280  bool write_field_managers,const std::string & field_manager_prefix) const;
281 
288  const Teuchos::RCP<panzer_stk::STK_Interface> & mesh) const;
289 
293  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
295  const Teuchos::ParameterList & closure_models,
296  int workset_size, Teuchos::ParameterList & user_data) const;
297 
298 
299  private:
300 
303 
305  std::vector<Teuchos::RCP<panzer::PhysicsBlock> > m_physics_blocks;
306 
316 
318 #ifdef PANZER_HAVE_TEMPUS
320 #endif
323 
326  };
327 
328 template<typename ScalarT>
329 template <typename BuilderT>
331 addResponse(const std::string & responseName,const std::vector<panzer::WorksetDescriptor> & wkstDesc,const BuilderT & builder)
332 {
333  typedef panzer::ModelEvaluator<double> PanzerME;
334 
335 #ifdef PANZER_HAVE_EPETRA_STACK
336  Teuchos::RCP<Thyra::EpetraModelEvaluator> thyra_ep_me = Teuchos::rcp_dynamic_cast<Thyra::EpetraModelEvaluator>(m_physics_me);
337  Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(m_physics_me);
338 
339  if(thyra_ep_me!=Teuchos::null && panzer_me==Teuchos::null) {
340  // I don't need no const-ness!
341  Teuchos::RCP<EpetraExt::ModelEvaluator> ep_me = Teuchos::rcp_const_cast<EpetraExt::ModelEvaluator>(thyra_ep_me->getEpetraModel());
342  Teuchos::RCP<panzer::ModelEvaluator_Epetra> ep_panzer_me = Teuchos::rcp_dynamic_cast<panzer::ModelEvaluator_Epetra>(ep_me);
343 
344  return ep_panzer_me->addResponse(responseName,wkstDesc,builder);
345  }
346  else if(panzer_me!=Teuchos::null && thyra_ep_me==Teuchos::null) {
347  return panzer_me->addResponse(responseName,wkstDesc,builder);
348  }
349 #else
350  Teuchos::RCP<PanzerME> panzer_me = Teuchos::rcp_dynamic_cast<PanzerME>(m_physics_me);
351  if(panzer_me!=Teuchos::null) {
352  return panzer_me->addResponse(responseName,wkstDesc,builder);
353  }
354 #endif
355 
356  TEUCHOS_ASSERT(false);
357  return -1;
358 }
359 
360 }
361 
362 #endif
Interface for constructing a BCStrategy_TemplateManager.
int addResponse(const std::string &responseName, const std::vector< WorksetDescriptor > &wkst_desc, const ResponseEvaluatorFactory_BuilderT &builder)
Allocates and initializes an equation set template manager.
void setStratimikosList(const Teuchos::RCP< Teuchos::ParameterList > &paramList)
Set the Stratimikos Linear Solver sublist used to create the LinearOpWithSolve factory.
bool isBlockedAssembly() const
Is blocked assembly?
Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > m_lin_obj_factory
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > m_response_library
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > getPhysicsModelEvaluator()
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > m_rome_me
Teuchos::RCP< panzer::GlobalIndexer > m_global_indexer
Teuchos::RCP< panzer::WorksetContainer > getWorksetContainer() const
Get the workset container associated with the mesh database.
Teuchos::RCP< panzer_stk::STK_Interface > m_mesh
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
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
Teuchos::RCP< panzer::ConnManager > m_conn_manager
Teuchos::RCP< STK_MeshFactory > buildSTKMeshFactory(const Teuchos::ParameterList &mesh_params) const
build STK mesh factory from a mesh parameter list
int addResponse(const std::string &responseName, const std::vector< panzer::WorksetDescriptor > &wkstDesc, const BuilderT &builder)
Teuchos::RCP< panzer::WorksetContainer > m_wkstContainer
void setParameterList(Teuchos::RCP< Teuchos::ParameterList > const &paramList)
Teuchos::RCP< panzer_stk::WorksetFactory > m_user_wkst_factory
Class that provides access to worksets on each element block and side set.
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > getResponseOnlyModelEvaluator()
Teuchos::RCP< panzer::GlobalData > m_global_data
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_stk::STK_Interface > getMesh() const
Get mesh object used to build model evaluator.
Teuchos::RCP< const panzer_stk::NOXObserverFactory > m_nox_observer_factory
void addUserFieldsToMesh(panzer_stk::STK_Interface &mesh, const Teuchos::ParameterList &output_list) const
Add the user fields specified by output_list to the mesh.
void setNOXObserverFactory(const Teuchos::RCP< const panzer_stk::NOXObserverFactory > &nox_observer_factory)
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.
Teuchos::RCP< Teuchos::ParameterList > m_stratimikos_params
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)
void buildResponses(const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const bool write_graphviz_file=false, const std::string &graphviz_file_prefix="")
const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > & getPhysicsBlocks() const
Teuchos::RCP< Thyra::ModelEvaluator< ScalarT > > m_physics_me
Teuchos::RCP< panzer::LinearObjFactory< panzer::Traits > > getLinearObjFactory() const
Get linear object factory used to build model evaluator.
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
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.
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
#define TEUCHOS_ASSERT(assertion_test)
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::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
Teuchos::RCP< panzer::GlobalIndexer > getGlobalIndexer() const
Get global indexer used to build model evaluator.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< const panzer::EquationSetFactory > m_eqset_factory
std::vector< Teuchos::RCP< panzer::PhysicsBlock > > m_physics_blocks
void setUserWorksetFactory(Teuchos::RCP< panzer_stk::WorksetFactory > &user_wkst_factory)
Set user defined workset factory.
Teuchos::RCP< panzer::ConnManager > getConnManager() const
Get connection manager.
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.
Teuchos::RCP< panzer::ResponseLibrary< panzer::Traits > > getResponseLibrary()
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