https://mooseframework.inl.gov
Loading...
Searching...
No Matches
CohesiveZoneAction.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
10#include "CohesiveZoneAction.h"
12#include "Factory.h"
13#include "FEProblem.h"
14#include "Conversion.h"
15
16registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_interface_kernel");
17registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_material");
18registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_master_action_material");
19registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_aux_variable");
20registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_aux_kernel");
21registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_kernel");
22registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "validate_coordinate_systems");
23
26{
28 params.addClassDescription("Action to create an instance of the cohesive zone model kernel for "
29 "each displacement component");
30 params.addRequiredParam<std::vector<BoundaryName>>(
31 "boundary", "The list of boundary IDs from the mesh where the cohesive zone will be applied");
32 return params;
33}
34
36 : CohesiveZoneActionBase(params),
37 _displacements(getParam<std::vector<VariableName>>("displacements")),
38 _ndisp(_displacements.size()),
39 _use_AD(getParam<bool>("use_automatic_differentiation")),
40 _base_name(isParamValid("base_name") && !getParam<std::string>("base_name").empty()
41 ? getParam<std::string>("base_name")
42 : ""),
43 _boundary(getParam<std::vector<BoundaryName>>("boundary")),
44 _strain(getParam<MooseEnum>("strain").getEnum<Strain>()),
45 _save_in_primary(getParam<std::vector<AuxVariableName>>("save_in_primary")),
46 _diag_save_in_primary(getParam<std::vector<AuxVariableName>>("diag_save_in_primary")),
47 _save_in_secondary(getParam<std::vector<AuxVariableName>>("save_in_secondary")),
48 _diag_save_in_secondary(getParam<std::vector<AuxVariableName>>("diag_save_in_secondary")),
49 _material_output_order(getParam<MultiMooseEnum>("material_output_order")),
50 _material_output_family(getParam<MultiMooseEnum>("material_output_family")),
51 _verbose(getParam<bool>("verbose"))
52{
53 // We can't enforce consistency between the number of displacement variables and the mesh
54 // dimension. Hence we only check we have a reasonable number of displacement variables
55 if (_ndisp > 3 || _ndisp < 1)
56 mooseError("the CZM Action requires 1, 2 or 3 displacement variables.");
57
58 switch (_strain)
59 {
60 case Strain::Small:
61 {
63 _use_AD ? "ADCZMInterfaceKernelSmallStrain" : "CZMInterfaceKernelSmallStrain";
64 _disp_jump_provider_name = _use_AD ? "ADCZMComputeDisplacementJumpSmallStrain"
65 : "CZMComputeDisplacementJumpSmallStrain";
67 _use_AD ? "ADCZMComputeGlobalTractionSmallStrain" : "CZMComputeGlobalTractionSmallStrain";
68 break;
69 }
70 case Strain::Finite:
71 {
73 _use_AD ? "ADCZMInterfaceKernelTotalLagrangian" : "CZMInterfaceKernelTotalLagrangian";
74 _disp_jump_provider_name = _use_AD ? "ADCZMComputeDisplacementJumpTotalLagrangian"
75 : "CZMComputeDisplacementJumpTotalLagrangian";
76 _equilibrium_traction_calculator_name = _use_AD ? "ADCZMComputeGlobalTractionTotalLagrangian"
77 : "CZMComputeGlobalTractionTotalLagrangian";
78 break;
79 }
80 default:
81 mooseError("CohesiveZoneAction Error: Invalid kinematic parameter. Allowed values are: "
82 "SmallStrain or TotalLagrangian");
83 }
84
85 if (_save_in_primary.size() != 0 && _save_in_primary.size() != _ndisp)
87 "Number of save_in_primary variables should equal to the number of displacement variables ",
88 _ndisp);
89 if (_diag_save_in_primary.size() != 0 && _diag_save_in_primary.size() != _ndisp)
91 "Number of diag_save_in_primary variables should equal to the number of displacement "
92 "variables ",
93 _ndisp);
94 if (_save_in_secondary.size() != 0 && _save_in_secondary.size() != _ndisp)
95 mooseError("Number of save_in_secondary variables should equal to the number of displacement "
96 "variables ",
97 _ndisp);
98
99 if (_diag_save_in_secondary.size() != 0 && _diag_save_in_secondary.size() != _ndisp)
101 "Number of diag_save_in_secondary variables should equal to the number of displacement "
102 "variables ",
103 _ndisp);
104
105 // convert output variable names to lower case
106 for (const auto & out : getParam<MultiMooseEnum>("generate_output"))
107 {
108 std::string lower(out);
109 std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
110 _generate_output.push_back(lower);
111 }
112
113 if (!_generate_output.empty())
115}
116
117void
119{
120 for (unsigned int i = 0; i < _ndisp; ++i)
121 {
122 // Create unique kernel name for each displacement component
123 std::string unique_kernel_name = _czm_kernel_name + "_" + _name + "_" + Moose::stringify(i);
124
126
127 paramsk.set<unsigned int>("component") = i;
128 paramsk.set<NonlinearVariableName>("variable") = _displacements[i];
129 paramsk.set<std::vector<VariableName>>("neighbor_var") = {_displacements[i]};
130 paramsk.set<std::vector<VariableName>>("displacements") = _displacements;
131 paramsk.set<std::vector<BoundaryName>>("boundary") = _boundary;
132 paramsk.set<std::string>("base_name") = _base_name;
134
135 std::string save_in_side;
136 std::vector<AuxVariableName> save_in_var_names;
137 if (_save_in_primary.size() == _ndisp || _save_in_secondary.size() == _ndisp)
138 {
139 prepareSaveInInputs(save_in_var_names, save_in_side, _save_in_primary, _save_in_secondary, i);
140 paramsk.set<std::vector<AuxVariableName>>("save_in") = save_in_var_names;
141 paramsk.set<MultiMooseEnum>("save_in_var_side") = save_in_side;
142 }
144 {
146 save_in_var_names, save_in_side, _diag_save_in_primary, _diag_save_in_secondary, i);
147 paramsk.set<std::vector<AuxVariableName>>("diag_save_in") = save_in_var_names;
148 paramsk.set<MultiMooseEnum>("diag_save_in_var_side") = save_in_side;
149 }
150 _problem->addInterfaceKernel(_czm_kernel_name, unique_kernel_name, paramsk);
151 }
152}
153
154void
156{
157 // Create unique material name for the "CZMComputeDisplacementJump" object
158 std::string unique_material_name = _disp_jump_provider_name + "_" + _name;
160 paramsm.set<std::vector<BoundaryName>>("boundary") = _boundary;
161
162 paramsm.set<std::vector<VariableName>>("displacements") = _displacements;
163 paramsm.set<std::string>("base_name") = _base_name;
165 _problem->addInterfaceMaterial(_disp_jump_provider_name, unique_material_name, paramsm);
166
167 // Create unique material name for the "CZMComputeGlobalTraction" object
168 unique_material_name = _equilibrium_traction_calculator_name + "_" + _name;
170 paramsm.set<std::vector<BoundaryName>>("boundary") = _boundary;
171
172 paramsm.set<std::string>("base_name") = _base_name;
173 _problem->addInterfaceMaterial(
174 _equilibrium_traction_calculator_name, unique_material_name, paramsm);
175}
176
177void
179{
180 // Enforce consistency
181 if (_ndisp != _mesh->dimension())
182 paramError("displacements", "Number of displacements must match problem dimension.");
183
185
186 if (_current_task == "add_interface_kernel")
188 else if (_current_task == "add_master_action_material")
190
191 // optional, add required outputs
193}
194
195void
201
202void
203CohesiveZoneAction::prepareSaveInInputs(std::vector<AuxVariableName> & save_in_names,
204 std::string & save_in_side,
205 const std::vector<AuxVariableName> & var_name_primary,
206 const std::vector<AuxVariableName> & var_name_secondary,
207 const int & i) const
208{
209 save_in_names.clear();
210 save_in_side.clear();
211 if (var_name_primary.size() == _ndisp)
212 {
213 save_in_names.push_back(var_name_primary[i]);
214 save_in_side += "m";
215 if (var_name_secondary.size() == _ndisp)
216 save_in_side += " ";
217 }
218 if (var_name_secondary.size() == _ndisp)
219 {
220 save_in_names.push_back(var_name_secondary[i]);
221 save_in_side += "s";
222 }
223}
224
225void
227{
228 // Ensure material output order and family vectors are same size as generate output
229
230 // check number of supplied orders and families
232 paramError("material_output_order",
233 "The number of orders assigned to material outputs must be: 0 to be assigned "
234 "CONSTANT; 1 to assign all outputs the same value, or the same size as the number "
235 "of generate outputs listed.");
236
237 if (_material_output_family.size() > 1 &&
239 paramError("material_output_family",
240 "The number of families assigned to material outputs must be: 0 to be assigned "
241 "MONOMIAL; 1 to assign all outputs the same value, or the same size as the number "
242 "of generate outputs listed.");
243
244 // if no value was provided, chose the default CONSTANT
245 if (_material_output_order.size() == 0)
247
248 // For only one order, make all orders the same magnitude
249 if (_material_output_order.size() == 1)
251 std::vector<std::string>(_generate_output.size(), _material_output_order[0]);
252
253 if (_verbose)
254 Moose::out << COLOR_CYAN << "*** Automatic applied material output orders ***"
255 << "\n"
256 << _name << ": " << Moose::stringify(_material_output_order) << "\n"
257 << COLOR_DEFAULT;
258
259 // if no value was provided, chose the default MONOMIAL
260 if (_material_output_family.size() == 0)
262
263 // For only one family, make all families that value
264 if (_material_output_family.size() == 1)
266 std::vector<std::string>(_generate_output.size(), _material_output_family[0]);
267
268 if (_verbose)
269 Moose::out << COLOR_CYAN << "*** Automatic applied material output families ***"
270 << "\n"
271 << _name << ": " << Moose::stringify(_material_output_family) << "\n"
272 << COLOR_DEFAULT;
273}
274
275void
277{
278 if (_current_task == "add_material")
280
281 // Add variables (optional)
282 if (_current_task == "add_aux_variable")
283 {
284 unsigned int index = 0;
285 for (auto out : _generate_output)
286 {
287 const auto & order = _material_output_order[index];
288 const auto & family = _material_output_family[index];
289
290 std::string type = (order == "CONSTANT" && family == "MONOMIAL")
291 ? "MooseVariableConstMonomial"
292 : "MooseVariable";
293
294 // Create output helper aux variables
295 auto params = _factory.getValidParams(type);
296 params.set<MooseEnum>("order") = order;
297 params.set<MooseEnum>("family") = family;
298 if (family == "MONOMIAL")
299 _problem->addAuxVariable(type, addBaseName(out), params);
300 else
301 _problem->addVariable(type, addBaseName(out), params);
302
303 index++;
304 }
305 }
306
307 // Add output AuxKernels
308 else if (_current_task == "add_aux_kernel")
309 {
310 const std::string material_output_aux_name = _use_AD ? "ADMaterialRealAux" : "MaterialRealAux";
311 // Loop through output aux variables
312 unsigned int index = 0;
313 for (auto out : _generate_output)
314 {
315 if (_material_output_family[index] == "MONOMIAL")
316 {
317 InputParameters params = _factory.getValidParams(material_output_aux_name);
318 params.set<MaterialPropertyName>("property") = addBaseName(out);
319 params.set<AuxVariableName>("variable") = addBaseName(out);
320 params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
321 params.set<std::vector<BoundaryName>>("boundary") = _boundary;
322 params.set<bool>("check_boundary_restricted") = false;
323 _problem->addAuxKernel(material_output_aux_name, addBaseName(out) + '_' + name(), params);
324 }
325 index++;
326 }
327 }
328}
329
330void
332{
333 if (_current_task == "add_material")
334 {
335 // Add output Materials
336 for (auto out : _generate_output)
337 {
339
340 // RealVectorCartesianComponent
341 if (
342 [&]()
343 {
344 for (const auto & vq : _real_vector_cartesian_component_table)
345 for (unsigned int a = 0; a < 3; ++a)
346 if (vq.first + '_' + _component_table[a] == out)
347 {
348 auto type = _use_AD ? "ADCZMRealVectorCartesianComponent"
349 : "CZMRealVectorCartesianComponent";
350 params = _factory.getValidParams(type);
351 params.set<std::string>("real_vector_value") = vq.second;
352 params.set<unsigned int>("index") = a;
353 params.set<std::vector<BoundaryName>>("boundary") = _boundary;
354 params.set<MaterialPropertyName>("property_name") = addBaseName(out);
355 params.set<std::string>("base_name") = _base_name;
356 _problem->addInterfaceMaterial(type, addBaseName(out) + '_' + name(), params);
357 return true;
358 }
359 return false;
360 }())
361 continue;
362
363 // CZMRealVectorScalar
364 if (setupOutput(out,
366 [&](std::string prop_name, std::string direction)
367 {
368 auto type = _use_AD ? "ADCZMRealVectorScalar" : "CZMRealVectorScalar";
369 params = _factory.getValidParams(type);
370 params.set<std::string>("real_vector_value") = prop_name;
371 params.set<MooseEnum>("direction") = direction;
372 params.set<MaterialPropertyName>("property_name") = addBaseName(out);
373 params.set<std::vector<BoundaryName>>("boundary") = _boundary;
374 params.set<std::string>("base_name") = _base_name;
375 _problem->addInterfaceMaterial(
376 type, addBaseName(out) + '_' + name(), params);
377 }))
378 continue;
379
380 mooseError("CZM Master: unable to add output Material");
381 }
382 }
383}
384
385void
387{
388
389 // Gather info about all other master actions when we add variables
390 if (_current_task == "validate_coordinate_systems")
391 {
392 auto actions = _awh.getActions<CohesiveZoneAction>();
393 for (const auto & action : actions)
394 {
395 const auto size_before = _boundary_name_union.size();
396 const auto added_size = action->_boundary.size();
397 _boundary_name_union.insert(action->_boundary.begin(), action->_boundary.end());
398 const auto size_after = _boundary_name_union.size();
399 if (size_after != size_before + added_size)
400 mooseError("The boundary restrictions in the CohesiveZoneAction actions must be "
401 "non-overlapping.");
402 }
403
404 for (const auto & action : actions)
405 {
406 // check for different strain definitions
407 _strain_formulation_union.insert(action->_strain);
408 const auto size_after = _strain_formulation_union.size();
409
410 if (size_after != 1)
411 mooseError("All blocks of the CohesiveZoneAction should have the same strain formulation");
412 }
413 }
414}
registerMooseAction("SolidMechanicsApp", CohesiveZoneAction, "add_interface_kernel")
InputParameters emptyInputParameters()
const ExecFlagType EXEC_TIMESTEP_END
std::vector< const T * > getActions()
std::shared_ptr< MooseMesh > & _mesh
std::shared_ptr< FEProblemBase > & _problem
const std::string & _current_task
ActionWarehouse & _awh
static const std::vector< char > _component_table
static const std::map< std::string, std::string > _real_vector_cartesian_component_table
table data for output generation
static const std::map< std::string, std::pair< std::string, std::vector< std::string > > > _vector_direction_table
static InputParameters validParams()
const unsigned int _ndisp
number of displacement components
std::vector< AuxVariableName > _diag_save_in_secondary
std::vector< std::string > _generate_output
output materials to generate scalar traction/jump vector quantities
std::vector< AuxVariableName > _save_in_primary
residual debugging
const bool _use_AD
whether to use AD kernels and materials
std::vector< VariableName > _displacements
the disaplcements varaible names
virtual void customizeCZMInterfaceKernelParameters(InputParameters &) const
Allows derived actions to set parameters on each generated interface kernel.
std::vector< AuxVariableName > _diag_save_in_primary
const std::string _base_name
Base name of the material system.
Strain
strain formulation
const bool _verbose
display info
std::string _equilibrium_traction_calculator_name
void prepareSaveInInputs(std::vector< AuxVariableName > &, std::string &, const std::vector< AuxVariableName > &, const std::vector< AuxVariableName > &, const int &) const
method to prepare save_in and diag_save_in inputs for the interface kernel
std::set< BoundaryName > _boundary_name_union
set generated from the combined boundary restrictions of all CohesiveZoneAction action blocks
void addRequiredCZMInterfaceMaterials()
adds the required interface materials based on the selected strain formulation
std::set< Strain > _strain_formulation_union
set generated from the combined boundary restrictions of all CohesiveZoneAction action blocks
std::string addBaseName(const std::string &name) const
simple method for adding the base name to a variable
void chekMultipleActionParameters()
method checking multiple CohesiveZoneAction block inputs
std::vector< AuxVariableName > _save_in_secondary
static InputParameters validParams()
std::string _disp_jump_provider_name
CohesiveZoneAction(const InputParameters &params)
virtual void customizeCZMDisplacementJumpMaterialParameters(InputParameters &) const
Allows derived actions to set parameters on the generated displacement jump material.
bool setupOutput(std::string out, T table, T2 setup)
enum CohesiveZoneAction::Strain _strain
MultiMooseEnum _material_output_order
MultiMooseEnum _material_output_family
void addRequiredCZMInterfaceKernels()
adds the required interfacekernels based on the selected strain formulation
virtual void addRelationshipManagers(Moose::RelationshipManagerType input_rm_type) override
std::string _czm_kernel_name
kernel's and materials's names
void verifyOrderAndFamilyOutputs()
verifies order and family of output variables
const std::vector< BoundaryName > _boundary
Base name of the material system.
InputParameters getValidParams(const std::string &name) const
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
const std::string & type() const
const std::string & name() const
void paramError(const std::string &param, Args... args) const
void mooseError(Args &&... args) const
const std::string & _name
void setAdditionalValue(const std::string &names)
unsigned int size() const
Factory & _factory
std::string stringify(const T &t)
RelationshipManagerType