]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
*** empty log message *** MED_OP_AG
authorageay <ageay>
Fri, 3 Dec 2010 17:24:10 +0000 (17:24 +0000)
committerageay <ageay>
Fri, 3 Dec 2010 17:24:10 +0000 (17:24 +0000)
src/MEDCoupling/Test/MEDCouplingBasicsTest.hxx
src/MEDLoader/MEDFileMesh.cxx
src/MEDLoader/MEDFileMesh.hxx
src/MEDLoader/MEDFileMeshLL.cxx
src/MEDLoader/MEDFileMeshLL.hxx

index 112c2a335c6880dd70e590f2ccccab90cf8fb079..4982c2e7af424926314f211ef81a4e3326c20835 100644 (file)
@@ -158,6 +158,8 @@ namespace ParaMEDMEM
     CPPUNIT_TEST( testExtrudedMesh5 );
     CPPUNIT_TEST( testExtrudedMesh6 );
     CPPUNIT_TEST( testExtrudedMesh7 );
+    CPPUNIT_TEST( testSimplexize1 );
+    CPPUNIT_TEST( testSimplexize2 );
     //MEDCouplingBasicsTestInterp.cxx
     CPPUNIT_TEST( test2DInterpP0P0_1 );
     CPPUNIT_TEST( test2DInterpP0P0PL_1 );
@@ -344,6 +346,8 @@ namespace ParaMEDMEM
     void testExtrudedMesh5();
     void testExtrudedMesh6();
     void testExtrudedMesh7();
+    void testSimplexize1();
+    void testSimplexize2();
     //MEDCouplingBasicsTestInterp.cxx
     void test2DInterpP0P0_1();
     void test2DInterpP0P0PL_1();
index 2ec445339c1c11c29df28021552291ebd08d323a..196f350a432d315cdf5720c87d3b371b1e9b97bb 100644 (file)
@@ -67,7 +67,7 @@ MEDFileUMesh::~MEDFileUMesh()
 {
 }
 
-void MEDFileUMesh::write(const char *fileName, int mode) const
+void MEDFileUMesh::write(const char *fileName, int mode) const throw(INTERP_KERNEL::Exception)
 {
 }
 
@@ -92,6 +92,34 @@ std::vector<int> MEDFileUMesh::getNonEmptyLevels() const
   return ret;
 }
 
+int MEDFileUMesh::getFamilyId(const char *name) const throw(INTERP_KERNEL::Exception)
+{
+  std::string oname(name);
+  std::map<std::string, int>::const_iterator it=_families.find(oname);
+  std::vector<std::string> fams=getFamiliesNames();
+  if(it==_families.end())
+    {
+      std::ostringstream oss; oss << "No such familyname \"" << name << "\" !\nAvailable families are :";
+      std::copy(fams.begin(),fams.end(),std::ostream_iterator<std::string>(oss," "));
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  return (*it).second;
+}
+
+std::vector<std::string> MEDFileUMesh::getFamiliesOnGroup(const char *name) const throw(INTERP_KERNEL::Exception)
+{
+  std::string oname(name);
+  std::map<std::string, std::vector<std::string> >::const_iterator it=_groups.find(oname);
+  std::vector<std::string> grps=getGroupsNames();
+  if(it==_groups.end())
+    {
+      std::ostringstream oss; oss << "No such groupname \"" << name << "\" !\nAvailable groups are :";
+      std::copy(grps.begin(),grps.end(),std::ostream_iterator<std::string>(oss," "));
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  return (*it).second;
+}
+
 std::vector<std::string> MEDFileUMesh::getGroupsNames() const
 {
   std::vector<std::string> ret(_groups.size());
@@ -110,6 +138,80 @@ std::vector<std::string> MEDFileUMesh::getFamiliesNames() const
   return ret;
 }
 
+void MEDFileUMesh::removeGroup(const char *name) throw(INTERP_KERNEL::Exception)
+{
+  std::string oname(name);
+  std::map<std::string, std::vector<std::string> >::iterator it=_groups.find(oname);
+  std::vector<std::string> grps=getGroupsNames();
+  if(it==_groups.end())
+    {
+      std::ostringstream oss; oss << "No such groupname \"" << name << "\" !\nAvailable groups are :";
+      std::copy(grps.begin(),grps.end(),std::ostream_iterator<std::string>(oss," "));
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  _groups.erase(it);
+}
+
+void MEDFileUMesh::removeFamily(const char *name) throw(INTERP_KERNEL::Exception)
+{
+  std::string oname(name);
+  std::map<std::string, int >::iterator it=_families.find(oname);
+  std::vector<std::string> fams=getFamiliesNames();
+  if(it==_families.end())
+    {
+      std::ostringstream oss; oss << "No such familyname \"" << name << "\" !\nAvailable families are :";
+      std::copy(fams.begin(),fams.end(),std::ostream_iterator<std::string>(oss," "));
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  _families.erase(it);
+}
+
+void MEDFileUMesh::changeGroupName(const char *oldName, const char *newName) throw(INTERP_KERNEL::Exception)
+{
+  std::string oname(oldName);
+  std::map<std::string, std::vector<std::string> >::iterator it=_groups.find(oname);
+  std::vector<std::string> grps=getGroupsNames();
+  if(it==_groups.end())
+    {
+      std::ostringstream oss; oss << "No such groupname \"" << oldName << "\" !\nAvailable groups are :";
+      std::copy(grps.begin(),grps.end(),std::ostream_iterator<std::string>(oss," "));
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  std::string nname(newName);
+  it=_groups.find(nname);
+  if(it!=_groups.end())
+    {
+      std::ostringstream oss; oss << "Such groupname \"" << newName << " already exists ! Kill it before !";
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  std::vector<std::string> cpy=(*it).second;
+  _groups.erase(it);
+  _groups[newName]=cpy;
+}
+
+void MEDFileUMesh::changeFamilyName(const char *oldName, const char *newName) throw(INTERP_KERNEL::Exception)
+{
+  std::string oname(oldName);
+  std::map<std::string, int >::iterator it=_families.find(oname);
+  std::vector<std::string> fams=getFamiliesNames();
+  if(it==_families.end())
+    {
+      std::ostringstream oss; oss << "No such familyname \"" << oldName << "\" !\nAvailable families are :";
+      std::copy(fams.begin(),fams.end(),std::ostream_iterator<std::string>(oss," "));
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  std::string nname(newName);
+  it=_families.find(nname);
+  if(it!=_families.end())
+    {
+      std::ostringstream oss; oss << "Such familyname \"" << newName << " already exists ! Kill it before !";
+      throw INTERP_KERNEL::Exception(oss.str().c_str());
+    }
+  int cpy=(*it).second;
+  _families.erase(it);
+  _families[newName]=cpy;
+}
+
 DataArrayDouble *MEDFileUMesh::getCoords() const
 {
   MEDCouplingAutoRefCountObjectPtr<DataArrayDouble> tmp(_coords);
@@ -208,3 +310,76 @@ const MEDFileUMeshSplitL1 *MEDFileUMesh::getMeshAtLevSafe(int meshDimRelToMax) c
     throw INTERP_KERNEL::Exception("On specified lev (or entity) no cells exists !");
   return _ms[tracucedRk];
 }
+
+void MEDFileUMesh::checkMeshDimCoherency(int meshDim, int meshDimRelToMax) const throw(INTERP_KERNEL::Exception)
+{
+  if(-meshDimRelToMax>=(int)_ms.size())
+    throw INTERP_KERNEL::Exception("MEDFileUMesh::checkMeshDimCoherency : The meshdim of mesh is not managed by 'this' !");
+  int i=0;
+  for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileUMeshSplitL1> >::const_iterator it=_ms.begin();it!=_ms.end();it++,i++)
+    {
+      if(((const MEDFileUMeshSplitL1*) (*it))!=0)
+        {
+          int ref=(*it)->getMeshDimension();
+          if(ref+i!=meshDim+meshDimRelToMax)
+            throw INTERP_KERNEL::Exception("MEDFileUMesh::checkMeshDimCoherency : no coherency between levels !");
+        }
+    }
+}
+
+void MEDFileUMesh::setMeshAtRank(int meshDimRelToMax, MEDCouplingUMesh *m) throw(INTERP_KERNEL::Exception)
+{
+  std::vector<int> levSet=getNonEmptyLevels();
+  if(std::find(levSet.begin(),levSet.end(),meshDimRelToMax)==levSet.end())
+    {
+      if((DataArrayDouble *)_coords==0)
+        {
+          DataArrayDouble *c=m->getCoords();
+          if(c)
+            c->incrRef();
+          _coords=c;
+        }
+      else
+        {
+          if(m->getCoords()!=_coords)
+            throw INTERP_KERNEL::Exception("MEDFileUMesh::setMeshAtRank : Invalid Given Mesh ! The coordinates are not the same ! try to use tryToShareSameCoords !");
+          int sz=(-meshDimRelToMax)+1;
+          if(sz>=(int)_ms.size())
+            _ms.resize(sz);
+          checkMeshDimCoherency(m->getMeshDimension(),sz);
+          _ms[sz]=new MEDFileUMeshSplitL1(m);
+        }
+    }
+}
+
+void MEDFileUMesh::setGroupsFromScratch(int meshDimRelToMax, const std::vector<MEDCouplingUMesh *>& ms) throw(INTERP_KERNEL::Exception)
+{
+  if(ms.empty())
+    throw INTERP_KERNEL::Exception("MEDFileUMesh::setGroupsFromScratch : expecting a non empty vector !");
+  int sz=(-meshDimRelToMax)+1;
+  if(sz>=(int)_ms.size())
+    _ms.resize(sz);
+  checkMeshDimCoherency(ms[0]->getMeshDimension(),meshDimRelToMax);
+  DataArrayDouble *coo=checkMultiMesh(ms);
+  if((DataArrayDouble *)_coords==0)
+    {
+      coo->incrRef();
+      _coords=coo;
+    }
+  else
+    if((DataArrayDouble *)_coords!=coo)
+      throw INTERP_KERNEL::Exception("MEDFileUMesh::setGroupsFromScratch : coordinates mismatches !");
+  _ms[-meshDimRelToMax]->setGroupsFromScratch(ms,_families,_groups);
+}
+
+void MEDFileUMesh::setGroupsOnSetMesh(int meshDimRelToMax, const std::vector<MEDCouplingUMesh *>& ms) throw(INTERP_KERNEL::Exception)
+{
+  if(ms.empty())
+    throw INTERP_KERNEL::Exception("MEDFileUMesh::setGroupsOnSetMesh : expecting a non empty vector !");
+  
+}
+
+DataArrayDouble *MEDFileUMesh::checkMultiMesh(const std::vector<MEDCouplingUMesh *>& ms) const throw(INTERP_KERNEL::Exception)
+{
+  return 0;
+}
index ecdd4a20136a9216dda08d3c75ba3ca8753447d0..330240e7afe829b321470d0f787e8c7b9f08a778 100644 (file)
@@ -46,10 +46,19 @@ namespace ParaMEDMEM
   {
   public:
     static MEDFileUMesh *New(const char *fileName, const char *mName) throw(INTERP_KERNEL::Exception);
+    static MEDFileUMesh *New();
     ~MEDFileUMesh();
-    void write(const char *fileName, int mode) const;
+    //
+    void removeGroup(const char *name) throw(INTERP_KERNEL::Exception);
+    void removeFamily(const char *name) throw(INTERP_KERNEL::Exception);
+    void changeGroupName(const char *oldName, const char *newName) throw(INTERP_KERNEL::Exception);
+    void changeFamilyName(const char *oldName, const char *newName) throw(INTERP_KERNEL::Exception);
+    //
+    void write(const char *fileName, int mode) const throw(INTERP_KERNEL::Exception);
     int getNumberOfLevels() const { return _ms.size(); }
     int getNumberOfNonEmptyLevels() const;
+    int getFamilyId(const char *name) const throw(INTERP_KERNEL::Exception);
+    std::vector<std::string> getFamiliesOnGroup(const char *name) const throw(INTERP_KERNEL::Exception);
     std::vector<std::string> getGroupsNames() const;
     std::vector<std::string> getFamiliesNames() const;
     std::vector<int> getNonEmptyLevels() const;
@@ -63,9 +72,15 @@ namespace ParaMEDMEM
     MEDCouplingUMesh *getRankM1Mesh() const throw(INTERP_KERNEL::Exception);
     MEDCouplingUMesh *getRankM2Mesh() const throw(INTERP_KERNEL::Exception);
     MEDCouplingUMesh *getRankM3Mesh() const throw(INTERP_KERNEL::Exception);
+    //
+    void setMeshAtRank(int meshDimRelToMax, MEDCouplingUMesh *m) throw(INTERP_KERNEL::Exception);
+    void setGroupsFromScratch(int meshDimRelToMax, const std::vector<MEDCouplingUMesh *>& ms) throw(INTERP_KERNEL::Exception);
+    void setGroupsOnSetMesh(int meshDimRelToMax, const std::vector<MEDCouplingUMesh *>& ms) throw(INTERP_KERNEL::Exception);
   private:
     MEDFileUMesh(const char *fileName, const char *mName) throw(INTERP_KERNEL::Exception);
     const MEDFileUMeshSplitL1 *getMeshAtLevSafe(int meshDimRelToMax) const throw(INTERP_KERNEL::Exception);
+    void checkMeshDimCoherency(int meshDim, int meshDimRelToMax) const throw(INTERP_KERNEL::Exception);
+    DataArrayDouble *checkMultiMesh(const std::vector<MEDCouplingUMesh *>& ms) const throw(INTERP_KERNEL::Exception);
   private:
     std::map<std::string, std::vector<std::string> > _groups;
     std::map<std::string,int> _families;
index ba819948cecb3495391c1086b48cf82481b01238..52aad20e7d15869e82fbeeca0d5c025911078169 100644 (file)
@@ -224,11 +224,29 @@ MEDFileUMeshSplitL1::MEDFileUMeshSplitL1(const MEDFileUMeshL2& l2, const char *m
     ms[i]->decrRef();
 }
 
+MEDFileUMeshSplitL1::MEDFileUMeshSplitL1(MEDCouplingUMesh *m)
+{
+  m->incrRef();
+  _m=m;
+  _m_by_types=(MEDCouplingUMesh *)_m->deepCpy();
+  MEDCouplingAutoRefCountObjectPtr<DataArrayInt> da=_m_by_types->getRenumArrForConsecutiveCellTypesSpec(typmai2,typmai2+MED_NBR_GEOMETRIE_MAILLE+2);
+  _num=da->invertArrayO2N2N2O(m->getNumberOfCells());
+  _fam=DataArrayInt::New();
+  _fam->alloc(m->getNumberOfCells(),1);
+  _fam->fillWithValue(0);
+  _m_by_types->renumberCells(da->getConstPointer(),false);
+}
+
 bool MEDFileUMeshSplitL1::empty() const
 {
   return ((const MEDCouplingUMesh *)_m_by_types)==0;
 }
 
+int MEDFileUMeshSplitL1::getMeshDimension() const
+{
+  return _m_by_types->getMeshDimension();
+}
+
 MEDCouplingUMesh *MEDFileUMeshSplitL1::getFamilyPart(const std::vector<int>& ids) const
 {
   MEDCouplingAutoRefCountObjectPtr<DataArrayInt> eltsToKeep=_fam->getIdsEqualList(ids);
@@ -243,6 +261,28 @@ MEDCouplingUMesh *MEDFileUMeshSplitL1::getWholeMesh() const
   return tmp;
 }
 
+/*!
+ * This method ignores _m and _m_by_types.
+ */
+void MEDFileUMeshSplitL1::setGroupsFromScratch(const std::vector<MEDCouplingUMesh *>& ms, std::map<std::string,int>& familyIds,
+                                               std::map<std::string, std::vector<std::string> >& groups) throw(INTERP_KERNEL::Exception)
+{
+  int sz=ms.size();
+  std::vector< DataArrayInt * > corr;
+  _m=MEDCouplingUMesh::fuseUMeshesOnSameCoords(ms,0,corr);
+  std::vector< std::vector<int> > fidsOfGroups;
+  _fam=DataArrayInt::makePartition(corr,_m->getNumberOfCells(),fidsOfGroups);
+  int nbOfCells=_m->getNumberOfCells();
+  std::map<int,std::string> newfams;
+  std::map<int,int> famIdTrad;
+  traduceFamilyNumber(fidsOfGroups,familyIds,famIdTrad,newfams);
+  for(int i=0;i<sz;i++)
+    corr[i]->decrRef();
+  int *w=_fam->getPointer();
+  for(int i=0;i<nbOfCells;i++,w++)
+    *w=famIdTrad[*w];
+}
+
 MEDCouplingUMesh *MEDFileUMeshSplitL1::renumIfNeeded(MEDCouplingUMesh *m, const int *cellIds) const
 {
   if((const DataArrayInt *)_num==0)
@@ -256,3 +296,23 @@ MEDCouplingUMesh *MEDFileUMeshSplitL1::renumIfNeeded(MEDCouplingUMesh *m, const
     }
   return m;
 }
+
+std::vector<int> MEDFileUMeshSplitL1::getNewFamiliesNumber(int nb, const std::map<std::string,int>& families)
+{
+  int id=-1;
+  for(std::map<std::string,int>::const_iterator it=families.begin();it!=families.end();it++)
+    id=std::max(id,(*it).second);
+  if(id==-1)
+    id=0;
+  std::vector<int> ret(nb);
+  for(int i=1;i<=nb;i++)
+    ret[i]=id+i;
+  return ret;
+}
+
+void MEDFileUMeshSplitL1::traduceFamilyNumber(const std::vector< std::vector<int> >& fidsGrps, std::map<std::string,int>& familyIds,
+                                              std::map<int,int>& famIdTrad, std::map<int,std::string>& newfams)
+{
+  std::set<int> allfids;
+  
+}
index 720a962aedae9638aab3129ade183e09f20387d8..5988a03d41770ebd3150dc86e0fb6473a43ce46a 100644 (file)
@@ -77,9 +77,16 @@ namespace ParaMEDMEM
   {
   public:
     MEDFileUMeshSplitL1(const MEDFileUMeshL2& l2, const char *mName, int id);
+    MEDFileUMeshSplitL1(MEDCouplingUMesh *m);
     bool empty() const;
+    int getMeshDimension() const;
     MEDCouplingUMesh *getFamilyPart(const std::vector<int>& ids) const;
     MEDCouplingUMesh *getWholeMesh() const;
+    void setGroupsFromScratch(const std::vector<MEDCouplingUMesh *>& ms, std::map<std::string,int>& familyIds,
+                              std::map<std::string, std::vector<std::string> >& groups) throw(INTERP_KERNEL::Exception);
+    static std::vector<int> getNewFamiliesNumber(int nb, const std::map<std::string,int>& families);
+    static void traduceFamilyNumber(const std::vector< std::vector<int> >& fidsGrps, std::map<std::string,int>& familyIds,
+                                    std::map<int,int>& famIdTrad, std::map<int,std::string>& newfams);
   private:
     MEDCouplingUMesh *renumIfNeeded(MEDCouplingUMesh *m, const int *cellIds) const;
   private: