www.mooseframework.org
DerivativeSumMaterial.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 #include "DerivativeSumMaterial.h"
11 
12 #include "libmesh/quadrature.h"
13 
16 
17 template <bool is_ad>
20 {
22  params.addClassDescription("Meta-material to sum up multiple derivative materials");
23  params.addParam<std::vector<std::string>>("sum_materials",
24  "Base name of the parsed sum material property");
25 
26  // All arguments of the parsed expression (free energy) being summed
27  params.addRequiredCoupledVar("args", "Vector of names of variables being summed");
28  params.deprecateCoupledVar("args", "coupled_variables", "02/07/2024");
29 
30  params.addCoupledVar("displacement_gradients",
31  "Vector of displacement gradient variables (see "
32  "Modules/PhaseField/DisplacementGradients "
33  "action)");
34 
35  // Advanced arguments to construct a sum of the form \f$ c+\gamma\sum_iF_i \f$
36  params.addParam<std::vector<Real>>("prefactor", {}, "Prefactor to multiply the sum term with.");
37  params.addParam<Real>("constant", 0.0, "Constant to be added to the prefactor multiplied sum.");
38 
39  params.addParam<bool>("validate_coupling",
40  true,
41  "Check if all variables the specified materials depend on are listed in "
42  "the `coupled_variables` parameter.");
43  params.addParamNamesToGroup("prefactor constant", "Advanced");
44 
45  return params;
46 }
47 
48 template <bool is_ad>
50  : DerivativeFunctionMaterialBaseTempl<is_ad>(parameters),
51  _sum_materials(this->template getParam<std::vector<std::string>>("sum_materials")),
52  _num_materials(_sum_materials.size()),
53  _prefactor(_num_materials, 1.0),
54  _constant(this->template getParam<Real>("constant")),
55  _validate_coupling(this->template getParam<bool>("validate_coupling"))
56 {
57  // we need at least one material in the sum
58  if (_num_materials == 0)
59  mooseError("Please supply at least one material to sum in DerivativeSumMaterial ", name());
60 
61  // get prefactor values if not 1.0
62  std::vector<Real> p = this->template getParam<std::vector<Real>>("prefactor");
63 
64  // if prefactor is used we need the same number of prefactors as sum materials
65  if (_num_materials == p.size())
66  _prefactor = p;
67  else if (p.size() != 0)
68  mooseError("Supply the same number of sum materials and prefactors.");
69 
70  // reserve space for summand material properties
71  _summand_F.resize(_num_materials);
75 
76  for (unsigned int n = 0; n < _num_materials; ++n)
77  {
78  _summand_F[n] = &this->template getGenericMaterialProperty<Real, is_ad>(_sum_materials[n]);
79  _summand_dF[n].resize(_nargs);
80  _summand_d2F[n].resize(_nargs);
81  _summand_d3F[n].resize(_nargs);
82 
83  for (unsigned int i = 0; i < _nargs; ++i)
84  {
85  _summand_dF[n][i] = &this->template getMaterialPropertyDerivative<Real, is_ad>(
86  _sum_materials[n], _arg_names[i]);
87  _summand_d2F[n][i].resize(_nargs);
88 
90  _summand_d3F[n][i].resize(_nargs);
91 
92  for (unsigned int j = 0; j < _nargs; ++j)
93  {
94  _summand_d2F[n][i][j] = &this->template getMaterialPropertyDerivative<Real, is_ad>(
96 
98  {
99  _summand_d3F[n][i][j].resize(_nargs);
100 
101  for (unsigned int k = 0; k < _nargs; ++k)
102  _summand_d3F[n][i][j][k] = &this->template getMaterialPropertyDerivative<Real, is_ad>(
104  }
105  }
106  }
107  }
108 }
109 
110 template <bool is_ad>
111 void
113 {
114  if (_validate_coupling)
115  for (unsigned int n = 0; n < _num_materials; ++n)
116  this->template validateCoupling<Real>(_sum_materials[n]);
117 }
118 
119 template <bool is_ad>
120 void
122 {
123  unsigned int i, j, k;
124 
125  for (_qp = 0; _qp < _qrule->n_points(); _qp++)
126  {
127  // set function value
128  if (_prop_F)
129  {
130  (*_prop_F)[_qp] = (*_summand_F[0])[_qp] * _prefactor[0];
131  for (unsigned int n = 1; n < _num_materials; ++n)
132  (*_prop_F)[_qp] += (*_summand_F[n])[_qp] * _prefactor[n];
133  }
134 
135  for (i = 0; i < _nargs; ++i)
136  {
137  // set first derivatives
138  if (_prop_dF[i])
139  {
140  (*_prop_dF[i])[_qp] = (*_summand_dF[0][i])[_qp] * _prefactor[0];
141  for (unsigned int n = 1; n < _num_materials; ++n)
142  (*_prop_dF[i])[_qp] += (*_summand_dF[n][i])[_qp] * _prefactor[n];
143  }
144 
145  // second derivatives
146  for (j = i; j < _nargs; ++j)
147  {
148  if (_prop_d2F[i][j])
149  {
150  (*_prop_d2F[i][j])[_qp] = (*_summand_d2F[0][i][j])[_qp] * _prefactor[0];
151  for (unsigned int n = 1; n < _num_materials; ++n)
152  (*_prop_d2F[i][j])[_qp] += (*_summand_d2F[n][i][j])[_qp] * _prefactor[n];
153  }
154 
155  // third derivatives
156  if (_third_derivatives)
157  {
158  for (k = j; k < _nargs; ++k)
159  if (_prop_d3F[i][j][k])
160  {
161  (*_prop_d3F[i][j][k])[_qp] = (*_summand_d3F[0][i][j][k])[_qp] * _prefactor[0];
162  for (unsigned int n = 1; n < _num_materials; ++n)
163  (*_prop_d3F[i][j][k])[_qp] += (*_summand_d3F[n][i][j][k])[_qp] * _prefactor[n];
164  }
165  }
166  }
167  }
168  }
169 }
DerivativeSumMaterialTempl(const InputParameters &parameters)
std::vector< std::string > _sum_materials
std::vector< std::vector< std::vector< const GenericMaterialProperty< Real, is_ad > * > > > _summand_d2F
Second derivatives of the summands.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::vector< std::vector< std::vector< std::vector< const GenericMaterialProperty< Real, is_ad > * > > > > _summand_d3F
Third derivatives of the summands.
std::vector< Real > _prefactor
arguments to construct a sum of the form
virtual const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:56
virtual void initialSetup()
Check if we got the right number of components in the &#39;coupled_variables&#39; vector. ...
std::vector< std::string > _arg_names
String vector of all argument names.
std::vector< std::vector< const GenericMaterialProperty< Real, is_ad > * > > _summand_dF
Derivatives of the summands with respect to arg[i].
virtual void computeProperties()
Performs the quadrature point loop, calling computeQpProperties.
registerMooseObject("MooseApp", DerivativeSumMaterial)
void deprecateCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &removal_date)
void addCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
bool _third_derivatives
Calculate (and allocate memory for) the third derivatives of the free energy.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
Material base class to compute a function and its derivatives.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an option parameter and a documentation string to the InputParameters object...
unsigned int _nargs
Number of coupled arguments.
std::vector< const GenericMaterialProperty< Real, is_ad > * > _summand_F
Function values of the summands.
static InputParameters validParams()
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...