Skip to content

Commit

Permalink
#914 Created stress tensor rotation method, including tests
Browse files Browse the repository at this point in the history
  • Loading branch information
JacobStoren committed Oct 17, 2016
1 parent 323f789 commit 941eed6
Show file tree
Hide file tree
Showing 3 changed files with 140 additions and 5 deletions.
115 changes: 115 additions & 0 deletions ApplicationCode/UnitTests/ScalarMapper-Test.cpp
Expand Up @@ -121,3 +121,118 @@ TEST(OffshoreSphericalCoords, OffshoreSphericalCoords)

}

#include "../cafTensor/cafTensor3.h"
#include "cvfMath.h"

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST(TensorRotation, TensorRotation)
{

{
caf::Ten3f orgT(1.0f, 0.5f, 0.2f, 0, 0, 0);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(1, 0, 0), cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(1.0f, rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(0.5f, rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.2f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SYZ], 1e-4);
}

{
caf::Ten3f orgT(1.0f, 0.5f, 0.2f, 0, 0, 0);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(1, 0, 0), 0.5*cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(1.0f, rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(0.2f, rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.5f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SYZ], 1e-4);
}

{
caf::Ten3f orgT(1.0f, 0.5f, 0.2f, 0, 0, 0);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(0, 0, 1), 0.5*cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(0.5f, rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(1.0f, rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.2f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SYZ], 1e-4);
}

{
caf::Ten3f orgT(1.0f, 0.5f, 0.2f, 0, 0, 0);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(0, 0, 1), 0.25*cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(0.75f,rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(0.75f,rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.2f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.25f,rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SYZ], 1e-4);
}

{
caf::Ten3f orgT(0.75f, 0.75f, 0.2f, 0.25, 0, 0);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(0, 0, 1), -0.25*cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(1.0f, rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(0.5f, rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.2f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SYZ], 1e-4);
}

{
caf::Ten3f orgT(1.0f, 0.5f, 0.2f, 0, 0, 0);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(1, 1, 1), 0.2*cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(0.8320561f, rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(0.5584094f, rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.3095343f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.2091861f, rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(-0.2258091f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0166228f, rotT[caf::Ten3f::SYZ], 1e-4);
}

{
caf::Ten3f orgT(0.8320561f, 0.5584094f, 0.3095343f, 0.2091861f, 0.0166228f, -0.2258091f);

cvf::Mat3f rotMx = cvf::Mat3f::fromRotation(cvf::Vec3f(1, 1, 1), -0.2*cvf::PI_F);

caf::Ten3f rotT = orgT.rotate(rotMx);

EXPECT_NEAR(1.0f, rotT[caf::Ten3f::SXX], 1e-4);
EXPECT_NEAR(0.5f, rotT[caf::Ten3f::SYY], 1e-4);
EXPECT_NEAR(0.2f, rotT[caf::Ten3f::SZZ], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SXY], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SZX], 1e-4);
EXPECT_NEAR(0.0f, rotT[caf::Ten3f::SYZ], 1e-4);
}

}
7 changes: 4 additions & 3 deletions Fwk/AppFwk/cafTensor/cafTensor3.h
Expand Up @@ -46,10 +46,11 @@ class Tensor3
void setFromInternalLayout(S* tensorData);
void setFromAbaqusLayout(S* tensorData);

cvf::Vec3f calculatePrincipals(cvf::Vec3f principalDirections[3]);
float calculateVonMises();
};
cvf::Vec3f calculatePrincipals(cvf::Vec3f principalDirections[3]) const;
float calculateVonMises() const;

Tensor3 rotate(const cvf::Matrix3<S>& rotMx) const;
};

typedef Tensor3<float> Ten3f;

Expand Down
23 changes: 21 additions & 2 deletions Fwk/AppFwk/cafTensor/cafTensor3.inl
Expand Up @@ -168,7 +168,7 @@ cvf::Vec3d eigenVector3(const cvf::Mat3d& mx, double eigenValue, bool* computedO
/// The tensor must be laid out as follows: SXX, SYY, SZZ, SXY, SYZ, SZX
//--------------------------------------------------------------------------------------------------
template<typename S>
cvf::Vec3f Tensor3<S>::calculatePrincipals( cvf::Vec3f principalDirections[3])
cvf::Vec3f Tensor3<S>::calculatePrincipals( cvf::Vec3f principalDirections[3]) const
{
CVF_TIGHT_ASSERT(m_tensor);

Expand Down Expand Up @@ -314,12 +314,31 @@ cvf::Vec3f Tensor3<S>::calculatePrincipals( cvf::Vec3f principalDirections[3])
///
//--------------------------------------------------------------------------------------------------
template< typename S>
float caf::Tensor3<S>::calculateVonMises()
float caf::Tensor3<S>::calculateVonMises() const
{
return (float) sqrt( ( (m_tensor[0]*m_tensor[0] + m_tensor[1]*m_tensor[1] + m_tensor[2]*m_tensor[2]) ) +
( -(m_tensor[0]*m_tensor[1] + m_tensor[1]*m_tensor[2] + m_tensor[0]*m_tensor[2]) ) +
( 3*(m_tensor[3]*m_tensor[3] + m_tensor[4]*m_tensor[4] + m_tensor[5]*m_tensor[5]) ) );
}

//--------------------------------------------------------------------------------------------------
/// Calculates Trot = rotMx*T*transpose(rotMx)
//--------------------------------------------------------------------------------------------------
template< typename S>
Tensor3<S> caf::Tensor3<S>::rotate(const cvf::Matrix3<S>& rotMx) const
{
cvf::Matrix3<S> tensor(m_tensor[SXX], m_tensor[SXY], m_tensor[SZX],
m_tensor[SXY], m_tensor[SYY], m_tensor[SYZ],
m_tensor[SZX], m_tensor[SYZ], m_tensor[SZZ]);

cvf::Matrix3<S> transposedRotMx = rotMx;
transposedRotMx.transpose();
cvf::Matrix3<S> rotatedTensor = rotMx * tensor * transposedRotMx;

return Tensor3(rotatedTensor(0,0), rotatedTensor(1,1), rotatedTensor(2,2),
rotatedTensor(1,0), rotatedTensor(1,2), rotatedTensor(0,2));
}


}

0 comments on commit 941eed6

Please sign in to comment.