14#define registerMOOSEQuantityToNEML2(T) \
15 registerMooseObject("MooseApp", MOOSE##T##ToNEML2); \
16 registerMooseObject("MooseApp", MOOSEOld##T##ToNEML2)
23template <
typename T,
unsigned int state>
30 params.addClassDescription(
31 "Gather a MOOSE quantity of type " + demangle(
typeid(T).name()) +
32 " for insertion into the specified input or model parameter of a NEML2 model.");
33 params.template addRequiredParam<std::string>(
"from_moose",
34 "Name of the MOOSE quantity to read from");
35 MooseEnum moose_type(
"TIME SCALAR FUNCTION VARIABLE MATERIAL",
"MATERIAL");
36 params.template addParam<MooseEnum>(
37 "quantity_type", moose_type,
"Type of the MOOSE quantity to read from.");
44 params.set<
ExecFlagEnum>(
"execute_on") = execute_options;
49template <
typename T,
unsigned int state>
57 _type ==
NEML2Utils::MOOSEIOType::SCALAR && state == 0
58 ? &this->_fe_problem.getScalarVariable(_tid, getParam<
std::string>(
"from_moose")).sln()
61 _type ==
NEML2Utils::MOOSEIOType::SCALAR && state == 1
62 ? &this->_fe_problem.getScalarVariable(_tid, getParam<
std::string>(
"from_moose"))
65 _func(_type ==
NEML2Utils::MOOSEIOType::FUNCTION
66 ? &this->_fe_problem.getFunction(getParam<
std::string>(
"from_moose"), _tid)
69 _type ==
NEML2Utils::MOOSEIOType::MATERIAL && state == 0
70 ? &this->template getMaterialPropertyByName<T>(getParam<
std::string>(
"from_moose"))
73 _type ==
NEML2Utils::MOOSEIOType::MATERIAL && state == 1
74 ? &this->template getMaterialPropertyOldByName<T>(getParam<
std::string>(
"from_moose"))
76 _var(_type ==
NEML2Utils::MOOSEIOType::VARIABLE && state == 0
77 ? &this->_fe_problem.getStandardVariable(_tid, getParam<
std::string>(
"from_moose"))
80 _var_old(_type ==
NEML2Utils::MOOSEIOType::VARIABLE && state == 1
81 ? &this->_fe_problem.getStandardVariable(_tid, getParam<
std::string>(
"from_moose"))
90template <
typename T,
unsigned int state>
97template <
typename T,
unsigned int state>
104 for (
unsigned int qp = 0; qp < _qrule->n_points(); qp++)
105 _buffer.emplace_back(qpData(qp));
108template <
typename T,
unsigned int state>
115 const auto & m2n = cast_ref<const MOOSEQuantityToNEML2<T, state> &>(uo);
116 _buffer.insert(_buffer.end(), m2n._buffer.begin(), m2n._buffer.end());
119template <
typename T,
unsigned int state>
128 return state == 0 ? neml2::Scalar::full(_t, neml2::kFloat64)
129 : neml2::Scalar::full(_t_old, neml2::kFloat64);
131 return state == 0 ? neml2::Scalar::full((*_var_scalar)[0], neml2::kFloat64)
132 : neml2::Scalar::full((*_var_scalar_old)[0], neml2::kFloat64);
137 "Unbatched quantity cannot be of type MATERIAL or VARIABLE. This should never happen.");
139 mooseError(
"Invalid MOOSE quantity type. This should never happen.");
146template <
typename T,
unsigned int state>
152 "elemMOOSEData should only be called for batched quantities. This should never happen.");
155 if constexpr (!std::is_same_v<T, Real>)
156 return state == 0 ? (*_mat_prop)[qp] : (*_mat_prop_old)[qp];
161 mooseError(
"Batched quantity cannot be of type TIME. This should never happen.");
163 mooseError(
"Batched quantity cannot be of type SCALAR. This should never happen.");
165 return _func->value(state == 0 ? _t : _t_old, _q_point[qp]);
167 return state == 0 ? (*_var)[qp] : (*_var_old)[qp];
169 return state == 0 ? (*_mat_prop)[qp] : (*_mat_prop_old)[qp];
171 mooseError(
"Invalid MOOSE quantity type. This should never happen.");
176#define instantiateMOOSEQuantityToNEML2(T) \
177 template class MOOSEQuantityToNEML2<T, 0>; \
178 template class MOOSEQuantityToNEML2<T, 1>
instantiateMOOSEQuantityToNEML2(Real)
registerMOOSEQuantityToNEML2(Real)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
const ExecFlagType EXEC_INITIAL
const ExecFlagType EXEC_LINEAR
const ExecFlagType EXEC_NONLINEAR
static InputParameters validParams()
A MultiMooseEnum object to hold "execute_on" flags.
void execute() override
Execute method.
MOOSEQuantityToNEML2(const InputParameters ¶ms)
neml2::Tensor gatheredData() const override
Convert data gathered from MOOSE into neml2::Tensor.
void initialize() override
Called before execute() is ever called so that data can be cleared.
static InputParameters validParams()
T qpData(unsigned int) const
void threadJoin(const UserObject &) override
Must override.
Common interface for inserting gathered MOOSE data into the NEML2 material model.
static InputParameters validParams()
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Base class for user-specific data.
ExecFlagEnum getDefaultExecFlagEnum()
neml2::Tensor fromBlob(const std::vector< T > &data)
Map from std::vector<T> to neml2::Tensor without copying the data.