SURFEX v8.1
General documentation of Surfex
dgam.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !######################################################################
6 !######################################################################
7 !
8 ! THIS ROUTINE COMPUTE THE INCOMPLETE AND THE COMPLEMENTARY
9 ! INCOMPLETE GAMMA FUNCTION REAL*8 IN BRIEF, THIS
10 ! FUNCTION HELP TO COMPUTE THE DIFFERENT FRACTION PRESENT IN THE
11 ! TOPMODEL FRAMEWORK.
12 ! MORE EXPLANATION ON THE SUBROUTINE USE ARE GIVEN IN THE NEXT
13 ! COMMENTARY
14 !
15 ! THIS ROUTINE WAS FOUND ON http://www.netlib.org WEB SITE.
16 !
17 ! REFERENCE - W. GAUTSCHI, :: A COMPUTATIONAL PROCEDURE FOR INCOMPLETE
18 ! GAMMA FUNCTIONS, ACM TRANS. MATH. SOFTWARE., (1979) 482-489
19 !
20 !######################################################################
21 !######################################################################
22 !
23 ! LET GAMMA(A) DENOTE THE GAMMA FUNCTION AND GAM(A,X) THE
24 ! (COMPLEMENTARY) INCOMPLETE GAMMA FUNCTION,
25 !
26 ! GAM(A,X)=INTEGRAL FROM T=X TO T=INFINITY OF EXP(-T)*T**(A-1).
27 !
28 ! LET GAMSTAR(A,X) DENOTE TRICOMI:S FORM OF THE INCOMPLETE GAMMA
29 ! FUNCTION, WHICH FOR A.GT.0. IS DEFINED BY
30 !
31 ! GAMSTAR(A,X)=(X**(-A)/GAMMA(A))*INTEGRAL FROM T=0 TO T=X OF
32 ! EXP(-T)*T**(A-1),
33 !
34 ! AND FOR A.LE.0. BY ANALYTIC CONTINUATION. FOR THE PURPOSE OF
35 ! THIS SUBROUTINE, THESE FUNCTIONS ARE NORMALIZED AS FOLLOWS&
36 !
37 ! GAM(A,X)/GAMMA(A), IF A.GT.0.,
38 ! G(A,X)=
39 ! EXP(X)*X**(-A)*GAM(A,X), IF A.LE.0.,
40 !
41 ! GSTAR(A,X)=(X**A)*GAMSTAR(A,X)
42 ! =(1/GAMMA(A))*INTEGRAL FROM T=0 TO T=X OF EXP(-T)*T**(A-1)
43 !
44 ! THE PROGRAM BELOW ATTEMPTS TO EVALUATE G(A,X) AND GSTAR(A,X),
45 ! BOTH TO AN ACCURACY OF ACC SIGNIFICANT DECIMAL DIGITS, FOR ARBI-
46 ! TRARY REAL VALUES OF A AND NONNEGATIVE VALUES OF X. THE SUB-
47 ! ROUTINE AUTOMATICALLY CHECKS FOR UNDERFLOW AND OVERFLOW CONDI-
48 ! TIONS AND RETURNS APPROPRIATE WARNINGS THROUGH THE OUTPUT PARA-
49 ! METERS IFLG, IFLGST. A RESULT THAT UNDERFLOWS IS RETURNED WITH
50 ! THE VALUE 0., ONE THAT OVERFLOWS WITH THE VALUE OF THE LARGEST
51 ! MACHINE-REPRESENTABLE NUMBER.
52 !
53 ! NEAR LINES IN THE (A,X)-PLANE, A.LT.0., ALONG WHICH GSTAR
54 ! VANISHES, THE ACCURACY SPECIFIED WILL BE ATTAINED ONLY IN TERMS
55 ! OF ABSOLUTE ERROR, NOT RELATIVE ERROR. THERE ARE OTHER (RARE)
56 ! INSTANCES IN WHICH THE ACCURACY ATTAINED IS SOMEWHAT LESS THAN
57 ! THE ACCURACY SPECIFIED. THE DISCREPANCY, HOWEVER, SHOULD NEVER
58 ! EXCEED ONE OR TWO (DECIMAL) ORDERS OF ACCURACY# NO INDICATION
59 ! OF THIS IS GIVEN THROUGH ERROR FLAGS.
60 !
61 ! PARAMETER LIST&
62 !
63 ! A - - THE FIRST ARGUMENT OF G AND GSTAR. TYPE REAL.
64 ! X - - THE SECOND ARGUMENT OF G AND GSTAR. TYPE REAL.
65 !ACC - - THE NUMBER OF CORRECT SIGNIFICANT DECIMAL DIGITS
66 ! DESIRED IN THE RESULTS. TYPE REAL.
67 ! G - - AN OUTPUT VARIABLE RETURNING THE VALUE OF G(A,X).
68 ! TYPE REAL.
69 ! GSTAR - - AN OUTPUT VARIABLE RETURNING THE VALUE OF
70 ! GSTAR(A,X). TYPE REAL.
71 ! IFLG - - AN ERROR FLAG INDICATING A NUMBER OF ERROR CONDI-
72 ! TIONS IN G UPON EXECUTION. TYPE INTEGER.
73 ! IFLGST - - AN ERROR FLAG INDICATING A NUMBER OF ERROR CONDI-
74 ! TIONS IN GSTAR UPON EXECUTION. TYPE INTEGER.
75 ! THE VALUES OF IFLG AND IFLGST HAVE THE FOLLOWING
76 ! MEANINGS&
77 ! 0 - NO ERROR CONDITION.
78 ! 1 - ILLEGAL NEGATIVE ARGUMENT X. THE ROUTINE EXITS
79 !WITH THE VALUES ZERO FOR G AND GSTAR.
80 ! 2 - INFINITELY LARGE RESULT AT X=0. THE ROUTINE
81 !RETURNS THE LARGEST MACHINE-REPRESENTABLE NUMBER.
82 ! 3 - (ONLY FOR IFLGST) GSTAR IS INDETERMINATE AT
83 !A=0. AND X=0. THE ROUTINE RETURNS THE VALUE 1.,
84 !WHICH IS THE LIMIT VALUE AS X TENDS TO ZERO FOR
85 !FIXED A=0.
86 ! 4 - THE RESULT UNDERFLOWS. IT IS SET EQUAL TO 0.
87 ! 5 - THE RESULT OVERFLOWS. IT IS SET EQUAL TO THE
88 !LARGEST MACHINE-REPRESENTABLE NUMBER, WITH
89 !PROPER SIGN.
90 ! 6 - CONVERGENCE FAILS WITHIN 600 ITERATIONS, EITHER
91 !IN TAYLOR:S SERIES OR IN LEGENDRE:S CONTINUED
92 !FRACTION. REASON UNKNOWN. THE COMPUTATION IS
93 !ABORTED AND THE ROUTINE RETURNS WITH ZERO
94 !VALUES FOR G AND GSTAR.
95 !
96 ! ALL MACHINE-DEPENDENT PARAMETERS ARE COLLECTED IN THE FIRST
97 ! DATA DECLARATION. THEY ARE AS FOLLOWS&
98 !
99 ! IN THE PROGRAM BELOW THESE PARAMETERS ARE SET TO CORRESPOND TO
100 ! THE MACHINE CHARACTERISTICS OF THE CDC 6500 COMPUTER.
101 !
102 ! THE SECOND DATA DECLARATION CONTAINS THE SINGLE PRECISION
103 ! VALUE OF ALOG(10.). THE NEXT DATA DECLARATION CONTAINS THE SUCCES-
104 ! SIVE COEFFICIENTS IN THE MACLAURIN EXPANSION OF (1/GAMMA(A+1))-1.
105 ! THEY ARE GIVEN TO AS MANY DECIMAL PLACES AS IS NECESSARY TO ACHIEVE
106 ! MACHINE PRECISION (ON THE CDC 6500 COMPUTER) IN THE RANGE
107 ! ABS(A).LE..5. MORE ACCURATE VALUES OF THESE COEFFICIENTS (TO
108 ! 31 DECIMAL PLACES) CAN BE FOUND IN TABLE 5 OF J.W.WRENCH,JR.,
109 ! CONCERNING TWO SERIES FOR THE GAMMA FUNCTION, MATH. COMPUT.
110 ! 22, 1968, 617-626.
111 !
112 ! THE SUBROUTINE CALLS ON A FUNCTION SUBROUTINE, NAMED ALGA,
113 ! WHICH IS TO PROVIDE SINGLE PRECISION VALUES OF THE LOGARITHM OF
114 ! THE GAMMA FUNCTION FOR ARGUMENTS LARGER THAN OR EQUAL TO .5.
115 ! A POSSIBLE VERSION OF SUCH A FUNCTION SUBROUTINE IS APPENDED
116 ! TO THE PRESENT SUBROUTINE. IT IS TAYLORED TO THE ACCURACY RE-
117 ! QUIREMENTS OF THE CDC 6500 COMPUTER, AND USES RATIONAL APPROXI-
118 ! MATIONS DUE TO CODY AND HILLSTROM (MATH. COMPUT. 21, 1967, 198-
119 ! 203).
120 !
121 ! REFERENCE - W. GAUTSCHI, ::A COMPUTATIONAL PROCEDURE FOR
122 ! INCOMPLETE GAMMA FUNCTIONS, ACM TRANS. MATH. SOFTWARE.
123 !
124 !----------------------------------------------------
125 !! MODIFICATIONS
126 !! -------------
127 !!J.Escobar10/06/2013: replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP
128 !----------------------------------------------------
129 !################################################################
130 !
131 SUBROUTINE dgam(PA, PX, PACC, PG, PGSTAR, KFLG, KFLGST)
132 !
133 !################################################################
134 
135 USE yomhook ,ONLY : lhook, dr_hook
136 USE parkind1 ,ONLY : jprb
137 
138 IMPLICIT NONE
139 
140 REAL, INTENT(IN) :: PA, PX, PACC
141 REAL, INTENT(OUT) :: PG, PGSTAR
142 INTEGER, INTENT(OUT) :: KFLG, KFLGST
143 !
144 REAL, PARAMETER :: XALPREC=digits(1.)*log(2.), &
145  xtop=log10(huge(1.)), xbot=log10(tiny(1.))
146 !
147 REAL :: ZALX, ZALPHA
148 REAL :: ZAINF, ZEPS, ZEPS1, ZES, ZSGA
149 REAL :: ZAE, ZAA, ZAP1, ZAM1, ZAEP1
150 REAL :: ZAEM1, ZFMA, ZAEPS, ZSGAE, ZAAEPS, ZALGP1
151 REAL :: ZSGGA, ZALGEP1, ZSGGS, ZALGS
152 REAL :: ZALG, ZSUMM, ZGA, ZY, ZTERM, ZU, ZP, ZQ, ZR, ZV, ZT, ZH
153 REAL :: ZSGT, ZA1X, ZRHO, ZXPA
154 REAL :: ZXMA, ZS, ZTEMP
155 !
156 INTEGER :: JI, JK, JK1, JMA
157 LOGICAL :: GRET
158 !
159 !RJ REAL,SAVE::AL10=2.3025850929940456840179914547
160 REAL,DIMENSION(29),PARAMETER :: XC=(/ &
161  0.57721566490153286060651209008, &
162  -.65587807152025388107701951515, &
163  -4.200263503409523552900393488e-2, &
164  0.1665386113822914895017007951, &
165  -4.21977345555443367482083013e-2, &
166  -9.6219715278769735621149217e-3, &
167  7.2189432466630995423950103e-3, &
168  -1.165167591859065112113971e-3, &
169  -2.15241674114950972815730e-4,&
170  1.2805028238811618615320e-4, &
171  -2.013485478078823865569e-5, &
172  -1.2504934821426706573e-6, &
173  1.1330272319816958824e-6, &
174  -2.056338416977607103e-7, &
175  6.1160951044814158e-9, &
176  5.0020076444692229e-9, &
177  -1.181274570487020e-9, &
178  1.04342671169110e-10, &
179  7.782263439905e-12, &
180  -3.696805618642e-12, &
181  5.1003702875e-13,&
182  -2.058326054e-14, &
183  -5.34812254e-15, &
184  1.2267786e-15, &
185  -1.181259e-16, &
186  1.187e-18, &
187  1.412e-18, &
188  -2.30e-19, &
189  1.7e-20/)
190 
191 REAL(KIND=JPRB) :: ZHOOK_HANDLE
192 !
193 !
194 IF (lhook) CALL dr_hook('DGAM',0,zhook_handle)
195 !
196 pg = 0.0
197 pgstar = 0.0
198 !
199 kflg = 0
200 kflgst = 0
201 !
202 IF ( px<0. ) THEN
203  ! 290 deb
204  kflg = 1
205  kflgst = 1
206  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
207  RETURN
208  ! 290 end
209 ENDIF
210 !
211 ! INITIALIZATION
212 !
213 zainf = huge(1.)
214 zaa = abs(pa)
215 !
216 IF ( px==0. ) THEN
217  !
218  ! EVALUATION OF GSTAR(A,0.) AND G(A,0.)
219  !
220  IF (pa<0.) THEN
221  kflgst = 2
222  pgstar = zainf
223  pg = 1./zaa
224  ELSEIF (pa==0.) THEN
225  kflgst = 3
226  kflg = 2
227  pgstar = 1.
228  pg = zainf
229  ELSEIF (pa>0.) THEN
230  pg = 1.
231  ENDIF
232  !
233  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
234  RETURN
235  !
236 ENDIF
237 !
238 ! PX > 0.
239 !
240 ! INITIALIZATION
241 !
242 ji = 0
243 !
244 zeps = 0.5*10.**(-pacc)
245 zeps1 = zeps/100.
246 !
247 zalx = log(px)
248 !
249 zalpha = px + 0.25
250 IF ( px<0.25 ) zalpha = log(0.5)/zalx
251 !
252 zsga = 1.
253 IF ( pa<0. ) zsga = -zsga
254 !
255 zae = pa
256 zap1 = pa + 1.
257 zaep1 = zap1
258 !
259 jma = int(0.5-pa)
260 zfma = float(jma)
261 zaeps = pa + zfma
262 zaaeps = abs(zaeps)
263 !
264 zsgae = 1.
265 IF (zaeps<0.) zsgae = -zsgae
266 !
267 ! EVALUATION OF THE LOGARITHM OF THE ABSOLUTE VALUE OF
268 ! GAMMA(A+1.) AND DETERMINATION OF THE SIGN OF GAMMA(A+1.)
269 !
270 zalgp1 = 0.
271 zsgga = 1.
272 !
273 IF (jma>0 .AND. zaeps/=0.) THEN
274 
275  zsgga = zsgae
276  IF ( jma==2*(jma/2) ) zsgga = -zsgga
277  zalgp1 = dlga(zaeps+1.) - log(zaaeps)
278 
279  IF (jma/=1) THEN
280  zalgp1 = zalgp1 + dlga(1.-zaeps) - dlga(zfma-zaeps)
281  ENDIF
282 
283 ELSEIF ( jma<=0 ) THEN
284  !10 deb
285  zalgp1 = dlga(zap1)
286  ! 10 end
287 ENDIF
288 !
289 ! 20 deb
290 zalgep1 = zalgp1
291 !
292 !Map:
293 ! PA<=ZALPHA
294 ! !
295 ! PX>1.5
296 ! PA <0., ==0., >0.
297 ! RETURN
298 ! !
299 ! PA<-0.5
300 ! PX<0.25 .AND. ZAE>ZALPHA
301 ! ELSE
302 ! !
303 ! PA <0.5
304 ! ELSE
305 ! !
306 ! CODE120
307 ! PA <0., ==0., >0.
308 ! RETURN
309 ! !
310 ! PA>ZALPHA
311 !
312 ! 60 deb
313 IF ( pa<=zalpha ) THEN
314  !
315  IF ( px>1.5 ) THEN
316  !
317  ! EVALUATION OF G(A,X) FOR X.GT.1.5 AND A.LE.ALPHA(X) BY
318  ! MEANS OF THE LEGENDRE CONTINUED FRACTION
319  !
320  !240 deb
321  pgstar = 1.
322  zxpa = px + 1. - pa
323  zxma = px - 1. - pa
324  zp = 0.
325  zq = zxpa*zxma
326  zr = 4.*zxpa
327  zs = -pa + 1.
328  zterm = 1.
329  zsumm = 1.
330  zrho = 0.
331  !
332  DO jk = 1,600
333  !
334  zp = zp + zs
335  zq = zq + zr
336  zr = zr + 8.
337  zs = zs + 2.
338  zt = zp*(1.+zrho)
339  zrho = zt/(zq-zt)
340  zterm = zrho*zterm
341  zsumm = zsumm + zterm
342  !
343  IF ( abs(zterm)<=zeps*zsumm ) EXIT
344  !
345  IF ( jk==600 ) THEN
346  ! 330 deb
347  kflg = 6
348  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
349  RETURN
350  ! 330 end
351  ENDIF
352  !
353  ENDDO
354  !
355  IF ( pa<0. ) THEN
356  !
357  ! 260 deb
358  pg = zsumm/zxpa
359  zalg = log(pg)
360  ! 260 end
361  !
362  ! EVALUATION OF GSTAR(A,X) IN TERMS OF G(A,X)
363  ! 200 deb (200 est la fin de 180)
364  CALL code200(jma, px, pa, zaeps, zsga, zsgga, zaa, zalx, &
365  zalg, zalgp1, zainf, pgstar, kflgst, gret)
366  !
367  IF ( gret ) THEN
368  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
369  RETURN
370  ENDIF
371  !
372  ELSEIF ( pa==0. ) THEN
373  !
374  ! 270 deb
375  pg = zsumm/zxpa
376  ! 270 end
377  !
378  ELSEIF ( pa>0. ) THEN
379  !
380  ! 280 deb
381  zalg = pa*zalx - px + log(pa*zsumm/zxpa) - zalgp1
382  !
383  IF ( zalg<=xbot ) THEN
384  ! 300 deb
385  kflg = 4
386  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
387  RETURN
388  ! 300 end
389  ENDIF
390  !
391  pg = exp(zalg)
392  pgstar = 1. - pg
393  ! 280 end
394  !
395  ENDIF
396  !
397  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
398  RETURN
399  !
400  ENDIF ! end PX>1.5
401  !
402  !
403  IF ( pa<-0.5 ) THEN
404  !
405  ! RECURSIVE EVALUATION OF G(A,X) FOR X.LE.1.5 AND A.LT.-.5
406  !
407  ! 170 deb
408  ji = 1
409  zae = zaeps
410  zaep1 = zaeps + 1.
411  ! 170 end
412  !
413  IF ( px<0.25 .AND. zae>zalpha ) THEN
414  !
415  ! 210 deb
416  ji = 2
417  zalgep1 = dlga(zaep1)
418  !
419  ! EVALUATION OF GSTAR(A,X) FOR A.GT.ALPHA(X) BY TAYLOR
420  ! EXPANSION
421  !
422  CALL code220(px,zae,zalx,zalgep1,zeps,pg,pgstar,kflgst,gret)
423  !
424  IF ( gret ) THEN
425  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
426  RETURN
427  ENDIF
428  !
429  pg = pg*exp(zalgep1)/zae
430  ! 210 end (220 230)
431  !
432  ! 180 deb
433  CALL code180(jma, px, pa, zae, zaeps, zsga, zsgga, zaa, zalx, &
434  zalgp1, zainf, pg, pgstar, kflgst, gret)
435  !
436  IF ( gret ) THEN
437  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
438  RETURN
439  ENDIF
440  !
441  ENDIF ! PX<0.25 .AND. ZAE>ZALPHA
442  !
443  ELSE ! end PA < -0.5
444  !
445  ! DIRECT EVALUATION OF G(A,X) AND GSTAR(A,X) FOR X.LE.1.5
446  ! AND -.5.LE.A.LE.ALPHA(X)
447  !
448  pgstar = 1.
449  !
450  ENDIF
451  !
452  IF ( pa<0.5 ) THEN
453  !
454  ! 70 deb
455  zsumm = xc(29)
456  !
457  DO jk = 1,28
458  jk1 = 29 - jk
459  zsumm = zae*zsumm + xc(jk1)
460  ENDDO
461  !
462  zga = -zsumm / (1.+zae*zsumm)
463  zy = zae*zalx
464  !
465  IF ( abs(zy)<1. ) THEN
466  !
467  zsumm = 1.
468  zterm = 1.
469  !
470  DO jk = 1,600
471  !
472  zterm = zy * zterm / jk
473  zsumm = zsumm + zterm
474  !
475  IF ( abs(zterm)<=zeps1*zsumm ) EXIT
476  !
477  IF ( jk==600) THEN
478  kflg = 6
479  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
480  RETURN
481  ENDIF
482  !
483  ENDDO
484  !
485  zu = zga - zsumm*zalx
486  ! 70 end
487  !
488  ELSE
489  !
490  ! 100 deb
491  zu = zga - (exp(zy)-1.)/zae
492  ! 100 end
493  !
494  ENDIF
495  !
496  ELSE
497  !
498  ! 110 deb
499  ztemp = dlga(pa*1.)
500  zu = dexp(ztemp) - (px**pa)/pa
501  ! 110 end
502  !
503  ENDIF
504  !
505  ! 120 deb
506  zp = zae*px
507  zq = zaep1
508  zr = zae + 3.
509  zterm = 1.
510  zsumm = 1.
511  !
512  DO jk = 1,600
513  !
514  zp = zp + px
515  zq = zq + zr
516  zr = zr + 2.
517  zterm = -zp * zterm / zq
518  zsumm = zsumm + zterm
519  !
520  IF ( abs(zterm)<=zeps1*zsumm ) EXIT
521  !
522  IF ( jk==600) THEN
523  kflg = 6
524  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
525  RETURN
526  !
527  ENDIF
528  !
529  ENDDO
530  !
531  zv = (px**zaep1) * zsumm / zaep1
532  pg = zu + zv
533  !
534  IF (ji==1) THEN
535  !
536  ! 180 deb
537  CALL code180(jma, px, pa, zae, zaeps, zsga, zsgga, zaa, zalx, &
538  zalgp1, zainf, pg, pgstar, kflgst, gret)
539  !
540  IF ( gret ) THEN
541  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
542  RETURN
543  ENDIF
544  !
545  ENDIF
546  !
547  IF (pa<0.) THEN
548  !
549  zt = exp(px) * px**(-pa)
550  pg = zt * pg
551  pgstar = 1. - pa * pg * dexp(-zalgp1) / zt
552  !
553  ELSEIF (pa==0.) THEN
554  !
555  pg = exp(px)*pg
556  !
557  ELSEIF (pa>0.) THEN
558  !
559  pg = pa*pg*exp(-zalgp1)
560  pgstar = 1. - pg
561  !
562  ENDIF
563  !
564  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
565  RETURN
566  ! 120 end
567  !
568 ENDIF
569 !
570 ! EVALUATION OF GSTAR(A,X) FOR A.GT.ALPHA(X) BY TAYLOR
571 ! EXPANSION
572 !
573 ! PA > ZALPHA : 220 deb
574  CALL code220(px,zae,zalx,zalgep1,zeps,pg,pgstar,kflgst,gret)
575 !
576 IF ( gret .OR. ji/=2) THEN
577  IF (lhook) CALL dr_hook('DGAM',1,zhook_handle)
578  RETURN
579 ENDIF
580 !
581 pg = pg*exp(zalgep1)/zae
582 ! 220 230 end
583 !
584 ! 180 deb
585 ! 180 deb
586  CALL code180(jma, px, pa, zae, zaeps, zsga, zsgga, zaa, zalx, &
587  zalgp1, zainf, pg, pgstar, kflgst, gret)
588 !
589 CONTAINS
590 !
591 !
592 SUBROUTINE code220(PX,PAE,PALX,PALGEP1,PEPS,PG,PGSTAR,KFLGST,ORET)
593 !
594 IMPLICIT NONE
595 !
596 REAL, INTENT(IN) :: PX
597 REAL, INTENT(IN) :: PAE
598 REAL, INTENT(IN) :: PALX
599 REAL, INTENT(IN) :: PALGEP1
600 REAL, INTENT(IN) :: PEPS
601 REAL, INTENT(OUT) :: PG
602 REAL, INTENT(INOUT) :: PGSTAR
603 INTEGER, INTENT(INOUT) :: KFLGST
604 LOGICAL, INTENT(OUT) :: ORET
605 !
606 REAL :: ZTERM, ZSUMM, ZALGS
607 INTEGER :: JK
608 REAL(KIND=JPRB) :: ZHOOK_HANDLE
609 !
610 IF (lhook) CALL dr_hook('DGAM:CODE220',0,zhook_handle)
611 !
612 ! 220 deb
613 pg = 1.
614 zterm = 1.
615 zsumm = 1.
616 !
617 DO jk = 1,600
618  !
619  zterm = px*zterm/(pae+jk)
620  zsumm = zsumm + zterm
621  IF (abs(zterm)<=peps*zsumm) EXIT
622  !
623  IF ( jk==600 ) THEN
624  kflgst = 6
625  IF (lhook) CALL dr_hook('DGAM:CODE220',1,zhook_handle)
626  RETURN
627  ENDIF
628  !
629 ENDDO
630 !
631 zalgs = pae*palx - px + log(zsumm) - palgep1
632 !
633 IF ( zalgs<=xbot ) THEN
634  kflgst = 4
635  IF (lhook) CALL dr_hook('DGAM:CODE220',1,zhook_handle)
636  RETURN
637 ENDIF
638 !
639 pgstar = exp(zalgs)
640 pg = 1. - pgstar
641 !
642 IF (lhook) CALL dr_hook('DGAM:CODE220',1,zhook_handle)
643 !
644 END SUBROUTINE code220
645 !
646 !
647 SUBROUTINE code200(KMA, PX, PA, PAEPS, PSGA, PSGGA, PAA, PALX, &
648  PALG, PALGP1, PAINF, PGSTAR, KFLGST, ORET)
649 !
650 IMPLICIT NONE
651 !
652 INTEGER, INTENT(IN) :: KMA
653 REAL, INTENT(IN) :: PX
654 REAL, INTENT(IN) :: PA
655 REAL, INTENT(IN) :: PAEPS
656 REAL, INTENT(IN) :: PSGA
657 REAL, INTENT(IN) :: PSGGA
658 REAL, INTENT(IN) :: PAA
659 REAL, INTENT(IN) :: PALX
660 REAL, INTENT(IN) :: PALG
661 REAL, INTENT(IN) :: PALGP1
662 REAL, INTENT(IN) :: PAINF
663 REAL, INTENT(OUT) :: PGSTAR
664 INTEGER, INTENT(INOUT) :: KFLGST
665 LOGICAL, INTENT(OUT) :: ORET
666 !
667 REAL :: ZSGT, ZT
668 INTEGER :: JK
669 !
670 REAL(KIND=JPRB) :: ZHOOK_HANDLE
671 !
672 IF (lhook) CALL dr_hook('DGAM:CODE200',0,zhook_handle)
673 !
674 oret = .false.
675 !
676 ! EVALUATION OF GSTAR(A,X) IN TERMS OF G(A,X)
677 !
678 pgstar = 1.
679 !
680 IF ( kma>=0 .AND. paeps==0. ) THEN
681  oret = .true.
682  IF ( lhook ) CALL dr_hook('DGAM:CODE200',1,zhook_handle)
683  RETURN
684 ENDIF
685 !
686 zsgt = psga*psgga
687 zt = log(paa) - px + pa*palx + palg - palgp1
688 !
689 IF ( zt<-xalprec .OR. zt>=xtop ) THEN
690  !
691  IF ( zt>=xtop ) THEN
692  kflgst = 5
693  pgstar = -zsgt*painf
694  ENDIF
695  !
696  oret = .true.
697  IF ( lhook ) CALL dr_hook('DGAM:CODE200',1,zhook_handle)
698  RETURN
699  !
700 ENDIF
701 !
702 pgstar = 1. - zsgt*exp(zt)
703 !
704 IF (lhook) CALL dr_hook('DGAM:CODE200',1,zhook_handle)
705 !
706 END SUBROUTINE code200
707 !
708 !
709 SUBROUTINE code180(KMA, PX, PA, PAE, PAEPS, PSGA, PSGGA, PAA, PALX, &
710  PALGP1, PAINF, PG, PGSTAR, KFLGST, ORET)
711 !
712 IMPLICIT NONE
713 !
714 INTEGER, INTENT(IN) :: KMA
715 REAL, INTENT(IN) :: PX
716 REAL, INTENT(IN) :: PA
717 REAL, INTENT(IN) :: PAE
718 REAL, INTENT(IN) :: PAEPS
719 REAL, INTENT(IN) :: PSGA
720 REAL, INTENT(IN) :: PSGGA
721 REAL, INTENT(IN) :: PAA
722 REAL, INTENT(IN) :: PALX
723 REAL, INTENT(IN) :: PALGP1
724 REAL, INTENT(IN) :: PAINF
725 REAL, INTENT(INOUT) :: PG
726 REAL, INTENT(OUT) :: PGSTAR
727 INTEGER, INTENT(INOUT) :: KFLGST
728 LOGICAL, INTENT(OUT) :: ORET
729 !
730 REAL :: ZALG
731 INTEGER :: JK
732 !
733 REAL(KIND=JPRB) :: ZHOOK_HANDLE
734 !
735 IF (lhook) CALL dr_hook('DGAM:CODE180',0,zhook_handle)
736 !
737 pg = pg*exp(px)*px**(-pae)
738 !
739 DO jk = 1,kma
740  pg = (1.-px*pg)/(jk-pae)
741 ENDDO
742 !
743 zalg = log(pg)
744 !
745 ! EVALUATION OF GSTAR(A,X) IN TERMS OF G(A,X)
746 !
747  CALL code200(kma, px, pa, paeps, psga, psgga, paa, palx, &
748  zalg, palgp1, painf, &
749  pgstar, kflgst, oret)
750 !
751 IF (lhook) CALL dr_hook('DGAM:CODE180',1,zhook_handle)
752 !
753 END SUBROUTINE code180
754 !
755 !
756 FUNCTION dlga(PDX) RESULT(PDLGAR)
758 USE yomhook ,ONLY : lhook, dr_hook
759 USE parkind1 ,ONLY : jprb
760 
761 IMPLICIT NONE
762 
763 REAL :: PDLGAR
764 !
765 REAL, INTENT(IN) :: PDX
766 !
767 REAL :: ZDC, ZDP, ZDY, ZDT, ZDS
768 !
769 REAL,DIMENSION(8),PARAMETER :: &
770  XDBNUM=(/-3617., 1., -691., 1., -1., 1., -1., 1./)
771 REAL,DIMENSION(8),PARAMETER :: &
772  XDBDEN=(/122400., 156., 360360., 1188., 1680., 1260., 360. , 12./)
773 !
774 REAL(KIND=JPRB) :: ZHOOK_HANDLE
775 
776 IF (lhook) CALL dr_hook('DGAMM:DLGA',0,zhook_handle)
777 
778 zdc = 0.5*log(8.*atan(1.))
779 zdp = 1.
780 zdy = pdx
781 zy = zdy
782 !
783 ! THE CONDITIONAL CLAUSE IN THE NEXT STATEMENT EXPRESSES THE
784 ! INEQUALITY Y.GT.EXP(.121189*DPREC+.053905), WHERE DPREC IS THE
785 ! NUMBER OF DECIMAL DIGITS CARRIED IN REAL*8 FLOATING-POINT
786 ! ARITHMETIC.
787 !
788 !RJ-remark this magic number is for 53 significant bit prec only +/-!!!!
789 DO WHILE ( zy<=35.027 )
790  zdp = zdy*zdp
791  zdy = zdy + 1.
792  zy = zdy
793 ENDDO
794 !
795 zdt = 1./(zdy*zdy)
796 zds = 43867./244188.
797 !
798 DO ji=1,8
799  zds = zdt*zds + xdbnum(ji)/xdbden(ji)
800 ENDDO
801 !
802 pdlgar = (zdy-0.5)*log(zdy) - zdy + zdc + zds/zdy - log(zdp)
803 !
804 IF (lhook) CALL dr_hook('DGAMM:DLGA',1,zhook_handle)
805 !
806 END FUNCTION dlga
807 
808 END SUBROUTINE dgam
subroutine code220(PX, PAE, PALX, PALGEP1, PEPS, PG, PGSTAR, KFLGST, ORET)
Definition: dgam.F90:593
subroutine code180(KMA, PX, PA, PAE, PAEPS, PSGA, PSGGA, PAA, PALX, PALGP1, PAINF, PG, PGSTAR, KFLGST, ORET)
Definition: dgam.F90:711
real function dlga(PDX)
Definition: dgam.F90:757
integer, parameter jprb
Definition: parkind1.F90:32
subroutine code200(KMA, PX, PA, PAEPS, PSGA, PSGGA, PAA, PALX, PALG, PALGP1, PAINF, PGSTAR, KFLGST, ORET)
Definition: dgam.F90:649
logical lhook
Definition: yomhook.F90:15
subroutine dgam(PA, PX, PACC, PG, PGSTAR, KFLG, KFLGST)
Definition: dgam.F90:132