]> SALOME platform Git repositories - modules/med.git/blob - src/MEDMEM/MEDMEM_MedMeshDriver.hxx
Salome HOME
NRI : Update 1.1a and New organisation.
[modules/med.git] / src / MEDMEM / MEDMEM_MedMeshDriver.hxx
1 #ifndef MED_MESH_DRIVER_HXX
2 #define MED_MESH_DRIVER_HXX
3
4 #include <string>
5 #include <vector>
6 #include "MEDMEM_define.hxx"
7 #include "MEDMEM_GenDriver.hxx"
8
9 #include "MEDMEM_STRING.hxx"
10 #include "MEDMEM_Exception.hxx"
11 #include "utilities.h"
12
13 class MESH;
14 class FAMILY;
15 class GROUP;
16 class CONNECTIVITY;
17
18 class MED_MESH_DRIVER : public GENDRIVER
19 {
20 protected:
21   
22   MESH *   _ptrMesh;
23   MED_FR::med_idt        _medIdt;
24   string         _meshName;    // const ?
25   int            _meshNum;     // INUTILE ?
26   
27 public :
28
29   // all MED cell type
30   static const MED_FR::med_geometrie_element all_cell_type[MED_NBR_GEOMETRIE_MAILLE];
31   
32   static const char * const all_cell_type_tab [MED_NBR_GEOMETRIE_MAILLE];
33  
34   MED_MESH_DRIVER():GENDRIVER(),
35                     _ptrMesh(( MESH *)MED_NULL),_medIdt(MED_INVALID),
36                     _meshName(""),_meshNum(MED_INVALID)
37   {
38   }
39   MED_MESH_DRIVER(const string & fileName,  MESH * ptrMesh, med_mode_acces accessMode): 
40     GENDRIVER(fileName,accessMode),
41     _ptrMesh(ptrMesh),_medIdt(MED_INVALID), 
42     _meshName(""),_meshNum(MED_INVALID) 
43   {
44   }
45   
46   void open() {
47     BEGIN_OF("MED_MESH_DRIVER::open()");
48     _medIdt = MED_FR::MEDouvrir( (const_cast <char *> (_fileName.c_str())),(MED_FR::med_mode_acces) _accessMode);
49     MESSAGE("MED_MESH_DRIVER::open() _medIdt : "<< _medIdt );
50     if (_medIdt > 0) _status=MED_OPENED; else {
51       MESSAGE(" MED_MESH__DRIVER::open() : MEDouvrir : _medIdt= " << _medIdt );
52       _status = MED_INVALID;
53     }
54     END_OF("MED_MESH_DRIVER::open()");
55   }
56   
57   void close() {
58     const char * LOC = "MED_MESH_DRIVER::close() " ;
59     BEGIN_OF(LOC);
60     med_int err = 0;
61     if ( _status == MED_OPENED) {
62       err=MED_FR::MEDfermer(_medIdt);
63       H5close(); // If we call H5close() all the files are closed.
64       if (err != 0)
65         throw MEDEXCEPTION( LOCALIZED(STRING(LOC)
66                                       <<" Error when closing file !"
67                                       )
68                             );
69       MESSAGE(LOC <<": _medIdt= " << _medIdt );
70       MESSAGE(LOC<<": MEDfermer : err    = " << err );
71       _status = MED_CLOSED;
72       _medIdt = MED_INVALID;
73     }
74     END_OF(LOC);
75   }
76
77   virtual void write( void ) const = 0 ;
78   virtual void read ( void ) = 0 ;
79  
80   void   setMeshName(const string & meshName) ;
81   string getMeshName() const ;
82
83 };
84
85 class MED_MESH_RDONLY_DRIVER : public virtual MED_MESH_DRIVER
86 {
87  
88 public :
89   
90   MED_MESH_RDONLY_DRIVER():MED_MESH_DRIVER() {};
91   
92   MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh):
93     MED_MESH_DRIVER(fileName,ptrMesh,MED_RDONLY) { 
94     MESSAGE("MED_MESH_RDONLY_DRIVER::MED_MESH_RDONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
95   }
96   
97   ~MED_MESH_RDONLY_DRIVER() { 
98     MESSAGE("MED_MESH_RDONLY_DRIVER::~MED_MESH_RDONLY_DRIVER() has been destroyed");
99   } 
100   
101   // CREER UNE METHODE POUR LIRE LA LISTE DES MAILLAGES .....
102   int getCOORDINATE();
103   int getCONNECTIVITY();
104   int getFAMILY();
105   void write( void ) const ;
106   void read ( void ) ;
107
108 private:
109   int getNodalConnectivity(CONNECTIVITY * Connectivity) ;
110   int getDescendingConnectivity(CONNECTIVITY * Connectivity) ;
111   int getNodesFamiliesNumber() ;
112   int getCellsFamiliesNumber(int** Arrays, CONNECTIVITY* Connectivity) ;
113   void updateFamily() ;
114   void buildAllGroups(vector<GROUP*> & Groups, vector<FAMILY*> & Families) ;
115   
116 };
117
118 class MED_MESH_WRONLY_DRIVER : public virtual MED_MESH_DRIVER {
119   
120 public :
121   
122   MED_MESH_WRONLY_DRIVER():MED_MESH_DRIVER() {}
123   
124   MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh):
125     MED_MESH_DRIVER(fileName,ptrMesh,MED_WRONLY)
126   {
127     MESSAGE("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
128   };
129
130   ~MED_MESH_WRONLY_DRIVER() {  
131     MESSAGE("MED_MESH_WRONLY_DRIVER::MED_MESH_WRONLY_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
132   }
133
134   void write( void ) const ;
135   void read ( void ) ;
136
137   int writeCoordinates    ()                         const;
138   int writeConnectivities (medEntityMesh entity)     const;
139   int writeFamilyNumbers  ()                         const;
140   int writeFamilies       (vector<FAMILY*> & families) const;
141 };
142
143
144 class MED_MESH_RDWR_DRIVER : public MED_MESH_RDONLY_DRIVER, public MED_MESH_WRONLY_DRIVER {
145
146 public :
147
148   MED_MESH_RDWR_DRIVER():MED_MESH_DRIVER() {}
149
150   MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh):
151     MED_MESH_DRIVER(fileName,ptrMesh,MED_RDWR)
152   {
153     MESSAGE("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been created");
154   };
155
156   ~MED_MESH_RDWR_DRIVER() {
157     MESSAGE("MED_MESH_RDWR_DRIVER::MED_MESH_RDWR_DRIVER(const string & fileName, MESH * ptrMesh) has been destroyed");
158   } 
159   
160   void write(void) const ;
161   void read (void)       ;
162 };
163
164
165 #endif /* MED_MESH_DRIVER_HXX */