#1487 - pre-proto - Making functions for calculating relevant transmissibilities static, and using cell sizes, conductivities etc as inputs instead of entire RigStimPlanCell

This commit is contained in:
astridkbjorke 2017-05-18 15:14:27 +02:00
parent c914071d33
commit c7354e8548
5 changed files with 74 additions and 34 deletions

View File

@ -656,7 +656,14 @@ void RifFractureExportTools::printTransmissibilityFractureToWell(const std::vect
const RigStimPlanFracTemplateCell& stimPlanCell = fracTemplateStimPlan->stimPlanCellFromIndex(fracTemplateStimPlan->getGlobalIndexFromIJ(wellCenterStimPlanCellIJ.first, wellCenterStimPlanCellIJ.second));
RigFractureTransCalc transmissibilityCalculator(caseToApply, fracture);
double linTransInStimPlanCell = transmissibilityCalculator.computeLinearTransmissibilityToWellinStimPlanCell(stimPlanCell, perforationLengthVert, perforationLengthHor);
double linTransInStimPlanCell = transmissibilityCalculator.computeLinearTransmissibilityToWellinStimPlanCell(stimPlanCell.getConductivtyValue(),
stimPlanCell.cellSizeX(),
stimPlanCell.cellSizeZ(),
perforationLengthVert,
perforationLengthHor,
fracture->perforationEfficiency,
fracture->attachedFractureDefinition()->skinFactor(),
transmissibilityCalculator.cDarcy());
out << qSetFieldWidth(10);
out << QString::number(linTransInStimPlanCell, 'f', 2);
@ -681,13 +688,17 @@ void RifFractureExportTools::printTransmissibilityFractureToWell(const std::vect
out << wellCenterStimPlanCellIJ.first;
out << wellCenterStimPlanCellIJ.second;
//RigStimPlanCell* stimPlanCell = fracTemplateStimPlan->getStimPlanCellAtIJ(wellCenterStimPlanCellIJ.first, wellCenterStimPlanCellIJ.second);
const RigStimPlanFracTemplateCell& stimPlanCell = fracTemplateStimPlan->stimPlanCellFromIndex(fracTemplateStimPlan->getGlobalIndexFromIJ(wellCenterStimPlanCellIJ.first, wellCenterStimPlanCellIJ.second));
//TODO: Error - stimPlanCell blir ikke riktig...
RigFractureTransCalc transmissibilityCalculator(caseToApply, fracture);
double radTransInStimPlanCell = transmissibilityCalculator.computeRadialTransmissibilityToWellinStimPlanCell(stimPlanCell);
double radTransInStimPlanCell = transmissibilityCalculator.computeRadialTransmissibilityToWellinStimPlanCell(stimPlanCell.getConductivtyValue(),
stimPlanCell.cellSizeX(),
stimPlanCell.cellSizeZ(),
fracture->wellRadius(),
fracture->attachedFractureDefinition()->skinFactor(),
fracture->azimuth,
fracture->wellAzimuthAtFracturePosition(),
transmissibilityCalculator.cDarcy());
out << qSetFieldWidth(10);
out << QString::number(radTransInStimPlanCell, 'f', 2);

View File

@ -203,9 +203,9 @@ void RigEclipseToStimPlanCellTransmissibilityCalculator::calculateStimPlanCellsM
double fractureAreaWeightedlength = totalAreaXLength / fractureArea;
double transmissibility_X = calculateMatrixTransmissibility(permY, NTG, Ay, dx, m_fractureSkinFactor, fractureAreaWeightedlength);
double transmissibility_Y = calculateMatrixTransmissibility(permX, NTG, Ax, dy, m_fractureSkinFactor, fractureAreaWeightedlength);
double transmissibility_Z = calculateMatrixTransmissibility(permZ, 1.0, Az, dz, m_fractureSkinFactor, fractureAreaWeightedlength);
double transmissibility_X = calculateMatrixTransmissibility(permY, NTG, Ay, dx, m_fractureSkinFactor, fractureAreaWeightedlength, m_cDarcy);
double transmissibility_Y = calculateMatrixTransmissibility(permX, NTG, Ax, dy, m_fractureSkinFactor, fractureAreaWeightedlength, m_cDarcy);
double transmissibility_Z = calculateMatrixTransmissibility(permZ, 1.0, Az, dz, m_fractureSkinFactor, fractureAreaWeightedlength, m_cDarcy);
double transmissibility = sqrt(transmissibility_X * transmissibility_X
+ transmissibility_Y * transmissibility_Y
@ -290,12 +290,13 @@ double RigEclipseToStimPlanCellTransmissibilityCalculator::calculateMatrixTransm
double A,
double cellSizeLength,
double skinfactor,
double fractureAreaWeightedlength)
double fractureAreaWeightedlength,
double cDarcy)
{
double transmissibility;
double slDivPi = (skinfactor * fractureAreaWeightedlength) / cvf::PI_D;
transmissibility = 8 * m_cDarcy * (perm * NTG) * A / (cellSizeLength + slDivPi);
transmissibility = 8 * cDarcy * (perm * NTG) * A / (cellSizeLength + slDivPi);
return transmissibility;
}

View File

@ -50,12 +50,13 @@ private:
cvf::Vec3d & localX,
cvf::Vec3d & localY,
cvf::Vec3d & localZ);
double calculateMatrixTransmissibility(double permX,
static double calculateMatrixTransmissibility(double permX,
double NTG,
double Ay,
double dx,
double skinfactor,
double fractureAreaWeightedlength);
double fractureAreaWeightedlength,
double cDarcy);
const RimEclipseCase* m_case;
double m_cDarcy;

View File

@ -587,22 +587,28 @@ double RigFractureTransCalc::computeStimPlanCellTransmissibilityInFracture(doubl
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RigFractureTransCalc::computeRadialTransmissibilityToWellinStimPlanCell(const RigStimPlanFracTemplateCell& stimPlanCell)
double RigFractureTransCalc::computeRadialTransmissibilityToWellinStimPlanCell(double stimPlanCellConductivity,
double stimPlanCellSizeX,
double stimPlanCellSizeZ,
double wellRadius,
double skinFactor,
double fractureAzimuth,
double wellAzimuthAtFracturePosition,
double cDarcyForRelevantUnit)
{
//TODO: Ta inn relevante parametre, ikke hele brønncella
if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::ALONG_WELL_PATH) return cvf::UNDEFINED_DOUBLE;
double areaScalingFactor = 1.0;
if (m_fracture->attachedFractureDefinition()->orientation == RimFractureTemplate::AZIMUTH)
double angleinRad = cvf::Math::toRadians(fractureAzimuth - (wellAzimuthAtFracturePosition - 90));
if ((angleinRad-90.0) > 0.01)
{
areaScalingFactor = 1 / cvf::Math::cos((m_fracture->azimuth() - (m_fracture->wellAzimuthAtFracturePosition()-90) ));
areaScalingFactor = 1 / cvf::Math::cos(angleinRad);
}
double ro = 0.14 * cvf::Math::sqrt(
pow(stimPlanCell.cellSizeX(), 2.0) + pow(stimPlanCell.cellSizeZ(), 2));
pow(stimPlanCellSizeX, 2.0) + pow(stimPlanCellSizeZ, 2));
double Tc = 2 * cvf::PI_D * cDarcy() * stimPlanCell.getConductivtyValue() /
(log(ro / m_fracture->wellRadius()) + m_fracture->attachedFractureDefinition()->skinFactor() );
double Tc = 2 * cvf::PI_D * cDarcyForRelevantUnit * stimPlanCellConductivity /
(log(ro / wellRadius) + skinFactor );
Tc = Tc * areaScalingFactor;
@ -612,20 +618,25 @@ double RigFractureTransCalc::computeRadialTransmissibilityToWellinStimPlanCell(c
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RigFractureTransCalc::computeLinearTransmissibilityToWellinStimPlanCell(const RigStimPlanFracTemplateCell& stimPlanCell, double perforationLengthVertical, double perforationLengthHorizontal)
double RigFractureTransCalc::computeLinearTransmissibilityToWellinStimPlanCell(double stimPlanConductivity,
double stimPlanCellSizeX,
double stimPlanCellSizeZ,
double perforationLengthVertical,
double perforationLengthHorizontal,
double perforationEfficiency,
double skinfactor,
double cDarcyForRelevantUnit)
{
//TODO: Ta inn relevante parametre, ikke hele brønncella
double TcPrefix = 8 * cDarcyForRelevantUnit * stimPlanConductivity;
double TcPrefix = 8 * cDarcy() * stimPlanCell.getConductivtyValue();
double DzPerf = perforationLengthVertical * m_fracture->perforationEfficiency();
double DxPerf = perforationLengthHorizontal * m_fracture->perforationEfficiency();
double DzPerf = perforationLengthVertical * perforationEfficiency;
double DxPerf = perforationLengthHorizontal * perforationEfficiency;
double TcZ = TcPrefix * DzPerf /
(stimPlanCell.cellSizeX() + m_fracture->attachedFractureDefinition()->skinFactor() * DzPerf / cvf::PI_D);
(stimPlanCellSizeX + skinfactor * DzPerf / cvf::PI_D);
double TcX = TcPrefix * DxPerf /
(stimPlanCell.cellSizeZ() + m_fracture->attachedFractureDefinition()->skinFactor() * DxPerf / cvf::PI_D);
(stimPlanCellSizeZ + skinfactor* DxPerf / cvf::PI_D);
double Tc = cvf::Math::sqrt(pow(TcX, 2) + pow(TcZ, 2));
return Tc;

View File

@ -55,13 +55,28 @@ public:
std::vector<RigFracturedEclipseCellExportData> computeUpscaledPropertyFromStimPlan(QString resultName, QString resultUnit, size_t timeStepIndex);
// Calculations based on StimPlan grid
static double computeStimPlanCellTransmissibilityInFracture(double conductivity, double sideLengthParallellTrans, double sideLengthNormalTrans);
static double computeStimPlanCellTransmissibilityInFracture(double conductivity,
double sideLengthParallellTrans,
double sideLengthNormalTrans);
double computeRadialTransmissibilityToWellinStimPlanCell(const RigStimPlanFracTemplateCell& stimPlanCell);
double computeLinearTransmissibilityToWellinStimPlanCell(const RigStimPlanFracTemplateCell& stimPlanCell,
static double computeRadialTransmissibilityToWellinStimPlanCell(double stimPlanCellConductivity,
double stimPlanCellSizeX,
double stimPlanCellSizeZ,
double wellRadius,
double skinFactor,
double fractureAzimuth,
double wellAzimuthAtFracturePosition,
double cDarcyForRelevantUnit);
static double computeLinearTransmissibilityToWellinStimPlanCell(double stimPlanConductivity,
double stimPlanCellSizeX,
double stimPlanCellSizeZ,
double perforationLengthVertical,
double perforationLengthHorizontal);
double perforationLengthHorizontal,
double perforationEfficiency,
double skinfactor,
double cDarcyForRelevantUnit);
double cDarcy();
private:
@ -91,3 +106,4 @@ private:
RimDefines::UnitSystem m_unitForCalculation;
};