source: flexpart.git/src/random_mod.f90 @ 3481cc1

10.4.1_peseiGFS_025bugfixes+enhancementsdevrelease-10release-10.4.1scaling-bug
Last change on this file since 3481cc1 was 3481cc1, checked in by Ignacio Pisso <ip@…>, 4 years ago

move license from headers to a different file

  • Property mode set to 100644
File size: 2.9 KB
Line 
1!  Taken from Press et al., Numerical Recipes
2
3module random_mod
4 
5  implicit none
6
7contains
8 
9  function ran1(idum)
10
11    implicit none
12
13    integer :: idum
14    real    :: ran1
15    integer,parameter :: ia=16807, im=2147483647, iq=127773, ir=2836
16    integer,parameter :: ntab=32, ndiv=1+(im-1)/ntab
17    real,parameter    :: am=1./im, eps=1.2e-7, rnmx=1.-eps
18    integer :: j, k
19    integer :: iv(ntab) = (/ (0,j=1,ntab) /)
20    integer :: iy=0
21
22    if (idum.le.0.or.iy.eq.0) then
23      idum=max(-idum,1)
24      do j=ntab+8,1,-1
25        k=idum/iq
26        idum=ia*(idum-k*iq)-ir*k
27        if (idum.lt.0) idum=idum+im
28        if (j.le.ntab) iv(j)=idum
29      enddo
30      iy=iv(1)
31    endif
32    k=idum/iq
33    idum=ia*(idum-k*iq)-ir*k
34    if (idum.lt.0) idum=idum+im
35    j=1+iy/ndiv
36    iy=iv(j)
37    iv(j)=idum
38    ran1=min(am*iy,rnmx)
39  end function ran1
40
41
42  function gasdev(idum)
43
44    implicit none
45
46    integer :: idum
47    real    :: gasdev, fac, r, v1, v2
48    integer :: iset = 0
49    real    :: gset = 0.
50   
51    if (iset.eq.0) then
521     v1=2.*ran3(idum)-1.
53      v2=2.*ran3(idum)-1.
54      r=v1**2+v2**2
55      if(r.ge.1.0 .or. r.eq.0.0) go to 1
56      fac=sqrt(-2.*log(r)/r)
57      gset=v1*fac
58      gasdev=v2*fac
59      iset=1
60    else
61      gasdev=gset
62      iset=0
63    endif
64  end function gasdev
65
66
67  subroutine gasdev1(idum,random1,random2)
68
69    implicit none
70
71    integer :: idum
72    real :: random1, random2, fac, v1, v2, r
73
741   v1=2.*ran3(idum)-1.
75    v2=2.*ran3(idum)-1.
76    r=v1**2+v2**2
77    if(r.ge.1.0 .or. r.eq.0.0) go to 1
78    fac=sqrt(-2.*log(r)/r)
79    random1=v1*fac
80    random2=v2*fac
81! Limit the random numbers to lie within the interval -3 and +3
82!**************************************************************
83    if (random1.lt.-3.) random1=-3.
84    if (random2.lt.-3.) random2=-3.
85    if (random1.gt.3.) random1=3.
86    if (random2.gt.3.) random2=3.
87  end subroutine gasdev1
88
89
90  function ran3(idum)
91
92    implicit none
93
94    integer :: idum
95    real :: ran3
96
97    integer,parameter :: mbig=1000000000, mseed=161803398, mz=0
98    real,parameter    :: fac=1./mbig
99    integer :: i,ii,inext,inextp,k
100    integer :: mj,mk,ma(55)
101
102    save inext,inextp,ma
103    integer :: iff = 0
104
105    if(idum.lt.0.or.iff.eq.0)then
106      iff=1
107      mj=mseed-iabs(idum)
108      mj=mod(mj,mbig)
109      ma(55)=mj
110      mk=1
111      do i=1,54
112        ii=mod(21*i,55)
113        ma(ii)=mk
114        mk=mj-mk
115        if(mk.lt.mz)mk=mk+mbig
116        mj=ma(ii)
117      end do
118      do k=1,4
119        do i=1,55
120          ma(i)=ma(i)-ma(1+mod(i+30,55))
121          if(ma(i).lt.mz)ma(i)=ma(i)+mbig
122        end do
123      end do
124      inext=0
125      inextp=31
126      idum=1
127    endif
128    inext=inext+1
129    if(inext.eq.56)inext=1
130    inextp=inextp+1
131    if(inextp.eq.56)inextp=1
132    mj=ma(inext)-ma(inextp)
133    if(mj.lt.mz)mj=mj+mbig
134    ma(inext)=mj
135    ran3=mj*fac
136  end function ran3
137!  (C) Copr. 1986-92 Numerical Recipes Software US.
138
139end module random_mod
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG