]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Debugging before generation of classic fields/meshes from structure elements...
authorAnthony Geay <anthony.geay@edf.fr>
Mon, 23 Jan 2017 13:57:12 +0000 (14:57 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Mon, 23 Jan 2017 13:57:12 +0000 (14:57 +0100)
src/MEDCoupling/MCAuto.hxx
src/MEDLoader/MEDFileField.cxx
src/MEDLoader/MEDFileField.hxx
src/MEDLoader/MEDFileMeshLL.cxx
src/MEDLoader/MEDFileMeshSupport.cxx
src/MEDLoader/MEDFileMeshSupport.hxx
src/MEDLoader/MEDFileStructureElement.cxx
src/MEDLoader/MEDFileStructureElement.hxx
src/MEDLoader/Swig/MEDLoaderCommon.i

index 6614cbfdfaa383eba763f4710628c5a8ab019eea..0fd3a97af004cee4ae4de7c19dbc9aec6509ea26 100644 (file)
@@ -101,7 +101,7 @@ namespace MEDCoupling
     const T& operator*() const { return *_ptr; }
     operator const T *() const { return _ptr; }
   private:
-    void referPtr(T *ptr) { _ptr=ptr; if(_ptr) _ptr->incrRef(); }
+    void referPtr(const T *ptr) { _ptr=ptr; if(_ptr) _ptr->incrRef(); }
     void destroyPtr() { if(_ptr) _ptr->decrRef(); }
   private:
     const T *_ptr;
index 117d694b6839e50298bdd2ec10cc0e5cebc20519..61b2b0660288e22c9d5e1014879e8a3b25b38481 100644 (file)
@@ -432,7 +432,7 @@ std::vector<const BigMemoryObject *> MEDFileFieldPerMeshPerTypePerDisc::getDirec
 
 MEDFileFieldPerMeshPerTypePerDisc *MEDFileFieldPerMeshPerTypePerDisc::deepCopy(MEDFileFieldPerMeshPerTypeCommon *father) const
 {
-  MCAuto<MEDFileFieldPerMeshPerTypePerDisc> ret=new MEDFileFieldPerMeshPerTypePerDisc(*this);
+  MCAuto<MEDFileFieldPerMeshPerTypePerDisc> ret(new MEDFileFieldPerMeshPerTypePerDisc(*this));
   ret->_father=father;
   return ret.retn();
 }
@@ -1761,9 +1761,12 @@ std::string MEDFileFieldPerMeshPerTypeDyn::getGeoTypeRepr() const
   throw INTERP_KERNEL::Exception("not implemented yet !");
 }
 
-MEDFileFieldPerMeshPerType *MEDFileFieldPerMeshPerTypeDyn::deepCopy(MEDFileFieldPerMesh *father) const
+MEDFileFieldPerMeshPerTypeDyn *MEDFileFieldPerMeshPerTypeDyn::deepCopy(MEDFileFieldPerMesh *father) const
 {
-  throw INTERP_KERNEL::Exception("not implemented yet !");
+  MCAuto<MEDFileFieldPerMeshPerTypeDyn> ret(new MEDFileFieldPerMeshPerTypeDyn(*this));
+  ret->setFather(father);
+  ret->deepCopyElements();
+  return ret.retn();
 }
 
 void MEDFileFieldPerMeshPerTypeDyn::getFieldAtLevel(int meshDim, TypeOfField type, const MEDFileFieldGlobsReal *glob, std::vector< std::pair<int,int> >& dads, std::vector<const DataArrayInt *>& pfls, std::vector<int>& locs, std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes) const
@@ -2015,6 +2018,21 @@ void MEDFileFieldPerMesh::killStructureElements()
   _field_pm_pt=res;
 }
 
+void MEDFileFieldPerMesh::keepOnlyStructureElements()
+{
+  std::vector< MCAuto< MEDFileFieldPerMeshPerTypeCommon > > res;
+  for(std::vector< MCAuto< MEDFileFieldPerMeshPerTypeCommon > >::iterator it=_field_pm_pt.begin();it!=_field_pm_pt.end();it++)
+    {
+      if((*it).isNotNull())
+        {
+          const MEDFileFieldPerMeshPerTypeDyn *pt(dynamic_cast<const MEDFileFieldPerMeshPerTypeDyn *>((const MEDFileFieldPerMeshPerTypeCommon *)*it));
+          if(pt)
+            res.push_back(*it);
+        }
+    }
+  _field_pm_pt=res;
+}
+
 DataArray *MEDFileFieldPerMesh::getOrCreateAndGetArray()
 {
   if(!_father)
@@ -5041,6 +5059,13 @@ void MEDFileAnyTypeField1TSWithoutSDA::killStructureElements()
       (*it)->killStructureElements();
 }
 
+void MEDFileAnyTypeField1TSWithoutSDA::keepOnlyStructureElements()
+{
+  for(std::vector< MCAuto< MEDFileFieldPerMesh > >::iterator it=_field_per_mesh.begin();it!=_field_per_mesh.end();it++)
+    if((*it).isNotNull())
+      (*it)->keepOnlyStructureElements();
+}
+
 MEDCouplingFieldDouble *MEDFileAnyTypeField1TSWithoutSDA::fieldOnMesh(const MEDFileFieldGlobsReal *glob, const MEDFileMesh *mesh, MCAuto<DataArray>& arrOut, const MEDFileFieldNameScope& nasc) const
 {
   static const char MSG0[]="MEDFileAnyTypeField1TSWithoutSDA::fieldOnMesh : the field is too complex to be able to be extracted with  \"field\" method ! Call getFieldOnMeshAtLevel method instead to deal with complexity !";
@@ -7496,7 +7521,7 @@ bool MEDFileAnyTypeFieldMultiTSWithoutSDA::onlyStructureElements() const
 
 void MEDFileAnyTypeFieldMultiTSWithoutSDA::killStructureElements()
 {
-  std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> > res;
+  std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> > ret;
   for(std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
     if((*it).isNotNull())
       {
@@ -7505,15 +7530,31 @@ void MEDFileAnyTypeFieldMultiTSWithoutSDA::killStructureElements()
             if(!(*it)->onlyStructureElements())
               {
                 (*it)->killStructureElements();
-                res.push_back(*it);
+                ret.push_back(*it);
               }
           }
         else
           {
-            res.push_back(*it);
+            ret.push_back(*it);
+          }
+      }
+  _time_steps=ret;
+}
+
+void MEDFileAnyTypeFieldMultiTSWithoutSDA::keepOnlyStructureElements()
+{
+  std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> > ret;
+  for(std::vector< MCAuto<MEDFileAnyTypeField1TSWithoutSDA> >::iterator it=_time_steps.begin();it!=_time_steps.end();it++)
+    if((*it).isNotNull())
+      {
+        if((*it)->presenceOfStructureElements())
+          {
+            if(!(*it)->onlyStructureElements())
+              (*it)->keepOnlyStructureElements();
+            ret.push_back(*it);
           }
       }
-  _time_steps=res;
+  _time_steps=ret;
 }
 
 bool MEDFileAnyTypeFieldMultiTSWithoutSDA::presenceOfMultiDiscPerGeoType() const
@@ -11031,17 +11072,35 @@ void MEDFileFields::killStructureElements()
                 ret.push_back(*it);
               }
           }
+        else
+          {
+            ret.push_back(*it);
+          }
       }
-    else
+  _fields=ret;
+}
+
+void MEDFileFields::keepOnlyStructureElements()
+{
+  std::vector< MCAuto<MEDFileAnyTypeFieldMultiTSWithoutSDA> > ret;
+  for(std::vector< MCAuto<MEDFileAnyTypeFieldMultiTSWithoutSDA> >::iterator it=_fields.begin();it!=_fields.end();it++)
+    if((*it).isNotNull())
       {
-        ret.push_back(*it);
+        if((*it)->presenceOfStructureElements())
+          {
+            if(!(*it)->onlyStructureElements())
+              (*it)->keepOnlyStructureElements();
+            ret.push_back(*it);
+          }
       }
   _fields=ret;
 }
-
+  
 MCAuto<MEDFileFields> MEDFileFields::partOfThisOnStructureElements() const
 {
-  throw INTERP_KERNEL::Exception("partOfThisOnStructureElements : not implemented yet !");
+  MCAuto<MEDFileFields> ret(deepCopy());
+  ret->keepOnlyStructureElements();
+  return ret;
 }
 
 MEDFileFieldsIterator *MEDFileFields::iterator()
index 8995fc045394d72d79769444b27ec0ed0fa1b72d..f283c93568ae281998089a89411a567b9c7a6d77 100644 (file)
@@ -278,7 +278,7 @@ namespace MEDCoupling
     void entriesForMEDfile(TypeOfField mct, med_geometry_type& gt, med_entity_type& ent) const;
     void simpleRepr(int bkOffset, std::ostream& oss, int id) const;
     std::string getGeoTypeRepr() const;
-    MEDFileFieldPerMeshPerType *deepCopy(MEDFileFieldPerMesh *father) const;
+    MEDFileFieldPerMeshPerTypeDyn *deepCopy(MEDFileFieldPerMesh *father) const;
     void getFieldAtLevel(int meshDim, TypeOfField type, const MEDFileFieldGlobsReal *glob, std::vector< std::pair<int,int> >& dads, std::vector<const DataArrayInt *>& pfls, std::vector<int>& locs, std::vector<INTERP_KERNEL::NormalizedCellType>& geoTypes) const;
   private:
     MEDFileFieldPerMeshPerTypeDyn(med_idt fid, MEDFileFieldPerMesh *fath, const MEDFileStructureElement *se, const MEDFileFieldNameScope& nasc);
@@ -320,6 +320,7 @@ namespace MEDCoupling
     bool presenceOfStructureElements() const;
     bool onlyStructureElements() const;
     void killStructureElements();
+    void keepOnlyStructureElements();
     DataArray *getOrCreateAndGetArray();
     const DataArray *getOrCreateAndGetArray() const;
     const std::vector<std::string>& getInfo() const;
@@ -561,6 +562,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT bool presenceOfStructureElements() const;
     MEDLOADER_EXPORT bool onlyStructureElements() const;
     MEDLOADER_EXPORT void killStructureElements();
+    MEDLOADER_EXPORT void keepOnlyStructureElements();
     MEDLOADER_EXPORT void setInfo(const std::vector<std::string>& infos);
     MEDLOADER_EXPORT std::size_t getHeapMemorySizeWithoutChildren() const;
     MEDLOADER_EXPORT std::vector<const BigMemoryObject *> getDirectChildrenWithNull() const;
@@ -916,6 +918,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT bool presenceOfStructureElements() const;
     MEDLOADER_EXPORT bool onlyStructureElements() const;
     MEDLOADER_EXPORT void killStructureElements();
+    MEDLOADER_EXPORT void keepOnlyStructureElements();
     MEDLOADER_EXPORT int getPosOfTimeStep(int iteration, int order) const;
     MEDLOADER_EXPORT int getPosGivenTime(double time, double eps=1e-8) const;
     MEDLOADER_EXPORT std::vector< std::pair<int,int> > getIterations() const;
@@ -1067,6 +1070,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT const std::vector<std::string>& getInfo() const;
     MEDLOADER_EXPORT bool presenceOfMultiDiscPerGeoType() const;
     MEDLOADER_EXPORT void killStructureElements();
+    MEDLOADER_EXPORT void keepOnlyStructureElements();
     MEDLOADER_EXPORT void setInfo(const std::vector<std::string>& info);
     MEDLOADER_EXPORT int getNumberOfComponents() const;
     MEDLOADER_EXPORT int getNonEmptyLevels(int iteration, int order, const std::string& mname, std::vector<int>& levs) const;
@@ -1246,6 +1250,7 @@ namespace MEDCoupling
     MEDLOADER_EXPORT MEDFileFields *partOfThisNotLyingOnSpecifiedTimeSteps(const std::vector< std::pair<int,int> >& timeSteps) const;
     MEDLOADER_EXPORT bool presenceOfStructureElements() const;
     MEDLOADER_EXPORT void killStructureElements();
+    MEDLOADER_EXPORT void keepOnlyStructureElements();
     MEDLOADER_EXPORT MCAuto<MEDFileFields> partOfThisOnStructureElements() const;
     MEDLOADER_EXPORT MEDFileFieldsIterator *iterator();
     MEDLOADER_EXPORT void destroyFieldAtPos(int i);
index b3a76b444d4701f1c4d09b9a238903cfe38928a8..d3e93c4412a2434b3cdff2fdd52c203984ed282d 100644 (file)
@@ -2091,8 +2091,8 @@ MEDFileEltStruct4Mesh::MEDFileEltStruct4Mesh(med_idt fid, const std::string& mNa
   }
   MCAuto<MEDFileMeshSupports> mss(MEDFileMeshSupports::New(fid));
   MCAuto<MEDFileStructureElements> mse(MEDFileStructureElements::New(fid,mss));
-  int nbOfNodesPerCell(mse->getNumberOfNodesPerCellOf(_geo_type_name));
-  _conn=DataArrayInt::New(); _conn->alloc(nCells,nbOfNodesPerCell);
+  int nbEntities(mse->getNumberOfNodesPerSE(_geo_type_name));
+  _conn=DataArrayInt::New(); _conn->alloc(nCells,nbEntities);
   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);
index 6958cb02a384cedd077bfbbf303425f14192b04a..9f8daa813b3370f9ea4f2e4554473c4124308b6f 100644 (file)
@@ -111,8 +111,22 @@ const MEDFileUMesh *MEDFileMeshSupports::getSupMeshWithName(const std::string& n
   throw INTERP_KERNEL::Exception(oss.str());
 }
 
-int MEDFileMeshSupports::getNumberOfNodesPerCellOf(const std::string& name) const
+int MEDFileMeshSupports::getNumberOfNodesInConnOf(TypeOfField entity, const std::string& name) const
 {
   const MEDFileUMesh *sup(getSupMeshWithName(name));
-  return sup->getNumberOfNodes();
+  switch(entity)
+    {
+    case ON_NODES:
+      return sup->getNumberOfNodes();
+    case ON_CELLS:
+      {
+        std::vector<INTERP_KERNEL::NormalizedCellType> gt(sup->getAllGeoTypes());
+        if(gt.size()!=1)
+          throw INTERP_KERNEL::Exception("MEDFileMeshSupports::getNumberOfNodesInConnOf : on cells only one geometric type allowed !");
+        const INTERP_KERNEL::CellModel& cm(INTERP_KERNEL::CellModel::GetCellModel(gt[0]));
+        return sup->getNumberOfCellsAtLevel(0)*cm.getNumberOfNodes();
+      }
+    default:
+      throw INTERP_KERNEL::Exception("MEDFileMeshSupports::getNumberOfNodesInConnOf : not recognized entity type !");
+    }
 }
index 7f7569422317881018a3c09d2438bf34c2deb549..b47d69b8c1590efe7eaac7750f6cd557d4778e09 100644 (file)
@@ -40,7 +40,7 @@ namespace MEDCoupling
     std::size_t getHeapMemorySizeWithoutChildren() const;
     void writeLL(med_idt fid) const;
     const MEDFileUMesh *getSupMeshWithName(const std::string& name) const;
-    int getNumberOfNodesPerCellOf(const std::string& name) const;
+    int getNumberOfNodesInConnOf(TypeOfField entity, const std::string& name) const;
   private:
     MEDFileMeshSupports(med_idt fid);
     MEDFileMeshSupports();
index e174bf60bd61b2dd9d6ce8d2fbc6ccf8f6ff9fd8..c8b2e17295359bad8c7c2a7a4848f5861f8c5cc5 100644 (file)
@@ -371,11 +371,13 @@ const MEDFileStructureElement *MEDFileStructureElements::getWithGT(int idGT) con
   throw INTERP_KERNEL::Exception(oss.str());
 }
 
-int MEDFileStructureElements::getNumberOfNodesPerCellOf(const std::string& seName) const
+int MEDFileStructureElements::getNumberOfNodesPerSE(const std::string& seName) const
 {
+  if(seName=="MED_PARTICLE")
+    return 1;
   const MEDFileStructureElement *se(getSEWithName(seName));
   std::string meshName(se->getMeshName());
-  return _sup->getNumberOfNodesPerCellOf(meshName);
+  return _sup->getNumberOfNodesInConnOf(se->getEntity(),meshName);
 }
 
 const MEDFileStructureElement *MEDFileStructureElements::getSEWithName(const std::string& seName) const
index 05efa66b16ad17ca1e2dcdb506fe18ffedbbbb4e..083ab5aefa3a6b355d2472c41f1c7f2629d27763 100644 (file)
@@ -121,7 +121,7 @@ class MEDFileSEConstAtt : public RefCountObject, public MEDFileWritableStandAlon
     MEDLOADER_EXPORT int getNumberOf() const;
     MEDLOADER_EXPORT std::vector<int> getDynGTAvail() const;
     MEDLOADER_EXPORT const MEDFileStructureElement *getWithGT(int idGT) const;
-    MEDLOADER_EXPORT int getNumberOfNodesPerCellOf(const std::string& seName) const;
+    MEDLOADER_EXPORT int getNumberOfNodesPerSE(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;
index da768d905e040efd06ec8020567539abc056cf98..aa0d5ab2a14337ebea6b72b798db8309c7f1f77e 100644 (file)
@@ -3023,6 +3023,7 @@ namespace MEDCoupling
     MEDFileFields *partOfThisLyingOnSpecifiedMeshName(const std::string& meshName) const throw(INTERP_KERNEL::Exception);
     bool presenceOfStructureElements() const throw(INTERP_KERNEL::Exception);
     void killStructureElements() throw(INTERP_KERNEL::Exception);
+    void keepOnlyStructureElements() throw(INTERP_KERNEL::Exception);
     void destroyFieldAtPos(int i) throw(INTERP_KERNEL::Exception);
     bool removeFieldsWithoutAnyTimeStep() throw(INTERP_KERNEL::Exception);
     %extend