53 _fparser_name(rhs._fparser_name),
54 _base_name(rhs._base_name),
55 _dependent_symbols(rhs._dependent_symbols),
56 _derivative_symbols(rhs._derivative_symbols),
58 _old_older_value(nullptr),
60 _property_name(rhs._property_name),
61 _required(rhs._required)
69 _fparser_name(rhs._fparser_name),
70 _base_name(rhs._base_name),
71 _dependent_symbols(rhs._dependent_symbols),
72 _derivative_symbols(rhs._derivative_symbols),
74 _old_older_value(nullptr),
76 _property_name(rhs._property_name),
77 _required(rhs._required)
125 auto open = expression.find_first_of(
"[");
126 auto close = expression.find_last_of(
"]");
128 if (open == std::string::npos && close == std::string::npos)
131 parseDependentSymbols(expression);
135 if (open != std::string::npos && close != std::string::npos)
137 if (expression.substr(0, open) ==
"Old")
139 _base_name = expression.substr(open + 1, close - open - 1);
140 _dependent_symbols.clear();
141 _state = PropertyState::OLD;
144 if (expression.substr(0, open) ==
"Older")
146 _base_name = expression.substr(open + 1, close - open - 1);
147 _dependent_symbols.clear();
148 _state = PropertyState::OLDER;
151 else if (expression.substr(0, open) ==
"D")
153 auto arguments = expression.substr(open + 1, close - open - 1);
154 auto close2 = arguments.find_last_of(
")");
156 if (close2 == std::string::npos)
163 if (_derivative_symbols.size() > 0)
166 parseDependentSymbols(_derivative_symbols[0]);
169 _derivative_symbols.erase(_derivative_symbols.begin());
170 updatePropertyName();
177 parseDependentSymbols(arguments.substr(0, close2 + 1));
179 updatePropertyName();
185 mooseError(
"Malformed material_properties expression '", expression,
"'");
192 auto open = expression.find_first_of(
"(");
193 auto close = expression.find_last_of(
")");
195 if (open == std::string::npos && close == std::string::npos)
198 _base_name = expression;
200 else if (open != std::string::npos && close != std::string::npos)
203 _base_name = expression.substr(0, open);
206 MooseUtils::tokenize(expression.substr(open + 1, close - open - 1), _dependent_symbols, 0,
",");
209 std::sort(_dependent_symbols.begin(), _dependent_symbols.end());
210 _dependent_symbols.erase(std::unique(_dependent_symbols.begin(), _dependent_symbols.end()),
211 _dependent_symbols.end());
214 mooseError(
"Malformed material_properties expression '", expression,
"'");
235 if (_state == PropertyState::CURRENT)
237 if (_value ==
nullptr)
245 auto name = derivativePropertyName(_base_name, _derivative_symbols);
251 const bool required = _required && _derivative_symbols.empty();
254 if (_material_parent)
255 _value = required ? &(_material_parent->getGenericMaterialProperty<Real, is_ad>(name))
256 : &(_material_parent->getGenericZeroMaterialProperty<Real, is_ad>(name));
257 else if (_kernel_parent)
258 _value = required ? &(_kernel_parent->getGenericMaterialProperty<Real, is_ad>(name))
259 : &(_kernel_parent->getGenericZeroMaterialProperty<Real, is_ad>(name));
261 mooseError(
"A FunctionMaterialPropertyDescriptor must be owned by either a Material or a "
269 if (_old_older_value ==
nullptr)
271 mooseAssert(_derivative_symbols.empty(),
"Don't take derivatives of old/older properties.");
279 if (_material_parent)
280 _old_older_value = (_state == PropertyState::OLD)
281 ? &(_material_parent->getMaterialPropertyOld<Real>(_base_name))
282 : &(_material_parent->getMaterialPropertyOlder<Real>(_base_name));
283 else if (_kernel_parent)
284 _old_older_value = (_state == PropertyState::OLD)
285 ? &(_kernel_parent->getMaterialPropertyOld<Real>(_base_name))
286 : &(_kernel_parent->getMaterialPropertyOlder<Real>(_base_name));
288 mooseError(
"A FunctionMaterialPropertyDescriptor must be owned by either a Material or a "
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...