6 #include "MEDMEM_Mesh.hxx"
7 #include "MEDMEM_Family.hxx"
9 FAMILY::FAMILY():_identifier(0), _numberOfAttribute(0),
10 _attributeIdentifier((int*)NULL),_attributeValue((int*)NULL), _attributeDescription((string*)NULL),
11 _numberOfGroup(0), _groupName((string*)NULL)
13 MESSAGE("FAMILY::FAMILY()");
16 FAMILY::FAMILY(MESH* Mesh, int Identifier, string Name, int NumberOfAttribute,
17 int *AttributeIdentifier, int *AttributeValue, string AttributeDescription,
18 int NumberOfGroup, string GroupName
19 ): SUPPORT(Mesh,Name),
20 _identifier(Identifier),
21 _numberOfAttribute(NumberOfAttribute),
22 _attributeIdentifier(AttributeIdentifier),
23 _attributeValue(AttributeValue),
24 _numberOfGroup(NumberOfGroup)
26 MESSAGE("FAMILY(int Identifier, string Name, int NumberOfAttribute,int *AttributeIdentifier,int *AttributeValue,string AttributeDescription,int NumberOfGroup,string GroupName, int ** Number) : "<<Identifier);
28 _attributeDescription=new string[_numberOfAttribute];
29 for (int i=0;i<NumberOfAttribute;i++) {
30 _attributeDescription[i].assign(AttributeDescription,i*MED_TAILLE_DESC,MED_TAILLE_DESC);
31 _attributeDescription[i].erase(strlen(_attributeDescription[i].c_str()));
32 //SCRUTE(_attributeDescription[i]);
35 _groupName=new string[_numberOfGroup];
36 for (int i=0;i<NumberOfGroup;i++) {
37 _groupName[i].assign(GroupName,i*MED_TAILLE_LNOM,MED_TAILLE_LNOM);
38 _groupName[i].erase(strlen(_groupName[i].c_str()));
39 //SCRUTE(_groupName[i]);
42 // well, we must set SUPPORT attribut
43 _description = "FAMILY" ;
44 // on which geometric type :
48 // ************************ NODES RELATED PART *************************************************
49 // Scan every node family number <NodeFamilyNumber[i]> in order to create
50 // the list <tmp_NodesList> of node numbers <i+1> belonging to the family <_identifier>
51 int NumberOfNodes = _mesh->getNumberOfNodes();
52 int NumberOfNodesInFamily = 0 ;
53 int * NodeFamilyNumber = _mesh->getMEDArrayNodeFamily() ; // EF : TEMPORAIRE !!
54 int * tmp_NodesList = new int[NumberOfNodes] ; // Un peu brutal...., oui mais ce n'est qu'un tableau de travail !
55 for (int i=0; i<NumberOfNodes; i++)
56 if ( _identifier == NodeFamilyNumber[i] ) {
57 tmp_NodesList[NumberOfNodesInFamily]=i+1 ;
58 NumberOfNodesInFamily++;
61 // If we found nodes set the family attributes adequatly
62 if (NumberOfNodesInFamily>0) {
67 _numberOfGeometricType = 1 ;
68 _geometricType = new medGeometryElement[1] ;
69 _geometricType[0]=MED_NONE ;
72 if (NumberOfNodesInFamily==NumberOfNodes)
76 _numberOfEntities = new int[1] ;
77 _numberOfEntities[0]=NumberOfNodesInFamily ;
78 _totalNumberOfEntities=NumberOfNodesInFamily;
80 _number=new MEDSKYLINEARRAY(1,NumberOfNodesInFamily) ;
81 int * NumberIndex = _number->getIndex();
82 int * NumberValue = _number->getValue();
83 NumberIndex[0]=1; //set the MEDSKYLINEARRAY Index table
84 NumberIndex[1]=1+NumberOfNodesInFamily; //set the MEDSKYLINEARRAY Index table
85 for(int i=0; i<NumberOfNodesInFamily; i++) // OH LA LA...
86 NumberValue[i]=tmp_NodesList[i] ; // RESIZE de tmp_NodesList serait plus efficace !!!!!!!!
87 // PG : pas de problème, si ca marche. Il faudra déplacer le delete !
90 delete[] tmp_NodesList ;
94 // ************************ CELLS RELATED PART *************************************************
95 // If we previously found nodes in our family don't scan the CELLS because a
96 // family contains different geometic types of only one entity type.
97 // ?? Scan every cell family number <NodeFamilyNumber[i]> in order to create
98 // ?? the list <tmp_NodesList> of node numbers <i+1> belonging to the family <_identifier>
101 // Get cell types information from <_mesh>
102 int numberOfCellTypes = _mesh->getNumberOfTypes(MED_CELL) ;
103 medGeometryElement * cellTypes = _mesh->getTypes(MED_CELL) ;
105 int * numberOfCellsInFamily = new int[numberOfCellTypes] ;
106 int numberOfCellTypesInFamily = 0 ;
108 medGeometryElement * tmp_CellsTypes = new medGeometryElement[numberOfCellTypes];
109 int ** tmp_CellsLists = new int*[numberOfCellTypes] ;
110 int * GeometricTypeNumber = new int[numberOfCellTypes] ;
111 int ** CellFamilyNumber = _mesh->getMEDArrayCellFamily(); // EF: TEMPORAIRE
112 int * GlobalNumberingIndex = _mesh->getGlobalNumberingIndex(MED_CELL);
114 // we search for all cell in this family
115 for (int cellTypeNumber=0; cellTypeNumber < numberOfCellTypes; cellTypeNumber++) {
117 int NumberOfCells = _mesh->getNumberOfElements(MED_CELL,cellTypes[cellTypeNumber]) ;
118 int NumberOfCellsInThisFamily = 0 ;
119 int * CellsOfThisFamilyNumber = CellFamilyNumber[cellTypeNumber];
120 int * tmp_CellsList = new int[NumberOfCells];
122 for (int i=0; i<NumberOfCells; i++)
123 if (_identifier == CellsOfThisFamilyNumber[i]) {
124 tmp_CellsList[NumberOfCellsInThisFamily]=i+GlobalNumberingIndex[cellTypeNumber] ;
125 NumberOfCellsInThisFamily++;
128 if (NumberOfCellsInThisFamily>0) {// we have found some cells
129 numberOfCellsInFamily[numberOfCellTypesInFamily]=NumberOfCellsInThisFamily;
130 int * CellsList=new int[NumberOfCellsInThisFamily] ;
132 for (int i=0;i<NumberOfCellsInThisFamily;i++)
133 CellsList[i]=tmp_CellsList[i] ; // RESIZE de tmp_NodesList serait plus efficace !!!!!!!!
135 tmp_CellsLists[numberOfCellTypesInFamily]=CellsList ;
136 tmp_CellsTypes[numberOfCellTypesInFamily]=cellTypes[cellTypeNumber];
137 GeometricTypeNumber[numberOfCellTypesInFamily]=cellTypeNumber+1;
138 numberOfCellTypesInFamily++;
141 delete[] tmp_CellsList ;
144 // we define all attribut in SUPPORT :
145 if (numberOfCellTypesInFamily>0) { // we have found cells
148 _numberOfGeometricType = numberOfCellTypesInFamily ;
149 _geometricType = new medGeometryElement[numberOfCellTypesInFamily] ;
150 _geometricTypeNumber = new int[numberOfCellTypesInFamily] ;
151 _isOnAllElts = false ;
152 _numberOfEntities = new int[numberOfCellTypesInFamily] ;
153 _totalNumberOfEntities=0;
154 for (int i=0; i<numberOfCellTypesInFamily; i++) {
155 _geometricType[i]=tmp_CellsTypes[i] ;
156 _geometricTypeNumber[i]=GeometricTypeNumber[i];
157 _numberOfEntities[i]=numberOfCellsInFamily[i] ;
158 _totalNumberOfEntities+=numberOfCellsInFamily[i] ;
160 delete[] numberOfCellsInFamily;
161 delete[] tmp_CellsTypes;
162 delete[] GeometricTypeNumber;
164 // family on all CELL ?
165 if (_totalNumberOfEntities==Mesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS)) {
166 _isOnAllElts = true ;
167 delete[] _numberOfEntities ;
168 _numberOfEntities=(int*)NULL;
170 _number=new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities);
171 int *NumberValue=_number->getValue();
172 int *NumberIndex=_number->getIndex();
174 for (int i=0; i<_numberOfGeometricType; i++) {
175 NumberIndex[i+1]=NumberIndex[i]+_numberOfEntities[i];
176 for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
177 NumberValue[j-1]=tmp_CellsLists[i][j-NumberIndex[i]];
178 delete[] tmp_CellsLists[i];
180 delete[] tmp_CellsLists;
186 if ((_mesh->existConnectivity(MED_NODAL,MED_FACE))|(_mesh->existConnectivity(MED_DESCENDING,MED_FACE))) {
187 int NumberOfFacesType = _mesh->getNumberOfTypes(MED_FACE) ;
188 medGeometryElement * FacesType = _mesh->getTypes(MED_FACE) ;
189 int * NumberOfFacesInFamily = new int[NumberOfFacesType] ;
190 int NumberOfFacesTypeInFamily = 0 ;
191 medGeometryElement * tmp_FacesTypes = new medGeometryElement[NumberOfFacesType];
192 int ** tmp_FacesLists = new int*[NumberOfFacesType] ;
193 int * GeometricTypeNumber = new int[NumberOfFacesType] ;
194 int ** FaceFamilyNumber = _mesh->getMEDArrayFaceFamily();
195 int * GlobalNumberingIndex = _mesh->getGlobalNumberingIndex(MED_FACE);
196 // we search all face in this family
197 for (int FaceTypeNumber=0; FaceTypeNumber<NumberOfFacesType; FaceTypeNumber++) {
198 int NumberOfThisFaces = _mesh->getNumberOfElements(MED_FACE,FacesType[FaceTypeNumber]) ;
199 int NumberOfFacesInThisFamily = 0 ;
200 int * FaceOfThisFamilyNumber = FaceFamilyNumber[FaceTypeNumber];
201 int * tmp_FacesList = new int[NumberOfThisFaces];
202 for (int i=0; i<NumberOfThisFaces; i++)
203 if (_identifier == FaceOfThisFamilyNumber[i]) {
204 tmp_FacesList[NumberOfFacesInThisFamily]=i+GlobalNumberingIndex[FaceTypeNumber] ;
205 NumberOfFacesInThisFamily++;
208 SCRUTE(NumberOfFacesInThisFamily);
211 if (NumberOfFacesInThisFamily>0) {// we have found some faces
212 NumberOfFacesInFamily[NumberOfFacesTypeInFamily]=NumberOfFacesInThisFamily;
213 int * FacesList=new int[NumberOfFacesInThisFamily] ;
214 for (int i=0;i<NumberOfFacesInThisFamily;i++)
215 FacesList[i]=tmp_FacesList[i] ;
216 tmp_FacesLists[NumberOfFacesTypeInFamily]=FacesList ;
217 tmp_FacesTypes[NumberOfFacesTypeInFamily]=FacesType[FaceTypeNumber];
218 GeometricTypeNumber[NumberOfFacesTypeInFamily]=FaceTypeNumber+1;
219 NumberOfFacesTypeInFamily++;
221 delete[] tmp_FacesList ;
223 // we define all attribut in SUPPORT :
224 if (NumberOfFacesTypeInFamily>0) { // we have found faces
227 _numberOfGeometricType = NumberOfFacesTypeInFamily ;
228 _geometricType = new medGeometryElement[NumberOfFacesTypeInFamily] ;
229 _geometricTypeNumber = new int[NumberOfFacesTypeInFamily] ;
230 _isOnAllElts = false ;
231 _numberOfEntities = new int[NumberOfFacesTypeInFamily] ;
232 _totalNumberOfEntities=0;
233 for (int i=0; i<NumberOfFacesTypeInFamily; i++) {
234 _geometricType[i]=tmp_FacesTypes[i] ;
235 _geometricTypeNumber[i]=GeometricTypeNumber[i];
236 _numberOfEntities[i]=NumberOfFacesInFamily[i] ;
237 _totalNumberOfEntities+=NumberOfFacesInFamily[i] ;
239 delete[] NumberOfFacesInFamily;
240 delete[] tmp_FacesTypes;
241 delete[] GeometricTypeNumber;
243 // family on all FACE ?
245 // we suppose family is never on all face !!!!!!!!!
246 // in all case, family is only on boundary and connectivity is partial
248 // if (_totalNumberOfEntities==Mesh->getNumberOfElements(MED_FACE,MED_ALL_ELEMENTS)) {
249 // _isOnAllElts = true ;
250 // delete[] _numberOfEntities ;
251 // _numberOfEntities=(int*)NULL;
253 _number=new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities);
254 int *NumberValue=_number->getValue();
255 int *NumberIndex=_number->getIndex();
257 for (int i=0; i<_numberOfGeometricType; i++) {
258 NumberIndex[i+1]=NumberIndex[i]+_numberOfEntities[i];
259 for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
260 NumberValue[j-1]=tmp_FacesLists[i][j-NumberIndex[i]];
261 delete[] tmp_FacesLists[i];
263 delete[] tmp_FacesLists;
270 if ((_mesh->existConnectivity(MED_NODAL,MED_EDGE))|(_mesh->existConnectivity(MED_DESCENDING,MED_EDGE))) {
271 int NumberOfEdgesType = _mesh->getNumberOfTypes(MED_EDGE) ;
272 medGeometryElement * EdgesType = _mesh->getTypes(MED_EDGE) ;
273 int * NumberOfEdgesInFamily = new int[NumberOfEdgesType] ;
274 int NumberOfEdgesTypeInFamily = 0 ;
275 medGeometryElement * tmp_EdgesTypes = new medGeometryElement[NumberOfEdgesType];
276 int ** tmp_EdgesLists = new int*[NumberOfEdgesType] ;
277 int * GeometricTypeNumber = new int[NumberOfEdgesType] ;
278 int ** EdgeFamilyNumber = _mesh->getMEDArrayEdgeFamily();
279 int * GlobalNumberingIndex = _mesh->getGlobalNumberingIndex(MED_EDGE);
280 // we search all edge in this family
281 for (int EdgeTypeNumber=0; EdgeTypeNumber<NumberOfEdgesType; EdgeTypeNumber++) {
282 int NumberOfThisEdges = _mesh->getNumberOfElements(MED_EDGE,EdgesType[EdgeTypeNumber]) ;
283 int NumberOfEdgesInThisFamily = 0 ;
284 int * EdgeOfThisFamilyNumber = EdgeFamilyNumber[EdgeTypeNumber];
285 int * tmp_EdgesList = new int[NumberOfThisEdges];
286 for (int i=0; i<NumberOfThisEdges; i++)
287 if (_identifier == EdgeOfThisFamilyNumber[i]) {
288 tmp_EdgesList[NumberOfEdgesInThisFamily]=i+GlobalNumberingIndex[EdgeTypeNumber] ;
289 NumberOfEdgesInThisFamily++;
291 if (NumberOfEdgesInThisFamily>0) {// we have found some edges
292 NumberOfEdgesInFamily[NumberOfEdgesTypeInFamily]=NumberOfEdgesInThisFamily;
293 int * EdgesList=new int[NumberOfEdgesInThisFamily] ;
294 for (int i=0;i<NumberOfEdgesInThisFamily;i++)
295 EdgesList[i]=tmp_EdgesList[i] ;
296 tmp_EdgesLists[NumberOfEdgesTypeInFamily]=EdgesList ;
297 tmp_EdgesTypes[NumberOfEdgesTypeInFamily]=EdgesType[EdgeTypeNumber];
298 GeometricTypeNumber[NumberOfEdgesTypeInFamily]=EdgeTypeNumber+1;
299 NumberOfEdgesTypeInFamily++;
301 delete[] tmp_EdgesList ;
303 // we define all attribut in SUPPORT :
304 if (NumberOfEdgesTypeInFamily>0) { // we have found edges
307 _numberOfGeometricType = NumberOfEdgesTypeInFamily ;
308 _geometricType = new medGeometryElement[NumberOfEdgesTypeInFamily] ;
309 _geometricTypeNumber = new int[NumberOfEdgesTypeInFamily] ;
310 _isOnAllElts = false ;
311 _numberOfEntities = new int[NumberOfEdgesTypeInFamily] ;
312 _totalNumberOfEntities=0;
313 for (int i=0; i<NumberOfEdgesTypeInFamily; i++) {
314 _geometricType[i]=tmp_EdgesTypes[i] ;
315 _geometricTypeNumber[i]=GeometricTypeNumber[i];
316 _numberOfEntities[i]=NumberOfEdgesInFamily[i] ;
317 _totalNumberOfEntities+=NumberOfEdgesInFamily[i] ;
319 delete[] NumberOfEdgesInFamily;
320 delete[] tmp_EdgesTypes;
321 delete[] GeometricTypeNumber;
323 // family on all EDGE ?
325 // we suppose family is never on all edge !!!!!!!!!
326 // in all case, family is only on boundary and connectivity is partial
328 // if (_totalNumberOfEntities==Mesh->getNumberOfElements(MED_EDGE,MED_ALL_ELEMENTS)) {
329 // _isOnAllElts = true ;
330 // delete[] _numberOfEntities ;
331 // _numberOfEntities=(int*)NULL;
333 _number=new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities);
334 int *NumberValue=_number->getValue();
335 int *NumberIndex=_number->getIndex();
337 for (int i=0; i<_numberOfGeometricType; i++) {
338 NumberIndex[i+1]=NumberIndex[i]+_numberOfEntities[i];
339 for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
340 NumberValue[j-1]=tmp_EdgesLists[i][j-NumberIndex[i]];
341 delete[] tmp_EdgesLists[i];
343 delete[] tmp_EdgesLists;
349 // if not find : no entity in familly !!!
351 _numberOfGeometricType = 0 ;
352 _isOnAllElts = false ;
353 MESSAGE ("FAMILY() : No entity found !") ;
354 } else { // set gauss point number to be equal one !
355 _numberOfGaussPoint = new int[_numberOfGeometricType] ;
356 for (int i=0; i<_numberOfGeometricType; i++)
357 _numberOfGaussPoint[i]=1 ;
363 MESSAGE("~FAMILY()");
364 if(_attributeIdentifier!=NULL)
365 delete[] _attributeIdentifier;
366 if(_attributeValue!=NULL)
367 delete[] _attributeValue;
368 if(_attributeDescription!=NULL)
369 delete[] _attributeDescription;
374 FAMILY & FAMILY::operator=(const FAMILY &fam)
376 MESSAGE("FAMILY::operator=");
377 _identifier = fam._identifier;
378 _numberOfAttribute = fam._numberOfAttribute;
379 _attributeIdentifier = fam._attributeIdentifier;
380 _attributeValue = fam._attributeValue;
381 _attributeDescription = fam._attributeDescription;
382 _numberOfGroup = fam._numberOfGroup;
383 _groupName = fam._groupName;