00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016       SUBROUTINE Mathlib_GausJad(fun,aa,bb,eeps,result)
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026       IMPLICIT NONE
00027 
00028       DOUBLE PRECISION  fun,aa,bb,eeps,result
00029       EXTERNAL fun
00030 
00031       DOUBLE PRECISION  a,b,xplus,sum16,range,sum8,erabs,erela,fminu,xminu
00032       DOUBLE PRECISION  fplus,xmidle,calk8,eps,x1,x2,delta,calk16
00033       INTEGER           iter,ndivi,itermx,k,i
00034       DOUBLE PRECISION  wg(12),xx(12)
00035       DATA wg
00036      $/0.101228536290376d0, 0.222381034453374d0, 0.313706645877887d0,
00037      $ 0.362683783378362d0, 0.027152459411754d0, 0.062253523938648d0,
00038      $ 0.095158511682493d0, 0.124628971255534d0, 0.149595988816577d0,
00039      $ 0.169156519395003d0, 0.182603415044924d0, 0.189450610455069d0/
00040       DATA xx
00041      $/0.960289856497536d0, 0.796666477413627d0, 0.525532409916329d0,
00042      $ 0.183434642495650d0, 0.989400934991650d0, 0.944575023073233d0,
00043      $ 0.865631202387832d0, 0.755404408355003d0, 0.617876244402644d0,
00044      $ 0.458016777657227d0, 0.281603550779259d0, 0.095012509837637d0/
00045       DATA itermx / 15/
00046 
00047       a  = aa
00048       b  = bb
00049       eps= ABS(eeps)
00050       ndivi=1
00051 
00052       DO iter=1,itermx
00053          calk8  =0d0
00054          calk16 =0d0
00055 
00056          DO k = 1,ndivi
00057             delta = (b-a)/ndivi
00058             x1    =  a + (k-1)*delta
00059             x2    =  x1+ delta
00060             xmidle= 0.5d0*(x2+x1)
00061             range = 0.5d0*(x2-x1)
00062             sum8 =0d0
00063             sum16=0d0
00064 
00065             DO i=1,12
00066                xplus= xmidle+range*xx(i)
00067                xminu= xmidle-range*xx(i)
00068                fplus=fun(xplus)
00069                fminu=fun(xminu)
00070                IF(i .LE. 4) THEN
00071                   sum8 =sum8  +(fplus+fminu)*wg(i)/2d0
00072                ELSE
00073                   sum16=sum16 +(fplus+fminu)*wg(i)/2d0
00074                ENDIF
00075             ENDDO
00076             calk8 = calk8 + sum8 *(x2-x1)
00077             calk16= calk16+ sum16*(x2-x1)
00078          ENDDO
00079          erabs = ABS(calk16-calk8)
00080          erela = 0d0
00081          IF(calk16 .NE. 0d0) erela= erabs/ABS(calk16)
00082 
00083 
00084          IF(eeps .GT. 0d0) THEN
00085             IF(erabs .LT.  eps) GOTO 800
00086          ELSE
00087             IF(erela .LT.  eps) GOTO 800
00088          ENDIF
00089          ndivi=ndivi*2
00090       ENDDO
00091       WRITE(*,*) '++++ Mathlib_GausJad: required precision to high!'
00092       WRITE(*,*) '++++ Mathlib_GausJad: eeps,erela,erabs=',eeps,erela,erabs
00093   800 CONTINUE
00094       result = calk16
00095       END
00096 
00097 
00098       DOUBLE PRECISION FUNCTION Mathlib_Gauss(f,a,b,eeps)
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109       IMPLICIT NONE
00110       DOUBLE PRECISION  f,a,b,eeps
00111 
00112       DOUBLE PRECISION  c1,c2,bb,s8,s16,y,aa,const,delta,eps,u
00113       INTEGER           i
00114 
00115       DOUBLE PRECISION  w(12),x(12)
00116       EXTERNAL f
00117       DATA const /1.0d-19/
00118       DATA w
00119      1/0.10122 85362 90376, 0.22238 10344 53374, 0.31370 66458 77887,
00120      2 0.36268 37833 78362, 0.02715 24594 11754, 0.06225 35239 38648,
00121      3 0.09515 85116 82493, 0.12462 89712 55534, 0.14959 59888 16577,
00122      4 0.16915 65193 95003, 0.18260 34150 44924, 0.18945 06104 55069/
00123       DATA x
00124      1/0.96028 98564 97536, 0.79666 64774 13627, 0.52553 24099 16329,
00125      2 0.18343 46424 95650, 0.98940 09349 91650, 0.94457 50230 73233,
00126      3 0.86563 12023 87832, 0.75540 44083 55003, 0.61787 62444 02644,
00127      4 0.45801 67776 57227, 0.28160 35507 79259, 0.09501 25098 37637/
00128 
00129       eps=abs(eeps)
00130       delta=const*abs(a-b)
00131       Mathlib_Gauss=0d0
00132       aa=a
00133     5 y=b-aa
00134       IF(abs(y)  .LE.  delta) RETURN
00135     2 bb=aa+y
00136       c1=0.5d0*(aa+bb)
00137       c2=c1-aa
00138       s8=0d0
00139       s16=0d0
00140       DO 1 i=1,4
00141       u=x(i)*c2
00142     1 s8=s8+w(i)*(f(c1+u)+f(c1-u))
00143       DO 3 i=5,12
00144       u=x(i)*c2
00145     3 s16=s16+w(i)*(f(c1+u)+f(c1-u))
00146       s8=s8*c2
00147       s16=s16*c2
00148       IF(eeps .LT. 0d0) THEN
00149         IF(abs(s16-s8)  .GT.  eps*abs(s16)) GOTO 4
00150       ELSE
00151         IF(abs(s16-s8)  .GT.  eps) GOTO 4
00152       ENDIF
00153       Mathlib_Gauss=Mathlib_Gauss+s16
00154       aa=bb
00155       GOTO 5
00156     4 y=0.5d0*y
00157       IF(abs(y)  .GT.  delta) GOTO 2
00158       WRITE(*,7)
00159       Mathlib_Gauss=0d0
00160       RETURN
00161     7 FORMAT(1x,36hgaus  ... too high accuracy required)
00162       END
00163 
00164 
00165       DOUBLE PRECISION FUNCTION Mathlib_dilogy(x)
00166 
00167 
00168 
00169 
00170 
00171 
00172       IMPLICIT NONE
00173       DOUBLE PRECISION x
00174 
00175       DOUBLE PRECISION a,b,s,t,y,z
00176 
00177       z=-1.644934066848226d0
00178       IF(x  .LT. -1.d0) go to 1
00179       IF(x  .LE.  0.5d0) go to 2
00180       IF(x  .EQ.  1.d0) go to 3
00181       IF(x  .LE.  2.d0) go to 4
00182       z=3.289868133696453d0
00183     1 t=1.d0/x
00184       s=-0.5d0
00185       z=z-0.5d0*dlog(dabs(x))**2
00186       go to 5
00187     2 t=x
00188       s=0.5d0
00189       z=0.d0
00190       go to 5
00191     3 Mathlib_Dilogy=1.644934066848226d0
00192       RETURN
00193     4 t=1.d0-x
00194       s=-0.5d0
00195       z=1.644934066848226d0-dlog(x)*dlog(dabs(t))
00196     5 y=2.666666666666667d0*t+0.666666666666667d0
00197       b=      0.000000000000001d0
00198       a=y*b  +0.000000000000004d0
00199       b=y*a-b+0.000000000000011d0
00200       a=y*b-a+0.000000000000037d0
00201       b=y*a-b+0.000000000000121d0
00202       a=y*b-a+0.000000000000398d0
00203       b=y*a-b+0.000000000001312d0
00204       a=y*b-a+0.000000000004342d0
00205       b=y*a-b+0.000000000014437d0
00206       a=y*b-a+0.000000000048274d0
00207       b=y*a-b+0.000000000162421d0
00208       a=y*b-a+0.000000000550291d0
00209       b=y*a-b+0.000000001879117d0
00210       a=y*b-a+0.000000006474338d0
00211       b=y*a-b+0.000000022536705d0
00212       a=y*b-a+0.000000079387055d0
00213       b=y*a-b+0.000000283575385d0
00214       a=y*b-a+0.000001029904264d0
00215       b=y*a-b+0.000003816329463d0
00216       a=y*b-a+0.000014496300557d0
00217       b=y*a-b+0.000056817822718d0
00218       a=y*b-a+0.000232002196094d0
00219       b=y*a-b+0.001001627496164d0
00220       a=y*b-a+0.004686361959447d0
00221       b=y*a-b+0.024879322924228d0
00222       a=y*b-a+0.166073032927855d0
00223       a=y*a-b+1.935064300869969d0
00224       Mathlib_Dilogy = s*t*(a-b)+z
00225       END
00226 
00227 
00228       DOUBLE PRECISION FUNCTION Mathlib_dpgamm(z)
00229 
00230 
00231 
00232 
00233 
00234       DOUBLE PRECISION z,z1,x,x1,x2,d1,d2,s1,s2,s3,pi,c(20),const
00235       SAVE c,pi,const
00236       DATA c( 1) / 8.3333333333333333333333333332d-02/
00237       DATA c( 2) /-2.7777777777777777777777777777d-03/
00238       DATA c( 3) / 7.9365079365079365079365079364d-04/
00239       DATA c( 4) /-5.9523809523809523809523809523d-04/
00240       DATA c( 5) / 8.4175084175084175084175084175d-04/
00241       DATA c( 6) /-1.9175269175269175269175269175d-03/
00242       DATA c( 7) / 6.4102564102564102564102564102d-03/
00243       DATA c( 8) /-2.9550653594771241830065359477d-02/
00244       DATA c( 9) / 1.7964437236883057316493849001d-01/
00245       DATA c(10) /-1.3924322169059011164274322169d+00/
00246       DATA c(11) / 1.3402864044168391994478951001d+01/
00247       DATA c(12) /-1.5684828462600201730636513245d+02/
00248       DATA c(13) / 2.1931033333333333333333333333d+03/
00249       DATA c(14) /-3.6108771253724989357173265219d+04/
00250       DATA c(15) / 6.9147226885131306710839525077d+05/
00251       DATA c(16) /-1.5238221539407416192283364959d+07/
00252       DATA c(17) / 3.8290075139141414141414141414d+08/
00253       DATA c(18) /-1.0882266035784391089015149165d+10/
00254       DATA c(19) / 3.4732028376500225225225225224d+11/
00255       DATA c(20) /-1.2369602142269274454251710349d+13/
00256       DATA pi    / 3.1415926535897932384626433832d+00/
00257       DATA const / 9.1893853320467274178032973641d-01/
00258       IF(z .GT. 5.75d 1)                                     GOTO  6666
00259       nn = z
00260       IF (z  -  dble(float(nn)))                 3,1,3
00261     1 IF (z     .LE.     0.d 0)                    GOTO 6667
00262       Mathlib_dpgamm = 1.d 0
00263       IF (z     .LE.     2.d 0)                    RETURN
00264       z1 = z
00265     2 z1 = z1  -  1.d 0
00266       Mathlib_dpgamm = Mathlib_dpgamm * z1
00267       IF (z1  -  2.d 0)                          61,61,2
00268     3 IF (dabs(z)     .LT.     1.d-29)             GOTO 60
00269       IF (z     .LT.     0.d 0)                    GOTO 4
00270       x  = z
00271       kk = 1
00272       GOTO 10
00273     4 x  = 1.d 0  -  z
00274       kk = 2
00275    10 x1 = x
00276       IF (x     .GT.     19.d 0)                   GOTO 13
00277       d1 = x
00278    11 x1 = x1  +  1.d 0
00279       IF (x1     .GE.     19.d 0)                  GOTO 12
00280       d1 = d1 * x1
00281       GOTO 11
00282    12 s3 = -dlog(d1)
00283       GOTO 14
00284    13 s3 = 0.d 0
00285    14 d1 = x1 * x1
00286       s1 = (x1  -  5.d-1) * dlog(x1)  -  x1  +  const
00287       DO 20                  k=1,20
00288       s2 = s1  +  c(k)/x1
00289       IF (dabs(s2  -  s1)     .LT.     1.d-28)     GOTO 21
00290       x1 = x1 * d1
00291    20 s1 = s2
00292    21 s3 = s3  +  s2
00293       GOTO (50,22),    kk
00294    22 d2 = dabs(z  -  nn)
00295       d1 = d2 * pi
00296       IF (d1     .LT.     1.d-15)                  GOTO 31
00297    30 x2 =  dlog(pi/dsin(d1))  -  s3
00298       GOTO 40
00299    31 x2 = -dlog(d2)
00300    40 mm = dabs(z)
00301       IF(x2       .GT.       1.74d2)                  GOTO 6666
00302       Mathlib_dpgamm = dexp(x2)
00303       IF (mm    .ne.    (mm/2) * 2)              RETURN
00304       Mathlib_dpgamm = -Mathlib_dpgamm
00305       RETURN
00306    50 IF(s3       .GT.       1.74d2)                  GOTO 6666
00307       Mathlib_dpgamm = dexp(s3)
00308       RETURN
00309  6666 print *, 2000
00310       RETURN
00311  6667 print *, 2001
00312       RETURN
00313    60 Mathlib_dpgamm = 0.d 0
00314       IF(dabs(z)    .LT.    1.d-77)   RETURN
00315       Mathlib_dpgamm = 1.d 0/z
00316    61 RETURN
00317  2000 FORMAT (/////, 2x, 32hdpgamm ..... argument too large., /////)
00318  2001 FORMAT (/////, 2x, 32hdpgamm ..... argument is a pole., /////)
00319       END
00320 
00321 
00322 
00323       SUBROUTINE Mathlib_Gaus8(fun,aa,bb,result)
00324 
00325 
00326 
00327       IMPLICIT NONE
00328       DOUBLE PRECISION  fun,aa,bb,result
00329       EXTERNAL fun
00330       DOUBLE PRECISION  a,b,sum8,xmidle,range,xplus,xminu
00331       INTEGER           k,i
00332       DOUBLE PRECISION  wg(4),xx(4)
00333       DATA wg /0.101228536290376d0, 0.222381034453374d0, 0.313706645877887d0, 0.362683783378362d0/
00334       DATA xx /0.960289856497536d0, 0.796666477413627d0, 0.525532409916329d0, 0.183434642495650d0/
00335 
00336       a  = aa
00337       b  = bb
00338       xmidle= 0.5d0*(a+b)
00339       range = 0.5d0*(b-a)
00340       sum8 =0d0
00341       DO i=1,4
00342          xplus= xmidle+range*xx(i)
00343          xminu= xmidle-range*xx(i)
00344          sum8 =sum8  +(fun(xplus)+fun(xminu))*wg(i)/2d0
00345       ENDDO
00346       result = sum8*(b-a)
00347       END
00348 
00349       SUBROUTINE Mathlib_Gaus16(fun,aa,bb,result)
00350 
00351 
00352 
00353       IMPLICIT NONE
00354       DOUBLE PRECISION  fun,aa,bb,result
00355       EXTERNAL fun
00356       DOUBLE PRECISION  a,b,sum16,xmidle,range,xplus,xminu
00357       INTEGER           k,i
00358       DOUBLE PRECISION  wg(8),xx(8)
00359       DATA wg              /0.027152459411754d0, 0.062253523938648d0,
00360      $ 0.095158511682493d0, 0.124628971255534d0, 0.149595988816577d0,
00361      $ 0.169156519395003d0, 0.182603415044924d0, 0.189450610455069d0/
00362       DATA xx              /0.989400934991650d0, 0.944575023073233d0,
00363      $ 0.865631202387832d0, 0.755404408355003d0, 0.617876244402644d0,
00364      $ 0.458016777657227d0, 0.281603550779259d0, 0.095012509837637d0/
00365 
00366       a  = aa
00367       b  = bb
00368       xmidle= 0.5d0*(a+b)
00369       range = 0.5d0*(b-a)
00370       sum16 =0d0
00371       DO i=1,8
00372          xplus= xmidle+range*xx(i)
00373          xminu= xmidle-range*xx(i)
00374          sum16 =sum16  +(fun(xplus)+fun(xminu))*wg(i)/2d0
00375       ENDDO
00376       result = sum16*(b-a)
00377       END
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385