From 1893a5546c2096b1a54b729ccaca8a182d33f3ff Mon Sep 17 00:00:00 2001 From: rubenthoms <69145689+rubenthoms@users.noreply.github.com> Date: Fri, 16 Oct 2020 14:11:52 +0200 Subject: [PATCH] 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 --- .../RivElementVectorResultPartMgr.cpp | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/ApplicationCode/ModelVisualization/RivElementVectorResultPartMgr.cpp b/ApplicationCode/ModelVisualization/RivElementVectorResultPartMgr.cpp index 48e07a3e92..9bf7787c3f 100644 --- a/ApplicationCode/ModelVisualization/RivElementVectorResultPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivElementVectorResultPartMgr.cpp @@ -88,10 +88,12 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode if ( !result->showResult() ) return; + cvf::ref displayCordXf = m_rimReservoirView->displayCoordTransform(); + std::vector tensorVisualizations; double characteristicCellSize = eclipseCase->characteristicCellSize(); - float arrowConstantScaling = 0.5 * result->sizeScale() * characteristicCellSize; + float arrowConstantScaling = 10.0 * result->sizeScale() * characteristicCellSize; double min, max; result->mappingRange( min, max ); @@ -141,10 +143,19 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode RigCaseCellResultsData* resultsData = eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); - const cvf::Vec3d offset = eclipseCase->mainGrid()->displayModelOffset(); - const std::vector& cells = eclipseCase->mainGrid()->globalCellArray(); - for ( int gcIdx = 0; gcIdx < static_cast( 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 ) ) { @@ -162,9 +173,9 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode if ( std::abs( resultValue ) >= result->threshold() ) { - cvf::Vec3d faceCenter = cells[gcIdx].faceCenter( directions[dir] ) - offset; - cvf::Vec3d cellCenter = cells[gcIdx].center() - offset; - cvf::Vec3d faceNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling; + cvf::Vec3d faceCenter; + cvf::Vec3d faceNormal; + getFaceCenterAndNormal( gcIdx, directions[dir], faceCenter, faceNormal ); if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT ) { @@ -195,29 +206,33 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode resultValue += 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 ) { - faceNormal *= resultValue; + faceNormalScaled *= resultValue; } else if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT_LOG ) { - faceNormal *= ( 1.0 - static_cast( std::signbit( resultValue ) ) * 2.0 ) * - scaleLogarithmically( std::abs( resultValue ) ); + faceNormalScaled *= ( 1.0 - static_cast( std::signbit( resultValue ) ) * 2.0 ) * + scaleLogarithmically( std::abs( resultValue ) ); } - aggregatedVector += faceNormal; - aggregatedResult += ( faceCenter - cellCenter ).getNormalized() * resultValue; + aggregatedVector += faceNormalScaled; + + // 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( - ElementVectorResultVisualization( cells[gcIdx].center() - offset, + ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( cells[gcIdx].center() ), aggregatedVector, aggregatedResult.length(), std::cbrt( cells[gcIdx].volume() / 3.0 ) ) ); @@ -259,10 +274,9 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode cvf::Vec3d connCenter = static_cast( cvf::GeometryTools::computePolygonCenter( conn.polygon() ) ); - cvf::Vec3d faceCenter = cells[conn.c1GlobIdx()].faceCenter( conn.face() ) - offset; - cvf::Vec3d cellCenter = cells[conn.c1GlobIdx()].center() - offset; - - cvf::Vec3d connNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling; + cvf::Vec3d faceCenter; + cvf::Vec3d connNormal; + getFaceCenterAndNormal( conn.c1GlobIdx(), conn.face(), faceCenter, connNormal ); if ( result->scaleMethod() == RimElementVectorResult::ScaleMethod::RESULT ) { @@ -276,7 +290,7 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode if ( std::abs( resultValue ) >= result->threshold() ) { tensorVisualizations.push_back( - ElementVectorResultVisualization( connCenter - offset, + ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( connCenter ), connNormal, resultValue, std::cbrt( cells[conn.c1GlobIdx()].volume() / 3.0 ) ) ); @@ -288,7 +302,6 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode if ( !tensorVisualizations.empty() ) { cvf::ref partIdx = createPart( *result, tensorVisualizations ); - partIdx->setTransform( m_scaleTransform.p() ); partIdx->updateBoundingBox(); model->addPart( partIdx.p() ); }