www.mooseframework.org
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
PolycrystalEBSD Class Referenceabstract

#include <PolycrystalEBSD.h>

Inheritance diagram for PolycrystalEBSD:
[legend]

Public Types

enum  FieldType {
  FieldType::UNIQUE_REGION, FieldType::VARIABLE_COLORING, FieldType::GHOSTED_ENTITIES, FieldType::HALOS,
  FieldType::CENTROID, FieldType::ACTIVE_BOUNDS, FieldType::INTERSECTS_SPECIFIED_BOUNDARY
}
 
enum  Status : unsigned char { Status::CLEAR = 0x0, Status::MARKED = 0x1, Status::DIRTY = 0x2, Status::INACTIVE = 0x4 }
 This enumeration is used to indicate status of the grains in the _unique_grains data structure. More...
 
enum  BoundaryIntersection : unsigned char {
  BoundaryIntersection::NONE = 0x0, BoundaryIntersection::ANY_BOUNDARY = 0x1, BoundaryIntersection::PRIMARY_PERCOLATION_BOUNDARY = 0x2, BoundaryIntersection::SECONDARY_PERCOLATION_BOUNDARY = 0x4,
  BoundaryIntersection::SPECIFIED_BOUNDARY = 0x8
}
 This enumeration is used to inidacate status of boundary intersections. More...
 
typedef DataFileName DataFileParameterType
 
typedef FunctorBase< RealFunctorType
 
typedef Real ValueType
 
typedef typename FunctorReturnType< Real, FunctorEvaluationKind::Gradient >::type GradientType
 
typedef ValueType DotType
 
enum  TEST_TYPE
 

Public Member Functions

 PolycrystalEBSD (const InputParameters &parameters)
 
virtual void getGrainsBasedOnPoint (const Point &point, std::vector< unsigned int > &grains) const override
 Method for retrieving active grain IDs based on some point in the mesh. More...
 
virtual Real getVariableValue (unsigned int op_index, const Point &p) const override
 Returns the variable value for a given op_index and mesh point. More...
 
virtual Real getNodalVariableValue (unsigned int op_index, const Node &n) const override
 Similarly to the getVariableValue method, this method also returns values but may be optimized for returning nodal values. More...
 
virtual unsigned int getNumGrains () const override
 Must be overridden by the deriving class to provide the number of grains in the polycrystal structure. More...
 
virtual void precomputeGrainStructure ()
 This callback is triggered after the object is initialized and may be optionally overridden to do precompute the element to grain identifiers ahead of time. More...
 
virtual void getGrainsBasedOnElem (const Elem &elem, std::vector< unsigned int > &grains) const
 This method may be defined in addition to the point based initialization to speed up lookups. More...
 
virtual void initialSetup () override
 UserObject interface overrides. More...
 
virtual void initialize () override
 
virtual void execute () override
 
virtual void finalize () override
 
virtual void meshChanged () override
 
virtual Real getValue () const override
 
std::size_t getNumberActiveFeatures () const
 Return the number of active features. More...
 
virtual std::size_t getTotalFeatureCount () const
 Returns the total feature count (active and inactive ids, useful for sizing vectors) More...
 
virtual bool doesFeatureIntersectBoundary (unsigned int feature_id) const
 Returns a Boolean indicating whether this feature intersects any boundary. More...
 
virtual bool doesFeatureIntersectSpecifiedBoundary (unsigned int feature_id) const
 Returns a Boolean indicating whether this feature intersects boundaries in a user-supplied list. More...
 
virtual bool isFeaturePercolated (unsigned int feature_id) const
 Returns a Boolean indicating whether this feature is percolated (e.g. More...
 
virtual Point featureCentroid (unsigned int feature_id) const
 Returns the centroid of the designated feature (only supported without periodic boundaries) More...
 
virtual const std::vector< unsigned int > & getVarToFeatureVector (dof_id_type elem_id) const
 Returns a list of active unique feature ids for a particular element. More...
 
virtual unsigned int getFeatureVar (unsigned int feature_id) const
 Returns the variable representing the passed in feature. More...
 
std::size_t numCoupledVars () const
 Returns the number of coupled varaibles. More...
 
const std::vector< MooseVariable * > & getCoupledVars () const
 Returns a const vector to the coupled variable pointers. More...
 
const std::vector< MooseVariableFEBase * > & getFECoupledVars () const
 Returns a const vector to the coupled MooseVariableFEBase pointers. More...
 
virtual Real getEntityValue (dof_id_type entity_id, FieldType field_type, std::size_t var_index=0) const
 
bool isElemental () const
 
const std::vector< FeatureData > & getFeatures () const
 Return a constant reference to the vector of all discovered features. More...
 
SubProblemgetSubProblem () const
 
bool shouldDuplicateInitialExecution () const
 
virtual Real spatialValue (const Point &) const
 
virtual const std::vector< Point > spatialPoints () const
 
void gatherSum (T &value)
 
void gatherMax (T &value)
 
void gatherMin (T &value)
 
void gatherProxyValueMax (T1 &value, T2 &proxy)
 
void gatherProxyValueMin (T1 &value, T2 &proxy)
 
void setPrimaryThreadCopy (UserObject *primary)
 
UserObjectprimaryThreadCopy ()
 
std::set< UserObjectName > getDependObjects () const
 
virtual bool needThreadedCopy () const
 
const std::set< std::string > & getRequestedItems () override
 
const std::set< std::string > & getSuppliedItems () override
 
unsigned int systemNumber () const
 
virtual bool enabled () const
 
MooseAppgetMooseApp () const
 
const std::string & type () const
 
virtual const std::string & name () const
 
std::string typeAndName () const
 
std::string errorPrefix (const std::string &error_type) const
 
void callMooseError (std::string msg, const bool with_prefix) const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
const InputParametersparameters () const
 
MooseObjectName uniqueName () const
 
const T & getParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const T & getRenamedParam (const std::string &old_name, const std::string &new_name) const
 
getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &nm) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void mooseError (Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &name, const std::string *param=nullptr) const
 
virtual void timestepSetup ()
 
virtual void timestepSetup () override
 
virtual void jacobianSetup ()
 
virtual void jacobianSetup () override
 
virtual void residualSetup ()
 
virtual void residualSetup () override
 
virtual void customSetup (const ExecFlagType &)
 
virtual void customSetup (const ExecFlagType &exec_type) override
 
const ExecFlagEnumgetExecuteOnEnum () const
 
UserObjectName getUserObjectName (const std::string &param_name) const
 
const T & getUserObject (const std::string &param_name, bool is_dependency=true) const
 
const T & getUserObjectByName (const UserObjectName &object_name, bool is_dependency=true) const
 
const UserObjectgetUserObjectBase (const std::string &param_name, bool is_dependency=true) const
 
const UserObjectgetUserObjectBaseByName (const UserObjectName &object_name, bool is_dependency=true) const
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty (const std::string &name, MaterialData &material_data, const unsigned int state=0)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty (const std::string &name, const unsigned int state=0)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty (const std::string &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialProperty (const std::string &name, MaterialData &material_data, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialProperty (const std::string &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialProperty (const std::string &name, const unsigned int state=0)
 
const ADMaterialProperty< T > & getADMaterialProperty (const std::string &name, MaterialData &material_data)
 
const ADMaterialProperty< T > & getADMaterialProperty (const std::string &name)
 
const ADMaterialProperty< T > & getADMaterialProperty (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOld (const std::string &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOld (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOld (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOlder (const std::string &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOlder (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOlder (const std::string &name)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName (const MaterialPropertyName &name, MaterialData &material_data, const unsigned int state)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialPropertyByName (const MaterialPropertyName &name, MaterialData &material_data, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const ADMaterialProperty< T > & getADMaterialPropertyByName (const MaterialPropertyName &name, MaterialData &material_data)
 
const ADMaterialProperty< T > & getADMaterialPropertyByName (const MaterialPropertyName &name)
 
const ADMaterialProperty< T > & getADMaterialPropertyByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOldByName (const MaterialPropertyName &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOldByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOldByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOlderByName (const MaterialPropertyName &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOlderByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOlderByName (const MaterialPropertyName &name)
 
std::pair< const MaterialProperty< T > *, std::set< SubdomainID > > getBlockMaterialProperty (const MaterialPropertyName &name)
 
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialProperty (const std::string &name)
 
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialProperty ()
 
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialPropertyByName (const std::string &prop_name)
 
const MaterialProperty< T > & getZeroMaterialProperty (Ts... args)
 
std::set< SubdomainIDgetMaterialPropertyBlocks (const std::string &name)
 
std::vector< SubdomainName > getMaterialPropertyBlockNames (const std::string &name)
 
std::set< BoundaryIDgetMaterialPropertyBoundaryIDs (const std::string &name)
 
std::vector< BoundaryName > getMaterialPropertyBoundaryNames (const std::string &name)
 
void checkBlockAndBoundaryCompatibility (std::shared_ptr< MaterialBase > discrete)
 
std::unordered_map< SubdomainID, std::vector< MaterialBase *> > buildRequiredMaterials (bool allow_stateful=true)
 
void statefulPropertiesAllowed (bool)
 
bool getMaterialPropertyCalled () const
 
const std::unordered_set< unsigned int > & getMatPropDependencies () const
 
virtual void resolveOptionalProperties ()
 
const GenericMaterialProperty< T, is_ad > & getPossiblyConstantGenericMaterialPropertyByName (const MaterialPropertyName &prop_name, MaterialData &material_data, const unsigned int state)
 
bool isImplicit ()
 
const PostprocessorValuegetCurrentValue () const
 
const std::string & PPName () const
 
virtual bool hasBlocks (SubdomainID) const override
 
bool supportsFaceArg () const override final
 
bool supportsElemSideQpArg () const override final
 
void buildOutputHideVariableList (std::set< std::string > variable_names)
 
const std::set< OutputName > & getOutputs ()
 
FunctorReturnType< Real, FET >::type genericEvaluate (const Space &r, const State &state) const
 
const MooseFunctorName & functorName () const
 
void setCacheClearanceSchedule (const std::set< ExecFlagType > &clearance_schedule)
 
virtual bool isExtrapolatedBoundaryFace (const FaceInfo &, const Elem *, const StateArg &) const
 
bool isInternalFace (const FaceInfo &) const
 
virtual bool isConstant () const
 
virtual bool hasFaceSide (const FaceInfo &fi, const bool fi_elem_side) const override
 
Moose::FaceArg checkFace (const Moose::FaceArg &face) const
 
virtual void threadJoin (const UserObject &) override
 
virtual void threadJoin (const UserObject &) override
 
virtual void subdomainSetup () override
 
virtual void subdomainSetup () override
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
const GenericOptionalMaterialProperty< T, is_ad > & getGenericOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const GenericOptionalMaterialProperty< T, is_ad > & getGenericOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const OptionalMaterialProperty< T > & getOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const OptionalMaterialProperty< T > & getOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const OptionalADMaterialProperty< T > & getOptionalADMaterialProperty (const std::string &name)
 
const OptionalADMaterialProperty< T > & getOptionalADMaterialProperty (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOld (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOld (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOlder (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOlder (const std::string &name)
 
MaterialBasegetMaterial (const std::string &name)
 
MaterialBasegetMaterial (const std::string &name)
 
MaterialBasegetMaterialByName (const std::string &name, bool no_warn=false)
 
MaterialBasegetMaterialByName (const std::string &name, bool no_warn=false)
 
bool hasMaterialProperty (const std::string &name)
 
bool hasMaterialProperty (const std::string &name)
 
bool hasMaterialPropertyByName (const std::string &name)
 
bool hasMaterialPropertyByName (const std::string &name)
 
bool hasADMaterialProperty (const std::string &name)
 
bool hasADMaterialProperty (const std::string &name)
 
bool hasADMaterialPropertyByName (const std::string &name)
 
bool hasADMaterialPropertyByName (const std::string &name)
 
bool hasGenericMaterialProperty (const std::string &name)
 
bool hasGenericMaterialProperty (const std::string &name)
 
bool hasGenericMaterialPropertyByName (const std::string &name)
 
bool hasGenericMaterialPropertyByName (const std::string &name)
 
ValueType operator() (const ElemArg &elem, const StateArg &state) const
 
ValueType operator() (const FaceArg &face, const StateArg &state) const
 
ValueType operator() (const ElemQpArg &qp, const StateArg &state) const
 
ValueType operator() (const ElemSideQpArg &qp, const StateArg &state) const
 
ValueType operator() (const ElemPointArg &elem_point, const StateArg &state) const
 
ValueType operator() (const NodeArg &node, const StateArg &state) const
 
ValueType operator() (const ElemArg &elem, const StateArg &state) const
 
ValueType operator() (const FaceArg &face, const StateArg &state) const
 
ValueType operator() (const ElemQpArg &qp, const StateArg &state) const
 
ValueType operator() (const ElemSideQpArg &qp, const StateArg &state) const
 
ValueType operator() (const ElemPointArg &elem_point, const StateArg &state) const
 
ValueType operator() (const NodeArg &node, const StateArg &state) const
 
ValueType operator() (const ElemArg &elem, const StateArg &state) const
 
ValueType operator() (const FaceArg &face, const StateArg &state) const
 
ValueType operator() (const ElemQpArg &qp, const StateArg &state) const
 
ValueType operator() (const ElemSideQpArg &qp, const StateArg &state) const
 
ValueType operator() (const ElemPointArg &elem_point, const StateArg &state) const
 
ValueType operator() (const NodeArg &node, const StateArg &state) const
 
GradientType gradient (const ElemArg &elem, const StateArg &state) const
 
GradientType gradient (const FaceArg &face, const StateArg &state) const
 
GradientType gradient (const ElemQpArg &qp, const StateArg &state) const
 
GradientType gradient (const ElemSideQpArg &qp, const StateArg &state) const
 
GradientType gradient (const ElemPointArg &elem_point, const StateArg &state) const
 
GradientType gradient (const NodeArg &node, const StateArg &state) const
 
GradientType gradient (const ElemArg &elem, const StateArg &state) const
 
GradientType gradient (const FaceArg &face, const StateArg &state) const
 
GradientType gradient (const ElemQpArg &qp, const StateArg &state) const
 
GradientType gradient (const ElemSideQpArg &qp, const StateArg &state) const
 
GradientType gradient (const ElemPointArg &elem_point, const StateArg &state) const
 
GradientType gradient (const NodeArg &node, const StateArg &state) const
 
GradientType gradient (const ElemArg &elem, const StateArg &state) const
 
GradientType gradient (const FaceArg &face, const StateArg &state) const
 
GradientType gradient (const ElemQpArg &qp, const StateArg &state) const
 
GradientType gradient (const ElemSideQpArg &qp, const StateArg &state) const
 
GradientType gradient (const ElemPointArg &elem_point, const StateArg &state) const
 
GradientType gradient (const NodeArg &node, const StateArg &state) const
 
DotType dot (const ElemArg &elem, const StateArg &state) const
 
DotType dot (const FaceArg &face, const StateArg &state) const
 
DotType dot (const ElemQpArg &qp, const StateArg &state) const
 
DotType dot (const ElemSideQpArg &qp, const StateArg &state) const
 
DotType dot (const ElemPointArg &elem_point, const StateArg &state) const
 
DotType dot (const NodeArg &node, const StateArg &state) const
 
DotType dot (const ElemArg &elem, const StateArg &state) const
 
DotType dot (const FaceArg &face, const StateArg &state) const
 
DotType dot (const ElemQpArg &qp, const StateArg &state) const
 
DotType dot (const ElemSideQpArg &qp, const StateArg &state) const
 
DotType dot (const ElemPointArg &elem_point, const StateArg &state) const
 
DotType dot (const NodeArg &node, const StateArg &state) const
 
DotType dot (const ElemArg &elem, const StateArg &state) const
 
DotType dot (const FaceArg &face, const StateArg &state) const
 
DotType dot (const ElemQpArg &qp, const StateArg &state) const
 
DotType dot (const ElemSideQpArg &qp, const StateArg &state) const
 
DotType dot (const ElemPointArg &elem_point, const StateArg &state) const
 
DotType dot (const NodeArg &node, const StateArg &state) const
 
GradientType gradDot (const ElemArg &elem, const StateArg &state) const
 
GradientType gradDot (const FaceArg &face, const StateArg &state) const
 
GradientType gradDot (const ElemQpArg &qp, const StateArg &state) const
 
GradientType gradDot (const ElemSideQpArg &qp, const StateArg &state) const
 
GradientType gradDot (const ElemPointArg &elem_point, const StateArg &state) const
 
GradientType gradDot (const NodeArg &node, const StateArg &state) const
 
GradientType gradDot (const ElemArg &elem, const StateArg &state) const
 
GradientType gradDot (const FaceArg &face, const StateArg &state) const
 
GradientType gradDot (const ElemQpArg &qp, const StateArg &state) const
 
GradientType gradDot (const ElemSideQpArg &qp, const StateArg &state) const
 
GradientType gradDot (const ElemPointArg &elem_point, const StateArg &state) const
 
GradientType gradDot (const NodeArg &node, const StateArg &state) const
 
GradientType gradDot (const ElemArg &elem, const StateArg &state) const
 
GradientType gradDot (const FaceArg &face, const StateArg &state) const
 
GradientType gradDot (const ElemQpArg &qp, const StateArg &state) const
 
GradientType gradDot (const ElemSideQpArg &qp, const StateArg &state) const
 
GradientType gradDot (const ElemPointArg &elem_point, const StateArg &state) const
 
GradientType gradDot (const NodeArg &node, const StateArg &state) const
 
const FunctiongetFunction (const std::string &name) const
 
const FunctiongetFunctionByName (const FunctionName &name) const
 
bool hasFunction (const std::string &param_name) const
 
bool hasFunctionByName (const FunctionName &name) const
 
bool isDefaultPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessor (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessorByName (const PostprocessorName &name) const
 
std::size_t coupledPostprocessors (const std::string &param_name) const
 
const PostprocessorName & getPostprocessorName (const std::string &param_name, const unsigned int index=0) const
 
const VectorPostprocessorValuegetVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const VectorPostprocessorValuegetVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name, bool needs_broadcast) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValuegetScatterVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool hasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
bool hasVectorPostprocessor (const std::string &param_name) const
 
bool hasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool hasVectorPostprocessorByName (const VectorPostprocessorName &name) const
 
const VectorPostprocessorName & getVectorPostprocessorName (const std::string &param_name) const
 
T & getSampler (const std::string &name)
 
SamplergetSampler (const std::string &name)
 
T & getSamplerByName (const SamplerName &name)
 
SamplergetSamplerByName (const SamplerName &name)
 
const std::vector< MooseVariableScalar *> & getCoupledMooseScalarVars ()
 
const std::set< TagID > & getScalarVariableCoupleableVectorTags () const
 
const std::set< TagID > & getScalarVariableCoupleableMatrixTags () const
 
PerfGraphperfGraph ()
 
const PostprocessorValuegetPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValuegetPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
virtual const PostprocessorValuegetPostprocessorValueByName (const PostprocessorName &name) const
 
virtual const PostprocessorValuegetPostprocessorValueByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOlderByName (const PostprocessorName &name) const
 
const PostprocessorValuegetPostprocessorValueOlderByName (const PostprocessorName &name) const
 
bool isVectorPostprocessorDistributed (const std::string &param_name) const
 
bool isVectorPostprocessorDistributed (const std::string &param_name) const
 
bool isVectorPostprocessorDistributedByName (const VectorPostprocessorName &name) const
 
bool isVectorPostprocessorDistributedByName (const VectorPostprocessorName &name) const
 
const DistributiongetDistribution (const std::string &name) const
 
const T & getDistribution (const std::string &name) const
 
const DistributiongetDistribution (const std::string &name) const
 
const T & getDistribution (const std::string &name) const
 
const DistributiongetDistributionByName (const DistributionName &name) const
 
const T & getDistributionByName (const std::string &name) const
 
const DistributiongetDistributionByName (const DistributionName &name) const
 
const T & getDistributionByName (const std::string &name) const
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
const ADVariableValuegetADDefaultValue (const std::string &var_name) const
 
const std::vector< MooseVariableFieldBase *> & getCoupledMooseVars () const
 
const std::vector< MooseVariable *> & getCoupledStandardMooseVars () const
 
const std::vector< VectorMooseVariable *> & getCoupledVectorMooseVars () const
 
const std::vector< ArrayMooseVariable *> & getCoupledArrayMooseVars () const
 
void addFEVariableCoupleableVectorTag (TagID tag)
 
void addFEVariableCoupleableMatrixTag (TagID tag)
 
std::set< TagID > & getFEVariableCoupleableVectorTags ()
 
const std::set< TagID > & getFEVariableCoupleableVectorTags () const
 
std::set< TagID > & getFEVariableCoupleableMatrixTags ()
 
const std::set< TagID > & getFEVariableCoupleableMatrixTags () const
 
auto & getWritableCoupledVariables () const
 
bool hasWritableCoupledVariables () const
 
const ADVectorVariableValuegetADDefaultVectorValue (const std::string &var_name) const
 
const ADVariableGradientgetADDefaultGradient () const
 
const ADVectorVariableGradientgetADDefaultVectorGradient () const
 
const ADVariableSecondgetADDefaultSecond () const
 
const std::set< MooseVariableFieldBase *> & getMooseVariableDependencies () const
 
std::set< MooseVariableFieldBase *> checkAllVariables (const DofObjectType &dof_object, const std::set< MooseVariableFieldBase * > &vars_to_omit={})
 
std::set< MooseVariableFieldBase *> checkVariables (const DofObjectType &dof_object, const std::set< MooseVariableFieldBase * > &vars_to_check)
 
virtual const std::set< BoundaryID > & boundaryIDs () const
 
const std::vector< BoundaryName > & boundaryNames () const
 
unsigned int numBoundaryIDs () const
 
bool hasBoundary (const BoundaryName &name) const
 
bool hasBoundary (const std::vector< BoundaryName > &names) const
 
bool hasBoundary (const BoundaryID &id) const
 
bool hasBoundary (const std::vector< BoundaryID > &ids, TEST_TYPE type=ALL) const
 
bool hasBoundary (const std::set< BoundaryID > &ids, TEST_TYPE type=ALL) const
 
bool isBoundarySubset (const std::set< BoundaryID > &ids) const
 
bool isBoundarySubset (const std::vector< BoundaryID > &ids) const
 
bool hasBoundaryMaterialProperty (const std::string &prop_name) const
 
virtual bool boundaryRestricted () const
 
const std::set< BoundaryID > & meshBoundaryIDs () const
 
virtual bool checkVariableBoundaryIntegrity () const
 

Static Public Member Functions

static InputParameters validParams ()
 
static MooseEnum coloringAlgorithms ()
 
static std::string coloringAlgorithmDescriptions ()
 Returns corresponding descriptions of available coloring algorithms. More...
 
static void sortDFS (typename std::vector< T > &vector)
 
static void cyclicDependencyError (CyclicDependencyException< T2 > &e, const std::string &header)
 
static std::string deduceFunctorName (const std::string &name, const InputParameters &params)
 
static bool restricted (const std::set< BoundaryID > &ids)
 

Public Attributes

const ConsoleStream _console
 
 ALL
 
 ANY
 

Static Public Attributes

static constexpr PropertyValue::id_type default_property_id
 
static constexpr PropertyValue::id_type zero_property_id
 
static constexpr auto SYSTEM
 
static constexpr auto NAME
 
static const std::size_t invalid_size_t = std::numeric_limits<std::size_t>::max()
 
static const unsigned int invalid_id = std::numeric_limits<unsigned int>::max()
 
static const processor_id_type invalid_proc_id
 

Protected Member Functions

virtual bool areFeaturesMergeable (const FeatureData &f1, const FeatureData &f2) const override
 Method for determining whether two features are mergeable. More...
 
virtual bool isNewFeatureOrConnectedRegion (const DofObject *dof_object, std::size_t &current_index, FeatureData *&feature, Status &status, unsigned int &new_id) override
 Method called during the recursive flood routine that should return whether or not the current entity is part of the current feature (if one is being explored), or if it's the start of a new feature. More...
 
virtual void prepareDataForTransfer () override
 This routine uses the local flooded data to build up the local feature data structures (_partial feature_sets). More...
 
virtual void mergeSets () override
 This routine is called on the primary rank only and stitches together the partial feature pieces seen on any processor. More...
 
virtual processor_id_type numberOfDistributedMergeHelpers () const override
 Returns a number indicating the number of merge helpers when running in parallel based on certain implementer decided criteria. More...
 
virtual void restoreOriginalDataStructures (std::vector< std::list< FeatureData >> &orig) override
 
void buildGrainAdjacencyMatrix ()
 Builds a dense adjacency matrix based on the discovery of grain neighbors and halos surrounding each grain. More...
 
void assignOpsToGrains ()
 Method that runs a coloring algorithm to assign OPs to grains. More...
 
bool colorGraph (unsigned int vertex)
 Built-in simple "back-tracking" algorithm to assign colors to a graph. More...
 
bool isGraphValid (unsigned int vertex, unsigned int color)
 Helper method for the back-tracking graph coloring algorithm. More...
 
void printGrainAdjacencyMatrix () const
 Prints out the adjacency matrix in a nicely spaced integer format. More...
 
template<typename T >
bool isBoundaryEntity (const T *entity) const
 Returns a Boolean indicating whether the entity is on one of the desired boundaries. More...
 
virtual void updateFieldInfo ()
 This method is used to populate any of the data structures used for storing field data (nodal or elemental). More...
 
bool flood (const DofObject *dof_object, std::size_t current_index)
 This method will check if the current entity is above the supplied threshold and "mark" it. More...
 
virtual Real getThreshold (std::size_t current_index) const
 Return the starting comparison threshold to use when inspecting an entity during the flood stage. More...
 
virtual Real getConnectingThreshold (std::size_t current_index) const
 Return the "connecting" comparison threshold to use when inspecting an entity during the flood stage. More...
 
bool compareValueWithThreshold (Real entity_value, Real threshold) const
 This method is used to determine whether the current entity value is part of a feature or not. More...
 
void expandPointHalos ()
 This method takes all of the partial features and expands the local, ghosted, and halo sets around those regions to account for the diffuse interface. More...
 
void expandEdgeHalos (unsigned int num_layers_to_expand)
 This method expands the existing halo set by some width determined by the passed in value. More...
 
template<typename T >
void visitNeighborsHelper (const T *curr_entity, std::vector< const T *> neighbor_entities, FeatureData *feature, bool expand_halos_only, bool topological_neighbor, bool disjoint_only)
 The actual logic for visiting neighbors is abstracted out here. More...
 
void serialize (std::string &serialized_buffer, unsigned int var_num=invalid_id)
 This routines packs the _partial_feature_sets data into a structure suitable for parallel communication operations. More...
 
void deserialize (std::vector< std::string > &serialized_buffers, unsigned int var_num=invalid_id)
 This routine takes the vector of byte buffers (one for each processor), deserializes them into a series of FeatureSet objects, and appends them to the _feature_sets data structure. More...
 
virtual void consolidateMergedFeatures (std::vector< std::list< FeatureData >> *saved_data=nullptr)
 This method consolidates all of the merged information from _partial_feature_sets into the _feature_sets vectors. More...
 
void communicateAndMerge ()
 This routine handles all of the serialization, communication and deserialization of the data structures containing FeatureData objects. More...
 
void sortAndLabel ()
 Sort and assign ids to features based on their position in the container after sorting. More...
 
void scatterAndUpdateRanks ()
 Calls buildLocalToGlobalIndices to build the individual local to global indicies for each rank and scatters that information to all ranks. More...
 
virtual void buildLocalToGlobalIndices (std::vector< std::size_t > &local_to_global_all, std::vector< int > &counts) const
 This routine populates a stacked vector of local to global indices per rank and the associated count vector for scattering the vector to the ranks. More...
 
void buildFeatureIdToLocalIndices (unsigned int max_id)
 This method builds a lookup map for retrieving the right local feature (by index) given a global index or id. More...
 
virtual void clearDataStructures ()
 Helper routine for clearing up data structures during initialize and prior to parallel communication. More...
 
void updateBoundaryIntersections (FeatureData &feature) const
 Update the feature's attributes to indicate boundary intersections. More...
 
void appendPeriodicNeighborNodes (FeatureData &feature) const
 This routine adds the periodic node information to our data structure prior to packing the data this makes those periodic neighbors appear much like ghosted nodes in a multiprocessor setting. More...
 
void updateRegionOffsets ()
 This routine updates the _region_offsets variable which is useful for quickly determining the proper global number for a feature when using multimap mode. More...
 
std::string deduceFunctorName (const std::string &name) const
 
virtual void addPostprocessorDependencyHelper (const PostprocessorName &name) const override
 
virtual void addVectorPostprocessorDependencyHelper (const VectorPostprocessorName &name) const override
 
virtual void addUserObjectDependencyHelper (const UserObject &uo) const override
 
void addReporterDependencyHelper (const ReporterName &reporter_name) override
 
const ReporterNamegetReporterName (const std::string &param_name) const
 
T & declareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< T > declareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const T & getRestartableData (const std::string &data_name) const
 
T & declareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
T & declareRecoverableData (const std::string &data_name, Args &&... args)
 
T & declareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
T & declareRestartableDataWithObjectNameWithContext (const std::string &data_name, const std::string &object_name, void *context, Args &&... args)
 
std::string restartableName (const std::string &data_name) const
 
const T & getMeshProperty (const std::string &data_name, const std::string &prefix)
 
const T & getMeshProperty (const std::string &data_name)
 
bool hasMeshProperty (const std::string &data_name, const std::string &prefix) const
 
bool hasMeshProperty (const std::string &data_name, const std::string &prefix) const
 
bool hasMeshProperty (const std::string &data_name) const
 
bool hasMeshProperty (const std::string &data_name) const
 
std::string meshPropertyName (const std::string &data_name) const
 
bool isCoupledScalar (const std::string &var_name, unsigned int i=0) const
 
unsigned int coupledScalarComponents (const std::string &var_name) const
 
unsigned int coupledScalar (const std::string &var_name, unsigned int comp=0) const
 
Order coupledScalarOrder (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarValue (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValueadCoupledScalarValue (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableValue< is_ad > & coupledGenericScalarValue (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableValue< false > & coupledGenericScalarValue (const std::string &var_name, const unsigned int comp) const
 
const GenericVariableValue< true > & coupledGenericScalarValue (const std::string &var_name, const unsigned int comp) const
 
const VariableValuecoupledVectorTagScalarValue (const std::string &var_name, TagID tag, unsigned int comp=0) const
 
const VariableValuecoupledMatrixTagScalarValue (const std::string &var_name, TagID tag, unsigned int comp=0) const
 
const VariableValuecoupledScalarValueOld (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarValueOlder (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarDot (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValueadCoupledScalarDot (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarDotDot (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarDotOld (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarDotDotOld (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarDotDu (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledScalarDotDotDu (const std::string &var_name, unsigned int comp=0) const
 
const MooseVariableScalargetScalarVar (const std::string &var_name, unsigned int comp) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level, const std::string &live_message, const bool print_dots=true) const
 
std::string timedSectionName (const std::string &section_name) const
 
virtual void checkMaterialProperty (const std::string &name, const unsigned int state)
 
void markMatPropRequested (const std::string &)
 
MaterialPropertyName getMaterialPropertyName (const std::string &name) const
 
void checkExecutionStage ()
 
Moose::StateArg determineState () const
 
const Moose::Functor< T > & getFunctor (const std::string &name)
 
const Moose::Functor< T > & getFunctor (const std::string &name, THREAD_ID tid)
 
const Moose::Functor< T > & getFunctor (const std::string &name, SubProblem &subproblem)
 
const Moose::Functor< T > & getFunctor (const std::string &name, SubProblem &subproblem, THREAD_ID tid)
 
bool isFunctor (const std::string &name) const
 
bool isFunctor (const std::string &name, const SubProblem &subproblem) const
 
Moose::ElemArg makeElemArg (const Elem *elem, bool correct_skewnewss=false) const
 
void checkFunctorSupportsSideIntegration (const std::string &name, bool qp_integration)
 
const T & getReporterValue (const std::string &param_name, const std::size_t time_index=0)
 
const T & getReporterValue (const std::string &param_name, ReporterMode mode, const std::size_t time_index=0)
 
const T & getReporterValue (const std::string &param_name, const std::size_t time_index=0)
 
const T & getReporterValue (const std::string &param_name, ReporterMode mode, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, ReporterMode mode, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, ReporterMode mode, const std::size_t time_index=0)
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
const GenericMaterialProperty< T, is_ad > * defaultGenericMaterialProperty (const std::string &name)
 
const GenericMaterialProperty< T, is_ad > * defaultGenericMaterialProperty (const std::string &name)
 
const MaterialProperty< T > * defaultMaterialProperty (const std::string &name)
 
const MaterialProperty< T > * defaultMaterialProperty (const std::string &name)
 
const ADMaterialProperty< T > * defaultADMaterialProperty (const std::string &name)
 
const ADMaterialProperty< T > * defaultADMaterialProperty (const std::string &name)
 
virtual GradientType evaluateGradDot (const ElemArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const FaceArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemSideQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemPointArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const NodeArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const FaceArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemSideQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemPointArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const NodeArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const FaceArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemSideQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const ElemPointArg &, const StateArg &) const
 
virtual GradientType evaluateGradDot (const NodeArg &, const StateArg &) const
 
bool checkVar (const std::string &var_name, unsigned int comp=0, unsigned int comp_bound=0) const
 
void validateExecutionerType (const std::string &name, const std::string &fn_name) const
 
virtual ValueType evaluate (const ElemArg &elem, const StateArg &state) const =0
 
virtual ValueType evaluate (const FaceArg &face, const StateArg &state) const =0
 
virtual ValueType evaluate (const ElemQpArg &qp, const StateArg &state) const =0
 
virtual ValueType evaluate (const ElemSideQpArg &side_qp, const StateArg &state) const =0
 
virtual ValueType evaluate (const ElemPointArg &elem_point, const StateArg &state) const =0
 
virtual ValueType evaluate (const NodeArg &node, const StateArg &state) const =0
 
virtual GradientType evaluateGradient (const ElemArg &, const StateArg &) const
 
virtual GradientType evaluateGradient (const FaceArg &, const StateArg &) const
 
virtual GradientType evaluateGradient (const ElemQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradient (const ElemSideQpArg &, const StateArg &) const
 
virtual GradientType evaluateGradient (const ElemPointArg &, const StateArg &) const
 
virtual GradientType evaluateGradient (const NodeArg &, const StateArg &) const
 
virtual DotType evaluateDot (const ElemArg &, const StateArg &) const
 
virtual DotType evaluateDot (const FaceArg &, const StateArg &) const
 
virtual DotType evaluateDot (const ElemQpArg &, const StateArg &) const
 
virtual DotType evaluateDot (const ElemSideQpArg &, const StateArg &) const
 
virtual DotType evaluateDot (const ElemPointArg &, const StateArg &) const
 
virtual DotType evaluateDot (const NodeArg &, const StateArg &) const
 
virtual void coupledCallback (const std::string &, bool) const
 
virtual bool isCoupled (const std::string &var_name, unsigned int i=0) const
 
virtual bool isCoupledConstant (const std::string &var_name) const
 
unsigned int coupledComponents (const std::string &var_name) const
 
VariableName coupledName (const std::string &var_name, unsigned int comp=0) const
 
std::vector< VariableName > coupledNames (const std::string &var_name) const
 
virtual unsigned int coupled (const std::string &var_name, unsigned int comp=0) const
 
std::vector< unsigned intcoupledIndices (const std::string &var_name) const
 
virtual const VariableValuecoupledValue (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledValues (const std::string &var_name) const
 
std::vector< const VectorVariableValue *> coupledVectorValues (const std::string &var_name) const
 
const GenericVariableValue< is_ad > & coupledGenericValue (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableValue< false > & coupledGenericValue (const std::string &var_name, unsigned int comp) const
 
const GenericVariableValue< true > & coupledGenericValue (const std::string &var_name, unsigned int comp) const
 
std::vector< const GenericVariableValue< is_ad > *> coupledGenericValues (const std::string &var_name) const
 
std::vector< const GenericVariableValue< false > *> coupledGenericValues (const std::string &var_name) const
 
std::vector< const GenericVariableValue< true > *> coupledGenericValues (const std::string &var_name) const
 
const GenericVariableValue< is_ad > & coupledGenericDofValue (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableValue< false > & coupledGenericDofValue (const std::string &var_name, unsigned int comp) const
 
const GenericVariableValue< true > & coupledGenericDofValue (const std::string &var_name, unsigned int comp) const
 
virtual const VariableValuecoupledValueLower (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValueadCoupledValue (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const ADVariableValue *> adCoupledValues (const std::string &var_name) const
 
const ADVariableValueadCoupledLowerValue (const std::string &var_name, unsigned int comp=0) const
 
const ADVectorVariableValueadCoupledVectorValue (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const ADVectorVariableValue *> adCoupledVectorValues (const std::string &var_name) const
 
virtual const VariableValuecoupledVectorTagValue (const std::string &var_names, TagID tag, unsigned int index=0) const
 
virtual const VariableValuecoupledVectorTagValue (const std::string &var_names, const std::string &tag_name, unsigned int index=0) const
 
std::vector< const VariableValue *> coupledVectorTagValues (const std::string &var_names, TagID tag) const
 
std::vector< const VariableValue *> coupledVectorTagValues (const std::string &var_names, const std::string &tag_name) const
 
virtual const ArrayVariableValuecoupledVectorTagArrayValue (const std::string &var_names, TagID tag, unsigned int index=0) const
 
virtual const ArrayVariableValuecoupledVectorTagArrayValue (const std::string &var_names, const std::string &tag_name, unsigned int index=0) const
 
std::vector< const ArrayVariableValue *> coupledVectorTagArrayValues (const std::string &var_names, TagID tag) const
 
std::vector< const ArrayVariableValue *> coupledVectorTagArrayValues (const std::string &var_names, const std::string &tag_name) const
 
virtual const VariableGradientcoupledVectorTagGradient (const std::string &var_names, TagID tag, unsigned int index=0) const
 
virtual const VariableGradientcoupledVectorTagGradient (const std::string &var_names, const std::string &tag_name, unsigned int index=0) const
 
std::vector< const VariableGradient *> coupledVectorTagGradients (const std::string &var_names, TagID tag) const
 
std::vector< const VariableGradient *> coupledVectorTagGradients (const std::string &var_names, const std::string &tag_name) const
 
virtual const ArrayVariableGradientcoupledVectorTagArrayGradient (const std::string &var_names, TagID tag, unsigned int index=0) const
 
virtual const ArrayVariableGradientcoupledVectorTagArrayGradient (const std::string &var_names, const std::string &tag_name, unsigned int index=0) const
 
std::vector< const ArrayVariableGradient *> coupledVectorTagArrayGradients (const std::string &var_names, TagID tag) const
 
std::vector< const ArrayVariableGradient *> coupledVectorTagArrayGradients (const std::string &var_names, const std::string &tag_name) const
 
virtual const VariableValuecoupledVectorTagDofValue (const std::string &var_name, TagID tag, unsigned int index=0) const
 
virtual const VariableValuecoupledVectorTagDofValue (const std::string &var_names, const std::string &tag_name, unsigned int index=0) const
 
const ArrayVariableValuecoupledVectorTagArrayDofValue (const std::string &var_name, const std::string &tag_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledVectorTagDofValues (const std::string &var_names, TagID tag) const
 
std::vector< const VariableValue *> coupledVectorTagDofValues (const std::string &var_names, const std::string &tag_name) const
 
virtual const VariableValuecoupledMatrixTagValue (const std::string &var_names, TagID tag, unsigned int index=0) const
 
virtual const VariableValuecoupledMatrixTagValue (const std::string &var_names, const std::string &tag_name, unsigned int index=0) const
 
std::vector< const VariableValue *> coupledMatrixTagValues (const std::string &var_names, TagID tag) const
 
std::vector< const VariableValue *> coupledMatrixTagValues (const std::string &var_names, const std::string &tag_name) const
 
virtual const VectorVariableValuecoupledVectorValue (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayValue (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const ArrayVariableValue *> coupledArrayValues (const std::string &var_name) const
 
MooseWritableVariablewritableVariable (const std::string &var_name, unsigned int comp=0)
 
virtual VariableValuewritableCoupledValue (const std::string &var_name, unsigned int comp=0)
 
void checkWritableVar (MooseWritableVariable *var)
 
virtual const VariableValuecoupledValueOld (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledValuesOld (const std::string &var_name) const
 
virtual const VariableValuecoupledValueOlder (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledValuesOlder (const std::string &var_name) const
 
virtual const VariableValuecoupledValuePreviousNL (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableValuecoupledVectorValueOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableValuecoupledVectorValueOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayValueOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayValueOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableGradientcoupledGradient (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableGradient *> coupledGradients (const std::string &var_name) const
 
const ADVariableGradientadCoupledGradient (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableGradientadCoupledGradientDot (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const ADVariableGradient *> adCoupledGradients (const std::string &var_name) const
 
const GenericVariableGradient< is_ad > & coupledGenericGradient (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableGradient< false > & coupledGenericGradient (const std::string &var_name, unsigned int comp) const
 
const GenericVariableGradient< true > & coupledGenericGradient (const std::string &var_name, unsigned int comp) const
 
std::vector< const GenericVariableGradient< is_ad > *> coupledGenericGradients (const std::string &var_name) const
 
std::vector< const GenericVariableGradient< false > *> coupledGenericGradients (const std::string &var_name) const
 
std::vector< const GenericVariableGradient< true > *> coupledGenericGradients (const std::string &var_name) const
 
const ADVectorVariableGradientadCoupledVectorGradient (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableSecondadCoupledSecond (const std::string &var_name, unsigned int comp=0) const
 
const ADVectorVariableSecondadCoupledVectorSecond (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableGradientcoupledGradientOld (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableGradient *> coupledGradientsOld (const std::string &var_name) const
 
virtual const VariableGradientcoupledGradientOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableGradientcoupledGradientPreviousNL (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableGradientcoupledGradientDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableGradientcoupledGradientDotDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableGradientcoupledVectorGradient (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableGradientcoupledVectorGradientOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableGradientcoupledVectorGradientOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableGradientcoupledArrayGradient (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableGradientcoupledArrayGradientOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableGradientcoupledArrayGradientOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableGradientcoupledArrayGradientDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableCurlcoupledCurl (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableCurlcoupledCurlOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableCurlcoupledCurlOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableSecondcoupledSecond (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableSecondcoupledSecondOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableSecondcoupledSecondOlder (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableSecondcoupledSecondPreviousNL (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledDot (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledDots (const std::string &var_name) const
 
virtual const VariableValuecoupledDotDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledDotDotOld (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValueadCoupledDot (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const ADVariableValue *> adCoupledDots (const std::string &var_name) const
 
const ADVariableValueadCoupledDotDot (const std::string &var_name, unsigned int comp=0) const
 
const ADVectorVariableValueadCoupledVectorDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableValuecoupledVectorDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableValuecoupledVectorDotDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableValuecoupledVectorDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VectorVariableValuecoupledVectorDotDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledVectorDotDu (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledVectorDotDotDu (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayDotDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const ArrayVariableValuecoupledArrayDotDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledDotDu (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledDotDotDu (const std::string &var_name, unsigned int comp=0) const
 
const VariableValuecoupledArrayDotDu (const std::string &var_name, unsigned int comp=0) const
 
const T & coupledNodalValue (const std::string &var_name, unsigned int comp=0) const
 
const Moose::ADType< T >::typeadCoupledNodalValue (const std::string &var_name, unsigned int comp=0) const
 
const T & coupledNodalValueOld (const std::string &var_name, unsigned int comp=0) const
 
const T & coupledNodalValueOlder (const std::string &var_name, unsigned int comp=0) const
 
const T & coupledNodalValuePreviousNL (const std::string &var_name, unsigned int comp=0) const
 
const T & coupledNodalDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledNodalDotDot (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledNodalDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledNodalDotDotOld (const std::string &var_name, unsigned int comp=0) const
 
virtual const VariableValuecoupledDofValues (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledAllDofValues (const std::string &var_name) const
 
virtual const VariableValuecoupledDofValuesOld (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledAllDofValuesOld (const std::string &var_name) const
 
virtual const VariableValuecoupledDofValuesOlder (const std::string &var_name, unsigned int comp=0) const
 
std::vector< const VariableValue *> coupledAllDofValuesOlder (const std::string &var_name) const
 
virtual const ArrayVariableValuecoupledArrayDofValues (const std::string &var_name, unsigned int comp=0) const
 
virtual const ADVariableValueadCoupledDofValues (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValueadZeroValue () const
 
const ADVariableGradientadZeroGradient () const
 
const ADVariableSecondadZeroSecond () const
 
const GenericVariableValue< is_ad > & genericZeroValue ()
 
const GenericVariableValue< false > & genericZeroValue ()
 
const GenericVariableValue< true > & genericZeroValue ()
 
const GenericVariableGradient< is_ad > & genericZeroGradient ()
 
const GenericVariableGradient< false > & genericZeroGradient ()
 
const GenericVariableGradient< true > & genericZeroGradient ()
 
const GenericVariableSecond< is_ad > & genericZeroSecond ()
 
const GenericVariableSecond< false > & genericZeroSecond ()
 
const GenericVariableSecond< true > & genericZeroSecond ()
 
const MooseVariableFieldBasegetFEVar (const std::string &var_name, unsigned int comp) const
 
const MooseVariableFieldBasegetFieldVar (const std::string &var_name, unsigned int comp) const
 
MooseVariableFieldBasegetFieldVar (const std::string &var_name, unsigned int comp)
 
const T * getVarHelper (const std::string &var_name, unsigned int comp) const
 
T * getVarHelper (const std::string &var_name, unsigned int comp)
 
MooseVariablegetVar (const std::string &var_name, unsigned int comp)
 
const MooseVariablegetVar (const std::string &var_name, unsigned int comp) const
 
VectorMooseVariablegetVectorVar (const std::string &var_name, unsigned int comp)
 
const VectorMooseVariablegetVectorVar (const std::string &var_name, unsigned int comp) const
 
ArrayMooseVariablegetArrayVar (const std::string &var_name, unsigned int comp)
 
const ArrayMooseVariablegetArrayVar (const std::string &var_name, unsigned int comp) const
 
std::vector< T > coupledVectorHelper (const std::string &var_name, const Func &func) const
 
void addMooseVariableDependency (MooseVariableFieldBase *var)
 
void addMooseVariableDependency (const std::vector< MooseVariableFieldBase * > &vars)
 
bool hasBoundaryMaterialPropertyHelper (const std::string &prop_name) const
 
void visitNodalNeighbors (const Node *node, FeatureData *feature, bool expand_halos_only)
 These two routines are utility routines used by the flood routine and by derived classes for visiting neighbors. More...
 
void visitElementalNeighbors (const Elem *elem, FeatureData *feature, bool expand_halos_only, bool disjoint_only)
 

Static Protected Member Functions

static std::string meshPropertyName (const std::string &data_name, const std::string &prefix)
 

Protected Attributes

const unsigned int _phase
 
const EBSDReader_ebsd_reader
 
const std::map< dof_id_type, std::vector< Real > > & _node_to_grain_weight_map
 
std::unique_ptr< DenseMatrix< Real > > _adjacency_matrix
 The dense adjacency matrix. More...
 
const unsigned int _dim
 mesh dimension More...
 
const unsigned int _op_num
 The maximum number of order parameters (colors) available to assign to the grain structure. More...
 
std::map< unsigned int, unsigned int_grain_to_op
 A map of the grain_id to op. More...
 
const MooseEnum _coloring_algorithm
 The selected graph coloring algorithm used by this object. More...
 
bool _colors_assigned
 A Boolean indicating whether the object has assigned colors to grains (internal use) More...
 
const bool _output_adjacency_matrix
 A user controllable Boolean which can be used to print the adjacency matrix to the console. More...
 
std::vector< MooseVariableFEBase * > _fe_vars
 The vector of coupled in variables. More...
 
std::vector< MooseVariable * > _vars
 The vector of coupled in variables cast to MooseVariable. More...
 
const DofMap & _dof_map
 Reference to the dof_map containing the coupled variables. More...
 
const Real _threshold
 The threshold above (or below) where an entity may begin a new region (feature) More...
 
Real _step_threshold
 
const Real _connecting_threshold
 The threshold above (or below) which neighboring entities are flooded (where regions can be extended but not started) More...
 
Real _step_connecting_threshold
 
MooseMesh_mesh
 A reference to the mesh. More...
 
unsigned long _var_number
 This variable is used to build the periodic node map. More...
 
const bool _single_map_mode
 This variable is used to indicate whether or not multiple maps are used during flooding. More...
 
const bool _condense_map_info
 
const bool _global_numbering
 This variable is used to indicate whether or not we identify features with unique numbers on multiple maps. More...
 
const bool _var_index_mode
 This variable is used to indicate whether the maps will contain unique region information or just the variable numbers owning those regions. More...
 
const bool _compute_halo_maps
 Indicates whether or not to communicate halo map information with all ranks. More...
 
const bool _compute_var_to_feature_map
 Indicates whether or not the var to feature map is populated. More...
 
const bool _use_less_than_threshold_comparison
 Use less-than when comparing values against the threshold value. More...
 
const std::size_t _n_vars
 
const std::size_t _maps_size
 Convenience variable holding the size of all the datastructures size by the number of maps. More...
 
const processor_id_type _n_procs
 Convenience variable holding the number of processors in this simulation. More...
 
std::vector< std::set< dof_id_type > > _entities_visited
 This variable keeps track of which nodes have been visited during execution. More...
 
std::vector< std::map< dof_id_type, int > > _var_index_maps
 This map keeps track of which variables own which nodes. More...
 
std::unordered_map< dof_id_type, std::vector< const Elem * > > _nodes_to_elem_map
 The data structure used to find neighboring elements give a node ID. More...
 
std::vector< unsigned int_feature_counts_per_map
 The number of features seen by this object per map. More...
 
unsigned int _feature_count
 The number of features seen by this object (same as summing _feature_counts_per_map) More...
 
std::vector< std::list< FeatureData > > _partial_feature_sets
 The data structure used to hold partial and communicated feature data, during the discovery and merging phases. More...
 
std::vector< FeatureData > & _feature_sets
 The data structure used to hold the globally unique features. More...
 
std::vector< FeatureData_volatile_feature_sets
 Derived objects (e.g. More...
 
std::vector< std::map< dof_id_type, int > > _feature_maps
 The feature maps contain the raw flooded node information and eventually the unique grain numbers. More...
 
std::vector< std::size_t > _local_to_global_feature_map
 The vector recording the local to global feature indices. More...
 
std::vector< std::size_t > _feature_id_to_local_index
 The vector recording the grain_id to local index (several indices will contain invalid_size_t) More...
 
PeriodicBoundaries * _pbs
 A pointer to the periodic boundary constraints object. More...
 
std::unique_ptr< PointLocatorBase > _point_locator
 
const PostprocessorValue_element_average_value
 Average value of the domain which can optionally be used to find features in a field. More...
 
std::map< dof_id_type, int_ghosted_entity_ids
 The map for holding reconstructed ghosted element information. More...
 
std::vector< std::map< dof_id_type, int > > _halo_ids
 The data structure for looking up halos around features. More...
 
std::multimap< dof_id_type, dof_id_type_periodic_node_map
 The data structure which is a list of nodes that are constrained to other nodes based on the imposed periodic boundary conditions. More...
 
std::unordered_set< dof_id_type_all_boundary_entity_ids
 The set of entities on the boundary of the domain used for determining if features intersect any boundary. More...
 
std::map< dof_id_type, std::vector< unsigned int > > _entity_var_to_features
 
std::vector< unsigned int_empty_var_to_features
 
std::vector< BoundaryID_primary_perc_bnds
 
std::vector< BoundaryID_secondary_perc_bnds
 
std::vector< BoundaryID_specified_bnds
 
const bool _is_elemental
 Determines if the flood counter is elements or not (nodes) More...
 
bool _is_boundary_restricted
 Indicates that this object should only run on one or more boundaries. More...
 
ConstBndElemRange_bnd_elem_range
 Boundary element range pointer. More...
 
const bool _is_primary
 Convenience variable for testing primary rank. More...
 
SubProblem_subproblem
 
FEProblemBase_fe_problem
 
SystemBase_sys
 
const THREAD_ID _tid
 
Assembly_assembly
 
const Moose::CoordinateSystemType_coord_sys
 
const bool _duplicate_initial_execution
 
std::set< std::string > _depend_uo
 
const bool & _enabled
 
MooseApp_app
 
const std::string _type
 
const std::string _name
 
const InputParameters_pars
 
Factory_factory
 
ActionFactory_action_factory
 
const ExecFlagEnum_execute_enum
 
const ExecFlagType_current_execute_flag
 
MooseApp_restartable_app
 
const std::string _restartable_system_name
 
const THREAD_ID _restartable_tid
 
const bool _restartable_read_only
 
FEProblemBase_mci_feproblem
 
FEProblemBase_sc_fe_problem
 
const THREAD_ID _sc_tid
 
const Real_real_zero
 
const VariableValue_scalar_zero
 
const Point & _point_zero
 
MooseApp_pg_moose_app
 
const std::string _prefix
 
const InputParameters_mi_params
 
const std::string _mi_name
 
const MooseObjectName _mi_moose_object_name
 
FEProblemBase_mi_feproblem
 
SubProblem_mi_subproblem
 
const THREAD_ID _mi_tid
 
const Moose::MaterialDataType _material_data_type
 
MaterialData_material_data
 
bool _stateful_allowed
 
bool _get_material_property_called
 
std::vector< std::unique_ptr< PropertyValue > > _default_properties
 
std::unordered_set< unsigned int_material_property_dependencies
 
const MaterialPropertyName _get_suffix
 
const bool _use_interpolated_state
 
const InputParameters_ti_params
 
FEProblemBase_ti_feproblem
 
bool _is_implicit
 
Real_t
 
int_t_step
 
Real_dt
 
Real_dt_old
 
bool _is_transient
 
const std::string & _pp_name
 
const PostprocessorValue_current_value
 
const Parallel::Communicator & _communicator
 
std::unordered_map< std::string, std::vector< std::unique_ptr< VariableValue > > > _default_value
 
const InputParameters_c_parameters
 
const std::string & _c_name
 
const std::string & _c_type
 
FEProblemBase_c_fe_problem
 
const SystemBase *const _c_sys
 
std::unordered_map< std::string, std::vector< MooseVariableFieldBase *> > _coupled_vars
 
std::vector< MooseVariableFieldBase *> _coupled_moose_vars
 
std::vector< MooseVariable *> _coupled_standard_moose_vars
 
std::vector< VectorMooseVariable *> _coupled_vector_moose_vars
 
std::vector< ArrayMooseVariable *> _coupled_array_moose_vars
 
std::vector< MooseVariableFV< Real > *> _coupled_standard_fv_moose_vars
 
const std::unordered_map< std::string, std::string > & _new_to_deprecated_coupled_vars
 
bool _c_nodal
 
bool _c_is_implicit
 
const bool _c_allow_element_to_nodal_coupling
 
THREAD_ID _c_tid
 
std::unordered_map< std::string, std::unique_ptr< MooseArray< DualReal > > > _ad_default_value
 
std::unordered_map< std::string, std::unique_ptr< VectorVariableValue > > _default_vector_value
 
std::unordered_map< std::string, std::unique_ptr< ArrayVariableValue > > _default_array_value
 
std::unordered_map< std::string, std::unique_ptr< MooseArray< ADRealVectorValue > > > _ad_default_vector_value
 
VariableValue _default_value_zero
 
VariableGradient _default_gradient
 
MooseArray< ADRealVectorValue_ad_default_gradient
 
MooseArray< ADRealTensorValue_ad_default_vector_gradient
 
VariableSecond _default_second
 
MooseArray< ADRealTensorValue_ad_default_second
 
const VariableValue_zero
 
const VariablePhiValue_phi_zero
 
const MooseArray< DualReal > & _ad_zero
 
const VariableGradient_grad_zero
 
const MooseArray< ADRealVectorValue > & _ad_grad_zero
 
const VariablePhiGradient_grad_phi_zero
 
const VariableSecond_second_zero
 
const MooseArray< ADRealTensorValue > & _ad_second_zero
 
const VariablePhiSecond_second_phi_zero
 
const VectorVariableValue_vector_zero
 
const VectorVariableCurl_vector_curl_zero
 
VectorVariableValue _default_vector_value_zero
 
VectorVariableGradient _default_vector_gradient
 
VectorVariableCurl _default_vector_curl
 
ArrayVariableValue _default_array_value_zero
 
ArrayVariableGradient _default_array_gradient
 
ArrayVariableCurl _default_array_curl
 
bool _coupleable_neighbor
 

Static Protected Attributes

static const unsigned int INVALID_COLOR
 Used to indicate an invalid coloring for the built-in back-tracking algorithm. More...
 
static const unsigned int HALO_THICKNESS = 4
 Used to hold the thickness of the halo that should be constructed for detecting adjacency. More...
 
static const std::string _interpolated_old
 
static const std::string _interpolated_older
 

Detailed Description

Definition at line 17 of file PolycrystalEBSD.h.

Member Enumeration Documentation

◆ BoundaryIntersection

enum FeatureFloodCount::BoundaryIntersection : unsigned char
stronginherited

This enumeration is used to inidacate status of boundary intersections.

Enumerator
NONE 
ANY_BOUNDARY 
PRIMARY_PERCOLATION_BOUNDARY 
SECONDARY_PERCOLATION_BOUNDARY 
SPECIFIED_BOUNDARY 

Definition at line 129 of file FeatureFloodCount.h.

129  : unsigned char
130  {
131  NONE = 0x0,
132  ANY_BOUNDARY = 0x1,
133  PRIMARY_PERCOLATION_BOUNDARY = 0x2,
134  SECONDARY_PERCOLATION_BOUNDARY = 0x4,
135  SPECIFIED_BOUNDARY = 0x8
136  };
NONE

◆ FieldType

enum FeatureFloodCount::FieldType
stronginherited
Enumerator
UNIQUE_REGION 
VARIABLE_COLORING 
GHOSTED_ENTITIES 
HALOS 
CENTROID 
ACTIVE_BOUNDS 
INTERSECTS_SPECIFIED_BOUNDARY 

Definition at line 102 of file FeatureFloodCount.h.

103  {
104  UNIQUE_REGION,
105  VARIABLE_COLORING,
106  GHOSTED_ENTITIES,
107  HALOS,
108  CENTROID,
109  ACTIVE_BOUNDS,
110  INTERSECTS_SPECIFIED_BOUNDARY,
111  };

◆ Status

enum FeatureFloodCount::Status : unsigned char
stronginherited

This enumeration is used to indicate status of the grains in the _unique_grains data structure.

Enumerator
CLEAR 
MARKED 
DIRTY 
INACTIVE 

Definition at line 120 of file FeatureFloodCount.h.

120  : unsigned char
121  {
122  CLEAR = 0x0,
123  MARKED = 0x1,
124  DIRTY = 0x2,
125  INACTIVE = 0x4
126  };

Constructor & Destructor Documentation

◆ PolycrystalEBSD()

PolycrystalEBSD::PolycrystalEBSD ( const InputParameters parameters)

Definition at line 25 of file PolycrystalEBSD.C.

27  _phase(isParamValid("phase") ? getParam<unsigned int>("phase") : libMesh::invalid_uint),
28  _ebsd_reader(getUserObject<EBSDReader>("ebsd_reader")),
30 {
31 }
const unsigned int invalid_uint
PolycrystalUserObjectBase(const InputParameters &parameters)
const unsigned int _phase
const std::map< dof_id_type, std::vector< Real > > & _node_to_grain_weight_map
const EBSDReader & _ebsd_reader
bool isParamValid(const std::string &name) const
const std::map< dof_id_type, std::vector< Real > > & getNodeToGrainWeightMap() const
Returns a map consisting of the node index followd by a vector of all grain weights for that node...
Definition: EBSDReader.C:437
const InputParameters & parameters() const

Member Function Documentation

◆ appendPeriodicNeighborNodes()

void FeatureFloodCount::appendPeriodicNeighborNodes ( FeatureData feature) const
protectedinherited

This routine adds the periodic node information to our data structure prior to packing the data this makes those periodic neighbors appear much like ghosted nodes in a multiprocessor setting.

Definition at line 1819 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::prepareDataForTransfer().

1820 {
1821  if (_is_elemental)
1822  {
1823  for (auto entity : feature._local_ids)
1824  {
1825  Elem * elem = _mesh.elemPtr(entity);
1826 
1827  for (const auto node_n : make_range(elem->n_nodes()))
1828  {
1829  auto iters = _periodic_node_map.equal_range(elem->node_id(node_n));
1830 
1831  for (auto it = iters.first; it != iters.second; ++it)
1832  {
1833  feature._periodic_nodes.insert(feature._periodic_nodes.end(), it->first);
1834  feature._periodic_nodes.insert(feature._periodic_nodes.end(), it->second);
1835  }
1836  }
1837  }
1838  }
1839  else
1840  {
1841  for (auto entity : feature._local_ids)
1842  {
1843  auto iters = _periodic_node_map.equal_range(entity);
1844 
1845  for (auto it = iters.first; it != iters.second; ++it)
1846  {
1847  feature._periodic_nodes.insert(feature._periodic_nodes.end(), it->first);
1848  feature._periodic_nodes.insert(feature._periodic_nodes.end(), it->second);
1849  }
1850  }
1851  }
1852 
1853  // TODO: Remove duplicates
1854 }
std::multimap< dof_id_type, dof_id_type > _periodic_node_map
The data structure which is a list of nodes that are constrained to other nodes based on the imposed ...
virtual Elem * elemPtr(const dof_id_type i)
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
IntRange< T > make_range(T beg, T end)
MooseMesh & _mesh
A reference to the mesh.

◆ areFeaturesMergeable()

bool PolycrystalUserObjectBase::areFeaturesMergeable ( const FeatureData f1,
const FeatureData f2 
) const
overrideprotectedvirtualinherited

Method for determining whether two features are mergeable.

This routine exists because derived classes may need to override this function rather than use the mergeable method in the FeatureData object.

Reimplemented from FeatureFloodCount.

Definition at line 496 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::mergeSets().

498 {
499  if (f1._id != f2._id)
500  return false;
501 
502  mooseAssert(f1._var_index == f2._var_index, "Feature should be mergeable but aren't");
503  return true;
504 }

◆ assignOpsToGrains()

void PolycrystalUserObjectBase::assignOpsToGrains ( )
protectedinherited

Method that runs a coloring algorithm to assign OPs to grains.

Now we have a vector giving us a coloring based on the indices in our features, but we need to build a map in case our features have non-contiguous IDs.

Definition at line 528 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::finalize().

529 {
530  mooseAssert(_is_primary, "This routine should only be called on the primary rank");
531 
532  TIME_SECTION("assignOpsToGrains", 2, "Assigning OPs to grains");
533 
534  // Use a simple backtracking coloring algorithm
535  if (_coloring_algorithm == "bt")
536  {
537  paramInfo("coloring_algorithm",
538  "The backtracking algorithm has exponential complexity. If you are using very few "
539  "order parameters,\nor you have several hundred grains or more, you should use one "
540  "of the PETSc coloring algorithms such as \"jp\".");
541 
542  if (!colorGraph(0))
543  paramError("op_num",
544  "Unable to find a valid grain to op coloring, Make sure you have created enough "
545  "variables to hold a\nvalid polycrystal initial condition (no grains represented "
546  "by the same variable should be allowed to\ntouch, ~8 for 2D, ~25 for 3D)?");
547  }
548  else // PETSc Coloring algorithms
549  {
550  const std::string & ca_str = _coloring_algorithm;
551  Real * am_data = _adjacency_matrix->get_values().data();
552 
553  try
554  {
556  am_data, _feature_count, _vars.size(), _grain_idx_to_op, ca_str.c_str());
557  }
558  catch (std::runtime_error & e)
559  {
560  paramError("op_num",
561  "Unable to find a valid grain to op coloring, Make sure you have created enough "
562  "variables to hold a\nvalid polycrystal initial condition (no grains represented "
563  "by the same variable should be allowed to\ntouch, ~8 for 2D, ~25 for 3D)?");
564  }
565  }
566 
571  mooseAssert(_grain_to_op.empty(), "grain_to_op data structure should be empty here");
572  for (MooseIndex(_grain_idx_to_op) i = 0; i < _grain_idx_to_op.size(); ++i)
573  _grain_to_op.emplace_hint(_grain_to_op.end(), _feature_sets[i]._id, _grain_idx_to_op[i]);
574 }
std::unique_ptr< DenseMatrix< Real > > _adjacency_matrix
The dense adjacency matrix.
std::map< unsigned int, unsigned int > _grain_to_op
A map of the grain_id to op.
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
const bool _is_primary
Convenience variable for testing primary rank.
std::vector< MooseVariable * > _vars
The vector of coupled in variables cast to MooseVariable.
void paramError(const std::string &param, Args... args) const
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
std::vector< unsigned int > _grain_idx_to_op
A vector indicating which op is assigned to each grain (by index of the grain)
bool colorGraph(unsigned int vertex)
Built-in simple "back-tracking" algorithm to assign colors to a graph.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void colorAdjacencyMatrix(PetscScalar *adjacency_matrix, unsigned int size, unsigned int colors, std::vector< unsigned int > &vertex_colors, const char *coloring_algorithm)
void paramInfo(const std::string &param, Args... args) const
const MooseEnum _coloring_algorithm
The selected graph coloring algorithm used by this object.

◆ buildFeatureIdToLocalIndices()

void FeatureFloodCount::buildFeatureIdToLocalIndices ( unsigned int  max_id)
protectedinherited

This method builds a lookup map for retrieving the right local feature (by index) given a global index or id.

max_id is passed to size the vector properly and may or may not be a globally consistent number. The assumption is that any id that is later queried from this object that is higher simply doesn't exist on the local processor.

Definition at line 660 of file FeatureFloodCount.C.

Referenced by GrainTracker::assignGrains(), FeatureFloodCount::scatterAndUpdateRanks(), and GrainTracker::trackGrains().

661 {
662  _feature_id_to_local_index.assign(max_id + 1, invalid_size_t);
663  for (const auto feature_index : index_range(_feature_sets))
664  {
665  if (_feature_sets[feature_index]._status != Status::INACTIVE)
666  {
667  mooseAssert(_feature_sets[feature_index]._id <= max_id,
668  "Feature ID out of range(" << _feature_sets[feature_index]._id << ')');
669  _feature_id_to_local_index[_feature_sets[feature_index]._id] = feature_index;
670  }
671  }
672 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
std::vector< std::size_t > _feature_id_to_local_index
The vector recording the grain_id to local index (several indices will contain invalid_size_t) ...
auto index_range(const T &sizable)

◆ buildGrainAdjacencyMatrix()

void PolycrystalUserObjectBase::buildGrainAdjacencyMatrix ( )
protectedinherited

Builds a dense adjacency matrix based on the discovery of grain neighbors and halos surrounding each grain.

Definition at line 507 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::finalize().

508 {
509  mooseAssert(_is_primary, "This routine should only be called on the primary rank");
510 
511  _adjacency_matrix = std::make_unique<DenseMatrix<Real>>(_feature_count, _feature_count);
512  for (MooseIndex(_feature_sets) i = 0; i < _feature_sets.size(); ++i)
513  {
514  for (MooseIndex(_feature_sets) j = i + 1; j < _feature_sets.size(); ++j)
515  {
516  if (_feature_sets[i].boundingBoxesIntersect(_feature_sets[j]) &&
517  _feature_sets[i].halosIntersect(_feature_sets[j]))
518  {
519  // Our grain adjacency matrix is symmetrical
520  (*_adjacency_matrix)(i, j) = 1;
521  (*_adjacency_matrix)(j, i) = 1;
522  }
523  }
524  }
525 }
std::unique_ptr< DenseMatrix< Real > > _adjacency_matrix
The dense adjacency matrix.
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
const bool _is_primary
Convenience variable for testing primary rank.
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")

◆ buildLocalToGlobalIndices()

void FeatureFloodCount::buildLocalToGlobalIndices ( std::vector< std::size_t > &  local_to_global_all,
std::vector< int > &  counts 
) const
protectedvirtualinherited

This routine populates a stacked vector of local to global indices per rank and the associated count vector for scattering the vector to the ranks.

The individual vectors can be different sizes. The ith vector will be distributed to the ith processor including the primary rank. e.g. [ ... n_0 ] [ ... n_1 ] ... [ ... n_m ]

It is intended to be overridden in derived classes.

Definition at line 614 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::scatterAndUpdateRanks().

616 {
617  mooseAssert(_is_primary, "This method must only be called on the root processor");
618 
619  counts.assign(_n_procs, 0);
620  // Now size the individual counts vectors based on the largest index seen per processor
621  for (const auto & feature : _feature_sets)
622  for (const auto & local_index_pair : feature._orig_ids)
623  {
624  // local_index_pair.first = ranks, local_index_pair.second = local_index
625  mooseAssert(local_index_pair.first < _n_procs, "Processor ID is out of range");
626  if (local_index_pair.second >= static_cast<std::size_t>(counts[local_index_pair.first]))
627  counts[local_index_pair.first] = local_index_pair.second + 1;
628  }
629 
630  // Build the offsets vector
631  unsigned int globalsize = 0;
632  std::vector<int> offsets(_n_procs); // Type is signed for use with the MPI API
633  for (const auto i : index_range(offsets))
634  {
635  offsets[i] = globalsize;
636  globalsize += counts[i];
637  }
638 
639  // Finally populate the primary vector
640  local_to_global_all.resize(globalsize, FeatureFloodCount::invalid_size_t);
641  for (const auto & feature : _feature_sets)
642  {
643  // Get the local indices from the feature and build a map
644  for (const auto & local_index_pair : feature._orig_ids)
645  {
646  auto rank = local_index_pair.first;
647  mooseAssert(rank < _n_procs, rank << ", " << _n_procs);
648 
649  auto local_index = local_index_pair.second;
650  auto stacked_local_index = offsets[rank] + local_index;
651 
652  mooseAssert(stacked_local_index < globalsize,
653  "Global index: " << stacked_local_index << " is out of range");
654  local_to_global_all[stacked_local_index] = feature._id;
655  }
656  }
657 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
const bool _is_primary
Convenience variable for testing primary rank.
const processor_id_type _n_procs
Convenience variable holding the number of processors in this simulation.
auto index_range(const T &sizable)

◆ clearDataStructures()

void FeatureFloodCount::clearDataStructures ( )
protectedvirtualinherited

Helper routine for clearing up data structures during initialize and prior to parallel communication.

Definition at line 316 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::communicateAndMerge().

317 {
318 }

◆ colorGraph()

bool PolycrystalUserObjectBase::colorGraph ( unsigned int  vertex)
protectedinherited

Built-in simple "back-tracking" algorithm to assign colors to a graph.

Definition at line 577 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::assignOpsToGrains().

578 {
579  // Base case: All grains are assigned
580  if (vertex == _feature_count)
581  return true;
582 
583  // Consider this grain and try different ops
584  for (unsigned int color_idx = 0; color_idx < _op_num; ++color_idx)
585  {
586  // We'll try to spread these colors around a bit rather than
587  // packing them all on the first few colors if we have several colors.
588  unsigned int color = (vertex + color_idx) % _op_num;
589 
590  if (isGraphValid(vertex, color))
591  {
592  _grain_idx_to_op[vertex] = color;
593 
594  if (colorGraph(vertex + 1))
595  return true;
596 
597  // Backtrack...
599  }
600  }
601 
602  return false;
603 }
const unsigned int _op_num
The maximum number of order parameters (colors) available to assign to the grain structure.
bool isGraphValid(unsigned int vertex, unsigned int color)
Helper method for the back-tracking graph coloring algorithm.
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
std::vector< unsigned int > _grain_idx_to_op
A vector indicating which op is assigned to each grain (by index of the grain)
bool colorGraph(unsigned int vertex)
Built-in simple "back-tracking" algorithm to assign colors to a graph.
static const unsigned int INVALID_COLOR
Used to indicate an invalid coloring for the built-in back-tracking algorithm.

◆ coloringAlgorithmDescriptions()

std::string PolycrystalUserObjectBase::coloringAlgorithmDescriptions ( )
staticinherited

Returns corresponding descriptions of available coloring algorithms.

Definition at line 639 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::validParams().

640 {
641  return "The grain neighbor graph coloring algorithm to use: \"jp\" (DEFAULT) Jones and "
642  "Plassmann, an efficient coloring algorithm, \"power\" an alternative stochastic "
643  "algorithm, \"greedy\", a greedy assignment algorithm with stochastic updates to "
644  "guarantee a valid coloring, \"bt\", a back tracking algorithm that produces good "
645  "distributions but may experience exponential run time in the worst case scenario "
646  "(works well on medium to large 2D problems)";
647 }

◆ coloringAlgorithms()

MooseEnum PolycrystalUserObjectBase::coloringAlgorithms ( )
staticinherited

Definition at line 633 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::validParams().

634 {
635  return MooseEnum("jp power greedy bt", "jp");
636 }

◆ communicateAndMerge()

void FeatureFloodCount::communicateAndMerge ( )
protectedinherited

This routine handles all of the serialization, communication and deserialization of the data structures containing FeatureData objects.

The libMesh packed range routines handle the communication of the individual string buffers. Here we need to create a container to hold our type to serialize. It'll always be size one because we are sending a single byte stream of all the data to other processors. The stream need not be the same size on all processors.

Additionally we need to create a different container to hold the received byte buffers. The container type need not match the send container type. However, We do know the number of incoming buffers (num processors) so we'll go ahead and use a vector.

When we distribute merge work, we are reducing computational work by adding more communication. Each of the first _n_vars processors will receive one variable worth of information to merge. After each of those processors has merged that information, it'll be sent to the primary processor where final consolidation will occur.

Send the data from all processors to the first 'n_merging_procs' processors to create a complete global feature maps for each variable.

A call to gather_packed_range seems to populate the receiving buffer on all processors, not just the receiving buffer on the actual receiving processor. If we plan to call this function repeatedly, we must clear the buffers each time on all non-receiving processors. On the actual receiving processor, we'll save off the buffer for use later.

The FeatureFloodCount and derived objects rely on having the original data structures intact on all non-zero ranks. This is because local-only information (local entities) is never communicated and thus must remain intact. However, the distributed merging will destroy that information. The easiest thing to do is to swap out the data structure while we perform the distributed merge work.

Send the data from the merging processors to the root to create a complete global feature map.

Send the data from all processors to the root to create a complete global feature map.

Definition at line 403 of file FeatureFloodCount.C.

Referenced by GrainTracker::finalize(), and FeatureFloodCount::finalize().

404 {
405  TIME_SECTION("communicateAndMerge", 3, "Communicating and Merging");
406 
407  // First we need to transform the raw data into a usable data structure
409 
417  std::vector<std::string> send_buffers(1);
418 
425  std::vector<std::string> recv_buffers, deserialize_buffers;
426 
433  const auto n_merging_procs = numberOfDistributedMergeHelpers();
434 
435  if (n_merging_procs > 1)
436  {
437  auto rank = processor_id();
438  bool is_merging_processor = rank < n_merging_procs;
439 
440  if (is_merging_processor)
441  recv_buffers.reserve(_app.n_processors());
442 
443  for (const auto i : make_range(n_merging_procs))
444  {
445  serialize(send_buffers[0], i);
446 
452  (void *)(nullptr),
453  send_buffers.begin(),
454  send_buffers.end(),
455  std::back_inserter(recv_buffers));
456 
463  if (rank == i)
464  recv_buffers.swap(deserialize_buffers);
465  else
466  recv_buffers.clear();
467  }
468 
469  // Setup a new communicator for doing merging communication operations
470  Parallel::Communicator merge_comm;
471 
472  _communicator.split(is_merging_processor ? 0 : MPI_UNDEFINED, rank, merge_comm);
473 
474  if (is_merging_processor)
475  {
483  std::vector<std::list<FeatureData>> tmp_data(_partial_feature_sets.size());
484  tmp_data.swap(_partial_feature_sets);
485 
486  deserialize(deserialize_buffers, processor_id());
487 
488  send_buffers[0].clear();
489  recv_buffers.clear();
490  deserialize_buffers.clear();
491 
492  // Merge one variable's worth of data
493  mergeSets();
494 
495  // Now we need to serialize again to send to the primary (only the processors who did work)
496  serialize(send_buffers[0]);
497 
498  // Free up as much memory as possible here before we do global communication
500 
505  merge_comm.gather_packed_range(0,
506  (void *)(nullptr),
507  send_buffers.begin(),
508  send_buffers.end(),
509  std::back_inserter(recv_buffers));
510 
511  if (_is_primary)
512  {
513  // The root process now needs to deserialize all of the data
514  deserialize(recv_buffers);
515 
516  send_buffers[0].clear();
517  recv_buffers.clear();
518 
519  consolidateMergedFeatures(&tmp_data);
520  }
521  else
522  // Restore our original data on non-zero ranks
523  tmp_data.swap(_partial_feature_sets);
524  }
525  }
526 
527  // Serialized merging (primary does all the work)
528  else
529  {
530  if (_is_primary)
531  recv_buffers.reserve(_app.n_processors());
532 
533  serialize(send_buffers[0]);
534 
535  // Free up as much memory as possible here before we do global communication
537 
543  (void *)(nullptr),
544  send_buffers.begin(),
545  send_buffers.end(),
546  std::back_inserter(recv_buffers));
547 
548  if (_is_primary)
549  {
550  // The root process now needs to deserialize all of the data
551  deserialize(recv_buffers);
552  recv_buffers.clear();
553 
554  mergeSets();
555 
557  }
558  }
559 
560  if (!_is_primary)
562 
563  // Make sure that feature count is communicated to all ranks
565 }
void gather_packed_range(const unsigned int root_id, Context *context, Iter range_begin, const Iter range_end, OutputIter out, std::size_t approx_buffer_size=1000000) const
void serialize(std::string &serialized_buffer, unsigned int var_num=invalid_id)
This routines packs the _partial_feature_sets data into a structure suitable for parallel communicati...
const bool _is_primary
Convenience variable for testing primary rank.
const Parallel::Communicator & _communicator
virtual void consolidateMergedFeatures(std::vector< std::list< FeatureData >> *saved_data=nullptr)
This method consolidates all of the merged information from _partial_feature_sets into the _feature_s...
processor_id_type n_processors() const
virtual void clearDataStructures()
Helper routine for clearing up data structures during initialize and prior to parallel communication...
virtual processor_id_type numberOfDistributedMergeHelpers() const
Returns a number indicating the number of merge helpers when running in parallel based on certain imp...
void split(int color, int key, Communicator &target) const
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
virtual void mergeSets()
This routine is called on the primary rank only and stitches together the partial feature pieces seen...
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
virtual void restoreOriginalDataStructures(std::vector< std::list< FeatureData >> &)
IntRange< T > make_range(T beg, T end)
void deserialize(std::vector< std::string > &serialized_buffers, unsigned int var_num=invalid_id)
This routine takes the vector of byte buffers (one for each processor), deserializes them into a seri...
processor_id_type processor_id() const
virtual void prepareDataForTransfer()
This routine uses the local flooded data to build up the local feature data structures (_partial feat...

◆ compareValueWithThreshold()

bool FeatureFloodCount::compareValueWithThreshold ( Real  entity_value,
Real  threshold 
) const
protectedinherited

This method is used to determine whether the current entity value is part of a feature or not.

Comparisons can either be greater than or less than the threshold which is controlled via input parameter.

Definition at line 1451 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::isNewFeatureOrConnectedRegion().

1452 {
1453  return ((_use_less_than_threshold_comparison && (entity_value >= threshold)) ||
1454  (!_use_less_than_threshold_comparison && (entity_value <= threshold)));
1455 }
const bool _use_less_than_threshold_comparison
Use less-than when comparing values against the threshold value.

◆ consolidateMergedFeatures()

void FeatureFloodCount::consolidateMergedFeatures ( std::vector< std::list< FeatureData >> *  saved_data = nullptr)
protectedvirtualinherited

This method consolidates all of the merged information from _partial_feature_sets into the _feature_sets vectors.

Now that the merges are complete we need to adjust the centroid, and halos. Additionally, To make several of the sorting and tracking algorithms more straightforward, we will move the features into a flat vector. Finally we can count the final number of features and find the max local index seen on any processor

Note: This is all occurring on rank 0 only!

IMPORTANT: FeatureFloodCount::_feature_count is set on rank 0 at this point but we can't broadcast it here because this routine is not collective.

Definition at line 1193 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::communicateAndMerge().

1194 {
1195  TIME_SECTION("consolidateMergedFeatures", 3, "Consolidating Merged Features");
1196 
1205  mooseAssert(_is_primary,
1206  "cosolidateMergedFeatures() may only be called on the primary processor");
1207  mooseAssert(saved_data == nullptr || saved_data->size() == _partial_feature_sets.size(),
1208  "Data structure size mismatch");
1209 
1210  // Offset where the current set of features with the same variable id starts in the flat vector
1211  unsigned int feature_offset = 0;
1212  // Set the member feature count to zero and start counting the actual features
1213  _feature_count = 0;
1214  for (const auto map_num : index_range(_partial_feature_sets))
1215  {
1216  for (auto & feature : _partial_feature_sets[map_num])
1217  {
1218  if (saved_data)
1219  {
1220  for (auto it = (*saved_data)[map_num].begin(); it != (*saved_data)[map_num].end();
1221  /* no increment */)
1222  {
1223  if (feature.canConsolidate(*it))
1224  {
1225  feature.consolidate(std::move(*it));
1226  it = (*saved_data)[map_num].erase(it); // increment
1227  }
1228  else
1229  ++it;
1230  }
1231  }
1232 
1233  // If after merging we still have an inactive feature, discard it
1234  if (feature._status == Status::CLEAR)
1235  {
1236  // First we need to calculate the centroid now that we are doing merging all partial
1237  // features
1238  if (feature._vol_count != 0)
1239  feature._centroid /= feature._vol_count;
1240 
1241  _feature_sets.emplace_back(std::move(feature));
1242  ++_feature_count;
1243  }
1244  }
1245 
1246  // Record the feature numbers just for the current map
1247  _feature_counts_per_map[map_num] = _feature_count - feature_offset;
1248 
1249  // Now update the running feature count so we can calculate the next map's contribution
1250  feature_offset = _feature_count;
1251 
1252  // Clean up the "moved" objects
1253  _partial_feature_sets[map_num].clear();
1254  if (saved_data)
1255  (*saved_data)[map_num].clear();
1256  }
1257 
1258  // We may have resided our data structures for the communicateAndMerge step. We'll restore the
1259  // original size here just in case we need to loop over the assumed size (i.e. _maps_size)
1260  // elsewhere in this or derived objects.
1261  if (_partial_feature_sets.size() != _maps_size)
1262  {
1264 
1267  }
1268 
1273 }
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
const bool _is_primary
Convenience variable for testing primary rank.
const std::size_t _maps_size
Convenience variable holding the size of all the datastructures size by the number of maps...
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
std::vector< unsigned int > _feature_counts_per_map
The number of features seen by this object per map.
auto index_range(const T &sizable)

◆ deserialize()

void FeatureFloodCount::deserialize ( std::vector< std::string > &  serialized_buffers,
unsigned int  var_num = invalid_id 
)
protectedinherited

This routine takes the vector of byte buffers (one for each processor), deserializes them into a series of FeatureSet objects, and appends them to the _feature_sets data structure.

Note: It is assumed that local processor information may already be stored in the _feature_sets data structure so it is not cleared before insertion.

Usually we have the local processor data already in the _partial_feature_sets data structure. However, if we are doing distributed merge work, we also need to preserve all of the original data for use in later stages of the algorithm so it'll have been swapped out with clean buffers. This leaves us a choice, either we just duplicate the Features from the original data structure after we've swapped out the buffer, or we go ahead and unpack data that we would normally already have. So during distributed merging, that's exactly what we'll do. Later however when the primary is doing the final consolidating, we'll opt to just skip the local unpacking. To tell the difference, between these two modes, we just need to see if a var_num was passed in.

Definition at line 1103 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::communicateAndMerge().

1104 {
1105  // The input string stream used for deserialization
1106  std::istringstream iss;
1107 
1108  auto rank = processor_id();
1109 
1110  for (const auto proc_id : index_range(serialized_buffers))
1111  {
1123  if (var_num == invalid_id && proc_id == rank)
1124  continue;
1125 
1126  iss.str(serialized_buffers[proc_id]); // populate the stream with a new buffer
1127  iss.clear(); // reset the string stream state
1128 
1129  // Load the gathered data into the data structure.
1130  if (var_num == invalid_id)
1131  dataLoad(iss, _partial_feature_sets, this);
1132  else
1133  dataLoad(iss, _partial_feature_sets[var_num], this);
1134  }
1135 }
void dataLoad(std::istream &stream, FeatureFloodCount::FeatureData &feature, void *context)
static const unsigned int invalid_id
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
processor_id_type processor_id() const
auto index_range(const T &sizable)

◆ doesFeatureIntersectBoundary()

bool FeatureFloodCount::doesFeatureIntersectBoundary ( unsigned int  feature_id) const
virtualinherited

Returns a Boolean indicating whether this feature intersects any boundary.

Reimplemented in GrainTracker, and FauxGrainTracker.

Definition at line 843 of file FeatureFloodCount.C.

Referenced by FeatureVolumeVectorPostprocessor::execute().

844 {
845  // Some processors don't contain the largest feature id, in that case we just return invalid_id
846  if (feature_id >= _feature_id_to_local_index.size())
847  return false;
848 
849  auto local_index = _feature_id_to_local_index[feature_id];
850 
851  if (local_index != invalid_size_t)
852  {
853  mooseAssert(local_index < _feature_sets.size(), "local_index out of bounds");
854  return _feature_sets[local_index]._status != Status::INACTIVE
855  ? _feature_sets[local_index]._boundary_intersection != BoundaryIntersection::NONE
856  : false;
857  }
858 
859  return false;
860 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
std::vector< std::size_t > _feature_id_to_local_index
The vector recording the grain_id to local index (several indices will contain invalid_size_t) ...

◆ doesFeatureIntersectSpecifiedBoundary()

bool FeatureFloodCount::doesFeatureIntersectSpecifiedBoundary ( unsigned int  feature_id) const
virtualinherited

Returns a Boolean indicating whether this feature intersects boundaries in a user-supplied list.

Reimplemented in GrainTracker.

Definition at line 863 of file FeatureFloodCount.C.

Referenced by FeatureVolumeVectorPostprocessor::execute(), and FeatureFloodCount::getEntityValue().

864 {
865  // Some processors don't contain the largest feature id, in that case we just return invalid_id
866  if (feature_id >= _feature_id_to_local_index.size())
867  return false;
868 
869  auto local_index = _feature_id_to_local_index[feature_id];
870 
871  if (local_index != invalid_size_t)
872  {
873  mooseAssert(local_index < _feature_sets.size(), "local_index out of bounds");
874  return _feature_sets[local_index]._status != Status::INACTIVE
875  ? ((_feature_sets[local_index]._boundary_intersection &
878  : false;
879  }
880 
881  return false;
882 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
std::vector< std::size_t > _feature_id_to_local_index
The vector recording the grain_id to local index (several indices will contain invalid_size_t) ...

◆ execute()

void PolycrystalUserObjectBase::execute ( )
overridevirtualinherited

We need one map per grain when creating the initial condition to support overlapping features. Luckily, this is a fairly sparse structure.

This loop is similar to the one found in the base class however, there are two key differences between building up the initial condition and discovering features based on solution variables:

1) When building up the initial condition, we aren't inspecting the actual variable values so we don't need to loop over all of the coupled variables. 2) We want to discover all features on a single pass since there may be thousands of features in a simulation. However, we can only actively flood a single feature at a time. To make sure that we pick up all features that might start on a given entity, we'll keep retrying the flood routine on the same entity as long as new discoveries are being made. We know this information from the return value of flood.

Reimplemented from FeatureFloodCount.

Reimplemented in FauxPolycrystalVoronoi.

Definition at line 111 of file PolycrystalUserObjectBase.C.

112 {
113  if (!_colors_assigned)
115  // No need to rerun the object if the mesh hasn't changed
116  else if (!_fe_problem.hasInitialAdaptivity())
117  return;
118 
119  TIME_SECTION("execute", 2, "Computing Polycrystal Initial Condition");
120 
126 
139  for (const auto & current_elem : _fe_problem.getNonlinearEvaluableElementRange())
140  {
141  // Loop over elements or nodes
142  if (_is_elemental)
143  while (flood(current_elem, invalid_size_t))
144  ;
145  else
146  {
147  auto n_nodes = current_elem->n_vertices();
148  for (auto i = decltype(n_nodes)(0); i < n_nodes; ++i)
149  {
150  const Node * current_node = current_elem->node_ptr(i);
151 
152  while (flood(current_node, invalid_size_t))
153  ;
154  }
155  }
156  }
157 }
static const std::size_t invalid_size_t
std::vector< std::set< dof_id_type > > _entities_visited
This variable keeps track of which nodes have been visited during execution.
const dof_id_type n_nodes
virtual void precomputeGrainStructure()
This callback is triggered after the object is initialized and may be optionally overridden to do pre...
bool _colors_assigned
A Boolean indicating whether the object has assigned colors to grains (internal use) ...
bool hasInitialAdaptivity() const
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
bool flood(const DofObject *dof_object, std::size_t current_index)
This method will check if the current entity is above the supplied threshold and "mark" it...
FEProblemBase & _fe_problem
virtual unsigned int getNumGrains() const =0
Must be overridden by the deriving class to provide the number of grains in the polycrystal structure...
const ConstElemRange & getNonlinearEvaluableElementRange()

◆ expandEdgeHalos()

void FeatureFloodCount::expandEdgeHalos ( unsigned int  num_layers_to_expand)
protectedinherited

This method expands the existing halo set by some width determined by the passed in value.

This method does NOT mask off any local IDs.

Create a copy of the halo set so that as we insert new ids into the set we don't continue to iterate on those new ids.

We have to handle disjoint halo IDs slightly differently. Once you are disjoint, you can't go back so make sure that we keep placing these IDs in the disjoint set.

Definition at line 1560 of file FeatureFloodCount.C.

Referenced by GrainTracker::finalize(), and PolycrystalUserObjectBase::finalize().

1561 {
1562  if (num_layers_to_expand == 0)
1563  return;
1564 
1565  TIME_SECTION("expandEdgeHalos", 3, "Expanding Edge Halos");
1566 
1567  for (auto & list_ref : _partial_feature_sets)
1568  {
1569  for (auto & feature : list_ref)
1570  {
1571  for (unsigned short halo_level = 0; halo_level < num_layers_to_expand; ++halo_level)
1572  {
1577  FeatureData::container_type orig_halo_ids(feature._halo_ids);
1578  for (auto entity : orig_halo_ids)
1579  {
1580  if (_is_elemental)
1582  &feature,
1583  /*expand_halos_only =*/true,
1584  /*disjoint_only =*/false);
1585  else
1587  &feature,
1588  /*expand_halos_only =*/true);
1589  }
1590 
1595  FeatureData::container_type disjoint_orig_halo_ids(feature._disjoint_halo_ids);
1596  for (auto entity : disjoint_orig_halo_ids)
1597  {
1598  if (_is_elemental)
1600 
1601  &feature,
1602  /*expand_halos_only =*/true,
1603  /*disjoint_only =*/true);
1604  else
1606 
1607  &feature,
1608  /*expand_halos_only =*/true);
1609  }
1610  }
1611  }
1612  }
1613 }
void visitNodalNeighbors(const Node *node, FeatureData *feature, bool expand_halos_only)
These two routines are utility routines used by the flood routine and by derived classes for visiting...
std::vector< dof_id_type > container_type
The primary underlying container type used to hold the data in each FeatureData.
virtual Elem * elemPtr(const dof_id_type i)
virtual const Node * nodePtr(const dof_id_type i) const
void visitElementalNeighbors(const Elem *elem, FeatureData *feature, bool expand_halos_only, bool disjoint_only)
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
MooseMesh & _mesh
A reference to the mesh.

◆ expandPointHalos()

void FeatureFloodCount::expandPointHalos ( )
protectedinherited

This method takes all of the partial features and expands the local, ghosted, and halo sets around those regions to account for the diffuse interface.

Rather than using any kind of recursion here, we simply expand the region by all "point" neighbors from the actual grain cells since all point neighbors will contain contributions to the region.

To expand the feature element region to the actual flooded region (nodal basis) we need to add in all point neighbors of the current local region for each feature. This is because the elemental variable influence spreads from the elemental data out exactly one element from every mesh point.

Definition at line 1498 of file FeatureFloodCount.C.

1499 {
1500  const auto & node_to_elem_map = _mesh.nodeToActiveSemilocalElemMap();
1501  FeatureData::container_type expanded_local_ids;
1502  auto my_processor_id = processor_id();
1503 
1510  for (auto & list_ref : _partial_feature_sets)
1511  {
1512  for (auto & feature : list_ref)
1513  {
1514  expanded_local_ids.clear();
1515 
1516  for (auto entity : feature._local_ids)
1517  {
1518  const Elem * elem = _mesh.elemPtr(entity);
1519  mooseAssert(elem, "elem pointer is NULL");
1520 
1521  // Get the nodes on a current element so that we can add in point neighbors
1522  auto n_nodes = elem->n_vertices();
1523  for (const auto i : make_range(n_nodes))
1524  {
1525  const Node * current_node = elem->node_ptr(i);
1526 
1527  auto elem_vector_it = node_to_elem_map.find(current_node->id());
1528  if (elem_vector_it == node_to_elem_map.end())
1529  mooseError("Error in node to elem map");
1530 
1531  const auto & elem_vector = elem_vector_it->second;
1532 
1533  std::copy(elem_vector.begin(),
1534  elem_vector.end(),
1535  std::insert_iterator<FeatureData::container_type>(expanded_local_ids,
1536  expanded_local_ids.end()));
1537 
1538  // Now see which elements need to go into the ghosted set
1539  for (auto entity : elem_vector)
1540  {
1541  const Elem * neighbor = _mesh.elemPtr(entity);
1542  mooseAssert(neighbor, "neighbor pointer is NULL");
1543 
1544  if (neighbor->processor_id() != my_processor_id)
1545  feature._ghosted_ids.insert(feature._ghosted_ids.end(), elem->id());
1546  }
1547  }
1548  }
1549 
1550  // Replace the existing local ids with the expanded local ids
1551  feature._local_ids.swap(expanded_local_ids);
1552 
1553  // Copy the expanded local_ids into the halo_ids container
1554  feature._halo_ids = feature._local_ids;
1555  }
1556  }
1557 }
std::vector< dof_id_type > container_type
The primary underlying container type used to hold the data in each FeatureData.
virtual Elem * elemPtr(const dof_id_type i)
const std::map< dof_id_type, std::vector< dof_id_type > > & nodeToActiveSemilocalElemMap()
const dof_id_type n_nodes
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
MooseMesh & _mesh
A reference to the mesh.
processor_id_type processor_id() const

◆ featureCentroid()

Point FeatureFloodCount::featureCentroid ( unsigned int  feature_id) const
virtualinherited

Returns the centroid of the designated feature (only supported without periodic boundaries)

Definition at line 909 of file FeatureFloodCount.C.

Referenced by FeatureVolumeVectorPostprocessor::execute().

910 {
911  if (feature_id >= _feature_id_to_local_index.size())
912  return invalid_id;
913 
914  auto local_index = _feature_id_to_local_index[feature_id];
915 
916  Real invalid_coord = std::numeric_limits<Real>::max();
917  Point p(invalid_coord, invalid_coord, invalid_coord);
918  if (local_index != invalid_size_t)
919  {
920  mooseAssert(local_index < _feature_sets.size(), "local_index out of bounds");
921  p = _feature_sets[local_index]._centroid;
922  }
923  return p;
924 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
static const unsigned int invalid_id
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< std::size_t > _feature_id_to_local_index
The vector recording the grain_id to local index (several indices will contain invalid_size_t) ...

◆ finalize()

void PolycrystalUserObjectBase::finalize ( )
overridevirtualinherited

All ranks: Update the variable indices based on the graph coloring algorithm.

Reimplemented from FeatureFloodCount.

Reimplemented in FauxPolycrystalVoronoi.

Definition at line 246 of file PolycrystalUserObjectBase.C.

247 {
249  return;
250 
251  TIME_SECTION("finalize", 2, "Finalizing Polycrystal Initial Condition");
252 
253  // TODO: Possibly retrieve the halo thickness from the active GrainTracker object?
254  constexpr unsigned int halo_thickness = 2;
255 
256  expandEdgeHalos(halo_thickness - 1);
257 
259 
260  if (!_colors_assigned)
261  {
262  // Resize the color assignment vector here. All ranks need a copy of this
264  if (_is_primary)
265  {
267 
269 
272  }
273 
274  // Communicate the coloring map with all ranks
276 
280  for (auto & feature : _feature_sets)
281  feature._var_index = _grain_to_op.at(feature._id);
282  }
283 
284  _colors_assigned = true;
285 }
void buildGrainAdjacencyMatrix()
Builds a dense adjacency matrix based on the discovery of grain neighbors and halos surrounding each ...
void expandEdgeHalos(unsigned int num_layers_to_expand)
This method expands the existing halo set by some width determined by the passed in value...
std::map< unsigned int, unsigned int > _grain_to_op
A map of the grain_id to op.
virtual void finalize() override
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
void assignOpsToGrains()
Method that runs a coloring algorithm to assign OPs to grains.
const bool _is_primary
Convenience variable for testing primary rank.
const Parallel::Communicator & _communicator
void printGrainAdjacencyMatrix() const
Prints out the adjacency matrix in a nicely spaced integer format.
bool _colors_assigned
A Boolean indicating whether the object has assigned colors to grains (internal use) ...
bool hasInitialAdaptivity() const
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
std::vector< unsigned int > _grain_idx_to_op
A vector indicating which op is assigned to each grain (by index of the grain)
FEProblemBase & _fe_problem
const bool _output_adjacency_matrix
A user controllable Boolean which can be used to print the adjacency matrix to the console...
static const unsigned int INVALID_COLOR
Used to indicate an invalid coloring for the built-in back-tracking algorithm.

◆ flood()

bool FeatureFloodCount::flood ( const DofObject *  dof_object,
std::size_t  current_index 
)
protectedinherited

This method will check if the current entity is above the supplied threshold and "mark" it.

It will then inspect neighboring entities that are above the connecting threshold and add them to the current feature.

Returns
Boolean indicating whether a new feature was found while exploring the current entity.

If we reach this point (i.e. we haven't continued to the next queue entry), we've found a new mesh entity that's part of a feature. We need to mark the entity as visited at this point (and not before!) to avoid infinite recursion. If you mark the node too early you risk not coloring in a whole feature any time a "connecting threshold" is used since we may have already visited this entity earlier but it was in-between two thresholds.

See if this particular entity cell contributes to the centroid calculation. We only deal with elemental floods and only count it if it's owned by the current processor to avoid skewing the result.

Definition at line 1327 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::execute(), and PolycrystalUserObjectBase::execute().

1329 {
1330  // if (dof_object == nullptr || dof_object == libMesh::remote_elem)
1331  // return false;
1332  mooseAssert(dof_object, "DOF object is nullptr");
1333  mooseAssert(_entity_queue.empty(), "Entity queue is not empty when starting a feature");
1334 
1335  // Kick off the exploration of a new feature
1336  _entity_queue.push_front(dof_object);
1337 
1338  bool return_value = false;
1339  FeatureData * feature = nullptr;
1340  while (!_entity_queue.empty())
1341  {
1342  const DofObject * curr_dof_object = _entity_queue.back();
1343  const Elem * elem = _is_elemental ? static_cast<const Elem *>(curr_dof_object) : nullptr;
1344  _entity_queue.pop_back();
1345 
1346  // Retrieve the id of the current entity
1347  auto entity_id = curr_dof_object->id();
1348 
1349  // Has this entity already been marked? - if so move along
1350  if (current_index != invalid_size_t &&
1351  _entities_visited[current_index].find(entity_id) != _entities_visited[current_index].end())
1352  continue;
1353 
1354  // Are we outside of the range we should be working in?
1355  if (_is_elemental && !_dof_map.is_evaluable(*elem))
1356  continue;
1357 
1358  // See if the current entity either starts a new feature or continues an existing feature
1359  auto new_id = invalid_id; // Writable reference to hold an optional id;
1360  Status status =
1361  Status::INACTIVE; // Status is inactive until we find an entity above the starting threshold
1362 
1363  // Make sure that the Assembly object has the right element and subdomain information set
1364  // since we are moving through the mesh in a manual fashion.
1365  if (_is_elemental)
1367 
1368  if (!isNewFeatureOrConnectedRegion(curr_dof_object, current_index, feature, status, new_id))
1369  {
1370  // If we have an active feature, we just found a halo entity
1371  if (feature)
1372  feature->_halo_ids.insert(feature->_halo_ids.end(), entity_id);
1373  continue;
1374  }
1375 
1376  mooseAssert(current_index != invalid_size_t, "current_index is invalid");
1377 
1386  return_value = true;
1387  _entities_visited[current_index].insert(entity_id);
1388 
1389  auto map_num = _single_map_mode ? decltype(current_index)(0) : current_index;
1390 
1391  // New Feature (we need to create it and add it to our data structure)
1392  if (!feature)
1393  {
1394  _partial_feature_sets[map_num].emplace_back(
1395  current_index, _feature_count++, processor_id(), status);
1396 
1397  // Get a handle to the feature we will update (always the last feature in the data structure)
1398  feature = &_partial_feature_sets[map_num].back();
1399 
1400  // If new_id is valid, we'll set it in the feature here.
1401  if (new_id != invalid_id)
1402  feature->_id = new_id;
1403  }
1404 
1405  // Insert the current entity into the local ids data structure
1406  feature->_local_ids.insert(feature->_local_ids.end(), entity_id);
1407 
1413  if (_is_elemental && processor_id() == curr_dof_object->processor_id())
1414  {
1415  // Keep track of how many elements participate in the centroid averaging
1416  feature->_vol_count++;
1417 
1418  // Sum the centroid values for now, we'll average them later
1419  feature->_centroid += elem->vertex_average();
1420 
1421  // // Does the volume intersect the boundary?
1422  // if (_all_boundary_entity_ids.find(elem->id()) != _all_boundary_entity_ids.end())
1423  // feature->_intersects_boundary = true;
1424  }
1425 
1426  if (_is_elemental)
1428  feature,
1429  /*expand_halos_only =*/false,
1430  /*disjoint_only =*/false);
1431  else
1432  visitNodalNeighbors(static_cast<const Node *>(curr_dof_object),
1433  feature,
1434  /*expand_halos_only =*/false);
1435  }
1436 
1437  return return_value;
1438 }
void visitNodalNeighbors(const Node *node, FeatureData *feature, bool expand_halos_only)
These two routines are utility routines used by the flood routine and by derived classes for visiting...
static const std::size_t invalid_size_t
Status
This enumeration is used to indicate status of the grains in the _unique_grains data structure...
std::vector< std::set< dof_id_type > > _entities_visited
This variable keeps track of which nodes have been visited during execution.
MPI_Status status
void visitElementalNeighbors(const Elem *elem, FeatureData *feature, bool expand_halos_only, bool disjoint_only)
const DofMap & _dof_map
Reference to the dof_map containing the coupled variables.
static const unsigned int invalid_id
const bool _single_map_mode
This variable is used to indicate whether or not multiple maps are used during flooding.
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
virtual void setCurrentSubdomainID(const Elem *elem, const THREAD_ID tid) override
virtual bool isNewFeatureOrConnectedRegion(const DofObject *dof_object, std::size_t &current_index, FeatureData *&feature, Status &status, unsigned int &new_id)
Method called during the recursive flood routine that should return whether or not the current entity...
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
FEProblemBase & _fe_problem
processor_id_type processor_id() const
std::deque< const DofObject * > _entity_queue
The data structure for maintaining entities to flood during discovery.

◆ getConnectingThreshold()

Real FeatureFloodCount::getConnectingThreshold ( std::size_t  current_index) const
protectedvirtualinherited

Return the "connecting" comparison threshold to use when inspecting an entity during the flood stage.

Definition at line 1445 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::isNewFeatureOrConnectedRegion().

1446 {
1448 }

◆ getCoupledVars()

const std::vector<MooseVariable *>& FeatureFloodCount::getCoupledVars ( ) const
inlineinherited

Returns a const vector to the coupled variable pointers.

Definition at line 97 of file FeatureFloodCount.h.

Referenced by AverageGrainVolume::AverageGrainVolume(), and FeatureVolumeVectorPostprocessor::FeatureVolumeVectorPostprocessor().

97 { return _vars; }
std::vector< MooseVariable * > _vars
The vector of coupled in variables cast to MooseVariable.

◆ getEntityValue()

Real FeatureFloodCount::getEntityValue ( dof_id_type  entity_id,
FieldType  field_type,
std::size_t  var_index = 0 
) const
virtualinherited

Reimplemented in GrainTracker, and FauxGrainTracker.

Definition at line 927 of file FeatureFloodCount.C.

Referenced by GrainTracker::getEntityValue(), and FeatureFloodCountAux::precalculateValue().

930 {
931  auto use_default = false;
932  if (var_index == invalid_size_t)
933  {
934  use_default = true;
935  var_index = 0;
936  }
937 
938  mooseAssert(var_index < _maps_size, "Index out of range");
939 
940  switch (field_type)
941  {
943  {
944  const auto entity_it = _feature_maps[var_index].find(entity_id);
945 
946  if (entity_it != _feature_maps[var_index].end())
947  return entity_it->second; // + _region_offsets[var_index];
948  else
949  return -1;
950  }
951 
953  {
954  mooseAssert(
956  "\"enable_var_coloring\" must be set to true to pull back the VARIABLE_COLORING field");
957 
958  const auto entity_it = _var_index_maps[var_index].find(entity_id);
959 
960  if (entity_it != _var_index_maps[var_index].end())
961  return entity_it->second;
962  else
963  return -1;
964  }
965 
967  {
968  const auto entity_it = _ghosted_entity_ids.find(entity_id);
969 
970  if (entity_it != _ghosted_entity_ids.end())
971  return entity_it->second;
972  else
973  return -1;
974  }
975 
976  case FieldType::HALOS:
977  {
978  if (!use_default)
979  {
980  const auto entity_it = _halo_ids[var_index].find(entity_id);
981  if (entity_it != _halo_ids[var_index].end())
982  return entity_it->second;
983  }
984  else
985  {
986  // Showing halos in reverse order for backwards compatibility
987  for (auto map_num = _maps_size;
988  map_num-- /* don't compare greater than zero for unsigned */;)
989  {
990  const auto entity_it = _halo_ids[map_num].find(entity_id);
991 
992  if (entity_it != _halo_ids[map_num].end())
993  return entity_it->second;
994  }
995  }
996  return -1;
997  }
998 
999  case FieldType::CENTROID:
1000  {
1001  if (_periodic_node_map.size())
1002  mooseDoOnce(mooseWarning(
1003  "Centroids are not correct when using periodic boundaries, contact the MOOSE team"));
1004 
1005  // If this element contains the centroid of one of features, return one
1006  const auto * elem_ptr = _mesh.elemPtr(entity_id);
1007 
1008  for (const auto & feature : _feature_sets)
1009  {
1010  if (feature._status == Status::INACTIVE)
1011  continue;
1012 
1013  if (elem_ptr->contains_point(feature._centroid))
1014  return 1;
1015  }
1016 
1017  return 0;
1018  }
1019 
1021  {
1022  auto ids = getVarToFeatureVector(entity_id);
1023  if (ids.size() != 0)
1025  return 0;
1026  }
1027 
1028  default:
1029  return 0;
1030  }
1031 }
std::multimap< dof_id_type, dof_id_type > _periodic_node_map
The data structure which is a list of nodes that are constrained to other nodes based on the imposed ...
static const std::size_t invalid_size_t
virtual Elem * elemPtr(const dof_id_type i)
virtual const std::vector< unsigned int > & getVarToFeatureVector(dof_id_type elem_id) const
Returns a list of active unique feature ids for a particular element.
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
void mooseWarning(Args &&... args) const
std::map< dof_id_type, int > _ghosted_entity_ids
The map for holding reconstructed ghosted element information.
std::vector< std::map< dof_id_type, int > > _halo_ids
The data structure for looking up halos around features.
const std::size_t _maps_size
Convenience variable holding the size of all the datastructures size by the number of maps...
std::vector< std::map< dof_id_type, int > > _feature_maps
The feature maps contain the raw flooded node information and eventually the unique grain numbers...
virtual bool doesFeatureIntersectSpecifiedBoundary(unsigned int feature_id) const
Returns a Boolean indicating whether this feature intersects boundaries in a user-supplied list...
MooseMesh & _mesh
A reference to the mesh.
const bool _var_index_mode
This variable is used to indicate whether the maps will contain unique region information or just the...
std::vector< std::map< dof_id_type, int > > _var_index_maps
This map keeps track of which variables own which nodes.

◆ getFeatures()

const std::vector<FeatureData>& FeatureFloodCount::getFeatures ( ) const
inlineinherited

Return a constant reference to the vector of all discovered features.

Definition at line 328 of file FeatureFloodCount.h.

Referenced by GrainTracker::prepopulateState().

328 { return _feature_sets; }
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.

◆ getFeatureVar()

unsigned int FeatureFloodCount::getFeatureVar ( unsigned int  feature_id) const
virtualinherited

Returns the variable representing the passed in feature.

Reimplemented in GrainTracker, and FauxGrainTracker.

Definition at line 824 of file FeatureFloodCount.C.

Referenced by FeatureVolumeVectorPostprocessor::execute(), and GrainTracker::getFeatureVar().

825 {
826  // Some processors don't contain the largest feature id, in that case we just return invalid_id
827  if (feature_id >= _feature_id_to_local_index.size())
828  return invalid_id;
829 
830  auto local_index = _feature_id_to_local_index[feature_id];
831  if (local_index != invalid_size_t)
832  {
833  mooseAssert(local_index < _feature_sets.size(), "local_index out of bounds");
834  return _feature_sets[local_index]._status != Status::INACTIVE
835  ? _feature_sets[local_index]._var_index
836  : invalid_id;
837  }
838 
839  return invalid_id;
840 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
static const unsigned int invalid_id
std::vector< std::size_t > _feature_id_to_local_index
The vector recording the grain_id to local index (several indices will contain invalid_size_t) ...

◆ getFECoupledVars()

const std::vector<MooseVariableFEBase *>& FeatureFloodCount::getFECoupledVars ( ) const
inlineinherited

Returns a const vector to the coupled MooseVariableFEBase pointers.

Definition at line 100 of file FeatureFloodCount.h.

Referenced by AverageGrainVolume::AverageGrainVolume().

100 { return _fe_vars; }
std::vector< MooseVariableFEBase * > _fe_vars
The vector of coupled in variables.

◆ getGrainsBasedOnElem()

virtual void PolycrystalUserObjectBase::getGrainsBasedOnElem ( const Elem &  elem,
std::vector< unsigned int > &  grains 
) const
inlinevirtualinherited

This method may be defined in addition to the point based initialization to speed up lookups.

It returns grain IDs based on the current element. Note: If your simulation contains adaptivity the point based method may be used to retrieve grain information as well as this method.

Definition at line 49 of file PolycrystalUserObjectBase.h.

Referenced by VoronoiICAux::computeValue(), and PolycrystalUserObjectBase::isNewFeatureOrConnectedRegion().

50  {
51  getGrainsBasedOnPoint(elem.vertex_average(), grains);
52  }
virtual void getGrainsBasedOnPoint(const Point &point, std::vector< unsigned int > &grains) const =0
Method for retrieving active grain IDs based on some point in the mesh.

◆ getGrainsBasedOnPoint()

void PolycrystalEBSD::getGrainsBasedOnPoint ( const Point &  point,
std::vector< unsigned int > &  grains 
) const
overridevirtual

Method for retrieving active grain IDs based on some point in the mesh.

Typically these are element centroids or nodes depending on the basis functions being initialized. ICs that have fixed resolution data (i.e. experimental datasets) may choose to implement the element based method as well for added convenience.

Implements PolycrystalUserObjectBase.

Definition at line 34 of file PolycrystalEBSD.C.

Referenced by getVariableValue().

36 {
38 
39  // See if we are in a phase that we are actually tracking
40  if (_phase != libMesh::invalid_uint && _phase != d._phase)
41  {
42  grains.resize(0);
43  return;
44  }
45 
46  // Get the ids from the EBSD reader
47  const auto global_id = _ebsd_reader.getGlobalID(d._feature_id);
48  const auto local_id = _ebsd_reader.getAvgData(global_id)._local_id;
49 
50  grains.resize(1);
51  grains[0] = _phase != libMesh::invalid_uint ? local_id : global_id;
52 }
unsigned int _local_id
Index in the per-phase list of global IDs.
const EBSDAvgData & getAvgData(unsigned int i) const
Get the requested type of average data for (global) grain number i.
Definition: EBSDReader.C:356
const unsigned int invalid_uint
const unsigned int _phase
const EBSDPointData & getData(const Point &p) const
Get the requested type of data at the point p.
Definition: EBSDReader.C:350
const EBSDReader & _ebsd_reader
Per element EBSD data point.
virtual unsigned int getGlobalID(unsigned int phase, unsigned int local_id) const
Return the (global) grain id for a given phase and (local) grain number.
Definition: EBSDReader.h:92

◆ getNodalVariableValue()

Real PolycrystalEBSD::getNodalVariableValue ( unsigned int  op_index,
const Node &  n 
) const
overridevirtual

Similarly to the getVariableValue method, this method also returns values but may be optimized for returning nodal values.

Reimplemented from PolycrystalUserObjectBase.

Definition at line 64 of file PolycrystalEBSD.C.

65 {
66  // Make sure the _current_node is in the node_to_grain_weight_map (return error if not in map)
67  const auto it = _node_to_grain_weight_map.find(n.id());
68 
69  if (it == _node_to_grain_weight_map.end())
70  mooseError("The following node id is not in the node map: ", n.id());
71 
72  // Increment through all grains at node_index (these are global IDs if consider_phase is false and
73  // local IDs otherwise)
74  const auto num_grains = getNumGrains();
75  for (MooseIndex(num_grains) index = 0; index < num_grains; ++index)
76  {
77  // If the current order parameter index (_op_index) is equal to the assigned index
78  // (_assigned_op),
79  // set the value from node_to_grain_weight_map
80  auto grain_index =
82  mooseAssert(grain_index < it->second.size(), "grain_index out of range");
83  auto value = (it->second)[grain_index];
84  if (_grain_to_op.at(index) == op_index && value > 0.0)
85  return value;
86  }
87 
88  return 0.0;
89 }
const unsigned int invalid_uint
std::map< unsigned int, unsigned int > _grain_to_op
A map of the grain_id to op.
const unsigned int _phase
const std::map< dof_id_type, std::vector< Real > > & _node_to_grain_weight_map
const EBSDReader & _ebsd_reader
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
virtual unsigned int getNumGrains() const override
Must be overridden by the deriving class to provide the number of grains in the polycrystal structure...
void mooseError(Args &&... args) const
virtual unsigned int getGlobalID(unsigned int phase, unsigned int local_id) const
Return the (global) grain id for a given phase and (local) grain number.
Definition: EBSDReader.h:92

◆ getNumberActiveFeatures()

std::size_t FeatureFloodCount::getNumberActiveFeatures ( ) const
inherited

Return the number of active features.

Definition at line 806 of file FeatureFloodCount.C.

Referenced by AverageGrainVolume::getValue().

807 {
808  // Note: This value is parallel consistent, see FeatureFloodCount::communicateAndMerge()
809  return _feature_count;
810 }
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...

◆ getNumGrains()

unsigned int PolycrystalEBSD::getNumGrains ( ) const
overridevirtual

Must be overridden by the deriving class to provide the number of grains in the polycrystal structure.

Implements PolycrystalUserObjectBase.

Definition at line 55 of file PolycrystalEBSD.C.

Referenced by getNodalVariableValue().

56 {
59  else
60  return _ebsd_reader.getGrainNum();
61 }
const unsigned int invalid_uint
const unsigned int _phase
const EBSDReader & _ebsd_reader
virtual unsigned int getGrainNum() const
Return the total number of grains.
Definition: EBSDReader.C:374

◆ getThreshold()

Real FeatureFloodCount::getThreshold ( std::size_t  current_index) const
protectedvirtualinherited

Return the starting comparison threshold to use when inspecting an entity during the flood stage.

Reimplemented in GrainTracker.

Definition at line 1440 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::isNewFeatureOrConnectedRegion().

1441 {
1442  return _step_threshold;
1443 }

◆ getTotalFeatureCount()

std::size_t FeatureFloodCount::getTotalFeatureCount ( ) const
virtualinherited

Returns the total feature count (active and inactive ids, useful for sizing vectors)

Since the FeatureFloodCount object doesn't maintain any information about features between invocations. The maximum id in use is simply the number of features.

Reimplemented in FauxGrainTracker, and GrainTracker.

Definition at line 813 of file FeatureFloodCount.C.

Referenced by FeatureVolumeVectorPostprocessor::execute(), and AverageGrainVolume::initialize().

814 {
820  return _feature_count;
821 }
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...

◆ getValue()

Real FeatureFloodCount::getValue ( ) const
overridevirtualinherited

Implements GeneralPostprocessor.

Reimplemented in FauxGrainTracker.

Definition at line 800 of file FeatureFloodCount.C.

801 {
802  return static_cast<Real>(_feature_count);
803 }
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ getVariableValue()

Real PolycrystalEBSD::getVariableValue ( unsigned int  op_index,
const Point &  p 
) const
overridevirtual

Returns the variable value for a given op_index and mesh point.

This is the method used by the initial condition after the Polycrystal grain structure has be setup. Those grains are then distributed to the typically smaller number of order parameters by this class. This method is then used to return those values but it may be overridden in a derived class.

Implements PolycrystalUserObjectBase.

Definition at line 92 of file PolycrystalEBSD.C.

93 {
94  std::vector<unsigned int> grain_ids;
95  getGrainsBasedOnPoint(p, grain_ids);
96 
97  if (grain_ids.empty())
98  return -1.0;
99 
100  mooseAssert(grain_ids.size() == 1, "Expected only one grain at point in EBSDReader");
101  auto index = grain_ids[0];
102 
103  return _grain_to_op.at(index) == op_index ? 1.0 : 0.0;
104 }
std::map< unsigned int, unsigned int > _grain_to_op
A map of the grain_id to op.
virtual void getGrainsBasedOnPoint(const Point &point, std::vector< unsigned int > &grains) const override
Method for retrieving active grain IDs based on some point in the mesh.

◆ getVarToFeatureVector()

const std::vector< unsigned int > & FeatureFloodCount::getVarToFeatureVector ( dof_id_type  elem_id) const
virtualinherited

Returns a list of active unique feature ids for a particular element.

The vector is indexed by variable number with each entry containing either an invalid size_t type (no feature active at that location) or a feature id if the variable is non-zero at that location.

Reimplemented in GrainTracker, and FauxGrainTracker.

Definition at line 694 of file FeatureFloodCount.C.

Referenced by AverageGrainVolume::execute(), FeatureVolumeVectorPostprocessor::execute(), FeatureFloodCount::getEntityValue(), GrainTracker::getVarToFeatureVector(), and FeatureFloodCountAux::precalculateValue().

695 {
696  mooseDoOnce(if (!_compute_var_to_feature_map) mooseError(
697  "Please set \"compute_var_to_feature_map = true\" to use this interface method"));
698 
699  const auto pos = _entity_var_to_features.find(elem_id);
700  if (pos != _entity_var_to_features.end())
701  {
702  mooseAssert(pos->second.size() == _n_vars, "Variable to feature vector not sized properly");
703  return pos->second;
704  }
705  else
706  return _empty_var_to_features;
707 }
const std::size_t _n_vars
std::map< dof_id_type, std::vector< unsigned int > > _entity_var_to_features
std::vector< unsigned int > _empty_var_to_features
void mooseError(Args &&... args) const
const bool _compute_var_to_feature_map
Indicates whether or not the var to feature map is populated.

◆ initialize()

void PolycrystalUserObjectBase::initialize ( )
overridevirtualinherited

Reimplemented from FeatureFloodCount.

Reimplemented in FauxPolycrystalVoronoi.

Definition at line 100 of file PolycrystalUserObjectBase.C.

101 {
103  return;
104 
105  _entity_to_grain_cache.clear();
106 
108 }
std::map< dof_id_type, std::vector< unsigned int > > _entity_to_grain_cache
virtual void initialize() override
bool _colors_assigned
A Boolean indicating whether the object has assigned colors to grains (internal use) ...
bool hasInitialAdaptivity() const
FEProblemBase & _fe_problem

◆ initialSetup()

void PolycrystalUserObjectBase::initialSetup ( )
overridevirtualinherited

UserObject interface overrides.

Derived classes should not override any of these methods.

For polycrystal ICs we need to assume that each of the variables has the same periodicity. Since BCs are handled elsewhere in the system, we'll have to check this case explicitly.

Reimplemented from FeatureFloodCount.

Reimplemented in FauxPolycrystalVoronoi.

Definition at line 78 of file PolycrystalUserObjectBase.C.

79 {
84  if (_op_num < 1)
85  mooseError("No coupled variables found");
86 
87  for (unsigned int dim = 0; dim < _dim; ++dim)
88  {
89  bool first_variable_value = _mesh.isTranslatedPeriodic(_vars[0]->number(), dim);
90 
91  for (unsigned int i = 1; i < _vars.size(); ++i)
92  if (_mesh.isTranslatedPeriodic(_vars[i]->number(), dim) != first_variable_value)
93  mooseError("Coupled polycrystal variables differ in periodicity");
94  }
95 
97 }
unsigned int dim
bool isTranslatedPeriodic(unsigned int nonlinear_var_num, unsigned int component) const
const unsigned int _op_num
The maximum number of order parameters (colors) available to assign to the grain structure.
const unsigned int _dim
mesh dimension
std::vector< MooseVariable * > _vars
The vector of coupled in variables cast to MooseVariable.
void mooseError(Args &&... args) const
virtual void initialSetup() override
MooseMesh & _mesh
A reference to the mesh.

◆ isBoundaryEntity()

template<typename T >
bool FeatureFloodCount::isBoundaryEntity ( const T *  entity) const
protectedinherited

Returns a Boolean indicating whether the entity is on one of the desired boundaries.

Definition at line 1858 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::visitNeighborsHelper().

1859 {
1860  mooseAssert(_bnd_elem_range, "Boundary Element Range is nullptr");
1861 
1862  if (entity)
1863  for (const auto & belem : *_bnd_elem_range)
1864  // Only works for Elements
1865  if (belem->_elem->id() == entity->id() && hasBoundary(belem->_bnd_id))
1866  return true;
1867 
1868  return false;
1869 }
bool hasBoundary(const BoundaryName &name) const
ConstBndElemRange * _bnd_elem_range
Boundary element range pointer.

◆ isElemental()

bool FeatureFloodCount::isElemental ( ) const
inlineinherited

Definition at line 117 of file FeatureFloodCount.h.

Referenced by FeatureFloodCountAux::FeatureFloodCountAux().

117 { return _is_elemental; }
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)

◆ isFeaturePercolated()

bool FeatureFloodCount::isFeaturePercolated ( unsigned int  feature_id) const
virtualinherited

Returns a Boolean indicating whether this feature is percolated (e.g.

intersects at least two different boundaries from sets supplied by the user)

Reimplemented in GrainTracker.

Definition at line 885 of file FeatureFloodCount.C.

Referenced by FeatureVolumeVectorPostprocessor::execute().

886 {
887  // Some processors don't contain the largest feature id, in that case we just return invalid_id
888  if (feature_id >= _feature_id_to_local_index.size())
889  return false;
890 
891  auto local_index = _feature_id_to_local_index[feature_id];
892 
893  if (local_index != invalid_size_t)
894  {
895  mooseAssert(local_index < _feature_sets.size(), "local_index out of bounds");
896  bool primary = ((_feature_sets[local_index]._boundary_intersection &
899  bool secondary = ((_feature_sets[local_index]._boundary_intersection &
902  return _feature_sets[local_index]._status != Status::INACTIVE ? (primary && secondary) : false;
903  }
904 
905  return false;
906 }
static const std::size_t invalid_size_t
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
std::vector< std::size_t > _feature_id_to_local_index
The vector recording the grain_id to local index (several indices will contain invalid_size_t) ...

◆ isGraphValid()

bool PolycrystalUserObjectBase::isGraphValid ( unsigned int  vertex,
unsigned int  color 
)
protectedinherited

Helper method for the back-tracking graph coloring algorithm.

Definition at line 606 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::colorGraph().

607 {
608  // See if the proposed color is valid based on the current neighbor colors
609  for (unsigned int neighbor = 0; neighbor < _feature_count; ++neighbor)
610  if ((*_adjacency_matrix)(vertex, neighbor) && color == _grain_idx_to_op[neighbor])
611  return false;
612  return true;
613 }
std::unique_ptr< DenseMatrix< Real > > _adjacency_matrix
The dense adjacency matrix.
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
std::vector< unsigned int > _grain_idx_to_op
A vector indicating which op is assigned to each grain (by index of the grain)

◆ isNewFeatureOrConnectedRegion()

bool PolycrystalUserObjectBase::isNewFeatureOrConnectedRegion ( const DofObject *  dof_object,
std::size_t &  current_index,
FeatureData *&  feature,
Status status,
unsigned int new_id 
)
overrideprotectedvirtualinherited

Method called during the recursive flood routine that should return whether or not the current entity is part of the current feature (if one is being explored), or if it's the start of a new feature.

When building the IC, we can't use the _entities_visited data structure the same way as we do for the base class. We need to discover multiple overlapping grains in a single pass. However we don't know what grain we are working on when we enter the flood routine (when that check is normally made). Only after we've made the callback to the child class do we know which grains we are operating on (at least until we've triggered the recursion). We need to see if there is at least one active grain where we haven't already visited the current entity before continuing.

If we get here the current entity is not part of the active feature, however we now want to look at neighbors.

Retrieve only the active neighbors for each side of this element, append them to the list of active neighbors

In general, {evaluable elements} >= {local elements} U {algebraic ghosting elements}. That is, the number of evaluable elements does NOT necessarily equal to the number of local and algebraic ghosting elements. The neighbors of evaluable elements can be remote even though we have two layers of geometric ghosting elements.

If the current element (passed into this method) doesn't have a connected neighbor but does have a topological neighbor, this might be a new disjoint region that we'll need to represent with a separate bounding box. To find out for sure, we'll need see if the new neighbors are present in any of the halo or disjoint halo sets. If they are not present, this is a new region.

In general, {evaluable elements} >= {local elements} U {algebraic ghosting elements}. That is, the number of evaluable elements does NOT necessarily equal to the number of local and algebraic ghosting elements. The neighbors of evaluable elements can be remote even though we have two layers of geometric ghosting elements.

If the value is only above the connecting threshold, it's still part of a feature but possibly part of one that we'll discard if there is never any starting threshold encountered.

Reimplemented from FeatureFloodCount.

Definition at line 334 of file PolycrystalUserObjectBase.C.

339 {
340  mooseAssert(_t_step == 0, "PolyIC only works if we begin in the initial condition");
341 
342  // Retrieve the id of the current entity
343  auto entity_id = dof_object->id();
344  auto grains_it = _entity_to_grain_cache.lower_bound(entity_id);
345 
346  if (grains_it == _entity_to_grain_cache.end() || grains_it->first != entity_id)
347  {
348  std::vector<unsigned int> grain_ids;
349 
350  if (_is_elemental)
351  getGrainsBasedOnElem(*static_cast<const Elem *>(dof_object), grain_ids);
352  else
353  getGrainsBasedOnPoint(*static_cast<const Node *>(dof_object), grain_ids);
354 
355  grains_it = _entity_to_grain_cache.emplace_hint(grains_it, entity_id, std::move(grain_ids));
356  }
357 
367  auto saved_grain_id = invalid_id;
368  if (current_index == invalid_size_t)
369  {
370  for (auto grain_id : grains_it->second)
371  {
372  auto map_it = _grain_to_op.find(grain_id);
373  mooseAssert(!_colors_assigned || map_it != _grain_to_op.end(), "grain_id missing");
374  auto map_num = _colors_assigned ? map_it->second : grain_id;
375 
376  if (_entities_visited[map_num].find(entity_id) == _entities_visited[map_num].end())
377  {
378  saved_grain_id = grain_id;
379  current_index = map_num;
380  break;
381  }
382  }
383 
384  if (current_index == invalid_size_t)
385  return false;
386  }
387  else if (_entities_visited[current_index].find(entity_id) !=
388  _entities_visited[current_index].end())
389  return false;
390 
391  if (!feature)
392  {
393  new_id = saved_grain_id;
394  status &= ~Status::INACTIVE;
395 
396  return true;
397  }
398  else
399  {
400  const auto & grain_ids = grains_it->second;
401  if (std::find(grain_ids.begin(), grain_ids.end(), feature->_id) != grain_ids.end())
402  return true;
403 
409  if (_is_elemental)
410  {
411  Elem * elem = _mesh.queryElemPtr(entity_id);
412  mooseAssert(elem, "Element is nullptr");
413 
414  std::vector<const Elem *> all_active_neighbors;
415  MeshBase & mesh = _mesh.getMesh();
416 
417  for (auto i = decltype(elem->n_neighbors())(0); i < elem->n_neighbors(); ++i)
418  {
419  const Elem * neighbor_ancestor = nullptr;
420 
425  neighbor_ancestor = elem->neighbor_ptr(i);
426 
427  if (neighbor_ancestor)
428  {
435  if (neighbor_ancestor->is_remote())
436  continue;
437 
438  neighbor_ancestor->active_family_tree_by_neighbor(all_active_neighbors, elem, false);
439  }
440  else // if (expand_halos_only /*&& feature->_periodic_nodes.empty()*/)
441  {
442  neighbor_ancestor = elem->topological_neighbor(i, mesh, *_point_locator, _pbs);
443 
451  if (neighbor_ancestor)
452  {
459  if (neighbor_ancestor->is_remote())
460  continue;
461 
462  neighbor_ancestor->active_family_tree_by_topological_neighbor(
463  all_active_neighbors, elem, mesh, *_point_locator, _pbs, false);
464  }
465  }
466  }
467 
468  for (const auto neighbor : all_active_neighbors)
469  {
470  // Retrieve the id of the current entity
471  auto neighbor_id = neighbor->id();
472  auto neighbor_it = _entity_to_grain_cache.lower_bound(neighbor_id);
473 
474  if (neighbor_it == _entity_to_grain_cache.end() || neighbor_it->first != neighbor_id)
475  {
476  std::vector<unsigned int> more_grain_ids;
477 
478  getGrainsBasedOnElem(*static_cast<const Elem *>(neighbor), more_grain_ids);
479 
480  neighbor_it = _entity_to_grain_cache.emplace_hint(
481  neighbor_it, neighbor_id, std::move(more_grain_ids));
482  }
483 
484  const auto & more_grain_ids = neighbor_it->second;
485  if (std::find(more_grain_ids.begin(), more_grain_ids.end(), feature->_id) !=
486  more_grain_ids.end())
487  return true;
488  }
489  }
490 
491  return false;
492  }
493 }
std::map< unsigned int, unsigned int > _grain_to_op
A map of the grain_id to op.
static const std::size_t invalid_size_t
Status
This enumeration is used to indicate status of the grains in the _unique_grains data structure...
std::vector< std::set< dof_id_type > > _entities_visited
This variable keeps track of which nodes have been visited during execution.
MeshBase & mesh
virtual void getGrainsBasedOnPoint(const Point &point, std::vector< unsigned int > &grains) const =0
Method for retrieving active grain IDs based on some point in the mesh.
std::map< dof_id_type, std::vector< unsigned int > > _entity_to_grain_cache
virtual Elem * queryElemPtr(const dof_id_type i)
virtual void getGrainsBasedOnElem(const Elem &elem, std::vector< unsigned int > &grains) const
This method may be defined in addition to the point based initialization to speed up lookups...
MPI_Status status
MeshBase & getMesh()
bool _colors_assigned
A Boolean indicating whether the object has assigned colors to grains (internal use) ...
static const unsigned int invalid_id
std::unique_ptr< PointLocatorBase > _point_locator
PeriodicBoundaries * _pbs
A pointer to the periodic boundary constraints object.
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
MooseMesh & _mesh
A reference to the mesh.

◆ mergeSets()

void PolycrystalUserObjectBase::mergeSets ( )
overrideprotectedvirtualinherited

This routine is called on the primary rank only and stitches together the partial feature pieces seen on any processor.

With initial conditions we know the grain IDs of every grain (even partial grains). We can use this information to put all mergeable features adjacent to one and other in the list so that merging is simply O(n).

Insert the new entity at the end of the list so that it may be checked against all other partial features again.

Now remove both halves the merged features: it2 contains the "moved" feature cell just inserted at the back of the list, it1 contains the mostly empty other half. We have to be careful about the order in which these two elements are deleted. We delete it2 first since we don't care where its iterator points after the deletion. We are going to break out of this loop anyway. If we delete it1 first, it may end up pointing at the same location as it2 which after the second deletion would cause both of the iterators to be invalidated.

Reimplemented from FeatureFloodCount.

Definition at line 288 of file PolycrystalUserObjectBase.C.

289 {
290  // When working with _distribute_merge_work all of the maps will be empty except for one
291  for (const auto map_num : index_range(_partial_feature_sets))
292  {
298  _partial_feature_sets[map_num].sort();
299 
300  auto it1 = _partial_feature_sets[map_num].begin();
301  auto it_end = _partial_feature_sets[map_num].end();
302  while (it1 != it_end)
303  {
304  auto it2 = it1;
305  if (++it2 == it_end)
306  break;
307 
308  if (areFeaturesMergeable(*it1, *it2))
309  {
310  it1->merge(std::move(*it2));
311  _partial_feature_sets[map_num].erase(it2);
312  }
313  else
314  ++it1; // Only increment if we have a mismatch
315  }
316  }
317 }
virtual bool areFeaturesMergeable(const FeatureData &f1, const FeatureData &f2) const override
Method for determining whether two features are mergeable.
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
auto index_range(const T &sizable)

◆ meshChanged()

void FeatureFloodCount::meshChanged ( )
overridevirtualinherited

We need to build a set containing all of the boundary entities to compare against. This will be elements for elemental flooding. Volumes for nodal flooding is not supported

Reimplemented from GeneralPostprocessor.

Reimplemented in FauxPolycrystalVoronoi, and GrainTracker.

Definition at line 321 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::initialSetup(), and GrainTracker::meshChanged().

322 {
323  _point_locator = _mesh.getMesh().sub_point_locator();
324 
326 
327  // Build a new node to element map
328  _nodes_to_elem_map.clear();
329  MeshTools::build_nodes_to_elem_map(_mesh.getMesh(), _nodes_to_elem_map);
330 
336  _all_boundary_entity_ids.clear();
337  if (_is_elemental)
338  for (auto elem_it = _mesh.bndElemsBegin(), elem_end = _mesh.bndElemsEnd(); elem_it != elem_end;
339  ++elem_it)
340  _all_boundary_entity_ids.insert((*elem_it)->_elem->id());
341 }
virtual bnd_elem_iterator bndElemsEnd()
std::multimap< dof_id_type, dof_id_type > _periodic_node_map
The data structure which is a list of nodes that are constrained to other nodes based on the imposed ...
virtual bnd_elem_iterator bndElemsBegin()
MeshBase & getMesh()
unsigned long _var_number
This variable is used to build the periodic node map.
std::unique_ptr< PointLocatorBase > _point_locator
PeriodicBoundaries * _pbs
A pointer to the periodic boundary constraints object.
std::unordered_map< dof_id_type, std::vector< const Elem * > > _nodes_to_elem_map
The data structure used to find neighboring elements give a node ID.
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
MooseMesh & _mesh
A reference to the mesh.
void buildPeriodicNodeMap(std::multimap< dof_id_type, dof_id_type > &periodic_node_map, unsigned int var_number, PeriodicBoundaries *pbs) const
std::unordered_set< dof_id_type > _all_boundary_entity_ids
The set of entities on the boundary of the domain used for determining if features intersect any boun...

◆ numberOfDistributedMergeHelpers()

processor_id_type PolycrystalUserObjectBase::numberOfDistributedMergeHelpers ( ) const
overrideprotectedvirtualinherited

Returns a number indicating the number of merge helpers when running in parallel based on certain implementer decided criteria.

This is a communication versus computation trade-off that we are almost always willing to make except for small problems. The decision however may be more complicated for some derived classes.

Reimplemented from FeatureFloodCount.

Definition at line 160 of file PolycrystalUserObjectBase.C.

161 {
163  "prepareDataForTransfer() hasn't been called yet");
164 
165  return _num_chunks;
166 }
processor_id_type _num_chunks
The number of chunks (for merging the features together)
static const processor_id_type invalid_proc_id

◆ numCoupledVars()

std::size_t FeatureFloodCount::numCoupledVars ( ) const
inlineinherited

Returns the number of coupled varaibles.

Definition at line 87 of file FeatureFloodCount.h.

87 { return _n_vars; }
const std::size_t _n_vars

◆ precomputeGrainStructure()

virtual void PolycrystalUserObjectBase::precomputeGrainStructure ( )
inlinevirtualinherited

This callback is triggered after the object is initialized and may be optionally overridden to do precompute the element to grain identifiers ahead of time.

Reimplemented in PolycrystalCircles, PolycrystalHex, and PolycrystalVoronoi.

Definition at line 33 of file PolycrystalUserObjectBase.h.

Referenced by PolycrystalUserObjectBase::execute().

33 {}

◆ prepareDataForTransfer()

void PolycrystalUserObjectBase::prepareDataForTransfer ( )
overrideprotectedvirtualinherited

This routine uses the local flooded data to build up the local feature data structures (_partial feature_sets).

This routine does not perform any communication so the _partial_feature_sets data structure will only contain information from the local processor after calling this routine. Any existing data in the _partial_feature_sets structure is destroyed by calling this routine.

_partial_feature_sets layout: The outer vector is sized to one when _single_map_mode == true, otherwise it is sized for the number of coupled variables. The inner list represents the flooded regions (local only after this call but fully populated after parallel communication and stitching).

With this class, all of the partial features are crammed into a single "outer" entry in our data structure because we don't know the variable assignments during the initial condition (that is the whole point of this class!). However, what we do know is the feature number that each piece belongs to, which is even more useful for merging. However, with extensive testing on larger problems, even ordering optimally ordering these pieces is far too much work for a single core to process. In order create a scalable algorithm, we'll first order our data, then break it into complete chunks for several processors to work on concurrently.

After sorting the data structure, it'll look something like this on some rank: _partial_feature_sets (showing the unique_id and fake variable number): 0 0 0 0 1 1 1 3 4 4 4 4 4 6 6 ...

We may very well have gaps in our numbering. This is a local view on one rank. We'd like to transform the data into something like the following 0 0 0 0 1 1 1 <- First 3 items here (even when we don't have all features) 1 3 4 4 4 4 4 <- Next 3 items here 2 6 6 ... <- Next 3 or remainder (linear partitioning)

The way to break up this work is to simply break it into min(n_features, n_procs) chunks. e.g. If we have 70 features and 8 cores, we'll partition the work into 8 chunks. In the odd case where we have more processors than features (e.g. 100 processors merging 10 features), we'll use end up using a subset of the available cores.

To get all this started we just need the number of features, but we don't normally know that until we've merged everything together... sigh... Wait! We can fall back on our sorted data structure though and figure out before we sort and merge. We'll need one more parallel communication, that won't hurt anything, right?!

With this class there are no guarentees that our IDs have a contiguous zero-based numbering. However, for many of the common derived classes they do (generated grain structures). If we have holes in our numbering, we might not get an even partition, but it shouldn't break. We just need the best guess at a total number (before we can actually count) which should be bounded by the largest_id + 1.

Here we are resizing our data structures that we normally size upon construction. This is to support the parallel merge capability that's in the FeatureFloodCount class. We'll need to undo this later, there are a few assumptions built on the sizes of these data structures.

See FeatureFloodCount::consolidateMergedFeatures for the "un-sizing" of these structures.

If using a vector container, we need to sort all of the data structures for later operations such as checking for intersection and merging. The following "sort" function does nothing when invoked on a std::set.

Save off the min entity id present in the feature to uniquely identify the feature regardless of n_procs

Reimplemented from FeatureFloodCount.

Definition at line 169 of file PolycrystalUserObjectBase.C.

170 {
172 
202  _partial_feature_sets[0].sort();
203 
204  // Get the largest ID seen on any rank
205  auto largest_id = _partial_feature_sets[0].back()._id;
206  _communicator.max(largest_id);
207  mooseAssert(largest_id != invalid_size_t, "Largest ID should not be invalid");
208 
216  auto total_items = largest_id + 1;
217 
218  _num_chunks = std::min(_app.n_processors(), total_items);
219 
229 
230  for (auto it = _partial_feature_sets[0].begin(); it != _partial_feature_sets[0].end();
231  /* No increment on it*/)
232  {
233  auto chunk = MooseUtils::linearPartitionChunk(total_items, _num_chunks, it->_id);
234 
235  if (chunk)
236  {
237  _partial_feature_sets[chunk].emplace_back(std::move(*it));
238  it = _partial_feature_sets[0].erase(it); // it is incremented here!
239  }
240  else
241  ++it;
242  }
243 }
static const std::size_t invalid_size_t
const Parallel::Communicator & _communicator
processor_id_type n_processors() const
processor_id_type _num_chunks
The number of chunks (for merging the features together)
processor_id_type linearPartitionChunk(dof_id_type num_items, dof_id_type num_chunks, dof_id_type item_id)
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
void max(const T &r, T &o, Request &req) const
std::vector< unsigned int > _feature_counts_per_map
The number of features seen by this object per map.
virtual void prepareDataForTransfer()
This routine uses the local flooded data to build up the local feature data structures (_partial feat...

◆ printGrainAdjacencyMatrix()

void PolycrystalUserObjectBase::printGrainAdjacencyMatrix ( ) const
protectedinherited

Prints out the adjacency matrix in a nicely spaced integer format.

Definition at line 616 of file PolycrystalUserObjectBase.C.

Referenced by PolycrystalUserObjectBase::finalize().

617 {
618  _console << "Grain Adjacency Matrix:\n";
619  for (unsigned int i = 0; i < _adjacency_matrix->m(); i++)
620  {
621  for (unsigned int j = 0; j < _adjacency_matrix->n(); j++)
622  _console << _adjacency_matrix->el(i, j) << " ";
623  _console << '\n';
624  }
625 
626  _console << "Grain to OP assignments:\n";
627  for (auto op : _grain_idx_to_op)
628  _console << op << " ";
629  _console << '\n' << std::endl;
630 }
std::unique_ptr< DenseMatrix< Real > > _adjacency_matrix
The dense adjacency matrix.
std::vector< unsigned int > _grain_idx_to_op
A vector indicating which op is assigned to each grain (by index of the grain)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const ConsoleStream _console

◆ restoreOriginalDataStructures()

void PolycrystalUserObjectBase::restoreOriginalDataStructures ( std::vector< std::list< FeatureData >> &  orig)
overrideprotectedvirtualinherited

Reimplemented from FeatureFloodCount.

Definition at line 320 of file PolycrystalUserObjectBase.C.

321 {
322  // Move all the data back into the first list
323  auto & master_list = orig[0];
324  for (MooseIndex(_maps_size) map_num = 1; map_num < orig.size(); ++map_num)
325  {
326  master_list.splice(master_list.end(), orig[map_num]);
327  orig[map_num].clear();
328  }
329 
330  orig.resize(1);
331 }
const std::size_t _maps_size
Convenience variable holding the size of all the datastructures size by the number of maps...

◆ scatterAndUpdateRanks()

void FeatureFloodCount::scatterAndUpdateRanks ( )
protectedinherited

Calls buildLocalToGlobalIndices to build the individual local to global indicies for each rank and scatters that information to all ranks.

Finally, the non-primary ranks update their own data structures to reflect the global mappings.

On non-root processors we can't maintain the full _feature_sets data structure since we don't have all of the global information. We'll move the items from the partial feature sets into a flat structure maintaining order and update the internal IDs with the proper global ID.

Important: Make sure we clear the local status if we received a valid global index for this feature. It's possible that we have a status of INVALID on the local processor because there was never any starting threshold found. However, the root processor wouldn't have sent an index if it didn't find a starting threshold connected to our local piece.

Definition at line 710 of file FeatureFloodCount.C.

Referenced by GrainTracker::assignGrains(), FeatureFloodCount::finalize(), and GrainTracker::trackGrains().

711 {
712  // local to global map (one per processor)
713  std::vector<int> counts;
714  std::vector<std::size_t> local_to_global_all;
715  if (_is_primary)
716  buildLocalToGlobalIndices(local_to_global_all, counts);
717 
718  // Scatter local_to_global indices to all processors and store in class member variable
719  _communicator.scatter(local_to_global_all, counts, _local_to_global_feature_map);
720 
721  std::size_t largest_global_index = std::numeric_limits<std::size_t>::lowest();
722  if (!_is_primary)
723  {
725 
732  for (auto & list_ref : _partial_feature_sets)
733  {
734  for (auto & feature : list_ref)
735  {
736  mooseAssert(feature._orig_ids.size() == 1, "feature._orig_ids length doesn't make sense");
737 
738  auto global_index = FeatureFloodCount::invalid_size_t;
739  auto local_index = feature._orig_ids.begin()->second;
740 
741  if (local_index < _local_to_global_feature_map.size())
742  global_index = _local_to_global_feature_map[local_index];
743 
744  if (global_index != FeatureFloodCount::invalid_size_t)
745  {
746  if (global_index > largest_global_index)
747  largest_global_index = global_index;
748 
749  // Set the correct global index
750  feature._id = global_index;
751 
759  feature._status &= ~Status::INACTIVE;
760 
761  // Move the feature into the correct place
762  _feature_sets[local_index] = std::move(feature);
763  }
764  }
765  }
766  }
767  else
768  {
769  for (auto global_index : local_to_global_all)
770  if (global_index != FeatureFloodCount::invalid_size_t && global_index > largest_global_index)
771  largest_global_index = global_index;
772  }
773 
774  // communicate the boundary intersection state
775  std::vector<std::pair<unsigned int, int>> intersection_state;
776  for (auto & feature : _feature_sets)
777  intersection_state.emplace_back(feature._id, static_cast<int>(feature._boundary_intersection));
778 
779  // gather on root
780  _communicator.gather(0, intersection_state);
781 
782  // consolidate
783  std::map<unsigned int, int> consolidated_intersection_state;
784  if (_is_primary)
785  for (const auto & [id, state] : intersection_state)
786  consolidated_intersection_state[id] |= state;
787 
788  // broadcast result
789  _communicator.broadcast(consolidated_intersection_state, 0);
790 
791  // apply broadcast changes
792  for (auto & feature : _feature_sets)
793  feature._boundary_intersection |=
794  static_cast<BoundaryIntersection>(consolidated_intersection_state[feature._id]);
795 
796  buildFeatureIdToLocalIndices(largest_global_index);
797 }
void scatter(const std::vector< T, A > &data, T &recv, const unsigned int root_id=0) const
static const std::size_t invalid_size_t
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const
Status
This enumeration is used to indicate status of the grains in the _unique_grains data structure...
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
const bool _is_primary
Convenience variable for testing primary rank.
const Parallel::Communicator & _communicator
virtual void buildLocalToGlobalIndices(std::vector< std::size_t > &local_to_global_all, std::vector< int > &counts) const
This routine populates a stacked vector of local to global indices per rank and the associated count ...
BoundaryIntersection
This enumeration is used to inidacate status of boundary intersections.
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...
void buildFeatureIdToLocalIndices(unsigned int max_id)
This method builds a lookup map for retrieving the right local feature (by index) given a global inde...
std::vector< std::size_t > _local_to_global_feature_map
The vector recording the local to global feature indices.

◆ serialize()

void FeatureFloodCount::serialize ( std::string &  serialized_buffer,
unsigned int  var_num = invalid_id 
)
protectedinherited

This routines packs the _partial_feature_sets data into a structure suitable for parallel communication operations.

Definition at line 1084 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::communicateAndMerge().

1085 {
1086  // stream for serializing the _partial_feature_sets data structure to a byte stream
1087  std::ostringstream oss;
1088 
1089  mooseAssert(var_num == invalid_id || var_num < _partial_feature_sets.size(),
1090  "var_num out of range");
1091 
1092  // Serialize everything
1093  if (var_num == invalid_id)
1094  dataStore(oss, _partial_feature_sets, this);
1095  else
1096  dataStore(oss, _partial_feature_sets[var_num], this);
1097 
1098  // Populate the passed in string pointer with the string stream's buffer contents
1099  serialized_buffer.assign(oss.str());
1100 }
void dataStore(std::ostream &stream, FeatureFloodCount::FeatureData &feature, void *context)
static const unsigned int invalid_id
std::vector< std::list< FeatureData > > _partial_feature_sets
The data structure used to hold partial and communicated feature data, during the discovery and mergi...

◆ sortAndLabel()

void FeatureFloodCount::sortAndLabel ( )
protectedinherited

Sort and assign ids to features based on their position in the container after sorting.

Perform a sort to give a parallel unique sorting to the identified features. We use the "min_entity_id" inside each feature to assign it's position in the sorted vector.

Sanity check. Now that we've sorted the flattened vector of features we need to make sure that the counts vector still lines up appropriately with each feature's _var_index.

Definition at line 568 of file FeatureFloodCount.C.

Referenced by GrainTracker::assignGrains(), and FeatureFloodCount::finalize().

569 {
570  mooseAssert(_is_primary, "sortAndLabel can only be called on the primary");
571 
577  std::sort(_feature_sets.begin(), _feature_sets.end());
578 
579 #ifndef NDEBUG
580 
585  unsigned int feature_offset = 0;
586  for (const auto map_num : make_range(_maps_size))
587  {
588  // Skip empty map checks
589  if (_feature_counts_per_map[map_num] == 0)
590  continue;
591 
592  // Check the begin and end of the current range
593  auto range_front = feature_offset;
594  auto range_back = feature_offset + _feature_counts_per_map[map_num] - 1;
595 
596  mooseAssert(range_front <= range_back && range_back < _feature_count,
597  "Indexing error in feature sets");
598 
599  if (!_single_map_mode && (_feature_sets[range_front]._var_index != map_num ||
600  _feature_sets[range_back]._var_index != map_num))
601  mooseError("Error in _feature_sets sorting, map index: ", map_num);
602 
603  feature_offset += _feature_counts_per_map[map_num];
604  }
605 #endif
606 
607  // Label the features with an ID based on the sorting (processor number independent value)
608  for (const auto i : index_range(_feature_sets))
609  if (_feature_sets[i]._id == invalid_id)
610  _feature_sets[i]._id = i;
611 }
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
const bool _is_primary
Convenience variable for testing primary rank.
const std::size_t _maps_size
Convenience variable holding the size of all the datastructures size by the number of maps...
static const unsigned int invalid_id
const bool _single_map_mode
This variable is used to indicate whether or not multiple maps are used during flooding.
unsigned int _feature_count
The number of features seen by this object (same as summing _feature_counts_per_map) ...
IntRange< T > make_range(T beg, T end)
std::vector< unsigned int > _feature_counts_per_map
The number of features seen by this object per map.
void mooseError(Args &&... args) const
auto index_range(const T &sizable)

◆ updateBoundaryIntersections()

void FeatureFloodCount::updateBoundaryIntersections ( FeatureData feature) const
protectedinherited

Update the feature's attributes to indicate boundary intersections.

Definition at line 1772 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::prepareDataForTransfer().

1773 {
1774  if (_is_elemental)
1775  {
1776  for (auto entity : feature._local_ids)
1777  {
1778  // See if this feature is on a boundary if we haven't already figured that out
1779  if ((feature._boundary_intersection & BoundaryIntersection::ANY_BOUNDARY) ==
1781  {
1782  Elem * elem = _mesh.elemPtr(entity);
1783  if (elem && elem->on_boundary())
1784  feature._boundary_intersection |= BoundaryIntersection::ANY_BOUNDARY;
1785  }
1786 
1787  // Now see if the feature touches the primary and/or secondary boundary IDs if we haven't
1788  // figured that out already
1789  if ((feature._boundary_intersection & BoundaryIntersection::PRIMARY_PERCOLATION_BOUNDARY) ==
1791  {
1792  for (auto primary_id : _primary_perc_bnds)
1793  if (_mesh.isBoundaryElem(entity, primary_id))
1794  feature._boundary_intersection |= BoundaryIntersection::PRIMARY_PERCOLATION_BOUNDARY;
1795  }
1796 
1797  if ((feature._boundary_intersection & BoundaryIntersection::SECONDARY_PERCOLATION_BOUNDARY) ==
1799  {
1800  for (auto secondary_id : _secondary_perc_bnds)
1801  if (_mesh.isBoundaryElem(entity, secondary_id))
1802  feature._boundary_intersection |= BoundaryIntersection::SECONDARY_PERCOLATION_BOUNDARY;
1803  }
1804 
1805  // See if the feature contacts any of the user-specified boundaries if we haven't
1806  // done so already
1807  if ((feature._boundary_intersection & BoundaryIntersection::SPECIFIED_BOUNDARY) ==
1809  {
1810  for (auto specified_id : _specified_bnds)
1811  if (_mesh.isBoundaryElem(entity, specified_id))
1812  feature._boundary_intersection |= BoundaryIntersection::SPECIFIED_BOUNDARY;
1813  }
1814  }
1815  }
1816 }
std::vector< BoundaryID > _primary_perc_bnds
std::vector< BoundaryID > _specified_bnds
std::vector< BoundaryID > _secondary_perc_bnds
virtual Elem * elemPtr(const dof_id_type i)
const bool _is_elemental
Determines if the flood counter is elements or not (nodes)
bool isBoundaryElem(dof_id_type elem_id) const
MooseMesh & _mesh
A reference to the mesh.

◆ updateFieldInfo()

void FeatureFloodCount::updateFieldInfo ( )
protectedvirtualinherited

This method is used to populate any of the data structures used for storing field data (nodal or elemental).

It is called at the end of finalize and can make use of any of the data structures created during the execution of this postprocessor.

Reimplemented in GrainTracker.

Definition at line 1282 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::finalize().

1283 {
1284  for (const auto i : index_range(_feature_sets))
1285  {
1286  auto & feature = _feature_sets[i];
1287 
1288  // If the developer has requested _condense_map_info we'll make sure we only update the zeroth
1289  // map
1290  auto map_index = (_single_map_mode || _condense_map_info) ? decltype(feature._var_index)(0)
1291  : feature._var_index;
1292 
1293  // Loop over the entity ids of this feature and update our local map
1294  for (auto entity : feature._local_ids)
1295  {
1296  _feature_maps[map_index][entity] = static_cast<int>(feature._id);
1297 
1298  if (_var_index_mode)
1299  _var_index_maps[map_index][entity] = feature._var_index;
1300 
1301  // Fill in the data structure that keeps track of all features per elem
1303  {
1304  auto insert_pair = moose_try_emplace(
1305  _entity_var_to_features, entity, std::vector<unsigned int>(_n_vars, invalid_id));
1306  auto & vec_ref = insert_pair.first->second;
1307  vec_ref[feature._var_index] = feature._id;
1308  }
1309  }
1310 
1311  if (_compute_halo_maps)
1312  // Loop over the halo ids to update cells with halo information
1313  for (auto entity : feature._halo_ids)
1314  _halo_ids[map_index][entity] = static_cast<int>(feature._id);
1315 
1316  // Loop over the ghosted ids to update cells with ghost information
1317  for (auto entity : feature._ghosted_ids)
1318  _ghosted_entity_ids[entity] = 1;
1319 
1320  // TODO: Fixme
1321  if (!_global_numbering)
1322  mooseError("Local numbering currently disabled");
1323  }
1324 }
const std::size_t _n_vars
const bool _condense_map_info
std::vector< FeatureData > & _feature_sets
The data structure used to hold the globally unique features.
std::map< dof_id_type, std::vector< unsigned int > > _entity_var_to_features
std::pair< typename M::iterator, bool > moose_try_emplace(M &m, const typename M::key_type &k, Args &&... args)
std::map< dof_id_type, int > _ghosted_entity_ids
The map for holding reconstructed ghosted element information.
std::vector< std::map< dof_id_type, int > > _halo_ids
The data structure for looking up halos around features.
const bool _global_numbering
This variable is used to indicate whether or not we identify features with unique numbers on multiple...
static const unsigned int invalid_id
std::vector< std::map< dof_id_type, int > > _feature_maps
The feature maps contain the raw flooded node information and eventually the unique grain numbers...
const bool _single_map_mode
This variable is used to indicate whether or not multiple maps are used during flooding.
const bool _compute_halo_maps
Indicates whether or not to communicate halo map information with all ranks.
void mooseError(Args &&... args) const
const bool _compute_var_to_feature_map
Indicates whether or not the var to feature map is populated.
auto index_range(const T &sizable)
const bool _var_index_mode
This variable is used to indicate whether the maps will contain unique region information or just the...
std::vector< std::map< dof_id_type, int > > _var_index_maps
This map keeps track of which variables own which nodes.

◆ updateRegionOffsets()

void FeatureFloodCount::updateRegionOffsets ( )
protectedinherited

This routine updates the _region_offsets variable which is useful for quickly determining the proper global number for a feature when using multimap mode.

◆ validParams()

InputParameters PolycrystalEBSD::validParams ( )
static

Definition at line 16 of file PolycrystalEBSD.C.

17 {
19  params.addClassDescription("Object for setting up a polycrystal structure from an EBSD Datafile");
20  params.addParam<unsigned int>("phase", "The phase to use for all queries.");
21  params.addParam<UserObjectName>("ebsd_reader", "EBSD Reader for initial condition");
22  return params;
23 }
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()

◆ visitElementalNeighbors()

void FeatureFloodCount::visitElementalNeighbors ( const Elem *  elem,
FeatureData feature,
bool  expand_halos_only,
bool  disjoint_only 
)
protectedinherited

Retrieve only the active neighbors for each side of this element, append them to the list of active neighbors

In general, {evaluable elements} >= {local elements} U {algebraic ghosting elements}. That is, the number of evaluable elements does NOT necessarily equal to the number of local and algebraic ghosting elements. The neighbors of evaluable elements can be remote even though we have two layers of geometric ghosting elements.

If the current element (passed into this method) doesn't have a connected neighbor but does have a topological neighbor, this might be a new disjoint region that we'll need to represent with a separate bounding box. To find out for sure, we'll need see if the new neighbors are present in any of the halo or disjoint halo sets. If they are not present, this is a new region.

In general, {evaluable elements} >= {local elements} U {algebraic ghosting elements}. That is, the number of evaluable elements does NOT necessarily equal to the number of local and algebraic ghosting elements. The neighbors of evaluable elements can be remote even though we have two layers of geometric ghosting elements.

This neighbor is NULL which means we need to expand the bounding box here in case this grain is up against multiple domain edges so we don't end up with a degenerate bounding box.

Definition at line 1616 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::expandEdgeHalos(), and FeatureFloodCount::flood().

1620 {
1621  mooseAssert(elem, "Elem is NULL");
1622 
1623  std::vector<const Elem *> all_active_neighbors;
1624  MeshBase & mesh = _mesh.getMesh();
1625 
1626  // Loop over all neighbors (at the the same level as the current element)
1627  for (const auto i : make_range(elem->n_neighbors()))
1628  {
1629  const Elem * neighbor_ancestor = nullptr;
1630  bool topological_neighbor = false;
1631 
1636  neighbor_ancestor = elem->neighbor_ptr(i);
1637 
1638  if (neighbor_ancestor)
1639  {
1646  if (neighbor_ancestor->is_remote())
1647  continue;
1648 
1649  neighbor_ancestor->active_family_tree_by_neighbor(all_active_neighbors, elem, false);
1650  }
1651  else
1652  {
1653  neighbor_ancestor = elem->topological_neighbor(i, mesh, *_point_locator, _pbs);
1654 
1662  if (neighbor_ancestor)
1663  {
1670  if (neighbor_ancestor->is_remote())
1671  continue;
1672 
1673  neighbor_ancestor->active_family_tree_by_topological_neighbor(
1674  all_active_neighbors, elem, mesh, *_point_locator, _pbs, false);
1675 
1676  topological_neighbor = true;
1677  }
1678  else
1679  {
1685  updateBBoxExtremesHelper(feature->_bboxes[0], *elem);
1686  }
1687  }
1688 
1689  visitNeighborsHelper(elem,
1690  all_active_neighbors,
1691  feature,
1692  expand_halos_only,
1693  topological_neighbor,
1694  disjoint_only);
1695 
1696  all_active_neighbors.clear();
1697  }
1698 }
MeshBase & mesh
MeshBase & getMesh()
std::unique_ptr< PointLocatorBase > _point_locator
PeriodicBoundaries * _pbs
A pointer to the periodic boundary constraints object.
void visitNeighborsHelper(const T *curr_entity, std::vector< const T *> neighbor_entities, FeatureData *feature, bool expand_halos_only, bool topological_neighbor, bool disjoint_only)
The actual logic for visiting neighbors is abstracted out here.
IntRange< T > make_range(T beg, T end)
void updateBBoxExtremesHelper(BoundingBox &bbox, const Point &node)
MooseMesh & _mesh
A reference to the mesh.

◆ visitNeighborsHelper()

template<typename T >
void FeatureFloodCount::visitNeighborsHelper ( const T *  curr_entity,
std::vector< const T *>  neighbor_entities,
FeatureData feature,
bool  expand_halos_only,
bool  topological_neighbor,
bool  disjoint_only 
)
protectedinherited

The actual logic for visiting neighbors is abstracted out here.

This method is templated to handle the Nodal and Elemental cases together.

Only recurse where we own this entity and it's a topologically connected entity. We shouldn't even attempt to flood to the periodic boundary because we won't have solution information and if we are using DistributedMesh we probably won't have geometric information either.

When we only recurse on entities we own, we can never get more than one away from a local entity which should be in the ghosted zone.

Premark neighboring entities with a halo mark. These entities may or may not end up being part of the feature. We will not update the _entities_visited data structure here.

Definition at line 1715 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::visitElementalNeighbors(), and FeatureFloodCount::visitNodalNeighbors().

1721 {
1722  // Loop over all active element neighbors
1723  for (const auto neighbor : neighbor_entities)
1724  {
1725  if (neighbor && (!_is_boundary_restricted || isBoundaryEntity(neighbor)))
1726  {
1727  if (expand_halos_only)
1728  {
1729  auto entity_id = neighbor->id();
1730 
1731  if (topological_neighbor || disjoint_only)
1732  feature->_disjoint_halo_ids.insert(feature->_disjoint_halo_ids.end(), entity_id);
1733  else if (!FeatureFloodCount::contains(feature->_local_ids, entity_id))
1734  feature->_halo_ids.insert(feature->_halo_ids.end(), entity_id);
1735  }
1736  else
1737  {
1738  auto my_processor_id = processor_id();
1739 
1740  if (!topological_neighbor && neighbor->processor_id() != my_processor_id)
1741  feature->_ghosted_ids.insert(feature->_ghosted_ids.end(), curr_entity->id());
1742 
1752  if (curr_entity->processor_id() == my_processor_id ||
1753  neighbor->processor_id() == my_processor_id)
1754  {
1761  if (topological_neighbor || disjoint_only)
1762  feature->_disjoint_halo_ids.insert(feature->_disjoint_halo_ids.end(), neighbor->id());
1763  else
1764  _entity_queue.push_front(neighbor);
1765  }
1766  }
1767  }
1768  }
1769 }
bool isBoundaryEntity(const T *entity) const
Returns a Boolean indicating whether the entity is on one of the desired boundaries.
static bool contains(std::set< T > &container, const T &item)
bool _is_boundary_restricted
Indicates that this object should only run on one or more boundaries.
processor_id_type processor_id() const
std::deque< const DofObject * > _entity_queue
The data structure for maintaining entities to flood during discovery.

◆ visitNodalNeighbors()

void FeatureFloodCount::visitNodalNeighbors ( const Node *  node,
FeatureData feature,
bool  expand_halos_only 
)
protectedinherited

These two routines are utility routines used by the flood routine and by derived classes for visiting neighbors.

Since the logic is different for the elemental versus nodal case it's easier to split them up.

Definition at line 1701 of file FeatureFloodCount.C.

Referenced by FeatureFloodCount::expandEdgeHalos(), and FeatureFloodCount::flood().

1704 {
1705  mooseAssert(node, "Node is NULL");
1706 
1707  std::vector<const Node *> all_active_neighbors;
1708  MeshTools::find_nodal_neighbors(_mesh.getMesh(), *node, _nodes_to_elem_map, all_active_neighbors);
1709 
1710  visitNeighborsHelper(node, all_active_neighbors, feature, expand_halos_only, false, false);
1711 }
MeshBase & getMesh()
std::unordered_map< dof_id_type, std::vector< const Elem * > > _nodes_to_elem_map
The data structure used to find neighboring elements give a node ID.
void visitNeighborsHelper(const T *curr_entity, std::vector< const T *> neighbor_entities, FeatureData *feature, bool expand_halos_only, bool topological_neighbor, bool disjoint_only)
The actual logic for visiting neighbors is abstracted out here.
MooseMesh & _mesh
A reference to the mesh.

Member Data Documentation

◆ _adjacency_matrix

std::unique_ptr<DenseMatrix<Real> > PolycrystalUserObjectBase::_adjacency_matrix
protectedinherited

◆ _all_boundary_entity_ids

std::unordered_set<dof_id_type> FeatureFloodCount::_all_boundary_entity_ids
protectedinherited

The set of entities on the boundary of the domain used for determining if features intersect any boundary.

Definition at line 695 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::meshChanged().

◆ _bnd_elem_range

ConstBndElemRange* FeatureFloodCount::_bnd_elem_range
protectedinherited

Boundary element range pointer.

Definition at line 713 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::execute(), and FeatureFloodCount::isBoundaryEntity().

◆ _coloring_algorithm

const MooseEnum PolycrystalUserObjectBase::_coloring_algorithm
protectedinherited

The selected graph coloring algorithm used by this object.

Definition at line 148 of file PolycrystalUserObjectBase.h.

Referenced by PolycrystalUserObjectBase::assignOpsToGrains().

◆ _colors_assigned

bool PolycrystalUserObjectBase::_colors_assigned
protectedinherited

A Boolean indicating whether the object has assigned colors to grains (internal use)

Definition at line 151 of file PolycrystalUserObjectBase.h.

Referenced by PolycrystalUserObjectBase::execute(), PolycrystalUserObjectBase::finalize(), PolycrystalUserObjectBase::initialize(), and PolycrystalUserObjectBase::isNewFeatureOrConnectedRegion().

◆ _compute_halo_maps

const bool FeatureFloodCount::_compute_halo_maps
protectedinherited

Indicates whether or not to communicate halo map information with all ranks.

Definition at line 588 of file FeatureFloodCount.h.

Referenced by GrainTracker::communicateHaloMap(), GrainTracker::meshChanged(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _compute_var_to_feature_map

const bool FeatureFloodCount::_compute_var_to_feature_map
protectedinherited

Indicates whether or not the var to feature map is populated.

Definition at line 591 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::getVarToFeatureVector(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _condense_map_info

const bool FeatureFloodCount::_condense_map_info
protectedinherited

◆ _connecting_threshold

const Real FeatureFloodCount::_connecting_threshold
protectedinherited

The threshold above (or below) which neighboring entities are flooded (where regions can be extended but not started)

Definition at line 561 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::initialize().

◆ _dim

const unsigned int PolycrystalUserObjectBase::_dim
protectedinherited

◆ _dof_map

const DofMap& FeatureFloodCount::_dof_map
protectedinherited

Reference to the dof_map containing the coupled variables.

Definition at line 553 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::flood().

◆ _ebsd_reader

const EBSDReader& PolycrystalEBSD::_ebsd_reader
protected

Definition at line 32 of file PolycrystalEBSD.h.

Referenced by getGrainsBasedOnPoint(), getNodalVariableValue(), and getNumGrains().

◆ _element_average_value

const PostprocessorValue& FeatureFloodCount::_element_average_value
protectedinherited

Average value of the domain which can optionally be used to find features in a field.

Definition at line 676 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::initialize().

◆ _empty_var_to_features

std::vector<unsigned int> FeatureFloodCount::_empty_var_to_features
protectedinherited

◆ _entities_visited

std::vector<std::set<dof_id_type> > FeatureFloodCount::_entities_visited
protectedinherited

This variable keeps track of which nodes have been visited during execution.

We don't use the _feature_map for this since we don't want to explicitly store data for all the unmarked nodes in a serialized datastructures. This keeps our overhead down since this variable never needs to be communicated.

Definition at line 615 of file FeatureFloodCount.h.

Referenced by PolycrystalUserObjectBase::execute(), FeatureFloodCount::flood(), FeatureFloodCount::initialize(), FeatureFloodCount::initialSetup(), and PolycrystalUserObjectBase::isNewFeatureOrConnectedRegion().

◆ _entity_var_to_features

std::map<dof_id_type, std::vector<unsigned int> > FeatureFloodCount::_entity_var_to_features
protectedinherited

◆ _fe_vars

std::vector<MooseVariableFEBase *> FeatureFloodCount::_fe_vars
protectedinherited

The vector of coupled in variables.

Definition at line 548 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::FeatureFloodCount(), and FeatureFloodCount::getFECoupledVars().

◆ _feature_count

unsigned int FeatureFloodCount::_feature_count
protectedinherited

◆ _feature_counts_per_map

std::vector<unsigned int> FeatureFloodCount::_feature_counts_per_map
protectedinherited

◆ _feature_id_to_local_index

std::vector<std::size_t> FeatureFloodCount::_feature_id_to_local_index
protectedinherited

◆ _feature_maps

std::vector<std::map<dof_id_type, int> > FeatureFloodCount::_feature_maps
protectedinherited

The feature maps contain the raw flooded node information and eventually the unique grain numbers.

We have a vector of them so we can create one per variable if that level of detail is desired.

Definition at line 662 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::getEntityValue(), FeatureFloodCount::initialize(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _feature_sets

std::vector<FeatureData>& FeatureFloodCount::_feature_sets
protectedinherited

The data structure used to hold the globally unique features.

The sorting of the vector is implementation defined and may not correspond to anything useful. The ID of each feature should be queried from the FeatureData objects.

Definition at line 646 of file FeatureFloodCount.h.

Referenced by GrainTracker::assignGrains(), PolycrystalUserObjectBase::assignOpsToGrains(), GrainTracker::attemptGrainRenumber(), GrainTracker::broadcastAndUpdateGrainData(), FeatureFloodCount::buildFeatureIdToLocalIndices(), PolycrystalUserObjectBase::buildGrainAdjacencyMatrix(), FeatureFloodCount::buildLocalToGlobalIndices(), GrainTracker::communicateHaloMap(), GrainTracker::computeMinDistancesFromGrain(), FeatureFloodCount::consolidateMergedFeatures(), FeatureFloodCount::doesFeatureIntersectBoundary(), GrainTracker::doesFeatureIntersectBoundary(), FeatureFloodCount::doesFeatureIntersectSpecifiedBoundary(), GrainTracker::doesFeatureIntersectSpecifiedBoundary(), FeatureFloodCount::featureCentroid(), PolycrystalUserObjectBase::finalize(), FeatureFloodCount::getEntityValue(), FeatureFloodCount::getFeatures(), FeatureFloodCount::getFeatureVar(), GrainTracker::getGrainCentroid(), GrainTracker::initialize(), FeatureFloodCount::initialize(), GrainTracker::isFeaturePercolated(), FeatureFloodCount::isFeaturePercolated(), GrainTracker::newGrainCreated(), GrainTracker::prepopulateState(), GrainTracker::remapGrains(), FeatureFloodCount::scatterAndUpdateRanks(), FeatureFloodCount::sortAndLabel(), GrainTracker::trackGrains(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _ghosted_entity_ids

std::map<dof_id_type, int> FeatureFloodCount::_ghosted_entity_ids
protectedinherited

The map for holding reconstructed ghosted element information.

Definition at line 679 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::getEntityValue(), FeatureFloodCount::initialize(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _global_numbering

const bool FeatureFloodCount::_global_numbering
protectedinherited

This variable is used to indicate whether or not we identify features with unique numbers on multiple maps.

Definition at line 581 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::updateFieldInfo().

◆ _grain_to_op

std::map<unsigned int, unsigned int> PolycrystalUserObjectBase::_grain_to_op
protectedinherited

◆ _halo_ids

std::vector<std::map<dof_id_type, int> > FeatureFloodCount::_halo_ids
protectedinherited

The data structure for looking up halos around features.

The outer vector is for splitting out the information per variable. The inner map holds the actual halo information

Definition at line 685 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::FeatureData::clear(), GrainTracker::communicateHaloMap(), FeatureFloodCount::getEntityValue(), FeatureFloodCount::FeatureData::halosIntersect(), FeatureFloodCount::initialize(), FeatureFloodCount::FeatureData::merge(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _is_boundary_restricted

bool FeatureFloodCount::_is_boundary_restricted
protectedinherited

Indicates that this object should only run on one or more boundaries.

Definition at line 710 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::execute(), FeatureFloodCount::FeatureFloodCount(), and FeatureFloodCount::visitNeighborsHelper().

◆ _is_elemental

const bool FeatureFloodCount::_is_elemental
protectedinherited

◆ _is_primary

const bool FeatureFloodCount::_is_primary
protectedinherited

◆ _local_to_global_feature_map

std::vector<std::size_t> FeatureFloodCount::_local_to_global_feature_map
protectedinherited

The vector recording the local to global feature indices.

Definition at line 665 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::scatterAndUpdateRanks().

◆ _maps_size

const std::size_t FeatureFloodCount::_maps_size
protectedinherited

◆ _mesh

MooseMesh& FeatureFloodCount::_mesh
protectedinherited

◆ _n_procs

const processor_id_type FeatureFloodCount::_n_procs
protectedinherited

Convenience variable holding the number of processors in this simulation.

Definition at line 607 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::buildLocalToGlobalIndices(), and GrainTracker::communicateHaloMap().

◆ _n_vars

const std::size_t FeatureFloodCount::_n_vars
protectedinherited

◆ _node_to_grain_weight_map

const std::map<dof_id_type, std::vector<Real> >& PolycrystalEBSD::_node_to_grain_weight_map
protected

Definition at line 33 of file PolycrystalEBSD.h.

Referenced by getNodalVariableValue().

◆ _nodes_to_elem_map

std::unordered_map<dof_id_type, std::vector<const Elem *> > FeatureFloodCount::_nodes_to_elem_map
protectedinherited

The data structure used to find neighboring elements give a node ID.

Definition at line 626 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::meshChanged(), and FeatureFloodCount::visitNodalNeighbors().

◆ _op_num

const unsigned int PolycrystalUserObjectBase::_op_num
protectedinherited

The maximum number of order parameters (colors) available to assign to the grain structure.

Definition at line 142 of file PolycrystalUserObjectBase.h.

Referenced by PolycrystalUserObjectBase::colorGraph(), FauxPolycrystalVoronoi::FauxPolycrystalVoronoi(), FauxPolycrystalVoronoi::initialSetup(), and PolycrystalUserObjectBase::initialSetup().

◆ _output_adjacency_matrix

const bool PolycrystalUserObjectBase::_output_adjacency_matrix
protectedinherited

A user controllable Boolean which can be used to print the adjacency matrix to the console.

Definition at line 154 of file PolycrystalUserObjectBase.h.

Referenced by PolycrystalUserObjectBase::finalize().

◆ _partial_feature_sets

std::vector<std::list<FeatureData> > FeatureFloodCount::_partial_feature_sets
protectedinherited

◆ _pbs

PeriodicBoundaries* FeatureFloodCount::_pbs
protectedinherited

◆ _periodic_node_map

std::multimap<dof_id_type, dof_id_type> FeatureFloodCount::_periodic_node_map
protectedinherited

The data structure which is a list of nodes that are constrained to other nodes based on the imposed periodic boundary conditions.

Definition at line 691 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::appendPeriodicNeighborNodes(), FauxGrainTracker::getEntityValue(), FeatureFloodCount::getEntityValue(), and FeatureFloodCount::meshChanged().

◆ _phase

const unsigned int PolycrystalEBSD::_phase
protected

Definition at line 31 of file PolycrystalEBSD.h.

Referenced by getGrainsBasedOnPoint(), getNodalVariableValue(), and getNumGrains().

◆ _point_locator

std::unique_ptr<PointLocatorBase> FeatureFloodCount::_point_locator
protectedinherited

◆ _primary_perc_bnds

std::vector<BoundaryID> FeatureFloodCount::_primary_perc_bnds
protectedinherited

◆ _secondary_perc_bnds

std::vector<BoundaryID> FeatureFloodCount::_secondary_perc_bnds
protectedinherited

◆ _single_map_mode

const bool FeatureFloodCount::_single_map_mode
protectedinherited

This variable is used to indicate whether or not multiple maps are used during flooding.

Definition at line 575 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::flood(), PolycrystalUserObjectBase::PolycrystalUserObjectBase(), FeatureFloodCount::sortAndLabel(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _specified_bnds

std::vector<BoundaryID> FeatureFloodCount::_specified_bnds
protectedinherited

◆ _step_connecting_threshold

Real FeatureFloodCount::_step_connecting_threshold
protectedinherited

◆ _step_threshold

Real FeatureFloodCount::_step_threshold
protectedinherited

◆ _threshold

const Real FeatureFloodCount::_threshold
protectedinherited

The threshold above (or below) where an entity may begin a new region (feature)

Definition at line 556 of file FeatureFloodCount.h.

Referenced by FauxGrainTracker::execute(), and FeatureFloodCount::initialize().

◆ _use_less_than_threshold_comparison

const bool FeatureFloodCount::_use_less_than_threshold_comparison
protectedinherited

Use less-than when comparing values against the threshold value.

True by default. If false, then greater-than comparison is used instead.

Definition at line 598 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::compareValueWithThreshold(), and FauxGrainTracker::execute().

◆ _var_index_maps

std::vector<std::map<dof_id_type, int> > FeatureFloodCount::_var_index_maps
protectedinherited

This map keeps track of which variables own which nodes.

We need a vector of them for multimap mode where multiple variables can own a single mode.

Note: This map is only populated when "show_var_coloring" is set to true.

Definition at line 623 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::FeatureFloodCount(), FeatureFloodCount::getEntityValue(), FeatureFloodCount::initialize(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _var_index_mode

const bool FeatureFloodCount::_var_index_mode
protectedinherited

This variable is used to indicate whether the maps will contain unique region information or just the variable numbers owning those regions.

Definition at line 585 of file FeatureFloodCount.h.

Referenced by FeatureFloodCount::FeatureFloodCount(), FeatureFloodCount::getEntityValue(), FeatureFloodCount::initialize(), GrainTracker::updateFieldInfo(), and FeatureFloodCount::updateFieldInfo().

◆ _var_number

unsigned long FeatureFloodCount::_var_number
protectedinherited

This variable is used to build the periodic node map.

Assumption: We are going to assume that either all variables are periodic or none are. This assumption can be relaxed at a later time if necessary.

Definition at line 572 of file FeatureFloodCount.h.

Referenced by GrainTracker::centroidRegionDistance(), and FeatureFloodCount::meshChanged().

◆ _vars

std::vector<MooseVariable *> FeatureFloodCount::_vars
protectedinherited

◆ _volatile_feature_sets

std::vector<FeatureData> FeatureFloodCount::_volatile_feature_sets
protectedinherited

Derived objects (e.g.

the GrainTracker) may require restartable data to track information across time steps. The FeatureFloodCounter however does not. This container is here so that we have the flexabilty to switch between volatile and non-volatile storage. The _feature_sets data structure can conditionally refer to this structure or a MOOSE-provided structure, which is backed up.

Definition at line 655 of file FeatureFloodCount.h.

◆ HALO_THICKNESS

const unsigned int PolycrystalUserObjectBase::HALO_THICKNESS = 4
staticprotectedinherited

Used to hold the thickness of the halo that should be constructed for detecting adjacency.

Definition at line 160 of file PolycrystalUserObjectBase.h.

◆ INVALID_COLOR

const unsigned int PolycrystalUserObjectBase::INVALID_COLOR
staticprotectedinherited
Initial value:
=
std::numeric_limits<unsigned int>::max()

Used to indicate an invalid coloring for the built-in back-tracking algorithm.

Definition at line 157 of file PolycrystalUserObjectBase.h.

Referenced by PolycrystalUserObjectBase::colorGraph(), and PolycrystalUserObjectBase::finalize().

◆ invalid_id

const unsigned int FeatureFloodCount::invalid_id = std::numeric_limits<unsigned int>::max()
staticinherited

◆ invalid_proc_id

const processor_id_type FeatureFloodCount::invalid_proc_id
staticinherited
Initial value:
=
std::numeric_limits<processor_id_type>::max()

Definition at line 93 of file FeatureFloodCount.h.

Referenced by PolycrystalUserObjectBase::numberOfDistributedMergeHelpers().

◆ invalid_size_t

const std::size_t FeatureFloodCount::invalid_size_t = std::numeric_limits<std::size_t>::max()
staticinherited

The documentation for this class was generated from the following files: