26 template <
class T,
class U>
63 std::vector<MaterialProperty<T> *>
_dM;
64 std::vector<std::vector<MaterialProperty<T> *>>
_d2M;
68 std::vector<const MaterialProperty<T> *>
_tensors;
69 std::vector<std::vector<const MaterialProperty<T> *>>
_dtensors;
70 std::vector<std::vector<std::vector<const MaterialProperty<T> *>>>
_d2tensors;
74 std::vector<const MaterialProperty<Real> *>
_weights;
75 std::vector<std::vector<const MaterialProperty<Real> *>>
_dweights;
76 std::vector<std::vector<std::vector<const MaterialProperty<Real> *>>>
_d2weights;
80 template <
class T,
class U>
83 _tensor_names(this->template getParam<
std::vector<MaterialPropertyName>>(
"tensors")),
84 _weight_names(this->template getParam<
std::vector<MaterialPropertyName>>(
"weights")),
86 _num_comp(_tensor_names.size()),
91 _d2tensors(_num_comp),
97 mooseError(
"The number of supplied 'tensors' and 'weights' must match.");
100 template <
class T,
class U>
105 params.
addRequiredParam<std::vector<MaterialPropertyName>>(
"tensors",
"Component tensors");
106 params.
addRequiredParam<std::vector<MaterialPropertyName>>(
"weights",
"Component weights");
111 template <
class T,
class U>
116 for (
unsigned int j = 0; j < _num_args; ++j)
118 const VariableName & jname =
120 _dM[j] = &this->
template declarePropertyDerivative<T>(
name, jname);
121 _d2M[j].resize(j + 1);
123 for (
unsigned int k = 0; k <= j; ++k)
125 const VariableName & kname =
128 _d2M[j][k] = &this->
template declarePropertyDerivative<T>(
name, jname, kname);
133 for (
unsigned int i = 0; i < _num_comp; ++i)
135 _tensors[i] = &this->
template getMaterialPropertyByName<T>(_tensor_names[i]);
136 _weights[i] = &this->
template getMaterialPropertyByName<Real>(_weight_names[i]);
138 _dtensors[i].resize(_num_args);
139 _dweights[i].resize(_num_args);
140 _d2tensors[i].resize(_num_args);
141 _d2weights[i].resize(_num_args);
143 for (
unsigned int j = 0; j < _num_args; ++j)
145 const VariableName & jname =
149 &this->
template getMaterialPropertyDerivativeByName<T>(_tensor_names[i], jname);
151 &this->
template getMaterialPropertyDerivativeByName<Real>(_weight_names[i], jname);
153 _d2tensors[i][j].resize(j + 1);
154 _d2weights[i][j].resize(j + 1);
156 for (
unsigned int k = 0; k <= j; ++k)
158 const VariableName & kname =
161 _d2tensors[i][j][k] =
162 &this->
template getMaterialPropertyDerivativeByName<T>(_tensor_names[i], jname, kname);
163 _d2weights[i][j][k] = &this->
template getMaterialPropertyDerivativeByName<Real>(
164 _weight_names[i], jname, kname);
170 template <
class T,
class U>
173 Real derivative_prefactor)
178 for (
unsigned int i = 0; i < _num_comp; ++i)
180 M[qp] += (*_tensors[i])[qp] * (*_weights[i])[qp];
182 for (
unsigned int j = 0; j < _num_args; ++j)
185 (*_dM[j])[qp].
zero();
187 (*_dM[j])[qp] += derivative_prefactor * ((*_tensors[i])[qp] * (*_dweights[i][j])[qp] +
188 (*_dtensors[i][j])[qp] * (*_weights[i])[qp]);
190 for (
unsigned int k = 0; k <= j; ++k)
193 (*_d2M[j][k])[qp].
zero();
196 derivative_prefactor * (2.0 * (*_dtensors[i][j])[qp] * (*_dweights[i][j])[qp] +
197 (*_tensors[i])[qp] * (*_d2weights[i][j][k])[qp] +
198 (*_d2tensors[i][j][k])[qp] * (*_weights[i])[qp]);
std::string name(const ElemQuality q)
CompositeTensorBase computes a simple T type MaterialProperty that is summed up from a list of other...
std::vector< const MaterialProperty< Real > * > _weights
component weights and their derivatives w.r.t. the args
std::vector< MaterialProperty< T > * > _dM
Composed tensor and its derivatives.
static InputParameters validParams()
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
std::vector< MaterialPropertyName > _weight_names
component weight names
virtual void computeQpTensorProperties(MaterialProperty< T > &M, Real derivative_prefactor=1.0)
Fill in the.
std::vector< std::vector< std::vector< const MaterialProperty< Real > * > > > _d2weights
InputParameters validParams()
void initializeDerivativeProperties(const std::string name)
Output material properties are initialized here so that derived classes can modify the name...
std::vector< const MaterialProperty< T > * > _tensors
component tensors and their derivatives w.r.t. the args
CompositeTensorBase(const InputParameters ¶meters)
std::vector< std::vector< const MaterialProperty< T > * > > _dtensors
unsigned int _num_comp
number of compomemt tensors and weights
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Interface class ("Veneer") to provide generator methods for derivative material property names...
std::vector< std::vector< const MaterialProperty< Real > * > > _dweights
unsigned int _num_args
number of dependent variables
std::vector< std::vector< MaterialProperty< T > * > > _d2M
std::vector< MaterialPropertyName > _tensor_names
component tensor names
std::vector< std::vector< std::vector< const MaterialProperty< T > * > > > _d2tensors