mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Merge branch 'dev' into dev-deeper
This commit is contained in:
commit
4685d5981d
@ -218,9 +218,14 @@ QList<caf::PdmOptionItemInfo> RiaMemoryCleanup::calculateValueOptions(const caf:
|
||||
RimProject* proj = RiaApplication::instance()->project();
|
||||
if (proj)
|
||||
{
|
||||
std::vector<RimGeoMechCase*> cases = proj->geoMechCases();
|
||||
std::vector<RimEclipseCase*> eclipseCases = proj->eclipseCases();
|
||||
for (RimEclipseCase* c : eclipseCases)
|
||||
{
|
||||
options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon()));
|
||||
}
|
||||
|
||||
for (RimGeoMechCase* c : cases)
|
||||
std::vector<RimGeoMechCase*> geoMechCases = proj->geoMechCases();
|
||||
for (RimGeoMechCase* c : geoMechCases)
|
||||
{
|
||||
options.push_back(caf::PdmOptionItemInfo(c->caseUserDescription(), c, false, c->uiIcon()));
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ std::vector<RigCompletionData>
|
||||
{
|
||||
// No change in transmissibility for main bore
|
||||
auto transmissibilityAndPermeability =
|
||||
RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAndKh(
|
||||
RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityData(
|
||||
settings.caseToApply,
|
||||
wellPath,
|
||||
wellBorePart.lengthsInCell,
|
||||
@ -140,13 +140,13 @@ std::vector<RigCompletionData>
|
||||
globalCellIndex,
|
||||
settings.useLateralNTG);
|
||||
|
||||
transmissibility = transmissibilityAndPermeability.first;
|
||||
transmissibility = transmissibilityAndPermeability.connectionFactor();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Adjust transmissibility for fishbone laterals
|
||||
auto transmissibilityAndPermeability =
|
||||
RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAndKh(
|
||||
RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityData(
|
||||
settings.caseToApply,
|
||||
wellPath,
|
||||
wellBorePart.lengthsInCell,
|
||||
@ -157,7 +157,7 @@ std::vector<RigCompletionData>
|
||||
numberOfLaterals,
|
||||
mainBoreDirection);
|
||||
|
||||
transmissibility = transmissibilityAndPermeability.first;
|
||||
transmissibility = transmissibilityAndPermeability.connectionFactor();
|
||||
}
|
||||
|
||||
CellDirection direction = RicWellPathExportCompletionDataFeatureImpl::calculateCellMainDirection(
|
||||
|
@ -1260,7 +1260,7 @@ void RicWellPathExportCompletionDataFeatureImpl::exportWelspecsToFile(RimEclipse
|
||||
std::set<const RimWellPath*> wellPathSet;
|
||||
|
||||
// Build list of unique RimWellPath
|
||||
for (const auto completion : completions)
|
||||
for (const auto& completion : completions)
|
||||
{
|
||||
const auto wellPath = findWellPathFromExportName(completion.wellName());
|
||||
if (wellPath)
|
||||
@ -1272,13 +1272,13 @@ void RicWellPathExportCompletionDataFeatureImpl::exportWelspecsToFile(RimEclipse
|
||||
// Export
|
||||
for (const auto wellPath : wellPathSet)
|
||||
{
|
||||
auto rimCcompletions = wellPath->completions();
|
||||
cvf::Vec2i ijIntersection = wellPathUpperGridIntersectionIJ(gridCase, wellPath);
|
||||
auto rimCcompletions = wellPath->completions();
|
||||
auto ijIntersection = wellPathUpperGridIntersectionIJ(gridCase, wellPath);
|
||||
|
||||
formatter.add(rimCcompletions->wellNameForExport())
|
||||
.add(rimCcompletions->wellGroupNameForExport())
|
||||
.addOneBasedCellIndex(ijIntersection.x())
|
||||
.addOneBasedCellIndex(ijIntersection.y())
|
||||
.addOneBasedCellIndex(ijIntersection.second.x())
|
||||
.addOneBasedCellIndex(ijIntersection.second.y())
|
||||
.add(rimCcompletions->referenceDepthForExport())
|
||||
.add(rimCcompletions->wellTypeNameForExport())
|
||||
.rowCompleted();
|
||||
@ -1311,32 +1311,44 @@ void RicWellPathExportCompletionDataFeatureImpl::exportWelspeclToFile(
|
||||
formatter.keyword("WELSPECL");
|
||||
formatter.header(header);
|
||||
|
||||
std::map<QString, std::set<const RimWellPath*>> wellPathMap;
|
||||
std::map<const RimWellPath*, std::set<QString>> wellPathToLgrNameMap;
|
||||
|
||||
// Build list of unique RimWellPath for each LGR
|
||||
for (const auto completionsForLgr : completions)
|
||||
for (const auto& completionsForLgr : completions)
|
||||
{
|
||||
wellPathMap.insert(std::make_pair(completionsForLgr.first, std::set<const RimWellPath*>()));
|
||||
|
||||
for (const auto completion : completionsForLgr.second)
|
||||
for (const auto& completion : completionsForLgr.second)
|
||||
{
|
||||
const auto wellPath = findWellPathFromExportName(completion.wellName());
|
||||
if (wellPath)
|
||||
{
|
||||
wellPathMap[completionsForLgr.first].insert(wellPath);
|
||||
}
|
||||
auto item = wellPathToLgrNameMap.find(wellPath);
|
||||
wellPathToLgrNameMap[wellPath].insert(completionsForLgr.first);
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto wellPathsForLgr : wellPathMap)
|
||||
for (const auto& wellPathsForLgr : wellPathToLgrNameMap)
|
||||
{
|
||||
QString lgrName = wellPathsForLgr.first;
|
||||
const RimWellPath* wellPath = wellPathsForLgr.first;
|
||||
|
||||
// Export
|
||||
for (const auto wellPath : wellPathsForLgr.second)
|
||||
std::tuple<double, cvf::Vec2i, QString> itemWithLowestMD =
|
||||
std::make_tuple(std::numeric_limits<double>::max(), cvf::Vec2i(), "");
|
||||
|
||||
// Find first LGR-intersection along the well path
|
||||
|
||||
for (const auto& lgrName : wellPathsForLgr.second)
|
||||
{
|
||||
auto rimCompletions = wellPath->completions();
|
||||
cvf::Vec2i ijIntersection = wellPathUpperGridIntersectionIJ(gridCase, wellPath, lgrName);
|
||||
auto ijIntersection = wellPathUpperGridIntersectionIJ(gridCase, wellPath, lgrName);
|
||||
if (ijIntersection.first < std::get<0>(itemWithLowestMD))
|
||||
{
|
||||
itemWithLowestMD = std::make_tuple(ijIntersection.first, ijIntersection.second, lgrName);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
double measuredDepth = 0.0;
|
||||
cvf::Vec2i ijIntersection;
|
||||
QString lgrName;
|
||||
|
||||
std::tie(measuredDepth, ijIntersection, lgrName) = itemWithLowestMD;
|
||||
|
||||
auto rimCompletions = wellPath->completions();
|
||||
|
||||
formatter.add(rimCompletions->wellNameForExport())
|
||||
.add(rimCompletions->wellGroupNameForExport())
|
||||
@ -1348,7 +1360,6 @@ void RicWellPathExportCompletionDataFeatureImpl::exportWelspeclToFile(
|
||||
.rowCompleted();
|
||||
}
|
||||
}
|
||||
|
||||
formatter.tableCompleted();
|
||||
}
|
||||
|
||||
@ -1682,30 +1693,32 @@ std::vector<RigCompletionData> RicWellPathExportCompletionDataFeatureImpl::gener
|
||||
double dFactor = RigCompletionData::defaultValue();
|
||||
|
||||
{
|
||||
auto transmissibilityAndKh = calculateTransmissibilityAndKh(settings.caseToApply,
|
||||
wellPath,
|
||||
cell.intersectionLengthsInCellCS,
|
||||
interval->skinFactor(),
|
||||
interval->diameter(unitSystem) / 2,
|
||||
cell.globCellIndex,
|
||||
settings.useLateralNTG);
|
||||
auto transmissibilityData = calculateTransmissibilityData(settings.caseToApply,
|
||||
wellPath,
|
||||
cell.intersectionLengthsInCellCS,
|
||||
interval->skinFactor(),
|
||||
interval->diameter(unitSystem) / 2,
|
||||
cell.globCellIndex,
|
||||
settings.useLateralNTG);
|
||||
|
||||
transmissibility = transmissibilityAndKh.first;
|
||||
transmissibility = transmissibilityData.connectionFactor();
|
||||
|
||||
if (nonDarcyParameters->nonDarcyFlowType() == RimNonDarcyPerforationParameters::NON_DARCY_USER_DEFINED)
|
||||
{
|
||||
kh = transmissibilityAndKh.second;
|
||||
kh = transmissibilityData.kh();
|
||||
dFactor = nonDarcyParameters->userDefinedDFactor();
|
||||
}
|
||||
else if (nonDarcyParameters->nonDarcyFlowType() == RimNonDarcyPerforationParameters::NON_DARCY_COMPUTED)
|
||||
{
|
||||
kh = transmissibilityAndKh.second;
|
||||
kh = transmissibilityData.kh();
|
||||
|
||||
const double effectiveH = transmissibilityData.effectiveH();
|
||||
|
||||
const double effectivePermeability =
|
||||
kh * nonDarcyParameters->gridPermeabilityScalingFactor() / cell.intersectionLengthsInCellCS.length();
|
||||
nonDarcyParameters->gridPermeabilityScalingFactor() * transmissibilityData.effectiveK();
|
||||
|
||||
dFactor = calculateDFactor(settings.caseToApply,
|
||||
cell.intersectionLengthsInCellCS,
|
||||
effectiveH,
|
||||
cell.globCellIndex,
|
||||
wellPath->perforationIntervalCollection()->nonDarcyParameters(),
|
||||
effectivePermeability);
|
||||
@ -2318,16 +2331,16 @@ CellDirection RicWellPathExportCompletionDataFeatureImpl::calculateCellMainDirec
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<double, double>
|
||||
RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAndKh(RimEclipseCase* eclipseCase,
|
||||
const RimWellPath* wellPath,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double skinFactor,
|
||||
double wellRadius,
|
||||
size_t globalCellIndex,
|
||||
bool useLateralNTG,
|
||||
size_t volumeScaleConstant,
|
||||
CellDirection directionForVolumeScaling)
|
||||
TransmissibilityData
|
||||
RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityData(RimEclipseCase* eclipseCase,
|
||||
const RimWellPath* wellPath,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double skinFactor,
|
||||
double wellRadius,
|
||||
size_t globalCellIndex,
|
||||
bool useLateralNTG,
|
||||
size_t volumeScaleConstant,
|
||||
CellDirection directionForVolumeScaling)
|
||||
{
|
||||
RigEclipseCaseData* eclipseCaseData = eclipseCase->eclipseCaseData();
|
||||
|
||||
@ -2354,7 +2367,7 @@ std::pair<double, double>
|
||||
if (dxAccessObject.isNull() || dyAccessObject.isNull() || dzAccessObject.isNull() || permxAccessObject.isNull() ||
|
||||
permyAccessObject.isNull() || permzAccessObject.isNull())
|
||||
{
|
||||
return std::make_pair(std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity());
|
||||
return TransmissibilityData();
|
||||
}
|
||||
|
||||
double ntg = 1.0;
|
||||
@ -2379,7 +2392,10 @@ std::pair<double, double>
|
||||
double permy = permyAccessObject->cellScalarGlobIdx(globalCellIndex);
|
||||
double permz = permzAccessObject->cellScalarGlobIdx(globalCellIndex);
|
||||
|
||||
const double totalKh = RigTransmissibilityEquations::totalPermeability(permx, permy, permz, internalCellLengths, latNtg, ntg);
|
||||
const double totalKh = RigTransmissibilityEquations::totalKh(permx, permy, permz, internalCellLengths, latNtg, ntg);
|
||||
|
||||
const double effectiveK = RigTransmissibilityEquations::effectiveK(permx, permy, permz, internalCellLengths, latNtg, ntg);
|
||||
const double effectiveH = RigTransmissibilityEquations::effectiveH(internalCellLengths, latNtg, ntg);
|
||||
|
||||
double darcy = RiaEclipseUnitTools::darcysConstant(wellPath->unitSystem());
|
||||
|
||||
@ -2399,14 +2415,16 @@ std::pair<double, double>
|
||||
|
||||
const double totalConnectionFactor = RigTransmissibilityEquations::totalConnectionFactor(transx, transy, transz);
|
||||
|
||||
return std::make_pair(totalConnectionFactor, totalKh);
|
||||
TransmissibilityData trData;
|
||||
trData.setData(effectiveH, effectiveK, totalConnectionFactor, totalKh);
|
||||
return trData;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RicWellPathExportCompletionDataFeatureImpl::calculateDFactor(RimEclipseCase* eclipseCase,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double effectiveH,
|
||||
size_t globalCellIndex,
|
||||
const RimNonDarcyPerforationParameters* nonDarcyParameters,
|
||||
const double effectivePermeability)
|
||||
@ -2443,7 +2461,7 @@ double RicWellPathExportCompletionDataFeatureImpl::calculateDFactor(RimEclipseCa
|
||||
return EQ::dFactor(alpha,
|
||||
betaFactor,
|
||||
effectivePermeability,
|
||||
internalCellLengths.length(),
|
||||
effectiveH,
|
||||
nonDarcyParameters->wellRadius(),
|
||||
nonDarcyParameters->relativeGasDensity(),
|
||||
nonDarcyParameters->gasViscosity());
|
||||
@ -2522,9 +2540,10 @@ double RicWellPathExportCompletionDataFeatureImpl::calculateTransmissibilityAsEc
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
cvf::Vec2i RicWellPathExportCompletionDataFeatureImpl::wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase,
|
||||
const RimWellPath* wellPath,
|
||||
const QString& gridName)
|
||||
std::pair<double, cvf::Vec2i>
|
||||
RicWellPathExportCompletionDataFeatureImpl::wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase,
|
||||
const RimWellPath* wellPath,
|
||||
const QString& gridName)
|
||||
{
|
||||
const RigEclipseCaseData* caseData = gridCase->eclipseCaseData();
|
||||
const RigMainGrid* mainGrid = caseData->mainGrid();
|
||||
@ -2555,11 +2574,11 @@ cvf::Vec2i RicWellPathExportCompletionDataFeatureImpl::wellPathUpperGridIntersec
|
||||
size_t i, j, k;
|
||||
if (grid->ijkFromCellIndex(gridLocalCellIndex, &i, &j, &k))
|
||||
{
|
||||
return cvf::Vec2i((int)i, (int)j);
|
||||
return std::make_pair(intersection.startMD, cvf::Vec2i((int)i, (int)j));
|
||||
}
|
||||
}
|
||||
}
|
||||
return cvf::Vec2i();
|
||||
return std::make_pair(cvf::UNDEFINED_DOUBLE, cvf::Vec2i());
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
#include "cvfBase.h"
|
||||
#include "cvfVector3.h"
|
||||
#include "cvfVector2.h"
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
@ -51,6 +52,59 @@ class SubSegmentIntersectionInfo;
|
||||
//==================================================================================================
|
||||
typedef std::shared_ptr<QFile> QFilePtr;
|
||||
|
||||
class TransmissibilityData
|
||||
{
|
||||
public:
|
||||
TransmissibilityData()
|
||||
: m_isValid(false)
|
||||
, m_effectiveH(0.0)
|
||||
, m_effectiveK(0.0)
|
||||
, m_connectionFactor(0.0)
|
||||
, m_kh(0.0)
|
||||
{
|
||||
}
|
||||
|
||||
bool isValid() const
|
||||
{
|
||||
return m_isValid;
|
||||
}
|
||||
|
||||
void setData(double effectiveH, double effectiveK, double connectionFactor, double kh)
|
||||
{
|
||||
m_isValid = true;
|
||||
|
||||
m_effectiveH = effectiveH;
|
||||
m_effectiveK = effectiveK;
|
||||
m_connectionFactor = connectionFactor;
|
||||
m_kh = kh;
|
||||
}
|
||||
|
||||
double effectiveH() const
|
||||
{
|
||||
return m_effectiveH;
|
||||
}
|
||||
|
||||
double effectiveK() const
|
||||
{
|
||||
return m_effectiveK;
|
||||
}
|
||||
double connectionFactor() const
|
||||
{
|
||||
return m_connectionFactor;
|
||||
}
|
||||
double kh() const
|
||||
{
|
||||
return m_kh;
|
||||
}
|
||||
|
||||
private:
|
||||
bool m_isValid;
|
||||
double m_effectiveH;
|
||||
double m_effectiveK;
|
||||
double m_connectionFactor;
|
||||
double m_kh;
|
||||
};
|
||||
|
||||
//==================================================================================================
|
||||
///
|
||||
//==================================================================================================
|
||||
@ -82,8 +136,8 @@ public:
|
||||
size_t globalCellIndex,
|
||||
const cvf::Vec3d& lengthsInCell);
|
||||
|
||||
static std::pair<double, double>
|
||||
calculateTransmissibilityAndKh(RimEclipseCase* eclipseCase,
|
||||
static TransmissibilityData
|
||||
calculateTransmissibilityData(RimEclipseCase* eclipseCase,
|
||||
const RimWellPath* wellPath,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double skinFactor,
|
||||
@ -94,7 +148,7 @@ public:
|
||||
CellDirection directionForVolumeScaling = CellDirection::DIR_I);
|
||||
|
||||
static double calculateDFactor(RimEclipseCase* eclipseCase,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double effectiveH,
|
||||
size_t globalCellIndex,
|
||||
const RimNonDarcyPerforationParameters* nonDarcyParameters,
|
||||
const double effectivePermeability);
|
||||
@ -215,7 +269,9 @@ private:
|
||||
static void appendCompletionData(std::map<size_t, std::vector<RigCompletionData>>* completionData,
|
||||
const std::vector<RigCompletionData>& data);
|
||||
|
||||
static cvf::Vec2i wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase, const RimWellPath* wellPath, const QString& gridName = "");
|
||||
static std::pair<double, cvf::Vec2i> wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase,
|
||||
const RimWellPath* wellPath,
|
||||
const QString& gridName = "");
|
||||
|
||||
static void exportWellSegments(RimEclipseCase* eclipseCase,
|
||||
QFilePtr exportFile,
|
||||
|
@ -851,7 +851,7 @@ bool RimEclipseCase::openReserviorCase()
|
||||
descendantsIncludingThisOfType(gridColls);
|
||||
for (RimGridCollection* gridCollection : gridColls)
|
||||
{
|
||||
gridCollection->syncFromMainGrid();
|
||||
gridCollection->syncFromMainEclipseGrid();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -361,9 +361,9 @@ caf::PdmFieldHandle* RimGridCollection::objectToggleField()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimGridCollection::syncFromMainGrid()
|
||||
void RimGridCollection::syncFromMainEclipseGrid()
|
||||
{
|
||||
auto mainGrid = this->mainGrid();
|
||||
auto mainGrid = this->mainEclipseGrid();
|
||||
if (mainGrid)
|
||||
{
|
||||
m_mainGrid->setName("Main Grid");
|
||||
@ -471,14 +471,17 @@ void RimGridCollection::initAfterRead()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimGridCollection::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /*= ""*/)
|
||||
{
|
||||
uiTreeOrdering.add(m_mainGrid());
|
||||
if (hasPersistentLgrs())
|
||||
if (mainEclipseGrid())
|
||||
{
|
||||
uiTreeOrdering.add(m_persistentLgrs());
|
||||
}
|
||||
if (hasTemporaryLgrs())
|
||||
{
|
||||
uiTreeOrdering.add(m_temporaryLgrs());
|
||||
uiTreeOrdering.add(m_mainGrid());
|
||||
if (hasPersistentLgrs())
|
||||
{
|
||||
uiTreeOrdering.add(m_persistentLgrs());
|
||||
}
|
||||
if (hasTemporaryLgrs())
|
||||
{
|
||||
uiTreeOrdering.add(m_temporaryLgrs());
|
||||
}
|
||||
}
|
||||
uiTreeOrdering.skipRemainingChildren(true);
|
||||
}
|
||||
@ -486,7 +489,7 @@ void RimGridCollection::defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrder
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
const RigMainGrid* RimGridCollection::mainGrid() const
|
||||
const RigMainGrid* RimGridCollection::mainEclipseGrid() const
|
||||
{
|
||||
RimEclipseCase* eclipseCase;
|
||||
firstAncestorOrThisOfType(eclipseCase);
|
||||
@ -498,7 +501,7 @@ const RigMainGrid* RimGridCollection::mainGrid() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RimGridCollection::hasPersistentLgrs() const
|
||||
{
|
||||
auto mainGrid = this->mainGrid();
|
||||
auto mainGrid = this->mainEclipseGrid();
|
||||
if (!mainGrid) return false;
|
||||
|
||||
for (size_t i = 1; i < mainGrid->gridCount(); i++)
|
||||
@ -514,7 +517,7 @@ bool RimGridCollection::hasPersistentLgrs() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RimGridCollection::hasTemporaryLgrs() const
|
||||
{
|
||||
auto mainGrid = this->mainGrid();
|
||||
auto mainGrid = this->mainEclipseGrid();
|
||||
if (!mainGrid) return false;
|
||||
|
||||
for (size_t i = 1; i < mainGrid->gridCount(); i++)
|
||||
|
@ -103,7 +103,7 @@ public:
|
||||
std::vector<size_t> indicesToVisibleGrids() const;
|
||||
|
||||
caf::PdmFieldHandle* objectToggleField() override;
|
||||
void syncFromMainGrid();
|
||||
void syncFromMainEclipseGrid();
|
||||
void setMainGridActive(bool active);
|
||||
|
||||
static const QString persistentGridUiName();
|
||||
@ -115,7 +115,7 @@ protected:
|
||||
void defineUiTreeOrdering(caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "") override;
|
||||
|
||||
private:
|
||||
const RigMainGrid* mainGrid() const;
|
||||
const RigMainGrid* mainEclipseGrid() const;
|
||||
bool hasPersistentLgrs() const;
|
||||
bool hasTemporaryLgrs() const;
|
||||
|
||||
|
@ -57,12 +57,12 @@ double RigTransmissibilityEquations::totalConnectionFactor(double transX, double
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RigTransmissibilityEquations::totalPermeability(double cellPermX,
|
||||
double cellPermY,
|
||||
double cellPermZ,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double lateralNtg,
|
||||
double ntg)
|
||||
double RigTransmissibilityEquations::totalKh(double cellPermX,
|
||||
double cellPermY,
|
||||
double cellPermZ,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double lateralNtg,
|
||||
double ntg)
|
||||
{
|
||||
// Compute kh for each local grid cell axis
|
||||
// Use permeability values for the two other axis
|
||||
@ -70,9 +70,52 @@ double RigTransmissibilityEquations::totalPermeability(double cellPer
|
||||
double khy = sqrt(cellPermX * cellPermZ) * internalCellLengths.y() * lateralNtg;
|
||||
double khz = sqrt(cellPermX * cellPermY) * internalCellLengths.z() * ntg;
|
||||
|
||||
const double totalKh = cvf::Math::sqrt(khx * khx + khy * khy + khz * khz);
|
||||
const double totKh = cvf::Math::sqrt(khx * khx + khy * khy + khz * khz);
|
||||
|
||||
return totalKh;
|
||||
return totKh;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RigTransmissibilityEquations::effectiveK(double cellPermX,
|
||||
double cellPermY,
|
||||
double cellPermZ,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double lateralNtg,
|
||||
double ntg)
|
||||
{
|
||||
// Compute kh for each local grid cell axis
|
||||
// Use permeability values for the two other axis
|
||||
|
||||
double lx = internalCellLengths.x() * lateralNtg;
|
||||
double ly = internalCellLengths.y() * lateralNtg;
|
||||
double lz = internalCellLengths.z() * ntg;
|
||||
|
||||
double khx = sqrt(cellPermY * cellPermZ) * lx;
|
||||
double khy = sqrt(cellPermX * cellPermZ) * ly;
|
||||
double khz = sqrt(cellPermX * cellPermY) * lz;
|
||||
|
||||
double nominator = khx + khy + khz;
|
||||
double denominator = lx + ly + lz;
|
||||
|
||||
const double effK = nominator / denominator;
|
||||
|
||||
return effK;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RigTransmissibilityEquations::effectiveH(const cvf::Vec3d& internalCellLengths, double lateralNtg, double ntg)
|
||||
{
|
||||
double lx = internalCellLengths.x() * lateralNtg;
|
||||
double ly = internalCellLengths.y() * lateralNtg;
|
||||
double lz = internalCellLengths.z() * ntg;
|
||||
|
||||
double effH = cvf::Math::sqrt(lx*lx + ly*ly + lz*lz);
|
||||
|
||||
return effH;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -38,12 +38,21 @@ public:
|
||||
|
||||
static double totalConnectionFactor(double transX, double transY, double transZ);
|
||||
|
||||
static double totalPermeability(double cellPermX,
|
||||
double cellPermY,
|
||||
double cellPermZ,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double lateralNtg,
|
||||
double ntg);
|
||||
static double totalKh(double cellPermX,
|
||||
double cellPermY,
|
||||
double cellPermZ,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double lateralNtg,
|
||||
double ntg);
|
||||
|
||||
static double effectiveK(double cellPermX,
|
||||
double cellPermY,
|
||||
double cellPermZ,
|
||||
const cvf::Vec3d& internalCellLengths,
|
||||
double lateralNtg,
|
||||
double ntg);
|
||||
|
||||
static double effectiveH(const cvf::Vec3d& internalCellLengths, double lateralNtg, double ntg);
|
||||
|
||||
static double permeability(const double conductivity, const double width);
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "qwt_scale_engine.h"
|
||||
|
||||
#include <QDockWidget>
|
||||
#include <QGridLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QCheckBox>
|
||||
@ -99,23 +100,29 @@ RiuRelativePermeabilityPlotPanel::RiuRelativePermeabilityPlotPanel(QDockWidget*
|
||||
m_selectedCurvesButtonGroup->addButton(new QCheckBox("PCOG"), RigFlowDiagSolverInterface::RelPermCurve::PCOG);
|
||||
|
||||
QGroupBox* groupBox = new QGroupBox("Curves");
|
||||
QVBoxLayout* groupBoxLayout = new QVBoxLayout;
|
||||
QGridLayout* groupBoxLayout = new QGridLayout;
|
||||
groupBox->setLayout(groupBoxLayout);
|
||||
|
||||
QList<QAbstractButton*> checkButtonList = m_selectedCurvesButtonGroup->buttons();
|
||||
for (int i = 0; i < checkButtonList.size(); i++)
|
||||
{
|
||||
checkButtonList[i]->setChecked(true);
|
||||
groupBoxLayout->addWidget(checkButtonList[i]);
|
||||
groupBoxLayout->addWidget(checkButtonList[i], i / 2, i % 2);
|
||||
}
|
||||
|
||||
m_logarithmicScaleKrAxisCheckBox = new QCheckBox("Logarithmic Scale\nKr Axis");
|
||||
m_logarithmicScaleKrAxisCheckBox = new QCheckBox("Log Scale Kr Axis");
|
||||
m_showUnscaledCheckBox = new QCheckBox("Show Unscaled");
|
||||
m_fixedXAxisCheckBox = new QCheckBox("Fixed [0, 1] X-axis");
|
||||
m_fixedLeftYAxisCheckBox = new QCheckBox("Fixed [0, 1] Kr-axis");
|
||||
m_fixedXAxisCheckBox->setChecked(true);
|
||||
m_fixedLeftYAxisCheckBox->setChecked(true);
|
||||
|
||||
QVBoxLayout* leftLayout = new QVBoxLayout;
|
||||
leftLayout->addWidget(groupBox);
|
||||
leftLayout->addWidget(m_logarithmicScaleKrAxisCheckBox);
|
||||
leftLayout->addWidget(m_showUnscaledCheckBox);
|
||||
leftLayout->addWidget(m_fixedXAxisCheckBox);
|
||||
leftLayout->addWidget(m_fixedLeftYAxisCheckBox);
|
||||
leftLayout->addStretch(1);
|
||||
|
||||
QHBoxLayout* mainLayout = new QHBoxLayout();
|
||||
@ -128,6 +135,8 @@ RiuRelativePermeabilityPlotPanel::RiuRelativePermeabilityPlotPanel(QDockWidget*
|
||||
connect(m_selectedCurvesButtonGroup, SIGNAL(buttonClicked(int)), SLOT(slotButtonInButtonGroupClicked(int)));
|
||||
connect(m_logarithmicScaleKrAxisCheckBox, SIGNAL(stateChanged(int)), SLOT(slotSomeCheckBoxStateChanged(int)));
|
||||
connect(m_showUnscaledCheckBox, SIGNAL(stateChanged(int)), SLOT(slotSomeCheckBoxStateChanged(int)));
|
||||
connect(m_fixedXAxisCheckBox, SIGNAL(stateChanged(int)), SLOT(slotSomeCheckBoxStateChanged(int)));
|
||||
connect(m_fixedLeftYAxisCheckBox, SIGNAL(stateChanged(int)), SLOT(slotSomeCheckBoxStateChanged(int)));
|
||||
|
||||
plotUiSelectedCurves();
|
||||
}
|
||||
@ -208,7 +217,7 @@ void RiuRelativePermeabilityPlotPanel::clearPlot()
|
||||
m_caseName.clear();
|
||||
m_cellReferenceText.clear();
|
||||
|
||||
plotCurvesInQwt(m_unitSystem, m_allCurvesArr, m_swat, m_sgas, m_cellReferenceText, false, m_qwtPlot, &m_myPlotMarkers);
|
||||
plotCurvesInQwt(m_unitSystem, m_allCurvesArr, m_swat, m_sgas, m_cellReferenceText, false, true, true, m_qwtPlot, &m_myPlotMarkers);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -226,8 +235,10 @@ void RiuRelativePermeabilityPlotPanel::plotUiSelectedCurves()
|
||||
{
|
||||
std::vector<RigFlowDiagSolverInterface::RelPermCurve> selectedCurves = gatherUiSelectedCurves();
|
||||
|
||||
const bool useLogScale = m_logarithmicScaleKrAxisCheckBox->isChecked() ? true : false;
|
||||
plotCurvesInQwt(m_unitSystem, selectedCurves, m_swat, m_sgas, m_cellReferenceText, useLogScale, m_qwtPlot, &m_myPlotMarkers);
|
||||
const bool useLogScale = m_logarithmicScaleKrAxisCheckBox->isChecked();
|
||||
const bool fixedXAxis = m_fixedXAxisCheckBox->isChecked();
|
||||
const bool fixedYAxis = m_fixedLeftYAxisCheckBox->isChecked();
|
||||
plotCurvesInQwt(m_unitSystem, selectedCurves, m_swat, m_sgas, m_cellReferenceText, useLogScale, fixedXAxis, fixedYAxis, m_qwtPlot, &m_myPlotMarkers);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -282,7 +293,9 @@ void RiuRelativePermeabilityPlotPanel::plotCurvesInQwt(RiaEclipseUnitTools::Unit
|
||||
double swat,
|
||||
double sgas,
|
||||
QString cellReferenceText,
|
||||
bool logScaleLeftAxis,
|
||||
bool logScaleLeftAxis,
|
||||
bool fixedXAxis,
|
||||
bool fixedLeftYAxis,
|
||||
QwtPlot* plot,
|
||||
std::vector<QwtPlotMarker*>* myPlotMarkers)
|
||||
{
|
||||
@ -403,7 +416,6 @@ void RiuRelativePermeabilityPlotPanel::plotCurvesInQwt(RiaEclipseUnitTools::Unit
|
||||
if (!dynamic_cast<QwtLogScaleEngine*>(plot->axisScaleEngine(QwtPlot::yLeft)))
|
||||
{
|
||||
plot->setAxisScaleEngine(QwtPlot::yLeft, new QwtLogScaleEngine);
|
||||
//plot->setAxisAutoScale(QwtPlot::yLeft, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -411,10 +423,37 @@ void RiuRelativePermeabilityPlotPanel::plotCurvesInQwt(RiaEclipseUnitTools::Unit
|
||||
if (!dynamic_cast<QwtLinearScaleEngine*>(plot->axisScaleEngine(QwtPlot::yLeft)))
|
||||
{
|
||||
plot->setAxisScaleEngine(QwtPlot::yLeft, new QwtLinearScaleEngine);
|
||||
//plot->setAxisAutoScale(QwtPlot::yLeft, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (fixedXAxis)
|
||||
{
|
||||
plot->setAxisScale(QwtPlot::xBottom, 0.0, 1.0);
|
||||
plot->setAxisAutoScale(QwtPlot::xBottom, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
plot->setAxisAutoScale(QwtPlot::xBottom, true);
|
||||
}
|
||||
|
||||
if (fixedLeftYAxis)
|
||||
{
|
||||
if (logScaleLeftAxis)
|
||||
{
|
||||
plot->setAxisScale(QwtPlot::yLeft, 1.0e-6, 1.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
plot->setAxisScale(QwtPlot::yLeft, 0.0, 1.0);
|
||||
}
|
||||
plot->setAxisAutoScale(QwtPlot::yLeft, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
plot->setAxisAutoScale(QwtPlot::yLeft, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
QString titleStr = "Relative Permeability";
|
||||
if (!cellReferenceText.isEmpty())
|
||||
|
@ -81,6 +81,8 @@ private:
|
||||
double sgas,
|
||||
QString cellReferenceText,
|
||||
bool logScaleLeftAxis,
|
||||
bool fixedXAxis,
|
||||
bool fixedLeftYAxis,
|
||||
QwtPlot* plot,
|
||||
std::vector<QwtPlotMarker*>* myPlotMarkers);
|
||||
|
||||
@ -128,6 +130,8 @@ private:
|
||||
QButtonGroup* m_selectedCurvesButtonGroup;
|
||||
QCheckBox* m_showUnscaledCheckBox;
|
||||
QCheckBox* m_logarithmicScaleKrAxisCheckBox;
|
||||
QCheckBox* m_fixedXAxisCheckBox;
|
||||
QCheckBox* m_fixedLeftYAxisCheckBox;
|
||||
|
||||
std::unique_ptr<RiuRelativePermeabilityPlotUpdater> m_plotUpdater;
|
||||
};
|
||||
|
@ -1,16 +1,16 @@
|
||||
|
||||
set(RESINSIGHT_MAJOR_VERSION 2018)
|
||||
set(RESINSIGHT_MINOR_VERSION 05)
|
||||
set(RESINSIGHT_PATCH_VERSION 1)
|
||||
set(RESINSIGHT_MINOR_VERSION 11)
|
||||
set(RESINSIGHT_PATCH_VERSION 0)
|
||||
|
||||
# Opional text with no restrictions
|
||||
set(RESINSIGHT_VERSION_TEXT "-dev")
|
||||
set(RESINSIGHT_VERSION_TEXT "-RC1")
|
||||
|
||||
# Optional text
|
||||
# Must be unique and increasing within one combination of major/minor/patch version
|
||||
# The uniqueness of this text is independent of RESINSIGHT_VERSION_TEXT
|
||||
# Format of text must be ".xx"
|
||||
set(RESINSIGHT_DEV_VERSION ".12")
|
||||
#set(RESINSIGHT_DEV_VERSION ".12")
|
||||
|
||||
# https://github.com/CRAVA/crava/tree/master/libs/nrlib
|
||||
set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f")
|
||||
|
Loading…
Reference in New Issue
Block a user