#912 Added principal stress directions as scalar results.

This commit is contained in:
Jacob Støren 2016-10-13 12:15:21 +02:00
parent f4fde3cc1c
commit c6a2196ac5
3 changed files with 178 additions and 5 deletions

View File

@ -197,6 +197,10 @@ std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::sc
fieldCompNames["SE"].push_back("S1");
fieldCompNames["SE"].push_back("S2");
fieldCompNames["SE"].push_back("S3");
fieldCompNames["SE"].push_back("S1inc");
fieldCompNames["SE"].push_back("S1azi");
fieldCompNames["SE"].push_back("S3inc");
fieldCompNames["SE"].push_back("S3azi");
fieldCompNames["ST"].push_back("S11");
fieldCompNames["ST"].push_back("S22");
@ -208,6 +212,11 @@ std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::sc
fieldCompNames["ST"].push_back("S2");
fieldCompNames["ST"].push_back("S3");
fieldCompNames["ST"].push_back("S1inc");
fieldCompNames["ST"].push_back("S1azi");
fieldCompNames["ST"].push_back("S3inc");
fieldCompNames["ST"].push_back("S3azi");
fieldCompNames["Gamma"].push_back("Gamma1");
fieldCompNames["Gamma"].push_back("Gamma2");
fieldCompNames["Gamma"].push_back("Gamma3");
@ -241,7 +250,12 @@ std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::sc
fieldCompNames["SE"].push_back("S1");
fieldCompNames["SE"].push_back("S2");
fieldCompNames["SE"].push_back("S3");
fieldCompNames["SE"].push_back("S1inc");
fieldCompNames["SE"].push_back("S1azi");
fieldCompNames["SE"].push_back("S3inc");
fieldCompNames["SE"].push_back("S3azi");
fieldCompNames["ST"].push_back("S11");
fieldCompNames["ST"].push_back("S22");
fieldCompNames["ST"].push_back("S33");
@ -252,6 +266,11 @@ std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::sc
fieldCompNames["ST"].push_back("S2");
fieldCompNames["ST"].push_back("S3");
fieldCompNames["ST"].push_back("S1inc");
fieldCompNames["ST"].push_back("S1azi");
fieldCompNames["ST"].push_back("S3inc");
fieldCompNames["ST"].push_back("S3azi");
fieldCompNames["Gamma"].push_back("Gamma1");
fieldCompNames["Gamma"].push_back("Gamma2");
@ -564,8 +583,14 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::calculateDerivedResult(in
return dstDataFrames;
}
if ((resVarAddr.fieldName == "SE")
&& !(resVarAddr.componentName == "S1" || resVarAddr.componentName == "S2" || resVarAddr.componentName == "S3" || resVarAddr.componentName == ""))
&& ( resVarAddr.componentName == "S11"
|| resVarAddr.componentName == "S22"
|| resVarAddr.componentName == "S33"
|| resVarAddr.componentName == "S12"
|| resVarAddr.componentName == "S13"
|| resVarAddr.componentName == "S23" ))
{
RigFemScalarResultFrames * srcDataFrames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, "S-Bar", resVarAddr.componentName));
RigFemScalarResultFrames * srcPORDataFrames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(RIG_NODAL, "POR-Bar", ""));
@ -615,7 +640,14 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::calculateDerivedResult(in
}
if ( (resVarAddr.fieldName == "SE" || resVarAddr.fieldName == "ST" )
&& (resVarAddr.componentName == "S1" || resVarAddr.componentName == "S2" || resVarAddr.componentName == "S3" ))
&& ( resVarAddr.componentName == "S1"
|| resVarAddr.componentName == "S2"
|| resVarAddr.componentName == "S3"
|| resVarAddr.componentName == "S1inc"
|| resVarAddr.componentName == "S1azi"
|| resVarAddr.componentName == "S3inc"
|| resVarAddr.componentName == "S3azi" )
)
{
RigFemScalarResultFrames * s11Frames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S11"));
RigFemScalarResultFrames * s22Frames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S22"));
@ -628,6 +660,11 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::calculateDerivedResult(in
RigFemScalarResultFrames * s2Frames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S2"));
RigFemScalarResultFrames * s3Frames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S3"));
RigFemScalarResultFrames * s1IncFrames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S1inc"));
RigFemScalarResultFrames * s1AziFrames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S1azi"));
RigFemScalarResultFrames * s3IncFrames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S3inc"));
RigFemScalarResultFrames * s3AziFrames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S3azi"));
int frameCount = s11Frames->frameCount();
for (int fIdx = 0; fIdx < frameCount; ++fIdx)
{
@ -642,20 +679,36 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::calculateDerivedResult(in
std::vector<float>& s2 = s2Frames->frameData(fIdx);
std::vector<float>& s3 = s3Frames->frameData(fIdx);
std::vector<float>& s1inc = s1IncFrames->frameData(fIdx);
std::vector<float>& s1Azi = s1AziFrames->frameData(fIdx);
std::vector<float>& s3inc = s3IncFrames->frameData(fIdx);
std::vector<float>& s3azi = s3AziFrames->frameData(fIdx);
size_t valCount = s11.size();
s1.resize(valCount);
s2.resize(valCount);
s3.resize(valCount);
s1inc.resize(valCount);
s1Azi.resize(valCount);
s3inc.resize(valCount);
s3azi.resize(valCount);
for (size_t vIdx = 0; vIdx < valCount; ++vIdx)
{
caf::Ten3f T(s11[vIdx], s22[vIdx], s33[vIdx], s12[vIdx], s23[vIdx], s13[vIdx] );
cvf::Vec3f principals = T.calculatePrincipals(NULL);
cvf::Vec3f principalDirs[3];
cvf::Vec3f principals = T.calculatePrincipals(principalDirs);
s1[vIdx] = principals[0];
s2[vIdx] = principals[1];
s3[vIdx] = principals[2];
OffshoreSphericalCoords sphCoord1(principalDirs[0]);
OffshoreSphericalCoords sphCoord3(principalDirs[2]);
s1inc[vIdx] = cvf::Math::toDegrees( sphCoord1.inc() );
s1Azi[vIdx] = cvf::Math::toDegrees( sphCoord1.azi() );
s3inc[vIdx] = cvf::Math::toDegrees( sphCoord3.inc() );
s3azi[vIdx] = cvf::Math::toDegrees( sphCoord3.azi() );
}
}

View File

@ -87,5 +87,36 @@ private:
std::map<RigFemResultAddress, cvf::ref<RigStatisticsDataCache> > m_resultStatistics;
};
#include <array>
#include "cvfVector3.h"
#include <cmath>
// Y - North, X - East, Z - up but depth is negative Z
// azi is measured from the Northing (Y) Axis in Clockwise direction looking down
// inc is measured from the negative Z (depth) axis
class OffshoreSphericalCoords
{
public:
explicit OffshoreSphericalCoords(const cvf::Vec3f& vec)
{
// Azimuth:
if (vec[0] == 0.0f && vec[1] == 0.0 ) incAziR[1] = 0.0f;
else incAziR[1] = atan2(vec[0], vec[1]); // atan2(Y, X)
// R
incAziR[2] = vec.length();
// Inclination from vertical down
if (incAziR[2] == 0) incAziR[0] = 0.0f;
else incAziR[0] = acos(-vec[2]/incAziR[2]);
}
float inc() { return incAziR[0];}
float azi() { return incAziR[1];}
float r() { return incAziR[2];}
private:
std::array<float, 3> incAziR;
};

View File

@ -4,6 +4,8 @@
#include <QDebug>
#include "RigFemPartResultsCollection.h"
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -32,3 +34,90 @@ TEST(ScalarMapperTest, TestHumanReadableTickmarks)
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST(OffshoreSphericalCoords, OffshoreSphericalCoords)
{
{
cvf::Vec3f vec(0, 0, 0);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(spCoord.inc(), 0.0, 1e-10);
EXPECT_NEAR(spCoord.azi(), 0.0, 1e-10);
EXPECT_NEAR(spCoord.r(), 0.0, 1e-10);
}
{
cvf::Vec3f vec(1, 0, 0);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 90.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 90.0, 1e-10);
EXPECT_NEAR(spCoord.r(), 1.0, 1e-10);
}
{
cvf::Vec3f vec(-1, 0, 0);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 90.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), -90.0, 1e-10);
EXPECT_NEAR(spCoord.r(), 1.0, 1e-10);
}
{
cvf::Vec3f vec(0, 1, 0);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 90.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 0.0, 1e-10);
EXPECT_NEAR(spCoord.r(), 1.0, 1e-10);
}
{
cvf::Vec3f vec(0.000001f, -3, 0);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 90.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 179.9999, 1e-4);
EXPECT_NEAR(spCoord.r(), 3.0, 1e-5);
}
{
cvf::Vec3f vec(-0.000001f, -3, 0);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 90.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), -179.9999, 1e-4);
EXPECT_NEAR(spCoord.r(), 3.0, 1e-5);
}
{
cvf::Vec3f vec(0, 0, 1);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 180.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 0.0, 1e-4);
EXPECT_NEAR(spCoord.r(), 1.0, 1e-5);
}
{
cvf::Vec3f vec(0, 0, -1);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 0.0, 1e-10);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 0.0, 1e-4);
EXPECT_NEAR(spCoord.r(), 1.0, 1e-5);
}
{
cvf::Vec3f vec(1, 0, -1);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 45.0, 1e-5);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 90.0, 1e-4);
EXPECT_NEAR(spCoord.r(), sqrt(2), 1e-5);
}
{
cvf::Vec3f vec(1.5f, 1.5f, 1.5f);
OffshoreSphericalCoords spCoord(vec);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.inc()), 125.264396, 1e-5);
EXPECT_NEAR(cvf::Math::toDegrees(spCoord.azi()), 45.0, 1e-4);
EXPECT_NEAR(spCoord.r(), vec.length(), 1e-6);
}
}