https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
16registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_kernel");
17
18registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_material");
19
20registerMooseAction("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
47void
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}
registerMooseAction("PhaseFieldApp", DisplacementGradientsAction, "add_kernel")
static InputParameters validParams()
std::shared_ptr< FEProblemBase > & _problem
const std::string & _current_task
Automatically generates all variables, Kernels, and Materials to ensure the correct derivatives of th...
std::vector< VariableName > _displacements
DisplacementGradientsAction(const InputParameters &params)
std::vector< VariableName > _displacement_gradients
InputParameters getValidParams(const std::string &name) const
void applySpecificParameters(const InputParameters &common, const std::vector< std::string > &include, bool allow_private=false)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
const InputParameters & parameters() const
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
const InputParameters & _pars
Factory & _factory