Salome HOME
Merge branch 'V9_2_2_BR'
[tools/medcoupling.git] / src / MEDPartitioner / MEDPARTITIONER_MeshCollection.hxx
index 86cc9a146a55b1a38dbeaa84677c109545ea4bf2..c20901c84be6b7ce5d424b07768c20e19af747a4 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2019  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include "MEDPARTITIONER_Graph.hxx"
 #include "MEDPARTITIONER_Utils.hxx"
 
-#include "MEDCouplingUMesh.hxx"
-
 #include <map>
 #include <vector>
 #include <string>
 
 #include "BBTree.txx"
 
-namespace ParaMEDMEM
+namespace MEDCoupling
 {
   class MEDCouplingUMesh;
   class DataArrayInt;
+  class MEDCouplingSkyLineArray;
 }
 
 namespace MEDPARTITIONER
@@ -43,7 +42,6 @@ namespace MEDPARTITIONER
   class Topology;
   class MeshCollectionDriver;
   class ParaDomainSelector;
-  class SkyLineArray;
   class ConnectZone;
   class JointFinder;
   
@@ -75,9 +73,9 @@ namespace MEDPARTITIONER
     void setDriverType(MEDPARTITIONER::DriverType type) { _driver_type=type; }
 
     //creation of the cell graph
-    void buildCellGraph(MEDPARTITIONER::SkyLineArray* & array,int *& edgeweights );
+    void buildCellGraph(MEDCoupling::MEDCouplingSkyLineArray* & array,int *& edgeweights );
    //creation of the cell graph
-    void buildParallelCellGraph(MEDPARTITIONER::SkyLineArray* & array,int *& edgeweights );
+    void buildParallelCellGraph(MEDCoupling::MEDCouplingSkyLineArray* & array,int *& edgeweights );
 
     //creation and partition of the associated graph
     Topology* createPartition(int nbdomain, Graph::splitter_type type = Graph::METIS,
@@ -94,24 +92,24 @@ namespace MEDPARTITIONER
     int getNbOfLocalFaces() const;
     
     //getting a reference to mesh vector
-    std::vector<ParaMEDMEM::MEDCouplingUMesh*>& getMesh();
-    std::vector<ParaMEDMEM::MEDCouplingUMesh*>& getFaceMesh();
-    std::vector<std::vector<ParaMEDMEM::MEDCouplingUMesh*> >& getGroupMeshes();
+    std::vector<MEDCoupling::MEDCouplingUMesh*>& getMesh();
+    std::vector<MEDCoupling::MEDCouplingUMesh*>& getFaceMesh();
+    std::vector<std::vector<MEDCoupling::MEDCouplingUMesh*> >& getGroupMeshes();
 
-    ParaMEDMEM::MEDCouplingUMesh* getMesh(int idomain) const;
-    ParaMEDMEM::MEDCouplingUMesh* getFaceMesh(int idomain);
-    std::vector<ParaMEDMEM::MEDCouplingUMesh*>& getGroupMeshes(int idomain);
+    MEDCoupling::MEDCouplingUMesh* getMesh(int idomain) const;
+    MEDCoupling::MEDCouplingUMesh* getFaceMesh(int idomain);
+    std::vector<MEDCoupling::MEDCouplingUMesh*>& getGroupMeshes(int idomain);
 
-    std::vector<ParaMEDMEM::DataArrayInt*>& getCellFamilyIds() { return _cell_family_ids; }
-    std::vector<ParaMEDMEM::DataArrayInt*>& getFaceFamilyIds() { return _face_family_ids; }
+    std::vector<MEDCoupling::DataArrayInt*>& getCellFamilyIds() { return _cell_family_ids; }
+    std::vector<MEDCoupling::DataArrayInt*>& getFaceFamilyIds() { return _face_family_ids; }
     
-    std::map<std::string, ParaMEDMEM::DataArrayInt*>& getMapDataArrayInt() { return _map_dataarray_int; }
-    std::map<std::string, ParaMEDMEM::DataArrayDouble*>& getMapDataArrayDouble() { return _map_dataarray_double; }
+    std::map<std::string, MEDCoupling::DataArrayInt*>& getMapDataArrayInt() { return _map_dataarray_int; }
+    std::map<std::string, MEDCoupling::DataArrayDouble*>& getMapDataArrayDouble() { return _map_dataarray_double; }
 
     std::map<std::string,int>& getFamilyInfo() { return _family_info; }
     std::map<std::string, std::vector<std::string> >& getGroupInfo() { return _group_info; }
 
-    ParaMEDMEM::DataArrayDouble* getField(std::string descriptionField, int iold);
+    MEDCoupling::DataArrayDouble* getField(std::string descriptionField, int iold);
     std::vector<std::string>&  getFieldDescriptions() { return _field_descriptions; }
     void prepareFieldDescriptions();
     void filterFaceOnCell();
@@ -122,8 +120,9 @@ namespace MEDPARTITIONER
     //getting a pointer to topology
     Topology* getTopology() const ;
     ParaDomainSelector* getParaDomainSelector() const { return _domain_selector; }
+    void setParaDomainSelector(ParaDomainSelector* pds) { _domain_selector = pds; }
     //setting a new topology
-    void setTopology(Topology* topology);
+    void setTopology(Topology* topology, bool takeOwneship);
 
     //getting/setting the name of the global mesh (as opposed 
     //to the name of a subdomain \a nn, which is name_nn) 
@@ -131,6 +130,8 @@ namespace MEDPARTITIONER
     void setName(const std::string& name) { _name=name; }
     void setDomainNames(const std::string& name);
 
+    void setNonEmptyMesh(int number) { _i_non_empty_mesh=number;}
+
     //getting/setting the description of the global mesh
     std::string getDescription() const { return _description; }
     void setDescription(const std::string& name) { _description=name; }
@@ -140,7 +141,8 @@ namespace MEDPARTITIONER
                            std::multimap<std::pair<int,int>,std::pair<int,int> >& nodeMapping);
     
     void castCellMeshes(MeshCollection& initialCollection, 
-                        std::vector<std::vector<std::vector<int> > >& new2oldIds);
+                        std::vector<std::vector<std::vector<int> > >& new2oldIds,
+                        std::vector<MEDCoupling::DataArrayInt*> & o2nRenumber);
     
     //creates faces on the new collection
     void castFaceMeshes(MeshCollection& initialCollection,
@@ -148,12 +150,17 @@ namespace MEDPARTITIONER
                         std::vector<std::vector<std::vector<int> > >& new2oldIds);
 
     //constructing connect zones
-    void buildConnectZones();
+    void buildConnectZones( const NodeMapping& nodeMapping,
+                            const std::vector<MEDCoupling::DataArrayInt*> & o2nRenumber,
+                            int nbInitialDomains );
+
+    // Find faces common with neighbor domains and put them in groups
+    void buildBoundaryFaces();
 
   private:
-    void castIntField(std::vector<ParaMEDMEM::MEDCouplingUMesh*>& meshesCastFrom,
-                       std::vector<ParaMEDMEM::MEDCouplingUMesh*>& meshesCastTo,
-                       std::vector<ParaMEDMEM::DataArrayInt*>& arrayFrom,
+    void castIntField(std::vector<MEDCoupling::MEDCouplingUMesh*>& meshesCastFrom,
+                       std::vector<MEDCoupling::MEDCouplingUMesh*>& meshesCastTo,
+                       std::vector<MEDCoupling::DataArrayInt*>& arrayFrom,
                        std::string nameArrayTo);
 
     void castAllFields(MeshCollection& initialCollection,
@@ -163,14 +170,14 @@ namespace MEDPARTITIONER
 
     
     void remapIntField(int inew, int iold, 
-                       const ParaMEDMEM::MEDCouplingUMesh& sourceMesh,
-                       const ParaMEDMEM::MEDCouplingUMesh& targetMesh,
+                       const MEDCoupling::MEDCouplingUMesh& sourceMesh,
+                       const MEDCoupling::MEDCouplingUMesh& targetMesh,
                        const int* fromArray,
                        std::string nameArrayTo,
                        const BBTreeOfDim* tree);
 
     void remapDoubleField(int inew, int iold,
-                           ParaMEDMEM::DataArrayDouble* fromArray,
+                           MEDCoupling::DataArrayDouble* fromArray,
                            std::string nameArrayTo,
                            std::string descriptionField);
 
@@ -193,23 +200,20 @@ namespace MEDPARTITIONER
     ParaDomainSelector* _domain_selector;
     
     //links to meshes
-    std::vector<ParaMEDMEM::MEDCouplingUMesh*> _mesh;
-    std::vector<ParaMEDMEM::MEDCouplingUMesh*> _face_mesh;
+    std::vector<MEDCoupling::MEDCouplingUMesh*> _mesh;
+    std::vector<MEDCoupling::MEDCouplingUMesh*> _face_mesh;
     
     //index of a non empty mesh within _mesh (in parallel mode all of meshes can be empty)
     int _i_non_empty_mesh;
     
-    //links to connectzones
-    std::vector<MEDPARTITIONER::ConnectZone*> _connect_zones;
-
     //family ids storages
-    std::vector<ParaMEDMEM::DataArrayInt*> _cell_family_ids;
-    std::vector<ParaMEDMEM::DataArrayInt*> _face_family_ids;
+    std::vector<MEDCoupling::DataArrayInt*> _cell_family_ids;
+    std::vector<MEDCoupling::DataArrayInt*> _face_family_ids;
     
     //DataArrayInt* storages
-    std::map<std::string, ParaMEDMEM::DataArrayInt*> _map_dataarray_int;
+    std::map<std::string, MEDCoupling::DataArrayInt*> _map_dataarray_int;
     //DataArrayDouble* storages
-    std::map<std::string, ParaMEDMEM::DataArrayDouble*> _map_dataarray_double;
+    std::map<std::string, MEDCoupling::DataArrayDouble*> _map_dataarray_double;
     
     //fields to be partitioned
     std::vector<std::string> _field_descriptions;
@@ -218,7 +222,7 @@ namespace MEDPARTITIONER
     std::map<std::string, int> _family_info;
     std::map<std::string, std::vector<std::string> > _group_info;
   
-    //list of groups that are not to be splitted
+    //list of groups that are not to be split
     std::vector<std::string> _indivisible_regions;
 
     //name of global mesh