1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #include "MEDMEM_MedMeshDriver.hxx"
23 #include "MEDMEM_MedMeshDriver21.hxx"
24 #include "MEDMEM_DriverFactory.hxx"
25 #include "MEDMEM_DriversDef.hxx"
27 #include "MEDMEM_Family.hxx"
28 #include "MEDMEM_Group.hxx"
29 #include "MEDMEM_Coordinate.hxx"
30 #include "MEDMEM_Connectivity.hxx"
31 #include "MEDMEM_Mesh.hxx"
32 #include "MEDMEM_CellModel.hxx"
33 #include "MEDMEM_Grid.hxx"
37 using namespace MEDMEM;
38 using namespace MED_EN;
40 // Every memory allocation made in the MedDriver members function are desallocated in the Mesh destructor
42 MED_MESH_DRIVER::MED_MESH_DRIVER():
43 GENDRIVER(MED_DRIVER),
44 _ptrMesh(( MESH *)MED_NULL),
50 MED_MESH_DRIVER::MED_MESH_DRIVER(const string & fileName,
52 MED_EN::med_mode_acces accessMode):
53 GENDRIVER(fileName, accessMode, MED_DRIVER),
60 MED_MESH_DRIVER::MED_MESH_DRIVER(const MED_MESH_DRIVER & driver):
62 _ptrMesh(driver._ptrMesh),
63 _meshName(driver._meshName),
64 _meshNum(driver._meshNum)
69 MED_MESH_DRIVER::~MED_MESH_DRIVER()
71 MESSAGE_MED("MED_MESH_DRIVER::~MED_MESH_DRIVER()has been destroyed");
75 void MED_MESH_DRIVER::setMeshName(const string & meshName)
80 string MED_MESH_DRIVER::getMeshName() const
85 //---------------------------------- RDONLY PART -------------------------------------------------------------
87 IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(): MED_MESH_DRIVER()
91 IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(const string & fileName,
93 MED_MESH_DRIVER(fileName, ptrMesh, MED_EN::RDONLY)
95 MESSAGE_MED("IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
98 IMED_MESH_RDONLY_DRIVER::IMED_MESH_RDONLY_DRIVER(const IMED_MESH_RDONLY_DRIVER & driver):
99 MED_MESH_DRIVER(driver)
103 int IMED_MESH_RDONLY_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity)
105 if (_status==MED_OPENED)
107 MESSAGE_MED("MED_MESH_RDONLY_DRIVER::getDescendingConnectivity : "<<"call on the object " << Connectivity);
108 MESSAGE_MED("MED_MESH_RDONLY_DRIVER::getDescendingConnectivity : "<<"Not yet implemented !");
113 void IMED_MESH_RDONLY_DRIVER::buildAllGroups(vector<GROUP*> & Groups, vector<FAMILY*> & Families)
115 const char* LOC = "MED_MESH_RDONLY_DRIVER::buildAllGroups ";
118 int numberOfFamilies = Families.size() ;
119 //SCRUTE_MED(numberOfFamilies);
120 map< string,list<FAMILY*> > groupsNames ;
121 for(int i=0; i<numberOfFamilies; i++) {
122 FAMILY * myFamily = Families[i] ;
123 int numberOfGroups_ = myFamily->getNumberOfGroups();
125 //SCRUTE_MED(numberOfGroups_);
126 for (int j=0; j<numberOfGroups_; j++) {
128 //SCRUTE_MED(myFamily->getGroupName(j+1));
129 groupsNames[myFamily->getGroupName(j+1)].push_back(myFamily);
132 int numberOfGroups = groupsNames.size() ;
133 SCRUTE_MED(numberOfGroups);
134 Groups.resize(numberOfGroups);
135 map< string,list<FAMILY*> >::const_iterator currentGroup ;
137 for(currentGroup=groupsNames.begin();currentGroup!=groupsNames.end();currentGroup++) {
138 GROUP * myGroup = new GROUP(healName((*currentGroup).first),(*currentGroup).second) ;
139 // GROUP * myGroup = new GROUP() ;
140 // myGroup->setName((*currentGroup).first);
141 // SCRUTE_MED(myGroup->getName());
142 // //myGroup->setMesh(_ptrMesh);
143 // myGroup->init((*currentGroup).second);
152 void IMED_MESH_RDONLY_DRIVER::updateFamily()
154 const char* LOC = "MED_MESH_RDONLY_DRIVER::updateFamily() ";
157 // we need to update family on constituent if we have constituent, but no
158 // descending connectivity, so, we must calculate all constituent and
159 // numbering correctly family !
160 _ptrMesh->_connectivity->updateFamily(_ptrMesh->_familyFace) ; // in 2d, do nothing
161 _ptrMesh->_connectivity->updateFamily(_ptrMesh->_familyEdge) ; // in 3d, do nothing
167 void IMED_MESH_RDONLY_DRIVER::write( void ) const
169 throw MEDEXCEPTION("MED_MESH_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
172 /*--------------------- WRONLY PART -------------------------------*/
174 IMED_MESH_WRONLY_DRIVER::IMED_MESH_WRONLY_DRIVER():MED_MESH_DRIVER()
178 IMED_MESH_WRONLY_DRIVER::IMED_MESH_WRONLY_DRIVER(const string & fileName,
180 MED_EN::med_mode_acces access):
181 MED_MESH_DRIVER(fileName,ptrMesh,access)
183 MESSAGE_MED("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
186 IMED_MESH_WRONLY_DRIVER::IMED_MESH_WRONLY_DRIVER(const IMED_MESH_WRONLY_DRIVER & driver):
187 MED_MESH_DRIVER(driver)
191 IMED_MESH_WRONLY_DRIVER::~IMED_MESH_WRONLY_DRIVER()
193 //MESSAGE_MED("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
196 void IMED_MESH_WRONLY_DRIVER::read (void)
198 throw MEDEXCEPTION("MED_MESH_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
201 /*--------------------- RDWR PART -------------------------------*/
203 IMED_MESH_RDWR_DRIVER::IMED_MESH_RDWR_DRIVER()
207 IMED_MESH_RDWR_DRIVER::IMED_MESH_RDWR_DRIVER(const string & fileName,
209 IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,RDWR)
211 MESSAGE_MED("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
214 IMED_MESH_RDWR_DRIVER::IMED_MESH_RDWR_DRIVER(const IMED_MESH_RDWR_DRIVER & driver):
215 IMED_MESH_RDONLY_DRIVER(driver),IMED_MESH_WRONLY_DRIVER(driver),MED_MESH_DRIVER(driver)
219 IMED_MESH_RDWR_DRIVER::~IMED_MESH_RDWR_DRIVER() {
220 //MESSAGE_MED("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
223 /////////// Concrete MED_MESH_DRIVERS implementations
225 MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER()
227 MESSAGE_MED("You are using the default constructor of the Mesh read only Driver and it is 2.1 one");
228 _concreteMeshDrv = new MED_MESH_RDONLY_DRIVER21();
231 MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh):
232 IMED_MESH_RDONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,RDONLY)
234 _concreteMeshDrv = DRIVERFACTORY::buildMeshDriverFromFile(fileName,ptrMesh,RDONLY);
237 MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const MED_MESH_RDONLY_DRIVER & driver):MED_MESH_DRIVER(driver)
239 _concreteMeshDrv = driver._concreteMeshDrv->copy();
242 MED_MESH_RDONLY_DRIVER::~MED_MESH_RDONLY_DRIVER()
244 if (_concreteMeshDrv) delete _concreteMeshDrv;
247 void MED_MESH_RDONLY_DRIVER::write( void ) const
249 _concreteMeshDrv->write();
252 void MED_MESH_RDONLY_DRIVER::activateFacesComputation()
254 IMED_MESH_RDONLY_DRIVER *drvC=dynamic_cast<IMED_MESH_RDONLY_DRIVER *>(_concreteMeshDrv);
256 drvC->activateFacesComputation();
259 void MED_MESH_RDONLY_DRIVER::desactivateFacesComputation()
261 IMED_MESH_RDONLY_DRIVER *drvC=dynamic_cast<IMED_MESH_RDONLY_DRIVER *>(_concreteMeshDrv);
263 drvC->desactivateFacesComputation();
266 void MED_MESH_RDONLY_DRIVER::read ( void )
268 _concreteMeshDrv->read();
271 void MED_MESH_RDONLY_DRIVER::open()
273 _concreteMeshDrv->open();
276 void MED_MESH_RDONLY_DRIVER::close()
278 _concreteMeshDrv->close();
281 void MED_MESH_RDONLY_DRIVER::setMeshName(const string & meshName)
283 _concreteMeshDrv->setMeshName(meshName);
286 string MED_MESH_RDONLY_DRIVER::getMeshName() const
288 return _concreteMeshDrv->getMeshName();
291 GENDRIVER * MED_MESH_RDONLY_DRIVER::copy ( void ) const
293 return new MED_MESH_RDONLY_DRIVER(*this);
296 void MED_MESH_RDONLY_DRIVER::merge ( const GENDRIVER& driver )
298 const MED_MESH_RDONLY_DRIVER *other=dynamic_cast<const MED_MESH_RDONLY_DRIVER *>(&driver);
300 _concreteMeshDrv->merge( *other->_concreteMeshDrv );
302 _concreteMeshDrv->merge( driver );
304 // int MED_MESH_RDONLY_DRIVER::getCOORDINATE()
306 // return _concreteMeshDrv->getCOORDINATE();
309 // int MED_MESH_RDONLY_DRIVER::getCONNECTIVITY()
311 // return _concreteMeshDrv->getCONNECTIVITY();
314 // int MED_MESH_RDONLY_DRIVER::getFAMILY()
316 // return _concreteMeshDrv->getFAMILY();
319 // int MED_MESH_RDONLY_DRIVER::getNodalConnectivity(CONNECTIVITY * Connectivity)
321 // return _concreteMeshDrv->getNodalConnectivity(Connectivity);
324 // int MED_MESH_RDONLY_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity)
326 // return _concreteMeshDrv->getDescendingConnectivity(Connectivity);
329 // int MED_MESH_RDONLY_DRIVER::getNodesFamiliesNumber(int * MEDArrayNodeFamily)
331 // return _concreteMeshDrv->getNodesFamiliesNumber(MEDArrayNodeFamily);
334 // int MED_MESH_RDONLY_DRIVER::getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity)
336 // return _concreteMeshDrv->getCellsFamiliesNumber(Arrays,Connectivity,entity);
339 // void MED_MESH_RDONLY_DRIVER::getGRID()
341 // _concreteMeshDrv->getGRID();
344 MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER()
346 MESSAGE_MED("You are using the default constructor of the Mesh write only Driver and it is 2.1 one");
347 _concreteMeshDrv = new MED_MESH_WRONLY_DRIVER21();
350 MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh, MED_EN::med_mode_acces access):
351 IMED_MESH_WRONLY_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,access)
353 _concreteMeshDrv = DRIVERFACTORY::buildMeshDriverFromFile(fileName,ptrMesh,access);
356 MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const MED_MESH_WRONLY_DRIVER & driver):MED_MESH_DRIVER(driver)
358 _concreteMeshDrv = driver._concreteMeshDrv->copy();
361 MED_MESH_WRONLY_DRIVER::~MED_MESH_WRONLY_DRIVER()
363 if (_concreteMeshDrv) delete _concreteMeshDrv;
366 void MED_MESH_WRONLY_DRIVER::open()
368 _concreteMeshDrv->open();
371 void MED_MESH_WRONLY_DRIVER::close()
373 _concreteMeshDrv->close();
376 void MED_MESH_WRONLY_DRIVER::setMeshName(const string & meshName)
378 _concreteMeshDrv->setMeshName(meshName);
381 string MED_MESH_WRONLY_DRIVER::getMeshName() const
383 return _concreteMeshDrv->getMeshName();
386 GENDRIVER * MED_MESH_WRONLY_DRIVER::copy ( void ) const
388 return new MED_MESH_WRONLY_DRIVER(*this);
391 void MED_MESH_WRONLY_DRIVER::read ()
393 _concreteMeshDrv->read();
396 void MED_MESH_WRONLY_DRIVER::write( void ) const
398 _concreteMeshDrv->write();
401 void MED_MESH_WRONLY_DRIVER::merge ( const GENDRIVER& driver )
403 const MED_MESH_WRONLY_DRIVER *other=dynamic_cast<const MED_MESH_WRONLY_DRIVER *>(&driver);
405 _concreteMeshDrv->merge( *other->_concreteMeshDrv );
407 _concreteMeshDrv->merge( driver );
410 // int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeCoordinates () const
412 // return _concreteMeshDrv->writeCoordinates();
415 // int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeConnectivities (MED_EN::medEntityMesh entity) const
417 // return _concreteMeshDrv->writeConnectivities(entity);
420 // int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeFamilyNumbers () const
422 // return _concreteMeshDrv->writeFamilyNumbers();
425 // int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeFamilies (vector<FAMILY*> & families) const
427 // return _concreteMeshDrv->writeFamilies(families);
430 // int MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER::writeGRID() const
432 // return _concreteMeshDrv->writeGRID();
435 MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER()
437 _concreteMeshDrv=new MED_MESH_RDWR_DRIVER21();
440 MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh):
441 IMED_MESH_RDWR_DRIVER(fileName,ptrMesh),MED_MESH_DRIVER(fileName,ptrMesh,RDWR)
443 _concreteMeshDrv = DRIVERFACTORY::buildMeshDriverFromFile(fileName,ptrMesh,RDWR);
446 MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const MED_MESH_RDWR_DRIVER & driver): MED_MESH_DRIVER(driver)
448 _concreteMeshDrv = driver._concreteMeshDrv->copy();
451 MED_MESH_RDWR_DRIVER::~MED_MESH_RDWR_DRIVER()
453 if (_concreteMeshDrv) delete _concreteMeshDrv;
456 void MED_MESH_RDWR_DRIVER::read ( void )
458 _concreteMeshDrv->read();
461 void MED_MESH_RDWR_DRIVER::write( void ) const
463 _concreteMeshDrv->write();
466 void MED_MESH_RDWR_DRIVER::activateFacesComputation()
468 IMED_MESH_RDONLY_DRIVER *drvC=dynamic_cast<IMED_MESH_RDONLY_DRIVER *>(_concreteMeshDrv);
470 drvC->activateFacesComputation();
473 void MED_MESH_RDWR_DRIVER::desactivateFacesComputation()
475 IMED_MESH_RDONLY_DRIVER *drvC=dynamic_cast<IMED_MESH_RDONLY_DRIVER *>(_concreteMeshDrv);
477 drvC->desactivateFacesComputation();
480 void MED_MESH_RDWR_DRIVER::open()
482 _concreteMeshDrv->open();
485 void MED_MESH_RDWR_DRIVER::close()
487 _concreteMeshDrv->close();
490 // int MED_MESH_RDWR_DRIVER::getCOORDINATE()
492 // return _concreteMeshDrv->getCOORDINATE();
495 // int MED_MESH_RDWR_DRIVER::getCONNECTIVITY()
497 // return _concreteMeshDrv->getCONNECTIVITY();
500 // int MED_MESH_RDWR_DRIVER::getFAMILY()
502 // return _concreteMeshDrv->getFAMILY();
505 // int MED_MESH_RDWR_DRIVER::getNodalConnectivity(CONNECTIVITY * Connectivity)
507 // return _concreteMeshDrv->getNodalConnectivity(Connectivity);
510 // int MED_MESH_RDWR_DRIVER::getDescendingConnectivity(CONNECTIVITY * Connectivity)
512 // return _concreteMeshDrv->getDescendingConnectivity(Connectivity);
515 // int MED_MESH_RDWR_DRIVER::getNodesFamiliesNumber(int * MEDArrayNodeFamily)
517 // return _concreteMeshDrv->getNodesFamiliesNumber(MEDArrayNodeFamily);
520 // int MED_MESH_RDWR_DRIVER::getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity, MED_EN::medEntityMesh entity)
522 // return _concreteMeshDrv->getCellsFamiliesNumber(Arrays,Connectivity,entity);
525 // void MED_MESH_RDWR_DRIVER::getGRID ()
527 // _concreteMeshDrv->getGRID();
530 // int MED_MESH_RDWR_DRIVER::writeCoordinates () const
532 // _concreteMeshDrv->writeCoordinates();
535 // int MED_MESH_RDWR_DRIVER::writeConnectivities (MED_EN::medEntityMesh entity) const
537 // return _concreteMeshDrv->writeConnectivities (entity);
540 // int MED_MESH_RDWR_DRIVER::writeFamilyNumbers () const
542 // return _concreteMeshDrv->writeFamilyNumbers();
545 // int MED_MESH_RDWR_DRIVER::writeFamilies (vector<FAMILY*> & families) const
547 // return _concreteMeshDrv->writeFamilies(families);
550 // int MED_MESH_RDWR_DRIVER::writeGRID() const
552 // return _concreteMeshDrv->writeGRID();
555 void MED_MESH_RDWR_DRIVER::setMeshName(const string & meshName)
557 _concreteMeshDrv->setMeshName(meshName);
560 string MED_MESH_RDWR_DRIVER::getMeshName() const
562 return _concreteMeshDrv->getMeshName();
565 GENDRIVER * MED_MESH_RDWR_DRIVER::copy ( void ) const
567 return new MED_MESH_RDWR_DRIVER(*this);
570 void MED_MESH_RDWR_DRIVER::merge ( const GENDRIVER& driver )
572 const MED_MESH_RDWR_DRIVER *other=dynamic_cast<const MED_MESH_RDWR_DRIVER *>(&driver);
574 _concreteMeshDrv->merge( *other->_concreteMeshDrv );
576 _concreteMeshDrv->merge( driver );