00001 subroutine qelg(n,epstab,result,abserr,res3la,nres)
00002
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 real abserr,delta1,delta2,delta3,r1mach,
00052 * epmach,epsinf,epstab,error,err1,err2,err3,e0,e1,e1abs,e2,e3,
00053 * oflow,res,result,res3la,ss,tol1,tol2,tol3
00054 integer i,ib,ib2,ie,indx,k1,k2,k3,limexp,n,newelm,nres,num
00055 dimension epstab(52),res3la(3)
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 epmach = r1mach(4)
00083 oflow = r1mach(2)
00084 nres = nres+1
00085 abserr = oflow
00086 result = epstab(n)
00087 if(n.lt.3) go to 100
00088 limexp = 50
00089 epstab(n+2) = epstab(n)
00090 newelm = (n-1)/2
00091 epstab(n) = oflow
00092 num = n
00093 k1 = n
00094 do 40 i = 1,newelm
00095 k2 = k1-1
00096 k3 = k1-2
00097 res = epstab(k1+2)
00098 e0 = epstab(k3)
00099 e1 = epstab(k2)
00100 e2 = res
00101 e1abs = abs(e1)
00102 delta2 = e2-e1
00103 err2 = abs(delta2)
00104 tol2 = amax1(abs(e2),e1abs)*epmach
00105 delta3 = e1-e0
00106 err3 = abs(delta3)
00107 tol3 = amax1(e1abs,abs(e0))*epmach
00108 if(err2.gt.tol2.or.err3.gt.tol3) go to 10
00109
00110
00111
00112
00113
00114
00115 result = res
00116 abserr = err2+err3
00117
00118 go to 100
00119 10 e3 = epstab(k1)
00120 epstab(k1) = e1
00121 delta1 = e1-e3
00122 err1 = abs(delta1)
00123 tol1 = amax1(e1abs,abs(e3))*epmach
00124
00125
00126
00127
00128 if(err1.le.tol1.or.err2.le.tol2.or.err3.le.tol3) go to 20
00129 ss = 0.1e+01/delta1+0.1e+01/delta2-0.1e+01/delta3
00130 epsinf = abs(ss*e1)
00131
00132
00133
00134
00135
00136 if(epsinf.gt.0.1e-03) go to 30
00137 20 n = i+i-1
00138
00139 go to 50
00140
00141
00142
00143
00144 30 res = e1+0.1e+01/ss
00145 epstab(k1) = res
00146 k1 = k1-2
00147 error = err2+abs(res-e2)+err3
00148 if(error.gt.abserr) go to 40
00149 abserr = error
00150 result = res
00151 40 continue
00152
00153
00154
00155 50 if(n.eq.limexp) n = 2*(limexp/2)-1
00156 ib = 1
00157 if((num/2)*2.eq.num) ib = 2
00158 ie = newelm+1
00159 do 60 i=1,ie
00160 ib2 = ib+2
00161 epstab(ib) = epstab(ib2)
00162 ib = ib2
00163 60 continue
00164 if(num.eq.n) go to 80
00165 indx = num-n+1
00166 do 70 i = 1,n
00167 epstab(i)= epstab(indx)
00168 indx = indx+1
00169 70 continue
00170 80 if(nres.ge.4) go to 90
00171 res3la(nres) = result
00172 abserr = oflow
00173 go to 100
00174
00175
00176
00177 90 abserr = abs(result-res3la(3))+abs(result-res3la(2))
00178 * +abs(result-res3la(1))
00179 res3la(1) = res3la(2)
00180 res3la(2) = res3la(3)
00181 res3la(3) = result
00182 100 abserr = amax1(abserr,0.5e+01*epmach*abs(result))
00183 return
00184 end