///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2017 Statoil 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 // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once //================================================================================================== /// /// //================================================================================================== class RigMainGrid; class RigActiveCellInfo; class RigEclCellIndexCalculator { public: RigEclCellIndexCalculator(const RigMainGrid* mainGrid, const RigActiveCellInfo* activeCellInfo) : m_mainGrid(mainGrid), m_activeCellInfo(activeCellInfo) {} size_t resultCellIndex(size_t gridIndex, size_t gridCellIndex) const; private: const RigMainGrid* m_mainGrid; const RigActiveCellInfo* m_activeCellInfo; }; //================================================================================================== /// /// //================================================================================================== #include #include #include #include "cvfBase.h" #include "cvfVector3.h" struct RigWellResultPoint; class RigAccWellFlowCalculator { public: RigAccWellFlowCalculator(const std::vector< std::vector >& pipeBranchesCLCoords, const std::vector< std::vector >& pipeBranchesCellIds, const std::map* >& tracerCellFractionValues, const RigEclCellIndexCalculator cellIndexCalculator, double smallContribThreshold, bool isProducer); RigAccWellFlowCalculator(const std::vector< std::vector >& pipeBranchesCLCoords, const std::vector< std::vector >& pipeBranchesCellIds, double smallContribThreshold); const std::vector& accumulatedTotalFlowPrConnection( size_t branchIdx);// const; const std::vector& accumulatedTracerFlowPrConnection(const QString& tracerName, size_t branchIdx);// const; const std::vector& connectionNumbersFromTop(size_t branchIdx) const; const std::vector& tracerNames() const { return m_tracerNames;} std::vector > totalTracerFractions(); private: bool isWellFlowConsistent(bool isProducer); void calculateAccumulatedFlowPrConnection( size_t branchIdx, size_t startConnectionNumberFromTop); std::vector wrpToConnectionIndexFromBottom( const std::vector &branchCells); static size_t connectionIndexFromTop( const std::vector& resPointToConnectionIndexFromBottom, size_t clSegIdx); std::vector findDownstreamBranchIdxs( const RigWellResultPoint& connectionPoint); std::vector > totalWellFlowPrTracer() ; void sortTracers(); void groupSmallContributions(); const std::vector< std::vector >& m_pipeBranchesCLCoords; const std::vector< std::vector >& m_pipeBranchesCellIds; const std::map* >* m_tracerCellFractionValues; RigEclCellIndexCalculator m_cellIndexCalculator; std::vector m_tracerNames; double m_smallContributionsThreshold; struct BranchFlow { std::vector depthValuesFromTop; std::map > accFlowPrTracer; std::map > flowPrTracer; }; std::vector< BranchFlow > m_accConnectionFlowPrBranch; std::vector< BranchFlow > m_accPseudoLengthFlowPrBranch; std::vector< BranchFlow > m_accTvdFlowPrBranch; };