mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Merge pull request #8402 from OPM/8401-flow-vector-result
#8401 Flow Vector Result: Handle empty results for first time step Use OpenMP for vector calculations Janitor: Use field of double instead of float to avoid rounding errors. If float is used in field, the current editor is has rounding effects that makes the text representation of 0.1 turn into 0.09999999....
This commit is contained in:
@@ -121,7 +121,8 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
if ( fluidIndex == 0 ) directions.push_back( cvf::StructGridInterface::POS_I );
|
if ( fluidIndex == 0 ) directions.push_back( cvf::StructGridInterface::POS_I );
|
||||||
|
|
||||||
auto candidate = addresses[0 + fluidIndex];
|
auto candidate = addresses[0 + fluidIndex];
|
||||||
if ( resultsData->hasResultEntry( candidate ) )
|
if ( resultsData->hasResultEntry( candidate ) &&
|
||||||
|
!resultsData->cellScalarResults( candidate, timeStepIndex ).empty() )
|
||||||
{
|
{
|
||||||
resultAddresses.push_back( candidate );
|
resultAddresses.push_back( candidate );
|
||||||
}
|
}
|
||||||
@@ -130,7 +131,8 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
{
|
{
|
||||||
if ( fluidIndex == 0 ) directions.push_back( cvf::StructGridInterface::POS_J );
|
if ( fluidIndex == 0 ) directions.push_back( cvf::StructGridInterface::POS_J );
|
||||||
auto candidate = addresses[1 + fluidIndex];
|
auto candidate = addresses[1 + fluidIndex];
|
||||||
if ( resultsData->hasResultEntry( candidate ) )
|
if ( resultsData->hasResultEntry( candidate ) &&
|
||||||
|
!resultsData->cellScalarResults( candidate, timeStepIndex ).empty() )
|
||||||
{
|
{
|
||||||
resultAddresses.push_back( candidate );
|
resultAddresses.push_back( candidate );
|
||||||
}
|
}
|
||||||
@@ -139,7 +141,8 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
{
|
{
|
||||||
if ( fluidIndex == 0 ) directions.push_back( cvf::StructGridInterface::POS_K );
|
if ( fluidIndex == 0 ) directions.push_back( cvf::StructGridInterface::POS_K );
|
||||||
auto candidate = addresses[2 + fluidIndex];
|
auto candidate = addresses[2 + fluidIndex];
|
||||||
if ( resultsData->hasResultEntry( candidate ) )
|
if ( resultsData->hasResultEntry( candidate ) &&
|
||||||
|
!resultsData->cellScalarResults( candidate, timeStepIndex ).empty() )
|
||||||
{
|
{
|
||||||
resultAddresses.push_back( candidate );
|
resultAddresses.push_back( candidate );
|
||||||
}
|
}
|
||||||
@@ -161,7 +164,8 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
faceNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling;
|
faceNormal = ( faceCenter - cellCenter ).getNormalized() * arrowScaling;
|
||||||
};
|
};
|
||||||
|
|
||||||
for ( size_t gcIdx = 0; gcIdx < cells.size(); ++gcIdx )
|
#pragma omp parallel for
|
||||||
|
for ( int gcIdx = 0; gcIdx < static_cast<int>( cells.size() ); ++gcIdx )
|
||||||
{
|
{
|
||||||
if ( !cells[gcIdx].isInvalid() && activeCellInfo->isActive( gcIdx ) )
|
if ( !cells[gcIdx].isInvalid() && activeCellInfo->isActive( gcIdx ) )
|
||||||
{
|
{
|
||||||
@@ -181,9 +185,10 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
{
|
{
|
||||||
cvf::Vec3d faceCenter;
|
cvf::Vec3d faceCenter;
|
||||||
cvf::Vec3d faceNormal;
|
cvf::Vec3d faceNormal;
|
||||||
getFaceCenterAndNormal( gcIdx, directions[dir], faceCenter, faceNormal );
|
getFaceCenterAndNormal( static_cast<size_t>( gcIdx ), directions[dir], faceCenter, faceNormal );
|
||||||
faceNormal *= std::abs( resultValue );
|
faceNormal *= std::abs( resultValue );
|
||||||
|
|
||||||
|
#pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_1 )
|
||||||
tensorVisualizations.push_back(
|
tensorVisualizations.push_back(
|
||||||
ElementVectorResultVisualization( faceCenter,
|
ElementVectorResultVisualization( faceCenter,
|
||||||
faceNormal,
|
faceNormal,
|
||||||
@@ -215,6 +220,7 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
}
|
}
|
||||||
if ( aggregatedResult.length() >= result->threshold() )
|
if ( aggregatedResult.length() >= result->threshold() )
|
||||||
{
|
{
|
||||||
|
#pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_2 )
|
||||||
tensorVisualizations.push_back(
|
tensorVisualizations.push_back(
|
||||||
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( cells[gcIdx].center() ),
|
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( cells[gcIdx].center() ),
|
||||||
aggregatedVector,
|
aggregatedVector,
|
||||||
@@ -245,7 +251,8 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( size_t nIdx = 0; nIdx < nncData->eclipseConnectionCount(); ++nIdx )
|
#pragma omp parallel for
|
||||||
|
for ( int nIdx = 0; nIdx < static_cast<int>( nncData->eclipseConnectionCount() ); ++nIdx )
|
||||||
{
|
{
|
||||||
const RigConnection& conn = nncData->availableConnections()[nIdx];
|
const RigConnection& conn = nncData->availableConnections()[nIdx];
|
||||||
if ( conn.polygon().size() )
|
if ( conn.polygon().size() )
|
||||||
@@ -253,7 +260,7 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
double resultValue = 0.0;
|
double resultValue = 0.0;
|
||||||
for ( size_t flIdx = 0; flIdx < nncResultVals.size(); flIdx++ )
|
for ( size_t flIdx = 0; flIdx < nncResultVals.size(); flIdx++ )
|
||||||
{
|
{
|
||||||
if ( nIdx < nncResultVals.at( flIdx )->at( timeStepIndex ).size() )
|
if ( nIdx < static_cast<int>( nncResultVals.at( flIdx )->at( timeStepIndex ).size() ) )
|
||||||
{
|
{
|
||||||
resultValue += nncResultVals.at( flIdx )->at( timeStepIndex )[nIdx];
|
resultValue += nncResultVals.at( flIdx )->at( timeStepIndex )[nIdx];
|
||||||
}
|
}
|
||||||
@@ -269,6 +276,7 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
|
|||||||
|
|
||||||
if ( std::abs( resultValue ) >= result->threshold() )
|
if ( std::abs( resultValue ) >= result->threshold() )
|
||||||
{
|
{
|
||||||
|
#pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_nnc )
|
||||||
tensorVisualizations.push_back(
|
tensorVisualizations.push_back(
|
||||||
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( connCenter ),
|
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( connCenter ),
|
||||||
connNormal,
|
connNormal,
|
||||||
|
@@ -94,13 +94,13 @@ RimElementVectorResult::RimElementVectorResult()
|
|||||||
CAF_PDM_InitField( &m_showVectorJ, "ShowVectorJ", true, "J" );
|
CAF_PDM_InitField( &m_showVectorJ, "ShowVectorJ", true, "J" );
|
||||||
CAF_PDM_InitField( &m_showVectorK, "ShowVectorK", true, "K" );
|
CAF_PDM_InitField( &m_showVectorK, "ShowVectorK", true, "K" );
|
||||||
CAF_PDM_InitField( &m_showNncData, "ShowNncData", true, "Show NNC Data" );
|
CAF_PDM_InitField( &m_showNncData, "ShowNncData", true, "Show NNC Data" );
|
||||||
CAF_PDM_InitField( &m_threshold, "Threshold", 0.0f, "Threshold" );
|
CAF_PDM_InitField( &m_threshold, "Threshold", 0.0, "Threshold" );
|
||||||
|
|
||||||
CAF_PDM_InitFieldNoDefault( &m_vectorColor, "VectorColor", "Color" );
|
CAF_PDM_InitFieldNoDefault( &m_vectorColor, "VectorColor", "Color" );
|
||||||
cvf::Color3f defaultUniformColor = cvf::Color3f::BLACK;
|
cvf::Color3f defaultUniformColor = cvf::Color3f::BLACK;
|
||||||
CAF_PDM_InitField( &m_uniformVectorColor, "UniformVectorColor", defaultUniformColor, "Uniform Vector Color" );
|
CAF_PDM_InitField( &m_uniformVectorColor, "UniformVectorColor", defaultUniformColor, "Uniform Vector Color" );
|
||||||
|
|
||||||
CAF_PDM_InitField( &m_sizeScale, "SizeScale", 1.0f, "Size Scale" );
|
CAF_PDM_InitField( &m_sizeScale, "SizeScale", 1.0, "Size Scale" );
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@@ -206,7 +206,7 @@ RimElementVectorResult::VectorSurfaceCrossingLocation RimElementVectorResult::ve
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
float RimElementVectorResult::threshold() const
|
double RimElementVectorResult::threshold() const
|
||||||
{
|
{
|
||||||
return m_threshold();
|
return m_threshold();
|
||||||
}
|
}
|
||||||
@@ -214,7 +214,7 @@ float RimElementVectorResult::threshold() const
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
float RimElementVectorResult::sizeScale() const
|
double RimElementVectorResult::sizeScale() const
|
||||||
{
|
{
|
||||||
return m_sizeScale();
|
return m_sizeScale();
|
||||||
}
|
}
|
||||||
|
@@ -77,8 +77,8 @@ public:
|
|||||||
bool showVectorK() const;
|
bool showVectorK() const;
|
||||||
bool showNncData() const;
|
bool showNncData() const;
|
||||||
VectorSurfaceCrossingLocation vectorSuraceCrossingLocation() const;
|
VectorSurfaceCrossingLocation vectorSuraceCrossingLocation() const;
|
||||||
float threshold() const;
|
double threshold() const;
|
||||||
float sizeScale() const;
|
double sizeScale() const;
|
||||||
TensorColors vectorColors() const;
|
TensorColors vectorColors() const;
|
||||||
|
|
||||||
const cvf::Color3f& getUniformVectorColor() const;
|
const cvf::Color3f& getUniformVectorColor() const;
|
||||||
@@ -108,10 +108,10 @@ private:
|
|||||||
caf::PdmField<bool> m_showVectorK;
|
caf::PdmField<bool> m_showVectorK;
|
||||||
caf::PdmField<bool> m_showNncData;
|
caf::PdmField<bool> m_showNncData;
|
||||||
caf::PdmField<caf::AppEnum<VectorSurfaceCrossingLocation>> m_vectorSurfaceCrossingLocation;
|
caf::PdmField<caf::AppEnum<VectorSurfaceCrossingLocation>> m_vectorSurfaceCrossingLocation;
|
||||||
caf::PdmField<float> m_threshold;
|
caf::PdmField<double> m_threshold;
|
||||||
caf::PdmField<caf::AppEnum<TensorColors>> m_vectorColor;
|
caf::PdmField<caf::AppEnum<TensorColors>> m_vectorColor;
|
||||||
caf::PdmField<cvf::Color3f> m_uniformVectorColor;
|
caf::PdmField<cvf::Color3f> m_uniformVectorColor;
|
||||||
caf::PdmField<float> m_sizeScale;
|
caf::PdmField<double> m_sizeScale;
|
||||||
caf::PdmField<RimRegularLegendConfig::RangeModeEnum> m_rangeMode;
|
caf::PdmField<RimRegularLegendConfig::RangeModeEnum> m_rangeMode;
|
||||||
caf::PdmChildField<RimRegularLegendConfig*> m_legendConfig;
|
caf::PdmChildField<RimRegularLegendConfig*> m_legendConfig;
|
||||||
};
|
};
|
||||||
|
@@ -264,6 +264,8 @@ bool RigCaseCellResultCalculator::computeDivideByCellFaceArea( RigMainGrid*
|
|||||||
cvf::ref<RigResultModifier> resultModifier =
|
cvf::ref<RigResultModifier> resultModifier =
|
||||||
RigResultModifierFactory::createResultModifier( destination, gridIdx, porosityModel, fIdx, address );
|
RigResultModifierFactory::createResultModifier( destination, gridIdx, porosityModel, fIdx, address );
|
||||||
|
|
||||||
|
if ( resultModifier.isNull() ) continue;
|
||||||
|
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for ( int localGridCellIdx = 0; localGridCellIdx < static_cast<int>( grid->cellCount() ); localGridCellIdx++ )
|
for ( int localGridCellIdx = 0; localGridCellIdx < static_cast<int>( grid->cellCount() ); localGridCellIdx++ )
|
||||||
{
|
{
|
||||||
|
@@ -65,6 +65,8 @@ cvf::ref<RigResultModifier> RigResultModifierFactory::createResultModifier( RigE
|
|||||||
resultValues = &( scalarSetResults->at( timeStepIndex ) );
|
resultValues = &( scalarSetResults->at( timeStepIndex ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( resultValues->empty() ) return nullptr;
|
||||||
|
|
||||||
bool useGlobalActiveIndex = eclipseCase->results( porosityModel )->isUsingGlobalActiveIndex( resVarAddr );
|
bool useGlobalActiveIndex = eclipseCase->results( porosityModel )->isUsingGlobalActiveIndex( resVarAddr );
|
||||||
if ( useGlobalActiveIndex )
|
if ( useGlobalActiveIndex )
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user