Commit | Line | Data |
---|---|---|
e0fe7396 D |
1 | subroutine ovtpvt |
2 | implicit double precision (a-h,o-z) | |
3 | c | |
4 | c | |
5 | c this routine generates the requested tabular listings of analysis | |
6 | c results. it calls plot to generate line-printer plots. | |
7 | c | |
8 | common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, | |
9 | 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, | |
10 | 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, | |
11 | 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, | |
12 | 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, | |
13 | 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval | |
14 | common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, | |
15 | 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs | |
16 | common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, | |
17 | 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, | |
18 | 2 itemno,nosolv,ipostp,iscrch | |
19 | common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, | |
20 | 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof | |
21 | common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, | |
22 | 1 defas,rstats(50),iwidth,lwidth,nopage | |
23 | common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop, | |
24 | 1 kinel,kidin,kovar,kidout | |
25 | common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq, | |
26 | 1 inoise,nosprt,nosout,nosin,idist,idprt | |
27 | common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg | |
28 | common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8), | |
29 | 1 ilogy(8),npoint,numout,kntr,numdgt | |
30 | common /blank/ value(1000) | |
31 | integer nodplc(64) | |
32 | complex*16 cvalue(32) | |
33 | equivalence (value(1),nodplc(1),cvalue(1)) | |
34 | c | |
35 | complex*16 cval | |
36 | dimension prform(3) | |
37 | dimension subtit(4,3) | |
38 | data subtit / 8hdc trans, 8hfer curv, 8hes , 8h , | |
39 | 1 8htransien, 8ht analys, 8his , 8h , | |
40 | 2 8hac analy, 8hsis , 8h , 8h / | |
41 | data prform / 8h(1pe11.3, 8h,2x,8e00, 8h.00) / | |
42 | data aper,rprn / 1h., 1h) / | |
43 | c | |
44 | call second(t1) | |
45 | if (icalc.le.0) go to 1000 | |
46 | call crunch | |
47 | if (nogo.lt.0) go to 1000 | |
48 | c | |
49 | c construct format statement to be used for printing the outputs | |
50 | c | |
51 | ifract=max0(numdgt-1,0) | |
52 | ifwdth=ifract+9 | |
53 | ipos=15 | |
54 | call alfnum(ifwdth,prform,ipos) | |
55 | call move(prform,ipos,aper,1,1) | |
56 | ipos=ipos+1 | |
57 | call alfnum(ifract,prform,ipos) | |
58 | call move(prform,ipos,rprn,1,1) | |
59 | c | |
60 | noprln=min0(8,(lwidth-12)/ifwdth) | |
61 | if (mode-2) 50,60,300 | |
62 | 50 numout=jelcnt(41)+1 | |
63 | go to 70 | |
64 | 60 numout=jelcnt(42)+1 | |
65 | c | |
66 | c dc and transient analysis printing | |
67 | c | |
68 | 70 loc=locate(30+mode) | |
69 | 80 if (loc.eq.0) go to 200 | |
70 | kntr=min0(noprln,nodplc(loc+3)) | |
71 | if (kntr.le.0) go to 120 | |
72 | call title(1,lwidth,1,subtit(1,mode)) | |
73 | call setprn(loc) | |
74 | c | |
75 | c get buffer space | |
76 | c | |
77 | call getm8(locx,npoint) | |
78 | call getm8(locy,kntr*npoint) | |
79 | c | |
80 | c interpolate outputs | |
81 | c | |
82 | call ntrpl8(locx,locy,numpnt) | |
83 | c | |
84 | c print outputs | |
85 | c | |
86 | do 100 i=1,numpnt | |
87 | xvar=value(locx+i) | |
88 | locyt=locy | |
89 | do 90 k=1,kntr | |
90 | yvar(k)=value(locyt+i) | |
91 | locyt=locyt+npoint | |
92 | 90 continue | |
93 | write (6,prform) xvar,(yvar(k),k=1,kntr) | |
94 | 100 continue | |
95 | write (6,111) | |
96 | 111 format(1hy) | |
97 | call clrmem(locx) | |
98 | call clrmem(locy) | |
99 | 120 loc=nodplc(loc) | |
100 | go to 80 | |
101 | c | |
102 | c dc and transient analysis plotting | |
103 | c | |
104 | 200 loc=locate(35+mode) | |
105 | 210 if (loc.eq.0) go to 250 | |
106 | kntr=nodplc(loc+3) | |
107 | if (kntr.le.0) go to 220 | |
108 | locv=nodplc(loc+1) | |
109 | call title(1,lwidth,1,subtit(1,mode)) | |
110 | call setplt(loc) | |
111 | c | |
112 | c get buffer space | |
113 | c | |
114 | call getm8(locx,npoint) | |
115 | call getm8(locy,kntr*npoint) | |
116 | c | |
117 | c interpolate outputs and load plot buffers | |
118 | c | |
119 | call ntrpl8(locx,locy,numpnt) | |
120 | call plot(numpnt,locx,locy,locv) | |
121 | call clrmem(locx) | |
122 | call clrmem(locy) | |
123 | 220 loc=nodplc(loc) | |
124 | go to 210 | |
125 | c | |
126 | c fourier analysis | |
127 | c | |
128 | 250 if (mode.eq.1) go to 1000 | |
129 | if (nfour.eq.0) go to 1000 | |
130 | if (nogo.ne.0) go to 1000 | |
131 | call fouran | |
132 | go to 1000 | |
133 | c | |
134 | c ac analysis printing | |
135 | c | |
136 | 300 numout=jelcnt(43)+jelcnt(44)+jelcnt(45)+1 | |
137 | do 599 id=33,35 | |
138 | loc=locate(id) | |
139 | 320 if (loc.eq.0) go to 599 | |
140 | kntr=min0(noprln,nodplc(loc+3)) | |
141 | if (kntr.le.0) go to 595 | |
142 | call title(1,lwidth,1,subtit(1,mode)) | |
143 | call setprn(loc) | |
144 | c | |
145 | c print ac outputs | |
146 | c | |
147 | lout=loutpt | |
148 | do 590 i=1,icalc | |
149 | xvar=dreal(cvalue(lout+1)) | |
150 | do 500 k=1,kntr | |
151 | iseq=itab(k) | |
152 | iseq=nodplc(iseq+4) | |
153 | cval=cvalue(lout+iseq) | |
154 | ktype=itype(k) | |
155 | go to (450,450,430,440,450,450), ktype | |
156 | 430 yvar(k)=dreal(cval) | |
157 | go to 500 | |
158 | 440 yvar(k)=dimag(cval) | |
159 | go to 500 | |
160 | 450 call magphs(cval,xmag,xphs) | |
161 | go to (460,460,430,440,470,465), ktype | |
162 | 460 yvar(k)=xmag | |
163 | go to 500 | |
164 | 465 yvar(k)=20.0d0*dlog10(xmag) | |
165 | go to 500 | |
166 | 470 yvar(k)=xphs | |
167 | 500 continue | |
168 | lout=lout+numout | |
169 | 580 write (6,prform) xvar,(yvar(k),k=1,kntr) | |
170 | 590 continue | |
171 | write (6,111) | |
172 | 595 loc=nodplc(loc) | |
173 | go to 320 | |
174 | 599 continue | |
175 | c | |
176 | c ac analysis plotting | |
177 | c | |
178 | do 760 id=38,40 | |
179 | loc=locate(id) | |
180 | 610 if (loc.eq.0) go to 760 | |
181 | kntr=nodplc(loc+3) | |
182 | if (kntr.le.0) go to 750 | |
183 | locv=nodplc(loc+1) | |
184 | call title(1,lwidth,1,subtit(1,mode)) | |
185 | call setplt(loc) | |
186 | c | |
187 | call getm8(locx,icalc) | |
188 | call getm8(locy,kntr*icalc) | |
189 | c | |
190 | c load plot buffers | |
191 | c | |
192 | lout=loutpt | |
193 | do 710 i=1,icalc | |
194 | xvar=dreal(cvalue(lout+1)) | |
195 | locyt=locy | |
196 | do 700 k=1,kntr | |
197 | iseq=itab(k) | |
198 | iseq=nodplc(iseq+4) | |
199 | cval=cvalue(lout+iseq) | |
200 | ktype=itype(k) | |
201 | go to (670,670,650,660,670,670), ktype | |
202 | 650 yvr=dreal(cval) | |
203 | go to 695 | |
204 | 660 yvr=dimag(cval) | |
205 | go to 695 | |
206 | 670 call magphs(cval,xmag,xphs) | |
207 | go to (680,680,650,660,690,685), ktype | |
208 | 680 yvr=dlog10(xmag) | |
209 | go to 695 | |
210 | 685 yvr=20.0d0*dlog10(xmag) | |
211 | go to 695 | |
212 | 690 yvr=xphs | |
213 | 695 value(locyt+i)=yvr | |
214 | locyt=locyt+icalc | |
215 | 700 continue | |
216 | value(locx+i)=xvar | |
217 | lout=lout+numout | |
218 | 710 continue | |
219 | call plot(icalc,locx,locy,locv) | |
220 | call clrmem(locx) | |
221 | call clrmem(locy) | |
222 | 750 loc=nodplc(loc) | |
223 | go to 610 | |
224 | 760 continue | |
225 | c | |
226 | c finished | |
227 | c | |
228 | 1000 call clrmem(loutpt) | |
229 | call second(t2) | |
230 | rstats(11)=rstats(11)+t2-t1 | |
231 | return | |
232 | end | |
233 | subroutine ntrpl8(locx,locy,numpnt) | |
234 | implicit double precision (a-h,o-z) | |
235 | c | |
236 | c this routine interpolates the analysis data to obtain the values | |
237 | c printed and/or plotted, using linear interpolation. | |
238 | c | |
239 | common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, | |
240 | 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, | |
241 | 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, | |
242 | 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, | |
243 | 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, | |
244 | 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval | |
245 | common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, | |
246 | 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, | |
247 | 2 itemno,nosolv,ipostp,iscrch | |
248 | common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8), | |
249 | 1 ilogy(8),npoint,numout,kntr,numdgt | |
250 | common /blank/ value(1000) | |
251 | integer nodplc(64) | |
252 | complex*16 cvalue(32) | |
253 | equivalence (value(1),nodplc(1),cvalue(1)) | |
254 | if(mode.ne.1) go to 4 | |
255 | numpnt=icalc | |
256 | loco=loutpt | |
257 | do 3 i=1,numpnt | |
258 | locyt=locy | |
259 | value(locx+i)=value(loco+1) | |
260 | do 2 k=1,kntr | |
261 | iseq=itab(k) | |
262 | iseq=nodplc(iseq+4) | |
263 | value(locyt+i)=value(loco+iseq) | |
264 | locyt=locyt+npoint | |
265 | 2 continue | |
266 | loco=loco+numout | |
267 | 3 continue | |
268 | return | |
269 | 4 continue | |
270 | xvar=xstart | |
271 | xvtol=xincr*1.0d-5 | |
272 | ippnt=0 | |
273 | icpnt=2 | |
274 | loco1=loutpt | |
275 | loco2=loco1+numout | |
276 | if (icalc.lt.2) go to 50 | |
277 | 10 x1=value(loco1+1) | |
278 | x2=value(loco2+1) | |
279 | dx1x2=x1-x2 | |
280 | 20 if (xincr.lt.0.0d0) go to 24 | |
281 | if (xvar.le.(x2+xvtol)) go to 30 | |
282 | go to 28 | |
283 | 24 if (xvar.ge.(x2+xvtol)) go to 30 | |
284 | 28 if (icpnt.ge.icalc) go to 100 | |
285 | icpnt=icpnt+1 | |
286 | loco1=loco2 | |
287 | loco2=loco1+numout | |
288 | go to 10 | |
289 | 30 ippnt=ippnt+1 | |
290 | value(locx+ippnt)=xvar | |
291 | dxx1=xvar-x1 | |
292 | locyt=locy | |
293 | do 40 i=1,kntr | |
294 | iseq=itab(i) | |
295 | iseq=nodplc(iseq+4) | |
296 | v1=value(loco1+iseq) | |
297 | v2=value(loco2+iseq) | |
298 | yvr=v1+(v1-v2)*dxx1/dx1x2 | |
299 | tol=dmin1(dabs(v1),dabs(v2))*1.0d-10 | |
300 | if (dabs(yvr).le.tol) yvr=0.0d0 | |
301 | value(locyt+ippnt)=yvr | |
302 | locyt=locyt+npoint | |
303 | 40 continue | |
304 | if (ippnt.ge.npoint) go to 100 | |
305 | xvar=xstart+dfloat(ippnt)*xincr | |
306 | if (dabs(xvar).ge.dabs(xvtol)) go to 20 | |
307 | xvar=0.0d0 | |
308 | go to 20 | |
309 | c | |
310 | c special handling if icalc = 1 | |
311 | c | |
312 | c... icalc=1; just copy over the single point and return | |
313 | 50 ippnt=1 | |
314 | value(locx+ippnt)=xvar | |
315 | locyt=locy | |
316 | do 60 i=1,kntr | |
317 | iseq=itab(i) | |
318 | iseq=nodplc(iseq+4) | |
319 | value(locyt+ippnt)=value(loco1+iseq) | |
320 | locyt=locyt+npoint | |
321 | 60 continue | |
322 | go to 100 | |
323 | c | |
324 | c return | |
325 | c | |
326 | 100 numpnt=ippnt | |
327 | return | |
328 | end | |
329 | subroutine setprn(loc) | |
330 | implicit double precision (a-h,o-z) | |
331 | c | |
332 | c this routine formats the column headers for tabular listings of | |
333 | c output variables. | |
334 | c | |
335 | common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, | |
336 | 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, | |
337 | 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, | |
338 | 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, | |
339 | 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, | |
340 | 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval | |
341 | common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, | |
342 | 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, | |
343 | 2 itemno,nosolv,ipostp,iscrch | |
344 | common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, | |
345 | 1 defas,rstats(50),iwidth,lwidth,nopage | |
346 | common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop, | |
347 | 1 kinel,kidin,kovar,kidout | |
348 | common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq, | |
349 | 1 inoise,nosprt,nosout,nosin,idist,idprt | |
350 | common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg | |
351 | common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8), | |
352 | 1 ilogy(8),npoint,numout,kntr,numdgt | |
353 | common /blank/ value(1000) | |
354 | integer nodplc(64) | |
355 | complex*16 cvalue(32) | |
356 | equivalence (value(1),nodplc(1),cvalue(1)) | |
357 | c | |
358 | data ablnk, atimex, afreq / 1h , 6h time, 6h freq / | |
359 | c | |
360 | c set limits depending upon the analysis mode | |
361 | c | |
362 | if (mode-2) 10,20,30 | |
363 | 10 xstart=tcstar(1) | |
364 | xincr=tcincr(1) | |
365 | npoint=icvflg | |
366 | itemp=itcelm(1) | |
367 | loce=nodplc(itemp+1) | |
368 | asweep=value(loce) | |
369 | go to 40 | |
370 | 20 xstart=tstart | |
371 | xincr=tstep | |
372 | npoint=jtrflg | |
373 | asweep=atimex | |
374 | go to 40 | |
375 | 30 xstart=fstart | |
376 | xincr=fincr | |
377 | npoint=icalc | |
378 | asweep=afreq | |
379 | c | |
380 | c construct and print the output variable names | |
381 | c | |
382 | 40 loct=loc+2 | |
383 | ipos=1 | |
384 | npos=ipos+numdgt+8 | |
385 | do 90 i=1,kntr | |
386 | loct=loct+2 | |
387 | itab(i)=nodplc(loct) | |
388 | itype(i)=nodplc(loct+1) | |
389 | call outnam(itab(i),itype(i),string,ipos) | |
390 | if (ipos.ge.npos) go to 70 | |
391 | do 60 j=ipos,npos | |
392 | call move(string,j,ablnk,1,1) | |
393 | 60 continue | |
394 | ipos=npos | |
395 | go to 80 | |
396 | 70 call move(string,ipos,ablnk,1,1) | |
397 | ipos=ipos+1 | |
398 | 80 npos=npos+numdgt+8 | |
399 | 90 continue | |
400 | call move(string,ipos,ablnk,1,7) | |
401 | jstop=(ipos+6)/8 | |
402 | write (6,91) asweep,(string(j),j=1,jstop) | |
403 | 91 format(/3x,a8,5x,14a8,a4) | |
404 | write (6,101) | |
405 | 101 format(1hx/1h ) | |
406 | return | |
407 | end | |
408 | subroutine setplt(loc) | |
409 | implicit double precision (a-h,o-z) | |
410 | c | |
411 | c this routine generates the 'legend' subheading used to identify | |
412 | c individual traces on multi-trace line-printer plots. | |
413 | c | |
414 | common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, | |
415 | 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, | |
416 | 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, | |
417 | 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, | |
418 | 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, | |
419 | 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval | |
420 | common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, | |
421 | 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, | |
422 | 2 itemno,nosolv,ipostp,iscrch | |
423 | common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, | |
424 | 1 defas,rstats(50),iwidth,lwidth,nopage | |
425 | common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop, | |
426 | 1 kinel,kidin,kovar,kidout | |
427 | common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq, | |
428 | 1 inoise,nosprt,nosout,nosin,idist,idprt | |
429 | common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg | |
430 | common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8), | |
431 | 1 ilogy(8),npoint,numout,kntr,numdgt | |
432 | common /blank/ value(1000) | |
433 | integer nodplc(64) | |
434 | complex*16 cvalue(32) | |
435 | equivalence (value(1),nodplc(1),cvalue(1)) | |
436 | c | |
437 | dimension logopt(6) | |
438 | data logopt / 2, 2, 1, 1, 1, 1 / | |
439 | data ablnk, atimex, afreq / 1h , 6h time, 6h freq / | |
440 | data pltsym / 8h*+=$0<>? / | |
441 | c | |
442 | c set limits depending upon the analysis mode | |
443 | c | |
444 | if (mode-2) 10,20,30 | |
445 | 10 xstart=tcstar(1) | |
446 | xincr=tcincr(1) | |
447 | npoint=icvflg | |
448 | itemp=itcelm(1) | |
449 | loce=nodplc(itemp+1) | |
450 | asweep=value(loce) | |
451 | go to 40 | |
452 | 20 xstart=tstart | |
453 | xincr=tstep | |
454 | npoint=jtrflg | |
455 | asweep=atimex | |
456 | go to 40 | |
457 | 30 xstart=fstart | |
458 | xincr=fincr | |
459 | npoint=jacflg | |
460 | asweep=afreq | |
461 | c | |
462 | c construct and print the output variables with corresponding plot | |
463 | c symbols | |
464 | c | |
465 | 40 loct=loc+2 | |
466 | if (kntr.eq.1) go to 80 | |
467 | write (6,41) | |
468 | 41 format('0legend:'/) | |
469 | do 70 i=1,kntr | |
470 | loct=loct+2 | |
471 | itab(i)=nodplc(loct) | |
472 | ioutyp=nodplc(loct+1) | |
473 | itype(i)=ioutyp | |
474 | ilogy(i)=1 | |
475 | if (mode.le.2) go to 50 | |
476 | ilogy(i)=logopt(ioutyp) | |
477 | 50 ipos=1 | |
478 | call outnam(itab(i),itype(i),string,ipos) | |
479 | call move(string,ipos,ablnk,1,7) | |
480 | jstop=(ipos+6)/8 | |
481 | call move(achar,1,pltsym,i,1) | |
482 | write (6,61) achar,(string(j),j=1,jstop) | |
483 | 61 format(1x,a1,2h: ,5a8) | |
484 | 70 continue | |
485 | 80 if (kntr.ge.2) go to 90 | |
486 | itab(1)=nodplc(loc+4) | |
487 | ioutyp=nodplc(loc+5) | |
488 | itype(1)=ioutyp | |
489 | ilogy(1)=1 | |
490 | if (mode.le.2) go to 90 | |
491 | ilogy(1)=logopt(ioutyp) | |
492 | 90 ipos=1 | |
493 | call outnam(itab(1),itype(1),string,ipos) | |
494 | call move(string,ipos,ablnk,1,7) | |
495 | jstop=(ipos+6)/8 | |
496 | write (6,101) asweep,(string(j),j=1,jstop) | |
497 | 101 format(1hx/3x,a8,4x,5a8) | |
498 | return | |
499 | end | |
500 | subroutine plot(numpnt,locx,locy,locv) | |
501 | implicit double precision (a-h,o-z) | |
502 | c | |
503 | c this routine generates the line-printer plots. | |
504 | c | |
505 | common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, | |
506 | 1 defas,rstats(50),iwidth,lwidth,nopage | |
507 | common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, | |
508 | 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, | |
509 | 2 itemno,nosolv,ipostp,iscrch | |
510 | common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, | |
511 | 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox | |
512 | common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8), | |
513 | 1 ilogy(8),npoint,numout,kntr,numdgt | |
514 | common /blank/ value(1000) | |
515 | integer nodplc(64) | |
516 | complex*16 cvalue(32) | |
517 | equivalence (value(1),nodplc(1),cvalue(1)) | |
518 | c | |
519 | c | |
520 | integer xxor | |
521 | dimension ycoor(5,8),icoor(8),delplt(8) | |
522 | dimension agraph(13),aplot(13) | |
523 | dimension asym(2),pmin(8),jcoor(8) | |
524 | data ablnk, aletx, aper / 1h , 1hx, 1h. / | |
525 | data asym1, asym2, arprn / 8h(-------, 8h--------, 1h) / | |
526 | data pltsym / 8h*+=$0<>? / | |
527 | c | |
528 | c | |
529 | iwide=1 | |
530 | nwide=101 | |
531 | nwide4=25 | |
532 | if(lwidth.gt.80) go to 3 | |
533 | iwide=0 | |
534 | nwide=57 | |
535 | nwide4=14 | |
536 | 3 if (numpnt.le.0) go to 400 | |
537 | do 5 i=1,13 | |
538 | agraph(i)=ablnk | |
539 | 5 continue | |
540 | do 7 i=1,5 | |
541 | ispot=1+nwide4*(i-1) | |
542 | call move(agraph,ispot,aper,1,1) | |
543 | 7 continue | |
544 | locyt=locy | |
545 | lspot=locv-1 | |
546 | mltscl=0 | |
547 | if (value(locv).eq.0.0d0) mltscl=1 | |
548 | do 235 k=1,kntr | |
549 | lspot=lspot+2 | |
550 | ymin=value(lspot) | |
551 | ymax=value(lspot+1) | |
552 | if (ymin.ne.0.0d0) go to 10 | |
553 | if (ymax.ne.0.0d0) go to 10 | |
554 | go to 100 | |
555 | 10 ymin1=dmin1(ymin,ymax) | |
556 | ymax1=dmax1(ymin,ymax) | |
557 | 30 if (ilogy(k).eq.1) go to 40 | |
558 | ymin1=dlog10(dmax1(ymin1,1.0d-20)) | |
559 | ymax1=dlog10(dmax1(ymax1,1.0d-20)) | |
560 | del=dmax1(ymax1-ymin1,0.0001d0)/4.0d0 | |
561 | go to 50 | |
562 | 40 del=dmax1(ymax1-ymin1,1.0d-20)/4.0d0 | |
563 | 50 ymin=ymin1 | |
564 | ymax=ymax1 | |
565 | go to 200 | |
566 | c | |
567 | c determine max and min values | |
568 | c | |
569 | 100 ymax1=value(locyt+1) | |
570 | ymin1=ymax1 | |
571 | if (numpnt.eq.1) go to 150 | |
572 | do 110 i=2,numpnt | |
573 | ymin1=dmin1(ymin1,value(locyt+i)) | |
574 | ymax1=dmax1(ymax1,value(locyt+i)) | |
575 | 110 continue | |
576 | c | |
577 | c scaling | |
578 | c | |
579 | 150 call scale(ymin1,ymax1,4,ymin,ymax,del) | |
580 | c | |
581 | c determine coordinates | |
582 | c | |
583 | 200 ycoor(1,k)=ymin | |
584 | pmin(k)=ymin | |
585 | small=del*1.0d-4 | |
586 | if (dabs(ycoor(1,k)).le.small) ycoor(1,k)=0.0d0 | |
587 | do 210 i=1,4 | |
588 | ycoor(i+1,k)=ycoor(i,k)+del | |
589 | if (dabs(ycoor(i+1,k)).le.small) ycoor(i+1,k)=0.0d0 | |
590 | 210 continue | |
591 | if (ilogy(k).eq.1) go to 230 | |
592 | do 220 i=1,5 | |
593 | 220 ycoor(i,k)=dexp(xlog10*ycoor(i,k)) | |
594 | 230 delplt(k)=del/dfloat(nwide4) | |
595 | locyt=locyt+npoint | |
596 | 235 continue | |
597 | c | |
598 | c count distinct coordinates | |
599 | c | |
600 | icoor(1)=1 | |
601 | jcoor(1)=1 | |
602 | numcor=1 | |
603 | if (kntr.eq.1) go to 290 | |
604 | do 250 i=2,kntr | |
605 | do 245 j=1,numcor | |
606 | l=jcoor(j) | |
607 | c... coordinates are *equal* if the most significant 24 bits agree | |
608 | do 240 k=1,5 | |
609 | y1=ycoor(k,i) | |
610 | y2=ycoor(k,l) | |
611 | if(y1.eq.0.0d0.and.y2.eq.0.0d0) go to 240 | |
612 | if(dabs((y1-y2)/dmax1(dabs(y1),dabs(y2))).ge.1.0d-7) go to 245 | |
613 | 240 continue | |
614 | icoor(i)=l | |
615 | go to 250 | |
616 | 245 continue | |
617 | icoor(i)=i | |
618 | numcor=numcor+1 | |
619 | jcoor(numcor)=i | |
620 | 250 continue | |
621 | c | |
622 | c print coordinates | |
623 | c | |
624 | 260 do 280 i=1,numcor | |
625 | asym(1)=asym1 | |
626 | asym(2)=asym2 | |
627 | ipos=2 | |
628 | do 270 j=1,kntr | |
629 | if (icoor(j).ne.jcoor(i)) go to 270 | |
630 | call move(asym,ipos,pltsym,j,1) | |
631 | ipos=ipos+1 | |
632 | 270 continue | |
633 | call move(asym,ipos,arprn,1,1) | |
634 | k=jcoor(i) | |
635 | if(iwide.ne.0) write(6,271) asym,(ycoor(j,k),j=1,5) | |
636 | 271 format(/1hx,2a8,4h----,1pd12.3,4(15x,d10.3)/26x,51(2h -)) | |
637 | if(iwide.eq.0) write(6,273) asym,(ycoor(j,k),j=1,5) | |
638 | 273 format(/1hx,2a8,1pd10.3,3(4x,d10.3),1x,d10.3/22x,29(2h -)) | |
639 | 280 continue | |
640 | go to 300 | |
641 | 290 if(iwide.ne.0) write(6,291) (ycoor(j,1),j=1,5) | |
642 | 291 format(/1hx,20x,1pd12.3,4(15x,d10.3)/26x,51(2h -)) | |
643 | if(iwide.eq.0) write(6,293) (ycoor(j,1),j=1,5) | |
644 | 293 format(/1hx,14x,1pd12.3,3(4x,d10.3),1x,d10.3/22x,29(2h -)) | |
645 | c | |
646 | c plotting | |
647 | c | |
648 | 300 aspot=ablnk | |
649 | do 320 i=1,numpnt | |
650 | xvar=value(locx+i) | |
651 | locyt=locy | |
652 | call copy8(agraph,aplot,13) | |
653 | do 310 k=1,kntr | |
654 | yvr=value(locyt+i) | |
655 | ktmp=icoor(k) | |
656 | ymin1=pmin(ktmp) | |
657 | jpoint=idint((yvr-ymin1)/delplt(k)+0.5d0)+1 | |
658 | if (jpoint.le.0) go to 306 | |
659 | if (jpoint.gt.nwide) go to 306 | |
660 | call move(aspot,1,aplot,jpoint,1) | |
661 | if (aspot.eq.ablnk) go to 303 | |
662 | if (aspot.eq.aper) go to 303 | |
663 | call move(aplot,jpoint,aletx,1,1) | |
664 | go to 306 | |
665 | 303 call move(aplot,jpoint,pltsym,k,1) | |
666 | 306 locyt=locyt+npoint | |
667 | 310 continue | |
668 | yvr=value(locy+i) | |
669 | if (ilogy(1).eq.1) go to 315 | |
670 | yvr=dexp(xlog10*yvr) | |
671 | 315 if(iwide.ne.0) write(6,316) xvar,yvr,aplot | |
672 | 316 format(1x,1pd10.3,2x,d10.3,2x,13a8) | |
673 | if(iwide.eq.0) write(6,317) xvar,yvr,(aplot(k),k=1,8) | |
674 | 317 format(1x,1pd10.3,1x,d10.3,7a8,a1) | |
675 | 320 continue | |
676 | c | |
677 | c finished | |
678 | c | |
679 | if(iwide.ne.0) write(6,331) | |
680 | 331 format(26x,51(2h -)//) | |
681 | if(iwide.eq.0) write(6,332) | |
682 | 332 format(21x,29(2h -)//) | |
683 | go to 500 | |
684 | c | |
685 | c too few points | |
686 | c | |
687 | 400 write (6,401) | |
688 | 401 format('0warning: too few points for plotting'/) | |
689 | 500 write (6,501) | |
690 | 501 format(1hy) | |
691 | return | |
692 | end | |
693 | subroutine scale(xmin,xmax,n,xminp,xmaxp,del) | |
694 | implicit double precision (a-h,o-z) | |
695 | c | |
696 | c this routine determines the 'optimal' scale to use for the plot of | |
697 | c some output variable. | |
698 | c | |
699 | c | |
700 | c adapted from algorithm 463 of 'collected algorithms of the cacm' | |
701 | c | |
702 | common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, | |
703 | 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox | |
704 | integer xxor | |
705 | dimension vint(5) | |
706 | data vint / 1.0d0,2.0d0,5.0d0,10.0d0,20.0d0 / | |
707 | data eps / 1.0d-12 / | |
708 | c | |
709 | c | |
710 | c... trap too-small data spread | |
711 | if(xmin.eq.0.0d0.and.xmax.eq.0.0d0) go to 4 | |
712 | if(dabs((xmax-xmin)/dmax1(dabs(xmin),dabs(xmax))).ge.1.0d-4) | |
713 | 1 go to 10 | |
714 | 4 continue | |
715 | if (xmin.ge.0.0d0) go to 5 | |
716 | xmax=0.5d0*xmin+eps | |
717 | xmin=1.5d0*xmin-eps | |
718 | go to 10 | |
719 | 5 xmax=1.5d0*xmin+eps | |
720 | xmin=0.5d0*xmin-eps | |
721 | c... find approximate interval size, normalized to [1,10] | |
722 | 10 a=(xmax-xmin)/dfloat(n) | |
723 | nal=idint(dlog10(a)) | |
724 | if (a.lt.1.0d0) nal=nal-1 | |
725 | xfact=dexp(xlog10*dfloat(nal)) | |
726 | b=a/xfact | |
727 | c... find closest permissible interval size | |
728 | do 20 i=1,3 | |
729 | if (b.lt.(vint(i)+eps)) go to 30 | |
730 | 20 continue | |
731 | i=4 | |
732 | c... compute interval size | |
733 | 30 del=vint(i)*xfact | |
734 | fm1=xmin/del | |
735 | m1=fm1 | |
736 | if (fm1.lt.0.0d0) m1=m1-1 | |
737 | if (dabs(dfloat(m1)+1.0d0-fm1).lt.eps) m1=m1+1 | |
738 | c... compute new maximum and minimum limits | |
739 | xminp=del*dfloat(m1) | |
740 | fm2=xmax/del | |
741 | m2=fm2+1.0d0 | |
742 | if (fm2.lt.(-1.0d0)) m2=m2-1 | |
743 | if (dabs(fm2+1.0d0-dfloat(m2)).lt.eps) m2=m2-1 | |
744 | xmaxp=del*dfloat(m2) | |
745 | np=m2-m1 | |
746 | c... check whether another loop required | |
747 | if (np.le.n) go to 40 | |
748 | i=i+1 | |
749 | go to 30 | |
750 | c... do final adjustments and correct for roundoff error(s) | |
751 | 40 nx=(n-np)/2 | |
752 | xminp=dmin1(xmin,xminp-dfloat(nx)*del) | |
753 | xmaxp=dmax1(xmax,xminp+dfloat(n)*del) | |
754 | return | |
755 | end | |
756 | subroutine fouran | |
757 | implicit double precision (a-h,o-z) | |
758 | c | |
759 | c this routine determines the fourier coefficients of a transient | |
760 | c analysis waveform. | |
761 | c | |
762 | common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, | |
763 | 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, | |
764 | 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, | |
765 | 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, | |
766 | 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, | |
767 | 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval | |
768 | common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, | |
769 | 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs | |
770 | common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, | |
771 | 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof | |
772 | common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, | |
773 | 1 defas,rstats(50),iwidth,lwidth,nopage | |
774 | common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, | |
775 | 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, | |
776 | 2 itemno,nosolv,ipostp,iscrch | |
777 | common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, | |
778 | 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox | |
779 | common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg | |
780 | common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8), | |
781 | 1 ilogy(8),npoint,numout,kntr,numdgt | |
782 | common /blank/ value(1000) | |
783 | integer nodplc(64) | |
784 | complex*16 cvalue(32) | |
785 | equivalence (value(1),nodplc(1),cvalue(1)) | |
786 | c | |
787 | c | |
788 | dimension sinco(9),cosco(9) | |
789 | dimension fortit(4) | |
790 | data fortit / 8hfourier , 8hanalysis, 8h , 8h / | |
791 | data ablnk / 1h / | |
792 | c | |
793 | c | |
794 | forprd=1.0d0/forfre | |
795 | xstart=tstop-forprd | |
796 | kntr=1 | |
797 | xn=101.0d0 | |
798 | xincr=forprd/xn | |
799 | npoint=xn | |
800 | call getm8(locx,npoint) | |
801 | call getm8(locy,npoint) | |
802 | do 105 nknt=1,nfour | |
803 | itab(1)=nodplc(ifour+nknt) | |
804 | kfrout=itab(1) | |
805 | call ntrpl8(locx,locy,numpnt) | |
806 | dcco=0.0d0 | |
807 | call zero8(sinco,9) | |
808 | call zero8(cosco,9) | |
809 | loct=locy+1 | |
810 | ipnt=0 | |
811 | 10 yvr=value(loct+ipnt) | |
812 | dcco=dcco+yvr | |
813 | forfac=dfloat(ipnt)*twopi/xn | |
814 | arg=0.0d0 | |
815 | do 20 k=1,9 | |
816 | arg=arg+forfac | |
817 | sinco(k)=sinco(k)+yvr*dsin(arg) | |
818 | cosco(k)=cosco(k)+yvr*dcos(arg) | |
819 | 20 continue | |
820 | ipnt=ipnt+1 | |
821 | if (ipnt.ne.npoint) go to 10 | |
822 | dcco=dcco/xn | |
823 | forfac=2.0d0/xn | |
824 | do 30 k=1,9 | |
825 | sinco(k)=sinco(k)*forfac | |
826 | cosco(k)=cosco(k)*forfac | |
827 | 30 continue | |
828 | call title(0,72,1,fortit) | |
829 | ipos=1 | |
830 | call outnam(kfrout,1,string,ipos) | |
831 | call move(string,ipos,ablnk,1,7) | |
832 | jstop=(ipos+6)/8 | |
833 | write (6,61) (string(j),j=1,jstop) | |
834 | 61 format(' fourier components of transient response ',5a8///) | |
835 | write (6,71) dcco | |
836 | 71 format('0dc component =',1pd12.3/, | |
837 | 1 '0harmonic frequency fourier normalized phase no | |
838 | 2rmalized'/, | |
839 | 3 ' no (hz) component component (deg) pha | |
840 | 4se (deg)'//) | |
841 | iknt=1 | |
842 | freq1=forfre | |
843 | xnharm=1.0d0 | |
844 | call magphs(dcmplx(sinco(1),cosco(1)),xnorm,pnorm) | |
845 | phasen=0.0d0 | |
846 | write (6,81) iknt,freq1,xnorm,xnharm,pnorm,phasen | |
847 | 81 format(i6,1pd15.3,d12.3,0pf13.6,f10.3,f12.3/) | |
848 | thd=0.0d0 | |
849 | do 90 iknt=2,9 | |
850 | freq1=dfloat(iknt)*forfre | |
851 | call magphs(dcmplx(sinco(iknt),cosco(iknt)), | |
852 | 1 harm,phase) | |
853 | xnharm=harm/xnorm | |
854 | phasen=phase-pnorm | |
855 | thd=thd+xnharm*xnharm | |
856 | write (6,81) iknt,freq1,harm,xnharm,phase,phasen | |
857 | 90 continue | |
858 | thd=100.0d0*dsqrt(thd) | |
859 | write (6,101) thd | |
860 | 101 format (//5x,'total harmonic distortion = ',f12.6,' percent') | |
861 | 105 continue | |
862 | call clrmem(locx) | |
863 | call clrmem(locy) | |
864 | 110 return | |
865 | end |