mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2553 Well CF Visualization: Add viz of connection factors on sim wells
This commit is contained in:
parent
c0054cff91
commit
9b0427aba9
@ -42,6 +42,7 @@ ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogCurveGeomertyGenerator.h
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.h
|
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.h
|
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.h
|
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.h
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RivSimWellConnectionSourceInfo.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogGridGeomertyGenerator.h
|
${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogGridGeomertyGenerator.h
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -83,6 +84,7 @@ ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogCurveGeomertyGenerator.cpp
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.cpp
|
${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.cpp
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/RivSimWellConnectionSourceInfo.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogGridGeomertyGenerator.cpp
|
${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogGridGeomertyGenerator.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2018 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 <http://www.gnu.org/licenses/gpl.html>
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "RivSimWellConnectionSourceInfo.h"
|
||||||
|
|
||||||
|
#include "RimSimWellInView.h"
|
||||||
|
#include "RivWellConnectionFactorGeometryGenerator.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RivSimWellConnectionSourceInfo::RivSimWellConnectionSourceInfo(RimSimWellInView* simWellInView,
|
||||||
|
RivWellConnectionFactorGeometryGenerator* geometryGenerator)
|
||||||
|
: m_simWellInView(simWellInView)
|
||||||
|
, m_geometryGenerator(geometryGenerator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
RimSimWellInView* RivSimWellConnectionSourceInfo::simWellInView() const
|
||||||
|
{
|
||||||
|
return m_simWellInView;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
size_t RivSimWellConnectionSourceInfo::globalCellIndexFromTriangleIndex(cvf::uint triangleIndex) const
|
||||||
|
{
|
||||||
|
if (m_geometryGenerator.isNull()) return 0;
|
||||||
|
|
||||||
|
return m_geometryGenerator->globalCellIndexFromTriangleIndex(triangleIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
double RivSimWellConnectionSourceInfo::connectionFactorFromTriangleIndex(cvf::uint triangleIndex) const
|
||||||
|
{
|
||||||
|
if (m_geometryGenerator.isNull()) return 0.0;
|
||||||
|
|
||||||
|
return m_geometryGenerator->connectionFactor(triangleIndex);
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Copyright (C) 2018 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 <http://www.gnu.org/licenses/gpl.html>
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "cafPdmPointer.h"
|
||||||
|
|
||||||
|
#include "cvfBase.h"
|
||||||
|
#include "cvfObject.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class RimSimWellInView;
|
||||||
|
class RivWellConnectionFactorGeometryGenerator;
|
||||||
|
|
||||||
|
//==================================================================================================
|
||||||
|
///
|
||||||
|
//==================================================================================================
|
||||||
|
class RivSimWellConnectionSourceInfo : public cvf::Object
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit RivSimWellConnectionSourceInfo(RimSimWellInView* simWellInView, RivWellConnectionFactorGeometryGenerator* geometryGenerator);
|
||||||
|
|
||||||
|
RimSimWellInView* simWellInView() const;
|
||||||
|
|
||||||
|
size_t globalCellIndexFromTriangleIndex(cvf::uint triangleIndex) const;
|
||||||
|
double connectionFactorFromTriangleIndex(cvf::uint triangleIndex) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
caf::PdmPointer<RimSimWellInView> m_simWellInView;
|
||||||
|
cvf::ref<RivWellConnectionFactorGeometryGenerator> m_geometryGenerator;
|
||||||
|
};
|
@ -20,16 +20,29 @@
|
|||||||
|
|
||||||
#include "RivSimWellPipesPartMgr.h"
|
#include "RivSimWellPipesPartMgr.h"
|
||||||
|
|
||||||
|
#include "RiaExtractionTools.h"
|
||||||
|
|
||||||
|
#include "RigEclipseWellLogExtractor.h"
|
||||||
|
#include "RigVirtualPerforationTransmissibilities.h"
|
||||||
|
#include "RigWellLogExtractor.h"
|
||||||
|
#include "RigWellPath.h"
|
||||||
|
|
||||||
#include "Rim3dView.h"
|
#include "Rim3dView.h"
|
||||||
|
#include "RimEclipseView.h"
|
||||||
|
#include "RimLegendConfig.h"
|
||||||
#include "RimSimWellInView.h"
|
#include "RimSimWellInView.h"
|
||||||
#include "RimSimWellInViewCollection.h"
|
#include "RimSimWellInViewCollection.h"
|
||||||
|
#include "RimVirtualPerforationResults.h"
|
||||||
|
|
||||||
#include "RivPipeGeometryGenerator.h"
|
#include "RivPipeGeometryGenerator.h"
|
||||||
#include "RivSimWellPipeSourceInfo.h"
|
|
||||||
#include "RivSectionFlattner.h"
|
#include "RivSectionFlattner.h"
|
||||||
|
#include "RivSimWellConnectionSourceInfo.h"
|
||||||
|
#include "RivSimWellPipeSourceInfo.h"
|
||||||
|
#include "RivWellConnectionFactorGeometryGenerator.h"
|
||||||
|
#include "RivWellConnectionSourceInfo.h"
|
||||||
|
|
||||||
#include "cafEffectGenerator.h"
|
|
||||||
#include "cafDisplayCoordTransform.h"
|
#include "cafDisplayCoordTransform.h"
|
||||||
|
#include "cafEffectGenerator.h"
|
||||||
|
|
||||||
#include "cvfDrawableGeo.h"
|
#include "cvfDrawableGeo.h"
|
||||||
#include "cvfModelBasicList.h"
|
#include "cvfModelBasicList.h"
|
||||||
@ -74,7 +87,7 @@ void RivSimWellPipesPartMgr::appendDynamicGeometryPartsToModel(cvf::ModelBasicLi
|
|||||||
|
|
||||||
if (!m_rimWell->isWellPipeVisible(frameIndex)) return;
|
if (!m_rimWell->isWellPipeVisible(frameIndex)) return;
|
||||||
|
|
||||||
buildWellPipeParts(displayXf, false, 0.0, -1);
|
buildWellPipeParts(displayXf, false, 0.0, -1, frameIndex);
|
||||||
|
|
||||||
std::list<RivPipeBranchData>::iterator it;
|
std::list<RivPipeBranchData>::iterator it;
|
||||||
for (it = m_wellBranches.begin(); it != m_wellBranches.end(); ++it)
|
for (it = m_wellBranches.begin(); it != m_wellBranches.end(); ++it)
|
||||||
@ -88,6 +101,11 @@ void RivSimWellPipesPartMgr::appendDynamicGeometryPartsToModel(cvf::ModelBasicLi
|
|||||||
{
|
{
|
||||||
model->addPart(it->m_centerLinePart.p());
|
model->addPart(it->m_centerLinePart.p());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (it->m_connectionFactorsPart.notNull())
|
||||||
|
{
|
||||||
|
model->addPart(it->m_connectionFactorsPart.p());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,7 +122,7 @@ void RivSimWellPipesPartMgr::appendFlattenedDynamicGeometryPartsToModel(cvf::Mod
|
|||||||
|
|
||||||
if (!m_rimWell->isWellPipeVisible(frameIndex)) return;
|
if (!m_rimWell->isWellPipeVisible(frameIndex)) return;
|
||||||
|
|
||||||
buildWellPipeParts(displayXf, true, flattenedIntersectionExtentLength, branchIndex);
|
buildWellPipeParts(displayXf, true, flattenedIntersectionExtentLength, branchIndex, frameIndex);
|
||||||
|
|
||||||
std::list<RivPipeBranchData>::iterator it;
|
std::list<RivPipeBranchData>::iterator it;
|
||||||
for (it = m_wellBranches.begin(); it != m_wellBranches.end(); ++it)
|
for (it = m_wellBranches.begin(); it != m_wellBranches.end(); ++it)
|
||||||
@ -127,7 +145,8 @@ void RivSimWellPipesPartMgr::appendFlattenedDynamicGeometryPartsToModel(cvf::Mod
|
|||||||
void RivSimWellPipesPartMgr::buildWellPipeParts(const caf::DisplayCoordTransform* displayXf,
|
void RivSimWellPipesPartMgr::buildWellPipeParts(const caf::DisplayCoordTransform* displayXf,
|
||||||
bool doFlatten,
|
bool doFlatten,
|
||||||
double flattenedIntersectionExtentLength,
|
double flattenedIntersectionExtentLength,
|
||||||
int branchIndex)
|
int branchIndex,
|
||||||
|
size_t frameIndex)
|
||||||
{
|
{
|
||||||
if (!this->viewWithSettings()) return;
|
if (!this->viewWithSettings()) return;
|
||||||
|
|
||||||
@ -237,9 +256,91 @@ void RivSimWellPipesPartMgr::buildWellPipeParts(const caf::DisplayCoordTransform
|
|||||||
pbd.m_largeSurfaceDrawable = pbd.m_pipeGeomGenerator->createPipeSurface();
|
pbd.m_largeSurfaceDrawable = pbd.m_pipeGeomGenerator->createPipeSurface();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pbd.m_connectionFactorGeometryGenerator = nullptr;
|
||||||
|
pbd.m_connectionFactorsPart = nullptr;
|
||||||
|
|
||||||
|
RimEclipseView* eclipseView = nullptr;
|
||||||
|
m_rimWell->firstAncestorOrThisOfType(eclipseView);
|
||||||
|
|
||||||
|
if (eclipseView && eclipseView->isVirtualConnectionFactorGeometryVisible())
|
||||||
|
{
|
||||||
|
RigSimWellData* simWellData = m_rimWell->simWellData();
|
||||||
|
|
||||||
|
if (simWellData && simWellData->hasWellResult(frameIndex))
|
||||||
|
{
|
||||||
|
const RigWellResultFrame& wResFrame = simWellData->wellResultFrame(frameIndex);
|
||||||
|
|
||||||
|
std::vector<CompletionVizData> completionVizDataItems;
|
||||||
|
|
||||||
|
RimVirtualPerforationResults* virtualPerforationResult = eclipseView->virtualPerforationResult();
|
||||||
|
{
|
||||||
|
auto wellPaths = m_rimWell->wellPipeBranches();
|
||||||
|
|
||||||
|
const RigWellPath* wellPath = wellPaths[brIdx];
|
||||||
|
|
||||||
|
RigEclipseWellLogExtractor* extractor = RiaExtractionTools::findOrCreateSimWellExtractor(m_rimWell, wellPath);
|
||||||
|
if (extractor)
|
||||||
|
{
|
||||||
|
std::vector<WellPathCellIntersectionInfo> wellPathCellIntersections = extractor->cellIntersectionInfosAlongWellPath();
|
||||||
|
|
||||||
|
for (const auto& intersectionInfo : wellPathCellIntersections)
|
||||||
|
{
|
||||||
|
size_t globalCellIndex = intersectionInfo.globCellIndex;
|
||||||
|
|
||||||
|
for (const auto& wellResultPoint : pbd.m_cellIds)
|
||||||
|
{
|
||||||
|
if (wellResultPoint.m_gridCellIndex == globalCellIndex)
|
||||||
|
{
|
||||||
|
double startMD = intersectionInfo.startMD;
|
||||||
|
double endMD = intersectionInfo.endMD;
|
||||||
|
|
||||||
|
double middleMD = (startMD + endMD) / 2.0;
|
||||||
|
|
||||||
|
cvf::Vec3d defaultLocationInDomainCoord = wellPath->interpolatedPointAlongWellPath(middleMD);
|
||||||
|
|
||||||
|
cvf::Vec3d p1;
|
||||||
|
cvf::Vec3d p2;
|
||||||
|
wellPath->twoClosestPoints(defaultLocationInDomainCoord, &p1, &p2);
|
||||||
|
|
||||||
|
cvf::Vec3d defaultWellPathDirection = (p2 - p1).getNormalized();
|
||||||
|
|
||||||
|
cvf::Vec3d anchor = displayXf->transformToDisplayCoord(defaultLocationInDomainCoord);;
|
||||||
|
|
||||||
|
const RigWellResultPoint* wResCell = wResFrame.findResultCell(wellResultPoint.m_gridIndex, wellResultPoint.m_gridCellIndex);
|
||||||
|
if (wResCell && wResCell->m_isOpen)
|
||||||
|
{
|
||||||
|
CompletionVizData data(anchor, defaultWellPathDirection, wResCell->connectionFactor(), globalCellIndex);
|
||||||
|
|
||||||
|
completionVizDataItems.push_back(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!completionVizDataItems.empty())
|
||||||
|
{
|
||||||
|
double radius = pipeRadius * virtualPerforationResult->geometryScaleFactor();
|
||||||
|
radius *= 2.0; // Enlarge the radius slightly to make the connection factor visible if geometry scale factor is set to 1.0
|
||||||
|
|
||||||
|
pbd.m_connectionFactorGeometryGenerator = new RivWellConnectionFactorGeometryGenerator(completionVizDataItems, radius);
|
||||||
|
|
||||||
|
cvf::ScalarMapper* scalarMapper = virtualPerforationResult->legendConfig()->scalarMapper();
|
||||||
|
cvf::ref<cvf::Part> part = pbd.m_connectionFactorGeometryGenerator->createSurfacePart(scalarMapper, eclipseView->isLightingDisabled());
|
||||||
|
if (part.notNull())
|
||||||
|
{
|
||||||
|
cvf::ref<RivSimWellConnectionSourceInfo> sourceInfo = new RivSimWellConnectionSourceInfo(m_rimWell, pbd.m_connectionFactorGeometryGenerator.p());
|
||||||
|
part->setSourceInfo(sourceInfo.p());
|
||||||
|
}
|
||||||
|
|
||||||
|
pbd.m_connectionFactorsPart = part;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (doFlatten) flattenedStartOffset += { 2*flattenedIntersectionExtentLength, 0.0, 0.0};
|
if (doFlatten) flattenedStartOffset += { 2*flattenedIntersectionExtentLength, 0.0, 0.0};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -43,6 +43,7 @@ namespace caf
|
|||||||
class RivPipeGeometryGenerator;
|
class RivPipeGeometryGenerator;
|
||||||
class Rim3dView;
|
class Rim3dView;
|
||||||
class RimSimWellInView;
|
class RimSimWellInView;
|
||||||
|
class RivWellConnectionFactorGeometryGenerator;
|
||||||
|
|
||||||
class RivSimWellPipesPartMgr : public cvf::Object
|
class RivSimWellPipesPartMgr : public cvf::Object
|
||||||
{
|
{
|
||||||
@ -70,7 +71,8 @@ private:
|
|||||||
void buildWellPipeParts(const caf::DisplayCoordTransform* displayXf,
|
void buildWellPipeParts(const caf::DisplayCoordTransform* displayXf,
|
||||||
bool doFlatten,
|
bool doFlatten,
|
||||||
double flattenedIntersectionExtentLength,
|
double flattenedIntersectionExtentLength,
|
||||||
int branchIndex);
|
int branchIndex,
|
||||||
|
size_t frameIndex);
|
||||||
|
|
||||||
caf::PdmPointer<RimSimWellInView> m_rimWell;
|
caf::PdmPointer<RimSimWellInView> m_rimWell;
|
||||||
|
|
||||||
@ -85,6 +87,8 @@ private:
|
|||||||
cvf::ref<cvf::Part> m_centerLinePart;
|
cvf::ref<cvf::Part> m_centerLinePart;
|
||||||
cvf::ref<cvf::DrawableGeo> m_centerLineDrawable;
|
cvf::ref<cvf::DrawableGeo> m_centerLineDrawable;
|
||||||
|
|
||||||
|
cvf::ref<RivWellConnectionFactorGeometryGenerator> m_connectionFactorGeometryGenerator;
|
||||||
|
cvf::ref<cvf::Part> m_connectionFactorsPart;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::list<RivPipeBranchData> m_wellBranches;
|
std::list<RivPipeBranchData> m_wellBranches;
|
||||||
|
@ -18,17 +18,20 @@
|
|||||||
|
|
||||||
#include "RivWellConnectionFactorGeometryGenerator.h"
|
#include "RivWellConnectionFactorGeometryGenerator.h"
|
||||||
|
|
||||||
|
#include "cafEffectGenerator.h"
|
||||||
#include "cvfArray.h"
|
#include "cvfArray.h"
|
||||||
#include "cvfDrawableGeo.h"
|
#include "cvfDrawableGeo.h"
|
||||||
|
#include "cvfPart.h"
|
||||||
#include "cvfPrimitiveSetIndexedUInt.h"
|
#include "cvfPrimitiveSetIndexedUInt.h"
|
||||||
|
#include "cvfScalarMapper.h"
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RivWellConnectionFactorGeometryGenerator::RivWellConnectionFactorGeometryGenerator(
|
RivWellConnectionFactorGeometryGenerator::RivWellConnectionFactorGeometryGenerator(
|
||||||
std::vector<CompletionVizData>& centerColorPairs,
|
std::vector<CompletionVizData>& completionVizData,
|
||||||
float radius)
|
float radius)
|
||||||
: m_completionVizData(centerColorPairs)
|
: m_completionVizData(completionVizData)
|
||||||
, m_radius(radius)
|
, m_radius(radius)
|
||||||
, m_trianglesPerConnection(0)
|
, m_trianglesPerConnection(0)
|
||||||
{
|
{
|
||||||
@ -39,6 +42,56 @@ RivWellConnectionFactorGeometryGenerator::RivWellConnectionFactorGeometryGenerat
|
|||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
RivWellConnectionFactorGeometryGenerator::~RivWellConnectionFactorGeometryGenerator() {}
|
RivWellConnectionFactorGeometryGenerator::~RivWellConnectionFactorGeometryGenerator() {}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
cvf::ref<cvf::Part> RivWellConnectionFactorGeometryGenerator::createSurfacePart(const cvf::ScalarMapper* scalarMapper, bool disableLighting)
|
||||||
|
{
|
||||||
|
if (!scalarMapper) return nullptr;
|
||||||
|
|
||||||
|
cvf::ref<cvf::DrawableGeo> drawable = createSurfaceGeometry();
|
||||||
|
if (drawable.notNull())
|
||||||
|
{
|
||||||
|
cvf::ref<cvf::Part> part = new cvf::Part;
|
||||||
|
part->setDrawable(drawable.p());
|
||||||
|
|
||||||
|
// Compute texture coords
|
||||||
|
cvf::ref<cvf::Vec2fArray> textureCoords = new cvf::Vec2fArray();
|
||||||
|
{
|
||||||
|
textureCoords->reserve(drawable->vertexArray()->size());
|
||||||
|
size_t verticesPerItem = drawable->vertexArray()->size() / m_completionVizData.size();
|
||||||
|
|
||||||
|
textureCoords->setAll(cvf::Vec2f(0.5f, 1.0f));
|
||||||
|
|
||||||
|
for (const auto& item : m_completionVizData)
|
||||||
|
{
|
||||||
|
cvf::Vec2f textureCoord = cvf::Vec2f(0.5f, 1.0f);
|
||||||
|
if (item.m_connectionFactor != HUGE_VAL)
|
||||||
|
{
|
||||||
|
textureCoord = scalarMapper->mapToTextureCoord(item.m_connectionFactor);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < verticesPerItem; i++)
|
||||||
|
{
|
||||||
|
textureCoords->add(textureCoord);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drawable->setTextureCoordArray(textureCoords.p());
|
||||||
|
|
||||||
|
caf::ScalarMapperEffectGenerator effGen(scalarMapper, caf::PO_1);
|
||||||
|
effGen.disableLighting(disableLighting);
|
||||||
|
|
||||||
|
cvf::ref<cvf::Effect> eff = effGen.generateCachedEffect();
|
||||||
|
part->setEffect(eff.p());
|
||||||
|
|
||||||
|
return part;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
namespace cvf
|
namespace cvf
|
||||||
{
|
{
|
||||||
class DrawableGeo;
|
class DrawableGeo;
|
||||||
|
class Part;
|
||||||
|
class ScalarMapper;
|
||||||
} // namespace cvf
|
} // namespace cvf
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -55,16 +57,18 @@ struct CompletionVizData
|
|||||||
class RivWellConnectionFactorGeometryGenerator : public cvf::Object
|
class RivWellConnectionFactorGeometryGenerator : public cvf::Object
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RivWellConnectionFactorGeometryGenerator(std::vector<CompletionVizData>& centerColorPairs, float radius);
|
RivWellConnectionFactorGeometryGenerator(std::vector<CompletionVizData>& completionVizData, float radius);
|
||||||
~RivWellConnectionFactorGeometryGenerator();
|
~RivWellConnectionFactorGeometryGenerator();
|
||||||
|
|
||||||
cvf::ref<cvf::DrawableGeo> createSurfaceGeometry();
|
cvf::ref<cvf::Part> createSurfacePart(const cvf::ScalarMapper* scalarMapper, bool disableLighting);
|
||||||
|
|
||||||
double connectionFactor(cvf::uint triangleIndex) const;
|
double connectionFactor(cvf::uint triangleIndex) const;
|
||||||
size_t globalCellIndexFromTriangleIndex(cvf::uint triangleIndex) const;
|
size_t globalCellIndexFromTriangleIndex(cvf::uint triangleIndex) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
size_t mapFromTriangleToConnectionIndex(cvf::uint triangleIndex) const;
|
size_t mapFromTriangleToConnectionIndex(cvf::uint triangleIndex) const;
|
||||||
|
cvf::ref<cvf::DrawableGeo> createSurfaceGeometry();
|
||||||
|
|
||||||
static cvf::Mat4f rotationMatrixBetweenVectors(const cvf::Vec3d& v1, const cvf::Vec3d& v2);
|
static cvf::Mat4f rotationMatrixBetweenVectors(const cvf::Vec3d& v1, const cvf::Vec3d& v2);
|
||||||
static void
|
static void
|
||||||
createStarGeometry(std::vector<cvf::Vec3f>* vertices, std::vector<cvf::uint>* indices, float radius, float thickness);
|
createStarGeometry(std::vector<cvf::Vec3f>* vertices, std::vector<cvf::uint>* indices, float radius, float thickness);
|
||||||
|
@ -149,52 +149,21 @@ void RivWellConnectionFactorPartMgr::appendDynamicGeometryPartsToModel(cvf::Mode
|
|||||||
|
|
||||||
if (!completionVizDataItems.empty())
|
if (!completionVizDataItems.empty())
|
||||||
{
|
{
|
||||||
double radius = mainGrid->characteristicIJCellSize() * m_virtualPerforationResult->geometryScaleFactor();
|
double characteristicCellSize = eclView->ownerCase()->characteristicCellSize();
|
||||||
|
|
||||||
|
double radius = m_rimWell->wellPathRadius(characteristicCellSize) * m_virtualPerforationResult->geometryScaleFactor();
|
||||||
|
radius *= 2.0; // Enlarge the radius slightly to make the connection factor visible if geometry scale factor is set to 1.0
|
||||||
|
|
||||||
m_geometryGenerator = new RivWellConnectionFactorGeometryGenerator(completionVizDataItems, radius);
|
m_geometryGenerator = new RivWellConnectionFactorGeometryGenerator(completionVizDataItems, radius);
|
||||||
auto drawable = m_geometryGenerator->createSurfaceGeometry();
|
|
||||||
|
|
||||||
cvf::ref<cvf::Part> part = new cvf::Part;
|
|
||||||
part->setDrawable(drawable.p());
|
|
||||||
|
|
||||||
auto scalarMapper = m_virtualPerforationResult->legendConfig()->scalarMapper();
|
auto scalarMapper = m_virtualPerforationResult->legendConfig()->scalarMapper();
|
||||||
|
cvf::ref<cvf::Part> part = m_geometryGenerator->createSurfacePart(scalarMapper, eclView->isLightingDisabled());
|
||||||
// Compute texture coords
|
if (part.notNull())
|
||||||
cvf::ref<cvf::Vec2fArray> textureCoords = new cvf::Vec2fArray();
|
|
||||||
{
|
{
|
||||||
textureCoords->reserve(drawable->vertexArray()->size());
|
cvf::ref<RivWellConnectionSourceInfo> sourceInfo = new RivWellConnectionSourceInfo(m_rimWell, m_geometryGenerator.p());
|
||||||
size_t verticesPerItem = drawable->vertexArray()->size() / completionVizDataItems.size();
|
part->setSourceInfo(sourceInfo.p());
|
||||||
|
|
||||||
textureCoords->setAll(cvf::Vec2f(0.5f, 1.0f));
|
model->addPart(part.p());
|
||||||
|
|
||||||
for (const auto& item : completionVizDataItems)
|
|
||||||
{
|
|
||||||
cvf::Vec2f textureCoord = cvf::Vec2f(0.5f, 1.0f);
|
|
||||||
if (item.m_connectionFactor != HUGE_VAL)
|
|
||||||
{
|
|
||||||
textureCoord = scalarMapper->mapToTextureCoord(item.m_connectionFactor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < verticesPerItem; i++)
|
|
||||||
{
|
|
||||||
textureCoords->add(textureCoord);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drawable->setTextureCoordArray(textureCoords.p());
|
|
||||||
|
|
||||||
caf::ScalarMapperEffectGenerator effGen(scalarMapper, caf::PO_1);
|
|
||||||
|
|
||||||
bool disableLighting = eclView->isLightingDisabled();
|
|
||||||
effGen.disableLighting(disableLighting);
|
|
||||||
|
|
||||||
cvf::ref<cvf::Effect> eff = effGen.generateCachedEffect();
|
|
||||||
part->setEffect(eff.p());
|
|
||||||
|
|
||||||
cvf::ref<RivWellConnectionSourceInfo> sourceInfo = new RivWellConnectionSourceInfo(m_rimWell, m_geometryGenerator.p());
|
|
||||||
part->setSourceInfo(sourceInfo.p());
|
|
||||||
|
|
||||||
model->addPart(part.p());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -71,12 +71,14 @@
|
|||||||
#include "RivIntersectionBoxSourceInfo.h"
|
#include "RivIntersectionBoxSourceInfo.h"
|
||||||
#include "RivIntersectionSourceInfo.h"
|
#include "RivIntersectionSourceInfo.h"
|
||||||
#include "RivObjectSourceInfo.h"
|
#include "RivObjectSourceInfo.h"
|
||||||
|
#include "RivSimWellConnectionSourceInfo.h"
|
||||||
#include "RivSimWellPipeSourceInfo.h"
|
#include "RivSimWellPipeSourceInfo.h"
|
||||||
#include "RivSourceInfo.h"
|
#include "RivSourceInfo.h"
|
||||||
#include "RivTernarySaturationOverlayItem.h"
|
#include "RivTernarySaturationOverlayItem.h"
|
||||||
#include "RivWellConnectionSourceInfo.h"
|
#include "RivWellConnectionSourceInfo.h"
|
||||||
#include "RivWellFracturePartMgr.h"
|
#include "RivWellFracturePartMgr.h"
|
||||||
#include "RivWellPathSourceInfo.h"
|
#include "RivWellPathSourceInfo.h"
|
||||||
|
|
||||||
#include "cafCmdExecCommandManager.h"
|
#include "cafCmdExecCommandManager.h"
|
||||||
#include "cafCmdFeatureManager.h"
|
#include "cafCmdFeatureManager.h"
|
||||||
#include "cafCmdFeatureMenuBuilder.h"
|
#include "cafCmdFeatureMenuBuilder.h"
|
||||||
@ -690,6 +692,54 @@ void RiuViewerCommands::handlePickAction(int winPosX, int winPosY, Qt::KeyboardM
|
|||||||
|
|
||||||
RiuMainWindow::instance()->selectAsCurrentItem(wellConnectionSourceInfo->wellPath(), allowActiveViewChange);
|
RiuMainWindow::instance()->selectAsCurrentItem(wellConnectionSourceInfo->wellPath(), allowActiveViewChange);
|
||||||
}
|
}
|
||||||
|
else if (dynamic_cast<const RivSimWellConnectionSourceInfo*>(firstHitPart->sourceInfo()))
|
||||||
|
{
|
||||||
|
const RivSimWellConnectionSourceInfo* simWellConnectionSourceInfo = dynamic_cast<const RivSimWellConnectionSourceInfo*>(firstHitPart->sourceInfo());
|
||||||
|
|
||||||
|
bool allowActiveViewChange = dynamic_cast<Rim2dIntersectionView*>(m_viewer->ownerViewWindow()) == nullptr;
|
||||||
|
|
||||||
|
size_t globalCellIndex = simWellConnectionSourceInfo->globalCellIndexFromTriangleIndex(firstPartTriangleIndex);
|
||||||
|
double connectionFactor = simWellConnectionSourceInfo->connectionFactorFromTriangleIndex(firstPartTriangleIndex);
|
||||||
|
|
||||||
|
RimEclipseView* eclipseView = dynamic_cast<RimEclipseView*>(m_reservoirView.p());
|
||||||
|
if (eclipseView)
|
||||||
|
{
|
||||||
|
RimEclipseCase* eclipseCase = nullptr;
|
||||||
|
eclipseView->firstAncestorOrThisOfTypeAsserted(eclipseCase);
|
||||||
|
|
||||||
|
if (eclipseCase->eclipseCaseData() &&
|
||||||
|
eclipseCase->eclipseCaseData()->virtualPerforationTransmissibilities())
|
||||||
|
{
|
||||||
|
auto connectionFactors = eclipseCase->eclipseCaseData()->virtualPerforationTransmissibilities();
|
||||||
|
size_t timeStep = eclipseView->currentTimeStep();
|
||||||
|
|
||||||
|
const auto& completionData = connectionFactors->completionsForSimWell(simWellConnectionSourceInfo->simWellInView()->simWellData(), timeStep);
|
||||||
|
|
||||||
|
for (const auto& compData : completionData)
|
||||||
|
{
|
||||||
|
if (compData.completionDataGridCell().globalCellIndex() == globalCellIndex)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
QString resultInfoText = QString("<b>Simulation Well Connection Factor :</b> %1<br><br>").arg(connectionFactor);
|
||||||
|
|
||||||
|
{
|
||||||
|
RiuResultTextBuilder textBuilder(eclipseView, globalCellIndex, eclipseView->currentTimeStep());
|
||||||
|
|
||||||
|
resultInfoText += textBuilder.geometrySelectionText("<br>");
|
||||||
|
}
|
||||||
|
|
||||||
|
RiuMainWindow::instance()->setResultInfo(resultInfoText);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
RiuMainWindow::instance()->selectAsCurrentItem(simWellConnectionSourceInfo->simWellInView(), allowActiveViewChange);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstNncHitPart && firstNncHitPart->sourceInfo())
|
if (firstNncHitPart && firstNncHitPart->sourceInfo())
|
||||||
|
Loading…
Reference in New Issue
Block a user