45 #include "Teuchos_Assert.hpp"
47 #include "Panzer_EquationSet_DefaultImpl.hpp"
57 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
59 const Teuchos::ParameterList& ic_block_closure_models,
61 const Teuchos::ParameterList& user_data,
62 const bool write_graphviz_file,
63 const std::string& graphviz_file_prefix,
66 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
67 for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
68 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
69 std::string blockId = pb->elementBlockID();
72 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
76 std::string closure_model_name =
"";
77 if (ic_block_closure_models.isSublist(blockId))
78 closure_model_name = blockId;
79 else if (ic_block_closure_models.isSublist(
"Default"))
80 closure_model_name =
"Default";
82 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Failed to find initial condition for element block \"" << blockId
83 <<
"\". You must provide an initial condition for each element block or set a default!"
84 << ic_block_closure_models);
87 pb->buildAndRegisterInitialConditionEvaluators(*fm, cm_factory, closure_model_name, ic_block_closure_models, lo_factory, user_data);
95 fm->postRegistrationSetup(setupData);
96 phx_ic_field_managers[blockId] = fm;
98 if (write_graphviz_file)
99 fm->writeGraphvizFile(graphviz_file_prefix+
"_IC_"+blockId);
105 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
107 const Teuchos::ParameterList& closure_models,
108 const Teuchos::ParameterList& ic_block_closure_models,
110 const Teuchos::ParameterList& user_data,
111 const bool write_graphviz_file,
112 const std::string& graphviz_file_prefix,
115 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
116 for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
117 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
118 std::string blockId = pb->elementBlockID();
121 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
125 std::string closure_model_name =
"";
126 if (ic_block_closure_models.isSublist(blockId))
127 closure_model_name = blockId;
128 else if (ic_block_closure_models.isSublist(
"Default"))
129 closure_model_name =
"Default";
131 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Failed to find initial condition for element block \"" << blockId
132 <<
"\". You must provide an initial condition for each element block or set a default!"
133 << ic_block_closure_models);
136 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data);
139 pb->buildAndRegisterInitialConditionEvaluators(*fm, cm_factory, closure_model_name, ic_block_closure_models, lo_factory, user_data);
147 fm->postRegistrationSetup(setupData);
148 phx_ic_field_managers[blockId] = fm;
150 if (write_graphviz_file)
151 fm->writeGraphvizFile(graphviz_file_prefix+
"_IC_"+blockId);
158 Teuchos::RCP<panzer::LinearObjContainer> loc,
160 const double time_stamp)
175 localCounter->initialize();
177 ped.
gedc->addDataObject(
"Residual Scatter Container",ghostedloc);
178 ped.
gedc->addDataObject(
"Dirichlet Counter",localCounter);
182 itr!=phx_ic_field_managers.end();++itr) {
183 std::string blockId = itr->first;
184 Teuchos::RCP< PHX::FieldManager<panzer::Traits> > fm = itr->second;
190 std::vector<panzer::Workset>& w = *wkstContainer.
getWorksets(wd);
191 for (std::size_t i = 0; i < w.size(); ++i) {
195 workset.
time = time_stamp;
202 summedGhostedCounter->initialize();
207 globalCounter->initialize();
223 Teuchos::RCP<LOC> loc2 = Teuchos::rcp_dynamic_cast<LOC>(itr->second);
224 if(loc2!=Teuchos::null) {
225 bool zeroVectorRows =
false;
240 template <
typename EvalT>
241 class EquationSet_IC :
public EquationSet_DefaultImpl<EvalT> {
247 EquationSet_IC(
const Teuchos::RCP<Teuchos::ParameterList>& params,
248 const int& default_integration_order,
249 const CellData& cell_data,
250 const Teuchos::RCP<GlobalData>& global_data,
251 const bool build_transient_support);
256 const FieldLibrary& ,
257 const Teuchos::ParameterList& )
const {}
262 template <
typename EvalT>
263 EquationSet_IC<EvalT>::
264 EquationSet_IC(
const Teuchos::RCP<Teuchos::ParameterList>& params,
265 const int& default_integration_order,
266 const CellData& cell_data,
267 const Teuchos::RCP<GlobalData>& global_data,
268 const bool build_transient_support) :
269 EquationSet_DefaultImpl<EvalT>(params, default_integration_order, cell_data, global_data, build_transient_support )
274 Teuchos::ParameterList valid_parameters_sublist;
275 valid_parameters_sublist.set(
"Basis Type",
"HGrad",
"Type of Basis to use");
276 valid_parameters_sublist.set(
"Basis Order",1,
"Order of the basis");
278 for(
auto itr=params->begin();itr!=params->end();++itr) {
280 const std::string
field = params->name(itr);
281 const Teuchos::ParameterEntry & entry = params->entry(itr);
284 if(!entry.isList())
continue;
286 Teuchos::ParameterList & basisPL = entry.getValue((Teuchos::ParameterList *) 0);
287 basisPL.validateParametersAndSetDefaults(valid_parameters_sublist);
289 std::string basis_type = basisPL.get<std::string>(
"Basis Type");
290 int basis_order = basisPL.get<
int>(
"Basis Order");
292 this->addDOF(
field,basis_type,basis_order,default_integration_order);
295 this->addClosureModel(
"");
304 class IC_EquationSetFactory :
public EquationSetFactory {
307 Teuchos::RCP<EquationSet_TemplateManager<Traits> >
308 buildEquationSet(
const Teuchos::RCP<Teuchos::ParameterList>& params,
309 const int& default_integration_order,
310 const CellData& cell_data,
311 const Teuchos::RCP<GlobalData>& global_data,
312 const bool build_transient_support)
const
314 Teuchos::RCP<EquationSet_TemplateManager<Traits> > eq_set=
315 Teuchos::rcp(
new EquationSet_TemplateManager<Traits>);
324 std::string msg =
"Error - the \"Equation Set\" called \"" + params->get<std::string>(
"Type") +
325 "\" is not a valid equation set identifier. Please supply the correct factory.\n";
326 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error, msg);
338 const std::map<std::string,std::vector<ICFieldDescriptor> > & block_ids_to_fields,
342 const Teuchos::ParameterList & ic_closure_models,
343 const Teuchos::ParameterList & user_data,
348 std::vector<Teuchos::RCP<PhysicsBlock> > physics_blocks;
351 std::map<std::string, Teuchos::RCP< PHX::FieldManager<Traits> > > phx_ic_field_managers;
359 "initial_condition_control_test",
360 phx_ic_field_managers);
364 Teuchos::rcp_dynamic_cast<ThyraObjContainer<double> >(loc)->set_x_th(vec);
371 buildICPhysicsBlocks(
const std::map<std::string,Teuchos::RCP<const shards::CellTopology> > & block_ids_to_cell_topo,
372 const std::map<std::string,std::vector<ICFieldDescriptor> > & block_ids_to_fields,
374 std::vector<Teuchos::RCP<PhysicsBlock> > & physics_blocks)
379 std::map<std::string,std::string> block_ids_to_physics_ids;
381 RCP<Teuchos::ParameterList> ipb = rcp(
new Teuchos::ParameterList);
383 for(
auto itr=block_ids_to_cell_topo.begin();itr!=block_ids_to_cell_topo.end();++itr) {
384 std::string eblock = itr->first;
385 RCP<const shards::CellTopology> ct = itr->second;
388 auto fds_itr = block_ids_to_fields.find(eblock);
389 TEUCHOS_ASSERT(fds_itr!=block_ids_to_fields.end());
391 const std::vector<ICFieldDescriptor> & fd_vec = fds_itr->second;
393 std::string physics_id =
"ic_"+eblock;
394 block_ids_to_physics_ids[eblock] = physics_id;
397 Teuchos::ParameterList & physics_block = ipb->sublist(physics_id).sublist(
"");
398 physics_block.set(
"Type",
"IC");
400 for(std::size_t i=0;i<fd_vec.size();i++) {
409 RCP<EquationSetFactory> eqset_factory = Teuchos::rcp(
new IC_EquationSetFactory);
413 block_ids_to_cell_topo,
414 ipb,1,workset_size,eqset_factory,gd,
false,physics_blocks);