12 #include "version.inc" 23 real :: minbounds(3), maxbounds(3)
26 real :: one_over_cell_length(3)
29 type(
sap_t),
dimension(:),
allocatable :: saps
32 type(hashtable_t) :: hashtable
63 integer :: particle_id
68 private :: multisap_raster
79 subroutine init_multisap(this,x_grid,y_grid,z_grid2,minbounds,maxbounds)
83 integer,
intent(in) :: x_grid,y_grid, z_grid2
84 real,
dimension(3),
intent(in) :: minbounds, maxbounds
85 integer :: ii,jj,kk, z_grid, sap_id
93 this%grid(1) = max(x_grid,1)
94 this%grid(2) = max(y_grid,1)
95 this%grid(3) = max(z_grid,1)
97 allocate(this%saps(0:this%grid(1)*this%grid(2)*this%grid(3)-1))
98 do ii=0,this%grid(1)-1
99 do jj=0,this%grid(2)-1
100 do kk=0,this%grid(3)-1
101 sap_id = (ii*this%grid(2)+jj)*this%grid(3)+kk
102 call init_sap(this%saps(sap_id),sap_id)
107 this%one_over_cell_length(:) = this%grid(:)/(maxbounds(:)-minbounds(:))
109 this%minbounds(:) = minbounds(:)
110 this%maxbounds(:) = maxbounds(:)
124 subroutine multisap_raster(this,aabb,sap_ids)
127 type(
aabb_t),
intent(in) :: aabb
128 integer,
intent(out) :: sap_ids(
max_saps)
129 integer :: max_grid(3),min_grid(3)
134 min_grid(:) = floor((aabb%minendpoint(:)-this%minbounds(:))*this%one_over_cell_length(:))
135 max_grid(:) = floor((aabb%maxendpoint(:)-this%minbounds(:))*this%one_over_cell_length(:))
137 min_grid(1) = min(max(min_grid(1),0),this%grid(1)-1)
138 min_grid(2) = min(max(min_grid(2),0),this%grid(2)-1)
139 min_grid(3) = min(max(min_grid(3),0),this%grid(3)-1)
140 max_grid(1) = min(max(max_grid(1),0),this%grid(1)-1)
141 max_grid(2) = min(max(max_grid(2),0),this%grid(2)-1)
142 max_grid(3) = min(max(max_grid(3),0),this%grid(3)-1)
144 call add_to_set((min_grid(1)*this%grid(2) + min_grid(2))*this%grid(3) + min_grid(3))
145 call add_to_set((min_grid(1)*this%grid(2) + min_grid(2))*this%grid(3) + max_grid(3))
146 call add_to_set((min_grid(1)*this%grid(2) + max_grid(2))*this%grid(3) + min_grid(3))
147 call add_to_set((min_grid(1)*this%grid(2) + max_grid(2))*this%grid(3) + max_grid(3))
148 call add_to_set((max_grid(1)*this%grid(2) + min_grid(2))*this%grid(3) + min_grid(3))
149 call add_to_set((max_grid(1)*this%grid(2) + min_grid(2))*this%grid(3) + max_grid(3))
150 call add_to_set((max_grid(1)*this%grid(2) + max_grid(2))*this%grid(3) + min_grid(3))
151 call add_to_set((max_grid(1)*this%grid(2) + max_grid(2))*this%grid(3) + max_grid(3))
164 integer,
intent(in) :: sap_id
167 do mm=1,
size(sap_ids)
168 if (sap_ids(mm).eq.sap_id)
then 172 if (sap_ids(mm).eq.-1)
then 180 end subroutine multisap_raster
192 subroutine multisap_add(this,aabb,particle_id,handlelist)
195 type(
aabb_t),
intent(in) :: aabb
196 integer,
intent(in) :: particle_id
201 call multisap_raster(this,aabb,sap_ids)
203 handlelist%particle_id = particle_id
206 do nn=1,
size(sap_ids)
207 handlelist%list(nn)%sap_id = sap_ids(nn)
208 if (sap_ids(nn) >= 0)
then 209 call add_box(this%saps(sap_ids(nn)),aabb,particle_id,handlelist%list(nn)%box_id)
230 do nn=1,
size(handlelist%list)
231 if (handlelist%list(nn)%sap_id >= 0)
then 232 call del_box(this%saps(handlelist%list(nn)%sap_id),handlelist%list(nn)%box_id)
251 type(
aabb_t),
intent(in) :: aabb
253 integer,
DIMENSION(MAX_SAPS) :: new_sap_ids
255 integer :: mm,nn,first_blank, box_id
257 call multisap_raster(this,aabb,new_sap_ids)
260 do nn=1,
size(new_sap_ids)
261 if (new_sap_ids(nn) < 0)
exit 265 do mm=1,
size(handlelist%list)
266 if (handlelist%list(mm)%sap_id < 0) first_blank = mm
268 if (handlelist%list(mm)%sap_id .eq. new_sap_ids(nn))
then 270 box_id = handlelist%list(mm)%box_id
271 call update_box(this%saps(new_sap_ids(nn)),handlelist%list(mm)%box_id,aabb)
279 if (first_blank .eq. -1)
then 280 print *,
"AABB is in more than 8 saps? Something is wrong: ",first_blank,handlelist%list
283 call add_box(this%saps(new_sap_ids(nn)),aabb,handlelist%particle_id,handlelist%list(first_blank)%box_id)
284 handlelist%list(first_blank)%sap_id = new_sap_ids(nn)
288 do mm=1,
size(handlelist%list)
289 if (handlelist%list(mm)%sap_id < 0) cycle
292 do nn=1,
size(new_sap_ids)
293 if (new_sap_ids(nn) < 0)
exit 295 if (handlelist%list(mm)%sap_id .eq. new_sap_ids(nn))
then 303 call del_box(this%saps(handlelist%list(mm)%sap_id),handlelist%list(mm)%box_id)
304 handlelist%list(mm)%sap_id = -1
326 integer :: ii, jj, kk, sap_id
328 integer :: sighs, cc,ll,i, cc_start, cc_end
330 call init_pairs(this%hashtable)
334 do ii=0,this%grid(1)-1
335 do jj=0,this%grid(2)-1
336 do kk=0,this%grid(3)-1
337 sap_id = ii*this%grid(2)*this%grid(3)+jj*this%grid(3)+kk
338 call sort(this%saps(sap_id))
344 print *,
" NUMBER OF DESGRIDS IS: ",this%grid(1)*this%grid(2)*this%grid(3)
348 open (unit=235,file=
"pairs.txt",action=
"write",status=
"replace")
350 do ii=0,this%grid(1)-1
351 do jj=0,this%grid(2)-1
352 do kk=0,this%grid(3)-1
353 sap_id = ii*this%grid(2)*this%grid(3)+jj*this%grid(3)+kk
354 call reset_pairs(this%saps(sap_id)%hashtable)
355 sighs = sighs + this%saps(sap_id)%hashtable%table_size
357 call get_pair(this%saps(sap_id)%hashtable,pair)
358 if (pair(1).eq.0 .and. pair(2).eq.0)
exit 359 write (235,*) pair(1),pair(2)
360 call add_pair(this%hashtable,pair(1),pair(2))
394 integer :: ii, jj, kk
395 integer :: sap_id, boxcount
399 do ii=0,this%grid(1)-1
400 do jj=0,this%grid(2)-1
401 do kk=0,this%grid(3)-1
402 sap_id = ii*this%grid(2)*this%grid(3)+jj*this%grid(3)+kk
404 boxcount = boxcount + this%saps(sap_id)%boxes_len
422 integer :: ii, jj, kk
425 do ii=0,this%grid(1)-1
426 do jj=0,this%grid(2)-1
427 do kk=0,this%grid(3)-1
428 sap_id = (ii*this%grid(2)+jj)*this%grid(3)+kk
429 call sweep(this%saps(sap_id))
439 integer :: ii, jj, kk
442 do ii=0,this%grid(1)-1
443 do jj=0,this%grid(2)-1
444 do kk=0,this%grid(3)-1
445 sap_id = (ii*this%grid(2)+jj)*this%grid(3)+kk
447 call check(this%saps(sap_id))
465 INTEGER,
INTENT(IN) :: new_size
466 type(
boxhandlelist_t),
DIMENSION(:),
ALLOCATABLE,
INTENT(INOUT) :: boxhandles
470 lsize =
size(boxhandles,1)
471 allocate(boxhandle_tmp(new_size))
472 boxhandle_tmp(1:lsize) = boxhandles(1:lsize)
473 call move_alloc(boxhandle_tmp,boxhandles)
subroutine, public update_box(this, id, aabb)
subroutine multisap_check(this)
subroutine, public multisap_add(this, aabb, particle_id, handlelist)
subroutine, public multisap_update(this, aabb, handlelist)
subroutine, public multisap_sort(this)
subroutine, public boxhandle_grow(boxhandles, new_size)
subroutine, public sweep(this)
subroutine, public multisap_sweep(this)
subroutine, public init_sap(this, id)
subroutine, public add_box(this, aabb, particle_id, id)
subroutine sort(Array, NUM_ROWS, COL1, COL2)
subroutine add_to_set(sap_id)
subroutine quicksort(this)
integer, parameter max_saps
subroutine, public del_box(this, id)
subroutine, public init_multisap(this, x_grid, y_grid, z_grid2, minbounds, maxbounds)
subroutine, public multisap_quicksort(this)
subroutine, public multisap_del(this, handlelist)