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_define.hxx"
23 #include "MEDMEM_Med.hxx"
24 #include "MEDMEM_Support.hxx"
25 #include "MEDMEM_Mesh.hxx"
27 #include "MEDMEM_EnsightMedDriver.hxx"
28 #include "MEDMEM_EnsightFieldDriver.hxx"
29 #include "MEDMEM_EnsightMeshDriver.hxx"
32 //using namespace MEDMEM;
33 using namespace MED_EN;
34 using namespace MEDMEM_ENSIGHT;
36 // ================================================================================
38 // ================================================================================
41 ENSIGHT_MED_DRIVER::ENSIGHT_MED_DRIVER():
42 _CaseFileDriver_User(),_ptrMed((MED *)MED_NULL)
45 ENSIGHT_MED_DRIVER::ENSIGHT_MED_DRIVER(const string & fileName, MED * ptrMed):
46 _CaseFileDriver_User(fileName,RDONLY), _ptrMed(ptrMed)
50 ENSIGHT_MED_DRIVER::ENSIGHT_MED_DRIVER(const string & fileName,
52 med_mode_acces accessMode):
53 _CaseFileDriver_User(fileName,accessMode), _ptrMed(ptrMed)
57 ENSIGHT_MED_DRIVER::ENSIGHT_MED_DRIVER(const ENSIGHT_MED_DRIVER & driver):
58 _CaseFileDriver_User(driver), _ptrMed(driver._ptrMed)
62 void ENSIGHT_MED_DRIVER::openConst() const
64 const char * LOC ="ENSIGHT_MED_DRIVER::open() : ";
67 if ( _fileName.empty() )
69 ( LOCALIZED( STRING(LOC) << "_fileName is empty, "
70 "please set a correct fileName before calling open()"));
72 if (!canOpenFile( _fileName, getAccessMode() ))
74 ( LOCALIZED( STRING(LOC) << "Can not open main Ensight file " << _fileName));
79 void ENSIGHT_MED_DRIVER::open() {
82 void ENSIGHT_MED_DRIVER::close() {
85 ENSIGHT_MED_DRIVER::~ENSIGHT_MED_DRIVER()
87 MESSAGE_MED("ENSIGHT_MED_DRIVER::~ENSIGHT_MED_DRIVER() has been destroyed");
90 // ================================================================================
92 // ================================================================================
94 ENSIGHT_MED_WRONLY_DRIVER::ENSIGHT_MED_WRONLY_DRIVER() : ENSIGHT_MED_DRIVER()
98 ENSIGHT_MED_WRONLY_DRIVER::ENSIGHT_MED_WRONLY_DRIVER(const string & fileName, MED * ptrMed)
99 : ENSIGHT_MED_DRIVER(fileName, ptrMed, MED_EN::WRONLY )
103 ENSIGHT_MED_WRONLY_DRIVER::ENSIGHT_MED_WRONLY_DRIVER(const ENSIGHT_MED_WRONLY_DRIVER & driver)
104 : ENSIGHT_MED_DRIVER(driver)
108 ENSIGHT_MED_WRONLY_DRIVER::~ENSIGHT_MED_WRONLY_DRIVER()
112 GENDRIVER * ENSIGHT_MED_WRONLY_DRIVER::copy() const
114 return new ENSIGHT_MED_WRONLY_DRIVER(*this) ;
117 void ENSIGHT_MED_WRONLY_DRIVER::read() throw (MEDEXCEPTION) {
118 throw MEDEXCEPTION("ENSIGHT_MED_WRONLY_DRIVER::read : Can't read with a WRONLY driver !");
121 void ENSIGHT_MED_WRONLY_DRIVER::write() const throw (MEDEXCEPTION)
123 const char * LOC = "ENSIGHT_MED_WRONLY_DRIVER::write() : ";
126 openConst(); // check if can open the case file
128 _CaseFileDriver caseFile( getCaseFileName(), this );
130 int NumberOfMeshes = _ptrMed->getNumberOfMeshes() ;
131 deque<string> MeshNames = _ptrMed->getMeshNames() ;
133 int NumberOfFields = _ptrMed->getNumberOfFields() ;
134 deque<string> FieldNames = _ptrMed->getFieldNames() ;
136 // Create drivers for all meshes and fields
137 // and add them to be written to Case file
139 list< GENDRIVER* > drivers;
140 ENSIGHT_MESH_WRONLY_DRIVER * meshDriver;
141 ENSIGHT_FIELD_WRONLY_DRIVER * fieldDriver;
143 for (int i=0; i<NumberOfMeshes; i++)
145 MESH * mesh = _ptrMed->getMesh(MeshNames[i]) ;
146 meshDriver = new ENSIGHT_MESH_WRONLY_DRIVER( _fileName, mesh );
147 caseFile.addMesh( meshDriver );
148 drivers.push_back( meshDriver );
150 // get all fields on this mesh
151 for (int j=0; j<NumberOfFields; j++)
153 deque<DT_IT_> timeSteps = _ptrMed->getFieldIteration(FieldNames[j]) ;
154 deque<DT_IT_>::const_iterator dtit = timeSteps.begin();
155 for ( ; dtit!=timeSteps.end(); dtit++)
157 FIELD_ * field = _ptrMed->getField( FieldNames[j], dtit->dt, dtit->it );
158 MESH* supMesh = field->getSupport()->getMesh();
159 if ( supMesh == mesh || mesh->getName() == field->getSupport()->getMeshName() ) {
160 fieldDriver = new ENSIGHT_FIELD_WRONLY_DRIVER( _fileName, field );
161 caseFile.addField( fieldDriver );
162 drivers.push_back( fieldDriver );
171 caseFile.write();// necessary data is passed to the drivers by this method
174 list< GENDRIVER* >::iterator drv = drivers.begin();
175 for ( ; drv != drivers.end(); ++drv ) {
176 GENDRIVER* driver = *drv;
184 // ================================================================================
186 // ================================================================================
188 ENSIGHT_MED_RDONLY_DRIVER::ENSIGHT_MED_RDONLY_DRIVER() :
189 ENSIGHT_MED_DRIVER(), _isFileStructRead(false)
193 ENSIGHT_MED_RDONLY_DRIVER::ENSIGHT_MED_RDONLY_DRIVER(const string & fileName, MED * ptrMed)
194 : ENSIGHT_MED_DRIVER( fileName, ptrMed, MED_EN::RDONLY), _isFileStructRead(false)
198 ENSIGHT_MED_RDONLY_DRIVER::ENSIGHT_MED_RDONLY_DRIVER(const ENSIGHT_MED_RDONLY_DRIVER & driver)
199 : ENSIGHT_MED_DRIVER(driver), _isFileStructRead(false)
203 ENSIGHT_MED_RDONLY_DRIVER::~ENSIGHT_MED_RDONLY_DRIVER()
207 GENDRIVER * ENSIGHT_MED_RDONLY_DRIVER::copy() const
209 return new ENSIGHT_MED_RDONLY_DRIVER(*this) ;
212 void ENSIGHT_MED_RDONLY_DRIVER::write() const throw (MEDEXCEPTION) {
213 throw MEDEXCEPTION("ENSIGHT_MED_RDONLY_DRIVER::write : Can't write with a RDONLY driver !");
216 void ENSIGHT_MED_RDONLY_DRIVER::read()
218 const char * LOC = "ENSIGHT_MED_RDONLY_DRIVER::read() : " ;
221 if ( _isFileStructRead ) {
223 int NumberOfMeshes = _ptrMed->getNumberOfMeshes() ;
224 deque<string> MeshNames = _ptrMed->getMeshNames() ;
226 int NumberOfFields = _ptrMed->getNumberOfFields() ;
227 deque<string> FieldNames = _ptrMed->getFieldNames() ;
229 for (int i=0; i<NumberOfMeshes; i++)
231 MESH * mesh = _ptrMed->getMesh(MeshNames[i]) ;
232 mesh->read( getId() );
235 for (int j=0; j<NumberOfFields; j++)
237 deque<DT_IT_> timeSteps = _ptrMed->getFieldIteration(FieldNames[j]) ;
238 deque<DT_IT_>::const_iterator dtit = timeSteps.begin();
239 for ( ; dtit!=timeSteps.end(); dtit++)
241 FIELD_ * field = _ptrMed->getField( FieldNames[j], dtit->dt, dtit->it );
242 field->read( getId() );
248 open(); // check if can open the case file
250 _CaseFileDriver caseFile( getCaseFileName(), this );
254 int nbOfMeshes = caseFile.getNbMeshes();
255 for ( int i = 1; i <= nbOfMeshes; ++i )
257 MESH* mesh = new MESH;
258 ENSIGHT_MESH_RDONLY_DRIVER meshDriver(_fileName, mesh);
259 caseFile.setDataFileName( i, &meshDriver );
262 _ptrMed->addMesh( mesh );
265 int nbOfFields = caseFile.getNbVariables();
266 for ( int i = 1; i <= nbOfFields; i++ )
268 int nbSteps = caseFile.getNbVarSteps( i );
269 for ( int step = 1; step <= nbSteps; ++step )
271 FIELD_* field = new FIELD<double>;
272 ENSIGHT_FIELD_RDONLY_DRIVER fieldDriver( _fileName, field );
273 caseFile.setDataFileName( i, step, &fieldDriver );
276 _ptrMed->addField( field );
281 //================================================================================
283 * \brief Create all meshes and fields but not read them
285 //================================================================================
287 void ENSIGHT_MED_RDONLY_DRIVER::readFileStruct()
289 const char * LOC = "ENSIGHT_MED_RDONLY_DRIVER::read() : " ;
292 open(); // check if can open the case file
294 _CaseFileDriver caseFile( getCaseFileName(), this );
298 int nbOfMeshes = caseFile.getNbMeshes();
299 vector<MESH*> meshes( nbOfMeshes+1, (MESH*)0 );
300 for ( int i = 1; i <= nbOfMeshes; ++i )
302 MESH* mesh = meshes[ i ] = new MESH;
303 ENSIGHT_MESH_RDONLY_DRIVER meshDriver(_fileName, mesh, i);
304 caseFile.setDataFileName( i, &meshDriver ); // retrieve mesh name
305 setId( mesh->addDriver( meshDriver ));
306 _ptrMed->addMesh( mesh );
308 _isFileStructRead = true;
310 int nbOfFields = caseFile.getNbVariables();
311 for ( int i = 1; i <= nbOfFields; i++ )
313 int nbSteps = caseFile.getNbVarSteps( i );
314 for ( int step = 1; step <= nbSteps; ++step )
316 FIELD<double>* field = new FIELD<double>;
317 ENSIGHT_FIELD_RDONLY_DRIVER fieldDriver( _fileName, field, step );
318 int meshIndex = caseFile.setDataFileName( i, step, &fieldDriver ); // retrieve field name
319 field->addDriver( fieldDriver );
320 if ( const SUPPORT* sup = field->getSupport() ) {
321 if ( meshIndex > nbOfMeshes || !meshes[ meshIndex ])
323 ((SUPPORT*) sup)->setMesh( meshes[ meshIndex ]);
325 _ptrMed->addField( field );