36 public string_hash, get_real_time, get_cpu_time, compute_total_triangular, triangular_index_to_ij
73 subroutine box_index_to_ij (idx, height, i, j)
74 integer,
intent(in) :: idx, height
75 integer,
intent(out) :: i, j
77 i = mod(idx - 1, height) + 1
78 j = (idx - 1) / height + 1
87 subroutine triangular_index_to_ij (idx_f, N, row, column)
88 integer,
intent(in) :: idx_f, n
89 integer,
intent(out) :: row, column
90 integer :: idx, ii, k, jj
93 ii = n * (n + 1) / 2 - 1 - idx
94 k = int((sqrt(8.0_wp*real(ii,wp) + 1.0_wp) - 1.0_wp) / 2.0_wp, longint)
95 jj = ii - k * (k + 1) / 2
110 integer function string_hash (str, table_size)
result(h)
111 character(len=*),
intent(in) :: str
112 integer,
intent(in) :: table_size
113 integer :: i, chr, g, mask = int(z
"1FFFFFF")
116 do i = 1, len_trim(str)
117 chr = ichar(str(i:i))
118 h = ishft(h, 4) + chr
120 h = iand(ieor(h,g), mask)
122 h = 1 + modulo(h, table_size)
159 subroutine pack_ints (i1, i2, i3, i4, i5, i6, i7, i8, z)
161 integer,
intent(in) :: i1, i2, i3, i4, i5, i6, i7, i8
162 integer(longint),
intent(out) :: z(:)
164 integer(longint),
parameter :: max16 = 2_longint**16 - 1
165 integer(longint),
parameter :: max32 = 2_longint**32 - 1
171 if (i1 > max16 .or. i2 > max16 .or. i3 > max16 .or. i4 > max16 .or. &
172 i5 > max16 .or. i6 > max16 .or. i7 > max16 .or. i8 > max16)
then
173 call mpi_xermsg(
'Utility_module',
'pack_ints', &
174 'Cannot pack integers, values too large. Try increasing NIDX.', 2, 1)
178 z(1) = ior(ishft(z(1), 16_longint), int(i2, longint))
179 z(1) = ior(ishft(z(1), 16_longint), int(i3, longint))
180 z(1) = ior(ishft(z(1), 16_longint), int(i4, longint))
182 z(2) = ior(ishft(z(2), 16_longint), int(i6, longint))
183 z(2) = ior(ishft(z(2), 16_longint), int(i7, longint))
184 z(2) = ior(ishft(z(2), 16_longint), int(i8, longint))
188 if (i1 > max32 .or. i2 > max32 .or. i3 > max32 .or. i4 > max32 .or. &
189 i5 > max32 .or. i6 > max32 .or. i7 > max32 .or. i8 > max32)
then
190 call mpi_xermsg(
'Utility_module',
'pack_ints', &
191 'Cannot pack integers, values too large. Try increasing NIDX.', 4, 1)
195 z(1) = ior(ishft(z(1), 32_longint), int(i2, longint))
197 z(2) = ior(ishft(z(2), 32_longint), int(i4, longint))
199 z(3) = ior(ishft(z(3), 32_longint), int(i6, longint))
201 z(4) = ior(ishft(z(4), 32_longint), int(i8, longint))
216 call mpi_xermsg(
'Utility_module',
'pack_ints',
'Packing implemented only for NIDX = 2, 4 or 8.', 1, 1)
229 subroutine unpack_ints (z, u)
231 integer(longint),
intent(in) :: z(:)
232 integer,
intent(out) :: u(8)
234 integer(longint),
parameter :: mask16 = 2_longint**16 - 1
235 integer(longint),
parameter :: mask32 = 2_longint**32 - 1
237 integer(longint) :: n
243 n = z(1); u(4) = int(iand(n, mask16))
244 n = ishft(n, -16_longint); u(3) = int(iand(n, mask16))
245 n = ishft(n, -16_longint); u(2) = int(iand(n, mask16))
246 n = ishft(n, -16_longint); u(1) = int(iand(n, mask16))
247 n = z(2); u(8) = int(iand(n, mask16))
248 n = ishft(n, -16_longint); u(7) = int(iand(n, mask16))
249 n = ishft(n, -16_longint); u(6) = int(iand(n, mask16))
250 n = ishft(n, -16_longint); u(5) = int(iand(n, mask16))
254 n = z(1); u(2) = int(iand(n, mask32))
255 n = ishft(n, -32_longint); u(1) = int(iand(n, mask32))
256 n = z(2); u(4) = int(iand(n, mask32))
257 n = ishft(n, -32_longint); u(3) = int(iand(n, mask32))
258 n = z(3); u(6) = int(iand(n, mask32))
259 n = ishft(n, -32_longint); u(5) = int(iand(n, mask32))
260 n = z(4); u(8) = int(iand(n, mask32))
261 n = ishft(n, -32_longint); u(7) = int(iand(n, mask32))
276 call mpi_xermsg(
'Utility_module',
'unpack_ints',
'Unpacking implemented only for NIDX = 2, 4 or 8.', 1, 1)