#933 Fixed the closes result for intersections also. Display the tensor data from the closest element node transformed onto the plane.

This commit is contained in:
Jacob Støren
2016-10-26 17:05:39 +02:00
parent 1a23e6c670
commit c93c7e41df
18 changed files with 454 additions and 125 deletions

View File

@@ -1380,8 +1380,9 @@ RigFemClosestResultIndexCalculator::RigFemClosestResultIndexCalculator(RigFemPar
{
m_resultIndexToClosestResult = -1;
m_closestNodeId = -1;
m_closestElementNodeResIdx = -1;
if ( resultPosition != RIG_ELEMENT_NODAL_FACE )
if ( resultPosition != RIG_ELEMENT_NODAL_FACE || m_face == -1 )
{
RigElementType elmType = femPart->elementType(elementIndex);
const int* elmentConn = femPart->connectivities(elementIndex);
@@ -1406,13 +1407,19 @@ RigFemClosestResultIndexCalculator::RigFemClosestResultIndexCalculator(RigFemPar
{
float scalarValue = std::numeric_limits<float>::infinity();
int nodeIdx = elmentConn[closestLocalNode];
m_closestElementNodeResIdx = static_cast<int>(femPart->elementNodeResultIdx(elementIndex, closestLocalNode));
if ( resultPosition == RIG_NODAL )
{
m_resultIndexToClosestResult = nodeIdx;
}
else if (resultPosition == RIG_ELEMENT_NODAL_FACE)
{
m_resultIndexToClosestResult = -1;
}
else
{
m_resultIndexToClosestResult = static_cast<int>(femPart->elementNodeResultIdx(elementIndex, closestLocalNode));
m_resultIndexToClosestResult = m_closestElementNodeResIdx;
}
m_closestNodeId = femPart->nodes().nodeIds[nodeIdx];
@@ -1424,6 +1431,7 @@ RigFemClosestResultIndexCalculator::RigFemClosestResultIndexCalculator(RigFemPar
int closestNodeIdx = -1;
{
int closestLocFaceNode = -1;
int closestLocalElmNode = -1;
{
RigElementType elmType = femPart->elementType(elementIndex);
int faceCount = RigFemTypes::elmentFaceCount(elmType);
@@ -1441,6 +1449,7 @@ RigFemClosestResultIndexCalculator::RigFemClosestResultIndexCalculator(RigFemPar
{
closestLocFaceNode = faceNodIdx;
closestNodeIdx = nodeIdx;
closestLocalElmNode = localElmNodeIndicesForFace[faceNodIdx];
minDist = dist;
}
}
@@ -1449,7 +1458,11 @@ RigFemClosestResultIndexCalculator::RigFemClosestResultIndexCalculator(RigFemPar
int elmNodFaceResIdxElmStart = elementIndex * 24; // HACK should get from part
int elmNodFaceResIdxFaceStart = elmNodFaceResIdxElmStart + 4*m_face;
if ( closestLocFaceNode >= 0 ) elmNodFaceResIdx = elmNodFaceResIdxFaceStart + closestLocFaceNode;
if ( closestLocFaceNode >= 0 )
{
elmNodFaceResIdx = elmNodFaceResIdxFaceStart + closestLocFaceNode;
m_closestElementNodeResIdx = static_cast<int>(femPart->elementNodeResultIdx(elementIndex, closestLocalElmNode));
}
}
m_resultIndexToClosestResult = elmNodFaceResIdx;

View File

@@ -138,8 +138,10 @@ public:
int resultIndexToClosestResult() { return m_resultIndexToClosestResult; }
int closestNodeId() { return m_closestNodeId; }
int closestElementNodeResIdx () { return m_closestElementNodeResIdx; }
private:
int m_resultIndexToClosestResult;
int m_closestNodeId;
int m_closestElementNodeResIdx;
};

View File

@@ -25,6 +25,7 @@
#include "RigFemPartResultsCollection.h"
#include "RigFemTypes.h"
#include "RigGeoMechCaseData.h"
#include "RiuGeoMechXfTensorResultAccessor.h"
#include <cmath> // Needed for HUGE_VAL on Linux
@@ -34,15 +35,38 @@
RigFemTimeHistoryResultAccessor::RigFemTimeHistoryResultAccessor(RigGeoMechCaseData* geomData,
RigFemResultAddress femResultAddress,
size_t gridIndex,
size_t cellIndex,
int elementIndex,
int face,
const cvf::Vec3d& intersectionPoint)
: m_geoMechCaseData(geomData),
m_femResultAddress(femResultAddress),
m_gridIndex(gridIndex),
m_cellIndex(cellIndex),
m_elementIndex(elementIndex),
m_face(face),
m_intersectionPoint(intersectionPoint)
m_intersectionPoint(intersectionPoint),
m_hasIntersectionTriangle(false)
{
computeTimeHistoryData();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigFemTimeHistoryResultAccessor::RigFemTimeHistoryResultAccessor(RigGeoMechCaseData* geomData,
RigFemResultAddress femResultAddress,
size_t gridIndex,
int elementIndex,
int face,
const cvf::Vec3d& intersectionPoint,
const std::array<cvf::Vec3f, 3>& intersectionTriangle)
: m_geoMechCaseData(geomData),
m_femResultAddress(femResultAddress),
m_gridIndex(gridIndex),
m_elementIndex(elementIndex),
m_face(face),
m_intersectionPoint(intersectionPoint),
m_hasIntersectionTriangle(true),
m_intersectionTriangle(intersectionTriangle)
{
computeTimeHistoryData();
}
@@ -57,13 +81,13 @@ QString RigFemTimeHistoryResultAccessor::topologyText() const
if (m_geoMechCaseData)
{
RigFemPart* femPart = m_geoMechCaseData->femParts()->part(m_gridIndex);
int elementId = femPart->elmId(m_cellIndex);
int elementId = femPart->elmId(m_elementIndex);
text += QString("Element : Id[%1]").arg(elementId);
size_t i = 0;
size_t j = 0;
size_t k = 0;
if (m_geoMechCaseData->femParts()->part(m_gridIndex)->structGrid()->ijkFromCellIndex(m_cellIndex, &i, &j, &k))
if (m_geoMechCaseData->femParts()->part(m_gridIndex)->structGrid()->ijkFromCellIndex(m_elementIndex, &i, &j, &k))
{
// Adjust to 1-based Eclipse indexing
i++;
@@ -100,23 +124,40 @@ void RigFemTimeHistoryResultAccessor::computeTimeHistoryData()
RigFemClosestResultIndexCalculator closestCalc(m_geoMechCaseData->femParts()->part(m_gridIndex),
m_femResultAddress.resultPosType,
m_cellIndex,
m_elementIndex,
m_face,
m_intersectionPoint );
int scalarResultIndex = closestCalc.resultIndexToClosestResult();
m_closestNodeId = closestCalc.closestNodeId();
if (scalarResultIndex < 0) return;
RigFemPartResultsCollection* femPartResultsColl = m_geoMechCaseData->femPartResults();
for (int frameIdx = 0; frameIdx < femPartResultsColl->frameCount(); frameIdx++)
{
const std::vector<float>& scalarResults = m_geoMechCaseData->femPartResults()->resultValues(m_femResultAddress, static_cast<int>(m_gridIndex), frameIdx);
if (scalarResults.size())
{
float scalarValue = scalarResults[scalarResultIndex];
if (m_femResultAddress.resultPosType == RIG_ELEMENT_NODAL_FACE && m_hasIntersectionTriangle)
{
int closestElmNodeResIndex = closestCalc.closestElementNodeResIdx();
for ( int frameIdx = 0; frameIdx < femPartResultsColl->frameCount(); frameIdx++ )
{
RiuGeoMechXfTensorResultAccessor stressXfAccessor(femPartResultsColl, m_femResultAddress, frameIdx);
float scalarValue = stressXfAccessor.calculateElmNodeValue(m_intersectionTriangle, closestElmNodeResIndex);
m_timeHistoryValues.push_back(scalarValue);
}
}
else
{
if ( scalarResultIndex < 0 ) return;
for ( int frameIdx = 0; frameIdx < femPartResultsColl->frameCount(); frameIdx++ )
{
const std::vector<float>& scalarResults = m_geoMechCaseData->femPartResults()->resultValues(m_femResultAddress, static_cast<int>(m_gridIndex), frameIdx);
if ( scalarResults.size() )
{
float scalarValue = scalarResults[scalarResultIndex];
m_timeHistoryValues.push_back(scalarValue);
}
}
}
}

View File

@@ -23,6 +23,7 @@
#include "cvfStructGrid.h"
#include "cvfVector3.h"
#include <array>
class RigGeoMechCaseData;
@@ -33,12 +34,21 @@ public:
RigFemTimeHistoryResultAccessor(RigGeoMechCaseData* geomData,
RigFemResultAddress femResultAddress,
size_t gridIndex,
size_t cellIndex,
int elementIndex,
int face,
const cvf::Vec3d& intersectionPoint);
RigFemTimeHistoryResultAccessor(RigGeoMechCaseData* geomData,
RigFemResultAddress femResultAddress,
size_t gridIndex,
int elementIndex,
int face,
const cvf::Vec3d& intersectionPoint,
const std::array<cvf::Vec3f, 3>& m_intersectionTriangle);
QString topologyText() const;
std::vector<double> timeHistoryValues() const;
int closestNodeId() const { return m_closestNodeId; }
private:
void computeTimeHistoryData();
@@ -48,12 +58,16 @@ private:
RigFemResultAddress m_femResultAddress;
size_t m_gridIndex;
size_t m_cellIndex;
int m_elementIndex;
size_t m_scalarResultIndex;
int m_face;
int m_closestNodeId;
cvf::Vec3d m_intersectionPoint;
bool m_hasIntersectionTriangle;
std::array<cvf::Vec3f, 3> m_intersectionTriangle;
std::vector<double> m_timeHistoryValues;
};