1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef MED_FIELD_DRIVER21_HXX
21 #define MED_FIELD_DRIVER21_HXX
25 #include "MEDMEM_define.hxx"
27 #include "MEDMEM_DriversDef.hxx"
28 #include "MEDMEM_Utilities.hxx"
29 #include "MEDMEM_MedFieldDriver.hxx"
30 #include "MEDMEM_STRING.hxx"
31 #include "MEDMEM_Exception.hxx"
32 #include "MEDMEM_Unit.hxx"
34 #include "MEDMEM_ArrayInterface.hxx"
35 #include "MEDMEM_ArrayConvert.hxx"
37 #include "MEDMEM_Support.hxx"
38 #include "MEDMEM_Mesh.hxx"
46 Generic part : implement open and close methods.
50 template <class T> class MED_FIELD_DRIVER21 : public virtual MED_FIELD_DRIVER<T>
53 med_2_1::med_idt _medIdt;
55 bool createFieldSupport(med_2_1::med_idt id,
60 string & meshName) const throw (MEDEXCEPTION);
62 void getMeshGeometricType(med_2_1::med_idt id,
64 MED_EN::medEntityMesh entite,
65 vector<MED_EN::medGeometryElement> & geoType,
66 vector<int> &nbOfElOfType) const;
73 MED_FIELD_DRIVER21():MED_FIELD_DRIVER<T>(),_medIdt(MED_INVALID)
78 template <class INTERLACING_TAG>
79 MED_FIELD_DRIVER21(const string & fileName,
80 FIELD<T, INTERLACING_TAG> * ptrField,
81 MED_EN::med_mode_acces accessMode)
82 : MED_FIELD_DRIVER<T>(fileName,ptrField,accessMode),_medIdt(MED_INVALID)
89 MED_FIELD_DRIVER21(const MED_FIELD_DRIVER21 & fieldDriver):
90 MED_FIELD_DRIVER<T>(fieldDriver), _medIdt(fieldDriver._medIdt)
97 virtual ~MED_FIELD_DRIVER21() {
100 void open() throw (MEDEXCEPTION)
102 const char * LOC = "MED_FIELD_DRIVER21::open() ";
105 // we must set fieldname before open, because we must find field number in file (if it exist !!!)
106 if ( MED_FIELD_DRIVER<T>::_fileName == "" )
107 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
108 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
112 MESSAGE(LOC<<"_fileName.c_str : "<< MED_FIELD_DRIVER<T>::_fileName.c_str()<<",mode : "<< MED_FIELD_DRIVER<T>::_accessMode);
113 _medIdt = med_2_1::MEDouvrir( (const_cast <char *> (MED_FIELD_DRIVER<T>::_fileName.c_str())),(med_2_1::med_mode_acces) MED_FIELD_DRIVER<T>::_accessMode);
114 MESSAGE(LOC<<"_medIdt : "<< _medIdt );
116 MED_FIELD_DRIVER<T>::_status=MED_OPENED;
118 MED_FIELD_DRIVER<T>::_status = MED_INVALID;
119 MED_FIELD_DRIVER21<T>::_medIdt = MED_INVALID;
120 throw MED_EXCEPTION (LOCALIZED( STRING(LOC)
121 << "Can't open |" << MED_FIELD_DRIVER<T>::_fileName
122 << "|, _medIdt : " << MED_FIELD_DRIVER21<T>::_medIdt
131 BEGIN_OF("MED_FIELD_DRIVER21::close()");
132 med_2_1::med_int err = 0;
133 if (MED_FIELD_DRIVER<T>::_status == MED_OPENED) {
134 err=med_2_1::MEDfermer(MED_FIELD_DRIVER21<T>::_medIdt);
135 //H5close(); // If we call H5close() all the files are closed.
136 MED_FIELD_DRIVER<T>::_status = MED_CLOSED;
137 MED_FIELD_DRIVER21<T>::_medIdt = MED_INVALID;
138 MESSAGE(" MED_FIELD_DRIVER21::close() : MEDfermer : MED_FIELD_DRIVER21<T>::_medIdt= " << _medIdt );
139 MESSAGE(" MED_FIELD_DRIVER21::close() : MEDfermer : err = " << err );
141 END_OF("MED_FIELD_DRIVER21::close()");
149 Driver Med for FIELD : Read only.
151 Implement read method.
155 template <class T> class MED_FIELD_RDONLY_DRIVER21 : public virtual MED_FIELD_DRIVER21<T>, public virtual IMED_FIELD_RDONLY_DRIVER<T>
163 MED_FIELD_RDONLY_DRIVER21():MED_FIELD_DRIVER<T>() {};
168 template <class INTERLACING_TAG>
169 MED_FIELD_RDONLY_DRIVER21(const string & fileName,
170 FIELD<T, INTERLACING_TAG> * ptrField):
171 MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDONLY),
172 MED_FIELD_DRIVER21<T>(fileName,ptrField,MED_EN::MED_RDONLY),
173 IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField)
175 BEGIN_OF("MED_FIELD_RDONLY_DRIVER21::MED_FIELD_RDONLY_DRIVER21(const string & fileName, const FIELD<T,INTERLACING_TAG> * ptrField)");
176 END_OF("MED_FIELD_RDONLY_DRIVER21::MED_FIELD_RDONLY_DRIVER21(const string & fileName, const FIELD<T,INTERLACING_TAG> * ptrField)");
182 MED_FIELD_RDONLY_DRIVER21(const MED_FIELD_RDONLY_DRIVER21 & fieldDriver):
183 IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
184 MED_FIELD_DRIVER21<T>(fieldDriver),
185 MED_FIELD_DRIVER<T>(fieldDriver)
191 virtual ~MED_FIELD_RDONLY_DRIVER21() {};
193 // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
196 Return a MEDEXCEPTION : it is the read-only driver.
198 void write( void ) const throw (MEDEXCEPTION) ;
200 Read FIELD in the specified file.
202 void read ( void ) throw (MEDEXCEPTION) ;
205 GENDRIVER * copy( void ) const ;
211 Driver Med for FIELD : Write only.
213 Implement write method.
217 template <class T> class MED_FIELD_WRONLY_DRIVER21 : public virtual MED_FIELD_DRIVER21<T>, public virtual IMED_FIELD_WRONLY_DRIVER<T> {
224 MED_FIELD_WRONLY_DRIVER21():MED_FIELD_DRIVER<T>() {}
229 template <class INTERLACING_TAG>
230 MED_FIELD_WRONLY_DRIVER21(const string & fileName,
231 FIELD<T, INTERLACING_TAG> * ptrField):
232 IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
233 MED_FIELD_DRIVER21<T>(fileName,ptrField,MED_EN::MED_WRONLY),
234 MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_WRONLY)
236 BEGIN_OF("MED_FIELD_WRONLY_DRIVER21::MED_FIELD_WRONLY_DRIVER21(const string & fileName, const FIELD<T,INTERLACING_TAG> * ptrField)");
237 END_OF("MED_FIELD_WRONLY_DRIVER21::MED_FIELD_WRONLY_DRIVER21(const string & fileName, const FIELD<T,INTERLACING_TAG> * ptrField)");
243 MED_FIELD_WRONLY_DRIVER21(const MED_FIELD_WRONLY_DRIVER21 & fieldDriver):
244 IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
245 MED_FIELD_DRIVER21<T>(fieldDriver),
246 MED_FIELD_DRIVER<T>(fieldDriver)
252 virtual ~MED_FIELD_WRONLY_DRIVER21() {};
255 Write FIELD in the specified file.
257 void write( void ) const throw (MEDEXCEPTION) ;
259 Return a MEDEXCEPTION : it is the write-only driver.
261 void read ( void ) throw (MEDEXCEPTION) ;
264 GENDRIVER * copy( void ) const ;
271 Driver Med for FIELD : Read write.
272 - Use read method from MED_FIELD_RDONLY_DRIVER
273 - Use write method from MED_FIELD_WDONLY_DRIVER
277 template <class T> class MED_FIELD_RDWR_DRIVER21 : public MED_FIELD_RDONLY_DRIVER21<T>, public MED_FIELD_WRONLY_DRIVER21<T>, public IMED_FIELD_RDWR_DRIVER<T> {
284 MED_FIELD_RDWR_DRIVER21():MED_FIELD_DRIVER21<T>() {}
289 template <class INTERLACING_TAG>
290 MED_FIELD_RDWR_DRIVER21(const string & fileName,
291 FIELD<T, INTERLACING_TAG> * ptrField):
292 MED_FIELD_WRONLY_DRIVER21<T>(fileName,ptrField),
293 MED_FIELD_RDONLY_DRIVER21<T>(fileName,ptrField),
294 IMED_FIELD_RDONLY_DRIVER<T>(fileName,ptrField),
295 IMED_FIELD_WRONLY_DRIVER<T>(fileName,ptrField),
296 MED_FIELD_DRIVER<T>(fileName,ptrField,MED_EN::MED_RDWR),
297 IMED_FIELD_RDWR_DRIVER<T>(fileName,ptrField)
299 BEGIN_OF("MED_FIELD_RDWR_DRIVER21::MED_FIELD_RDWR_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
300 //_accessMode = MED_RDWR ;
301 END_OF("MED_FIELD_RDWR_DRIVER21::MED_FIELD_RDWR_DRIVER21(const string & fileName, const FIELD<T> * ptrField)");
307 MED_FIELD_RDWR_DRIVER21(const MED_FIELD_RDWR_DRIVER21 & fieldDriver):
308 MED_FIELD_WRONLY_DRIVER21<T>(fieldDriver),
309 MED_FIELD_RDONLY_DRIVER21<T>(fieldDriver),
310 IMED_FIELD_RDWR_DRIVER<T>(fieldDriver),
311 IMED_FIELD_RDONLY_DRIVER<T>(fieldDriver),
312 IMED_FIELD_WRONLY_DRIVER<T>(fieldDriver),
313 MED_FIELD_DRIVER<T>(fieldDriver)
319 ~MED_FIELD_RDWR_DRIVER21() {};
322 Write FIELD in the specified file.
324 void write(void) const throw (MEDEXCEPTION) ;
326 Read FIELD in the specified file.
328 void read (void) throw (MEDEXCEPTION) ;
331 GENDRIVER * copy( void ) const ;
335 /*--------------------- DRIVER PART -------------------------------*/
337 template <class T> bool
338 MED_FIELD_DRIVER21<T>::createFieldSupport(med_2_1::med_idt id,
340 med_2_1::med_int ndt,
343 string & meshName) const throw (MEDEXCEPTION)
346 //EF : Gérer le meshName pour le driver 2.2
347 const char * LOC="MED_FIELD_DRIVER<T>::search_field(...)";
349 map<int, list<MED_EN::medGeometryElement> > CellAndNodeEntities;
350 map<int, list<MED_EN::medGeometryElement> >::iterator currentEntity;
351 CellAndNodeEntities[MED_EN::MED_CELL] = MED_EN::meshEntities[MED_EN::MED_CELL];
352 CellAndNodeEntities[MED_EN::MED_NODE] = MED_EN::meshEntities[MED_EN::MED_NODE];
353 list< MED_EN::medGeometryElement >::const_iterator currentGeometry;
355 //med_2_1::med_entite_maillage
356 MED_EN::medEntityMesh entity;
357 bool alreadyFoundAnEntity=false, alreadyFoundPdtIt = false, anyGauss=false;
358 int numberOfElements = 0;
359 int numberOfGeometricType = 0;
360 //med_2_1::med_geometrie_element..
361 MED_EN::medGeometryElement geometricType[MED_NBR_GEOMETRIE_MAILLE];
362 int numberOfElementsOfType[MED_NBR_GEOMETRIE_MAILLE];
363 int numberOfGaussPoints[MED_NBR_GEOMETRIE_MAILLE];
365 med_2_1::med_int ngauss=0, numdt=-1, numo=-1, nbPdtIt=0; //nmaa=0
366 char dtunit[MED_TAILLE_PNOM21+1], maa[MED_TAILLE_NOM+1];
367 med_2_1::med_float dt=-1.0;
368 //med_2_1::med_booleen local;
369 med_2_1::med_err ret=1;
371 for (currentEntity = CellAndNodeEntities.begin();
372 currentEntity != CellAndNodeEntities.end(); currentEntity++) {
373 for (currentGeometry = (*currentEntity).second.begin();
374 currentGeometry != (*currentEntity).second.end(); currentGeometry++) {
376 if ( (numberOfElements = med_2_1::MEDnVal(id, const_cast <char*> ( fieldName.c_str() ),
377 (med_2_1::med_entite_maillage) (*currentEntity).first,
378 (med_2_1::med_geometrie_element) *currentGeometry,
382 if ( alreadyFoundAnEntity ) {
383 if (entity != (*currentEntity).first )
384 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Field |" << fieldName
385 << "| with (ndt,or) = (" << ndt << ","
386 << od << ") must not be defined on nodes and cells" ));
388 } else { entity=(*currentEntity).first; alreadyFoundAnEntity = true; };
390 nbPdtIt = med_2_1::MEDnPasdetemps(id, const_cast <char*> ( fieldName.c_str() ),
391 (med_2_1::med_entite_maillage) (*currentEntity).first,
392 (med_2_1::med_geometrie_element) *currentGeometry );
394 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Field |" << fieldName << "| with (ndt,or) = ("
395 << ndt << "," << od << ") should be defined for (entityType,geometricType)=("
396 << MED_EN::entNames[(*currentEntity).first] << ","
397 << MED_EN::geoNames[*currentGeometry] << ")" ));
399 ret = 0; alreadyFoundPdtIt = false; ngauss =0;
400 for ( med_2_1::med_int j=1; j <= nbPdtIt; j++ ) {
402 // Search how many <ngauss> (<fieldName>,<ndt>,<ot>) has
403 ret = med_2_1::MEDpasdetempsInfo(id, const_cast <char*> ( fieldName.c_str() ),
404 (med_2_1::med_entite_maillage) (*currentEntity).first,
405 (med_2_1::med_geometrie_element) *currentGeometry,
406 j,maa,&ngauss,&numdt,dtunit,&dt,&numo);
408 // ret = med_2_2::MEDpasdetempsInfo(id, const_cast <char*> ( fieldName.c_str() ),
409 // (med_2_1::med_entite_maillage) (*currentEntity).first,
410 // (med_2_1::med_geometrie_element) *currentGeometry,
411 // j, &ngauss, &numdt, &numo, &dtunit, &dt, &maa, &local, &nmaa)
413 if ( ndt == numdt && numo == od ) {
414 alreadyFoundPdtIt = true;
415 if ( ! meshName.empty() )
416 if ( meshName != maa ) {
420 //EF : Gérer le meshName pour le driver 2.2
421 // MESSAGE(STRING(LOC)<<" Field |" << fieldName << "| with (ndt,or) = (" << ndt << ","
422 // << ot << ") is defined on " << nmaa << " meshes, using mesh |"
425 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Field |" << fieldName << "| with (ndt,or) = ("
426 << ndt << "," << od << ") for (entityType,geometricType)=("
427 << MED_EN::entNames[(*currentEntity).first] << ","
428 << MED_EN::geoNames[*currentGeometry] << ")"
429 << "is defined on mesh |" << maa << "| not on mesh |" << meshName ));
436 if ( !alreadyFoundPdtIt )
437 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Field |" << fieldName << "| with (ndt,or) = ("
438 << ndt << "," << od << ") should be defined for (entityType,geometricType)=("
439 << MED_EN::entNames[(*currentEntity).first] << ","
440 << MED_EN::geoNames[*currentGeometry] << ")" ));
442 if ( (ret != 0) || (ngauss < 1 ) )
443 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Error in MEDpasdetempsInfo for Field |" << fieldName
444 << "| with (ndt,or) = ("
445 << ndt << "," << od << ") for (entityType,geometricType)=("
446 << MED_EN::entNames[(*currentEntity).first] << ","
447 << MED_EN::geoNames[*currentGeometry] << ")" )); ;
449 //totalNumberOfElements+=numberOfElements;
450 numberOfElementsOfType[numberOfGeometricType] = numberOfElements/ngauss;
451 numberOfGaussPoints[numberOfGeometricType] = ngauss;
452 anyGauss = (anyGauss || (ngauss-1) );
453 geometricType[numberOfGeometricType]= *currentGeometry;
454 numberOfGeometricType++;
460 if ( alreadyFoundAnEntity) {
461 support.setName(fieldName+"Support");
462 support.setMeshName(string(maa)); // Vérifier que les différents noms de maillages lus soient identiques
463 support.setEntity(entity);
464 // REM : Signification précédente erronée pour un champ qui ne repose pas sur toutes les entités géométriques
465 // du maillage mais dont le SUPPORT a été crée à partir des informations d'un maillage, comme
466 // celà fût la plupart du temps.
467 support.setNumberOfGeometricType(numberOfGeometricType);
468 support.setGeometricType(geometricType); // Utile uniquement si setAll == false
469 support.setNumberOfElements(numberOfElementsOfType); //setNumberOfElements effectue une copie
470 support.setAll(true);
472 return alreadyFoundAnEntity;
477 template <class T> void
478 MED_FIELD_DRIVER21<T>::getMeshGeometricType(med_2_1::med_idt id,
480 MED_EN::medEntityMesh entity,
481 vector<MED_EN::medGeometryElement> & geoType,
482 vector<int> &nbOfElOfType) const
484 const char LOC[] = "MED_FIELD_DRIVER<T>::getMeshGeometricType(...)";
486 int numberOfGeometricType=0;
487 MED_EN::medGeometryElement geometricType[MED_NBR_GEOMETRIE_MAILLE];
488 int numberOfElementsOfType[MED_NBR_GEOMETRIE_MAILLE];
489 med_2_1::med_int numberOfElements=0;
490 med_2_1::med_table quoi;
491 if (entity == MED_EN::MED_CELL) quoi=med_2_1::MED_CONN;
493 if (entity == MED_EN::MED_NODE) quoi=med_2_1::MED_COOR;
495 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Support Creation from Mesh |" << meshName
496 << "| on entity " << MED_EN::entNames[entity]
497 << "| is impossible, must be on MED_NODE or MED_CELL" ));
499 list<MED_EN::medGeometryElement>::const_iterator currentGeometry;
500 bool alreadyFoundAnEntity = false;
502 for (currentGeometry = (MED_EN::meshEntities[entity]).begin();
503 currentGeometry != (MED_EN::meshEntities[entity]).end(); currentGeometry++) {
506 if ( (numberOfElements =
507 med_2_1::MEDnEntMaa(id,
508 const_cast<char*> (meshName.c_str()),
510 (med_2_1::med_entite_maillage) entity,
511 (med_2_1::med_geometrie_element) *currentGeometry,
512 med_2_1::MED_NOD) ) <= 0)
515 alreadyFoundAnEntity = true;
516 numberOfElementsOfType[numberOfGeometricType] = numberOfElements;
517 geometricType[numberOfGeometricType] = *currentGeometry;
518 numberOfGeometricType++;
522 geoType = vector<MED_EN::medGeometryElement>(geometricType,geometricType+numberOfGeometricType);
523 nbOfElOfType = vector<int> (numberOfElementsOfType,numberOfElementsOfType+numberOfGeometricType);
527 /*--------------------- RDONLY PART -------------------------------*/
529 template <class T> GENDRIVER * MED_FIELD_RDONLY_DRIVER21<T>::copy(void) const
531 return new MED_FIELD_RDONLY_DRIVER21<T>(*this);
534 template <class T> void MED_FIELD_RDONLY_DRIVER21<T>::read(void)
537 const char * LOC = " MED_FIELD_RDONLY_DRIVER21::read() " ;
540 typedef typename MEDMEM_ArrayInterface<T,NoInterlace,NoGauss>::Array ArrayNo;
541 typedef typename MEDMEM_ArrayInterface<T,FullInterlace,NoGauss>::Array ArrayFull;
543 if ( ( MED_FIELD_DRIVER<T>::_fieldName.empty() ) &&
544 ( MED_FIELD_DRIVER<T>::_ptrField->_name.empty() ) )
545 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)
546 <<" neither <fieldName> is set in driver nor in object FIELD.")) ;
548 // If _fieldName is not set in driver, try to use _ptrfield->_fieldName
549 if ( ( MED_FIELD_DRIVER<T>::_fieldName.empty() ) &&
550 ( !MED_FIELD_DRIVER<T>::_ptrField->_name.empty() ) )
551 MED_FIELD_DRIVER<T>::_fieldName=MED_FIELD_DRIVER<T>::_ptrField->_name;
553 if ( MED_FIELD_DRIVER<T>::_fieldName.size() > MED_TAILLE_NOM )
554 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)
555 <<" <fieldName> size in object driver FIELD is > MED_TAILLE_NOM ."));
558 MESSAGE("###### "<<LOC<<" fieldNameDRIVER : "<< MED_FIELD_DRIVER<T>::_fieldName <<
559 " fieldName : "<<MED_FIELD_DRIVER<T>::_fieldName);
562 if (MED_FIELD_DRIVER<T>::_status!=MED_OPENED)
563 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": Method open must be called before method read.")) ;
566 // Si un support a été donnée au champ, pour des raisons de compatibilité avec
567 // les versions précédentes, ce support sera utilisé pour
568 // - Obtenir le nom du maillage sur lequel on veut lire le champ
569 // (eventuellement on pourrait l'utiliser pour selectionner un champ qui
570 // repose sur plusieurs maillages cf HOMARD-ASTER)
571 // - vérifier le type d'entité (MED_NOEUD xor MED_MAILLE xor MED_FACE xor MED_ARETE ) sur lequel
572 // il faut lire le champ qui est également retouvé.
573 // - Si le support défini une liste d'entité ( différente de MED_ALL_ELEMENTS), celle-ci est ignorée
574 // à la lecture et écrasé par les listes de profils lus s'il en existe
576 // Si aucun support n'a été donné au champ :
577 // - A la lecture : Un support est crée et le type d'entité unique est lu
578 // (cf decision gt MED qu'un champ repose sur une entité unique ?),
579 // l'ensemble des types géométriques est lu,
580 // l'ensemble des profils par type géométrique est lu
581 // Le nom du maillage associé est lu mais le pointeur SUPPORT-MESH non initialisé
583 char * fieldName = new char[MED_TAILLE_NOM+1] ;
586 int numberOfComponents = 0;
587 char * componentName = (char *) MED_NULL;
588 char * unitName = (char *) MED_NULL;
589 med_2_1::med_type_champ type ;
590 med_2_1::med_idt id = MED_FIELD_DRIVER21<T>::_medIdt;
592 // we search for the field med number of <fieldName>
593 // Having found <fieldName> variables <numberOfComponents>,
594 // <componentName>, <unitname>, <type> and attribute <_fieldNum> are set.
595 if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID)
597 int numberOfFields = 0; //MED_INVALID
598 numberOfFields = med_2_1::MEDnChamp(id,0) ;
599 if ( numberOfFields <= 0 )
600 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": No Field found !"));
602 for (int i=1;i<=numberOfFields;i++)
604 numberOfComponents = med_2_1::MEDnChamp(id,i) ;
605 if ( numberOfComponents <= 0 )
606 // throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
607 // << "Be careful there is no compound for field n°"
608 // << i << "in file |"<<_fileName<<"| !"));
609 MESSAGE(LOC<<"Be careful there is no compound for field n°"<<i<<"in file |"<<MED_FIELD_DRIVER<T>::_fileName<<"| !");
611 componentName = new char[numberOfComponents*MED_TAILLE_PNOM21+1] ;
612 unitName = new char[numberOfComponents*MED_TAILLE_PNOM21+1] ;
614 err = med_2_1::MEDchampInfo(id, i, fieldName, &type, componentName,
615 unitName, numberOfComponents) ;
617 MESSAGE("Champ "<<i<<" : #" << fieldName <<"# et recherche #"<<MED_FIELD_DRIVER<T>::_fieldName.c_str()<<"#");
618 if ( !strcmp(fieldName,MED_FIELD_DRIVER<T>::_fieldName.c_str()) )
620 MESSAGE("FOUND FIELD "<< fieldName <<" : "<<i);
621 MED_FIELD_DRIVER<T>::_fieldNum = i ;
624 // not found : release memory and search next field !
625 delete[] componentName ;
632 if (MED_FIELD_DRIVER<T>::_fieldNum==MED_INVALID)
633 throw MEDEXCEPTION(LOCALIZED( STRING(LOC) << ": Field "<<MED_FIELD_DRIVER<T>::_fieldName << " not found in file " << MED_FIELD_DRIVER<T>::_fileName ) );
635 MESSAGE ("FieldNum : "<<MED_FIELD_DRIVER<T>::_fieldNum);
637 if (numberOfComponents < 1)
639 delete[] componentName; delete[] unitName;
640 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"no component found for field "
641 << MED_FIELD_DRIVER<T>::_fieldName)) ;
644 // Pourquoi _ptrField est toujour null et non MED_FIELD_DRIVER<T>::_ptrField
645 switch ( (med_2_1::med_type_champ) MED_FIELD_DRIVER<T>::_ptrField->_valueType ) {
646 case med_2_1::MED_INT :
647 case med_2_1::MED_INT32 :
648 case med_2_1::MED_INT64 :
649 if ( type == ( med_2_1::MED_REEL64 ) ) {
650 delete[] componentName; delete[] unitName;
651 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Field Type in file (" << type
652 <<") differs from FIELD object type (" <<
653 MED_FIELD_DRIVER<T>::_ptrField->_valueType << ")" )) ;
662 bool haveSupport = false;
663 if ( MED_FIELD_DRIVER<T>::_ptrField->getSupport() ) {
664 // Verif sur la taille du meshName
665 meshName = MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getMesh()->getName() ;
669 // Cherche le type d'entité, le nombre d'entité par type géométrique sur le type d'entité
670 // (MED_MAILLE ou MED_NOEUD uniquement car MEDMEMOIRE ne gère pas la connectivité descendante).
671 // et crée le support correspondant.
672 SUPPORT * mySupport = new SUPPORT();
673 bool found = createFieldSupport(id,MED_FIELD_DRIVER<T>::_fieldName,
674 MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber,
675 MED_FIELD_DRIVER<T>::_ptrField->_orderNumber,
676 *mySupport, meshName) ;
678 delete mySupport; delete[] componentName; delete[] unitName;
679 MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ;
680 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Can't find any entity for field |"
681 << MED_FIELD_DRIVER<T>::_fieldName
682 << "| with (it,or) = ("
683 << MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber << ","
684 << MED_FIELD_DRIVER<T>::_ptrField->_orderNumber << "), on mesh "
685 << meshName << "|" ));
689 meshName = mySupport->getMeshName();
691 if ( mySupport->getEntity() != MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getEntity() ) {
692 MED_EN::medEntityMesh ent = mySupport->getEntity();
693 delete mySupport; delete[] componentName; delete[] unitName;
694 MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ;
695 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<" Given entity |"
696 << MED_EN::entNames[MED_FIELD_DRIVER<T>::_ptrField->
697 getSupport()->getEntity()]
699 << MED_FIELD_DRIVER<T>::_fieldName
700 << "| with (it,or) = ("
701 << MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber << ","
702 << MED_FIELD_DRIVER<T>::_ptrField->_orderNumber << "), on mesh "
703 << meshName << "| differs from found entity |"
704 << MED_EN::entNames[ent] << "|."
707 mySupport->setName( MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getName() );
708 mySupport->setMesh( MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getMesh() );
709 mySupport->setDescription(MED_FIELD_DRIVER<T>::_ptrField->getSupport()->getDescription());
712 // Test si le Support du Champ repose ou non sur toutes les entités géométriques du maillage.
713 // Pour tester les profils aussi ?
714 vector< MED_EN::medGeometryElement > meshGeoType;
715 vector< int > meshNbOfElOfType;
716 getMeshGeometricType(id,meshName,mySupport->getEntity(),meshGeoType,meshNbOfElOfType);
717 vector < MED_EN::medGeometryElement > v1( mySupport->getTypes(),
718 mySupport->getTypes()+mySupport->getNumberOfTypes() );
719 vector < int > v2(mySupport->getNumberOfElements(),
720 mySupport->getNumberOfElements()+mySupport->getNumberOfTypes() );
721 if ( ( meshGeoType != v1 ) || meshNbOfElOfType != v2 ) {
722 mySupport->setAll(false);
725 //??support->setNumber(MEDSKYLINEARRAY * Number);
726 //??support->setNumber(const int * index, const int* value, bool shallowCopy=false);
728 // If an error occurs while reading the field, these allocated FIELD member will be deleted
729 MED_FIELD_DRIVER<T>::_ptrField->_name = MED_FIELD_DRIVER<T>::_fieldName;
730 MED_FIELD_DRIVER<T>::_ptrField->_numberOfComponents = numberOfComponents ;
731 MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = new int[numberOfComponents] ;
732 MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = new string[numberOfComponents] ;
733 MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = new UNIT[numberOfComponents] ;
734 MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = new string[numberOfComponents] ;
735 MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = new string[numberOfComponents] ;
737 for (int i=0; i<numberOfComponents; i++)
739 MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes[i] = 1 ;
740 MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i] = string(componentName,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
741 SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_componentsNames[i]);
742 MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i] = string(unitName,i*MED_TAILLE_PNOM21,MED_TAILLE_PNOM21) ;
743 SCRUTE(MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits[i]);
746 delete[] componentName;
749 // read values for each geometric type in _support
750 int NumberOfTypes = mySupport->getNumberOfTypes() ;
751 const MED_EN::medGeometryElement *Types = mySupport->getTypes() ;
752 T ** myValues = new T*[NumberOfTypes] ;
753 int * NumberOfValues = new int[NumberOfTypes] ;
754 int TotalNumberOfValues = 0 ; // Profils a gerer en 2.2 Rmq from EF
755 MESSAGE ("NumberOfTypes :"<< NumberOfTypes);
756 MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues=0 ;
758 for (int i=0; i<NumberOfTypes; i++) {
759 MESSAGE ("Type["<<i+1<<"] :"<< Types[i]);
760 MESSAGE ("Entity :"<< mySupport->getEntity());
762 // NumberOfValues[i] =
763 // MEDnVal(MED_FIELD_DRIVER21<T>::_medIdt,
764 // const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
765 // (med_2_1::med_entite_maillage)MED_FIELD_DRIVER<T>::_ptrField->_support->getEntity(),
766 // (med_2_1::med_geometrie_element)Types[i],
767 // MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber,
768 // MED_FIELD_DRIVER<T>::_ptrField->_orderNumber) ;
770 NumberOfValues[i] = mySupport->getNumberOfElements(Types[i])
771 * MED_FIELD_DRIVER<T>::_ptrField->getNumberOfGaussPoints(Types[i]);
773 myValues[i] = new T[ NumberOfValues[i]*numberOfComponents ] ;
774 TotalNumberOfValues+=NumberOfValues[i] ;
775 char * ProfilName = new char[MED_TAILLE_NOM+1];
776 MESSAGE ("NumberOfValues :"<< NumberOfValues[i]);
777 MESSAGE ("NumberOfComponents :"<< numberOfComponents);
778 MESSAGE ("MESH_NAME :"<< meshName.c_str());
779 MESSAGE ("FIELD_NAME :"<< MED_FIELD_DRIVER<T>::_fieldName.c_str());
780 MESSAGE ("MED_ENTITE :"<< (med_2_1::med_entite_maillage) mySupport->getEntity());
781 MESSAGE("MED_GEOM :"<<(med_2_1::med_geometrie_element)Types[i]);
782 MESSAGE("Iteration :"<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
783 MESSAGE("Order :"<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
784 MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=mySupport->getNumberOfElements(Types[i]); // Ne doit pas prendre en compte les points de Gauss
786 med_2_1::med_err ret;
787 #if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
788 int lgth2=NumberOfValues[i]*numberOfComponents;
789 if(MED_FIELD_DRIVER<T>::_ptrField->getValueType()==MED_EN::MED_INT32)
791 med_2_1::med_int *temp=new med_2_1::med_int[lgth2];
792 ret=med_2_1::MEDchampLire(id,const_cast <char*> (meshName.c_str()),
793 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
794 (unsigned char*) temp,
795 med_2_1::MED_NO_INTERLACE,
798 (med_2_1::med_entite_maillage) mySupport->getEntity(),
799 (med_2_1::med_geometrie_element) Types[i],
800 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
801 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
803 for(int i2=0;i2<lgth2;i2++)
804 myValues[i][i2]=(int)(temp[i2]);
809 ret=med_2_1::MEDchampLire(id,const_cast <char*> (meshName.c_str()),
810 const_cast <char*> (MED_FIELD_DRIVER<T>::_fieldName.c_str()),
811 (unsigned char*) myValues[i],
812 med_2_1::MED_NO_INTERLACE,
815 (med_2_1::med_entite_maillage) mySupport->getEntity()
816 ,(med_2_1::med_geometrie_element)Types[i],
817 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
818 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
822 // The Field can't be read then we mustdelete all previously allocated members in FIELD
823 for(int j=0; j<=i;j++)
824 delete[] myValues[j];
826 delete[] NumberOfValues ;
828 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes ;
829 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsNames ;
830 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits ;
831 delete[] MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions ;
832 delete[] MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits ;
833 MED_FIELD_DRIVER<T>::_ptrField->_componentsTypes = NULL ;
834 MED_FIELD_DRIVER<T>::_ptrField->_componentsNames = NULL ;
835 MED_FIELD_DRIVER<T>::_ptrField->_componentsUnits = NULL ;
836 MED_FIELD_DRIVER<T>::_ptrField->_componentsDescriptions = NULL ;
837 MED_FIELD_DRIVER<T>::_ptrField->_MEDComponentsUnits = NULL ;
838 MED_FIELD_DRIVER<T>::_fieldNum = MED_INVALID ; // we have not found right field, so reset the field number
839 throw MEDEXCEPTION( LOCALIZED( STRING(LOC) <<": ERROR when read value")) ;
842 delete[] ProfilName ;
845 // probleme avec les points de gauss : voir lorsqu-il y en a (!= 1)
846 // Creer un driver spécifique pour les modes MED_FULL_INTERLACE et MED_NO_INTERLACE
847 // serait plus efficicace.
848 ArrayNo * Values = new ArrayNo(numberOfComponents,TotalNumberOfValues);
850 for (int i=0; i<numberOfComponents; i++)
852 //T * ValuesT = Values->getRow(i+1) ;
854 for (int j=0; j<NumberOfTypes; j++)
856 T * myValue = myValues[j] ;
857 int NumberOf = NumberOfValues[j] ;
858 // MED_FIELD_DRIVER<T>::_ptrField->_numberOfValues+=NumberOf; // problem with gauss point : _numberOfValues != TotalNumberOfValues !!!!!!!
859 int offset = NumberOf*i ;
860 for (int k=0 ; k<NumberOf; k++) {
861 //ValuesT[Count]=myValue[k+offset] ;
862 Values->setIJ(Count,i+1,myValue[k+offset]);
863 //jfa 22.07.2005:SCRUTE(Count);
864 //jfa 22.07.2005:SCRUTE(Values->getIJ(Count,i+1));
870 for (int j=0; j<NumberOfTypes; j++)
871 delete[] myValues[j] ;
873 delete[] NumberOfValues ;
875 if (MED_FIELD_DRIVER<T>::_ptrField->_value != NULL)
876 delete MED_FIELD_DRIVER<T>::_ptrField->_value;
878 if ( MED_FIELD_DRIVER<T>::_ptrField->getInterlacingType() == MED_EN::MED_FULL_INTERLACE )
880 // dynamic_cast inutile
881 MED_FIELD_DRIVER<T>::_ptrField->_value=dynamic_cast<ArrayFull *>(ArrayConvert(*Values));
885 MED_FIELD_DRIVER<T>::_ptrField->_value=Values;
887 MED_FIELD_DRIVER<T>::_ptrField->_isRead = true ;
889 MED_FIELD_DRIVER<T>::_ptrField->_support=mySupport; //Prévenir l'utilisateur ?
894 template <class T> void MED_FIELD_RDONLY_DRIVER21<T>::write( void ) const
897 throw MEDEXCEPTION("MED_FIELD_RDONLY_DRIVER21::write : Can't write with a RDONLY driver !");
900 /*--------------------- WRONLY PART -------------------------------*/
902 template <class T> GENDRIVER * MED_FIELD_WRONLY_DRIVER21<T>::copy(void) const
904 return new MED_FIELD_WRONLY_DRIVER21<T>(*this);
907 template <class T> void MED_FIELD_WRONLY_DRIVER21<T>::read (void)
910 throw MEDEXCEPTION("MED_FIELD_WRONLY_DRIVER21::read : Can't read with a WRONLY driver !");
913 template <class T> void MED_FIELD_WRONLY_DRIVER21<T>::write(void) const
916 const char * LOC = "MED_FIELD_WRONLY_DRIVER21::write(void) const " ;
919 typedef typename MEDMEM_ArrayInterface<T,NoInterlace,NoGauss>::Array ArrayNo;
920 typedef typename MEDMEM_ArrayInterface<T,FullInterlace,NoGauss>::Array ArrayFull;
922 if (MED_FIELD_DRIVER<T>::_status==MED_OPENED)
926 int component_count=MED_FIELD_DRIVER<T>::_ptrField->getNumberOfComponents();
927 string component_name(component_count*MED_TAILLE_PNOM21,' ') ;
928 string component_unit(component_count*MED_TAILLE_PNOM21,' ') ;
930 const string * listcomponent_name=MED_FIELD_DRIVER<T>::_ptrField->getComponentsNames() ;
931 const string * listcomponent_unit=MED_FIELD_DRIVER<T>::_ptrField->getMEDComponentsUnits() ;
933 for (int i=0; i < component_count ; i++) {
934 length = min(MED_TAILLE_PNOM21,(int)listcomponent_name[i].size());
935 component_name.replace(i*MED_TAILLE_PNOM21,length,
936 listcomponent_name[i],0,length);
937 length = min(MED_TAILLE_PNOM21,(int)listcomponent_unit[i].size());
938 component_unit.replace(i*MED_TAILLE_PNOM21,length,
939 listcomponent_unit[i],0,length);
942 MESSAGE("component_name=|"<<component_name<<"|");
943 MESSAGE("component_unit=|"<<component_unit<<"|");
945 MED_EN::med_type_champ ValueType=MED_FIELD_DRIVER<T>::_ptrField->getValueType() ;
947 MESSAGE("Template Type =|"<<ValueType<<"|");
949 // le champ existe deja ???
950 char * champName = new char[MED_TAILLE_NOM+1] ;
951 med_2_1::med_type_champ type ;
955 int n = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,0);
957 for (int i=1; i<=n; i++) {
958 nbComp = med_2_1::MEDnChamp(MED_FIELD_DRIVER21<T>::_medIdt,i);
959 compName = new char[MED_TAILLE_PNOM21*nbComp+1];
960 compUnit = new char[MED_TAILLE_PNOM21*nbComp+1];
961 err = med_2_1::MEDchampInfo(MED_FIELD_DRIVER21<T>::_medIdt,i,champName,&type,compName,compUnit,nbComp);
963 if (strcmp(champName,MED_FIELD_DRIVER<T>::_ptrField->getName().c_str())==0) { // Found !
973 if (nbComp != component_count)
974 throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
975 <<": Field exist in file, but number of component are different : "<<nbComp<<" in file and "<<component_count<<" in memory."
978 // component name and unit
979 MESSAGE(LOC<<" Component name in file : "<<compName);
980 MESSAGE(LOC<<" Component name in memory : "<<component_name);
981 MESSAGE(LOC<<" Component unit in file : "<<compUnit);
982 MESSAGE(LOC<<" Component unit in memory : "<<component_unit);
987 // Verify the field doesn't exist
989 string dataGroupName = "/CHA/";
990 dataGroupName += MED_FIELD_DRIVER<T>::_ptrField->getName();
991 MESSAGE(LOC << "|" << dataGroupName << "|" );
992 med_2_1::med_idt gid = H5Gopen(MED_FIELD_DRIVER21<T>::_medIdt, dataGroupName.c_str() );
996 err=med_2_1::MEDchampCr(MED_FIELD_DRIVER21<T>::_medIdt,
997 const_cast <char*> ((MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
998 (med_2_1::med_type_champ) ValueType,
999 const_cast <char*> ( component_name.c_str() ),
1000 const_cast <char*> ( component_unit.c_str() ),
1003 throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
1004 << ": Error MEDchampCr : "<<err
1011 const SUPPORT * mySupport = MED_FIELD_DRIVER<T>::_ptrField->getSupport() ;
1013 if (! mySupport->isOnAllElements())
1014 throw MEDEXCEPTION( LOCALIZED (STRING(LOC)
1015 <<": Field must be on all entity"
1019 MESH * myMesh = mySupport->getMesh() ;
1020 string MeshName = myMesh->getName() ;
1021 //MED_EN::medModeSwitch Mode = MED_FIELD_DRIVER<T>::_ptrField->_value->getMode() ;
1022 // on boucle sur tout les types pour ecrire les tableaux de valeur
1023 int NumberOfType = mySupport->getNumberOfTypes() ;
1025 const MED_EN::medGeometryElement * Types = mySupport->getTypes() ;
1027 const T * value = NULL;
1028 ArrayFull * myArray = NULL;
1029 if ( MED_FIELD_DRIVER<T>::_ptrField->getInterlacingType() == MED_EN::MED_FULL_INTERLACE )
1030 myArray = MED_FIELD_DRIVER<T>::_ptrField->getArrayNoGauss();
1032 // En attendant la convertion de FIELD, on utilise le ArrayConvert
1033 // ( les infos _ptrField-> sont les mêmes )
1034 myArray = ArrayConvert( *( dynamic_cast< ArrayNo * >
1035 (MED_FIELD_DRIVER<T>::_ptrField->getArrayNoGauss()
1040 for (int i=0;i<NumberOfType;i++) {
1041 int NumberOfElements = mySupport->getNumberOfElements(Types[i]) ;
1042 int NumberOfGaussPoints = MED_FIELD_DRIVER<T>::_ptrField->getNumberOfGaussPoints(Types[i]) ;
1044 // const T * value = MED_FIELD_DRIVER<T>::_ptrField->getValueI(MED_EN::MED_FULL_INTERLACE,Index) ;
1046 value = myArray->getRow(Index) ;
1048 MESSAGE("MED_FIELD_DRIVER21<T>::_medIdt : "<<MED_FIELD_DRIVER21<T>::_medIdt);
1049 MESSAGE("MeshName.c_str() : "<<MeshName.c_str());
1050 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getName() : "<<MED_FIELD_DRIVER<T>::_ptrField->getName());
1051 MESSAGE("value : "<<value);
1052 MESSAGE("NumberOfElements : "<<NumberOfElements);
1053 MESSAGE("NumberOfGaussPoints : "<<NumberOfGaussPoints);
1054 MESSAGE("mySupport->getEntity() : "<<mySupport->getEntity());
1055 MESSAGE("Types[i] : "<<Types[i]);
1056 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber());
1057 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getTime() : "<<MED_FIELD_DRIVER<T>::_ptrField->getTime());
1058 MESSAGE("MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber() : "<<MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber());
1060 /* char chanom[MED_TAILLE_NOM+1];
1061 char chacomp[MED_TAILLE_NOM+1];
1062 char chaunit[MED_TAILLE_NOM+1];
1063 med_2_1::med_type_champ chatype;
1066 err=med_2_1::MEDchampInfo(MED_FIELD_DRIVER<T>::_medIdt,1,chanom,&chatype,chacomp,chaunit,chancomp);
1070 cout<<"=======================================================================> gros probleme"<<endl;
1073 cout<<"==================> nom lu = "<<chanom<<endl;
1074 cout<<"==================> type lu = "<<chatype<<endl;
1075 cout<<"==================> nom composante lu = "<<chacomp<<endl;
1076 cout<<"==================> nom unit lu = "<<chaunit<<endl;
1077 cout<<"==================> valeur de med_2_1::MED_REEL64 = "<<med_2_1::MED_REEL64<<endl;
1079 #if defined(IRIX64) || defined(OSF1) || defined(VPP5000)
1080 if(_ptrField->getValueType()==MED_EN::MED_INT32)
1082 int lgth2=_ptrField->getNumberOfValues();
1083 med_2_1::med_int *temp=new med_2_1::med_int[lgth2];
1084 for(int i2=0;i2<lgth2;i2++)
1085 temp[i2]=(int)(value[i2]);
1086 err=med_2_1::MEDchampEcr(MED_FIELD_DRIVER21<T>::_medIdt,
1087 const_cast <char*> ( MeshName.c_str()) , //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
1088 const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
1089 (unsigned char*)temp,
1090 med_2_1::MED_FULL_INTERLACE,
1092 NumberOfGaussPoints,
1095 med_2_1::MED_REMP, // PROFIL NON GERE, mode de remplacement non géré
1096 (med_2_1::med_entite_maillage)mySupport->getEntity(),
1097 (med_2_1::med_geometrie_element)Types[i],
1098 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
1100 MED_FIELD_DRIVER<T>::_ptrField->getTime(),
1101 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
1107 err=med_2_1::MEDchampEcr(MED_FIELD_DRIVER21<T>::_medIdt,
1108 const_cast <char*> ( MeshName.c_str()) , //( string(mesh_name).resize(MED_TAILLE_NOM).c_str())
1109 const_cast <char*> ( (MED_FIELD_DRIVER<T>::_ptrField->getName()).c_str()),
1110 (unsigned char*)value,
1111 med_2_1::MED_FULL_INTERLACE,
1113 NumberOfGaussPoints,
1116 med_2_1::MED_REMP, // PROFIL NON GERE, mode de remplacement non géré
1117 (med_2_1::med_entite_maillage)mySupport->getEntity(),
1118 (med_2_1::med_geometrie_element)Types[i],
1119 MED_FIELD_DRIVER<T>::_ptrField->getIterationNumber(),
1121 MED_FIELD_DRIVER<T>::_ptrField->getTime(),
1122 MED_FIELD_DRIVER<T>::_ptrField->getOrderNumber()
1124 if (err < MED_VALID )
1126 if ( MED_FIELD_DRIVER<T>::_ptrField->getInterlacingType() == MED_EN::MED_NO_INTERLACE ) delete myArray;
1128 throw MEDEXCEPTION(LOCALIZED( STRING(LOC)
1129 <<": Error in writing Field "<< MED_FIELD_DRIVER<T>::_ptrField->getName() <<", type "<<Types[i]
1134 Index += NumberOfElements ;
1137 if ( MED_FIELD_DRIVER<T>::_ptrField->getInterlacingType() == MED_EN::MED_NO_INTERLACE ) delete myArray;
1144 /*--------------------- RDWR PART -------------------------------*/
1146 template <class T> GENDRIVER * MED_FIELD_RDWR_DRIVER21<T>::copy(void) const
1148 return new MED_FIELD_RDWR_DRIVER21<T>(*this);
1151 template <class T> void MED_FIELD_RDWR_DRIVER21<T>::write(void) const
1152 throw (MEDEXCEPTION)
1154 BEGIN_OF("MED_FIELD_RDWR_DRIVER21::write(void)");
1155 MED_FIELD_WRONLY_DRIVER21<T>::write();
1156 END_OF("MED_FIELD_RDWR_DRIVER21::write(void)");
1159 template <class T> void MED_FIELD_RDWR_DRIVER21<T>::read (void)
1160 throw (MEDEXCEPTION)
1162 BEGIN_OF("MED_FIELD_RDWR_DRIVER21::read(void)");
1163 MED_FIELD_RDONLY_DRIVER21<T>::read();
1164 END_OF("MED_FIELD_RDWR_DRIVER21::read(void)");
1166 }//End namespace MEDMEM
1167 /*-----------------------------------------------------------------*/
1169 #endif /* MED_FIELD_DRIVER_HXX */