LCOV - code coverage report
Current view: top level - src/physics - QuasiStaticSolidMechanicsPhysicsBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 98 105 93.3 %
Date: 2025-07-25 05:00:39 Functions: 5 6 83.3 %
Legend: Lines: hit not hit

          Line data    Source code
       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 "QuasiStaticSolidMechanicsPhysicsBase.h"
      11             : #include "CommonSolidMechanicsAction.h"
      12             : #include "ActionWarehouse.h"
      13             : #include "AddAuxVariableAction.h"
      14             : #include "ComputeFiniteStrain.h"
      15             : #include "MooseApp.h"
      16             : #include "InputParameterWarehouse.h"
      17             : 
      18             : // map tensor name shortcuts to tensor material property names
      19             : std::map<std::string, std::string>
      20             :     QuasiStaticSolidMechanicsPhysicsBase::_rank_two_cartesian_component_table = {
      21             :         {"strain", "total_strain"},
      22             :         {"mechanical_strain", "mechanical_strain"},
      23             :         {"stress", "stress"},
      24             :         {"cauchy_stress", "cauchy_stress"},
      25             :         {"deformation_gradient", "deformation_gradient"},
      26             :         {"pk1_stress", "pk1_stress"},
      27             :         {"pk2_stress", "pk2_stress"},
      28             :         {"small_stress", "small_stress"},
      29             :         {"elastic_strain", "elastic_strain"},
      30             :         {"plastic_strain", "plastic_strain"},
      31             :         {"creep_strain", "creep_strain"},
      32             :         {"creep_stress", "creep_stress"}};
      33             : const std::vector<char> QuasiStaticSolidMechanicsPhysicsBase::_component_table = {'x', 'y', 'z'};
      34             : 
      35             : // map aux variable name prefixes to RankTwoInvariant option and list of permitted tensor name
      36             : // shortcuts
      37             : const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
      38             :     QuasiStaticSolidMechanicsPhysicsBase::_rank_two_invariant_table = {
      39             :         {"vonmises", {"VonMisesStress", {"stress", "cauchy_stress", "pk1_stress", "pk2_stress"}}},
      40             :         {"effective", {"EffectiveStrain", {"plastic_strain", "creep_strain"}}},
      41             :         {"hydrostatic",
      42             :          {"Hydrostatic", {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress"}}},
      43             :         {"l2norm",
      44             :          {"L2norm",
      45             :           {"mechanical_strain",
      46             :            "stress",
      47             :            "cauchy_stress",
      48             :            "pk1_stress",
      49             :            "strain",
      50             :            "elastic_strain",
      51             :            "plastic_strain",
      52             :            "creep_strain"}}},
      53             :         {"volumetric", {"VolumetricStrain", {"mechanical_strain", "strain"}}},
      54             :         {"firstinv",
      55             :          {"FirstInvariant",
      56             :           {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress", "strain"}}},
      57             :         {"secondinv",
      58             :          {"SecondInvariant",
      59             :           {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress", "strain"}}},
      60             :         {"thirdinv",
      61             :          {"ThirdInvariant",
      62             :           {"stress", "cauchy_stress", "pk1_stress", "pk2_stress", "small_stress", "strain"}}},
      63             :         {"triaxiality",
      64             :          {"TriaxialityStress",
      65             :           {
      66             :               "stress",
      67             :               "cauchy_stress",
      68             :               "pk1_stress",
      69             :               "pk2_stress",
      70             :               "small_stress",
      71             :           }}},
      72             :         {"maxshear",
      73             :          {"MaxShear",
      74             :           {
      75             :               "stress",
      76             :               "cauchy_stress",
      77             :               "pk1_stress",
      78             :               "pk2_stress",
      79             :               "small_stress",
      80             :           }}},
      81             :         {"intensity",
      82             :          {"StressIntensity",
      83             :           {
      84             :               "stress",
      85             :               "cauchy_stress",
      86             :               "pk1_stress",
      87             :               "pk2_stress",
      88             :               "small_stress",
      89             :           }}},
      90             :         {"max_principal",
      91             :          {"MaxPrincipal",
      92             :           {"mechanical_strain",
      93             :            "stress",
      94             :            "cauchy_stress",
      95             :            "pk1_stress",
      96             :            "pk2_stress",
      97             :            "small_stress",
      98             :            "strain"}}},
      99             :         {"mid_principal",
     100             :          {"MidPrincipal",
     101             :           {"mechanical_strain",
     102             :            "stress",
     103             :            "cauchy_stress",
     104             :            "pk1_stress",
     105             :            "pk2_stress",
     106             :            "small_stress",
     107             :            "strain"}}},
     108             :         {"min_principal",
     109             :          {"MinPrincipal",
     110             :           {"mechanical_strain",
     111             :            "stress",
     112             :            "cauchy_stress",
     113             :            "pk1_stress",
     114             :            "pk2_stress",
     115             :            "small_stress",
     116             :            "strain"}}}};
     117             : 
     118             : const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
     119             :     QuasiStaticSolidMechanicsPhysicsBase::_rank_two_directional_component_table = {
     120             :         {"directional", {"Direction", {"stress", "strain"}}}};
     121             : 
     122             : const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
     123             :     QuasiStaticSolidMechanicsPhysicsBase::_rank_two_cylindrical_component_table = {
     124             :         {"axial",
     125             :          {"AxialStress", {"stress", "strain", "plastic_strain", "creep_strain", "elastic_strain"}}},
     126             :         {"hoop",
     127             :          {"HoopStress", {"stress", "strain", "plastic_strain", "creep_strain", "elastic_strain"}}},
     128             :         {"radial", {"RadialStress", {"stress", "strain"}}}};
     129             : 
     130             : const std::map<std::string, std::pair<std::string, std::vector<std::string>>>
     131             :     QuasiStaticSolidMechanicsPhysicsBase::_rank_two_spherical_component_table = {
     132             :         {"spherical_hoop",
     133             :          {"HoopStress", {"stress", "strain", "plastic_strain", "creep_strain", "elastic_strain"}}},
     134             :         {"spherical_radial", {"RadialStress", {"stress", "strain"}}}};
     135             : 
     136             : InputParameters
     137       11568 : QuasiStaticSolidMechanicsPhysicsBase::validParams()
     138             : {
     139       11568 :   InputParameters params = Action::validParams();
     140             : 
     141       23136 :   params.addRequiredParam<std::vector<VariableName>>(
     142             :       "displacements", "The nonlinear displacement variables for the problem");
     143       23136 :   params.addParam<std::vector<VariableName>>("temperature", "The temperature");
     144             : 
     145       23136 :   MooseEnum strainType("SMALL FINITE", "SMALL");
     146       23136 :   params.addParam<MooseEnum>("strain", strainType, "Strain formulation");
     147       23136 :   params.addParam<bool>("incremental",
     148             :                         "Use incremental or total strain (if not explicitly specified this "
     149             :                         "defaults to incremental for finite strain and total for small strain)");
     150             : 
     151       23136 :   params.addParam<std::string>("base_name", "Material property base name");
     152       23136 :   params.addParam<bool>(
     153       23136 :       "volumetric_locking_correction", false, "Flag to correct volumetric locking");
     154       23136 :   params.addParam<bool>(
     155       23136 :       "use_finite_deform_jacobian", false, "Jacobian for corrotational finite strain");
     156       23136 :   params.addParam<bool>("add_variables", false, "Add the displacement variables");
     157       23136 :   params.addParam<std::vector<MaterialPropertyName>>(
     158             :       "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation");
     159       23136 :   params.addParam<bool>("use_automatic_differentiation",
     160       23136 :                         false,
     161             :                         "Flag to use automatic differentiation (AD) objects when possible");
     162             :   // Global Strain
     163       23136 :   params.addParam<MaterialPropertyName>(
     164             :       "global_strain",
     165             :       "Name of the global strain material to be applied in this strain calculation. "
     166             :       "The global strain tensor is constant over the whole domain and allows visualization "
     167             :       "of the deformed shape with the periodic BC");
     168             : 
     169             :   // Advanced
     170       23136 :   params.addParam<std::vector<AuxVariableName>>("save_in", {}, "The displacement residuals");
     171       23136 :   params.addParam<std::vector<AuxVariableName>>(
     172             :       "diag_save_in", {}, "The displacement diagonal preconditioner terms");
     173       23136 :   params.addParam<MooseEnum>("decomposition_method",
     174       23136 :                              ComputeFiniteStrain::decompositionType(),
     175             :                              "Methods to calculate the finite strain and rotation increments");
     176       23136 :   params.addParamNamesToGroup("save_in diag_save_in", "Advanced");
     177             : 
     178             :   // Planar Formulation
     179             :   MooseEnum planarFormulationType("NONE WEAK_PLANE_STRESS PLANE_STRAIN GENERALIZED_PLANE_STRAIN",
     180       23136 :                                   "NONE");
     181       23136 :   params.addParam<MooseEnum>(
     182             :       "planar_formulation", planarFormulationType, "Out-of-plane stress/strain formulation");
     183       23136 :   params.addParam<VariableName>("scalar_out_of_plane_strain",
     184             :                                 "Scalar variable for the out-of-plane strain (in y "
     185             :                                 "direction for 1D Axisymmetric or in z direction for 2D "
     186             :                                 "Cartesian problems)");
     187       23136 :   params.addParam<VariableName>("out_of_plane_strain",
     188             :                                 "Variable for the out-of-plane strain for plane stress models");
     189       23136 :   MooseEnum outOfPlaneDirection("x y z", "z");
     190       23136 :   params.addParam<MooseEnum>(
     191             :       "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
     192       23136 :   params.addDeprecatedParam<FunctionName>(
     193             :       "out_of_plane_pressure",
     194             :       "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction "
     195             :       "(y for 1D Axisymmetric or z for 2D Cartesian problems)",
     196             :       "This has been replaced by 'out_of_plane_pressure_function'");
     197       23136 :   params.addParam<FunctionName>(
     198             :       "out_of_plane_pressure_function",
     199             :       "Function used to prescribe pressure (applied toward the body) in the out-of-plane direction "
     200             :       "(y for 1D Axisymmetric or z for 2D Cartesian problems)");
     201       23136 :   params.addParam<Real>(
     202             :       "pressure_factor",
     203             :       "Scale factor applied to prescribed out-of-plane pressure (both material and function)");
     204       23136 :   params.addParam<MaterialPropertyName>("out_of_plane_pressure_material",
     205             :                                         "0",
     206             :                                         "Material used to prescribe pressure (applied toward the "
     207             :                                         "body) in the out-of-plane direction");
     208       23136 :   params.addParamNamesToGroup("planar_formulation scalar_out_of_plane_strain out_of_plane_pressure "
     209             :                               "out_of_plane_pressure_material out_of_plane_pressure_function "
     210             :                               "pressure_factor out_of_plane_direction out_of_plane_strain",
     211             :                               "Out-of-plane stress/strain");
     212             : 
     213             :   // Output
     214       23136 :   params.addParam<MultiMooseEnum>("generate_output",
     215       23136 :                                   QuasiStaticSolidMechanicsPhysicsBase::outputPropertiesType(),
     216             :                                   "Add scalar quantity output for stress and/or strain");
     217             : 
     218       23136 :   params.addParam<MultiMooseEnum>(
     219             :       "material_output_order",
     220       23136 :       QuasiStaticSolidMechanicsPhysicsBase::materialOutputOrders(),
     221             :       "Specifies the order of the FE shape function to use for this variable.");
     222             : 
     223       23136 :   params.addParam<MultiMooseEnum>(
     224             :       "material_output_family",
     225       23136 :       QuasiStaticSolidMechanicsPhysicsBase::materialOutputFamilies(),
     226             :       "Specifies the family of FE shape functions to use for this variable.");
     227       23136 :   params.addParamNamesToGroup("generate_output material_output_order material_output_family",
     228             :                               "Output");
     229       23136 :   params.addParam<bool>("verbose", false, "Display extra information.");
     230             : 
     231       23136 :   params.addParam<bool>("new_system",
     232       23136 :                         false,
     233             :                         "If true use the new "
     234             :                         "LagrangianStressDiverence kernels.");
     235             : 
     236       23136 :   MooseEnum formulationType("TOTAL UPDATED", "TOTAL");
     237       23136 :   params.addParam<MooseEnum>("formulation",
     238             :                              formulationType,
     239             :                              "Select between the total Lagrangian (TOTAL) "
     240             :                              "and updated Lagrangian (UPDATED) formulations "
     241             :                              "for the new kernel system.");
     242             : 
     243       23136 :   params.addParamNamesToGroup("add_variables displacements temperature", "Variables");
     244       23136 :   params.addParamNamesToGroup("strain incremental use_finite_deform_jacobian eigenstrain_names",
     245             :                               "Strain");
     246             : 
     247       11568 :   return params;
     248       11568 : }
     249             : 
     250        6766 : QuasiStaticSolidMechanicsPhysicsBase::QuasiStaticSolidMechanicsPhysicsBase(
     251        6766 :     const InputParameters & parameters)
     252       13532 :   : Action(parameters), _use_ad(getParam<bool>("use_automatic_differentiation"))
     253             : {
     254        6766 :   const auto & params = _app.getInputParameterWarehouse().getInputParameters();
     255        6766 :   InputParameters & pars(*(params.find(uniqueActionName())->second.get()));
     256             : 
     257             :   // check if a container block with common parameters is found
     258        6766 :   auto action = _awh.getActions<CommonSolidMechanicsAction>();
     259        6766 :   if (action.size() == 1)
     260        4904 :     pars.applyParameters(action[0]->parameters());
     261             : 
     262             :   // append additional_generate_output
     263       13532 :   if (isParamValid("additional_generate_output"))
     264             :   {
     265          48 :     MultiMooseEnum generate_output = getParam<MultiMooseEnum>("generate_output");
     266             :     MultiMooseEnum additional_generate_output =
     267          48 :         getParam<MultiMooseEnum>("additional_generate_output");
     268             : 
     269          48 :     MultiMooseEnum material_output_order = getParam<MultiMooseEnum>("material_output_order");
     270             :     MultiMooseEnum additional_material_output_order =
     271          48 :         getParam<MultiMooseEnum>("additional_material_output_order");
     272             : 
     273          48 :     MultiMooseEnum material_output_family = getParam<MultiMooseEnum>("material_output_family");
     274             :     MultiMooseEnum additional_material_output_family =
     275          72 :         getParam<MultiMooseEnum>("additional_material_output_family");
     276             : 
     277          48 :     for (auto & output : additional_generate_output)
     278          48 :       generate_output.setAdditionalValue(output);
     279          24 :     for (auto & order : additional_material_output_order)
     280           0 :       material_output_order.setAdditionalValue(order);
     281          24 :     for (auto & family : additional_material_output_family)
     282           0 :       material_output_family.setAdditionalValue(family);
     283             : 
     284          24 :     pars.set<MultiMooseEnum>("generate_output") = generate_output;
     285          24 :     pars.set<MultiMooseEnum>("material_output_order") = material_output_order;
     286          24 :     pars.set<MultiMooseEnum>("material_output_family") = material_output_family;
     287          24 :   }
     288        6766 : }
     289             : 
     290             : MultiMooseEnum
     291       18334 : QuasiStaticSolidMechanicsPhysicsBase::materialOutputOrders()
     292             : {
     293       18334 :   auto orders = AddAuxVariableAction::getAuxVariableOrders().getRawNames();
     294             : 
     295       36668 :   return MultiMooseEnum(orders);
     296             : }
     297             : 
     298             : MultiMooseEnum
     299       18334 : QuasiStaticSolidMechanicsPhysicsBase::materialOutputFamilies()
     300             : {
     301       36668 :   return MultiMooseEnum("MONOMIAL LAGRANGE");
     302             : }
     303             : 
     304             : MultiMooseEnum
     305       18334 : QuasiStaticSolidMechanicsPhysicsBase::outputPropertiesType()
     306             : {
     307       18334 :   std::string options = "";
     308      238342 :   for (auto & r2tc : _rank_two_cartesian_component_table)
     309      880032 :     for (unsigned int a = 0; a < 3; ++a)
     310     2640096 :       for (unsigned int b = 0; b < 3; ++b)
     311     5921882 :         options += (options == "" ? "" : " ") + r2tc.first + '_' + _component_table[a] +
     312     1980072 :                    _component_table[b];
     313             : 
     314      275010 :   for (auto & r2i : _rank_two_invariant_table)
     315     1631726 :     for (auto & t : r2i.second.second)
     316     4125150 :       options += " " + r2i.first + "_" + t;
     317             : 
     318       36668 :   for (auto & r2sdc : _rank_two_directional_component_table)
     319       55002 :     for (auto & r : r2sdc.second.second)
     320      110004 :       options += " " + r2sdc.first + "_" + r;
     321             : 
     322       73336 :   for (auto & r2cc : _rank_two_cylindrical_component_table)
     323      275010 :     for (auto & r : r2cc.second.second)
     324      660024 :       options += " " + r2cc.first + "_" + r;
     325             : 
     326       55002 :   for (auto & r2sc : _rank_two_spherical_component_table)
     327      165006 :     for (auto & r : r2sc.second.second)
     328      385014 :       options += " " + r2sc.first + "_" + r;
     329             : 
     330       36668 :   return MultiMooseEnum(options, "", true);
     331             : }
     332             : 
     333             : void
     334           0 : QuasiStaticSolidMechanicsPhysicsBase::addCartesianComponentOutput(const std::string & enum_name,
     335             :                                                                   const std::string & prop_name)
     336             : {
     337           0 :   if (prop_name.empty())
     338             :     // the enum name is the actual tensor material property name
     339           0 :     _rank_two_cartesian_component_table.emplace(enum_name, enum_name);
     340             :   else
     341             :     // supply a different name for the enum options (this is done for
     342             :     // 'strain' -> 'mechanical_strain' in the TMA)
     343           0 :     _rank_two_cartesian_component_table.emplace(enum_name, prop_name);
     344           0 : }

Generated by: LCOV version 1.14