https://mooseframework.inl.gov
Loading...
Searching...
No Matches
RotationTensor.C
Go to the documentation of this file.
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 "RotationTensor.h"
11#include "libmesh/libmesh.h"
12
13RotationTensor::RotationTensor(Axis axis, Real angle) { update(axis, angle); }
14
15RotationTensor::RotationTensor(const RealVectorValue & euler_angles) { update(euler_angles); }
16
17void
19{
20 zero();
21
22 RealVectorValue a;
23 a(axis) = 1.0;
24
25 const Real s = std::sin(angle * libMesh::pi / 180.0);
26 const Real c = std::cos(angle * libMesh::pi / 180.0);
27
28 // assemble row wise
29 _coords[0] = a * RealVectorValue(1.0, -c, -c);
30 _coords[1] = a * RealVectorValue(0.0, 0.0, s);
31 _coords[2] = a * RealVectorValue(0.0, -s, 0.0);
32
33 _coords[3] = a * RealVectorValue(0.0, 0.0, -s);
34 _coords[4] = a * RealVectorValue(-c, 1.0, -c);
35 _coords[5] = a * RealVectorValue(s, 0.0, 0.0);
36
37 _coords[6] = a * RealVectorValue(0.0, s, 0.0);
38 _coords[7] = a * RealVectorValue(-s, 0.0, 0.0);
39 _coords[8] = a * RealVectorValue(-c, -c, 1.0);
40}
41
42void
43RotationTensor::update(const RealVectorValue & euler_angles)
44{
45 const Real phi_1 = euler_angles(0) * (libMesh::pi / 180.0);
46 const Real Phi = euler_angles(1) * (libMesh::pi / 180.0);
47 const Real phi_2 = euler_angles(2) * (libMesh::pi / 180.0);
48
49 const Real c1 = std::cos(phi_1);
50 const Real c2 = std::cos(Phi);
51 const Real c3 = std::cos(phi_2);
52
53 const Real s1 = std::sin(phi_1);
54 const Real s2 = std::sin(Phi);
55 const Real s3 = std::sin(phi_2);
56
57 // doing a Z1, X2, Z3 rotation
58 // RealTensorValue is formed row-wise
59
60 _coords[0] = c1 * c3 - c2 * s1 * s3; // R11
61 _coords[3] = -c1 * s3 - c2 * c3 * s1; // R21
62 _coords[6] = s1 * s2; // R31
63
64 _coords[1] = c3 * s1 + c1 * c2 * s3; // R12
65 _coords[4] = c1 * c2 * c3 - s1 * s3; // R22
66 _coords[7] = -c1 * s2; // R32
67
68 _coords[2] = s2 * s3; // R13
69 _coords[5] = c3 * s2; // R23
70 _coords[8] = c2; // R33
71}
Axis
axis for single axis rotation constructor
void update(Axis axis, Real angle)
reforms the rotation matrix according to axis and angle.
RotationTensor(Axis axis, Real angle)
single axis rotation (in degrees)
const Real pi