///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2018- 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 // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RifElementPropertyReader.h" #include "RiaEclipseUnitTools.h" #include "RiaLogging.h" #include "RiaQStringFormatter.h" #include "RifFileParseTools.h" #include "RiuMessageDialog.h" #include "cafAssert.h" #include #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RifElementPropertyReader::RifElementPropertyReader( const std::vector& elementIdxToId ) : m_elementIdxToId( elementIdxToId ) { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RifElementPropertyReader::~RifElementPropertyReader() { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RifElementPropertyReader::addFile( const std::string& fileName ) { RifElementPropertyMetadata metaData = RifElementPropertyTableReader::readMetadata( QString::fromStdString( fileName ) ); for ( QString field : metaData.dataColumns ) { m_fieldsMetaData[field.toStdString()] = metaData; } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RifElementPropertyReader::removeFile( const std::string& fileName ) { std::map tempMetaData; for ( std::pair metaData : m_fieldsMetaData ) { if ( metaData.second.fileName.toStdString() != fileName ) { tempMetaData[metaData.first] = metaData.second; } } m_fieldsMetaData.swap( tempMetaData ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RifElementPropertyReader::scalarElementFields() const { std::vector fields; for ( const std::pair& field : m_fieldsMetaData ) { fields.push_back( field.first ); } return fields; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- static void scaleColumnIfModulus( const std::string& fieldName, std::vector& data ) { if ( fieldName == "MODULUS" ) { const float paToGPa = static_cast( 1.0 / RiaEclipseUnitTools::gigaPascalToPascal( 1.0 ) ); for ( float& v : data ) { v *= paToGPa; } } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::map> RifElementPropertyReader::readAllElementPropertiesInFileContainingField( const std::string& fieldName ) { std::map> fieldAndData; if ( m_fieldsMetaData.find( fieldName ) == m_fieldsMetaData.end() ) { return fieldAndData; } RifElementPropertyTable table; try { RifElementPropertyTableReader::readData( &m_fieldsMetaData[fieldName], &table ); } catch ( FileParseException& exception ) { RiaLogging::error( std::format( "Element property import failed: '{}'.", exception.message ) ); return fieldAndData; } // The file may have been moved or deleted after the metadata was read if ( !table.hasData || m_fieldsMetaData[fieldName].dataColumns.size() != table.data.size() ) { return fieldAndData; } for ( size_t i = 0; i < table.data.size(); i++ ) { CAF_ASSERT( table.data[i].size() == table.elementIds.size() ); } const std::vector& elementIdsFromFile = table.elementIds; if ( elementIdsFromFile == m_elementIdxToId ) { for ( size_t i = 0; i < table.data.size(); i++ ) { const std::string& currentFieldFromFile = m_fieldsMetaData[fieldName].dataColumns[i].toStdString(); std::vector columnData = table.data[i]; scaleColumnIfModulus( currentFieldFromFile, columnData ); fieldAndData[currentFieldFromFile] = std::move( columnData ); } } else if ( elementIdsFromFile.size() > m_elementIdxToId.size() && elementIdsFromFile.size() > m_elementIdToIdx.size() ) { RifElementPropertyReader::outputWarningAboutWrongFileData(); return fieldAndData; } else { if ( m_elementIdToIdx.empty() ) { makeElementIdToIdxMap(); } std::vector fileIdxToElementIdx; fileIdxToElementIdx.reserve( elementIdsFromFile.size() ); for ( int elementId : elementIdsFromFile ) { auto it = m_elementIdToIdx.find( elementId ); if ( it == m_elementIdToIdx.end() ) { RifElementPropertyReader::outputWarningAboutWrongFileData(); return fieldAndData; } fileIdxToElementIdx.push_back( it->second ); } for ( size_t i = 0; i < table.data.size(); i++ ) { std::string currentFieldFromFile = m_fieldsMetaData[fieldName].dataColumns[i].toStdString(); const std::vector& currentColumn = table.data[i]; std::vector tempResult( m_elementIdToIdx.size(), HUGE_VAL ); for ( size_t j = 0; j < currentColumn.size(); j++ ) { tempResult[fileIdxToElementIdx[j]] = currentColumn[j]; } scaleColumnIfModulus( currentFieldFromFile, tempResult ); fieldAndData[currentFieldFromFile].swap( tempResult ); } } return fieldAndData; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RifElementPropertyReader::fieldsInFile( const std::string& fileName ) const { std::vector fields; for ( std::pair metaData : m_fieldsMetaData ) { if ( metaData.second.fileName.toStdString() == fileName ) { for ( const QString& column : metaData.second.dataColumns ) { fields.push_back( column.toStdString() ); } } } return fields; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RifElementPropertyReader::makeElementIdToIdxMap() { m_elementIdToIdx.reserve( m_elementIdxToId.size() ); for ( size_t i = 0; i < m_elementIdxToId.size(); i++ ) { m_elementIdToIdx[m_elementIdxToId[i]] = (int)i; } std::vector tempVectorForDeletion; m_elementIdxToId.swap( tempVectorForDeletion ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RifElementPropertyReader::outputWarningAboutWrongFileData() { QString warningText = QString( "The chosen result property does not fit the model" ); RiuMessageDialog::showError( nullptr, "Element Property Reader", warningText ); }