www.mooseframework.org
CavityPressureAction.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 "CavityPressureAction.h"
11 #include "Factory.h"
12 #include "FEProblem.h"
13 #include "Conversion.h"
14 
15 registerMooseAction("TensorMechanicsApp", CavityPressureAction, "add_bc");
16 
18 
19 InputParameters
21 {
22  InputParameters params = Action::validParams();
23  params.addRequiredParam<std::vector<BoundaryName>>(
24  "boundary", "The list of boundary IDs from the mesh where the pressure will be applied");
25  params.addRequiredParam<std::vector<VariableName>>("displacements",
26  "The nonlinear displacement variables");
27  params.addParam<std::vector<AuxVariableName>>(
28  "save_in", "Auxiliary variables to save the displacement residuals");
29  params.addParam<std::string>("output", "The name to use for the cavity pressure value");
30  params.addParam<bool>(
31  "use_displaced_mesh", true, "Whether to use displaced mesh in the boundary condition");
32  params.addParam<bool>("use_automatic_differentiation",
33  false,
34  "Flag to use automatic differentiation (AD) objects when possible");
35  return params;
36 }
37 
38 CavityPressureAction::CavityPressureAction(const InputParameters & params)
39  : Action(params), _use_ad(getParam<bool>("use_automatic_differentiation"))
40 {
41 }
42 
43 void
45 {
46  auto displacements = getParam<std::vector<VariableName>>("displacements");
47  auto save_in = getParam<std::vector<AuxVariableName>>("save_in");
48 
49  unsigned int ndisp = displacements.size();
50  if (save_in.size() > 0 && save_in.size() != ndisp)
51  mooseError("Number of save_in variables should equal to the number of displacement variables ",
52  ndisp);
53 
54  std::string ad_append = "";
55  std::string ad_prepend = "";
56  if (_use_ad)
57  {
58  ad_append = "<RESIDUAL>";
59  ad_prepend = "AD";
60  }
61 
62  std::string kernel_name = ad_prepend + "Pressure";
63 
64  InputParameters params = _factory.getValidParams(kernel_name + ad_append);
65  params.applyParameters(parameters());
66 
67  params.set<PostprocessorName>("postprocessor") =
68  isParamValid("output") ? getParam<std::string>("output") : _name;
69 
70  for (unsigned int i = 0; i < ndisp; ++i)
71  {
72  params.set<unsigned int>("component") = i;
73  params.set<NonlinearVariableName>("variable") = displacements[i];
74  if (!save_in.empty())
75  params.set<std::vector<AuxVariableName>>("save_in") = {save_in[i]};
76  std::string unique_kernel_name = _name + "_" + Moose::stringify(i);
77 
78  if (_use_ad)
79  {
80  _problem->addBoundaryCondition(
81  kernel_name + ad_append, unique_kernel_name + "_residual", params);
82  _problem->addBoundaryCondition(
83  kernel_name + "<JACOBIAN>", unique_kernel_name + "_jacobian", params);
84  _problem->haveADObjects(true);
85  }
86  else
87  {
88  _problem->addBoundaryCondition(kernel_name, unique_kernel_name, params);
89  }
90  }
91 }
CavityPressureAction::validParams
static InputParameters validParams()
Definition: CavityPressureAction.C:20
CavityPressureAction
Definition: CavityPressureAction.h:19
registerMooseAction
registerMooseAction("TensorMechanicsApp", CavityPressureAction, "add_bc")
CavityPressureAction::CavityPressureAction
CavityPressureAction(const InputParameters &params)
Definition: CavityPressureAction.C:38
validParams
InputParameters validParams()
defineLegacyParams
defineLegacyParams(CavityPressureAction)
CavityPressureAction.h
CavityPressureAction::act
virtual void act() override
Definition: CavityPressureAction.C:44
CavityPressureAction::_use_ad
const bool _use_ad
Flag to use automatic differentiation where possible.
Definition: CavityPressureAction.h:29