2 #include "MEDMEM_VtkMedDriver.hxx"
6 #include "MEDMEM_define.hxx"
7 #include "MEDMEM_Med.hxx"
8 #include "MEDMEM_Field.hxx"
9 #include "MEDMEM_Support.hxx"
10 #include "MEDMEM_Mesh.hxx"
11 #include "MEDMEM_CellModel.hxx"
13 VTK_MED_DRIVER::VTK_MED_DRIVER(): GENDRIVER(),
14 _ptrMed((MED * const)MED_NULL)
16 _vtkFile = new ofstream();
17 // What about _id in Gendriver ?
22 VTK_MED_DRIVER::VTK_MED_DRIVER(const string & fileName, MED * const ptrMed):
23 GENDRIVER(fileName,MED_EN::MED_RDWR), _ptrMed(ptrMed)
25 _ptrMed->addDriver(*this); // OU RECUPERER L'ID.
26 _vtkFile = new ofstream();
27 // What about _id in Gendriver ?
31 VTK_MED_DRIVER::VTK_MED_DRIVER(const VTK_MED_DRIVER & driver):
33 _ptrMed(driver._ptrMed)
35 _ptrMed->addDriver(*this); // OU RECUPERER L'ID.
36 _vtkFile = new ofstream();
37 // What about _id in Gendriver ?
41 VTK_MED_DRIVER::~VTK_MED_DRIVER()
43 const char * LOC ="VTK_MED_DRIVER::~VTK_MED_DRIVER()";
52 GENDRIVER * VTK_MED_DRIVER::copy() const
54 return new VTK_MED_DRIVER(*this) ;
57 //REM : As t'on besoin du champ _status : _vtkFile <-> _status ? Oui
59 void VTK_MED_DRIVER::openConst() const {
61 const char * LOC ="VTK_MED_DRIVER::open() : ";
64 if ( _fileName == "" )
65 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
66 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
70 if (!(*_vtkFile).is_open())
71 (*_vtkFile).open(_fileName.c_str()) ;
73 // _status = MED_OPENED ;
76 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not open file "
82 void VTK_MED_DRIVER::open() {
86 void VTK_MED_DRIVER::closeConst() const {
88 const char * LOC = "VTK_MED_DRIVER::close() : ";
94 // _status = MED_CLOSED ;
97 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not close file "
103 void VTK_MED_DRIVER::close() {
108 void VTK_MED_DRIVER::write() const {
110 const char * LOC = "VTK_MED_DRIVER::write() : ";
113 // Well we must open vtk file first, because there are
114 // no other driver than MED for VTK that do it !
117 // could we put more than one Mesh ?????
118 (*_vtkFile) << "# vtk DataFile Version 2.0" << endl
119 << "maillage from MedMemory" << endl ;
120 // only ASCII for the moment (binary came later :-)
121 (*_vtkFile) << "ASCII" << endl ;
123 int NumberOfMeshes = _ptrMed->getNumberOfMeshes() ;
124 deque<string> MeshNames = _ptrMed->getMeshNames() ;
125 //deque<string>::const_iterator currentMesh ; !! UNUSED VARIABLE !!
126 // In fact, we must take care of all supports
127 // We restrict Field on all nodes or cells
129 int NumberOfFields = _ptrMed->getNumberOfFields() ;
130 deque<string> FieldNames = _ptrMed->getFieldNames() ;
131 //deque<string>::const_iterator currentField ; !! UNUSED VARIABLE !!
133 // for ( currentMesh=MeshName.begin();currentMesh != MeshName.end(); currentMesh++) {
134 for (int i=0; i<NumberOfMeshes; i++) {
135 MESH * myMesh = _ptrMed->getMesh(MeshNames[i]) ;
137 // get all field which values are on this mesh => revoir api de Med !!!
138 // first : field on node
139 // fields is on all node !
140 (*_vtkFile) << "POINT_DATA " << myMesh->getNumberOfNodes() << endl ;
141 for (int j=0; j<NumberOfFields; j++) {
142 deque<DT_IT_> timeStep = _ptrMed->getFieldIteration(FieldNames[j]) ;
143 deque<DT_IT_>::const_iterator currentTimeStep ;
144 for ( currentTimeStep=timeStep.begin(); currentTimeStep!=timeStep.end(); currentTimeStep++) {
145 int dt = (*currentTimeStep).dt ;
146 int it = (*currentTimeStep).it ;
147 FIELD_ * myField = _ptrMed->getField(FieldNames[j],dt,it) ;
148 if( MeshNames[i] == myField->getSupport()->getMesh()->getName() ) {
149 // rigth in all case : better compare pointeur ?
150 if (MED_NODE == myField->getSupport()->getEntity())
151 if (myField->getSupport()->isOnAllElements()) {
153 name << myField->getName() << "_" << dt << "_" << it ;
154 writeField(myField,name.str()) ;
156 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" which is not on all nodes !");
161 (*_vtkFile) << "CELL_DATA " << myMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) << endl ;
162 // second : field on cell
163 for (int j=0; j<NumberOfFields; j++) {
164 deque<DT_IT_> timeStep = _ptrMed->getFieldIteration(FieldNames[j]) ;
165 deque<DT_IT_>::const_iterator currentTimeStep ;
166 for ( currentTimeStep=timeStep.begin(); currentTimeStep!=timeStep.end(); currentTimeStep++) {
169 FIELD_ * myField = _ptrMed->getField(FieldNames[j],dt,it) ;
170 if( MeshNames[i] == myField->getSupport()->getMesh()->getName() ) {
171 // rigth in all case : better compare pointeur ?
172 if (MED_CELL == myField->getSupport()->getEntity())
173 if (myField->getSupport()->isOnAllElements()) {
175 name << myField->getName() << "_" << dt << "_" << it ;
176 writeField(myField,name.str()) ;
178 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" which is not on all cells !");
185 // Well we must close vtk file first, because there are
186 // no other driver than MED for VTK that do it !
192 void VTK_MED_DRIVER::writeMesh(MESH * myMesh) const {
194 const char * LOC = "VTK_MED_DRIVER::writeMesh() : ";
197 (*_vtkFile) << "DATASET UNSTRUCTURED_GRID" << endl ;
198 // put points (all point are in 3D, so if we are in 1D or 2D, we complete by zero !
199 int SpaceDimension = myMesh->getSpaceDimension() ;
200 int NumberOfNodes = myMesh->getNumberOfNodes() ;
201 (*_vtkFile) << "POINTS " << NumberOfNodes << " float" << endl ;
202 const double *coordinate = myMesh->getCoordinates(MED_FULL_INTERLACE) ;
203 for (int i=0;i<NumberOfNodes;i++) {
204 for (int j=0;j<SpaceDimension;j++)
205 (*_vtkFile) << coordinate[i*SpaceDimension+j] << " " ;
206 if (SpaceDimension==1)
207 (*_vtkFile) << "0 0" ;
208 if (SpaceDimension==2)
210 (*_vtkFile) << endl ;
213 // we put connectivity
214 // how many cells and how many value in connectivity :
215 int cells_types_count = myMesh->getNumberOfTypes(MED_CELL) ;
216 // int * cells_count = myMesh->get_cells_count() ;
217 // int cells_sum = cells_count[cells_types_count] ;
218 int cells_sum = myMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) ;
219 const CELLMODEL * cells_type = myMesh->getCellsTypes(MED_CELL) ;
220 // int connectivity_sum = 0 ;
222 //const int * connectivity = myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_ALL_ELEMENTS) ; !! UNUSED VARIABLE !!
223 const int * connectivityIndex = myMesh->getConnectivityIndex(MED_NODAL,MED_CELL) ;
225 int connectivity_sum = connectivityIndex[cells_sum]-1 ;
227 (*_vtkFile) << "CELLS " << cells_sum << " " << connectivity_sum+cells_sum << endl ;
228 // we put connectivity
229 for (int i=0;i<cells_types_count;i++) {
230 int *filter = (int*) NULL ; // index in vtk connectivity
231 switch (cells_type[i].getType())
234 filter = new int[1] ;
239 filter = new int[2] ;
248 filter = new int[3] ;
255 filter = new int[4] ;
269 filter = new int[4] ;
272 filter[2] = 3 ; // 3td element in med are 4th in vtk (array begin at 0 !)
273 filter[3] = 2 ; // 4th element in med are 3rd in vtk (array begin at 0 !)
277 filter = new int[5] ;
279 filter[1] = 3 ; // 2nd element in med are 4th in vtk (array begin at 0 !)
281 filter[3] = 1 ; // 4th element in med are 2nd in vtk (array begin at 0 !)
286 filter = new int[6] ;
296 filter = new int[8] ;
324 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getName() ) ) ;
325 int nodes_cell = cells_type[i].getNumberOfNodes();
326 int numberOfCell = myMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
327 const int * connectivityArray = myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,cells_type[i].getType());
328 for (int j=0;j<numberOfCell;j++) {
329 (*_vtkFile) << nodes_cell << " " ;
330 for (int k=0;k<nodes_cell;k++)
331 (*_vtkFile) << connectivityArray[j*nodes_cell+filter[k]] - 1 << " " ;
332 (*_vtkFile) << endl ;
337 (*_vtkFile) << endl ;
339 (*_vtkFile) << "CELL_TYPES " << cells_sum << endl ;
340 for (int i=0;i<cells_types_count;i++) {
342 switch (cells_type[i].getType())
410 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getType() ) ) ;
411 int numberOfCell = myMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
412 for (int j=0;j<numberOfCell;j++)
413 (*_vtkFile) << vtkType << endl ;
416 // add a constant field on all node to test !
417 // _vtkFile << "POINT_DATA " << NumberOfNodes << endl ;
418 // _vtkFile << "SCALARS example_scalaire float 1" << endl ;
419 // _vtkFile << "LOOKUP_TABLE default" << endl ;
420 // for (int i=0;i<NumberOfNodes;i++)
421 // _vtkFile << i << endl ;
429 void VTK_MED_DRIVER::writeField(FIELD_ * myField,string name) const {
431 const char * LOC = "VTK_MED_DRIVER::writeField() : ";
434 int NomberOfValue = myField->getSupport()->getNumberOfElements(MED_ALL_ELEMENTS) ;
435 int NomberOfComponents = myField->getNumberOfComponents() ;
437 med_type_champ type = myField->getValueType() ;
443 MESSAGE("MED_INT32");
444 if (NomberOfComponents==3) {
445 (*_vtkFile) << "VECTORS " << name << " int" << endl ;
446 } else if (NomberOfComponents<=4) {
447 (*_vtkFile) << "SCALARS " << name << " int " << NomberOfComponents << endl ;
448 (*_vtkFile) << "LOOKUP_TABLE default" << endl ;
450 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" there are more than 4 components !");
454 //const int * value = ((FIELD<int>*)myField)->getValue(MED_NO_INTERLACE) ;
455 const int * value = ((FIELD<int>*)myField)->getValue(MED_NO_INTERLACE) ;
456 for (int i=0; i<NomberOfValue; i++) {
457 for(int j=0; j<NomberOfComponents; j++)
458 (*_vtkFile) << value[j*NomberOfValue+i] << " " ;
459 (*_vtkFile) << endl ;
464 MESSAGE("MED_REEL64");
465 if (NomberOfComponents==3) {
466 (*_vtkFile) << "VECTORS " << name << " float" << endl ;
467 } else if (NomberOfComponents<=4) {
468 (*_vtkFile) << "SCALARS " << name << " float " << NomberOfComponents << endl ;
469 (*_vtkFile) << "LOOKUP_TABLE default" << endl ;
471 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" there are more than 4 components !");
474 const double * value = ((FIELD<double>*)myField)->getValue(MED_NO_INTERLACE) ;
475 for (int i=0; i<NomberOfValue; i++) {
476 for(int j=0; j<NomberOfComponents; j++)
477 (*_vtkFile) << value[j*NomberOfValue+i] << " " ;
478 (*_vtkFile) << endl ;
483 MESSAGE(LOC << "Could not write field "<<name<<" the type is not int or double !");
490 void VTK_MED_DRIVER::writeSupport(SUPPORT * mySupport) const {
491 const char * LOC = "VTK_MED_DRIVER::writeSupport(SUPPORT *) : " ;
493 MESSAGE(LOC << "Not yet implemented, acting on the object " << *mySupport);