LCOV - code coverage report
Current view: top level - src/materials - ComputeReducedOrderEigenstrain.C (source / functions) Hit Total Coverage
Test: idaholab/moose tensor_mechanics: d6b47a Lines: 72 73 98.6 %
Date: 2024-02-27 11:53:14 Functions: 7 7 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://www.mooseframework.org
       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 "ComputeReducedOrderEigenstrain.h"
      11             : 
      12             : #include "MooseMesh.h"
      13             : #include "libmesh/quadrature.h"
      14             : 
      15             : registerMooseObject("TensorMechanicsApp", ComputeReducedOrderEigenstrain);
      16             : 
      17             : InputParameters
      18          48 : ComputeReducedOrderEigenstrain::validParams()
      19             : {
      20          48 :   InputParameters params = ComputeEigenstrainBase::validParams();
      21          48 :   params.addClassDescription("accepts eigenstrains and computes a reduced order eigenstrain for "
      22             :                              "consistency in the order of strain and eigenstrains.");
      23          96 :   params.addRequiredParam<std::vector<MaterialPropertyName>>(
      24             :       "input_eigenstrain_names", "List of eigenstrains to be applied in this strain calculation");
      25          48 :   return params;
      26           0 : }
      27             : 
      28          36 : ComputeReducedOrderEigenstrain::ComputeReducedOrderEigenstrain(const InputParameters & parameters)
      29             :   : ComputeEigenstrainBase(parameters),
      30          36 :     _input_eigenstrain_names(
      31             :         getParam<std::vector<MaterialPropertyName>>("input_eigenstrain_names")),
      32          36 :     _eigenstrains(_input_eigenstrain_names.size()),
      33          36 :     _subproblem(*parameters.get<SubProblem *>("_subproblem")),
      34          36 :     _ncols(1 + _subproblem.mesh().dimension()),
      35          36 :     _second_order(_subproblem.mesh().hasSecondOrderElements()),
      36             :     _eigsum(),
      37          36 :     _A(),
      38          36 :     _b(6),
      39          36 :     _AT(),
      40          36 :     _ATb(_ncols),
      41          36 :     _x(6, DenseVector<Real>(_ncols)),
      42          36 :     _vals(6),
      43          72 :     _adjusted_eigenstrain()
      44             : {
      45          72 :   for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
      46             :   {
      47          36 :     _input_eigenstrain_names[i] = _base_name + _input_eigenstrain_names[i];
      48          36 :     _eigenstrains[i] = &getMaterialProperty<RankTwoTensor>(_input_eigenstrain_names[i]);
      49             :   }
      50          36 : }
      51             : 
      52             : void
      53         288 : ComputeReducedOrderEigenstrain::initQpStatefulProperties()
      54             : {
      55         288 :   _eigenstrain[_qp].zero();
      56         288 : }
      57             : 
      58             : void
      59         952 : ComputeReducedOrderEigenstrain::computeProperties()
      60             : {
      61         952 :   sumEigenstrain();
      62             : 
      63         952 :   prepareEigenstrain();
      64             : 
      65         952 :   Material::computeProperties();
      66         952 : }
      67             : 
      68             : void
      69        8568 : ComputeReducedOrderEigenstrain::computeQpEigenstrain()
      70             : {
      71        8568 :   if (_second_order)
      72             :   {
      73        7056 :     for (unsigned i = 0; i < 6; ++i)
      74             :     {
      75        6048 :       _vals[i] = _x[i](0);
      76       18144 :       for (unsigned j = 1; j < _ncols; ++j)
      77       12096 :         _vals[i] += _x[i](j) * _q_point[_qp](j - 1);
      78             :     }
      79        1008 :     _adjusted_eigenstrain.fillFromInputVector(_vals);
      80             :   }
      81        8568 :   _eigenstrain[_qp] = _adjusted_eigenstrain;
      82        8568 : }
      83             : 
      84             : void
      85         952 : ComputeReducedOrderEigenstrain::sumEigenstrain()
      86             : {
      87         952 :   _eigsum.resize(_qrule->n_points());
      88        9520 :   for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
      89             :   {
      90        8568 :     _eigsum[_qp].zero();
      91       17136 :     for (auto es : _eigenstrains)
      92        8568 :       _eigsum[_qp] += (*es)[_qp];
      93             :   }
      94         952 : }
      95             : 
      96             : void
      97         952 : ComputeReducedOrderEigenstrain::prepareEigenstrain()
      98             : {
      99             :   // The eigenstrains can either be constant in an element or linear in x, y, z
     100             :   // If constant, do volume averaging.
     101         952 :   if (!_second_order || _qrule->n_points() == 1)
     102             :   {
     103             :     // Volume average
     104             :     _adjusted_eigenstrain.zero();
     105         840 :     Real vol = 0.0;
     106        8400 :     for (unsigned qp = 0; qp < _qrule->n_points(); ++qp)
     107             :     {
     108        7560 :       _adjusted_eigenstrain += _eigsum[qp] * _JxW[qp] * _coord[qp];
     109        7560 :       vol += _JxW[qp] * _coord[qp];
     110             :     }
     111         840 :     _adjusted_eigenstrain /= vol;
     112             :   }
     113             :   else
     114             :   {
     115             :     // 1 x y z
     116             : 
     117             :     // Six sets (one for each unique component of eigen) of qp data
     118         112 :     _A.resize(_qrule->n_points(), _ncols);
     119         784 :     for (auto && b : _b)
     120         672 :       b.resize(_qrule->n_points());
     121             : 
     122        1120 :     for (unsigned qp = 0; qp < _qrule->n_points(); ++qp)
     123             :     {
     124        1008 :       _A(qp, 0) = 1.0;
     125        3024 :       for (unsigned j = 1; j < _ncols; ++j)
     126        2016 :         _A(qp, j) = _q_point[qp](j - 1);
     127             : 
     128        1008 :       _b[0](qp) = _eigsum[qp](0, 0);
     129        1008 :       _b[1](qp) = _eigsum[qp](1, 1);
     130        1008 :       _b[2](qp) = _eigsum[qp](2, 2);
     131        1008 :       _b[3](qp) = _eigsum[qp](1, 2);
     132        1008 :       _b[4](qp) = _eigsum[qp](0, 2);
     133        1008 :       _b[5](qp) = _eigsum[qp](0, 1);
     134             :     }
     135             : 
     136         112 :     _A.get_transpose(_AT);
     137         112 :     _A.left_multiply(_AT);
     138         784 :     for (unsigned i = 0; i < 6; ++i)
     139             :     {
     140         672 :       _AT.vector_mult(_ATb, _b[i]);
     141             : 
     142         672 :       _A.cholesky_solve(_ATb, _x[i]);
     143             :     }
     144             :   }
     145         952 : }

Generated by: LCOV version 1.14