ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/math/erfc.F90
Revision: 2756
Committed: Wed May 17 15:37:15 2006 UTC (18 years, 2 months ago) by gezelter
File size: 8663 byte(s)
Log Message:
Getting fortran side prepped for single precision...

File Contents

# User Rev Content
1 gezelter 2756 ! **********************************************************************
2     ! erfc.F used with permission from Naval Surface Warfare Group
3     !******************************************************************************
4     function erfc (x)
5    
6     use definitions
7    
8     !! ERFC: the complementary error function
9    
10     real( kind = DP ) :: erfc
11     real( kind = DP ) :: an, ax, c, eps, rpinv, t, x, w
12     real( kind = DP ) :: a(21), b(44), e(44)
13     real( kind = DP ) :: dpmpar, dcsevl
14     !
15     ! rpinv = 1/sqrt(pi)
16     !
17     data rpinv /.56418958354775628694807945156077259e0_dp/
18     !
19     data a(1) / .1283791670955125738961589031215e+00_dp/, &
20     a(2) /-.3761263890318375246320529677070e+00_dp/, &
21     a(3) / .1128379167095512573896158902931e+00_dp/, &
22     a(4) /-.2686617064513125175943235372542e-01_dp/, &
23     a(5) / .5223977625442187842111812447877e-02_dp/, &
24     a(6) /-.8548327023450852832540164081187e-03_dp/, &
25     a(7) / .1205533298178966425020717182498e-03_dp/, &
26     a(8) /-.1492565035840625090430728526820e-04_dp/, &
27     a(9) / .1646211436588924261080723578109e-05_dp/, &
28     a(10) /-.1636584469123468757408968429674e-06_dp/
29     data a(11) / .1480719281587021715400818627811e-07_dp/, &
30     a(12) /-.1229055530145120140800510155331e-08_dp/, &
31     a(13) / .9422759058437197017313055084212e-10_dp/, &
32     a(14) /-.6711366740969385085896257227159e-11_dp/, &
33     a(15) / .4463222608295664017461758843550e-12_dp/, &
34     a(16) /-.2783497395542995487275065856998e-13_dp/, &
35     a(17) / .1634095572365337143933023780777e-14_dp/, &
36     a(18) /-.9052845786901123985710019387938e-16_dp/, &
37     a(19) / .4708274559689744439341671426731e-17_dp/, &
38     a(20) /-.2187159356685015949749948252160e-18_dp/, &
39     a(21) / .7043407712019701609635599701333e-20_dp/
40     !
41     data b(1) / .610143081923200417926465815756e+00_dp/, &
42     b(2) /-.434841272712577471828182820888e+00_dp/, &
43     b(3) / .176351193643605501125840298123e+00_dp/, &
44     b(4) /-.607107956092494148600512158250e-01_dp/, &
45     b(5) / .177120689956941144861471411910e-01_dp/, &
46     b(6) /-.432111938556729381859986496800e-02_dp/, &
47     b(7) / .854216676887098678819832055000e-03_dp/, &
48     b(8) /-.127155090609162742628893940000e-03_dp/, &
49     b(9) / .112481672436711894688470720000e-04_dp/, &
50     b(10) / .313063885421820972630152000000e-06_dp/
51     data b(11) /-.270988068537762022009086000000e-06_dp/, &
52     b(12) / .307376227014076884409590000000e-07_dp/, &
53     b(13) / .251562038481762293731400000000e-08_dp/, &
54     b(14) /-.102892992132031912759000000000e-08_dp/, &
55     b(15) / .299440521199499393630000000000e-10_dp/, &
56     b(16) / .260517896872669362900000000000e-10_dp/, &
57     b(17) /-.263483992417196938600000000000e-11_dp/, &
58     b(18) /-.643404509890636443000000000000e-12_dp/, &
59     b(19) / .112457401801663447000000000000e-12_dp/, &
60     b(20) / .172815333899860980000000000000e-13_dp/
61     data b(21) /-.426410169494237500000000000000e-14_dp/, &
62     b(22) /-.545371977880191000000000000000e-15_dp/, &
63     b(23) / .158697607761671000000000000000e-15_dp/, &
64     b(24) / .208998378443340000000000000000e-16_dp/, &
65     b(25) /-.590052686940900000000000000000e-17_dp/, &
66     b(26) /-.941893387554000000000000000000e-18_dp/, &
67     b(27) / .214977356470000000000000000000e-18_dp/, &
68     b(28) / .466609850080000000000000000000e-19_dp/, &
69     b(29) /-.724301186200000000000000000000e-20_dp/, &
70     b(30) /-.238796682400000000000000000000e-20_dp/
71     data b(31) / .191177535000000000000000000000e-21_dp/, &
72     b(32) / .120482568000000000000000000000e-21_dp/, &
73     b(33) /-.672377000000000000000000000000e-24_dp/, &
74     b(34) /-.574799700000000000000000000000e-23_dp/, &
75     b(35) /-.428493000000000000000000000000e-24_dp/, &
76     b(36) / .244856000000000000000000000000e-24_dp/, &
77     b(37) / .437930000000000000000000000000e-25_dp/, &
78     b(38) /-.815100000000000000000000000000e-26_dp/, &
79     b(39) /-.308900000000000000000000000000e-26_dp/, &
80     b(40) / .930000000000000000000000000000e-28_dp/
81     data b(41) / .174000000000000000000000000000e-27_dp/, &
82     b(42) / .160000000000000000000000000000e-28_dp/, &
83     b(43) /-.800000000000000000000000000000e-29_dp/, &
84     b(44) /-.200000000000000000000000000000e-29_dp/
85     !
86     data e(1) / .107797785207238315116833591035e+01_dp/, &
87     e(2) /-.265598904091486733721465009040e-01_dp/, &
88     e(3) /-.148707314669809950960504633300e-02_dp/, &
89     e(4) /-.138040145414143859607708920000e-03_dp/, &
90     e(5) /-.112803033322874914985073660000e-04_dp/, &
91     e(6) /-.117286984274372522405373900000e-05_dp/, &
92     e(7) /-.103476150393304615537382000000e-06_dp/, &
93     e(8) /-.118991140858924382544470000000e-07_dp/, &
94     e(9) /-.101622254498949864047600000000e-08_dp/, &
95     e(10) /-.137895716146965692169000000000e-09_dp/
96     data e(11) /-.936961303373730333500000000000e-11_dp/, &
97     e(12) /-.191880958395952534900000000000e-11_dp/, &
98     e(13) /-.375730172019937070000000000000e-13_dp/, &
99     e(14) /-.370537260269833570000000000000e-13_dp/, &
100     e(15) / .262756542349037100000000000000e-14_dp/, &
101     e(16) /-.112132287643793300000000000000e-14_dp/, &
102     e(17) / .184136028922538000000000000000e-15_dp/, &
103     e(18) /-.491302565748860000000000000000e-16_dp/, &
104     e(19) / .107044551673730000000000000000e-16_dp/, &
105     e(20) /-.267189366240500000000000000000e-17_dp/
106     data e(21) / .649326867976000000000000000000e-18_dp/, &
107     e(22) /-.165399353183000000000000000000e-18_dp/, &
108     e(23) / .426056266040000000000000000000e-19_dp/, &
109     e(24) /-.112558407650000000000000000000e-19_dp/, &
110     e(25) / .302561744800000000000000000000e-20_dp/, &
111     e(26) /-.829042146000000000000000000000e-21_dp/, &
112     e(27) / .231049558000000000000000000000e-21_dp/, &
113     e(28) /-.654695110000000000000000000000e-22_dp/, &
114     e(29) / .188423140000000000000000000000e-22_dp/, &
115     e(30) /-.550434100000000000000000000000e-23_dp/
116     data e(31) / .163095000000000000000000000000e-23_dp/, &
117     e(32) /-.489860000000000000000000000000e-24_dp/, &
118     e(33) / .149054000000000000000000000000e-24_dp/, &
119     e(34) /-.459220000000000000000000000000e-25_dp/, &
120     e(35) / .143180000000000000000000000000e-25_dp/, &
121     e(36) /-.451600000000000000000000000000e-26_dp/, &
122     e(37) / .144000000000000000000000000000e-26_dp/, &
123     e(38) /-.464000000000000000000000000000e-27_dp/, &
124     e(39) / .151000000000000000000000000000e-27_dp/, &
125     e(40) /-.500000000000000000000000000000e-28_dp/
126     data e(41) / .170000000000000000000000000000e-28_dp/, &
127     e(42) /-.600000000000000000000000000000e-29_dp/, &
128     e(43) / .200000000000000000000000000000e-29_dp/, &
129     e(44) /-.100000000000000000000000000000e-29_dp/
130     !
131     eps = epsilon ( eps )
132     !
133     ! abs(x) <= 1
134     !
135     ax = abs(x)
136     if (ax > 1.0_dp) go to 20
137     t = x*x
138     w = a(21)
139     do i = 1,20
140     k = 21 - i
141     w = t*w + a(k)
142     end do
143     erfc = 0.5_dp + (0.5_dp - x*(1.0_dp + w))
144     return
145     !
146     ! 1 < abs(x) < 2
147     !
148     20 if (ax >= 2.0_dp) go to 30
149     n = 44
150     if (eps >= 1.0e-20_dp) n = 30
151     t = (ax - 3.75_dp)/(ax + 3.75_dp)
152     erfc = csevl(t, b, n)
153     21 erfc = exp(-x*x) * erfc
154     if (x < 0.0_dp) erfc = 2.0_dp - erfc
155     return
156     !
157     ! 2 < dabs(x) < 12
158     !
159     30 if (x < -9.0_dp) go to 60
160     if (x >= 12.0_dp) go to 40
161     n = 44
162     if (eps >= 1.0e-20_dp) n = 25
163     t = (1.0_dp/x)**2
164     w = (10.5_dp*t - 1.0_dp)/(2.5_dp*t + 1.0_dp)
165     erfc = csevl(w, e, n) / ax
166     go to 21
167     !
168     ! x >= 12
169     !
170     40 if (x > 50.0_dp) go to 70
171     t = (1.0_dp/x)**2
172     an = -0.5_dp
173     c = 0.5_dp
174     w = 0.0_dp
175     50 c = c + 1.0_dp
176     an = - c*an*t
177     w = w + an
178     if (abs(an) > eps) go to 50
179     w = (-0.5_dp + w)*t + 1.0_dp
180     erfc = exp(-x*x) * ((rpinv*w)/ax)
181     return
182     !
183     ! limit value for large negative x
184     !
185     60 erfc = 2.0_dp
186     return
187     !
188     ! limit value for large positive x
189     !
190     70 erfc = 0.0_dp
191     return
192     end function erfc
193    
194     function csevl (x, a, n)
195    
196     !! CSEVL: evaluate the n term chebyshev series a at x.
197     !! only half of the first coefficient is used.
198    
199     use definitions
200    
201     real( kind = DP ) :: csevl
202     real( kind = DP ) :: a(n), x, x2, s0, s1, s2
203    
204     if (n .le. 1) then
205     csevl = 0.5_dp * a(1)
206     return
207     else
208    
209     x2 = x + x
210     s0 = a(n)
211     s1 = 0.0_dp
212     do i = 2,n
213     s2 = s1
214     s1 = s0
215     k = n - i + 1
216     s0 = x2*s1 - s2 + a(k)
217     end do
218     csevl = 0.5_dp * (s0 - s2)
219     return
220    
221     endif
222     end function csevl