Panzer Version of the Day
Loading...
Searching...
No Matches
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"
56#include "Panzer_Dimension.hpp"
57
60
61#include "Phalanx_KokkosDeviceTypes.hpp"
62
63namespace 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
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 &
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
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
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;
377 std::vector<double> gather_seeds; // generic gather seeds
379
383 Teuchos::RCP<WorksetDetails> other;
384
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_; }
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
Description and data layouts associated with a particular basis.
const WorksetDetails & operator()(const Workset &workset) const
const accessor.
void setDetailsIndex(const int di)
An evaluator builder sets the details index.
WorksetDetails & operator()(Workset &workset) const
Workset wrapper to extract the correct details. Example: wda(workset).bases[i].
WorksetDetailsAccessor()
Default value is 0, which is backwards compatible.
int numOwnedCells() const
Number of cells owned by this workset.
const std::string & getSideset() const
Get the sideset id (returns "" if not a sideset)
const panzer::IntegrationRule & getIntegrationRule(const panzer::IntegrationDescriptor &description) const
Grab the integration rule for a given integration description (throws error if integration doesn't ex...
std::string block_id
DEPRECATED - use: getElementBlock()
Teuchos::RCP< panzer::SubcellConnectivity > face_connectivity_
std::map< size_t, Teuchos::RCP< const panzer::IntegrationValues2< double > > > integration_values_map_
std::map< size_t, std::map< size_t, Teuchos::RCP< panzer::BasisValues2< double > > > > basis_integration_values_map_
const panzer::SubcellConnectivity & getFaceConnectivity() const
int subcell_dim
DEPRECATED - use: getSubcellDimension()
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::vector< Teuchos::RCP< panzer::IntegrationValues2< double > > > int_rules
Teuchos::RCP< const shards::CellTopology > cell_topology_
const std::string & getElementBlock() const
Get the element block id.
PHX::View< const int * > cell_local_ids_k
std::map< size_t, Teuchos::RCP< const panzer::IntegrationRule > > _integration_rule_map
PHX::MDField< double, Cell, NODE, Dim > CellCoordArray
unsigned int numDimensions() const
Get the cell dimension for the mesh.
Kokkos::View< const int *, PHX::Device > getLocalCellIDs() const
Get the local cell IDs for the workset.
int num_cells
DEPRECATED - use: numCells()
bool hasSubcellConnectivity(const unsigned int subcell_dimension) const
Check if subcell connectivity exists for a given dimension.
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...
int numCells() const
Number of total cells in workset (owned, ghost, and virtual)
Teuchos::RCP< std::vector< std::string > > basis_names
Value corresponds to basis type. Use the offest for indexing.
std::map< size_t, Teuchos::RCP< const panzer::PointRule > > _point_rule_map
const panzer::IntegrationValues2< double > & getIntegrationValues(const panzer::IntegrationDescriptor &description, const bool lazy_version=false) const
Get the integration values for a given integration description.
std::map< size_t, Teuchos::RCP< const panzer::PureBasis > > _pure_basis_map
std::map< size_t, std::map< size_t, Teuchos::RCP< panzer::BasisValues2< double > > > > basis_point_values_map_
int numGhostCells() const
Number of cells owned by a different workset.
Teuchos::RCP< std::vector< int > > ir_degrees
If workset corresponds to a sub cell, what is the index?
CellCoordArray getCellVertices() const
Get the vertices for the cells.
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...
const SubcellConnectivity & getSubcellConnectivity(const unsigned int subcell_dimension) const
Get the subcell connectivity for the workset topology.
int getSubcellDimension() const
Get the subcell dimension.
int subcell_index
DEPRECATED - use: getSubcellIndex()
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)
const panzer::BasisValues2< double > & getBasisValues(const panzer::BasisDescriptor &basis_description, const bool lazy_version=false) const
std::map< size_t, Teuchos::RCP< panzer::PointValues2< double > > > point_values_map_
WorksetDetails()
Default constructor.
int getSubcellIndex() const
Get the subcell index (returns -1 if not a subcell)
int numVirtualCells() const
Number of cells not owned by any workset - these are used for boundary conditions.
std::vector< size_t > cell_local_ids
CellCoordArray cell_vertex_coordinates
DEPRECATED - use: getCellVertices()
void setup(const LocalMeshPartition &partition, const WorksetOptions &options)
Constructs the workset details from a given chunk of the mesh.
std::size_t getIdentifier() const
Get the unique identifier for this workset, this is not an index!
Workset(std::size_t identifier)
Constructor that that requires a unique identifier.
std::size_t identifier_
Workset()
Default constructor, identifier is a useless 0 by default.
size_t numDetails() const
Return the number of WorksetDetails this Workset holds.
WorksetDetails & operator()(const int i)
op(0) return *this; op(1) returns *other.
std::vector< double > gather_seeds
const WorksetDetails & operator()(const int i) const
const accessor.
const WorksetDetails & details(const int i) const
void setIdentifier(std::size_t identifier)
Set the unique identifier for this workset, this is not an index!
WorksetDetails & details(const int i)
Convenience wrapper to operator() for pointer access.
Teuchos::RCP< WorksetDetails > other
std::ostream & operator<<(std::ostream &os, const AssemblyEngineInArgs &in)
Used to define options for lazy evaluation of BasisValues and IntegrationValues objects.
bool align_side_points_
If workset side integration values must align with another workset, there must be a unique order assi...
Teuchos::RCP< const OrientationsInterface > orientations_
Must be set to apply orientations - if it is set, then orientations will be applied to basis values.
bool side_assembly_
Build integration values for sides.
WorksetOptions()
Default constructor.