]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
WIP
authorAnthony GEAY <anthony.geay@edf.fr>
Tue, 10 Nov 2020 15:21:28 +0000 (16:21 +0100)
committerAnthony GEAY <anthony.geay@edf.fr>
Tue, 10 Nov 2020 15:21:28 +0000 (16:21 +0100)
src/MEDLoader/MEDFileMeshLL.cxx
src/MEDLoader/MEDFileMeshReadSelector.cxx
src/MEDLoader/MEDFileMeshReadSelector.hxx
src/MEDLoader/Swig/MEDLoaderCommon.i

index 5809f35957bd23105ace385fdcecc0ed59fdb42a..10afc9ebdd9c6ef49529a2884ada49effff74aec 100644 (file)
@@ -563,10 +563,28 @@ void MEDFileUMeshL2::loadPart(med_idt fid, const MeshOrStructMeshCls *mId, const
   mcIdType nMin(ToIdType(std::distance(fetchedNodeIds.begin(),std::find(fetchedNodeIds.begin(),fetchedNodeIds.end(),true))));
   mcIdType nMax(ToIdType(std::distance(fetchedNodeIds.rbegin(),std::find(fetchedNodeIds.rbegin(),fetchedNodeIds.rend(),true))));
   nMax=nCoords-nMax;
-  for(std::vector< std::vector< MCAuto<MEDFileUMeshPerType> > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++)
-    for(std::vector< MCAuto<MEDFileUMeshPerType> >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++)
-      (*it1)->getMesh()->renumberNodesWithOffsetInConn(-nMin);
-  loadPartCoords(fid,infosOnComp,mName,dt,it,nMin,nMax);
+  if(!mrs || mrs->getNumberOfCoordsLoadSessions()==1)
+  {
+    for(std::vector< std::vector< MCAuto<MEDFileUMeshPerType> > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++)
+      for(std::vector< MCAuto<MEDFileUMeshPerType> >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++)
+        (*it1)->getMesh()->renumberNodesWithOffsetInConn(-nMin);
+    loadPartCoords(fid,infosOnComp,mName,dt,it,nMin,nMax);
+  }
+  else
+  {
+    mcIdType nbOfCooLS(mrs->getNumberOfCoordsLoadSessions());
+    MCAuto<DataArrayIdType> fni(DataArrayIdType::BuildListOfSwitchedOn(fetchedNodeIds));
+    MCAuto< MapKeyVal<mcIdType, mcIdType> > o2n(fni->invertArrayN2O2O2NOptimized());
+    for(std::vector< std::vector< MCAuto<MEDFileUMeshPerType> > >::const_iterator it0=_per_type_mesh.begin();it0!=_per_type_mesh.end();it0++)
+      for(std::vector< MCAuto<MEDFileUMeshPerType> >::const_iterator it1=(*it0).begin();it1!=(*it0).end();it1++)
+        (*it1)->getMesh()->renumberNodesInConn(o2n->data());
+    for(mcIdType ipart = 0 ; ipart < nbOfCooLS ; ++ipart)
+    {
+      mcIdType partStart,partStop;
+      DataArray::GetSlice(nMin,nMax,1,ipart,nbOfCooLS,partStart,partStop);
+      loadPartCoords(fid,infosOnComp,mName,dt,it,partStart,partStop);
+    }
+  }
 }
 
 void MEDFileUMeshL2::loadConnectivity(med_idt fid, int mdim, const std::string& mName, int dt, int it, MEDFileMeshReadSelector *mrs)
index eb717c10e54c67404a4c7c939abbdba9d14e2a9f..241086d43054d32c0ef661739f839e4da48d1b81 100644 (file)
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-// Author : Anthony Geay (CEA/DEN)
+// Author : Anthony Geay (EDF R&D)
 
 #include "MEDFileMeshReadSelector.hxx"
 
+#include "InterpKernelException.hxx"
+
+#include <sstream>
+
 using namespace MEDCoupling;
 
-MEDFileMeshReadSelector::MEDFileMeshReadSelector():_code(0xFFFFFFFF)
+MEDFileMeshReadSelector::MEDFileMeshReadSelector():_nb_coords_load_sessions(1),_code(0xFFFFFFFF)
 {
 }
 
@@ -40,6 +44,13 @@ void MEDFileMeshReadSelector::setCode(unsigned int newCode)
   _code=newCode;
 }
 
+void MEDFileMeshReadSelector::setNumberOfCoordsLoadSessions(mcIdType newNbOfCoordsLoadSessions)
+{
+  if(newNbOfCoordsLoadSessions < 1)
+    throw INTERP_KERNEL::Exception("MEDFileMeshReadSelector::setNumberOfCoordsLoadSessions : input must be >= 1 !");
+  _nb_coords_load_sessions = newNbOfCoordsLoadSessions;
+}
+
 bool MEDFileMeshReadSelector::isCellFamilyFieldReading() const
 {
   return _code & 0x00000001;
@@ -141,6 +152,7 @@ void MEDFileMeshReadSelector::setGlobalNodeNumFieldReading(bool b)
 void MEDFileMeshReadSelector::reprAll(std::ostream& str) const
 {
   str << "MEDFileMeshReadSelector (code=" << _code << ") : \n";
+  str << "Number of coords load part sessions : " << this->_nb_coords_load_sessions << std::endl;
   str << "Read family field on cells : " << ReprStatus(isCellFamilyFieldReading()) << std::endl;
   str << "Read family field on nodes : " << ReprStatus(isNodeFamilyFieldReading()) << std::endl;
   str << "Read name field on cells : " << ReprStatus(isCellNameFieldReading()) << std::endl;
index 514ebea6285bdf81f9dd70573e3a1a1338c0a7db..8db3a3c3ba0e3672527c7f00b17114a75ca38d71 100644 (file)
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-// Author : Anthony Geay (CEA/DEN)
+// Author : Anthony Geay (EDF R&D)
 
-#ifndef __MEDFILEMESHREADSELECTOR_HXX__
-#define __MEDFILEMESHREADSELECTOR_HXX__
+#pragma once
 
 #include "MEDLoaderDefines.hxx"
 
-#include <sstream>
+#include "MCIdType.hxx"
+
 #include <string>
 
 namespace MEDCoupling
@@ -35,6 +35,8 @@ namespace MEDCoupling
     MEDFileMeshReadSelector(unsigned int code);
     unsigned int getCode() const;
     void setCode(unsigned int newCode);
+    mcIdType getNumberOfCoordsLoadSessions() const { return _nb_coords_load_sessions; }
+    void setNumberOfCoordsLoadSessions(mcIdType newNbOfCoordsLoadSessions);
     bool isCellFamilyFieldReading() const;
     bool isNodeFamilyFieldReading() const;
     bool isCellNameFieldReading() const;
@@ -53,6 +55,7 @@ namespace MEDCoupling
   private:
     static std::string ReprStatus(bool v);
   private:
+    mcIdType _nb_coords_load_sessions;
     //bit #0 cell family field
     //bit #1 node family field
     //bit #2 cell name field
@@ -63,4 +66,3 @@ namespace MEDCoupling
   };
 }
 
-#endif
index 955e5f565440b9268e597d1f9e095a297a3396d3..b1176fe839668922a3566577aad67271553fe1fe 100644 (file)
@@ -672,6 +672,8 @@ namespace MEDCoupling
   public:
     MEDFileMeshReadSelector();
     MEDFileMeshReadSelector(unsigned int code);
+    mcIdType getNumberOfCoordsLoadSessions();
+    void setNumberOfCoordsLoadSessions(mcIdType newNbOfCoordsLoadSessions);
     unsigned int getCode() const;
     void setCode(unsigned int newCode);
     bool isCellFamilyFieldReading() const;