Salome HOME
df6ab7abf91845dcb0213780cbeb6e2e148b7136
[modules/med.git] / src / MEDMEM_SWIG / medEnsightMed_test.py
1 #!/usr/bin/env python
2 #  -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Lesser General Public License for more details.
14 #
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21
22 ############################################################################
23 # This script tests conversion of MEDMEM to EnSight by performing following
24 # operations on available med files:
25 # - read med file into MEDMEM and breifly dump it's content;
26 # - write EnSight file in different formats: Gold and EnSight6, ASCII and binary;
27 # - checks generated EnSight files using ens_checker utility (if available);
28 # - read generated EnSight file into MEDMEM and breifly dump it's content;
29 # - store MEDMEM to med file.
30 ############################################################################
31 #
32 from medmem import *
33 from dumpMEDMEM import *
34 from re import search
35 import sys
36
37 ASCII = False
38 Binary = True
39 formats = [
40     (ENSIGHT_GOLD,ASCII)
41     ,(ENSIGHT_GOLD,Binary)
42     ,(ENSIGHT_6,ASCII)
43     ,(ENSIGHT_6,Binary)
44     ]
45
46 tmpDir  = os.getenv("TMP")
47 if not tmpDir:
48     tmpDir = os.getenv("TMPDIR","/tmp")
49
50 inDir = os.path.join(os.getenv("MED_ROOT_DIR"), "share","salome","resources","med")
51 if not os.access(inDir, os.F_OK):
52     raise RuntimeError, "Path to med files not found, MED_ROOT_DIR incorrect?"
53
54 outDir = os.path.join( tmpDir,"Ensight_out")
55 if not os.access(outDir, os.F_OK):
56     os.mkdir( outDir )
57     pass
58
59 # find out if ens_checker is present
60 has_ens_checker = False
61 tmpFile = os.path.join( outDir, "has_ens_checker" )
62 os.system("ens_checker _.case > %s 2>&1" % tmpFile)
63 tmpFile = open( tmpFile ).read()
64 if search("EnSight Data Format Checker", tmpFile):
65     has_ens_checker = True
66 else:
67     print "\nWarning: ens_checker utility NOT available"
68     pass
69
70 dumpMesh = False
71 dumpMesh = True
72
73 dumpField= False
74 dumpField= True
75
76 def check_ens(casefile, logfile):
77     cmd = "(cd %s; ens_checker %s > %s 2>&1)" % (outDir, casefile, logfile)
78     err = os.system( cmd )
79     if os.access(logfile, os.F_OK):
80         log = open(logfile).read()
81         if search("bummer", log):
82             print log
83             raise RuntimeError, "cd %s; ens_checker %s" % (outDir, casefile)
84         if search("Warning:", log):
85             print log
86         pass
87     pass
88
89 def compatibilityPb():
90     "Print traceback and return true if exception is due to EnSight-MEDMEM incompatibility"
91     isCompatibilityPb = ( sys.exc_value.__str__().find("compatibility problem") > 0 )
92     if isCompatibilityPb:
93         print '$$$$$$$$$$$$$$$$$$$$ COMPATIBILITY PROBLEM $$$$$$$$$$$$$$$$$$$$$$$$'
94         print sys.exc_value, "\n"
95     else:
96         import traceback
97         traceback.print_exc()
98     return isCompatibilityPb
99
100 from dircache import listdir
101
102 # all files sorted by size increasing
103 medFiles = [
104      "ChampsDarcy.med"
105 #     ,"Old_maillage_chemvalIV_cas1_40elts.med"
106 #     ,"maillage_UniSegFam.med"
107 #     ,"champ1.med"
108 #     ,"carre_en_quad4.med"
109 #     ,"poly3D.med"
110 #     ,"Old_Deff_fdt_5.8_castem_vf_diff_conc_dom.med"
111 #     ,"Old_Deff_fdt_5.8_castem_efmh_diff_conc_dom.med"
112 #     ,"test18.med"
113 #     ,"cas_defaut_domaine_fluide.med"
114 #     ,"carre_en_quad4_seg2.med"
115 #     ,"polyedres.med"
116 #     ,"Fields_group3D.med"
117 #     ,"maillage_5_5_5.med"
118 #     ,"cube_hexa8.med"
119 #     ,"new_pointe.med"
120 #     ,"mesh.med"
121 #     ,"cube_hexa8_quad4.med"
122 #     ,"jurassique.med"
123 #     ,"test_2D.med"
124 #     ,"pointe_4fields.med"
125 #     ,"pointe.med"
126 #     ,"test19.med"
127 #     ,"extendedtransport53_triangles.med"
128 #     ,"recoll_bord.med"
129 #     ,"polygones.med"
130 #     ,"zzzz121b_without_tr6.med"
131 #     ,"trio_2D.med"
132 #     ,"essaiminimail.med"
133 #     ,"maill.0.med"
134 #     ,"elle_3D_HPr_2x2x2_2.med"
135 #     ,"maill.00_nofield.med"
136 #     ,"elle_3D_HPr_4x4x4_2.med"
137 #     ,"maill.00_nomesh.med"
138 #     ,"fra1.med"
139 #     ,"fra.med"
140 #     ,"maill.00_without_seg2.med"
141 #     ,"freebord.med"
142 #     ,"maill.00.med"
143 #     ,"zzzz121b.med"
144 #     ,"ResOK_0000.med"
145 #     ,"Darcy3_3D_H_10x10x10_2.med"
146 #     ,"maill.0_volumes.med"
147 #     ,"Old_darcy_1.3_resTRACES.med"
148 #     ,"Old_darcy_1.3_resCASTEM.med"
149 #     ,"darcy_1.3_resTRACES.med"
150 #     ,"darcy_1.3_resCASTEM.med"
151 #     ,"geomMesh22.med"
152 #     ,"geomMesh21.med"
153 #     ,"Old_darcy_1.3_resPORFLOW.med"
154 #     ,"darcy_1.3_resPORFLOW.med"
155 #     ,"test_hydro_darcy1a_out.med"
156 #     ,"maillage_2D.med"
157 #     ,"elle_3D_HPr_10x10x10_2.med"
158 #     ,"Old_darcy_1.1_res.med"
159 #     ,"darcy_1.1_res.med"
160 #     ,"maill.1.med"
161 #     ,"clo.med"
162 #     ,"clo2.med"
163 #     ,"Old_H_Traces_Se79_COUPLEX1.med"
164 #     ,"Old_H_Traces_I129_COUPLEX1.med"
165 #     ,"Old_H_PorfPorf_Se79_COUPLEX1.med"
166 #     ,"Old_H_PorfPorf_I129_COUPLEX1.med"
167 #     ,"Old_H_PorfCast_EFMH_Se79_COUPLEX1.med"
168 #     ,"Old_H_PorfCast_EFMH_I129_COUPLEX1.med"
169 #     ,"Old_H_CastPorf_Se79_COUPLEX1.med"
170 #     ,"Old_H_CastPorf_I129_COUPLEX1.med"
171 #     ,"Old_H_CastCast_VF_Se79_COUPLEX1.med"
172 #     ,"Old_H_CastCast_VF_I129_COUPLEX1.med"
173 #     ,"Old_H_CastCast_EFMH_I129_COUPLEX1.med"
174 #     ,"H_Traces_Se79_COUPLEX1.med"
175 #     ,"H_Traces_I129_COUPLEX1.med"
176 #     ,"H_PorfPorf_I129_COUPLEX1.med"
177 #     ,"H_PorfCast_EFMH_Se79_COUPLEX1.med"
178 #     ,"H_PorfCast_EFMH_I129_COUPLEX1.med"
179 #     ,"H_CastPorf_Se79_COUPLEX1.med"
180 #     ,"H_CastPorf_I129_COUPLEX1.med"
181 #     ,"H_CastCast_VF_Se79_COUPLEX1.med"
182 #     ,"H_CastCast_VF_I129_COUPLEX1.med"
183 #     ,"H_CastCast_EFMH_I129_COUPLEX1.med"
184 #     ,"puitsinst.med"
185 #     ,"Old_darcy2_Castem_EFMH.med"
186 #     ,"darcy2_Castem_EFMH.med"
187 #     ,"Old_darcy2_Castem_qua_VF.med"
188 #     ,"Old_darcy2_Castem_qua_EFMH.med"
189 #     ,"darcy2_Castem_qua_VF.med"
190 #     ,"darcy2_Castem_qua_EFMH.med"
191 #     ,"maillage_migr3d.med"
192 #     ,"Mistrat.med"
193 #     ,"Old_ChampsDarcy.med"
194 #     ,"ChampsDarcy.med"
195 #     ,"resu.2.med"
196 #     ,"maill.2.med"
197 #     ,"TimeStamps.med"
198 #     ,"hexa_28320_ELEM.med"
199     ]
200
201 badFiles = [ # files that can't be read by MEDMEM
202     "Deff_fdt_5.8_castem_efmh_diff_conc_dom.med"
203     ,"Deff_fdt_5.8_castem_vf_diff_conc_dom.med"
204     ]
205
206 medFiles = listdir( inDir )
207
208
209 for medFile in medFiles: # loop on med files in inDir
210
211     basename, ext = os.path.splitext( medFile )
212     if ext != ".med" or medFile in badFiles: continue
213
214     # read MED file
215     medFile = os.path.join( inDir, medFile )
216     print "reading",medFile
217     fields = []
218     try:
219         med = MEDFILEBROWSER(medFile)
220         if med.getNumberOfMeshes() < 1: continue
221         m2m_nom  = med.getMeshNames()[0]
222         if med.isStructuredMesh(m2m_nom):
223             mesh = GRID(MED_DRIVER,medFile,m2m_nom);
224         else:
225             mesh = MESH(MED_DRIVER,medFile,m2m_nom);
226             pass
227
228         for f_name in med.getFieldNames():
229             if med.getMeshName(f_name) != mesh.getName(): continue
230             dtit_list = med.getFieldIteration( f_name )
231             for dtit in dtit_list:
232                 if med.getFieldType( f_name ) == MED_REEL64:
233                     field = FIELDDOUBLE(MED_DRIVER, medFile, f_name, dtit.dt, dtit.it, mesh )
234                 else:
235                     field = FIELDINT(MED_DRIVER, medFile, f_name, dtit.dt, dtit.it, mesh )
236                     pass
237                 fields.append( field )
238     except:
239         print sys.exc_value
240         continue
241
242     ShowMesh( mesh )
243     print "Nb Fields",len(fields)
244     #ShowGroups( mesh )
245     #ShowFields( fields, 10 )
246
247     basename = os.path.join( outDir, basename ) + '.'
248     checkFile = basename + "ens_checker"
249
250     for format,bin in formats:
251         if format == ENSIGHT_GOLD:
252             formatName = "ENSIGHT GOLD"
253             formatSuffix = "g"
254         else:
255             formatName = "ENSIGHT 6"
256             formatSuffix = '6'
257             pass
258         if bin:
259             formatName += " Binary"
260             formatSuffix += 'b'
261         else:
262             formatName += " ASCII"
263             formatSuffix += 'a'
264             pass
265         ensFile = basename + formatSuffix + ".case"
266         print '*'*80
267         print "Format: \t",formatName
268         print '*'*80
269
270         setEnSightFormatForWriting( format, bin )
271
272         # write a mesh to EnSight
273         # print "write a mesh to EnSight"
274         # myMeshDriver = ENSIGHT_MESH_WRONLY_DRIVER(ensFile,mesh)
275         # myMeshDriver.write()
276
277         # if med.getNumberOfFields() > 0:
278         #     fName = med.getFieldName( 0 )
279         #     dt_it_= med.getFieldIteration( fName, 0 )
280         #     field = med.getField( fName, dt_it_.dt, dt_it_.it )
281         #     print "add a field to EnSight"
282         #     myFieldDriver = ENSIGHT_FIELD_WRONLY_DRIVER(ensFile,field);
283         #     myFieldDriver.write();
284
285         # check_ens(ensFile, checkFile)
286
287         # write EnSight
288         print "writting", ensFile
289         try:
290             if fields:
291                 medEnsDriver = ENSIGHT_MED_WRONLY_DRIVER (ensFile, fields)
292                 medEnsDriver.write()
293             else:
294                 mesh.write( ENSIGHT_DRIVER, ensFile )
295         except:
296             if not compatibilityPb():
297                 sys.exit(1)
298             continue
299
300         # check generated EnSight
301         check_ens(ensFile, checkFile)
302
303         # read generated EnSight into MEDMEM
304         print "reading",ensFile
305         if fields:
306             medFromEns = ENSIGHT_MED_RDONLY_DRIVER(ensFile)
307             fields = medFromEns.read()
308             mesh = fields[0].getSupport().getMesh()
309         else:
310             mesh = MESH(ENSIGHT_DRIVER, ensFile, "")
311
312         # dump generated EnSight
313         if dumpMesh:
314             #ShowMesh( mesh )
315             ShowMesh( mesh, 10, [10,10,10] )
316             #ShowGroups( mesh )
317             pass
318         if dumpField:
319             ShowFields( fields, 10 )
320             pass
321
322         # write EnSight to MED
323         wFile = basename + formatSuffix + ".med"
324         deleteFile(wFile)
325         print "write",wFile
326         try:
327             mesh.write( MED_DRIVER,wFile )
328             for f in fields:
329                 fTyped = f.castToTypedField()
330                 fTyped.write(MED_DRIVER,wFile)
331         except:
332             import traceback
333             traceback.print_exc()
334             pass
335         pass
336
337     print "\n\n\n"
338             
339
340 # remove created files
341 for f in listdir( outDir ):
342     deleteFile( os.path.join( outDir, f ))