| 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 |