X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FDriverMED%2FDriverMED_W_Field.cxx;h=c722aaf357bc484407ec572dd236c074173bba29;hp=8317ae96b4cbe1ea23e76303f96db593a3035f7c;hb=ef9db08c815361b806e558b78acf445adc43613d;hpb=4c16067d4281f56bd07d3f92fb63fff9c0c1d169 diff --git a/src/DriverMED/DriverMED_W_Field.cxx b/src/DriverMED/DriverMED_W_Field.cxx index 8317ae96b..c722aaf35 100644 --- a/src/DriverMED/DriverMED_W_Field.cxx +++ b/src/DriverMED/DriverMED_W_Field.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -26,6 +26,7 @@ #include "DriverMED_W_Field.h" +#include "MED_TFile.hxx" #include "DriverMED.hxx" #include "DriverMED_W_SMESHDS_Mesh.h" #include "MED_Factory.hxx" @@ -90,7 +91,7 @@ bool DriverMED_W_Field::Set(SMESHDS_Mesh * mesh, } // find out "MED order" of elements - sort elements by geom type - int nbElems; + smIdType nbElems; if ( _nbElemsByGeom.empty() || _elemType != type ) { _elemType = type; @@ -119,7 +120,7 @@ bool DriverMED_W_Field::Set(SMESHDS_Mesh * mesh, if ( _nbElemsByGeom.size() == 1 ) _nbElemsByGeom.push_back( std::make_pair( SMDSEntity_0D, 0)); _nbElemsByGeom.push_back( std::make_pair( SMDSEntity_Node, - nodes.size() + _nbElemsByGeom.back().second )); + nodes.size() + _nbElemsByGeom.back().second )); } } @@ -156,7 +157,7 @@ bool DriverMED_W_Field::Set(SMESHDS_Mesh * mesh, else _dblValues.reserve( nbElems * nbComps ); - return nbElems * nbComps; + return nbElems && nbComps; } //================================================================================ @@ -236,16 +237,8 @@ SMDS_ElemIteratorPtr DriverMED_W_Field::GetOrderedElems() return SMDS_ElemIteratorPtr( new TItIterator( iterVec )); } -//================================================================================ -/*! - * Writes a field to the file - */ -//================================================================================ - -Driver_Mesh::Status DriverMED_W_Field::Perform() +Driver_Mesh::Status DriverMED_W_Field::PerformInternal(MED::PWrapper& medFile) { - if ( myFile.empty() ) - return addMessage("File name not set", /*isFatal=*/true ); // 'fatal' means 'bug' if ( myMeshId < 0 && myMeshName.empty() ) return addMessage("Mesh in file not specified", /*isFatal=*/true ); if ( _nbElemsByGeom.size() < 2 ) @@ -253,7 +246,6 @@ Driver_Mesh::Status DriverMED_W_Field::Perform() if ( !myMesh ) return addMessage("Supporting mesh not set", /*isFatal=*/true ); - MED::PWrapper medFile = MED::CrWrapper( myFile, MED::eV2_2 ); MED::PMeshInfo meshInfo; if ( myMeshId > 0 ) { @@ -276,7 +268,7 @@ Driver_Mesh::Status DriverMED_W_Field::Perform() ( !myMeshName.empty() && meshInfo->GetName() != myMeshName )) { myMeshId = -1; - return addMessage("Specified mesh not found in the file", /*isFatal=*/true ); + return addMessage("DriverMED_W_Field: Specified mesh not found in the file", /*isFatal=*/true ); } // create a field @@ -357,6 +349,49 @@ Driver_Mesh::Status DriverMED_W_Field::Perform() return DRS_OK; } +/*! + * Writes a field to the file + */ +Driver_Mesh::Status DriverMED_W_Field::Perform() +{ + if ( myFile.empty() ) + return addMessage("File name not set", /*isFatal=*/true ); // 'fatal' means 'bug' + int version = -1, major, minor, release; + if ( MED::GetMEDVersion( myFile, major, minor, release )) + version = major * 10 + minor; + + MED::PWrapper medFile = MED::CrWrapperW( myFile, version ); + return this->PerformInternal(medFile); +} + +/*! + * Writes a field to a chunck of memory + */ +Driver_Mesh::Status DriverMED_W_Field_Mem::Perform() +{ + void *ptr(nullptr); + std::size_t sz(0); + Driver_Mesh::Status status = Driver_Mesh::DRS_OK; + bool isClosed(false); + MED::TMemFile *tfileInst = nullptr; + char *initPtr(_data->getPointer()); + mcIdType initSz(_data->getNumberOfTuples()); + _data->accessToMemArray().setSpecificDeallocator(nullptr); + _data->useArray(nullptr,false,MEDCoupling::DeallocType::C_DEALLOC,0,1); + {// let braces to flush (call of MED::PWrapper myMed destructor) + tfileInst = new MED::TMemFile(initPtr,initSz,&isClosed); + MED::PWrapper myMed = MED::CrWrapperW(myFile, -1, tfileInst); + status = this->PerformInternal(myMed); + } + if(tfileInst) + { + ptr = tfileInst->getData(); sz = tfileInst->getSize(); + } + _data = MEDCoupling::DataArrayByte::New(); + _data->useArray(reinterpret_cast(ptr),true,MEDCoupling::DeallocType::C_DEALLOC,sz,1); + return status; +} + namespace DriverMED // Implementation of functions declared in DriverMED.hxx { //================================================================================