|
|
1.1 ! root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.