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 "GrainTrackerElasticity.h" 11 : #include "EulerAngleProvider.h" 12 : #include "RotationTensor.h" 13 : 14 : registerMooseObject("PhaseFieldApp", GrainTrackerElasticity); 15 : 16 : InputParameters 17 0 : GrainTrackerElasticity::validParams() 18 : { 19 0 : InputParameters params = GrainTracker::validParams(); 20 0 : params.addParam<bool>("random_rotations", 21 0 : true, 22 : "Generate random rotations when the Euler Angle " 23 : "provider runs out of data (otherwise error " 24 : "out)"); 25 0 : params.addRequiredParam<std::vector<Real>>("C_ijkl", "Unrotated stiffness tensor"); 26 0 : params.addParam<MooseEnum>( 27 0 : "fill_method", RankFourTensor::fillMethodEnum() = "symmetric9", "The fill method"); 28 0 : params.addRequiredParam<UserObjectName>("euler_angle_provider", 29 : "Name of Euler angle provider user object"); 30 0 : return params; 31 0 : } 32 : 33 0 : GrainTrackerElasticity::GrainTrackerElasticity(const InputParameters & parameters) 34 : : GrainDataTracker<RankFourTensor>(parameters), 35 0 : _random_rotations(getParam<bool>("random_rotations")), 36 0 : _C_ijkl(getParam<std::vector<Real>>("C_ijkl"), 37 0 : getParam<MooseEnum>("fill_method").getEnum<RankFourTensor::FillMethod>()), 38 0 : _euler(getUserObject<EulerAngleProvider>("euler_angle_provider")) 39 : { 40 0 : } 41 : 42 : RankFourTensor 43 0 : GrainTrackerElasticity::newGrain(unsigned int new_grain_id) 44 : { 45 0 : EulerAngles angles; 46 : 47 0 : if (new_grain_id < _euler.getGrainNum()) 48 0 : angles = _euler.getEulerAngles(new_grain_id); 49 : else 50 : { 51 0 : if (_random_rotations) 52 0 : angles.random(); 53 : else 54 0 : mooseError("GrainTrackerElasticity has run out of grain rotation data."); 55 : } 56 : 57 0 : RankFourTensor C_ijkl = _C_ijkl; 58 0 : C_ijkl.rotate(RotationTensor(RealVectorValue(angles))); 59 : 60 0 : return C_ijkl; 61 : }