COSMOS v7.655  COSMOSv7655
(AirShowerMC)
ksampLin.f
Go to the documentation of this file.
1 ! implicit none
2 ! real*8 a, b, alpha, beta, x
3 ! integer i
4 !
5 ! a = -10.
6 ! b = 1.
7 ! alpha = -2.
8 ! beta =-1.
9 ! do i = 1, 50000
10 ! call ksampLin(a, b, alpha, beta, x)
11 ! write(*,*) sngl(x)
12 ! enddo
13 ! end
14  subroutine ksamplin(a, b, alpha, beta, x)
15 ! samples a random variable with density
16 ! f(x)dx = ax + b in x=(alpha, beta); alpha <= beta
17 ! f(x) need not be normalized.
18 ! f(x) > 0 in the region since it is prob. density.
19 !
20  implicit none
21  real*8 a ! input.
22  real*8 b ! input.
23  real*8 alpha ! input
24  real*8 beta ! input. beta > alpha.
25  real*8 x ! output.
26 !
27  real*8 u1, u2, u
28  real*8 fa ! f(alpha)
29  real*8 fb ! f(beta)
30  real*8 ba ! beta -alpha
31 !
32  ba = beta - alpha
33  if(ba .eq. 0.) then
34  x = beta
35  elseif(ba .lt. 0.) then
36  stop 'error input to ksampLin'
37  else
38  fa = a*alpha + b
39  fb = a*beta + b
40  if(fa .lt. 0 .or. fb .lt. 0.) then
41  stop 'bad region to ksampLin'
42  endif
43 
44  call rndc(u)
45  if(u .lt. abs(fb - fa)/(fb + fa)) then
46  call rndc(u1)
47  call rndc(u2)
48  if(fa .lt. fb) then
49  x = max(u1, u2)
50  else
51  x = min(u1, u2)
52  endif
53  x = ba * x + alpha
54  else
55  call rndc(u)
56  x = ba * u + alpha
57  endif
58  endif
59  end
subroutine rndc(u)
Definition: rnd.f:91
subroutine ksamplin(a, b, alpha, beta, x)
Definition: ksampLin.f:15