LCOV - code coverage report
Current view: top level - src/actions - GlobalStrainAction.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 94 97 96.9 %
Date: 2025-07-25 05:00:39 Functions: 3 3 100.0 %
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 "GlobalStrainAction.h"
      11             : 
      12             : #include "Conversion.h"
      13             : #include "FEProblem.h"
      14             : #include "MooseMesh.h"
      15             : #include "NonlinearSystemBase.h"
      16             : 
      17             : #include "libmesh/string_to_enum.h"
      18             : 
      19             : registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_user_object");
      20             : 
      21             : registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_scalar_kernel");
      22             : 
      23             : registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_material");
      24             : 
      25             : registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_aux_variable");
      26             : 
      27             : registerMooseAction("SolidMechanicsApp", GlobalStrainAction, "add_aux_kernel");
      28             : 
      29             : InputParameters
      30           6 : GlobalStrainAction::validParams()
      31             : {
      32           6 :   InputParameters params = Action::validParams();
      33           6 :   params.addClassDescription("Set up the GlobalStrainAction environment");
      34          12 :   params.addRequiredParam<VariableName>("scalar_global_strain",
      35             :                                         "Scalar variable for global strain");
      36          12 :   params.addParam<std::vector<VariableName>>("displacements", {}, "The displacement variables");
      37          12 :   params.addParam<std::vector<AuxVariableName>>(
      38             :       "auxiliary_displacements",
      39             :       "The auxliary displacement variables to be calculated from scalar variables");
      40          12 :   params.addParam<std::vector<AuxVariableName>>(
      41             :       "global_displacements",
      42             :       "The global displacement variables to be calculated from scalar variables");
      43          12 :   params.addParam<std::vector<Real>>("applied_stress_tensor",
      44             :                                      "Vector of values defining the constant applied stress "
      45             :                                      "to add, in order 11, 22, 33, 23, 13, 12");
      46          12 :   params.addParam<std::string>("base_name", "Material property base name");
      47          12 :   params.addParam<std::vector<SubdomainName>>(
      48             :       "block", {}, "The block id where this variable lives");
      49             : 
      50           6 :   return params;
      51           0 : }
      52             : 
      53           6 : GlobalStrainAction::GlobalStrainAction(const InputParameters & params)
      54             :   : Action(params),
      55           6 :     _disp(getParam<std::vector<VariableName>>("displacements")),
      56          12 :     _aux_disp(getParam<std::vector<AuxVariableName>>("auxiliary_displacements")),
      57          12 :     _global_disp(getParam<std::vector<AuxVariableName>>("global_displacements")),
      58          18 :     _block_names(getParam<std::vector<SubdomainName>>("block")),
      59           6 :     _block_ids()
      60             : {
      61           6 :   if (_aux_disp.size() != _disp.size())
      62           0 :     mooseError("Number of auxiliary displacement variables should be equal to the number of "
      63             :                "nonlinear displacement variables, i.e., ",
      64           0 :                _disp.size());
      65           6 : }
      66             : 
      67             : void
      68          30 : GlobalStrainAction::act()
      69             : {
      70             :   // get subdomain IDs
      71          60 :   for (auto & name : _block_names)
      72          30 :     _block_ids.insert(_problem->mesh().getSubdomainID(name));
      73             : 
      74             :   // user object name
      75          30 :   const std::string uo_name = _name + "_GlobalStrainUserObject";
      76             : 
      77             :   //
      78             :   // Add user object
      79             :   //
      80          30 :   if (_current_task == "add_user_object")
      81             :   {
      82           6 :     std::string uo_type = "GlobalStrainUserObject";
      83           6 :     InputParameters params = _factory.getValidParams(uo_type);
      84           6 :     params.applyParameters(parameters());
      85           6 :     params.set<bool>("use_displaced_mesh") = false;
      86          30 :     params.set<ExecFlagEnum>("execute_on") = {EXEC_INITIAL, EXEC_LINEAR, EXEC_NONLINEAR};
      87             : 
      88           6 :     _problem->addUserObject(uo_type, uo_name, params);
      89           6 :   }
      90             : 
      91             :   //
      92             :   // Add scalar kernel
      93             :   //
      94          24 :   else if (_current_task == "add_scalar_kernel")
      95             :   {
      96           6 :     std::string sk_type = "GlobalStrain";
      97           6 :     InputParameters params = _factory.getValidParams(sk_type);
      98           6 :     params.applyParameters(parameters());
      99           6 :     params.set<bool>("use_displaced_mesh") = false;
     100          24 :     params.set<NonlinearVariableName>("variable") = getParam<VariableName>("scalar_global_strain");
     101          12 :     params.set<UserObjectName>("global_strain_uo") = uo_name;
     102             : 
     103           6 :     _problem->addScalarKernel(sk_type, _name + "_GlobalStrain", params);
     104           6 :   }
     105             : 
     106             :   //
     107             :   // Add ComputeGlobalStrain material
     108             :   //
     109          18 :   else if (_current_task == "add_material")
     110             :   {
     111           6 :     std::string mat_type = "ComputeGlobalStrain";
     112           6 :     InputParameters params = _factory.getValidParams(mat_type);
     113          12 :     params.applyParameters(parameters(), {"scalar_global_strain"});
     114           6 :     params.set<bool>("use_displaced_mesh") = false;
     115          12 :     params.set<std::vector<VariableName>>("scalar_global_strain") = {
     116          24 :         getParam<VariableName>("scalar_global_strain")};
     117          12 :     params.set<UserObjectName>("global_strain_uo") = uo_name;
     118             : 
     119           6 :     _problem->addMaterial(mat_type, _name + "_global_strain", params);
     120           6 :   }
     121             : 
     122             :   //
     123             :   // Add auxiliary displacement variables
     124             :   //
     125          12 :   else if (_current_task == "add_aux_variable")
     126             :   {
     127           6 :     auto params = _factory.getValidParams("MooseVariable");
     128             :     // determine necessary order
     129           6 :     const bool second = _problem->mesh().hasSecondOrderElements();
     130             : 
     131          18 :     params.set<MooseEnum>("order") = second ? "SECOND" : "FIRST";
     132          12 :     params.set<MooseEnum>("family") = "LAGRANGE";
     133             : 
     134          24 :     for (unsigned int i = 0; i < _aux_disp.size(); ++i)
     135             :     {
     136          18 :       std::string aux_var_name = _aux_disp[i];
     137             : 
     138          36 :       _problem->addAuxVariable("MooseVariable", aux_var_name, params);
     139             :     }
     140             : 
     141          24 :     for (unsigned int i = 0; i < _global_disp.size(); ++i)
     142             :     {
     143          18 :       std::string aux_var_name = _global_disp[i];
     144             : 
     145          36 :       _problem->addAuxVariable("MooseVariable", aux_var_name, params);
     146             :     }
     147           6 :   }
     148             : 
     149             :   //
     150             :   // Add aux kernels for computing global displacements
     151             :   //
     152           6 :   else if (_current_task == "add_aux_kernel")
     153             :   {
     154          24 :     for (unsigned int i = 0; i < _aux_disp.size(); ++i)
     155             :     {
     156          18 :       std::string aux_var_name = _aux_disp[i];
     157             : 
     158          18 :       std::string aux_type = "GlobalDisplacementAux";
     159          18 :       InputParameters params = _factory.getValidParams(aux_type);
     160          36 :       params.applyParameters(parameters(), {"scalar_global_strain"});
     161          36 :       params.set<AuxVariableName>("variable") = aux_var_name;
     162          18 :       params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
     163          18 :       params.set<bool>("use_displaced_mesh") = false;
     164          18 :       params.set<bool>("output_global_displacement") = false;
     165          36 :       params.set<std::vector<VariableName>>("scalar_global_strain") = {
     166          72 :           getParam<VariableName>("scalar_global_strain")};
     167          36 :       params.set<UserObjectName>("global_strain_uo") = uo_name;
     168          18 :       params.set<unsigned int>("component") = i;
     169             : 
     170          18 :       _problem->addAuxKernel(aux_type, aux_var_name + '_' + name(), params);
     171          18 :     }
     172             : 
     173          24 :     for (unsigned int i = 0; i < _global_disp.size(); ++i)
     174             :     {
     175          18 :       std::string aux_var_name = _global_disp[i];
     176             : 
     177          18 :       std::string aux_type = "GlobalDisplacementAux";
     178          18 :       InputParameters params = _factory.getValidParams(aux_type);
     179          36 :       params.applyParameters(parameters(), {"scalar_global_strain"});
     180          36 :       params.set<AuxVariableName>("variable") = aux_var_name;
     181          18 :       params.set<ExecFlagEnum>("execute_on") = EXEC_TIMESTEP_END;
     182          18 :       params.set<bool>("use_displaced_mesh") = false;
     183          18 :       params.set<bool>("output_global_displacement") = true;
     184          36 :       params.set<std::vector<VariableName>>("scalar_global_strain") = {
     185          72 :           getParam<VariableName>("scalar_global_strain")};
     186          36 :       params.set<UserObjectName>("global_strain_uo") = uo_name;
     187          18 :       params.set<unsigned int>("component") = i;
     188             : 
     189          18 :       _problem->addAuxKernel(aux_type, aux_var_name + '_' + name(), params);
     190          18 :     }
     191             :   }
     192         204 : }

Generated by: LCOV version 1.14