mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
1339 - pre-proto - Starting functions for computing flow from fracture to well
This commit is contained in:
parent
96372c9077
commit
6dadf95713
@ -281,6 +281,7 @@ cvf::Mat4f RimFracture::transformMatrix()
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
//TODO: Make static and move to another class
|
||||||
void RimFracture::computeTransmissibility(RimEclipseCase* caseToApply)
|
void RimFracture::computeTransmissibility(RimEclipseCase* caseToApply)
|
||||||
{
|
{
|
||||||
//Get correct unit system:
|
//Get correct unit system:
|
||||||
@ -538,19 +539,14 @@ void RimFracture::computeUpscaledPropertyFromStimPlan(RimEclipseCase* caseToAppl
|
|||||||
std::vector<double> stimPlanParameterValues;
|
std::vector<double> stimPlanParameterValues;
|
||||||
fracTemplateStimPlan->getStimPlanDataAsPolygonsAndValues(stimPlanCellsAsPolygons, stimPlanParameterValues, resultName, resultUnit, timeStepIndex);
|
fracTemplateStimPlan->getStimPlanDataAsPolygonsAndValues(stimPlanCellsAsPolygons, stimPlanParameterValues, resultName, resultUnit, timeStepIndex);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//TODO: A lot of common code with function above... Can be cleaned up...?
|
//TODO: A lot of common code with function above... Can be cleaned up...?
|
||||||
std::vector<size_t> fracCells = getPotentiallyFracturedCells();
|
std::vector<size_t> fracCells = getPotentiallyFracturedCells();
|
||||||
|
|
||||||
|
|
||||||
RigEclipseCaseData* eclipseCaseData = caseToApply->eclipseCaseData();
|
RigEclipseCaseData* eclipseCaseData = caseToApply->eclipseCaseData();
|
||||||
|
|
||||||
RifReaderInterface::PorosityModelResultType porosityModel = RifReaderInterface::MATRIX_RESULTS;
|
RifReaderInterface::PorosityModelResultType porosityModel = RifReaderInterface::MATRIX_RESULTS;
|
||||||
RimReservoirCellResultsStorage* gridCellResults = caseToApply->results(porosityModel);
|
RimReservoirCellResultsStorage* gridCellResults = caseToApply->results(porosityModel);
|
||||||
RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo(porosityModel);
|
RigActiveCellInfo* activeCellInfo = eclipseCaseData->activeCellInfo(porosityModel);
|
||||||
|
|
||||||
|
|
||||||
std::vector<RigFractureData> fracDataVec;
|
std::vector<RigFractureData> fracDataVec;
|
||||||
|
|
||||||
for (size_t fracCell : fracCells)
|
for (size_t fracCell : fracCells)
|
||||||
@ -689,10 +685,15 @@ void RimFracture::computeFlowInFracture(RimEclipseCase* caseToApply)
|
|||||||
if (!attachedFractureDefinition()) return;
|
if (!attachedFractureDefinition()) return;
|
||||||
|
|
||||||
RimStimPlanFractureTemplate* fracTemplateStimPlan;
|
RimStimPlanFractureTemplate* fracTemplateStimPlan;
|
||||||
|
RimEllipseFractureTemplate* fracTemplateEllipse;
|
||||||
if (dynamic_cast<RimStimPlanFractureTemplate*>(attachedFractureDefinition()))
|
if (dynamic_cast<RimStimPlanFractureTemplate*>(attachedFractureDefinition()))
|
||||||
{
|
{
|
||||||
fracTemplateStimPlan = dynamic_cast<RimStimPlanFractureTemplate*>(attachedFractureDefinition());
|
fracTemplateStimPlan = dynamic_cast<RimStimPlanFractureTemplate*>(attachedFractureDefinition());
|
||||||
}
|
}
|
||||||
|
else if (dynamic_cast<RimEllipseFractureTemplate*>(attachedFractureDefinition()))
|
||||||
|
{
|
||||||
|
fracTemplateEllipse = dynamic_cast<RimEllipseFractureTemplate*>(attachedFractureDefinition());
|
||||||
|
}
|
||||||
else return;
|
else return;
|
||||||
|
|
||||||
//Get correct unit system:
|
//Get correct unit system:
|
||||||
@ -731,19 +732,67 @@ void RimFracture::computeFlowInFracture(RimEclipseCase* caseToApply)
|
|||||||
|
|
||||||
for (size_t fracCell : fracCells)
|
for (size_t fracCell : fracCells)
|
||||||
{
|
{
|
||||||
|
double K; //Conductivity
|
||||||
|
double w; //Fracture width
|
||||||
|
|
||||||
|
if (fracTemplateEllipse)
|
||||||
|
{
|
||||||
|
//TODO: UNit handling...
|
||||||
|
K = fracTemplateEllipse->fractureConductivity();
|
||||||
|
w = fracTemplateEllipse->width();
|
||||||
|
}
|
||||||
|
else if (fracTemplateStimPlan)
|
||||||
|
{
|
||||||
|
QString resultName = "CONDUCTIVITY";
|
||||||
|
QString resultUnit = "md-m";
|
||||||
|
size_t timeStepIndex = 0; //TODO...
|
||||||
|
double upscaledAritmStimPlanValue = cvf::UNDEFINED_DOUBLE;
|
||||||
|
double upscaledHarmStimPlanValue = cvf::UNDEFINED_DOUBLE;
|
||||||
|
caf::AppEnum< RimDefines::UnitSystem > unitSystem = RimDefines::UNITS_METRIC;
|
||||||
|
computeUpscaledPropertyFromStimPlanForEclipseCell(upscaledAritmStimPlanValue, upscaledHarmStimPlanValue, caseToApply, resultName, resultUnit, timeStepIndex, unitSystem, fracCell);
|
||||||
|
K = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2;
|
||||||
|
|
||||||
|
resultName = "WIDTH";
|
||||||
|
resultUnit = "cm"; //TODO handle mm and cm!
|
||||||
|
computeUpscaledPropertyFromStimPlanForEclipseCell(upscaledAritmStimPlanValue, upscaledHarmStimPlanValue, caseToApply, resultName, resultUnit, timeStepIndex, unitSystem, fracCell);
|
||||||
|
w = (upscaledAritmStimPlanValue + upscaledHarmStimPlanValue) / 2;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_rigFracture->setFractureData(fracDataVec);
|
m_rigFracture->setFractureData(fracDataVec);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RimFracture::computeFlowIntoTransverseWell(RimEclipseCase* caseToApply)
|
||||||
|
{
|
||||||
|
|
||||||
|
//TODO: A lot of common code with function for calculating transmissibility...
|
||||||
|
|
||||||
|
if (!attachedFractureDefinition()) return;
|
||||||
|
if (attachedFractureDefinition()->orientation == RimFractureTemplate::ALONG_WELL_PATH) return;
|
||||||
|
|
||||||
|
double wellRadius = cvf::UNDEFINED_DOUBLE;
|
||||||
|
if (attachedFractureDefinition()->orientation == RimFractureTemplate::TRANSVERSE_WELL_PATH)
|
||||||
|
{
|
||||||
|
wellRadius = 0.0;//TODO read this value...
|
||||||
|
}
|
||||||
|
if (attachedFractureDefinition()->orientation == RimFractureTemplate::AZIMUTH)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -88,6 +88,7 @@ public:
|
|||||||
void computeUpscaledPropertyFromStimPlan(RimEclipseCase* caseToApply, QString resultName, QString resultUnit, size_t timeStepIndex);
|
void computeUpscaledPropertyFromStimPlan(RimEclipseCase* caseToApply, QString resultName, QString resultUnit, size_t timeStepIndex);
|
||||||
void computeUpscaledPropertyFromStimPlanForEclipseCell(double &upscaledAritmStimPlanValue, double &upscaledHarmStimPlanValue, RimEclipseCase* caseToApply, QString resultName, QString resultUnit, size_t timeStepIndex, caf::AppEnum< RimDefines::UnitSystem > unitSystem, size_t cellIndex);
|
void computeUpscaledPropertyFromStimPlanForEclipseCell(double &upscaledAritmStimPlanValue, double &upscaledHarmStimPlanValue, RimEclipseCase* caseToApply, QString resultName, QString resultUnit, size_t timeStepIndex, caf::AppEnum< RimDefines::UnitSystem > unitSystem, size_t cellIndex);
|
||||||
void computeFlowInFracture(RimEclipseCase* caseToApply);
|
void computeFlowInFracture(RimEclipseCase* caseToApply);
|
||||||
|
void computeFlowIntoTransverseWell(RimEclipseCase* caseToApply);
|
||||||
|
|
||||||
double areaWeightedHarmonicAverage(std::vector<double> areaOfFractureParts, std::vector<double> valuesForFractureParts);
|
double areaWeightedHarmonicAverage(std::vector<double> areaOfFractureParts, std::vector<double> valuesForFractureParts);
|
||||||
double areaWeightedArithmeticAverage(std::vector<double> areaOfFractureParts, std::vector<double> valuesForFractureParts);
|
double areaWeightedArithmeticAverage(std::vector<double> areaOfFractureParts, std::vector<double> valuesForFractureParts);
|
||||||
@ -97,6 +98,8 @@ public:
|
|||||||
cvf::Vec3d fracturePosition() const;
|
cvf::Vec3d fracturePosition() const;
|
||||||
|
|
||||||
virtual void updateAzimuthFromFractureDefinition() = 0;
|
virtual void updateAzimuthFromFractureDefinition() = 0;
|
||||||
|
virtual double wellAzimuthAtFracturePosition() = 0;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) override;
|
virtual QList<caf::PdmOptionItemInfo> calculateValueOptions(const caf::PdmFieldHandle* fieldNeedingOptions, bool * useOptionsOnly) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user