97 integer,
intent(in) :: lx, ly, lz
98 integer :: ordering(lx * ly * lz)
99 integer :: i, j, k, vtk_idx
100 integer :: ibdy, jbdy, kbdy, nbdy, offset
101 integer :: n_corners, n_edges, n_faces
104 n_edges = 4 * ((lx - 2) + (ly - 2) + (lz - 2))
105 n_faces = 2 * ((lx - 2) * (ly - 2) + (lx - 2) * (lz - 2) &
106 + (ly - 2) * (lz - 2))
108 do concurrent(i = 1:lx, j = 1:ly, k = 1:lz)
109 ibdy = merge(1, 0, i .eq. 1 .or. i .eq. lx)
110 jbdy = merge(1, 0, j .eq. 1 .or. j .eq. ly)
111 kbdy = merge(1, 0, k .eq. 1 .or. k .eq. lz)
112 nbdy = ibdy + jbdy + kbdy
114 if (nbdy .eq. 3)
then
117 merge(2, 1, j .ne. 1), &
118 merge(3, 0, j .ne. 1), i .ne. 1) &
119 + merge(4, 0, k .ne. 1)
121 else if (nbdy .eq. 2)
then
124 if (ibdy .eq. 0)
then
126 + merge((lx - 2) + (ly - 2), 0, j .ne. 1) &
127 + merge(2 * ((lx - 2) + (ly - 2)), 0, k .ne. 1) &
129 else if (jbdy .eq. 0)
then
131 + merge(lx - 2, 2 * (lx - 2) + (ly - 2), i .ne. 1) &
132 + merge(2 * ((lx - 2) + (ly - 2)), 0, k .ne. 1) &
135 vtk_idx = (k - 2) + (lz - 2) &
136 * merge(merge(2, 1, j .ne. 1), &
137 merge(3, 0, j .ne. 1), i .ne. 1) &
138 + offset + 4 * ((lx - 2) + (ly - 2))
141 else if (nbdy .eq. 1)
then
143 offset = n_corners + n_edges
144 if (ibdy .eq. 1)
then
145 vtk_idx = (j - 2) + (ly - 2) * (k - 2) &
146 + merge((ly - 2) * (lz - 2), 0, i .ne. 1) &
148 else if (jbdy .eq. 1)
then
149 offset = offset + 2 * (ly - 2) * (lz - 2)
150 vtk_idx = (i - 2) + (lx - 2) * (k - 2) &
151 + merge((lx - 2) * (lz - 2), 0, j .ne. 1) &
153 else if (kbdy .eq. 1)
then
154 offset = offset + 2 * (ly - 2) * (lz - 2) + 2 * (lx - 2) * (lz - 2)
155 vtk_idx = (i - 2) + (lx - 2) * (j - 2) &
156 + merge((lx - 2) * (ly - 2), 0, k .ne. 1) &
162 offset = n_corners + n_edges + n_faces
164 + (i - 2) + (lx - 2) * ((j - 2) + (ly - 2) * (k - 2))
168 ordering(vtk_idx + 1) =
linear_index(i, j, k, 1, lx, ly, lz) - 1
183 integer,
intent(in) :: lx, ly
184 integer :: ordering(lx * ly)
185 integer :: i, j, vtk_idx
186 integer :: ibdy, jbdy, nbdy, offset
187 integer :: n_corners, n_edges
190 n_edges = 2 * ((lx - 2) + (ly - 2))
192 do concurrent(i = 1:lx, j = 1:ly)
193 ibdy = merge(1, 0, i .eq. 1 .or. i .eq. lx)
194 jbdy = merge(1, 0, j .eq. 1 .or. j .eq. ly)
197 if (nbdy .eq. 2)
then
200 merge(2, 1, j .ne. 1), &
201 merge(3, 0, j .ne. 1), i .ne. 1)
203 else if (nbdy .eq. 1)
then
206 if (ibdy .eq. 0)
then
208 + merge((lx - 2) + (ly - 2), 0, j .ne. 1) &
212 + merge(lx - 2, 2 * (lx - 2) + (ly - 2), i .ne. 1) &
218 offset = n_corners + n_edges
219 vtk_idx = offset + (i - 2) + (lx - 2) * (j - 2)
222 ordering(vtk_idx + 1) =
linear_index(i, j, 1, 1, lx, ly, 1) - 1
pure integer function, public linear_index(i, j, k, l, lx, ly, lz)
Compute the address of a (i,j,k,l) array with sizes (1:lx, 1:ly, 1:lz, :)
integer function, dimension(:), allocatable, public vtk_ordering(cell_type, lx, ly, lz)
Get the VTK node ordering for a given cell type. For Lagrange cells, returns an array mapping VTK nod...