///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2015- Statoil ASA // Copyright (C) 2015- Ceetron Solutions AS // // 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 "RigWellLogFile.h" #include "RigWellLogCurveData.h" #include "RiaStringEncodingTools.h" #include "RimWellLogCurve.h" #include "laswell.hpp" #include "well.hpp" #include #include #include // Needed for HUGE_VAL on Linux #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RigWellLogFile::RigWellLogFile() : cvf::Object() { m_wellLogFile = nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RigWellLogFile::~RigWellLogFile() { close(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RigWellLogFile::open( const QString& fileName, QString* errorMessage ) { close(); NRLib::Well* well = nullptr; try { int wellFormat = NRLib::Well::LAS; well = NRLib::Well::ReadWell( RiaStringEncodingTools::toNativeEncoded( fileName ).data(), wellFormat ); if ( !well ) { return false; } } catch ( std::exception& e ) { if ( well ) { delete well; } if ( e.what() ) { CVF_ASSERT( errorMessage ); *errorMessage = e.what(); } return false; } QStringList wellLogNames; const std::map>& contLogs = well->GetContLog(); std::map>::const_iterator itCL; for ( itCL = contLogs.begin(); itCL != contLogs.end(); ++itCL ) { QString logName = QString::fromStdString( itCL->first ); wellLogNames.append( logName ); // 2018-11-09 Added MD https://github.com/OPM/ResInsight/issues/3641 if ( logName.toUpper() == "DEPT" || logName.toUpper() == "DEPTH" || logName.toUpper() == "MD" ) { m_depthLogName = logName; } else if ( logName.toUpper() == "TVDMSL" ) { m_tvdMslLogName = logName; } else if ( logName.toUpper() == "TVDRKB" ) { m_tvdRkbLogName = logName; } } m_wellLogChannelNames = wellLogNames; m_wellLogFile = well; return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RigWellLogFile::close() { if ( m_wellLogFile ) { delete m_wellLogFile; m_wellLogFile = nullptr; } m_wellLogChannelNames.clear(); m_depthLogName.clear(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RigWellLogFile::wellName() const { CVF_ASSERT( m_wellLogFile ); return RiaStringEncodingTools::fromNativeEncoded( m_wellLogFile->GetWellName().data() ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RigWellLogFile::date() const { CVF_ASSERT( m_wellLogFile ); return QString::fromStdString( m_wellLogFile->GetDate() ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QStringList RigWellLogFile::wellLogChannelNames() const { return m_wellLogChannelNames; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigWellLogFile::depthValues() const { return values( m_depthLogName ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigWellLogFile::tvdMslValues() const { return values( m_tvdMslLogName ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigWellLogFile::tvdRkbValues() const { return values( m_tvdRkbLogName ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigWellLogFile::values( const QString& name ) const { CVF_ASSERT( m_wellLogFile ); if ( m_wellLogFile->HasContLog( name.toStdString() ) ) { std::vector logValues = m_wellLogFile->GetContLog( name.toStdString() ); for ( size_t vIdx = 0; vIdx < logValues.size(); vIdx++ ) { if ( m_wellLogFile->IsMissing( logValues[vIdx] ) ) { // Convert missing ("NULL") values to HUGE_VAL logValues[vIdx] = HUGE_VAL; } } return logValues; } return std::vector(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RigWellLogFile::depthUnitString() const { QString unit; NRLib::LasWell* lasWell = dynamic_cast( m_wellLogFile ); if ( lasWell ) { unit = QString::fromStdString( lasWell->depthUnit() ); } return unit; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RigWellLogFile::wellLogChannelUnitString( const QString& wellLogChannelName, RiaDefines::DepthUnitType displayDepthUnit ) const { QString unit; NRLib::LasWell* lasWell = dynamic_cast( m_wellLogFile ); if ( lasWell ) { unit = QString::fromStdString( lasWell->unitName( wellLogChannelName.toStdString() ) ); } if ( unit == depthUnitString() ) { if ( displayDepthUnit != depthUnit() ) { if ( displayDepthUnit == RiaDefines::DepthUnitType::UNIT_METER ) { return "M"; } else if ( displayDepthUnit == RiaDefines::DepthUnitType::UNIT_FEET ) { return "FT"; } else if ( displayDepthUnit == RiaDefines::DepthUnitType::UNIT_NONE ) { CVF_ASSERT( false ); return ""; } } } return unit; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- QString RigWellLogFile::wellLogChannelUnitString( const QString& wellLogChannelName ) const { QString unit; NRLib::LasWell* lasWell = dynamic_cast( m_wellLogFile ); if ( lasWell ) { return QString::fromStdString( lasWell->unitName( wellLogChannelName.toStdString() ) ); } return ""; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RigWellLogFile::hasTvdMslChannel() const { return !m_tvdMslLogName.isEmpty(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RigWellLogFile::hasTvdRkbChannel() const { return !m_tvdRkbLogName.isEmpty(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- double RigWellLogFile::getMissingValue() const { return m_wellLogFile->GetContMissing(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaDefines::DepthUnitType RigWellLogFile::depthUnit() const { RiaDefines::DepthUnitType unitType = RiaDefines::DepthUnitType::UNIT_METER; if ( depthUnitString().toUpper() == "F" || depthUnitString().toUpper() == "FT" ) { unitType = RiaDefines::DepthUnitType::UNIT_FEET; } return unitType; }