mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#6072 Well Completions : Make sure valves are included if they are located outside grid cells
This commit is contained in:
parent
4395ee899c
commit
31ebeba0a3
@ -1108,9 +1108,13 @@ std::vector<SubSegmentIntersectionInfo>
|
|||||||
const std::vector<double>& mds = wellPathGeometry->measureDepths();
|
const std::vector<double>& mds = wellPathGeometry->measureDepths();
|
||||||
CVF_ASSERT( !coords.empty() && !mds.empty() );
|
CVF_ASSERT( !coords.empty() && !mds.empty() );
|
||||||
|
|
||||||
std::vector<WellPathCellIntersectionInfo> intersections =
|
std::vector<WellPathCellIntersectionInfo> intersectionsA =
|
||||||
RigWellPathIntersectionTools::findCellIntersectionInfosAlongPath( eclipseCase->eclipseCaseData(), coords, mds );
|
RigWellPathIntersectionTools::findCellIntersectionInfosAlongPath( eclipseCase->eclipseCaseData(), coords, mds );
|
||||||
|
|
||||||
|
const RigMainGrid* mainGrid = eclipseCase->mainGrid();
|
||||||
|
std::vector<WellPathCellIntersectionInfo> intersections =
|
||||||
|
RigWellPathIntersectionTools::buildContinuousIntersections( intersectionsA, mainGrid );
|
||||||
|
|
||||||
if ( wellPath->perforationIntervalCollection()->mswParameters()->referenceMDType() ==
|
if ( wellPath->perforationIntervalCollection()->mswParameters()->referenceMDType() ==
|
||||||
RimMswCompletionParameters::MANUAL_REFERENCE_MD )
|
RimMswCompletionParameters::MANUAL_REFERENCE_MD )
|
||||||
{
|
{
|
||||||
@ -1219,11 +1223,19 @@ std::vector<WellPathCellIntersectionInfo>
|
|||||||
|
|
||||||
const RigMainGrid* grid = eclipseCase->mainGrid();
|
const RigMainGrid* grid = eclipseCase->mainGrid();
|
||||||
|
|
||||||
extraIntersection.intersectionLengthsInCellCS =
|
if ( intersection.globCellIndex < grid->cellCount() )
|
||||||
RigWellPathIntersectionTools::calculateLengthInCell( grid,
|
{
|
||||||
intersection.globCellIndex,
|
extraIntersection.intersectionLengthsInCellCS =
|
||||||
intersectionPoint,
|
RigWellPathIntersectionTools::calculateLengthInCell( grid,
|
||||||
intersection.endPoint );
|
intersection.globCellIndex,
|
||||||
|
intersectionPoint,
|
||||||
|
intersection.endPoint );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
extraIntersection.intersectionLengthsInCellCS = cvf::Vec3d::ZERO;
|
||||||
|
}
|
||||||
|
|
||||||
filteredIntersections.push_back( extraIntersection );
|
filteredIntersections.push_back( extraIntersection );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,3 +150,74 @@ cvf::Vec3d RigWellPathIntersectionTools::calculateLengthInCell( const RigMainGri
|
|||||||
|
|
||||||
return calculateLengthInCell( hexCorners, startPoint, endPoint );
|
return calculateLengthInCell( hexCorners, startPoint, endPoint );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
std::vector<WellPathCellIntersectionInfo> RigWellPathIntersectionTools::buildContinuousIntersections(
|
||||||
|
const std::vector<WellPathCellIntersectionInfo>& originalIntersections,
|
||||||
|
const cvf::StructGridInterface* grid )
|
||||||
|
{
|
||||||
|
std::vector<WellPathCellIntersectionInfo> intersectionsNoGap;
|
||||||
|
|
||||||
|
for ( size_t i = 0; i < originalIntersections.size() - 1; i++ )
|
||||||
|
{
|
||||||
|
const WellPathCellIntersectionInfo& current = originalIntersections[i];
|
||||||
|
const WellPathCellIntersectionInfo& next = originalIntersections[i + 1];
|
||||||
|
|
||||||
|
double distance = std::fabs( current.endMD - next.startMD );
|
||||||
|
double gapInGridThreshold = 0.1;
|
||||||
|
if ( distance > gapInGridThreshold )
|
||||||
|
{
|
||||||
|
WellPathCellIntersectionInfo extraIntersection;
|
||||||
|
|
||||||
|
QString ijkTextCurrent;
|
||||||
|
{
|
||||||
|
size_t i = 0, j = 0, k = 0;
|
||||||
|
if ( grid )
|
||||||
|
{
|
||||||
|
grid->ijkFromCellIndex( current.globCellIndex, &i, &j, &k );
|
||||||
|
}
|
||||||
|
ijkTextCurrent = QString( "(%1 %2 %3)" ).arg( i + 1 ).arg( j + 1 ).arg( k + 1 );
|
||||||
|
}
|
||||||
|
QString ijkTextNext;
|
||||||
|
{
|
||||||
|
size_t i = 0, j = 0, k = 0;
|
||||||
|
if ( grid )
|
||||||
|
{
|
||||||
|
grid->ijkFromCellIndex( next.globCellIndex, &i, &j, &k );
|
||||||
|
}
|
||||||
|
ijkTextNext = QString( "(%1 %2 %3)" ).arg( i + 1 ).arg( j + 1 ).arg( k + 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
QString text = QString( "Gap detected : Distance diff : %1, epsilon = %2\n Global Cell Index 1 : %3, "
|
||||||
|
"IJK=%4, endMD : %5\n Global Cell Index 2 : %6, IJK=%7, startMD : %8" )
|
||||||
|
.arg( distance )
|
||||||
|
.arg( gapInGridThreshold )
|
||||||
|
.arg( current.globCellIndex )
|
||||||
|
.arg( ijkTextCurrent )
|
||||||
|
.arg( current.endMD )
|
||||||
|
.arg( next.globCellIndex )
|
||||||
|
.arg( ijkTextNext )
|
||||||
|
.arg( next.startMD );
|
||||||
|
|
||||||
|
RiaLogging::info( text );
|
||||||
|
|
||||||
|
extraIntersection.globCellIndex = std::numeric_limits<size_t>::max();
|
||||||
|
extraIntersection.startPoint = current.endPoint;
|
||||||
|
extraIntersection.endPoint = next.startPoint;
|
||||||
|
extraIntersection.startMD = current.endMD;
|
||||||
|
extraIntersection.endMD = next.startMD;
|
||||||
|
extraIntersection.intersectedCellFaceIn =
|
||||||
|
cvf::StructGridInterface::oppositeFace( current.intersectedCellFaceOut );
|
||||||
|
extraIntersection.intersectedCellFaceOut = cvf::StructGridInterface::oppositeFace( next.intersectedCellFaceIn );
|
||||||
|
extraIntersection.intersectionLengthsInCellCS = cvf::Vec3d::ZERO;
|
||||||
|
|
||||||
|
intersectionsNoGap.push_back( extraIntersection );
|
||||||
|
}
|
||||||
|
|
||||||
|
intersectionsNoGap.push_back( current );
|
||||||
|
}
|
||||||
|
|
||||||
|
return intersectionsNoGap;
|
||||||
|
}
|
||||||
|
@ -29,6 +29,11 @@ class RigEclipseCaseData;
|
|||||||
struct HexIntersectionInfo;
|
struct HexIntersectionInfo;
|
||||||
struct WellPathCellIntersectionInfo;
|
struct WellPathCellIntersectionInfo;
|
||||||
|
|
||||||
|
namespace cvf
|
||||||
|
{
|
||||||
|
class StructGridInterface;
|
||||||
|
};
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
@ -55,4 +60,9 @@ public:
|
|||||||
size_t cellIndex,
|
size_t cellIndex,
|
||||||
const cvf::Vec3d& startPoint,
|
const cvf::Vec3d& startPoint,
|
||||||
const cvf::Vec3d& endPoint );
|
const cvf::Vec3d& endPoint );
|
||||||
|
|
||||||
|
// Insert dummy intersections used to represent gap in grid
|
||||||
|
static std::vector<WellPathCellIntersectionInfo>
|
||||||
|
buildContinuousIntersections( const std::vector<WellPathCellIntersectionInfo>& originalIntersections,
|
||||||
|
const cvf::StructGridInterface* grid );
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user