1 // Copyright (C) 2007-2023 CEA, EDF
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 #include "MEDPARTITIONER_ConnectZone.hxx"
22 #include "MEDCouplingSkyLineArray.hxx"
26 using namespace MEDCoupling;
28 MEDPARTITIONER::ConnectZone::ConnectZone():
31 ,_local_domain_number(0)
32 ,_distant_domain_number(0)
40 MEDPARTITIONER::ConnectZone::~ConnectZone()
42 for(std::map < std::pair <mcIdType, mcIdType>,MEDCouplingSkyLineArray * >::iterator iter=_entity_corresp.begin(); iter!=_entity_corresp.end();iter++)
44 iter->second->decrRef();
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)
55 ,_node_corresp(myConnectZone._node_corresp)
56 ,_face_corresp(myConnectZone._face_corresp)
57 ,_entity_corresp(myConnectZone._entity_corresp)
61 std::string MEDPARTITIONER::ConnectZone::getName() const
66 std::string MEDPARTITIONER::ConnectZone::getDescription() const
71 int MEDPARTITIONER::ConnectZone::getDistantDomainNumber() const
73 return _distant_domain_number;
76 int MEDPARTITIONER::ConnectZone::getLocalDomainNumber() const
78 return _local_domain_number;
81 MEDCouplingUMesh *MEDPARTITIONER::ConnectZone::getLocalMesh() const
86 MEDCouplingUMesh *MEDPARTITIONER::ConnectZone::getDistantMesh() const
91 bool MEDPARTITIONER::ConnectZone::isEntityCorrespPresent(mcIdType localEntity, mcIdType distantEntity) const
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++)
96 if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
102 const mcIdType *MEDPARTITIONER::ConnectZone::getNodeCorrespIndex() const
104 return _node_corresp->getIndex();
107 const mcIdType *MEDPARTITIONER::ConnectZone::getNodeCorrespValue() const
109 return _node_corresp->getValues();
112 mcIdType MEDPARTITIONER::ConnectZone::getNodeNumber() const
114 return _node_corresp->getNumberOf();
117 const MEDCouplingSkyLineArray * MEDPARTITIONER::ConnectZone::getNodeCorresp() const
119 return (const MEDCouplingSkyLineArray *)_node_corresp;
122 const mcIdType *MEDPARTITIONER::ConnectZone::getFaceCorrespIndex() const
124 return _face_corresp->getIndex();
127 const mcIdType *MEDPARTITIONER::ConnectZone::getFaceCorrespValue() const
129 return _face_corresp->getValues();
132 mcIdType MEDPARTITIONER::ConnectZone::getFaceNumber() const
134 return _face_corresp->getNumberOf();
137 const MEDCouplingSkyLineArray * MEDPARTITIONER::ConnectZone::getFaceCorresp() const
139 return _face_corresp;
142 const mcIdType *MEDPARTITIONER::ConnectZone::getEntityCorrespIndex(mcIdType localEntity,
143 mcIdType distantEntity) const
145 typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
147 for(map_iter iter=_entity_corresp.begin();iter!=_entity_corresp.end();iter++)
149 if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
150 return iter->second->getIndex();
155 const mcIdType *MEDPARTITIONER::ConnectZone::getEntityCorrespValue(mcIdType localEntity,
156 mcIdType distantEntity) const
158 typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
160 for (map_iter iter=_entity_corresp.begin();iter!=_entity_corresp.end();iter++)
162 if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
163 return iter->second->getValues();
168 mcIdType MEDPARTITIONER::ConnectZone::getEntityCorrespNumber(mcIdType localEntity,
169 mcIdType distantEntity) const
171 typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
173 for(map_iter iter=_entity_corresp.begin();iter!=_entity_corresp.end();iter++)
175 if((iter->first).first==localEntity && (iter->first).second==distantEntity)
176 return iter->second->getNumberOf();
181 mcIdType MEDPARTITIONER::ConnectZone::getEntityCorrespLength(mcIdType localEntity,
182 mcIdType distantEntity) const
184 typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
186 for (map_iter iter=_entity_corresp.begin(); iter != _entity_corresp.end(); iter++)
188 if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
189 return iter->second->getLength();
194 const MEDCouplingSkyLineArray *
195 MEDPARTITIONER::ConnectZone::getEntityCorresp(mcIdType localEntity, mcIdType distantEntity) const
197 typedef std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator map_iter;
199 for (map_iter iter=_entity_corresp.begin(); iter != _entity_corresp.end(); iter++)
201 if ((iter->first).first==localEntity && (iter->first).second==distantEntity)
207 std::vector< std::pair< mcIdType,mcIdType > > MEDPARTITIONER::ConnectZone::getEntities() const
209 std::vector< std::pair< mcIdType,mcIdType > > types;
211 std::map<std::pair<mcIdType,mcIdType>, MEDCouplingSkyLineArray*>::const_iterator
212 iter = _entity_corresp.begin();
213 for ( ; iter != _entity_corresp.end(); iter++)
215 types.push_back( iter->first );
221 void MEDPARTITIONER::ConnectZone::setName(const std::string& name)
226 void MEDPARTITIONER::ConnectZone::setDescription(const std::string& description)
228 _description=description;
231 void MEDPARTITIONER::ConnectZone::setDistantDomainNumber(int distantDomainNumber)
233 _distant_domain_number=distantDomainNumber;
236 void MEDPARTITIONER::ConnectZone::setLocalDomainNumber(int localDomainNumber)
238 _local_domain_number=localDomainNumber;
241 void MEDPARTITIONER::ConnectZone::setLocalMesh(MEDCouplingUMesh * localMesh)
243 _local_mesh=localMesh;
246 void MEDPARTITIONER::ConnectZone::setDistantMesh(MEDCouplingUMesh * distantMesh)
248 _distant_mesh=distantMesh;
251 /*! transforms an int array containing
252 * the node-node connections
253 * to a MEDCouplingSkyLineArray
255 void MEDPARTITIONER::ConnectZone::setNodeCorresp(const mcIdType * nodeCorresp, mcIdType nbnode)
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++)
266 value[2*i ]=nodeCorresp[2*i];
267 value[2*i+1]=nodeCorresp[2*i+1];
269 index[nbnode]=2*nbnode;
270 setNodeCorresp( MEDCouplingSkyLineArray::New( indexArr, valueArr ));
273 void MEDPARTITIONER::ConnectZone::setNodeCorresp(MEDCouplingSkyLineArray* array)
275 MCAuto<MEDCouplingSkyLineArray> arr(array);
279 /*! transforms an int array containing
280 * the face-face connections
281 * to a MEDCouplingSkyLineArray
283 void MEDPARTITIONER::ConnectZone::setFaceCorresp(const mcIdType * faceCorresp, mcIdType nbface)
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++)
294 value[2*i]=faceCorresp[2*i];
295 value[2*i+1]=faceCorresp[2*i+1];
297 index[nbface]=2*nbface;
298 setFaceCorresp( MEDCouplingSkyLineArray::New( indexArr, valueArr ));
301 void MEDPARTITIONER::ConnectZone::setFaceCorresp(MEDCouplingSkyLineArray* array)
303 MCAuto<MEDCouplingSkyLineArray> arr (array);
307 /*! transforms an int array containing
308 * the entity-entity connections
309 * to a MEDCouplingSkyLineArray
311 * the resulting MEDCouplingSkyLineArray is put in the map
313 void MEDPARTITIONER::ConnectZone::setEntityCorresp(mcIdType localEntity, mcIdType distantEntity,
314 const mcIdType *entityCorresp, mcIdType nbentity)
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++)
325 value[2*i ]=entityCorresp[2*i];
326 value[2*i+1]=entityCorresp[2*i+1];
328 index[nbentity]=2*nbentity;
329 setEntityCorresp( localEntity, distantEntity, MEDCouplingSkyLineArray::New(indexArr,valueArr));
332 void MEDPARTITIONER::ConnectZone::setEntityCorresp(mcIdType localEntity, mcIdType distantEntity,
333 MEDCouplingSkyLineArray *array)
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();