]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Fast read for new internal model (>=4.1). Same behavior for legacy MED files.
authorAnthony Geay <anthony.geay@edf.fr>
Wed, 11 Mar 2020 16:43:10 +0000 (17:43 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Wed, 11 Mar 2020 16:43:10 +0000 (17:43 +0100)
src/MEDLoader/MEDFileField1TS.cxx
src/MEDLoader/MEDFileField1TS.hxx
src/MEDLoader/MEDFileFieldMultiTS.cxx
src/MEDLoader/MEDFileUtilities.cxx
src/MEDLoader/MEDFileUtilities.hxx

index 1e4e091cae814db7429af8cb166010b4d91a4b38..ea2514be5af94e7368a3f28882118bc6a250bf17 100644 (file)
@@ -739,21 +739,21 @@ bool MEDFileAnyTypeField1TSWithoutSDA::allocIfNecessaryTheArrayToReceiveDataFrom
   throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::allocIfNecessaryTheArrayToReceiveDataFromFile : internal error !");
 }
 
-void MEDFileAnyTypeField1TSWithoutSDA::loadOnlyStructureOfDataRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities)
+void MEDFileAnyTypeField1TSWithoutSDA::loadOnlyStructureOfDataRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities, const MEDFileCapability *capability)
 {
   med_int numdt,numit;
   med_float dt;
-  med_int meshnumdt,meshnumit;
+  med_int meshnumdt(-1),meshnumit(-1);
   MEDFILESAFECALLERRD0(MEDfieldComputingStepInfo,(fid,nasc.getName().c_str(),_csit,&numdt,&numit,&_dt));
-  /*{
+  if(!capability || !capability->isFastReader())
+  {
     med_bool localMesh;
     med_int nmesh;
     INTERP_KERNEL::AutoPtr<char> meshName(MEDLoaderBase::buildEmptyString(MED_NAME_SIZE));
     MEDFILESAFECALLERRD0(MEDfield23ComputingStepMeshInfo,(fid,nasc.getName().c_str(),_csit,&numdt,&numit,&dt,&nmesh,meshName,&localMesh,&meshnumdt,&meshnumit)); // to check with Adrien for legacy MED files
-    }*/
-  /*MEDFILESAFECALLERRD0(MEDfieldComputingStepMeshInfo,(fid,nasc.getName().c_str(),_csit,&numdt,&numit,&_dt,&meshnumdt,&meshnumit));
+  }
   if(_iteration!=numdt || _order!=numit)
-  throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::loadBigArraysRecursively : unexpected exception internal error !");*/
+    throw INTERP_KERNEL::Exception("MEDFileAnyTypeField1TSWithoutSDA::loadBigArraysRecursively : unexpected exception internal error !");
   _field_per_mesh.resize(1);
   //
   MEDFileMesh *mm(0);
index 924ef6ee3711c1bece2a0c5fc79471a9466f6119..f88d5a6ab82073d28a14bf9990341cb04505eb84 100644 (file)
@@ -116,7 +116,7 @@ namespace MEDCoupling
   public:
     MEDLOADER_EXPORT void allocNotFromFile(mcIdType newNbOfTuples);
     MEDLOADER_EXPORT bool allocIfNecessaryTheArrayToReceiveDataFromFile();
-    MEDLOADER_EXPORT void loadOnlyStructureOfDataRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities);
+    MEDLOADER_EXPORT void loadOnlyStructureOfDataRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities, const MEDFileCapability *capability = nullptr);
     MEDLOADER_EXPORT void loadBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc);
     MEDLOADER_EXPORT void loadBigArraysRecursivelyIfNecessary(med_idt fid, const MEDFileFieldNameScope& nasc);
     MEDLOADER_EXPORT void loadStructureAndBigArraysRecursively(med_idt fid, const MEDFileFieldNameScope& nasc, const MEDFileMeshes *ms, const MEDFileEntities *entities);
index a1449764289133e0c4ad288ce6306916b2714374..087f8cd85661e5cea8f1bb7f7faafd35d0503ae3 100644 (file)
@@ -489,7 +489,8 @@ void MEDFileAnyTypeFieldMultiTSWithoutSDA::loadStructureOrStructureAndBigArraysR
   //
   INTERP_KERNEL::AutoCppPtr<MEDFileEntities> entitiesFast;
   const MEDFileEntities *entitiesForSubInstances(entities);
-  if(!entities)
+  MEDFileCapability mfcap(fid);
+  if(!entities && mfcap.isFastReader())
     {// no entities
       int nentitype(MEDfieldnEntityType(fid,_name.c_str(),MED_ALL_DT,MED_ALL_IT));
       INTERP_KERNEL::AutoPtr<med_entity_type> types(new med_entity_type[nentitype]);
@@ -548,9 +549,9 @@ void MEDFileAnyTypeFieldMultiTSWithoutSDA::loadStructureOrStructureAndBigArraysR
       if(loadAll)
         _time_steps[i]->loadStructureAndBigArraysRecursively(fid,*this,ms,entitiesForSubInstances);
       else
-        _time_steps[i]->loadOnlyStructureOfDataRecursively(fid,*this,ms,entitiesForSubInstances);
-      //synchronizeNameScope();
+        _time_steps[i]->loadOnlyStructureOfDataRecursively(fid,*this,ms,entitiesForSubInstances,&mfcap);
     }
+  synchronizeNameScope();
 }
 
 void MEDFileAnyTypeFieldMultiTSWithoutSDA::writeLL(med_idt fid, const MEDFileWritable& opts) const
index d30377eaeb8c7c9a9d6ee96fae56930698f531c1..2b10b10d2e6a272479f27589e2ac3f566b7f6576 100644 (file)
@@ -239,3 +239,8 @@ std::string MEDCoupling::MEDFileWritableStandAlone::GenerateUniqueDftFileNameInM
   std::ostringstream oss; oss << DFT_FILENAME_IN_MEM << "_" << ii++;
   return oss.str();
 }
+
+MEDCoupling::MEDFileCapability::MEDFileCapability(med_idt fid)
+{
+  MEDFILESAFECALLERRD0(MEDfileNumVersionRd,(fid,&_maj,&_min,&_rel));
+}
index 501a6d5e57295d9430cf5ff0b571782a8f8bbf1d..45173dbe7748805ef78ebf0e77773de2ddbe48a2 100644 (file)
@@ -79,6 +79,16 @@ namespace MEDCoupling
     static T *BuildFromMemoryChunk(DataArrayByte *db);
   };
   
+  class MEDFileCapability
+  {
+  public:
+    MEDFileCapability(med_idt fid);
+    bool isFastReader() const { return _maj>=4 && _min >=1; }
+  private:
+    med_int _maj;
+    med_int _min;
+    med_int _rel;
+  };
   MEDFileUtilities::AutoFid OpenMEDFileForRead(const std::string& fileName);
 }