mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
6781 - Fix of z scaling issue for flow vectors (#6792)
* Fixed #6781. Tidied up code. * Bugfix: threshold not correctly applied for Cell Center Total * Removed unused model offset. * Remove commented code Co-authored-by: Magne Sjaastad <magne.sjaastad@ceetronsolutions.com>
This commit is contained in:
parent
7be1763941
commit
1893a5546c
@ -88,10 +88,12 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
|
|
||||||
if ( !result->showResult() ) return;
|
if ( !result->showResult() ) return;
|
||||||
|
|
||||||
|
cvf::ref<caf::DisplayCoordTransform> displayCordXf = m_rimReservoirView->displayCoordTransform();
|
||||||
|
|
||||||
std::vector<ElementVectorResultVisualization> tensorVisualizations;
|
std::vector<ElementVectorResultVisualization> tensorVisualizations;
|
||||||
|
|
||||||
double characteristicCellSize = eclipseCase->characteristicCellSize();
|
double characteristicCellSize = eclipseCase->characteristicCellSize();
|
||||||
float arrowConstantScaling = 0.5 * result->sizeScale() * characteristicCellSize;
|
float arrowConstantScaling = 10.0 * result->sizeScale() * characteristicCellSize;
|
||||||
|
|
||||||
double min, max;
|
double min, max;
|
||||||
result->mappingRange( min, max );
|
result->mappingRange( min, max );
|
||||||
@ -141,10 +143,19 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
RigCaseCellResultsData* resultsData = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
RigCaseCellResultsData* resultsData = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
||||||
RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL );
|
||||||
|
|
||||||
const cvf::Vec3d offset = eclipseCase->mainGrid()->displayModelOffset();
|
|
||||||
|
|
||||||
const std::vector<RigCell>& cells = eclipseCase->mainGrid()->globalCellArray();
|
const std::vector<RigCell>& cells = eclipseCase->mainGrid()->globalCellArray();
|
||||||
for ( int gcIdx = 0; gcIdx < static_cast<int>( cells.size() ); ++gcIdx )
|
|
||||||
|
auto getFaceCenterAndNormal =
|
||||||
|
[activeCellInfo, cells, arrowScaling, displayCordXf]( size_t globalCellIdx,
|
||||||
|
cvf::StructGridInterface::FaceType faceType,
|
||||||
|
cvf::Vec3d& faceCenter,
|
||||||
|
cvf::Vec3d& faceNormal ) {
|
||||||
|
faceCenter = displayCordXf->transformToDisplayCoord( cells[globalCellIdx].faceCenter( faceType ) );
|
||||||
|
cvf::Vec3d cellCenter = displayCordXf->transformToDisplayCoord( cells[globalCellIdx].center() );
|
||||||
|
faceNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling;
|
||||||
|
};
|
||||||
|
|
||||||
|
for ( size_t gcIdx = 0; gcIdx < cells.size(); ++gcIdx )
|
||||||
{
|
{
|
||||||
if ( !cells[gcIdx].isInvalid() && activeCellInfo->isActive( gcIdx ) )
|
if ( !cells[gcIdx].isInvalid() && activeCellInfo->isActive( gcIdx ) )
|
||||||
{
|
{
|
||||||
@ -162,9 +173,9 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
|
|
||||||
if ( std::abs( resultValue ) >= result->threshold() )
|
if ( std::abs( resultValue ) >= result->threshold() )
|
||||||
{
|
{
|
||||||
cvf::Vec3d faceCenter = cells[gcIdx].faceCenter( directions[dir] ) - offset;
|
cvf::Vec3d faceCenter;
|
||||||
cvf::Vec3d cellCenter = cells[gcIdx].center() - offset;
|
cvf::Vec3d faceNormal;
|
||||||
cvf::Vec3d faceNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling;
|
getFaceCenterAndNormal( gcIdx, directions[dir], faceCenter, faceNormal );
|
||||||
|
|
||||||
if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT )
|
if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT )
|
||||||
{
|
{
|
||||||
@ -195,29 +206,33 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
resultValue +=
|
resultValue +=
|
||||||
resultsData->cellScalarResults( resultAddresses[flIdx], timeStepIndex ).at( resultIdx );
|
resultsData->cellScalarResults( resultAddresses[flIdx], timeStepIndex ).at( resultIdx );
|
||||||
}
|
}
|
||||||
cvf::Vec3d faceCenter = cells[gcIdx].faceCenter( directions[dir] ) - offset;
|
|
||||||
cvf::Vec3d cellCenter = cells[gcIdx].center() - offset;
|
|
||||||
cvf::Vec3d faceNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling;
|
|
||||||
|
|
||||||
aggregatedVector += faceNormal;
|
cvf::Vec3d faceCenter;
|
||||||
|
cvf::Vec3d faceNormal;
|
||||||
|
cvf::Vec3d faceNormalScaled;
|
||||||
|
getFaceCenterAndNormal( gcIdx, directions[dir], faceCenter, faceNormal );
|
||||||
|
faceNormalScaled = faceNormal;
|
||||||
|
|
||||||
if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT )
|
if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT )
|
||||||
{
|
{
|
||||||
faceNormal *= resultValue;
|
faceNormalScaled *= resultValue;
|
||||||
}
|
}
|
||||||
else if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT_LOG )
|
else if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT_LOG )
|
||||||
{
|
{
|
||||||
faceNormal *= ( 1.0 - static_cast<double>( std::signbit( resultValue ) ) * 2.0 ) *
|
faceNormalScaled *= ( 1.0 - static_cast<double>( std::signbit( resultValue ) ) * 2.0 ) *
|
||||||
scaleLogarithmically( std::abs( resultValue ) );
|
scaleLogarithmically( std::abs( resultValue ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
aggregatedVector += faceNormal;
|
aggregatedVector += faceNormalScaled;
|
||||||
aggregatedResult += ( faceCenter - cellCenter ).getNormalized() * resultValue;
|
|
||||||
|
// If the vector is scaled in a logarithmic scale, the result should still be the same as before.
|
||||||
|
// Hence, we need to separate the result value from the vector.
|
||||||
|
aggregatedResult += faceNormal.getNormalized() * resultValue;
|
||||||
}
|
}
|
||||||
if ( aggregatedVector.length() >= result->threshold() )
|
if ( aggregatedResult.length() >= result->threshold() )
|
||||||
{
|
{
|
||||||
tensorVisualizations.push_back(
|
tensorVisualizations.push_back(
|
||||||
ElementVectorResultVisualization( cells[gcIdx].center() - offset,
|
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( cells[gcIdx].center() ),
|
||||||
aggregatedVector,
|
aggregatedVector,
|
||||||
aggregatedResult.length(),
|
aggregatedResult.length(),
|
||||||
std::cbrt( cells[gcIdx].volume() / 3.0 ) ) );
|
std::cbrt( cells[gcIdx].volume() / 3.0 ) ) );
|
||||||
@ -259,10 +274,9 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
cvf::Vec3d connCenter =
|
cvf::Vec3d connCenter =
|
||||||
static_cast<cvf::Vec3d>( cvf::GeometryTools::computePolygonCenter<cvf::Vec3f>( conn.polygon() ) );
|
static_cast<cvf::Vec3d>( cvf::GeometryTools::computePolygonCenter<cvf::Vec3f>( conn.polygon() ) );
|
||||||
|
|
||||||
cvf::Vec3d faceCenter = cells[conn.c1GlobIdx()].faceCenter( conn.face() ) - offset;
|
cvf::Vec3d faceCenter;
|
||||||
cvf::Vec3d cellCenter = cells[conn.c1GlobIdx()].center() - offset;
|
cvf::Vec3d connNormal;
|
||||||
|
getFaceCenterAndNormal( conn.c1GlobIdx(), conn.face(), faceCenter, connNormal );
|
||||||
cvf::Vec3d connNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling;
|
|
||||||
|
|
||||||
if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT )
|
if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT )
|
||||||
{
|
{
|
||||||
@ -276,7 +290,7 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
if ( std::abs( resultValue ) >= result->threshold() )
|
if ( std::abs( resultValue ) >= result->threshold() )
|
||||||
{
|
{
|
||||||
tensorVisualizations.push_back(
|
tensorVisualizations.push_back(
|
||||||
ElementVectorResultVisualization( connCenter - offset,
|
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( connCenter ),
|
||||||
connNormal,
|
connNormal,
|
||||||
resultValue,
|
resultValue,
|
||||||
std::cbrt( cells[conn.c1GlobIdx()].volume() / 3.0 ) ) );
|
std::cbrt( cells[conn.c1GlobIdx()].volume() / 3.0 ) ) );
|
||||||
@ -288,7 +302,6 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
if ( !tensorVisualizations.empty() )
|
if ( !tensorVisualizations.empty() )
|
||||||
{
|
{
|
||||||
cvf::ref<cvf::Part> partIdx = createPart( *result, tensorVisualizations );
|
cvf::ref<cvf::Part> partIdx = createPart( *result, tensorVisualizations );
|
||||||
partIdx->setTransform( m_scaleTransform.p() );
|
|
||||||
partIdx->updateBoundingBox();
|
partIdx->updateBoundingBox();
|
||||||
model->addPart( partIdx.p() );
|
model->addPart( partIdx.p() );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user