Salome HOME
update from the MedMemory V1.0.1
[modules/med.git] / src / MEDMEM / MEDMEM_Family.cxx
index 9264613a8bf6e7d127133db17861f77077041f5b..45d647b2f11f81b3eb7f243e449a81ac5d3485f2 100644 (file)
@@ -1,3 +1,4 @@
+using namespace std;
 /*
  File MEDMEM_Family.cxx
  $Header$
@@ -15,16 +16,25 @@ FAMILY::FAMILY():_identifier(0), _numberOfAttribute(0),
 
 FAMILY::FAMILY(MESH* Mesh, int Identifier, string Name, int NumberOfAttribute,
                int *AttributeIdentifier, int *AttributeValue, string AttributeDescription,
-               int NumberOfGroup, string GroupName
+               int NumberOfGroup, string GroupName,
+              int * MEDArrayNodeFamily,
+              int ** MEDArrayCellFamily,
+              int ** MEDArrayFaceFamily,
+              int ** MEDArrayEdgeFamily
               ): SUPPORT(Mesh,Name),
                  _identifier(Identifier), 
                  _numberOfAttribute(NumberOfAttribute), 
-                 _attributeIdentifier(AttributeIdentifier),
-                 _attributeValue(AttributeValue),
                  _numberOfGroup(NumberOfGroup)
 {
   MESSAGE("FAMILY(int Identifier, string Name, int NumberOfAttribute,int *AttributeIdentifier,int *AttributeValue,string AttributeDescription,int NumberOfGroup,string GroupName, int ** Number) : "<<Identifier);
 
+  _isOnAllElts = false ;
+  // replace them by pointerOf ?
+  _attributeIdentifier = new int[_numberOfAttribute] ;
+  memcpy(_attributeIdentifier,AttributeIdentifier,_numberOfAttribute*sizeof(int));
+  _attributeValue = new int[_numberOfAttribute] ;
+  memcpy(_attributeValue,AttributeValue,_numberOfAttribute*sizeof(int));
+
   _attributeDescription=new string[_numberOfAttribute];
   for (int i=0;i<NumberOfAttribute;i++) {
     _attributeDescription[i].assign(AttributeDescription,i*MED_TAILLE_DESC,MED_TAILLE_DESC);
@@ -50,41 +60,55 @@ FAMILY::FAMILY(MESH* Mesh, int Identifier, string Name, int NumberOfAttribute,
   // the list <tmp_NodesList> of node numbers <i+1> belonging to the family <_identifier>
   int NumberOfNodes         = _mesh->getNumberOfNodes();
   int NumberOfNodesInFamily = 0 ;
-  int * NodeFamilyNumber    = _mesh->getMEDArrayNodeFamily() ;   // EF : TEMPORAIRE !!
+  //int * NodeFamilyNumber    = _mesh->getMEDArrayNodeFamily() ;   // EF : TEMPORAIRE !!
   int * tmp_NodesList       = new int[NumberOfNodes] ;           // Un peu brutal...., oui mais ce n'est qu'un tableau de travail !
   for (int i=0; i<NumberOfNodes; i++)
-    if ( _identifier == NodeFamilyNumber[i] ) {
+    if ( _identifier == MEDArrayNodeFamily[i] ) {
       tmp_NodesList[NumberOfNodesInFamily]=i+1 ;
       NumberOfNodesInFamily++;
     }
-  
+  //SCRUTE(NumberOfNodesInFamily);
+
   // If we found nodes set the family attributes adequatly
   if (NumberOfNodesInFamily>0) {
     
     Find = true ;
     
     _entity = MED_NODE ;
-    _numberOfGeometricType = 1 ;
-    _geometricType = new medGeometryElement[1] ;
-    _geometricType[0]=MED_NONE ;
+//      _numberOfGeometricType = 1 ;
+//      _geometricType = new medGeometryElement[1] ;
+//      _geometricType[0]=MED_NONE ;
     
     // family on all NODE
-    if (NumberOfNodesInFamily==NumberOfNodes)
+    if (NumberOfNodesInFamily==NumberOfNodes) {
       _isOnAllElts = true ;
-    else {
+      update();
+    } else {
+      _numberOfGeometricType = 1 ;
+      if (_geometricType!=NULL) delete[] _geometricType ;
+      _geometricType = new medGeometryElement[1] ;
+      _geometricType[0]=MED_NONE ;
       _isOnAllElts= false ;
-      _numberOfEntities = new int[1] ;
-      _numberOfEntities[0]=NumberOfNodesInFamily ;
-      _totalNumberOfEntities=NumberOfNodesInFamily;
+      if (_numberOfElements!=NULL) delete[] _numberOfElements ;
+      _numberOfElements = new int[1] ;
+      _numberOfElements[0]=NumberOfNodesInFamily ;
+      _totalNumberOfElements=NumberOfNodesInFamily;
       
-      _number=new MEDSKYLINEARRAY(1,NumberOfNodesInFamily) ;
-      int * NumberIndex = _number->getIndex();
-      int * NumberValue = _number->getValue();
+//        _number=new MEDSKYLINEARRAY(1,NumberOfNodesInFamily) ;
+//        int * NumberIndex = _number->getIndex();
+//        int * NumberValue = _number->getValue();
+      int * NumberIndex = new int[2];
+      int * NumberValue = new int[NumberOfNodesInFamily];
+
       NumberIndex[0]=1;                          //set the MEDSKYLINEARRAY Index table
       NumberIndex[1]=1+NumberOfNodesInFamily;    //set the MEDSKYLINEARRAY Index table
       for(int i=0; i<NumberOfNodesInFamily; i++) // OH LA LA... 
        NumberValue[i]=tmp_NodesList[i] ;        // RESIZE de tmp_NodesList serait plus efficace !!!!!!!!
       // PG : pas de problème, si ca marche. Il faudra déplacer le delete !
+      if(_number!=NULL) delete _number ;
+      _number=new MEDSKYLINEARRAY(1,NumberOfNodesInFamily,NumberIndex,NumberValue) ;
+      delete[] NumberIndex ;
+      delete[] NumberValue ;
     }
   }
   delete[] tmp_NodesList ;
@@ -97,253 +121,21 @@ FAMILY::FAMILY(MESH* Mesh, int Identifier, string Name, int NumberOfAttribute,
   // ?? Scan every cell family number <NodeFamilyNumber[i]> in order to create 
   // ?? the list <tmp_NodesList> of node numbers <i+1> belonging to the family <_identifier>
   if (!Find) {
-
-    // Get cell types information from <_mesh>
-    int    numberOfCellTypes             = _mesh->getNumberOfTypes(MED_CELL) ;
-    medGeometryElement * cellTypes       = _mesh->getTypes(MED_CELL) ;
-  
-    int *  numberOfCellsInFamily         = new int[numberOfCellTypes] ;
-    int    numberOfCellTypesInFamily     = 0 ;
-    
-    medGeometryElement * tmp_CellsTypes  = new medGeometryElement[numberOfCellTypes];
-    int ** tmp_CellsLists                = new int*[numberOfCellTypes] ;
-    int *  GeometricTypeNumber           = new int[numberOfCellTypes] ;
-    int ** CellFamilyNumber              = _mesh->getMEDArrayCellFamily();             // EF:  TEMPORAIRE
-    int *  GlobalNumberingIndex          = _mesh->getGlobalNumberingIndex(MED_CELL);
-    
-    // we search for all cell in this family  
-    for (int cellTypeNumber=0; cellTypeNumber < numberOfCellTypes; cellTypeNumber++) {
-      
-      int NumberOfCells             = _mesh->getNumberOfElements(MED_CELL,cellTypes[cellTypeNumber]) ;
-      int NumberOfCellsInThisFamily = 0 ;
-      int * CellsOfThisFamilyNumber = CellFamilyNumber[cellTypeNumber];
-      int * tmp_CellsList           = new int[NumberOfCells];
-      
-      for (int i=0; i<NumberOfCells; i++)
-       if (_identifier == CellsOfThisFamilyNumber[i]) {
-         tmp_CellsList[NumberOfCellsInThisFamily]=i+GlobalNumberingIndex[cellTypeNumber] ;
-         NumberOfCellsInThisFamily++;
-       }
-      
-      if (NumberOfCellsInThisFamily>0) {// we have found some cells
-       numberOfCellsInFamily[numberOfCellTypesInFamily]=NumberOfCellsInThisFamily;
-       int * CellsList=new int[NumberOfCellsInThisFamily] ;
-       
-        for (int i=0;i<NumberOfCellsInThisFamily;i++)
-         CellsList[i]=tmp_CellsList[i] ;                         // RESIZE de tmp_NodesList serait plus efficace !!!!!!!!
-       
-        tmp_CellsLists[numberOfCellTypesInFamily]=CellsList ;
-       tmp_CellsTypes[numberOfCellTypesInFamily]=cellTypes[cellTypeNumber];
-       GeometricTypeNumber[numberOfCellTypesInFamily]=cellTypeNumber+1;
-       numberOfCellTypesInFamily++;
-      }
-     
-      delete[] tmp_CellsList ;
-    }
-    
-    // we define all attribut in SUPPORT :
-    if (numberOfCellTypesInFamily>0) { // we have found cells
-      Find = true ;
-      _entity = MED_CELL ;
-      _numberOfGeometricType = numberOfCellTypesInFamily ;
-      _geometricType = new medGeometryElement[numberOfCellTypesInFamily] ;
-      _geometricTypeNumber = new int[numberOfCellTypesInFamily] ;
-      _isOnAllElts = false ;
-      _numberOfEntities = new int[numberOfCellTypesInFamily] ;
-      _totalNumberOfEntities=0;
-      for (int i=0; i<numberOfCellTypesInFamily; i++) {
-       _geometricType[i]=tmp_CellsTypes[i] ;
-       _geometricTypeNumber[i]=GeometricTypeNumber[i];
-       _numberOfEntities[i]=numberOfCellsInFamily[i] ;
-       _totalNumberOfEntities+=numberOfCellsInFamily[i] ;
-      }
-      delete[] numberOfCellsInFamily;
-      delete[] tmp_CellsTypes;
-      delete[] GeometricTypeNumber;
-      
-      // family on all CELL ?
-      if (_totalNumberOfEntities==Mesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS)) {
-       _isOnAllElts = true ;
-       delete[] _numberOfEntities ;
-       _numberOfEntities=(int*)NULL;
-      } else {
-       _number=new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities);
-       int *NumberValue=_number->getValue();
-       int *NumberIndex=_number->getIndex();
-       NumberIndex[0]=1;
-       for (int i=0; i<_numberOfGeometricType; i++) {
-         NumberIndex[i+1]=NumberIndex[i]+_numberOfEntities[i];
-         for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
-           NumberValue[j-1]=tmp_CellsLists[i][j-NumberIndex[i]];
-         delete[] tmp_CellsLists[i];
-       }
-       delete[] tmp_CellsLists;
-      }
-    }
+    Find = build(MED_CELL,MEDArrayCellFamily) ;
   }
   // on face ?
-  if (!Find) 
+  if (!Find) {
     if ((_mesh->existConnectivity(MED_NODAL,MED_FACE))|(_mesh->existConnectivity(MED_DESCENDING,MED_FACE))) {
-      int NumberOfFacesType = _mesh->getNumberOfTypes(MED_FACE) ;
-      medGeometryElement * FacesType = _mesh->getTypes(MED_FACE) ;
-      int * NumberOfFacesInFamily = new int[NumberOfFacesType] ;
-      int NumberOfFacesTypeInFamily = 0 ;
-      medGeometryElement * tmp_FacesTypes = new medGeometryElement[NumberOfFacesType];
-      int ** tmp_FacesLists = new int*[NumberOfFacesType] ;
-      int * GeometricTypeNumber = new int[NumberOfFacesType] ;
-      int ** FaceFamilyNumber = _mesh->getMEDArrayFaceFamily();
-      int * GlobalNumberingIndex = _mesh->getGlobalNumberingIndex(MED_FACE);
-      // we search all face in this family
-      for (int FaceTypeNumber=0; FaceTypeNumber<NumberOfFacesType; FaceTypeNumber++) {
-       int NumberOfThisFaces = _mesh->getNumberOfElements(MED_FACE,FacesType[FaceTypeNumber]) ;
-       int NumberOfFacesInThisFamily = 0 ;
-       int * FaceOfThisFamilyNumber = FaceFamilyNumber[FaceTypeNumber];
-       int * tmp_FacesList = new int[NumberOfThisFaces];
-       for (int i=0; i<NumberOfThisFaces; i++)
-         if (_identifier == FaceOfThisFamilyNumber[i]) {
-           tmp_FacesList[NumberOfFacesInThisFamily]=i+GlobalNumberingIndex[FaceTypeNumber] ;
-           NumberOfFacesInThisFamily++;
-           
-           SCRUTE(i);
-           SCRUTE(NumberOfFacesInThisFamily);
-
-         }
-       if (NumberOfFacesInThisFamily>0) {// we have found some faces
-         NumberOfFacesInFamily[NumberOfFacesTypeInFamily]=NumberOfFacesInThisFamily;
-         int * FacesList=new int[NumberOfFacesInThisFamily] ;
-         for (int i=0;i<NumberOfFacesInThisFamily;i++)
-           FacesList[i]=tmp_FacesList[i] ;
-         tmp_FacesLists[NumberOfFacesTypeInFamily]=FacesList ;
-         tmp_FacesTypes[NumberOfFacesTypeInFamily]=FacesType[FaceTypeNumber];
-         GeometricTypeNumber[NumberOfFacesTypeInFamily]=FaceTypeNumber+1;
-         NumberOfFacesTypeInFamily++;
-       }
-       delete[] tmp_FacesList ;
-      }
-      // we define all attribut in SUPPORT :
-      if (NumberOfFacesTypeInFamily>0) { // we have found faces
-       Find = true ;
-       _entity = MED_FACE ;
-       _numberOfGeometricType = NumberOfFacesTypeInFamily ;
-       _geometricType = new medGeometryElement[NumberOfFacesTypeInFamily] ;
-       _geometricTypeNumber = new int[NumberOfFacesTypeInFamily] ;
-       _isOnAllElts = false ;
-       _numberOfEntities = new int[NumberOfFacesTypeInFamily] ;
-       _totalNumberOfEntities=0;
-       for (int i=0; i<NumberOfFacesTypeInFamily; i++) {
-         _geometricType[i]=tmp_FacesTypes[i] ;
-         _geometricTypeNumber[i]=GeometricTypeNumber[i];
-         _numberOfEntities[i]=NumberOfFacesInFamily[i] ;
-         _totalNumberOfEntities+=NumberOfFacesInFamily[i] ;
-       }
-       delete[] NumberOfFacesInFamily;
-       delete[] tmp_FacesTypes;
-       delete[] GeometricTypeNumber;
-      
-       // family on all FACE ?
-
-       // we suppose family is never on all face !!!!!!!!!
-       // in all case, family is only on boundary and connectivity is partial
-
-//     if (_totalNumberOfEntities==Mesh->getNumberOfElements(MED_FACE,MED_ALL_ELEMENTS)) {
-//       _isOnAllElts = true ;
-//       delete[] _numberOfEntities ;
-//       _numberOfEntities=(int*)NULL;
-//     } else {
-         _number=new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities);
-         int *NumberValue=_number->getValue();
-         int *NumberIndex=_number->getIndex();
-         NumberIndex[0]=1;
-         for (int i=0; i<_numberOfGeometricType; i++) {
-           NumberIndex[i+1]=NumberIndex[i]+_numberOfEntities[i];
-           for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
-             NumberValue[j-1]=tmp_FacesLists[i][j-NumberIndex[i]];
-           delete[] tmp_FacesLists[i];
-         }
-         delete[] tmp_FacesLists;
-//     }
-      }
+      Find = build(MED_FACE,MEDArrayFaceFamily) ;
     }
+  }
   
   // on edge ?
-  if (!Find) 
+  if (!Find) {
     if ((_mesh->existConnectivity(MED_NODAL,MED_EDGE))|(_mesh->existConnectivity(MED_DESCENDING,MED_EDGE))) {
-      int NumberOfEdgesType = _mesh->getNumberOfTypes(MED_EDGE) ;
-      medGeometryElement * EdgesType = _mesh->getTypes(MED_EDGE) ;
-      int * NumberOfEdgesInFamily = new int[NumberOfEdgesType] ;
-      int NumberOfEdgesTypeInFamily = 0 ;
-      medGeometryElement * tmp_EdgesTypes = new medGeometryElement[NumberOfEdgesType];
-      int ** tmp_EdgesLists = new int*[NumberOfEdgesType] ;
-      int * GeometricTypeNumber = new int[NumberOfEdgesType] ;
-      int ** EdgeFamilyNumber = _mesh->getMEDArrayEdgeFamily();
-      int * GlobalNumberingIndex = _mesh->getGlobalNumberingIndex(MED_EDGE);
-      // we search all edge in this family
-      for (int EdgeTypeNumber=0; EdgeTypeNumber<NumberOfEdgesType; EdgeTypeNumber++) {
-       int NumberOfThisEdges = _mesh->getNumberOfElements(MED_EDGE,EdgesType[EdgeTypeNumber]) ;
-       int NumberOfEdgesInThisFamily = 0 ;
-       int * EdgeOfThisFamilyNumber = EdgeFamilyNumber[EdgeTypeNumber];
-       int * tmp_EdgesList = new int[NumberOfThisEdges];
-       for (int i=0; i<NumberOfThisEdges; i++)
-         if (_identifier == EdgeOfThisFamilyNumber[i]) {
-           tmp_EdgesList[NumberOfEdgesInThisFamily]=i+GlobalNumberingIndex[EdgeTypeNumber] ;
-           NumberOfEdgesInThisFamily++;
-         }
-       if (NumberOfEdgesInThisFamily>0) {// we have found some edges
-         NumberOfEdgesInFamily[NumberOfEdgesTypeInFamily]=NumberOfEdgesInThisFamily;
-         int * EdgesList=new int[NumberOfEdgesInThisFamily] ;
-         for (int i=0;i<NumberOfEdgesInThisFamily;i++)
-           EdgesList[i]=tmp_EdgesList[i] ;
-         tmp_EdgesLists[NumberOfEdgesTypeInFamily]=EdgesList ;
-         tmp_EdgesTypes[NumberOfEdgesTypeInFamily]=EdgesType[EdgeTypeNumber];
-         GeometricTypeNumber[NumberOfEdgesTypeInFamily]=EdgeTypeNumber+1;
-         NumberOfEdgesTypeInFamily++;
-       }
-       delete[] tmp_EdgesList ;
-      }
-      // we define all attribut in SUPPORT :
-      if (NumberOfEdgesTypeInFamily>0) { // we have found edges
-       Find = true ;
-       _entity = MED_EDGE ;
-       _numberOfGeometricType = NumberOfEdgesTypeInFamily ;
-       _geometricType = new medGeometryElement[NumberOfEdgesTypeInFamily] ;
-       _geometricTypeNumber = new int[NumberOfEdgesTypeInFamily] ;
-       _isOnAllElts = false ;
-       _numberOfEntities = new int[NumberOfEdgesTypeInFamily] ;
-       _totalNumberOfEntities=0;
-       for (int i=0; i<NumberOfEdgesTypeInFamily; i++) {
-         _geometricType[i]=tmp_EdgesTypes[i] ;
-         _geometricTypeNumber[i]=GeometricTypeNumber[i];
-         _numberOfEntities[i]=NumberOfEdgesInFamily[i] ;
-         _totalNumberOfEntities+=NumberOfEdgesInFamily[i] ;
-       }
-       delete[] NumberOfEdgesInFamily;
-       delete[] tmp_EdgesTypes;
-       delete[] GeometricTypeNumber;
-      
-       // family on all EDGE ?
-
-       // we suppose family is never on all edge !!!!!!!!!
-       // in all case, family is only on boundary and connectivity is partial
-
-//     if (_totalNumberOfEntities==Mesh->getNumberOfElements(MED_EDGE,MED_ALL_ELEMENTS)) {
-//       _isOnAllElts = true ;
-//       delete[] _numberOfEntities ;
-//       _numberOfEntities=(int*)NULL;
-//     } else {
-         _number=new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities);
-         int *NumberValue=_number->getValue();
-         int *NumberIndex=_number->getIndex();
-         NumberIndex[0]=1;
-         for (int i=0; i<_numberOfGeometricType; i++) {
-           NumberIndex[i+1]=NumberIndex[i]+_numberOfEntities[i];
-           for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
-             NumberValue[j-1]=tmp_EdgesLists[i][j-NumberIndex[i]];
-           delete[] tmp_EdgesLists[i];
-         }
-         delete[] tmp_EdgesLists;
-//     }
-      }
+      Find = build(MED_EDGE,MEDArrayEdgeFamily) ;
     }
+  }
   // That's all !
 
   // if not find : no entity in familly !!!
@@ -351,11 +143,64 @@ FAMILY::FAMILY(MESH* Mesh, int Identifier, string Name, int NumberOfAttribute,
     _numberOfGeometricType = 0 ;
     _isOnAllElts = false ;
     MESSAGE ("FAMILY() : No entity found !") ;
-  } else { // set gauss point number to be equal one !
-    _numberOfGaussPoint = new int[_numberOfGeometricType] ;
-    for (int i=0; i<_numberOfGeometricType; i++)
-      _numberOfGaussPoint[i]=1 ;
-  }
+  } 
+  // already done by support !!!!
+//    else { // set gauss point number to be equal one !
+//      _numberOfGaussPoint = new int[_numberOfGeometricType] ;
+//      for (int i=0; i<_numberOfGeometricType; i++)
+//        _numberOfGaussPoint[i]=1 ;
+//    }
+};
+
+FAMILY::FAMILY(const FAMILY & m):SUPPORT(m)
+{
+  MESSAGE("FAMILY::FAMILY(FAMILY & m)");
+  _identifier = m._identifier;
+  _numberOfAttribute = m._numberOfAttribute;
+  if (m._attributeIdentifier != NULL)
+    {
+      _attributeIdentifier = new int[m._numberOfAttribute];
+      memcpy(_attributeIdentifier,m._attributeIdentifier,m._numberOfAttribute*sizeof(int));
+    }
+  else
+    _attributeIdentifier = (int *) NULL;
+  if (m._attributeValue != NULL)
+    {
+      _attributeValue = new int[m._numberOfAttribute];
+      memcpy(_attributeValue,m._attributeValue,m._numberOfAttribute*sizeof(int));
+    }
+  else
+    _attributeValue = (int *) NULL;
+  if (m._attributeDescription != NULL)
+    {
+      _attributeDescription = new string[m._numberOfAttribute];
+      for (int i=0;i<m._numberOfAttribute;i++)
+       _attributeDescription[i] = m._attributeDescription[i];
+    }
+  else
+    _attributeDescription = (string *) NULL;
+  _numberOfGroup = m._numberOfGroup;
+  if (m._groupName != NULL)
+    {
+      _groupName = new string[m._numberOfGroup];
+      for (int i=0;i<m._numberOfGroup;i++)
+       _groupName[i]=m._groupName[i];
+    }
+  else
+    _groupName = (string *) NULL;
+};
+
+FAMILY::FAMILY(const SUPPORT & s):SUPPORT(s)
+{
+  MESSAGE("FAMILY::FAMILY(const SUPPORT & s)");
+
+  _identifier = 0;
+  _numberOfAttribute = 0;
+  _attributeIdentifier = (int*) NULL;
+  _attributeValue = (int*) NULL;
+  _attributeDescription = (string*) NULL;
+  _numberOfGroup = 0;
+  _groupName= (string*) NULL;
 };
 
 FAMILY::~FAMILY() 
@@ -383,3 +228,125 @@ FAMILY & FAMILY::operator=(const FAMILY &fam)
     _groupName = fam._groupName;
     return *this;
 };
+
+ostream & operator<<(ostream &os, FAMILY &myFamily)
+{
+  // how do cast without duplicate ?
+  os << (SUPPORT) myFamily;
+
+  os << "  - Identifier : "<<myFamily.getIdentifier()<<endl;
+  int numberofattributes = myFamily.getNumberOfAttributes();
+  os << "  - Attributes ("<<numberofattributes<<") :"<<endl;
+  for (int j=1;j<numberofattributes+1;j++)
+    os << "    * "<<myFamily.getAttributeIdentifier(j)<<" : "<<myFamily.getAttributeValue(j)<<", "<<myFamily.getAttributeDescription(j).c_str()<<endl;
+  int numberofgroups = myFamily.getNumberOfGroups();
+  os << "  - Groups ("<<numberofgroups<<") :"<<endl;
+  for (int j=1;j<numberofgroups+1;j++)
+    os << "    * "<<myFamily.getGroupName(j).c_str()<<endl ;
+
+  return os;
+};
+
+bool FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)
+{
+  MESSAGE("FAMILY::build(medEntityMesh Entity,int **FamilyNumber /* from MED file */)");
+  bool Find = false ;
+  // Get types information from <_mesh>
+  int    numberOfTypes             = _mesh->getNumberOfTypes(Entity) ;
+  const medGeometryElement * types       = _mesh->getTypes(Entity) ;
+  
+  int *  numberOfElementsInFamily         = new int[numberOfTypes] ;
+  int    numberOfElementTypesInFamily     = 0 ;
+  
+  medGeometryElement * tmp_Types  = new medGeometryElement[numberOfTypes];
+  int ** tmp_ElementsLists                = new int*[numberOfTypes] ;
+  //  int *  GeometricTypeNumber           = new int[numberOfTypes] ;
+  const int *  GlobalNumberingIndex          = _mesh->getGlobalNumberingIndex(Entity);
+  
+  // we search for all elements in this family
+  for (int TypeNumber=0; TypeNumber < numberOfTypes; TypeNumber++) {
+    
+    int NumberOfElements             = _mesh->getNumberOfElements(Entity,types[TypeNumber]) ;
+    int NumberOfElementsInThisFamily = 0 ;
+    int * ElementsOfThisFamilyNumber = FamilyNumber[TypeNumber];
+    int * tmp_ElementsList           = new int[NumberOfElements];
+      
+    for (int i=0; i<NumberOfElements; i++)
+      if (_identifier == ElementsOfThisFamilyNumber[i]) {
+       tmp_ElementsList[NumberOfElementsInThisFamily]=i+GlobalNumberingIndex[TypeNumber] ;
+       NumberOfElementsInThisFamily++;
+      }
+    
+    if (NumberOfElementsInThisFamily>0) {// we have found some elements
+      numberOfElementsInFamily[numberOfElementTypesInFamily]=NumberOfElementsInThisFamily;
+
+      //int * ElementsList = tmp_ElementsList.resize(NumberOfElementsInThisFamily);
+      int * ElementsList = new int[NumberOfElementsInThisFamily] ;
+      memcpy(ElementsList,tmp_ElementsList,sizeof(int)*NumberOfElementsInThisFamily); // RESIZE de tmp_NodesList serait plus efficace !!!!!!!!
+       
+      tmp_ElementsLists[numberOfElementTypesInFamily]=ElementsList ;
+      tmp_Types[numberOfElementTypesInFamily]=types[TypeNumber];
+      //      GeometricTypeNumber[numberOfElementTypesInFamily]=TypeNumber+1;
+      numberOfElementTypesInFamily++;
+      //      delete [] ElementsList;
+    }
+    delete[] tmp_ElementsList;
+  }
+  
+  // we define all attribut in SUPPORT :
+  if (numberOfElementTypesInFamily>0) { // we have found elements
+    Find = true ;
+    _entity = Entity ;
+    _numberOfGeometricType = numberOfElementTypesInFamily ;
+    if (_geometricType!=NULL) delete[] _geometricType ;
+    _geometricType = new medGeometryElement[numberOfElementTypesInFamily] ;
+    _isOnAllElts = false ;
+    if (_numberOfElements!=NULL) delete[] _numberOfElements ;
+    _numberOfElements = new int[numberOfElementTypesInFamily] ;
+    _totalNumberOfElements=0;
+
+    //_numberOfGaussPoint = new int[numberOfElementTypesInFamily] ;
+
+    //int * numberIndex = new int[numberOfElementTypesInFamily+1];
+    //numberIndex[0]=1;
+    for (int i=0; i<numberOfElementTypesInFamily; i++) {
+      _geometricType[i]=tmp_Types[i] ;
+      //numberIndex[i+1]=numberIndex[i]+numberOfElementsInFamily[i];
+      _numberOfElements[i]=numberOfElementsInFamily[i]; // plutot un resize !!
+      _totalNumberOfElements+=_numberOfElements[i];
+      //_numberOfGaussPoint[i]=1;
+    }
+    //    delete[] numberOfElementsInFamily;
+    //    delete[] tmp_Types;
+    //    delete[] GeometricTypeNumber;
+      
+    // family on all ELEMENT ?
+    if (_totalNumberOfElements == _mesh->getNumberOfElements(Entity,MED_ALL_ELEMENTS)) {
+      _isOnAllElts = true ;
+      // all others attributs are rights !
+      for (int i=0; i<_numberOfGeometricType; i++)
+       delete[] tmp_ElementsLists[i];
+    } else {
+      int *NumberValue = new int[_totalNumberOfElements];
+      int *NumberIndex = new int[_numberOfGeometricType+1];
+      NumberIndex[0]=1;
+      for (int i=0; i<_numberOfGeometricType; i++) {
+       NumberIndex[i+1]=NumberIndex[i]+_numberOfElements[i];
+       for (int j=NumberIndex[i]; j<NumberIndex[i+1]; j++)
+         NumberValue[j-1]=tmp_ElementsLists[i][j-NumberIndex[i]];
+       delete[] tmp_ElementsLists[i];
+      }
+      if(_number!=NULL) delete _number ;
+      _number = new MEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfElements,NumberIndex,NumberValue);
+      delete[] NumberIndex ;
+      delete[] NumberValue ;
+    }
+  }
+  delete[] tmp_Types;
+  delete[] numberOfElementsInFamily;
+
+  delete[] tmp_ElementsLists;
+
+  return Find ;
+}
+