12 integer,
parameter :: dp = kind(0.0d0)
15 integer,
parameter :: morton_k = selected_int_kind(15)
21 public :: morton_from_ix2
22 public :: morton_from_ix3
23 public :: morton_to_ix2
24 public :: morton_to_ix3
25 public :: morton_bsearch
28 public :: print_bits_morton
33 function morton_from_ix2(ix)
result(m_ix)
34 integer,
intent(in) :: ix(2)
35 integer(morton_k) :: m_ix
36 integer(morton_k) :: a, b
37 a = bit_space_1(ix(1))
38 b = bit_space_1(ix(2))
39 m_ix = ior(a, ishft(b, 1))
40 end function morton_from_ix2
43 function morton_to_ix2(m_ix)
result(ix)
44 integer(morton_k),
intent(in) :: m_ix
46 ix(1) = bit_despace_1(m_ix)
47 ix(2) = bit_despace_1(ishft(m_ix, -1))
48 end function morton_to_ix2
51 function morton_from_ix3(ix)
result(m_ix)
52 integer,
intent(in) :: ix(3)
53 integer(morton_k) :: m_ix
54 integer(morton_k) :: a, b, c
55 a = bit_space_2(ix(1))
56 b = bit_space_2(ix(2))
57 c = bit_space_2(ix(3))
58 m_ix = ior(ior(a, ishft(b, 1)), ishft(c, 2))
59 end function morton_from_ix3
62 function morton_to_ix3(m_ix)
result(ix)
63 integer(morton_k),
intent(in) :: m_ix
65 ix(1) = bit_despace_2(m_ix)
66 ix(2) = bit_despace_2(ishft(m_ix, -1))
67 ix(3) = bit_despace_2(ishft(m_ix, -2))
68 end function morton_to_ix3
72 function morton_bsearch(list, val)
result(ix)
73 integer(morton_k),
intent(in) :: list(:)
74 integer(morton_k),
intent(in) :: val
75 integer :: ix, i_min, i_max, i_middle
80 do while (i_min < i_max)
81 i_middle = i_min + (i_max - i_min) / 2
83 if (val <= list(i_middle))
then 91 if (val > list(ix)) ix = -1
92 end function morton_bsearch
96 function bit_space_2(a)
result(x)
97 integer,
intent(in) :: a
98 integer(morton_k) :: x
101 x = iand(int(a, morton_k), int(z
'1fffff', morton_k))
102 x = iand(ior(x, ishft(x, 32)), int(z
'1f00000000ffff', morton_k))
103 x = iand(ior(x, ishft(x, 16)), int(z
'1f0000ff0000ff', morton_k))
104 x = iand(ior(x, ishft(x, 8)), int(z
'100f00f00f00f00f', morton_k))
105 x = iand(ior(x, ishft(x, 4)), int(z
'10c30c30c30c30c3', morton_k))
106 x = iand(ior(x, ishft(x, 2)), int(z
'1249249249249249', morton_k))
107 end function bit_space_2
110 function bit_despace_2(a)
result(y)
111 integer(morton_k),
intent(in) :: a
112 integer(morton_k) :: x
115 x = iand(a, int(z
'1249249249249249', morton_k))
116 x = iand(ior(x, ishft(x, -2)), int(z
'10c30c30c30c30c3', morton_k))
117 x = iand(ior(x, ishft(x, -4)), int(z
'100f00f00f00f00f', morton_k))
118 x = iand(ior(x, ishft(x, -8)), int(z
'1f0000ff0000ff', morton_k))
119 x = iand(ior(x, ishft(x, -16)), int(z
'1f00000000ffff', morton_k))
120 x = iand(ior(x, ishft(x, -32)), int(z
'1fffff', morton_k))
122 end function bit_despace_2
125 function bit_space_1(a)
result(x)
126 integer,
intent(in) :: a
127 integer(morton_k) :: x
130 x = iand(ior(x, ishft(x, 32)), int(z
'00000000ffffffff', morton_k))
131 x = iand(ior(x, ishft(x, 16)), int(z
'0000ffff0000ffff', morton_k))
132 x = iand(ior(x, ishft(x, 8)), int(z
'00ff00ff00ff00ff', morton_k))
133 x = iand(ior(x, ishft(x, 4)), int(z
'0f0f0f0f0f0f0f0f', morton_k))
134 x = iand(ior(x, ishft(x, 2)), int(z
'3333333333333333', morton_k))
135 x = iand(ior(x, ishft(x, 1)), int(z
'5555555555555555', morton_k))
136 end function bit_space_1
139 function bit_despace_1(a)
result(y)
140 integer(morton_k),
intent(in) :: a
141 integer(morton_k) :: x
145 x = iand(x, int(z
'5555555555555555', morton_k))
146 x = iand(ior(x, ishft(x, -1)), int(z
'3333333333333333', morton_k))
147 x = iand(ior(x, ishft(x, -2)), int(z
'0f0f0f0f0f0f0f0f', morton_k))
148 x = iand(ior(x, ishft(x, -4)), int(z
'00ff00ff00ff00ff', morton_k))
149 x = iand(ior(x, ishft(x, -8)), int(z
'0000ffff0000ffff', morton_k))
150 x = iand(ior(x, ishft(x, -16)), int(z
'00000000ffffffff', morton_k))
152 end function bit_despace_1
155 subroutine morton_rank (XDONT, IRNGT)
162 Integer(morton_k),
Dimension (:),
Intent (In) :: XDONT
163 Integer,
Dimension (:),
Intent (Out) :: IRNGT
165 Integer(morton_k) :: XVALA, XVALB
167 Integer,
Dimension (SIZE(IRNGT)) :: JWRKT
168 Integer :: LMTNA, LMTNC, IRNG1, IRNG2
169 Integer :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB
171 nval = min(
SIZE(xdont),
SIZE(irngt))
185 If (xdont(iind-1) <= xdont(iind))
Then 186 irngt(iind-1) = iind - 1
190 irngt(iind) = iind - 1
193 If (modulo(nval, 2) /= 0)
Then 210 Do iwrkd = 0, nval - 1, 4
211 If ((iwrkd+4) > nval)
Then 212 If ((iwrkd+2) >= nval)
Exit 216 If (xdont(irngt(iwrkd+2)) <= xdont(irngt(iwrkd+3)))
Exit 220 If (xdont(irngt(iwrkd+1)) <= xdont(irngt(iwrkd+3)))
Then 221 irng2 = irngt(iwrkd+2)
222 irngt(iwrkd+2) = irngt(iwrkd+3)
223 irngt(iwrkd+3) = irng2
228 irng1 = irngt(iwrkd+1)
229 irngt(iwrkd+1) = irngt(iwrkd+3)
230 irngt(iwrkd+3) = irngt(iwrkd+2)
231 irngt(iwrkd+2) = irng1
238 If (xdont(irngt(iwrkd+2)) <= xdont(irngt(iwrkd+3))) cycle
242 If (xdont(irngt(iwrkd+1)) <= xdont(irngt(iwrkd+3)))
Then 243 irng2 = irngt(iwrkd+2)
244 irngt(iwrkd+2) = irngt(iwrkd+3)
245 If (xdont(irng2) <= xdont(irngt(iwrkd+4)))
Then 247 irngt(iwrkd+3) = irng2
250 irngt(iwrkd+3) = irngt(iwrkd+4)
251 irngt(iwrkd+4) = irng2
257 irng1 = irngt(iwrkd+1)
258 irng2 = irngt(iwrkd+2)
259 irngt(iwrkd+1) = irngt(iwrkd+3)
260 If (xdont(irng1) <= xdont(irngt(iwrkd+4)))
Then 261 irngt(iwrkd+2) = irng1
262 If (xdont(irng2) <= xdont(irngt(iwrkd+4)))
Then 264 irngt(iwrkd+3) = irng2
267 irngt(iwrkd+3) = irngt(iwrkd+4)
268 irngt(iwrkd+4) = irng2
272 irngt(iwrkd+2) = irngt(iwrkd+4)
273 irngt(iwrkd+3) = irng1
274 irngt(iwrkd+4) = irng2
289 If (lmtna >= nval)
Exit 298 jinda = iwrkf + lmtna
299 iwrkf = iwrkf + lmtnc
300 If (iwrkf >= nval)
Then 301 If (jinda >= nval)
Exit 317 jwrkt(1:lmtna) = irngt(iwrkd:jinda)
319 xvala = xdont(jwrkt(iinda))
320 xvalb = xdont(irngt(iindb))
327 If (xvala > xvalb)
Then 328 irngt(iwrk) = irngt(iindb)
330 If (iindb > iwrkf)
Then 332 irngt(iwrk+1:iwrkf) = jwrkt(iinda:lmtna)
335 xvalb = xdont(irngt(iindb))
337 irngt(iwrk) = jwrkt(iinda)
339 If (iinda > lmtna) exit
340 xvala = xdont(jwrkt(iinda))
353 end subroutine morton_rank
355 subroutine print_bits(x)
356 integer,
intent(in) :: x
358 do n = 0, bit_size(x)-1
359 if (btest(x, n))
then 360 write(*,
"(A)", advance=
"NO")
"1" 362 write(*,
"(A)", advance=
"NO")
"0" 366 end subroutine print_bits
368 subroutine print_bits_morton(x)
369 integer(morton_k),
intent(in) :: x
371 do n = 0, bit_size(x)-1
372 if (btest(x, n))
then 373 write(*,
"(A)", advance=
"NO")
"1" 375 write(*,
"(A)", advance=
"NO")
"0" 379 end subroutine print_bits_morton
This module contains methods to convert indices to morton numbers.