Panzer  Version of the Day
Panzer_Workset.hpp
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 
44 #ifndef PANZER_WORKSET_HPP
45 #define PANZER_WORKSET_HPP
46 
47 #include <cstddef>
48 #include <vector>
49 #include <map>
50 #include <iostream>
51 
52 #include "Panzer_Dimension.hpp"
53 #include "Panzer_BasisValues2.hpp"
54 #include "Panzer_PointValues2.hpp"
56 #include "Panzer_Dimension.hpp"
57 
60 
61 #include "Phalanx_KokkosDeviceTypes.hpp"
62 
63 namespace panzer {
64 
65  struct WorksetNeeds;
66 
67  struct LocalMeshPartition;
68 
69  class SubcellConnectivity;
70 
71  class OrientationsInterface;
72 
78  struct
80  {
83  side_assembly_(false),
84  align_side_points_(false)
85  {
86 
87  }
88 
91 
94 
96  Teuchos::RCP<const OrientationsInterface> orientations_;
97  };
98 
104  public:
105  typedef PHX::MDField<double,Cell,NODE,Dim> CellCoordArray;
106 
108  WorksetDetails();
109 
111  void
112  setup(const LocalMeshPartition & partition,
113  const WorksetOptions & options);
114 
117 
120 
121  // DEPRECATED - use: getLocalCellIDs()
122  PHX::View<const int*> cell_local_ids_k;
123 
124  // DEPRECATED - use: getLocalCellIDs()
125  std::vector<size_t> cell_local_ids;
126 
129 
131  std::string block_id;
132 
135 
137  //TEUCHOS_DEPRECATED
138  Teuchos::RCP< std::vector<int> > ir_degrees;
139 
140  //TEUCHOS_DEPRECATED
141  mutable std::vector<Teuchos::RCP<panzer::IntegrationValues2<double> > > int_rules;
142 
144  //TEUCHOS_DEPRECATED
145  Teuchos::RCP< std::vector<std::string> > basis_names;
146 
148  //TEUCHOS_DEPRECATED
149  mutable std::vector<Teuchos::RCP< panzer::BasisValues2<double> > > bases;
150 
155 
158 
160  const panzer::PureBasis & getBasis(const panzer::BasisDescriptor & description) const;
161 
163  const std::string &
165  {return block_id;}
166 
168  const std::string &
169  getSideset() const
170  {return sideset_;}
171 
173  unsigned int
175  {return num_dimensions_;}
176 
178  int
180  {return subcell_index;}
181 
183  int
185  {return subcell_dim;}
186 
190  {return cell_vertex_coordinates;}
191 
193  Kokkos::View<const int*,PHX::Device>
195  {return cell_local_ids_k;}
196 
226  const SubcellConnectivity &
227  getSubcellConnectivity(const unsigned int subcell_dimension) const;
228 
230  bool
231  hasSubcellConnectivity(const unsigned int subcell_dimension) const;
232 
245  const bool lazy_version=false) const;
246 
247  /*
248  * \brief Grab the basis values for a given basis description
249  *
250  * \note An arbitrary integration order is used - only use for getting basis coordinates
251  *
252  * \throws If setup has not been called
253  *
254  * \param[in] basis_description Description of requested basis
255  * \param[in] lazy_version Get an empty BasisValues2 object that will construct/allocate itself on demand (less memory - EXPERIMENTAL)
256  *
257  * \return Object containing basis values
258  */
260  getBasisValues(const panzer::BasisDescriptor & basis_description,
261  const bool lazy_version=false) const;
262 
263  /*
264  * \brief Grab the basis values for a given basis description
265  *
266  * \throws If setup has not been called
267  *
268  * \todo This needs to be const, but one path for workset construction requires non-const
269  *
270  * \param[in] basis_description Description of requested basis
271  * \param[in] integration_description Descriptor for integration scheme
272  * \param[in] lazy_version Get an empty BasisValues2 object that will construct/allocate itself on demand (less memory - EXPERIMENTAL)
273  *
274  * \return Object containing basis values
275  */
277  getBasisValues(const panzer::BasisDescriptor & basis_description,
278  const panzer::IntegrationDescriptor & integration_description,
279  const bool lazy_version=false) const;
280 
281  /*
282  * \brief Grab the basis values for a given basis description
283  *
284  * \throws If setup has not been called
285  * \throws if point_descriptor has not been registered
286  *
287  * \param[in] basis_description Description of requested basis
288  * \param[in] point_description Descriptor for points
289  * \param[in] lazy_version Get an empty BasisValues2 object that will construct/allocate itself on demand (less memory - EXPERIMENTAL)
290  *
291  * \return Object containing basis values
292  */
294  getBasisValues(const panzer::BasisDescriptor & basis_description,
295  const panzer::PointDescriptor & point_description,
296  const bool lazy_version=false) const;
297 
304  getPointValues(const panzer::PointDescriptor & point_description) const;
305 
307  int numCells() const {return num_cells;}
308 
310  int numOwnedCells() const {return num_owned_cells_;}
311 
313  int numGhostCells() const {return num_ghost_cells_;}
314 
316  int numVirtualCells() const {return num_virtual_cells_;}
317 
319  void setNumberOfCells(const int owned_cells,
320  const int ghost_cells,
321  const int virtual_cells);
322 
323  protected:
324 
325  bool setup_;
326 
330 
332 
333  std::string sideset_;
334 
336 
337  Teuchos::RCP<const shards::CellTopology> cell_topology_;
338 
339  // TODO: Const vs non-const is complicated here due to how point values are generated and orientations are applied
340  // Unifying the construction method for worksets will help reduce the clutter here, but point values will almost always be non-const
341  mutable std::map<size_t,Teuchos::RCP<const panzer::PureBasis > > _pure_basis_map;
342  mutable std::map<size_t,Teuchos::RCP<const panzer::IntegrationRule > > _integration_rule_map;
343  mutable std::map<size_t,Teuchos::RCP<const panzer::PointRule > > _point_rule_map;
344 
345  mutable std::map<size_t,Teuchos::RCP<const panzer::IntegrationValues2<double> > > integration_values_map_;
346  mutable std::map<size_t,Teuchos::RCP<panzer::PointValues2<double> > > point_values_map_;
347  mutable std::map<size_t,std::map<size_t,Teuchos::RCP<panzer::BasisValues2<double> > > > basis_integration_values_map_;
348  mutable std::map<size_t,std::map<size_t,Teuchos::RCP<panzer::BasisValues2<double> > > > basis_point_values_map_;
349 
350  Teuchos::RCP<panzer::SubcellConnectivity> face_connectivity_;
351 
352  };
353 
358  class Workset : public WorksetDetails {
359  public:
362 
364  Workset(std::size_t identifier) : identifier_(identifier) {}
365 
367  void setIdentifier(std::size_t identifier) { identifier_ = identifier; }
368 
370  std::size_t getIdentifier() const { return identifier_; }
371 
372  double alpha;
373  double beta;
374  double time;
375  double step_size;
376  double stage_number;
377  std::vector<double> gather_seeds; // generic gather seeds
379 
383  Teuchos::RCP<WorksetDetails> other;
384 
386  WorksetDetails& operator()(const int i) {
387  TEUCHOS_ASSERT(i == 0 || (i == 1 && Teuchos::nonnull(other)));
388  return i == 0 ? static_cast<WorksetDetails&>(*this) : *other;
389  }
391  const WorksetDetails& operator()(const int i) const {
392  TEUCHOS_ASSERT(i == 0 || (i == 1 && Teuchos::nonnull(other)));
393  return i == 0 ? static_cast<const WorksetDetails&>(*this) : *other;
394  }
396  WorksetDetails& details(const int i) { return operator()(i); }
397  const WorksetDetails& details(const int i) const { return operator()(i); }
399  size_t numDetails() const { return Teuchos::nonnull(other) ? 2 : 1; }
400 
401  private:
402  std::size_t identifier_;
403  };
404 
405  std::ostream& operator<<(std::ostream& os, const panzer::Workset& w);
406 
414  public:
418  void setDetailsIndex(const int di) { details_index_ = di; }
421  int getDetailsIndex() const { return details_index_; }
423  WorksetDetails& operator()(Workset& workset) const {
424  return workset(details_index_);
425  }
427  const WorksetDetails& operator()(const Workset& workset) const {
428  return workset(details_index_);
429  }
430  private:
432  };
433 
434 } // namespace panzer
435 
436 #endif
const panzer::IntegrationValues2< double > & getIntegrationValues(const panzer::IntegrationDescriptor &description, const bool lazy_version=false) const
Get the integration values for a given integration description.
int num_cells
DEPRECATED - use: numCells()
const panzer::IntegrationRule & getIntegrationRule(const panzer::IntegrationDescriptor &description) const
Grab the integration rule for a given integration description (throws error if integration doesn&#39;t ex...
const SubcellConnectivity & getSubcellConnectivity(const unsigned int subcell_dimension) const
Get the subcell connectivity for the workset topology.
std::map< size_t, Teuchos::RCP< const panzer::IntegrationRule > > _integration_rule_map
PHX::View< const int * > cell_local_ids_k
Teuchos::RCP< panzer::SubcellConnectivity > face_connectivity_
std::size_t getIdentifier() const
Get the unique identifier for this workset, this is not an index!
int numVirtualCells() const
Number of cells not owned by any workset - these are used for boundary conditions.
std::map< size_t, std::map< size_t, Teuchos::RCP< panzer::BasisValues2< double > > > > basis_point_values_map_
void setDetailsIndex(const int di)
An evaluator builder sets the details index.
std::vector< size_t > cell_local_ids
Used to define options for lazy evaluation of BasisValues and IntegrationValues objects.
WorksetOptions()
Default constructor.
void setIdentifier(std::size_t identifier)
Set the unique identifier for this workset, this is not an index!
Teuchos::RCP< std::vector< int > > ir_degrees
If workset corresponds to a sub cell, what is the index?
std::vector< Teuchos::RCP< panzer::BasisValues2< double > > > bases
Static basis function data, key is basis name, value is index in the static_bases vector...
std::map< size_t, Teuchos::RCP< const panzer::IntegrationValues2< double > > > integration_values_map_
Teuchos::RCP< std::vector< std::string > > basis_names
Value corresponds to basis type. Use the offest for indexing.
int subcell_dim
DEPRECATED - use: getSubcellDimension()
unsigned int numDimensions() const
Get the cell dimension for the mesh.
std::map< size_t, Teuchos::RCP< const panzer::PureBasis > > _pure_basis_map
const std::string & getElementBlock() const
Get the element block id.
int numCells() const
Number of total cells in workset (owned, ghost, and virtual)
std::size_t identifier_
size_t numDetails() const
Return the number of WorksetDetails this Workset holds.
CellCoordArray cell_vertex_coordinates
DEPRECATED - use: getCellVertices()
Workset(std::size_t identifier)
Constructor that that requires a unique identifier.
const WorksetDetails & operator()(const int i) const
const accessor.
panzer::PointValues2< double > & getPointValues(const panzer::PointDescriptor &point_description) const
Grab the basis values for a given basis description and integration description (throws error if it d...
void setNumberOfCells(const int owned_cells, const int ghost_cells, const int virtual_cells)
Provides access to set numbers of cells (required for backwards compatibility)
Teuchos::RCP< const shards::CellTopology > cell_topology_
std::map< size_t, Teuchos::RCP< const panzer::PointRule > > _point_rule_map
Teuchos::RCP< WorksetDetails > other
PHX::MDField< double, Cell, NODE, Dim > CellCoordArray
Teuchos::RCP< const OrientationsInterface > orientations_
Must be set to apply orientations - if it is set, then orientations will be applied to basis values...
WorksetDetailsAccessor()
Default value is 0, which is backwards compatible.
int getSubcellIndex() const
Get the subcell index (returns -1 if not a subcell)
bool side_assembly_
Build integration values for sides.
std::vector< Teuchos::RCP< panzer::IntegrationValues2< double > > > int_rules
std::map< size_t, Teuchos::RCP< panzer::PointValues2< double > > > point_values_map_
std::vector< double > gather_seeds
const panzer::BasisValues2< double > & getBasisValues(const panzer::BasisDescriptor &basis_description, const bool lazy_version=false) const
bool hasSubcellConnectivity(const unsigned int subcell_dimension) const
Check if subcell connectivity exists for a given dimension.
int getSubcellDimension() const
Get the subcell dimension.
WorksetDetails & operator()(const int i)
op(0) return *this; op(1) returns *other.
std::map< size_t, std::map< size_t, Teuchos::RCP< panzer::BasisValues2< double > > > > basis_integration_values_map_
const WorksetDetails & operator()(const Workset &workset) const
const accessor.
Kokkos::View< const int *, PHX::Device > getLocalCellIDs() const
Get the local cell IDs for the workset.
std::string block_id
DEPRECATED - use: getElementBlock()
WorksetDetails()
Default constructor.
int subcell_index
DEPRECATED - use: getSubcellIndex()
int numOwnedCells() const
Number of cells owned by this workset.
const WorksetDetails & details(const int i) const
const std::string & getSideset() const
Get the sideset id (returns "" if not a sideset)
std::ostream & operator<<(std::ostream &os, const AssemblyEngineInArgs &in)
WorksetDetails & details(const int i)
Convenience wrapper to operator() for pointer access.
bool align_side_points_
If workset side integration values must align with another workset, there must be a unique order assi...
WorksetDetails & operator()(Workset &workset) const
Workset wrapper to extract the correct details. Example: wda(workset).bases[i].
const panzer::SubcellConnectivity & getFaceConnectivity() const
int numGhostCells() const
Number of cells owned by a different workset.
Description and data layouts associated with a particular basis.
CellCoordArray getCellVertices() const
Get the vertices for the cells.
void setup(const LocalMeshPartition &partition, const WorksetOptions &options)
Constructs the workset details from a given chunk of the mesh.
Workset()
Default constructor, identifier is a useless 0 by default.
const panzer::PureBasis & getBasis(const panzer::BasisDescriptor &description) const
Grab the pure basis (contains data layouts) for a given basis description (throws error if integratio...