00001 SUBROUTINE DQK15I(F,BOUN,INF,A,B,RESULT,ABSERR,RESABS,RESASC,
00002 1 IERR)
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 DOUBLE PRECISION A,ABSC,ABSC1,ABSC2,ABSERR,B,BOUN,CENTR,DABS,DINF,
00073 * DMAX1,DMIN1,D1MACH,EPMACH,FC,FSUM,FVAL1,FVAL2,FV1,FV2,HLGTH,
00074 * RESABS,RESASC,RESG,RESK,RESKH,RESULT,TABSC1,TABSC2,UFLOW,WG,WGK,
00075 * XGK,FVALT
00076 INTEGER INF,J
00077 EXTERNAL F
00078
00079 DIMENSION FV1(7),FV2(7),XGK(8),WGK(8),WG(8)
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 DATA WG(1) / 0.0D0 /
00098 DATA WG(2) / 0.1294849661 6886969327 0611432679 082D0 /
00099 DATA WG(3) / 0.0D0 /
00100 DATA WG(4) / 0.2797053914 8927666790 1467771423 780D0 /
00101 DATA WG(5) / 0.0D0 /
00102 DATA WG(6) / 0.3818300505 0511894495 0369775488 975D0 /
00103 DATA WG(7) / 0.0D0 /
00104 DATA WG(8) / 0.4179591836 7346938775 5102040816 327D0 /
00105
00106 DATA XGK(1) / 0.9914553711 2081263920 6854697526 329D0 /
00107 DATA XGK(2) / 0.9491079123 4275852452 6189684047 851D0 /
00108 DATA XGK(3) / 0.8648644233 5976907278 9712788640 926D0 /
00109 DATA XGK(4) / 0.7415311855 9939443986 3864773280 788D0 /
00110 DATA XGK(5) / 0.5860872354 6769113029 4144838258 730D0 /
00111 DATA XGK(6) / 0.4058451513 7739716690 6606412076 961D0 /
00112 DATA XGK(7) / 0.2077849550 0789846760 0689403773 245D0 /
00113 DATA XGK(8) / 0.0000000000 0000000000 0000000000 000D0 /
00114
00115 DATA WGK(1) / 0.0229353220 1052922496 3732008058 970D0 /
00116 DATA WGK(2) / 0.0630920926 2997855329 0700663189 204D0 /
00117 DATA WGK(3) / 0.1047900103 2225018383 9876322541 518D0 /
00118 DATA WGK(4) / 0.1406532597 1552591874 5189590510 238D0 /
00119 DATA WGK(5) / 0.1690047266 3926790282 6583426598 550D0 /
00120 DATA WGK(6) / 0.1903505780 6478540991 3256402421 014D0 /
00121 DATA WGK(7) / 0.2044329400 7529889241 4161999234 649D0 /
00122 DATA WGK(8) / 0.2094821410 8472782801 2999174891 714D0 /
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 EPMACH = D1MACH(4)
00146 UFLOW = D1MACH(1)
00147 DINF = MIN0(1,INF)
00148
00149 CENTR = 0.5D+00*(A+B)
00150 HLGTH = 0.5D+00*(B-A)
00151 TABSC1 = BOUN+DINF*(0.1D+01-CENTR)/CENTR
00152 IERR = 0
00153 CALL F(TABSC1,IERR,FVAL1)
00154 IF (IERR .LT. 0) RETURN
00155 IF(INF.EQ.2) THEN
00156 CALL F(-TABSC1,IERR,FVALT)
00157 IF (IERR .LT. 0) RETURN
00158 FVAL1 = FVAL1+FVALT
00159 ENDIF
00160 FC = (FVAL1/CENTR)/CENTR
00161
00162
00163
00164
00165 RESG = WG(8)*FC
00166 RESK = WGK(8)*FC
00167 RESABS = DABS(RESK)
00168 DO 10 J=1,7
00169 ABSC = HLGTH*XGK(J)
00170 ABSC1 = CENTR-ABSC
00171 ABSC2 = CENTR+ABSC
00172 TABSC1 = BOUN+DINF*(0.1D+01-ABSC1)/ABSC1
00173 TABSC2 = BOUN+DINF*(0.1D+01-ABSC2)/ABSC2
00174 CALL F(TABSC1,IERR,FVAL1)
00175 IF (IERR .LT. 0) RETURN
00176 CALL F(TABSC2,IERR,FVAL2)
00177 IF (IERR .LT. 0) RETURN
00178 IF(INF.EQ.2) THEN
00179 CALL F(-TABSC1,IERR,FVALT)
00180 IF (IERR .LT. 0) RETURN
00181 FVAL1 = FVAL1+FVALT
00182 ENDIF
00183 IF(INF.EQ.2) THEN
00184 CALL F(-TABSC2,IERR,FVALT)
00185 IF (IERR .LT. 0) RETURN
00186 FVAL2 = FVAL2+FVALT
00187 ENDIF
00188 FVAL1 = (FVAL1/ABSC1)/ABSC1
00189 FVAL2 = (FVAL2/ABSC2)/ABSC2
00190 FV1(J) = FVAL1
00191 FV2(J) = FVAL2
00192 FSUM = FVAL1+FVAL2
00193 RESG = RESG+WG(J)*FSUM
00194 RESK = RESK+WGK(J)*FSUM
00195 RESABS = RESABS+WGK(J)*(DABS(FVAL1)+DABS(FVAL2))
00196 10 CONTINUE
00197 RESKH = RESK*0.5D+00
00198 RESASC = WGK(8)*DABS(FC-RESKH)
00199 DO 20 J=1,7
00200 RESASC = RESASC+WGK(J)*(DABS(FV1(J)-RESKH)+DABS(FV2(J)-RESKH))
00201 20 CONTINUE
00202 RESULT = RESK*HLGTH
00203 RESASC = RESASC*HLGTH
00204 RESABS = RESABS*HLGTH
00205 ABSERR = DABS((RESK-RESG)*HLGTH)
00206 IF(RESASC.NE.0.0D+00.AND.ABSERR.NE.0.D0) ABSERR = RESASC*
00207 * DMIN1(0.1D+01,(0.2D+03*ABSERR/RESASC)**1.5D+00)
00208 IF(RESABS.GT.UFLOW/(0.5D+02*EPMACH)) ABSERR = DMAX1
00209 * ((EPMACH*0.5D+02)*RESABS,ABSERR)
00210 RETURN
00211 END