55 const unsigned short dim = _mesh->dimension();
58 std::string periodicity_name =
name();
61 const std::vector<BoundaryName> axis = {
"x",
"y",
"z"};
64 const std::vector<BoundaryName> boundary_names = {
"left",
"bottom",
"back"};
66 const std::vector<BoundaryName> opposite_boundary_names = {
"right",
"top",
"front"};
69 std::set<SubdomainID> current_subdomain_ids;
70 _mesh->getMesh().subdomain_ids(current_subdomain_ids);
72 SubdomainID new_subdomain_id =
73 *std::max_element(current_subdomain_ids.begin(), current_subdomain_ids.end()) + 1;
76 for (
unsigned short i = 0; i < dim; ++i)
85 if (_current_task ==
"add_mesh_modifier")
88 if (!_app.isRecovering())
90 auto slave_params = _factory.getValidParams(
"LowerDBlockFromSideset");
91 auto master_params = _factory.getValidParams(
"LowerDBlockFromSideset");
93 auto slave_boundary_id = _mesh->getBoundaryID(boundary_names[i]);
94 auto master_boundary_id = _mesh->getBoundaryID(opposite_boundary_names[i]);
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();
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();
106 _app.addMeshModifier(
"LowerDBlockFromSideset", axis[i] +
"_slave_lower_d", slave_params);
107 _app.addMeshModifier(
108 "LowerDBlockFromSideset", axis[i] +
"_master_lower_d", master_params);
113 const std::string lm_base =
"lm_" + periodicity_name +
"_" + boundary_names[i];
119 if (_current_task ==
"add_variable")
121 std::set<SubdomainID> sub_ids = {_mesh->getSubdomainID(
"slave_" + axis[i])};
128 for (
unsigned short j = 0; j < dim; ++j)
130 _problem->addVariable(lm_base +
"_" + var +
"_d" + axis[j],
131 FEType(Utility::string_to_enum<Order>(
"FIRST"),
132 Utility::string_to_enum<FEFamily>(
"LAGRANGE")),
141 _problem->addVariable(lm_base +
"_" + var,
142 FEType(Utility::string_to_enum<Order>(
"FIRST"),
143 Utility::string_to_enum<FEFamily>(
"LAGRANGE")),
150 paramError(
"periodicity",
"Periodicity type not implemented");
159 if (_current_task ==
"add_constraint")
163 const std::string ct_base =
164 "ct_" + periodicity_name +
"_" + boundary_names[i] +
"_" + var;
169 for (
unsigned short j = 0; j < dim; ++j)
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",
185 _problem->addConstraint(
"EqualGradientConstraint<JACOBIAN>",
186 ct_base +
"_d" + axis[j] +
"_jacobian",
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);
211 mooseError(
"Periodicity type not implemented");