]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
MEDCouplingMesh::MergeMeshes
authorageay <ageay>
Tue, 24 Apr 2012 10:46:44 +0000 (10:46 +0000)
committerageay <ageay>
Tue, 24 Apr 2012 10:46:44 +0000 (10:46 +0000)
src/MEDCoupling/MEDCouplingMesh.cxx
src/MEDCoupling/MEDCouplingMesh.hxx
src/MEDCoupling_Swig/MEDCoupling.i
src/MEDCoupling_Swig/MEDCouplingBasicsTest.py
src/MEDCoupling_Swig/MEDCouplingTypemaps.i

index 9bfca39fdda1cfd2d5fcac7ef40154419fbc9f1c..e6996122ef8404189fb1538ecf5f6bf3188c813e 100644 (file)
@@ -18,6 +18,7 @@
 //
 
 #include "MEDCouplingMesh.hxx"
+#include "MEDCouplingUMesh.hxx"
 #include "MEDCouplingMemArray.hxx"
 #include "MEDCouplingFieldDouble.hxx"
 #include "MEDCouplingFieldDiscretization.hxx"
@@ -295,13 +296,45 @@ MEDCouplingFieldDouble *MEDCouplingMesh::fillFromAnalytic3(TypeOfField t, int nb
 
 /*!
  * retruns a newly created mesh with counter=1 
- * that is the union of mesh1 and mesh2 if possible. The cells of mesh2 will appear after cells of 'mesh1'. Idem for nodes.
+ * that is the union of \b mesh1 and \b mesh2 if possible. The cells of \b mesh2 will appear after cells of \b mesh1. Idem for nodes.
+ * The only contraint is that \b mesh1 an \b mesh2 have the same mesh types. If it is not the case please use the other API of MEDCouplingMesh::MergeMeshes,
+ * with input vector of meshes.
  */
-MEDCouplingMesh *MEDCouplingMesh::MergeMeshes(const MEDCouplingMesh *mesh1, const MEDCouplingMesh *mesh2)
+MEDCouplingMesh *MEDCouplingMesh::MergeMeshes(const MEDCouplingMesh *mesh1, const MEDCouplingMesh *mesh2) throw(INTERP_KERNEL::Exception)
 {
+  if(!mesh1)
+    throw INTERP_KERNEL::Exception("MEDCouplingMesh::MergeMeshes : first parameter is an empty mesh !");
+  if(!mesh2)
+    throw INTERP_KERNEL::Exception("MEDCouplingMesh::MergeMeshes : second parameter is an empty mesh !");
   return mesh1->mergeMyselfWith(mesh2);
 }
 
+/*!
+ * retruns a newly created mesh with counter=1 
+ * that is the union of meshes if possible. The cells of \b meshes[1] will appear after cells of \b meshes[0]. Idem for nodes.
+ * This method performs a systematic conversion to unstructured meshes before performing aggregation contrary to the other ParaMEDMEM::MEDCouplingMesh::MergeMeshes with
+ * two parameters that work only on the same type of meshes. So here it is possible to mix different type of meshes.
+ */
+MEDCouplingMesh *MEDCouplingMesh::MergeMeshes(std::vector<const MEDCouplingMesh *>& meshes) throw(INTERP_KERNEL::Exception)
+{
+  std::vector< MEDCouplingAutoRefCountObjectPtr<MEDCouplingUMesh> > ms1(meshes.size());
+  std::vector< const MEDCouplingUMesh * > ms2(meshes.size());
+  for(std::size_t i=0;i<meshes.size();i++)
+    {
+      if(meshes[i])
+        {
+          MEDCouplingUMesh *cur=meshes[i]->buildUnstructured();
+          ms1[i]=cur;  ms2[i]=cur;
+        }
+      else
+        {
+          std::ostringstream oss; oss << "MEDCouplingMesh::MergeMeshes(std::vector<const MEDCouplingMesh *>& meshes) : mesh at pos #" << i << " of input vector of size " << meshes.size() << " is empty !";
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+    }
+  return MEDCouplingUMesh::MergeUMeshes(ms2);
+}
+
 void MEDCouplingMesh::getCellsContainingPoint(const double *pos, double eps, std::vector<int>& elts) const
 {
   int ret=getCellContainingPoint(pos,eps);
index 0311d5967a5703a7a9c26bf5b2518fc35ade8717..9724ca3e6c37a01175f5a2a422f2a4c904de6c5e 100644 (file)
@@ -113,7 +113,8 @@ namespace ParaMEDMEM
     virtual MEDCouplingUMesh *buildUnstructured() const throw(INTERP_KERNEL::Exception) = 0;
     virtual DataArrayInt *simplexize(int policy) throw(INTERP_KERNEL::Exception) = 0;
     virtual bool areCompatibleForMerge(const MEDCouplingMesh *other) const;
-    static MEDCouplingMesh *MergeMeshes(const MEDCouplingMesh *mesh1, const MEDCouplingMesh *mesh2);
+    static MEDCouplingMesh *MergeMeshes(const MEDCouplingMesh *mesh1, const MEDCouplingMesh *mesh2) throw(INTERP_KERNEL::Exception);
+    static MEDCouplingMesh *MergeMeshes(std::vector<const MEDCouplingMesh *>& meshes) throw(INTERP_KERNEL::Exception);
     //serialisation-unserialization
     virtual void getTinySerializationInformation(std::vector<double>& tinyInfoD, std::vector<int>& tinyInfo, std::vector<std::string>& littleStrings) const = 0;
     virtual void resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *a1, DataArrayDouble *a2, std::vector<std::string>& littleStrings) const = 0;
index 21b52859e7ec10a02aa12b3692045362ba071dc8..106f3bb913c9a99107c2b62094c229dd0662880c 100644 (file)
@@ -667,6 +667,13 @@ namespace ParaMEDMEM
              PyList_SetItem(res,i,PyInt_FromLong(*iL));
            return res;
          }
+         
+         static MEDCouplingMesh *MergeMeshes(PyObject *li) throw(INTERP_KERNEL::Exception)
+         {
+            std::vector<const ParaMEDMEM::MEDCouplingMesh *> tmp;
+            convertPyObjToVecMeshesCst(li,tmp);
+            return MEDCouplingMesh::MergeMeshes(tmp);
+         }
        }
   };
 }
index 1df73b78fa3dfabed51c22ed785cbefd434371fa..5682979c787828507068dc95bd9d0af14c144dab 100644 (file)
@@ -6948,6 +6948,9 @@ class MEDCouplingBasicsTest(unittest.TestCase):
         self.assertEqual(10,m4.getNumberOfCells());
         self.assertEqual(20,m4.getNumberOfNodes());
         self.assertEqual(45,m4.getMeshLength());
+        m4bis=MEDCouplingMesh.MergeMeshes(ms);
+        self.assertTrue(m4.isEqual(m4bis,1e-12))
+        del m4bis
         #
         vec3=[0,1,2,3,4]
         m4_1=m4.buildPartOfMySelf(vec3,False);
index ccd64ca86dd00bbe1f5520a3406b1ac7a38ae01b..f9e28d3e4aefce4435521e18045e96772c789ce3 100644 (file)
@@ -551,7 +551,7 @@ void convertPyObjToVecUMeshesCst(PyObject *ms, std::vector<const ParaMEDMEM::MED
           int status=SWIG_ConvertPtr(obj,&argp,SWIGTYPE_p_ParaMEDMEM__MEDCouplingUMesh,0|0);
           if(!SWIG_IsOK(status))
             {
-              const char msg[]="list must contain only MEDCouplingUMesh";
+              const char msg[]="list must contain only instance of MEDCouplingUMesh";
               PyErr_SetString(PyExc_TypeError,msg);
               throw INTERP_KERNEL::Exception(msg);
             }
@@ -567,6 +567,35 @@ void convertPyObjToVecUMeshesCst(PyObject *ms, std::vector<const ParaMEDMEM::MED
     }
 }
 
+void convertPyObjToVecMeshesCst(PyObject *ms, std::vector<const ParaMEDMEM::MEDCouplingMesh *>& v) throw(INTERP_KERNEL::Exception)
+{
+  if(PyList_Check(ms))
+    {
+      int size=PyList_Size(ms);
+      v.resize(size);
+      for(int i=0;i<size;i++)
+        {
+          PyObject *obj=PyList_GetItem(ms,i);
+          void *argp;
+          int status=SWIG_ConvertPtr(obj,&argp,SWIGTYPE_p_ParaMEDMEM__MEDCouplingMesh,0|0);
+          if(!SWIG_IsOK(status))
+            {
+              const char msg[]="list must contain only instance of MEDCouplingMesh";
+              PyErr_SetString(PyExc_TypeError,msg);
+              throw INTERP_KERNEL::Exception(msg);
+            }
+          const ParaMEDMEM::MEDCouplingMesh *arg=reinterpret_cast< const ParaMEDMEM::MEDCouplingMesh * >(argp);
+          v[i]=arg;
+        }
+    }
+  else
+    {
+      const char msg[]="convertPyObjToVecUMeshesCst : not a list";
+      PyErr_SetString(PyExc_TypeError,msg);
+      throw INTERP_KERNEL::Exception(msg);
+    }
+}
+
 void convertPyObjToVecDataArrayDblCst(PyObject *ms, std::vector<const ParaMEDMEM::DataArrayDouble *>& v) throw(INTERP_KERNEL::Exception)
 {
   if(PyList_Check(ms))
@@ -609,7 +638,7 @@ void convertPyObjToVecFieldDblCst(PyObject *ms, std::vector<const ParaMEDMEM::ME
           int status=SWIG_ConvertPtr(obj,&argp,SWIGTYPE_p_ParaMEDMEM__MEDCouplingFieldDouble,0|0);
           if(!SWIG_IsOK(status))
             {
-              const char msg[]="list must contain only MEDCouplingFieldDouble";
+              const char msg[]="list must contain only instance of MEDCouplingFieldDouble";
               PyErr_SetString(PyExc_TypeError,msg);
               throw INTERP_KERNEL::Exception(msg);
             }
@@ -638,7 +667,7 @@ void convertPyObjToVecDataArrayIntCst(PyObject *ms, std::vector<const ParaMEDMEM
           int status=SWIG_ConvertPtr(obj,&argp,SWIGTYPE_p_ParaMEDMEM__DataArrayInt,0|0);
           if(!SWIG_IsOK(status))
             {
-              const char msg[]="list must contain only DataArrayInt";
+              const char msg[]="list must contain only instance of DataArrayInt";
               PyErr_SetString(PyExc_TypeError,msg);
               throw INTERP_KERNEL::Exception(msg);
             }