+ subroutine ovtpvt
+ implicit double precision (a-h,o-z)
+c
+c
+c this routine generates the requested tabular listings of analysis
+c results. it calls plot to generate line-printer plots.
+c
+ common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
+ 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
+ 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
+ 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
+ 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
+ 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
+ common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
+ 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
+ common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
+ 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
+ 2 itemno,nosolv,ipostp,iscrch
+ common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
+ 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
+ common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
+ 1 defas,rstats(50),iwidth,lwidth,nopage
+ common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
+ 1 kinel,kidin,kovar,kidout
+ common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
+ 1 inoise,nosprt,nosout,nosin,idist,idprt
+ common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
+ common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
+ 1 ilogy(8),npoint,numout,kntr,numdgt
+ common /blank/ value(1000)
+ integer nodplc(64)
+ complex*16 cvalue(32)
+ equivalence (value(1),nodplc(1),cvalue(1))
+c
+ complex*16 cval
+ dimension prform(3)
+ dimension subtit(4,3)
+ data subtit / 8hdc trans, 8hfer curv, 8hes , 8h ,
+ 1 8htransien, 8ht analys, 8his , 8h ,
+ 2 8hac analy, 8hsis , 8h , 8h /
+ data prform / 8h(1pe11.3, 8h,2x,8e00, 8h.00) /
+ data aper,rprn / 1h., 1h) /
+c
+ call second(t1)
+ if (icalc.le.0) go to 1000
+ call crunch
+ if (nogo.lt.0) go to 1000
+c
+c construct format statement to be used for printing the outputs
+c
+ ifract=max0(numdgt-1,0)
+ ifwdth=ifract+9
+ ipos=15
+ call alfnum(ifwdth,prform,ipos)
+ call move(prform,ipos,aper,1,1)
+ ipos=ipos+1
+ call alfnum(ifract,prform,ipos)
+ call move(prform,ipos,rprn,1,1)
+c
+ noprln=min0(8,(lwidth-12)/ifwdth)
+ if (mode-2) 50,60,300
+ 50 numout=jelcnt(41)+1
+ go to 70
+ 60 numout=jelcnt(42)+1
+c
+c dc and transient analysis printing
+c
+ 70 loc=locate(30+mode)
+ 80 if (loc.eq.0) go to 200
+ kntr=min0(noprln,nodplc(loc+3))
+ if (kntr.le.0) go to 120
+ call title(1,lwidth,1,subtit(1,mode))
+ call setprn(loc)
+c
+c get buffer space
+c
+ call getm8(locx,npoint)
+ call getm8(locy,kntr*npoint)
+c
+c interpolate outputs
+c
+ call ntrpl8(locx,locy,numpnt)
+c
+c print outputs
+c
+ do 100 i=1,numpnt
+ xvar=value(locx+i)
+ locyt=locy
+ do 90 k=1,kntr
+ yvar(k)=value(locyt+i)
+ locyt=locyt+npoint
+ 90 continue
+ write (6,prform) xvar,(yvar(k),k=1,kntr)
+ 100 continue
+ write (6,111)
+ 111 format(1hy)
+ call clrmem(locx)
+ call clrmem(locy)
+ 120 loc=nodplc(loc)
+ go to 80
+c
+c dc and transient analysis plotting
+c
+ 200 loc=locate(35+mode)
+ 210 if (loc.eq.0) go to 250
+ kntr=nodplc(loc+3)
+ if (kntr.le.0) go to 220
+ locv=nodplc(loc+1)
+ call title(1,lwidth,1,subtit(1,mode))
+ call setplt(loc)
+c
+c get buffer space
+c
+ call getm8(locx,npoint)
+ call getm8(locy,kntr*npoint)
+c
+c interpolate outputs and load plot buffers
+c
+ call ntrpl8(locx,locy,numpnt)
+ call plot(numpnt,locx,locy,locv)
+ call clrmem(locx)
+ call clrmem(locy)
+ 220 loc=nodplc(loc)
+ go to 210
+c
+c fourier analysis
+c
+ 250 if (mode.eq.1) go to 1000
+ if (nfour.eq.0) go to 1000
+ if (nogo.ne.0) go to 1000
+ call fouran
+ go to 1000
+c
+c ac analysis printing
+c
+ 300 numout=jelcnt(43)+jelcnt(44)+jelcnt(45)+1
+ do 599 id=33,35
+ loc=locate(id)
+ 320 if (loc.eq.0) go to 599
+ kntr=min0(noprln,nodplc(loc+3))
+ if (kntr.le.0) go to 595
+ call title(1,lwidth,1,subtit(1,mode))
+ call setprn(loc)
+c
+c print ac outputs
+c
+ lout=loutpt
+ do 590 i=1,icalc
+ xvar=dreal(cvalue(lout+1))
+ do 500 k=1,kntr
+ iseq=itab(k)
+ iseq=nodplc(iseq+4)
+ cval=cvalue(lout+iseq)
+ ktype=itype(k)
+ go to (450,450,430,440,450,450), ktype
+ 430 yvar(k)=dreal(cval)
+ go to 500
+ 440 yvar(k)=dimag(cval)
+ go to 500
+ 450 call magphs(cval,xmag,xphs)
+ go to (460,460,430,440,470,465), ktype
+ 460 yvar(k)=xmag
+ go to 500
+ 465 yvar(k)=20.0d0*dlog10(xmag)
+ go to 500
+ 470 yvar(k)=xphs
+ 500 continue
+ lout=lout+numout
+ 580 write (6,prform) xvar,(yvar(k),k=1,kntr)
+ 590 continue
+ write (6,111)
+ 595 loc=nodplc(loc)
+ go to 320
+ 599 continue
+c
+c ac analysis plotting
+c
+ do 760 id=38,40
+ loc=locate(id)
+ 610 if (loc.eq.0) go to 760
+ kntr=nodplc(loc+3)
+ if (kntr.le.0) go to 750
+ locv=nodplc(loc+1)
+ call title(1,lwidth,1,subtit(1,mode))
+ call setplt(loc)
+c
+ call getm8(locx,icalc)
+ call getm8(locy,kntr*icalc)
+c
+c load plot buffers
+c
+ lout=loutpt
+ do 710 i=1,icalc
+ xvar=dreal(cvalue(lout+1))
+ locyt=locy
+ do 700 k=1,kntr
+ iseq=itab(k)
+ iseq=nodplc(iseq+4)
+ cval=cvalue(lout+iseq)
+ ktype=itype(k)
+ go to (670,670,650,660,670,670), ktype
+ 650 yvr=dreal(cval)
+ go to 695
+ 660 yvr=dimag(cval)
+ go to 695
+ 670 call magphs(cval,xmag,xphs)
+ go to (680,680,650,660,690,685), ktype
+ 680 yvr=dlog10(xmag)
+ go to 695
+ 685 yvr=20.0d0*dlog10(xmag)
+ go to 695
+ 690 yvr=xphs
+ 695 value(locyt+i)=yvr
+ locyt=locyt+icalc
+ 700 continue
+ value(locx+i)=xvar
+ lout=lout+numout
+ 710 continue
+ call plot(icalc,locx,locy,locv)
+ call clrmem(locx)
+ call clrmem(locy)
+ 750 loc=nodplc(loc)
+ go to 610
+ 760 continue
+c
+c finished
+c
+ 1000 call clrmem(loutpt)
+ call second(t2)
+ rstats(11)=rstats(11)+t2-t1
+ return
+ end
+ subroutine ntrpl8(locx,locy,numpnt)
+ implicit double precision (a-h,o-z)
+c
+c this routine interpolates the analysis data to obtain the values
+c printed and/or plotted, using linear interpolation.
+c
+ common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
+ 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
+ 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
+ 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
+ 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
+ 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
+ common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
+ 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
+ 2 itemno,nosolv,ipostp,iscrch
+ common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
+ 1 ilogy(8),npoint,numout,kntr,numdgt
+ common /blank/ value(1000)
+ integer nodplc(64)
+ complex*16 cvalue(32)
+ equivalence (value(1),nodplc(1),cvalue(1))
+ if(mode.ne.1) go to 4
+ numpnt=icalc
+ loco=loutpt
+ do 3 i=1,numpnt
+ locyt=locy
+ value(locx+i)=value(loco+1)
+ do 2 k=1,kntr
+ iseq=itab(k)
+ iseq=nodplc(iseq+4)
+ value(locyt+i)=value(loco+iseq)
+ locyt=locyt+npoint
+ 2 continue
+ loco=loco+numout
+ 3 continue
+ return
+ 4 continue
+ xvar=xstart
+ xvtol=xincr*1.0d-5
+ ippnt=0
+ icpnt=2
+ loco1=loutpt
+ loco2=loco1+numout
+ if (icalc.lt.2) go to 50
+ 10 x1=value(loco1+1)
+ x2=value(loco2+1)
+ dx1x2=x1-x2
+ 20 if (xincr.lt.0.0d0) go to 24
+ if (xvar.le.(x2+xvtol)) go to 30
+ go to 28
+ 24 if (xvar.ge.(x2+xvtol)) go to 30
+ 28 if (icpnt.ge.icalc) go to 100
+ icpnt=icpnt+1
+ loco1=loco2
+ loco2=loco1+numout
+ go to 10
+ 30 ippnt=ippnt+1
+ value(locx+ippnt)=xvar
+ dxx1=xvar-x1
+ locyt=locy
+ do 40 i=1,kntr
+ iseq=itab(i)
+ iseq=nodplc(iseq+4)
+ v1=value(loco1+iseq)
+ v2=value(loco2+iseq)
+ yvr=v1+(v1-v2)*dxx1/dx1x2
+ tol=dmin1(dabs(v1),dabs(v2))*1.0d-10
+ if (dabs(yvr).le.tol) yvr=0.0d0
+ value(locyt+ippnt)=yvr
+ locyt=locyt+npoint
+ 40 continue
+ if (ippnt.ge.npoint) go to 100
+ xvar=xstart+dfloat(ippnt)*xincr
+ if (dabs(xvar).ge.dabs(xvtol)) go to 20
+ xvar=0.0d0
+ go to 20
+c
+c special handling if icalc = 1
+c
+c... icalc=1; just copy over the single point and return
+ 50 ippnt=1
+ value(locx+ippnt)=xvar
+ locyt=locy
+ do 60 i=1,kntr
+ iseq=itab(i)
+ iseq=nodplc(iseq+4)
+ value(locyt+ippnt)=value(loco1+iseq)
+ locyt=locyt+npoint
+ 60 continue
+ go to 100
+c
+c return
+c
+ 100 numpnt=ippnt
+ return
+ end
+ subroutine setprn(loc)
+ implicit double precision (a-h,o-z)
+c
+c this routine formats the column headers for tabular listings of
+c output variables.
+c
+ common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
+ 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
+ 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
+ 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
+ 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
+ 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
+ common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
+ 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
+ 2 itemno,nosolv,ipostp,iscrch
+ common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
+ 1 defas,rstats(50),iwidth,lwidth,nopage
+ common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
+ 1 kinel,kidin,kovar,kidout
+ common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
+ 1 inoise,nosprt,nosout,nosin,idist,idprt
+ common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
+ common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
+ 1 ilogy(8),npoint,numout,kntr,numdgt
+ common /blank/ value(1000)
+ integer nodplc(64)
+ complex*16 cvalue(32)
+ equivalence (value(1),nodplc(1),cvalue(1))
+c
+ data ablnk, atimex, afreq / 1h , 6h time, 6h freq /
+c
+c set limits depending upon the analysis mode
+c
+ if (mode-2) 10,20,30
+ 10 xstart=tcstar(1)
+ xincr=tcincr(1)
+ npoint=icvflg
+ itemp=itcelm(1)
+ loce=nodplc(itemp+1)
+ asweep=value(loce)
+ go to 40
+ 20 xstart=tstart
+ xincr=tstep
+ npoint=jtrflg
+ asweep=atimex
+ go to 40
+ 30 xstart=fstart
+ xincr=fincr
+ npoint=icalc
+ asweep=afreq
+c
+c construct and print the output variable names
+c
+ 40 loct=loc+2
+ ipos=1
+ npos=ipos+numdgt+8
+ do 90 i=1,kntr
+ loct=loct+2
+ itab(i)=nodplc(loct)
+ itype(i)=nodplc(loct+1)
+ call outnam(itab(i),itype(i),string,ipos)
+ if (ipos.ge.npos) go to 70
+ do 60 j=ipos,npos
+ call move(string,j,ablnk,1,1)
+ 60 continue
+ ipos=npos
+ go to 80
+ 70 call move(string,ipos,ablnk,1,1)
+ ipos=ipos+1
+ 80 npos=npos+numdgt+8
+ 90 continue
+ call move(string,ipos,ablnk,1,7)
+ jstop=(ipos+6)/8
+ write (6,91) asweep,(string(j),j=1,jstop)
+ 91 format(/3x,a8,5x,14a8,a4)
+ write (6,101)
+ 101 format(1hx/1h )
+ return
+ end
+ subroutine setplt(loc)
+ implicit double precision (a-h,o-z)
+c
+c this routine generates the 'legend' subheading used to identify
+c individual traces on multi-trace line-printer plots.
+c
+ common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
+ 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
+ 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
+ 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
+ 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
+ 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
+ common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
+ 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
+ 2 itemno,nosolv,ipostp,iscrch
+ common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
+ 1 defas,rstats(50),iwidth,lwidth,nopage
+ common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
+ 1 kinel,kidin,kovar,kidout
+ common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
+ 1 inoise,nosprt,nosout,nosin,idist,idprt
+ common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
+ common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
+ 1 ilogy(8),npoint,numout,kntr,numdgt
+ common /blank/ value(1000)
+ integer nodplc(64)
+ complex*16 cvalue(32)
+ equivalence (value(1),nodplc(1),cvalue(1))
+c
+ dimension logopt(6)
+ data logopt / 2, 2, 1, 1, 1, 1 /
+ data ablnk, atimex, afreq / 1h , 6h time, 6h freq /
+ data pltsym / 8h*+=$0<>? /
+c
+c set limits depending upon the analysis mode
+c
+ if (mode-2) 10,20,30
+ 10 xstart=tcstar(1)
+ xincr=tcincr(1)
+ npoint=icvflg
+ itemp=itcelm(1)
+ loce=nodplc(itemp+1)
+ asweep=value(loce)
+ go to 40
+ 20 xstart=tstart
+ xincr=tstep
+ npoint=jtrflg
+ asweep=atimex
+ go to 40
+ 30 xstart=fstart
+ xincr=fincr
+ npoint=jacflg
+ asweep=afreq
+c
+c construct and print the output variables with corresponding plot
+c symbols
+c
+ 40 loct=loc+2
+ if (kntr.eq.1) go to 80
+ write (6,41)
+ 41 format('0legend:'/)
+ do 70 i=1,kntr
+ loct=loct+2
+ itab(i)=nodplc(loct)
+ ioutyp=nodplc(loct+1)
+ itype(i)=ioutyp
+ ilogy(i)=1
+ if (mode.le.2) go to 50
+ ilogy(i)=logopt(ioutyp)
+ 50 ipos=1
+ call outnam(itab(i),itype(i),string,ipos)
+ call move(string,ipos,ablnk,1,7)
+ jstop=(ipos+6)/8
+ call move(achar,1,pltsym,i,1)
+ write (6,61) achar,(string(j),j=1,jstop)
+ 61 format(1x,a1,2h: ,5a8)
+ 70 continue
+ 80 if (kntr.ge.2) go to 90
+ itab(1)=nodplc(loc+4)
+ ioutyp=nodplc(loc+5)
+ itype(1)=ioutyp
+ ilogy(1)=1
+ if (mode.le.2) go to 90
+ ilogy(1)=logopt(ioutyp)
+ 90 ipos=1
+ call outnam(itab(1),itype(1),string,ipos)
+ call move(string,ipos,ablnk,1,7)
+ jstop=(ipos+6)/8
+ write (6,101) asweep,(string(j),j=1,jstop)
+ 101 format(1hx/3x,a8,4x,5a8)
+ return
+ end
+ subroutine plot(numpnt,locx,locy,locv)
+ implicit double precision (a-h,o-z)
+c
+c this routine generates the line-printer plots.
+c
+ common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
+ 1 defas,rstats(50),iwidth,lwidth,nopage
+ common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
+ 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
+ 2 itemno,nosolv,ipostp,iscrch
+ common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
+ 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
+ common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
+ 1 ilogy(8),npoint,numout,kntr,numdgt
+ common /blank/ value(1000)
+ integer nodplc(64)
+ complex*16 cvalue(32)
+ equivalence (value(1),nodplc(1),cvalue(1))
+c
+c
+ integer xxor
+ dimension ycoor(5,8),icoor(8),delplt(8)
+ dimension agraph(13),aplot(13)
+ dimension asym(2),pmin(8),jcoor(8)
+ data ablnk, aletx, aper / 1h , 1hx, 1h. /
+ data asym1, asym2, arprn / 8h(-------, 8h--------, 1h) /
+ data pltsym / 8h*+=$0<>? /
+c
+c
+ iwide=1
+ nwide=101
+ nwide4=25
+ if(lwidth.gt.80) go to 3
+ iwide=0
+ nwide=57
+ nwide4=14
+ 3 if (numpnt.le.0) go to 400
+ do 5 i=1,13
+ agraph(i)=ablnk
+ 5 continue
+ do 7 i=1,5
+ ispot=1+nwide4*(i-1)
+ call move(agraph,ispot,aper,1,1)
+ 7 continue
+ locyt=locy
+ lspot=locv-1
+ mltscl=0
+ if (value(locv).eq.0.0d0) mltscl=1
+ do 235 k=1,kntr
+ lspot=lspot+2
+ ymin=value(lspot)
+ ymax=value(lspot+1)
+ if (ymin.ne.0.0d0) go to 10
+ if (ymax.ne.0.0d0) go to 10
+ go to 100
+ 10 ymin1=dmin1(ymin,ymax)
+ ymax1=dmax1(ymin,ymax)
+ 30 if (ilogy(k).eq.1) go to 40
+ ymin1=dlog10(dmax1(ymin1,1.0d-20))
+ ymax1=dlog10(dmax1(ymax1,1.0d-20))
+ del=dmax1(ymax1-ymin1,0.0001d0)/4.0d0
+ go to 50
+ 40 del=dmax1(ymax1-ymin1,1.0d-20)/4.0d0
+ 50 ymin=ymin1
+ ymax=ymax1
+ go to 200
+c
+c determine max and min values
+c
+ 100 ymax1=value(locyt+1)
+ ymin1=ymax1
+ if (numpnt.eq.1) go to 150
+ do 110 i=2,numpnt
+ ymin1=dmin1(ymin1,value(locyt+i))
+ ymax1=dmax1(ymax1,value(locyt+i))
+ 110 continue
+c
+c scaling
+c
+ 150 call scale(ymin1,ymax1,4,ymin,ymax,del)
+c
+c determine coordinates
+c
+ 200 ycoor(1,k)=ymin
+ pmin(k)=ymin
+ small=del*1.0d-4
+ if (dabs(ycoor(1,k)).le.small) ycoor(1,k)=0.0d0
+ do 210 i=1,4
+ ycoor(i+1,k)=ycoor(i,k)+del
+ if (dabs(ycoor(i+1,k)).le.small) ycoor(i+1,k)=0.0d0
+ 210 continue
+ if (ilogy(k).eq.1) go to 230
+ do 220 i=1,5
+ 220 ycoor(i,k)=dexp(xlog10*ycoor(i,k))
+ 230 delplt(k)=del/dfloat(nwide4)
+ locyt=locyt+npoint
+ 235 continue
+c
+c count distinct coordinates
+c
+ icoor(1)=1
+ jcoor(1)=1
+ numcor=1
+ if (kntr.eq.1) go to 290
+ do 250 i=2,kntr
+ do 245 j=1,numcor
+ l=jcoor(j)
+c... coordinates are *equal* if the most significant 24 bits agree
+ do 240 k=1,5
+ y1=ycoor(k,i)
+ y2=ycoor(k,l)
+ if(y1.eq.0.0d0.and.y2.eq.0.0d0) go to 240
+ if(dabs((y1-y2)/dmax1(dabs(y1),dabs(y2))).ge.1.0d-7) go to 245
+ 240 continue
+ icoor(i)=l
+ go to 250
+ 245 continue
+ icoor(i)=i
+ numcor=numcor+1
+ jcoor(numcor)=i
+ 250 continue
+c
+c print coordinates
+c
+ 260 do 280 i=1,numcor
+ asym(1)=asym1
+ asym(2)=asym2
+ ipos=2
+ do 270 j=1,kntr
+ if (icoor(j).ne.jcoor(i)) go to 270
+ call move(asym,ipos,pltsym,j,1)
+ ipos=ipos+1
+ 270 continue
+ call move(asym,ipos,arprn,1,1)
+ k=jcoor(i)
+ if(iwide.ne.0) write(6,271) asym,(ycoor(j,k),j=1,5)
+ 271 format(/1hx,2a8,4h----,1pd12.3,4(15x,d10.3)/26x,51(2h -))
+ if(iwide.eq.0) write(6,273) asym,(ycoor(j,k),j=1,5)
+ 273 format(/1hx,2a8,1pd10.3,3(4x,d10.3),1x,d10.3/22x,29(2h -))
+ 280 continue
+ go to 300
+ 290 if(iwide.ne.0) write(6,291) (ycoor(j,1),j=1,5)
+ 291 format(/1hx,20x,1pd12.3,4(15x,d10.3)/26x,51(2h -))
+ if(iwide.eq.0) write(6,293) (ycoor(j,1),j=1,5)
+ 293 format(/1hx,14x,1pd12.3,3(4x,d10.3),1x,d10.3/22x,29(2h -))
+c
+c plotting
+c
+ 300 aspot=ablnk
+ do 320 i=1,numpnt
+ xvar=value(locx+i)
+ locyt=locy
+ call copy8(agraph,aplot,13)
+ do 310 k=1,kntr
+ yvr=value(locyt+i)
+ ktmp=icoor(k)
+ ymin1=pmin(ktmp)
+ jpoint=idint((yvr-ymin1)/delplt(k)+0.5d0)+1
+ if (jpoint.le.0) go to 306
+ if (jpoint.gt.nwide) go to 306
+ call move(aspot,1,aplot,jpoint,1)
+ if (aspot.eq.ablnk) go to 303
+ if (aspot.eq.aper) go to 303
+ call move(aplot,jpoint,aletx,1,1)
+ go to 306
+ 303 call move(aplot,jpoint,pltsym,k,1)
+ 306 locyt=locyt+npoint
+ 310 continue
+ yvr=value(locy+i)
+ if (ilogy(1).eq.1) go to 315
+ yvr=dexp(xlog10*yvr)
+ 315 if(iwide.ne.0) write(6,316) xvar,yvr,aplot
+ 316 format(1x,1pd10.3,2x,d10.3,2x,13a8)
+ if(iwide.eq.0) write(6,317) xvar,yvr,(aplot(k),k=1,8)
+ 317 format(1x,1pd10.3,1x,d10.3,7a8,a1)
+ 320 continue
+c
+c finished
+c
+ if(iwide.ne.0) write(6,331)
+ 331 format(26x,51(2h -)//)
+ if(iwide.eq.0) write(6,332)
+ 332 format(21x,29(2h -)//)
+ go to 500
+c
+c too few points
+c
+ 400 write (6,401)
+ 401 format('0warning: too few points for plotting'/)
+ 500 write (6,501)
+ 501 format(1hy)
+ return
+ end
+ subroutine scale(xmin,xmax,n,xminp,xmaxp,del)
+ implicit double precision (a-h,o-z)
+c
+c this routine determines the 'optimal' scale to use for the plot of
+c some output variable.
+c
+c
+c adapted from algorithm 463 of 'collected algorithms of the cacm'
+c
+ common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
+ 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
+ integer xxor
+ dimension vint(5)
+ data vint / 1.0d0,2.0d0,5.0d0,10.0d0,20.0d0 /
+ data eps / 1.0d-12 /
+c
+c
+c... trap too-small data spread
+ if(xmin.eq.0.0d0.and.xmax.eq.0.0d0) go to 4
+ if(dabs((xmax-xmin)/dmax1(dabs(xmin),dabs(xmax))).ge.1.0d-4)
+ 1 go to 10
+ 4 continue
+ if (xmin.ge.0.0d0) go to 5
+ xmax=0.5d0*xmin+eps
+ xmin=1.5d0*xmin-eps
+ go to 10
+ 5 xmax=1.5d0*xmin+eps
+ xmin=0.5d0*xmin-eps
+c... find approximate interval size, normalized to [1,10]
+ 10 a=(xmax-xmin)/dfloat(n)
+ nal=idint(dlog10(a))
+ if (a.lt.1.0d0) nal=nal-1
+ xfact=dexp(xlog10*dfloat(nal))
+ b=a/xfact
+c... find closest permissible interval size
+ do 20 i=1,3
+ if (b.lt.(vint(i)+eps)) go to 30
+ 20 continue
+ i=4
+c... compute interval size
+ 30 del=vint(i)*xfact
+ fm1=xmin/del
+ m1=fm1
+ if (fm1.lt.0.0d0) m1=m1-1
+ if (dabs(dfloat(m1)+1.0d0-fm1).lt.eps) m1=m1+1
+c... compute new maximum and minimum limits
+ xminp=del*dfloat(m1)
+ fm2=xmax/del
+ m2=fm2+1.0d0
+ if (fm2.lt.(-1.0d0)) m2=m2-1
+ if (dabs(fm2+1.0d0-dfloat(m2)).lt.eps) m2=m2-1
+ xmaxp=del*dfloat(m2)
+ np=m2-m1
+c... check whether another loop required
+ if (np.le.n) go to 40
+ i=i+1
+ go to 30
+c... do final adjustments and correct for roundoff error(s)
+ 40 nx=(n-np)/2
+ xminp=dmin1(xmin,xminp-dfloat(nx)*del)
+ xmaxp=dmax1(xmax,xminp+dfloat(n)*del)
+ return
+ end
+ subroutine fouran
+ implicit double precision (a-h,o-z)
+c
+c this routine determines the fourier coefficients of a transient
+c analysis waveform.
+c
+ common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
+ 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
+ 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
+ 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
+ 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
+ 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
+ common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
+ 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
+ common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
+ 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
+ common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
+ 1 defas,rstats(50),iwidth,lwidth,nopage
+ common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
+ 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
+ 2 itemno,nosolv,ipostp,iscrch
+ common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
+ 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
+ common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
+ common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
+ 1 ilogy(8),npoint,numout,kntr,numdgt
+ common /blank/ value(1000)
+ integer nodplc(64)
+ complex*16 cvalue(32)
+ equivalence (value(1),nodplc(1),cvalue(1))
+c
+c
+ dimension sinco(9),cosco(9)
+ dimension fortit(4)
+ data fortit / 8hfourier , 8hanalysis, 8h , 8h /
+ data ablnk / 1h /
+c
+c
+ forprd=1.0d0/forfre
+ xstart=tstop-forprd
+ kntr=1
+ xn=101.0d0
+ xincr=forprd/xn
+ npoint=xn
+ call getm8(locx,npoint)
+ call getm8(locy,npoint)
+ do 105 nknt=1,nfour
+ itab(1)=nodplc(ifour+nknt)
+ kfrout=itab(1)
+ call ntrpl8(locx,locy,numpnt)
+ dcco=0.0d0
+ call zero8(sinco,9)
+ call zero8(cosco,9)
+ loct=locy+1
+ ipnt=0
+ 10 yvr=value(loct+ipnt)
+ dcco=dcco+yvr
+ forfac=dfloat(ipnt)*twopi/xn
+ arg=0.0d0
+ do 20 k=1,9
+ arg=arg+forfac
+ sinco(k)=sinco(k)+yvr*dsin(arg)
+ cosco(k)=cosco(k)+yvr*dcos(arg)
+ 20 continue
+ ipnt=ipnt+1
+ if (ipnt.ne.npoint) go to 10
+ dcco=dcco/xn
+ forfac=2.0d0/xn
+ do 30 k=1,9
+ sinco(k)=sinco(k)*forfac
+ cosco(k)=cosco(k)*forfac
+ 30 continue
+ call title(0,72,1,fortit)
+ ipos=1
+ call outnam(kfrout,1,string,ipos)
+ call move(string,ipos,ablnk,1,7)
+ jstop=(ipos+6)/8
+ write (6,61) (string(j),j=1,jstop)
+ 61 format(' fourier components of transient response ',5a8///)
+ write (6,71) dcco
+ 71 format('0dc component =',1pd12.3/,
+ 1 '0harmonic frequency fourier normalized phase no
+ 2rmalized'/,
+ 3 ' no (hz) component component (deg) pha
+ 4se (deg)'//)
+ iknt=1
+ freq1=forfre
+ xnharm=1.0d0
+ call magphs(dcmplx(sinco(1),cosco(1)),xnorm,pnorm)
+ phasen=0.0d0
+ write (6,81) iknt,freq1,xnorm,xnharm,pnorm,phasen
+ 81 format(i6,1pd15.3,d12.3,0pf13.6,f10.3,f12.3/)
+ thd=0.0d0
+ do 90 iknt=2,9
+ freq1=dfloat(iknt)*forfre
+ call magphs(dcmplx(sinco(iknt),cosco(iknt)),
+ 1 harm,phase)
+ xnharm=harm/xnorm
+ phasen=phase-pnorm
+ thd=thd+xnharm*xnharm
+ write (6,81) iknt,freq1,harm,xnharm,phase,phasen
+ 90 continue
+ thd=100.0d0*dsqrt(thd)
+ write (6,101) thd
+ 101 format (//5x,'total harmonic distortion = ',f12.6,' percent')
+ 105 continue
+ call clrmem(locx)
+ call clrmem(locy)
+ 110 return
+ end