www.mooseframework.org
Public Member Functions | Protected Attributes | List of all members
MortarPeriodicAction Class Reference

Set up Mortar based periodicity in an input file with a MortarPeriodicMesh. More...

#include <MortarPeriodicAction.h>

Inheritance diagram for MortarPeriodicAction:
[legend]

Public Member Functions

 MortarPeriodicAction (const InputParameters &parameters)
 
virtual void act ()
 

Protected Attributes

std::vector< VariableName > _variables
 
const unsigned int _periodicity
 
const MultiMooseEnum _periodic_directions
 

Detailed Description

Set up Mortar based periodicity in an input file with a MortarPeriodicMesh.

Definition at line 22 of file MortarPeriodicAction.h.

Constructor & Destructor Documentation

◆ MortarPeriodicAction()

MortarPeriodicAction::MortarPeriodicAction ( const InputParameters &  parameters)

Definition at line 43 of file MortarPeriodicAction.C.

44  : Action(parameters),
45  _variables(getParam<std::vector<VariableName>>("variable")),
46  _periodicity(getParam<MooseEnum>("periodicity")),
47  _periodic_directions(getParam<MultiMooseEnum>("periodic_directions"))
48 {
49 }

Member Function Documentation

◆ act()

void MortarPeriodicAction::act ( )
virtual

Definition at line 52 of file MortarPeriodicAction.C.

53 {
54  // mesh dimension
55  const unsigned short dim = _mesh->dimension();
56 
57  // periodicity subblock name
58  std::string periodicity_name = name();
59 
60  // axis names
61  const std::vector<BoundaryName> axis = {"x", "y", "z"};
62 
63  // boundaries
64  const std::vector<BoundaryName> boundary_names = {"left", "bottom", "back"};
65  // opposite boundaries
66  const std::vector<BoundaryName> opposite_boundary_names = {"right", "top", "front"};
67 
68  // Get the current subdomain ids
69  std::set<SubdomainID> current_subdomain_ids;
70  _mesh->getMesh().subdomain_ids(current_subdomain_ids);
71 
72  SubdomainID new_subdomain_id =
73  *std::max_element(current_subdomain_ids.begin(), current_subdomain_ids.end()) + 1;
74 
75  // iterate over the periodic directions
76  for (unsigned short i = 0; i < dim; ++i)
77  {
78  if (_periodic_directions.contains(i))
79  {
80  //
81  // Add Mortar interfaces. I am only going to add these to the reference
82  // mesh because this action currently has no machinery to add constraints
83  // on the displaced problem (e.g. see the add_constraint block)
84  //
85  if (_current_task == "add_mesh_modifier")
86  {
87  // Don't do mesh modifiers when recovering!
88  if (!_app.isRecovering())
89  {
90  auto slave_params = _factory.getValidParams("LowerDBlockFromSideset");
91  auto master_params = _factory.getValidParams("LowerDBlockFromSideset");
92 
93  auto slave_boundary_id = _mesh->getBoundaryID(boundary_names[i]);
94  auto master_boundary_id = _mesh->getBoundaryID(opposite_boundary_names[i]);
95 
96  slave_params.set<SubdomainID>("new_block_id") = new_subdomain_id++;
97  slave_params.set<SubdomainName>("new_block_name") = "slave_" + axis[i];
98  slave_params.set<std::vector<BoundaryID>>("sidesets") = {slave_boundary_id};
99  slave_params.set<MooseMesh *>("_mesh") = _mesh.get();
100 
101  master_params.set<SubdomainID>("new_block_id") = new_subdomain_id++;
102  master_params.set<SubdomainName>("new_block_name") = "master_" + axis[i];
103  master_params.set<std::vector<BoundaryID>>("sidesets") = {master_boundary_id};
104  master_params.set<MooseMesh *>("_mesh") = _mesh.get();
105 
106  _app.addMeshModifier("LowerDBlockFromSideset", axis[i] + "_slave_lower_d", slave_params);
107  _app.addMeshModifier(
108  "LowerDBlockFromSideset", axis[i] + "_master_lower_d", master_params);
109  }
110  }
111 
112  // Lagrange multiplier variable base name
113  const std::string lm_base = "lm_" + periodicity_name + "_" + boundary_names[i];
114 
115  //
116  // Add Lagrange multiplier variables
117  //
118 
119  if (_current_task == "add_variable")
120  {
121  std::set<SubdomainID> sub_ids = {_mesh->getSubdomainID("slave_" + axis[i])};
122  for (auto & var : _variables)
123  {
124  switch (_periodicity)
125  {
126  case 0: // gradient
127  {
128  for (unsigned short j = 0; j < dim; ++j)
129  {
130  _problem->addVariable(lm_base + "_" + var + "_d" + axis[j],
131  FEType(Utility::string_to_enum<Order>("FIRST"),
132  Utility::string_to_enum<FEFamily>("LAGRANGE")),
133  1.0,
134  &sub_ids);
135  }
136  break;
137  }
138 
139  case 1: // value
140  {
141  _problem->addVariable(lm_base + "_" + var,
142  FEType(Utility::string_to_enum<Order>("FIRST"),
143  Utility::string_to_enum<FEFamily>("LAGRANGE")),
144  1.0,
145  &sub_ids);
146  break;
147  }
148 
149  default:
150  paramError("periodicity", "Periodicity type not implemented");
151  }
152  }
153  }
154 
155  //
156  // Add Constraints
157  //
158 
159  if (_current_task == "add_constraint")
160  {
161  for (auto & var : _variables)
162  {
163  const std::string ct_base =
164  "ct_" + periodicity_name + "_" + boundary_names[i] + "_" + var;
165  switch (_periodicity)
166  {
167  case 0: // gradient
168  {
169  for (unsigned short j = 0; j < dim; ++j)
170  {
171  InputParameters params =
172  _factory.getValidParams("EqualGradientConstraint<RESIDUAL>");
173  params.set<NonlinearVariableName>("variable") =
174  lm_base + "_" + var + "_d" + axis[j];
175  params.set<VariableName>("master_variable") = var;
176  params.set<BoundaryName>("slave_boundary_name") = boundary_names[i];
177  params.set<BoundaryName>("master_boundary_name") = opposite_boundary_names[i];
178  params.set<SubdomainName>("slave_subdomain_name") = "slave_" + axis[i];
179  params.set<SubdomainName>("master_subdomain_name") = "master_" + axis[i];
180  params.set<unsigned int>("component") = j;
181  params.set<bool>("periodic") = true;
182  _problem->addConstraint("EqualGradientConstraint<RESIDUAL>",
183  ct_base + "_d" + axis[j] + "_residual",
184  params);
185  _problem->addConstraint("EqualGradientConstraint<JACOBIAN>",
186  ct_base + "_d" + axis[j] + "_jacobian",
187  params);
188  }
189  break;
190  }
191 
192  case 1: // value
193  {
194  InputParameters params = _factory.getValidParams("EqualValueConstraint<RESIDUAL>");
195  params.set<NonlinearVariableName>("variable") = lm_base + "_" + var;
196  params.set<VariableName>("master_variable") = var;
197  params.set<BoundaryName>("slave_boundary_name") = boundary_names[i];
198  params.set<BoundaryName>("master_boundary_name") = opposite_boundary_names[i];
199  params.set<SubdomainName>("slave_subdomain_name") = "slave_" + axis[i];
200  params.set<SubdomainName>("master_subdomain_name") = "master_" + axis[i];
201  params.set<bool>("periodic") = true;
202  _problem->addConstraint(
203  "EqualValueConstraint<RESIDUAL>", ct_base + "_residual", params);
204  _problem->addConstraint(
205  "EqualValueConstraint<JACOBIAN>", ct_base + "_jacobian", params);
206 
207  break;
208  }
209 
210  default:
211  mooseError("Periodicity type not implemented");
212  }
213  }
214  }
215  }
216  }
217 }

Member Data Documentation

◆ _periodic_directions

const MultiMooseEnum MortarPeriodicAction::_periodic_directions
protected

Definition at line 37 of file MortarPeriodicAction.h.

Referenced by act().

◆ _periodicity

const unsigned int MortarPeriodicAction::_periodicity
protected

Definition at line 34 of file MortarPeriodicAction.h.

Referenced by act().

◆ _variables

std::vector<VariableName> MortarPeriodicAction::_variables
protected

Definition at line 31 of file MortarPeriodicAction.h.

Referenced by act().


The documentation for this class was generated from the following files:
MortarPeriodicAction::_variables
std::vector< VariableName > _variables
Definition: MortarPeriodicAction.h:31
MortarPeriodicAction::_periodic_directions
const MultiMooseEnum _periodic_directions
Definition: MortarPeriodicAction.h:37
MortarPeriodicAction::_periodicity
const unsigned int _periodicity
Definition: MortarPeriodicAction.h:34
name
const std::string name
Definition: Setup.h:21