#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

@@ -446,8 +446,7 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
formatter.header(header);
}
{
formatter.comment("Main stem");
{
double prevMD = exportInfo.initialMD();
double prevTVD = exportInfo.initialTVD();
for (const RicMswSegment& location : exportInfo.wellSegmentLocations())
@@ -485,60 +484,77 @@ 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());
formatter.add(exportInfo.roughnessFactor());
formatter.rowCompleted();
formatter.rowCompleted();
}
else
{
if (completion.completionType() == RigCompletionData::FISHBONES)
{
formatter.comment(QString("%1 : Sub index %2 - %3")
.arg(location.label())
.arg(location.subIndex())
.arg(completion.label()));
.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;
double depth = 0;
double length = 0;
if (exportInfo.lengthAndDepthText() == QString("INC"))
{
depth = subSegment.deltaTVD();
depth = subSegment.deltaTVD();
length = subSegment.deltaMD();
}
else
{
depth = subSegment.startTVD() + subSegment.deltaTVD();
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,13 +562,127 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
formatter.add(length);
formatter.add(depth);
formatter.add(diameter);
formatter.add(location.openHoleRoughnessFactor());
formatter.add(segment.openHoleRoughnessFactor());
formatter.rowCompleted();
}
}
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
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");
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTables(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo)
{
/*
* 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, fishbonesTypes);
}
}
{
std::set<RigCompletionData::CompletionType> fractureTypes = { RigCompletionData::FRACTURE };
generateCompsegTable(formatter, exportInfo, false, fractureTypes);
if (exportInfo.hasSubGridIntersections())
{
generateCompsegTable(formatter, exportInfo, true, fractureTypes);
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
bool exportSubGridIntersections,
const std::set<RigCompletionData::CompletionType>& exportCompletionTypes)
{
bool generatedHeader = false;
for (const RicMswSegment& location : exportInfo.wellSegmentLocations())
{
double startMD = location.startMD();
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)
{
startMD = segment.startMD();
}
for (const RicMswSubSegmentCellIntersection& intersection : segment.intersections())
{
bool isSubGridIntersection = !intersection.gridName().isEmpty();
if (isSubGridIntersection == exportSubGridIntersections)
{
if (exportSubGridIntersections)
{
formatter.add(intersection.gridName());
}
cvf::Vec3st ijk = intersection.gridLocalCellIJK();
formatter.addZeroBasedCellIndex(ijk.x()).addZeroBasedCellIndex(ijk.y()).addZeroBasedCellIndex(ijk.z());
formatter.add(completion.branchNumber());
double startLength = segment.startMD();
if (exportInfo.lengthAndDepthText() == QString("INC"))
{
startLength -= startMD;
}
formatter.add(startLength);
formatter.add(startLength + segment.deltaMD());
formatter.rowCompleted();
}
}
}
}
}
}
formatter.tableCompleted();
}
@@ -560,22 +690,10 @@ void RicWellPathExportCompletionDataFeatureImpl::generateWelsegsTable(RifEclipse
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTables(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo)
{
generateCompsegTable(formatter, exportInfo, false);
if (exportInfo.hasSubGridIntersections())
{
generateCompsegTable(formatter, exportInfo, true);
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
bool exportSubGridIntersections)
void RicWellPathExportCompletionDataFeatureImpl::generateCompsegHeader(RifEclipseDataTableFormatter& formatter,
const RicMswExportInfo& exportInfo,
RigCompletionData::CompletionType completionType,
bool exportSubGridIntersections)
{
if (exportSubGridIntersections)
{
@@ -586,8 +704,17 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipse
formatter.keyword("COMPSEGS");
}
if (completionType == RigCompletionData::ICD)
{
std::vector<RifEclipseOutputTableColumn> header = {RifEclipseOutputTableColumn("Name")};
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();
@@ -600,61 +727,18 @@ void RicWellPathExportCompletionDataFeatureImpl::generateCompsegTable(RifEclipse
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")};
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);
}
for (const RicMswSegment& location : exportInfo.wellSegmentLocations())
{
double startMD = location.startMD();
for (const RicMswCompletion& completion : location.completions())
{
for (const RicMswSubSegment& segment : completion.subSegments())
{
if (completion.completionType() == RigCompletionData::ICD)
{
startMD = segment.startMD();
}
for (const RicMswSubSegmentCellIntersection& intersection : segment.intersections())
{
bool isSubGridIntersection = !intersection.gridName().isEmpty();
if (isSubGridIntersection == exportSubGridIntersections)
{
if (exportSubGridIntersections)
{
formatter.add(intersection.gridName());
}
cvf::Vec3st ijk = intersection.gridLocalCellIJK();
formatter.addZeroBasedCellIndex(ijk.x()).addZeroBasedCellIndex(ijk.y()).addZeroBasedCellIndex(ijk.z());
formatter.add(completion.branchNumber());
double startLength = segment.startMD();
if (exportInfo.lengthAndDepthText() == QString("INC"))
{
startLength -= startMD;
}
formatter.add(startLength);
formatter.add(startLength + segment.deltaMD());
formatter.rowCompleted();
}
}
}
}
}
formatter.tableCompleted();
}
//--------------------------------------------------------------------------------------------------

View File

@@ -89,11 +89,22 @@ 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);
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);