///////////////////////////////////////////////////////////////////////////////// // // 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 "RigWellLogExtractor.h" #include "RigFemResultPosEnum.h" #include "cafTensor3.h" #include "cvfMath.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: enum WbsParameterSource { INVALID = -1, AUTO = 0, GRID, // Only relevant for Pore Pressure LAS_FILE, ELEMENT_PROPERTY_TABLE, USER_DEFINED, // Not relevant for Pore Pressure HYDROSTATIC_PP // Only relevant for Pore Pressure }; public: RigGeoMechWellLogExtractor( RigGeoMechCaseData* aCase, const RigWellPath* wellpath, const std::string& wellCaseErrorMsgName ); void performCurveDataSmoothing( int frameIndex, std::vector* mds, std::vector* tvds, std::vector* values, const double smoothingTreshold ); void curveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); const RigGeoMechCaseData* caseData(); void setRkbDiff( double rkbDiff ); void setWellLogMdAndMudWeightKgPerM3( const std::vector>& mudWeightKgPerM3 ); void setWellLogMdAndUcsBar( const std::vector>& ucsValues ); void setWellLogMdAndPoissonRatio( const std::vector>& poissonRatio ); static std::set supportedSourcesForPorePressure(); static std::set supportedSourcesForPoissonRatio(); static std::set supportedSourcesForUcs(); void setWbsParameters( WbsParameterSource porePressureSource, WbsParameterSource poissonRatioSource, WbsParameterSource ucsSource, double userDefinedPoissonRatio, double userDefinedUcs ); std::vector porePressureIntervals( int frameIndex ); std::vector poissonIntervals( int frameIndex ); std::vector ucsIntervals( int frameIndex ); private: enum WellPathTangentCalculation { TangentFollowWellPathSegments, TangentConstantWithinCell }; std::pair calculatePorePressureInSegment( int64_t intersectionIdx, double effectiveDepthMeters, const std::vector& interpolatedInterfacePorePressuresBar, const std::vector& poreElementPressuresPascal ) const; std::pair calculatePoissonRatioInSegment( int64_t intersectionIdx, const std::vector& poissonRatios ) const; std::pair calculateUcsInSegment( int64_t intersectionIdx, const std::vector& ucsValuesPascal ) const; void wellPathAngles( const RigFemResultAddress& resAddr, std::vector* values ); void wellPathScaledCurveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); void wellBoreWallCurveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); void wellPathParameters( const RigFemResultAddress& resAddr, 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; static caf::Ten3d transformTensorToWellPathOrientation( const cvf::Vec3d& wellPathTangent, const caf::Ten3d& wellPathTensor ); cvf::Vec3f cellCentroid( size_t intersectionIdx ) const; double getWellLogSegmentValue( 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, const std::vector& unscaledResultValues ) const; static void initializeResultValues( std::vector& resultValues, size_t resultCount ); static void initializeResultValues( std::vector& resultValues, size_t resultCount ); void filterShortSegments( std::vector* xValues, std::vector* yValues, std::vector* filterSegments, std::vector*>& vectorOfDependentValues ); void filterColinearSegments( std::vector* xValues, std::vector* yValues, std::vector* filterSegments, std::vector*>& vectorOfDependentValues ); 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 ); private: cvf::ref m_caseData; double m_rkbDiff; std::vector> m_wellLogMdAndMudWeightKgPerM3; std::vector> m_wellLogMdAndUcsBar; std::vector> m_wellLogMdAndPoissonRatios; WbsParameterSource m_porePressureSource; WbsParameterSource m_poissonRatioSource; WbsParameterSource m_ucsSource; double m_userDefinedPoissonRatio; double m_userDefinedUcs; static const double UNIT_WEIGHT_OF_WATER; };