4 # include "MEDMEM_Med.hxx"
6 # include "MEDMEM_STRING.hxx"
8 # include "MEDMEM_Mesh.hxx"
9 # include "MEDMEM_Grid.hxx"
10 # include "MEDMEM_Field.hxx"
12 # include "MEDMEM_Exception.hxx"
13 # include "utilities.h"
14 using namespace MEDMEM;
20 MESSAGE("MED::MED()");
26 MED::MED(driverTypes driverType, const string & fileName)
28 const char * LOC = "MED::MED(driverTypes driverType, const string & fileName) : ";
31 MESSAGE(LOC << "driverType = " << driverType);
33 MED_MED_RDONLY_DRIVER * myDriver = new MED_MED_RDONLY_DRIVER(fileName,this) ;
34 int current = addDriver(*myDriver);
35 //int current= addDriver(driverType,fileName);
37 _drivers[current]->open();
38 _drivers[current]->readFileStruct();
39 _drivers[current]->close();
49 const char * LOC = "MED::~MED() : ";
52 // Analysis of the object MED
56 map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
58 for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
59 if ( (*currentField).first != NULL) index++;
62 MESSAGE(LOC << " there is(are) " << index << " field(s):");
63 for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
64 if ( (*currentField).first != NULL) MESSAGE(" " << ((*currentField).first)->getName().c_str());
67 map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::iterator itSupportOnMesh ;
69 for ( itSupportOnMesh=_support.begin();itSupportOnMesh != _support.end(); itSupportOnMesh++ ) {
70 map<MED_FR::med_entite_maillage,SUPPORT *>::iterator itSupport ;
71 for ( itSupport=(*itSupportOnMesh).second.begin();itSupport!=(*itSupportOnMesh).second.end();itSupport++)
75 MESSAGE(LOC << " there is(are) " << index << " support(s):");
77 map<MESH_NAME_,MESH*>::const_iterator currentMesh;
79 for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
80 if ( (*currentMesh).second != NULL)
84 MESSAGE(LOC << " there is(are) " << index << " meshe(s):");
85 // for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
86 // if ( (*currentMesh).second != NULL)
88 // SCRUTE((*currentMesh).second);
90 // string meshName = ((*currentMesh).second)->getName();
92 // MESSAGE(" " << meshName);
96 // delete all ? : PG : YES !
97 // map<FIELD_ *, MESH_NAME_>::const_iterator currentField;
98 for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) {
99 if ( (*currentField).first != NULL) {
100 // cast in right type to delete it !
101 switch ((*currentField).first->getValueType()) {
103 delete (FIELD<int>*) (*currentField).first ;
106 delete (FIELD<double>*) (*currentField).first ;
109 MESSAGE(LOC << "Field has type different of int or double, could not destroy its values array !") ;
110 delete (*currentField).first;
114 // map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::iterator itSupportOnMesh ;
115 for ( itSupportOnMesh=_support.begin();itSupportOnMesh != _support.end(); itSupportOnMesh++ ) {
116 map<MED_FR::med_entite_maillage,SUPPORT *>::iterator itSupport ;
117 for ( itSupport=(*itSupportOnMesh).second.begin();itSupport!=(*itSupportOnMesh).second.end();itSupport++)
118 delete (*itSupport).second ;
121 // map<MESH_NAME_,MESH*>::const_iterator currentMesh;
122 for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
123 if ( (*currentMesh).second != NULL)
125 if (!((*currentMesh).second)->getIsAGrid())
126 delete (*currentMesh).second;
128 delete (GRID *) (*currentMesh).second;
132 index =_drivers.size();
134 MESSAGE(LOC << "In this object MED there is(are) " << index << " driver(s):");
136 for (unsigned int ind=0; ind < _drivers.size(); ind++ )
138 SCRUTE(_drivers[ind]);
139 if ( _drivers[ind] != NULL) delete _drivers[ind];
147 // ------- Drivers Management Part
149 // Add your new driver instance declaration here (step 3-1)
150 MED::INSTANCE_DE<MED_MED_RDWR_DRIVER> MED::inst_med ;
151 MED::INSTANCE_DE<VTK_MED_DRIVER> MED::inst_vtk ;
153 // Add your new driver instance in the MED instance list (step 3-2)
154 const MED::INSTANCE * const MED::instances[] = { &MED::inst_med, &MED::inst_vtk };
157 Create the specified driver and return its index reference to path to
158 read or write methods.
160 int MED::addDriver(driverTypes driverType, const string & fileName="Default File Name.med") {
162 const char * LOC = "MED::addDriver(driverTypes driverType, const string & fileName=\"Default File Name.med\") : ";
165 int itDriver = (int) NO_DRIVER;
169 MESSAGE(LOC << " the file name is " << fileName);
173 SCRUTE(instances[driverType]);
178 itDriver = (int) driverType ;
188 throw MED_EXCEPTION (LOCALIZED(STRING(LOC)<< "GIBI_DRIVER has been specified to the method which is not allowed because there is no GIBI driver for the MED object"));
193 throw MED_EXCEPTION (LOCALIZED(STRING(LOC)<< "NO_DRIVER has been specified to the method which is not allowed"));
198 if (itDriver == ((int) NO_DRIVER))
199 throw MED_EXCEPTION (LOCALIZED(STRING(LOC)<< "NO_DRIVER has been specified to the method which is not allowed"));
201 driver = instances[itDriver]->run(fileName, this) ;
203 current = _drivers.size()-1;
205 driver->setId(current);
213 Duplicate the given driver and return its index reference to path to
214 read or write methods.
216 int MED::addDriver(GENDRIVER & driver) {
217 const char * LOC = "MED::addDriver(GENDRIVER &) : ";
222 SCRUTE(_drivers.size());
224 _drivers.push_back(&driver);
226 SCRUTE(_drivers.size());
231 current = _drivers.size()-1;
232 driver.setId(current);
240 Remove the driver referenced by its index.
242 void MED::rmDriver (int index/*=0*/)
243 throw (MED_EXCEPTION)
245 const char * LOC = "MED::rmDriver (int index=0): ";
249 //_drivers.erase(&_drivers[index]);
252 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
253 << "The index given is invalid, index must be between 0 and |"
261 ??? to do comment ???
263 void MED::writeFrom (int index/*=0*/)
264 throw (MED_EXCEPTION)
266 const char * LOC = "MED::write (int index=0): ";
269 if (_drivers[index]) {
270 // open and close are made by all objects !
271 _drivers[index]->writeFrom();
273 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
274 << "The index given is invalid, index must be between 0 and |"
282 Write all objects with the driver given by its index.
284 void MED::write (int index/*=0*/)
285 throw (MED_EXCEPTION)
287 const char * LOC = "MED::write (int index=0): ";
290 if (_drivers[index]) {
291 // open and close are made by the subsequent objects !
292 _drivers[index]->write();
295 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
296 << "The index given is invalid, index must be between 0 and |"
304 Parse all the file and generate empty object.
306 All object must be read explicitly later with their own method read
307 or use MED::read to read all.
309 This method is automaticaly call by constructor with driver information.
311 void MED::readFileStruct (int index/*=0*/)
312 throw (MED_EXCEPTION)
314 const char * LOC = "MED::readFileStruct (int index=0): ";
317 if (_drivers[index]) {
318 _drivers[index]->open();
319 _drivers[index]->readFileStruct();
320 _drivers[index]->close();
323 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
324 << "The index given is invalid, index must be between 0 and |"
332 Read all objects in the file specified in the driver given by its index.
334 void MED::read (int index/*=0*/)
335 throw (MED_EXCEPTION)
337 const char * LOC = "MED::read (int index=0): ";
340 if (_drivers[index]) {
341 // open and close are made by all objects !
343 SCRUTE(_drivers[index]);
344 SCRUTE(&_drivers[index]);
345 // _drivers[index]->open();
346 _drivers[index]->read();
347 // _drivers[index]->close();
350 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
351 << "The index given is invalid, index must be between >0 and < |"
359 // ------- End Of Drivers Management Part
362 Get the number of MESH objects.
364 int MED::getNumberOfMeshes ( void ) const {
366 const char * LOC = "MED::getNumberOfMeshes ( void ) const : ";
369 return _meshes.size();
375 Get the number of FIELD objects.
377 int MED::getNumberOfFields ( void ) const {
379 const char * LOC = "MED::getNumberOfFields ( void ) const : ";
382 return _fields.size(); // we get number of field with different name
388 Get the names of all MESH objects.
390 meshNames is an in/out argument.
392 It is a string array of size the
393 number of MESH objects. It must be allocated before calling
394 this method. All names are put in it.
396 void MED::getMeshNames ( string * meshNames ) const
397 throw (MED_EXCEPTION)
399 const char * LOC = "MED::getMeshNames ( string * ) const : ";
401 unsigned int meshNamesSize;
403 if ( ( meshNamesSize = sizeof(meshNames) / sizeof(string *) )
405 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
406 << "Size of parameter meshNames is |"
407 << meshNamesSize << "| and should be |"
408 << _meshes.size() << "| and should be |"
412 // REM : ALLOCATION D'UN TABLEAU DE POINTEURS SUR STRING FAITE PAR LE CLIENT
413 map<MESH_NAME_,MESH*>::const_iterator currentMesh; // ??ITERATEUR CONST SUR UN OBJET NON CONST ??
415 int meshNamesIndex = 0;
417 for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
418 meshNames[meshNamesIndex]=(*currentMesh).first;
419 meshNamesIndex++; // CF OPTIMISATION
426 Get the names of all MESH objects.
428 Return a deque<string> object which contain the name of all MESH objects.
430 deque<string> MED::getMeshNames () const {
432 const char * LOC = "MED::getMeshNames () const : ";
435 deque<string> meshNames(_meshes.size());
437 map<MESH_NAME_,MESH*>::const_iterator currentMesh; // ??ITERATEUR CONST SUR UN OBJET NON CONST ??
439 int meshNamesIndex = 0;
441 for ( currentMesh=_meshes.begin();currentMesh != _meshes.end(); currentMesh++ ) {
442 meshNames[meshNamesIndex]=(*currentMesh).first;
443 meshNamesIndex++; // CF OPTIMISATION
452 Return a reference to the MESH object named meshName.
454 MESH * MED::getMesh ( const string & meshName ) const
455 throw (MED_EXCEPTION)
458 const char * LOC = "MED::getMesh ( const string & meshName ) const : ";
461 map<MESH_NAME_,MESH*>::const_iterator itMeshes = _meshes.find(meshName);
463 if ( itMeshes == _meshes.end() )
464 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
465 << "There is no known mesh named |"
470 return (*itMeshes).second;
476 \internal Return a reference to the MESH object associated with
479 MESH * MED::getMesh (const FIELD_ * const field ) const
480 throw (MED_EXCEPTION)
483 const char * LOC = "MED::getMesh ( const FIELD * field ) const : ";
486 FIELD_ * f = const_cast< FIELD_* > (field); // Comment faire mieux ?
487 map<FIELD_ *, MESH_NAME_>::const_iterator itMeshName = _meshName.find(f);
489 if ( itMeshName == _meshName.end() )
490 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
491 << "There is no known mesh associated with |"
492 << field << "| pointer"
496 string meshName = (*itMeshName).second;
497 map<MESH_NAME_,MESH*>::const_iterator itMeshes = _meshes.find(meshName);
498 if ( itMeshes == _meshes.end() )
499 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
500 << "There is no known mesh named |"
501 << meshName << " while it's associated with the found field |"
502 << field << "| pointer"
506 return (*itMeshes).second;
513 Get the names of all FIELD objects.
515 fieldNames is an in/out argument.
517 It is an array of string of size the
518 number of FIELD objects. It must be allocated before calling
519 this method. All names are put in it.
521 void MED::getFieldNames ( string * fieldNames ) const
522 throw (MED_EXCEPTION)
524 const char * LOC = "MED::getFieldNames ( string * ) const : ";
527 unsigned int fieldNamesSize = sizeof(fieldNames) / sizeof(string *);
529 if ( fieldNamesSize != _fields.size() )
530 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
531 << "Size of parameter fieldNames is |"
532 << fieldNamesSize << "| and should be |"
533 << _fields.size() << "| and should be |"
537 // REM : ALLOCATION D'UN TABLEAU DE POINTEURS SUR STRING FAITE PAR LE CLIENT
538 map<FIELD_NAME_,MAP_DT_IT_>::const_iterator currentField;
540 int fieldNamesIndex = 0;
541 for ( currentField=_fields.begin();currentField != _fields.end(); currentField++ ) {
542 fieldNames[fieldNamesIndex]=(*currentField).first;
543 fieldNamesIndex++; // CF OPTIMISATION
551 Get the names of all FIELD objects.
553 Return a deque<string> object which contain the name of all FIELD objects.
555 deque<string> MED::getFieldNames () const {
557 const char * LOC = "MED::getFieldNames ( ) const : ";
560 deque<string> fieldNames(_fields.size());
562 map<FIELD_NAME_,MAP_DT_IT_>::const_iterator currentField;
564 int fieldNamesIndex = 0;
566 for ( currentField=_fields.begin();currentField != _fields.end(); currentField++ ) {
567 fieldNames[fieldNamesIndex]=(*currentField).first;
568 fieldNamesIndex++; // CF OPTIMISATION
576 Return a deque<DT_IT_> which contain all iteration step for the FIELD
577 identified by its name.
579 deque<DT_IT_> MED::getFieldIteration (const string & fieldName) const
580 throw (MED_EXCEPTION)
583 const char * LOC = "MED::getFieldIteration ( const string & ) const : ";
586 map<FIELD_NAME_,MAP_DT_IT_>::const_iterator itFields = _fields.find(fieldName);
588 if ( itFields == _fields.end() )
589 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
590 << "There is no known field named |"
594 // const MAP_DT_IT_ & myIterationMap = const_cast<const MAP_DT_IT_ & > ((*itFields).second);
595 const MAP_DT_IT_ & myIterationMap = (*itFields).second ;
596 MAP_DT_IT_::const_iterator currentIterator ;
598 deque<DT_IT_> Iteration(myIterationMap.size());
600 int iterationIndex = 0;
602 for ( currentIterator=myIterationMap.begin();currentIterator != myIterationMap.end(); currentIterator++ ) {
603 Iteration[iterationIndex]=(*currentIterator).first;
604 iterationIndex++; // CF OPTIMISATION
612 Return a reference to the FIELD object named fieldName with
613 time step number dt and order number it.
615 FIELD_ * MED::getField ( const string & fieldName, const int dt=MED_NOPDT, const int it=MED_NOPDT ) const
616 throw (MED_EXCEPTION)
619 const char * LOC = "MED::getField ( const string &, const int, const int ) const : ";
622 MESSAGE(LOC << "fieldName = "<<fieldName<<", dt ="<<dt<<", it = "<<it);
629 map<FIELD_NAME_,MAP_DT_IT_>::const_iterator itFields = _fields.find(fieldName);
631 if ( itFields == _fields.end() )
632 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
633 << "There is no known field named |"
638 const MAP_DT_IT_ & map_dtIt = const_cast<const MAP_DT_IT_ & > ((*itFields).second);
639 MAP_DT_IT_::const_iterator itMap_dtIt = map_dtIt.find(dtIt);
641 if ( itMap_dtIt == map_dtIt.end() )
642 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
643 << "There is no (dt,it) |("
644 << dt << "," << it << ")| associated with the found field |"
651 //return _fields[fieldName][dtIt];
652 return (*itMap_dtIt).second;
657 // fiend ostream & MED::operator<<(ostream &os,const MED & med) const {
662 Return a map<MED_FR::med_entite_maillage,SUPPORT*> which contain
663 foreach entity, a reference to the SUPPORT on all elements.
665 const map<MED_FR::med_entite_maillage,SUPPORT*> & MED::getSupports(const string & meshName) const
666 throw (MED_EXCEPTION)
668 const char * LOC = "MED::getSupports ( const string ) const : ";
671 map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::const_iterator itSupportOnMesh = _support.find(meshName) ;
673 if ( itSupportOnMesh == _support.end() )
674 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
675 << "There is no support on mesh named |"
680 return (*itSupportOnMesh).second ;
684 Return a reference to the SUPPORT object on all elements of entity
685 for the MESH named meshName.
687 SUPPORT * MED::getSupport (const string & meshName,MED_FR::med_entite_maillage entity) const
688 throw (MED_EXCEPTION)
690 const char * LOC = "MED::getSupport ( const string, MED_FR::med_entite_maillage ) const : ";
694 for (map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::const_iterator const_itSupportOnMesh=_support.begin(); const_itSupportOnMesh != _support.end();
695 const_itSupportOnMesh++ )
697 map<MED_FR::med_entite_maillage,SUPPORT *>::const_iterator const_itSupport ;
698 for (const_itSupport=(*const_itSupportOnMesh).second.begin();
699 const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++) index++;
702 MESSAGE(LOC << "In this MED object there is(are) " << index << " support(s):");
704 for (map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::const_iterator const_itSupportOnMesh=_support.begin();const_itSupportOnMesh != _support.end(); const_itSupportOnMesh++ )
706 map<MED_FR::med_entite_maillage,SUPPORT *>::const_iterator const_itSupport ;
707 for (const_itSupport=(*const_itSupportOnMesh).second.begin();
708 const_itSupport!=(*const_itSupportOnMesh).second.end();const_itSupport++)
710 MESSAGE(LOC << "Support on mesh " << (*const_itSupportOnMesh).first << " on entity " << (*const_itSupport).first << " : " << *((*const_itSupport).second));
715 map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::const_iterator const_itSupportOnMesh = _support.find(meshName) ;
717 if ( const_itSupportOnMesh == _support.end() )
718 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
719 << "There is no support on mesh named |"
724 // map<MED_FR::med_entite_maillage,SUPPORT *> & SupportOnMesh = (map<MED_FR::med_entite_maillage,SUPPORT *>&) ((*itSupportOnMesh).second) ;
725 // map<MED_FR::med_entite_maillage,SUPPORT *>::const_iterator itSupport = SupportOnMesh.find(entity) ;
727 // if (itSupport == SupportOnMesh.end() )
728 // throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
729 // << "There is no support on entity "
730 // << entity << " in mesh named |"
731 // << meshName << "|"
736 map<MED_FR::med_entite_maillage,SUPPORT *> SupportOnMesh = ((*const_itSupportOnMesh).second);
738 map<MED_FR::med_entite_maillage,SUPPORT *>::const_iterator itSupport = SupportOnMesh.find(entity) ;
740 if (itSupport == SupportOnMesh.end() )
741 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
742 << "There is no support on entity "
743 << entity << " in mesh named |"
748 return (*itSupport).second ;
752 Temporary method : when all MESH objects are read, this methods
753 update all SUPPORT objects with the rigth dimension.
755 void MED::updateSupport ()
758 const char * LOC = "MED::updateSupport () : ";
761 map<MESH_NAME_, map<MED_FR::med_entite_maillage,SUPPORT *> >::iterator itSupportOnMesh ;
762 for ( itSupportOnMesh=_support.begin();itSupportOnMesh != _support.end(); itSupportOnMesh++ ) {
763 map<MED_FR::med_entite_maillage,SUPPORT *>::iterator itSupport ;
764 for ( itSupport=(*itSupportOnMesh).second.begin();itSupport!=(*itSupportOnMesh).second.end();itSupport++)
766 (*itSupport).second->update() ;
768 catch (MEDEXCEPTION & ex) {
769 // entity not defined in mesh -> we remove support on it !
770 MESSAGE(LOC<<ex.what());
771 delete (*itSupport).second ;
772 (*itSupportOnMesh).second.erase(itSupport) ; // that's rigth ????
781 Add the given MESH object. MED object control it,
782 and destroy it, so you must not destroy it after.
784 The meshName is given by the MESH object.
786 void MED::addMesh( MESH * const ptrMesh)
787 throw (MED_EXCEPTION)
789 const char * LOC = "MED::addMesh(const MESH * ptrMesh): ";
793 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrMesh must not be NULL !"));
796 if ( ! ( meshName = ptrMesh->getName()).size() )
797 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrMesh->_name must not be NULL !"));
799 // MESH * meshToMed = new MESH(*ptrMesh); DO WE HAVE TO COPY THE ENTRY MESH OR NOT ????? (NB)
801 _meshes[meshName] = ptrMesh; // if ptrMesh->meshName already exists it is modified
803 // _meshes[meshName] = meshToMed;
809 Add the given FIELD object. MED object control it,
810 and destroy it, so you must not destroy it after.
812 The fieldName is given by the FIELD object.
814 void MED::addField( FIELD_ * const ptrField)
815 throw (MED_EXCEPTION)
817 const char * LOC = "MED::addField(const FIELD_ * const ptrField): ";
821 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrField must not be NULL !"));
824 if ( ! (fieldName = ptrField->getName()).size() )
825 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrField->_name must not be NULL !"));
827 SUPPORT * ptrSupport;
828 if ( ! ( ptrSupport = (SUPPORT * ) ptrField->getSupport()) )
829 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrField->_support must not be NULL !"));
832 if ( ! ( ptrMesh = ptrSupport->getMesh()) )
833 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrField->_support->_mesh must not be NULL !"));
836 if ( ! ( meshName = ptrMesh->getName()).size() )
837 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "ptrField->_support->_mesh->_name must not be NULL !"));
840 dtIt.dt = ptrField->getIterationNumber();
841 dtIt.it = ptrField->getOrderNumber();
843 _fields [fieldName][dtIt] = ptrField; // if it already exists it is replaced
844 _meshName [ptrField] = meshName; // if it already exists it is replaced
845 _meshes [meshName] = ptrMesh; // if it already exists it is replaced
847 // int numberOfTypes = ptrSupport->getNumberOfTypes(); !! UNUSED VARIABLE !!
848 _support [meshName][ (MED_FR::med_entite_maillage) ptrSupport->getEntity()] = ptrSupport;// if it already exists it is replaced