diff --git a/ApplicationLibCode/ReservoirDataModel/RigResdataGridConverter.cpp b/ApplicationLibCode/ReservoirDataModel/RigResdataGridConverter.cpp index 0689cd238d..6664f9a5b3 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigResdataGridConverter.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigResdataGridConverter.cpp @@ -54,6 +54,10 @@ bool RigResdataGridConverter::exportGrid( const QString& resultFileName, const RigMainGrid* mainGrid = eclipseCase->mainGrid(); cvf::Vec3st resolvedMax = max.isUndefined() ? cvf::Vec3st( mainGrid->cellCountI() - 1, mainGrid->cellCountJ() - 1, mainGrid->cellCountK() - 1 ) : max; + + // An inverted box, e.g. the visible cell range of a view without visible cells, underflows the sector size + if ( resolvedMax.x() < min.x() || resolvedMax.y() < min.y() || resolvedMax.z() < min.z() ) return false; + cvf::Vec3st sectorSize( resolvedMax.x() - min.x() + 1, resolvedMax.y() - min.y() + 1, resolvedMax.z() - min.z() + 1 ); RigGridExportAdapter gridAdapter( eclipseCase, min, resolvedMax, RigUniformRefinement( refinement, sectorSize ), cellVisibilityOverrideForActnum ); diff --git a/ApplicationLibCode/UnitTests/RigResdataGridConverter-Test.cpp b/ApplicationLibCode/UnitTests/RigResdataGridConverter-Test.cpp index 9eef821e74..1072a0d647 100644 --- a/ApplicationLibCode/UnitTests/RigResdataGridConverter-Test.cpp +++ b/ApplicationLibCode/UnitTests/RigResdataGridConverter-Test.cpp @@ -27,6 +27,7 @@ #include "RigActiveCellInfo.h" #include "RigEclipseCaseData.h" #include "RigMainGrid.h" +#include "RigReservoirBuilder.h" #include "RimEclipseResultCase.h" #include @@ -727,3 +728,26 @@ TEST( RigResdataGridConverterTest, CornerPointArrayConversion ) EXPECT_TRUE( hasNonZeroZcorn ) << "ZCORN array is all zeros"; EXPECT_TRUE( hasActiveCell ) << "No active cells found"; } + +//-------------------------------------------------------------------------------------------------- +/// An inverted box (min > max), e.g. the visible cell range of a view with no visible cells, +/// underflowed the sector size and threw std::length_error when allocating the export arrays +//-------------------------------------------------------------------------------------------------- +TEST( RigResdataGridConverterTest, ExportGridWithInvertedBoxFails ) +{ + RigReservoirBuilder builder; + builder.setIJKCount( cvf::Vec3st( 3, 3, 3 ) ); + builder.setWorldCoordinates( cvf::Vec3d( 0.0, 0.0, 0.0 ), cvf::Vec3d( 3.0, 3.0, -3.0 ) ); + + cvf::ref eclipseCase = new RigEclipseCaseData( nullptr ); + builder.createGridsAndCells( eclipseCase.p() ); + eclipseCase->mainGrid()->computeCachedData(); + + QTemporaryDir tempDir; + ASSERT_TRUE( tempDir.isValid() ); + QString fileName = tempDir.filePath( "GRID.GRDECL" ); + + cvf::Vec3st min( 2, 2, 2 ); + cvf::Vec3st max( 0, 0, 0 ); + EXPECT_FALSE( RigResdataGridConverter::exportGrid( fileName, eclipseCase.p(), false, nullptr, min, max, cvf::Vec3st( 1, 1, 1 ) ) ); +}