File: storl2.f

package info (click to toggle)
scilab 4.0-12
  • links: PTS
  • area: non-free
  • in suites: etch, etch-m68k
  • size: 100,640 kB
  • ctags: 57,333
  • sloc: ansic: 377,889; fortran: 242,862; xml: 179,819; tcl: 42,062; sh: 10,593; ml: 9,441; makefile: 4,377; cpp: 1,354; java: 621; csh: 260; yacc: 247; perl: 130; lex: 126; asm: 72; lisp: 30
file content (215 lines) | stat: -rw-r--r-- 5,442 bytes parent folder | download | duplicates (4)
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
      subroutine storl2(neq,tq,tg,ng,imin,tabc,iback,ntback,tback,
     &     nch,mxsol,w,ierr)
C!but
C     Lorsque un minimum local vient d'etre determine, cette
C     procedure est appelee afin de verifier son originalite,
C     et si elle est effective, de le stocker dans le tableau
C     en construction, correspondant au degre de la recherche
C     en cours. S'il n'est pas de ce degre, il est alors range
C     dans le tableau 'tback' qui contient tout minimum origi-
C     nal obtenu apres une sortie de face.
C!liste d'appel
C     entrees :
C     - neq. est le degre du minimum nouvellement obtenu.
C     - tq. est le tableau contenant ses coefficients
C     - imin. est le nombre des minimums de meme degre,
C        deja reveles.
C     - tabc. etant le tableau contenant ces minimums.
C     - iback. est le nombre de minimums de degre
C        quelconque, reveles apres une sortie de face.
C     - ntback. est un tableau entier unicolonne contenant
C        les degres de ces polynomes.
C     - tback. est le tableau ou sont stockes ces polynomes.
C        Ainsi, le ieme polynome, de degre ntback(i), a
C        ses coeff dans la ieme ligne, c-a-d de tback(i,0)
C        a tback(i,ntback(i)-1).
C     - nch. est un parametre entier indiquant s'il s'agit
C        d'un minimum de meme degre que celui de la recherche
C        en cours, ou bien d'une sortie de face.
C
C     sorties :
C     - peuvent etre modifies: imin, tabc, iback, ntback,
C        tback, suivant le tableau ou a ete stocke le minimum tq
c
c     Copyright INRIA
c
C!
      implicit double precision (a-h,o-y)
      dimension tq(0:*), tabc(mxsol,0:*), ntback(iback),
     &          tback(mxsol,0:*), xx(1),tg(ng+1),w(*)
C
      common /sortie/ io,info,ll
C
      ierr = 0
      if (nch .lt. -2) goto 200
      if (imin .eq. 0) goto 400
C
C     ---- test sur l'originalite du nouveau min -----------------------
C
C     ---- par rapport a tabc.
C
      do 120 im = 1,imin
C
        diff0 = 0.0d+0
        do 110 ij = 0,neq-1
          diff0 = diff0 + (tq(ij)-tabc(im,ij))**2
 110    continue
        diff0 = sqrt(diff0)
C
        if (diff0 .lt. 1.0d-03) then
          if (info .gt. 0) call outl2(80,0,0,xx,xx,x,x)
          return
        endif
C
 120  continue
C
C     ---- par rapport a tback.
C
C     - Situation des polynomes de meme degre. -
C
 200  if (nch.lt.0 .and. iback.gt.0) then
        jsup = iback + 1
        jinf = 0
C
        do 210 j = iback,1,-1
          if (jsup.gt.j .and. ntback(j).gt.neq) jsup = j
 210    continue
        do 220 j = 1,iback
          if (jinf.lt.j .and. ntback(j).lt.neq) jinf = j
 220    continue
C
C     - Controle de l'originalite. -
C
        if ((jsup-jinf) .gt. 1) then
C
          do 240 j = jinf+1,jsup-1
C
            diff0 = 0.0d+0
            do 230 i = 0,neq-1
              diff0 = diff0 + (tq(i)-tback(j,i))**2
 230        continue
            diff0 = sqrt(diff0)
C
            if (diff0 .lt. 1.0d-03) then
              if (info .gt. 0) call outl2(80,0,0,xx,xx,x,x)
              return
            endif
C
 240      continue
        endif
      endif
C
C     -------- classement du nouveau minimum -----
C     ---- dans tback.
C
      if (iback .eq. mxsol) then
        ierr = 7
        return
      endif
      if (nch .lt. 0) then
C
        if (iback .eq. 0) then
C
          do 310 i = 0,neq-1
            tback(1,i) = tq(i)
 310      continue
          ntback(1) = neq
C
        elseif (jsup .gt. iback) then
C
          do 330 i = 0,neq-1
            tback(jsup,i) = tq(i)
 330      continue
          ntback(iback+1) = neq
C
          
        else
C
          do 350 j = iback,jsup,-1
            do 340 i = 0,ntback(j)-1
              tback(j+1,i) = tback(j,i)
 340        continue
            ntback(j+1) = ntback(j)
 350      continue
C
          do 370 i = 0,neq-1
            tback(jsup,i) = tq(i)
 370      continue
          ntback(jsup) = neq
C
          
        endif
C
        iback = iback + 1
        if (info .gt. 1) call outl2(81,neq,neq,xx,xx,x,x)
        return
C
      endif
C
C     -------- dans tabc.
 400  continue
      if (imin .eq. mxsol) then
        ierr = 7
        return
      endif
      paux = phi(tq,neq,tg,ng,w)
C
      if (imin .eq. 0) then
C
        do 410 ij = 0,neq-1
          tabc(1,ij) = tq(ij)
 410    continue
        tabc(1,neq) = paux
        imin = imin + 1
C
        
      else
C
        do 490 im = imin,1,-1
C
          if (paux.gt.tabc(im,neq) .and. im.eq.imin) then
C
            do 420 ij = 0,neq-1
              tabc(imin+1,ij) = tq(ij)
 420        continue
            tabc(imin+1,neq) = paux
            imin = imin + 1
            return
C
          elseif (paux .gt. tabc(im,neq)) then
C
            do 440 in = imin,im+1,-1
              do 430 ij = 0,neq
                tabc(in+1,ij) = tabc(in,ij)
 430          continue
 440        continue
            do 450 ij = 0,neq-1
              tabc(im+1,ij) = tq(ij)
 450        continue
            tabc(im+1,neq) = paux
            imin = imin + 1
            return
C
          elseif (im .eq. 1) then
C
            do 470 in = imin,1,-1
              do 460 ij = 0,neq
                tabc(in+1,ij) = tabc(in,ij)
 460          continue
 470        continue
            do 480 ij = 0,neq-1
              tabc(1,ij) = tq(ij)
 480        continue
            tabc(1,neq) = paux
            imin = imin + 1
C
          endif
C
 490    continue
C
        
      endif
C
      return
      end