File: mscope.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 (275 lines) | stat: -rw-r--r-- 8,129 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
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
      subroutine mscope(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,
     &     rpar,nrpar,ipar,nipar,u,nu,y,ny)
c     Copyright INRIA

c     Scicos block simulator
c     ipar(1) = win_num
c     ipar(2) = number of subwindows (input ports)
c     ipar(3) = buffer size
c     ipar(4:5) : window position
c     ipar(6:7) : window dimension
c     ipar(8:7+ipar(2)) = input port sizes
c     ipar(8+ipar(2):7+ipar(2)+nu) = line type for ith curve
c     ipar(8+ipar(2)+nu) = acceptance of inherited events

c     rpar(1)=dt
c     rpar(2)=periode
c     rpar(3)=ymin_1
c     rpar(4)=ymax_1
c     ...
c     rpar(2*k+1)=ymin_k
c     rpar(2*k+2)=ymax_k

c
      double precision t,xd(*),x(*),z(*),tvec(*),rpar(*),u(*),y(*)
      integer flag,nevprt,nx,nz,ntvec,nrpar,ipar(*)
      integer nipar,nu,ny
c
      double precision dt,ymin,ymax,per,rect(4),tsave
      integer i,n,verb,cur,na,v,wid,nax(4)
      character*40 strf,buf
      double precision dv
      double precision frect(4)
      character*(4) logf
      character*4 name
      logical herited

      integer kfun
      common /curblk/ kfun
      data cur/0/,verb/0/


c     
      call dr1('xgetdr'//char(0),name,v,v,v,v,v,v,
     $     dv,dv,dv,dv)
      if(name(1:3).ne.'Rec') then
         call dr1('xsetdr'//char(0),'Rec'//char(0),v,v,v,v,v,v,
     $        dv,dv,dv,dv)
      endif
c

      wid=ipar(1)
      nwid=ipar(2)
      N=ipar(3)
      per=rpar(2)
      dt=rpar(1)
      if(nipar.lt.8+ipar(2)+nu) then
c     compatibility
         herited=.true.
      else
         herited=ipar(8+ipar(2)+nu).ne.0
      endif
c
      if (flag.le.2) then
         K=int(z(1))
         if(K.gt.0) then
            n1=int(z(1+K)/per)
            if(z(1+K).lt.0.0d0) n1=n1-1
         else
            n1=0
         endif
c     
         tsave=t
         if(dt.gt.0.0d0) t=z(1+K)+dt
c     
         n2=int(t/per)
         if(t.lt.0.0d0) n2=n2-1
c     
c     add new point to the buffer
         K=K+1
         z(1+K)=t
         do 05 i=1,nu
           z(1+N+(i-1)*N+K)=u(i)
 05      continue
         z(1)=K
         if(n1.eq.n2.and.K.lt.N) then
            t=tsave
            return
         endif
c     
c     plot 1:K points of the buffer
         call dr1('xget'//char(0),'window'//char(0),verb,cur,na,v,v,v,
     $        dv,dv,dv,dv)
         if(cur.ne.wid) then
            call dr1('xset'//char(0),'window'//char(0),wid,v,v,v,v,v,
     $           dv,dv,dv,dv)
         endif
         call dr1('xset'//char(0),'use color'//char(0),1,0,0,
     &        0,0,v,dv,dv,dv,dv)
         call dr1('xset'//char(0),'dashes'//char(0),0,0,0,
     &        0,0,v,dv,dv,dv,dv)

         ilt=8+ipar(2)

         it=0
c     loop on input ports
         if(K.gt.0) then
            do 11 kwid=1,nwid
               buf='xlines'//char(0)
               rect(1)=per*(n1)
               rect(2)=rpar(2*kwid+1)
               rect(3)=per*(1+n1)
               rect(4)=rpar(2*kwid+2)
               frect(1)=0.0d0
               frect(2)=(kwid-1)*(1.0d0/nwid)
               frect(3)=1.0d0
               frect(4)=(1.0d0/nwid)
               call  setscale2d(frect,rect,'nn'//char(0))
               call scicosclip(1)

c     loop on input port elements
               do 10 i=1,ipar(7+kwid)
                  call dr1('xpolys'//char(0),'v'//char(0),v,v,
     $                 ipar(ilt+it),1,K,v,z(2),z(2+N+it*N),dv,dv)
                  it=it+1
 10            continue
            call scicosclip(0)

 11         continue
         endif
c     shift buffer left
         z(2)=z(1+K)
         do 15 i=1,nu
            z(1+N+(i-1)*N+1)=z(1+N+(i-1)*N+K)
 15      continue
         z(1)=1.0d0
         if(n1.ne.n2) then
c     clear window
            nax(1)=2
            nax(2)=10
            nax(3)=2
            nax(4)=10
            call dr1('xclear'//char(0),'v'//char(0),v,v,v,v,v,v,
     $           dv,dv,dv,dv)
            call dr1('xset'//char(0),'use color'//char(0),1,0,0,
     &           0,0,v,dv,dv,dv,dv)
            call dr('xstart'//char(0),'v'//char(0),wid,v,v,v,v,v,
     $           dv,dv,dv,dv)
            buf='t@ @input and output'
            strf='011'//char(0)
            call dr1('xset'//char(0),'dashes'//char(0),0,0,0,
     &           0,0,v,dv,dv,dv,dv)

            do 16 kwid=1,nwid
               rect(1)=per*(1+n1)
               rect(2)=rpar(1+2*kwid)
               rect(3)=per*(2+n1)
               rect(4)=rpar(2*kwid+2)
               frect(1)=0.0d0
               frect(2)=(kwid-1)*(1.0d0/nwid)
               frect(3)=1.0d0
               frect(4)=(1.0d0/nwid)
               call  setscale2d(frect,rect,'nn'//char(0))
               call plot2d(rect(1),rect(2),1,1,-1,strf,buf,rect,nax)
 16         continue
         endif
         t=tsave
c
      elseif(flag.eq.4) then

         nax(1)=2
         nax(2)=10
         nax(3)=2
         nax(4)=10
         n1=int(t)/per
         if(t.le.0.0d0) n1=n1-1
         call sciwin()
         call dr1('xget'//char(0),'window'//char(0),verb,cur,na,v,v,v,
     $        dv,dv,dv,dv)
         if(cur.ne.wid) then
            call dr1('xset'//char(0),'window'//char(0),wid,v,v,v,v,v,
     $           dv,dv,dv,dv)
         endif
         iwp=4
         if(ipar(iwp).ge.0) then
            call dr1('xset'//char(0),'wpos'//char(0),ipar(iwp),
     $           ipar(iwp+1),v,v,v,v,dv,dv,dv,dv)
         endif
         iwd=6
         if(ipar(iwd).ge.0) then
            call dr1('xset'//char(0),'wdim'//char(0),ipar(iwd),
     $           ipar(iwd+1),v,v,v,v,dv,dv,dv,dv)
         endif
         call dr1('xset'//char(0),'use color'//char(0),1,0,0,
     &        0,0,v,dv,dv,dv,dv)
         call dr1('xset'//char(0),'alufunction'//char(0),3,0,0,
     &        0,0,v,dv,dv,dv,dv)
         call dr1('xclear'//char(0),'v'//char(0),v,v,v,v,v,v,
     $        dv,dv,dv,dv)
         call dr('xstart'//char(0),'v'//char(0),wid,v,v,v,v,v,
     $        dv,dv,dv,dv)
         buf='t@ @input and output'
         strf='011'//char(0)
         call dr1('xset'//char(0),'dashes'//char(0),0,0,0,
     &        0,0,v,dv,dv,dv,dv)
         nxname=40
         call getlabel(kfun,buf,nxname)
         if(nxname.gt.39) nxname=39
         buf(nxname+1:nxname+1)=char(0)
         if ((nxname.eq.1.and.buf(1:1).eq.' ').or.(nxname.eq.0)) then
         else
            call dr('xname'//char(0),buf,v,v,v,v,v,v,dv,dv,dv,dv)
         endif

         do 20 kwid=1,nwid
            rect(1)=per*(1+n1)
            rect(2)=rpar(1+2*kwid)
            rect(3)=per*(2+n1)
            rect(4)=rpar(2*kwid+2)
            frect(1)=0.0d0
            frect(2)=(kwid-1)*(1.0d0/nwid)
            frect(3)=1.0d0
            frect(4)=(1.0d0/nwid)
            call  setscale2d(frect,rect,'nn'//char(0))
            call plot2d(rect(1),rect(2),1,1,-1,strf,buf,rect,nax)
 20      continue
c
         z(1)=0.0d0
         z(2)=t
         call dset(nu*N,0.0d0,z(3),1)
      elseif(flag.eq.5) then

         K=int(z(1))
         if(K.le.1) return
         call dr1('xget'//char(0),'window'//char(0),verb,cur,na,v,v,v,
     $        dv,dv,dv,dv)
         if(cur.ne.wid) then
            call dr1('xset'//char(0),'window'//char(0),wid,v,v,v,v,v,
     $           dv,dv,dv,dv)
         endif
         call dr1('xset'//char(0),'use color'//char(0),1,0,0,
     &        0,0,v,dv,dv,dv,dv)
c     
         ilt=8+ipar(2)

         it=0
         n1=int(t)/per
         if(t.le.0.0d0) n1=n1-1
c     loop on input ports
         do 35 kwid=1,nwid
            rect(1)=per*(1+n1)
            rect(2)=rpar(1+2*kwid)
            rect(3)=per*(2+n1)
            rect(4)=rpar(2*kwid+2)
            frect(1)=0.0d0
            frect(2)=(kwid-1)*(1.0d0/nwid)
            frect(3)=1.0d0
            frect(4)=(1.0d0/nwid)
            call  setscale2d(frect,rect,'nn'//char(0))
            call scicosclip(1)

c     loop on input port elements
            do 30 i=1,ipar(7+kwid)
               call dr1('xpolys'//char(0),'v'//char(0),v,v,ipar(ilt
     $              +it),1,K-1,v,z(2),z(2+N+it*N),dv,dv)
               it=it+1
 30         continue
               call scicosclip(0)
 35      continue
      endif

      call dr1('xsetdr'//char(0),name,v,v,v,v,v,v,
     $     dv,dv,dv,dv)
 
      end