https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MaterialPropertyInterface.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10// MOOSE includes
12#include "MooseApp.h"
13#include "MaterialBase.h"
14#include "FEProblemBase.h"
15
16const std::string MaterialPropertyInterface::_interpolated_old = "_interpolated_old";
17const std::string MaterialPropertyInterface::_interpolated_older = "_interpolated_older";
18
21{
24 "_material_data_type"); // optionally force the type of MaterialData to utilize
25 params.addParam<MaterialPropertyName>("prop_getter_suffix",
26 "",
27 "An optional suffix parameter that can be appended to any "
28 "attempt to retrieve/get material properties. The suffix "
29 "will be prepended with a '_' character.");
30 params.addParam<bool>(
31 "use_interpolated_state",
32 false,
33 "For the old and older state use projected material properties interpolated at the "
34 "quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.");
35 params.addParamNamesToGroup("use_interpolated_state prop_getter_suffix",
36 "Material property retrieval");
37
38 return params;
39}
40
41namespace moose
42{
43namespace internal
44{
45bool
46boundaryRestricted(const std::set<BoundaryID> & boundary_ids)
47{
48 return !boundary_ids.empty() && BoundaryRestrictable::restricted(boundary_ids);
49}
50}
51}
52
54 const std::set<SubdomainID> & block_ids,
55 const std::set<BoundaryID> & boundary_ids)
56 : _mi_moose_object(*moose_object),
57 _mi_params(_mi_moose_object.parameters()),
58 _mi_name(moose_object->name()),
59 _mi_moose_object_name(_mi_moose_object.getBase(), _mi_name, "::"),
60 _mi_feproblem(*_mi_params.getCheckedPointerParam<FEProblemBase *>("_fe_problem_base")),
61 _mi_subproblem(*_mi_params.getCheckedPointerParam<SubProblem *>("_subproblem")),
62 _mi_tid(_mi_params.get<THREAD_ID>("_tid")),
63#ifdef MOOSE_KOKKOS_ENABLED
64 _is_kokkos_object(_mi_moose_object.isKokkosObject()),
65#endif
66 _material_data_type(getMaterialDataType(boundary_ids)),
67 _material_data(
68#ifdef MOOSE_KOKKOS_ENABLED
69 _is_kokkos_object
70 ? _mi_feproblem.getKokkosMaterialData(_material_data_type, moose_object)
71 :
72#endif
73 _mi_feproblem.getMaterialData(_material_data_type, _mi_tid, moose_object)),
74 _stateful_allowed(true),
75 _get_material_property_called(false),
76 _get_suffix(_mi_params.get<MaterialPropertyName>("prop_getter_suffix")),
77 _use_interpolated_state(_mi_params.get<bool>("use_interpolated_state")),
78 _mi_boundary_restricted(moose::internal::boundaryRestricted(boundary_ids)),
79 _mi_block_ids(block_ids),
80 _mi_boundary_ids(boundary_ids)
81{
82 moose_object->getMooseApp().registerInterfaceObject(*this);
83}
84
85#ifdef MOOSE_KOKKOS_ENABLED
88 : _mi_moose_object(object._mi_moose_object),
89 _mi_params(object._mi_params),
90 _mi_name(object._mi_name),
91 _mi_moose_object_name(object._mi_moose_object_name),
92 _mi_feproblem(object._mi_feproblem),
93 _mi_subproblem(object._mi_subproblem),
94 _mi_tid(object._mi_tid),
95 _is_kokkos_object(object._is_kokkos_object),
96 _material_data_type(object._material_data_type),
97 _material_data(object._material_data),
98 _stateful_allowed(object._stateful_allowed),
99 _get_material_property_called(object._get_material_property_called),
100 _get_suffix(object._get_suffix),
101 _use_interpolated_state(object._use_interpolated_state),
102 _mi_boundary_restricted(object._mi_boundary_restricted),
103 _mi_block_ids(object._mi_block_ids),
104 _mi_boundary_ids(object._mi_boundary_ids)
105{
106}
107#endif
108
109MaterialPropertyName
111{
112 if (_mi_params.have_parameter<MaterialPropertyName>(name) && _mi_params.isParamValid(name))
113 return _mi_params.get<MaterialPropertyName>(name);
114 return name;
115}
116
117std::set<SubdomainID>
122
123std::vector<SubdomainName>
128
129std::set<BoundaryID>
134
135std::vector<BoundaryName>
140
141unsigned int
146
147void
149 const std::string & prop_name)
150{
151 return _mi_feproblem.addConsumedPropertyName(obj_name, prop_name);
152}
153
154void
155MaterialPropertyInterface::checkMaterialProperty(const std::string & name, const unsigned int state)
156{
157 if (state == 0)
158 {
159 // If the material property is boundary restrictable, add to the list of materials to check
161 for (const auto & bnd_id : _mi_boundary_ids)
163
164 // The default is to assume block restrictions
165 else
166 for (const auto & blk_ids : _mi_block_ids)
168 }
169}
170
171void
176
177void
179{
180 _stateful_allowed = stateful_allowed;
181}
182
183void
185 std::shared_ptr<MaterialBase> discrete)
186{
187 // Check block compatibility
188 if (!discrete->hasBlocks(_mi_block_ids))
189 {
190 std::ostringstream oss;
191 oss << "Incompatible material and object blocks:";
192
193 oss << "\n " << discrete->parameters().paramLocationPrefix("block")
194 << " material defined on blocks ";
195 for (const auto & sbd_id : discrete->blockIDs())
196 oss << sbd_id << ", ";
197
198 oss << "\n " << _mi_params.paramLocationPrefix("block")
199 << " object needs material on blocks ";
200 for (const auto & block_id : _mi_block_ids)
201 oss << block_id << ", ";
202
203 mooseError(oss.str());
204 }
205
206 // Check boundary compatibility
207 if (!discrete->hasBoundary(_mi_boundary_ids))
208 {
209 std::ostringstream oss;
210 oss << "Incompatible material and object boundaries:";
211
212 oss << "\n " << discrete->parameters().paramLocationPrefix("boundary")
213 << " material defined on boundaries ";
214 for (const auto & bnd_id : discrete->boundaryIDs())
215 oss << bnd_id << ", ";
216
217 oss << "\n " << _mi_params.paramLocationPrefix("boundary")
218 << " object needs material on boundaries ";
219 for (const auto & bnd_id : _mi_boundary_ids)
220 oss << bnd_id << ", ";
221
222 mooseError(oss.str());
223 }
224}
225
228{
229 return getMaterialByName(_mi_params.get<MaterialName>(name));
230}
231
233MaterialPropertyInterface::getMaterialByName(const std::string & name, bool no_warn)
234{
235 std::shared_ptr<MaterialBase> discrete =
237
239 return *discrete;
240}
241
242std::unordered_map<SubdomainID, std::vector<MaterialBase *>>
244{
245 std::unordered_map<SubdomainID, std::vector<MaterialBase *>> required_mats;
246 const auto & mwh = _mi_feproblem.getMaterialWarehouse();
247 for (const auto id : _mi_block_ids)
248 {
249 const auto & mats = mwh[_material_data_type].getActiveBlockObjects(id, _mi_tid);
250 std::array<const MaterialPropertyInterface *, 1> consumers = {{this}};
251 const auto block_required =
252 MaterialBase::buildRequiredMaterials(consumers, mats, allow_stateful);
253 required_mats[id].insert(
254 required_mats[id].begin(), block_required.begin(), block_required.end());
255 }
256 return required_mats;
257}
258
259void
261{
263 mooseError("Material properties must be retrieved during object construction. This is a code "
264 "problem.");
265}
266
267void
269{
270 for (auto & proxy : _optional_property_proxies)
271 proxy->resolve(*this);
272}
273
275MaterialPropertyInterface::getMaterialDataType(const std::set<BoundaryID> & boundary_ids) const
276{
277 if (_mi_params.isParamValid("_material_data_type"))
278 return _mi_params.get<Moose::MaterialDataType>("_material_data_type");
279 if (moose::internal::boundaryRestricted(boundary_ids))
282}
InputParameters emptyInputParameters()
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
static bool restricted(const std::set< BoundaryID > &ids)
Helper for determining if the object is boundary restricted.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
unsigned int getMaxQps() const
std::shared_ptr< MaterialBase > getMaterial(std::string name, Moose::MaterialDataType type, const THREAD_ID tid=0, bool no_warn=false)
Return a pointer to a MaterialBase object.
const MaterialWarehouse & getMaterialWarehouse() const
virtual bool startedInitialSetup()
Returns true if we are in or beyond the initialSetup stage.
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 addPrivateParam(const std::string &name, const T &value)
These method add a parameter to the InputParameters object which can be retrieved like any other para...
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.
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
std::string paramLocationPrefix(const std::string &param) const
Returns a prefix containing the parameter name and location (if available)
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another,...
MaterialBases compute MaterialProperties.
static std::deque< MaterialBase * > buildRequiredMaterials(const Consumers &mat_consumers, const std::vector< std::shared_ptr< MaterialBase > > &mats, const bool allow_stateful)
Build the materials required by a set of consumer objects.
An interface for accessing Materials.
const std::set< BoundaryID > & _mi_boundary_ids
Storage for the boundary ids created by BoundaryRestrictable.
void statefulPropertiesAllowed(bool)
Derived classes can declare whether or not they work with stateful material properties.
const bool _mi_boundary_restricted
BoundaryRestricted flag.
MaterialPropertyInterface(const MooseObject *moose_object, const std::set< SubdomainID > &block_ids, const std::set< BoundaryID > &boundary_ids)
const THREAD_ID _mi_tid
Current threaded it.
std::vector< BoundaryName > getMaterialPropertyBoundaryNames(const std::string &name)
Retrieve the boundary namess that the material property is defined.
std::vector< std::unique_ptr< OptionalMaterialPropertyProxyBase< MaterialPropertyInterface > > > _optional_property_proxies
optional material properties
std::vector< SubdomainName > getMaterialPropertyBlockNames(const std::string &name)
Retrieve the block names that the material property is defined.
MaterialPropertyName getMaterialPropertyName(const std::string &name) const
MaterialBase & getMaterial(const std::string &name)
Return a MaterialBase reference - usable for computing directly.
MaterialBase & getMaterialByName(const std::string &name, bool no_warn=false)
static const std::string _interpolated_old
name suffixes for interpolated old and older properties
virtual void checkMaterialProperty(const std::string &name, const unsigned int state)
A helper method for checking material properties This method was required to avoid a compiler problem...
const Moose::MaterialDataType _material_data_type
The type of data.
std::set< SubdomainID > getMaterialPropertyBlocks(const std::string &name)
Retrieve the block ids that the material property is defined.
static const std::string _interpolated_older
const std::set< SubdomainID > & _mi_block_ids
Storage for the block ids created by BlockRestrictable.
void markMatPropRequested(const std::string &)
A proxy method for _mi_feproblem.markMatPropRequested(name)
FEProblemBase & _mi_feproblem
Reference to the FEProblemBase class.
std::unordered_map< SubdomainID, std::vector< MaterialBase * > > buildRequiredMaterials(bool allow_stateful=true)
get a map of MaterialBase pointers for all material objects that this object depends on for each bloc...
void checkBlockAndBoundaryCompatibility(std::shared_ptr< MaterialBase > discrete)
Check if block and boundary restrictions of a given material are compatible with the current material...
const InputParameters & _mi_params
Parameters of the object with this interface.
Moose::MaterialDataType getMaterialDataType(const std::set< BoundaryID > &boundary_ids) const
static InputParameters validParams()
void addConsumedPropertyName(const MooseObjectName &obj_name, const std::string &prop_name)
std::set< BoundaryID > getMaterialPropertyBoundaryIDs(const std::string &name)
Retrieve the boundary ids that the material property is defined.
virtual void resolveOptionalProperties()
resolve all optional properties
const std::string _mi_name
The name of the object that this interface belongs to.
void checkExecutionStage()
Check and throw an error if the execution has progressed past the construction stage.
void registerInterfaceObject(T &interface)
Registers an interface object for accessing with getInterfaceObjects.
Definition MooseApp.h:1779
MooseApp & getMooseApp() const
Get the MooseApp this class is associated with.
Definition MooseBase.h:87
A class for storing the names of MooseObject by tag and object name.
const std::map< SubdomainID, std::vector< std::shared_ptr< T > > > & getActiveBlockObjects(THREAD_ID tid=0) const
Every object that can be built by the factory should be derived from this class.
Definition MooseObject.h:31
Generic class for solving transient nonlinear problems.
Definition SubProblem.h:79
void addConsumedPropertyName(const MooseObjectName &obj_name, const std::string &prop_name)
Helper for tracking the object that is consuming a property for MaterialPropertyDebugOutput.
Definition SubProblem.C:737
virtual void storeBoundaryDelayedCheckMatProp(const std::string &requestor, BoundaryID boundary_id, const std::string &name)
Adds to a map based on boundary ids of material properties to validate.
Definition SubProblem.C:616
virtual void markMatPropRequested(const std::string &)
Helper method for adding a material property name to the _material_property_requested set.
Definition SubProblem.C:725
virtual std::set< SubdomainID > getMaterialPropertyBlocks(const std::string &prop_name)
Get a vector containing the block ids the material property is defined on.
Definition SubProblem.C:474
virtual std::set< BoundaryID > getMaterialPropertyBoundaryIDs(const std::string &prop_name)
Get a vector containing the block ids the material property is defined on.
Definition SubProblem.C:526
virtual std::vector< BoundaryName > getMaterialPropertyBoundaryNames(const std::string &prop_name)
Get a vector of block id equivalences that the material property is defined on.
Definition SubProblem.C:542
virtual void storeSubdomainDelayedCheckMatProp(const std::string &requestor, SubdomainID block_id, const std::string &name)
Adds to a map based on block ids of material properties to validate.
Definition SubProblem.C:608
virtual std::vector< SubdomainName > getMaterialPropertyBlockNames(const std::string &prop_name)
Get a vector of block id equivalences that the material property is defined on.
Definition SubProblem.C:490
MaterialDataType
MaterialData types.
Definition MooseTypes.h:746
@ BOUNDARY_MATERIAL_DATA
Definition MooseTypes.h:748
@ BLOCK_MATERIAL_DATA
Definition MooseTypes.h:747
bool boundaryRestricted(const std::set< BoundaryID > &boundary_ids)