///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2016- 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 "RigFlowDiagResultAddress.h" #include "RigFlowDiagSolverInterface.h" #include "RimFlowDiagSolution.h" #include "cafPdmPointer.h" #include "cvfBase.h" #include "cvfObject.h" #include #include #include class RigFlowDiagResultFrames; class RigStatisticsDataCache; class RigActiveCellInfo; class RigFlowDiagResults: public cvf::Object { public: RigFlowDiagResults(RimFlowDiagSolution* flowSolution, size_t timeStepCount); virtual ~RigFlowDiagResults(); const std::vector* resultValues(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); size_t timeStepCount() { return m_timeStepCount; } const RigActiveCellInfo * activeCellInfo(const RigFlowDiagResultAddress& resVarAddr); void minMaxScalarValues (const RigFlowDiagResultAddress& resVarAddr, int frameIndex, double* localMin, double* localMax); void minMaxScalarValues (const RigFlowDiagResultAddress& resVarAddr, double* globalMin, double* globalMax); void posNegClosestToZero(const RigFlowDiagResultAddress& resVarAddr, int frameIndex, double* localPosClosestToZero, double* localNegClosestToZero); void posNegClosestToZero(const RigFlowDiagResultAddress& resVarAddr, double* globalPosClosestToZero, double* globalNegClosestToZero); void meanScalarValue(const RigFlowDiagResultAddress& resVarAddr, double* meanValue); void meanScalarValue(const RigFlowDiagResultAddress& resVarAddr, int frameIndex, double* meanValue); void p10p90ScalarValues(const RigFlowDiagResultAddress& resVarAddr, double* p10, double* p90); void p10p90ScalarValues(const RigFlowDiagResultAddress& resVarAddr, int frameIndex, double* p10, double* p90); void sumScalarValue(const RigFlowDiagResultAddress& resVarAddr, double* sum); void sumScalarValue(const RigFlowDiagResultAddress& resVarAddr, int frameIndex, double* sum); const std::vector& scalarValuesHistogram(const RigFlowDiagResultAddress& resVarAddr); const std::vector& scalarValuesHistogram(const RigFlowDiagResultAddress& resVarAddr, int frameIndex); const std::vector& uniqueCellScalarValues(const RigFlowDiagResultAddress& resVarAddr); const std::vector& uniqueCellScalarValues(const RigFlowDiagResultAddress& resVarAddr, int frameIndex); std::pair injectorProducerPairFluxes(const std::string& injTracername, const std::string& prodTracerName, int frameIndex); double maxAbsPairFlux(int frameIndex); std::vector calculatedTimeSteps(RigFlowDiagResultAddress::PhaseSelection phaseSelection); RigFlowDiagSolverInterface::FlowCharacteristicsResultFrame flowCharacteristicsResults(int frameIndex, double max_pv_fraction); private: const std::vector* findOrCalculateResult (const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); void calculateNativeResultsIfNotPreviouslyAttempted(size_t frameIndex, RigFlowDiagResultAddress::PhaseSelection phaseSelection); std::vector* calculateDerivedResult(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); std::vector* calculateAverageTOFResult(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); std::vector* calculateSumOfFractionsResult(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); std::vector* calculateTracerWithMaxFractionResult(const RigFlowDiagResultAddress &resVarAddr, size_t frameIndex); std::vector* calculateCommunicationResult(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); std::vector* > findResultsForSelectedTracers(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex, const std::string& nativeResultName, RimFlowDiagSolution::TracerStatusType wantedTracerType); std::vector< std::pair*> > findNamedResultsForSelectedTracers(const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex, const std::string& nativeResultName, RimFlowDiagSolution::TracerStatusType wantedTracerType); void calculateSumOfFractionAndFractionMultTOF(size_t activeCellCount, const std::vector *>& injectorFractions, const std::vector *>& injectorTOFs, std::vector *injectorTotalFractions, std::vector *injectorFractMultTof); void calculateSumOfFractions(const std::vector *> &fractions, size_t activeCellCount, std::vector* sumOfFractions); RigStatisticsDataCache* statistics(const RigFlowDiagResultAddress& resVarAddr); RigFlowDiagResultFrames* createScalarResult(const RigFlowDiagResultAddress& resVarAddr); RigFlowDiagResultFrames* findScalarResult (const RigFlowDiagResultAddress& resVarAddr) ; std::vector* findScalarResultFrame (const RigFlowDiagResultAddress& resVarAddr, size_t frameIndex); //void deleteScalarResult(const RigFlowDiagResultAddress& resVarAddr); RigFlowDiagSolverInterface* solverInterface(); size_t m_timeStepCount; caf::PdmPointer m_flowDiagSolution; std::vector< std::map > m_hasAtemptedNativeResults; std::map< RigFlowDiagResultAddress, cvf::ref > m_resultSets; std::map< RigFlowDiagResultAddress, cvf::ref > m_resultStatistics; using InjectorProducerCommunicationMap = std::map< std::pair, std::pair >; std::vector< std::map > m_injProdPairFluxCommunicationTimesteps; };