Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 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 "EnrichmentFunctionCalculation.h" 11 : 12 44 : EnrichmentFunctionCalculation::EnrichmentFunctionCalculation( 13 44 : const CrackFrontDefinition * crack_front_definition) 14 44 : : _crack_front_definition(*crack_front_definition) 15 : { 16 44 : } 17 : 18 : unsigned int 19 9492744 : EnrichmentFunctionCalculation::crackTipEnrichementFunctionAtPoint(const Point & point, 20 : std::vector<Real> & B) 21 : { 22 : unsigned int crack_front_point_index = 23 9492744 : _crack_front_definition.calculateRThetaToCrackFront(point, _r, _theta); 24 : 25 9492744 : if (MooseUtils::absoluteFuzzyEqual(_r, 0.0)) 26 0 : mooseError("EnrichmentFunctionCalculation: the distance between a point and the crack " 27 : "tip/front is zero."); 28 : 29 9492744 : Real st = std::sin(_theta); 30 9492744 : Real st2 = std::sin(_theta / 2.0); 31 9492744 : Real ct2 = std::cos(_theta / 2.0); 32 9492744 : Real sr = std::sqrt(_r); 33 : 34 9492744 : B[0] = sr * st2; 35 9492744 : B[1] = sr * ct2; 36 9492744 : B[2] = sr * st2 * st; 37 9492744 : B[3] = sr * ct2 * st; 38 : 39 9492744 : return crack_front_point_index; 40 : } 41 : 42 : unsigned int 43 3590060 : EnrichmentFunctionCalculation::crackTipEnrichementFunctionDerivativeAtPoint( 44 : const Point & point, std::vector<RealVectorValue> & dB) 45 : { 46 : unsigned int crack_front_point_index = 47 3590060 : _crack_front_definition.calculateRThetaToCrackFront(point, _r, _theta); 48 : 49 3590060 : if (MooseUtils::absoluteFuzzyEqual(_r, 0.0)) 50 0 : mooseError("EnrichmentFunctionCalculation: the distance between a point and the crack " 51 : "tip/front is zero."); 52 : 53 3590060 : Real st = std::sin(_theta); 54 3590060 : Real ct = std::cos(_theta); 55 3590060 : Real st2 = std::sin(_theta / 2.0); 56 3590060 : Real ct2 = std::cos(_theta / 2.0); 57 3590060 : Real st15 = std::sin(1.5 * _theta); 58 3590060 : Real ct15 = std::cos(1.5 * _theta); 59 3590060 : Real sr = std::sqrt(_r); 60 : 61 3590060 : dB[0](0) = -0.5 / sr * st2; 62 3590060 : dB[0](1) = 0.5 / sr * ct2; 63 3590060 : dB[0](2) = 0.0; 64 3590060 : dB[1](0) = 0.5 / sr * ct2; 65 3590060 : dB[1](1) = 0.5 / sr * st2; 66 3590060 : dB[1](2) = 0.0; 67 3590060 : dB[2](0) = -0.5 / sr * st15 * st; 68 3590060 : dB[2](1) = 0.5 / sr * (st2 + st15 * ct); 69 3590060 : dB[2](2) = 0.0; 70 3590060 : dB[3](0) = -0.5 / sr * ct15 * st; 71 3590060 : dB[3](1) = 0.5 / sr * (ct2 + ct15 * ct); 72 3590060 : dB[3](2) = 0.0; 73 : 74 3590060 : return crack_front_point_index; 75 : } 76 : 77 : void 78 14360240 : EnrichmentFunctionCalculation::rotateFromCrackFrontCoordsToGlobal(const RealVectorValue & vector, 79 : RealVectorValue & rotated_vector, 80 : const unsigned int point_index) 81 : { 82 14360240 : rotated_vector = _crack_front_definition.rotateFromCrackFrontCoordsToGlobal(vector, point_index); 83 14360240 : }