10 #include "MEDMEM_DriversDef.hxx"
11 #include "MEDMEM_Support.hxx"
12 #include "MEDMEM_Mesh.hxx"
15 using namespace MED_EN;
16 using namespace MEDMEM;
18 #define MED_NBR_GEOMETRIE_MAILLE 15
20 /* This class is a generic class for family and group */
25 //--------------------------------------------------------------------------
26 SUPPORT::SUPPORT(): _name(""), _description("None"), _mesh((MESH*)NULL),
27 _entity(MED_CELL), _numberOfGeometricType(0),
28 _geometricType((medGeometryElement*)NULL),
29 _numberOfGaussPoint((int*)NULL),
31 _numberOfElements((int*)NULL),
32 _totalNumberOfElements(0),
33 _number((MEDSKYLINEARRAY*)NULL)
34 //--------------------------------------------------------------------------
36 MESSAGE("SUPPORT::SUPPORT()");
42 //--------------------------------------------------------------------------
43 SUPPORT::SUPPORT(MESH* Mesh, string Name/*=""*/, medEntityMesh Entity/*=MED_CELL*/):
44 _name(Name), _description("None"), _mesh(Mesh), _entity(Entity),
45 _numberOfGeometricType(0),
46 _geometricType((medGeometryElement*)NULL),
47 _numberOfGaussPoint((int*)NULL),
49 _numberOfElements((int*)NULL),
50 _totalNumberOfElements(0),
51 _number((MEDSKYLINEARRAY*)NULL)
52 //--------------------------------------------------------------------------
54 MESSAGE("SUPPORT::SUPPORT(MESH*Mesh,string Name,medEntityMesh Entity)");
61 //--------------------------------------------------------------------------
62 SUPPORT::SUPPORT(const SUPPORT & m)
63 //--------------------------------------------------------------------------
65 const char * LOC = "SUPPORT::SUPPORT(SUPPORT & m) : " ;
69 _description = m._description;
70 _mesh = m._mesh; // on recopie uniquement l'adresse
72 _numberOfGeometricType = m._numberOfGeometricType;
73 if (m._geometricType != NULL)
75 _geometricType = new medGeometryElement[m._numberOfGeometricType];
76 memcpy(_geometricType,m._geometricType,m._numberOfGeometricType*sizeof(medGeometryElement));
79 _geometricType = (medGeometryElement *) NULL;
80 if (m._numberOfGaussPoint != NULL)
82 _numberOfGaussPoint = new int[m._numberOfGeometricType];
83 memcpy(_numberOfGaussPoint,m._numberOfGaussPoint,m._numberOfGeometricType*sizeof(int));
86 _numberOfGaussPoint = (int *) NULL;
87 _isOnAllElts = m._isOnAllElts;
88 if (m._numberOfElements != NULL)
90 _numberOfElements = new int[_numberOfGeometricType];
91 memcpy(_numberOfElements,m._numberOfElements,_numberOfGeometricType*sizeof(int));
94 _numberOfElements = (int *) NULL;
95 _totalNumberOfElements = m._totalNumberOfElements;
96 if (m._isOnAllElts == false)
97 _number = new MEDSKYLINEARRAY(* m._number);
99 _number = (MEDSKYLINEARRAY *) NULL;
112 MESSAGE("Destructeur ~SUPPORT()");
113 clearDataOnNumbers();
119 //--------------------------------------------------
120 ostream & MEDMEM::operator<<(ostream &os, const SUPPORT &my)
121 //--------------------------------------------------
123 os << "Name : "<< my.getName() << endl ;
124 os << "Description : "<< my.getDescription() << endl ;
125 os << "Mesh name : ";
126 if (my.getMesh() == NULL)
127 os << "ERROR : Mesh not defined !" << endl ;
129 os << my._mesh->getName() << endl ;
130 os << "Entity : "<< my._entity << endl;
131 os << "Entity list : "<< endl;
132 if (!(my._isOnAllElts)) {
133 int numberoftypes = my._numberOfGeometricType ;
134 os << "NumberOfTypes : "<<numberoftypes<<endl;
135 medGeometryElement * types = my._geometricType;
136 for (int j=0;j<numberoftypes;j++) {
137 int numberOfElements = my._numberOfElements[j];
138 os << " * Type "<<types[j]<<" : there is(are) "<<numberOfElements<<" element(s) :" << endl;
139 // const int * number = my.getNumber(types[j]);
142 // for (int k=0; k<numberOfElements;k++)
143 // os << number[k] << " ";
147 os << "Is on all entities !"<< endl;
153 Updade the SUPPORT attributs with rigth MESH information.
155 It has an effect only if SUPPORT is on all elements.
157 No more need in future release.
159 //-------------------
160 void SUPPORT::update()
161 //-------------------
163 const char * LOC = "SUPPORT::update() : " ;
167 if (_entity == MED_NODE) {
168 _numberOfGeometricType=1 ;
169 _geometricType=new medGeometryElement[1] ;
170 _geometricType[0]=MED_NONE ;
171 _numberOfElements = new int[1] ;
172 _numberOfElements[0]=_mesh->getNumberOfNodes();
173 _totalNumberOfElements=_numberOfElements[0];
174 _numberOfGaussPoint = new int[1] ;
175 _numberOfGaussPoint[0]=1;
176 } else { // we duplicate information from _mesh
177 _numberOfGeometricType=_mesh->getNumberOfTypesWithPoly(_entity);
178 if (_geometricType == (medGeometryElement *) NULL)
179 _geometricType=_mesh->getTypesWithPoly(_entity);
181 memcpy(_geometricType,_mesh->getTypes(_entity),_numberOfGeometricType*sizeof(medGeometryElement));
182 if (_numberOfElements == (int *) NULL)
183 _numberOfElements = new int[_numberOfGeometricType] ;
184 if (_numberOfGaussPoint == (int *) NULL)
185 _numberOfGaussPoint = new int[_numberOfGeometricType] ;
186 _totalNumberOfElements=0;
187 for (int i=0;i<_numberOfGeometricType;i++) {
188 _numberOfElements[i]=_mesh->getNumberOfElementsWithPoly(_entity,_geometricType[i]) ;
189 _totalNumberOfElements+=_numberOfElements[i];
190 _numberOfGaussPoint[i]=1 ;
198 Blend the given SUPPORT mySupport into the calling object SUPPORT.
200 //-------------------
201 void SUPPORT::blending(SUPPORT * mySupport) throw (MEDEXCEPTION)
202 //-------------------
204 const char * LOC="SUPPORT::blending(SUPPORT *) : ";
206 if (_entity!=mySupport->getEntity())
207 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
208 if(!(*_mesh == *mySupport->getMesh()))
209 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh are different !"));
212 if(mySupport->isOnAllElements())
217 if(mySupport->_totalNumberOfElements==0)
219 const int *ids=getNumber(MED_ALL_ELEMENTS);
220 set<int> idsSet(ids,ids+getNumberOfElements(MED_ALL_ELEMENTS));
221 const int *idsMySupport=mySupport->getNumber(MED_ALL_ELEMENTS);
222 int mySupportSize=mySupport->getNumberOfElements(MED_ALL_ELEMENTS);
223 set<int>::iterator iter;
224 for(int i=0;i<mySupportSize;i++)
225 idsSet.insert(idsMySupport[i]);
226 int size=idsSet.size();
230 for(iter=idsSet.begin();iter!=idsSet.end();iter++)
231 idsList.push_back(*iter);
232 if(_entity==MED_NODE)
233 fillFromNodeList(idsList);
235 fillFromElementList(idsList);
238 clearDataOnNumbers();
243 This function allows the user to set a support not on all entities Entity,
244 it should be used after an initialisation with the constructor
245 SUPPORT(MESH* Mesh, string Name="", medEntityMesh Entity=MED_CELL) and
246 after the call to the function setAll(false).
247 It allocates and initialises all the attributs of the class SUPPORT.
250 //-------------------
251 void SUPPORT::setpartial(string Description, int NumberOfGeometricType,
252 int TotalNumberOfElements,
253 medGeometryElement *GeometricType,
254 int *NumberOfElements, int *NumberValue)
255 //-------------------
257 const char * LOC = "SUPPORT::setpartial(string , int , int , medGeometryElement * , int * , int *) : " ;
260 _isOnAllElts = false ;
262 _description=Description;
264 _numberOfGeometricType=NumberOfGeometricType;
266 if (_geometricType!=NULL) delete[] _geometricType ;
267 _geometricType = new medGeometryElement[NumberOfGeometricType];
268 if (_numberOfElements!=NULL) delete[] _numberOfElements ;
269 _numberOfElements = new int[NumberOfGeometricType];
270 _totalNumberOfElements = TotalNumberOfElements;
271 if (_numberOfGaussPoint!=NULL) delete[] _numberOfGaussPoint ;
272 _numberOfGaussPoint = new int[NumberOfGeometricType];
273 int * index = new int[_numberOfGeometricType+1];
276 for (int i=0;i<_numberOfGeometricType;i++) {
277 if(GeometricType[i]/100 != elemDim)
279 elemDim=GeometricType[i]/100;
281 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"unhomogeneous geometric types (dimension) !"));
282 _geometricType[i] = GeometricType[i] ;
283 _numberOfElements[i] = NumberOfElements[i] ;
284 _numberOfGaussPoint[i] = 1 ;
285 index[i+1] = index[i]+NumberOfElements[i] ;
288 if (_number!=NULL) delete _number ;
289 _number = new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfElements,index,NumberValue);
298 This method gets the boundary elements of the mesh. The support has to be
299 build using the constructor SUPPORT(MESH *,string, medEntityMesh) or
300 SUPPORT() followed by setMesh(MESH*) setName(string) and
301 setEntity(medEntityMesh) before using this method.
303 //-------------------
304 void SUPPORT::getBoundaryElements() throw (MEDEXCEPTION)
305 //-------------------
307 const char * LOC = "SUPPORT::getBoundaryElements() : " ;
310 if (_mesh == (MESH*)NULL) throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"You shlould use the appropriate SUPPORT Constructor before calling this method"));
312 int spaceDimension = _mesh->getSpaceDimension();
314 if (spaceDimension == 3)
315 if (_entity != MED_FACE)
316 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 3D mesh for entity "<<_entity<<" !"));
317 if (spaceDimension == 2)
318 if (_entity != MED_EDGE)
319 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 2D mesh for entity "<<_entity<<" !"));
323 const int * myConnectivityValue = _mesh->getReverseConnectivity(MED_DESCENDING) ;
324 const int * myConnectivityIndex = _mesh->getReverseConnectivityIndex(MED_DESCENDING) ;
325 int numberOf = _mesh->getNumberOfElements(_entity,MED_ALL_ELEMENTS) ;
326 list<int> myElementsList ;
329 for (int i=0 ; i<numberOf; i++)
330 if (myConnectivityValue[myConnectivityIndex[i]] == 0) {
332 myElementsList.push_back(i+1) ;
336 // Well, we must know how many geometric type we have found
337 int * myListArray = new int[size] ;
339 list<int>::iterator myElementsListIt ;
340 for (myElementsListIt=myElementsList.begin();myElementsListIt!=myElementsList.end();myElementsListIt++) {
341 myListArray[id]=(*myElementsListIt) ;
343 SCRUTE(myListArray[id]);
347 int numberOfGeometricType ;
348 medGeometryElement* geometricType ;
349 int * numberOfGaussPoint ;
350 int * geometricTypeNumber ;
351 int * numberOfElements ;
352 //MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY() ;
353 int * mySkyLineArrayIndex ;
355 int numberOfType = _mesh->getNumberOfTypes(_entity) ;
356 if (numberOfType == 1) { // wonderfull : it's easy !
357 numberOfGeometricType = 1 ;
358 geometricType = new medGeometryElement[1] ;
359 const medGeometryElement * allType = _mesh->getTypes(_entity);
360 geometricType[0] = allType[0] ;
361 numberOfGaussPoint = new int[1] ;
362 numberOfGaussPoint[0] = 1 ;
363 geometricTypeNumber = new int[1] ; // not use, but initialized to nothing
364 geometricTypeNumber[0] = 0 ;
365 numberOfElements = new int[1] ;
366 numberOfElements[0] = size ;
367 mySkyLineArrayIndex = new int[2] ;
368 mySkyLineArrayIndex[0]=1 ;
369 mySkyLineArrayIndex[1]=1+size ;
372 map<medGeometryElement,int> theType ;
373 for (myElementsListIt=myElementsList.begin();myElementsListIt!=myElementsList.end();myElementsListIt++) {
374 medGeometryElement myType = _mesh->getElementType(_entity,*myElementsListIt) ;
375 if (theType.find(myType) != theType.end() )
380 numberOfGeometricType = theType.size() ;
381 geometricType = new medGeometryElement[numberOfGeometricType] ;
382 //const medGeometryElement * allType = _mesh->getTypes(_entity); !! UNUSED VARIABLE !!
383 numberOfGaussPoint = new int[numberOfGeometricType] ;
384 geometricTypeNumber = new int[numberOfGeometricType] ; // not use, but initialized to nothing
385 numberOfElements = new int[numberOfGeometricType] ;
386 mySkyLineArrayIndex = new int[numberOfGeometricType+1] ;
388 mySkyLineArrayIndex[0]=1 ;
389 map<medGeometryElement,int>::iterator theTypeIt ;
390 for (theTypeIt=theType.begin();theTypeIt!=theType.end();theTypeIt++) {
391 geometricType[index] = (*theTypeIt).first ;
392 numberOfGaussPoint[index] = 1 ;
393 geometricTypeNumber[index] = 0 ;
394 numberOfElements[index] = (*theTypeIt).second ;
395 mySkyLineArrayIndex[index+1]=mySkyLineArrayIndex[index]+numberOfElements[index] ;
399 //mySkyLineArray->setMEDSKYLINEARRAY(numberOfGeometricType,size,mySkyLineArrayIndex,myListArray) ;
400 MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY(numberOfGeometricType,size,mySkyLineArrayIndex,myListArray) ;
402 setNumberOfGeometricType(numberOfGeometricType) ;
403 // setGeometricType(geometricType) ;
404 // setNumberOfGaussPoint(numberOfGaussPoint) ;
405 for (int i=0;i<numberOfGeometricType;i++)
407 _numberOfGaussPoint[i] = numberOfGaussPoint[i];
408 _geometricType[i] = geometricType[i];
411 setNumberOfElements(numberOfElements) ;
412 setTotalNumberOfElements(size) ;
413 // setNumber(mySkyLineArray) ;
415 _number = new MEDSKYLINEARRAY(numberOfGeometricType,size);
417 _number->setIndex(mySkyLineArrayIndex);
419 for (int i=0;i<size;i++)
421 _number->setIndexValue(i+1,myListArray[i]);
424 delete[] numberOfElements;
425 delete[] geometricTypeNumber;
426 delete[] numberOfGaussPoint;
427 delete[] geometricType;
428 delete[] mySkyLineArrayIndex;
429 delete[] myListArray;
430 delete mySkyLineArray;
436 intersect the given SUPPORT mySupport into the calling SUPPORT object.
438 //-------------------
439 void SUPPORT::intersecting(SUPPORT * mySupport) throw (MEDEXCEPTION)
440 //-------------------
442 const char * LOC="SUPPORT::intersecting(SUPPORT *) : ";
444 if (_entity!=mySupport->getEntity())
445 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
446 if(!(*_mesh == *mySupport->getMesh()))
447 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh are different !"));
448 if(mySupport->isOnAllElements())
455 if(_totalNumberOfElements==0)
457 const int *ids=getNumber(MED_ALL_ELEMENTS);
458 set<int> idsSet(ids,ids+getNumberOfElements(MED_ALL_ELEMENTS));
459 const int *idsMySupport=mySupport->getNumber(MED_ALL_ELEMENTS);
460 int mySupportSize=mySupport->getNumberOfElements(MED_ALL_ELEMENTS);
461 set<int> idsSetMySupport(idsMySupport,idsMySupport+mySupportSize);
462 set<int>::iterator iter;
464 for(iter=idsSet.begin();iter!=idsSet.end();iter++)
465 if(idsSetMySupport.find(*iter)!=idsSetMySupport.end())
466 idsList.push_back(*iter);
467 int size=idsSet.size();
470 if(_entity==MED_NODE)
471 fillFromNodeList(idsList);
473 fillFromElementList(idsList);
477 clearDataOnNumbers();
483 operator = perform et deep copy except for attribute _mesh
485 SUPPORT& MEDMEM::SUPPORT::operator=(const SUPPORT &other)
487 const char * LOC = "SUPPORT::operator=(const SUPPORT & m) : ";
491 _description=other._description;
493 _entity=other._entity;
494 _isOnAllElts=other._isOnAllElts;
495 clearDataOnNumbers();
496 _numberOfGeometricType=other._numberOfGeometricType;
497 _totalNumberOfElements=other._totalNumberOfElements;
499 if(other._geometricType != NULL)
501 _geometricType=new medGeometryElement[other._numberOfGeometricType];
502 memcpy(_geometricType,other._geometricType,other._numberOfGeometricType*sizeof(medGeometryElement));
504 if (other._numberOfGaussPoint != NULL)
506 _numberOfGaussPoint=new int[other._numberOfGeometricType];
507 memcpy(_numberOfGaussPoint,other._numberOfGaussPoint,other._numberOfGeometricType*sizeof(int));
509 if(other._numberOfElements != NULL)
511 _numberOfElements=new int[_numberOfGeometricType];
512 memcpy(_numberOfElements,other._numberOfElements,_numberOfGeometricType*sizeof(int));
516 _number=new MEDSKYLINEARRAY(* other._number);
522 Method that cleans up all the fields related to _numbers. Defined for code factorization.
524 //--------------------------------------------------
525 void MEDMEM::SUPPORT::clearDataOnNumbers()
526 //--------------------------------------------------
528 _numberOfGeometricType=0;
529 _totalNumberOfElements=0;
532 delete [] _geometricType;
533 _geometricType=(medGeometryElement *) NULL;
535 if(_numberOfGaussPoint)
537 delete [] _numberOfGaussPoint;
538 _numberOfGaussPoint=(int *) NULL;
540 if(_numberOfElements)
542 delete [] _numberOfElements;
543 _numberOfElements=(int *) NULL;
548 _number=(MEDSKYLINEARRAY *) NULL;
553 operator == This operator does not compare attributs _name and _description.
555 //--------------------------------------------------
556 bool MEDMEM::SUPPORT::operator == (const SUPPORT &support) const
557 //--------------------------------------------------
559 const char * LOC = "bool SUPPORT::operator ==(const SUPPORT &support) const : ";
563 bool operatorReturn = false;
565 operatorReturn = (*_mesh == *support._mesh) && (_entity == support._entity) &&
566 (_numberOfGeometricType == support._numberOfGeometricType) &&
567 ((_isOnAllElts && support._isOnAllElts) || (!_isOnAllElts && !support._isOnAllElts)) &&
568 (_totalNumberOfElements == support._totalNumberOfElements);
574 for (int i=0; i<_numberOfGeometricType; i++)
576 operatorReturn = operatorReturn &&
577 (_geometricType[i] == support._geometricType[i]) &&
578 (_numberOfElements[i] == support._numberOfElements[i]) &&
579 (_numberOfGaussPoint[i] == support._numberOfGaussPoint[i]);
583 for (int j=0; j<_numberOfElements[i]; j++)
585 operatorReturn = operatorReturn &&
586 (getNumber(_geometricType[i])[j] ==
587 support.getNumber(_geometricType[i])[j]);
596 return operatorReturn;
599 void SUPPORT::changeElementsNbs(MED_EN::medEntityMesh entity, const int *renumberingFromOldToNew, int limitNbClassicPoly, const int *renumberingFromOldToNewPoly)
601 if(entity != _entity)
602 throw MEDEXCEPTION("SUPPORT::changeElementsNbs : Renumbering on a mismatch entity");
606 const int *oldNbs=_number->getValue();
607 for(int i=0;i<_totalNumberOfElements;i++)
609 int globNb=oldNbs[i];
610 if(globNb<=limitNbClassicPoly)
611 newNbs.push_back(renumberingFromOldToNew[globNb-1]);
613 newNbs.push_back(renumberingFromOldToNewPoly[globNb-limitNbClassicPoly-1]);
616 fillFromElementList(newNbs);
623 operator == + in case false a test if coordinates and connectivity of _mesh and support->_mesh are the same
625 bool MEDMEM::SUPPORT::deepCompare(const SUPPORT &support) const
627 bool operatorReturn =(_entity == support._entity) &&
628 (_numberOfGeometricType == support._numberOfGeometricType) &&
629 ( (_isOnAllElts && support._isOnAllElts) || (!_isOnAllElts && !support._isOnAllElts) ) &&
630 (_totalNumberOfElements == support._totalNumberOfElements);
635 for (int i=0; i<_numberOfGeometricType && operatorReturn; i++)
637 operatorReturn = (_geometricType[i] == support._geometricType[i]) &&
638 (_numberOfElements[i] == support._numberOfElements[i]) &&
639 (_numberOfGaussPoint[i] == support._numberOfGaussPoint[i]);
642 for (int j=0; j<_numberOfElements[i]; j++)
644 operatorReturn = (getNumber(_geometricType[i])[j] ==
645 support.getNumber(_geometricType[i])[j]);
653 if(!(*_mesh == *support._mesh))
655 return _mesh->deepCompare(*support._mesh);
658 return operatorReturn;
662 States if this is included in other.
664 bool MEDMEM::SUPPORT::belongsTo(const SUPPORT& other, bool deepCompare) const
666 if(!(*_mesh == *other._mesh))
670 if(!_mesh->deepCompare(*other._mesh))
673 if(_entity!=other._entity)
675 if(other._isOnAllElts)
677 if(_isOnAllElts && !other._isOnAllElts)
679 if(_numberOfGeometricType>other._numberOfGeometricType)
681 for(int i=0; i<_numberOfGeometricType; i++)
683 MED_EN::medGeometryElement curGeomType=_geometricType[i];
685 for(int j=0; j<other._numberOfGeometricType; j++)
686 if(other._geometricType[j]==curGeomType)
690 if(_numberOfElements[i]>other._numberOfElements[iOther])
692 const int *numbers1=_number->getI(i+1);
693 const int *numbers2=other._number->getI(iOther+1);
694 for (int k=0; k<_numberOfElements[i]; k++)
697 for(int l=0;l<other._numberOfElements[iOther] && !found;l++)
699 if(numbers1[k]==numbers2[l])
709 Method used to sort array of id.
711 int compareId(const void *x, const void *y)
713 const int *x1=(const int *)x;
714 const int *y1=(const int *)y;
724 performs a common operation : Sub builds a sorted int array that is obtained by supression of all ids contained
725 in array defined by (idsToSuppress,lgthIdsToSuppress) from array [start ... end]
726 Example sub(0,7,{1,2,5},3) => {0,3,4,6,7} - WARNING returned list should be deallocated !
728 list<int> *MEDMEM::SUPPORT::sub(int start,int end,const int *idsToSuppress,int lgthIdsToSuppress)
730 int size=end-start+1;
731 int sizeRet=size-lgthIdsToSuppress;
734 throw MEDEXCEPTION("MEDMEM::SUPPORT::sub");
742 for(int l=0;l<size;l++)
743 ret->push_back(start+l);
747 int *temp=new int[lgthIdsToSuppress];
748 memcpy(temp,idsToSuppress,sizeof(int)*lgthIdsToSuppress);
749 qsort(temp,lgthIdsToSuppress,sizeof(int),compareId);
751 for(int i=start;i<=end;i++)
761 performs a common operation : Sub builds a sorted int array that is obtained by supression of all ids contained
762 in array defined by (idsToSuppress,lgthIdsToSuppress) from array [start ... end]
763 Example sub({1,3,4,5,6,7,9},7,{1,2,5},3) => {3,4,6,7,9} - WARNING returned list should be deallocated !
765 list<int> *MEDMEM::SUPPORT::sub(const int *ids,int lgthIds,const int *idsToSuppress,int lgthIdsToSuppress)
770 throw MEDEXCEPTION("MEDMEM::SUPPORT::sub");
774 int *temp1=new int[lgthIds];
775 memcpy(temp1,ids,sizeof(int)*lgthIds);
776 qsort(temp1,lgthIds,sizeof(int),compareId);
777 int *temp2=new int[lgthIdsToSuppress];
778 memcpy(temp2,idsToSuppress,sizeof(int)*lgthIdsToSuppress);
779 qsort(temp2,lgthIdsToSuppress,sizeof(int),compareId);
782 if(j>=lgthIdsToSuppress)
783 ret->push_back(temp1[i++]);
784 else if(temp1[i]>temp2[j])
786 else if(temp1[i]<temp2[j])
787 ret->push_back(temp1[i++]);
797 returns a new SUPPORT (responsability to caller to destroy it)
798 that is the complement to "this", lying on the same entity than "this".
800 SUPPORT *MEDMEM::SUPPORT::getComplement() const
803 const int nbOfElt=_mesh->getNumberOfElements(_entity,MED_EN::MED_ALL_ELEMENTS);
804 int nbOfEltInSupp=getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
805 if(_isOnAllElts || nbOfElt==nbOfEltInSupp)
809 ret->setEntity(_entity);
810 string name="Complement of ";
815 const int *nbs=_number->getValue();
816 list<int> *ids=sub(1,nbOfElt,nbs,nbOfEltInSupp);
817 if(_entity==MED_EN::MED_NODE)
818 ret=_mesh->buildSupportOnNodeFromElementList(*ids,_entity);
820 ret=_mesh->buildSupportOnElementsFromElementList(*ids,_entity);
826 returns a new support the user should delete.
828 SUPPORT *MEDMEM::SUPPORT::substract(const SUPPORT& other) const throw (MEDEXCEPTION)
830 const char * LOC = "SUPPORT *MEDMEM::subtract(const SUPPORT * other) : ";
833 if (_entity!=other.getEntity())
834 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
835 if(!(*_mesh == *other.getMesh()))
836 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Mesh are different !"));
837 if(other._isOnAllElts)
841 ret->setEntity(_entity);
845 return other.getComplement();
846 int nbOfEltInThis=getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
847 const int *nbsThis=_number->getValue();
848 int nbOfEltInOther=other.getNumberOfElements(MED_EN::MED_ALL_ELEMENTS);
849 const int *nbsOther=other._number->getValue();
850 list<int> *ids=sub(nbsThis,nbOfEltInThis,nbsOther,nbOfEltInOther);
851 if(_entity==MED_EN::MED_NODE)
852 ret=_mesh->buildSupportOnNodeFromElementList(*ids,_entity);
854 ret=_mesh->buildSupportOnElementsFromElementList(*ids,_entity);
861 returns a new support the user has to delete. Entity is either MED_NODE to obtain node elements lying on boundary of "this"
862 or MED_FACE,MED_EDGE (depends on the this->_mesh dimension).
864 SUPPORT *MEDMEM::SUPPORT::getBoundaryElements(MED_EN::medEntityMesh Entity) const throw (MEDEXCEPTION)
866 const char * LOC = "SUPPORT *MEDMEM::SUPPORT::getBoundaryElements(MED_EN::medEntityMesh Entity) : ";
868 int spaceDimension=_mesh->getSpaceDimension();
869 MED_EN::medEntityMesh baseEntity=Entity;
870 if (spaceDimension == 3)
871 if (Entity!=MED_FACE)
875 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 3D mesh for entity "<<Entity<<" !"));
876 if (spaceDimension == 2)
877 if (Entity!=MED_EDGE)
881 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Not defined in 2D mesh for entity "<<Entity<<" !"));
883 return _mesh->getBoundaryElements(Entity);
885 const int * myConnectivityValue=_mesh->getReverseConnectivity(MED_DESCENDING);
886 const int * myConnectivityIndex=_mesh->getReverseConnectivityIndex(MED_DESCENDING);
887 int numberOf=_mesh->getNumberOfElements(baseEntity,MED_ALL_ELEMENTS);
888 const int *ids=_number->getValue();
889 set<int> idsSet(ids,ids+_totalNumberOfElements);
890 list<int> myElementsList;
891 for (int i=0;i<numberOf;i++)
893 int nbOfDP1EntitySharing=0;
894 if(idsSet.find(myConnectivityValue[myConnectivityIndex[i]-1])!=idsSet.end())
895 nbOfDP1EntitySharing++;
896 if(idsSet.find(myConnectivityValue[myConnectivityIndex[i]])!=idsSet.end())
897 nbOfDP1EntitySharing++;
898 if(nbOfDP1EntitySharing==1)
899 myElementsList.push_back(i+1);
903 return _mesh->buildSupportOnNodeFromElementList(myElementsList,baseEntity);
907 return _mesh->buildSupportOnElementsFromElementList(myElementsList,baseEntity);
912 Method that fills this and updates all its attributes in order to lye on the the listOfNode.
914 void MEDMEM::SUPPORT::fillFromNodeList(const list<int>& listOfNode) throw (MEDEXCEPTION)
916 setEntity(MED_EN::MED_NODE);
917 clearDataOnNumbers();
918 int size=listOfNode.size();
919 int totalNbInMesh=_mesh->getNumberOfElements(_entity,MED_ALL_ELEMENTS);
920 if(totalNbInMesh==size)
928 int numberOfGeometricType=1;
929 medGeometryElement* geometricType=new medGeometryElement[1];
930 geometricType[0]=MED_NONE;
931 int *numberOfGaussPoint=new int[1];
932 numberOfGaussPoint[0]=1;
933 int *numberOfElements=new int[1];
934 numberOfElements[0]=size;
935 int *mySkyLineArrayIndex=new int[2];
936 mySkyLineArrayIndex[0]=1;
937 mySkyLineArrayIndex[1]=1+numberOfElements[0];
938 int *tab=new int[numberOfElements[0]];
940 for(list<int>::const_iterator iter2=listOfNode.begin();iter2!=listOfNode.end();iter2++)
942 MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY(1,numberOfElements[0],mySkyLineArrayIndex,tab,true);
943 setNumberOfGeometricType(numberOfGeometricType);
944 setGeometricType(geometricType);
945 setNumberOfGaussPoint(numberOfGaussPoint);
946 setNumberOfElements(numberOfElements);
947 setTotalNumberOfElements(numberOfElements[0]);
948 setNumber(mySkyLineArray);
950 delete[] numberOfElements;
951 delete[] numberOfGaussPoint;
952 delete[] geometricType;
956 Method created to factorize code. This method fills the current SUPPORT on entity 'entity' containing all the entities contained in
957 elements 'listOfElt' of entity 'entity'. Warning this method should be called after both the attributes this->_mesh and this->_entity are correctly set.
959 void MEDMEM::SUPPORT::fillFromElementList(const list<int>& listOfElt) throw (MEDEXCEPTION)
961 clearDataOnNumbers();
962 int size=listOfElt.size();
963 int totalNbInMesh=_mesh->getNumberOfElementsWithPoly(_entity,MED_ALL_ELEMENTS);
964 if(totalNbInMesh==size){
971 // Well, we must know how many geometric type we have found
972 int * myListArray = new int[size] ;
974 list<int>::const_iterator myElementsListIt ;
975 for (myElementsListIt=listOfElt.begin();myElementsListIt!=listOfElt.end();myElementsListIt++)
976 myListArray[id++]=(*myElementsListIt) ;
977 int numberOfGeometricType ;
978 medGeometryElement* geometricType ;
979 int * numberOfGaussPoint ;
980 int * numberOfElements ;
981 int * mySkyLineArrayIndex ;
983 int numberOfType = _mesh->getNumberOfTypesWithPoly(_entity) ;
984 if (numberOfType == 1) {
985 numberOfGeometricType = 1 ;
986 geometricType = new medGeometryElement[1] ;
987 medGeometryElement * allType = _mesh->getTypesWithPoly(_entity);
988 geometricType[0] = allType[0] ;
989 numberOfGaussPoint = new int[1] ;
990 numberOfGaussPoint[0] = 1 ;
991 numberOfElements = new int[1] ;
992 numberOfElements[0] = size ;
993 mySkyLineArrayIndex = new int[2] ;
994 mySkyLineArrayIndex[0]=1 ;
995 mySkyLineArrayIndex[1]=1+size ;
999 map<medGeometryElement,int> theType ;
1000 for (myElementsListIt=listOfElt.begin();myElementsListIt!=listOfElt.end();myElementsListIt++) {
1001 medGeometryElement myType = _mesh->getElementTypeWithPoly(_entity,*myElementsListIt) ;
1002 if (theType.find(myType) != theType.end() )
1003 theType[myType]+=1 ;
1007 numberOfGeometricType = theType.size() ;
1008 geometricType = new medGeometryElement[numberOfGeometricType] ;
1009 numberOfGaussPoint = new int[numberOfGeometricType] ;
1010 numberOfElements = new int[numberOfGeometricType] ;
1011 mySkyLineArrayIndex = new int[numberOfGeometricType+1] ;
1013 mySkyLineArrayIndex[0]=1 ;
1014 map<medGeometryElement,int>::iterator theTypeIt ;
1015 for (theTypeIt=theType.begin();theTypeIt!=theType.end();theTypeIt++) {
1016 geometricType[index] = (*theTypeIt).first ;
1017 numberOfGaussPoint[index] = 1 ;
1018 numberOfElements[index] = (*theTypeIt).second ;
1019 mySkyLineArrayIndex[index+1]=mySkyLineArrayIndex[index]+numberOfElements[index] ;
1023 MEDSKYLINEARRAY * mySkyLineArray = new MEDSKYLINEARRAY(numberOfGeometricType,size,mySkyLineArrayIndex,myListArray,true) ;
1024 setNumberOfGeometricType(numberOfGeometricType) ;
1025 setGeometricType(geometricType) ;
1026 setNumberOfGaussPoint(numberOfGaussPoint) ;
1027 setNumberOfElements(numberOfElements) ;
1028 setTotalNumberOfElements(size) ;
1029 setNumber(mySkyLineArray) ;
1031 delete[] numberOfElements;
1032 delete[] numberOfGaussPoint;
1033 delete[] geometricType;
1036 /*! set the reference _mesh to Mesh */
1037 //--------------------------------------
1038 void SUPPORT::setMesh(MESH *Mesh)
1039 //--------------------------------------
1042 _mesh->removeReference();
1045 _mesh->addReference();
1049 addReference : reference counter presently disconnected in C++ -> just connected for client.
1051 void MEDMEM::SUPPORT::addReference() const
1056 removeReference : reference counter presently disconnected in C++ -> just connected for client.
1058 void MEDMEM::SUPPORT::removeReference() const