File: cplmax.f

package info (click to toggle)
scilab 2.2-4
  • links: PTS
  • area: non-free
  • in suites: hamm
  • size: 31,472 kB
  • ctags: 21,963
  • sloc: fortran: 110,983; ansic: 89,717; makefile: 3,016; sh: 1,892; csh: 150; cpp: 101
file content (151 lines) | stat: -rw-r--r-- 3,757 bytes parent folder | download
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
      subroutine cplmax(alphi,beta,c,deg,ex,hp1,hp2,ihp1,ihp2,imin,
     &     ind,l1,l2,la2,lp2,m1,m2,ma,mm,n,n1dim,ndim,or,
     &     p1w,p2w,pimin,pivw,q,r,s1,s2,sat,x,z)
      implicit doubleprecision (a-h,o-z)
      dimension pivw(ndim),pimin(ndim),p1w(ndim),p2w(ndim)
      integer q(ndim),x(ma),sat(ndim)
      integer m1(ndim),m2(ndim),l1(ndim),l2(ndim),ind(ndim)
      integer deg(ndim),s1(ndim),s2(ndim)
      integer alphi(ndim),beta(ndim),or(ma),ex(ma),lp2(n1dim)
      integer la2(mm)
      dimension c(ma),r(ndim),imin(ndim),ihp1(ndim),ihp2(ndim)
      integer hp1(ndim),hp2(ndim),sortie
      logical modif
      doubleprecision infr
      do 2 l=1,ma
         x(l)=0
 2    continue
      z=0.
      infr=10.e5
      cmax=-1.
      do 5 l=1,ma
         if(c(l).lt.cmax) goto 5
         cmax=c(l)
         lmax=l
    5 continue
      if(cmax.gt.0) goto 10
      return
 10   continue
      do 11 i=1,n
         pivw(i)=cmax/2.
 11   continue
      do 14 i=1,n
         q(i)=0
 14   continue
      do 15 i=1,ndim
         alphi(i)=0
         beta(i)=0
         r(i)=0.
 15   continue
      do 16 i=1,n
         alphi(i)=i
         beta(i)=i
 16   continue
      do 18 i=1,n
         pimin(i)=10.e8
 18   continue
      nnn=n+1
      nnn1=nnn-1
      modif=.true.
 100  continue
      nn1=ndim+1
      call match(beta,c,deg,ex,hp1,hp2,ihp1,ihp2,ind,itmin,l1,l2,
     &     la2,lp2,m1,m2,ma,mm,modif,nnn1,n1dim,ndim,or,p1w,
     &     p2w,pimin,pivw,q,r,s1,s2,sat,sortie,x)
      if (sortie.eq.10) then
         call erro('error 10 in match')
         return
      endif
      if (sortie.eq.20) then
         call erro('error 20 in match')
         return
      endif
      if (sortie.eq.0) goto 900
      if (sortie.eq.2) goto 300
      if (sortie.eq.1) continue
      necl=itmin
      call eclat(alphi,beta,c,ex,imin,ma,mm,modif,
     &     n,ndim,necl,nnn1,or,pimin,pivw,q,r,sat,x)
      goto 100
 300  ncontr=0
 316  continue
      do 318 i=1,nnn1
         if(q(i).ne.0.and.alphi(i).eq.i) goto 320
 318  continue
      if(ncontr.gt.0) goto 350
      if(ncontr.eq.0) goto 900
 320  k=i
      ncontr=ncontr+1
      pimin(nnn)=pivw(i)
      imin(nnn)=i
      alphi(nnn)=nnn
      beta(nnn)=nnn
 330  l=q(i)
      x(l)=0
      alphi(i)=nnn
      j=or(l)
      j=beta(j)
      j1=ex(l)
      j1=beta(j1)
      if(j.eq.i)j=j1
      if(pivw(j).lt.pimin(nnn))imin(nnn)=j
      if(pivw(j).lt.pimin(nnn))pimin(nnn)=pivw(j)
      i=j
      if(i.eq.k) goto 340
      goto 330
 340  pivw(nnn)=pimin(nnn)
      q(nnn)=0
      nnn=nnn+1
      goto 316
 350  nnn1=nnn-1
      do 366 i=1,nnn1
         ib=beta(i)
         if(ib.eq.0)goto 366
         beta(i)=alphi(ib)
 366  continue
      modif=.true.
      do 410 i=1,nnn1
         r(i)=infr
 410  continue
      do 480 i=1,n
         if(alphi(i).ne.i) goto 425
         r(i)=0
         goto 480
 425     continue
         r(i)=0.
         ii=i
 430     continue
         i1=alphi(ii)
         if(i1.eq.ii)goto 445
         r(i)=r(i)+pivw(ii)-pimin(i1)
         if(r(i1).lt.infr)goto 440
         ii=i1
         goto 430
 440     continue
         r(i)=r(i)+r(i1)
 445     continue
         ii=i
 460     continue
         i1=alphi(ii)
         if(i1.eq.ii)goto 480
         if(r(i1).lt.infr)goto 480
         r(i1)=r(ii)-pivw(ii)+pimin(i1)
         ii=i1
         goto 460
 480  continue
      goto 100
 900  if(nnn1.eq.n) goto 950
      do 910 necl1=n+1,nnn1
         necl=nnn1+n+1-necl1
         if(beta(necl).eq.0) goto 910
         call eclat(alphi,beta,c,ex,imin,ma,ma,modif,
     &        n,ndim,necl,nnn1,or,pimin,pivw,q,r,sat,x)
 910  continue
 950  continue
      z=0.
      do 960 l=1,ma
         if(x(l).eq.2) z=z+c(l)-r(or(l))-r(ex(l))
 960  continue
      modif=.true.
 999  return
      end