1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
subroutine fmc11a(a,n,z,sig,w,ir,mk,eps)
implicit double precision (a-h,o-z)
dimension a(*),z(n),w(n)
c update factors given in a by sig*z*ztranspose
if(n.gt.1)goto1
a(1)=a(1)+sig *z(1)**2
ir=1
if(a(1).gt.0.d0)return
a(1)=0.d0
ir=0
return
1 continue
np=n+1
if(sig.gt.0.d0)goto40
if(sig.eq.0.d0.or.ir.eq.0)return
ti=1.d0/sig
ij=1
if(mk.eq.0)goto10
do 7 i=1,n
if(a(ij).ne.0.d0)ti=ti+w(i)**2/a(ij)
7 ij=ij+np-i
goto20
10 continue
do 11 i=1,n
11 w(i)=z(i)
do 15 i=1,n
ip=i+1
v=w(i)
if(a(ij).gt.0.d0)goto12
w(i)=0.d0
ij=ij+np-i
goto15
12 continue
ti=ti+v**2/a(ij)
if(i.eq.n)goto14
do 13 j=ip,n
ij=ij+1
13 w(j)=w(j)-v*a(ij)
14 ij=ij+1
15 continue
20 continue
if(ir.le.0 )goto21
if(ti.gt.0.d0)goto22
if(mk-1)40,40,23
21 ti=0.d0
ir=-ir-1
goto23
22 ti=eps/sig
if(eps.eq.0.d0)ir=ir-1
23 continue
mm=1
tim=ti
do 30 i=1,n
j=np-i
ij=ij-i
if(a(ij).ne.0.d0)tim=ti-w(j)**2/a(ij)
w(j)=ti
30 ti=tim
goto41
40 continue
mm=0
tim=1.d0/sig
41 continue
ij=1
do 66 i=1,n
ip=i+1
v=z(i)
if(a(ij).gt.0.d0)goto53
if(ir.gt.0 .or.sig.lt.0.d0.or.v.eq.0.d0)goto52
ir=1-ir
a(ij)=v**2/tim
if(i.eq.n)return
do 51 j=ip,n
ij=ij+1
51 a(ij)=z(j)/v
return
52 continue
ti=tim
ij=ij+np-i
goto66
53 continue
al=v/a(ij)
if(mm)54,54,55
54 ti=tim+v*al
goto56
55 ti=w(i)
56 continue
r=ti/tim
a(ij)=a(ij)*r
if(r.eq.0.d0)goto70
if(i.eq.n)goto70
b=al/ti
if(r.gt.4.d0)goto62
do 61 j=ip,n
ij=ij+1
z(j)=z(j)-v*a(ij)
61 a(ij)=a(ij)+b*z(j)
goto64
62 gm=tim/ti
do 63 j=ip,n
ij=ij+1
y=a(ij)
a(ij)=b*z(j)+y*gm
63 z(j)=z(j)-v*y
64 continue
tim=ti
ij=ij+1
66 continue
70 continue
if(ir.lt.0)ir=-ir
return
end
|