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"
12 using namespace MEDMEM;
14 VTK_MED_DRIVER::VTK_MED_DRIVER(): GENDRIVER(),
15 _ptrMed((MED * const)MED_NULL)
17 _vtkFile = new ofstream();
18 // What about _id in Gendriver ?
23 VTK_MED_DRIVER::VTK_MED_DRIVER(const string & fileName, MED * const ptrMed):
24 GENDRIVER(fileName,MED_EN::MED_RDWR), _ptrMed(ptrMed)
26 _ptrMed->addDriver(*this); // OU RECUPERER L'ID.
27 _vtkFile = new ofstream();
28 // What about _id in Gendriver ?
32 VTK_MED_DRIVER::VTK_MED_DRIVER(const VTK_MED_DRIVER & driver):
34 _ptrMed(driver._ptrMed)
36 _ptrMed->addDriver(*this); // OU RECUPERER L'ID.
37 _vtkFile = new ofstream();
38 // What about _id in Gendriver ?
42 VTK_MED_DRIVER::~VTK_MED_DRIVER()
44 const char * LOC ="VTK_MED_DRIVER::~VTK_MED_DRIVER()";
53 GENDRIVER * VTK_MED_DRIVER::copy() const
55 return new VTK_MED_DRIVER(*this) ;
58 //REM : As t'on besoin du champ _status : _vtkFile <-> _status ? Oui
60 void VTK_MED_DRIVER::openConst() const {
62 const char * LOC ="VTK_MED_DRIVER::open() : ";
65 if ( _fileName == "" )
66 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC)
67 << "_fileName is |\"\"|, please set a correct fileName before calling open()"
71 if (!(*_vtkFile).is_open())
72 (*_vtkFile).open(_fileName.c_str()) ;
74 // _status = MED_OPENED ;
77 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not open file "
83 void VTK_MED_DRIVER::open() {
87 void VTK_MED_DRIVER::closeConst() const {
89 const char * LOC = "VTK_MED_DRIVER::close() : ";
95 // _status = MED_CLOSED ;
98 throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) << "Could not close file "
104 void VTK_MED_DRIVER::close() {
109 void VTK_MED_DRIVER::write() const {
111 const char * LOC = "VTK_MED_DRIVER::write() : ";
114 // Well we must open vtk file first, because there are
115 // no other driver than MED for VTK that do it !
118 // could we put more than one Mesh ?????
119 (*_vtkFile) << "# vtk DataFile Version 2.0" << endl
120 << "maillage from MedMemory" << endl ;
121 // only ASCII for the moment (binary came later :-)
122 (*_vtkFile) << "ASCII" << endl ;
124 int NumberOfMeshes = _ptrMed->getNumberOfMeshes() ;
125 deque<string> MeshNames = _ptrMed->getMeshNames() ;
126 //deque<string>::const_iterator currentMesh ; !! UNUSED VARIABLE !!
127 // In fact, we must take care of all supports
128 // We restrict Field on all nodes or cells
130 int NumberOfFields = _ptrMed->getNumberOfFields() ;
131 deque<string> FieldNames = _ptrMed->getFieldNames() ;
132 //deque<string>::const_iterator currentField ; !! UNUSED VARIABLE !!
134 // for ( currentMesh=MeshName.begin();currentMesh != MeshName.end(); currentMesh++) {
135 for (int i=0; i<NumberOfMeshes; i++) {
136 MESH * myMesh = _ptrMed->getMesh(MeshNames[i]) ;
138 // get all field which values are on this mesh => revoir api de Med !!!
139 // first : field on node
140 // fields is on all node !
141 (*_vtkFile) << "POINT_DATA " << myMesh->getNumberOfNodes() << endl ;
142 for (int j=0; j<NumberOfFields; j++) {
143 deque<DT_IT_> timeStep = _ptrMed->getFieldIteration(FieldNames[j]) ;
144 deque<DT_IT_>::const_iterator currentTimeStep ;
145 for ( currentTimeStep=timeStep.begin(); currentTimeStep!=timeStep.end(); currentTimeStep++) {
146 int dt = (*currentTimeStep).dt ;
147 int it = (*currentTimeStep).it ;
148 FIELD_ * myField = _ptrMed->getField(FieldNames[j],dt,it) ;
149 if( MeshNames[i] == myField->getSupport()->getMesh()->getName() ) {
150 // rigth in all case : better compare pointeur ?
151 if (MED_NODE == myField->getSupport()->getEntity())
152 if (myField->getSupport()->isOnAllElements()) {
154 name << myField->getName() << "_" << dt << "_" << it ;
155 writeField(myField,name.str()) ;
157 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" which is not on all nodes !");
162 (*_vtkFile) << "CELL_DATA " << myMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) << endl ;
163 // second : field on cell
164 for (int j=0; j<NumberOfFields; j++) {
165 deque<DT_IT_> timeStep = _ptrMed->getFieldIteration(FieldNames[j]) ;
166 deque<DT_IT_>::const_iterator currentTimeStep ;
167 for ( currentTimeStep=timeStep.begin(); currentTimeStep!=timeStep.end(); currentTimeStep++) {
170 FIELD_ * myField = _ptrMed->getField(FieldNames[j],dt,it) ;
171 if( MeshNames[i] == myField->getSupport()->getMesh()->getName() ) {
172 // rigth in all case : better compare pointeur ?
173 if (MED_CELL == myField->getSupport()->getEntity())
174 if (myField->getSupport()->isOnAllElements()) {
176 name << myField->getName() << "_" << dt << "_" << it ;
177 writeField(myField,name.str()) ;
179 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" which is not on all cells !");
186 // Well we must close vtk file first, because there are
187 // no other driver than MED for VTK that do it !
193 void VTK_MED_DRIVER::writeMesh(MESH * myMesh) const {
195 const char * LOC = "VTK_MED_DRIVER::writeMesh() : ";
198 (*_vtkFile) << "DATASET UNSTRUCTURED_GRID" << endl ;
199 // put points (all point are in 3D, so if we are in 1D or 2D, we complete by zero !
200 int SpaceDimension = myMesh->getSpaceDimension() ;
201 int NumberOfNodes = myMesh->getNumberOfNodes() ;
202 (*_vtkFile) << "POINTS " << NumberOfNodes << " float" << endl ;
203 const double *coordinate = myMesh->getCoordinates(MED_FULL_INTERLACE) ;
204 for (int i=0;i<NumberOfNodes;i++) {
205 for (int j=0;j<SpaceDimension;j++)
206 (*_vtkFile) << coordinate[i*SpaceDimension+j] << " " ;
207 if (SpaceDimension==1)
208 (*_vtkFile) << "0 0" ;
209 if (SpaceDimension==2)
211 (*_vtkFile) << endl ;
214 // we put connectivity
215 // how many cells and how many value in connectivity :
216 int cells_types_count = myMesh->getNumberOfTypes(MED_CELL) ;
217 // int * cells_count = myMesh->get_cells_count() ;
218 // int cells_sum = cells_count[cells_types_count] ;
219 int cells_sum = myMesh->getNumberOfElements(MED_CELL,MED_ALL_ELEMENTS) ;
220 const CELLMODEL * cells_type = myMesh->getCellsTypes(MED_CELL) ;
221 // int connectivity_sum = 0 ;
223 //const int * connectivity = myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,MED_ALL_ELEMENTS) ; !! UNUSED VARIABLE !!
224 const int * connectivityIndex = myMesh->getConnectivityIndex(MED_NODAL,MED_CELL) ;
226 int connectivity_sum = connectivityIndex[cells_sum]-1 ;
228 (*_vtkFile) << "CELLS " << cells_sum << " " << connectivity_sum+cells_sum << endl ;
229 // we put connectivity
230 for (int i=0;i<cells_types_count;i++) {
231 int *filter = (int*) NULL ; // index in vtk connectivity
232 switch (cells_type[i].getType())
235 filter = new int[1] ;
240 filter = new int[2] ;
249 filter = new int[3] ;
256 filter = new int[4] ;
270 filter = new int[4] ;
273 filter[2] = 3 ; // 3td element in med are 4th in vtk (array begin at 0 !)
274 filter[3] = 2 ; // 4th element in med are 3rd in vtk (array begin at 0 !)
278 filter = new int[5] ;
280 filter[1] = 3 ; // 2nd element in med are 4th in vtk (array begin at 0 !)
282 filter[3] = 1 ; // 4th element in med are 2nd in vtk (array begin at 0 !)
287 filter = new int[6] ;
297 filter = new int[8] ;
325 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getName() ) ) ;
326 int nodes_cell = cells_type[i].getNumberOfNodes();
327 int numberOfCell = myMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
328 const int * connectivityArray = myMesh->getConnectivity(MED_FULL_INTERLACE,MED_NODAL,MED_CELL,cells_type[i].getType());
329 for (int j=0;j<numberOfCell;j++) {
330 (*_vtkFile) << nodes_cell << " " ;
331 for (int k=0;k<nodes_cell;k++)
332 (*_vtkFile) << connectivityArray[j*nodes_cell+filter[k]] - 1 << " " ;
333 (*_vtkFile) << endl ;
338 (*_vtkFile) << endl ;
340 (*_vtkFile) << "CELL_TYPES " << cells_sum << endl ;
341 for (int i=0;i<cells_types_count;i++) {
343 switch (cells_type[i].getType())
411 throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<": MED element type not supported yet : " << cells_type[i].getType() ) ) ;
412 int numberOfCell = myMesh->getNumberOfElements(MED_CELL,cells_type[i].getType()) ;
413 for (int j=0;j<numberOfCell;j++)
414 (*_vtkFile) << vtkType << endl ;
417 // add a constant field on all node to test !
418 // _vtkFile << "POINT_DATA " << NumberOfNodes << endl ;
419 // _vtkFile << "SCALARS example_scalaire float 1" << endl ;
420 // _vtkFile << "LOOKUP_TABLE default" << endl ;
421 // for (int i=0;i<NumberOfNodes;i++)
422 // _vtkFile << i << endl ;
430 void VTK_MED_DRIVER::writeField(FIELD_ * myField,string name) const {
432 const char * LOC = "VTK_MED_DRIVER::writeField() : ";
435 int NomberOfValue = myField->getSupport()->getNumberOfElements(MED_ALL_ELEMENTS) ;
436 int NomberOfComponents = myField->getNumberOfComponents() ;
438 med_type_champ type = myField->getValueType() ;
444 MESSAGE("MED_INT32");
445 if (NomberOfComponents==3) {
446 (*_vtkFile) << "VECTORS " << name << " int" << endl ;
447 } else if (NomberOfComponents<=4) {
448 (*_vtkFile) << "SCALARS " << name << " int " << NomberOfComponents << endl ;
449 (*_vtkFile) << "LOOKUP_TABLE default" << endl ;
451 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" there are more than 4 components !");
455 //const int * value = ((FIELD<int>*)myField)->getValue(MED_NO_INTERLACE) ;
456 const int * value = ((FIELD<int>*)myField)->getValue(MED_NO_INTERLACE) ;
457 for (int i=0; i<NomberOfValue; i++) {
458 for(int j=0; j<NomberOfComponents; j++)
459 (*_vtkFile) << value[j*NomberOfValue+i] << " " ;
460 (*_vtkFile) << endl ;
465 MESSAGE("MED_REEL64");
466 if (NomberOfComponents==3) {
467 (*_vtkFile) << "VECTORS " << name << " float" << endl ;
468 } else if (NomberOfComponents<=4) {
469 (*_vtkFile) << "SCALARS " << name << " float " << NomberOfComponents << endl ;
470 (*_vtkFile) << "LOOKUP_TABLE default" << endl ;
472 MESSAGE(LOC << "Could not write field "<<myField->getName()<<" there are more than 4 components !");
475 const double * value = ((FIELD<double>*)myField)->getValue(MED_NO_INTERLACE) ;
476 for (int i=0; i<NomberOfValue; i++) {
477 for(int j=0; j<NomberOfComponents; j++)
478 (*_vtkFile) << value[j*NomberOfValue+i] << " " ;
479 (*_vtkFile) << endl ;
484 MESSAGE(LOC << "Could not write field "<<name<<" the type is not int or double !");
491 void VTK_MED_DRIVER::writeSupport(SUPPORT * mySupport) const {
492 const char * LOC = "VTK_MED_DRIVER::writeSupport(SUPPORT *) : " ;
494 MESSAGE(LOC << "Not yet implemented, acting on the object " << *mySupport);