File: gcp.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 (111 lines) | stat: -rw-r--r-- 2,766 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
      subroutine gcp(n,index,indic,np,nt,y,s,z,ys,zs,diag,b,x,d,g,eps)
c
c     methode de gradient preconditionne appliquee a l'equation
c     [a]*{x}={b}. ici [a] est definie par les vecteurs ({y}(i),
c     {s}(i), {z}(i), i=1,np).
c     Copyright INRIA
c
      implicit  double precision (a-h,o-z)
      dimension x(n),b(n),y(nt,n),s(nt,n),z(nt,n),ys(nt),zs(nt),diag(n)
      dimension       g(n),d(n)
      integer   index(nt),indic(n)
c
c     initialisation
      eps0=1.e-5
      eps1=1.e-5
      do 100 i=1,n
         if(indic(i).gt.0) go to 100
         x(i)=-b(i)/diag(i)
100   continue
c
      call calbx(n,index,indic,nt,np,y,s,ys,z,zs,x,diag,g)
      do 110 i=1,n
         if(indic(i).gt.0) go to 110
         g(i)=g(i)+b(i)
110   continue
c
c     ----------
c     iteration 1
c     ------test de convergence
      s0=0
      do 120 i=1,n
         if(indic(i).gt.0) go to 120
         s0=s0+g(i)*g(i)/diag(i)
120   continue
      if(s0.lt.1.0d-18) return
      s1=s0
c     ------recherche de la direction de descente
      do 130 i=1,n
         if(indic(i).gt.0) go to 130
         d(i)=-g(i)/diag(i)
130   continue
c
c     ------step length
      dg=0.
      do 135 i=1,n
         if(indic(i).gt.0) go to 135
         dg=dg+d(i)*g(i)
135   continue
      call calbx(n,index,indic,nt,np,y,s,ys,z,zs,d,diag,g)
      d2a=0
      do 140 i=1,n
         if(indic(i).gt.0) go to 140
         d2a=d2a+d(i)*g(i)
140   continue
c
      ro=-dg/d2a
      do 150 i=1,n
         if(indic(i).gt.0) go to 150
         x(i)=x(i)+ro*d(i)
150   continue
      call calbx(n,index,indic,nt,np,y,s,ys,z,zs,x,diag,g)
      do 170 i=1,n
         if(indic(i).gt.0) go to 170
         g(i)=g(i)+b(i)
170   continue
c
c     iteration k
      iter=0
      itmax=2*np
10    iter=iter +1
      if(iter.gt.itmax)return
c     ------test de convergence
      s2=0
      do 200 i=1,n
         if(indic(i).gt.0) go to 200
         s2=s2+g(i)*g(i)/diag(i)
200   continue
      if((s2/s0).lt.eps) return
c     ------recherche de la direction de descente
      beta=s2/s1
      do 210 i=1,n
         if(indic(i).gt.0) go to 210
         d(i)=-g(i)/diag(i)+beta*d(i)
210   continue
      s1=s2
c
c     -----step length
      dg=0.
      do 215 i=1,n
         if(indic(i).gt.0) go to 215
         dg=dg+d(i)*g(i)
215   continue
      call calbx(n,index,indic,nt,np,y,s,ys,z,zs,d,diag,g)
      d2a=0.
      do 220 i=1,n
         if(indic(i).gt.0) go to 220
         d2a=d2a+d(i)*g(i)
220   continue
c
      ro=-dg/d2a
      do 230 i=1,n
         if(indic(i).gt.0) go to 230
         x(i)=x(i)+ro*d(i)
230   continue
      call calbx(n,index,indic,nt,np,y,s,ys,z,zs,x,diag,g)
      do 240 i=1,n
         if(indic(i).gt.0) go to 240
         g(i)=g(i)+b(i)
240   continue
      go to 10
      end