LCOV - code coverage report
Current view: top level - src/utils - RaccoonUtils.C (source / functions) Hit Total Coverage
Test: coverage.info Lines: 29 30 96.7 %
Date: 2025-11-27 01:11:00 Functions: 5 5 100.0 %

          Line data    Source code
       1             : //* This file is part of the RACCOON application
       2             : //* being developed at Dolbow lab at Duke University
       3             : //* http://dolbow.pratt.duke.edu
       4             : 
       5             : #include "RaccoonUtils.h"
       6             : #include "ADReal.h"
       7             : #include "MooseUtils.h"
       8             : #include "RankTwoTensorImplementation.h"
       9             : 
      10             : namespace RaccoonUtils
      11             : {
      12             : 
      13             : ADReal
      14     7766504 : Macaulay(const ADReal x, const bool deriv)
      15             : {
      16             :   using std::abs;
      17     7766504 :   if (deriv)
      18           0 :     return x > 0 ? 1 : 0;
      19    23299512 :   return 0.5 * (x + abs(x));
      20             : }
      21             : 
      22             : std::vector<ADReal>
      23     1828660 : Macaulay(const std::vector<ADReal> & v, const bool deriv)
      24             : {
      25     1828660 :   std::vector<ADReal> m = v;
      26     7314640 :   for (auto & x : m)
      27     5485980 :     x = Macaulay(x, deriv);
      28     1828660 :   return m;
      29             : }
      30             : 
      31             : ADRankTwoTensor
      32     1828660 : spectralDecomposition(const ADRankTwoTensor & r2t)
      33             : {
      34     1828660 :   ADRankTwoTensor eigvecs;
      35     1828660 :   std::vector<ADReal> eigvals(LIBMESH_DIM);
      36     1828660 :   r2t.symmetricEigenvaluesEigenvectors(eigvals, eigvecs);
      37             : 
      38     1828660 :   ADRankTwoTensor eigvals_pos;
      39     1828660 :   eigvals_pos.fillFromInputVector(Macaulay(eigvals));
      40     1828660 :   return eigvecs * eigvals_pos * eigvecs.transpose();
      41             : }
      42             : 
      43             : ADRankTwoTensor
      44      520072 : log(const ADRankTwoTensor & r2t)
      45             : {
      46             :   using std::log;
      47             :   std::vector<ADReal> d;
      48      520072 :   ADRankTwoTensor V, D;
      49      520072 :   r2t.symmetricEigenvaluesEigenvectors(d, V);
      50     2080288 :   for (auto & di : d)
      51     1560216 :     di = log(di);
      52      520072 :   D.fillFromInputVector(d);
      53      520072 :   return V * D * V.transpose();
      54             : }
      55             : 
      56             : ADRankTwoTensor
      57      235576 : exp(const ADRankTwoTensor & r2t)
      58             : {
      59             :   using std::exp;
      60             :   std::vector<ADReal> d;
      61      235576 :   ADRankTwoTensor V, D;
      62      235576 :   r2t.symmetricEigenvaluesEigenvectors(d, V);
      63      942304 :   for (auto & di : d)
      64      706728 :     di = exp(di);
      65      235576 :   D.fillFromInputVector(d);
      66      235576 :   return V * D * V.transpose();
      67             : }
      68             : 
      69             : } // end namespace MooseUtils

Generated by: LCOV version 1.16