mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3779 Implement accumulator system for ICDs in preparation of using this for AICDs
This commit is contained in:
parent
6e1b8adba1
commit
ddd454077f
@ -15,6 +15,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicMswCompletions.h
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.h
|
${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.h
|
${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicMswSubSegment.h
|
${CMAKE_CURRENT_LIST_DIR}/RicMswSubSegment.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicMswValveAccumulators.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.h
|
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.h
|
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.h
|
${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.h
|
||||||
@ -37,6 +38,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RicMswCompletions.cpp
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicMswSubSegment.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicMswSubSegment.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RicMswValveAccumulators.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.cpp
|
||||||
|
@ -17,7 +17,10 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "RicMswCompletions.h"
|
#include "RicMswCompletions.h"
|
||||||
|
|
||||||
#include "RicMswSubSegment.h"
|
#include "RicMswSubSegment.h"
|
||||||
|
|
||||||
|
#include "RimWellPathValve.h"
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -97,8 +100,54 @@ void RicMswCompletion::setLabel(const QString& label)
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RicMswICD::RicMswICD(const QString& label, size_t index /*= cvf::UNDEFINED_SIZE_T*/, int branchNumber /*= cvf::UNDEFINED_INT*/)
|
RicMswFracture::RicMswFracture(const QString& label,
|
||||||
|
size_t index /*= cvf::UNDEFINED_SIZE_T*/,
|
||||||
|
int branchNumber /*= cvf::UNDEFINED_INT*/)
|
||||||
: RicMswCompletion(label, index, branchNumber)
|
: RicMswCompletion(label, index, branchNumber)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RigCompletionData::CompletionType RicMswFracture::completionType() const
|
||||||
|
{
|
||||||
|
return RigCompletionData::FRACTURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicMswPerforation::RicMswPerforation(const QString& label,
|
||||||
|
size_t index /*= cvf::UNDEFINED_SIZE_T*/,
|
||||||
|
int branchNumber /*= cvf::UNDEFINED_INT*/)
|
||||||
|
: RicMswCompletion(label, index, branchNumber)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RigCompletionData::CompletionType RicMswPerforation::completionType() const
|
||||||
|
{
|
||||||
|
return RigCompletionData::PERFORATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicMswValve::RicMswValve(const QString& label,
|
||||||
|
size_t index /*= cvf::UNDEFINED_SIZE_T*/,
|
||||||
|
int branchNumber /*= cvf::UNDEFINED_INT*/)
|
||||||
|
: RicMswCompletion(label, index, branchNumber)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicMswICD::RicMswICD(const QString& label, size_t index /*= cvf::UNDEFINED_SIZE_T*/, int branchNumber /*= cvf::UNDEFINED_INT*/)
|
||||||
|
: RicMswValve(label, index, branchNumber)
|
||||||
, m_flowCoefficient(0.0)
|
, m_flowCoefficient(0.0)
|
||||||
, m_area(0.0)
|
, m_area(0.0)
|
||||||
{
|
{
|
||||||
@ -154,42 +203,6 @@ RigCompletionData::CompletionType RicMswFishbonesICD::completionType() const
|
|||||||
return RigCompletionData::FISHBONES_ICD;
|
return RigCompletionData::FISHBONES_ICD;
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RicMswFracture::RicMswFracture(const QString& label,
|
|
||||||
size_t index /*= cvf::UNDEFINED_SIZE_T*/,
|
|
||||||
int branchNumber /*= cvf::UNDEFINED_INT*/)
|
|
||||||
: RicMswCompletion(label, index, branchNumber)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RigCompletionData::CompletionType RicMswFracture::completionType() const
|
|
||||||
{
|
|
||||||
return RigCompletionData::FRACTURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RicMswPerforation::RicMswPerforation(const QString& label,
|
|
||||||
size_t index /*= cvf::UNDEFINED_SIZE_T*/,
|
|
||||||
int branchNumber /*= cvf::UNDEFINED_INT*/)
|
|
||||||
: RicMswCompletion(label, index, branchNumber)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
///
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
|
||||||
RigCompletionData::CompletionType RicMswPerforation::completionType() const
|
|
||||||
{
|
|
||||||
return RigCompletionData::PERFORATION;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -207,5 +220,3 @@ RigCompletionData::CompletionType RicMswPerforationICD::completionType() const
|
|||||||
{
|
{
|
||||||
return RigCompletionData::PERFORATION_ICD;
|
return RigCompletionData::PERFORATION_ICD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
class RimWellPathValve;
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
@ -70,7 +72,37 @@ public:
|
|||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
class RicMswICD : public RicMswCompletion
|
class RicMswFracture : public RicMswCompletion
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RicMswFracture(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
||||||
|
RigCompletionData::CompletionType completionType() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicMswPerforation : public RicMswCompletion
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RicMswPerforation(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
||||||
|
RigCompletionData::CompletionType completionType() const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicMswValve : public RicMswCompletion
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RicMswValve(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
||||||
|
virtual ~RicMswValve() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicMswICD : public RicMswValve
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RicMswICD(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
RicMswICD(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
||||||
@ -93,26 +125,6 @@ public:
|
|||||||
RigCompletionData::CompletionType completionType() const override;
|
RigCompletionData::CompletionType completionType() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
//==================================================================================================
|
|
||||||
///
|
|
||||||
//==================================================================================================
|
|
||||||
class RicMswFracture : public RicMswCompletion
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RicMswFracture(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
|
||||||
RigCompletionData::CompletionType completionType() const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
//==================================================================================================
|
|
||||||
///
|
|
||||||
//==================================================================================================
|
|
||||||
class RicMswPerforation : public RicMswCompletion
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RicMswPerforation(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
|
||||||
RigCompletionData::CompletionType completionType() const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
///
|
///
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
@ -122,5 +134,3 @@ public:
|
|||||||
RicMswPerforationICD(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
RicMswPerforationICD(const QString& label, size_t index = cvf::UNDEFINED_SIZE_T, int branchNumber = cvf::UNDEFINED_INT);
|
||||||
RigCompletionData::CompletionType completionType() const override;
|
RigCompletionData::CompletionType completionType() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
#include "RicMswValveAccumulators.h"
|
||||||
|
|
||||||
|
#include "RicMswCompletions.h"
|
||||||
|
|
||||||
|
#include "RimWellPathValve.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RicMswICDAccumulator::RicMswICDAccumulator(RiaEclipseUnitTools::UnitSystem unitSystem)
|
||||||
|
: RicMswValveAccumulator(unitSystem)
|
||||||
|
, m_areaSum(0.0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicMswICDAccumulator::accumulateValveParameters(const RimWellPathValve* wellPathValve, double contributionFraction)
|
||||||
|
{
|
||||||
|
double icdOrificeRadius = wellPathValve->orificeDiameter(m_unitSystem) / 2;
|
||||||
|
double icdArea = icdOrificeRadius * icdOrificeRadius * cvf::PI_D;
|
||||||
|
|
||||||
|
m_areaSum += icdArea * contributionFraction;
|
||||||
|
m_coefficientCalculator.addValueAndWeight(wellPathValve->flowCoefficient(), icdArea * contributionFraction);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
void RicMswICDAccumulator::applyToSuperValve(std::shared_ptr<RicMswValve> valve)
|
||||||
|
{
|
||||||
|
std::shared_ptr<RicMswICD> icd = std::dynamic_pointer_cast<RicMswICD>(valve);
|
||||||
|
CVF_ASSERT(icd);
|
||||||
|
icd->setArea(m_areaSum);
|
||||||
|
if (m_coefficientCalculator.validAggregatedWeight())
|
||||||
|
{
|
||||||
|
icd->setFlowCoefficient(m_coefficientCalculator.weightedMean());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2018 Equinor ASA
|
||||||
|
//
|
||||||
|
// ResInsight is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "RiaEclipseUnitTools.h"
|
||||||
|
#include "RiaWeightedMeanCalculator.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class RimWellPathValve;
|
||||||
|
class RicMswValve;
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicMswValveAccumulator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RicMswValveAccumulator(RiaEclipseUnitTools::UnitSystem unitSystem) : m_unitSystem(unitSystem) {}
|
||||||
|
virtual void accumulateValveParameters(const RimWellPathValve* wellPathValve, double contributionFraction) = 0;
|
||||||
|
virtual void applyToSuperValve(std::shared_ptr<RicMswValve> valve) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
RiaEclipseUnitTools::UnitSystem m_unitSystem;
|
||||||
|
};
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RicMswICDAccumulator : public RicMswValveAccumulator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RicMswICDAccumulator(RiaEclipseUnitTools::UnitSystem unitSystem);
|
||||||
|
void accumulateValveParameters(const RimWellPathValve* wellPathValve, double contributionFraction) override;
|
||||||
|
void applyToSuperValve(std::shared_ptr<RicMswValve> valve) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
RiaWeightedMeanCalculator<double> m_coefficientCalculator;
|
||||||
|
double m_areaSum;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
|||||||
#include "RicExportCompletionDataSettingsUi.h"
|
#include "RicExportCompletionDataSettingsUi.h"
|
||||||
#include "RicExportFractureCompletionsImpl.h"
|
#include "RicExportFractureCompletionsImpl.h"
|
||||||
#include "RicMswExportInfo.h"
|
#include "RicMswExportInfo.h"
|
||||||
|
#include "RicMswValveAccumulators.h"
|
||||||
#include "RicWellPathExportCompletionsFileTools.h"
|
#include "RicWellPathExportCompletionsFileTools.h"
|
||||||
|
|
||||||
#include "RifEclipseDataTableFormatter.h"
|
#include "RifEclipseDataTableFormatter.h"
|
||||||
@ -1055,10 +1056,10 @@ void RicWellPathExportMswCompletionsImpl::assignValveContributionsToSuperValves(
|
|||||||
ValveContributionMap assignedRegularValves;
|
ValveContributionMap assignedRegularValves;
|
||||||
for (std::shared_ptr<RicMswSegment> segment : mainBoreSegments)
|
for (std::shared_ptr<RicMswSegment> segment : mainBoreSegments)
|
||||||
{
|
{
|
||||||
std::shared_ptr<RicMswPerforationICD> superValve;
|
std::shared_ptr<RicMswValve> superValve;
|
||||||
for (auto completion : segment->completions())
|
for (auto completion : segment->completions())
|
||||||
{
|
{
|
||||||
std::shared_ptr<RicMswPerforationICD> valve = std::dynamic_pointer_cast<RicMswPerforationICD>(completion);
|
std::shared_ptr<RicMswValve> valve = std::dynamic_pointer_cast<RicMswValve>(completion);
|
||||||
if (valve)
|
if (valve)
|
||||||
{
|
{
|
||||||
superValve = valve;
|
superValve = valve;
|
||||||
@ -1068,8 +1069,11 @@ void RicWellPathExportMswCompletionsImpl::assignValveContributionsToSuperValves(
|
|||||||
|
|
||||||
if (!superValve) continue;
|
if (!superValve) continue;
|
||||||
|
|
||||||
double totalIcdArea = 0.0;
|
std::shared_ptr<RicMswValveAccumulator> accumulator;
|
||||||
RiaWeightedMeanCalculator<double> coeffMeanCalc;
|
if (std::dynamic_pointer_cast<const RicMswPerforationICD>(superValve))
|
||||||
|
{
|
||||||
|
accumulator.reset(new RicMswICDAccumulator(unitSystem));
|
||||||
|
}
|
||||||
|
|
||||||
for (const RimPerforationInterval* interval : perforationIntervals)
|
for (const RimPerforationInterval* interval : perforationIntervals)
|
||||||
{
|
{
|
||||||
@ -1086,21 +1090,17 @@ void RicWellPathExportMswCompletionsImpl::assignValveContributionsToSuperValves(
|
|||||||
double overlapEnd = std::min(valveSegment.second, segment->endMD());
|
double overlapEnd = std::min(valveSegment.second, segment->endMD());
|
||||||
double overlap = std::max(0.0, overlapEnd - overlapStart);
|
double overlap = std::max(0.0, overlapEnd - overlapStart);
|
||||||
|
|
||||||
if (overlap > 0.0)
|
if (overlap > 0.0 && accumulator)
|
||||||
{
|
{
|
||||||
assignedRegularValves[superValve].insert(std::make_pair(valve, nSubValve));
|
assignedRegularValves[superValve].insert(std::make_pair(valve, nSubValve));
|
||||||
double icdOrificeRadius = valve->orificeDiameter(unitSystem) / 2;
|
accumulator->accumulateValveParameters(valve, overlap / valveSegmentLength);
|
||||||
double icdArea = icdOrificeRadius * icdOrificeRadius * cvf::PI_D * overlap / valveSegmentLength;
|
|
||||||
totalIcdArea += icdArea;
|
|
||||||
coeffMeanCalc.addValueAndWeight(valve->flowCoefficient(), icdArea);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
superValve->setArea(totalIcdArea);
|
if (superValve && accumulator)
|
||||||
if (coeffMeanCalc.validAggregatedWeight())
|
|
||||||
{
|
{
|
||||||
superValve->setFlowCoefficient(coeffMeanCalc.weightedMean());
|
accumulator->applyToSuperValve(superValve);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user