///////////////////////////////////////////////////////////////////////////////// // // 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 //================================================================================================== /// /// //================================================================================================== #include "RigActiveCellInfo.h" #include "RigMainGrid.h" #include "RigFlowDiagResults.h" struct RigWellResultPoint; 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 { const RigGridBase* grid = m_mainGrid->gridByIndex(gridIndex); size_t reservoirCellIndex = grid->reservoirCellIndex(gridCellIndex); return m_activeCellInfo->cellResultIndex(reservoirCellIndex); } private: const RigMainGrid* m_mainGrid; const RigActiveCellInfo* m_activeCellInfo; }; //================================================================================================== /// /// //================================================================================================== 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); 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: 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 BranchResult { std::vector connectionNumbersFromTop; std::map > accConnFlowFractionsPrTracer; }; std::vector< BranchResult > m_accConnectionFlowPrBranch; };