https://mooseframework.inl.gov
MaterialPropertyInterface.h
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 #pragma once
11 
12 #ifdef MOOSE_KOKKOS_ENABLED
14 #endif
15 
16 // MOOSE includes
17 #include "MaterialProperty.h"
18 #include "MooseTypes.h"
19 #include "MaterialData.h"
20 #include "MathUtils.h"
21 #include "MooseObjectName.h"
22 #include "InputParameters.h"
23 
24 #include <unordered_map>
25 
26 #define usingMaterialPropertyInterfaceMembers \
27  using MaterialPropertyInterface::_material_data_type; \
28  using MaterialPropertyInterface::_material_data
29 
30 // Forward declarations
31 class MooseObject;
32 class FEProblemBase;
33 class SubProblem;
34 
43 template <class M>
45 {
46 public:
47  OptionalMaterialPropertyProxyBase(const std::string & name, const unsigned int state)
48  : _name(name), _state(state)
49  {
50  }
52  virtual void resolve(M & material) = 0;
53 
54 protected:
55  const std::string _name;
56  const unsigned int _state;
57 };
58 
70 {
71 public:
72  MaterialPropertyInterface(const MooseObject * moose_object,
73  const std::set<SubdomainID> & block_ids,
74  const std::set<BoundaryID> & boundary_ids);
75 
76 #ifdef MOOSE_KOKKOS_ENABLED
77 
81  const Moose::Kokkos::FunctorCopy & key);
82 #endif
83 
85 
91 
93 
102  template <typename T, bool is_ad>
104  const unsigned int state = 0)
105  {
106  return getGenericMaterialProperty<T, is_ad>(name, _material_data, state);
107  }
108  template <typename T>
109  const MaterialProperty<T> & getMaterialProperty(const std::string & name,
110  const unsigned int state = 0)
111  {
112  return getGenericMaterialProperty<T, false>(name, state);
113  }
114  template <typename T>
115  const ADMaterialProperty<T> & getADMaterialProperty(const std::string & name)
116  {
117  return getGenericMaterialProperty<T, true>(name, 0);
118  }
119  template <typename T>
120  const MaterialProperty<T> & getMaterialPropertyOld(const std::string & name)
121  {
122  return getMaterialProperty<T>(name, 1);
123  }
124  template <typename T>
125  const MaterialProperty<T> & getMaterialPropertyOlder(const std::string & name)
126  {
127  return getMaterialProperty<T>(name, 2);
128  }
130 
132 
139  template <typename T, bool is_ad>
141  getGenericMaterialPropertyByName(const MaterialPropertyName & name, const unsigned int state = 0)
142  {
143  return getGenericMaterialPropertyByName<T, is_ad>(name, _material_data, state);
144  }
145  template <typename T>
146  const MaterialProperty<T> & getMaterialPropertyByName(const MaterialPropertyName & name,
147  const unsigned int state = 0)
148  {
149  return getGenericMaterialPropertyByName<T, false>(name, state);
150  }
151  template <typename T>
152  const ADMaterialProperty<T> & getADMaterialPropertyByName(const MaterialPropertyName & name)
153  {
154  return getGenericMaterialPropertyByName<T, true>(name, 0);
155  }
156  template <typename T>
157  const MaterialProperty<T> & getMaterialPropertyOldByName(const MaterialPropertyName & name)
158  {
159  return getMaterialPropertyByName<T>(name, 1);
160  }
161  template <typename T>
162  const MaterialProperty<T> & getMaterialPropertyOlderByName(const MaterialPropertyName & name)
163  {
164  return getMaterialPropertyByName<T>(name, 2);
165  }
167 
168 #ifdef MOOSE_KOKKOS_SCOPE
169 
177  template <typename T, unsigned int dimension = 0, unsigned int state = 0>
179  getKokkosMaterialPropertyByName(const std::string & prop_name_in);
187  template <typename T, unsigned int dimension = 0>
189  getKokkosMaterialPropertyOldByName(const std::string & prop_name)
190  {
191  return getKokkosMaterialPropertyByName<T, dimension, 1>(prop_name);
192  }
200  template <typename T, unsigned int dimension = 0>
202  getKokkosMaterialPropertyOlderByName(const std::string & prop_name)
203  {
204  return getKokkosMaterialPropertyByName<T, dimension, 2>(prop_name);
205  }
214  template <typename T, unsigned int dimension = 0, unsigned int state = 0>
216  {
217  return getKokkosMaterialPropertyByName<T, dimension, state>(getMaterialPropertyName(name));
218  }
226  template <typename T, unsigned int dimension = 0>
228  getKokkosMaterialPropertyOld(const std::string & name)
229  {
230  return getKokkosMaterialPropertyByName<T, dimension, 1>(getMaterialPropertyName(name));
231  }
239  template <typename T, unsigned int dimension = 0>
241  getKokkosMaterialPropertyOlder(const std::string & name)
242  {
243  return getKokkosMaterialPropertyByName<T, dimension, 2>(getMaterialPropertyName(name));
244  }
245 #endif
246 
249  template <typename T, bool is_ad>
251  getGenericOptionalMaterialProperty(const std::string & name, const unsigned int state = 0);
252 
253  template <typename T>
255  const unsigned int state = 0)
256  {
257  return getGenericOptionalMaterialProperty<T, false>(name, state);
258  }
259  template <typename T>
261  {
262  return getGenericOptionalMaterialProperty<T, true>(name);
263  }
264 
265  template <typename T>
267  {
268  return getOptionalMaterialProperty<T>(name, 1);
269  }
270  template <typename T>
272  {
273  return getOptionalMaterialProperty<T>(name, 2);
274  }
276 
287  template <typename T>
288  std::pair<const MaterialProperty<T> *, std::set<SubdomainID>>
289  getBlockMaterialProperty(const MaterialPropertyName & name);
290 
291 #ifdef MOOSE_KOKKOS_SCOPE
292 
303  template <typename T, unsigned int dimension = 0, unsigned int state = 0>
304  std::pair<Moose::Kokkos::MaterialProperty<T, dimension>, std::set<SubdomainID>>
305  getKokkosBlockMaterialProperty(const MaterialPropertyName & name);
306 #endif
307 
312  template <typename T, bool is_ad>
314  getGenericZeroMaterialProperty(const std::string & name);
315  template <typename T, bool is_ad>
317  getGenericZeroMaterialPropertyByName(const std::string & prop_name);
318 
322  template <typename T, bool is_ad>
324 
326  template <typename T, typename... Ts>
328  {
329  return getGenericZeroMaterialProperty<T, false>(args...);
330  }
331 
337  std::set<SubdomainID> getMaterialPropertyBlocks(const std::string & name);
338 
344  std::vector<SubdomainName> getMaterialPropertyBlockNames(const std::string & name);
345 
351  std::set<BoundaryID> getMaterialPropertyBoundaryIDs(const std::string & name);
352 
358  std::vector<BoundaryName> getMaterialPropertyBoundaryNames(const std::string & name);
359 
364  void checkBlockAndBoundaryCompatibility(std::shared_ptr<MaterialBase> discrete);
365 
367 
375  MaterialBase & getMaterial(const std::string & name);
376  MaterialBase & getMaterialByName(const std::string & name, bool no_warn = false);
378 
380  std::unordered_map<SubdomainID, std::vector<MaterialBase *>>
381  buildRequiredMaterials(bool allow_stateful = true);
382 
384 
389  template <typename T>
390  bool hasMaterialProperty(const std::string & name);
391  template <typename T>
392  bool hasMaterialPropertyByName(const std::string & name);
393  template <typename T>
394  bool hasADMaterialProperty(const std::string & name);
395  template <typename T>
396  bool hasADMaterialPropertyByName(const std::string & name);
397 #ifdef MOOSE_KOKKOS_SCOPE
398  template <typename T, unsigned int dimension = 0>
399  bool hasKokkosMaterialProperty(const std::string & name);
400  template <typename T, unsigned int dimension = 0>
401  bool hasKokkosMaterialPropertyByName(const std::string & name);
402 #endif
403 
406  template <typename T, bool is_ad>
407  bool hasGenericMaterialProperty(const std::string & name)
408  {
409  if constexpr (is_ad)
410  return hasADMaterialProperty<T>(name);
411  else
412  return hasMaterialProperty<T>(name);
413  }
414  template <typename T, bool is_ad>
415  bool hasGenericMaterialPropertyByName(const std::string & name)
416  {
417  if constexpr (is_ad)
418  return hasADMaterialPropertyByName<T>(name);
419  else
420  return hasMaterialPropertyByName<T>(name);
421  }
423 
429  void statefulPropertiesAllowed(bool);
430 
435 
442  virtual const std::unordered_set<unsigned int> & getMatPropDependencies() const
443  {
445  }
446 
448  virtual void resolveOptionalProperties();
449 
453  template <typename T, bool is_ad>
455  const std::string & name, MaterialData & material_data, const unsigned int state = 0);
456 
462  template <typename T>
463  const MaterialProperty<T> & getMaterialProperty(const std::string & name,
464  MaterialData & material_data,
465  const unsigned int state = 0)
466  {
467  return getGenericMaterialProperty<T, false>(name, material_data, state);
468  }
469 
475  template <typename T>
476  const ADMaterialProperty<T> & getADMaterialProperty(const std::string & name,
477  MaterialData & material_data)
478  {
479  return getGenericMaterialProperty<T, true>(name, material_data, 0);
480  }
481 
486  template <typename T, bool is_ad>
488  const MaterialPropertyName & name, MaterialData & material_data, const unsigned int state);
489 
495  template <typename T, bool is_ad>
497  getPossiblyConstantGenericMaterialPropertyByName(const MaterialPropertyName & prop_name,
498  MaterialData & material_data,
499  const unsigned int state);
500 
506  template <typename T>
507  const MaterialProperty<T> & getMaterialPropertyByName(const MaterialPropertyName & name,
508  MaterialData & material_data,
509  const unsigned int state = 0)
510  {
511  return getGenericMaterialPropertyByName<T, false>(name, material_data, state);
512  }
513 
518  template <typename T>
519  const ADMaterialProperty<T> & getADMaterialPropertyByName(const MaterialPropertyName & name,
520  MaterialData & material_data)
521  {
522  return getGenericMaterialPropertyByName<T, true>(name, material_data, 0);
523  }
524 
528  template <typename T>
529  const MaterialProperty<T> & getMaterialPropertyOld(const std::string & name,
530  MaterialData & material_data)
531  {
532  return getMaterialProperty<T>(name, material_data, 1);
533  }
534 
539  template <typename T>
540  const MaterialProperty<T> & getMaterialPropertyOlder(const std::string & name,
541  MaterialData & material_data)
542  {
543  return getMaterialProperty<T>(name, material_data, 2);
544  }
545 
550  template <typename T>
551  const MaterialProperty<T> & getMaterialPropertyOldByName(const MaterialPropertyName & name,
552  MaterialData & material_data)
553  {
554  return getMaterialPropertyByName<T>(name, material_data, 1);
555  }
556 
561  template <typename T>
562  const MaterialProperty<T> & getMaterialPropertyOlderByName(const MaterialPropertyName & name,
563  MaterialData & material_data)
564  {
565  return getMaterialPropertyByName<T>(name, material_data, 2);
566  }
567 
568 private:
571 
572 protected:
575 
577  const std::string _mi_name;
578 
581 
584 
587 
590 
591 #ifdef MOOSE_KOKKOS_ENABLED
592  const bool _is_kokkos_object;
594 #endif
595 
598 
601 
607  virtual void checkMaterialProperty(const std::string & name, const unsigned int state);
608 
609 #ifdef MOOSE_KOKKOS_ENABLED
610 
616  virtual void getKokkosMaterialPropertyHook(const std::string & /* prop_name_in */,
617  const unsigned int /* state */)
618  {
619  }
620 #endif
621 
625  void markMatPropRequested(const std::string &);
626 
634  MaterialPropertyName getMaterialPropertyName(const std::string & name) const;
635 
643  template <typename T, bool is_ad>
646  defaultGenericMaterialProperty(const std::string & name);
647  template <typename T>
648  const MaterialProperty<T> * defaultMaterialProperty(const std::string & name)
649  {
650  return defaultGenericMaterialProperty<T, false>(name);
651  }
652  template <typename T>
653  const ADMaterialProperty<T> * defaultADMaterialProperty(const std::string & name)
654  {
655  return defaultGenericMaterialProperty<T, true>(name);
656  }
658 
662  void checkExecutionStage();
663 
669 
676 
678  std::vector<std::unique_ptr<PropertyValue>> _default_properties;
679 
681  std::unordered_set<unsigned int> _material_property_dependencies;
682 
683  const MaterialPropertyName _get_suffix;
684 
687 
689  static const std::string _interpolated_old;
690  static const std::string _interpolated_older;
692 
693 private:
697  Moose::MaterialDataType getMaterialDataType(const std::set<BoundaryID> & boundary_ids) const;
698 
699  /*
700  * A proxy method for _mi_feproblem.getMaxQps()
701  */
702  unsigned int getMaxQps() const;
703 
704  /*
705  * A proxy method for _mi_feproblem.addConsumedPropertyName()
706  */
707  void addConsumedPropertyName(const MooseObjectName & obj_name, const std::string & prop_name);
708 
711 
713  const std::set<SubdomainID> & _mi_block_ids;
714 
716  const std::set<BoundaryID> & _mi_boundary_ids;
717 
719  std::vector<std::unique_ptr<OptionalMaterialPropertyProxyBase<MaterialPropertyInterface>>>
721 };
722 
723 template <class M, typename T, bool is_ad>
725 {
726 public:
727  OptionalMaterialPropertyProxy(const std::string & name, const unsigned int state)
729  {
730  }
732  void resolve(M & mpi) override
733  {
734  if (mpi.template hasGenericMaterialProperty<T, is_ad>(this->_name))
735  {
736  if constexpr (is_ad)
737  if (this->_state > 0)
738  mooseError("Non-current (state > 0) material properties are not available as AD");
739 
740  _value.set(&mpi.template getGenericMaterialProperty<T, is_ad>(this->_name, this->_state));
741  }
742  }
743 
744 private:
746 };
747 
748 template <typename T, bool is_ad>
751 {
752  if constexpr (std::is_same_v<T, Real> || std::is_same_v<T, RealVectorValue>)
753  {
754  std::istringstream ss(name);
755  Real real_value;
756 
757  // check if the string parsed cleanly into a Real number
758  if (ss >> real_value && ss.eof())
759  {
760  using prop_type = GenericMaterialProperty<T, is_ad>;
761 
762  const auto nqp = Moose::constMaxQpsPerElem;
763  auto & property =
764  _default_properties.emplace_back(std::make_unique<prop_type>(default_property_id));
765  auto & T_property = static_cast<prop_type &>(*property);
766 
767  T_property.resize(nqp);
768  for (const auto qp : make_range(nqp))
769  T_property[qp] = real_value;
770 
771  return &T_property;
772  }
773  }
774 
775  return nullptr;
776 }
777 
778 template <typename T>
779 std::pair<const MaterialProperty<T> *, std::set<SubdomainID>>
780 MaterialPropertyInterface::getBlockMaterialProperty(const MaterialPropertyName & name_in)
781 {
782  if (_mi_block_ids.empty())
783  mooseError("getBlockMaterialProperty must be called by a block restrictable object");
784 
785  const auto name = _get_suffix.empty()
786  ? static_cast<const std::string &>(name_in)
787  : MooseUtils::join(std::vector<std::string>({name_in, _get_suffix}), "_");
788 
789  using pair_type = std::pair<const MaterialProperty<T> *, std::set<SubdomainID>>;
790 
791  if (!hasMaterialPropertyByName<T>(name))
792  return pair_type(nullptr, {});
793 
794  // Call first so that the ID gets registered
795  const auto & prop = _material_data.getProperty<T, false>(name, 0, _mi_moose_object);
797  auto prop_blocks_pair = pair_type(&prop, std::move(blocks));
798 
800 
801  // Update consumed properties in MaterialPropertyDebugOutput
803 
804  return prop_blocks_pair;
805 }
806 
807 template <typename T>
808 bool
810 {
811  // Check if the supplied parameter is a valid input parameter key
812  const auto prop_name = getMaterialPropertyName(name);
813  return hasMaterialPropertyByName<T>(prop_name);
814 }
815 
816 template <typename T>
817 bool
819 {
820  const auto name = _get_suffix.empty()
821  ? name_in
822  : MooseUtils::join(std::vector<std::string>({name_in, _get_suffix}), "_");
823  return _material_data.haveProperty<T>(name);
824 }
825 
826 template <typename T, bool is_ad>
829 {
830  const auto prop_name = getMaterialPropertyName(name);
831  return getGenericZeroMaterialPropertyByName<T, is_ad>(prop_name);
832 }
833 
834 template <typename T, bool is_ad>
837 {
838  // if found return the requested property
839  if (hasGenericMaterialPropertyByName<T, is_ad>(prop_name))
840  return getGenericMaterialPropertyByName<T, is_ad>(prop_name);
841 
842  return getGenericZeroMaterialProperty<T, is_ad>();
843 }
844 
845 template <typename T, bool is_ad>
848 {
849  // static zero property storage
851 
852  // resize to accomodate maximum number of qpoints
853  // (in multiapp scenarios getMaxQps can return different values in each app; we need the max)
854  unsigned int nqp = getMaxQps();
855  if (nqp > zero.size())
856  zero.resize(nqp);
857 
858  // set values for all qpoints to zero
859  for (unsigned int qp = 0; qp < nqp; ++qp)
861 
862  return zero;
863 }
864 
865 template <typename T>
866 bool
868 {
869  // Check if the supplied parameter is a valid input parameter key
870  const auto prop_name = getMaterialPropertyName(name);
871  return hasADMaterialPropertyByName<T>(prop_name);
872 }
873 
874 template <typename T>
875 bool
877 {
878  const auto name = _get_suffix.empty()
879  ? name_in
880  : MooseUtils::join(std::vector<std::string>({name_in, _get_suffix}), "_");
882 }
883 
884 template <typename T, bool is_ad>
887  const unsigned int state)
888 {
889  auto proxy = std::make_unique<OptionalMaterialPropertyProxy<MaterialPropertyInterface, T, is_ad>>(
890  name, state);
891  auto & optional_property = proxy->value();
892  _optional_property_proxies.push_back(std::move(proxy));
893  return optional_property;
894 }
895 
896 template <typename T, bool is_ad>
899  const MaterialPropertyName & prop_name, MaterialData & material_data, const unsigned int state)
900 {
901  // Check if it's just a constant
902  if (const auto * default_property = defaultGenericMaterialProperty<T, is_ad>(prop_name))
903  {
905  return *default_property;
906  }
907 
908  if (state > 0 && !_stateful_allowed)
909  mooseError("Stateful material properties not allowed for this object."
910  " State ",
911  state,
912  " property for \"",
913  prop_name,
914  "\" was requested.");
915 
916  return this->getGenericMaterialPropertyByName<T, is_ad>(prop_name, material_data, state);
917 }
918 
919 template <typename T, bool is_ad>
922  MaterialData & material_data,
923  const unsigned int state)
924 {
925  // Check if the supplied parameter is a valid input parameter key
926  const auto prop_name = getMaterialPropertyName(name);
927 
928  return getPossiblyConstantGenericMaterialPropertyByName<T, is_ad>(
929  prop_name, material_data, state);
930 }
931 
932 template <typename T, bool is_ad>
935  MaterialData & material_data,
936  const unsigned int state)
937 {
938 #ifdef MOOSE_KOKKOS_ENABLED
939  if (_is_kokkos_object)
941  "Attempted to retrieve a standard MOOSE material property from a Kokkos object.");
942 #endif
943 
945  {
946  if (state == 1)
947  return getGenericMaterialPropertyByName<T, is_ad>(
948  name_in + _interpolated_old, material_data, 0);
949  if (state == 2)
950  return getGenericMaterialPropertyByName<T, is_ad>(
951  name_in + _interpolated_older, material_data, 0);
952  }
953 
954  const auto name = _get_suffix.empty()
955  ? static_cast<const std::string &>(name_in)
956  : MooseUtils::join(std::vector<std::string>({name_in, _get_suffix}), "_");
957 
959  checkMaterialProperty(name, state);
960 
961  // mark property as requested
963 
964  // Update the boolean flag.
966 
967  // Call first so that the ID gets registered
968  auto & prop = material_data.getProperty<T, is_ad>(name, state, _mi_moose_object);
969 
970  // Does the material data used here matter?
971  _material_property_dependencies.insert(material_data.getPropertyId(name));
972 
973  if (state == 0)
975 
976  return prop;
977 }
978 
979 #ifdef MOOSE_KOKKOS_SCOPE
980 template <typename T, unsigned int dimension>
981 bool
983 {
984  // Check if the supplied parameter is a valid input parameter key
985  const auto prop_name = getMaterialPropertyName(name);
986  return hasKokkosMaterialPropertyByName<T, dimension>(prop_name);
987 }
988 
989 template <typename T, unsigned int dimension>
990 bool
992 {
993  const auto name = _get_suffix.empty()
994  ? name_in
995  : MooseUtils::join(std::vector<std::string>({name_in, _get_suffix}), "_");
996  return _material_data.haveKokkosProperty<T, dimension>(name);
997 }
998 
999 template <typename T, unsigned int dimension, unsigned int state>
1002 {
1003  if (!_is_kokkos_object)
1005  "Attempted to retrieve a Kokkos material property from a standard MOOSE object.");
1006 
1007  if constexpr (std::is_same_v<T, Real>)
1008  {
1009  std::istringstream ss(prop_name_in);
1010  Real value;
1011 
1012  // Check if the string parsed cleanly into a Real number
1013  if (ss >> value && ss.eof())
1015  }
1016 
1017  const auto prop_name =
1018  _get_suffix.empty()
1019  ? static_cast<const std::string &>(prop_name_in)
1020  : MooseUtils::join(std::vector<std::string>({prop_name_in, _get_suffix}), "_");
1021 
1023  checkMaterialProperty(prop_name, state);
1024 
1025  // Mark property as requested
1026  markMatPropRequested(prop_name);
1027 
1028  // Update the boolean flag
1030 
1031  // Call first so that the ID gets registered
1032  auto prop = _material_data.getKokkosProperty<T, dimension, state>(prop_name);
1033 
1034  // Does the material data used here matter?
1036 
1037  if constexpr (state == 0)
1039 
1040  getKokkosMaterialPropertyHook(prop_name_in, state);
1041 
1042  return prop;
1043 }
1044 
1045 template <typename T, unsigned int dimension, unsigned int state>
1046 std::pair<Moose::Kokkos::MaterialProperty<T, dimension>, std::set<SubdomainID>>
1048 {
1049  if (!_is_kokkos_object)
1051  "Attempted to retrieve a Kokkos material property from a standard MOOSE object.");
1052 
1053  if (_mi_block_ids.empty())
1054  mooseError("getKokkosBlockMaterialProperty must be called by a block restrictable object");
1055 
1056  const auto name = _get_suffix.empty()
1057  ? static_cast<const std::string &>(name_in)
1058  : MooseUtils::join(std::vector<std::string>({name_in, _get_suffix}), "_");
1059 
1060  using pair_type = std::pair<Moose::Kokkos::MaterialProperty<T, dimension>, std::set<SubdomainID>>;
1061 
1062  if (!hasKokkosMaterialPropertyByName<T, dimension>(name))
1063  return pair_type(Moose::Kokkos::MaterialProperty<T, dimension>(), {});
1064 
1066 
1067  // Mark property as requested
1069 
1070  // Call first so that the ID gets registered
1071  auto prop = _material_data.getKokkosProperty<T, dimension, state>(name);
1073  auto prop_blocks_pair = pair_type(prop, std::move(blocks));
1074 
1076 
1077  // Update consumed properties in MaterialPropertyDebugOutput
1078  if constexpr (state == 0)
1080 
1081  getKokkosMaterialPropertyHook(name_in, state);
1082 
1083  return prop_blocks_pair;
1084 }
1085 #endif
virtual const std::unordered_set< unsigned int > & getMatPropDependencies() const
Retrieve the set of material properties that this object depends on.
std::string name(const ElemQuality q)
FEProblemBase & _mi_feproblem
Reference to the FEProblemBase class.
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosProperty(const std::string &prop_name)
Get a Kokkos material property.
Definition: MaterialData.h:463
const THREAD_ID _mi_tid
Current threaded it.
const OptionalMaterialProperty< T > & getOptionalMaterialProperty(const std::string &name, const unsigned int state=0)
const MaterialProperty< T > * defaultMaterialProperty(const std::string &name)
virtual void resolveOptionalProperties()
resolve all optional properties
static const std::string _interpolated_old
name suffixes for interpolated old and older properties
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOlderByName(const std::string &prop_name)
Get an older Kokkos material property by property name.
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...
void mooseSetToZero(T &v)
Helper function templates to set a variable to zero.
Definition: MathUtils.h:377
const MooseObjectName _mi_moose_object_name
The "complete" name of the object that this interface belongs for material property output...
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyByName(const std::string &prop_name_in)
Get a Kokkos material property by property name for any state.
static constexpr PropertyValue::id_type default_property_id
The material property ID for a default (parsed from input) property.
const bool _is_kokkos_object
Whether the MOOSE object is a Kokkos object.
const std::set< SubdomainID > & _mi_block_ids
Storage for the block ids created by BlockRestrictable.
std::vector< BoundaryName > getMaterialPropertyBoundaryNames(const std::string &name)
Retrieve the boundary namess that the material property is defined.
bool haveProperty(const std::string &prop_name) const
Returns true if the regular material property exists - defined by any material.
Definition: MaterialData.h:93
virtual bool getMaterialPropertyCalled() const
Returns true if getMaterialProperty() has been called, false otherwise.
bool hasKokkosMaterialPropertyByName(const std::string &name)
const ADMaterialProperty< T > & getADMaterialProperty(const std::string &name)
char ** blocks
bool hasMaterialPropertyByName(const std::string &name)
MaterialPropertyInterface(const MooseObject *moose_object, const std::set< SubdomainID > &block_ids, const std::set< BoundaryID > &boundary_ids)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialPropertyByName(const std::string &prop_name)
const MaterialProperty< T > & getMaterialPropertyOlderByName(const MaterialPropertyName &name)
constexpr std::size_t constMaxQpsPerElem
This is used for places where we initialize some qp-sized data structures that would end up being siz...
Definition: MooseTypes.h:258
const MaterialProperty< T > & getMaterialPropertyByName(const MaterialPropertyName &name, MaterialData &material_data, const unsigned int state=0)
Retrieve the property named "name" without any deduction for the specified material_data.
static const std::string _interpolated_older
bool hasGenericMaterialPropertyByName(const std::string &name)
std::pair< const MaterialProperty< T > *, std::set< SubdomainID > > getBlockMaterialProperty(const MaterialPropertyName &name)
Retrieve pointer to a material property with the mesh blocks where it is defined The name required by...
MaterialDataType
MaterialData types.
Definition: MooseTypes.h:740
std::vector< SubdomainName > getMaterialPropertyBlockNames(const std::string &name)
Retrieve the block names that the material property is defined.
std::vector< std::unique_ptr< PropertyValue > > _default_properties
Storage vector for default properties.
unsigned int getPropertyId(const std::string &prop_name) const
Wrapper for MaterialStorage::getPropertyId.
Definition: MaterialData.C:80
const MaterialProperty< T > & getMaterialPropertyOld(const std::string &name, MaterialData &material_data)
Retrieve the old property deduced from the name name for the specified material_data.
const bool _mi_boundary_restricted
BoundaryRestricted flag.
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty(const std::string &name, const unsigned int state=0)
Retrieve reference to material property or one of it&#39;s old or older values.
std::set< BoundaryID > getMaterialPropertyBoundaryIDs(const std::string &name)
Retrieve the boundary ids that the material property is defined.
unsigned int id_type
The type for a material property ID.
const MaterialProperty< T > & getMaterialPropertyOldByName(const MaterialPropertyName &name)
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::pair< Moose::Kokkos::MaterialProperty< T, dimension >, std::set< SubdomainID > > getKokkosBlockMaterialProperty(const MaterialPropertyName &name)
Retrieve a Kokkos material property with the mesh blocks where it is defined NOTE: This is not a drop...
static InputParameters validParams()
SubProblem & _mi_subproblem
Reference to the subproblem.
const std::set< BoundaryID > & _mi_boundary_ids
Storage for the boundary ids created by BoundaryRestrictable.
const std::string _mi_name
The name of the object that this interface belongs to.
const Number zero
const MaterialProperty< T > & getMaterialPropertyOldByName(const MaterialPropertyName &name, MaterialData &material_data)
Retrieve the old property named name without any deduction for the specified material_data.
const ADMaterialProperty< T > & getADMaterialProperty(const std::string &name, MaterialData &material_data)
Retrieve the AD property named "name" for the specified material_data.
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOld(const std::string &name)
Get an old Kokkos material property.
MaterialPropertyName getMaterialPropertyName(const std::string &name) const
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
const MaterialProperty< T > & getMaterialPropertyOld(const std::string &name)
void markMatPropRequested(const std::string &)
A proxy method for _mi_feproblem.markMatPropRequested(name)
Helper class for deferred getting of material properties after the construction phase for materials...
MaterialData & _material_data
The material data class that stores properties.
bool hasADMaterialPropertyByName(const std::string &name)
const GenericOptionalMaterialProperty< T, is_ad > & value() const
std::set< SubdomainID > getMaterialPropertyBlocks(const std::string &name)
Retrieve the block ids that the material property is defined.
const MaterialProperty< T > & getMaterialPropertyOlder(const std::string &name)
virtual void resolve(M &material)=0
Wrapper around a material property pointer.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
Moose::MaterialDataType getMaterialDataType(const std::set< BoundaryID > &boundary_ids) const
const GenericOptionalMaterialProperty< T, is_ad > & getGenericOptionalMaterialProperty(const std::string &name, const unsigned int state=0)
const ADMaterialProperty< T > & getADMaterialPropertyByName(const MaterialPropertyName &name)
const MaterialProperty< T > & getMaterialPropertyOlderByName(const MaterialPropertyName &name, MaterialData &material_data)
Retrieve the older property named name without any deduction for the specified material_data.
typename GenericMaterialPropertyStruct< T, is_ad >::type GenericMaterialProperty
const MaterialProperty< T > & getMaterialPropertyOlder(const std::string &name, MaterialData &material_data)
Retrieve the older property deduced from the name name for the specified material_data.
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName(const MaterialPropertyName &name, const unsigned int state=0)
Retrieve reference to material property or its old or older value The name required by this method is...
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOldByName(const std::string &prop_name)
Get an old Kokkos material property by property name.
const MaterialPropertyName _get_suffix
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialProperty()
Return a constant zero anonymous material property.
const MaterialProperty< T > & getZeroMaterialProperty(Ts... args)
for backwards compatibility
const InputParameters & _mi_params
Parameters of the object with this interface.
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOlder(const std::string &name)
const ADMaterialProperty< T > & getADMaterialPropertyByName(const MaterialPropertyName &name, MaterialData &material_data)
Retrieve the AD property named "name" without any deduction for the specified material_data.
bool hasKokkosMaterialProperty(const std::string &name)
const GenericMaterialProperty< T, is_ad > * defaultGenericMaterialProperty(const std::string &name)
bool hasMaterialProperty(const std::string &name)
Check if the material property exists.
static constexpr PropertyValue::id_type zero_property_id
The material property ID for a zero property.
MaterialBase & getMaterialByName(const std::string &name, bool no_warn=false)
void statefulPropertiesAllowed(bool)
Derived classes can declare whether or not they work with stateful material properties.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool haveADProperty(const std::string &prop_name) const
Returns true if the AD material property exists - defined by any material.
Definition: MaterialData.h:100
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
const OptionalADMaterialProperty< T > & getOptionalADMaterialProperty(const std::string &name)
An interface for accessing Materials.
const MaterialProperty< T > & getMaterialProperty(const std::string &name, MaterialData &material_data, const unsigned int state=0)
Retrieve the property named "name" for the specified material_data.
GenericMaterialProperty< T, is_ad > & getProperty(const std::string &prop_name, const unsigned int state, const MooseObject &requestor)
Retrieves a material property.
Definition: MaterialData.h:127
bool haveKokkosProperty(const std::string &prop_name) const
Get whether a Kokkos material property exists.
Definition: MaterialData.h:452
IntRange< T > make_range(T beg, T end)
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:281
const bool _use_interpolated_state
Use the interpolated state set up through the ProjectedStatefulMaterialStorageAction.
void addConsumedPropertyName(const MooseObjectName &obj_name, const std::string &prop_name)
GenericOptionalMaterialProperty< T, is_ad > _value
static constexpr id_type invalid_property_id
The material property ID for an invalid property We only have this because there are a few cases wher...
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOlder(const std::string &name)
Get an older Kokkos material property.
Proxy for accessing MaterialPropertyStorage.
Definition: MaterialData.h:37
const GenericMaterialProperty< T, is_ad > & getPossiblyConstantGenericMaterialPropertyByName(const MaterialPropertyName &prop_name, MaterialData &material_data, const unsigned int state)
Retrieve the generic property named "prop_name" without any deduction for the specified material_data...
std::vector< std::unique_ptr< OptionalMaterialPropertyProxyBase< MaterialPropertyInterface > > > _optional_property_proxies
optional material properties
void checkBlockAndBoundaryCompatibility(std::shared_ptr< MaterialBase > discrete)
Check if block and boundary restrictions of a given material are compatible with the current material...
bool _get_material_property_called
Initialized to false.
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialProperty(const std::string &name)
Get a Kokkos material property for any state.
OptionalMaterialPropertyProxyBase(const std::string &name, const unsigned int state)
void checkExecutionStage()
Check and throw an error if the execution has progressed past the construction stage.
const Moose::MaterialDataType _material_data_type
The type of data.
bool _stateful_allowed
True by default.
The Kokkos material property class.
A class for storing the names of MooseObject by tag and object name.
MaterialBase & getMaterial(const std::string &name)
Return a MaterialBase reference - usable for computing directly.
const MooseObject & _mi_moose_object
The MooseObject creating the MaterialPropertyInterface.
const ADMaterialProperty< T > * defaultADMaterialProperty(const std::string &name)
const MaterialProperty< T > & getMaterialPropertyByName(const MaterialPropertyName &name, const unsigned int state=0)
bool hasGenericMaterialProperty(const std::string &name)
generic hasMaterialProperty helper
MaterialBases compute MaterialProperties.
Definition: MaterialBase.h:62
bool hasADMaterialProperty(const std::string &name)
std::unordered_set< unsigned int > _material_property_dependencies
The set of material properties (as given by their IDs) that this object depends on.
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOld(const std::string &name)
const MaterialProperty< T > & getMaterialProperty(const std::string &name, const unsigned int state=0)
unsigned int THREAD_ID
Definition: MooseTypes.h:237
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...
OptionalMaterialPropertyProxy(const std::string &name, const unsigned int state)
virtual void getKokkosMaterialPropertyHook(const std::string &, const unsigned int)
A virtual method that can be overriden by Kokkos objects to insert additional operations in getKokkos...