36 type(
pair_t),
dimension(:),
allocatable :: table
40 integer :: current_hash
44 private :: check_table
61 if (.not.
allocated(this%table))
allocate(this%table(0:10006))
93 logical function check_table(this)
96 integer :: nn, blanks, deleted, full
98 if (this%table_size >
size(this%table))
then 109 do nn=0,
size(this%table)-1
110 if (this%table(nn)%ii > 0 .and. this%table(nn)%jj > 0)
then 112 else if (this%table(nn)%ii .eq. 0 .and. this%table(nn)%jj .eq. 0)
then 114 else if (this%table(nn)%ii .eq. 0 .and. this%table(nn)%jj .eq. 1)
then 115 deleted = deleted + 1
117 print *,
"SHOULD NEVER OCCUR" 118 check_table = .false.
123 if (full .ne. this%table_size)
then 124 print *,
"SIZE = ",
size(this%table)
125 print *,
"blanks = ",blanks
126 print *,
"deleted = ",deleted
127 print *,
"full = ",full
128 print *,
"table_size = ",this%table_size
129 check_table = .false.
132 if (full+deleted+blanks .ne.
size(this%table))
then 133 print *,
"SIZE = ",
size(this%table)
134 print *,
"blanks = ",blanks
135 print *,
"deleted = ",deleted
136 print *,
"full = ",full
137 print *,
"table_size = ",this%table_size
138 check_table = .false.
141 end function check_table
155 integer,
intent(out) :: pair(2)
160 do while (this%current_hash <
size(this%table))
161 if (0.ne.this%table(this%current_hash)%ii .and. 0.ne.this%table(this%current_hash)%jj)
then 162 pair(1) = this%table(this%current_hash)%ii
163 pair(2) = this%table(this%current_hash)%jj
164 this%current_hash = this%current_hash + 1
167 this%current_hash = this%current_hash + 1
179 logical function is_pair(this,i0,j0)
182 integer,
intent(in) :: i0, j0
183 integer :: ii, jj, probe_count
184 integer(kind=8) :: hash, init_hash
189 if (ii < 1 .or. jj < 1)
then 190 print *,
"invalid pair: ",ii,jj
196 hash = mod(ii+jj*jj+probe_count*probe_count,
size(this%table))
197 if (hash < 0) hash = hash+
size(this%table)
202 if (this%table(hash)%ii .eq. ii .and. this%table(hash)%jj .eq. jj)
then 206 if (this%table(hash)%ii .eq. 0 .and. this%table(hash)%jj .eq. 0)
then 210 probe_count = probe_count + 1
211 hash = mod(hash+probe_count*probe_count,
size(this%table))
212 if (hash < 0) hash = hash+
size(this%table)
213 if (hash .eq. init_hash)
exit 216 print *,
"loop in hash addressing, this should not occur" 229 recursive subroutine add_pair(this,i0,j0)
232 integer,
intent(in) :: i0,j0
233 integer :: ii, jj, nn, old_size, old_tablesize, probe_count
234 integer(kind=8) :: hash, init_hash
235 type(
pair_t),
dimension(:),
allocatable :: table_tmp
237 if (i0 < 1 .or. j0 < 1)
then 238 print *,
"invalid pair: ",i0,j0
242 if (
size(this%table) < 2*this%table_size )
then 243 old_size =
size(this%table)
244 old_tablesize = this%table_size
245 allocate(table_tmp(0:old_size-1))
246 if (
size(table_tmp).ne.old_size)
then 247 print *,
"size = ",
size(table_tmp)
248 print *,
"old_size = ",old_size
251 table_tmp(0:old_size-1) = this%table(0:old_size-1)
253 deallocate(this%table)
254 allocate(this%table(0:2*old_size))
259 if ( table_tmp(nn)%ii .ne. 0 .and. table_tmp(nn)%jj .ne. 0)
then 260 call add_pair(this,table_tmp(nn)%ii,table_tmp(nn)%jj)
263 if (this%table_size.ne.old_tablesize)
then 264 print *,
"size = ",this%table_size
265 print *,
"old_size = ",old_tablesize
268 deallocate(table_tmp)
274 if (ii < 1 .or. jj < 1)
then 275 print *,
"invalid pair: ",ii,jj
281 hash = mod(ii+jj*jj+probe_count*probe_count,
size(this%table))
282 if (hash < 0) hash = hash+
size(this%table)
286 if (this%table(hash)%ii .eq. ii .and. this%table(hash)%jj .eq. jj)
then 290 if (this%table(hash)%ii .eq. 0 .or. this%table(hash)%jj .eq. 0)
then 291 this%table(hash)%ii = ii
292 this%table(hash)%jj = jj
293 this%table_size = this%table_size + 1
297 probe_count = probe_count + 1
298 hash = mod(hash+probe_count*probe_count,
size(this%table))
299 if (hash < 0) hash = hash+
size(this%table)
300 if (hash .eq. init_hash)
exit 303 print *,
"loop in hash addressing, this should not occur. maybe hash table is full" 319 integer,
intent(in) :: i0,j0
320 integer :: ii, jj, probe_count
321 integer(kind=8) :: hash, init_hash
326 if (ii < 1 .or. jj < 1)
then 327 print *,
"invalid pair: ",ii,jj
333 hash = mod(ii+jj*jj+probe_count*probe_count,
size(this%table))
334 if (hash < 0) hash = hash+
size(this%table)
338 if (this%table(hash)%ii .eq. 0 .and. this%table(hash)%jj .eq. 0)
then 342 if (this%table(hash)%ii .eq. ii .and. this%table(hash)%jj .eq. jj)
then 344 this%table(hash)%ii = 0
345 this%table(hash)%jj = 1
346 this%table_size = this%table_size - 1
350 probe_count = probe_count + 1
351 hash = mod(hash+probe_count*probe_count,
size(this%table))
352 if (hash < 0) hash = hash+
size(this%table)
353 if (hash .eq. init_hash)
exit 358 print *,
"loop in hash addressing. must be a lot of DELETED entries: ",this%table_size,
"/",
size(this%table)
subroutine, public reset_pairs(this)
subroutine, public init_pairs(this)
subroutine, public del_pair(this, i0, j0)
logical function, public is_pair(this, i0, j0)
subroutine, public get_pair(this, pair)
recursive subroutine, public add_pair(this, i0, j0)