1 #ifndef MED_FIELD_DRIVER22_HXX
2 #define MED_FIELD_DRIVER22_HXX
6 #include "MEDMEM_define.hxx"
8 #include "MEDMEM_GenDriver.hxx"
10 #include "MEDMEM_MedFieldDriver.hxx"
11 #include "MEDMEM_STRING.hxx"
12 #include "MEDMEM_Exception.hxx"
13 #include "MEDMEM_Unit.hxx"
14 #include "MEDMEM_Array.hxx"
15 #include "MEDMEM_Support.hxx"
16 #include "MEDMEM_Mesh.hxx"
19 template <class T> class FIELD;
21 // A QD LA CLASSE MED_ALL_ELEMENTS_DRIVER.... :) pour mutualiser le open ..... avec led _medIdt...
27 Generic part : implement open and close methods.
31 template <class T> class MED_FIELD_DRIVER22 : public virtual MED_FIELD_DRIVER<T>
35 med_2_2::med_idt _medIdt;
41 // all MED cell type ?? Classe de Définition ??
42 // static const medGeometryElement all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
44 // static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
49 MED_FIELD_DRIVER22():MED_FIELD_DRIVER<T>(),_medIdt(MED_INVALID)
54 MED_FIELD_DRIVER22(const string & fileName, FIELD<T> * ptrField,
55 MED_EN::med_mode_acces accessMode)
56 : MED_FIELD_DRIVER<T>(fileName,ptrField,accessMode),_medIdt(MED_INVALID)
63 MED_FIELD_DRIVER22(const MED_FIELD_DRIVER22 & fieldDriver):
64 MED_FIELD_DRIVER<T>(fieldDriver),
65 _medIdt(fieldDriver._medIdt)
72 virtual ~MED_FIELD_DRIVER22() {
75 void open() throw (MEDEXCEPTION)
77 const char * LOC = "MED_FIELD_DRIVER22::open() ";
80 // we must set fieldname before open, because we must find field number in file (if it exist !!!)
81 if ( MED_FIELD_DRIVER<T>::_fileName == "" )
82 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
83 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
87 MESSAGE(LOC<<"_fileName.c_str : "<< MED_FIELD_DRIVER<T>::_fileName.c_str()<<",mode : "<< MED_FIELD_DRIVER<T>::_accessMode);
88 _medIdt = med_2_2::MEDouvrir( (const_cast <char *> (MED_FIELD_DRIVER<T>::_fileName.c_str())),(med_2_2::med_mode_acces) MED_FIELD_DRIVER<T>::_accessMode);
89 MESSAGE(LOC<<"_medIdt : "<< _medIdt );
91 MED_FIELD_DRIVER<T>::_status=MED_OPENED;
93 MED_FIELD_DRIVER<T>::_status = MED_INVALID;
94 _medIdt = MED_INVALID;
95 throw MED_EXCEPTION (LOCALIZED( STRING(LOC)
96 << "Can't open |" << MED_FIELD_DRIVER<T>::_fileName
97 << "|, _medIdt : " << _medIdt
106 BEGIN_OF("MED_FIELD_DRIVER22::close()");
107 med_2_2::med_int err = 0;
108 if (MED_FIELD_DRIVER<T>::_status == MED_OPENED) {
109 err=med_2_2::MEDfermer(_medIdt);
110 //H5close(); // If we call H5close() all the files are closed.
111 MED_FIELD_DRIVER<T>::_status = MED_CLOSED;
112 _medIdt = MED_INVALID;
113 MESSAGE(" MED_FIELD_DRIVER22::close() : MEDfermer : _medIdt= " << _medIdt );
114 MESSAGE(" MED_FIELD_DRIVER22::close() : MEDfermer : err = " << err );
116 END_OF("MED_FIELD_DRIVER22::close()");
123 Driver Med for FIELD : Read only.
125 Implement read method.
129 template <class T> class MED_FIELD_RDONLY_DRIVER22 : public virtual MED_FIELD_DRIVER22<T>, public virtual IMED_FIELD_RDONLY_DRIVER<T>
137 MED_FIELD_RDONLY_DRIVER22():MED_FIELD_DRIVER<T>() {};
142 MED_FIELD_RDONLY_DRIVER22(const string & fileName, FIELD<T> * ptrField):
143 IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
144 MED_FIELD_DRIVER22<T>(fileName,ptrField,MED_EN::MED_RDONLY),
145 MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDONLY)
147 BEGIN_OF("MED_FIELD_RDONLY_DRIVER22::MED_FIELD_RDONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
148 END_OF("MED_FIELD_RDONLY_DRIVER22::MED_FIELD_RDONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
154 MED_FIELD_RDONLY_DRIVER22(const MED_FIELD_RDONLY_DRIVER22 & fieldDriver):
155 IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
156 MED_FIELD_DRIVER22<T>(fieldDriver),
157 MED_FIELD_DRIVER<T>(fieldDriver)
163 virtual ~MED_FIELD_RDONLY_DRIVER22() {};
165 // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
168 Return a MEDEXCEPTION : it is the read-only driver.
170 void write( void ) const throw (MEDEXCEPTION) ;
172 Read FIELD in the specified file.
174 void read ( void ) throw (MEDEXCEPTION) ;
177 GENDRIVER * copy( void ) const ;
183 Driver Med for FIELD : Write only.
185 Implement write method.
189 template <class T> class MED_FIELD_WRONLY_DRIVER22 : public virtual MED_FIELD_DRIVER22<T>, public virtual IMED_FIELD_WRONLY_DRIVER<T> {
196 MED_FIELD_WRONLY_DRIVER22():MED_FIELD_DRIVER<T>() {}
201 MED_FIELD_WRONLY_DRIVER22(const string & fileName, FIELD<T> * ptrField):
202 IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
203 MED_FIELD_DRIVER22<T>(fileName,ptrField,MED_EN::MED_WRONLY),
204 MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_WRONLY)
206 BEGIN_OF("MED_FIELD_WRONLY_DRIVER22::MED_FIELD_WRONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
207 END_OF("MED_FIELD_WRONLY_DRIVER22::MED_FIELD_WRONLY_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
213 MED_FIELD_WRONLY_DRIVER22(const MED_FIELD_WRONLY_DRIVER22 & fieldDriver):
214 IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
215 MED_FIELD_DRIVER22<T>(fieldDriver),
216 MED_FIELD_DRIVER<T>(fieldDriver)
222 virtual ~MED_FIELD_WRONLY_DRIVER22() {};
225 Write FIELD in the specified file.
227 void write( void ) const throw (MEDEXCEPTION) ;
229 Return a MEDEXCEPTION : it is the write-only driver.
231 void read ( void ) throw (MEDEXCEPTION) ;
234 GENDRIVER * copy( void ) const ;
241 Driver Med for FIELD : Read write.
242 - Use read method from MED_FIELD_RDONLY_DRIVER
243 - Use write method from MED_FIELD_WDONLY_DRIVER
247 template <class T> class MED_FIELD_RDWR_DRIVER22 : public MED_FIELD_RDONLY_DRIVER22<T>, public MED_FIELD_WRONLY_DRIVER22<T>, public IMED_FIELD_RDWR_DRIVER<T> {
254 MED_FIELD_RDWR_DRIVER22():MED_FIELD_DRIVER22<T>() {}
259 MED_FIELD_RDWR_DRIVER22(const string & fileName, FIELD<T> * ptrField):
260 MED_FIELD_WRONLY_DRIVER22<T>(fileName,ptrField),
261 MED_FIELD_RDONLY_DRIVER22<T>(fileName,ptrField),
262 IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
263 IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
264 MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDWR),
265 IMED_FIELD_RDWR_DRIVER<T>(fileName,ptrField)
267 BEGIN_OF("MED_FIELD_RDWR_DRIVER22::MED_FIELD_RDWR_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
268 //_accessMode = MED_RDWR ;
269 END_OF("MED_FIELD_RDWR_DRIVER22::MED_FIELD_RDWR_DRIVER22(const string & fileName, const FIELD<T> * ptrField)");
275 MED_FIELD_RDWR_DRIVER22(const MED_FIELD_RDWR_DRIVER22 & fieldDriver):
276 MED_FIELD_WRONLY_DRIVER22<T>(fieldDriver),
277 MED_FIELD_RDONLY_DRIVER22<T>(fieldDriver),
278 IMED_FIELD_RDWR_DRIVER<T>(fieldDriver),
279 IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
280 IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
281 MED_FIELD_DRIVER<T>(fieldDriver)
287 ~MED_FIELD_RDWR_DRIVER22() {};
290 Write FIELD in the specified file.
292 void write(void) const throw (MEDEXCEPTION) ;
294 Read FIELD in the specified file.
296 void read (void) throw (MEDEXCEPTION) ;
299 GENDRIVER * copy( void ) const ;
304 /*-------------------------*/
305 /* template implementation */
306 /*-------------------------*/
308 /*--------------------- DRIVER PART -------------------------------*/
310 // template <class T> void MED_FIELD_DRIVER<T>::search_field() {
311 // const char * LOC = "template <class T> class MED_FIELD_DRIVER::search_field() :";
313 // // we search the field number !!!!
314 // if (_status==MED_OPENED)
315 // if (_fieldNum==MED_INVALID) {
317 // int numberOfFields = 0; //MED_INVALID
318 // // char fieldName[MED_TAILLE_NOM+1] = "";
319 // char fieldName[MED_TAILLE_NOM+1] ;
320 // int numberOfComponents = 0;
321 // char * componentName = (char *) MED_NULL;
322 // char * unitName = (char *) MED_NULL;
323 // med_2_2::med_type_champ type ;
324 // numberOfFields = med_2_2::MEDnChamp(_medIdt,0) ;
325 // if ( numberOfFields <= 0 )
326 // throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
327 // for (int i=1;i<=numberOfFields;i++) {
329 // numberOfComponents = med_2_2::MEDnChamp(_medIdt,i) ;
330 // if ( numberOfComponents <= 0 )
331 // throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
332 // << "Be careful there is no compound for field n°"
333 // << i << "in file |"<<_fileName<<"| !"));
335 // componentName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
336 // unitName = new char[numberOfComponents*MED_TAILLE_PNOM+1] ;
338 // err = med_2_2::MEDchampInfo(_medIdt, i, fieldName, &type, componentName,
339 // unitName, numberOfComponents) ;
341 // delete[] componentName ;
342 // delete[] unitName ;
343 // MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<_fieldName.c_str()<<"#");
344 // if ( !strcmp(fieldName,_fieldName.c_str()) ) {
345 // MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
353 /*--------------------- RDONLY PART -------------------------------*/
355 template <class T> GENDRIVER * MED_FIELD_RDONLY_DRIVER22<T>::copy(void) const
357 return new MED_FIELD_RDONLY_DRIVER22<T>(*this);
360 template <class T> void MED_FIELD_RDONLY_DRIVER22<T>::read(void)
363 const char * LOC = " MED_FIELD_RDONLY_DRIVER22::read() " ;
366 if (MED_FIELD_DRIVER<T>::_ptrField->_name=="")
367 MED_FIELD_DRIVER<T>::_ptrField->_name = MED_FIELD_DRIVER<T>::_fieldName ;
369 MED_FIELD_DRIVER<T>::_fieldName = MED_FIELD_DRIVER<T>::_ptrField->_name; // bug indetermine ! apres avoir fait readfilestruct, lorsque je recupere le champ, tout est bon sauf le nom du champ dans le driver !!!!!
371 MESSAGE("###### "<<LOC<<" fieldNameDRIVER : "<<MED_FIELD_DRIVER<T>::_fieldName<<" fieldName : "<<MED_FIELD_DRIVER<T>::_ptrField->_name);
373 string MeshName = MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getMesh()->getName() ;
375 if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
381 fieldName = new char[MED_TAILLE_NOM+1] ;
383 int numberOfComponents = 0;
384 char * componentName = (char *) MED_NULL;
385 char * unitName = (char *) MED_NULL;
386 med_2_2::med_type_champ type ;
388 // we search the field number !!!!
389 if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID) {
390 int numberOfFields = 0; //MED_INVALID
391 numberOfFields = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,0) ;
392 if ( numberOfFields <= 0 )
393 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
394 for (int i=1;i<=numberOfFields;i++) {
396 numberOfComponents = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,i) ;
397 if ( numberOfComponents <= 0 )
398 // throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
399 // << "Be careful there is no compound for field n°"
400 // << i << "in file |"<<_fileName<<"| !"));
401 MESSAGE(LOC<<"Be careful there is no compound for field n°"<<i<<"in file |"<<MED_FIELD_DRIVER<T>::_fileName<<"| !");
403 componentName = new char[numberOfComponents*MED_TAILLE_PNOM22+1] ;
404 unitName = new char[numberOfComponents*MED_TAILLE_PNOM22+1] ;
406 err = med_2_2::MEDchampInfo(MED_FIELD_DRIVER22<T>::_medIdt, i, fieldName, &type, componentName,
407 unitName, numberOfComponents) ;
409 MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<MED_FIELD_DRIVER<T>::_fieldName.c_str()<<"#");
410 if ( !strcmp(fieldName,MED_FIELD_DRIVER<T>::_fieldName.c_str()) ) {
411 MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
412 MED_FIELD_DRIVER<T>::_fieldNum = i ;
415 // not found : release memory and search next field !
416 delete[] componentName ;
423 if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID)
424 throw MEDEXCEPTION(LOCALIZED( STRING(LOC) << ": Field "<<MED_FIELD_DRIVER<T>::_fieldName << " not found in file " << MED_FIELD_DRIVER<T>::_fileName ) );
425 MESSAGE ("FieldNum : "<<MED_FIELD_DRIVER<T>::_fieldNum);
428 // int NumberOfComponents = med_2_2::MEDnChamp(MED_FIELD_DRIVER<T>::_medIdt,MED_FIELD_DRIVER<T>::_fieldNum) ;
429 if (numberOfComponents < 1)
430 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no component")) ; // use iostring !
431 // test type to check if it is rigth !!!???
432 MED_FIELD_DRIVER<T>::_ptrField->_numberOfComponents = numberOfComponents ;
433 MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = new int[numberOfComponents] ;
434 MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = new string[numberOfComponents] ;
435 MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = new UNIT[numberOfComponents] ;
436 MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = new string[numberOfComponents] ;
437 MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = new string[numberOfComponents] ;
438 for (int i=0; i<numberOfComponents; i++) {
439 MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes[i] = 1 ;
441 // PG : what about space !!!
442 MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i] = string(componentName,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
443 SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i]);
444 MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i] = string(unitName,i*MED_TAILLE_PNOM22,MED_TAILLE_PNOM22) ;
445 SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i]);
447 delete[] componentName;
450 // read values for each geometric type in _support
451 int NumberOfTypes = MED_FIELD_DRIVER<T>::_ptrField->_support->getNumberOfTypes() ;
452 const MED_EN::medGeometryElement *Types = MED_FIELD_DRIVER<T>::_ptrField->_support->getTypes() ;
453 T ** myValues = new T*[NumberOfTypes] ;
454 int * NumberOfValues = new int[NumberOfTypes] ;
455 int TotalNumberOfValues = 0 ;
456 MESSAGE ("NumberOfTypes :"<< NumberOfTypes);
457 MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues=0 ;
458 for (int i=0; i<NumberOfTypes; i++) {
459 MESSAGE ("Type["<<i+1<<"] :"<< Types[i]);
460 MESSAGE ("Entity :"<<MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
461 // NumberOfValues[i] =
463 // const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
464 // (med_2_2::med_entite_maillage)_ptrField->_support->getEntity(),
465 // (med_2_2::med_geometrie_element)Types[i],
466 // _ptrField->_iterationNumber,
467 // _ptrField->_orderNumber) ; // no time step ! prend en compte le nbre de pt de gauss
468 // test if NumberOfValues is the same in _support !!! TODO that !!
470 // we could allocate array
471 // Be really carefull about the profil; especially the last arg of
475 MEDnVal(MED_FIELD_DRIVER22<T>::_medIdt,
476 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
477 (med_2_2::med_entite_maillage)MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),
478 (med_2_2::med_geometrie_element) Types[i],
479 MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber, MED_FIELD_DRIVER<T>::_ptrField->_orderNumber,
480 const_cast <char*> (MED_FIELD_DRIVER<T>::_ptrField->_support->getMesh()->getName().c_str()),
481 med_2_2::MED_COMPACT) ;
483 myValues[i] = new T[ NumberOfValues[i]*numberOfComponents ] ;
484 TotalNumberOfValues+=NumberOfValues[i] ;// diviser par le nombre de point de gauss
485 char * ProfilName = new char[MED_TAILLE_NOM+1];
486 char * LocalGaussName = new char[MED_TAILLE_NOM+1];
487 MESSAGE ("NumberOfValues :"<< NumberOfValues[i]);
488 MESSAGE ("NumberOfComponents :"<< numberOfComponents);
489 MESSAGE ("MESH_NAME :"<< MeshName.c_str());
490 MESSAGE ("FIELD_NAME :"<< MED_FIELD_DRIVER<T>::_fieldName.c_str());
491 MESSAGE ("MED_ENTITE :"<< (med_2_2::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity());
492 MESSAGE("MED_GEOM :"<<(med_2_2::med_geometrie_element)Types[i]);
493 MESSAGE("Iteration :"<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
494 MESSAGE("Order :"<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
495 MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOfValues[i]; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
497 err = MEDchampLire(MED_FIELD_DRIVER22<T>::_medIdt,const_cast <char*> (MeshName.c_str()),
498 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
499 (unsigned char*) myValues[i],
500 med_2_2::MED_NO_INTERLACE,MED_ALL,
501 LocalGaussName,ProfilName,
502 med_2_2::MED_NO_PFLMOD,
503 (med_2_2::med_entite_maillage) MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),(med_2_2::med_geometrie_element)Types[i],
504 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
505 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
508 // we must do some delete !!!
509 for(int j=0; j<=i;j++)
510 delete[] myValues[j];
512 delete[] NumberOfValues ;
514 delete[] LocalGaussName;
515 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes ;
516 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsNames ;
517 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits ;
518 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions ;
519 delete[] MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits ;
520 MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = NULL ;
521 MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = NULL ;
522 MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = NULL ;
523 MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = NULL ;
524 MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = NULL ;
525 MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ; // we have not found right field, so reset the field number
526 throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": ERROR when read value")) ;
529 // At this time ProfilName should be med_2_2::MED_NOPFL and
530 // LocalGaussName should be med_2_2::MED_NOGAUSS
531 delete[] ProfilName ;
532 delete[] LocalGaussName ;
535 // probleme avec les points de gauss : voir lorsqu-il y en a (!= 1)
536 // MEDARRAY<T> * Values = new MEDARRAY<T>(MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),TotalNumberOfValues/MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents(),MED_EN::MED_NO_INTERLACE);
538 if (MED_FIELD_DRIVER<T>::_ptrField->_value==NULL)
539 MED_FIELD_DRIVER<T>::_ptrField->_value=new MEDARRAY<T>(numberOfComponents,TotalNumberOfValues,MED_EN::MED_NO_INTERLACE);
541 MEDARRAY<T> * Values = MED_FIELD_DRIVER<T>::_ptrField->_value ; // create by constructor ???
542 // check if dimensions are right : inutile : c'est dans le constructeur !!!
543 //if (Values->getLeadingValue() != numberOfComponents)
544 // throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": leading dimension are false : "<<Values->getLeadingValue()<<" and "<<numberOfComponents) ) ;
545 //if (Values->getLengthValue() != TotalNumberOfValues)
546 // throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": length dimension are false : "<<Values->getLengthValue()<<" and "<<TotalNumberOfValues) ) ;
548 for (int i=0; i<numberOfComponents; i++) {
549 //T * ValuesT = Values->getRow(i+1) ;
551 for (int j=0; j<NumberOfTypes; j++) {
552 T * myValue = myValues[j] ;
553 int NumberOf = NumberOfValues[j] ;
554 // MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOf; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
555 int offset = NumberOf*i ;
556 for (int k=0 ; k<NumberOf; k++) {
557 //ValuesT[Count]=myValue[k+offset] ;
558 Values->setIJ(Count,i+1,myValue[k+offset]);
560 SCRUTE(Values->getIJ(Count,i+1));
566 for (int j=0; j<NumberOfTypes; j++)
567 delete[] myValues[j] ;
569 delete[] NumberOfValues ;
571 MED_FIELD_DRIVER<T>::_ptrField->_isRead = true ;
577 template <class T> void MED_FIELD_RDONLY_DRIVER22<T>::write( void ) const
580 throw MEDEXCEPTION("MED_FIELD_RDONLY_DRIVER22::write : Can't write with a RDONLY driver !");
583 /*--------------------- WRONLY PART -------------------------------*/
585 template <class T> GENDRIVER * MED_FIELD_WRONLY_DRIVER22<T>::copy(void) const
587 return new MED_FIELD_WRONLY_DRIVER22<T>(*this);
590 template <class T> void MED_FIELD_WRONLY_DRIVER22<T>::read (void)
593 throw MEDEXCEPTION("MED_FIELD_WRONLY_DRIVER22::read : Can't read with a WRONLY driver !");
596 template <class T> void MED_FIELD_WRONLY_DRIVER22<T>::write(void) const
599 const char * LOC = "MED_FIELD_WRONLY_DRIVER22::write(void) const " ;
601 if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
605 int component_count=MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents();
606 string component_name(component_count*MED_TAILLE_PNOM22,' ') ;
607 string component_unit(component_count*MED_TAILLE_PNOM22,' ') ;
609 const string * listcomponent_name=MED_FIELD_DRIVER<T>::_ptrField->getComponentsNames() ;
610 const string * listcomponent_unit=MED_FIELD_DRIVER<T>::_ptrField->getMEDComponentsUnits() ;
612 for (int i=0; i < component_count ; i++) {
613 length = min(MED_TAILLE_PNOM22,(int)listcomponent_name[i].size());
614 component_name.replace(i*MED_TAILLE_PNOM22,length,
615 listcomponent_name[i],0,length);
616 length = min(MED_TAILLE_PNOM22,(int)listcomponent_unit[i].size());
617 component_unit.replace(i*MED_TAILLE_PNOM22,length,
618 listcomponent_unit[i],0,length);
621 MESSAGE("component_name=|"<<component_name<<"|");
622 MESSAGE("component_unit=|"<<component_unit<<"|");
624 MED_EN::med_type_champ ValueType=MED_FIELD_DRIVER<T>::_ptrField->getValueType() ;
626 MESSAGE("Template Type =|"<<ValueType<<"|");
628 // le champ existe deja ???
629 char * champName = new char[MED_TAILLE_NOM+1] ;
630 med_2_2::med_type_champ type ;
634 int n = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,0);
636 for (int i=1; i<=n; i++) {
637 nbComp = med_2_2::MEDnChamp(MED_FIELD_DRIVER22<T>::_medIdt,i);
638 compName = new char[MED_TAILLE_PNOM22*nbComp+1];
639 compUnit = new char[MED_TAILLE_PNOM22*nbComp+1];
640 err = med_2_2::MEDchampInfo(MED_FIELD_DRIVER22<T>::_medIdt,i,champName,&type,compName,compUnit,nbComp);
642 if (strcmp(champName,MED_FIELD_DRIVER<T>::_ptrField->getName().c_str())==0) { // Found !
652 if (nbComp != component_count)
653 throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
654 <<": Field exist in file, but number of component are different : "<<nbComp<<" in file and "<<component_count<<" in memory."
657 // component name and unit
658 MESSAGE(LOC<<" Component name in file : "<<compName);
659 MESSAGE(LOC<<" Component name in memory : "<<component_name);
660 MESSAGE(LOC<<" Component unit in file : "<<compUnit);
661 MESSAGE(LOC<<" Component unit in memory : "<<component_unit);
666 // Verify the field doesn't exist
668 string dataGroupName = "/CHA/";
669 dataGroupName += MED_FIELD_DRIVER<T>::_ptrField->getName();
670 MESSAGE(LOC << "|" << dataGroupName << "|" );
671 med_2_2::med_idt gid = H5Gopen(MED_FIELD_DRIVER22<T>::_medIdt, dataGroupName.c_str() );
675 err=med_2_2::MEDchampCr(MED_FIELD_DRIVER22<T>::_medIdt,
676 const_cast <char*> ((MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
677 (med_2_2::med_type_champ) ValueType,
678 const_cast <char*> ( component_name.c_str() ),
679 const_cast <char*> ( component_unit.c_str() ),
682 throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
683 << ": Error MEDchampCr : "<<err
690 const SUPPORT * mySupport = MED_FIELD_DRIVER<T>::_ptrField->getSupport() ;
692 if (! mySupport->isOnAllElements())
693 throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
694 <<": Field must be on all entity"
698 MESH * myMesh = mySupport->getMesh() ;
699 string MeshName = myMesh->getName() ;
700 //MED_EN::medModeSwitch Mode = MED_FIELD_DRIVER<T>::_ptrField->_value->getMode() ;
701 // on boucle sur tout les types pour ecrire les tableaux de valeur
702 int NumberOfType = mySupport->getNumberOfTypes() ;
704 const MED_EN::medGeometryElement * Types = mySupport->getTypes() ;
705 const int * NumberOfGaussPoint = mySupport->getNumberOfGaussPoint() ;
706 for (int i=0;i<NumberOfType;i++) {
707 int NumberOfElements = mySupport->getNumberOfElements(Types[i]) ;
709 const T * value = MED_FIELD_DRIVER<T>::_ptrField->getValueI(MED_EN::MED_FULL_INTERLACE,Index) ;
711 MESSAGE("MED_FIELD_DRIVER<T>22::_medIdt : "<<MED_FIELD_DRIVER22<T>::_medIdt);
712 MESSAGE("MeshName.c_str() : "<<MeshName.c_str());
713 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getName() : "<<MED_FIELD_DRIVER<T>::_ptrField->getName());
714 MESSAGE("value : "<<value);
715 MESSAGE("NumberOfElements : "<<NumberOfElements);
716 MESSAGE("NumberOfGaussPoint[i] : "<<NumberOfGaussPoint[i]);
717 MESSAGE("mySupport->getEntity() : "<<mySupport->getEntity());
718 MESSAGE("Types[i] : "<<Types[i]);
719 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
720 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getTime() : "<<MED_FIELD_DRIVER<T>::_ptrField->getTime());
721 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
723 /* char chanom[MED_TAILLE_NOM+1];
724 char chacomp[MED_TAILLE_NOM+1];
725 char chaunit[MED_TAILLE_NOM+1];
726 med_2_2::med_type_champ chatype;
729 err=med_2_2::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt,1,chanom,&chatype,chacomp,chaunit,chancomp);
733 cout<<"=======================================================================> gros probleme"<<endl;
736 cout<<"==================> nom lu = "<<chanom<<endl;
737 cout<<"==================> type lu = "<<chatype<<endl;
738 cout<<"==================> nom composante lu = "<<chacomp<<endl;
739 cout<<"==================> nom unit lu = "<<chaunit<<endl;
740 cout<<"==================> valeur de med_2_2::MED_REEL64 = "<<med_2_2::MED_REEL64<<endl;
743 // err=med_2_2::MEDchampEcr(_medIdt,
744 // const_cast <char*> ( MeshName.c_str()) , //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
745 // const_cast <char*> ( (_ptrField->getName()).c_str()),
746 // (unsigned char*)value,
747 // med_2_2::MED_FULL_INTERLACE,
749 // NumberOfGaussPoint[i],
752 // med_2_2::MED_REMP, // PROFIL NON GERE, mode de remplacement non géré
753 // (med_2_2::med_entite_maillage)mySupport->getEntity(),
754 // (med_2_2::med_geometrie_element)Types[i],
755 // _ptrField->getIterationNumber(),
757 // _ptrField->getTime(),
758 // _ptrField->getOrderNumber()
761 err=med_2_2::MEDchampEcr(MED_FIELD_DRIVER22<T>::_medIdt,
762 const_cast <char*> ( MeshName.c_str()) , //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
763 const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
764 (unsigned char*)value,
765 med_2_2::MED_FULL_INTERLACE,
766 NumberOfElements*NumberOfGaussPoint[i],
767 MED_NOGAUSS, MED_ALL, MED_NOPFL,
768 med_2_2::MED_NO_PFLMOD, // PROFIL NON GERE, mode de remplacement non géré
769 (med_2_2::med_entite_maillage)mySupport->getEntity(),
770 (med_2_2::med_geometrie_element)Types[i],
771 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
773 MED_FIELD_DRIVER<T>::_ptrField->getTime(),
774 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
777 if (err < MED_VALID )
778 throw MEDEXCEPTION(LOCALIZED( STRING(LOC)
779 <<": Error in writing Field "<< MED_FIELD_DRIVER<T>::_ptrField->getName() <<", type "<<Types[i]
783 Index += NumberOfElements ;
791 /*--------------------- RDWR PART -------------------------------*/
793 template <class T> GENDRIVER * MED_FIELD_RDWR_DRIVER22<T>::copy(void) const
795 return new MED_FIELD_RDWR_DRIVER22<T>(*this);
798 template <class T> void MED_FIELD_RDWR_DRIVER22<T>::write(void) const
801 BEGIN_OF("MED_FIELD_RDWR_DRIVER22::write(void)");
802 MED_FIELD_WRONLY_DRIVER22<T>::write();
803 END_OF("MED_FIELD_RDWR_DRIVER22::write(void)");
806 template <class T> void MED_FIELD_RDWR_DRIVER22<T>::read (void)
809 BEGIN_OF("MED_FIELD_RDWR_DRIVER22::read(void)");
810 MED_FIELD_RDONLY_DRIVER22<T>::read();
811 END_OF("MED_FIELD_RDWR_DRIVER22::read(void)");
815 /*-----------------------------------------------------------------*/
817 #endif /* MED_FIELD_DRIVER_HXX */