//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- double RimWellLogExtractionCurve::rkbDiff() const { if (m_wellPath && m_wellPath->wellPathGeometry()) { RigWellPath* geo = m_wellPath->wellPathGeometry(); if (geo->hasDatumElevation()) { return geo->datumElevation(); } // If measured depth is zero, use the z-value of the well path points if (geo->m_wellPathPoints.size() > 0 && geo->m_measuredDepths.size() > 0) { double epsilon = 1e-3; if (cvf::Math::abs(geo->m_measuredDepths[0]) < epsilon) { double diff = geo->m_measuredDepths[0] - (-geo->m_wellPathPoints[0].z()); return diff; } } } return HUGE_VAL; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- cvf::BoundingBox RimPerforationInterval::boundingBoxInDomainCoords() { cvf::BoundingBox bb; RimWellPath* wellPath = nullptr; this->firstAncestorOrThisOfTypeAsserted(wellPath); RigWellPath* rigWellPath = wellPath->wellPathGeometry(); if (rigWellPath) { bb.add(rigWellPath->interpolatedPointAlongWellPath(startMD())); bb.add(rigWellPath->interpolatedPointAlongWellPath(endMD())); } return bb; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- double RimWellPathFracture::wellAzimuthAtFracturePosition() const { RimWellPath* wellPath = nullptr; this->firstAncestorOrThisOfType(wellPath); if (!wellPath) return cvf::UNDEFINED_DOUBLE; double wellPathAzimuth = 0.0; RigWellPath* wellPathGeometry = wellPath->wellPathGeometry(); if (wellPathGeometry) { wellPathAzimuth = wellPathGeometry->wellPathAzimuthAngle(fracturePosition()); } if (wellPathAzimuth < 0) wellPathAzimuth += 360; return wellPathAzimuth; }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellPathFracture::updatePositionFromMeasuredDepth() { cvf::Vec3d positionAlongWellpath = cvf::Vec3d::ZERO; caf::PdmObjectHandle* objHandle = dynamic_cast<caf::PdmObjectHandle*>(this); if (!objHandle) return; RimWellPath* wellPath = nullptr; objHandle->firstAncestorOrThisOfType(wellPath); if (!wellPath) return; RigWellPath* wellPathGeometry = wellPath->wellPathGeometry(); if (wellPathGeometry) { positionAlongWellpath = wellPathGeometry->interpolatedPointAlongWellPath(m_measuredDepth()); } this->setAnchorPosition(positionAlongWellpath); }
//-------------------------------------------------------------------------------------------------- /// Read JSON file containing well path data //-------------------------------------------------------------------------------------------------- void RimWellPath::readJsonWellPathFile() { RigWellPath* wellPathGeom = new RigWellPath(); ResInsightInternalJson::JsonReader jsonReader; QMap<QString, QVariant> jsonMap = jsonReader.decodeFile(filepath); // General well info name = jsonMap["name"].toString(); id = jsonMap["id"].toString(); sourceSystem = jsonMap["sourceSystem"].toString(); utmZone = jsonMap["utmZone"].toString(); updateUser = jsonMap["updateUser"].toString(); setSurveyType(jsonMap["surveyType"].toString()); // Convert updateDate from the following format: // "Number of milliseconds elapsed since midnight Coordinated Universal Time (UTC) // of January 1, 1970, not counting leap seconds" QString updateDateStr = jsonMap["updateDate"].toString().trimmed(); uint updateDateUint = updateDateStr.toULongLong() / 1000; // should be within 32 bit, maximum number is 4294967295 which corresponds to year 2106 QDateTime updateDateTime; updateDateTime.setTime_t(updateDateUint); updateDate = updateDateTime.toString("d MMMM yyyy"); // Well path points double datumElevation = jsonMap["datumElevation"].toDouble(); wellPathGeom->setDatumElevation(datumElevation); QList<QVariant> pathList = jsonMap["path"].toList(); foreach (QVariant point, pathList) { QMap<QString, QVariant> coordinateMap = point.toMap(); cvf::Vec3d vec3d(coordinateMap["east"].toDouble(), coordinateMap["north"].toDouble(), -(coordinateMap["tvd"].toDouble() - datumElevation)); wellPathGeom->m_wellPathPoints.push_back(vec3d); double measuredDepth = coordinateMap["md"].toDouble(); wellPathGeom->m_measuredDepths.push_back(measuredDepth); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimWellLogFileCurve::onLoadDataAndUpdate(bool updateParentPlot) { this->RimPlotCurve::updateCurvePresentation(updateParentPlot); if (isCurveVisible()) { m_curveData = new RigWellLogCurveData; RimWellLogPlot* wellLogPlot; firstAncestorOrThisOfType(wellLogPlot); CVF_ASSERT(wellLogPlot); if (m_wellPath && m_wellLogFile) { RigWellLogFile* wellLogFile = m_wellLogFile->wellLogFileData(); if (wellLogFile) { std::vector<double> values = wellLogFile->values(m_wellLogChannnelName); std::vector<double> measuredDepthValues = wellLogFile->depthValues(); if (wellLogPlot && wellLogPlot->depthType() == RimWellLogPlot::TRUE_VERTICAL_DEPTH) { bool canUseTvd = false; if (wellLogFile->hasTvdChannel()) { std::vector<double> tvdMslValues = wellLogFile->tvdMslValues(); if (values.size() == measuredDepthValues.size() && values.size() == tvdMslValues.size()) { m_curveData->setValuesWithTVD(values, measuredDepthValues, tvdMslValues, wellLogFile->depthUnit(), false); canUseTvd = true; } } if (!canUseTvd) { RigWellPath* rigWellPath = m_wellPath->wellPathGeometry(); if (rigWellPath) { std::vector<double> trueVerticeldepthValues; for (double measuredDepthValue : measuredDepthValues) { trueVerticeldepthValues.push_back(-rigWellPath->interpolatedPointAlongWellPath(measuredDepthValue).z()); } if (values.size() == trueVerticeldepthValues.size() && values.size() == measuredDepthValues.size()) { m_curveData->setValuesWithTVD(values, measuredDepthValues, trueVerticeldepthValues, wellLogFile->depthUnit(), false); canUseTvd = true; } } } if (!canUseTvd) { if (RiaApplication::instance()->preferences()->showLasCurveWithoutTvdWarning()) { QString tmp = QString("Display of True Vertical Depth (TVD) for LAS curves is not possible without a well log path, and the LAS curve will be hidden in this mode.\n\n"); tmp += "Control display of this warning from \"Preferences->Show LAS curve without TVD warning\""; QMessageBox::warning(nullptr, "LAS curve without TVD", tmp); } } } else { if (values.size() == measuredDepthValues.size()) { m_curveData->setValuesAndMD(values, measuredDepthValues, wellLogFile->depthUnit(), false); } } } if (m_isUsingAutoName) { m_qwtPlotCurve->setTitle(createCurveAutoName()); } } RiaDefines::DepthUnitType displayUnit = RiaDefines::UNIT_METER; if (wellLogPlot) { displayUnit = wellLogPlot->depthUnit(); } if (wellLogPlot && wellLogPlot->depthType() == RimWellLogPlot::TRUE_VERTICAL_DEPTH) { m_qwtPlotCurve->setSamples(m_curveData->xPlotValues().data(), m_curveData->trueDepthPlotValues(displayUnit).data(), static_cast<int>(m_curveData->xPlotValues().size())); } else { m_qwtPlotCurve->setSamples(m_curveData->xPlotValues().data(), m_curveData->measuredDepthPlotValues(displayUnit).data(), static_cast<int>(m_curveData->xPlotValues().size())); } m_qwtPlotCurve->setLineSegmentStartStopIndices(m_curveData->polylineStartStopIndices()); updateZoomInParentPlot(); if (m_parentQwtPlot) m_parentQwtPlot->replot(); } }