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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
subroutine onface(nq,tq,tg,ng,nprox,ierr,w)
C!but
C il est question ici de calculer (ou d estimer)
C le polynome (ou point) qui se situe a l'intersection
C de la recherche et de la face-frontiere du domaine.
C!liste d'appel
C subroutine onface(nq,tq,nprox)
C
C double precision tq(0:nq),w(*)
C integer nq,nprox,ierr
C
C Entree :
C - nq. est le degre du polynome q(z) avant toute
C modification.
C - tq. est le tableau de ses coefficients
C - nprox. est l indice de la face par laquelle on estime
C que la recherche a franchi la frontiere du domaine.
C
C Sortie :
C -nq. est alors le degre des polynomes de la face
C traversee et donc du polynome intersection. Sa valeur
C est inferieur de 1 ou 2 a sa valeur precedente.
C - tq. contient en sortie les coefficients du polynome
C intersection dans le domaine de la face traversee.
C
C Tableau de travail
C - w : 12*nq+ng+1
C!
c Copyright INRIA
implicit double precision (a-h,o-y)
dimension tq(0:nq), w(*),tg(ng+1)
C
dimension tps(0:1), taux2(0:2), tabeta(0:2), xx(1)
common /sortie/ io,info,ll
C
C decoupage du tableau de travail
lqaux = 1
lqdot = lqaux
lrq0 = lqdot + nq + 1
lrq1 = lrq0 + nq
lrgd0 = lrq1 + nq
lrgd1 = lrgd0 + nq
lgp = lrgd1 + nq
lgp1 = lgp + 2*nq - 2
lbeta = lgp1
lw = lbeta + 2*nq - 2
lfree = lw+3*nq+ng+1
C
nqvra = nq
C
tps(1) = 1.0d+0
tps(0) = 1.0d+0
C
if (nprox .ne. 0) then
tps(0) = real(nprox)
C calcul du reste de la division de q par tps
call horner(tq,nq,-tps(0),0.0d+0,srq,xx)
C calcul du reste de la division de qdot par 1+z
call feq1(nq,t,tq,tg,ng,w(lqdot),w(lw))
call horner(w(lqdot),nq,-tps(0),0.0d+0,srgd,xx)
C
call daxpy(nq,(-srq)/srgd,w(lqdot),1,tq,1)
C
call dpodiv(tq,tps,nq,1)
if (info .gt. 0) call outl2(70,1,1,xx,xx,x,x)
if (info .gt. 1) call outl2(71,1,1,tq,xx,x,x)
call dcopy(nq,tq(1),1,tq,1)
nq = nq - 1
C
elseif (nprox .eq. 0) then
C
taux2(2) = 1.0d+0
taux2(1) = 0.0d+0
taux2(0) = 1.0d+0
C
call dcopy(nq+1,tq,1,w(lqaux),1)
do 200 ndiv = 0,nq-2
call dpodiv(w(lqaux),taux2,nq-ndiv,2)
w(lrq1+ndiv) = w(lqaux+1)
w(lrq0+ndiv) = w(lqaux)
C
do 180 j = 2,nq-ndiv
w(lqaux+j-1) = w(lqaux+j)
180 continue
w(lqaux) = 0.0d+0
200 continue
w(lrq1-1+nq) = w(lqaux+1)
w(lrq0-1+nq) = w(lqaux)
C
call feq1(nq,t,tq,tg,ng,w(lqaux),w(lw))
nqdot = nq - 1
C
do 240 ndiv = 0,nqdot-2
call dpodiv(w(lqaux),taux2,nqdot-ndiv,2)
w(lrgd1+ndiv) = w(lqaux+1)
w(lrgd0+ndiv) = w(lqaux)
C
do 220 j = 2,nqdot-ndiv
w(lqaux+j-1) = w(lqaux+j)
220 continue
w(lqaux) = 0.0d+0
240 continue
w(lrgd1-1+nqdot) = w(lqaux+1)
w(lrgd0-1+nqdot) = w(lqaux)
C
C - construction du polynome gp(z) dont on cherchera une racine
C comprise entre -2 et +2 -----------------------------
C
call dset(2*nq-2,0.0d+0,w(lgp),1)
call dset(2*nq-2,0.0d+0,w(lgp1),1)
C
do 260 j = 1,nq
do 258 i = 1,nqdot
k = i + j - 2
w(lgp+k) = w(lgp+k) + ((-1)**k)*w(lrq0-1+j)*w(lrgd1-1+i)
w(lgp1+k) = w(lgp1+k) + ((-1)**k)*w(lrq1-1+j)*w(lrgd0-1+i)
258 continue
260 continue
C
call ddif(2*nq-2,w(lgp1),1,w(lgp),1)
ngp = 2*nq - 3
call rootgp(ngp,w(lgp),nbeta,w(lbeta),ierr,w(lw))
if (ierr .ne. 0) return
C
do 299 k = 1,nbeta
C
C - calcul de t (coeff multiplicateur) -
C
auxt1 = 0.0d+0
do 280 i = 1,nq
auxt1 = auxt1 + w(lrq1-1+i)*((-w(lbeta-1+k))**(i-1))
280 continue
C
auxt2 = 0.0d+0
do 290 i = 1,nqdot
auxt2 = auxt2 + w(lrgd1-1+i)*((-w(lbeta-1+k))**(i-1))
290 continue
C
tmult = (-auxt1) / auxt2
C
if (k .eq. 1) then
t0 = tmult
beta0 = w(lbeta)
elseif (abs(tmult) .lt. abs(t0)) then
t0 = tmult
beta0 = w(lbeta-1+k)
endif
C
299 continue
C
call feq1(nq,t,tq,tg,ng,w(lqdot),w(lw))
call daxpy(nq,t0,w(lqdot),1,tq,1)
C
tabeta(2) = 1.0d+0
tabeta(1) = beta0
tabeta(0) = 1.0d+0
call dpodiv(tq,tabeta,nq,2)
if (info .gt. 0) call outl2(70,2,2,xx,xx,x,x)
if (info .gt. 1) call outl2(71,2,2,tq,xx,x,x)
C
call dcopy(nq-1,tq(2),1,tq,1)
nq = nq - 2
C
endif
C
return
end
|