File: feq.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 (130 lines) | stat: -rw-r--r-- 3,908 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
      subroutine feq(neq,t,tq,tqdot)
c!but
c      Etablir la valeur de l'oppose du gradient au point q
c!liste d'appel
c     subroutine feq(neq,t,tq,tqdot)
c     - neq. tableau entier de taille 3+(nq+1)*(nq+2)
c         neq(1)=nq est le degre effectif du polynome tq (ou q).
c         neq(2)=ng est le nombre de coefficient de fourier
c         neq(3)=dgmax degre maximum pour q (l'adresse des coeff de fourier dans
c               tq est neq(3)+2
c     - t  . variable parametrique necessaire a l'execution de
c         la routine lsoda .
c     - tq. tableau reel de taille au moins
c               3+dgmax+nq+2*ng
c         tq(1:nq+1) est le tableau des coefficients du polynome q.
c         tq(dgmax+2:dgmax+ng+2) est le tableau des coefficients
c                      de fourier
c         tq(dgmax+ng+3:) est un tableau de travail de taille au moins
c                         nq+ng+1
c     Sortie :
c     - tqdot . tableau contenant les opposes des coordonnees du
c              gradient de la fonction PHI au point q
c!Remarque 
c     la structure particuliere  pour neq et tq est liee au fait que feq peut
c     etre appele comme un external de lsode
c!
c     Copyright INRIA
      implicit double precision (a-h,o-y)
      dimension tq(*),tqdot(*)
      dimension neq(*)
c
      
      nq=neq(1)
      ng=neq(2)
c
c     decoupage du tableau tq
      itq=1
      itg=itq+neq(3)+1
      iw=itg+ng+1
      ifree=iw+1+nq+ng

      call feq1(nq,t,tq,tq(itg),ng,tqdot,tq(iw))
      return
      end
      subroutine feqn(neq,t,tq,tqdot)
c!but
c      Etablir la valeur  du gradient au point q
c!liste d'appel
c     subroutine feqn(neq,t,tq,tqdot)
c     - neq. tableau entier de taille 3+(nq+1)*(nq+2)
c         neq(1)=nq est le degre effectif du polynome tq (ou q).
c         neq(2)=ng est le nombre de coefficient de fourier
c         neq(3)=dgmax degre maximum pour q (l'adresse des coeff de fourier dans
c               tq est neq(3)+2
c     - t  . variable parametrique necessaire a l'execution de
c         la routine lsoda .
c     - tq. tableau reel de taille au moins
c               3+dgmax+nq+2*ng
c         tq(1:nq+1) est le tableau des coefficients du polynome q.
c         tq(dgmax+2:dgmax+ng+2) est le tableau des coefficients
c                      de fourier
c         tq(dgmax+ng+3:) est un tableau de travail de taille au moins
c                         nq+ng+1
c     Sortie :
c     - tqdot . tableau contenant les opposes des coordonnees du
c              gradient de la fonction PHI au point q
c!Remarque 
c     la structure particuliere  pour neq et tq est liee au fait que feq peut
c     etre appele comme un external de lsode
c!
      implicit double precision (a-h,o-y)
      dimension tq(*),tqdot(*)
      dimension neq(*)
c
      
      nq=neq(1)
      ng=neq(2)
c
c     decoupage du tableau tq
      itq=1
      itg=itq+neq(3)+1
      iw=itg+ng+1
      ifree=iw+1+nq+ng

      call feq1(nq,t,tq,tq(itg),ng,tqdot,tq(iw))
      do 10 i=1,nq
         tqdot(i)=-tqdot(i)
 10   continue
      return
      end
      
      subroutine feq1(nq,t,tq,tg,ng,tqdot,tr)
      implicit double precision (a-h,o-y)
      dimension tq(nq+1),tqdot(nq),tg(*)
      dimension tr(nq+ng+1)
 
      
c
      do 199 i=1,nq
c
c     -- calcul du terme general --
c
         if (i.eq.1) then
            call lq(nq,tq,tr,tg,ng)
c     .     tlq =tr(1:nq); tvq =tr(nq+1:nq+ng+1)
            ltlq=1
            ltvq=nq+1
c
c     division de tvq par q            
            call dpodiv(tr(ltvq),tq,ng,nq)
            nv=ng-nq
         else
            ichoix=1
            call mzdivq(ichoix,nv,tr(ltvq),nq,tq)
         endif
c
c     calcul de tvq~ sur place
         nr=nq-1
         call tild(nr,tr(ltvq),tr)
         call calsca(nq,tq,tr,y0,tg,ng)
c
c     -- conclusion --
c
         tqdot(i)=-2.0d+0*y0
c
 199  continue
c      write(6,'(''tqdot='',5(e10.3,2x))') (tqdot(i),i=1,nq)
c
      return
      end