1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2012 CEA/DEN, EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 # Author : Edward AGAPOV (eap)
22 from MEDLoader import *
24 from MEDLoaderDataForTest import MEDLoaderDataForTest
26 class SauvLoaderTest(unittest.TestCase):
28 def testSauv2Med(self):
29 # get a file containing all types of readable piles
30 self.assertTrue( os.getenv("MED_ROOT_DIR") )
31 sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
32 "resources","med","allPillesTest.sauv")
33 self.assertTrue( os.access( sauvFile, os.F_OK))
35 # read SAUV and write MED
36 medFile = "SauvLoaderTest.med"
37 sr=SauvReader.New(sauvFile);
38 d2=sr.loadInMEDFileDS();
42 self.assertEqual(1,d2.getNumberOfMeshes())
43 self.assertEqual(8+97,d2.getNumberOfFields())
45 m = mm.getMeshAtPos(0)
46 self.assertEqual(17,len(m.getGroupsNames()))
51 def testMed2Sauv(self):
53 self.assertTrue( os.getenv("MED_ROOT_DIR") )
54 medFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
55 "resources","med","pointe.med")
56 self.assertTrue( os.access( medFile, os.F_OK))
57 pointeMed = MEDFileData.New( medFile )
59 # add 3 faces to pointeMed
60 pointeMedMesh = pointeMed.getMeshes().getMeshAtPos(0)
61 pointeM1D = MEDCouplingUMesh.New()
62 pointeM1D.setCoords( pointeMedMesh.getCoords() )
63 pointeM1D.setMeshDimension( 2 )
64 pointeM1D.allocateCells( 3 )
65 pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,2])
66 pointeM1D.insertNextCell( NORM_TRI3, 3, [0,1,3])
67 pointeM1D.insertNextCell( NORM_QUAD4, 4, [10,11,12,13])
68 pointeM1D.finishInsertingCells()
69 pointeMedMesh.setMeshAtLevel( -1, pointeM1D )
70 pointeMed.getMeshes().setMeshAtPos( 0, pointeMedMesh )
72 # add a field on 2 faces to pointeMed
73 ff1=MEDFileFieldMultiTS.New()
74 f1=MEDCouplingFieldDouble.New(ON_GAUSS_NE,ONE_TIME)
75 #f1.setMesh( pointeM1D )
76 f1.setName("Field on 2 faces")
77 d=DataArrayDouble.New()
79 d.setInfoOnComponent(0,"sigX [MPa]")
80 d.setInfoOnComponent(1,"sigY [GPa]")
81 d.setValues([311,312,321,322,331,332,411,412,421,422,431,432,441,442],3+4,2)
84 da.setValues([0,2],2,1)
86 ff1.appendFieldProfile(f1,pointeMedMesh,-1,da)
87 pointeMed.getFields().pushField( ff1 )
90 pointeFields = pointeMed.getFields()
91 for i in range( pointeFields.getNumberOfFields() ):
92 if pointeFields.getFieldAtPos(i).getName() == "fieldnodeint":
93 pointeFields.destroyFieldAtPos( i )
96 # write pointeMed to SAUV
97 sauvFile = "SauvLoaderTest.sauv"
99 sw.setMEDFileDS(pointeMed);
102 # read SAUV and check
103 sr=SauvReader.New(sauvFile);
104 d2=sr.loadInMEDFileDS();
105 self.assertEqual(1,d2.getNumberOfMeshes())
106 self.assertEqual(4,d2.getNumberOfFields())
107 m = d2.getMeshes().getMeshAtPos(0)
108 self.assertEqual("maa1",m.getName())
109 self.assertEqual(6,len(m.getGroupsNames()))
110 self.assertEqual(3,m.getMeshDimension())
111 groups = m.getGroupsNames()
112 self.assertTrue( "groupe1" in groups )
113 self.assertTrue( "groupe2" in groups )
114 self.assertTrue( "groupe3" in groups )
115 self.assertTrue( "groupe4" in groups )
116 self.assertTrue( "groupe5" in groups )
117 self.assertTrue( "maa1" in groups )
118 self.assertEqual(16,m.getSizeAtLevel(0))
119 um0 = m.getGenMeshAtLevel(0)
120 self.assertEqual(12, um0.getNumberOfCellsWithType( NORM_TETRA4 ))
121 self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_PYRA5 ))
122 self.assertEqual(2, um0.getNumberOfCellsWithType( NORM_HEXA8 ))
123 um1 = m.getGenMeshAtLevel(-1)
124 self.assertEqual(2, um1.getNumberOfCellsWithType( NORM_TRI3 ))
125 pointeUM0 = pointeMedMesh.getGenMeshAtLevel(0)
126 self.assertTrue(m.getCoords().isEqualWithoutConsideringStr(pointeMedMesh.getCoords(),1e-12))
127 self.assertEqual( um0.getMeasureField(0).accumulate(0),
128 pointeUM0.getMeasureField(0).accumulate(0),1e-12)
131 fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldnodedouble")
132 fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldnodedouble")
133 self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
134 self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
135 io1 = fieldnodedoubleTS1.getIterations()
136 io2 = fieldnodedoubleTS2.getIterations()
137 for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
138 fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_NODES, io1[i][0],io1[i][1],pointeUM0)
139 fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_NODES, io2[i][0],io2[i][1],um0)
140 self.assertTrue( fnd1.getArray().isEqual( fnd2.getArray(), 1e-12 ))
141 # fieldcelldoublevector
142 fieldnodedoubleTS1 = pointeMed.getFields().getFieldWithName("fieldcelldoublevector")
143 fieldnodedoubleTS2 = d2.getFields().getFieldWithName("fieldcelldoublevector")
144 self.assertEqual( fieldnodedoubleTS1.getInfo(), fieldnodedoubleTS2.getInfo())
145 self.assertEqual( fieldnodedoubleTS1.getNumberOfTS(), fieldnodedoubleTS2.getNumberOfTS())
146 io1 = fieldnodedoubleTS1.getIterations()
147 io2 = fieldnodedoubleTS2.getIterations()
148 for i in range(fieldnodedoubleTS1.getNumberOfTS() ):
149 fnd1 = fieldnodedoubleTS1.getFieldOnMeshAtLevel(ON_CELLS, io1[i][0],io1[i][1],pointeUM0)
150 fnd2 = fieldnodedoubleTS2.getFieldOnMeshAtLevel(ON_CELLS, io2[i][0],io2[i][1],um0)
151 self.assertAlmostEqual( fnd1.accumulate(0), fnd2.accumulate(0) )
152 self.assertAlmostEqual( fnd1.accumulate(1), fnd2.accumulate(1) )
153 self.assertAlmostEqual( fnd1.accumulate(2), fnd2.accumulate(2) )
155 fieldOnFaces = d2.getFields().getFieldWithName(f1.getName())
156 io1 = fieldOnFaces.getIterations()
157 fof = fieldOnFaces.getFieldOnMeshAtLevel(f1.getTypeOfField(),io1[i][0],io1[i][1],um1)
158 self.assertTrue( d.isEqual( fof.getArray(), 1e-12 ))
160 os.remove( sauvFile )
164 def testSauv2MedWONodeFamilyNum(self):
165 """test for issue 0021673: [CEA 566] Bug in SauvWriter when writing meshes
166 having no family ids on nodes."""
168 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)
169 targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4];
170 targetMesh=MEDCouplingUMesh.New("BugInSauvWriter",2);
171 targetMesh.allocateCells(5);
172 targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
173 targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
174 targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
175 targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
176 targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
177 targetMesh.finishInsertingCells();
178 targetMesh.setCoords(myCoords);
181 m.setMeshAtLevel(0,targetMesh)
183 fam=DataArrayInt.New(targetMesh.getNumberOfNodes())
185 #m.setFamilyFieldArr(1,fam)
188 ms=MEDFileMeshes.New()
190 meddata=MEDFileData.New()
191 meddata.setMeshes(ms)
193 medFile = "BugInSauvWriter.sauv"
195 sw.setMEDFileDS(meddata);
201 def testSauv2MedOnPipe1D(self):
202 """test for issue 0021745: [CEA 600] Some missing groups in mesh after reading a SAUV file with SauvReader."""
203 sauvFile="Test_sauve_1D.sauv"
204 # Make a sauve file with a qudratic 1D mesh
205 m=MEDCouplingUMesh.New("pipe1D",1)
207 targetConn=[0,2,1, 2,4,3]
208 m.insertNextCell(NORM_SEG3,3,targetConn[0:3])
209 m.insertNextCell(NORM_SEG3,3,targetConn[3:6])
210 m.finishInsertingCells();
212 coords=[ 0.,1.,2.,4.,5. ];
213 c=DataArrayDouble.New()
214 c.setValues(coords,5,1)
217 mm=MEDFileUMesh.New()
218 mm.setName(m.getName())
219 mm.setDescription("1D mesh")
221 mm.setMeshAtLevel(0,m);
223 mfd1 = MEDFileData.New()
224 ms=MEDFileMeshes.New(); ms.setMeshAtPos(0,mm)
228 sw.setMEDFileDS(mfd1)
230 # Check connectivity read from the sauv file
231 sr = SauvReader.New(sauvFile)
232 mfd2 = sr.loadInMEDFileDS()
233 mfMesh = mfd2.getMeshes()[0]
234 mesh = mfMesh.getMeshAtLevel(0)
235 self.assertTrue(mesh.getNodalConnectivity().isEqual(m.getNodalConnectivity()))
240 def testMissingGroups(self):
241 """test for issue 0021749: [CEA 601] Some missing groups in mesh after reading a SAUV file with SauvReader."""
242 self.assertTrue( os.getenv("MED_ROOT_DIR") )
243 sauvFile = os.path.join( os.getenv("MED_ROOT_DIR"), "share","salome",
244 "resources","med","BDC-714.sauv")
245 self.assertTrue( os.access( sauvFile, os.F_OK))
246 name_of_group_on_cells='Slice10:ABSORBER'
247 name_of_group_on_cells2='Slice10:00LR'
248 sr=SauvReader.New(sauvFile)
249 mfd2=sr.loadInMEDFileDS()
250 mfMesh=mfd2.getMeshes()[0]
252 self.assertTrue(name_of_group_on_cells in mfMesh.getGroupsNames())
253 self.assertTrue(name_of_group_on_cells2 in mfMesh.getGroupsNames())
254 self.assertEqual(270,len(mfMesh.getGroupsNames()))
256 ids1=mfMesh.getGroupArr(0,name_of_group_on_cells)
257 ids2=mfMesh.getGroupArr(0,name_of_group_on_cells2)
260 self.assertTrue(ids1.isEqual(ids2))