///////////////////////////////////////////////////////////////////////////////// // // 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. // ///////////////////////////////////////////////////////////////////////////////// #include "RigWellPathIntersectionTools.h" #include "RiaLogging.h" #include "RigCellGeometryTools.h" #include "RigEclipseCaseData.h" #include "RigEclipseWellLogExtractor.h" #include "RigMainGrid.h" #include "RigSimulationWellCoordsAndMD.h" #include "RigWellLogExtractionTools.h" #include "RigWellPath.h" #include "RimEclipseCase.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigWellPathIntersectionTools::findCellIntersectionInfosAlongPath( const RigEclipseCaseData* caseData, const std::vector& pathCoords, const std::vector& pathMds ) { std::vector intersectionInfos; if ( pathCoords.size() < 2 ) return intersectionInfos; cvf::ref dummyWellPath = new RigWellPath; dummyWellPath->m_wellPathPoints = pathCoords; dummyWellPath->m_measuredDepths = pathMds; cvf::ref extractor = new RigEclipseWellLogExtractor( caseData, dummyWellPath.p(), caseData->ownerCase()->caseUserDescription().toStdString() ); return extractor->cellIntersectionInfosAlongWellPath(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::set RigWellPathIntersectionTools::findIntersectedGlobalCellIndicesForWellPath( const RigEclipseCaseData* caseData, const RigWellPath* wellPath ) { std::set globalCellIndices; if ( caseData ) { cvf::ref extractor = new RigEclipseWellLogExtractor( caseData, wellPath, caseData->ownerCase()->caseUserDescription().toStdString() ); std::vector intersections = extractor->cellIntersectionInfosAlongWellPath(); for ( const auto& intersection : intersections ) { globalCellIndices.insert( intersection.globCellIndex ); } } return globalCellIndices; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::set RigWellPathIntersectionTools::findIntersectedGlobalCellIndices( const RigEclipseCaseData* caseData, const std::vector& coords, const std::vector& measuredDepths ) { std::set globalCellIndices; if ( caseData ) { cvf::ref dummyWellPath = new RigWellPath; if ( measuredDepths.size() == coords.size() ) { dummyWellPath->m_wellPathPoints = coords; dummyWellPath->m_measuredDepths = measuredDepths; } else { RigSimulationWellCoordsAndMD helper( coords ); dummyWellPath->m_wellPathPoints = helper.wellPathPoints(); dummyWellPath->m_measuredDepths = helper.measuredDepths(); } globalCellIndices = findIntersectedGlobalCellIndicesForWellPath( caseData, dummyWellPath.p() ); } return globalCellIndices; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::Vec3d RigWellPathIntersectionTools::calculateLengthInCell( const std::array& hexCorners, const cvf::Vec3d& startPoint, const cvf::Vec3d& endPoint ) { cvf::Vec3d vec = endPoint - startPoint; cvf::Vec3d iAxisDirection; cvf::Vec3d jAxisDirection; cvf::Vec3d kAxisDirection; RigCellGeometryTools::findCellLocalXYZ( hexCorners, iAxisDirection, jAxisDirection, kAxisDirection ); cvf::Mat3d localCellCoordinateSystem( iAxisDirection.x(), jAxisDirection.x(), kAxisDirection.x(), iAxisDirection.y(), jAxisDirection.y(), kAxisDirection.y(), iAxisDirection.z(), jAxisDirection.z(), kAxisDirection.z() ); return vec.getTransformedVector( localCellCoordinateSystem.getInverted() ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::Vec3d RigWellPathIntersectionTools::calculateLengthInCell( const RigMainGrid* grid, size_t cellIndex, const cvf::Vec3d& startPoint, const cvf::Vec3d& endPoint ) { std::array hexCorners; grid->cellCornerVertices( cellIndex, hexCorners.data() ); return calculateLengthInCell( hexCorners, startPoint, endPoint ); }