www.mooseframework.org
GrainTracker.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "FeatureFloodCount.h"
13 #include "GrainTrackerInterface.h"
14 
15 #include "libmesh/bounding_box.h"
16 
17 class GrainTracker;
19 struct GrainDistance;
20 
21 template <>
22 InputParameters validParams<GrainTracker>();
23 
25 {
26 public:
27  GrainTracker(const InputParameters & parameters);
28  virtual ~GrainTracker();
29 
30  virtual void meshChanged() override;
31  virtual void initialize() override;
32  virtual void execute() override;
33  virtual void finalize() override;
34 
35  virtual std::size_t getTotalFeatureCount() const override;
36 
37  // Struct used to transfer minimal data to all ranks
39  {
41  unsigned int id;
42  Point centroid;
44  };
45 
46  struct CacheValues
47  {
48  Real current;
49  Real old;
50  Real older;
51  };
52 
53  enum class RemapCacheMode
54  {
55  FILL,
56  USE,
57  BYPASS
58  };
59 
60  // GrainTrackerInterface methods
61  virtual Real getEntityValue(dof_id_type node_id,
62  FieldType field_type,
63  std::size_t var_index = 0) const override;
64  virtual const std::vector<unsigned int> &
65  getVarToFeatureVector(dof_id_type elem_id) const override;
66  virtual unsigned int getFeatureVar(unsigned int feature_id) const override;
67  virtual std::size_t getNumberActiveGrains() const override;
68  virtual Point getGrainCentroid(unsigned int grain_id) const override;
69  virtual bool doesFeatureIntersectBoundary(unsigned int feature_id) const override;
70  virtual bool doesFeatureIntersectSpecifiedBoundary(unsigned int feature_id) const override;
71  virtual bool isFeaturePercolated(unsigned int feature_id) const override;
72  virtual std::vector<unsigned int> getNewGrainIDs() const override;
73 
74 protected:
75  virtual void updateFieldInfo() override;
76  virtual Real getThreshold(std::size_t current_index) const override;
77 
84  void prepopulateState(const FeatureFloodCount & ffc_object);
85 
88  void communicateHaloMap();
89 
94  void assignGrains();
95 
103  void trackGrains();
104 
109  virtual void newGrainCreated(unsigned int new_grain_id);
110 
114  void remapGrains();
115 
121 
127  void computeMinDistancesFromGrain(FeatureData & grain,
128  std::vector<std::list<GrainDistance>> & min_distances);
129 
134  bool attemptGrainRenumber(FeatureData & grain, unsigned int depth, unsigned int max_depth);
135 
141  void swapSolutionValues(FeatureData & grain,
142  std::size_t new_var_index,
143  std::vector<std::map<Node *, CacheValues>> & cache,
144  RemapCacheMode cache_mode);
145 
149  void swapSolutionValuesHelper(Node * curr_node,
150  std::size_t curr_var_index,
151  std::size_t new_var_index,
152  std::vector<std::map<Node *, CacheValues>> & cache,
153  RemapCacheMode cache_mode);
154 
159  Real boundingRegionDistance(std::vector<BoundingBox> & bboxes1,
160  std::vector<BoundingBox> & bboxes2) const;
161 
166  Real centroidRegionDistance(std::vector<BoundingBox> & bboxes1,
167  std::vector<BoundingBox> & bboxes2) const;
168 
174  unsigned int getNextUniqueID();
175 
176  /*************************************************
177  *************** Data Structures *****************
178  ************************************************/
179 
181  const int _tracking_step;
182 
184  const unsigned short _halo_level;
185 
187  const unsigned short _max_remap_recursion_depth;
188 
190  const unsigned short _n_reserve_ops;
191 
194  const std::size_t _reserve_op_index;
195 
197  const Real _reserve_op_threshold;
198 
200  const bool _remap;
201 
203  const bool _tolerate_failure;
204 
206  NonlinearSystemBase & _nl;
207 
212  std::vector<FeatureData> _feature_sets_old;
213 
216 
220  const short _verbosity_level;
221 
226  bool & _first_time;
227 
233  const bool _error_on_grain_creation;
234 
235 private:
237  unsigned int _reserve_grain_first_index;
238 
240  unsigned int _old_max_grain_id;
241 
243  unsigned int & _max_curr_grain_id;
244 
246  const bool _is_transient;
247 
249  std::vector<std::pair<dof_id_type, dof_id_type>> _all_ranges;
250 
252  const PerfID _finalize_timer;
253  const PerfID _remap_timer;
254  const PerfID _track_grains;
255  const PerfID _broadcast_update;
256  const PerfID _update_field_info;
257 };
258 
264 {
265  GrainDistance(Real distance, std::size_t var_index);
266 
267  GrainDistance(Real distance,
268  std::size_t var_index,
269  std::size_t grain_index,
270  unsigned int grain_id);
271 
272  // Copy constructors
273  GrainDistance(const GrainDistance & f) = default;
274  GrainDistance & operator=(const GrainDistance & f) = default;
275 
276  // Move constructors
277  GrainDistance(GrainDistance && f) = default;
278  GrainDistance & operator=(GrainDistance && f) = default;
279 
280  bool operator<(const GrainDistance & rhs) const;
281 
282  Real _distance;
283  std::size_t _var_index;
284  std::size_t _grain_index;
285  unsigned int _grain_id;
286 };
287 
288 template <>
289 void dataStore(std::ostream & stream, GrainTracker::PartialFeatureData & feature, void * context);
290 template <>
291 void dataLoad(std::istream & stream, GrainTracker::PartialFeatureData & feature, void * context);
GrainTracker::_reserve_grain_first_index
unsigned int _reserve_grain_first_index
Holds the first unique grain index when using _reserve_op (all the remaining indices are sequential)
Definition: GrainTracker.h:236
GrainTracker::getEntityValue
virtual Real getEntityValue(dof_id_type node_id, FieldType field_type, std::size_t var_index=0) const override
Definition: GrainTracker.C:120
GrainTrackerInterface
This class defines the interface for the GrainTracking objects.
Definition: GrainTrackerInterface.h:24
GrainTracker::_halo_level
const unsigned short _halo_level
The thickness of the halo surrounding each grain.
Definition: GrainTracker.h:183
GrainTracker::CacheValues::current
Real current
Definition: GrainTracker.h:48
GrainTracker::assignGrains
void assignGrains()
When the tracking phase starts (_t_step == _tracking_step) it assigns a unique id to every FeatureDat...
Definition: GrainTracker.C:450
GrainTracker::_error_on_grain_creation
const bool _error_on_grain_creation
Boolean to terminate with an error if a new grain is created during the simulation.
Definition: GrainTracker.h:232
GrainTracker::PartialFeatureData::id
unsigned int id
Definition: GrainTracker.h:41
GrainTracker::_feature_sets_old
std::vector< FeatureData > _feature_sets_old
This data structure holds the map of unique grains from the previous time step.
Definition: GrainTracker.h:211
GrainTracker::_old_max_grain_id
unsigned int _old_max_grain_id
The previous max grain id (needed to figure out which ids are new in a given step)
Definition: GrainTracker.h:239
GrainTracker::getTotalFeatureCount
virtual std::size_t getTotalFeatureCount() const override
Returns the total feature count (active and inactive ids, useful for sizing vectors)
Definition: GrainTracker.C:150
FeatureFloodCount::Status
Status
This enumeration is used to indicate status of the grains in the _unique_grains data structure.
Definition: FeatureFloodCount.h:120
GrainTracker::newGrainCreated
virtual void newGrainCreated(unsigned int new_grain_id)
This method is called when a new grain is detected.
Definition: GrainTracker.C:880
GrainDistance::_distance
Real _distance
Definition: GrainTracker.h:282
FeatureFloodCount::FieldType
FieldType
Definition: FeatureFloodCount.h:103
GrainTracker::_n_reserve_ops
const unsigned short _n_reserve_ops
The number of reserved order parameters.
Definition: GrainTracker.h:189
GrainTracker::boundingRegionDistance
Real boundingRegionDistance(std::vector< BoundingBox > &bboxes1, std::vector< BoundingBox > &bboxes2) const
This method returns the minimum periodic distance between two vectors of bounding boxes.
Definition: GrainTracker.C:1745
GrainTracker::updateFieldInfo
virtual void updateFieldInfo() override
This method is used to populate any of the data structures used for storing field data (nodal or elem...
Definition: GrainTracker.C:1553
GrainTracker::doesFeatureIntersectBoundary
virtual bool doesFeatureIntersectBoundary(unsigned int feature_id) const override
Returns a Boolean indicating whether this feature intersects any boundary.
Definition: GrainTracker.C:175
GrainTracker::_broadcast_update
const PerfID _broadcast_update
Definition: GrainTracker.h:254
GrainDistance
This struct is used to hold distance information to other grains in the simulation.
Definition: GrainTracker.h:263
FeatureFloodCount
This object will mark nodes or elements of continuous regions all with a unique number for the purpos...
Definition: FeatureFloodCount.h:44
GrainTracker
Definition: GrainTracker.h:24
GrainTracker::RemapCacheMode::USE
GrainTracker::PartialFeatureData
Definition: GrainTracker.h:38
GrainTracker::getNewGrainIDs
virtual std::vector< unsigned int > getNewGrainIDs() const override
This method returns all of the new ids generated in an invocation of the GrainTracker.
Definition: GrainTracker.C:901
GrainTracker::broadcastAndUpdateGrainData
void broadcastAndUpdateGrainData()
Broadcast essential Grain information to all processors.
Definition: GrainTracker.C:388
GrainTracker::PartialFeatureData::status
Status status
Definition: GrainTracker.h:43
GrainTracker::_poly_ic_uo
const PolycrystalUserObjectBase * _poly_ic_uo
An optional IC UserObject which can provide initial data structures to this object.
Definition: GrainTracker.h:214
PolycrystalUserObjectBase
This object provides the base capability for creating proper polycrystal ICs.
Definition: PolycrystalUserObjectBase.h:27
GrainTracker::prepopulateState
void prepopulateState(const FeatureFloodCount &ffc_object)
This method extracts the necessary state from the passed in object necessary to continue tracking gra...
Definition: GrainTracker.C:298
GrainTracker::execute
virtual void execute() override
Definition: GrainTracker.C:273
dataStore
void dataStore(std::ostream &stream, GrainTracker::PartialFeatureData &feature, void *context)
Definition: GrainTracker.C:28
GrainTracker::computeMinDistancesFromGrain
void computeMinDistancesFromGrain(FeatureData &grain, std::vector< std::list< GrainDistance >> &min_distances)
Populates and sorts a min_distances vector with the minimum distances to all grains in the simulation...
Definition: GrainTracker.C:1185
GrainTracker::swapSolutionValues
void swapSolutionValues(FeatureData &grain, std::size_t new_var_index, std::vector< std::map< Node *, CacheValues >> &cache, RemapCacheMode cache_mode)
A routine for moving all of the solution values from a given grain to a new variable number.
Definition: GrainTracker.C:1434
GrainDistance::GrainDistance
GrainDistance(Real distance, std::size_t var_index)
Definition: GrainTracker.C:1812
FeatureFloodCount.h
GrainTracker::RemapCacheMode::BYPASS
dataLoad
void dataLoad(std::istream &stream, GrainTracker::PartialFeatureData &feature, void *context)
Definition: GrainTracker.C:38
GrainTracker::swapSolutionValuesHelper
void swapSolutionValuesHelper(Node *curr_node, std::size_t curr_var_index, std::size_t new_var_index, std::vector< std::map< Node *, CacheValues >> &cache, RemapCacheMode cache_mode)
Helper method for actually performing the swaps.
Definition: GrainTracker.C:1473
GrainTracker::trackGrains
void trackGrains()
On subsequent time_steps, incoming FeatureData objects are compared to previous time_step information...
Definition: GrainTracker.C:497
GrainTracker::finalize
virtual void finalize() override
Definition: GrainTracker.C:330
GrainTracker::_max_curr_grain_id
unsigned int & _max_curr_grain_id
Holds the next "regular" grain ID (a grain found or remapped to the standard op vars)
Definition: GrainTracker.h:242
FeatureFloodCount::BoundaryIntersection
BoundaryIntersection
This enumeration is used to inidacate status of boundary intersections.
Definition: FeatureFloodCount.h:129
GrainTracker::_finalize_timer
const PerfID _finalize_timer
Timers.
Definition: GrainTracker.h:251
GrainTracker::_all_ranges
std::vector< std::pair< dof_id_type, dof_id_type > > _all_ranges
Data structure to hold element ID ranges when using Distributed Mesh (populated on rank 0 only)
Definition: GrainTracker.h:248
GrainTracker::_remap
const bool _remap
Inidicates whether remapping should be done or not (remapping is independent of tracking)
Definition: GrainTracker.h:199
GrainTracker::RemapCacheMode::FILL
validParams< GrainTracker >
InputParameters validParams< GrainTracker >()
Definition: GrainTracker.C:50
GrainTracker::_nl
NonlinearSystemBase & _nl
A reference to the nonlinear system (used for retrieving solution vectors)
Definition: GrainTracker.h:205
GrainTracker::CacheValues
Definition: GrainTracker.h:46
GrainTracker::centroidRegionDistance
Real centroidRegionDistance(std::vector< BoundingBox > &bboxes1, std::vector< BoundingBox > &bboxes2) const
This method returns the minimum periodic distance between the centroids of two vectors of bounding bo...
Definition: GrainTracker.C:1718
GrainTracker::~GrainTracker
virtual ~GrainTracker()
Definition: GrainTracker.C:117
GrainTracker::PartialFeatureData::centroid
Point centroid
Definition: GrainTracker.h:42
GrainTracker::attemptGrainRenumber
bool attemptGrainRenumber(FeatureData &grain, unsigned int depth, unsigned int max_depth)
This is the recursive part of the remapping algorithm.
Definition: GrainTracker.C:1259
GrainTracker::PartialFeatureData::boundary_intersection
BoundaryIntersection boundary_intersection
Definition: GrainTracker.h:40
GrainTracker::RemapCacheMode
RemapCacheMode
Definition: GrainTracker.h:53
GrainTracker::_update_field_info
const PerfID _update_field_info
Definition: GrainTracker.h:255
GrainTracker::getVarToFeatureVector
virtual const std::vector< unsigned int > & getVarToFeatureVector(dof_id_type elem_id) const override
Returns a list of active unique feature ids for a particular element.
Definition: GrainTracker.C:131
GrainTracker::_is_transient
const bool _is_transient
Boolean to indicate whether this is a Steady or Transient solve.
Definition: GrainTracker.h:245
GrainDistance::operator<
bool operator<(const GrainDistance &rhs) const
Definition: GrainTracker.C:1829
GrainTracker::communicateHaloMap
void communicateHaloMap()
Definition: GrainTracker.C:1632
GrainTrackerInterface.h
GrainTracker::GrainTracker
GrainTracker(const InputParameters &parameters)
Definition: GrainTracker.C:80
GrainTracker::_tracking_step
const int _tracking_step
The timestep to begin tracking grains.
Definition: GrainTracker.h:180
GrainDistance::_grain_index
std::size_t _grain_index
Definition: GrainTracker.h:284
GrainTracker::_reserve_op_index
const std::size_t _reserve_op_index
The cutoff index where if variable index >= this number, no remapping TO that variable will occur.
Definition: GrainTracker.h:193
GrainTracker::_max_remap_recursion_depth
const unsigned short _max_remap_recursion_depth
Depth of renumbering recursion (a depth of zero means no recursion)
Definition: GrainTracker.h:186
GrainTracker::getGrainCentroid
virtual Point getGrainCentroid(unsigned int grain_id) const override
Returns the centroid for the given grain number.
Definition: GrainTracker.C:157
GrainTracker::initialize
virtual void initialize() override
Definition: GrainTracker.C:230
GrainDistance::operator=
GrainDistance & operator=(const GrainDistance &f)=default
GrainTracker::getThreshold
virtual Real getThreshold(std::size_t current_index) const override
Return the starting comparison threshold to use when inspecting an entity during the flood stage.
Definition: GrainTracker.C:286
GrainTracker::_reserve_op_threshold
const Real _reserve_op_threshold
The threshold above (or below) where a grain may be found on a reserve op field.
Definition: GrainTracker.h:196
GrainTracker::getFeatureVar
virtual unsigned int getFeatureVar(unsigned int feature_id) const override
Returns the variable representing the passed in feature.
Definition: GrainTracker.C:137
GrainTracker::_track_grains
const PerfID _track_grains
Definition: GrainTracker.h:253
GrainTracker::_verbosity_level
const short _verbosity_level
Verbosity level controlling the amount of information printed to the console.
Definition: GrainTracker.h:219
GrainTracker::remapGrains
void remapGrains()
This method is called after trackGrains to remap grains that are too close to each other.
Definition: GrainTracker.C:913
GrainDistance::_grain_id
unsigned int _grain_id
Definition: GrainTracker.h:285
GrainTracker::_tolerate_failure
const bool _tolerate_failure
Indicates whether we should continue after a remap failure (will result in non-physical results)
Definition: GrainTracker.h:202
GrainTracker::getNextUniqueID
unsigned int getNextUniqueID()
Retrieve the next unique grain number if a new grain is detected during trackGrains.
Definition: GrainTracker.C:1795
GrainTracker::getNumberActiveGrains
virtual std::size_t getNumberActiveGrains() const override
Returns the number of active grains current stored in the GrainTracker.
Definition: GrainTracker.C:143
GrainTracker::CacheValues::old
Real old
Definition: GrainTracker.h:49
GrainTracker::_remap_timer
const PerfID _remap_timer
Definition: GrainTracker.h:252
GrainTracker::CacheValues::older
Real older
Definition: GrainTracker.h:50
GrainTracker::isFeaturePercolated
virtual bool isFeaturePercolated(unsigned int feature_id) const override
Returns a Boolean indicating whether this feature is percolated (e.g.
Definition: GrainTracker.C:208
GrainTracker::doesFeatureIntersectSpecifiedBoundary
virtual bool doesFeatureIntersectSpecifiedBoundary(unsigned int feature_id) const override
Returns a Boolean indicating whether this feature intersects boundaries in a user-supplied list.
Definition: GrainTracker.C:191
GrainTracker::meshChanged
virtual void meshChanged() override
Definition: GrainTracker.C:248
GrainDistance::_var_index
std::size_t _var_index
Definition: GrainTracker.h:283
GrainTracker::_first_time
bool & _first_time
Boolean to indicate the first time this object executes.
Definition: GrainTracker.h:225