///////////////////////////////////////////////////////////////////////////////// // // 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 "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: using WbsParameterSource = RigWbsParameter::Source; using WbsParameterSourceEnum = RigWbsParameter::SourceEnum; 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 setWbsLasValues( const RigWbsParameter& parameter, const std::vector>& values ); void setWbsParametersSource( RigWbsParameter parameter, WbsParameterSource source ); void setWbsUserDefinedValue( RigWbsParameter parameter, double userDefinedValue ); std::vector porePressureSourceRegions( int frameIndex ); std::vector poissonSourceRegions( int frameIndex ); std::vector ucsSourceRegions( int frameIndex ); private: enum WellPathTangentCalculation { TangentFollowWellPathSegments, TangentConstantWithinCell }; std::vector calculateWbsParameterForAllSegments( const RigWbsParameter& parameter, WbsParameterSource primarySource, int frameIndex, std::vector* outputValues ); std::vector calculateWbsParameterForAllSegments( const RigWbsParameter& parameter, int frameIndex, std::vector* outputValues ); std::vector calculateWbsParametersForAllSegments( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); void wellPathAngles( const RigFemResultAddress& resAddr, std::vector* values ); std::vector wellPathScaledCurveData( const RigFemResultAddress& resAddr, int frameIndex, std::vector* values ); 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; 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, 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 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 ); double hydroStaticPorePressureForSegment( size_t intersectionIdx ) const; static bool isValid( double value ); static bool isValid( float value ); private: cvf::ref m_caseData; std::map>> m_lasFileValues; std::map m_parameterSources; std::map m_userDefinedValues; static const double UNIT_WEIGHT_OF_WATER; };