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 7766504 : if (deriv) 17 0 : return x > 0 ? 1 : 0; 18 23299512 : return 0.5 * (x + std::abs(x)); 19 : } 20 : 21 : std::vector<ADReal> 22 1828660 : Macaulay(const std::vector<ADReal> & v, const bool deriv) 23 : { 24 1828660 : std::vector<ADReal> m = v; 25 7314640 : for (auto & x : m) 26 5485980 : x = Macaulay(x, deriv); 27 1828660 : return m; 28 : } 29 : 30 : ADRankTwoTensor 31 1828660 : spectralDecomposition(const ADRankTwoTensor & r2t) 32 : { 33 1828660 : ADRankTwoTensor eigvecs; 34 1828660 : std::vector<ADReal> eigvals(LIBMESH_DIM); 35 1828660 : r2t.symmetricEigenvaluesEigenvectors(eigvals, eigvecs); 36 : 37 1828660 : ADRankTwoTensor eigvals_pos; 38 1828660 : eigvals_pos.fillFromInputVector(Macaulay(eigvals)); 39 1828660 : return eigvecs * eigvals_pos * eigvecs.transpose(); 40 : } 41 : 42 : ADRankTwoTensor 43 519064 : log(const ADRankTwoTensor & r2t) 44 : { 45 : std::vector<ADReal> d; 46 519064 : ADRankTwoTensor V, D; 47 519064 : r2t.symmetricEigenvaluesEigenvectors(d, V); 48 2076256 : for (auto & di : d) 49 1557192 : di = std::log(di); 50 519064 : D.fillFromInputVector(d); 51 519064 : return V * D * V.transpose(); 52 : } 53 : 54 : ADRankTwoTensor 55 235072 : exp(const ADRankTwoTensor & r2t) 56 : { 57 : std::vector<ADReal> d; 58 235072 : ADRankTwoTensor V, D; 59 235072 : r2t.symmetricEigenvaluesEigenvectors(d, V); 60 940288 : for (auto & di : d) 61 705216 : di = std::exp(di); 62 235072 : D.fillFromInputVector(d); 63 235072 : return V * D * V.transpose(); 64 : } 65 : 66 : } // end namespace MooseUtils