13#include "Teuchos_Assert.hpp"
15#include "Panzer_EquationSet_DefaultImpl.hpp"
25 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
27 const Teuchos::ParameterList& ic_block_closure_models,
29 const Teuchos::ParameterList& user_data,
30 const bool write_graphviz_file,
31 const std::string& graphviz_file_prefix,
34 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
35 for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
36 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
37 std::string blockId = pb->elementBlockID();
40 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
44 std::string closure_model_name =
"";
45 if (ic_block_closure_models.isSublist(blockId))
46 closure_model_name = blockId;
47 else if (ic_block_closure_models.isSublist(
"Default"))
48 closure_model_name =
"Default";
50 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Failed to find initial condition for element block \"" << blockId
51 <<
"\". You must provide an initial condition for each element block or set a default!"
52 << ic_block_closure_models);
55 std::vector<bool> active_evaluation_types(Sacado::mpl::size<panzer::Traits::EvalTypes>::value,
false);
56 int residual_index = Sacado::mpl::find<panzer::Traits::EvalTypes,panzer::Traits::Residual>::value;
57 active_evaluation_types[residual_index] =
true;
58 pb->setActiveEvaluationTypes(active_evaluation_types);
61 pb->buildAndRegisterInitialConditionEvaluators(*fm, cm_factory, closure_model_name, ic_block_closure_models, lo_factory, user_data);
63 pb->activateAllEvaluationTypes();
72 for (
auto eval_type=fm->begin(); eval_type != fm->end(); ++eval_type,++i) {
73 if (active_evaluation_types[i])
74 eval_type->postRegistrationSetup(setupData,*fm,
false,
false,
nullptr);
77 phx_ic_field_managers[blockId] = fm;
79 if (write_graphviz_file)
80 fm->writeGraphvizFile(graphviz_file_prefix+
"_IC_"+blockId);
86 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
88 const Teuchos::ParameterList& closure_models,
89 const Teuchos::ParameterList& ic_block_closure_models,
91 const Teuchos::ParameterList& user_data,
92 const bool write_graphviz_file,
93 const std::string& graphviz_file_prefix,
96 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
97 for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
98 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
99 std::string blockId = pb->elementBlockID();
102 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
106 std::string closure_model_name =
"";
107 if (ic_block_closure_models.isSublist(blockId))
108 closure_model_name = blockId;
109 else if (ic_block_closure_models.isSublist(
"Default"))
110 closure_model_name =
"Default";
112 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Failed to find initial condition for element block \"" << blockId
113 <<
"\". You must provide an initial condition for each element block or set a default!"
114 << ic_block_closure_models);
117 std::vector<bool> active_evaluation_types(Sacado::mpl::size<panzer::Traits::EvalTypes>::value,
false);
118 int residual_index = Sacado::mpl::find<panzer::Traits::EvalTypes,panzer::Traits::Residual>::value;
119 active_evaluation_types[residual_index] =
true;
120 pb->setActiveEvaluationTypes(active_evaluation_types);
123 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data);
126 pb->buildAndRegisterInitialConditionEvaluators(*fm, cm_factory, closure_model_name, ic_block_closure_models, lo_factory, user_data);
128 pb->activateAllEvaluationTypes();
137 for (
auto eval_type=fm->begin(); eval_type != fm->end(); ++eval_type,++i) {
138 if (active_evaluation_types[i])
139 eval_type->postRegistrationSetup(setupData,*fm,
false,
false,
nullptr);
142 phx_ic_field_managers[blockId] = fm;
144 if (write_graphviz_file)
145 fm->writeGraphvizFile(graphviz_file_prefix+
"_IC_"+blockId);
152 Teuchos::RCP<panzer::LinearObjContainer> loc,
154 const double time_stamp,
155 const double step_size,
156 const int stage_number)
171 localCounter->initialize();
173 ped.
gedc->addDataObject(
"Residual Scatter Container",ghostedloc);
174 ped.
gedc->addDataObject(
"Dirichlet Counter",localCounter);
178 itr!=phx_ic_field_managers.end();++itr) {
179 std::string blockId = itr->first;
180 Teuchos::RCP< PHX::FieldManager<panzer::Traits> > fm = itr->second;
186 std::vector<panzer::Workset>& w = *wkstContainer.
getWorksets(wd);
187 for (std::size_t i = 0; i < w.size(); ++i) {
189 workset.
time = time_stamp;
191 workset.
stage_number =
static_cast<double>(stage_number);
198 summedGhostedCounter->initialize();
203 globalCounter->initialize();
219 Teuchos::RCP<LOC> loc2 = Teuchos::rcp_dynamic_cast<LOC>(itr->second);
220 if(loc2!=Teuchos::null) {
221 bool zeroVectorRows =
false;
236template <
typename EvalT>
237class EquationSet_IC :
public EquationSet_DefaultImpl<EvalT> {
243 EquationSet_IC(
const Teuchos::RCP<Teuchos::ParameterList>& params,
244 const int& default_integration_order,
245 const CellData& cell_data,
246 const Teuchos::RCP<GlobalData>& global_data,
247 const bool build_transient_support);
252 const FieldLibrary& ,
253 const Teuchos::ParameterList& )
const {}
258template <
typename EvalT>
259EquationSet_IC<EvalT>::
260EquationSet_IC(
const Teuchos::RCP<Teuchos::ParameterList>& params,
261 const int& default_integration_order,
262 const CellData& cell_data,
263 const Teuchos::RCP<GlobalData>& global_data,
264 const bool build_transient_support) :
265 EquationSet_DefaultImpl<EvalT>(params, default_integration_order, cell_data, global_data, build_transient_support )
270 Teuchos::ParameterList valid_parameters_sublist;
271 valid_parameters_sublist.set(
"Basis Type",
"HGrad",
"Type of Basis to use");
272 valid_parameters_sublist.set(
"Basis Order",1,
"Order of the basis");
274 for(
auto itr=params->begin();itr!=params->end();++itr) {
276 const std::string
field = params->name(itr);
277 const Teuchos::ParameterEntry & entry = params->entry(itr);
280 if(!entry.isList())
continue;
282 Teuchos::ParameterList & basisPL = entry.getValue((Teuchos::ParameterList *) 0);
283 basisPL.validateParametersAndSetDefaults(valid_parameters_sublist);
285 std::string basis_type = basisPL.get<std::string>(
"Basis Type");
286 int basis_order = basisPL.get<
int>(
"Basis Order");
288 this->addDOF(
field,basis_type,basis_order,default_integration_order);
291 this->addClosureModel(
"");
300class IC_EquationSetFactory :
public EquationSetFactory {
303 Teuchos::RCP<EquationSet_TemplateManager<Traits> >
304 buildEquationSet(
const Teuchos::RCP<Teuchos::ParameterList>& params,
305 const int& default_integration_order,
306 const CellData& cell_data,
307 const Teuchos::RCP<GlobalData>& global_data,
308 const bool build_transient_support)
const
310 Teuchos::RCP<EquationSet_TemplateManager<Traits> > eq_set=
311 Teuchos::rcp(
new EquationSet_TemplateManager<Traits>);
320 std::string msg =
"Error - the \"Equation Set\" called \"" + params->get<std::string>(
"Type") +
321 "\" is not a valid equation set identifier. Please supply the correct factory.\n";
322 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error, msg);
334 const std::map<std::string,std::vector<ICFieldDescriptor> > & block_ids_to_fields,
338 const Teuchos::ParameterList & ic_closure_models,
339 const Teuchos::ParameterList & user_data,
344 std::vector<Teuchos::RCP<PhysicsBlock> > physics_blocks;
347 std::map<std::string, Teuchos::RCP< PHX::FieldManager<Traits> > > phx_ic_field_managers;
355 "initial_condition_control_test",
356 phx_ic_field_managers);
360 Teuchos::rcp_dynamic_cast<ThyraObjContainer<double> >(loc)->set_x_th(vec);
367buildICPhysicsBlocks(
const std::map<std::string,Teuchos::RCP<const shards::CellTopology> > & block_ids_to_cell_topo,
368 const std::map<std::string,std::vector<ICFieldDescriptor> > & block_ids_to_fields,
370 std::vector<Teuchos::RCP<PhysicsBlock> > & physics_blocks)
375 std::map<std::string,std::string> block_ids_to_physics_ids;
377 RCP<Teuchos::ParameterList> ipb = rcp(
new Teuchos::ParameterList);
379 for(
auto itr=block_ids_to_cell_topo.begin();itr!=block_ids_to_cell_topo.end();++itr) {
380 std::string eblock = itr->first;
381 RCP<const shards::CellTopology> ct = itr->second;
384 auto fds_itr = block_ids_to_fields.find(eblock);
385 TEUCHOS_ASSERT(fds_itr!=block_ids_to_fields.end());
387 const std::vector<ICFieldDescriptor> & fd_vec = fds_itr->second;
389 std::string physics_id =
"ic_"+eblock;
390 block_ids_to_physics_ids[eblock] = physics_id;
393 Teuchos::ParameterList & physics_block = ipb->sublist(physics_id).sublist(
"");
394 physics_block.set(
"Type",
"IC");
396 for(std::size_t i=0;i<fd_vec.size();i++) {
405 RCP<EquationSetFactory> eqset_factory = Teuchos::rcp(
new IC_EquationSetFactory);
408 buildPhysicsBlocks(block_ids_to_physics_ids,
409 block_ids_to_cell_topo,
410 ipb,1,workset_size,eqset_factory,gd,
false,physics_blocks);
#define PANZER_BUILD_EQSET_OBJECTS(key, fType)
#define PANZER_DECLARE_EQSET_TEMPLATE_BUILDER(fClass, fType)
PHX::MDField< ScalarT, panzer::Cell, panzer::BASIS > field
A field to which we'll contribute, or in which we'll store, the result of computing this integral.
void addDataObject(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
const_iterator begin() const
std::unordered_map< std::string, Teuchos::RCP< GlobalEvaluationData > >::iterator iterator
const_iterator end() const
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const =0
virtual void initializeGhostedContainer(int, LinearObjContainer &loc) const =0
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const =0
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveGhostedLinearObjContainer() const =0
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const =0
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const =0
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveLinearObjContainer() const =0
virtual void initializeContainer(int, LinearObjContainer &loc) const =0
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const =0
Class that provides access to worksets on each element block and side set.
Teuchos::RCP< std::vector< Workset > > getWorksets(const WorksetDescriptor &wd)
Access to volume worksets.
Teuchos::RCP< const std::vector< Intrepid2::Orientation > > getOrientations() const
WorksetDescriptor blockDescriptor(const std::string &eBlock)
void buildICPhysicsBlocks(const std::map< std::string, Teuchos::RCP< const shards::CellTopology > > &block_ids_to_cell_topo, const std::map< std::string, std::vector< ICFieldDescriptor > > &block_ids_to_fields, int workset_size, std::vector< Teuchos::RCP< PhysicsBlock > > &physics_blocks)
Teuchos::RCP< panzer::GlobalData > createGlobalData(bool build_default_os, int print_process)
void setupInitialConditionFieldManagers(WorksetContainer &wkstContainer, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &ic_block_closure_models, const panzer::LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data, const bool write_graphviz_file, const std::string &graphviz_file_prefix, std::map< std::string, Teuchos::RCP< PHX::FieldManager< panzer::Traits > > > &phx_ic_field_managers)
Builds PHX::FieldManager objects for inital conditions and registers evaluators.
void setupControlInitialCondition(const std::map< std::string, Teuchos::RCP< const shards::CellTopology > > &block_ids_to_cell_topo, const std::map< std::string, std::vector< ICFieldDescriptor > > &block_ids_to_fields, WorksetContainer &wkstContainer, const LinearObjFactory< Traits > &lof, const ClosureModelFactory_TemplateManager< Traits > &cm_factory, const Teuchos::ParameterList &ic_closure_models, const Teuchos::ParameterList &user_data, int workset_size, double t0, const Teuchos::RCP< Thyra::VectorBase< double > > &vec)
void evaluateInitialCondition(WorksetContainer &wkstContainer, const std::map< std::string, Teuchos::RCP< PHX::FieldManager< panzer::Traits > > > &phx_ic_field_managers, Teuchos::RCP< panzer::LinearObjContainer > loc, const panzer::LinearObjFactory< panzer::Traits > &lo_factory, const double time_stamp, const double step_size, const int stage_number)
Teuchos::RCP< GlobalEvaluationDataContainer > gedc
std::string first_sensitivities_name
Teuchos::RCP< const std::vector< panzer::Workset > > worksets_
Teuchos::RCP< const std::vector< Intrepid2::Orientation > > orientations_