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