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: 2026-03-04 01:53:39 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     6718400 : Macaulay(const ADReal x, const bool deriv)
      15             : {
      16             :   using std::abs;
      17     6718400 :   if (deriv)
      18           0 :     return x > 0 ? 1 : 0;
      19    20155200 :   return 0.5 * (x + abs(x));
      20             : }
      21             : 
      22             : std::vector<ADReal>
      23     1582772 : Macaulay(const std::vector<ADReal> & v, const bool deriv)
      24             : {
      25     1582772 :   std::vector<ADReal> m = v;
      26     6331088 :   for (auto & x : m)
      27     4748316 :     x = Macaulay(x, deriv);
      28     1582772 :   return m;
      29             : }
      30             : 
      31             : ADRankTwoTensor
      32     1582772 : spectralDecomposition(const ADRankTwoTensor & r2t)
      33             : {
      34     1582772 :   ADRankTwoTensor eigvecs;
      35     1582772 :   std::vector<ADReal> eigvals(LIBMESH_DIM);
      36     1582772 :   r2t.symmetricEigenvaluesEigenvectors(eigvals, eigvecs);
      37             : 
      38     1582772 :   ADRankTwoTensor eigvals_pos;
      39     1582772 :   eigvals_pos.fillFromInputVector(Macaulay(eigvals));
      40     1582772 :   return eigvecs * eigvals_pos * eigvecs.transpose();
      41             : }
      42             : 
      43             : ADRankTwoTensor
      44      473464 : log(const ADRankTwoTensor & r2t)
      45             : {
      46             :   using std::log;
      47             :   std::vector<ADReal> d;
      48      473464 :   ADRankTwoTensor V, D;
      49      473464 :   r2t.symmetricEigenvaluesEigenvectors(d, V);
      50     1893856 :   for (auto & di : d)
      51     1420392 :     di = log(di);
      52      473464 :   D.fillFromInputVector(d);
      53      473464 :   return V * D * V.transpose();
      54             : }
      55             : 
      56             : ADRankTwoTensor
      57      214592 : exp(const ADRankTwoTensor & r2t)
      58             : {
      59             :   using std::exp;
      60             :   std::vector<ADReal> d;
      61      214592 :   ADRankTwoTensor V, D;
      62      214592 :   r2t.symmetricEigenvaluesEigenvectors(d, V);
      63      858368 :   for (auto & di : d)
      64      643776 :     di = exp(di);
      65      214592 :   D.fillFromInputVector(d);
      66      214592 :   return V * D * V.transpose();
      67             : }
      68             : 
      69             : } // end namespace MooseUtils

Generated by: LCOV version 1.16