Salome HOME
Merge from BR_V5_DEV 16Feb09
[modules/med.git] / src / MEDMEM / MEDMEM_Group.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 /*
23  File Group.cxx
24  $Header$
25 */
26 #include <list>
27
28 #include "MEDMEM_Group.hxx"
29 #include "MEDMEM_Family.hxx"
30
31 using namespace std;
32 using namespace MEDMEM;
33 using namespace MED_EN;
34
35 GROUP::GROUP():SUPPORT(),_numberOfFamilies(0),_family() 
36 {
37   MESSAGE_MED("GROUP()");
38 }
39
40 GROUP::~GROUP() 
41 {
42   MESSAGE_MED("~GROUP()");
43 }
44   
45 GROUP & GROUP::operator=(const GROUP &group) 
46 {
47   MESSAGE_MED("GROUP::operator=");
48   if ( &group == this ) return *this;
49   SUPPORT::operator=(group);
50   _numberOfFamilies = group._numberOfFamilies ;
51   _family           = group._family ;
52   return *this;
53 }
54
55 ostream & MEDMEM::operator<<(ostream &os, GROUP &myGroup)
56 {
57   os << (SUPPORT) myGroup;
58
59   int numberoffamilies = myGroup.getNumberOfFamilies();
60   os << "  - Families ("<<numberoffamilies<<") :"<<endl;
61   for (int j=1;j<numberoffamilies+1;j++)
62     os << "    * "<<myGroup.getFamily(j)->getName().c_str()<<endl ;
63
64   return os;
65 }
66
67 GROUP::GROUP(const string & name, const list<FAMILY*> & families) throw (MEDEXCEPTION)
68 {
69   const char * LOC = "GROUP( const string & , const list<FAMILY*> & ) : " ;
70   
71   BEGIN_OF_MED(LOC);
72
73   MESSAGE_MED(LOC<<name);
74
75   int numberOfFamilies = families.size();
76   _name = name ;
77   _description = "GROUP";
78   // description : none !
79   // first FAMILY to set all !
80   FAMILY * myFamily = families.front() ;
81   _mesh =  myFamily->getMesh() ;
82   _entity = myFamily->getEntity() ;
83   bool isOnAllElts = myFamily->isOnAllElements() ;
84
85   SCRUTE_MED(isOnAllElts);
86   SCRUTE_MED(numberOfFamilies);
87
88
89   if ((numberOfFamilies==1) && (isOnAllElts))
90     {
91       _numberOfFamilies = numberOfFamilies;
92       _isOnAllElts = isOnAllElts ;
93       _family.resize(_numberOfFamilies) ;
94       _family[0] = myFamily;
95       update();
96       return;
97     }
98   else if ((!(numberOfFamilies==1)) && (isOnAllElts))
99     throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "building of a GROUP object from several FAMILY, and one of them is on all entities"  )) ;
100
101   _numberOfGeometricType = myFamily->getNumberOfTypes() ;
102
103   _geometricType.set(_numberOfGeometricType);
104   _numberOfElements.set(_numberOfGeometricType) ;
105
106   const medGeometryElement * geometricType = myFamily->getTypes() ;
107   //int * geometricTypeNumber = myFamily->getGeometricTypeNumber() ;
108
109   SCRUTE_MED(_numberOfGeometricType);
110
111   for (int i=0 ; i<_numberOfGeometricType; i++) {
112     _geometricType[i]= geometricType[i] ;
113     // _geometricTypeNumber[i] = geometricTypeNumber[i] ;
114     _numberOfElements[i]=myFamily->getNumberOfElements(geometricType[i]);
115     MESSAGE_MED(LOC << " Type : " << _geometricType[i] << " number of element(s) " << _numberOfElements[i]);
116   }
117   _isOnAllElts = false ;
118   //_totalNumberOfEntities = myFamily->getNumberOfElements(MED_ALL_ELEMENTS) ;
119
120
121   MEDSKYLINEARRAY * famNumber = myFamily->getnumber();
122
123   const int * famNumberValue = myFamily->getNumber(MED_ALL_ELEMENTS);
124
125   const int * famNumberIndex = myFamily->getNumberIndex();
126
127   int famNumberCount = famNumber->getNumberOf();
128   int famNumberLength = famNumber->getLength();
129
130   SCRUTE_MED(famNumber);
131   SCRUTE_MED(famNumberCount);
132   SCRUTE_MED(famNumberLength);
133   SCRUTE_MED(famNumberValue);
134   SCRUTE_MED(famNumberIndex);
135
136 //   _number = new MEDSKYLINEARRAY(*famNumber) ;
137   _number = new MEDSKYLINEARRAY(famNumberCount,famNumberLength,
138                                 famNumberIndex,famNumberValue) ;
139
140   SCRUTE_MED(_number);
141
142   _numberOfFamilies = families.size();
143
144   SCRUTE_MED(numberOfFamilies);
145
146   //SCRUTE_MED(_numberOfFamilies);
147
148   _family.resize(_numberOfFamilies) ;
149   list<FAMILY*>::const_iterator li ;
150
151   // MESSAGE_MED(LOC<<"Printing of the object GROUP built right before the blending"<< (SUPPORT) *this);
152
153
154   int it = 0 ;
155   for (li=families.begin();li!=families.end();li++) {
156     blending(*li);
157     _family[it] = (*li) ;
158     it++ ;
159   }
160
161   //MESSAGE_MED(LOC<<"Printing of the object GROUP built "<< (GROUP)*this);
162
163   END_OF_MED(LOC);
164 }
165
166 GROUP::GROUP(const GROUP & m):SUPPORT(m)
167 {
168   _numberOfFamilies = m._numberOfFamilies;
169   _family = m._family; //Copie profonde dans FAMILY Rmq from EF
170 }
171
172 // void GROUP::init(const list<FAMILY*> & families)
173 // {
174   
175 //   BEGIN_OF_MED(LOC);
176   
177 //   FAMILY * myFamily = families.front() ;
178 //   _mesh =  myFamily->getMesh() ;
179
180 //   _isOnAllElts = myFamily->isOnAllElements() ;
181
182 //   SCRUTE_MED(_mesh);
183
184 //   SCRUTE_MED(_isOnAllElts);
185
186 //   _entity = myFamily->getEntity() ;
187
188 //   SCRUTE_MED(_mesh->getNumberOfTypes(_entity));
189
190 //   _numberOfGeometricType = myFamily->getNumberOfTypes() ;
191 //   _geometricType = new medGeometryElement[_numberOfGeometricType];
192 //   //_geometricTypeNumber = new int[_numberOfGeometricType] ;
193 //   _numberOfGaussPoints = new int[_numberOfGeometricType] ;
194 //   _numberOfElements = new int[_numberOfGeometricType] ;
195 //   medGeometryElement * geometricType = myFamily->getTypes() ;
196 //   //int * geometricTypeNumber = myFamily->getGeometricTypeNumber() ;
197 //   int * numberOfGaussPoints = myFamily->getNumberOfGaussPoints() ;
198 //   for (int i=0 ; i<_numberOfGeometricType; i++) {
199 //     _geometricType[i]= geometricType[i] ;
200 //     // _geometricTypeNumber[i] = geometricTypeNumber[i] ;
201 //     _numberOfGaussPoints[i] = numberOfGaussPoints[i] ;
202 //     _numberOfElements[i]=myFamily->getNumberOfElements(geometricType[i]);
203 //   }
204 //   _isOnAllElts = false ;
205 //   _totalNumberOfEntities = myFamily->getNumberOfElements(MED_ALL_ELEMENTS) ;
206 //   _number = new MEDSKYLINEARRAY(*myFamily->getnumber()) ;
207   
208 //   _numberOfFamilies = families.size();
209 //   _family.resize(_numberOfFamilies) ;
210 //   list<FAMILY*>::const_iterator liIni = families.begin() ;
211 //   _family[0]=(*liIni);
212 //   liIni++;
213 //   list<FAMILY*>::const_iterator li ;
214 //   int it = 1 ;
215 //   for (li=liIni;li!=families.end();li++) {
216 //     blending(*li);
217 //     _family[it] = (*li) ;
218 //     it++ ;
219 //   }
220   
221 //   END_OF_MED();
222 // };
223