1 // Copyright (C) 2003 CEA/DEN, EDF R&D
5 // File : VISU_DatConvertor.cxx
6 // Author : Alexey PETROV
9 #include "MED_Wrapper.hxx"
10 #include "MED_Utilities.hxx"
16 static int MYDEBUG = 1;
18 static int MYDEBUG = 0;
23 //---------------------------------------------------------------
24 static med_geometrie_element NODEGEOM[1] = {MED_POINT1};
26 static med_geometrie_element EDGEGEOM[MED_NBR_GEOMETRIE_ARETE] = {
30 static med_geometrie_element FACEGEOM[MED_NBR_GEOMETRIE_FACE] = {
31 MED_TRIA3, MED_QUAD4, MED_TRIA6, MED_QUAD8
34 static med_geometrie_element CELLGEOM[MED_NBR_GEOMETRIE_MAILLE] = {
35 MED_POINT1, MED_SEG2, MED_SEG3, MED_TRIA3,
36 MED_QUAD4, MED_TRIA6, MED_QUAD8, MED_TETRA4,
37 MED_PYRA5, MED_PENTA6, MED_HEXA8, MED_TETRA10,
38 MED_PYRA13, MED_PENTA15, MED_HEXA20
41 void GetEntity2Geom(med_entite_maillage theEntity, med_geometrie_element*& theVector, int* theEnd){
43 case MED_MAILLE: theVector = CELLGEOM; *theEnd = MED_NBR_GEOMETRIE_MAILLE; break;
44 case MED_FACE: theVector = FACEGEOM; *theEnd = MED_NBR_GEOMETRIE_FACE; break;
45 case MED_ARETE: theVector = EDGEGEOM; *theEnd = MED_NBR_GEOMETRIE_ARETE; break;
46 case MED_NOEUD: theVector = NODEGEOM; *theEnd = 1; break;
48 EXCEPTION(runtime_error,"GetEntity2Geom - theEntity == "<<theEntity<<" is uncorrect");
53 //---------------------------------------------------------------
54 TFile::TFile(const std::string& theFileName):
57 myFileName(strdup(theFileName.c_str()))
66 void TFile::Open(med_mode_acces theMode){
68 myFid = MEDouvrir(myFileName,theMode);
70 EXCEPTION(runtime_error,"TFile - MEDouvrir('"<<myFileName<<"',"<<theMode<<")");
80 const med_idt& TFile::Id() const {
82 EXCEPTION(runtime_error,"TFile - GetFid() < 0");
87 //---------------------------------------------------------------
88 TWrapper::TWrapper(const std::string& theFileName):
93 med_int TWrapper::GetNbMeshes(){
94 TFileWrapper aFileWrapper(myFile,MED_LECT);
96 return MEDnMaa(myFile.Id());
100 void TWrapper::GetMeshInfo(med_int theMeshId, TMeshInfo& theInfo){
101 TFileWrapper aFileWrapper(myFile,MED_LECT);
103 med_err ret = MEDmaaInfo(myFile.Id(),
108 EXCEPTION(runtime_error,"GetMeshInfo - MEDmaaInfo(...)");
112 void TWrapper::SetMeshInfo(const TMeshInfo& theInfo){
115 TFileWrapper aFileWrapper(myFile,MED_ECRI);
117 TMeshInfo& anInfo = const_cast<TMeshInfo&>(theInfo);
118 ret = MEDmaaCr(myFile.Id(),
123 TFileWrapper aFileWrapper(myFile,MED_REMP);
125 TMeshInfo& anInfo = const_cast<TMeshInfo&>(theInfo);
126 ret = MEDmaaCr(myFile.Id(),
131 EXCEPTION(runtime_error,"SetMeshInfo - MEDmaaCr(...)");
135 med_int TWrapper::GetNbFamilies(const TMeshInfo& theInfo){
136 TFileWrapper aFileWrapper(myFile,MED_LECT);
138 TMeshInfo& anInfo = const_cast<TMeshInfo&>(theInfo);
139 return MEDnFam(myFile.Id(),
146 med_int TWrapper::GetNbFamAttr(med_int theFamId, const TMeshInfo& theInfo){
147 TFileWrapper aFileWrapper(myFile,MED_LECT);
149 TMeshInfo& anInfo = const_cast<TMeshInfo&>(theInfo);
150 return MEDnFam(myFile.Id(),
157 med_int TWrapper::GetNbFamGroup(med_int theFamId, const TMeshInfo& theInfo){
158 TFileWrapper aFileWrapper(myFile,MED_LECT);
160 TMeshInfo& anInfo = const_cast<TMeshInfo&>(theInfo);
161 return MEDnFam(myFile.Id(),
168 void TWrapper::GetFamilyInfo(med_int theFamId, TFamilyInfo& theInfo){
169 TFileWrapper aFileWrapper(myFile,MED_LECT);
171 TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
173 med_err ret = MEDfamInfo(myFile.Id(),
174 &aMeshInfo.myName[0],
178 &theInfo.myAttrId[0],
179 &theInfo.myAttrVal[0],
180 &theInfo.myAttrDesc[0],
182 &theInfo.myGroupNames[0],
185 EXCEPTION(runtime_error,"GetFamilyInfo - MEDfamInfo(...)");
189 void TWrapper::SetFamilyInfo(const TFamilyInfo& theInfo){
190 TFileWrapper aFileWrapper(myFile,MED_ECRI);
192 TFamilyInfo& anInfo = const_cast<TFamilyInfo&>(theInfo);
193 TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
195 med_err ret = MEDfamCr(myFile.Id(),
196 &aMeshInfo.myName[0],
200 &anInfo.myAttrVal[0],
201 &anInfo.myAttrDesc[0],
203 &anInfo.myGroupNames[0],
206 EXCEPTION(runtime_error,"SetFamilyInfo - MEDfamCr(...)");
210 med_int TWrapper::GetNbNodes(const TMeshInfo& theMeshInfo){
211 TFileWrapper aFileWrapper(myFile,MED_LECT);
213 TMeshInfo& aMeshInfo = const_cast<TMeshInfo&>(theMeshInfo);
215 return MEDnEntMaa(myFile.Id(),
216 &aMeshInfo.myName[0],
218 med_geometrie_element(0),
219 med_connectivite(0));
223 void TWrapper::GetNodeInfo(TNodeInfo& theInfo){
224 TFileWrapper aFileWrapper(myFile,MED_LECT);
226 TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
228 med_err ret = MEDnoeudsLire(myFile.Id(),
229 &aMeshInfo.myName[0],
234 &theInfo.myCoordNames[0],
235 &theInfo.myCoordUnits[0],
236 &theInfo.myElemNames[0],
237 &theInfo.myIsElemNames,
238 &theInfo.myElemNum[0],
239 &theInfo.myIsElemNum,
240 &theInfo.myFamNum[0],
243 EXCEPTION(runtime_error,"GetNodeInfo - MEDnoeudsLire(...)");
247 void TWrapper::SetNodeInfo(const TNodeInfo& theInfo)
249 TFileWrapper aFileWrapper(myFile,MED_ECRI);
251 TNodeInfo& anInfo = const_cast<TNodeInfo&>(theInfo);
252 TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
254 med_err ret = MEDnoeudsEcr(myFile.Id(),
255 &aMeshInfo.myName[0],
260 &anInfo.myCoordNames[0],
261 &anInfo.myCoordUnits[0],
262 &anInfo.myElemNames[0],
263 anInfo.myIsElemNames,
264 &anInfo.myElemNum[0],
270 EXCEPTION(runtime_error,"SetNodeInfo - MEDnoeudsEcr(...)");
274 TEntityInfo TWrapper::GetEntityInfo(const TMeshInfo& theMeshInfo){
275 TFileWrapper aFileWrapper(myFile,MED_LECT);
278 if(med_int aNbElem = GetNbNodes(theMeshInfo)){
279 anInfo[MED_NOEUD][MED_POINT1] = aNbElem;
280 med_entite_maillage anEntityVector[3] = {MED_MAILLE, MED_FACE, MED_ARETE};
281 for(med_int iEntity = 0; iEntity < 3; iEntity++){
283 med_entite_maillage& anEntity = anEntityVector[iEntity];
284 med_geometrie_element* aGeomVector;
285 GetEntity2Geom(anEntity,aGeomVector,&iGeomEnd);
286 for(med_int iGeom = 0; iGeom < iGeomEnd; iGeom++) {
287 med_geometrie_element& aGeom = aGeomVector[iGeom];
288 if(med_int aNb = GetNbCells(theMeshInfo,anEntity,aGeom)){
289 anInfo[anEntity][aGeom] = aNb;
298 med_int TWrapper::GetNbCells(const TMeshInfo& theMeshInfo,
299 med_entite_maillage theTEntity,
300 med_geometrie_element theTGeom,
301 med_connectivite theTConn)
303 TFileWrapper aFileWrapper(myFile,MED_LECT);
305 TMeshInfo& aMeshInfo = const_cast<TMeshInfo&>(theMeshInfo);
307 return MEDnEntMaa(myFile.Id(),
308 &aMeshInfo.myName[0],
316 void TWrapper::GetCellInfo(TCellInfo& theInfo)
318 TFileWrapper aFileWrapper(myFile,MED_LECT);
320 TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
321 med_int aNbElem = theInfo.myElemNum.size();
323 med_err ret = MEDelementsLire(myFile.Id(),
324 &aMeshInfo.myName[0],
328 &theInfo.myElemNames[0],
329 &theInfo.myIsElemNames,
330 &theInfo.myElemNum[0],
331 &theInfo.myIsElemNum,
332 &theInfo.myFamNum[0],
338 EXCEPTION(runtime_error,"GetCellInfo - MEDelementsLire(...)");
342 void TWrapper::SetCellInfo(const TCellInfo& theInfo)
344 TFileWrapper aFileWrapper(myFile,MED_ECRI);
346 TCellInfo& anInfo = const_cast<TCellInfo&>(theInfo);
347 TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
348 med_int aNbElem = anInfo.myElemNum.size();
350 med_err ret = MEDelementsEcr(myFile.Id(),
351 &aMeshInfo.myName[0],
355 &anInfo.myElemNames[0],
356 anInfo.myIsElemNames,
357 &anInfo.myElemNum[0],
367 EXCEPTION(runtime_error,"GetCellInfo - MEDelementsLire(...)");
371 med_int TWrapper::GetNbFields(){
372 TFileWrapper aFileWrapper(myFile,MED_LECT);
374 return MEDnChamp(myFile.Id(),0);
378 med_int TWrapper::GetNbComp(med_int theFieldId){
379 TFileWrapper aFileWrapper(myFile,MED_LECT);
381 return MEDnChamp(myFile.Id(),theFieldId);
385 void TWrapper::GetFieldInfo(med_int theFieldId, TFieldInfo& theInfo){
386 TFileWrapper aFileWrapper(myFile,MED_LECT);
388 med_err ret = MEDchampInfo(myFile.Id(),
392 &theInfo.myCompNames[0],
393 &theInfo.myUnitNames[0],
396 EXCEPTION(runtime_error,"GetFieldInfo - MEDchampInfo(...)");
400 void TWrapper::SetFieldInfo(const TFieldInfo& theInfo)
402 TFileWrapper aFileWrapper(myFile,MED_ECRI);
404 TFieldInfo& anInfo = const_cast<TFieldInfo&>(theInfo);
405 med_err ret = MEDchampCr(myFile.Id(),
408 &anInfo.myCompNames[0],
409 &anInfo.myUnitNames[0],
412 EXCEPTION(runtime_error,"SetFieldInfo - MEDchampEcr(...)");
416 med_int TWrapper::GetNbTimeStamps(const TFieldInfo& theInfo,
417 const TEntityInfo& theEntityInfo,
418 med_entite_maillage& theEntity,
421 TFileWrapper aFileWrapper(myFile,MED_LECT);
423 if(theEntityInfo.empty())
424 EXCEPTION(runtime_error,"GetNbTimeStamps - There is no any Entity on the Mesh");
427 med_int aNbTimeStamps = 0;
428 TFieldInfo& anInfo = const_cast<TFieldInfo&>(theInfo);
429 TEntityInfo::const_iterator anIter = theEntityInfo.begin();
430 for(; anIter != theEntityInfo.end(); anIter++){
431 const med_entite_maillage& anEntity = anIter->first;
432 const TGeom& aTGeom = anIter->second;
433 TGeom::const_iterator anGeomIter = aTGeom.begin();
434 for(; anGeomIter != aTGeom.end(); anGeomIter++){
435 const med_geometrie_element& aGeom = anGeomIter->first;
436 aNbTimeStamps = MEDnPasdetemps(myFile.Id(),&anInfo.myName[0],anEntity,aGeom);
438 theEntity = anEntity;
439 theGeom[aGeom] = anGeomIter->second;
442 if(aNbTimeStamps) break;
444 return aNbTimeStamps;
448 void TWrapper::GetTimeStampInfo(med_int theTimeStampId, TTimeStampInfo& theInfo)
450 TFileWrapper aFileWrapper(myFile,MED_LECT);
451 med_idt anId = myFile.Id();
453 TFieldInfo& aFieldInfo = *theInfo.myFieldInfo;
454 TMeshInfo& aMeshInfo = *aFieldInfo.myMeshInfo;
456 med_entite_maillage anEntity = theInfo.myEntity;
457 TGeom& aTGeom = theInfo.myGeom;
459 EXCEPTION(runtime_error,"GetTimeStampInfo - There is no any cell");
461 TGeom::iterator anIter = aTGeom.begin();
462 med_geometrie_element aGeom = anIter->first;
464 med_err ret = MEDpasdetempsInfo(anId,
465 &aFieldInfo.myName[0],
469 &aMeshInfo.myName[0],
472 &theInfo.myUnitDt[0],
476 EXCEPTION(runtime_error,"GetTimeStampInfo - MEDpasdetempsInfo(...)");
478 static med_int MAX_NB_GAUSS_POINTS = 32;
479 if(theInfo.myNbGauss > MAX_NB_GAUSS_POINTS)
480 theInfo.myNbGauss = 1;
483 void TWrapper::SetTimeStamp(const TTimeStampVal& theVal)
485 TFileWrapper aFileWrapper(myFile,MED_ECRI);
487 TTimeStampVal& aVal = const_cast<TTimeStampVal&>(theVal);
488 TTimeStampInfo& aTimeStampInfo = *aVal.myTimeStampInfo;
489 TFieldInfo& aFieldInfo = *aTimeStampInfo.myFieldInfo;
490 TMeshInfo& aMeshInfo = *aFieldInfo.myMeshInfo;
491 TMeshValue& aMeshValue = aVal.myMeshValue;
493 med_entite_maillage anEntity = aTimeStampInfo.myEntity;
494 TMeshValue::iterator anIter = aMeshValue.begin();
495 for(; anIter != aMeshValue.end(); anIter++){
496 const med_geometrie_element& aGeom = anIter->first;
497 TValue& aValue = aVal.myMeshValue[aGeom];
498 med_int iEnd = aValue.size();
499 med_int aNbVal = iEnd / aFieldInfo.myNbComp;
502 switch(aFieldInfo.myType){
504 valarray<med_float>& anArray = aValue;
506 ret = MEDchampEcr(myFile.Id(),
507 &aMeshInfo.myName[0],
508 &aFieldInfo.myName[0],
509 (unsigned char*)&anArray[0],
512 aTimeStampInfo.myNbGauss,
518 aTimeStampInfo.myNumDt,
519 &aTimeStampInfo.myUnitDt[0],
521 aTimeStampInfo.myNumOrd);
526 valarray<med_int> anArray(iEnd);
527 for(med_int i = 0; i< iEnd; i++) anArray[i] = med_int(aValue[i]);
529 ret = MEDchampEcr(myFile.Id(),
530 &aMeshInfo.myName[0],
531 &aFieldInfo.myName[0],
532 (unsigned char*)&anArray[0],
535 aTimeStampInfo.myNbGauss,
541 aTimeStampInfo.myNumDt,
542 &aTimeStampInfo.myUnitDt[0],
544 aTimeStampInfo.myNumOrd);
548 EXCEPTION(runtime_error,"SetTimeStamp - Type of the field == "<<aFieldInfo.myType<<" is wrong");
551 EXCEPTION(runtime_error,"SetTimeStamp - MEDchampEcr(...)");
555 void TWrapper::GetTimeStampVal(TTimeStampVal& theVal)
557 TFileWrapper aFileWrapper(myFile,MED_LECT);
558 med_idt anId = myFile.Id();
560 TTimeStampInfo& aTimeStampInfo = *theVal.myTimeStampInfo;
561 TFieldInfo& aFieldInfo = *aTimeStampInfo.myFieldInfo;
562 TMeshInfo& aMeshInfo = *aFieldInfo.myMeshInfo;
563 TMeshValue& aMeshValue = theVal.myMeshValue;
565 med_entite_maillage anEntity = aTimeStampInfo.myEntity;
566 TGeom& aTGeom = aTimeStampInfo.myGeom;
567 TGeom::iterator anIter = aTGeom.begin();
568 for(; anIter != aTGeom.end(); anIter++){
569 const med_geometrie_element& aGeom = anIter->first;
570 med_int aNbVal = MEDnVal(anId,&aFieldInfo.myName[0],anEntity,aGeom,
571 aTimeStampInfo.myNumDt,aTimeStampInfo.myNumOrd);
573 EXCEPTION(runtime_error,"GetTimeStampInfo - MEDnVal(...) - aNbVal == "<<aNbVal<<" <= 0");
575 TValue& aValue = theVal.myMeshValue[aGeom];
576 med_int iEnd = aNbVal * aFieldInfo.myNbComp;
578 if(iEnd != aValue.size())
579 EXCEPTION(runtime_error,"GetTimeStampInfo - iEnd == "<<iEnd<<" != aValue.size() == "<<aValue.size());
582 switch(aFieldInfo.myType){
584 valarray<med_float> anArray(iEnd);
585 ret = MEDchampLire(myFile.Id(),
586 &aMeshInfo.myName[0],
587 &aFieldInfo.myName[0],
588 (unsigned char*)&anArray[0],
591 &theVal.myPflName[0],
594 aTimeStampInfo.myNumDt,
595 aTimeStampInfo.myNumOrd);
597 for(med_int i = 0; i < iEnd; i++) aValue[i] = anArray[i];
602 valarray<med_int> anArray(iEnd);
603 ret = MEDchampLire(myFile.Id(),
604 &aMeshInfo.myName[0],
605 &aFieldInfo.myName[0],
606 (unsigned char*)&anArray[0],
609 &theVal.myPflName[0],
612 aTimeStampInfo.myNumDt,
613 aTimeStampInfo.myNumOrd);
615 for(med_int i = 0; i < iEnd; i++) aValue[i] = anArray[i];
619 EXCEPTION(runtime_error,"GetValTimeStamp - Type of the field == "<<aFieldInfo.myType<<" is wrong");
622 EXCEPTION(runtime_error,"GetValTimeStamp - MEDchampLire(...)");