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