1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef __MEDPARTITIONER_MESHCOLLECTION_HXX__
21 #define __MEDPARTITIONER_MESHCOLLECTION_HXX__
23 #include "MEDPARTITIONER.hxx"
24 #include "MEDPARTITIONER_Graph.hxx"
25 #include "MEDPARTITIONER_Utils.hxx"
27 #include "MEDCouplingUMesh.hxx"
37 class MEDCouplingUMesh;
41 namespace MEDPARTITIONER
44 class MeshCollectionDriver;
45 class ParaDomainSelector;
50 typedef enum{MedAscii, MedXml, Undefined} DriverType;
51 typedef std::multimap<std::pair<int,int>, std::pair<int,int> > NodeMapping ;
52 typedef std::vector<std::pair<int,int> > NodeList;
54 class MEDPARTITIONER_EXPORT MeshCollection
58 //Constructing from an existing mesh and a new topology
59 MeshCollection(MeshCollection&, Topology*, bool family_splitting=false, bool create_empty_groups=false);
60 //Constructing the mesh collection from a file
61 MeshCollection(const std::string& filename);
62 //Constructing the mesh collection from a file
63 MeshCollection(const std::string& filename, ParaDomainSelector& domainSelector);
64 //Constructing the mesh collection from a file
65 MeshCollection(const std::string& filename, const std::string& meshname);
67 bool isParallelMode() const { return _domain_selector; }
69 //writing to a distributed file
70 void write(const std::string& filename);
73 MeshCollectionDriver *retrieveDriver();
74 MeshCollectionDriver *getDriver() const;
75 void setDriverType(MEDPARTITIONER::DriverType type) { _driver_type=type; }
77 //creation of the cell graph
78 void buildCellGraph(MEDPARTITIONER::SkyLineArray* & array,int *& edgeweights );
79 //creation of the cell graph
80 void buildParallelCellGraph(MEDPARTITIONER::SkyLineArray* & array,int *& edgeweights );
82 //creation and partition of the associated graph
83 Topology* createPartition(int nbdomain, Graph::splitter_type type = Graph::METIS,
84 const std::string& ="", int* edgeweights=0, int* verticesweights=0);
86 //creation of a user specified partition
87 Topology* createPartition(const int* partition);
89 //getting mesh dimension
90 int getMeshDimension() const;
91 int getNbOfLocalMeshes() const;
92 int getNbOfGlobalMeshes() const { return _mesh.size(); }
93 int getNbOfLocalCells() const;
94 int getNbOfLocalFaces() const;
96 //getting a reference to mesh vector
97 std::vector<ParaMEDMEM::MEDCouplingUMesh*>& getMesh();
98 std::vector<ParaMEDMEM::MEDCouplingUMesh*>& getFaceMesh();
99 std::vector<std::vector<ParaMEDMEM::MEDCouplingUMesh*> >& getGroupMeshes();
101 ParaMEDMEM::MEDCouplingUMesh* getMesh(int idomain) const;
102 ParaMEDMEM::MEDCouplingUMesh* getFaceMesh(int idomain);
103 std::vector<ParaMEDMEM::MEDCouplingUMesh*>& getGroupMeshes(int idomain);
105 std::vector<ParaMEDMEM::DataArrayInt*>& getCellFamilyIds() { return _cell_family_ids; }
106 std::vector<ParaMEDMEM::DataArrayInt*>& getFaceFamilyIds() { return _face_family_ids; }
108 std::map<std::string, ParaMEDMEM::DataArrayInt*>& getMapDataArrayInt() { return _map_dataarray_int; }
109 std::map<std::string, ParaMEDMEM::DataArrayDouble*>& getMapDataArrayDouble() { return _map_dataarray_double; }
111 std::map<std::string,int>& getFamilyInfo() { return _family_info; }
112 std::map<std::string, std::vector<std::string> >& getGroupInfo() { return _group_info; }
114 ParaMEDMEM::DataArrayDouble* getField(std::string descriptionField, int iold);
115 std::vector<std::string>& getFieldDescriptions() { return _field_descriptions; }
116 void prepareFieldDescriptions();
117 void filterFaceOnCell();
119 //getting a reference to connect zones vector
120 std::vector<MEDPARTITIONER::ConnectZone*>& getCZ();
122 //getting a pointer to topology
123 Topology* getTopology() const ;
124 ParaDomainSelector* getParaDomainSelector() const { return _domain_selector; }
125 //setting a new topology
126 void setTopology(Topology* topology);
128 //getting/setting the name of the global mesh (as opposed
129 //to the name of a subdomain \a nn, which is name_nn)
130 std::string getName() const { return _name; }
131 void setName(const std::string& name) { _name=name; }
132 void setDomainNames(const std::string& name);
134 //getting/setting the description of the global mesh
135 std::string getDescription() const { return _description; }
136 void setDescription(const std::string& name) { _description=name; }
138 //creates the node mapping between an old collection and the present one
139 void createNodeMapping(MeshCollection& initialCollection,
140 std::multimap<std::pair<int,int>,std::pair<int,int> >& nodeMapping);
142 void castCellMeshes(MeshCollection& initialCollection,
143 std::vector<std::vector<std::vector<int> > >& new2oldIds);
145 //creates faces on the new collection
146 void castFaceMeshes(MeshCollection& initialCollection,
147 const std::multimap<std::pair<int,int>, std::pair<int,int> >& nodeMapping,
148 std::vector<std::vector<std::vector<int> > >& new2oldIds);
150 //constructing connect zones
151 void buildConnectZones();
154 void castIntField(std::vector<ParaMEDMEM::MEDCouplingUMesh*>& meshesCastFrom,
155 std::vector<ParaMEDMEM::MEDCouplingUMesh*>& meshesCastTo,
156 std::vector<ParaMEDMEM::DataArrayInt*>& arrayFrom,
157 std::string nameArrayTo);
159 void castAllFields(MeshCollection& initialCollection,
160 std::string nameArrayTo);
162 void findCommonDistantNodes(std::vector<std::vector<std::multimap<int,int> > >& commonDistantNodes);
165 void remapIntField(int inew, int iold,
166 const ParaMEDMEM::MEDCouplingUMesh& sourceMesh,
167 const ParaMEDMEM::MEDCouplingUMesh& targetMesh,
168 const int* fromArray,
169 std::string nameArrayTo,
170 const BBTreeOfDim* tree);
172 void remapDoubleField(int inew, int iold,
173 ParaMEDMEM::DataArrayDouble* fromArray,
174 std::string nameArrayTo,
175 std::string descriptionField);
177 void createJointGroup( const std::vector< int >& faces,
183 //link to mesh_collection topology
186 //control over topology
189 //Driver for read/write operations
190 MeshCollectionDriver* _driver;
192 //Parallelizer - mark of parallel execution mode
193 ParaDomainSelector* _domain_selector;
196 std::vector<ParaMEDMEM::MEDCouplingUMesh*> _mesh;
197 std::vector<ParaMEDMEM::MEDCouplingUMesh*> _face_mesh;
199 //index of a non empty mesh within _mesh (in parallel mode all of meshes can be empty)
200 int _i_non_empty_mesh;
202 //links to connectzones
203 std::vector<MEDPARTITIONER::ConnectZone*> _connect_zones;
205 //family ids storages
206 std::vector<ParaMEDMEM::DataArrayInt*> _cell_family_ids;
207 std::vector<ParaMEDMEM::DataArrayInt*> _face_family_ids;
209 //DataArrayInt* storages
210 std::map<std::string, ParaMEDMEM::DataArrayInt*> _map_dataarray_int;
211 //DataArrayDouble* storages
212 std::map<std::string, ParaMEDMEM::DataArrayDouble*> _map_dataarray_double;
214 //fields to be partitioned
215 std::vector<std::string> _field_descriptions;
217 //group family conversion
218 std::map<std::string, int> _family_info;
219 std::map<std::string, std::vector<std::string> > _group_info;
221 //list of groups that are not to be splitted
222 std::vector<std::string> _indivisible_regions;
224 //name of global mesh
227 //description of global mesh
228 std::string _description;
230 //specifies the driver associated to the collection
231 DriverType _driver_type;
233 //flag specifying that the splitter should create boundary constituent entity
234 //so that they are written in joints
235 bool _subdomain_boundary_creates;
237 //flag specifying that families must be preserved by the splitting
238 bool _family_splitting;
240 //flag specifying that groups must be created on all domains, even if they are empty
241 bool _create_empty_groups;
243 JointFinder* _joint_finder;