LCOV - code coverage report
Current view: top level - src/materials - ComputeFPIsolatorElasticity.C (source / functions) Hit Total Coverage
Test: idaholab/mastodon: 55510a Lines: 234 239 97.9 %
Date: 2025-08-26 23:09:31 Functions: 8 8 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // MASTODON includes
       2             : #include "ComputeFPIsolatorElasticity.h"
       3             : 
       4             : // MOOSE includes
       5             : #include "MooseMesh.h"
       6             : #include "Assembly.h"
       7             : #include "NonlinearSystem.h"
       8             : #include "MooseVariable.h"
       9             : #include "MathUtils.h"
      10             : 
      11             : // libmesh includes
      12             : #include "libmesh/quadrature.h"
      13             : #include "libmesh/utility.h"
      14             : 
      15             : registerMooseObject("MastodonApp", ComputeFPIsolatorElasticity);
      16             : 
      17             : InputParameters
      18          96 : ComputeFPIsolatorElasticity::validParams()
      19             : {
      20          96 :   InputParameters params = Material::validParams();
      21          96 :   params.addClassDescription("Compute the forces and the stiffness matrix for a single concave "
      22             :                              "Friction Pendulum isolator element.");
      23             :   // Switches
      24         192 :   params.addRequiredParam<bool>(
      25             :       "pressure_dependent",
      26             :       "Switch for modeling friction dependence on the instantaneous pressure.");
      27         192 :   params.addRequiredParam<bool>(
      28             :       "temperature_dependent",
      29             :       "Switch for modeling friction dependence on the instantaneous temperature.");
      30         192 :   params.addRequiredParam<bool>(
      31             :       "velocity_dependent",
      32             :       "Switch for modeling friction dependence on the instantaneous sliding velocity.");
      33             :   // Material properties
      34         192 :   params.addRequiredRangeCheckedParam<Real>(
      35             :       "mu_ref", "mu_ref>0.0", "Reference co-efficient of friction.");
      36         192 :   params.addRequiredRangeCheckedParam<Real>("p_ref", "p_ref>0.0", "Reference axial pressure.");
      37         192 :   params.addRequiredRangeCheckedParam<Real>(
      38             :       "diffusivity", "diffusivity>0.0", "Thermal diffusivity of steel.");
      39         192 :   params.addRequiredRangeCheckedParam<Real>(
      40             :       "conductivity", "conductivity>0.0", "Thermal conductivity of steel.");
      41         192 :   params.addRequiredRangeCheckedParam<Real>("a", "a>0.0", "Rate parameter.");
      42         192 :   params.addRequiredRangeCheckedParam<Real>(
      43             :       "r_eff", "r_eff>0.0", "Effective radius of curvature of sliding surface.");
      44         192 :   params.addRequiredRangeCheckedParam<Real>(
      45             :       "r_contact", "r_contact>0.0", "Radius of contact area at sliding surface.");
      46         192 :   params.addRequiredRangeCheckedParam<Real>(
      47             :       "uy", "uy>0.0", "Yield displacement of the bearing in shear.");
      48         192 :   params.addRequiredRangeCheckedParam<Real>(
      49             :       "gamma", "gamma>0.0", "Gamma parameter of Newmark algorithm.");
      50         192 :   params.addRequiredRangeCheckedParam<Real>(
      51             :       "beta", "beta>0.0", "Beta parameter of Newmark algorithm.");
      52         192 :   params.addRequiredRangeCheckedParam<unsigned int>(
      53             :       "unit",
      54             :       "8 > unit > 0",
      55             :       "Tag for conversion in the pressure factor computation "
      56             :       "when different unit systems are used. Enter "
      57             :       "1 for N m s C;  "
      58             :       "2 for kN m s C;  "
      59             :       "3 for N mm s C;  "
      60             :       "4 for kN mm s C;  "
      61             :       "5 for lb in s C;  "
      62             :       "6 for kip in s C;  "
      63             :       "7 for lb ft s C;  "
      64             :       "8 for kip ft s C. ");
      65         192 :   params.addParam<Real>(
      66             :       "k_x",
      67         192 :       10e13,
      68             :       "Stiffness of the bearing in translation along x axis. Defaults to 10e13 (SI units)");
      69         192 :   params.addParam<Real>(
      70             :       "k_xx",
      71         192 :       10e13,
      72             :       "Stiffness of the bearing in rotation about x axis. Defaults to 10e13 (SI units) ");
      73         192 :   params.addParam<Real>(
      74             :       "k_yy",
      75         192 :       10e13,
      76             :       "Stiffness of the bearing in rotation about y axis. Defaults to 10e13 (SI units) ");
      77         192 :   params.addParam<Real>(
      78             :       "k_zz",
      79         192 :       10e13,
      80             :       "Stiffness of the bearing in rotation about z axis. Defaults to 10e13 (SI units) ");
      81         192 :   params.addParam<Real>(
      82         192 :       "tol", 1e-8, "Convergence tolerance to satisfy equilibrium of element. Defaults to 1e-8");
      83         192 :   params.addParam<Real>(
      84         192 :       "maxiter", 100, "Maximum number of iterations for equilibrium. Defaults to 100.");
      85         192 :   params.set<MooseEnum>("constant_on") = "ELEMENT";
      86          96 :   return params;
      87           0 : }
      88             : 
      89          72 : ComputeFPIsolatorElasticity::ComputeFPIsolatorElasticity(const InputParameters & parameters)
      90             :   : Material(parameters),
      91          72 :     _pressure_dependent(getParam<bool>("pressure_dependent")),
      92         144 :     _temperature_dependent(getParam<bool>("temperature_dependent")),
      93         144 :     _velocity_dependent(getParam<bool>("velocity_dependent")),
      94         144 :     _mu_ref(getParam<Real>("mu_ref")),
      95         144 :     _p_ref(getParam<Real>("p_ref")),
      96         144 :     _diffusivity(getParam<Real>("diffusivity")),
      97         144 :     _conductivity(getParam<Real>("conductivity")),
      98         144 :     _a(getParam<Real>("a")),
      99         144 :     _r_eff(getParam<Real>("r_eff")),
     100         144 :     _r_contact(getParam<Real>("r_contact")),
     101         144 :     _uy(getParam<Real>("uy")),
     102         144 :     _unit(getParam<unsigned int>("unit")),
     103         144 :     _gamma(getParam<Real>("gamma")),
     104         144 :     _beta(getParam<Real>("beta")),
     105         144 :     _k_x(getParam<Real>("k_x")),
     106         144 :     _k_xx(getParam<Real>("k_xx")),
     107         144 :     _k_yy(getParam<Real>("k_yy")),
     108         144 :     _k_zz(getParam<Real>("k_zz")),
     109         144 :     _tol(getParam<Real>("tol")),
     110         144 :     _maxiter(getParam<Real>("maxiter")),
     111          72 :     _sD(0.5),
     112         144 :     _local_def(getMaterialPropertyByName<ColumnMajorMatrix>("local_deformations")),
     113         144 :     _basic_def(getMaterialPropertyByName<ColumnMajorMatrix>("deformations")),
     114         144 :     _basic_def_old(getMaterialPropertyByName<ColumnMajorMatrix>("old_deformations")),
     115         144 :     _basic_vel(getMaterialPropertyByName<ColumnMajorMatrix>("deformation_rates")),
     116         144 :     _basic_vel_old(getMaterialPropertyByName<ColumnMajorMatrix>("old_deformation_rates")),
     117          72 :     _Fb(declareProperty<ColumnMajorMatrix>("basic_forces")),
     118          72 :     _Fl(declareProperty<ColumnMajorMatrix>("local_forces")),
     119          72 :     _Fg(declareProperty<ColumnMajorMatrix>("global_forces")),
     120          72 :     _Kb(declareProperty<ColumnMajorMatrix>("basic_stiffness_matrix")),
     121          72 :     _Kl(declareProperty<ColumnMajorMatrix>("local_stiffness_matrix")),
     122          72 :     _Kg(declareProperty<ColumnMajorMatrix>("global_stiffness_matrix")),
     123         144 :     _total_gl(getMaterialPropertyByName<ColumnMajorMatrix>("total_global_to_local_transformation")),
     124         144 :     _total_lb(getMaterialPropertyByName<ColumnMajorMatrix>("total_local_to_basic_transformation")),
     125         144 :     _length(getMaterialPropertyByName<Real>("initial_isolator_length")),
     126          72 :     _pi(libMesh::pi),
     127          72 :     _ubPlastic(declareProperty<RealVectorValue>("plastic displacements in basic system")),
     128         216 :     _ubPlastic_old(getMaterialPropertyOld<RealVectorValue>("plastic displacements in basic system"))
     129             : 
     130             : {
     131             :   // Calculation of lateral stiffness of elastic component
     132          72 :   _mass_slider = _p_ref * _pi * _r_contact * _r_contact / 9.81; // Mass of the slider
     133          72 :   _k0 = _mass_slider * 9.81 * _mu_ref / _uy; // Initial elastic stiffness in lateral direction
     134             : 
     135             :   // Other parameters
     136          72 :   _kpF = 1;
     137          72 :   _ktF = 1;
     138          72 :   _kvF = 1;
     139          72 :   _temperature_center = 0;
     140          72 :   _heatflux_center = 0;
     141          72 :   _mu_adj = _mu_ref;
     142          72 :   _disp_currentstep = 0;
     143          72 :   _vel_currentstep = 0;
     144          72 :   _vec_time.push_back(0);
     145          72 :   _vec_heatflux.push_back(0);
     146          72 : }
     147             : 
     148             : void
     149          40 : ComputeFPIsolatorElasticity::initQpStatefulProperties()
     150             : {
     151          40 :   _ubPlastic[_qp].zero();
     152          40 : }
     153             : 
     154             : void
     155       12316 : ComputeFPIsolatorElasticity::computeQpProperties()
     156             : {
     157       12316 :   initializeFPIsolator();
     158             : 
     159             :   // Computing shear forces and stiffness terms
     160       12316 :   computeShear();
     161             : 
     162             :   // Compute forces in other directions
     163       12316 :   _Fb[_qp](0, 0) = _Kb[_qp](0, 0) * _basic_def[_qp](0, 0); // translation in basic x direction
     164       12316 :   _Fb[_qp](3, 0) = _Kb[_qp](3, 3) * _basic_def[_qp](3, 0); // rotation along basic x direction
     165       12316 :   _Fb[_qp](4, 0) = _Kb[_qp](4, 4) * _basic_def[_qp](4, 0); // rotation along basic y direction
     166       12316 :   _Fb[_qp](5, 0) = _Kb[_qp](5, 5) * _basic_def[_qp](5, 0); // rotation along basic z direction
     167             : 
     168             :   // Finalize forces and stiffness matrix and convert them into global co-ordinate system
     169       12316 :   finalize();
     170       12316 : }
     171             : 
     172             : void
     173       12316 : ComputeFPIsolatorElasticity::initializeFPIsolator()
     174             : {
     175             :   // Initialize stiffness matrices
     176       12316 :   _Kb[_qp].reshape(6, 6);
     177       12316 :   _Kb[_qp].identity();
     178       12316 :   _Kb[_qp](0, 0) = _k_x;  // axial stiffness along x axis
     179       12316 :   _Kb[_qp](1, 1) = _k0;   // elastic lateral stiffness along y axis
     180       12316 :   _Kb[_qp](2, 2) = _k0;   // elastic lateral stiffness along z axis
     181       12316 :   _Kb[_qp](3, 3) = _k_xx; // torsional stiffness about x axis
     182       12316 :   _Kb[_qp](4, 4) = _k_yy; // rotational stiffness about y axis
     183       12316 :   _Kb[_qp](5, 5) = _k_zz; // rotational stiffness about z axis
     184             : 
     185             :   // Initialize forces
     186       12316 :   _Fb[_qp].reshape(6, 1); // forces in the basic system
     187       12316 :   _Fb[_qp].zero();
     188       12316 :   _Fl[_qp].reshape(12, 1); // forces in local system (6+6 = 12dofs)
     189       12316 :   _Fl[_qp].zero();
     190       12316 :   _Fg[_qp] = _Fl[_qp]; // forces in global system
     191             : 
     192       12316 :   _Fb[_qp] = _Kb[_qp] * _basic_def[_qp];
     193       12316 : }
     194             : 
     195             : void
     196       12316 : ComputeFPIsolatorElasticity::computeShear()
     197             : {
     198       12316 :   if (_t != _vec_time[_vec_time.size() - 1])
     199             :   {
     200             :     // Update last element of time vector with current analysis time
     201        4300 :     _vec_time.push_back(_t);
     202        4300 :     _vec_heatflux.push_back(0);
     203             :   }
     204             : 
     205             :   // Compute resultant displacement in horizontal direction
     206       12316 :   Real resultantU = sqrt(_basic_def[_qp](1, 0) * _basic_def[_qp](1, 0) +
     207       12316 :                          _basic_def[_qp](2, 0) * _basic_def[_qp](2, 0));
     208             : 
     209             :   // Calculate radii in basic y- and z- direction
     210       12316 :   Real r_y = sqrt(pow(_r_eff, 2) - pow(_basic_def[_qp](1, 0), 2));
     211       12316 :   Real r_z = sqrt(pow(_r_eff, 2) - pow(_basic_def[_qp](2, 0), 2));
     212             : 
     213             :   // Calculate velocities based on current deformations according to Newmark formulation
     214       12316 :   Real vel1 = _basic_vel_old[_qp](1, 0) +
     215       12316 :               (_gamma / _beta) * (((_basic_def[_qp](1, 0) - _basic_def_old[_qp](1, 0)) / _dt) -
     216       12316 :                                   (_basic_vel_old[_qp](1, 0)));
     217       12316 :   Real vel2 = _basic_vel_old[_qp](2, 0) +
     218       12316 :               (_gamma / _beta) * (((_basic_def[_qp](2, 0) - _basic_def_old[_qp](2, 0)) / _dt) -
     219       12316 :                                   (_basic_vel_old[_qp](2, 0)));
     220             : 
     221             :   // Calculate absolute velocity
     222             :   Real velAbs =
     223       12316 :       sqrt(pow(vel1 / r_y * _basic_def[_qp](1, 0) + vel2 / r_z * _basic_def[_qp](2, 0), 2) +
     224             :            pow(vel1, 2) + pow(vel2, 2));
     225             : 
     226             :   // Check for uplift
     227             :   bool is_uplift = 0;
     228             :   Real kFactUplift = 1.0E-6;
     229       12316 :   if (_Fb[_qp](0, 0) >= 0.0)
     230             :   {
     231          30 :     _Fb[_qp](0, 0) = -0.0001 * _Fb[_qp](0, 0);
     232             :     is_uplift = 1;
     233             :   }
     234             : 
     235             :   // Unit conversion for pressure to be used in the pressure factor computation
     236             :   Real p_Unit_Convert; // To convert to MPa
     237       12316 :   if (_unit == 1)
     238             :   {
     239             :     p_Unit_Convert = 0.000001;
     240             :   }
     241       12316 :   if (_unit == 2)
     242             :   {
     243             :     p_Unit_Convert = 0.001;
     244             :   }
     245       12316 :   if (_unit == 3)
     246             :   {
     247             :     p_Unit_Convert = 1.0;
     248             :   }
     249       12316 :   if (_unit == 4)
     250             :   {
     251             :     p_Unit_Convert = 1000.0;
     252             :   }
     253       12316 :   if (_unit == 5)
     254             :   {
     255             :     p_Unit_Convert = 0.006894;
     256             :   }
     257       12316 :   if (_unit == 6)
     258             :   {
     259             :     p_Unit_Convert = 6.894;
     260             :   }
     261       12316 :   if (_unit == 7)
     262             :   {
     263             :     p_Unit_Convert = 0.00004788;
     264             :   }
     265       12316 :   if (_unit == 8)
     266             :   {
     267             :     p_Unit_Convert = 0.04788;
     268             :   }
     269             : 
     270             :   // Calculate normal force
     271       24632 :   Real N = -_Fb[_qp](0, 0);
     272             : 
     273             :   // Calculate instantaneous pressure
     274       12316 :   Real Inst_Pressure = fabs(N) / (_pi * _r_contact * _r_contact);
     275             : 
     276             :   // Calculate displacement increment in the current step
     277       12316 :   _disp_currentstep = sqrt(pow((_basic_def[_qp](1, 0) - _basic_def_old[_qp](1, 0)), 2) +
     278       12316 :                            pow((_basic_def[_qp](2, 0) - _basic_def_old[_qp](2, 0)), 2));
     279             : 
     280             :   // Calculate sliding velocity
     281       12316 :   _vel_currentstep = _disp_currentstep / _dt;
     282             : 
     283       12316 :   if (velAbs > 0.0)
     284        5340 :     _vel_currentstep = velAbs;
     285             : 
     286             :   // Calculate pressure factor
     287       12316 :   if (_pressure_dependent)
     288        6716 :     _kpF = pow(0.7, ((Inst_Pressure - _p_ref) * p_Unit_Convert / 50.0));
     289             : 
     290             :   // Calculate temperature factor
     291       12316 :   if (_temperature_dependent)
     292             :   {
     293             :     // Calculate flux
     294        6716 :     if (resultantU < (_r_contact * sqrt(_pi / 4)))
     295        6716 :       _vec_heatflux[_t_step] =
     296        6716 :           _mu_adj * (fabs(N) / (_pi * _r_contact * _r_contact)) * _vel_currentstep;
     297             : 
     298             :     else
     299           0 :       _vec_heatflux[_t_step] = 0.0;
     300             : 
     301        6716 :     _heatflux_center = _vec_heatflux[_t_step];
     302             : 
     303             :     // Temperature at the sliding surface
     304             :     Real temperature_change = 0.0;
     305             : 
     306             :     // Evaluate the temperature integral
     307        6716 :     if (_t_step >= 1 && resultantU > 0.0)
     308             :     {
     309             :       Real dt_analysis = 0.000001;
     310             :       Real tau = 0.000001;
     311             : 
     312      913546 :       for (int jTemp = 1; jTemp <= _t_step; jTemp++)
     313             :       {
     314      910616 :         dt_analysis = _dt;
     315      910616 :         tau = _vec_time[jTemp];
     316             : 
     317      910616 :         temperature_change =
     318             :             temperature_change +
     319      910616 :             sqrt(_diffusivity / _pi) * _vec_heatflux[_t_step - jTemp] * dt_analysis /
     320      910616 :                 (_conductivity * sqrt(tau)); // Solving the integral for temperature increment
     321             :       }
     322             : 
     323        2930 :       _temperature_center =
     324        2930 :           20.0 + temperature_change; // Temperature at the center of the sliding surface
     325             : 
     326        2930 :       _ktF =
     327        2930 :           0.789 * (pow(0.7, (_temperature_center / 50.0)) + 0.4); // Update the temperature factor
     328             :     }
     329             :   }
     330             : 
     331             :   // Calculate velocity factor
     332       12316 :   if (_velocity_dependent)
     333        6716 :     _kvF = 1 - 0.5 * exp(-_a * _vel_currentstep);
     334             : 
     335             :   // Calculate adjusted co-efficient of friction
     336       12316 :   _mu_adj = _mu_ref * _kpF * _ktF * _kvF;
     337             : 
     338             :   // Calculate shear forces and stiffness in basic y- and z-direction
     339       12316 :   unsigned int iter = 0;
     340             :   _qbOld.zero();
     341             : 
     342             :   do
     343             :   {
     344             :     // Save shear forces of last iteration
     345       17342 :     _qbOld(0) = _Fb[_qp](1, 0);
     346       17342 :     _qbOld(1) = _Fb[_qp](2, 0);
     347             : 
     348             :     // Yield force
     349       17342 :     Real qYield = _mu_adj * N;
     350             : 
     351             :     // Calculate stiffness of elastic components
     352       17342 :     Real k2y = N / r_y;
     353       17342 :     Real k2z = N / r_z;
     354             : 
     355             :     // Calculate initial stiffness of hysteretic components
     356       17342 :     Real k0y = _k0 - k2y;
     357       17342 :     Real k0z = _k0 - k2z;
     358             : 
     359             :     // Account for uplift
     360             :     kFactUplift = 1.0E-6;
     361       17342 :     if (is_uplift)
     362             :     {
     363          30 :       k0y = kFactUplift * k0y;
     364          30 :       k0z = kFactUplift * k0z;
     365             :     }
     366             : 
     367             :     // Trial shear forces of hysteretic component
     368             :     _qTrial.zero();
     369       17342 :     _qTrial(0) = k0y * (_basic_def[_qp](1, 0) - _ubPlastic_old[_qp](0));
     370       17342 :     _qTrial(1) = k0z * (_basic_def[_qp](2, 0) - _ubPlastic_old[_qp](1));
     371             : 
     372             :     // Compute yield criterion of hysteretic component
     373       17342 :     Real qTrialNorm = _qTrial.norm();
     374       17342 :     Real Y = qTrialNorm - qYield;
     375             : 
     376             :     // Elastic step -> no updates required
     377       17342 :     if (Y <= 0.0)
     378             :     {
     379             :       // Set shear forces
     380        9558 :       _Fb[_qp](1, 0) = _qTrial(0) - N * _local_def[_qp](5, 0) + k2y * _basic_def[_qp](1, 0);
     381        9558 :       _Fb[_qp](2, 0) = _qTrial(1) + N * _local_def[_qp](4, 0) + k2z * _basic_def[_qp](2, 0);
     382             : 
     383             :       // Set tangent stiffnesses
     384        9558 :       _Kb[_qp](1, 1) = _Kb[_qp](2, 2) = _k0;
     385        9558 :       _Kb[_qp](1, 2) = _Kb[_qp](2, 1) = 0.0;
     386             : 
     387             :       // Account for uplift
     388        9558 :       if (is_uplift)
     389             :       {
     390          30 :         _Kb[_qp](1, 1) = kFactUplift * _k0;
     391          30 :         _Kb[_qp](2, 2) = kFactUplift * _k0;
     392             :       }
     393             : 
     394        9558 :       _ubPlastic[_qp](0) = _ubPlastic_old[_qp](0);
     395        9558 :       _ubPlastic[_qp](1) = _ubPlastic_old[_qp](1);
     396             :     }
     397             : 
     398             :     // Plastic step -> return mapping
     399             :     else
     400             :     {
     401             :       // Compute consistency parameters
     402        7784 :       Real dGammaY = Y / k0y;
     403        7784 :       Real dGammaZ = Y / k0z;
     404             : 
     405             :       // Update plastic displacements
     406        7784 :       _ubPlastic[_qp](0) = _ubPlastic_old[_qp](0) + dGammaY * _qTrial(0) / qTrialNorm;
     407        7784 :       _ubPlastic[_qp](1) = _ubPlastic_old[_qp](1) + dGammaZ * _qTrial(1) / qTrialNorm;
     408             : 
     409             :       // Set shear forces
     410        7784 :       _Fb[_qp](1, 0) = qYield * _qTrial(0) / qTrialNorm - N * _local_def[_qp](5, 0) +
     411        7784 :                        k2y * _basic_def[_qp](1, 0);
     412        7784 :       _Fb[_qp](2, 0) = qYield * _qTrial(1) / qTrialNorm + N * _local_def[_qp](4, 0) +
     413        7784 :                        k2z * _basic_def[_qp](2, 0);
     414             : 
     415             :       // Account for uplift
     416        7784 :       Real k0Plastic = _k0;
     417             : 
     418        7784 :       if (is_uplift)
     419           0 :         k0Plastic = kFactUplift * _k0;
     420             : 
     421             :       // Set tangent stiffness
     422             :       Real D = pow(qTrialNorm, 3);
     423             : 
     424        7784 :       _Kb[_qp](1, 1) = k0Plastic * (1.0 - (qYield * _qTrial(1) * _qTrial(1) / D)) + k2y;
     425        7784 :       _Kb[_qp](1, 2) = -qYield * k0Plastic * _qTrial(0) * _qTrial(1) / D;
     426        7784 :       _Kb[_qp](2, 1) = _Kb[_qp](1, 2);
     427        7784 :       _Kb[_qp](2, 2) = k0Plastic * (1.0 - (qYield * _qTrial(0) * _qTrial(0) / D)) + k2z;
     428             :     }
     429             : 
     430       17342 :     iter++;
     431             : 
     432       34684 :   } while (sqrt(pow(_Fb[_qp](1, 0) - _qbOld(0), 2) + pow(_Fb[_qp](2, 0) - _qbOld(1), 2) >= _tol) &&
     433        5026 :            (iter <= _maxiter));
     434             : 
     435             :   // Issue warning if iteration did not converge
     436       12316 :   if (iter >= _maxiter)
     437             :   {
     438           0 :     mooseError("Error: ComputeFPIsolatorElasticity::computeshearforce() - did not find the shear "
     439             :                "force after ",
     440             :                iter,
     441             :                " iterations and norm: ",
     442           0 :                sqrt(pow(_Fb[_qp](1, 0) - _qbOld(0), 2) + pow(_Fb[_qp](2, 0) - _qbOld(1), 2)),
     443             :                ".\n");
     444             :   }
     445       12316 : }
     446             : 
     447             : void
     448       12316 : ComputeFPIsolatorElasticity::addPDeltaEffects()
     449             : {
     450             :   // Add P-Delta moment stiffness terms
     451       12316 :   Real Ls = (1 - _sD) * _length[_qp];
     452             : 
     453       12316 :   _Kl[_qp](5, 1) -= _Fb[_qp](0, 0);
     454       12316 :   _Kl[_qp](5, 7) += _Fb[_qp](0, 0);
     455       12316 :   _Kl[_qp](5, 11) -= _Fb[_qp](0, 0) * Ls;
     456       12316 :   _Kl[_qp](11, 11) -= _Fb[_qp](0, 0) * Ls;
     457       12316 :   _Kl[_qp](4, 2) += _Fb[_qp](0, 0);
     458       12316 :   _Kl[_qp](4, 8) -= _Fb[_qp](0, 0);
     459       12316 :   _Kl[_qp](4, 10) -= _Fb[_qp](0, 0) * Ls;
     460       12316 :   _Kl[_qp](10, 10) -= _Fb[_qp](0, 0) * Ls;
     461             : 
     462             :   // Add V-Delta torsion stiffness terms
     463       12316 :   _Kl[_qp](3, 1) += _Fb[_qp](2, 0);
     464       12316 :   _Kl[_qp](3, 2) -= _Fb[_qp](1, 0);
     465       12316 :   _Kl[_qp](3, 7) -= _Fb[_qp](2, 0);
     466       12316 :   _Kl[_qp](3, 8) += _Fb[_qp](1, 0);
     467       12316 :   _Kl[_qp](3, 10) += _Fb[_qp](1, 0) * Ls;
     468       12316 :   _Kl[_qp](3, 11) += _Fb[_qp](2, 0) * Ls;
     469       12316 :   _Kl[_qp](9, 10) -= _Fb[_qp](1, 0) * Ls;
     470       12316 :   _Kl[_qp](9, 11) -= _Fb[_qp](2, 0) * Ls;
     471       12316 : }
     472             : 
     473             : void
     474       12316 : ComputeFPIsolatorElasticity::finalize()
     475             : {
     476             :   // Convert forces from basic to local to global coordinate system
     477       12316 :   _Fl[_qp] = _total_lb[_qp].transpose() * _Fb[_qp]; // local forces
     478       12316 :   _Fg[_qp] = _total_gl[_qp].transpose() * _Fl[_qp]; // global forces
     479             : 
     480             :   // Convert stiffness matrix from basic to local coordinate system
     481       12316 :   _Kl[_qp] = _total_lb[_qp].transpose() * _Kb[_qp] * _total_lb[_qp];
     482             : 
     483             :   // add P-∆ and V-∆ effects to local stiffness matrix
     484       12316 :   addPDeltaEffects();
     485             : 
     486             :   // Converting stiffness matrix from local to global coordinate system
     487       12316 :   _Kg[_qp] = _total_gl[_qp].transpose() * _Kl[_qp] * _total_gl[_qp];
     488       12316 : }

Generated by: LCOV version 1.14