#7493 Handle units in fracture group statistics export.

This commit is contained in:
Kristian Bendiksen 2021-03-26 10:01:36 +01:00
parent 49c2b16058
commit acd483f04b
4 changed files with 66 additions and 34 deletions

View File

@ -21,6 +21,7 @@
// #include "RiaEclipseUnitTools.h"
// #include "RimStimPlanModel.h"
#include "RiaDefines.h"
#include "RigSlice2D.h"
#include "cafAssert.h"
@ -31,11 +32,12 @@
///
//--------------------------------------------------------------------------------------------------
bool RifFractureGroupStatisticsExporter::writeAsStimPlanXml( const std::vector<std::shared_ptr<RigSlice2D>>& statistics,
const std::vector<QString>& properties,
const std::vector<std::pair<QString, QString>>& properties,
const QString& filePath,
const std::vector<double>& gridXs,
const std::vector<double>& gridYs,
double time )
double time,
RiaDefines::EclipseUnitSystem unitSystem )
{
QFile data( filePath );
if ( !data.open( QFile::WriteOnly | QFile::Truncate ) )
@ -45,7 +47,7 @@ bool RifFractureGroupStatisticsExporter::writeAsStimPlanXml( const std::vector<s
QTextStream stream( &data );
appendHeaderToStream( stream );
appendGridDimensionsToStream( stream, gridXs, gridYs );
appendGridDimensionsToStream( stream, gridXs, gridYs, unitSystem );
appendPropertiesToStream( stream, statistics, properties, gridYs, time );
appendFooterToStream( stream );
@ -65,9 +67,9 @@ void RifFractureGroupStatisticsExporter::appendHeaderToStream( QTextStream& stre
//--------------------------------------------------------------------------------------------------
void RifFractureGroupStatisticsExporter::appendPropertiesToStream( QTextStream& stream,
const std::vector<std::shared_ptr<RigSlice2D>>& statistics,
const std::vector<QString>& properties,
const std::vector<double>& gridYs,
double time )
const std::vector<std::pair<QString, QString>>& properties,
const std::vector<double>& gridYs,
double time )
{
CAF_ASSERT( statistics.size() == properties.size() );
@ -75,10 +77,8 @@ void RifFractureGroupStatisticsExporter::appendPropertiesToStream( QTextStream&
for ( size_t s = 0; s < statistics.size(); s++ )
{
QString propertyName = properties[s];
// TODO:
QString propertyUnit = "cm";
QString propertyName = properties[s].first;
QString propertyUnit = properties[s].second;
stream << QString( "<property name=\"%1\" uom=\"%2\">" ).arg( propertyName ).arg( propertyUnit ) << endl;
stream << QString( "<time value=\"%1\">" ).arg( time ) << endl;
@ -105,11 +105,14 @@ void RifFractureGroupStatisticsExporter::appendPropertiesToStream( QTextStream&
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RifFractureGroupStatisticsExporter::appendGridDimensionsToStream( QTextStream& stream,
const std::vector<double>& gridXs,
const std::vector<double>& gridYs )
void RifFractureGroupStatisticsExporter::appendGridDimensionsToStream( QTextStream& stream,
const std::vector<double>& gridXs,
const std::vector<double>& gridYs,
RiaDefines::EclipseUnitSystem unitSystem )
{
stream << QString( "<grid xCount=\"%1\" yCount=\"%2\">" ).arg( gridXs.size() ).arg( gridYs.size() ) << endl;
QString unitString = getStringForUnitSystem( unitSystem );
stream << QString( "<grid xCount=\"%1\" yCount=\"%2\" uom=\"%3\">" ).arg( gridXs.size() ).arg( gridYs.size() ).arg( unitString )
<< endl;
stream << "<xs>[";
for ( auto x : gridXs )
@ -123,6 +126,7 @@ void RifFractureGroupStatisticsExporter::appendGridDimensionsToStream( QTextStre
stream << "</grid>" << endl;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -130,3 +134,16 @@ void RifFractureGroupStatisticsExporter::appendFooterToStream( QTextStream& stre
{
stream << "</contours>" << endl;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QString RifFractureGroupStatisticsExporter::getStringForUnitSystem( RiaDefines::EclipseUnitSystem unitSystem )
{
if ( unitSystem == RiaDefines::EclipseUnitSystem::UNITS_METRIC )
return "m";
else if ( unitSystem == RiaDefines::EclipseUnitSystem::UNITS_FIELD )
return "ft";
else
return "";
}

View File

@ -18,6 +18,8 @@
#pragma once
#include "RiaDefines.h"
#include <memory>
#include <vector>
@ -33,21 +35,25 @@ class RifFractureGroupStatisticsExporter
{
public:
static bool writeAsStimPlanXml( const std::vector<std::shared_ptr<RigSlice2D>>& statistics,
const std::vector<QString>& properties,
const std::vector<std::pair<QString, QString>>& properties,
const QString& filePath,
const std::vector<double>& gridXs,
const std::vector<double>& gridYs,
double time );
double time,
RiaDefines::EclipseUnitSystem unitSystem );
private:
static void appendHeaderToStream( QTextStream& stream );
static void appendGridDimensionsToStream( QTextStream& stream,
const std::vector<double>& gridXs,
const std::vector<double>& gridYs );
static void appendGridDimensionsToStream( QTextStream& stream,
const std::vector<double>& gridXs,
const std::vector<double>& gridYs,
RiaDefines::EclipseUnitSystem unitSystem );
static void appendPropertiesToStream( QTextStream& stream,
const std::vector<std::shared_ptr<RigSlice2D>>& statistics,
const std::vector<QString>& properties,
const std::vector<std::pair<QString, QString>>& properties,
const std::vector<double>& gridYs,
double time );
static void appendFooterToStream( QTextStream& stream );
static QString getStringForUnitSystem( RiaDefines::EclipseUnitSystem unitSystem );
};

View File

@ -18,6 +18,7 @@
#include "RimFractureGroupStatistics.h"
#include "RiaDefines.h"
#include "RiaLogging.h"
#include "RiaPreferences.h"
@ -35,6 +36,7 @@
#include <cmath>
#include <QDir>
#include <QFile>
namespace caf
@ -139,7 +141,7 @@ void RimFractureGroupStatistics::computeStatistics()
std::vector<cvf::ref<RigStimPlanFractureDefinition>> stimPlanFractureDefinitions =
readFractureDefinitions( m_filePaths.v(), unitSystem );
std::set<QString> availableResults = findAllResultNames( stimPlanFractureDefinitions );
std::set<std::pair<QString, QString>> availableResults = findAllResultNames( stimPlanFractureDefinitions );
std::map<std::pair<RimFractureGroupStatistics::StatisticsType, QString>, std::shared_ptr<RigSlice2D>> statisticsGridsAll;
@ -155,10 +157,10 @@ void RimFractureGroupStatistics::computeStatistics()
for ( auto result : availableResults )
{
RiaLogging::info( QString( "Creating statistics for result: %1" ).arg( result ) );
RiaLogging::info( QString( "Creating statistics for result: %1" ).arg( result.first ) );
std::vector<cvf::cref<RigFractureGrid>> fractureGrids =
createFractureGrids( stimPlanFractureDefinitions, unitSystem, result );
createFractureGrids( stimPlanFractureDefinitions, unitSystem, result.first );
auto [minX, maxX, minY, maxY] = findExtentsOfGrids( fractureGrids );
@ -193,11 +195,12 @@ void RimFractureGroupStatistics::computeStatistics()
for ( auto [statType, slice] : statisticsGrids )
{
auto key = std::make_pair( statType, result );
auto key = std::make_pair( statType, result.first );
statisticsGridsAll[key] = slice;
}
}
QString tempDir = QDir::tempPath();
for ( size_t i = 0; i < caf::AppEnum<RimFractureGroupStatistics::StatisticsType>::size(); ++i )
{
caf::AppEnum<RimFractureGroupStatistics::StatisticsType> t =
@ -206,18 +209,24 @@ void RimFractureGroupStatistics::computeStatistics()
// Get the all the properties for this statistics type
std::vector<std::shared_ptr<RigSlice2D>> statisticsSlices;
std::vector<QString> properties;
std::vector<std::pair<QString, QString>> properties;
for ( auto result : availableResults )
{
properties.push_back( result );
std::shared_ptr<RigSlice2D> slice = statisticsGridsAll[std::make_pair( t.value(), result )];
std::shared_ptr<RigSlice2D> slice = statisticsGridsAll[std::make_pair( t.value(), result.first )];
statisticsSlices.push_back( slice );
writeStatisticsToCsv( "/tmp/" + text + "-" + result + ".csv", *slice );
writeStatisticsToCsv( tempDir + "/" + text + "-" + result.first + ".csv", *slice );
}
QString xmlFilePath = "/tmp/fracture_group/" + text + ".xml";
RifFractureGroupStatisticsExporter::writeAsStimPlanXml( statisticsSlices, properties, xmlFilePath, gridXs, gridYs, timeStep );
QString xmlFilePath = tempDir + "/fracture_group/" + text + ".xml";
RifFractureGroupStatisticsExporter::writeAsStimPlanXml( statisticsSlices,
properties,
xmlFilePath,
gridXs,
gridYs,
timeStep,
unitSystem );
}
}
@ -258,15 +267,15 @@ std::vector<cvf::ref<RigStimPlanFractureDefinition>>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::set<QString> RimFractureGroupStatistics::findAllResultNames(
std::set<std::pair<QString, QString>> RimFractureGroupStatistics::findAllResultNames(
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& stimPlanFractureDefinitions )
{
std::set<QString> resultNames;
std::set<std::pair<QString, QString>> resultNames;
for ( auto stimPlanFractureDefinitionData : stimPlanFractureDefinitions )
{
for ( auto [resultName, unit] : stimPlanFractureDefinitionData->getStimPlanPropertyNamesUnits() )
for ( auto propertyNameWithUnit : stimPlanFractureDefinitionData->getStimPlanPropertyNamesUnits() )
{
resultNames.insert( resultName );
resultNames.insert( propertyNameWithUnit );
}
}

View File

@ -69,7 +69,7 @@ protected:
RiaDefines::EclipseUnitSystem unitSystem,
const QString& resultName );
static std::set<QString>
static std::set<std::pair<QString, QString>>
findAllResultNames( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& stimPlanFractureDefinitions );
static std::tuple<double, double, double, double>