LCOV - code coverage report
Current view: top level - src/kernels - ADDistributedLoadShell.C (source / functions) Hit Total Coverage
Test: idaholab/moose solid_mechanics: f45d79 Lines: 33 36 91.7 %
Date: 2025-07-25 05:00:39 Functions: 4 8 50.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 "ADDistributedLoadShell.h"
      11             : #include "Assembly.h"
      12             : #include "Function.h"
      13             : #include "MooseError.h"
      14             : #include "FEProblemBase.h"
      15             : #include "MooseMesh.h"
      16             : 
      17             : registerMooseObject("SolidMechanicsApp", ADDistributedLoadShell);
      18             : registerMooseObject("SolidMechanicsApp", ADDistributedLoadShell);
      19             : 
      20             : template <bool is_ad>
      21             : InputParameters
      22          96 : ADDistributedLoadShellTempl<is_ad>::validParams()
      23             : {
      24             :   InputParameters params = GenericKernel<is_ad>::validParams();
      25          96 :   params.addClassDescription(
      26             :       "Applies a distributed load (specified in units of force per area) on the shell plane in a "
      27             :       "given direction (e.g. self_weight, wind load) or normal to the shell plan (e.g. pressure "
      28             :       "loads)");
      29         192 :   params.addRequiredCoupledVar("displacements",
      30             :                                "The string of displacements suitable for the problem statement");
      31         192 :   params.addParam<bool>(
      32         192 :       "project_load_to_normal", false, "Whether to apply the distributed load normal to the shell");
      33         192 :   params.addRequiredParam<FunctionName>(
      34             :       "function",
      35             :       "The function that describes the distributed load specified in units of force per area ");
      36          96 :   return params;
      37           0 : }
      38             : 
      39             : template <bool is_ad>
      40          48 : ADDistributedLoadShellTempl<is_ad>::ADDistributedLoadShellTempl(const InputParameters & parameters)
      41             :   : GenericKernel<is_ad>(parameters),
      42          48 :     _ndisp(this->coupledComponents("displacements")),
      43          48 :     _component(libMesh::invalid_uint),
      44          48 :     _function(&this->getFunction("function")),
      45          48 :     _project_load_to_normal(parameters.isParamSetByUser("project_load_to_normal")
      46         120 :                                 ? this->template getParam<bool>("project_load_to_normal")
      47             :                                 : false),
      48          96 :     _nodes(4)
      49             : {
      50          48 :   if (_ndisp != 3)
      51           0 :     mooseError("ADDistributedLoadShell: parameter 'displacements' needs to have exactly three "
      52             :                "components.");
      53             : 
      54         192 :   for (unsigned int i = 0; i < _ndisp; ++i)
      55             :   {
      56         144 :     _disp_var.push_back(this->coupled("displacements", i));
      57         144 :     if (_var.number() == _disp_var[i])
      58             :     {
      59          48 :       _component = i;
      60             :     }
      61             :   }
      62          48 :   if (_component == libMesh::invalid_uint)
      63           0 :     mooseError("Problem with displacements in " + _name);
      64          84 : }
      65             : 
      66             : template <bool is_ad>
      67             : GenericReal<is_ad>
      68      320128 : ADDistributedLoadShellTempl<is_ad>::computeQpResidual()
      69             : {
      70     1600640 :   for (unsigned int i = 0; i < 4; ++i)
      71     1280512 :     _nodes[i] = _current_elem->node_ptr(i);
      72             : 
      73      320128 :   _v1 = (*_nodes[1] - *_nodes[0]);
      74      320128 :   _v2 = (*_nodes[2] - *_nodes[0]);
      75             : 
      76      320128 :   _normal = _v1.cross(_v2);
      77      320128 :   _normal /= _normal.norm();
      78             : 
      79      320128 :   if (_project_load_to_normal)
      80      291840 :     return computeFactor() * (_normal(_component) * _test[_i][_qp]);
      81             :   else
      82       28288 :     return computeFactor() * (_test[_i][_qp]);
      83             : }
      84             : 
      85             : template <bool is_ad>
      86             : GenericReal<is_ad>
      87      320128 : ADDistributedLoadShellTempl<is_ad>::computeFactor() const
      88             : {
      89      320128 :   return _function->value(_t, _q_point[_qp]);
      90             : }
      91             : 
      92             : template class ADDistributedLoadShellTempl<false>;
      93             : template class ADDistributedLoadShellTempl<true>;

Generated by: LCOV version 1.14