mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user