59 lines
1.4 KiB
Fortran
59 lines
1.4 KiB
Fortran
! loosely translated from python. We do not need to generate and store the entire vector at once.
|
|
! compilation: gfortran -Wall -std=f2008 -o thisfile thisfile.f08
|
|
|
|
program percolation_mean_run_density
|
|
implicit none
|
|
integer :: i, p10, n2, n, t
|
|
real :: p, limit, sim, delta
|
|
data n,p,t/100,0.5,500/
|
|
write(6,'(a3,a5,4a7)')'t','p','n','p(1-p)','sim','delta%'
|
|
do p10=1,10,2
|
|
p = p10/10.0
|
|
limit = p*(1-p)
|
|
write(6,'()')
|
|
do n2=10,15,2
|
|
n = 2**n2
|
|
sim = 0
|
|
do i=1,t
|
|
sim = sim + mean_run_density(n,p)
|
|
end do
|
|
sim = sim/t
|
|
if (limit /= 0) then
|
|
delta = abs(sim-limit)/limit
|
|
else
|
|
delta = sim
|
|
end if
|
|
delta = delta * 100
|
|
write(6,'(i3,f5.2,i7,2f7.3,f5.1)')t,p,n,limit,sim,delta
|
|
end do
|
|
end do
|
|
|
|
contains
|
|
|
|
integer function runs(n, p)
|
|
integer, intent(in) :: n
|
|
real, intent(in) :: p
|
|
real :: harvest
|
|
logical :: q
|
|
integer :: count, i
|
|
count = 0
|
|
q = .false.
|
|
do i=1,n
|
|
call random_number(harvest)
|
|
if (harvest < p) then
|
|
q = .true.
|
|
else
|
|
if (q) count = count+1
|
|
q = .false.
|
|
end if
|
|
end do
|
|
runs = count
|
|
end function runs
|
|
|
|
real function mean_run_density(n, p)
|
|
integer, intent(in) :: n
|
|
real, intent(in) :: p
|
|
mean_run_density = real(runs(n,p))/real(n)
|
|
end function mean_run_density
|
|
|
|
end program percolation_mean_run_density
|