Panzer  Version of the Day
Panzer_FieldManagerBuilder.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Panzer: A partial differential equation assembly
5 // engine for strongly coupled complex multiphysics systems
6 // Copyright (2011) Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and
39 // Eric C. Cyr (eccyr@sandia.gov)
40 // ***********************************************************************
41 // @HEADER
42 
43 #include <vector>
44 #include <string>
45 #include <sstream>
46 #include <fstream>
47 
49 
50 #include "Phalanx_DataLayout_MDALayout.hpp"
51 #include "Phalanx_FieldManager.hpp"
52 
53 #include "Teuchos_FancyOStream.hpp"
54 
55 #include "Shards_CellTopology.hpp"
56 
57 #include "Panzer_Traits.hpp"
58 #include "Panzer_Workset.hpp"
59 #include "Panzer_Workset_Builder.hpp"
60 #include "Panzer_PhysicsBlock.hpp"
64 #include "Panzer_CellData.hpp"
69 
70 //#include "EpetraExt_BlockMapOut.h"
71 
72 //=======================================================================
73 //=======================================================================
74 void panzer::FieldManagerBuilder::print(std::ostream& os) const
75 {
76  os << "panzer::FieldManagerBuilder output: Not implemented yet!";
77 }
78 
79 //=======================================================================
81  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
82  const std::vector<WorksetDescriptor> & wkstDesc,
84  const Teuchos::ParameterList& closure_models,
86  const Teuchos::ParameterList& user_data,
87  const GenericEvaluatorFactory & gEvalFact,
88  bool closureModelByEBlock)
89 {
90  using Teuchos::RCP;
91  using Teuchos::rcp;
92 
93  TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
94  "panzer::FMB::setupVolumeFieldManagers: method function getWorksetContainer() returns null. "
95  "Plase call setWorksetContainer() before calling this method");
96  TEUCHOS_TEST_FOR_EXCEPTION(physicsBlocks.size()!=wkstDesc.size(),std::runtime_error,
97  "panzer::FMB::setupVolumeFieldManagers: physics block count must match workset descriptor count.");
98 
99  phx_volume_field_managers_.clear();
100 
101  Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> globalIndexer = lo_factory.getRangeGlobalIndexer();
102 
103  for (std::size_t blkInd=0;blkInd<physicsBlocks.size();++blkInd) {
104  RCP<panzer::PhysicsBlock> pb = physicsBlocks[blkInd];
105  const WorksetDescriptor wd = wkstDesc[blkInd];
106 
107  Traits::SetupData setupData;
108  setupData.worksets_ = getWorksetContainer()->getWorksets(wd);
109  if(setupData.worksets_->size()==0)
110  continue;
111 
112  // sanity check
113  TEUCHOS_ASSERT(wd.getElementBlock()==pb->elementBlockID());
114 
115  // build a field manager object
116  Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
117  = Teuchos::rcp(new PHX::FieldManager<panzer::Traits>);
118 
119  // use the physics block to register evaluators
120  pb->buildAndRegisterEquationSetEvaluators(*fm, user_data);
121  if(!physicsBlockGatherDisabled())
122  pb->buildAndRegisterGatherAndOrientationEvaluators(*fm,lo_factory,user_data);
123  pb->buildAndRegisterDOFProjectionsToIPEvaluators(*fm,Teuchos::ptrFromRef(lo_factory),user_data);
124  if(!physicsBlockScatterDisabled())
125  pb->buildAndRegisterScatterEvaluators(*fm,lo_factory,user_data);
126 
127  if(closureModelByEBlock)
128  pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,pb->elementBlockID(),closure_models,user_data);
129  else
130  pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data);
131 
132  // register additional model evaluator from the generic evaluator factory
133  gEvalFact.registerEvaluators(*fm,wd,*pb);
134 
135  // setup derivative information
136  setKokkosExtendedDataTypeDimensions(wd.getElementBlock(),*globalIndexer,user_data,*fm);
137 
138  // build the setup data using passed in information
139  fm->postRegistrationSetup(setupData);
140 
141  // make sure to add the field manager & workset to the list
142  volume_workset_desc_.push_back(wd);
143  phx_volume_field_managers_.push_back(fm);
144  }
145 }
146 
147 //=======================================================================
149  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
151  const Teuchos::ParameterList& closure_models,
152  const panzer::LinearObjFactory<panzer::Traits> & lo_factory,
153  const Teuchos::ParameterList& user_data)
154 {
155  std::vector<WorksetDescriptor> wkstDesc;
156  for(std::size_t i=0;i<physicsBlocks.size();i++)
157  wkstDesc.push_back(blockDescriptor(physicsBlocks[i]->elementBlockID()));
158 
160  setupVolumeFieldManagers(physicsBlocks,wkstDesc,cm_factory,closure_models,lo_factory,user_data,eef);
161 }
162 
163 //=======================================================================
164 //=======================================================================
166 setupBCFieldManagers(const std::vector<panzer::BC> & bcs,
167  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
168  const Teuchos::Ptr<const panzer::EquationSetFactory> & eqset_factory,
170  const panzer::BCStrategyFactory& bc_factory,
171  const Teuchos::ParameterList& closure_models,
172  const panzer::LinearObjFactory<panzer::Traits> & lo_factory,
173  const Teuchos::ParameterList& user_data)
174 {
175  TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
176  "panzer::FMB::setupBCFieldManagers: method function getWorksetContainer() returns null. "
177  "Plase call setWorksetContainer() before calling this method");
178 
179  Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> globalIndexer = lo_factory.getRangeGlobalIndexer();
180 
181  // for convenience build a map (element block id => physics block)
182  std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks_map;
183  {
184  std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
185  for(blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
186  Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
187  std::string blockId = pb->elementBlockID();
188 
189  // add block id, physics block pair to the map
190  physicsBlocks_map.insert(std::make_pair(blockId,pb));
191  }
192  }
193 
194  // ***************************
195  // BCs
196  // ***************************
197  std::vector<panzer::BC>::const_iterator bc;
198  for (bc=bcs.begin(); bc != bcs.end(); ++bc) {
199  const Teuchos::RCP<std::map<unsigned,panzer::Workset> >
200  currentWkst = getWorksetContainer()->getSideWorksets(*bc);
201  if (currentWkst.is_null()) continue;
202 
203  BCType bc_type = bc->bcType();
204 
205  if (bc_type == BCT_Interface) {
206  // Loop over local face indices and setup each field manager
207  for (std::map<unsigned,panzer::Workset>::const_iterator wkst = currentWkst->begin();
208  wkst != currentWkst->end(); ++wkst) {
209  // Build one FieldManager for each local side workset for each bc
210  std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
211  bc_field_managers_[*bc];
212 
213  PHX::FieldManager<panzer::Traits>& fm = field_managers[wkst->first];
214 
215  int gid_count = 0;
216  for (int block_id_index = 0; block_id_index < 2; ++block_id_index) {
217  const std::string element_block_id = block_id_index == 0 ? bc->elementBlockID() : bc->elementBlockID2();
218 
219  std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator
220  volume_pb_itr = physicsBlocks_map.find(element_block_id);
221 
222  TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr == physicsBlocks_map.end(), std::logic_error,
223  "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \""
224  << element_block_id << "\"");
225 
226  const Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
227  const Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
228 
229  // register evaluators from strategy
230  const panzer::CellData side_cell_data(wkst->second.num_cells,
231  wkst->second.details(block_id_index).subcell_index,
232  volume_cell_topology);
233 
234  // Copy the physics block for side integrations
235  Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
236 
237  Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> >
238  bcs = bc_factory.buildBCStrategy(*bc, side_pb->globalData());
239 
240  // Iterate over evaluation types
242  bcs_type = bcs->begin(); bcs_type != bcs->end(); ++bcs_type) {
243  bcs_type->setDetailsIndex(block_id_index);
244  side_pb->setDetailsIndex(block_id_index);
245  bcs_type->setup(*side_pb, user_data);
246  bcs_type->buildAndRegisterEvaluators(fm, *side_pb, cm_factory, closure_models, user_data);
247  bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm, *side_pb, lo_factory, user_data);
248  if ( ! physicsBlockScatterDisabled())
249  bcs_type->buildAndRegisterScatterEvaluators(fm, *side_pb, lo_factory, user_data);
250  }
251 
252  gid_count += globalIndexer->getElementBlockGIDCount(element_block_id);
253  }
254 
255  { // Use gid_count to set up the derivative information.
256  std::vector<PHX::index_size_type> derivative_dimensions;
257  derivative_dimensions.push_back(gid_count);
258  fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Jacobian>(derivative_dimensions);
259 
260  #ifdef Panzer_BUILD_HESSIAN_SUPPORT
261  fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Hessian>(derivative_dimensions);
262  #endif
263 
264  derivative_dimensions[0] = 1;
265  if (user_data.isType<int>("Tangent Dimension"))
266  derivative_dimensions[0] = user_data.get<int>("Tangent Dimension");
267  fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Tangent>(derivative_dimensions);
268  }
269 
270  // Set up the field manager
271  Traits::SetupData setupData;
272  Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(new std::vector<panzer::Workset>);
273  worksets->push_back(wkst->second);
274  setupData.worksets_ = worksets;
275 
276  fm.postRegistrationSetup(setupData);
277  }
278  } else {
279  const std::string element_block_id = bc->elementBlockID();
280 
281  std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator volume_pb_itr
282  = physicsBlocks_map.find(element_block_id);
283 
284  TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr==physicsBlocks_map.end(),std::logic_error,
285  "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \"" << element_block_id << "\"");
286 
287  Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
288  Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
289 
290  // Build one FieldManager for each local side workset for each dirichlet bc
291  std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
292  bc_field_managers_[*bc];
293 
294  // Loop over local face indices and setup each field manager
295  for (std::map<unsigned,panzer::Workset>::const_iterator wkst =
296  currentWkst->begin(); wkst != currentWkst->end();
297  ++wkst) {
298 
299  PHX::FieldManager<panzer::Traits>& fm = field_managers[wkst->first];
300 
301  // register evaluators from strategy
302  const panzer::CellData side_cell_data(wkst->second.num_cells,
303  wkst->first,volume_cell_topology);
304 
305  // Copy the physics block for side integrations
306  Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
307 
308  Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> > bcs =
309  bc_factory.buildBCStrategy(*bc,side_pb->globalData());
310 
311  // Iterate over evaluation types
313  bcs_type = bcs->begin(); bcs_type != bcs->end(); ++bcs_type) {
314  bcs_type->setup(*side_pb,user_data);
315  bcs_type->buildAndRegisterEvaluators(fm,*side_pb,cm_factory,closure_models,user_data);
316  bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm,*side_pb,lo_factory,user_data);
317  if(!physicsBlockScatterDisabled())
318  bcs_type->buildAndRegisterScatterEvaluators(fm,*side_pb,lo_factory,user_data);
319  }
320 
321  // Setup the fieldmanager
322  Traits::SetupData setupData;
323  Teuchos::RCP<std::vector<panzer::Workset> > worksets =
324  Teuchos::rcp(new(std::vector<panzer::Workset>));
325  worksets->push_back(wkst->second);
326  setupData.worksets_ = worksets;
327 
328  // setup derivative information
329  setKokkosExtendedDataTypeDimensions(element_block_id,*globalIndexer,user_data,fm);
330 
331  fm.postRegistrationSetup(setupData);
332  }
333  }
334  }
335 }
336 
337 //=======================================================================
338 //=======================================================================
340 writeVolumeGraphvizDependencyFiles(std::string filename_prefix,
341  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks) const
342 {
343  if(phx_volume_field_managers_.size()<1)
344  return; // nothing to see here folks
345 
346  TEUCHOS_ASSERT(phx_volume_field_managers_.size()==physicsBlocks.size());
347 
348  std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
349  int index = 0;
350  for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr,++index) {
351  std::string blockId = (*blkItr)->elementBlockID();
352  phx_volume_field_managers_[index]->writeGraphvizFile(filename_prefix+"_VOLUME_"+blockId);
353  }
354 
355 }
356 
357 //=======================================================================
358 //=======================================================================
360 writeBCGraphvizDependencyFiles(std::string filename_prefix) const
361 {
362  typedef std::map<panzer::BC,std::map<unsigned,PHX::FieldManager<panzer::Traits> >,panzer::LessBC> FMMap;
363 
364  FMMap::const_iterator blkItr;
365  int bc_index = 0;
366  for (blkItr=bc_field_managers_.begin();blkItr!=bc_field_managers_.end();++blkItr,++bc_index) {
367  panzer::BC bc = blkItr->first;
368  const PHX::FieldManager<panzer::Traits> & fm = blkItr->second.begin()->second; // get the first field manager
369 
370  BCType bc_type = bc.bcType();
371  std::string type;
372  if (bc_type == BCT_Dirichlet)
373  type = "_Dirichlet_";
374  else if (bc_type == BCT_Neumann)
375  type = "_Neumann_";
376  else if (bc_type == BCT_Interface)
377  type = "_Interface_";
378  else
379  TEUCHOS_ASSERT(false);
380 
381  std::string blockId = bc.elementBlockID();
382  std::string sideId = bc.sidesetID();
383  fm.writeGraphvizFile(filename_prefix+"_BC_"+std::to_string(bc_index)+type+sideId+"_"+blockId);
384  }
385 
386 }
387 
388 //=======================================================================
389 //=======================================================================
391 writeVolumeTextDependencyFiles(std::string filename_prefix,
392  const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks) const
393 {
394  if(phx_volume_field_managers_.size()<1)
395  return; // nothing to see here folks
396 
397  TEUCHOS_ASSERT(phx_volume_field_managers_.size()==physicsBlocks.size());
398 
399  std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
400  int index = 0;
401  for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr,++index) {
402 
403  std::string blockId = (*blkItr)->elementBlockID();
404 
405  std::string filename = filename_prefix+"_VOLUME_"+blockId+".txt";
406  std::ofstream ofs;
407  ofs.open(filename.c_str());
408 
409  ofs << *(phx_volume_field_managers_[index]) << std::endl;
410 
411  ofs.close();
412  }
413 
414 }
415 
416 //=======================================================================
417 //=======================================================================
419 writeBCTextDependencyFiles(std::string filename_prefix) const
420 {
421  typedef std::map<panzer::BC,std::map<unsigned,PHX::FieldManager<panzer::Traits> >,panzer::LessBC> FMMap;
422 
423  FMMap::const_iterator blkItr;
424  int bc_index = 0;
425  for (blkItr=bc_field_managers_.begin();blkItr!=bc_field_managers_.end();++blkItr,++bc_index) {
426  panzer::BC bc = blkItr->first;
427  const PHX::FieldManager<panzer::Traits> & fm = blkItr->second.begin()->second; // get the first field manager
428 
429  BCType bc_type = bc.bcType();
430  std::string type;
431  if (bc_type == BCT_Dirichlet)
432  type = "_Dirichlet_";
433  else if (bc_type == BCT_Neumann)
434  type = "_Neumann_";
435  else if (bc_type == BCT_Interface)
436  type = "_Interface_";
437  else
438  TEUCHOS_ASSERT(false);
439 
440  std::string blockId = bc.elementBlockID();
441  std::string sideId = bc.sidesetID();
442 
443  std::string filename = filename_prefix+"_BC_"+std::to_string(bc_index)+type+sideId+"_"+blockId+".txt";
444  std::ofstream ofs;
445  ofs.open(filename.c_str());
446 
447  ofs << fm << std::endl;
448 
449  ofs.close();
450  }
451 
452 }
453 
454 //=======================================================================
455 //=======================================================================
457 setKokkosExtendedDataTypeDimensions(const std::string & eblock,
458  const panzer::UniqueGlobalIndexerBase & globalIndexer,
459  const Teuchos::ParameterList& user_data,
461 {
462  // setup Jacobian derivative terms
463  {
464  std::vector<PHX::index_size_type> derivative_dimensions;
465  derivative_dimensions.push_back(globalIndexer.getElementBlockGIDCount(eblock));
466 
467  fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Jacobian>(derivative_dimensions);
468 
469  }
470 
471  #ifdef Panzer_BUILD_HESSIAN_SUPPORT
472  {
473  std::vector<PHX::index_size_type> derivative_dimensions;
474  derivative_dimensions.push_back(globalIndexer.getElementBlockGIDCount(eblock));
475 
476  fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Hessian>(derivative_dimensions);
477  }
478  #endif
479 
480  {
481  std::vector<PHX::index_size_type> derivative_dimensions;
482  derivative_dimensions.push_back(1);
483  if (user_data.isType<int>("Tangent Dimension"))
484  derivative_dimensions[0] = user_data.get<int>("Tangent Dimension");
485  fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Tangent>(derivative_dimensions);
486  }
487 }
488 
489 //=======================================================================
490 //=======================================================================
491 std::ostream& panzer::operator<<(std::ostream& os, const panzer::FieldManagerBuilder& rfd)
492 {
493  rfd.print(os);
494  return os;
495 }
void writeVolumeTextDependencyFiles(std::string filename_prefix, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks) const
Interface for constructing a BCStrategy_TemplateManager.
virtual int getElementBlockGIDCount(const std::string &blockId) const =0
How any GIDs are associate with a particular element block.
void setupVolumeFieldManagers(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data)
Teuchos::RCP< std::vector< panzer::Workset > > worksets_
BCType
Type of boundary condition.
Definition: Panzer_BC.hpp:73
void writeVolumeGraphvizDependencyFiles(std::string filename_prefix, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks) const
BCType bcType() const
Returns the boundary condition type (Dirichlet or Neumann or Interface).
Definition: Panzer_BC.cpp:184
PHX::MDField< ScalarT > vector
virtual Teuchos::RCP< panzer::BCStrategy_TemplateManager< panzer::Traits > > buildBCStrategy(const panzer::BC &bc, const Teuchos::RCP< panzer::GlobalData > &global_data) const =0
void writeBCTextDependencyFiles(std::string filename_prefix) const
void writeBCGraphvizDependencyFiles(std::string filename_prefix) const
Data for determining cell topology and dimensionality.
void print(std::ostream &os) const
void setKokkosExtendedDataTypeDimensions(const std::string &eblock, const panzer::UniqueGlobalIndexerBase &globalIndexer, const Teuchos::ParameterList &user_data, PHX::FieldManager< panzer::Traits > &fm) const
std::string getElementBlock() const
Get element block.
virtual Teuchos::RCP< const panzer::UniqueGlobalIndexerBase > getRangeGlobalIndexer() const =0
Get the range global indexer object associated with this factory.
virtual bool registerEvaluators(PHX::FieldManager< panzer::Traits > &fm, const WorksetDescriptor &wd, const PhysicsBlock &pb) const =0
std::string elementBlockID() const
Returns the element block id associated with this sideset.
Definition: Panzer_BC.cpp:198
std::ostream & operator<<(std::ostream &os, const AssemblyEngineInArgs &in)
WorksetDescriptor blockDescriptor(const std::string &eBlock)
Stores input information for a boundary condition.
Definition: Panzer_BC.hpp:80
void setupBCFieldManagers(const std::vector< panzer::BC > &bcs, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::EquationSetFactory &eqset_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const panzer::BCStrategyFactory &bc_factory, const Teuchos::ParameterList &closure_models, const LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data)
std::string sidesetID() const
Returns the set id.
Definition: Panzer_BC.cpp:191