mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-11 07:56:08 -06:00
Thermal Fracture: rotate and place fracture according to template data.
This commit is contained in:
parent
96c4d48c9d
commit
49e298c0b8
@ -70,6 +70,10 @@ void RicPlaceThermalFractureUsingTemplateDataFeature::onActionTriggered( bool is
|
||||
|
||||
fracture->setMeasuredDepth( md );
|
||||
|
||||
fracture->setAzimuth( rotation.x() );
|
||||
fracture->setDip( rotation.y() );
|
||||
fracture->setTilt( rotation.z() );
|
||||
|
||||
fracture->updateConnectedEditors();
|
||||
RimProject* project = RimProject::current();
|
||||
project->reloadCompletionTypeResultsInAllViews();
|
||||
|
@ -543,6 +543,22 @@ double RimFracture::tilt() const
|
||||
return m_tilt();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimFracture::setTilt( double tilt )
|
||||
{
|
||||
m_tilt = tilt;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimFracture::setAzimuth( double azimuth )
|
||||
{
|
||||
m_azimuth = azimuth;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -97,7 +97,11 @@ public:
|
||||
cvf::Mat4d transformMatrix() const;
|
||||
void setDip( double dip );
|
||||
double dip() const;
|
||||
double tilt() const;
|
||||
|
||||
void setTilt( double tilt );
|
||||
double tilt() const;
|
||||
|
||||
void setAzimuth( double azimuth );
|
||||
|
||||
void setFractureTemplateNoUpdate( RimFractureTemplate* fractureTemplate );
|
||||
void setFractureTemplate( RimFractureTemplate* fractureTemplate );
|
||||
|
@ -695,13 +695,12 @@ QString RimThermalFractureTemplate::wellPathDepthAtFractureUiName() const
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<cvf::Vec3d, cvf::Vec3d> RimThermalFractureTemplate::computePositionAndRotation() const
|
||||
{
|
||||
cvf::Vec3d centerPosition = cvf::Vec3d::UNDEFINED;
|
||||
cvf::Vec3d rotation = cvf::Vec3d::UNDEFINED;
|
||||
|
||||
if ( m_fractureDefinitionData )
|
||||
{
|
||||
centerPosition = m_fractureDefinitionData->centerPosition();
|
||||
return RigThermalFractureResultUtil::computePositionAndRotation( m_fractureDefinitionData, m_activeTimeStepIndex );
|
||||
}
|
||||
|
||||
cvf::Vec3d centerPosition = cvf::Vec3d::UNDEFINED;
|
||||
cvf::Vec3d rotation = cvf::Vec3d::UNDEFINED;
|
||||
return std::make_pair( centerPosition, rotation );
|
||||
}
|
||||
|
@ -30,10 +30,11 @@
|
||||
|
||||
#include "cafAssert.h"
|
||||
#include "cvfBoundingBox.h"
|
||||
#include "cvfGeometryTools.h"
|
||||
|
||||
#include <cmath>
|
||||
|
||||
int numSamplesX = 60;
|
||||
int numSamplesX = 100;
|
||||
int numSamplesY = 60;
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@ -365,16 +366,10 @@ std::pair<std::vector<double>, std::vector<double>>
|
||||
double maxY = bb.max().y();
|
||||
|
||||
std::vector<double> gridXs;
|
||||
double sampleDistanceX = linearSampling( minX, maxX, numSamplesX, gridXs );
|
||||
linearSampling( minX, maxX, numSamplesX, gridXs );
|
||||
|
||||
std::vector<double> gridYs;
|
||||
double sampleDistanceY = linearSampling( minY, maxY, numSamplesY, gridYs );
|
||||
|
||||
RiaLogging::info( QString( "Uniform Mesh. Output size: %1x%2. Sampling Distance X = %3 Sampling Distance Y = %4" )
|
||||
.arg( numSamplesX )
|
||||
.arg( numSamplesY )
|
||||
.arg( sampleDistanceX )
|
||||
.arg( sampleDistanceY ) );
|
||||
linearSampling( minY, maxY, numSamplesY, gridYs );
|
||||
|
||||
return std::make_pair( gridXs, gridYs );
|
||||
}
|
||||
@ -481,13 +476,20 @@ std::vector<cvf::Vec3d>
|
||||
std::vector<cvf::Vec3d> relativePos = fractureDefinition->relativeCoordinates( static_cast<int>( timeStepIndex ) );
|
||||
CAF_ASSERT( relativePos.size() == fractureDefinition->numNodes() );
|
||||
|
||||
for ( auto& r : relativePos )
|
||||
{
|
||||
r.z() *= -1.0;
|
||||
}
|
||||
|
||||
cvf::Vec3d p0 = relativePos[0];
|
||||
cvf::Vec3d p1 = relativePos[1];
|
||||
cvf::Vec3d p2 = relativePos[2];
|
||||
|
||||
cvf::Plane plane;
|
||||
plane.setFromPoints( relativePos[0], relativePos[1], relativePos[2] );
|
||||
plane.setFromPoints( p0, p1, p2 );
|
||||
|
||||
cvf::Vec3d planeNormal = plane.normal().getNormalized();
|
||||
RiaLogging::info(
|
||||
QString( "Plane normal: [%1 %2 %3]" ).arg( planeNormal.x() ).arg( planeNormal.y() ).arg( planeNormal.z() ) );
|
||||
auto rotMat = rotationMatrixBetweenVectors( planeNormal, cvf::Vec3d::Z_AXIS.getNormalized() );
|
||||
auto rotMat = rotationMatrixBetweenVectors( planeNormal, ( cvf::Vec3d::Z_AXIS ).getNormalized() );
|
||||
|
||||
for ( auto& r : relativePos )
|
||||
{
|
||||
@ -495,9 +497,80 @@ std::vector<cvf::Vec3d>
|
||||
r.z() = 0.0;
|
||||
}
|
||||
|
||||
auto findExtrema = []( const std::vector<cvf::Vec3d>& points ) {
|
||||
double maxDistance = -1.0;
|
||||
|
||||
cvf::Vec3d e1 = cvf::Vec3d::UNDEFINED;
|
||||
cvf::Vec3d e2 = cvf::Vec3d::UNDEFINED;
|
||||
for ( auto p1 : points )
|
||||
{
|
||||
for ( auto p2 : points )
|
||||
{
|
||||
double distance = p1.pointDistanceSquared( p2 );
|
||||
if ( distance > maxDistance )
|
||||
{
|
||||
maxDistance = distance;
|
||||
e1 = p1;
|
||||
e2 = p2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair( e1, e2 );
|
||||
};
|
||||
|
||||
auto [e1, e2] = findExtrema( relativePos );
|
||||
cvf::Vec3d direction = e1 - e2;
|
||||
auto rotMat2 = rotationMatrixBetweenVectors( direction.getNormalized(), cvf::Vec3d::X_AXIS );
|
||||
for ( auto& r : relativePos )
|
||||
{
|
||||
r.transformVector( rotMat2 );
|
||||
}
|
||||
|
||||
return relativePos;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
std::pair<cvf::Vec3d, cvf::Vec3d> RigThermalFractureResultUtil::computePositionAndRotation(
|
||||
std::shared_ptr<const RigThermalFractureDefinition> fractureDefinition,
|
||||
size_t timeStepIndex )
|
||||
{
|
||||
std::vector<cvf::Vec3d> relativePos = fractureDefinition->relativeCoordinates( static_cast<int>( timeStepIndex ) );
|
||||
CAF_ASSERT( relativePos.size() == fractureDefinition->numNodes() );
|
||||
|
||||
cvf::Plane plane;
|
||||
cvf::Vec3d p0 = relativePos[0];
|
||||
cvf::Vec3d p1 = relativePos[1];
|
||||
cvf::Vec3d p2 = relativePos[2];
|
||||
|
||||
p0.z() *= -1.0;
|
||||
p1.z() *= -1.0;
|
||||
p2.z() *= -1.0;
|
||||
plane.setFromPoints( p0, p1, p2 );
|
||||
|
||||
cvf::Vec3d planeNormal = plane.normal().getNormalized();
|
||||
RiaLogging::info(
|
||||
QString( "Plane normal: [%1 %2 %3]" ).arg( planeNormal.x() ).arg( planeNormal.y() ).arg( planeNormal.z() ) );
|
||||
|
||||
cvf::Plane xyPlane;
|
||||
xyPlane.setFromPointAndNormal( cvf::Vec3d::ZERO, cvf::Vec3d::Z_AXIS );
|
||||
|
||||
cvf::Vec3d inPlane;
|
||||
if ( !xyPlane.projectVector( planeNormal, &inPlane ) ) RiaLogging::info( "Failed to project vector" );
|
||||
|
||||
double azimuth = cvf::Math::toDegrees( cvf::GeometryTools::getAngle( inPlane, cvf::Vec3d::Y_AXIS ) ) + 90.0;
|
||||
double dip = cvf::Math::toDegrees( cvf::GeometryTools::getAngle( inPlane, cvf::Vec3d::Z_AXIS ) ) - 90.0;
|
||||
double tilt = cvf::Math::toDegrees( cvf::GeometryTools::getAngle( planeNormal, cvf::Vec3d::Z_AXIS ) ) - 90.0;
|
||||
RiaLogging::info( QString( "Dip: %1" ).arg( dip ) );
|
||||
RiaLogging::info( QString( "Tilt: %1" ).arg( tilt ) );
|
||||
RiaLogging::info( QString( "Azimuth: %1" ).arg( azimuth ) );
|
||||
|
||||
cvf::Vec3d rotation( azimuth, dip, tilt );
|
||||
return std::make_pair( fractureDefinition->centerPosition(), rotation );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -86,6 +86,10 @@ public:
|
||||
static std::pair<double, double> minMaxDepth( std::shared_ptr<const RigThermalFractureDefinition> fractureDefinition,
|
||||
int activeTimeStepIndex );
|
||||
|
||||
static std::pair<cvf::Vec3d, cvf::Vec3d>
|
||||
computePositionAndRotation( std::shared_ptr<const RigThermalFractureDefinition> fractureDefinition,
|
||||
size_t timeStepIndex );
|
||||
|
||||
private:
|
||||
static std::pair<std::vector<double>, std::vector<double>>
|
||||
generateUniformMesh( const cvf::BoundingBox& bb, int numSamplesX, int numSamplesY );
|
||||
|
Loading…
Reference in New Issue
Block a user