COSMOS v7.655  COSMOSv7655
(AirShowerMC)
kerf.f
Go to the documentation of this file.
1 ! test kerf
2 !
3 ! implicit none
4 ! real*8 x, kerf
5 ! do x = 0.d0, 10.d0, 0.5d0
6 ! write(*, *) ' x=', x, ' erf=',kerf(x)
7 ! enddo
8 ! end
9 ! *********************************
10  real*8 function kerf(x)
11 ! *********************************
12 ! Error function: integral from 0 to x
13 ! of 2/sqrt(pi) * exp(-t**2)dt
14 !
15 ! Adapted from Mori's code in Maruzen book.
16 !
17 ! *** note ***
18 !
19 ! kerf(inf) = 1
20 !
21 ! I(0:inf){exp(-(ax**2 + 2bx + c)} =
22 !
23 ! sqrt(pi/a)/2 exp( (b**2 - ac)/a ) kerf(b/sqrt(a))
24 !
25 ! I(0:inf){exp(-ax**2 - b/(x**2))} =
26 !
27 ! sqrt(pi/2)/2 exp(-2sqrt(ab))
28 !
29 !
30 ! I( :x){exp(-(ax**2 + 2bx + c))}dx =
31 !
32 ! sqrt(pi/a)/2 exp( (b**2-ac)/a ) kerf(sqrt(a)x + b/sqrt(a))
33 ! (a != 0)
34 !
35 ! let z(x)=1/sqrt(2pi) * exp(-x**2/2)
36 ! p(x)=integral z(x) from -inf to x
37 ! q(x)= // x to inf
38 ! a(x)= // -x to x
39 ! then p+q=1; p(-x)=q(x); a=2p-1.
40 ! p( (x-m)/s ) =1/sqrt(2pi)/s * integral
41 ! exp(- ((x-m)/s)**2/2) from -inf to x
42 ! z( (m+x)/s ) = z( (m-x)/s )
43 ! kerrorf(x)= 2p(sqrt(2)x) -1
44 ! p(x)= ( erf(x/sqrt(2)) + 1 )/2
45 
46  implicit none
47  real*8 x
48 !
49  integer nm, nx, na
50 
51  parameter(nm = 5, nx = 13, na = 5)
52 
53  real*8 cm(0:nm), cx(nx), cq(nx), ca(0:na)
54 
55  real*8 sqrtpi, norm, invpi, fourpi, pi
56 
57  parameter(sqrtpi = 1.772453850905516d0)
58  parameter(norm = 2.d0 / sqrtpi, pi = 3.141592653589793d0)
59  parameter(invpi = 1.0d0 / pi, fourpi = 4.d0 *pi)
60  real*8 y, xv, v
61  integer i
62 
63  data cm /
64  * 0.1000000000000000d+01,
65  * -0.3333333333333333d+00,
66  * 0.1000000000000000d+00,
67  * -0.2380952380952381d-01,
68  * 0.4629629629629630d-02,
69  * -0.7575757575757575d-03 /
70 
71  data cx /
72  * 0.7788007830714048d+00,
73  * 0.3678794411714423d+00,
74  * 0.1053992245618643d+00,
75  * 0.1831563888873418d-01,
76  * 0.1930454136227709d-02,
77  * 0.1234098040866796d-03,
78  * 0.4785117392129009d-05,
79  * 0.1125351747192591d-06,
80  * 0.1605228055185612d-08,
81  * 0.1388794386496402d-10,
82  * 0.7287724095819692d-13,
83  * 0.2319522830243569d-15,
84  * 0.4477732441718302d-18 /
85 
86  data cq /
87  * 0.2500000000000000d+00,
88  * 0.1000000000000000d+01,
89  * 0.2250000000000000d+01,
90  * 0.4000000000000000d+01,
91  * 0.6250000000000000d+01,
92  * 0.9000000000000000d+01,
93  * 0.1225000000000000d+02,
94  * 0.1600000000000000d+02,
95  * 0.2025000000000000d+02,
96  * 0.2500000000000000d+02,
97  * 0.3025000000000000d+02,
98  * 0.3600000000000000d+02,
99  * 0.4225000000000000d+02 /
100 
101  data ca /
102  * 0.1000000000000000d+01,
103  * -0.1000000000000000d+01,
104  * 0.3000000000000000d+01,
105  * -0.1500000000000000d+02,
106  * 0.1050000000000000d+03,
107  * -0.9449999999999999d+03 /
108 ! --------------------------------------------
109 
110  xv = abs(x)
111  if (xv .le. 0.1d0) then
112  y = xv**2
113  v = cm(nm)
114  do i = nm - 1, 0, -1
115  v = cm(i) + y * v
116  enddo
117  kerf = norm * xv * v
118  elseif (xv .le. 8.0d0) then
119  y = xv**2
120  v = 1.d0 / (2 * y)
121  do i = 1, nx
122  v = v + cx(i) / (cq(i) + y)
123  enddo
124  v = invpi * xv * exp(-y) * v
125  if (xv .lt. 6.0d0) then
126  v = v - 2 / (exp(fourpi * xv) - 1)
127  end if
128  kerf = 1.d0 - v
129  else
130 ! y = 2 * xv**2
131 ! v = ca(na)
132 ! do i = na - 1, 0, -1
133 ! v = ca(i) + y * v
134 ! enddo
135 ! v = exp(-xv**2) / (sqrtpi * xv) * v
136 ! kerf = 1.d0 - v
137  kerf = 1.d0
138  endif
139 
140  if (x .lt. 0.d0) then
141  kerf = -kerf
142  endif
143  end
integer npitbl real *nx parameter(n=101, npitbl=46, nx=n-1) real *8 uconst
real *8 function kerf(x)
Definition: kerf.f:11
block data cblkEvhnp ! currently usable models data RegMdls ad *special data *Cekaon d0
Definition: cblkEvhnp.h:5
dE dx *! Nuc Int sampling table d
Definition: cblkMuInt.h:130