LCOV - code coverage report
Current view: top level - src/physics - QuasiStaticSolidMechanicsPhysicsBase.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: #31405 (292dce) with base fef103 Lines: 98 105 93.3 %
Date: 2025-09-04 07:57:23 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       13124 : QuasiStaticSolidMechanicsPhysicsBase::validParams()
     138             : {
     139       13124 :   InputParameters params = Action::validParams();
     140             : 
     141       26248 :   params.addRequiredParam<std::vector<VariableName>>(
     142             :       "displacements", "The nonlinear displacement variables for the problem");
     143       26248 :   params.addParam<std::vector<VariableName>>("temperature", "The temperature");
     144             : 
     145       26248 :   MooseEnum strainType("SMALL FINITE", "SMALL");
     146       26248 :   params.addParam<MooseEnum>("strain", strainType, "Strain formulation");
     147       26248 :   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       26248 :   params.addParam<std::string>("base_name", "Material property base name");
     152       26248 :   params.addParam<bool>(
     153       26248 :       "volumetric_locking_correction", false, "Flag to correct volumetric locking");
     154       26248 :   params.addParam<bool>(
     155       26248 :       "use_finite_deform_jacobian", false, "Jacobian for corrotational finite strain");
     156       26248 :   params.addParam<bool>("add_variables", false, "Add the displacement variables");
     157       26248 :   params.addParam<std::vector<MaterialPropertyName>>(
     158             :       "eigenstrain_names", {}, "List of eigenstrains to be applied in this strain calculation");
     159       26248 :   params.addParam<bool>("use_automatic_differentiation",
     160       26248 :                         false,
     161             :                         "Flag to use automatic differentiation (AD) objects when possible");
     162             :   // Global Strain
     163       26248 :   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       26248 :   params.addParam<std::vector<AuxVariableName>>("save_in", {}, "The displacement residuals");
     171       26248 :   params.addParam<std::vector<AuxVariableName>>(
     172             :       "diag_save_in", {}, "The displacement diagonal preconditioner terms");
     173       26248 :   params.addParam<MooseEnum>("decomposition_method",
     174       26248 :                              ComputeFiniteStrain::decompositionType(),
     175             :                              "Methods to calculate the finite strain and rotation increments");
     176       26248 :   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       26248 :                                   "NONE");
     181       26248 :   params.addParam<MooseEnum>(
     182             :       "planar_formulation", planarFormulationType, "Out-of-plane stress/strain formulation");
     183       26248 :   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       26248 :   params.addParam<VariableName>("out_of_plane_strain",
     188             :                                 "Variable for the out-of-plane strain for plane stress models");
     189       26248 :   MooseEnum outOfPlaneDirection("x y z", "z");
     190       26248 :   params.addParam<MooseEnum>(
     191             :       "out_of_plane_direction", outOfPlaneDirection, "The direction of the out-of-plane strain.");
     192       26248 :   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       26248 :   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       26248 :   params.addParam<Real>(
     202             :       "pressure_factor",
     203             :       "Scale factor applied to prescribed out-of-plane pressure (both material and function)");
     204       26248 :   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       26248 :   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       26248 :   params.addParam<MultiMooseEnum>("generate_output",
     215       26248 :                                   QuasiStaticSolidMechanicsPhysicsBase::outputPropertiesType(),
     216             :                                   "Add scalar quantity output for stress and/or strain");
     217             : 
     218       26248 :   params.addParam<MultiMooseEnum>(
     219             :       "material_output_order",
     220       26248 :       QuasiStaticSolidMechanicsPhysicsBase::materialOutputOrders(),
     221             :       "Specifies the order of the FE shape function to use for this variable.");
     222             : 
     223       26248 :   params.addParam<MultiMooseEnum>(
     224             :       "material_output_family",
     225       26248 :       QuasiStaticSolidMechanicsPhysicsBase::materialOutputFamilies(),
     226             :       "Specifies the family of FE shape functions to use for this variable.");
     227       26248 :   params.addParamNamesToGroup("generate_output material_output_order material_output_family",
     228             :                               "Output");
     229       26248 :   params.addParam<bool>("verbose", false, "Display extra information.");
     230             : 
     231       26248 :   params.addParam<bool>("new_system",
     232       26248 :                         false,
     233             :                         "If true use the new "
     234             :                         "LagrangianStressDiverence kernels.");
     235             : 
     236       26248 :   MooseEnum formulationType("TOTAL UPDATED", "TOTAL");
     237       26248 :   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       26248 :   params.addParamNamesToGroup("add_variables displacements temperature", "Variables");
     244       26248 :   params.addParamNamesToGroup("strain incremental use_finite_deform_jacobian eigenstrain_names",
     245             :                               "Strain");
     246             : 
     247       13124 :   return params;
     248       13124 : }
     249             : 
     250        7669 : QuasiStaticSolidMechanicsPhysicsBase::QuasiStaticSolidMechanicsPhysicsBase(
     251        7669 :     const InputParameters & parameters)
     252       15338 :   : Action(parameters), _use_ad(getParam<bool>("use_automatic_differentiation"))
     253             : {
     254        7669 :   const auto & params = _app.getInputParameterWarehouse().getInputParameters();
     255        7669 :   InputParameters & pars(*(params.find(uniqueActionName())->second.get()));
     256             : 
     257             :   // check if a container block with common parameters is found
     258        7669 :   auto action = _awh.getActions<CommonSolidMechanicsAction>();
     259        7669 :   if (action.size() == 1)
     260        5567 :     pars.applyParameters(action[0]->parameters());
     261             : 
     262             :   // append additional_generate_output
     263       15338 :   if (isParamValid("additional_generate_output"))
     264             :   {
     265          54 :     MultiMooseEnum generate_output = getParam<MultiMooseEnum>("generate_output");
     266             :     MultiMooseEnum additional_generate_output =
     267          54 :         getParam<MultiMooseEnum>("additional_generate_output");
     268             : 
     269          54 :     MultiMooseEnum material_output_order = getParam<MultiMooseEnum>("material_output_order");
     270             :     MultiMooseEnum additional_material_output_order =
     271          54 :         getParam<MultiMooseEnum>("additional_material_output_order");
     272             : 
     273          54 :     MultiMooseEnum material_output_family = getParam<MultiMooseEnum>("material_output_family");
     274             :     MultiMooseEnum additional_material_output_family =
     275          81 :         getParam<MultiMooseEnum>("additional_material_output_family");
     276             : 
     277          54 :     for (auto & output : additional_generate_output)
     278          54 :       generate_output.setAdditionalValue(output);
     279          27 :     for (auto & order : additional_material_output_order)
     280           0 :       material_output_order.setAdditionalValue(order);
     281          27 :     for (auto & family : additional_material_output_family)
     282           0 :       material_output_family.setAdditionalValue(family);
     283             : 
     284          27 :     pars.set<MultiMooseEnum>("generate_output") = generate_output;
     285          27 :     pars.set<MultiMooseEnum>("material_output_order") = material_output_order;
     286          27 :     pars.set<MultiMooseEnum>("material_output_family") = material_output_family;
     287          27 :   }
     288        7669 : }
     289             : 
     290             : MultiMooseEnum
     291       20793 : QuasiStaticSolidMechanicsPhysicsBase::materialOutputOrders()
     292             : {
     293       20793 :   auto orders = AddAuxVariableAction::getAuxVariableOrders().getRawNames();
     294             : 
     295       41586 :   return MultiMooseEnum(orders);
     296             : }
     297             : 
     298             : MultiMooseEnum
     299       20793 : QuasiStaticSolidMechanicsPhysicsBase::materialOutputFamilies()
     300             : {
     301       41586 :   return MultiMooseEnum("MONOMIAL LAGRANGE");
     302             : }
     303             : 
     304             : MultiMooseEnum
     305       20793 : QuasiStaticSolidMechanicsPhysicsBase::outputPropertiesType()
     306             : {
     307       20793 :   std::string options = "";
     308      270309 :   for (auto & r2tc : _rank_two_cartesian_component_table)
     309      998064 :     for (unsigned int a = 0; a < 3; ++a)
     310     2994192 :       for (unsigned int b = 0; b < 3; ++b)
     311     6716139 :         options += (options == "" ? "" : " ") + r2tc.first + '_' + _component_table[a] +
     312     2245644 :                    _component_table[b];
     313             : 
     314      311895 :   for (auto & r2i : _rank_two_invariant_table)
     315     1850577 :     for (auto & t : r2i.second.second)
     316     4678425 :       options += " " + r2i.first + "_" + t;
     317             : 
     318       41586 :   for (auto & r2sdc : _rank_two_directional_component_table)
     319       62379 :     for (auto & r : r2sdc.second.second)
     320      124758 :       options += " " + r2sdc.first + "_" + r;
     321             : 
     322       83172 :   for (auto & r2cc : _rank_two_cylindrical_component_table)
     323      311895 :     for (auto & r : r2cc.second.second)
     324      748548 :       options += " " + r2cc.first + "_" + r;
     325             : 
     326       62379 :   for (auto & r2sc : _rank_two_spherical_component_table)
     327      187137 :     for (auto & r : r2sc.second.second)
     328      436653 :       options += " " + r2sc.first + "_" + r;
     329             : 
     330       41586 :   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