///////////////////////////////////////////////////////////////////////////////// // // 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 "RigCompletionData.h" #include "RicExportCompletionDataSettingsUi.h" #include "RicMultiSegmentWellExportInfo.h" #include "RicWellPathFractureReportItem.h" #include #include "cvfBase.h" #include "cvfVector3.h" #include #include class RigCell; class RigEclipseCaseData; class RigMainGrid; class RimEclipseCase; class RimFishbonesMultipleSubs; class RimSimWellInView; class RimPerforationInterval; class RimWellPath; class RimWellPathFracture; class RimNonDarcyPerforationParameters; class RifEclipseDataTableFormatter; class RigVirtualPerforationTransmissibilities; class SubSegmentIntersectionInfo; //================================================================================================== /// //================================================================================================== typedef std::shared_ptr QFilePtr; //================================================================================================== /// //================================================================================================== class RicWellPathExportCompletionDataFeatureImpl { public: static RicMswExportInfo generateFishbonesMswExportInfo(const RimEclipseCase* caseToApply, const RimWellPath* wellPath, bool enableSegmentSplitting); static RicMswExportInfo generateFishbonesMswExportInfo(const RimEclipseCase* caseToApply, const RimWellPath* wellPath, const std::vector& fishbonesSubs, bool enableSegmentSplitting); static RicMswExportInfo generateFracturesMswExportInfo(RimEclipseCase* caseToApply, const RimWellPath* wellPath); static RicMswExportInfo generateFracturesMswExportInfo(RimEclipseCase* caseToApply, const RimWellPath* wellPath, const std::vector& fractures); static RicMswExportInfo generatePerforationsMswExportInfo(const RicExportCompletionDataSettingsUi& exportSettings, const RimWellPath* wellPath, const std::vector& perforationIntervals); static CellDirection calculateDirectionInCell(RimEclipseCase* eclipseCase, size_t globalCellIndex, const cvf::Vec3d& lengthsInCell); static double calculateTransmissibility(RimEclipseCase* eclipseCase, const RimWellPath* wellPath, const cvf::Vec3d& internalCellLengths, double skinFactor, double wellRadius, size_t globalCellIndex, bool useLateralNTG, size_t volumeScaleConstant = 1, CellDirection directionForVolumeScaling = CellDirection::DIR_I); static double calculateDFactor(RimEclipseCase* eclipseCase, const cvf::Vec3d& internalCellLengths, const double wellRadius, size_t globalCellIndex, const RimNonDarcyPerforationParameters* nonDarcyParameters, const double effectiveTransmissibilityForCell); static void exportCompletions(const std::vector& wellPaths, const std::vector& simWells, const RicExportCompletionDataSettingsUi& exportSettings); static std::vector computeStaticCompletionsForWellPath(RimWellPath* wellPath, RimEclipseCase* eclipseCase); static std::vector computeDynamicCompletionsForWellPath(RimWellPath* wellPath, RimEclipseCase* eclipseCase, size_t timeStepIndex); static void generateWelsegsTable(RifEclipseDataTableFormatter& formatter, const RicMswExportInfo& exportInfo); static void generateWelsegsSegments(RifEclipseDataTableFormatter &formatter, const RicMswExportInfo &exportInfo, const std::set& exportCompletionTypes); static void generateWelsegsCompletionCommentHeader(RifEclipseDataTableFormatter &formatter, RigCompletionData::CompletionType completionType); static void generateCompsegTables(RifEclipseDataTableFormatter& formatter, const RicMswExportInfo& exportInfo); static void generateCompsegTable(RifEclipseDataTableFormatter& formatter, const RicMswExportInfo& exportInfo, bool exportSubGridIntersections, const std::set& exportCompletionTypes); static void generateCompsegHeader(RifEclipseDataTableFormatter& formatter, const RicMswExportInfo& exportInfo, RigCompletionData::CompletionType completionType, bool exportSubGridIntersections); static void generateWsegvalvTable(RifEclipseDataTableFormatter& formatter, const RicMswExportInfo& exportInfo); private: static double calculateTransmissibilityAsEclipseDoes(RimEclipseCase* eclipseCase, double skinFactor, double wellRadius, size_t globalCellIndex, CellDirection direction); static RigCompletionData combineEclipseCellCompletions(const std::vector& completions, const RicExportCompletionDataSettingsUi& settings); static QFilePtr openFileForExport(const QString& fullFileName); static QFilePtr openFileForExport(const QString& folderName, const QString& fileName); static std::vector mainGridCompletions(std::vector& allCompletions); static std::map> subGridsCompletions(std::vector& allCompletions); static void exportWellPathFractureReport(RimEclipseCase* sourceCase, QFilePtr exportFile, const std::vector& wellPathFractureReportItems); static void exportWelspecsToFile(RimEclipseCase* gridCase, QFilePtr exportFile, const std::vector& completions); static void exportWelspeclToFile(RimEclipseCase* gridCase, QFilePtr exportFile, const std::map>& completions); static void sortAndExportCompletionsToFile(RimEclipseCase* eclipseCase, const QString& exportFolder, const QString& fileName, std::vector& completions, const std::vector& wellPathFractureReportItems, RicExportCompletionDataSettingsUi::CompdatExportType exportType); static void exportCompdatAndWpimultTables(RimEclipseCase* sourceCase, QFilePtr exportFile, const std::map>& completionsPerGrid, RicExportCompletionDataSettingsUi::CompdatExportType exportType); static void exportCompdatTableUsingFormatter(RifEclipseDataTableFormatter& formatter, const QString& gridName, const std::vector& completionData); static void exportWpimultTableUsingFormatter(RifEclipseDataTableFormatter& formatter, const QString& gridName, const std::vector& completionData); static std::vector generatePerforationsCompdatValues(const RimWellPath* wellPath, const std::vector& intervals, const RicExportCompletionDataSettingsUi& settings); static void assignFishbonesLateralIntersections(const RimEclipseCase* caseToApply, const RimFishbonesMultipleSubs* fishbonesSubs, RicMswSegment* location, bool* foundSubGridIntersections, double maxSegmentLength); static void assignFractureIntersections(const RimEclipseCase* caseToApply, const RimWellPathFracture* fracture, const std::vector& completionData, RicMswSegment* location, bool* foundSubGridIntersections); static void assignPerforationIntervalIntersections(const RimEclipseCase* caseToApply, const RimPerforationInterval* interval, const std::vector& completionData, RicMswSegment* location, const SubSegmentIntersectionInfo* cellIntInfo, bool* foundSubGridIntersections); static void assignBranchAndSegmentNumbers(const RimEclipseCase* caseToApply, RicMswSegment* location, int* branchNum, int* segmentNum); static void assignBranchAndSegmentNumbers(const RimEclipseCase* caseToApply, RicMswExportInfo* exportInfo); static void appendCompletionData(std::map>* completionData, const std::vector& data); static cvf::Vec2i wellPathUpperGridIntersectionIJ(const RimEclipseCase* gridCase, const RimWellPath* wellPath, const QString& gridName = ""); static void exportWellSegments(RimEclipseCase* eclipseCase, QFilePtr exportFile, const RimWellPath* wellPath, const std::vector& fractures); static void exportWellSegments(RimEclipseCase* eclipseCase, QFilePtr exportFile, const RimWellPath* wellPath, const std::vector& fishbonesSubs); static void exportWellSegments(const RicExportCompletionDataSettingsUi& exportSettings, QFilePtr exportFile, const RimWellPath* wellPath, const std::vector& perforationIntervals); static QString createPressureDepletionFileNameSuffix(const RicExportCompletionDataSettingsUi& exportSettings); };