131 SUBROUTINE dgam(A, X, ACC, G, GSTAR, IFLG, IFLGST)
135 USE yomhook
,ONLY : lhook, dr_hook
136 USE parkind1
,ONLY : jprb
140 REAL(KIND=JPRB) :: zhook_handle
142 INTEGER,
PARAMETER :: jdbl=8
143 REAL :: a, x, acc, g, gstar
144 INTEGER :: iflg, iflgst, i, k, k1, ma
146 REAL(KIND=JDBL) :: alx, alpha, alprec
147 REAL(KIND=JDBL) :: top, bot, ainf, eps, eps1, es, sga
148 REAL(KIND=JDBL) :: ae, aa, ap1, am1, aep1
149 REAL(KIND=JDBL) :: aem1, fma, aeps, sgae, aaeps, algp1
150 REAL(KIND=JDBL) :: sgga, algep1, sggs, algs
151 REAL(KIND=JDBL) :: alg, summ, ga, y, term, u, p, q, r, v, t, h
152 REAL(KIND=JDBL) :: sgt, a1x, rho, xpa
153 REAL(KIND=JDBL) :: xma, s, temp
156 REAL(KIND=JDBL),
DIMENSION(29),
PARAMETER :: c=(/ &
157 & .57721566490153286060651209008e0_JDBL, &
158 & -.65587807152025388107701951515e0_JDBL, &
159 & -4.200263503409523552900393488e-2_JDBL, &
160 & .1665386113822914895017007951e0_JDBL, &
161 & -4.21977345555443367482083013e-2_JDBL, &
162 & -9.6219715278769735621149217e-3_JDBL, &
163 & 7.2189432466630995423950103e-3_JDBL, &
164 & -1.165167591859065112113971e-3_JDBL, &
165 & -2.15241674114950972815730e-4_JDBL, &
166 & 1.2805028238811618615320e-4_JDBL, &
167 & -2.013485478078823865569e-5_JDBL, &
168 & -1.2504934821426706573e-6_JDBL, &
169 & 1.1330272319816958824e-6_JDBL, &
170 & -2.056338416977607103e-7_JDBL, &
171 & 6.1160951044814158e-9_JDBL, &
172 & 5.0020076444692229e-9_JDBL, &
173 & -1.181274570487020e-9_JDBL, &
174 & 1.04342671169110e-10_JDBL, &
175 & 7.782263439905e-12_JDBL, &
176 & -3.696805618642e-12_JDBL, &
177 & 5.1003702875e-13_JDBL, &
178 & -2.058326054e-14_JDBL, &
179 & -5.34812254e-15_JDBL, &
180 & 1.2267786e-15_JDBL, &
181 & -1.181259e-16_JDBL, &
187 IF (lhook) CALL dr_hook(
'DGAM',0,zhook_handle)
191 IF (x<0.e0_jdbl) go to 290
198 IF (x>0.e0_jdbl) alx = log(x*1.e0_jdbl)
199 alpha = x + .25e0_jdbl
200 IF (x<0.25e0_jdbl .AND. x>0.e0_jdbl) alpha = log(0.5e0_jdbl)/alx
201 alprec = digits(1.e0_jdbl)*log(2.e0_jdbl)
202 top = log10(huge(1.e0_jdbl))
203 bot = log10(tiny(1.e0_jdbl))
204 ainf = huge(1.e0_jdbl)
205 eps = 0.5e0_jdbl*10.e0_jdbl**(-acc)
208 IF (a<0.e0_jdbl) sga = -sga
210 aa = abs(a*1.e0_jdbl)
213 ma = int(0.5e0_jdbl-a)
217 IF (aeps<0.e0_jdbl) sgae = -sgae
226 IF (aeps==0.e0_jdbl) go to 20
228 IF (ma==2*(ma/2)) sgga = -sgga
229 algp1 =
dlga(aeps+1.e0_jdbl) - log(aaeps)
231 algp1 = algp1 +
dlga(1.e0_jdbl-aeps) -
dlga(fma-aeps)
235 IF (x>0.e0_jdbl) go to 60
243 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
249 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
252 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
254 60
IF (a>alpha) go to 220
255 IF (x>1.5e0_jdbl) go to 240
256 IF (a<-.5e0_jdbl) go to 170
262 IF (a>=0.5e0_jdbl) go to 110
266 summ = ae*summ + c(k1)
268 ga = -summ/(1.e0_jdbl+ae*summ)
270 IF (abs(y)>=1.e0_jdbl) go to 100
278 IF (abs(term)>eps1*summ) go to 90
281 100 u = ga - (exp(y)-1.e0_jdbl)/ae
283 110 temp=
dlga(a*1.e0_jdbl)
284 u = dexp(temp) - (x**a)/a
298 IF (abs(term)>eps1*summ) go to 130
299 v = (x**aep1)*summ/aep1
303 140 t = exp(x*1.e0_jdbl)*x**(-a)
305 gstar = 1.e0_jdbl - a*g*dexp(-algp1)/t
306 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
308 150 g = exp(x*1.e0_jdbl)*g
309 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
311 160 g = a*g*exp(-algp1)
312 gstar = 1.e0_jdbl - g
313 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
320 aep1 = aeps + 1.e0_jdbl
321 IF (x<0.25e0_jdbl .AND. ae>alpha) go to 210
323 180 g = g*exp(x*1.e0_jdbl)*x**(-ae)
325 g = (1.e0_jdbl-x*g)/(k-ae)
327 alg = log(g*1.e0_jdbl)
331 200 gstar = 1.e0_jdbl
332 IF (ma>=0 .AND. aeps==0.e0_jdbl .AND. lhook) &
333 & CALL dr_hook(
'DGAM',1,zhook_handle)
334 IF (ma>=0 .AND. aeps==0.0_jdbl)
RETURN
336 t = log(aa) - x + a*alx + alg - algp1
337 IF (t<-alprec .AND. lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
338 IF (t<-alprec)
RETURN
339 IF (t>=top) go to 320
340 gstar = 1.e0_jdbl - sgt*exp(t)
341 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
357 IF (abs(term)>eps*summ) go to 230
358 algs = ae*alx - x + log(summ) - algep1
359 IF (algs<=bot) go to 310
361 g = 1.e0_jdbl - gstar
362 IF (i/=2 .AND. lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
370 240 gstar = 1.e0_jdbl
371 xpa = x + 1.e0_jdbl - a
372 xma = x - 1.e0_jdbl - a
387 t = p*(1.e0_jdbl+rho)
391 IF (abs(term)>eps*summ) go to 250
394 alg = log(g*1.e0_jdbl)
397 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
399 280 alg = a*alx - x + log(a*summ/xpa) - algp1
400 IF (alg<=bot) go to 300
402 gstar = 1.e0_jdbl - g
403 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
407 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
410 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
413 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
417 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
420 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
423 IF (lhook) CALL dr_hook(
'DGAM',1,zhook_handle)
428 FUNCTION dlga(DX) RESULT(DLGAR)
430 USE yomhook
,ONLY : lhook, dr_hook
431 USE parkind1
,ONLY : jprb
435 REAL(KIND=JPRB) :: zhook_handle
437 REAL(KIND=JDBL) :: dlgar
438 REAL(KIND=JDBL) :: dx, dc, dp, dy, dt, ds
439 REAL(KIND=JDBL),
DIMENSION(8),
PARAMETER :: dbnum=(/ &
440 & -3.617e3_JDBL,1.e0_JDBL,-6.91e2_JDBL,1.e0_JDBL, &
441 & -1.e0_JDBL, 1.e0_JDBL,-1.e0_JDBL, 1.e0_JDBL/)
442 REAL(KIND=JDBL),
DIMENSION(8),
PARAMETER :: dbden=(/ &
443 & 1.224e5_JDBL,1.56e2_JDBL,3.6036e5_JDBL,1.188e3_JDBL, &
444 & 1.68e3_JDBL, 1.26e3_JDBL,3.6e2_JDBL, 1.2e1_JDBL/)
446 IF (lhook) CALL dr_hook(
'DLGA',0,zhook_handle)
448 dc = 0.5e0_jdbl*log(8.e0_jdbl*atan(1.e0_jdbl))
459 10
IF (y>35.027_jdbl) go to 20
464 20 dt = 1.e0_jdbl/(dy*dy)
465 ds = 4.3867e4_jdbl/2.44188e5_jdbl
467 ds = dt*ds + dbnum(i)/dbden(i)
469 dlgar = (dy-0.5e0_jdbl)*log(dy) - dy + dc + ds/dy - log(dp)
470 IF (lhook) CALL dr_hook(
'DLGA',1,zhook_handle)
real(kind=jdbl) function dlga(DX)
subroutine dgam(A, X, ACC, G, GSTAR, IFLG, IFLGST)