22 integer(i8),
private :: s(2) = [123456789_i8, 987654321_i8]
24 procedure, non_overridable :: set_seed
25 procedure, non_overridable :: jump
26 procedure, non_overridable :: int_4
27 procedure, non_overridable :: int_8
28 procedure, non_overridable :: unif_01
29 procedure, non_overridable :: unif_01_vec
30 procedure, non_overridable :: normal
31 procedure, non_overridable :: two_normals
32 procedure, non_overridable :: poisson
33 procedure, non_overridable :: circle
34 procedure, non_overridable :: sphere
35 procedure, non_overridable :: next
288 integer,
intent(in) :: nmax
289 double precision,
intent(in) :: r_min,bmin1,bmin2,bmax1,bmax2
290 double precision,
intent(out) :: points_store(nmax,2)
291 integer,
intent(out) :: n_setpoints
293 double precision :: gsize,x1len,x2len,r2,threer2,r_rand,a_rand,x_rand,y_rand
294 double precision :: unif_random_number(2),candidate(2),distance,random01
297 integer,
allocatable :: id_grid(:,:)
298 integer :: nx1,nx2,ix1,ix2,n_active,id,j,k_candi
299 integer :: id_active_points(nmax),point_index_in_grid(2,nmax)
300 logical :: points_active(nmax)
301 logical :: candidate_found
307 points_active=.false.
309 gsize=r_min/sqrt(2.d0)
313 nx1=ceiling(x1len/gsize)
314 nx2=ceiling(x2len/gsize)
315 allocate(id_grid(nx1,nx2))
318 call rng%unif_01_vec(unif_random_number)
319 points_store(1,1)=unif_random_number(1)*x1len
320 points_store(1,2)=unif_random_number(2)*x2len
321 ix1=ceiling(points_store(1,1)/gsize)
322 ix2=ceiling(points_store(1,2)/gsize)
324 point_index_in_grid(1,1)=ix1
325 point_index_in_grid(2,1)=ix2
326 points_active(1)=.true.
329 do while(any(points_active))
333 if(points_active(id))
then
335 id_active_points(n_active)=id
339 id=id_active_points(ceiling(rng%unif_01()*dble(n_active)))
341 candidate_found=.true.
342 r_rand=sqrt(rng%unif_01()*threer2+r2)
343 a_rand=2.d0*
dpi*rng%unif_01()
344 x_rand=points_store(id,1)+r_rand*cos(a_rand)
345 y_rand=points_store(id,2)+r_rand*sin(a_rand)
346 if(x_rand<0.d0 .or. x_rand> x1len .or. y_rand<0.d0 .or. y_rand > x2len) cycle
347 do ix2=max(1,point_index_in_grid(2,id)-3),min(nx2,point_index_in_grid(2,id)+3)
348 do ix1=max(1,point_index_in_grid(1,id)-3),min(nx1,point_index_in_grid(1,id)+3)
349 if(id_grid(ix1,ix2)==id) cycle
350 if(id_grid(ix1,ix2)/=0)
then
351 distance=sqrt((x_rand-points_store(id_grid(ix1,ix2),1))**2+(y_rand-points_store(id_grid(ix1,ix2),2))**2)
352 if(distance<r_min)
then
353 candidate_found=.false.
359 if(candidate_found)
then
360 n_setpoints=n_setpoints+1
361 points_store(n_setpoints,1)=x_rand
362 points_store(n_setpoints,2)=y_rand
363 ix1=ceiling(points_store(n_setpoints,1)/gsize)
364 ix2=ceiling(points_store(n_setpoints,2)/gsize)
365 point_index_in_grid(1,n_setpoints)=ix1
366 point_index_in_grid(2,n_setpoints)=ix2
367 id_grid(ix1,ix2)=n_setpoints
368 points_active(n_setpoints)=.true.
373 if(.not.candidate_found)
then
374 points_active(id)=.false.
377 points_store(1:n_setpoints,1)=points_store(1:n_setpoints,1)+bmin1
378 points_store(1:n_setpoints,2)=points_store(1:n_setpoints,2)+bmin2