1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2017 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, or (at your option) any later version.
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
21 from MEDCoupling import *
23 from math import pi,e,sqrt,cos,sin
24 from datetime import datetime
25 import rlcompleter,readline # this line has to be here, to ensure a usability of MEDCoupling/MEDLoader. B4 removing it please notify to anthony.geay@edf.fr
27 class MEDCouplingBasicsTest6(unittest.TestCase):
28 def testPointSetInvertOrientationOfAllCells(self):
29 """ Test of inversion of orientation of cells on a different geo types"""
31 m=MEDCouplingUMesh("",1)
33 m.insertNextCell(NORM_SEG2,[3,4])
34 m.insertNextCell(NORM_SEG2,[13,14])
35 m.insertNextCell(NORM_SEG3,[5,6,7])
36 m.insertNextCell(NORM_SEG2,[23,24])
37 m.insertNextCell(NORM_SEG3,[8,9,10])
38 ref0=DataArrayInt([0,3,6,10,13,17])
39 self.assertTrue(m.getNodalConnectivityIndex().isEqual(ref0))
40 m.invertOrientationOfAllCells()
41 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([1,4,3, 1,14,13, 2,7,6,5, 1,24,23, 2,10,9,8])))
42 self.assertTrue(m.getNodalConnectivityIndex().isEqual(ref0))
46 m=MEDCouplingUMesh("",2)
48 m.insertNextCell(NORM_TRI3,[1,2,3])
49 m.insertNextCell(NORM_QUAD4,[4,5,6,7])
50 m.insertNextCell(NORM_POLYGON,[8,9,10,11,12,13])
51 m.insertNextCell(NORM_TRI6,[14,15,16,17,18,19])
52 m.insertNextCell(NORM_QUAD8,[20,21,22,23,24,25,26,27])
53 m.insertNextCell(NORM_QPOLYG,[30,31,32,33,34,35, 36,37,38,39,40,41])
54 ref0=DataArrayInt([0,4,9,16,23,32,45])
55 self.assertTrue(m.getNodalConnectivityIndex().isEqual(ref0))
56 m.invertOrientationOfAllCells()
57 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([3,1,3,2, 4,4,7,6,5, 5,8,13,12,11,10,9, 6,14,16,15,19,18,17, 8,20,23,22,21,27,26,25,24, 32,30,35,34,33,32,31,41,40,39,38,37,36])))
58 self.assertTrue(m.getNodalConnectivityIndex().isEqual(ref0))
62 m=MEDCouplingUMesh("",3)
64 m.insertNextCell(NORM_TETRA4,[1,2,3,4])
65 m.insertNextCell(NORM_PYRA5,[5,6,7,8,9])
66 m.insertNextCell(NORM_PENTA6,[10,11,12,13,14,15])
67 m.insertNextCell(NORM_HEXA8,[20,21,22,23,24,25,26,27])
68 m.insertNextCell(NORM_TETRA10,[30,31,32,33,34,35,36,37,38,39])
69 m.insertNextCell(NORM_PYRA13,[40,41,42,43,44,45,46,47,48,49,50,51,52])
70 m.insertNextCell(NORM_HEXA20,[60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79])
71 m.insertNextCell(NORM_PENTA15,[80,81,82,83,84,85,86,87,88,89,90,91,92,93,94])
72 ref0=DataArrayInt([0,5,11,18,27,38,52,73,89])
73 self.assertTrue(m.getNodalConnectivityIndex().isEqual(ref0))
74 m.invertOrientationOfAllCells()
75 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([14,1,3,2,4, 15,5,8,7,6,9, 16,10,12,11,13,15,14, 18,20,23,22,21,24,27,26,25, 20,30,32,31,33,36,35,34,37,39,38, 23,40,43,42,41,44,48,47,46,45,49,52,51,50, 30,60,63,62,61,64,67,66,65,71,70,69,68,75,74,73,72,76,79,78,77, 25,80,82,81,83,85,84,88,87,86,91,90,89,92,94,93])))
76 self.assertTrue(m.getNodalConnectivityIndex().isEqual(ref0))
80 m=MEDCoupling1SGTUMesh("",NORM_SEG2)
81 m.setNodalConnectivity(DataArrayInt([1,2,3,4,5,6,7,8]))
82 self.assertEqual(m.getNumberOfCells(),4)
84 self.assertTrue(m2.isEqual(m,0.))
85 m.invertOrientationOfAllCells()
86 self.assertTrue(not m2.isEqual(m,0.))
87 m.getNodalConnectivity().isEqual(DataArrayInt([2,1,4,3,6,5,8,7]))
88 m.invertOrientationOfAllCells()
89 self.assertTrue(m2.isEqual(m,0.))
91 p=MEDCoupling1DGTUMesh("",NORM_POLYGON)
92 ref0=DataArrayInt([0,3,7,12])
93 p.setNodalConnectivity(DataArrayInt([1,2,3, 10,11,12,13, 20,21,22,23,24]),ref0)
95 self.assertTrue(p2.isEqual(p,0.))
96 self.assertEqual(p.getNumberOfCells(),3)
97 p.invertOrientationOfAllCells()
98 self.assertTrue(not p2.isEqual(p,0.))
99 self.assertTrue(p.getNodalConnectivityIndex().isEqual(ref0))
100 self.assertTrue(p.getNodalConnectivity().isEqual(DataArrayInt([1,3,2, 10,13,12,11, 20,24,23,22,21])))
101 p.invertOrientationOfAllCells()
102 self.assertTrue(p2.isEqual(p,0.))
110 def testPenta18_1(self):
111 arr=DataArrayDouble([
112 (0.,1.,1.),(0.,0.,1.),(1.,0.,1.),
113 (0.,1.,0.),(0.,0.,0.),(1.,0.,0.),
114 (0.,0.5,1.),(0.5,0.,1.),(0.5,0.5,1.),
115 (0.,0.5,0.),(0.5,0.,0.),(0.5,0.5,0.),
116 (0.,1.,0.5),(0.,0.,0.5),(1.,0.,0.5),
117 (0.,0.5,0.5),(0.5,0.,0.5),(0.5,0.5,0.5)])
118 m=MEDCouplingUMesh("mesh",3)
121 m.insertNextCell(NORM_PENTA18,list(range(18)))
122 m.checkConsistencyLight()
123 self.assertTrue(m.getMeasureField(True).getArray().isEqual(DataArrayDouble([0.5]),1e-12))
125 f=MEDCouplingFieldDouble(ON_NODES)
127 f.setName("FieldOnPenta18")
128 f.setArray(DataArrayDouble(list(range(18))))
129 f.checkConsistencyLight()
131 m2,d,di,rd,rdi=m.buildDescendingConnectivity()
132 self.assertTrue(m2.getNodalConnectivity().isEqual(DataArrayInt([6,0,1,2,6,7,8,6,3,5,4,11,10,9,9,0,3,4,1,12,9,13,6,15,9,1,4,5,2,13,10,14,7,16,9,2,4,5,0,14,11,12,8,17])))
133 self.assertTrue(m2.getNodalConnectivityIndex().isEqual(DataArrayInt([0,7,14,24,34,44])))
134 self.assertTrue(d.isEqual(DataArrayInt([0,1,2,3,4])))
135 self.assertTrue(di.isEqual(DataArrayInt([0,5])))
136 self.assertTrue(rd.isEqual(DataArrayInt([0,0,0,0,0])))
137 self.assertTrue(rdi.isEqual(DataArrayInt([0,1,2,3,4,5])))
139 f2=MEDCouplingFieldDouble(ON_NODES)
141 f2.setName("FieldOnPenta18Sub")
142 f2.setArray(DataArrayDouble(list(range(18))))
143 f2.checkConsistencyLight()
146 def testSKLAReplaceDeletePacks(self):
147 index=DataArrayInt([0,3,5,6,6])
148 value=DataArrayInt([1,2,3, 2,3, 3 ])
149 sla=MEDCouplingSkyLineArray(index,value)
150 idx=DataArrayInt([0,3])
151 packs=[DataArrayInt([4,5]),DataArrayInt([6,7,8])]
152 sla.replaceSimplePacks(idx,packs)
153 self.assertTrue(sla.getIndexArray().isEqual(DataArrayInt([0,2,4,5,8])))
154 self.assertTrue(sla.getValuesArray().isEqual(DataArrayInt([4,5, 2,3, 3, 6,7,8])))
155 sla.deleteSimplePacks(idx)
156 self.assertTrue(sla.getIndexArray().isEqual(DataArrayInt([0,2,3])))
157 self.assertTrue(sla.getValuesArray().isEqual(DataArrayInt([2,3, 3])))
158 sla.deleteSimplePack(1)
159 self.assertTrue(sla.getIndexArray().isEqual(DataArrayInt([0,2])))
160 self.assertTrue(sla.getValuesArray().isEqual(DataArrayInt([2,3])))
163 def testDADAsArcOfCircle(self):
164 d=DataArrayDouble([3.06915124862645,2.1464466094067824,2.85355345827285,2.3620444674400574,2.637955532559882,2.1464467447661937],3,2)
165 center,radius,ang=d.asArcOfCircle()
166 self.assertTrue((d-center).magnitude().isUniform(radius,1e-10))
167 self.assertAlmostEqual(ang,-4.712389294301196,12)
170 def testDAMaxAbsValue(self):
171 d=DataArrayDouble([-2,3,1.2,-2.9])
172 a,b=d.getMaxAbsValue()
173 self.assertAlmostEqual(a,3.,13)
174 self.assertEqual(b,1)
175 a,b=(-d).getMaxAbsValue()
176 self.assertAlmostEqual(a,-3.,13)
177 self.assertEqual(b,1)
178 self.assertAlmostEqual((-d).getMaxAbsValueInArray(),-3.,13)
181 def testDAIFindIdForEach1(self):
182 a1=DataArrayInt([17,27,2,10,-4,3,12,27,16])
183 b1=DataArrayInt([3,16,-4,27,17])
184 ret=a1.findIdForEach(b1)
185 self.assertTrue(ret.isEqual(DataArrayInt([5,8,4,7,0])))
186 self.assertTrue(a1[ret].isEqual(b1))
187 b2=DataArrayInt([3,16,22,27,17])
188 self.assertRaises(InterpKernelException,a1.findIdForEach,b2) # 22 not in a1 !
190 self.assertRaises(InterpKernelException,a1.findIdForEach,b1) # a1 is not single component
193 def testAttractSeg3MidPtsAroundNodes1(self):
194 """ Test of MEDCouplingUMesh.attractSeg3MidPtsAroundNodes methods """
195 ptsExpToBeModified=DataArrayInt([95,96,97,98,101,103,104,106,108,110])
199 coo=DataArrayDouble([10,0,0,10,10,0,10,0,3.+b,10,0,6.+a,10,10,3.+b,10,10,6.+a,10,3.+b,0,10,6.+a,0,3.+b,0,0,6.+a,0,0,3.+b,10,0,6.+a,10,0,10,3.+b,6.+a,10,6.+a,6.+a,10,3.+b,3.+b,10,6.+a,3.+b,3.+b,0,3.+b,3.+b,0,6.+a,6.+a,0,3.+b,6.+a,0,6.+a,6.+a,10,3.+b,6.+a,10,6.+a,3.+b,10,3.+b,3.+b,10,6.+a,3.+b,3.+b,0,6.+a,3.+b,0,3.+b,6.+a,0,6.+a,6.+a,0,3.+b,3.+b,6.+a,6.+a,3.+b,6.+a,3.+b,6.+a,6.+a,6.+a,6.+a,6.+a,3.+b,3.+b,3.+b,6.+a,3.+b,3.+b,3.+b,6.+a,3.+b,6.+a,6.+a,3.+b,10,0,1.+a,10,0,5.,10,10,1.+a,10,10,5.,10,1.+a,0,10,5.,0,10,8.+b,0,5.,0,0,8.+b,0,0,5.,10,0,8.+b,10,0,10,1.+a,6.+a,10,5.,6.+a,10,8.+b,6.+a,10,1.+a,3.+b,10,3.+b,5.,10,5.,3.+b,10,6.+a,5.,10,8.+b,3.+b,10,3.+b,1.+a,10,6.+a,1.+a,3.+b,0,1.+a,3.+b,0,5.,6.+a,0,1.+a,5.,0,3.+b,6.+a,0,5.,5.,0,6.+a,8.+b,0,3.+b,8.+b,0,6.+a,6.+a,10,1.+a,8.+b,10,3.+b,6.+a,10,5.,8.+b,10,6.+a,3.+b,10,1.+a,5.,10,3.+b,3.+b,10,5.,5.,10,6.+a,3.+b,1.+a,0,5.,3.+b,0,6.+a,1.+a,0,8.+b,3.+b,0,3.+b,5.,0,5.,6.+a,0,6.+a,5.,0,8.+b,6.+a,0,3.+b,8.+b,0,6.+a,8.+b,0,3.+b,1.+a,6.+a,6.+a,1.+a,6.+a,5.,3.+b,6.+a,8.+b,3.+b,6.+a,3.+b,5.,6.+a,6.+a,5.,6.+a,5.,6.+a,6.+a,8.+b,6.+a,6.+a,3.+b,8.+b,6.+a,6.+a,8.+b,6.+a,3.+b,3.+b,5,3.+b,1.+a,3.+b,6.+a,3.+b,5.,6.+a,1.+a,3.+b,5.,3.+b,3.+b,8.+b,3.+b,3.+b,3.+b,6.+a,5.,3.+b,5.,3.+b,6.+a,6.+a,5.,6.+a,5.,3.+b,5.,6.+a,3.+b,8.+b,6.+a,3.+b,3.+b,8.+b,3.+b,6.+a,8.+b,3.+b,3.+b,3.+b,1.+a,6.+a,3.+b,1.+a,3.+b,6.+a,1.+a,6.+a,6.+a,1.+a],111,3)
200 conn=DataArrayInt([30,17,28,32,16,19,29,33,18,83,93,94,58,84,95,96,61,62,85,97,60,30,19,29,33,18,3,12,14,2,84,95,96,61,47,51,50,37,64,86,98,63,30,28,30,34,32,29,31,35,33,87,99,100,93,88,101,102,95,85,89,103,97,30,29,31,35,33,12,13,15,14,88,101,102,95,48,53,52,51,86,90,104,98,30,30,23,22,34,31,21,20,35,91,71,105,99,92,67,106,101,89,72,70,103,30,31,21,20,35,13,5,4,15,92,67,106,101,49,39,54,53,90,68,66,104,30,16,32,24,8,18,33,25,9,94,107,73,57,96,108,75,59,60,97,74,43,30,18,33,25,9,2,14,6,0,96,108,75,59,50,55,40,36,63,98,76,44,30,32,34,26,24,33,35,27,25,100,109,77,107,102,110,79,108,97,103,78,74,30,33,35,27,25,14,15,7,6,102,110,79,108,52,56,41,55,98,104,80,76,30,34,22,10,26,35,20,11,27,105,69,81,109,106,65,82,110,103,70,45,78,30,35,20,11,27,15,4,1,7,106,65,82,110,54,38,42,56,104,66,46,80])
201 connI=DataArrayInt([0,21,42,63,84,105,126,147,168,189,210,231,252])
202 m=MEDCouplingUMesh("mesh",3)
203 m.setConnectivity(conn,connI,True)
204 m.setCoords(coo.deepCopy())# deep copy coo because next line is going to modify it, if it works normaly
205 m.attractSeg3MidPtsAroundNodes(0.1,DataArrayInt([33,35])) # ze call is here !
206 self.assertTrue(not m.getCoords().isEqual(coo,eps)) # some points have had their position changed...
207 ptsExpNotToBeModified=ptsExpToBeModified.buildComplement(len(coo))
208 self.assertTrue(m.getCoords()[ptsExpNotToBeModified].isEqual(coo[ptsExpNotToBeModified],eps))
209 self.assertTrue((m.getCoords()[ptsExpToBeModified]-coo[ptsExpToBeModified]).magnitude().isUniform(4./3.,1e-12))
210 ptsPosExp=DataArrayDouble([6.+a,3.+b,3.+a,6.+a,3.,3.+b,6.+b,3.+b,3.+b,7.,3.+b,3.+b,6.+a,6.+a,3.+a,6.+b,6.+a,3.+b,7.,6.+a,3.+b,6.+a,7.,3.+b,6.+a,3.+b,3.,6.+a,6.+a,3.],10,3)
211 self.assertTrue(m.getCoords()[ptsExpToBeModified].isEqual(ptsPosExp,1e-12))
214 def testRenumberNodesInConnOpt(self):
215 """ Test of MEDCouplingPointSet.renumberNodesInConn with map as input coming from DataArrayInt.invertArrayN2O2O2NOptimized
217 m=MEDCouplingUMesh("mesh",2)
219 m.insertNextCell(NORM_QUAD4,[10000,10002,10001,10003])
220 coo=DataArrayDouble([(0,0),(1,1),(1,0),(0,1)])
222 m.checkConsistencyLight()
224 d=DataArrayInt([10000,10001,10002,10003])
225 myMap=d.invertArrayN2O2O2NOptimized()
226 myMap2=d.giveN2OOptimized()
227 m.checkConsistencyLight()
229 m.renumberNodesInConn(myMap) # <- test is here for UMesh
230 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([4,0,2,1,3])))
231 m.renumberNodesInConn(myMap2) # <- test is here for UMesh
232 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([4,10000,10002,10001,10003])))
234 m=MEDCoupling1SGTUMesh("mesh",NORM_QUAD4)
235 m.setNodalConnectivity(DataArrayInt([10000,10002,10001,10003]))
237 m.checkConsistencyLight()
238 m.renumberNodesInConn(myMap) # <- test is here for 1SGTUMesh
239 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([0,2,1,3])))
241 m=MEDCoupling1DGTUMesh("mesh",NORM_POLYGON)
243 m.setNodalConnectivity(DataArrayInt([10000,10002,10001,10003]),DataArrayInt([0,4]))
244 m.checkConsistencyLight()
245 m.renumberNodesInConn(myMap) # <- test is here for 1DGTUMesh
246 self.assertTrue(m.getNodalConnectivity().isEqual(DataArrayInt([0,2,1,3])))
247 self.assertTrue(m.getNodalConnectivityIndex().isEqual(DataArrayInt([0,4])))
250 def testSeg2bGP(self):
251 """Test of Gauss points on SEG2 using SEG2B style as ref coords
253 coo=DataArrayDouble([[0.,0.,0.],[1.,1.,1.]])
254 m=MEDCouplingUMesh("mesh",1) ; m.setCoords(coo)
256 # the cell description is exactly those described in the description of HEXA27 in MED file 3.0.7 documentation
257 m.insertNextCell(NORM_SEG2,[0,1])
259 weights=[0.8,0.1,0.1]
260 gCoords=[0.2,0.5,0.9]
261 fGauss=MEDCouplingFieldDouble(ON_GAUSS_PT) ; fGauss.setName("fGauss")
263 fGauss.setGaussLocalizationOnType(NORM_SEG2,refCoo,gCoords,weights)
264 arr=DataArrayDouble(fGauss.getNumberOfTuplesExpected()) ; arr.iota()
266 fGauss.checkConsistencyLight()
267 arrOfDisc=fGauss.getLocalizationOfDiscr()
268 self.assertTrue(arrOfDisc.isEqual(DataArrayDouble([0.2,0.2,0.2,0.5,0.5,0.5,0.9,0.9,0.9],3,3),1e-12))
271 def testUMeshGetCellsContainingPtOn2DNonDynQuadraticCells(self):
272 """getCellsContainingPoint is now dealing curves of quadratic 2D elements.
273 This test is a mesh containing 2 QUAD8 cells. The input point is located at a special loc.
274 If true geometry (with curve as edges) is considered the result of getCellsContainingPoint is not the same as if only linear part of cells is considered."""
275 coords=DataArrayDouble([-0.9428090415820631,0.9428090415820631,-1.06066017177982,1.06066017177982,-1.1785113019775801,1.1785113019775801,-1.2963624321753402,1.2963624321753402,-1.4142135623731,1.41421356237309,-0.7653668647301801,1.8477590650225701,-0.6378057206084831,1.53979922085214,-0.510244576486786,1.23183937668172,-0.701586292669331,1.6937791429373599,-0.574025148547635,1.38581929876693,-0.9259503883660041,1.38578268717091,-0.740760310692803,1.10862614973673,-1.1111404660392,1.66293922460509],13,2)
276 m=MEDCouplingUMesh("mesh",2)
279 m.insertNextCell(NORM_QUAD8,[4,2,6,5,3,10,8,12])
280 m.insertNextCell(NORM_QUAD8,[2,0,7,6,1,11,9,10])
282 zePt=DataArrayDouble([-0.85863751450784975,1.4203162316045934],1,2)
283 a,b=m.getCellsContainingPoints(zePt,1e-12)
284 self.assertTrue(b.isEqual(DataArrayInt([0,1])))
285 self.assertTrue(a.isEqual(DataArrayInt([1]))) # <- test is here. 0 if only linear parts are considered.
287 a,b=m.getCellsContainingPointsLinearPartOnlyOnNonDynType(zePt,1e-12)
288 self.assertTrue(b.isEqual(DataArrayInt([0,1])))
289 self.assertTrue(a.isEqual(DataArrayInt([0]))) # <- like before
295 if __name__ == '__main__':