Salome HOME
Merge from V6_main_20120808 08Aug12
[modules/med.git] / src / MEDLoader / Swig / SauvLoaderTest.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2012  CEA/DEN, EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 from MEDLoader import *
22 import unittest, os
23 from MEDLoaderDataForTest import MEDLoaderDataForTest
24
25 class SauvLoaderTest(unittest.TestCase):
26
27     def testSauv2Med(self):
28         # get a file containing all types of readable piles
29         self.assertTrue( os.getenv("MED_ROOT_DIR") )
30         sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
31                                  "resources","med","allPillesTest.sauv")
32         self.assertTrue( os.access( sauvFile, os.F_OK))
33
34         # read SAUV and write MED
35         medFile = "SauvLoaderTest.med"
36         sr=SauvReader.New(sauvFile);
37         d2=sr.loadInMEDFileDS();
38         d2.write(medFile,0);
39
40         # check 
41         self.assertEqual(1,d2.getNumberOfMeshes())
42         self.assertEqual(8+97,d2.getNumberOfFields())
43         mm = d2.getMeshes()
44         m = mm.getMeshAtPos(0)
45         self.assertEqual(17,len(m.getGroupsNames()))
46
47         os.remove( medFile )
48         pass
49
50     def testMed2Sauv(self):
51         # read pointe.med
52         self.assertTrue( os.getenv("MED_ROOT_DIR") )
53         medFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
54                                 "resources","med","pointe.med")
55         self.assertTrue( os.access( medFile, os.F_OK))
56         pointeMed = MEDFileData.New( medFile )
57
58         # add 3 faces to pointeMed
59         pointeMedMesh = pointeMed.getMeshes().getMeshAtPos(0)
60         pointeM1D = MEDCouplingUMesh.New()
61         pointeM1D.setCoords( pointeMedMesh.getCoords() )
62         pointeM1D.setMeshDimension( 2 )
63         pointeM1D.allocateCells( 3 )
64         pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,2])
65         pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,3])
66         pointeM1D.insertNextCell( NORM_QUAD4, 4, [10,11,12,13])
67         pointeM1D.finishInsertingCells()
68         pointeMedMesh.setMeshAtLevel( -1, pointeM1D )
69         pointeMed.getMeshes().setMeshAtPos( 0, pointeMedMesh )
70
71         # add a field on 2 faces to pointeMed
72         ff1=MEDFileFieldMultiTS.New()
73         f1=MEDCouplingFieldDouble.New(ON_GAUSS_NE,ONE_TIME)
74         #f1.setMesh( pointeM1D )
75         f1.setName("Field on 2 faces")
76         d=DataArrayDouble.New()
77         d.alloc(3+4,2)
78         d.setInfoOnComponent(0,"sigX [MPa]")
79         d.setInfoOnComponent(1,"sigY [GPa]")
80         d.setValues([311,312,321,322,331,332,411,412,421,422,431,432,441,442],3+4,2)
81         f1.setArray(d)
82         da=DataArrayInt.New()
83         da.setValues([0,2],2,1)
84         da.setName("sup2")
85         ff1.appendFieldProfile(f1,pointeMedMesh,-1,da)
86         pointeMed.getFields().pushField( ff1 )
87
88         #remove fieldnodeint
89         pointeFields = pointeMed.getFields()
90         for i in range( pointeFields.getNumberOfFields() ):
91             if pointeFields.getFieldAtPos(i).getName() == "fieldnodeint":
92                 pointeFields.destroyFieldAtPos( i )
93                 break
94
95         # write pointeMed to SAUV
96         sauvFile = "SauvLoaderTest.sauv"
97         sw=SauvWriter.New();
98         sw.setMEDFileDS(pointeMed);
99         sw.write(sauvFile);
100
101         # read SAUV and check
102         sr=SauvReader.New(sauvFile);
103         d2=sr.loadInMEDFileDS();
104         self.assertEqual(1,d2.getNumberOfMeshes())
105         self.assertEqual(4,d2.getNumberOfFields())
106         m = d2.getMeshes().getMeshAtPos(0)
107         self.assertEqual("maa1",m.getName())
108         self.assertEqual(6,len(m.getGroupsNames()))
109         self.assertEqual(3,m.getMeshDimension())
110         groups = m.getGroupsNames()
111         self.assertTrue( "groupe1" in groups )
112         self.assertTrue( "groupe2" in groups )
113         self.assertTrue( "groupe3" in groups )
114         self.assertTrue( "groupe4" in groups )
115         self.assertTrue( "groupe5" in groups )
116         self.assertTrue( "maa1" in groups )
117         self.assertEqual(16,m.getSizeAtLevel(0))
118         um0 = m.getGenMeshAtLevel(0)
119         self.assertEqual(12, um0.getNumberOfCellsWithType( NORM_TETRA4 ))
120         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_PYRA5 ))
121         self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_HEXA8 ))
122         um1 = m.getGenMeshAtLevel(-1)
123         self.assertEqual(2, um1.getNumberOfCellsWithType( NORM_TRI3 ))
124         pointeUM0 = pointeMedMesh.getGenMeshAtLevel(0)
125         self.assertTrue(m.getCoords().isEqualWithoutConsideringStr(pointeMedMesh.getCoords(),1e-12))
126         self.assertEqual( um0.getMeasureField(0).accumulate(0),
127                           pointeUM0.getMeasureField(0).accumulate(0),1e-12)
128         # check fields
129         # fieldnodedouble
130         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldnodedouble")
131         fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldnodedouble")
132         self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
133         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
134         io1 = fieldnodedoubleTS1.getIterations()
135         io2 = fieldnodedoubleTS2.getIterations()
136         for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
137             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_NODES, io1[i][0],io1[i][1],pointeUM0)
138             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_NODES, io2[i][0],io2[i][1],um0)
139             self.assertTrue( fnd1.getArray().isEqual( fnd2.getArray(), 1e-12 ))
140         # fieldcelldoublevector
141         fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldcelldoublevector")
142         fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldcelldoublevector")
143         self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
144         self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
145         io1 = fieldnodedoubleTS1.getIterations()
146         io2 = fieldnodedoubleTS2.getIterations()
147         for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
148             fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_CELLS, io1[i][0],io1[i][1],pointeUM0)
149             fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_CELLS, io2[i][0],io2[i][1],um0)
150             self.assertAlmostEqual( fnd1.accumulate(0), fnd2.accumulate(0) )
151             self.assertAlmostEqual( fnd1.accumulate(1), fnd2.accumulate(1) )
152             self.assertAlmostEqual( fnd1.accumulate(2), fnd2.accumulate(2) )
153             # Field on 2 faces
154             fieldOnFaces = d2.getFields().getFieldWithName(f1.getName())
155             io1 = fieldOnFaces.getIterations()
156             fof = fieldOnFaces.getFieldOnMeshAtLevel(f1.getTypeOfField(),io1[i][0],io1[i][1],um1)
157             self.assertTrue( d.isEqual( fof.getArray(), 1e-12 ))
158
159             os.remove( sauvFile )
160             pass
161         pass
162
163     def testSauv2MedWONodeFamilyNum(self):
164         """test for issue 0021673: [CEA 566] Bug in SauvWriter when writing meshes
165         having no family ids on nodes."""
166
167         myCoords=DataArrayDouble.New([-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2, 0.7,0.2, -0.3,0.7, 0.2,0.7, 0.7,0.7 ],9,2)
168         targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4];
169         targetMesh=MEDCouplingUMesh.New("BugInSauvWriter",2);
170         targetMesh.allocateCells(5);
171         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
172         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
173         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
174         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
175         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
176         targetMesh.finishInsertingCells();
177         targetMesh.setCoords(myCoords);
178         #
179         m=MEDFileUMesh.New()
180         m.setMeshAtLevel(0,targetMesh)
181         # start of bug
182         fam=DataArrayInt.New(targetMesh.getNumberOfNodes())
183         fam[:]=0
184         #m.setFamilyFieldArr(1,fam)
185         #end of bug
186
187         ms=MEDFileMeshes.New()
188         ms.setMeshAtPos(0,m)
189         meddata=MEDFileData.New()
190         meddata.setMeshes(ms)
191
192         medFile = "BugInSauvWriter.sauv"
193         sw=SauvWriter.New();
194         sw.setMEDFileDS(meddata);
195         sw.write(medFile);
196
197         os.remove( medFile )
198         pass
199
200     def testSauv2MedOnPipe1D(self):
201         """test for issue 0021745: [CEA 600] Some missing groups in mesh after reading a SAUV file with SauvReader."""
202         sauvFile="Test_sauve_1D.sauv"
203         # Make a sauve file with a qudratic 1D mesh
204         m=MEDCouplingUMesh.New("pipe1D",1)
205         m.allocateCells(2);
206         targetConn=[0,2,1, 2,4,3]
207         m.insertNextCell(NORM_SEG3,3,targetConn[0:3])
208         m.insertNextCell(NORM_SEG3,3,targetConn[3:6])
209         m.finishInsertingCells();
210         # coords
211         coords=[ 0.,1.,2.,4.,5. ];
212         c=DataArrayDouble.New()
213         c.setValues(coords,5,1)
214         m.setCoords(c)
215         # MEDFileUMesh
216         mm=MEDFileUMesh.New()
217         mm.setName(m.getName())
218         mm.setDescription("1D mesh")
219         mm.setCoords(c)
220         mm.setMeshAtLevel(0,m);
221         # MEDFileData
222         mfd1 = MEDFileData.New()
223         ms=MEDFileMeshes.New(); ms.setMeshAtPos(0,mm)
224         mfd1.setMeshes(ms)
225         # write
226         sw=SauvWriter.New()
227         sw.setMEDFileDS(mfd1)
228         sw.write(sauvFile)
229         # Check connectivity read from the sauv file
230         sr = SauvReader.New(sauvFile)
231         mfd2 = sr.loadInMEDFileDS()
232         mfMesh = mfd2.getMeshes()[0]
233         mesh = mfMesh.getMeshAtLevel(0)
234         self.assertTrue(mesh.getNodalConnectivity().isEqual(m.getNodalConnectivity()))
235         #
236         os.remove(sauvFile)
237         pass
238
239     def testMissingGroups(self):
240         """test for issue 0021749: [CEA 601] Some missing groups in mesh after reading a SAUV file with SauvReader."""
241         self.assertTrue( os.getenv("MED_ROOT_DIR") )
242         sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
243                                  "resources","med","BDC-714.sauv")
244         self.assertTrue( os.access( sauvFile, os.F_OK))
245         name_of_group_on_cells='Slice10:ABSORBER'
246         name_of_group_on_cells2='Slice10:00LR'
247         sr=SauvReader.New(sauvFile)
248         mfd2=sr.loadInMEDFileDS()
249         mfMesh=mfd2.getMeshes()[0]
250         #
251         self.assertTrue(name_of_group_on_cells in mfMesh.getGroupsNames())
252         self.assertTrue(name_of_group_on_cells2 in mfMesh.getGroupsNames())
253         self.assertEqual(270,len(mfMesh.getGroupsNames()))
254         #
255         ids1=mfMesh.getGroupArr(0,name_of_group_on_cells)
256         ids2=mfMesh.getGroupArr(0,name_of_group_on_cells2)
257         ids1.setName("")
258         ids2.setName("")
259         self.assertTrue(ids1.isEqual(ids2))
260         pass
261
262     pass
263
264 unittest.main()