///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) Statoil ASA // Copyright (C) Ceetron Solutions AS // // 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 "RiaDefines.h" #include "RigWbsParameter.h" #include "RigWellLogExtractor.h" #include "RigFemResultPosEnum.h" #include "cafAppEnum.h" #include "cafTensor3.h" #include "cvfObject.h" #include "cvfStructGrid.h" #include "cvfVector3.h" #include class RigFemPart; class RigFemResultAddress; class RigGeoMechCaseData; class RigWellPath; namespace cvf { class BoundingBox; } //================================================================================================== /// //================================================================================================== class RigGeoMechWellLogExtractor : public RigWellLogExtractor { public: static const double PURE_WATER_DENSITY_GCM3; static const double GRAVITY_ACCEL; using WbsParameterSource = RigWbsParameter::Source; using WbsParameterSourceEnum = RigWbsParameter::SourceEnum; public: RigGeoMechWellLogExtractor( gsl::not_null aCase, gsl::not_null wellpath, const std::string& wellCaseErrorMsgName ); void performCurveDataSmoothing( int frameIndex, std::vector* mds, std::vector* tvds, std::vector* values, const double smoothingTreshold ); QString curveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); const RigGeoMechCaseData* caseData(); void setWbsLasValues( const RigWbsParameter& parameter, const std::vector>& values ); void setWbsParametersSource( RigWbsParameter parameter, WbsParameterSource source ); void setWbsUserDefinedValue( RigWbsParameter parameter, double userDefinedValue ); static QString parameterInputUnits( const RigWbsParameter& parameter ); std::vector porePressureSourceRegions( int frameIndex ); std::vector poissonSourceRegions( int frameIndex ); std::vector ucsSourceRegions( int frameIndex ); static caf::Ten3d transformTensorToWellPathOrientation( const cvf::Vec3d& wellPathTangent, const caf::Ten3d& wellPathTensor ); static double hydroStaticPorePressureAtDepth( double effectiveDepthMeters, double waterDensityGCM3 = PURE_WATER_DENSITY_GCM3 ); double waterDepth() const; double estimateWaterDepth() const; private: enum WellPathTangentCalculation { TangentFollowWellPathSegments, TangentConstantWithinCell }; std::vector calculateWbsParameterForAllSegments( const RigWbsParameter& parameter, WbsParameterSource primarySource, int frameIndex, std::vector* outputValues, bool allowNormalization ); std::vector calculateWbsParameterForAllSegments( const RigWbsParameter& parameter, int frameIndex, std::vector* outputValues, bool allowNormalization ); std::vector calculateWbsParametersForAllSegments( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values, bool allowNormalization ); void wellPathAngles( const RigFemResultAddress& resAddr, std::vector* values ); std::vector wellPathScaledCurveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values, bool forceGridSourceforPPReservoir = false ); void wellBoreWallCurveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); void wellBoreFGShale( int frameIndex, std::vector* values ); void wellBoreSH_MatthewsKelly( int frameIndex, std::vector* values ); template T interpolateGridResultValue( RigFemResultPosEnum resultPosType, const std::vector& gridResultValues, int64_t intersectionIdx ) const; size_t gridResultIndexFace( size_t elementIdx, cvf::StructGridInterface::FaceType cellFace, int faceLocalNodeIdx ) const; void calculateIntersection(); std::vector findCloseCells( const cvf::BoundingBox& bb ); cvf::Vec3d calculateLengthInCell( size_t cellIndex, const cvf::Vec3d& startPoint, const cvf::Vec3d& endPoint ) const override; cvf::Vec3d calculateWellPathTangent( int64_t intersectionIdx, WellPathTangentCalculation calculationType ) const; cvf::Vec3f cellCentroid( size_t intersectionIdx ) const; double getWellLogIntersectionValue( size_t intersectionIdx, const std::vector>& wellLogValues ) const; template bool averageIntersectionValuesToSegmentValue( size_t intersectionIdx, const std::vector& intersectionValues, const T& invalidValue, T* averagedSegmentValue ) const; static double pascalToBar( double pascalValue ); template std::vector interpolateInterfaceValues( RigFemResultAddress nativeAddr, int frameIndex, const std::vector& unscaledResultValues ); static void initializeResultValues( std::vector& resultValues, size_t resultCount ); static void initializeResultValues( std::vector& resultValues, size_t resultCount ); void smoothSegments( std::vector* mds, std::vector* tvds, std::vector* values, const std::vector& interfaceShValues, const std::vector& smoothSegments, const double smoothingThreshold ); std::vector determineFilteringOrSmoothing( const std::vector& porePressures ); double hydroStaticPorePressureForIntersection( size_t intersectionIdx, double waterDensityGCM3 = PURE_WATER_DENSITY_GCM3 ) const; double hydroStaticPorePressureForSegment( size_t intersectionIdx, double waterDensityGCM3 = PURE_WATER_DENSITY_GCM3 ) const; double wbsCurveValuesAtMsl() const; static bool isValid( double value ); static bool isValid( float value ); double calculateWaterDepth() const; private: cvf::ref m_caseData; std::map>> m_lasFileValues; std::map m_lasFileInputUnits; std::map m_parameterSources; std::map m_userDefinedValues; double m_waterDepth; };