Salome HOME
Copyright update 2021
[modules/paravis.git] / src / Plugins / MEDReader / plugin / Test / testMEDReader14.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2021  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, or (at your option) any later version.
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 # Author : Anthony Geay (EDF R&D)
21
22 import os
23 import sys
24
25 from medcoupling import *
26 from paraview.simple import *
27 from MEDReaderHelper import WriteInTmpDir,RetriveBaseLine
28 paraview.simple._DisableFirstRenderCameraReset()
29
30 def GenerateCase():
31     """ This test reproduces precisely the bug EDF8655 (PAL 22677) by cheking that multi loc per geo type in a field is correctly managed.
32     """
33
34     fname="testMEDReader14.med"
35
36     arr0=DataArrayDouble(7) ; arr0.iota()
37     arr1=DataArrayDouble(5) ; arr1.iota()
38     c=MEDCouplingCMesh()
39     c.setCoords(arr0,arr1)
40     m=c.build1SGTUnstructured()
41     pfl=DataArrayInt([5,10,11,16,17,23])
42     m0=m[pfl.buildComplement(24)]
43     m1=m[pfl] ; m1.simplexize(0)
44     m=MEDCouplingUMesh.MergeUMeshesOnSameCoords(m1.buildUnstructured(),m0.buildUnstructured())
45     m.setName("Mesh")
46     m1=MEDCoupling1SGTUMesh(m.getName(),NORM_SEG2)
47     m1.setCoords(m.getCoords())
48     m1.allocateCells()
49     for i in [[28,21],[21,14],[14,7],[7,0]]:
50         m1.insertNextCell(i)
51         pass
52     for i in range(6):
53         m1.insertNextCell([i,i+1])
54         pass
55     for i in [[6,13],[13,20],[20,27],[27,34]]:
56         m1.insertNextCell(i)
57         pass
58     for i in range(6,0,-1):
59         m1.insertNextCell([28+i,28+i-1])
60         pass
61     #
62     mm=MEDFileUMesh()
63     mm.setMeshAtLevel(0,m)
64     mm.setMeshAtLevel(-1,m1)
65     mm.write(fname,2)
66     #
67     pfl0=DataArrayInt([0,1,2,3]) ; pfl0.setName("PFL000")
68     pfl1=DataArrayInt([4,5,6,7,8,9]) ; pfl1.setName("PFL001")
69     pfl2=DataArrayInt([10,11,12,13]) ; pfl2.setName("PFL002")
70     pfl3=DataArrayInt([13,14,15,16,19,20,23,24,26,27,28,29]) ; pfl3.setName("PFL003")
71     #
72     fieldName0="zeField0"
73     fieldName1="zeField1"
74     fieldName2="zeField2"
75     fs0=MEDFileFieldMultiTS()
76     fs1=MEDFileFieldMultiTS()
77     fs2=MEDFileFieldMultiTS()
78     for i in range(5):
79         f=MEDFileField1TS()
80         zePfl0=DataArrayInt.Aggregate(DataArrayInt.Range(0,12,1),pfl3,0) ; zePfl0.setName("PFL")
81         fNode=MEDCouplingFieldDouble(ON_GAUSS_PT) ; fNode.setTime(float(i),i,0)
82         tmp=m[zePfl0]
83         fNode.setName(fieldName0) ; fNode.setMesh(tmp)
84         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(0,12,1),[0.,0.,1.,0.,0.,1.],[0.1,0.1,0.8,0.1,0.1,0.8],3*[0.16666666666666666])
85         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(12,24,1),[-1.,-1.,1.,-1.,1.,1.,-1.,1.],[-0.577350,-0.577350,0.577350,-0.577350,0.577350,0.577350,-0.577350,0.577350],4*[1.])
86         arr=DataArrayDouble(2*(12*3+12*4)) ; arr.iota(0+1000*i) ; arr.rearrange(2)
87         fNode.setArray(arr) ; arr.setInfoOnComponents(["Comp1_2 [m]","Com2_2 [s^2]"]) ; fNode.checkConsistencyLight()
88         fNode.setName(fieldName0)
89         f.setFieldProfile(fNode,mm,0,zePfl0)
90         #
91         zePfl1=DataArrayInt.Range(0,14,1) ; zePfl1.setName("PFL")
92         fNode=MEDCouplingFieldDouble(ON_GAUSS_PT) ; fNode.setTime(float(i),i,0)
93         tmp=m1[zePfl1]
94         #
95         fNode.setName(fieldName0) ; fNode.setMesh(tmp)
96         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(0,4,1),[-1.,1.],[-0.33333333333333337,0.33333333333333337],[1.,1.])
97         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(4,10,1),[-1.,1.],[-0.5,0.,0.5],[1.,1.,1.])
98         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(10,14,1),[-1.,1.],[-0.6,-0.2,0.2,0.6],[1.,1.,1.,1.])
99         arr=DataArrayDouble(2*(4*2+6*3+4*4)) ; arr.iota(100+1000*i) ; arr.rearrange(2)
100         fNode.setArray(arr) ; arr.setInfoOnComponents(["Comp1_2 [m]","Com2_2 [s^2]"]) ; fNode.checkConsistencyLight()
101         fNode.setName(fieldName0)
102         f.setFieldProfile(fNode,mm,-1,zePfl1)
103         fs0.pushBackTimeStep(f)
104         #
105         f=MEDFileField1TS()
106         zePfl2=DataArrayInt.Range(10,20,1) ; zePfl2.setName("PFL2")
107         fNode=MEDCouplingFieldDouble(ON_GAUSS_PT) ; fNode.setTime(float(i),i,0)
108         tmp=m1[zePfl2]
109         fNode.setName(fieldName1) ; fNode.setMesh(tmp)
110         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(0,4,1),[-1.,1.],[-0.6,-0.2,0.2,0.6],[1.,1.,1.,1.])
111         fNode.setGaussLocalizationOnCells(DataArrayInt.Range(4,10,1),[-1.,1.],[-0.6666666666666667,-0.33333333333333337,0.,0.33333333333333337,0.6666666666666667],[1.,1.,1.,1.,1.])
112         arr=DataArrayDouble(2*(4*4+6*5)) ; arr.iota(500+1000*i) ; arr.rearrange(2)
113         fNode.setArray(arr) ; arr.setInfoOnComponents(["C1 [m]","C2 [s^2]"]) ; fNode.checkConsistencyLight()
114         f.setFieldProfile(fNode,mm,-1,zePfl2)
115         fs1.pushBackTimeStep(f)
116         #
117         f=MEDFileField1TS()
118         zePfl3=DataArrayInt([6,10,11,12,13,17,18,19,20,24,25,26,27,34]) ; zePfl3.setName("PFL3")
119         fNode=MEDCouplingFieldDouble(ON_NODES) ; fNode.setTime(float(i),i,0)
120         fNode.setName(fieldName2)
121         arr=DataArrayDouble(2*14) ; arr.iota(700+1000*i) ; arr.rearrange(2)
122         fNode.setArray(arr) ; arr.setInfoOnComponents(["C3 [kg]","C4 [m^2]"])
123         f.setFieldProfile(fNode,mm,0,zePfl3)
124         fs2.pushBackTimeStep(f)
125         pass
126     fs0.write(fname,0)
127     fs1.write(fname,0)
128     fs2.write(fname,0)
129     return fname
130
131 @WriteInTmpDir
132 def test(baseline_file):
133     fname = GenerateCase()
134     reader=MEDReader(FileName=fname)
135     ExpectedEntries=['TS0/Mesh/ComSup0/zeField0_MM0@@][@@GAUSS', 'TS0/Mesh/ComSup1/zeField0_MM1@@][@@GAUSS', 'TS0/Mesh/ComSup2/zeField0_MM2@@][@@GAUSS', 'TS0/Mesh/ComSup2/zeField1_MM0@@][@@GAUSS', 'TS0/Mesh/ComSup3/zeField1_MM1@@][@@GAUSS', 'TS0/Mesh/ComSup4/zeField2@@][@@P1', 'TS1/Mesh/ComSup0/Mesh@@][@@P0']
136     assert(reader.GetProperty("FieldsTreeInfo")[::2]==ExpectedEntries)
137
138     if '-D' not in sys.argv:
139         renderView1=GetActiveViewOrCreate('RenderView')
140         for entry in [[ExpectedEntries[0]],[ExpectedEntries[1]],[ExpectedEntries[2],ExpectedEntries[3]],[ExpectedEntries[4]]]:
141             reader=MEDReader(FileName=fname)
142             reader.AllArrays=entry
143             gaussPoints=ELGAfieldToPointGaussian(Input=reader)
144             gaussPoints.SelectSourceArray="ELGA@0"
145             Show(gaussPoints,renderView1)
146             pass
147
148         #
149
150         readerNodeField=MEDReader(FileName=fname)
151         readerNodeField.AllArrays=[ExpectedEntries[5]]
152         nodeFieldDisplay=Show(readerNodeField,renderView1)
153         ColorBy(nodeFieldDisplay,('POINTS','zeField2'))
154         nodeFieldDisplay.RescaleTransferFunctionToDataRange(True)
155         zeField2LUT=GetColorTransferFunction('zeField2')
156         zeField2LUT.RGBPoints=[990.6568528002015, 0.231373, 0.298039, 0.752941, 1009.0416245953584, 0.865003, 0.865003, 0.865003, 1027.4263963905153, 0.705882, 0.0156863, 0.14902]
157         zeField2LUT.ScalarRangeInitialized=1.
158         #
159         renderView1.ResetCamera()
160         renderView1.InteractionMode = '2D'
161         renderView1.CameraPosition = [3.0, 2.0, 10000.0]
162         renderView1.CameraFocalPoint = [3.0, 2.0, 0.0]
163         renderView1.ViewSize =[300,300]
164         renderView1.GetRenderWindow().DoubleBufferOff()
165         #
166
167         Render()
168
169         # compare with baseline image
170         import vtk.test.Testing
171         from vtk.util.misc import vtkGetTempDir
172         vtk.test.Testing.VTK_TEMP_DIR = vtk.util.misc.vtkGetTempDir()
173         vtk.test.Testing.compareImage(renderView1.GetRenderWindow(), baseline_file,
174                                                                     threshold=1)
175         vtk.test.Testing.interact()
176         
177 if __name__ == "__main__":
178     outImgName="testMEDReader14.png"
179     baseline_file = RetriveBaseLine(outImgName)
180     test(baseline_file)
181     pass