#8409 NNC : Make sure NNC flow vector directions are stable

This commit is contained in:
Magne Sjaastad 2022-01-05 15:27:26 +01:00
parent d578771a40
commit 0cb7a157c9
2 changed files with 42 additions and 7 deletions

View File

@ -191,12 +191,21 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
getFaceCenterAndNormal( static_cast<size_t>( gcIdx ), directions[dir], faceCenter, faceNormal ); getFaceCenterAndNormal( static_cast<size_t>( gcIdx ), directions[dir], faceCenter, faceNormal );
faceNormal *= std::abs( resultValue ); faceNormal *= std::abs( resultValue );
bool centerArrow = false;
if ( result->vectorSuraceCrossingLocation() ==
RimElementVectorResult::VectorSurfaceCrossingLocation::VECTOR_CENTER &&
result->vectorView() == RimElementVectorResult::VectorView::PER_FACE )
{
centerArrow = true;
}
#pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_1 ) #pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_1 )
tensorVisualizations.push_back( tensorVisualizations.push_back(
ElementVectorResultVisualization( faceCenter, ElementVectorResultVisualization( faceCenter,
faceNormal, faceNormal,
resultValue, resultValue,
std::cbrt( cells[gcIdx].volume() / 3.0 ) ) ); std::cbrt( cells[gcIdx].volume() / 3.0 ),
centerArrow ) );
} }
} }
} }
@ -223,12 +232,20 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
} }
if ( aggregatedResult.length() >= result->threshold() ) if ( aggregatedResult.length() >= result->threshold() )
{ {
bool centerArrow = false;
if ( result->vectorSuraceCrossingLocation() ==
RimElementVectorResult::VectorSurfaceCrossingLocation::VECTOR_CENTER )
{
centerArrow = true;
}
#pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_2 ) #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,
aggregatedResult.length(), aggregatedResult.length(),
std::cbrt( cells[gcIdx].volume() / 3.0 ) ) ); std::cbrt( cells[gcIdx].volume() / 3.0 ),
centerArrow ) );
} }
} }
} }
@ -280,12 +297,25 @@ void RivElementVectorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::Mode
if ( std::abs( resultValue ) >= result->threshold() ) if ( std::abs( resultValue ) >= result->threshold() )
{ {
bool centerArrow = false;
if ( result->vectorView() == RimElementVectorResult::VectorView::CELL_CENTER_TOTAL )
{
centerArrow = true;
}
else if ( result->vectorView() == RimElementVectorResult::VectorView::PER_FACE )
{
if ( result->vectorSuraceCrossingLocation() ==
RimElementVectorResult::VectorSurfaceCrossingLocation::VECTOR_CENTER )
centerArrow = true;
}
#pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_nnc ) #pragma omp critical( critical_section_RivElementVectorResultPartMgr_add_nnc )
tensorVisualizations.push_back( tensorVisualizations.push_back(
ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( connCenter ), ElementVectorResultVisualization( displayCordXf->transformToDisplayCoord( connCenter ),
connNormal, connNormal,
resultValue, resultValue,
std::cbrt( cells[conn.c1GlobIdx()].volume() / 3.0 ) ) ); std::cbrt( cells[conn.c1GlobIdx()].volume() / 3.0 ),
centerArrow ) );
} }
} }
} }
@ -430,8 +460,7 @@ std::array<cvf::Vec3f, 7>
cvf::Vec3f headTop = evrViz.faceCenter + evrViz.faceNormal; cvf::Vec3f headTop = evrViz.faceCenter + evrViz.faceNormal;
cvf::Vec3f shaftStart = evrViz.faceCenter; cvf::Vec3f shaftStart = evrViz.faceCenter;
if ( result->vectorSuraceCrossingLocation() == RimElementVectorResult::VectorSurfaceCrossingLocation::VECTOR_CENTER && if ( evrViz.centerArrow )
result->vectorView() == RimElementVectorResult::VectorView::PER_FACE )
{ {
headTop = evrViz.faceCenter + evrViz.faceNormal / 2.0; headTop = evrViz.faceCenter + evrViz.faceNormal / 2.0;
shaftStart = evrViz.faceCenter - evrViz.faceNormal / 2.0; shaftStart = evrViz.faceCenter - evrViz.faceNormal / 2.0;
@ -439,7 +468,7 @@ std::array<cvf::Vec3f, 7>
// Flip arrow for negative results and if the vector is not aggregated (in which case we do not have any negative // Flip arrow for negative results and if the vector is not aggregated (in which case we do not have any negative
// result) // result)
if ( evrViz.result < 0 && result->vectorView() != RimElementVectorResult::VectorView::CELL_CENTER_TOTAL ) if ( evrViz.result < 0 )
{ {
std::swap( headTop, shaftStart ); std::swap( headTop, shaftStart );
} }

View File

@ -54,11 +54,16 @@ public:
private: private:
struct ElementVectorResultVisualization struct ElementVectorResultVisualization
{ {
ElementVectorResultVisualization( cvf::Vec3d faceCenter, cvf::Vec3d faceNormal, double result, double approximateCellLength ) ElementVectorResultVisualization( cvf::Vec3d faceCenter,
cvf::Vec3d faceNormal,
double result,
double approximateCellLength,
bool centerArrow )
: faceCenter( faceCenter ) : faceCenter( faceCenter )
, faceNormal( faceNormal ) , faceNormal( faceNormal )
, result( result ) , result( result )
, approximateCellLength( approximateCellLength ) , approximateCellLength( approximateCellLength )
, centerArrow( centerArrow )
{ {
} }
@ -66,6 +71,7 @@ private:
cvf::Vec3f faceNormal; cvf::Vec3f faceNormal;
double result; double result;
double approximateCellLength; double approximateCellLength;
bool centerArrow;
}; };
private: private: