Files
ResInsight/ApplicationLibCode/ReservoirDataModel/RigStimPlanModelTools.h
T
Kristian Bendiksen 6357cef1ab #14334 Fix formation dip sign when aligning fracture with formation dip
The sign of the projected formation direction vector flips with the fracture
direction normal, which follows the well drilling direction, while the fracture
azimuth defining the dip rotation in RimFracture::transformMatrix() is only
defined mod 180 degrees. Canonicalize the formation direction against the
fracture azimuth direction before computing the dip, so a positive dip means
the formation descends toward the azimuth direction.

Restore std::abs() in calculateFormationDipFromHorizontal() so the StimPlan
model formation dip (BedDipDeg in the Asymmetric FRK export) keeps the
non-negative convention from #8877.
2026-07-13 14:34:17 +02:00

71 lines
3.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2021- Equinor 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 <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "cvfVector3.h"
#include <QString>
#include <vector>
class RigEclipseCaseData;
class RigFault;
struct WellPathCellIntersectionInfo;
//==================================================================================================
///
///
//==================================================================================================
class RigStimPlanModelTools
{
public:
static cvf::Vec3d calculateTSTDirection( RigEclipseCaseData* eclipseCaseData,
const cvf::Vec3d& anchorPosition,
double boundingBoxHorizontal,
double boundingBoxVertical );
static bool findThicknessTargetPoints( RigEclipseCaseData* eclipseCaseData,
const cvf::Vec3d& position,
const cvf::Vec3d& direction,
double extractionDepthTop,
double extractionDepthBottom,
cvf::Vec3d& topPosition,
cvf::Vec3d& bottomPosition );
static double calculateAngleFromVertical( const cvf::Vec3d& direction );
static double calculateFormationDipFromHorizontal( const cvf::Vec3d& direction );
static double calculateFormationDipAlignedToAzimuth( const cvf::Vec3d& formationDirection, double azimuthDegrees );
static QString vecToString( const cvf::Vec3d& vec );
static std::tuple<const RigFault*, double, cvf::Vec3d, double>
findClosestFaultBarrier( RigEclipseCaseData* eclipseCaseData, const cvf::Vec3d& position, const cvf::Vec3d& directionToBarrier );
static std::vector<WellPathCellIntersectionInfo>
generateBarrierIntersections( RigEclipseCaseData* eclipseCaseData, const cvf::Vec3d& position, const cvf::Vec3d& directionToBarrier );
static std::vector<WellPathCellIntersectionInfo> generateBarrierIntersectionsBetweenPoints( RigEclipseCaseData* eclipseCaseData,
const cvf::Vec3d& startPosition,
const cvf::Vec3d& endPosition );
static double calculatePerforationLength( const cvf::Vec3d& wellPathDirection, double perforationLength );
};