1 #include "MEDMEM_VtkMedDriver.hxx"
5 #include "MEDMEM_define.hxx"
6 #include "MEDMEM_Med.hxx"
7 #include "MEDMEM_Field.hxx"
8 #include "MEDMEM_Support.hxx"
9 #include "MEDMEM_Mesh.hxx"
10 #include "MEDMEM_CellModel.hxx"
13 using namespace MEDMEM;
14 using namespace MED_EN;
16 VTK_MED_DRIVER::VTK_MED_DRIVER(): GENDRIVER(),
17 _ptrMed((MED * const)MED_NULL)
19 _vtkFile = new ofstream();
20 // What about _id in Gendriver ?
25 VTK_MED_DRIVER::VTK_MED_DRIVER(const string & fileName, MED * const ptrMed):
26 GENDRIVER(fileName,MED_EN::MED_RDWR), _ptrMed(ptrMed)
28 _ptrMed->addDriver(*this); // OU RECUPERER L'ID.
29 _vtkFile = new ofstream();
30 // What about _id in Gendriver ?
34 VTK_MED_DRIVER::VTK_MED_DRIVER(const VTK_MED_DRIVER & driver):
36 _ptrMed(driver._ptrMed)
38 _ptrMed->addDriver(*this); // OU RECUPERER L'ID.
39 _vtkFile = new ofstream();
40 // What about _id in Gendriver ?
44 VTK_MED_DRIVER::~VTK_MED_DRIVER()
46 const char * LOC ="VTK_MED_DRIVER::~VTK_MED_DRIVER()";
55 GENDRIVER * VTK_MED_DRIVER::copy() const
57 return new VTK_MED_DRIVER(*this) ;
60 //REM : As t'on besoin du champ _status : _vtkFile <-> _status ? Oui
62 void VTK_MED_DRIVER::openConst() const {
64 const char * LOC ="VTK_MED_DRIVER::open() : ";
67 if ( _fileName == "" )
68 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
69 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
73 if (!(*_vtkFile).is_open())
74 (*_vtkFile).open(_fileName.c_str()) ;
76 // _status = MED_OPENED ;
79 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not open file "
85 void VTK_MED_DRIVER::open() {
89 void VTK_MED_DRIVER::closeConst() const {
91 const char * LOC = "VTK_MED_DRIVER::close() : ";
97 // _status = MED_CLOSED ;
100 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not close file "
106 void VTK_MED_DRIVER::close() {
111 void VTK_MED_DRIVER::write() const {
113 const char * LOC = "VTK_MED_DRIVER::write() : ";
116 // Well we must open vtk file first, because there are
117 // no other driver than MED for VTK that do it !
120 // could we put more than one Mesh ?????
121 (*_vtkFile) << "# vtk DataFile Version 2.0" << endl
122 << "maillage from MedMemory" << endl ;
123 // only ASCII for the moment (binary came later :-)
124 (*_vtkFile) << "ASCII" << endl ;
126 int NumberOfMeshes = _ptrMed->getNumberOfMeshes() ;
127 deque<string> MeshNames = _ptrMed->getMeshNames() ;
128 //deque<string>::const_iterator currentMesh ; !! UNUSED VARIABLE !!
129 // In fact, we must take care of all supports
130 // We restrict Field on all nodes or cells
132 int NumberOfFields = _ptrMed->getNumberOfFields() ;
133 deque<string> FieldNames = _ptrMed->getFieldNames() ;
134 //deque<string>::const_iterator currentField ; !! UNUSED VARIABLE !!
136 // for ( currentMesh=MeshName.begin();currentMesh != MeshName.end(); currentMesh++) {
137 for (int i=0; i<NumberOfMeshes; i++) {
138 MESH * myMesh = _ptrMed->getMesh(MeshNames[i]) ;
140 // get all field which values are on this mesh => revoir api de Med !!!
141 // first : field on node
142 // fields is on all node !
143 (*_vtkFile) << "POINT_DATA " << myMesh->getNumberOfNodes() << endl ;
144 for (int j=0; j<NumberOfFields; j++) {
145 deque<DT_IT_> timeStep = _ptrMed->getFieldIteration(FieldNames[j]) ;
146 deque<DT_IT_>::const_iterator currentTimeStep ;
147 for ( currentTimeStep=timeStep.begin(); currentTimeStep!=timeStep.end(); currentTimeStep++) {
148 int dt = (*currentTimeStep).dt ;
149 int it = (*currentTimeStep).it ;
150 FIELD_ * myField = _ptrMed->getField(FieldNames[j],dt,it) ;
151 if( MeshNames[i] == myField->getSupport()->getMesh()->getName() ) {
152 // rigth in all case : better compare pointeur ?
153 if (MED_NODE == myField->getSupport()->getEntity())
154 if (myField->getSupport()->isOnAllElements()) {
156 name << myField->getName() << "_" << dt << "_" << it ;
157 writeField(myField,name.str()) ;
159 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" which is not on all nodes !");
164 (*_vtkFile) << "CELL_DATA " << myMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) << endl ;
165 // second : field on cell
166 for (int j=0; j<NumberOfFields; j++) {
167 deque<DT_IT_> timeStep = _ptrMed->getFieldIteration(FieldNames[j]) ;
168 deque<DT_IT_>::const_iterator currentTimeStep ;
169 for ( currentTimeStep=timeStep.begin(); currentTimeStep!=timeStep.end(); currentTimeStep++) {
172 FIELD_ * myField = _ptrMed->getField(FieldNames[j],dt,it) ;
173 if( MeshNames[i] == myField->getSupport()->getMesh()->getName() ) {
174 // rigth in all case : better compare pointeur ?
175 if (MED_CELL == myField->getSupport()->getEntity())
176 if (myField->getSupport()->isOnAllElements()) {
178 name << myField->getName() << "_" << dt << "_" << it ;
179 writeField(myField,name.str()) ;
181 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" which is not on all cells !");
188 // Well we must close vtk file first, because there are
189 // no other driver than MED for VTK that do it !
195 void VTK_MED_DRIVER::writeMesh(MESH * myMesh) const {
197 const char * LOC = "VTK_MED_DRIVER::writeMesh() : ";
200 (*_vtkFile) << "DATASET UNSTRUCTURED_GRID" << endl ;
201 // put points (all point are in 3D, so if we are in 1D or 2D, we complete by zero !
202 int SpaceDimension = myMesh->getSpaceDimension() ;
203 int NumberOfNodes = myMesh->getNumberOfNodes() ;
204 (*_vtkFile) << "POINTS " << NumberOfNodes << " float" << endl ;
205 const double *coordinate = myMesh->getCoordinates(MED_FULL_INTERLACE) ;
206 for (int i=0;i<NumberOfNodes;i++) {
207 for (int j=0;j<SpaceDimension;j++)
208 (*_vtkFile) << coordinate[i*SpaceDimension+j] << " " ;
209 if (SpaceDimension==1)
210 (*_vtkFile) << "0 0" ;
211 if (SpaceDimension==2)
213 (*_vtkFile) << endl ;
216 // we put connectivity
217 // how many cells and how many value in connectivity :
218 int cells_types_count = myMesh->getNumberOfTypes(MED_CELL) ;
219 // int * cells_count = myMesh->get_cells_count() ;
220 // int cells_sum = cells_count[cells_types_count] ;
221 int cells_sum = myMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) ;
222 const CELLMODEL * cells_type = myMesh->getCellsTypes(MED_CELL) ;
223 // int connectivity_sum = 0 ;
225 //const int * connectivity = myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_ALL_ELEMENTS) ; !! UNUSED VARIABLE !!
226 const int * connectivityIndex = myMesh->getConnectivityIndex(MED_NODAL,MED_CELL) ;
228 int connectivity_sum = connectivityIndex[cells_sum]-1 ;
230 (*_vtkFile) << "CELLS " << cells_sum << " " << connectivity_sum+cells_sum << endl ;
231 // we put connectivity
232 for (int i=0;i<cells_types_count;i++) {
233 int *filter = (int*) NULL ; // index in vtk connectivity
234 switch (cells_type[i].getType())
237 filter = new int[1] ;
242 filter = new int[2] ;
251 filter = new int[3] ;
258 filter = new int[4] ;
272 filter = new int[4] ;
275 filter[2] = 3 ; // 3td element in med are 4th in vtk (array begin at 0 !)
276 filter[3] = 2 ; // 4th element in med are 3rd in vtk (array begin at 0 !)
280 filter = new int[5] ;
282 filter[1] = 3 ; // 2nd element in med are 4th in vtk (array begin at 0 !)
284 filter[3] = 1 ; // 4th element in med are 2nd in vtk (array begin at 0 !)
289 filter = new int[6] ;
299 filter = new int[8] ;
327 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getName() ) ) ;
328 int nodes_cell = cells_type[i].getNumberOfNodes();
329 int numberOfCell = myMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
330 const int * connectivityArray = myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,cells_type[i].getType());
331 for (int j=0;j<numberOfCell;j++) {
332 (*_vtkFile) << nodes_cell << " " ;
333 for (int k=0;k<nodes_cell;k++)
334 (*_vtkFile) << connectivityArray[j*nodes_cell+filter[k]] - 1 << " " ;
335 (*_vtkFile) << endl ;
340 (*_vtkFile) << endl ;
342 (*_vtkFile) << "CELL_TYPES " << cells_sum << endl ;
343 for (int i=0;i<cells_types_count;i++) {
345 switch (cells_type[i].getType())
413 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getType() ) ) ;
414 int numberOfCell = myMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
415 for (int j=0;j<numberOfCell;j++)
416 (*_vtkFile) << vtkType << endl ;
419 // add a constant field on all node to test !
420 // _vtkFile << "POINT_DATA " << NumberOfNodes << endl ;
421 // _vtkFile << "SCALARS example_scalaire float 1" << endl ;
422 // _vtkFile << "LOOKUP_TABLE default" << endl ;
423 // for (int i=0;i<NumberOfNodes;i++)
424 // _vtkFile << i << endl ;
432 void VTK_MED_DRIVER::writeField(FIELD_ * myField,string name) const {
434 const char * LOC = "VTK_MED_DRIVER::writeField() : ";
437 int NomberOfValue = myField->getSupport()->getNumberOfElements(MED_ALL_ELEMENTS) ;
438 int NomberOfComponents = myField->getNumberOfComponents() ;
440 med_type_champ type = myField->getValueType() ;
446 MESSAGE("MED_INT32");
447 if (NomberOfComponents==3) {
448 (*_vtkFile) << "VECTORS " << name << " int" << endl ;
449 } else if (NomberOfComponents<=4) {
450 (*_vtkFile) << "SCALARS " << name << " int " << NomberOfComponents << endl ;
451 (*_vtkFile) << "LOOKUP_TABLE default" << endl ;
453 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" there are more than 4 components !");
457 //const int * value = ((FIELD<int>*)myField)->getValue(MED_NO_INTERLACE) ;
458 const int * value = ((FIELD<int>*)myField)->getValue(MED_NO_INTERLACE) ;
459 for (int i=0; i<NomberOfValue; i++) {
460 for(int j=0; j<NomberOfComponents; j++)
461 (*_vtkFile) << value[j*NomberOfValue+i] << " " ;
462 (*_vtkFile) << endl ;
467 MESSAGE("MED_REEL64");
468 if (NomberOfComponents==3) {
469 (*_vtkFile) << "VECTORS " << name << " float" << endl ;
470 } else if (NomberOfComponents<=4) {
471 (*_vtkFile) << "SCALARS " << name << " float " << NomberOfComponents << endl ;
472 (*_vtkFile) << "LOOKUP_TABLE default" << endl ;
474 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" there are more than 4 components !");
477 const double * value = ((FIELD<double>*)myField)->getValue(MED_NO_INTERLACE) ;
478 for (int i=0; i<NomberOfValue; i++) {
479 for(int j=0; j<NomberOfComponents; j++)
480 (*_vtkFile) << value[j*NomberOfValue+i] << " " ;
481 (*_vtkFile) << endl ;
486 MESSAGE(LOC << "Could not write field "<<name<<" the type is not int or double !");
493 void VTK_MED_DRIVER::writeSupport(SUPPORT * mySupport) const {
494 const char * LOC = "VTK_MED_DRIVER::writeSupport(SUPPORT *) : " ;
496 MESSAGE(LOC << "Not yet implemented, acting on the object " << *mySupport);