#7559 Refactor to allow for adaptive mesh

This commit is contained in:
Kristian Bendiksen
2021-04-14 16:16:06 +02:00
parent bb3f736408
commit b69acb80f3
2 changed files with 56 additions and 52 deletions

View File

@@ -251,11 +251,8 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
} }
referenceDepth /= stimPlanFractureDefinitions.size(); referenceDepth /= stimPlanFractureDefinitions.size();
int numSamplesX = m_numSamplesX(); std::vector<double> gridXs;
int numSamplesY = m_numSamplesY(); std::vector<double> gridYs;
std::vector<double> gridXs( numSamplesX );
std::vector<double> gridYs( numSamplesY );
for ( auto result : availableResults ) for ( auto result : availableResults )
{ {
@@ -265,13 +262,22 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
createFractureGrids( stimPlanFractureDefinitions, unitSystem, result.first ); createFractureGrids( stimPlanFractureDefinitions, unitSystem, result.first );
auto [minX, maxX, minY, maxY] = findExtentsOfGrids( fractureGrids ); auto [minX, maxX, minY, maxY] = findExtentsOfGrids( fractureGrids );
RiaLogging::info(
QString( "Ensemble Fracture Size: X = [%1, %2] Y = [%3, %4]" ).arg( minX ).arg( maxX ).arg( minY ).arg( maxY ) );
if ( m_meshType() == MeshType::UNIFORM )
{
gridXs.clear();
gridYs.clear();
int numSamplesX = m_numSamplesX();
int numSamplesY = m_numSamplesY();
double sampleDistanceX = ( maxX - minX ) / numSamplesX; double sampleDistanceX = ( maxX - minX ) / numSamplesX;
double sampleDistanceY = ( maxY - minY ) / numSamplesY; double sampleDistanceY = ( maxY - minY ) / numSamplesY;
RiaLogging::info( RiaLogging::info(
QString( "Ensemble Fracture Size: X = [%1, %2] Y = [%3, %4]" ).arg( minX ).arg( maxX ).arg( minY ).arg( maxY ) ); QString( "Uniform Mesh. Output size: %1x%2. Sampling Distance X = %3 Sampling Distance Y = %4" )
RiaLogging::info( QString( "Output size: %1x%2. Sampling Distance X = %3 Sampling Distance Y = %4" )
.arg( numSamplesX ) .arg( numSamplesX )
.arg( numSamplesY ) .arg( numSamplesY )
.arg( sampleDistanceX ) .arg( sampleDistanceX )
@@ -280,20 +286,21 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
for ( int y = 0; y < numSamplesY; y++ ) for ( int y = 0; y < numSamplesY; y++ )
{ {
double posY = minY + y * sampleDistanceY + sampleDistanceY * 0.5; double posY = minY + y * sampleDistanceY + sampleDistanceY * 0.5;
gridYs[y] = referenceDepth - posY; gridYs.push_back( posY );
} }
for ( int x = 0; x < numSamplesX; x++ ) for ( int x = 0; x < numSamplesX; x++ )
{ {
double posX = minX + x * sampleDistanceX + sampleDistanceX * 0.5; double posX = minX + x * sampleDistanceX + sampleDistanceX * 0.5;
gridXs[x] = posX; gridXs.push_back( posX );
}
} }
std::vector<std::vector<double>> samples( numSamplesX * numSamplesY ); std::vector<std::vector<double>> samples( gridXs.size() * gridYs.size() );
sampleAllGrids( fractureGrids, samples, minX, minY, numSamplesX, numSamplesY, sampleDistanceX, sampleDistanceY ); sampleAllGrids( fractureGrids, gridXs, gridYs, samples );
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>> statisticsGrids; std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>> statisticsGrids;
generateStatisticsGrids( samples, numSamplesX, numSamplesY, statisticsGrids, selectedStatistics ); generateStatisticsGrids( samples, gridXs.size(), gridYs.size(), statisticsGrids, selectedStatistics );
for ( auto [statType, slice] : statisticsGrids ) for ( auto [statType, slice] : statisticsGrids )
{ {
@@ -332,12 +339,17 @@ std::vector<QString> RimEnsembleFractureStatistics::computeStatistics()
QString xmlFilePath = outputDirectoryPath + "/" + name() + "-" + text + ".xml"; QString xmlFilePath = outputDirectoryPath + "/" + name() + "-" + text + ".xml";
// TODO: add offset for grid ys
std::vector<double> gridYsWithOffset;
for ( double depth : gridYs )
gridYsWithOffset.push_back( referenceDepth - depth );
RiaLogging::info( QString( "Writing fracture group statistics to: %1" ).arg( xmlFilePath ) ); RiaLogging::info( QString( "Writing fracture group statistics to: %1" ).arg( xmlFilePath ) );
RifEnsembleFractureStatisticsExporter::writeAsStimPlanXml( statisticsSlices, RifEnsembleFractureStatisticsExporter::writeAsStimPlanXml( statisticsSlices,
properties, properties,
xmlFilePath, xmlFilePath,
gridXs, gridXs,
gridYs, gridYsWithOffset,
timeStep, timeStep,
unitSystem ); unitSystem );
@@ -502,20 +514,16 @@ double RimEnsembleFractureStatistics::computeDepthOfWellPathAtFracture(
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleFractureStatistics::sampleAllGrids( const std::vector<cvf::cref<RigFractureGrid>>& fractureGrids, void RimEnsembleFractureStatistics::sampleAllGrids( const std::vector<cvf::cref<RigFractureGrid>>& fractureGrids,
std::vector<std::vector<double>>& samples, const std::vector<double>& samplesX,
double minX, const std::vector<double>& samplesY,
double minY, std::vector<std::vector<double>>& samples )
int numSamplesX,
int numSamplesY,
double sampleDistanceX,
double sampleDistanceY )
{ {
for ( int y = 0; y < numSamplesY; y++ ) for ( size_t y = 0; y < samplesY.size(); y++ )
{ {
for ( int x = 0; x < numSamplesX; x++ ) for ( size_t x = 0; x < samplesX.size(); x++ )
{ {
double posX = minX + x * sampleDistanceX + sampleDistanceX * 0.5; double posX = samplesX[x];
double posY = minY + y * sampleDistanceY + sampleDistanceY * 0.5; double posY = samplesY[y];
for ( auto fractureGrid : fractureGrids ) for ( auto fractureGrid : fractureGrids )
{ {
@@ -523,7 +531,7 @@ void RimEnsembleFractureStatistics::sampleAllGrids( const std::vector<cvf::cref<
{ {
if ( isCoordinateInsideFractureCell( posX, posY, fractureCell ) ) if ( isCoordinateInsideFractureCell( posX, posY, fractureCell ) )
{ {
int idx = y * numSamplesX + x; size_t idx = y * samplesX.size() + x;
samples[idx].push_back( fractureCell.getConductivityValue() ); samples[idx].push_back( fractureCell.getConductivityValue() );
break; break;
} }
@@ -570,8 +578,8 @@ bool RimEnsembleFractureStatistics::writeStatisticsToCsv( const QString& filePat
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RimEnsembleFractureStatistics::generateStatisticsGrids( void RimEnsembleFractureStatistics::generateStatisticsGrids(
const std::vector<std::vector<double>>& samples, const std::vector<std::vector<double>>& samples,
int numSamplesX, size_t numSamplesX,
int numSamplesY, size_t numSamplesY,
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids, std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids,
const std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>& statisticsTypes ) const std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>& statisticsTypes )
{ {
@@ -593,9 +601,9 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids(
bool calculateP90 = isCalculationEnabled( StatisticsType::P90, statisticsTypes ); bool calculateP90 = isCalculationEnabled( StatisticsType::P90, statisticsTypes );
bool calculateOccurrence = isCalculationEnabled( StatisticsType::OCCURRENCE, statisticsTypes ); bool calculateOccurrence = isCalculationEnabled( StatisticsType::OCCURRENCE, statisticsTypes );
for ( int y = 0; y < numSamplesY; y++ ) for ( size_t y = 0; y < numSamplesY; y++ )
{ {
for ( int x = 0; x < numSamplesX; x++ ) for ( size_t x = 0; x < numSamplesX; x++ )
{ {
size_t idx = y * numSamplesX + x; size_t idx = y * numSamplesX + x;

View File

@@ -88,18 +88,14 @@ protected:
findExtentsOfGrids( const std::vector<cvf::cref<RigFractureGrid>>& fractureGrids ); findExtentsOfGrids( const std::vector<cvf::cref<RigFractureGrid>>& fractureGrids );
static void sampleAllGrids( const std::vector<cvf::cref<RigFractureGrid>>& fractureGrids, static void sampleAllGrids( const std::vector<cvf::cref<RigFractureGrid>>& fractureGrids,
std::vector<std::vector<double>>& samples, const std::vector<double>& samplesX,
double minX, const std::vector<double>& samplesY,
double maxX, std::vector<std::vector<double>>& samples );
int numSamplesX,
int numSamplesY,
double sampleDistanceX,
double sampleDistanceY );
static void generateStatisticsGrids( static void generateStatisticsGrids(
const std::vector<std::vector<double>>& samples, const std::vector<std::vector<double>>& samples,
int numSamplesX, size_t numSamplesX,
int numSamplesY, size_t numSamplesY,
std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids, std::map<RimEnsembleFractureStatistics::StatisticsType, std::shared_ptr<RigSlice2D>>& statisticsGrids,
const std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>& statisticsTypes ); const std::vector<caf::AppEnum<RimEnsembleFractureStatistics::StatisticsType>>& statisticsTypes );