https://mooseframework.inl.gov
DisplacementGradientsAction.C
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 
11 #include "Factory.h"
12 #include "FEProblem.h"
13 
14 #include "libmesh/string_to_enum.h"
15 
16 registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_kernel");
17 
18 registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_material");
19 
20 registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_variable");
21 
24 {
26  params.addClassDescription("Set up variables, kernels, and materials for a the displacement "
27  "gradients and their elastic free energy derivatives for non-split "
28  "Cahn-Hilliard problems.");
29  params.addRequiredParam<std::vector<VariableName>>("displacements",
30  "Vector of displacement variables");
31  params.addRequiredParam<std::vector<VariableName>>("displacement_gradients",
32  "Vector of displacement gradient variables");
33  params.addParam<Real>(
34  "scaling", 1.0, "Specifies a scaling factor to apply to the displacement gradient variables");
35  params.addParam<std::vector<SubdomainName>>(
36  "block", {}, "Block restriction for the variables and kernels");
37  return params;
38 }
39 
41  : Action(params),
42  _displacements(getParam<std::vector<VariableName>>("displacements")),
43  _displacement_gradients(getParam<std::vector<VariableName>>("displacement_gradients"))
44 {
45 }
46 
47 void
49 {
50  unsigned int ngrad = _displacement_gradients.size();
51 
52  if (_current_task == "add_variable")
53  {
54  // Loop through the gij variables
55  Real scaling = getParam<Real>("scaling");
56  for (unsigned int i = 0; i < ngrad; ++i)
57  {
58  auto var_params = _factory.getValidParams("MooseVariable");
59  var_params.set<MooseEnum>("family") = "LAGRANGE";
60  var_params.set<MooseEnum>("order") = "FIRST";
61  var_params.set<std::vector<Real>>("scaling") = {scaling};
62  var_params.applySpecificParameters(_pars, {"block"});
63 
64  // Create displacement gradient variables
65  _problem->addVariable("MooseVariable", _displacement_gradients[i], var_params);
66  }
67  }
68  else if (_current_task == "add_material")
69  {
70  InputParameters params = _factory.getValidParams("StrainGradDispDerivatives");
71  params.set<std::vector<VariableName>>("displacement_gradients") = _displacement_gradients;
72  params.applySpecificParameters(parameters(), {"block"});
73  _problem->addMaterial("StrainGradDispDerivatives", "strain_grad_disp_derivatives", params);
74  }
75  else if (_current_task == "add_kernel")
76  {
77  unsigned int ndisp = _displacements.size();
78  if (ndisp * ndisp != ngrad)
79  paramError("displacement_gradients",
80  "Number of displacement gradient variables must be the square of the number of "
81  "displacement variables.");
82 
83  // Loop through the displacements
84  unsigned int i = 0;
85  for (unsigned int j = 0; j < ndisp; ++j)
86  for (unsigned int k = 0; k < ndisp; ++k)
87  {
88  InputParameters params = _factory.getValidParams("GradientComponent");
89  params.set<NonlinearVariableName>("variable") = _displacement_gradients[i];
90  params.set<std::vector<VariableName>>("v") = {_displacements[j]};
91  params.set<unsigned int>("component") = k;
92  _problem->addKernel(
93  "GradientComponent", _displacement_gradients[i] + "_grad_kernel", params);
94  ++i;
95  }
96  }
97  else
98  mooseError("Internal error.");
99 }
DisplacementGradientsAction(const InputParameters &params)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void applySpecificParameters(const InputParameters &common, const std::vector< std::string > &include, bool allow_private=false)
T & set(const std::string &name, bool quiet_mode=false)
InputParameters getValidParams(const std::string &name) const
registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_kernel")
void addRequiredParam(const std::string &name, const std::string &doc_string)
Factory & _factory
static InputParameters validParams()
const std::string & _current_task
void paramError(const std::string &param, Args... args) const
std::vector< VariableName > _displacements
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< VariableName > _displacement_gradients
void mooseError(Args &&... args) const
const InputParameters & _pars
void addClassDescription(const std::string &doc_string)
std::shared_ptr< FEProblemBase > & _problem
const InputParameters & parameters() const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
static InputParameters validParams()
Automatically generates all variables, Kernels, and Materials to ensure the correct derivatives of th...
static const std::string k
Definition: NS.h:130