Streamlines : Show dominant flow phase velocity

This commit is contained in:
Magne Sjaastad
2021-02-26 10:29:03 +01:00
parent 4a9e759e4b
commit bde6fc7d9c
4 changed files with 114 additions and 64 deletions

View File

@@ -97,6 +97,7 @@ void RivStreamlinesPartMgr::appendDynamicGeometryPartsToModel( cvf::ModelBasicLi
streamline.appendTracerPoint( tracer.tracerPoints()[i].position() ); streamline.appendTracerPoint( tracer.tracerPoints()[i].position() );
streamline.appendAbsVelocity( tracer.tracerPoints()[i].absValue() ); streamline.appendAbsVelocity( tracer.tracerPoints()[i].absValue() );
streamline.appendDirection( tracer.tracerPoints()[i].direction() ); streamline.appendDirection( tracer.tracerPoints()[i].direction() );
streamline.appendPhase( tracer.tracerPoints()[i].phaseType() );
} }
m_streamlines.push_back( streamline ); m_streamlines.push_back( streamline );
} }
@@ -257,6 +258,27 @@ void RivStreamlinesPartMgr::createResultColorTextureCoords( cvf::Vec2fArray*
for ( size_t i = 0; i < streamline.countTracerPoints(); i++ ) for ( size_t i = 0; i < streamline.countTracerPoints(); i++ )
{ {
cvf::Vec2f texCoord = mapper->mapToTextureCoord( streamline.getAbsVelocity( i ) ); cvf::Vec2f texCoord = mapper->mapToTextureCoord( streamline.getAbsVelocity( i ) );
if ( streamlineCollection->colorMode() == RimStreamlineInViewCollection::ColorMode::PHASE_COLORS )
{
double phaseValue = 0.0;
auto phase = streamline.getPhase( i );
if ( phase == RiaDefines::PhaseType::GAS_PHASE )
{
phaseValue = 1.0;
}
else if ( phase == RiaDefines::PhaseType::OIL_PHASE )
{
phaseValue = 0.5;
}
else if ( phase == RiaDefines::PhaseType::WATER_PHASE )
{
phaseValue = 0.0;
}
texCoord.x() = phaseValue;
}
if ( streamlineCollection && if ( streamlineCollection &&
streamlineCollection->visualizationMode() == RimStreamlineInViewCollection::VisualizationMode::VECTORS ) streamlineCollection->visualizationMode() == RimStreamlineInViewCollection::VisualizationMode::VECTORS )
{ {
@@ -682,6 +704,14 @@ void RivStreamlinesPartMgr::Streamline::appendDirection( cvf::Vec3d direction )
directions.push_back( direction ); directions.push_back( direction );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RivStreamlinesPartMgr::Streamline::appendPhase( RiaDefines::PhaseType phase )
{
dominantPhases.push_back( phase );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -690,6 +720,7 @@ void RivStreamlinesPartMgr::Streamline::clear()
tracerPoints.clear(); tracerPoints.clear();
absVelocities.clear(); absVelocities.clear();
directions.clear(); directions.clear();
dominantPhases.clear();
delete part.p(); delete part.p();
} }
@@ -725,6 +756,14 @@ cvf::Vec3d RivStreamlinesPartMgr::Streamline::getDirection( size_t index ) const
return directions[index]; return directions[index];
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RiaDefines::PhaseType RivStreamlinesPartMgr::Streamline::getPhase( size_t index ) const
{
return dominantPhases[index];
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -132,26 +132,31 @@ private:
{ {
Streamline() { animIndex = 0; }; Streamline() { animIndex = 0; };
void appendTracerPoint( cvf::Vec3d point ); void appendTracerPoint( cvf::Vec3d point );
void appendAbsVelocity( double velocity ); void appendAbsVelocity( double velocity );
void appendDirection( cvf::Vec3d direction ); void appendDirection( cvf::Vec3d direction );
void clear(); void appendPhase( RiaDefines::PhaseType phase );
cvf::ref<cvf::Part> getPart(); void clear();
cvf::Vec3d getTracerPoint( size_t index ) const; cvf::ref<cvf::Part> getPart();
double getAbsVelocity( size_t index ) const; cvf::Vec3d getTracerPoint( size_t index ) const;
cvf::Vec3d getDirection( size_t index ) const; double getAbsVelocity( size_t index ) const;
size_t countTracerPoints() const; cvf::Vec3d getDirection( size_t index ) const;
void setPart( cvf::ref<cvf::Part> part ); RiaDefines::PhaseType getPhase( size_t index ) const;
size_t getAnimationIndex() const;
void incrementAnimationIndex( size_t increment = 1.0 ); size_t countTracerPoints() const;
void setAnimationIndex( size_t index ); void setPart( cvf::ref<cvf::Part> part );
size_t getAnimationIndex() const;
void incrementAnimationIndex( size_t increment = 1.0 );
void setAnimationIndex( size_t index );
private: private:
std::vector<cvf::Vec3d> tracerPoints; std::vector<cvf::Vec3d> tracerPoints;
std::vector<double> absVelocities; std::vector<double> absVelocities;
std::vector<cvf::Vec3d> directions; std::vector<cvf::Vec3d> directions;
cvf::ref<cvf::Part> part; std::vector<RiaDefines::PhaseType> dominantPhases;
size_t animIndex;
cvf::ref<cvf::Part> part;
size_t animIndex;
}; };
private: private:

View File

@@ -39,8 +39,6 @@
#include "RiuViewer.h" #include "RiuViewer.h"
#include "cafPdmFieldScriptingCapability.h"
#include "cafPdmObjectScriptingCapability.h"
#include "cafPdmUiDoubleSliderEditor.h" #include "cafPdmUiDoubleSliderEditor.h"
#include "cafPdmUiSliderEditor.h" #include "cafPdmUiSliderEditor.h"
#include "cafPdmUiTreeOrdering.h" #include "cafPdmUiTreeOrdering.h"
@@ -73,7 +71,15 @@ void AppEnum<RimStreamlineInViewCollection::StreamlinePhaseType>::setUp()
addItem( RimStreamlineInViewCollection::StreamlinePhaseType::GAS, "GAS", "Gas" ); addItem( RimStreamlineInViewCollection::StreamlinePhaseType::GAS, "GAS", "Gas" );
addItem( RimStreamlineInViewCollection::StreamlinePhaseType::WATER, "WATER", "Water" ); addItem( RimStreamlineInViewCollection::StreamlinePhaseType::WATER, "WATER", "Water" );
addItem( RimStreamlineInViewCollection::StreamlinePhaseType::COMBINED, "COMBINED", "Combined" ); addItem( RimStreamlineInViewCollection::StreamlinePhaseType::COMBINED, "COMBINED", "Combined" );
setDefault( RimStreamlineInViewCollection::StreamlinePhaseType::OIL ); setDefault( RimStreamlineInViewCollection::StreamlinePhaseType::COMBINED );
}
template <>
void AppEnum<RimStreamlineInViewCollection::ColorMode>::setUp()
{
addItem( RimStreamlineInViewCollection::ColorMode::PHASE_COLORS, "PHASE_COLORS", "Dominant Phase" );
addItem( RimStreamlineInViewCollection::ColorMode::VELOCITY, "VELOCITY", "Velocity" );
setDefault( RimStreamlineInViewCollection::ColorMode::PHASE_COLORS );
} }
} // namespace caf } // namespace caf
@@ -87,40 +93,42 @@ RimStreamlineInViewCollection::RimStreamlineInViewCollection()
: m_shouldGenerateTracers( false ) : m_shouldGenerateTracers( false )
, m_currentTimestep( -1 ) , m_currentTimestep( -1 )
{ {
CAF_PDM_InitScriptableObject( "Streamlines", ":/Erase.png", "", "" ); CAF_PDM_InitObject( "Streamlines", ":/Erase.png", "", "" );
CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" );
m_legendConfig = new RimRegularLegendConfig(); m_legendConfig = new RimRegularLegendConfig();
m_legendConfig->setMappingMode( RimRegularLegendConfig::MappingType::LOG10_CONTINUOUS );
m_legendConfig.uiCapability()->setUiHidden( true ); m_legendConfig.uiCapability()->setUiHidden( true );
CAF_PDM_InitScriptableFieldNoDefault( &m_collectionName, "Name", "Name", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_collectionName, "Name", "Name", "", "", "" );
m_collectionName = "Streamlines"; m_collectionName = "Streamlines";
m_collectionName.uiCapability()->setUiReadOnly( true ); m_collectionName.uiCapability()->setUiReadOnly( true );
CAF_PDM_InitScriptableFieldNoDefault( &m_flowThreshold, "FlowThreshold", "Flow Threshold [m/day]", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_flowThreshold, "FlowThreshold", "Flow Threshold [m/day]", "", "", "" );
m_flowThreshold = 0.001; m_flowThreshold = 0.01;
CAF_PDM_InitScriptableFieldNoDefault( &m_lengthThreshold, "LengthThreshold", "Minimum Length [m]", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_lengthThreshold, "LengthThreshold", "Minimum Length [m]", "", "", "" );
m_lengthThreshold = 100.0; m_lengthThreshold = 100.0;
CAF_PDM_InitScriptableFieldNoDefault( &m_resolution, "Resolution", "Resolution [days]", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_resolution, "Resolution", "Resolution [days]", "", "", "" );
m_resolution = 20.0; m_resolution = 20.0;
CAF_PDM_InitScriptableFieldNoDefault( &m_maxDays, "MaxDays", "Max Days", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_maxDays, "MaxDays", "Max Days", "", "", "" );
m_maxDays = 50000; m_maxDays = 50000;
CAF_PDM_InitScriptableFieldNoDefault( &m_useProducers, "UseProducers", "Producer Wells", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_useProducers, "UseProducers", "Producer Wells", "", "", "" );
m_useProducers = true; m_useProducers = true;
CAF_PDM_InitScriptableFieldNoDefault( &m_useInjectors, "UseInjectors", "Injector Wells", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_useInjectors, "UseInjectors", "Injector Wells", "", "", "" );
m_useInjectors = true; m_useInjectors = true;
CAF_PDM_InitScriptableField( &m_phases, "Phase", StreamlinePhaseTypeEnum( StreamlinePhaseType::OIL ), "Phase", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_phases, "Phase", "Phase", "", "", "" );
CAF_PDM_InitField( &m_isActive, "isActive", false, "Active", "", "", "" ); CAF_PDM_InitField( &m_isActive, "isActive", false, "Active", "", "", "" );
m_isActive.uiCapability()->setUiHidden( true ); m_isActive.uiCapability()->setUiHidden( true );
CAF_PDM_InitFieldNoDefault( &m_visualizationMode, "VisualizationMode", "Visualization Mode", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_visualizationMode, "VisualizationMode", "Visualization Mode", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_colorMode, "ColorMode", "Colors", "", "", "" );
CAF_PDM_InitFieldNoDefault( &m_animationSpeed, "AnimationSpeed", "Animation Speed", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_animationSpeed, "AnimationSpeed", "Animation Speed", "", "", "" );
m_animationSpeed.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); m_animationSpeed.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() );
@@ -139,11 +147,7 @@ RimStreamlineInViewCollection::RimStreamlineInViewCollection()
m_tracerLength.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); m_tracerLength.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() );
m_tracerLength = 100; m_tracerLength = 100;
CAF_PDM_InitFieldNoDefault( &m_injectionDeltaTime, "InjectionDeltaTime", "Pause between injections", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_streamlines, "Streamlines", "Streamlines", "", "", "" );
m_injectionDeltaTime.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() );
m_injectionDeltaTime = 500;
CAF_PDM_InitScriptableFieldNoDefault( &m_streamlines, "Streamlines", "Streamlines", "", "", "" );
m_streamlines.uiCapability()->setUiTreeHidden( true ); m_streamlines.uiCapability()->setUiTreeHidden( true );
m_streamlines.xmlCapability()->disableIO(); m_streamlines.xmlCapability()->disableIO();
@@ -232,6 +236,14 @@ RimStreamlineInViewCollection::VisualizationMode RimStreamlineInViewCollection::
return m_visualizationMode(); return m_visualizationMode();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimStreamlineInViewCollection::ColorMode RimStreamlineInViewCollection::colorMode() const
{
return m_colorMode();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -297,8 +309,11 @@ void RimStreamlineInViewCollection::updateLegendRangesTextAndVisibility( RiuView
double negClosestToZero = -HUGE_VAL; double negClosestToZero = -HUGE_VAL;
m_legendConfig->setClosestToZeroValues( posClosestToZero, negClosestToZero, posClosestToZero, negClosestToZero ); m_legendConfig->setClosestToZeroValues( posClosestToZero, negClosestToZero, posClosestToZero, negClosestToZero );
nativeOrOverrideViewer->addColorLegendToBottomLeftCorner( m_legendConfig->titledOverlayFrame(), if ( colorMode() == ColorMode::VELOCITY )
isUsingOverrideViewer ); {
nativeOrOverrideViewer->addColorLegendToBottomLeftCorner( m_legendConfig->titledOverlayFrame(),
isUsingOverrideViewer );
}
} }
} }
@@ -348,14 +363,6 @@ size_t RimStreamlineInViewCollection::tracerLength() const
return m_tracerLength(); return m_tracerLength();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
size_t RimStreamlineInViewCollection::injectionDeltaTime() const
{
return m_injectionDeltaTime();
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -560,12 +567,12 @@ void RimStreamlineInViewCollection::defineUiOrdering( QString uiConfigName, caf:
caf::PdmUiGroup* visualizationGroup = uiOrdering.addNewGroup( "Visualization Settings" ); caf::PdmUiGroup* visualizationGroup = uiOrdering.addNewGroup( "Visualization Settings" );
visualizationGroup->add( &m_visualizationMode ); visualizationGroup->add( &m_visualizationMode );
visualizationGroup->add( &m_colorMode );
if ( m_visualizationMode() == VisualizationMode::ANIMATION ) if ( m_visualizationMode() == VisualizationMode::ANIMATION )
{ {
visualizationGroup->add( &m_animationSpeed ); visualizationGroup->add( &m_animationSpeed );
visualizationGroup->add( &m_tracerLength ); visualizationGroup->add( &m_tracerLength );
visualizationGroup->add( &m_injectionDeltaTime );
} }
if ( m_visualizationMode() == VisualizationMode::MANUAL ) if ( m_visualizationMode() == VisualizationMode::MANUAL )
{ {
@@ -623,15 +630,6 @@ void RimStreamlineInViewCollection::defineEditorAttribute( const caf::PdmFieldHa
myAttr->m_maximum = static_cast<int>( 1000 ); myAttr->m_maximum = static_cast<int>( 1000 );
} }
} }
else if ( field == &m_injectionDeltaTime )
{
caf::PdmUiSliderEditorAttribute* myAttr = dynamic_cast<caf::PdmUiSliderEditorAttribute*>( attribute );
if ( myAttr )
{
myAttr->m_minimum = 1;
myAttr->m_maximum = static_cast<int>( 1000 );
}
}
else if ( field == &m_scaleFactor ) else if ( field == &m_scaleFactor )
{ {
caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast<caf::PdmUiDoubleSliderEditorAttribute*>( attribute ); caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast<caf::PdmUiDoubleSliderEditorAttribute*>( attribute );
@@ -650,8 +648,7 @@ void RimStreamlineInViewCollection::fieldChangedByUi( const caf::PdmFieldHandle*
const QVariant& oldValue, const QVariant& oldValue,
const QVariant& newValue ) const QVariant& newValue )
{ {
if ( changedField == &m_animationSpeed || changedField == &m_animationIndex || if ( changedField == &m_animationSpeed || changedField == &m_animationIndex || changedField == &m_tracerLength )
changedField == &m_injectionDeltaTime || changedField == &m_tracerLength )
{ {
return; return;
} }

View File

@@ -60,6 +60,13 @@ public:
}; };
using StreamlinePhaseTypeEnum = caf::AppEnum<StreamlinePhaseType>; using StreamlinePhaseTypeEnum = caf::AppEnum<StreamlinePhaseType>;
enum class ColorMode
{
PHASE_COLORS = 0,
VELOCITY,
};
using ColorModeEnum = caf::AppEnum<ColorMode>;
public: public:
RimStreamlineInViewCollection(); RimStreamlineInViewCollection();
~RimStreamlineInViewCollection() override; ~RimStreamlineInViewCollection() override;
@@ -70,11 +77,11 @@ public:
std::list<RiaDefines::PhaseType> phases() const; std::list<RiaDefines::PhaseType> phases() const;
VisualizationMode visualizationMode() const; VisualizationMode visualizationMode() const;
ColorMode colorMode() const;
size_t animationSpeed() const; size_t animationSpeed() const;
size_t animationIndex() const; size_t animationIndex() const;
double scaleFactor() const; double scaleFactor() const;
size_t tracerLength() const; size_t tracerLength() const;
size_t injectionDeltaTime() const;
bool isActive() const; bool isActive() const;
@@ -119,11 +126,13 @@ private:
caf::PdmChildArrayField<RimStreamline*> m_streamlines; caf::PdmChildArrayField<RimStreamline*> m_streamlines;
caf::PdmField<StreamlinePhaseTypeEnum> m_phases; caf::PdmField<StreamlinePhaseTypeEnum> m_phases;
caf::PdmField<VisualizationModeEnum> m_visualizationMode; caf::PdmField<VisualizationModeEnum> m_visualizationMode;
caf::PdmField<size_t> m_animationSpeed; caf::PdmField<ColorModeEnum> m_colorMode;
caf::PdmField<size_t> m_animationIndex;
caf::PdmField<double> m_scaleFactor; // Animation
caf::PdmField<size_t> m_tracerLength; caf::PdmField<size_t> m_animationSpeed;
caf::PdmField<size_t> m_injectionDeltaTime; caf::PdmField<size_t> m_animationIndex;
caf::PdmField<double> m_scaleFactor;
caf::PdmField<size_t> m_tracerLength;
size_t m_maxAnimationIndex; size_t m_maxAnimationIndex;