Skip to content

Commit 4b89606

Browse files
author
Javier Velo
committed
Merge branch '546-support-for-more-vtk-elements' into 'development'
use general Lagrange elements instead of P1 elements Closes #546 See merge request damask/DAMASK!1128
2 parents 52bf7ad + 5d44ca1 commit 4b89606

File tree

5 files changed

+37
-28
lines changed

5 files changed

+37
-28
lines changed

python/damask/_geomgrid.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1382,4 +1382,4 @@ def get_grain_boundaries(self,
13821382
connectivity.append(np.block([base_nodes + o[i][k] for k in range(4)]))
13831383

13841384
coords = grid_filters.coordinates0_node(self.cells,self.size,self.origin).reshape(-1,3,order='F')
1385-
return VTK.from_unstructured_grid(coords,np.vstack(connectivity),'QUAD')
1385+
return VTK.from_unstructured_grid(coords,np.vstack(connectivity),'QUADRILATERAL')

python/damask/_vtk.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@
3030
vtkRectilinearGrid,
3131
vtkUnstructuredGrid,
3232
vtkPolyData,
33-
VTK_TRIANGLE,
34-
VTK_QUAD,
35-
VTK_TETRA,
36-
VTK_HEXAHEDRON,
33+
VTK_LAGRANGE_TRIANGLE,
34+
VTK_LAGRANGE_QUADRILATERAL,
35+
VTK_LAGRANGE_TETRAHEDRON,
36+
VTK_LAGRANGE_HEXAHEDRON,
3737
)
3838
from vtkmodules.vtkIOLegacy import (
3939
vtkGenericDataObjectReader,
@@ -242,11 +242,14 @@ def from_image_data(cells: IntSequence,
242242
@staticmethod
243243
def from_unstructured_grid(nodes: np.ndarray,
244244
connectivity: np.ndarray,
245-
cell_type: Literal['TRIANGLE', 'TETRA', 'QUAD', 'HEXAHEDRON']) -> 'VTK':
245+
cell_type: Literal['TRIANGLE', 'TETRAHEDRON', 'QUADRILATERAL', 'HEXAHEDRON']
246+
) -> 'VTK':
246247
"""
247248
Create VTK of type vtkUnstructuredGrid.
248249
249250
This is the common type for mesh solver results.
251+
Elements are of the Lagrange type and all elements
252+
should have the same type and order.
250253
251254
Parameters
252255
----------
@@ -255,7 +258,7 @@ def from_unstructured_grid(nodes: np.ndarray,
255258
connectivity : numpy.ndarray of np.dtype = np.int64
256259
Cell connectivity (0-based), first dimension determines #Cells,
257260
second dimension determines #Nodes/Cell.
258-
cell_type : {'TRIANGLE', 'QUAD', 'TETRA', 'HEXAHEDRON'}
261+
cell_type : {'TRIANGLE', 'QUADRILATERAL', 'TETRAHEDRON', 'HEXAHEDRON'}
259262
Name of the vtkCell subclass.
260263
261264
Returns
@@ -273,9 +276,10 @@ def from_unstructured_grid(nodes: np.ndarray,
273276

274277
vtk_data = vtkUnstructuredGrid()
275278
vtk_data.SetPoints(vtk_nodes)
276-
cell_types = {'TRIANGLE':VTK_TRIANGLE, 'QUAD':VTK_QUAD,
277-
'TETRA' :VTK_TETRA, 'HEXAHEDRON':VTK_HEXAHEDRON}
278-
vtk_data.SetCells(cell_types[cell_type.split("_",1)[-1].upper()],cells)
279+
# gracefully accept 'VTK_QUAD', 'vtk_lagrange_quadrilateral', etc.
280+
cell_types = {'TRIA':VTK_LAGRANGE_TRIANGLE, 'QUAD':VTK_LAGRANGE_QUADRILATERAL,
281+
'TETR':VTK_LAGRANGE_TETRAHEDRON, 'HEXA':VTK_LAGRANGE_HEXAHEDRON}
282+
vtk_data.SetCells(cell_types[cell_type.split('_')[-1].upper()[:4]],cells)
279283

280284
return VTK(vtk_data)
281285

python/tests/test_VTK.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,17 @@ def test_polyData_VTKHDF(np_rng,tmp_path):
8383
vtkhdf = VTK.load(tmp_path/'polyData.vtkhdf')
8484
assert (v.as_ASCII() == vtkhdf.as_ASCII())
8585

86-
@pytest.mark.parametrize('cell_type,n',[
87-
('VTK_hexahedron',8),
88-
('TETRA',4),
89-
('quad',4),
90-
('VTK_TRIANGLE',3)
91-
]
86+
# https://defelement.org/elements/lagrange.html
87+
@pytest.mark.parametrize('cell_type,n_nodes',[
88+
('VTK_hexahedron',lambda k: (k+1)**3),
89+
('TETRA',lambda k: ((k+1)*(k+2)*(k+3))//6),
90+
('quad',lambda k: (k+1)**2),
91+
('VTK_TRIANGLE',lambda k: ((k+1)*(k+2))//2),
92+
]
9293
)
93-
def test_unstructuredGrid(np_rng,tmp_path,cell_type,n):
94+
@pytest.mark.parametrize('order',[1,2,3,4,5])
95+
def test_unstructuredGrid(np_rng,tmp_path,cell_type,n_nodes,order):
96+
n = n_nodes(order)
9497
nodes = np_rng.random((n,3))
9598
connectivity = np_rng.choice(np.arange(n),n,False).reshape(-1,n)
9699
v = VTK.from_unstructured_grid(nodes,connectivity,cell_type)
@@ -104,15 +107,17 @@ def test_unstructuredGrid(np_rng,tmp_path,cell_type,n):
104107
assert (string == vtu.as_ASCII() == vtk.as_ASCII())
105108

106109
@pytest.mark.xfail(np.lib.NumpyVersion(vtkVersion.GetVTKVersion()) < '9.4.0',
107-
reason = 'not available in VTK < 9.4')
108-
@pytest.mark.parametrize('cell_type,n',[
109-
('VTK_hexahedron',8),
110-
('TETRA',4),
111-
('quad',4),
112-
('VTK_TRIANGLE',3)
113-
]
110+
reason = 'not available in VTK < 9.4')
111+
@pytest.mark.parametrize('cell_type,n_nodes',[
112+
('VTK_lagrange_hexa',lambda k: (k+1)**3),
113+
('VTK_LAGRANGE_TETRAHEDRON',lambda k: ((k+1)*(k+2)*(k+3))//6),
114+
('quadrilateral',lambda k: (k+1)**2),
115+
('TRIANGLE',lambda k: ((k+1)*(k+2))//2),
116+
]
114117
)
115-
def test_unstructuredGrid_VTKHDF(np_rng,tmp_path,cell_type,n):
118+
@pytest.mark.parametrize('order',[1,2,3,4,5])
119+
def test_unstructuredGrid_VTKHDF(np_rng,tmp_path,cell_type,n_nodes,order):
120+
n = n_nodes(order)
116121
nodes = np_rng.random((n,3))
117122
connectivity = np_rng.choice(np.arange(n),n,False).reshape(-1,n)
118123
v = VTK.from_unstructured_grid(nodes,connectivity,cell_type)

src/Marc/element.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,10 +763,10 @@ subroutine tElement_init(self,elemType)
763763
self%vtkType = 'TRIANGLE'
764764
case(2)
765765
self%cellFace = CELLFACE2
766-
self%vtkType = 'QUAD'
766+
self%vtkType = 'QUADRILATERAL'
767767
case(3)
768768
self%cellFace = CELLFACE3
769-
self%vtkType = 'TETRA'
769+
self%vtkType = 'TETRAHEDRON'
770770
case(4)
771771
self%cellFace = CELLFACE4
772772
self%vtkType = 'HEXAHEDRON'

src/result.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ subroutine result_init(restart)
9999
if (.not. file_exists .or. .not. restart) then
100100
call result_createJobFile()
101101
call result_addAttribute('DADF5_version_major',1)
102-
call result_addAttribute('DADF5_version_minor',2)
102+
call result_addAttribute('DADF5_version_minor',3)
103103
call get_command_argument(0,commandLine)
104104
call result_addAttribute('creator',trim(commandLine)//' '//DAMASK_VERSION)
105105
call result_addAttribute('created',now())

0 commit comments

Comments
 (0)