10 #include "MEDMEM_define.hxx"
11 #include "MEDMEM_DriversDef.hxx"
12 #include "MEDMEM_Support.hxx"
13 #include "MEDMEM_Family.hxx"
14 #include "MEDMEM_Group.hxx"
15 #include "MEDMEM_Mesh.hxx"
17 using namespace MED_EN;
19 /* This class is a generic class for family and group */
20 //--------------------------------------------------------------------------
21 SUPPORT::SUPPORT(): _name(""), _description(""), _mesh((MESH*)NULL),
22 _entity(MED_CELL), _numberOfGeometricType(0),
23 _geometricType((medGeometryElement*)NULL),
24 _numberOfGaussPoint((int*)NULL),
25 _geometricTypeNumber((int*)NULL), _isOnAllElts(false),
26 _numberOfEntities((int*)NULL), _totalNumberOfEntities(0),
27 _number((MEDSKYLINEARRAY*)NULL)
28 //--------------------------------------------------------------------------
30 MESSAGE("Constructeur SUPPORT sans parametre");
33 //--------------------------------------------------------------------------
34 SUPPORT::SUPPORT(MESH* Mesh, string Name="", medEntityMesh Entity=MED_CELL):
35 _name(Name), _description(""), _mesh(Mesh), _entity(Entity),
36 _numberOfGeometricType(0),
37 _geometricType((medGeometryElement*)NULL),
38 _numberOfGaussPoint((int*)NULL),
39 _geometricTypeNumber((int*)NULL),
40 _isOnAllElts(true), _numberOfEntities((int*)NULL),
41 _totalNumberOfEntities(0),
42 _number((MEDSKYLINEARRAY*)NULL)
43 //--------------------------------------------------------------------------
45 MESSAGE("Constructeur SUPPORT avec parametres MESH* Mesh,string name,medEntityMesh Entity");
46 if ( Entity == MED_NODE) {
47 _numberOfGeometricType=1 ;
48 _geometricType=new medGeometryElement[1] ;
49 _geometricType[0]=MED_NONE ;
57 MESSAGE("Destructeur ~SUPPORT()");
58 if (_geometricType!=NULL)
59 delete[] _geometricType ;
60 if (_numberOfGaussPoint!=NULL)
61 delete[] _numberOfGaussPoint ;
62 if (_geometricTypeNumber!=NULL)
63 delete[] _geometricTypeNumber ;
64 if (_numberOfEntities!=NULL)
65 delete[] _numberOfEntities ;
70 //--------------------------------------------------
71 ostream & operator<<(ostream &os, const SUPPORT &my)
72 //--------------------------------------------------
74 os << "Name : "<<my._name<< endl ;
75 os << "Description : "<< my._description << endl ;
78 os << "ERROR : Mesh not defined !" << endl ;
80 os << my._mesh->getName() << endl ;
86 void SUPPORT::update()
89 const char * LOC = "SUPPORT::update() : " ;
93 if (_numberOfGaussPoint==NULL) {
94 MESSAGE( "ENTITY : "<< _entity );
95 int NumberOfTypes = _mesh->getNumberOfTypes(_entity) ;
96 MESSAGE( "NumberOfTypes : "<< NumberOfTypes );
97 _numberOfGaussPoint = new int[NumberOfTypes] ;
98 for (int i=0;i<NumberOfTypes;i++)
99 _numberOfGaussPoint[i]=1 ;
101 if (_entity == MED_NODE)
102 _totalNumberOfEntities = _mesh->getNumberOfNodes();
108 //-------------------
109 void SUPPORT::blending(SUPPORT * mySupport)
110 //-------------------
112 const char * LOC = "SUPPORT::blending() : " ;
116 if ( _entity != mySupport->getEntity() )
117 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Entities are different !"));
119 int * tmp_NumberOfElementsInType = new int[MED_NBR_GEOMETRIE_MAILLE];
120 medGeometryElement * myType = new medGeometryElement[MED_NBR_GEOMETRIE_MAILLE];
121 int * whereIsType = new int[MED_NBR_GEOMETRIE_MAILLE];
122 //MESH_ENTITIES myMeshEntities() ;
123 list<MED_FR::med_geometrie_element>::const_iterator listIt ;
125 for(listIt=(MED_FR::meshEntities[(MED_FR::med_entite_maillage)_entity]).begin();listIt!=(MED_FR::meshEntities[(MED_FR::med_entite_maillage)_entity]).end();listIt++){
126 tmp_NumberOfElementsInType[it]=0;
129 tmp_NumberOfElementsInType[it]+=getNumberOfElements((medGeometryElement)(*listIt)) ;
132 catch (const MEDEXCEPTION & ex) {};
134 tmp_NumberOfElementsInType[it]+=mySupport->getNumberOfElements((medGeometryElement)(*listIt)) ;
137 catch (const MEDEXCEPTION & ex) {};
138 if (whereIsType[it]!=0) {
139 myType[it]=(medGeometryElement)(*listIt) ;
144 int * numberOfEntities=_numberOfEntities ;
145 _numberOfEntities = new int[it] ;
146 _totalNumberOfEntities = 0 ;
147 // int totalSize = 0 ;
148 int ** tmp_array = new (int*)[it];
149 for (int i=0;i<it;i++) {
150 int numberOfElementsInType = tmp_NumberOfElementsInType[i] ;
151 _numberOfEntities[i] = numberOfElementsInType ;
152 tmp_array[i] = new int[numberOfElementsInType] ;
153 //totalSize+=numberOfElementsInType*(myType[i]%100) ;
154 _totalNumberOfEntities+=numberOfElementsInType ;
155 if (whereIsType[i] == 1) { // only first Support
156 memcpy(tmp_array[i],getNumber(myType[i]),sizeof(int)*numberOfElementsInType);
157 } else if (whereIsType[i] == 2) { // only second Support
158 memcpy(tmp_array[i],mySupport->getNumber(myType[i]),sizeof(int)*numberOfElementsInType);
159 } else if (whereIsType[i] == 3) { // more difficult :-)
160 set<int> elementList ;
164 int * number1 = getNumber(myType[i]) ;
165 int * number2 = mySupport->getNumber(myType[i]) ;
167 int numberOfElements1 = numberOfEntities[i] ;
168 int numberOfElements2 = mySupport->getNumberOfElements(myType[i]) ;
170 for(int j=0;j<numberOfElements1;j++){
171 elementList.insert(number1[j]) ;
174 for(int j=0;j<numberOfElements2;j++){
175 elementList.insert(number2[j]) ;
179 int newNumberOfEntities = elementList.size() ;
180 _numberOfEntities[i] = newNumberOfEntities ;
181 int * tmp_arrayNew = new int[newNumberOfEntities];
183 set<int>::iterator its ;
184 for(its=elementList.begin();its!=elementList.end(); its++) {
185 tmp_arrayNew[ii]=*its ;
189 delete[] tmp_array[i] ;
190 tmp_array[i] = tmp_arrayNew ;
191 _totalNumberOfEntities-=(numberOfElementsInType-newNumberOfEntities) ;
194 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"ERROR")) ;
196 delete[] whereIsType ;
197 delete[] tmp_NumberOfElementsInType ;
199 _numberOfGeometricType = it ;
200 medGeometryElement * geometricType=_geometricType ;
201 _geometricType = new medGeometryElement[it] ;
202 int * numberOfGaussPoint=_numberOfGaussPoint ;
203 _numberOfGaussPoint= new int[it] ;
204 int * geometricTypeNumber=_geometricTypeNumber ;
205 _geometricTypeNumber = new int[it] ;
207 MEDSKYLINEARRAY* numberNew = new MEDSKYLINEARRAY(it,_totalNumberOfEntities);
208 int * numberIndex = numberNew->getIndex() ;
210 for (int i=0;i<it;i++) {
211 memcpy(numberNew->getI(i+1),tmp_array[i],sizeof(int)*_numberOfEntities[i]) ;
212 delete[] tmp_array[i] ;
213 numberIndex[i+1]=numberIndex[i]+_numberOfEntities[i] ;
215 _geometricType[i]=myType[i] ;
216 _numberOfGaussPoint[i]=1 ;
217 _geometricTypeNumber[i]=0 ;
221 _number = numberNew ;
226 delete[] geometricType ;
227 delete[] numberOfGaussPoint ;
228 delete[] geometricTypeNumber ;
229 delete[] numberOfEntities ;
235 This function allows the user to set a support not on all entities Entity,
236 it should be used after an initialisation with the constructor
237 SUPPORT(MESH* Mesh, string Name="", medEntityMesh Entity=MED_CELL) and
238 after the call to the function setAll(false).
239 It allocates and initialises all the attributs of the class SUPPORT.;
240 useful for the Python API.
243 //-------------------
244 void SUPPORT::setpartial(string Description, int NumberOfGeometricType,
245 int TotalNumberOfEntity,
246 medGeometryElement *GeometricType,
247 int *NumberOfEntity, int *NumberValue)
248 //-------------------
250 const char * LOC = "SUPPORT::setpartial(string , int , int , medGeometryElement * , int * , int *) : " ;
253 _description=Description;
255 _numberOfGeometricType=NumberOfGeometricType;
257 _totalNumberOfEntities=TotalNumberOfEntity;
259 _geometricType = new medGeometryElement[NumberOfGeometricType];
260 _geometricType = GeometricType;
262 // attributes initialised at 0 because not really useful but it has to be
263 // allocated !! WARNING !!
265 _geometricTypeNumber = new int[NumberOfGeometricType] ;
266 for (int i=0;i<NumberOfGeometricType;i++) _geometricTypeNumber[i] = 0;
268 //_numberOfEntities = new int[NumberOfGeometricType] ;
269 _numberOfEntities = NumberOfEntity;
271 MEDSKYLINEARRAY * number = new MEDSKYLINEARRAY();
273 int * index = new int[_numberOfGeometricType+1];
276 for (int i=0;i<_numberOfGeometricType;i++)
277 index[i+1] = index[i]+_numberOfEntities[i] ;
279 number->setMEDSKYLINEARRAY(_numberOfGeometricType,_totalNumberOfEntities,index,NumberValue);
281 if (_number!=NULL) delete _number ;