#3230 Repeat COMPSEGS for each completion type.

This commit is contained in:
Gaute Lindkvist
2018-08-22 09:27:49 +02:00
parent 0ed7e5d0d5
commit 3ddf559856
2 changed files with 188 additions and 93 deletions

View File

@@ -447,7 +447,6 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
}
{
formatter.comment("Main stem");
double prevMD = exportInfo.initialMD();
double prevTVD = exportInfo.initialTVD();
for (const RicMswSegment& location : exportInfo.wellSegmentLocations())
@@ -485,25 +484,41 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
}
{
formatter.comment("Laterals");
formatter.comment("Diam: MSW - Tubing Radius");
formatter.comment("Rough: MSW - Open Hole Roughness Factor");
for (const RicMswSegment& location : exportInfo.wellSegmentLocations())
{
if (location.completions().empty())
{
continue;
generateWelsegsSegments(formatter, exportInfo, { RigCompletionData::ICD, RigCompletionData::FISHBONES});
generateWelsegsSegments(formatter, exportInfo, { RigCompletionData::FRACTURE });
}
for (const RicMswCompletion& completion : location.completions())
formatter.tableCompleted();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsSegments(
RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
const std::set<RigCompletionData::CompletionType>& exportCompletionTypes)
{
bool generatedHeader = false;
for (const RicMswSegment& segment : exportInfo.wellSegmentLocations())
{
for (const RicMswCompletion& completion : segment.completions())
{
if (exportCompletionTypes.count(completion.completionType()))
{
if (!generatedHeader)
{
generateWelsegsCompletionCommentHeader(formatter, completion.completionType());
generatedHeader = true;
}
if (completion.completionType() == RigCompletionData::ICD) // Found ICD
{
formatter.comment(completion.label());
formatter.add(completion.subSegments().front().segmentNumber());
formatter.add(completion.subSegments().front().segmentNumber());
formatter.add(completion.branchNumber());
formatter.add(location.segmentNumber());
formatter.add(segment.segmentNumber());
formatter.add(0.1); // ICDs have 0.1 length
formatter.add(0); // Depth change
formatter.add(exportInfo.linerDiameter());
@@ -515,14 +530,15 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
if (completion.completionType() == RigCompletionData::FISHBONES)
{
formatter.comment(QString("%1 : Sub index %2 - %3")
.arg(location.label())
.arg(location.subIndex())
.arg(segment.label())
.arg(segment.subIndex())
.arg(completion.label()));
}
else if (completion.completionType() == RigCompletionData::FRACTURE)
{
formatter.comment(QString("%1 connected to %2").arg(completion.label()).arg(location.label()));
formatter.comment(QString("%1 connected to %2").arg(completion.label()).arg(segment.label()));
}
for (const RicMswSubSegment& subSegment : completion.subSegments())
{
double depth = 0;
@@ -538,7 +554,7 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
depth = subSegment.startTVD() + subSegment.deltaTVD();
length = subSegment.startMD() + subSegment.deltaMD();
}
double diameter = location.effectiveDiameter();
double diameter = segment.effectiveDiameter();
formatter.add(subSegment.segmentNumber());
formatter.add(subSegment.segmentNumber());
formatter.add(completion.branchNumber());
@@ -546,15 +562,36 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
formatter.add(length);
formatter.add(depth);
formatter.add(diameter);
formatter.add(location.openHoleRoughnessFactor());
formatter.add(segment.openHoleRoughnessFactor());
formatter.rowCompleted();
}
}
}
}
}
}
formatter.tableCompleted();
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsCompletionCommentHeader(RifEclipseDataTableFormatter &formatter, RigCompletionData::CompletionType completionType)
{
if (completionType == RigCompletionData::CT_UNDEFINED)
{
formatter.comment("Main stem");
}
else if (completionType == RigCompletionData::ICD)
{
formatter.comment("Fishbone Laterals");
formatter.comment("Diam: MSW - Tubing Radius");
formatter.comment("Rough: MSW - Open Hole Roughness Factor");
}
else if (completionType == RigCompletionData::FRACTURE)
{
formatter.comment("Fracture Segments");
formatter.comment("Diam: MSW - Default Dummy");
formatter.comment("Rough: MSW - Default Dummy");
}
}
//--------------------------------------------------------------------------------------------------
@@ -563,10 +600,27 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTables(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo)
{
generateCompsegTable(formatter, exportInfo, false);
/*
* TODO: Creating the regular perforation COMPSEGS table should come in here, before the others
* should take precedence by appearing later in the output. See #3230.
*/
{
std::set<RigCompletionData::CompletionType> fishbonesTypes = { RigCompletionData::ICD, RigCompletionData::FISHBONES };
generateCompsegTable(formatter, exportInfo, false, fishbonesTypes);
if (exportInfo.hasSubGridIntersections())
{
generateCompsegTable(formatter, exportInfo, true);
generateCompsegTable(formatter, exportInfo, true, fishbonesTypes);
}
}
{
std::set<RigCompletionData::CompletionType> fractureTypes = { RigCompletionData::FRACTURE };
generateCompsegTable(formatter, exportInfo, false, fractureTypes);
if (exportInfo.hasSubGridIntersections())
{
generateCompsegTable(formatter, exportInfo, true, fractureTypes);
}
}
}
@@ -575,43 +629,10 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTables(RifEclips
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
bool exportSubGridIntersections)
bool exportSubGridIntersections,
const std::set<RigCompletionData::CompletionType>& exportCompletionTypes)
{
if (exportSubGridIntersections)
{
formatter.keyword("COMPSEGL");
}
else
{
formatter.keyword("COMPSEGS");
}
{
std::vector<RifEclipseOutputTableColumn> header = {RifEclipseOutputTableColumn("Name")};
formatter.header(header);
formatter.add(exportInfo.wellPath()->name());
formatter.rowCompleted();
}
{
std::vector<RifEclipseOutputTableColumn> allHeaders;
if (exportSubGridIntersections)
{
allHeaders.push_back(RifEclipseOutputTableColumn("Grid"));
}
std::vector<RifEclipseOutputTableColumn> commonHeaders = {RifEclipseOutputTableColumn("I"),
RifEclipseOutputTableColumn("J"),
RifEclipseOutputTableColumn("K"),
RifEclipseOutputTableColumn("Branch no"),
RifEclipseOutputTableColumn("Start Length"),
RifEclipseOutputTableColumn("End Length"),
RifEclipseOutputTableColumn("Dir Pen"),
RifEclipseOutputTableColumn("End Range"),
RifEclipseOutputTableColumn("Connection Depth")};
allHeaders.insert(allHeaders.end(), commonHeaders.begin(), commonHeaders.end());
formatter.header(allHeaders);
}
bool generatedHeader = false;
for (const RicMswSegment& location : exportInfo.wellSegmentLocations())
{
@@ -619,6 +640,14 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipse
for (const RicMswCompletion& completion : location.completions())
{
if (exportCompletionTypes.count(completion.completionType()))
{
if (!generatedHeader)
{
generateCompsegHeader(formatter, exportInfo, completion.completionType(), exportSubGridIntersections);
generatedHeader = true;
}
for (const RicMswSubSegment& segment : completion.subSegments())
{
if (completion.completionType() == RigCompletionData::ICD)
@@ -653,10 +682,65 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipse
}
}
}
}
formatter.tableCompleted();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegHeader(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
RigCompletionData::CompletionType completionType,
bool exportSubGridIntersections)
{
if (exportSubGridIntersections)
{
formatter.keyword("COMPSEGL");
}
else
{
formatter.keyword("COMPSEGS");
}
if (completionType == RigCompletionData::ICD)
{
formatter.comment("Fishbones");
}
else if (completionType == RigCompletionData::FRACTURE)
{
formatter.comment("Fractures");
}
{
std::vector<RifEclipseOutputTableColumn> header = { RifEclipseOutputTableColumn("Name") };
formatter.header(header);
formatter.add(exportInfo.wellPath()->name());
formatter.rowCompleted();
}
{
std::vector<RifEclipseOutputTableColumn> allHeaders;
if (exportSubGridIntersections)
{
allHeaders.push_back(RifEclipseOutputTableColumn("Grid"));
}
std::vector<RifEclipseOutputTableColumn> commonHeaders = { RifEclipseOutputTableColumn("I"),
RifEclipseOutputTableColumn("J"),
RifEclipseOutputTableColumn("K"),
RifEclipseOutputTableColumn("Branch no"),
RifEclipseOutputTableColumn("Start Length"),
RifEclipseOutputTableColumn("End Length"),
RifEclipseOutputTableColumn("Dir Pen"),
RifEclipseOutputTableColumn("End Range"),
RifEclipseOutputTableColumn("Connection Depth") };
allHeaders.insert(allHeaders.end(), commonHeaders.begin(), commonHeaders.end());
formatter.header(allHeaders);
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@@ -89,10 +89,21 @@ public:
static void generateWelsegsTable(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo);
static void generateWelsegsSegments(RifEclipseDataTableFormatter &formatter,
const RicMswExportInfo &exportInfo,
const std::set<RigCompletionData::CompletionType>& exportCompletionTypes);
static void generateWelsegsCompletionCommentHeader(RifEclipseDataTableFormatter &formatter,
RigCompletionData::CompletionType completionType);
static void generateCompsegTables(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo);
static void generateCompsegTable(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
bool exportSubGridIntersections,
const std::set<RigCompletionData::CompletionType>& exportCompletionTypes);
static void generateCompsegHeader(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
RigCompletionData::CompletionType completionType,
bool exportSubGridIntersections);
static void generateWsegvalvTable(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo);