www.mooseframework.org
DisplacementGradientsAction.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 
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 
22 template <>
23 InputParameters
25 {
26  InputParameters params = validParams<Action>();
27  params.addClassDescription("Set up variables, kernels, and materials for a the displacement "
28  "gradients and their elastic free energy derivatives for non-split "
29  "Cahn-Hilliard problems.");
30  params.addRequiredParam<std::vector<VariableName>>("displacements",
31  "Vector of displacement variables");
32  params.addRequiredParam<std::vector<VariableName>>("displacement_gradients",
33  "Vector of displacement gradient variables");
34  params.addParam<Real>(
35  "scaling", 1.0, "Specifies a scaling factor to apply to the displacement gradient variables");
36  return params;
37 }
38 
40  : Action(params),
41  _displacements(getParam<std::vector<VariableName>>("displacements")),
42  _displacement_gradients(getParam<std::vector<VariableName>>("displacement_gradients"))
43 {
44 }
45 
46 void
48 {
49  unsigned int ngrad = _displacement_gradients.size();
50 
51  if (_current_task == "add_variable")
52  {
53  // Loop through the gij variables
54  Real scaling = getParam<Real>("scaling");
55  for (unsigned int i = 0; i < ngrad; ++i)
56  {
57  auto var_params = _factory.getValidParams("MooseVariable");
58  var_params.set<MooseEnum>("family") = "LAGRANGE";
59  var_params.set<MooseEnum>("order") = "FIRST";
60  var_params.set<std::vector<Real>>("scaling") = {scaling};
61 
62  // Create displacement gradient variables
63  _problem->addVariable("MooseVariable", _displacement_gradients[i], var_params);
64  }
65  }
66  else if (_current_task == "add_material")
67  {
68  InputParameters params = _factory.getValidParams("StrainGradDispDerivatives");
69  params.set<std::vector<VariableName>>("displacement_gradients") = _displacement_gradients;
70  params.set<std::vector<SubdomainName>>("block") = {"0"}; // TODO: add parameter for this
71  _problem->addMaterial("StrainGradDispDerivatives", "strain_grad_disp_derivatives", params);
72  }
73  else if (_current_task == "add_kernel")
74  {
75  unsigned int ndisp = _displacements.size();
76  if (ndisp * ndisp != ngrad)
77  paramError("displacement_gradients",
78  "Number of displacement gradient variables must be the square of the number of "
79  "displacement variables.");
80 
81  // Loop through the displacements
82  unsigned int i = 0;
83  for (unsigned int j = 0; j < ndisp; ++j)
84  for (unsigned int k = 0; k < ndisp; ++k)
85  {
86  InputParameters params = _factory.getValidParams("GradientComponent");
87  params.set<NonlinearVariableName>("variable") = _displacement_gradients[i];
88  params.set<std::vector<VariableName>>("v") = {_displacements[j]};
89  params.set<unsigned int>("component") = k;
90  _problem->addKernel(
91  "GradientComponent", _displacement_gradients[i] + "_grad_kernel", params);
92  ++i;
93  }
94  }
95  else
96  mooseError("Internal error.");
97 }
DisplacementGradientsAction::DisplacementGradientsAction
DisplacementGradientsAction(const InputParameters &params)
Definition: DisplacementGradientsAction.C:39
DisplacementGradientsAction::_displacements
std::vector< VariableName > _displacements
Definition: DisplacementGradientsAction.h:28
registerMooseAction
registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_kernel")
validParams< DisplacementGradientsAction >
InputParameters validParams< DisplacementGradientsAction >()
Definition: DisplacementGradientsAction.C:24
DisplacementGradientsAction::act
virtual void act()
Definition: DisplacementGradientsAction.C:47
DisplacementGradientsAction::_displacement_gradients
std::vector< VariableName > _displacement_gradients
Definition: DisplacementGradientsAction.h:29
DisplacementGradientsAction.h
DisplacementGradientsAction
Automatically generates all variables, Kernels, and Materials to ensure the correct derivatives of th...
Definition: DisplacementGradientsAction.h:20