]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Step 6 over. Remaining part : extract structure elements from fields and generate...
authorAnthony Geay <anthony.geay@edf.fr>
Mon, 23 Jan 2017 10:08:15 +0000 (11:08 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Mon, 23 Jan 2017 10:08:15 +0000 (11:08 +0100)
src/MEDLoader/MEDFileMesh.cxx
src/MEDLoader/MEDFileMesh.hxx
src/MEDLoader/MEDFileMeshLL.cxx
src/MEDLoader/MEDFileMeshLL.hxx
src/MEDLoader/MEDFileMeshSupport.cxx
src/MEDLoader/MEDFileMeshSupport.hxx
src/MEDLoader/MEDFileStructureElement.cxx
src/MEDLoader/MEDFileStructureElement.hxx
src/MEDLoader/Swig/MEDLoaderCommon.i

index 7b6c43d6db64f183c81103d9b7bea21afacf01fa..3d59c0b9544d51bdee37dc4971d4b9ba9c913750 100644 (file)
@@ -2816,7 +2816,6 @@ void MEDFileUMesh::loadLL(med_idt fid, const std::string& mName, int dt, int it,
   if(nModels<=0)
     return ;
   _elt_str.resize(nModels);
-  std::cerr << "******** " << nModels << std::endl;
   for(int i=0;i<nModels;i++)
     _elt_str[i]=MEDFileEltStruct4Mesh::New(fid,mName,dt,it,i,mrs);
 }
@@ -3315,6 +3314,19 @@ MEDFileMesh *MEDFileUMesh::cartesianize() const
     }
 }
 
+bool MEDFileUMesh::presenceOfStructureElements() const
+{
+  for(std::vector< MCAuto<MEDFileEltStruct4Mesh> >::const_iterator it=_elt_str.begin();it!=_elt_str.end();it++)
+    if((*it).isNotNull())
+      return true;
+  return false;
+}
+
+void MEDFileUMesh::killStructureElements()
+{
+  _elt_str.clear();
+}
+
 /*!
  * Returns the optional numbers of mesh entities of a given dimension transformed using
  * DataArrayInt::invertArrayN2O2O2N().
@@ -7094,6 +7106,22 @@ void MEDFileMeshMultiTS::setJoints( MEDFileJoints* joints )
     }
 }
 
+bool MEDFileMeshMultiTS::presenceOfStructureElements() const
+{
+  for(std::vector< MCAuto<MEDFileMesh> >::const_iterator it=_mesh_one_ts.begin();it!=_mesh_one_ts.end();it++)
+    if((*it).isNotNull())
+      if((*it)->presenceOfStructureElements())
+        return true;
+  return false;
+}
+
+void MEDFileMeshMultiTS::killStructureElements()
+{
+  for(std::vector< MCAuto<MEDFileMesh> >::iterator it=_mesh_one_ts.begin();it!=_mesh_one_ts.end();it++)
+    if((*it).isNotNull())
+      (*it)->killStructureElements();
+}
+
 void MEDFileMeshMultiTS::writeLL(med_idt fid) const
 {
   MEDFileJoints *joints(getJoints());
@@ -7387,6 +7415,22 @@ void MEDFileMeshes::checkConsistencyLight() const
     }
 }
 
+bool MEDFileMeshes::presenceOfStructureElements() const
+{
+  for(std::vector< MCAuto<MEDFileMeshMultiTS> >::const_iterator it=_meshes.begin();it!=_meshes.end();it++)
+    if((*it).isNotNull())
+      if((*it)->presenceOfStructureElements())
+        return true;
+  return false;
+}
+
+void MEDFileMeshes::killStructureElements()
+{
+  for(std::vector< MCAuto<MEDFileMeshMultiTS> >::iterator it=_meshes.begin();it!=_meshes.end();it++)
+    if((*it).isNotNull())
+      (*it)->killStructureElements();
+}
+
 MEDFileMeshesIterator::MEDFileMeshesIterator(MEDFileMeshes *ms):_ms(ms),_iter_id(0),_nb_iter(0)
 {
   if(ms)
@@ -7442,3 +7486,5 @@ TypeOfField MEDFileMesh::ConvertFromMEDFileEntity(med_entity_type etype)
       }
     }
 }
+
+
index c3f3c6776f1ec57f4f1d360eef846a428fc303b9..5cca36ee76940240964f46d1504a1852d38a467e 100644 (file)
@@ -91,6 +91,8 @@ namespace MEDCoupling
     MEDLOADER_EXPORT virtual std::vector<int> getDistributionOfTypes(int meshDimRelToMax) const;
     MEDLOADER_EXPORT virtual void whichAreNodesFetched(const MEDFileField1TSStructItem& st, const MEDFileFieldGlobsReal *globs, std::vector<bool>& nodesFetched) const = 0;
     MEDLOADER_EXPORT virtual MEDFileMesh *cartesianize() const = 0;
+    MEDLOADER_EXPORT virtual bool presenceOfStructureElements() const = 0;
+    MEDLOADER_EXPORT virtual void killStructureElements() { }
     //
     MEDLOADER_EXPORT bool areFamsEqual(const MEDFileMesh *other, std::string& what) const;
     MEDLOADER_EXPORT bool areGrpsEqual(const MEDFileMesh *other, std::string& what) const;
@@ -296,6 +298,8 @@ namespace MEDCoupling
     MEDLOADER_EXPORT int getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType ct) const;
     MEDLOADER_EXPORT void whichAreNodesFetched(const MEDFileField1TSStructItem& st, const MEDFileFieldGlobsReal *globs, std::vector<bool>& nodesFetched) const;
     MEDLOADER_EXPORT MEDFileMesh *cartesianize() const;
+    MEDLOADER_EXPORT bool presenceOfStructureElements() const;
+    MEDLOADER_EXPORT void killStructureElements();
     MEDLOADER_EXPORT std::vector<int> getNonEmptyLevels() const;
     MEDLOADER_EXPORT std::vector<int> getNonEmptyLevelsExt() const;
     MEDLOADER_EXPORT std::vector<int> getFamArrNonEmptyLevelsExt() const;
@@ -426,6 +430,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT std::vector<INTERP_KERNEL::NormalizedCellType> getGeoTypesAtLevel(int meshDimRelToMax) const;
     MEDLOADER_EXPORT int getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType ct) const;
     MEDLOADER_EXPORT void whichAreNodesFetched(const MEDFileField1TSStructItem& st, const MEDFileFieldGlobsReal *globs, std::vector<bool>& nodesFetched) const;
+    MEDLOADER_EXPORT bool presenceOfStructureElements() const { return false; }
     MEDLOADER_EXPORT virtual const MEDCouplingStructuredMesh *getStructuredMesh() const = 0;
     // tools
     MEDLOADER_EXPORT bool unPolyze(std::vector<int>& oldCode, std::vector<int>& newCode, DataArrayInt *& o2nRenumCell);
@@ -548,6 +553,8 @@ namespace MEDCoupling
     MEDLOADER_EXPORT void setOneTimeStep(MEDFileMesh *mesh1TimeStep);
     MEDLOADER_EXPORT MEDFileJoints *getJoints() const;
     MEDLOADER_EXPORT void setJoints(MEDFileJoints* joints);
+    MEDLOADER_EXPORT bool presenceOfStructureElements() const;
+    MEDLOADER_EXPORT void killStructureElements();
   private:
     ~MEDFileMeshMultiTS() { }
     void loadFromFile(med_idt fid, const std::string& mName);
@@ -585,6 +592,8 @@ namespace MEDCoupling
     MEDLOADER_EXPORT void pushMesh(MEDFileMesh *mesh);
     MEDLOADER_EXPORT void setMeshAtPos(int i, MEDFileMesh *mesh);
     MEDLOADER_EXPORT void destroyMeshAtPos(int i);
+    MEDLOADER_EXPORT bool presenceOfStructureElements() const;
+    MEDLOADER_EXPORT void killStructureElements();
   private:
     ~MEDFileMeshes() { }
     void checkConsistencyLight() const;
index 3dc52b7bc2682f4d06a055253f2a66c91bd485f3..b3a76b444d4701f1c4d09b9a238903cfe38928a8 100644 (file)
@@ -2064,7 +2064,7 @@ MEDFileEltStruct4Mesh *MEDFileEltStruct4Mesh::New(med_idt fid, const std::string
 
 std::size_t MEDFileEltStruct4Mesh::getHeapMemorySizeWithoutChildren() const
 {
-  return _geo_type_name.capacity();
+  return _geo_type_name.capacity()+_vars.capacity()*sizeof(MCAuto<DataArray>);
 }
 
 std::vector<const MEDCoupling::BigMemoryObject*> MEDFileEltStruct4Mesh::getDirectChildrenWithNull() const
@@ -2072,6 +2072,8 @@ std::vector<const MEDCoupling::BigMemoryObject*> MEDFileEltStruct4Mesh::getDirec
   std::vector<const MEDCoupling::BigMemoryObject*> ret;
   ret.push_back(_conn);
   ret.push_back(_common);
+  for(std::vector< MCAuto<DataArray> >::const_iterator it=_vars.begin();it!=_vars.end();it++)
+    ret.push_back(*it);
   return ret;
 }
 
@@ -2094,5 +2096,16 @@ MEDFileEltStruct4Mesh::MEDFileEltStruct4Mesh(med_idt fid, const std::string& mNa
   MEDFILESAFECALLERRD0(MEDmeshElementConnectivityRd,(fid,mName.c_str(),dt,it,MED_STRUCT_ELEMENT,_geo_type,MED_NODAL,MED_FULL_INTERLACE,_conn->getPointer()));
   _common=MEDFileUMeshPerTypeCommon::New();
   _common->loadCommonPart(fid,mName.c_str(),dt,it,nCells,geoType,MED_STRUCT_ELEMENT,mrs);
-  //MEDFILESAFECALLERRD0(MEDmeshElementRd,(mName.c_str(),dt,it,MED_STRUCT_ELEMENT,geoType,MED_NODAL,MED_FULL_INTERLACE,conn,));
+  std::vector<std::string> vns(mse->getVarAttsOf(_geo_type_name));
+  std::size_t sz(vns.size());
+  _vars.resize(sz);
+  for(std::size_t i=0;i<sz;i++)
+    {
+      const MEDFileSEVarAtt *var(mse->getVarAttOf(_geo_type_name,vns[i]));
+      MCAuto<DataArray> gen(var->getGenerator());
+      MCAuto<DataArray> arr(gen->buildNewEmptyInstance());
+      arr->alloc(nCells,var->getNbOfComponents());
+      arr->setName(vns[i]);
+      MEDFILESAFECALLERRD0(MEDmeshStructElementVarAttRd,(fid,mName.c_str(),dt,it,_geo_type,vns[i].c_str(),arr->getVoidStarPointer()));
+    }
 }
index adbd78e21fbee6a5f4d4cde2f327528a343033d8..8a8d31b85a0ab9a24919a4f38288a85cff73615e 100644 (file)
@@ -338,6 +338,7 @@ namespace MEDCoupling
     int _geo_type;
     MCAuto<DataArrayInt> _conn;
     MCAuto<MEDFileUMeshPerTypeCommon> _common;
+    std::vector< MCAuto<DataArray> > _vars;
   };
 }
 
index 1e101c0c29655c35f65f5219b026b38063804fa1..6958cb02a384cedd077bfbbf303425f14192b04a 100644 (file)
 
 using namespace MEDCoupling;
 
+MEDFileMeshSupports *MEDFileMeshSupports::New(const std::string& fileName)
+{
+  MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
+  return New(fid);
+}
+
 MEDFileMeshSupports *MEDFileMeshSupports::New(med_idt fid)
 {
   return new MEDFileMeshSupports(fid);
index c94a9ee7d1abd018943cb95404db88d4b894d2e5..7f7569422317881018a3c09d2438bf34c2deb549 100644 (file)
@@ -32,6 +32,7 @@ namespace MEDCoupling
   class MEDFileMeshSupports : public RefCountObject, public MEDFileWritableStandAlone
   {
   public:
+    MEDLOADER_EXPORT static MEDFileMeshSupports *New(const std::string& fileName);
     MEDLOADER_EXPORT static MEDFileMeshSupports *New(med_idt fid);
     MEDLOADER_EXPORT static MEDFileMeshSupports *New();
   public:
index d2de14def61ade58a031d87ae2df9ddd7e3582c0..e174bf60bd61b2dd9d6ce8d2fbc6ccf8f6ff9fd8 100644 (file)
@@ -34,6 +34,11 @@ std::string MEDFileSEHolder::getModelName() const
   return _father->getName();
 }
 
+std::string MEDFileSEHolder::getName() const
+{
+  return _name;
+}
+
 void MEDFileSEHolder::setName(const std::string& name)
 {
   _name=name;
@@ -266,8 +271,33 @@ std::string MEDFileStructureElement::getMeshName() const
   return _sup_mesh_name;
 }
 
+std::vector<std::string> MEDFileStructureElement::getVarAtts() const
+{
+  std::vector<std::string> ret;
+  for(std::vector< MCAuto<MEDFileSEVarAtt> >::const_iterator it=_var_att.begin();it!=_var_att.end();it++)
+    if((*it).isNotNull())
+      ret.push_back((*it)->getName());
+  return ret;
+}
+
+const MEDFileSEVarAtt *MEDFileStructureElement::getVarAtt(const std::string& varName) const
+{
+  for(std::vector< MCAuto<MEDFileSEVarAtt> >::const_iterator it=_var_att.begin();it!=_var_att.end();it++)
+    if((*it).isNotNull())
+      if((*it)->getName()==varName)
+        return *it;
+  std::ostringstream oss; oss << "MEDFileStructureElement::getVarAtt : no var att with name \"" << varName << "\" !";
+  throw INTERP_KERNEL::Exception(oss.str());
+}
+
 ////////////////////
 
+MEDFileStructureElements *MEDFileStructureElements::New(const std::string& fileName, const MEDFileMeshSupports *ms)
+{
+  MEDFileUtilities::AutoFid fid(OpenMEDFileForRead(fileName));
+  return New(fid,ms);
+}
+
 MEDFileStructureElements *MEDFileStructureElements::New(med_idt fid, const MEDFileMeshSupports *ms)
 {
   return new MEDFileStructureElements(fid,ms);
@@ -360,3 +390,14 @@ const MEDFileStructureElement *MEDFileStructureElements::getSEWithName(const std
   throw INTERP_KERNEL::Exception(oss.str());
 }
 
+std::vector<std::string> MEDFileStructureElements::getVarAttsOf(const std::string& seName) const
+{
+  const MEDFileStructureElement *se(getSEWithName(seName));
+  return se->getVarAtts();
+}
+
+const MEDFileSEVarAtt *MEDFileStructureElements::getVarAttOf(const std::string &seName, const std::string& varName) const
+{
+  const MEDFileStructureElement *se(getSEWithName(seName));
+  return se->getVarAtt(varName);
+}
index cdb56aa099a113374e18d115857197fc4f7fb727..05efa66b16ad17ca1e2dcdb506fe18ffedbbbb4e 100644 (file)
@@ -35,9 +35,11 @@ namespace MEDCoupling
   
   class MEDFileSEHolder
   {
+  public:
+    std::string getModelName() const;
+    std::string getName() const;
   protected:
     MEDFileSEHolder(MEDFileStructureElement *father):_father(father) { }
-    std::string getModelName() const;
     void setName(const std::string& name);
     std::size_t getHeapMemorySizeLoc() const;
   private:
@@ -71,6 +73,8 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     std::size_t getHeapMemorySizeWithoutChildren() const;
     void writeLL(med_idt fid) const;
+    int getNbOfComponents() const { return _nb_compo; }
+    MCAuto<DataArray> getGenerator() const { return _gen; }
   private:
     MEDFileSEVarAtt(med_idt fid, MEDFileStructureElement *father, int idVarAtt);
   private:
@@ -86,6 +90,8 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
     MEDLOADER_EXPORT int getDynGT() const;
     MEDLOADER_EXPORT TypeOfField getEntity() const;
     MEDLOADER_EXPORT std::string getMeshName() const;
+    MEDLOADER_EXPORT std::vector<std::string> getVarAtts() const;
+    MEDLOADER_EXPORT const MEDFileSEVarAtt *getVarAtt(const std::string& varName) const;
   public:
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     std::size_t getHeapMemorySizeWithoutChildren() const;
@@ -109,6 +115,7 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
   class MEDFileStructureElements : public RefCountObject, public MEDFileWritableStandAlone
   {
   public:
+    MEDLOADER_EXPORT static MEDFileStructureElements *New(const std::string& fileName, const MEDFileMeshSupports *ms);
     MEDLOADER_EXPORT static MEDFileStructureElements *New(med_idt fid, const MEDFileMeshSupports *ms);
     MEDLOADER_EXPORT static MEDFileStructureElements *New();
     MEDLOADER_EXPORT int getNumberOf() const;
@@ -116,6 +123,8 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
     MEDLOADER_EXPORT const MEDFileStructureElement *getWithGT(int idGT) const;
     MEDLOADER_EXPORT int getNumberOfNodesPerCellOf(const std::string& seName) const;
     MEDLOADER_EXPORT const MEDFileStructureElement *getSEWithName(const std::string& seName) const;
+    MEDLOADER_EXPORT std::vector<std::string> getVarAttsOf(const std::string& seName) const;
+    MEDLOADER_EXPORT const MEDFileSEVarAtt *getVarAttOf(const std::string &seName, const std::string& varName) const;
   public:
     std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
     std::size_t getHeapMemorySizeWithoutChildren() const;
index 10057bca122d349ba95c22f9973c005676ff3bc7..5e2e86c941e1cfa764df92609037e92f78300ece 100644 (file)
@@ -1083,6 +1083,8 @@ namespace MEDCoupling
     void setJoints( MEDFileJoints* joints );
     void initializeEquivalences();
     void killEquivalences();
+    bool presenceOfStructureElements() const throw(INTERP_KERNEL::Exception);
+    void killStructureElements() throw(INTERP_KERNEL::Exception);
     %extend
        {
          std::string __str__() const throw(INTERP_KERNEL::Exception)
@@ -1751,6 +1753,8 @@ namespace MEDCoupling
     void setMeshAtPos(int i, MEDFileMesh *mesh) throw(INTERP_KERNEL::Exception);
     void destroyMeshAtPos(int i) throw(INTERP_KERNEL::Exception);
     void cartesianizeMe() throw(INTERP_KERNEL::Exception);
+    bool presenceOfStructureElements() const throw(INTERP_KERNEL::Exception);
+    void killStructureElements() throw(INTERP_KERNEL::Exception);
     %extend
        {
          MEDFileMeshes()