131 SUBROUTINE dgam(PA, PX, PACC, PG, PGSTAR, KFLG, KFLGST)
140 REAL,
INTENT(IN) :: PA, PX, PACC
141 REAL,
INTENT(OUT) :: PG, PGSTAR
142 INTEGER,
INTENT(OUT) :: KFLG, KFLGST
144 REAL,
PARAMETER :: XALPREC=digits(1.)*log(2.), &
145 xtop=log10(huge(1.)), xbot=log10(tiny(1.))
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
156 INTEGER :: JI, JK, JK1, JMA
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, &
191 REAL(KIND=JPRB) :: ZHOOK_HANDLE
244 zeps = 0.5*10.**(-pacc)
250 IF ( px<0.25 ) zalpha = log(0.5)/zalx
253 IF ( pa<0. ) zsga = -zsga
265 IF (zaeps<0.) zsgae = -zsgae
273 IF (jma>0 .AND. zaeps/=0.)
THEN 276 IF ( jma==2*(jma/2) ) zsgga = -zsgga
277 zalgp1 =
dlga(zaeps+1.) - log(zaaeps)
280 zalgp1 = zalgp1 +
dlga(1.-zaeps) -
dlga(zfma-zaeps)
283 ELSEIF ( jma<=0 )
THEN 313 IF ( pa<=zalpha )
THEN 341 zsumm = zsumm + zterm
343 IF ( abs(zterm)<=zeps*zsumm )
EXIT 364 CALL code200(jma, px, pa, zaeps, zsga, zsgga, zaa, zalx, &
365 zalg, zalgp1, zainf, pgstar, kflgst, gret)
372 ELSEIF ( pa==0. )
THEN 378 ELSEIF ( pa>0. )
THEN 381 zalg = pa*zalx - px + log(pa*zsumm/zxpa) - zalgp1
383 IF ( zalg<=xbot )
THEN 413 IF ( px<0.25 .AND. zae>zalpha )
THEN 417 zalgep1 =
dlga(zaep1)
422 CALL code220(px,zae,zalx,zalgep1,zeps,pg,pgstar,kflgst,gret)
429 pg = pg*exp(zalgep1)/zae
433 CALL code180(jma, px, pa, zae, zaeps, zsga, zsgga, zaa, zalx, &
434 zalgp1, zainf, pg, pgstar, kflgst, gret)
459 zsumm = zae*zsumm + xc(jk1)
462 zga = -zsumm / (1.+zae*zsumm)
465 IF ( abs(zy)<1. )
THEN 472 zterm = zy * zterm / jk
473 zsumm = zsumm + zterm
475 IF ( abs(zterm)<=zeps1*zsumm )
EXIT 485 zu = zga - zsumm*zalx
491 zu = zga - (exp(zy)-1.)/zae
500 zu = dexp(ztemp) - (px**pa)/pa
517 zterm = -zp * zterm / zq
518 zsumm = zsumm + zterm
520 IF ( abs(zterm)<=zeps1*zsumm )
EXIT 531 zv = (px**zaep1) * zsumm / zaep1
537 CALL code180(jma, px, pa, zae, zaeps, zsga, zsgga, zaa, zalx, &
538 zalgp1, zainf, pg, pgstar, kflgst, gret)
549 zt = exp(px) * px**(-pa)
551 pgstar = 1. - pa * pg * dexp(-zalgp1) / zt
559 pg = pa*pg*exp(-zalgp1)
574 CALL code220(px,zae,zalx,zalgep1,zeps,pg,pgstar,kflgst,gret)
576 IF ( gret .OR. ji/=2)
THEN 581 pg = pg*exp(zalgep1)/zae
586 CALL code180(jma, px, pa, zae, zaeps, zsga, zsgga, zaa, zalx, &
587 zalgp1, zainf, pg, pgstar, kflgst, gret)
592 SUBROUTINE code220(PX,PAE,PALX,PALGEP1,PEPS,PG,PGSTAR,KFLGST,ORET)
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
606 REAL :: ZTERM, ZSUMM, ZALGS
608 REAL(KIND=JPRB) :: ZHOOK_HANDLE
619 zterm = px*zterm/(pae+jk)
620 zsumm = zsumm + zterm
621 IF (abs(zterm)<=peps*zsumm)
EXIT 631 zalgs = pae*palx - px + log(zsumm) - palgep1
633 IF ( zalgs<=xbot )
THEN 647 SUBROUTINE code200(KMA, PX, PA, PAEPS, PSGA, PSGGA, PAA, PALX, &
648 PALG, PALGP1, PAINF, PGSTAR, KFLGST, ORET)
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
670 REAL(KIND=JPRB) :: ZHOOK_HANDLE
680 IF ( kma>=0 .AND. paeps==0. )
THEN 682 IF (
lhook )
CALL dr_hook(
'DGAM:CODE200',1,zhook_handle)
687 zt = log(paa) - px + pa*palx + palg - palgp1
689 IF ( zt<-xalprec .OR. zt>=xtop )
THEN 697 IF (
lhook )
CALL dr_hook(
'DGAM:CODE200',1,zhook_handle)
702 pgstar = 1. - zsgt*exp(zt)
709 SUBROUTINE code180(KMA, PX, PA, PAE, PAEPS, PSGA, PSGGA, PAA, PALX, &
710 PALGP1, PAINF, PG, PGSTAR, KFLGST, ORET)
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
733 REAL(KIND=JPRB) :: ZHOOK_HANDLE
737 pg = pg*exp(px)*px**(-pae)
740 pg = (1.-px*pg)/(jk-pae)
747 CALL code200(kma, px, pa, paeps, psga, psgga, paa, palx, &
748 zalg, palgp1, painf, &
749 pgstar, kflgst, oret)
756 FUNCTION dlga(PDX)
RESULT(PDLGAR)
765 REAL,
INTENT(IN) :: PDX
767 REAL :: ZDC, ZDP, ZDY, ZDT, ZDS
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./)
774 REAL(KIND=JPRB) :: ZHOOK_HANDLE
778 zdc = 0.5*log(8.*atan(1.))
789 DO WHILE ( zy<=35.027 )
799 zds = zdt*zds + xdbnum(ji)/xdbden(ji)
802 pdlgar = (zdy-0.5)*log(zdy) - zdy + zdc + zds/zdy - log(zdp)
subroutine code220(PX, PAE, PALX, PALGEP1, PEPS, PG, PGSTAR, KFLGST, ORET)
subroutine code180(KMA, PX, PA, PAE, PAEPS, PSGA, PSGGA, PAA, PALX, PALGP1, PAINF, PG, PGSTAR, KFLGST, ORET)
subroutine code200(KMA, PX, PA, PAEPS, PSGA, PSGGA, PAA, PALX, PALG, PALGP1, PAINF, PGSTAR, KFLGST, ORET)
subroutine dgam(PA, PX, PACC, PG, PGSTAR, KFLG, KFLGST)