mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3230 Repeat COMPSEGS for each completion type.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user