#3089 Non-Darcy longitudinal : Add support for longitudinal fractures

- move non-darcy data from template to fracture, as this data is now depending of fracutre
- compute weighted average of stimplan width and conductivity based on fracture perforation length
- use referringPtrFields() to find fractures using this fracture template
This commit is contained in:
Magne Sjaastad
2018-08-15 09:44:27 +02:00
parent 4c75e2514d
commit 2ddc3d77df
11 changed files with 391 additions and 212 deletions

View File

@@ -67,10 +67,12 @@ std::vector<RigCompletionData> RicExportFractureCompletionsImpl::generateCompdat
if (wellPath->fractureCollection()->isChecked())
{
for (const auto& frac : wellPath->fractureCollection()->fractures)
for (auto& frac : wellPath->fractureCollection()->fractures)
{
if (frac->isChecked())
{
frac->ensureValidNonDarcyProperties();
fracturesAlongWellPath.push_back(frac);
}
}
@@ -174,11 +176,8 @@ std::vector<RigCompletionData>
//////
// Calculate Matrix To Fracture Trans
RigEclipseToStimPlanCalculator eclToFractureCalc(caseToApply,
fracture->transformMatrix(),
fracture->fractureTemplate()->skinFactor(),
cDarcyInCorrectUnit,
*fractureGrid);
RigEclipseToStimPlanCalculator eclToFractureCalc(
caseToApply, fracture->transformMatrix(), fracTemplate->skinFactor(), cDarcyInCorrectUnit, *fractureGrid);
eclToFractureCalc.appendDataToTransmissibilityCondenser(fracture, useFiniteConductivityInFracture, &transCondenser);
@@ -248,32 +247,28 @@ std::vector<RigCompletionData>
////
// If fracture has orientation Azimuth or Transverse, assume only radial inflow
if (fracture->fractureTemplate()->orientationType() == RimFractureTemplate::AZIMUTH ||
fracture->fractureTemplate()->orientationType() == RimFractureTemplate::TRANSVERSE_WELL_PATH)
if (fracTemplate->orientationType() == RimFractureTemplate::AZIMUTH ||
fracTemplate->orientationType() == RimFractureTemplate::TRANSVERSE_WELL_PATH)
{
const RigFractureGrid* fracGrid = fracture->fractureTemplate()->fractureGrid();
if (fracGrid)
{
std::pair<size_t, size_t> wellCellIJ = fracGrid->fractureCellAtWellCenter();
size_t wellCellIndex = fracGrid->getGlobalIndexFromIJ(wellCellIJ.first, wellCellIJ.second);
std::pair<size_t, size_t> wellCellIJ = fractureGrid->fractureCellAtWellCenter();
size_t wellCellIndex = fractureGrid->getGlobalIndexFromIJ(wellCellIJ.first, wellCellIJ.second);
const RigFractureCell& wellCell = fractureGrid->cellFromIndex(wellCellIndex);
const RigFractureCell& wellCell = fractureGrid->cellFromIndex(wellCellIndex);
double radialTrans =
RigFractureTransmissibilityEquations::fractureCellToWellRadialTrans(wellCell.getConductivityValue(),
wellCell.cellSizeX(),
wellCell.cellSizeZ(),
fracture->wellRadius(),
fracTemplate->skinFactor(),
cDarcyInCorrectUnit);
double radialTrans =
RigFractureTransmissibilityEquations::fractureCellToWellRadialTrans(wellCell.getConductivityValue(),
wellCell.cellSizeX(),
wellCell.cellSizeZ(),
fracture->wellRadius(),
fracTemplate->skinFactor(),
cDarcyInCorrectUnit);
transCondenser.addNeighborTransmissibility(
{true, RigTransmissibilityCondenser::CellAddress::WELL, 1},
{false, RigTransmissibilityCondenser::CellAddress::STIMPLAN, wellCellIndex},
radialTrans);
}
transCondenser.addNeighborTransmissibility(
{true, RigTransmissibilityCondenser::CellAddress::WELL, 1},
{false, RigTransmissibilityCondenser::CellAddress::STIMPLAN, wellCellIndex},
radialTrans);
}
else if (fracture->fractureTemplate()->orientationType() == RimFractureTemplate::ALONG_WELL_PATH)
else if (fracTemplate->orientationType() == RimFractureTemplate::ALONG_WELL_PATH)
{
////
// If fracture has orientation along well, linear inflow along well and radial flow at endpoints
@@ -332,7 +327,7 @@ std::vector<RigCompletionData>
fracture->fractureMD());
double diameter = 2.0 * fracture->wellRadius();
compDat.setFromFracture(trans, fracture->fractureTemplate()->skinFactor(), diameter);
compDat.setFromFracture(trans, fracTemplate->skinFactor(), diameter);
compDat.addMetadata(fracture->name(), QString::number(trans));
allCompletionsForOneFracture.push_back(compDat);
}
@@ -341,10 +336,10 @@ std::vector<RigCompletionData>
/////
// Compute Non-Dracy Flow parameters
if (fracture->fractureTemplate()->isNonDarcyFlowEnabled())
if (fracTemplate->isNonDarcyFlowEnabled())
{
double dFactorForFracture = fracture->fractureTemplate()->dFactor();
double khForFracture = fracture->fractureTemplate()->kh();
double dFactorForFracture = fracture->nonDarcyProperties().dFactor;
double khForFracture = fracture->nonDarcyProperties().conductivity;
double sumOfTransmissibilitiesInFracture = 0.0;
for (const auto& c : allCompletionsForOneFracture)
@@ -367,11 +362,7 @@ std::vector<RigCompletionData>
if (fractureDataReportItems)
{
QString fractureTemplateName;
if (fracture->fractureTemplate())
{
fractureTemplateName = fracture->fractureTemplate()->name();
}
QString fractureTemplateName = fracTemplate->name();
RicWellPathFractureReportItem reportItem(wellPathName, fracture->name(), fractureTemplateName);
double transmissibility = 0.0;

View File

@@ -290,8 +290,6 @@ QString RicWellPathFractureTextReportFeatureImpl::createStimPlanFractureText(
RifEclipseOutputTableColumn(" "),
floatNumberColumn("WDiam"),
floatNumberColumn("Skin"),
floatNumberColumn("Dfac"),
floatNumberColumn("LPerf"),
};
formatter.header(header);
@@ -302,8 +300,6 @@ QString RicWellPathFractureTextReportFeatureImpl::createStimPlanFractureText(
formatter.add("Orientation"); // Orientation
formatter.add("[m]"); // WDiam
formatter.add("[] "); // Skin
formatter.add("[...]"); // DFac
formatter.add("[m]"); // LPerf
formatter.rowCompleted();
}
@@ -316,17 +312,6 @@ QString RicWellPathFractureTextReportFeatureImpl::createStimPlanFractureText(
formatter.add(stimPlanTemplate->wellDiameter());
formatter.add(stimPlanTemplate->skinFactor());
if (stimPlanTemplate->isNonDarcyFlowEnabled())
{
formatter.add(stimPlanTemplate->dFactor());
formatter.add(stimPlanTemplate->perforationLength());
}
else
{
formatter.add("NA");
formatter.add("NA");
}
formatter.rowCompleted();
}
@@ -358,8 +343,6 @@ QString RicWellPathFractureTextReportFeatureImpl::createEllipseFractureText(
floatNumberColumn("Wf"),
floatNumberColumn("WDiam"),
floatNumberColumn("Skin"),
floatNumberColumn("Dfac"),
floatNumberColumn("LPerf"),
};
formatter.header(header);
@@ -374,8 +357,6 @@ QString RicWellPathFractureTextReportFeatureImpl::createEllipseFractureText(
formatter.add("[m]"); // Wf
formatter.add("[m]"); // WDiam
formatter.add("[] "); // Skin
formatter.add("[...]"); // DFac
formatter.add("[m]"); // LPerf
formatter.rowCompleted();
}
@@ -394,17 +375,6 @@ QString RicWellPathFractureTextReportFeatureImpl::createEllipseFractureText(
formatter.add(ellipseTemplate->wellDiameter());
formatter.add(ellipseTemplate->skinFactor());
if (ellipseTemplate->isNonDarcyFlowEnabled())
{
formatter.add(ellipseTemplate->dFactor());
formatter.add(ellipseTemplate->perforationLength());
}
else
{
formatter.add("NA");
formatter.add("NA");
}
formatter.rowCompleted();
}