source: flexpart.git/src/random_mod.f90

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

add SPDX-License-Identifier to all .f90 files

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