diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp index ea3225526a..895cf1a572 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp @@ -197,6 +197,10 @@ std::map > 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 > 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 > 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 > 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& s2 = s2Frames->frameData(fIdx); std::vector& s3 = s3Frames->frameData(fIdx); + std::vector& s1inc = s1IncFrames->frameData(fIdx); + std::vector& s1Azi = s1AziFrames->frameData(fIdx); + std::vector& s3inc = s3IncFrames->frameData(fIdx); + std::vector& 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() ); } } diff --git a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h index acfdc1d9ef..c1d740588d 100644 --- a/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h +++ b/ApplicationCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h @@ -87,5 +87,36 @@ private: std::map > m_resultStatistics; }; +#include +#include "cvfVector3.h" +#include +// 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 incAziR; +}; diff --git a/ApplicationCode/UnitTests/ScalarMapper-Test.cpp b/ApplicationCode/UnitTests/ScalarMapper-Test.cpp index dc875050d6..a3a1c85c5e 100644 --- a/ApplicationCode/UnitTests/ScalarMapper-Test.cpp +++ b/ApplicationCode/UnitTests/ScalarMapper-Test.cpp @@ -4,6 +4,8 @@ #include +#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); + } + +} +