Salome HOME
Copyright update 2021
[tools/medcoupling.git] / src / MEDPartitioner / MEDPARTITIONER_ConnectZone.cxx
1 // Copyright (C) 2007-2021  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "MEDPARTITIONER_ConnectZone.hxx"
21
22 #include "MEDCouplingSkyLineArray.hxx"
23
24 #include <map>
25
26 using namespace MEDCoupling;
27
28 MEDPARTITIONER::ConnectZone::ConnectZone():
29   _name("")
30   ,_description("")
31   ,_local_domain_number(0)
32   ,_distant_domain_number(0)
33   ,_local_mesh(0)
34   ,_distant_mesh(0)
35   ,_node_corresp(0)
36   ,_face_corresp(0)
37 {
38 }
39
40 MEDPARTITIONER::ConnectZone::~ConnectZone()
41 {
42   for(std::map < std::pair <mcIdType, mcIdType>,MEDCouplingSkyLineArray * >::iterator iter=_entity_corresp.begin(); iter!=_entity_corresp.end();iter++)
43     {
44       iter->second->decrRef();
45     }
46 }
47
48 MEDPARTITIONER::ConnectZone::ConnectZone(const ConnectZone & myConnectZone):
49   _name(myConnectZone._name)
50   ,_description(myConnectZone._description)
51   ,_local_domain_number(myConnectZone._local_domain_number)
52   ,_distant_domain_number(myConnectZone._distant_domain_number)
53   ,_local_mesh(0)
54   ,_distant_mesh(0)
55   ,_node_corresp(myConnectZone._node_corresp)
56   ,_face_corresp(myConnectZone._face_corresp)
57   ,_entity_corresp(myConnectZone._entity_corresp)
58 {
59 }
60
61 std::string MEDPARTITIONER::ConnectZone::getName() const 
62 {
63   return _name;
64 }
65
66 std::string MEDPARTITIONER::ConnectZone::getDescription() const     
67 {
68   return _description;
69 }
70
71 int MEDPARTITIONER::ConnectZone::getDistantDomainNumber() const 
72 {
73   return _distant_domain_number;
74 }
75
76 int MEDPARTITIONER::ConnectZone::getLocalDomainNumber() const 
77 {
78   return _local_domain_number;
79 }
80
81 MEDCouplingUMesh *MEDPARTITIONER::ConnectZone::getLocalMesh() const
82 {
83   return _local_mesh;
84 }
85
86 MEDCouplingUMesh *MEDPARTITIONER::ConnectZone::getDistantMesh() const
87 {
88   return _distant_mesh;
89 }
90
91 bool MEDPARTITIONER::ConnectZone::isEntityCorrespPresent(mcIdType localEntity, mcIdType distantEntity) const
92 {
93   typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
94   for(map_iter iter=_entity_corresp.begin(); iter != _entity_corresp.end(); iter++)
95     {
96       if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
97         return true;
98     }
99   return false;
100 }
101
102 const mcIdType *MEDPARTITIONER::ConnectZone::getNodeCorrespIndex() const
103 {
104   return _node_corresp->getIndex();
105 }
106
107 const mcIdType *MEDPARTITIONER::ConnectZone::getNodeCorrespValue() const
108 {
109   return _node_corresp->getValues();
110 }
111
112 mcIdType MEDPARTITIONER::ConnectZone::getNodeNumber() const
113 {
114   return _node_corresp->getNumberOf();
115 }
116
117 const MEDCouplingSkyLineArray * MEDPARTITIONER::ConnectZone::getNodeCorresp() const
118 {
119   return (const MEDCouplingSkyLineArray *)_node_corresp;
120 }
121
122 const mcIdType *MEDPARTITIONER::ConnectZone::getFaceCorrespIndex() const
123 {
124   return _face_corresp->getIndex();
125 }
126
127 const mcIdType *MEDPARTITIONER::ConnectZone::getFaceCorrespValue() const
128 {
129   return _face_corresp->getValues();
130 }
131
132 mcIdType MEDPARTITIONER::ConnectZone::getFaceNumber() const
133 {
134   return _face_corresp->getNumberOf();
135 }
136
137 const MEDCouplingSkyLineArray * MEDPARTITIONER::ConnectZone::getFaceCorresp() const
138 {
139   return _face_corresp;
140 }
141
142 const mcIdType *MEDPARTITIONER::ConnectZone::getEntityCorrespIndex(mcIdType localEntity,
143                                                                    mcIdType distantEntity) const
144 {
145   typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
146
147   for(map_iter iter=_entity_corresp.begin();iter!=_entity_corresp.end();iter++)
148   {
149     if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
150       return iter->second->getIndex();
151   }
152   return 0;
153 }
154
155 const mcIdType *MEDPARTITIONER::ConnectZone::getEntityCorrespValue(mcIdType localEntity,
156                                                                    mcIdType distantEntity) const
157 {
158   typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
159
160   for (map_iter iter=_entity_corresp.begin();iter!=_entity_corresp.end();iter++)
161   {
162     if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
163       return iter->second->getValues();
164   }
165   return 0;
166 }
167
168 mcIdType MEDPARTITIONER::ConnectZone::getEntityCorrespNumber(mcIdType localEntity,
169                                                              mcIdType distantEntity) const
170 {
171   typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
172
173   for(map_iter iter=_entity_corresp.begin();iter!=_entity_corresp.end();iter++)
174   {
175     if((iter->first).first==localEntity && (iter->first).second==distantEntity)
176       return iter->second->getNumberOf();
177   }
178   return 0;
179 }
180
181 mcIdType MEDPARTITIONER::ConnectZone::getEntityCorrespLength(mcIdType localEntity,
182                                                         mcIdType distantEntity) const
183 {
184   typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
185
186   for (map_iter iter=_entity_corresp.begin(); iter != _entity_corresp.end(); iter++)
187   {
188     if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
189       return iter->second->getLength();
190   }
191   return 0;
192 }
193
194 const MEDCouplingSkyLineArray *
195 MEDPARTITIONER::ConnectZone::getEntityCorresp(mcIdType localEntity, mcIdType distantEntity) const
196 {
197   typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
198
199   for (map_iter iter=_entity_corresp.begin(); iter != _entity_corresp.end(); iter++)
200   {
201     if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
202       return iter->second;
203   }
204   return 0;
205 }
206
207 std::vector< std::pair< mcIdType,mcIdType > > MEDPARTITIONER::ConnectZone::getEntities() const
208 {
209   std::vector< std::pair< mcIdType,mcIdType > > types;
210
211   std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator
212     iter = _entity_corresp.begin();
213   for ( ; iter != _entity_corresp.end(); iter++)
214     {
215       types.push_back( iter->first );
216     }
217
218   return types;
219 }
220
221 void MEDPARTITIONER::ConnectZone::setName(const std::string& name) 
222 {
223   _name=name;
224 }
225
226 void MEDPARTITIONER::ConnectZone::setDescription(const std::string& description)
227 {
228   _description=description;
229 }
230
231 void MEDPARTITIONER::ConnectZone::setDistantDomainNumber(int distantDomainNumber)
232 {
233   _distant_domain_number=distantDomainNumber;
234 }
235
236 void MEDPARTITIONER::ConnectZone::setLocalDomainNumber(int localDomainNumber)
237 {
238   _local_domain_number=localDomainNumber;
239 }
240
241 void MEDPARTITIONER::ConnectZone::setLocalMesh(MEDCouplingUMesh * localMesh)
242 {
243   _local_mesh=localMesh;
244 }
245
246 void MEDPARTITIONER::ConnectZone::setDistantMesh(MEDCouplingUMesh * distantMesh)
247 {
248   _distant_mesh=distantMesh;
249 }
250
251 /*! transforms an int array containing 
252  * the node-node connections
253  * to a MEDCouplingSkyLineArray
254  */
255 void MEDPARTITIONER::ConnectZone::setNodeCorresp(const mcIdType * nodeCorresp, mcIdType nbnode)
256 {
257   MCAuto<DataArrayIdType> indexArr( DataArrayIdType::New() );
258   MCAuto<DataArrayIdType> valueArr( DataArrayIdType::New() );
259   indexArr->alloc( nbnode+1 );
260   valueArr->alloc( 2*nbnode );
261   mcIdType * index = indexArr->getPointer();
262   mcIdType * value = valueArr->getPointer();
263   for (mcIdType i=0; i<nbnode; i++)
264     {
265       index[i]=2*i;
266       value[2*i  ]=nodeCorresp[2*i];
267       value[2*i+1]=nodeCorresp[2*i+1];
268     }
269   index[nbnode]=2*nbnode;
270   setNodeCorresp( MEDCouplingSkyLineArray::New( indexArr, valueArr ));
271 }
272
273 void MEDPARTITIONER::ConnectZone::setNodeCorresp(MEDCouplingSkyLineArray* array)
274 {
275   MCAuto<MEDCouplingSkyLineArray> arr(array);
276   _node_corresp = arr;
277 }
278
279 /*! transforms an int array containing 
280  * the face-face connections
281  * to a MEDCouplingSkyLineArray
282  */
283 void MEDPARTITIONER::ConnectZone::setFaceCorresp(const mcIdType * faceCorresp, mcIdType nbface)
284 {
285   MCAuto<DataArrayIdType> indexArr( DataArrayIdType::New() );
286   MCAuto<DataArrayIdType> valueArr( DataArrayIdType::New() );
287   indexArr->alloc( nbface+1 );
288   valueArr->alloc( 2*nbface );
289   mcIdType * index = indexArr->getPointer();
290   mcIdType * value = valueArr->getPointer();
291   for (mcIdType i=0; i<nbface; i++)
292     {
293       index[i]=2*i;
294       value[2*i]=faceCorresp[2*i];
295       value[2*i+1]=faceCorresp[2*i+1];
296     }
297   index[nbface]=2*nbface;
298   setFaceCorresp( MEDCouplingSkyLineArray::New( indexArr, valueArr ));
299 }
300
301 void MEDPARTITIONER::ConnectZone::setFaceCorresp(MEDCouplingSkyLineArray* array)
302 {
303   MCAuto<MEDCouplingSkyLineArray> arr (array);
304   _face_corresp = arr;
305 }
306
307 /*! transforms an int array containing 
308  * the entity-entity connections
309  * to a MEDCouplingSkyLineArray
310  * 
311  * the resulting MEDCouplingSkyLineArray is put in the map
312  */
313 void MEDPARTITIONER::ConnectZone::setEntityCorresp(mcIdType localEntity, mcIdType distantEntity,
314                                                    const mcIdType *entityCorresp, mcIdType nbentity)
315
316   MCAuto<DataArrayIdType> indexArr( DataArrayIdType::New() );
317   MCAuto<DataArrayIdType> valueArr( DataArrayIdType::New() );
318   indexArr->alloc( nbentity+1 );
319   valueArr->alloc( 2*nbentity );
320   mcIdType * index = indexArr->getPointer();
321   mcIdType * value = valueArr->getPointer();
322   for (mcIdType i=0; i<nbentity; i++)
323     {
324       index[i]=2*i;
325       value[2*i  ]=entityCorresp[2*i];
326       value[2*i+1]=entityCorresp[2*i+1];
327     }
328   index[nbentity]=2*nbentity;
329   setEntityCorresp( localEntity, distantEntity, MEDCouplingSkyLineArray::New(indexArr,valueArr));
330 }
331
332 void MEDPARTITIONER::ConnectZone::setEntityCorresp(mcIdType localEntity, mcIdType distantEntity,
333                                                    MEDCouplingSkyLineArray *array)
334 {
335   MEDCouplingSkyLineArray * nullArray = 0;
336   std::map < std::pair <mcIdType,mcIdType>, MEDCouplingSkyLineArray * >::iterator it;
337   it = _entity_corresp.insert
338     ( std::make_pair( std::make_pair(localEntity,distantEntity), nullArray )).first;
339   if ( it->second != nullArray ) it->second->decrRef();
340   it->second = array;
341 }