Salome HOME
Merging with the MAN_SALOME2 branch
[modules/med.git] / src / MEDMEM / MEDMEM_Group.cxx
1 using namespace std;
2 /*
3  File Group.cxx
4  $Header$
5 */
6 #include <list>
7
8 #include "MEDMEM_Group.hxx"
9 #include "MEDMEM_Family.hxx"
10 using namespace MEDMEM;
11
12 GROUP::GROUP():_numberOfFamilies(0),_family() 
13 {
14   MESSAGE("GROUP()");
15 };
16
17 GROUP::~GROUP() 
18 {
19   MESSAGE("~GROUP()");
20 };
21   
22 GROUP & GROUP::operator=(const GROUP &group) 
23 {
24   MESSAGE("GROUP::operator=");
25   _numberOfFamilies = group._numberOfFamilies ;
26   _family           = group._family ;
27   return *this;
28 };
29
30 ostream & MEDMEM::operator<<(ostream &os, GROUP &myGroup)
31 {
32   os << (SUPPORT) myGroup;
33
34   int numberoffamilies = myGroup.getNumberOfFamilies();
35   os << "  - Families ("<<numberoffamilies<<") :"<<endl;
36   for (int j=1;j<numberoffamilies+1;j++)
37     os << "    * "<<myGroup.getFamily(j)->getName().c_str()<<endl ;
38
39   return os;
40 };
41
42 GROUP::GROUP(const string & name, const list<FAMILY*> & families) throw (MEDEXCEPTION)
43 {
44   const char * LOC = "GROUP( const string & , const list<FAMILY*> & ) : " ;
45   
46   BEGIN_OF(LOC);
47
48   MESSAGE(LOC<<name);
49
50   int numberOfFamilies = families.size();
51   _name = name ;
52   // description : none !
53   // first FAMILY to set all !
54   FAMILY * myFamily = families.front() ;
55   _mesh =  myFamily->getMesh() ;
56   _entity = myFamily->getEntity() ;
57   bool isOnAllElts = myFamily->isOnAllElements() ;
58
59   SCRUTE(isOnAllElts);
60   SCRUTE(numberOfFamilies);
61
62
63   if ((numberOfFamilies==1)&(isOnAllElts))
64     {
65       _numberOfFamilies = numberOfFamilies;
66       _isOnAllElts = isOnAllElts ;
67       _family.resize(_numberOfFamilies) ;
68       _family[0] = myFamily;
69       update();
70       return;
71     }
72   else if ((!(numberOfFamilies==1))&(isOnAllElts))
73     throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "building of a GROUP object from several FAMILY, and one of them is on all entities"  )) ;
74
75   _numberOfGeometricType = myFamily->getNumberOfTypes() ;
76   _geometricType = new medGeometryElement[_numberOfGeometricType];
77   //_geometricTypeNumber = new int[_numberOfGeometricType] ;
78   _numberOfGaussPoint = new int[_numberOfGeometricType] ;
79   _numberOfElements = new int[_numberOfGeometricType] ;
80   const medGeometryElement * geometricType = myFamily->getTypes() ;
81   //int * geometricTypeNumber = myFamily->getGeometricTypeNumber() ;
82   const int * numberOfGaussPoint = myFamily->getNumberOfGaussPoint() ;
83
84   SCRUTE(_numberOfGeometricType);
85
86   for (int i=0 ; i<_numberOfGeometricType; i++) {
87     _geometricType[i]= geometricType[i] ;
88     // _geometricTypeNumber[i] = geometricTypeNumber[i] ;
89     _numberOfGaussPoint[i] = numberOfGaussPoint[i] ;
90     _numberOfElements[i]=myFamily->getNumberOfElements(geometricType[i]);
91     MESSAGE(LOC << " Type : " << _geometricType[i] << " number of element(s) " << _numberOfElements[i]);
92   }
93   _isOnAllElts = false ;
94   //_totalNumberOfEntities = myFamily->getNumberOfElements(MED_ALL_ELEMENTS) ;
95   _number = new MEDSKYLINEARRAY(*myFamily->getnumber()) ;
96
97   _numberOfFamilies = families.size();
98   _family.resize(_numberOfFamilies) ;
99   list<FAMILY*>::const_iterator li ;
100
101   MESSAGE(LOC<<"Printing of the object GROUP built right before the blending"<< (SUPPORT) *this);
102
103
104   int it = 0 ;
105   for (li=families.begin();li!=families.end();li++) {
106     blending(*li);
107     _family[it] = (*li) ;
108     it++ ;
109   }
110
111   MESSAGE(LOC<<"Printing of the object GROUP built "<< (GROUP)*this);
112
113   END_OF(LOC);
114 };
115
116 GROUP::GROUP(const GROUP & m):SUPPORT(m)
117 {
118   _numberOfFamilies = m._numberOfFamilies;
119   _family = m._family;
120 };
121
122 // void GROUP::init(const list<FAMILY*> & families)
123 // {
124 //   const char * LOC = "GROUP::init( const list<FAMILY*> & ) : " ;
125   
126 //   BEGIN_OF(LOC);
127   
128 //   FAMILY * myFamily = families.front() ;
129 //   _mesh =  myFamily->getMesh() ;
130
131 //   _isOnAllElts = myFamily->isOnAllElements() ;
132
133 //   SCRUTE(_mesh);
134
135 //   SCRUTE(_isOnAllElts);
136
137 //   _entity = myFamily->getEntity() ;
138
139 //   SCRUTE(_mesh->getNumberOfTypes(_entity));
140
141 //   _numberOfGeometricType = myFamily->getNumberOfTypes() ;
142 //   _geometricType = new medGeometryElement[_numberOfGeometricType];
143 //   //_geometricTypeNumber = new int[_numberOfGeometricType] ;
144 //   _numberOfGaussPoint = new int[_numberOfGeometricType] ;
145 //   _numberOfElements = new int[_numberOfGeometricType] ;
146 //   medGeometryElement * geometricType = myFamily->getTypes() ;
147 //   //int * geometricTypeNumber = myFamily->getGeometricTypeNumber() ;
148 //   int * numberOfGaussPoint = myFamily->getNumberOfGaussPoint() ;
149 //   for (int i=0 ; i<_numberOfGeometricType; i++) {
150 //     _geometricType[i]= geometricType[i] ;
151 //     // _geometricTypeNumber[i] = geometricTypeNumber[i] ;
152 //     _numberOfGaussPoint[i] = numberOfGaussPoint[i] ;
153 //     _numberOfElements[i]=myFamily->getNumberOfElements(geometricType[i]);
154 //   }
155 //   _isOnAllElts = false ;
156 //   _totalNumberOfEntities = myFamily->getNumberOfElements(MED_ALL_ELEMENTS) ;
157 //   _number = new MEDSKYLINEARRAY(*myFamily->getnumber()) ;
158   
159 //   _numberOfFamilies = families.size();
160 //   _family.resize(_numberOfFamilies) ;
161 //   list<FAMILY*>::const_iterator liIni = families.begin() ;
162 //   _family[0]=(*liIni);
163 //   liIni++;
164 //   list<FAMILY*>::const_iterator li ;
165 //   int it = 1 ;
166 //   for (li=liIni;li!=families.end();li++) {
167 //     blending(*li);
168 //     _family[it] = (*li) ;
169 //     it++ ;
170 //   }
171   
172 //   END_OF(LOC);
173 // };
174