mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#912 Added principal stress directions as scalar results.
This commit is contained in:
@@ -197,6 +197,10 @@ std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::sc
|
|||||||
fieldCompNames["SE"].push_back("S1");
|
fieldCompNames["SE"].push_back("S1");
|
||||||
fieldCompNames["SE"].push_back("S2");
|
fieldCompNames["SE"].push_back("S2");
|
||||||
fieldCompNames["SE"].push_back("S3");
|
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("S11");
|
||||||
fieldCompNames["ST"].push_back("S22");
|
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("S2");
|
||||||
fieldCompNames["ST"].push_back("S3");
|
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("Gamma1");
|
||||||
fieldCompNames["Gamma"].push_back("Gamma2");
|
fieldCompNames["Gamma"].push_back("Gamma2");
|
||||||
fieldCompNames["Gamma"].push_back("Gamma3");
|
fieldCompNames["Gamma"].push_back("Gamma3");
|
||||||
@@ -242,6 +251,11 @@ std::map<std::string, std::vector<std::string> > RigFemPartResultsCollection::sc
|
|||||||
fieldCompNames["SE"].push_back("S2");
|
fieldCompNames["SE"].push_back("S2");
|
||||||
fieldCompNames["SE"].push_back("S3");
|
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("S11");
|
||||||
fieldCompNames["ST"].push_back("S22");
|
fieldCompNames["ST"].push_back("S22");
|
||||||
fieldCompNames["ST"].push_back("S33");
|
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("S2");
|
||||||
fieldCompNames["ST"].push_back("S3");
|
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("Gamma1");
|
||||||
fieldCompNames["Gamma"].push_back("Gamma2");
|
fieldCompNames["Gamma"].push_back("Gamma2");
|
||||||
@@ -564,8 +583,14 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::calculateDerivedResult(in
|
|||||||
return dstDataFrames;
|
return dstDataFrames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((resVarAddr.fieldName == "SE")
|
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 * srcDataFrames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, "S-Bar", resVarAddr.componentName));
|
||||||
RigFemScalarResultFrames * srcPORDataFrames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(RIG_NODAL, "POR-Bar", ""));
|
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" )
|
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 * s11Frames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S11"));
|
||||||
RigFemScalarResultFrames * s22Frames = this->findOrLoadScalarResult(partIndex, RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S22"));
|
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 * s2Frames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S2"));
|
||||||
RigFemScalarResultFrames * s3Frames = m_femPartResults[partIndex]->createScalarResult(RigFemResultAddress(resVarAddr.resultPosType, resVarAddr.fieldName, "S3"));
|
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();
|
int frameCount = s11Frames->frameCount();
|
||||||
for (int fIdx = 0; fIdx < frameCount; ++fIdx)
|
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>& s2 = s2Frames->frameData(fIdx);
|
||||||
std::vector<float>& s3 = s3Frames->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();
|
size_t valCount = s11.size();
|
||||||
|
|
||||||
s1.resize(valCount);
|
s1.resize(valCount);
|
||||||
s2.resize(valCount);
|
s2.resize(valCount);
|
||||||
s3.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)
|
for (size_t vIdx = 0; vIdx < valCount; ++vIdx)
|
||||||
{
|
{
|
||||||
caf::Ten3f T(s11[vIdx], s22[vIdx], s33[vIdx], s12[vIdx], s23[vIdx], s13[vIdx] );
|
caf::Ten3f T(s11[vIdx], s22[vIdx], s33[vIdx], s12[vIdx], s23[vIdx], s13[vIdx] );
|
||||||
|
cvf::Vec3f principalDirs[3];
|
||||||
cvf::Vec3f principals = T.calculatePrincipals(NULL);
|
cvf::Vec3f principals = T.calculatePrincipals(principalDirs);
|
||||||
s1[vIdx] = principals[0];
|
s1[vIdx] = principals[0];
|
||||||
s2[vIdx] = principals[1];
|
s2[vIdx] = principals[1];
|
||||||
s3[vIdx] = principals[2];
|
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() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -87,5 +87,36 @@ private:
|
|||||||
std::map<RigFemResultAddress, cvf::ref<RigStatisticsDataCache> > m_resultStatistics;
|
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;
|
||||||
|
};
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include <QDebug>
|
#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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user