c Scilab ( http://www.scilab.org/ ) - This file is part of Scilab c Copyright (C) INRIA c c This file must be used under the terms of the CeCILL. c This source file is licensed as described in the file COPYING, which c you should have received as part of this distribution. The terms c are also available at c http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt subroutine degl2(tg,ng,neq,imina,iminb,iminc,ta,tb,tc,iback, & ntback,tback,mxsol,w,iw,ierr) C!but C Cette procedure a pour objectif de determiner le plus grand C nombre de minimums de degre "neq". C!liste d'appel C subroutine degre (neq,imina,iminb,iminc,ta,tb,tc, C & iback,ntback,tback) C C Entree : C -neq. est le degre des polynomes parmi lesquels ont C recherche les minimums. C -imina. est le nombre de minimums de degre "neq-1" C contenus dans ta. C -iminb. est le nombre de minimums de degre "neq-2" C contenus dans tb. C -iminc. est le nombre de minimums de degre "neq-3" C contenus dans tc. C -ta. est le tableau contenant donc les minimums de degre C "neq-1" C -tb. est le tableau contenant donc les minimums de degre C "neq-2" C -tc. est le tableau contenant donc les minimums de degre C "neq-3" C -iback. est le nombre de minimums obtenus apres une C intersection avec la frontiere C -ntback est un tableau d'entier qui contient les degre C de ces minimums C -tback. est le tableau qui contient leurs coefficients, C ou ils sont ordonnes degre par degre. C C Sortie : C -imina. est le nombre de minimums de degre neq que l'on C vient de determiner C -iminb. est le nombre de minimums de degre "neq-1" C -iminc. est le nombre de minimums de degre "neq-2" C -ta. contient les mins de degre neq, -tb. ceux de degre C neq-1 et tc ceux de degre neq-2 C -iback,ntback,tback ont pu etre augmente des mins obtenus C apres intersection eventuelle avec la frontiere. C C tableaux de travail C w : 33+33*neq+7*ng+neq*ng+neq**2*(ng+2) C iw :29+neq**2+4*neq c C! implicit double precision (a-h,o-y) dimension ta(mxsol,*), tb(mxsol,*), tc(mxsol,*),tg(ng+1), & ntback(mxsol), tback(mxsol,*) dimension w(*), iw(*), xx(1) C dimension tps(0:1), tms(0:1) double precision x,phi0,phi,gnrm C external feq, jacl2 common /comall/ nall1 common /sortie/ io,info,ll common /no2f/ gnrm C tps(0) = 1.0d+0 tps(1) = 1.0d+0 tms(0) = -1.0d+0 tms(1) = 1.0d+0 C C C -------- Reinitialisation des tableaux -------- C if (neq .eq. 1) goto 111 C do 110 j = 1,iminb call dcopy(neq,tb(j,1),mxsol,tc(j,1),mxsol) 110 continue iminc = iminb C 111 do 120 j = 1,imina call dcopy(neq,ta(j,1),mxsol,tb(j,1),mxsol) 120 continue iminb = imina imina = 0 neq = neq + 1 neqbac = neq c lrw = neq**2 + 9*neq + 22 liw = 20+neq C decoupage du tableau de travail w ltq = 1 lwopt = ltq+6+6*neq+6*ng+neq*ng+neq**2*(ng+1) ltr = lwopt +25+26*neq+ng+neq**2 lfree=ltr+neq+1 c c les lrw elements de w suivant w(lwopt) ne doivent pas etre modifies c d'un appel de optml2 a l'autre lw=lwopt+lrw ltg=ltq+neq+1 call dcopy(ng+1,tg,1,w(ltg),1) C decoupage du tableau de travail iw lneq=1 liwopt=lneq+3+(neq+1)*(neq+2) lifree =liwopt + 20+neq c iw(lneq)=neq iw(lneq+1)=ng iw(lneq+2)=neq if (info .gt. 0) call outl2(51,neq,neq,xx,xx,x,x) C C -------- Boucles de calculs -------- C do 190 k = 1,iminb C call dcopy(neq-1,tb(k,1),mxsol,w(ltr),1) w(ltr+neq-1) = 1.0d+0 C do 180 imult = 1,2 C if (imult .eq. 1) then call dpmul1(w(ltr),neq-1,tps,1,w(ltq)) elseif (imult .eq. 2) then call dpmul1(w(ltr),neq-1,tms,1,w(ltq)) endif C 140 continue C nch = 1 call optml2(feq,jacl2,iw(lneq),w(ltq),nch,w(lwopt),iw(liwopt)) neq=iw(lneq) if(info.gt.1) call outl2(nch,iw(lneq),neqbac,w(ltq),xx,x,x) if (info .gt. 0) then call lq(neq,w(ltq),w(lw),w(ltg),ng) x=sqrt(gnrm) call dscal(neq,x,w(lw),1) call outl2(nch,neq,neqbac,w(ltq),w(lw),x,x) phi0= abs(phi(w(ltq),neq,w(ltg),ng,w(lw))) lqdot=lw call feq(iw(lneq),t,w(ltq),w(lqdot)) call outl2(17,neq,neq,w(ltq),w(lqdot),phi0,x) endif if (nch.eq.15 .and. nall1.eq.0) then ierr = 4 return endif C if (nch .eq. -1) goto 140 if (nch .eq. -2) goto 140 C nch = 2 call optml2(feq,jacl2,iw(lneq),w(ltq),nch,w(lwopt),iw(liwopt)) neq=iw(lneq) if (info .gt. 1) then call lq(neq,w(ltq),w(lw),w(ltg),ng) x=sqrt(gnrm) call dscal(neq,x,w(lw),1) call outl2(nch,neq,neqbac,w(ltq),w(lw),x,x) phi0= abs(phi(w(ltq),neq,w(ltg),ng,w(lw))) lqdot=lw call feq(iw(lneq),t,w(ltq),w(lqdot)) call outl2(17,neq,neq,w(ltq),w(lqdot),phi0,x) endif if (nch.eq.15 .and. nall1.eq.0) then ierr = 4 return endif C C if (nch .eq. -1) goto 140 if (nch .eq. -2) goto 140 C if (nch .eq. 15) then if (info .gt. 0) call outl2(50,neq,neq,xx,xx,x,x) goto 170 endif C nch = neq - neqbac if (nch .eq. -2) then call storl2(neq,w(ltq),w(ltg),ng,iminc,tc,iback,ntback, & tback,nch,mxsol,w(lwopt),ierr) elseif (nch .eq. -1) then call storl2(neq,w(ltq),w(ltg),ng,iminb,tb,iback,ntback, & tback,nch,mxsol,w(lwopt),ierr) else call storl2(neq,w(ltq),w(ltg),ng,imina,ta,iback,ntback, & tback,nch,mxsol,w(lwopt),ierr) endif C 170 neq = neqbac iw(lneq)=neq C 180 continue 190 continue if (info .gt. 0) then x = real(mxsol) call outl2(53,neq,imina,ta,xx,x,x) endif return end