https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
LayeredBase Class Reference

This base class computes volume integrals of a variable storing partial sums for the specified number of intervals in a direction (x,y,z). More...

#include <LayeredBase.h>

Inheritance diagram for LayeredBase:
[legend]

Public Member Functions

 LayeredBase (const InputParameters &parameters)
 
virtual Real integralValue (const Point &p) const
 Given a Point return the integral value associated with the layer that point falls in.
 
virtual Real getLayerValue (unsigned int layer) const
 Get the value for a given layer.
 
virtual unsigned int getLayer (const Point &p) const
 Helper function to return the layer the point lies in.
 
const std::vector< Real > & getLayerCenters () const
 Get the center coordinates for the layers (along given direction)
 
unsigned int direction () const
 Get direction of the layers.
 
virtual void initialize ()
 
virtual void finalize ()
 
virtual void threadJoin (const UserObject &y)
 

Static Public Member Functions

static InputParameters validParams ()
 

Protected Member Functions

void setLayerValue (unsigned int layer, Real value)
 Set the value for a particular layer.
 
bool layerHasValue (unsigned int layer) const
 Whether or not a layer has a value.
 
void getBounds ()
 Compute bounds, restricted to blocks if given.
 
void computeLayerCenters ()
 Compute the center points for each layer.
 

Protected Attributes

std::string _layered_base_name
 Name of this object.
 
const InputParameters_layered_base_params
 Params for this object.
 
MooseEnum _direction_enum
 The MooseEnum direction the layers are going in.
 
unsigned int _direction
 The component direction the layers are going in. We cache this for speed (so we're not always going through the MooseEnum)
 
bool _interval_based
 Whether or not this object is based on equally spaced intervals or "bounds".
 
unsigned int _num_layers
 Number of layers to split the mesh into.
 
std::vector< Real > _layer_bounds
 The boundaries of the layers.
 
unsigned int _sample_type
 How to sample the values.
 
unsigned int _average_radius
 How many layers both above and below the found layer will be used in the average.
 
bool _using_displaced_mesh
 true if this object operates on the displaced mesh, otherwise false
 
std::vector< Real > _layer_centers
 center coordinates of each layer
 
Real _direction_min
 
Real _direction_max
 
std::vector< Real > & _layer_values
 Value of the integral for each layer.
 
std::vector< int > & _layer_has_value
 Whether or not each layer has had any value summed into it.
 
bool _cumulative
 Whether the values are cumulative over the layers.
 
const bool _positive_cumulative_direction
 Whether the cumulative values should be summed in the positive or negative direction.
 

Private Member Functions

template<typename T , typename... Args>
T & declareRestartableData (const std::string &data_name, Args &&... args)
 Declare a piece of data as "restartable" and initialize it.
 
template<typename T , typename... Args>
ManagedValue< T > declareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 Declares a piece of "managed" restartable data and initialize it.
 
template<typename T , typename... Args>
const T & getRestartableData (const std::string &data_name) const
 Declare a piece of data as "restartable" and initialize it Similar to declareRestartableData but returns a const reference to the object.
 
template<typename T , typename... Args>
T & declareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 Declare a piece of data as "restartable" and initialize it.
 
template<typename T , typename... Args>
T & declareRecoverableData (const std::string &data_name, Args &&... args)
 Declare a piece of data as "recoverable" and initialize it.
 
template<typename T , typename... Args>
T & declareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 Declare a piece of data as "restartable".
 
template<typename T , typename... Args>
T & declareRestartableDataWithObjectNameWithContext (const std::string &data_name, const std::string &object_name, void *context, Args &&... args)
 Declare a piece of data as "restartable".
 
std::string restartableName (const std::string &data_name) const
 Gets the name of a piece of restartable data given a data name, adding the system name and object name prefix.
 
RestartableDataValueregisterRestartableDataOnApp (std::unique_ptr< RestartableDataValue > data, THREAD_ID tid) const
 Helper function for actually registering the restartable data.
 
void registerRestartableNameWithFilterOnApp (const std::string &name, Moose::RESTARTABLE_FILTER filter)
 Helper function for actually registering the restartable data.
 
template<typename T , typename... Args>
RestartableData< T > & declareRestartableDataHelper (const std::string &data_name, void *context, Args &&... args) const
 Helper function for declaring restartable data.
 

Private Attributes

SubProblem_layered_base_subproblem
 Subproblem for the child object.
 
std::vector< SubdomainID_layer_bounding_blocks
 List of SubdomainIDs, if given.
 
bool _has_direction_max_min
 whether the max/min coordinate in the direction is known from user input
 
MooseApp_restartable_app
 Reference to the application.
 
const std::string _restartable_system_name
 The system name this object is in.
 
const THREAD_ID _restartable_tid
 The thread ID for this object.
 
const bool _restartable_read_only
 Flag for toggling read only status (see ReporterData)
 
const RestartableDataMapName _metaname
 Restartable metadata name.
 
std::string _restartable_name
 The name of the object.
 

Detailed Description

This base class computes volume integrals of a variable storing partial sums for the specified number of intervals in a direction (x,y,z).

Definition at line 36 of file LayeredBase.h.

Constructor & Destructor Documentation

◆ LayeredBase()

LayeredBase::LayeredBase ( const InputParameters parameters)

Definition at line 85 of file LayeredBase.C.

86 : Restartable(parameters.getCheckedPointerParam<SubProblem *>("_subproblem")->getMooseApp(),
87 parameters.getObjectName() + "_layered_base",
88 "LayeredBase",
89 parameters.get<THREAD_ID>("_tid")),
91 _layered_base_params(parameters),
92 _direction_enum(parameters.get<MooseEnum>("direction")),
94 _sample_type(parameters.get<MooseEnum>("sample_type")),
95 _average_radius(parameters.get<unsigned int>("average_radius")),
96 _using_displaced_mesh(_layered_base_params.get<bool>("use_displaced_mesh")),
97 _layer_values(declareRestartableData<std::vector<Real>>("layer_values")),
98 _layer_has_value(declareRestartableData<std::vector<int>>("layer_has_value")),
99 _cumulative(parameters.get<bool>("cumulative")),
100 _positive_cumulative_direction(parameters.get<bool>("positive_cumulative_direction")),
101 _layered_base_subproblem(*parameters.getCheckedPointerParam<SubProblem *>("_subproblem")),
104{
105 if (_layered_base_params.isParamValid("num_layers") &&
107 mooseError("'bounds' and 'num_layers' cannot both be set");
108
109 if (!_cumulative && parameters.isParamSetByUser("positive_cumulative_direction"))
111 "The 'positive_cumulative_direction' parameter is unused when 'cumulative' is false");
112
113 if (_layered_base_params.isParamValid("num_layers"))
114 {
115 _num_layers = _layered_base_params.get<unsigned int>("num_layers");
116 _interval_based = true;
117 }
118 else if (_layered_base_params.isParamValid("bounds"))
119 {
120 _interval_based = false;
121
122 _layer_bounds = _layered_base_params.get<std::vector<Real>>("bounds");
123
124 if (_layer_bounds.size() < 2)
125 mooseError("At least two boundaries must be provided in 'bounds' to form layers!");
126
127 // Make sure the bounds are sorted - we're going to depend on this
128 std::sort(_layer_bounds.begin(), _layer_bounds.end());
129
130 if (_layered_base_params.isParamValid("bound_splits") &&
131 _layered_base_params.isParamValid("bound_uniform_splits"))
132 mooseError("Parameters 'bound_splits' and 'bound_uniform_splits' cannot be both supplied");
133
134 // If requested, we uniformly split the layers.
135 if (_layered_base_params.isParamValid("bound_uniform_splits"))
136 {
137 const auto splits = _layered_base_params.get<unsigned int>("bound_uniform_splits");
138 for (unsigned int s = 0; s < splits; ++s)
139 {
140 std::vector<Real> new_bnds;
141 new_bnds.reserve(2 * (_layer_bounds.size() - 1) + 1);
142 for (unsigned int i = 0; i < _layer_bounds.size() - 1; ++i)
143 {
144 new_bnds.emplace_back(_layer_bounds[i]);
145 new_bnds.emplace_back(0.5 * (_layer_bounds[i] + _layer_bounds[i + 1]));
146 }
147 new_bnds.emplace_back(_layer_bounds.back());
148 _layer_bounds = new_bnds;
149 }
150 }
151
152 if (_layered_base_params.isParamValid("bound_splits"))
153 {
154 // expand layers with subdivisions
155 const auto nsubs = _layered_base_params.get<std::vector<unsigned int>>("bound_splits");
156 if (nsubs.size() != _layer_bounds.size() - 1)
157 mooseError("'bound_splits' size must be equal to the size of 'bounds' minus one");
158
159 std::vector<Real> new_layers;
160 new_layers.reserve(std::accumulate(nsubs.begin(), nsubs.end(), (unsigned int)0));
161 new_layers.push_back(_layer_bounds[0]);
162 for (const auto i : index_range(nsubs))
163 {
164 Real dz = (_layer_bounds[i + 1] - _layer_bounds[i]) / nsubs[i];
165 for (const auto j : make_range(nsubs[i]))
166 {
168 new_layers.push_back(new_layers.back() + dz);
169 }
170 }
171 _layer_bounds = new_layers;
172 }
173
174 _num_layers = _layer_bounds.size() - 1; // Layers are only in-between the bounds
178 }
179 else
180 mooseError("One of 'bounds' or 'num_layers' must be specified");
181
182 if (!_interval_based && _sample_type == 1)
183 mooseError("'sample_type = interpolate' not supported with 'bounds'");
184
185 bool has_layer_bounding_block = _layered_base_params.isParamValid("layer_bounding_block");
186 bool has_block = _layered_base_params.isParamValid("block");
187 bool has_direction_min = _layered_base_params.isParamValid("direction_min");
188 bool has_direction_max = _layered_base_params.isParamValid("direction_max");
189
190 if (_has_direction_max_min && has_direction_min)
191 mooseWarning("'direction_min' is unused when providing 'bounds'");
192
193 if (_has_direction_max_min && has_direction_max)
194 mooseWarning("'direction_max' is unused when providing 'bounds'");
195
196 // can only specify one of layer_bounding_block or the pair direction_max/min
197 if (has_layer_bounding_block && (has_direction_min || has_direction_max))
198 mooseError("Only one of 'layer_bounding_block' and the pair 'direction_max' and "
199 "'direction_min' can be provided");
200
201 // if either one of direction_min or direction_max is specified, must provide the other one
202 if (has_direction_min != has_direction_max)
203 mooseError("If providing the layer max/min directions, both 'direction_max' and "
204 "'direction_min' must be specified.");
205
206 if (has_layer_bounding_block)
208 _layered_base_params.get<std::vector<SubdomainName>>("layer_bounding_block"));
209 else if (has_block)
211 _layered_base_params.get<std::vector<SubdomainName>>("block"));
212
213 // specifying the direction max/min overrides anything set with the 'block'
214 if (has_direction_min && has_direction_max)
215 {
216 _direction_min = parameters.get<Real>("direction_min");
217 _direction_max = parameters.get<Real>("direction_max");
219
221 mooseError("'direction_max' must be larger than 'direction_min'");
222 }
223
226
227 // if we haven't already figured out the max/min in specified direction
228 // (either with the 'bounds' or explicit specification from the user), do so
230 getBounds();
231
233}
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
unsigned int THREAD_ID
Definition MooseTypes.h:237
void ErrorVector unsigned int
bool isParamSetByUser(const std::string &name) const
Method returns true if the parameter was set by the user.
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
const std::string & getObjectName() const
T getCheckedPointerParam(const std::string &name, const std::string &error_string="") const
Verifies that the requested parameter exists and is not NULL and returns it to the caller.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another,...
SubProblem & _layered_base_subproblem
Subproblem for the child object.
bool _has_direction_max_min
whether the max/min coordinate in the direction is known from user input
unsigned int _num_layers
Number of layers to split the mesh into.
std::string _layered_base_name
Name of this object.
bool _interval_based
Whether or not this object is based on equally spaced intervals or "bounds".
Real _direction_max
bool _using_displaced_mesh
true if this object operates on the displaced mesh, otherwise false
std::vector< SubdomainID > _layer_bounding_blocks
List of SubdomainIDs, if given.
std::vector< int > & _layer_has_value
Whether or not each layer has had any value summed into it.
void computeLayerCenters()
Compute the center points for each layer.
unsigned int _sample_type
How to sample the values.
bool _cumulative
Whether the values are cumulative over the layers.
const bool _positive_cumulative_direction
Whether the cumulative values should be summed in the positive or negative direction.
const InputParameters & _layered_base_params
Params for this object.
MooseEnum _direction_enum
The MooseEnum direction the layers are going in.
unsigned int _direction
The component direction the layers are going in. We cache this for speed (so we're not always going t...
Real _direction_min
unsigned int _average_radius
How many layers both above and below the found layer will be used in the average.
std::vector< Real > _layer_bounds
The boundaries of the layers.
std::vector< Real > & _layer_values
Value of the integral for each layer.
void getBounds()
Compute bounds, restricted to blocks if given.
MooseApp & getMooseApp() const
Get the MooseApp this class is associated with.
Definition MooseBase.h:87
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition MooseEnum.h:55
std::vector< SubdomainID > getSubdomainIDs(const std::vector< SubdomainName > &subdomain_names) const
Get the associated subdomainIDs for the subdomain names that are passed in.
Definition MooseMesh.C:1726
A class for creating restricted objects.
Definition Restartable.h:29
T & declareRestartableData(const std::string &data_name, Args &&... args)
Declare a piece of data as "restartable" and initialize it.
Generic class for solving transient nonlinear problems.
Definition SubProblem.h:79
virtual MooseMesh & mesh()=0
auto index_range(const T &sizable)
void libmesh_ignore(const Args &...)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)

Member Function Documentation

◆ computeLayerCenters()

void LayeredBase::computeLayerCenters ( )
protected

Compute the center points for each layer.

Definition at line 442 of file LayeredBase.C.

443{
445
446 if (_interval_based)
447 {
449
450 for (const auto i : make_range(_num_layers))
451 _layer_centers[i] = (i + 0.5) * dx;
452 }
453 else
454 {
455 for (const auto i : make_range(_num_layers))
456 _layer_centers[i] = 0.5 * (_layer_bounds[i + 1] + _layer_bounds[i]);
457 }
458}
std::vector< Real > _layer_centers
center coordinates of each layer

Referenced by LayeredBase().

◆ declareManagedRestartableDataWithContext()

template<typename T , typename... Args>
Restartable::ManagedValue< T > Restartable::declareManagedRestartableDataWithContext ( const std::string &  data_name,
void *  context,
Args &&...  args 
)
protectedinherited

Declares a piece of "managed" restartable data and initialize it.

Here, "managed" restartable data means that the caller can destruct this data upon destruction of the return value of this method. Therefore, this ManagedValue<T> wrapper should survive after the final calls to dataStore() for it. That is... at the very end.

This is needed for objects whose destruction ordering is important, and enables natural c++ destruction in reverse construction order of the object that declares it.

See delcareRestartableData and declareRestartableDataWithContext for more information.

Definition at line 283 of file Restartable.h.

286{
287 auto & data_ptr =
288 declareRestartableDataHelper<T>(data_name, context, std::forward<Args>(args)...);
289 return Restartable::ManagedValue<T>(data_ptr);
290}
Wrapper class for restartable data that is "managed.
Definition Restartable.h:43

◆ declareRecoverableData()

template<typename T , typename... Args>
T & Restartable::declareRecoverableData ( const std::string &  data_name,
Args &&...  args 
)
protectedinherited

Declare a piece of data as "recoverable" and initialize it.

This means that in the event of a restart this piece of data will be restored back to its previous value.

Note - this data will NOT be restored on Restart!

NOTE: This returns a reference! Make sure you store it in a reference!

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)
argsArguments to forward to the constructor of the data

Definition at line 358 of file Restartable.h.

359{
360 const auto full_name = restartableName(data_name);
361
363
364 return declareRestartableDataWithContext<T>(data_name, nullptr, std::forward<Args>(args)...);
365}
std::string restartableName(const std::string &data_name) const
Gets the name of a piece of restartable data given a data name, adding the system name and object nam...
Definition Restartable.C:78
void registerRestartableNameWithFilterOnApp(const std::string &name, Moose::RESTARTABLE_FILTER filter)
Helper function for actually registering the restartable data.
Definition Restartable.C:71

◆ declareRestartableData()

template<typename T , typename... Args>
T & Restartable::declareRestartableData ( const std::string &  data_name,
Args &&...  args 
)
protectedinherited

Declare a piece of data as "restartable" and initialize it.

This means that in the event of a restart this piece of data will be restored back to its previous value.

NOTE: This returns a reference! Make sure you store it in a reference!

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)
argsArguments to forward to the constructor of the data

Definition at line 276 of file Restartable.h.

277{
278 return declareRestartableDataWithContext<T>(data_name, nullptr, std::forward<Args>(args)...);
279}

◆ declareRestartableDataHelper()

template<typename T , typename... Args>
RestartableData< T > & Restartable::declareRestartableDataHelper ( const std::string &  data_name,
void *  context,
Args &&...  args 
) const
privateinherited

Helper function for declaring restartable data.

We use this function to reduce code duplication when returning const/nonconst references to the data.

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)
contextContext pointer that will be passed to the load and store functions
argsArguments to forward to the constructor of the data

Definition at line 310 of file Restartable.h.

313{
314 const auto full_name = restartableName(data_name);
315
316 // Here we will create the RestartableData even though we may not use this instance.
317 // If it's already in use, the App will return a reference to the existing instance and we'll
318 // return that one instead. We might refactor this to have the app create the RestartableData
319 // at a later date.
320 auto data_ptr =
321 std::make_unique<RestartableData<T>>(full_name, context, std::forward<Args>(args)...);
322 auto & restartable_data_ref = static_cast<RestartableData<T> &>(
323 registerRestartableDataOnApp(std::move(data_ptr), _restartable_tid));
324
325 return restartable_data_ref;
326}
Concrete definition of a parameter value for a specified type.
const THREAD_ID _restartable_tid
The thread ID for this object.
RestartableDataValue & registerRestartableDataOnApp(std::unique_ptr< RestartableDataValue > data, THREAD_ID tid) const
Helper function for actually registering the restartable data.
Definition Restartable.C:63

◆ declareRestartableDataWithContext()

template<typename T , typename... Args>
T & Restartable::declareRestartableDataWithContext ( const std::string &  data_name,
void *  context,
Args &&...  args 
)
protectedinherited

Declare a piece of data as "restartable" and initialize it.

This means that in the event of a restart this piece of data will be restored back to its previous value.

NOTE: This returns a reference! Make sure you store it in a reference!

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)
contextContext pointer that will be passed to the load and store functions
argsArguments to forward to the constructor of the data

Definition at line 301 of file Restartable.h.

304{
305 return declareRestartableDataHelper<T>(data_name, context, std::forward<Args>(args)...).set();
306}

◆ declareRestartableDataWithObjectName()

template<typename T , typename... Args>
T & Restartable::declareRestartableDataWithObjectName ( const std::string &  data_name,
const std::string &  object_name,
Args &&...  args 
)
protectedinherited

Declare a piece of data as "restartable".

This means that in the event of a restart this piece of data will be restored back to its previous value.

NOTE: This returns a reference! Make sure you store it in a reference!

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)
object_nameA supplied name for the object that is declaring this data.
argsArguments to forward to the constructor of the data

Definition at line 330 of file Restartable.h.

333{
334 return declareRestartableDataWithObjectNameWithContext<T>(
335 data_name, object_name, nullptr, std::forward<Args>(args)...);
336}

◆ declareRestartableDataWithObjectNameWithContext()

template<typename T , typename... Args>
T & Restartable::declareRestartableDataWithObjectNameWithContext ( const std::string &  data_name,
const std::string &  object_name,
void *  context,
Args &&...  args 
)
protectedinherited

Declare a piece of data as "restartable".

This means that in the event of a restart this piece of data will be restored back to its previous value.

NOTE: This returns a reference! Make sure you store it in a reference!

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)
object_nameA supplied name for the object that is declaring this data.
contextContext pointer that will be passed to the load and store functions
argsArguments to forward to the constructor of the data

Definition at line 340 of file Restartable.h.

344{
345 std::string old_name = _restartable_name;
346
347 _restartable_name = object_name;
348
349 T & value = declareRestartableDataWithContext<T>(data_name, context, std::forward<Args>(args)...);
350
351 _restartable_name = old_name;
352
353 return value;
354}
std::string _restartable_name
The name of the object.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)

◆ direction()

unsigned int LayeredBase::direction ( ) const
inline

Get direction of the layers.

Returns
layer direction

Definition at line 73 of file LayeredBase.h.

73{ return _direction; }

◆ finalize()

void LayeredBase::finalize ( )
virtual

Reimplemented in FunctionLayeredIntegral, LayeredAverageBase< BaseType >, LayeredAverageBase< ElementIntegralFunctorUserObject >, LayeredAverageBase< ElementIntegralVariableUserObject >, LayeredAverageBase< SideIntegralFunctorUserObject >, LayeredAverageBase< SideIntegralVariableUserObject >, LayeredExtremumMaterialProperty, LayeredIntegralBase< UserObjectType >, LayeredIntegralBase< BaseType >, LayeredIntegralBase< ElementIntegralFunctorUserObject >, LayeredIntegralBase< ElementIntegralVariableUserObject >, LayeredIntegralBase< SideIntegralFunctorUserObject >, and LayeredIntegralBase< SideIntegralVariableUserObject >.

Definition at line 368 of file LayeredBase.C.

369{
372
373 if (_cumulative)
374 {
375 Real value = 0;
376
378 for (const auto i : make_range(_num_layers))
379 {
380 value += getLayerValue(i);
381 setLayerValue(i, value);
382 }
383 else
384 for (int i = _num_layers - 1; i >= 0; i--)
385 {
386 value += getLayerValue(i);
387 setLayerValue(i, value);
388 }
389 }
390}
virtual Real getLayerValue(unsigned int layer) const
Get the value for a given layer.
void setLayerValue(unsigned int layer, Real value)
Set the value for a particular layer.
void max(const T &r, T &o, Request &req) const
const Parallel::Communicator & comm() const

Referenced by FunctionLayeredIntegral::finalize(), and LayeredIntegralBase< UserObjectType >::finalize().

◆ getBounds()

void LayeredBase::getBounds ( )
protected

Compute bounds, restricted to blocks if given.

Definition at line 468 of file LayeredBase.C.

469{
470 if (_layer_bounding_blocks.size() == 0)
471 {
473 _direction_min = bounding_box.min()(_direction);
474 _direction_max = bounding_box.max()(_direction);
475 }
476 else
477 {
478 _direction_min = std::numeric_limits<Real>::infinity();
479 _direction_max = -std::numeric_limits<Real>::infinity();
480
482
483 for (auto & elem_ptr : *mesh.getActiveLocalElementRange())
484 {
485 auto subdomain_id = elem_ptr->subdomain_id();
486
487 if (std::find(_layer_bounding_blocks.begin(), _layer_bounding_blocks.end(), subdomain_id) ==
489 continue;
490
491 for (auto & node : elem_ptr->node_ref_range())
492 {
493 _direction_min = std::min(_direction_min, node(_direction));
494 _direction_max = std::max(_direction_max, node(_direction));
495 }
496 }
497
498 mesh.comm().min(_direction_min);
499 mesh.comm().max(_direction_max);
500 }
501}
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition MooseMesh.h:95
MeshBase & mesh
libMesh::BoundingBox create_bounding_box(const MeshBase &mesh)

Referenced by initialize(), and LayeredBase().

◆ getLayer()

unsigned int LayeredBase::getLayer ( const Point &  p) const
virtual

Helper function to return the layer the point lies in.

Parameters
pThe point.
Returns
The layer the Point is found in.

Definition at line 402 of file LayeredBase.C.

403{
404 Real direction_x = p(_direction);
405
406 if (direction_x < _direction_min)
407 return 0;
408
409 if (_interval_based)
410 {
411 unsigned int layer =
412 std::floor(((direction_x - _direction_min) / (_direction_max - _direction_min)) *
413 static_cast<Real>(_num_layers));
414
415 if (layer >= _num_layers)
416 layer = _num_layers - 1;
417
418 return layer;
419 }
420 else // Figure out what layer we are in from the bounds
421 {
422 // This finds the first entry in the vector that is larger than what we're looking for
423 std::vector<Real>::const_iterator one_higher =
424 std::upper_bound(_layer_bounds.begin(), _layer_bounds.end(), direction_x);
425
426 if (one_higher == _layer_bounds.end())
427 {
428 return static_cast<unsigned int>(
429 _layer_bounds.size() -
430 2); // Just return the last layer. -2 because layers are "in-between" bounds
431 }
432 else if (one_higher == _layer_bounds.begin())
433 return 0; // Return the first layer
434 else
435 // The -1 is because the interval that we fall in is just _before_ the number that is bigger
436 // (which is what we found
437 return static_cast<unsigned int>(std::distance(_layer_bounds.begin(), one_higher - 1));
438 }
439}

Referenced by FunctionLayeredIntegral::execute(), LayeredExtremumMaterialProperty::execute(), and integralValue().

◆ getLayerCenters()

const std::vector< Real > & LayeredBase::getLayerCenters ( ) const
inline

Get the center coordinates for the layers (along given direction)

Definition at line 67 of file LayeredBase.h.

67{ return _layer_centers; }

Referenced by NearestPointBase< UserObjectType, BaseType >::spatialPoints().

◆ getLayerValue()

Real LayeredBase::getLayerValue ( unsigned int  layer) const
virtual

Get the value for a given layer.

Parameters
layerThe layer index
Returns
The value for the given layer

Definition at line 347 of file LayeredBase.C.

348{
349 if (layer >= _layer_values.size())
350 mooseError("Layer '", layer, "' not found in '", _layered_base_name, "'.");
351 return _layer_values[layer];
352}

Referenced by FunctionLayeredIntegral::execute(), LayeredExtremumMaterialProperty::execute(), finalize(), LayeredExtremumMaterialProperty::finalize(), threadJoin(), and LayeredExtremumMaterialProperty::threadJoin().

◆ getRestartableData()

template<typename T , typename... Args>
const T & Restartable::getRestartableData ( const std::string &  data_name) const
protectedinherited

Declare a piece of data as "restartable" and initialize it Similar to declareRestartableData but returns a const reference to the object.

Forwarded arguments are not allowed in this case because we assume that the object is restarted and we won't need different constructors to initialize it.

NOTE: This returns a const reference! Make sure you store it in a const reference!

Parameters
data_nameThe name of the data (usually just use the same name as the member variable)

Definition at line 294 of file Restartable.h.

295{
296 return declareRestartableDataHelper<T>(data_name, nullptr).get();
297}

◆ initialize()

void LayeredBase::initialize ( )
virtual

◆ integralValue()

Real LayeredBase::integralValue ( const Point &  p) const
virtual

Given a Point return the integral value associated with the layer that point falls in.

Parameters
pThe point to look for in the layers.

Definition at line 236 of file LayeredBase.C.

237{
238 unsigned int layer = getLayer(p);
239
240 int higher_layer = -1;
241 int lower_layer = -1;
242
243 for (unsigned int i = layer; i < _layer_values.size(); i++)
244 {
245 if (_layer_has_value[i])
246 {
247 higher_layer = i;
248 break;
249 }
250 }
251
252 for (int i = layer - 1; i >= 0; i--)
253 {
254 if (_layer_has_value[i])
255 {
256 lower_layer = i;
257 break;
258 }
259 }
260
261 if (higher_layer == -1 && lower_layer == -1)
262 return 0; // TODO: We could error here but there are startup dependency problems
263
264 switch (_sample_type)
265 {
266 case 0: // direct
267 {
268 if (higher_layer == -1) // Didn't find a higher layer
269 return _layer_values[lower_layer];
270
271 if (unsigned(higher_layer) == layer) // constant in a layer
272 return _layer_values[higher_layer];
273
274 if (lower_layer == -1) // Didn't find a lower layer
275 return _layer_values[higher_layer];
276
277 return (_layer_values[higher_layer] + _layer_values[lower_layer]) / 2;
278 }
279 case 1: // interpolate
280 {
281 if (higher_layer == -1) // Didn't find a higher layer
282 return _layer_values[lower_layer];
283
284 Real layer_length = (_direction_max - _direction_min) / _num_layers;
285 Real lower_coor = _direction_min;
286 Real lower_value = 0;
287 if (lower_layer != -1)
288 {
289 lower_coor += (lower_layer + 1) * layer_length;
290 lower_value = _layer_values[lower_layer];
291 }
292
293 // Interpolate between the two points
294 Real higher_value = _layer_values[higher_layer];
295
296 // Linear interpolation
297 return lower_value +
298 (higher_value - lower_value) * (p(_direction) - lower_coor) / layer_length;
299 }
300 case 2: // average
301 {
302 Real total = 0;
303 unsigned int num_values = 0;
304
305 if (higher_layer != -1)
306 {
307 for (const auto i : make_range(_average_radius))
308 {
309 int current_layer = higher_layer + i;
310
311 if ((size_t)current_layer >= _layer_values.size())
312 break;
313
314 if (_layer_has_value[current_layer])
315 {
316 total += _layer_values[current_layer];
317 num_values += 1;
318 }
319 }
320 }
321
322 if (lower_layer != -1)
323 {
324 for (const auto i : make_range(_average_radius))
325 {
326 int current_layer = lower_layer - i;
327
328 if (current_layer < 0)
329 break;
330
331 if (_layer_has_value[current_layer])
332 {
333 total += _layer_values[current_layer];
334 num_values += 1;
335 }
336 }
337 }
338
339 return total / num_values;
340 }
341 default:
342 mooseError("Unknown sample type!");
343 }
344}
virtual unsigned int getLayer(const Point &p) const
Helper function to return the layer the point lies in.

Referenced by FunctionLayeredIntegral::spatialValue(), LayeredExtremumMaterialProperty::spatialValue(), and LayeredIntegralBase< UserObjectType >::spatialValue().

◆ layerHasValue()

bool LayeredBase::layerHasValue ( unsigned int  layer) const
inlineprotected

Whether or not a layer has a value.

Definition at line 90 of file LayeredBase.h.

90{ return _layer_has_value[layer]; }

◆ registerRestartableDataOnApp()

RestartableDataValue & Restartable::registerRestartableDataOnApp ( std::unique_ptr< RestartableDataValue data,
THREAD_ID  tid 
) const
privateinherited

Helper function for actually registering the restartable data.

Definition at line 63 of file Restartable.C.

65{
67 std::move(data), tid, _restartable_read_only, _metaname);
68}
RestartableDataValue & registerRestartableData(std::unique_ptr< RestartableDataValue > data, THREAD_ID tid, bool read_only, const RestartableDataMapName &metaname="")
Definition MooseApp.C:2449
const RestartableDataMapName _metaname
Restartable metadata name.
const bool _restartable_read_only
Flag for toggling read only status (see ReporterData)
MooseApp & _restartable_app
Reference to the application.

Referenced by Restartable::declareRestartableDataHelper().

◆ registerRestartableNameWithFilterOnApp()

void Restartable::registerRestartableNameWithFilterOnApp ( const std::string &  name,
Moose::RESTARTABLE_FILTER  filter 
)
privateinherited

Helper function for actually registering the restartable data.

Definition at line 71 of file Restartable.C.

73{
75}
void registerRestartableNameWithFilter(const std::string &name, Moose::RESTARTABLE_FILTER filter)
NOTE: This is an internal function meant for MOOSE use only!
Definition MooseApp.C:1701

Referenced by Restartable::declareRecoverableData().

◆ restartableName()

std::string Restartable::restartableName ( const std::string &  data_name) const
protectedinherited

Gets the name of a piece of restartable data given a data name, adding the system name and object name prefix.

This should only be used in this interface and in testing.

Definition at line 78 of file Restartable.C.

79{
80 return _restartable_system_name + "/" + _restartable_name + "/" + data_name;
81}
const std::string _restartable_system_name
The system name this object is in.

Referenced by Restartable::declareRecoverableData(), and Restartable::declareRestartableDataHelper().

◆ setLayerValue()

void LayeredBase::setLayerValue ( unsigned int  layer,
Real  value 
)
protected

Set the value for a particular layer.

Parameters
layerThe layer you are setting the value for
valueThe value to set

Definition at line 461 of file LayeredBase.C.

462{
463 _layer_values[layer] = value;
464 _layer_has_value[layer] = true;
465}

Referenced by FunctionLayeredIntegral::execute(), LayeredExtremumMaterialProperty::execute(), finalize(), LayeredExtremumMaterialProperty::finalize(), LayeredExtremumMaterialProperty::initialize(), threadJoin(), and LayeredExtremumMaterialProperty::threadJoin().

◆ threadJoin()

void LayeredBase::threadJoin ( const UserObject y)
virtual

◆ validParams()

InputParameters LayeredBase::validParams ( )
static

Definition at line 22 of file LayeredBase.C.

23{
25 MooseEnum directions("x y z");
26
27 params.addRequiredParam<MooseEnum>("direction", directions, "The direction of the layers.");
28 params.addParam<unsigned int>("num_layers", "The number of layers.");
29 params.addParam<std::vector<Real>>("bounds",
30 "The 'bounding' positions of the layers i.e.: '0, "
31 "1.2, 3.7, 4.2' will mean 3 layers between those "
32 "positions.");
33 params.addRangeCheckedParam<unsigned int>("bound_uniform_splits",
34 "bound_uniform_splits > 0",
35 "The number of times the bins specified in 'bounds' "
36 "should be split uniformly.");
37 params.addParam<std::vector<unsigned int>>(
38 "bound_splits", "Number of uniform splits of all layers in 'bounds' (default to all ones)");
39
40 MooseEnum sample_options("direct interpolate average", "direct");
41 params.addParam<MooseEnum>("sample_type",
42 sample_options,
43 "How to sample the layers. 'direct' means get the value of the layer "
44 "the point falls in directly (or average if that layer has no value). "
45 " 'interpolate' does a linear interpolation between the two closest "
46 "layers. 'average' averages the two closest layers.");
47
48 params.addParam<unsigned int>("average_radius",
49 1,
50 "When using 'average' sampling this is how "
51 "the number of values both above and below "
52 "the layer that will be averaged.");
53
54 params.addParam<bool>(
55 "cumulative",
56 false,
57 "When true the value in each layer is the sum of the values up to and including that layer");
58 params.addParam<bool>(
59 "positive_cumulative_direction",
60 true,
61 "When 'cumulative' is true, whether the direction for summing the cumulative value "
62 "is the positive direction or negative direction");
63
64 params.addParam<std::vector<SubdomainName>>(
65 "block", "The list of block ids (SubdomainID) that this object will be applied");
66
67 params.addParam<std::vector<SubdomainName>>("layer_bounding_block",
68 "List of block ids (SubdomainID) that are used to "
69 "determine the upper and lower geometric bounds for "
70 "all layers. If this is not specified, the ids "
71 "specified in 'block' are used for this purpose.");
72
73 params.addParam<Real>("direction_min",
74 "Minimum coordinate along 'direction' that bounds the layers");
75 params.addParam<Real>("direction_max",
76 "Maximum coordinate along 'direction' that bounds the layers");
78 "direction num_layers bounds direction_min direction_max bound_uniform_splits bound_splits",
79 "Layers extent and definition");
80 params.addParamNamesToGroup("sample_type average_radius cumulative positive_cumulative_direction",
81 "Value sampling / aggregating");
82 return params;
83}
InputParameters emptyInputParameters()
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)

Referenced by FunctionLayeredIntegral::validParams(), LayeredExtremumMaterialProperty::validParams(), and LayeredIntegralBase< UserObjectType >::validParams().

Member Data Documentation

◆ _average_radius

unsigned int LayeredBase::_average_radius
protected

How many layers both above and below the found layer will be used in the average.

Definition at line 127 of file LayeredBase.h.

Referenced by integralValue().

◆ _cumulative

bool LayeredBase::_cumulative
protected

Whether the values are cumulative over the layers.

Definition at line 145 of file LayeredBase.h.

Referenced by finalize(), LayeredExtremumMaterialProperty::finalize(), and LayeredBase().

◆ _direction

unsigned int LayeredBase::_direction
protected

The component direction the layers are going in. We cache this for speed (so we're not always going through the MooseEnum)

Definition at line 112 of file LayeredBase.h.

Referenced by direction(), getBounds(), getLayer(), integralValue(), FunctionLayeredIntegral::spatialPoints(), and LayeredExtremumMaterialProperty::spatialPoints().

◆ _direction_enum

MooseEnum LayeredBase::_direction_enum
protected

The MooseEnum direction the layers are going in.

Definition at line 109 of file LayeredBase.h.

◆ _direction_max

Real LayeredBase::_direction_max
protected

Definition at line 136 of file LayeredBase.h.

Referenced by computeLayerCenters(), getBounds(), getLayer(), integralValue(), and LayeredBase().

◆ _direction_min

Real LayeredBase::_direction_min
protected

Definition at line 135 of file LayeredBase.h.

Referenced by computeLayerCenters(), getBounds(), getLayer(), integralValue(), and LayeredBase().

◆ _has_direction_max_min

bool LayeredBase::_has_direction_max_min
private

whether the max/min coordinate in the direction is known from user input

Definition at line 158 of file LayeredBase.h.

Referenced by LayeredBase().

◆ _interval_based

bool LayeredBase::_interval_based
protected

Whether or not this object is based on equally spaced intervals or "bounds".

Definition at line 115 of file LayeredBase.h.

Referenced by computeLayerCenters(), getLayer(), and LayeredBase().

◆ _layer_bounding_blocks

std::vector<SubdomainID> LayeredBase::_layer_bounding_blocks
private

List of SubdomainIDs, if given.

Definition at line 155 of file LayeredBase.h.

Referenced by getBounds(), and LayeredBase().

◆ _layer_bounds

std::vector<Real> LayeredBase::_layer_bounds
protected

The boundaries of the layers.

Definition at line 121 of file LayeredBase.h.

Referenced by computeLayerCenters(), getLayer(), and LayeredBase().

◆ _layer_centers

std::vector<Real> LayeredBase::_layer_centers
protected

◆ _layer_has_value

std::vector<int>& LayeredBase::_layer_has_value
protected

Whether or not each layer has had any value summed into it.

Definition at line 142 of file LayeredBase.h.

Referenced by finalize(), LayeredExtremumMaterialProperty::finalize(), initialize(), integralValue(), LayeredBase(), layerHasValue(), and setLayerValue().

◆ _layer_values

std::vector<Real>& LayeredBase::_layer_values
protected

Value of the integral for each layer.

Definition at line 139 of file LayeredBase.h.

Referenced by finalize(), LayeredExtremumMaterialProperty::finalize(), getLayerValue(), initialize(), integralValue(), LayeredBase(), setLayerValue(), and threadJoin().

◆ _layered_base_name

std::string LayeredBase::_layered_base_name
protected

Name of this object.

Definition at line 103 of file LayeredBase.h.

Referenced by getLayerValue().

◆ _layered_base_params

const InputParameters& LayeredBase::_layered_base_params
protected

Params for this object.

Definition at line 106 of file LayeredBase.h.

Referenced by LayeredBase().

◆ _layered_base_subproblem

SubProblem& LayeredBase::_layered_base_subproblem
private

Subproblem for the child object.

Definition at line 152 of file LayeredBase.h.

Referenced by finalize(), getBounds(), and LayeredBase().

◆ _metaname

const RestartableDataMapName Restartable::_metaname
privateinherited

Restartable metadata name.

Definition at line 247 of file Restartable.h.

Referenced by Restartable::registerRestartableDataOnApp().

◆ _num_layers

unsigned int LayeredBase::_num_layers
protected

◆ _positive_cumulative_direction

const bool LayeredBase::_positive_cumulative_direction
protected

Whether the cumulative values should be summed in the positive or negative direction.

Definition at line 148 of file LayeredBase.h.

Referenced by finalize(), and LayeredExtremumMaterialProperty::finalize().

◆ _restartable_app

MooseApp& Restartable::_restartable_app
protectedinherited

Reference to the application.

Definition at line 234 of file Restartable.h.

Referenced by Restartable::registerRestartableDataOnApp(), and Restartable::registerRestartableNameWithFilterOnApp().

◆ _restartable_name

std::string Restartable::_restartable_name
privateinherited

The name of the object.

Definition at line 250 of file Restartable.h.

Referenced by Restartable::declareRestartableDataWithObjectNameWithContext(), and Restartable::restartableName().

◆ _restartable_read_only

const bool Restartable::_restartable_read_only
protectedinherited

Flag for toggling read only status (see ReporterData)

Definition at line 243 of file Restartable.h.

Referenced by Restartable::registerRestartableDataOnApp().

◆ _restartable_system_name

const std::string Restartable::_restartable_system_name
protectedinherited

The system name this object is in.

Definition at line 237 of file Restartable.h.

Referenced by Restartable::restartableName().

◆ _restartable_tid

const THREAD_ID Restartable::_restartable_tid
protectedinherited

The thread ID for this object.

Definition at line 240 of file Restartable.h.

Referenced by Restartable::declareRestartableDataHelper().

◆ _sample_type

unsigned int LayeredBase::_sample_type
protected

How to sample the values.

Definition at line 124 of file LayeredBase.h.

Referenced by integralValue(), and LayeredBase().

◆ _using_displaced_mesh

bool LayeredBase::_using_displaced_mesh
protected

true if this object operates on the displaced mesh, otherwise false

Definition at line 130 of file LayeredBase.h.

Referenced by initialize().


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