|
|
1.1 ! root 1: subroutine acan ! 2: implicit double precision (a-h,o-z) ! 3: c ! 4: c ! 5: c this routine drives the small-signal analyses. ! 6: c ! 7: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 8: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 9: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 10: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 11: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 12: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 13: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, ! 14: 1 defas,rstats(50),iwidth,lwidth,nopage ! 15: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 16: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 17: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, ! 18: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, ! 19: 2 itemno,nosolv,ipostp,iscrch ! 20: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, ! 21: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof ! 22: common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, ! 23: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox ! 24: common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq, ! 25: 1 inoise,nosprt,nosout,nosin,idist,idprt ! 26: common /cje/ maxtim,itime,icost ! 27: common /blank/ value(1000) ! 28: integer nodplc(64) ! 29: complex*16 cvalue(32) ! 30: equivalence (value(1),nodplc(1),cvalue(1)) ! 31: data aendor /9.87654321d0/ ! 32: call second(t1) ! 33: c.. post-processor initialization ! 34: if(ipostp.eq.0) go to 1 ! 35: numcur=jelcnt(9) ! 36: numpos=nunods+numcur ! 37: call getm16(ibuff,numpos) ! 38: numpos=numpos*4 ! 39: if(numcur.eq.0) go to 1 ! 40: loc=locate(9) ! 41: loccur=nodplc(loc+6)-1 ! 42: c ! 43: c allocate storage ! 44: c ! 45: 1 call getm8(ndiag,2*nstop) ! 46: call getm8(lvn,nstop) ! 47: call getm8(imvn,nstop) ! 48: call getm16(lcvn,nstop) ! 49: call getm8(lynl,nstop+nut+nlt) ! 50: call getm8(imynl,nstop+nut+nlt) ! 51: if (idist.ne.0) call dinit ! 52: nandd=0 ! 53: if (inoise.eq.0) go to 10 ! 54: if (idist.eq.0) go to 10 ! 55: nandd=1 ! 56: call getm16(lvnctc,nstop) ! 57: 10 call getm16(loutpt,0) ! 58: call crunch ! 59: lyu=lynl+nstop ! 60: lyl=lyu+nut ! 61: numout=jelcnt(43)+jelcnt(44)+jelcnt(45)+1 ! 62: c if(ipostp.ne.0) call pheadr(atitle) ! 63: icalc=0 ! 64: freq=fstart ! 65: c ! 66: c load y matrix and c vector, solve for v vector ! 67: c ! 68: 100 call getcje ! 69: if ((maxtim-itime).le.limtim) go to 900 ! 70: omega=twopi*freq ! 71: call acload ! 72: call acdcmp ! 73: call acsol ! 74: if (igoof.eq.0) go to 200 ! 75: write (6,121) igoof,freq ! 76: 121 format('0warning: underflow ',i4,' time(s) in ac analysis at freq ! 77: 1 = ',1pd9.3,' hz') ! 78: igoof=0 ! 79: c ! 80: c store outputs ! 81: c ! 82: 200 call extmem(loutpt,numout) ! 83: loco=loutpt+icalc*numout ! 84: icalc=icalc+1 ! 85: cvalue(loco+1)=dcmplx(freq,omega) ! 86: loc=locate(43) ! 87: 310 if (loc.eq.0) go to 350 ! 88: if (nodplc(loc+5).ne.0) go to 320 ! 89: node1=nodplc(loc+2) ! 90: node2=nodplc(loc+3) ! 91: iseq=nodplc(loc+4) ! 92: cvalue(loco+iseq)=cvalue(lcvn+node1)-cvalue(lcvn+node2) ! 93: loc=nodplc(loc) ! 94: go to 310 ! 95: 320 iptr=nodplc(loc+2) ! 96: iptr=nodplc(iptr+6) ! 97: iseq=nodplc(loc+4) ! 98: cvalue(loco+iseq)=cvalue(lcvn+iptr) ! 99: loc=nodplc(loc) ! 100: go to 310 ! 101: 350 if(ipostp.eq.0) go to 400 ! 102: cvalue(ibuff+1)=dcmplx(freq,0.0d0) ! 103: call copy16(cvalue(lcvn+2),cvalue(ibuff+2),nunods-1) ! 104: if(numcur.ne.0) call copy16(cvalue(lcvn+loccur+1), ! 105: 1 cvalue(ibuff+nunods+1),numcur) ! 106: call dblsgl(cvalue(ibuff+1),numpos) ! 107: c call fwrite(cvalue(ibuff+1),numpos) ! 108: c ! 109: c noise and distortion analyses ! 110: c ! 111: 400 if (nandd.eq.0) go to 410 ! 112: call copy16(cvalue(lcvn+1),cvalue(lvnctc+1),nstop) ! 113: 410 if (inoise.ne.0) call noise(loco) ! 114: if (nandd.eq.0) go to 420 ! 115: call copy16(cvalue(lvnctc+1),cvalue(lcvn+1),nstop) ! 116: 420 if (idist.ne.0) call disto(loco) ! 117: c ! 118: c increment frequency ! 119: c ! 120: if (icalc.ge.jacflg) go to 1000 ! 121: if (idfreq.ge.3) go to 510 ! 122: freq=freq*fincr ! 123: go to 100 ! 124: 510 freq=freq+fincr ! 125: go to 100 ! 126: c ! 127: c finished ! 128: c ! 129: 900 write (6,901) ! 130: 901 format('0*error*: cpu time limit exceeded ... analysis stopped'/) ! 131: nogo=1 ! 132: 1000 if(ipostp.eq.0) go to 1010 ! 133: cvalue(ibuff+1)=aendor ! 134: c call fwrite(cvalue(ibuff+1),numpos) ! 135: if(ipostp.ne.0) call clrmem(ibuff) ! 136: 1010 call clrmem(lvnim1) ! 137: call clrmem(lx0) ! 138: call clrmem(lvn) ! 139: call clrmem(imvn) ! 140: call clrmem(lcvn) ! 141: call clrmem(imynl) ! 142: call clrmem(lynl) ! 143: call clrmem(ndiag) ! 144: if (idist.eq.0) go to 1020 ! 145: call clrmem(ld0) ! 146: call clrmem(ld1) ! 147: 1020 if (nandd.eq.0) go to 1040 ! 148: call clrmem(lvnctc) ! 149: 1040 call second(t2) ! 150: rstats(7)=rstats(7)+t2-t1 ! 151: rstats(8)=rstats(8)+icalc ! 152: return ! 153: end ! 154: subroutine cdiv(xr,xi,yr,yi,cr,ci) ! 155: c.. ok if cr and ci are really xr and xi or yr and yi ! 156: implicit double precision (a-h,o-z) ! 157: xrtemp=xr ! 158: xitemp=xi ! 159: yrtemp=yr ! 160: yitemp=yi ! 161: amag2=yrtemp*yrtemp+yitemp*yitemp ! 162: cr=(xrtemp*yrtemp+xitemp*yitemp)/amag2 ! 163: ci=(xitemp*yrtemp-xrtemp*yitemp)/amag2 ! 164: return ! 165: end ! 166: subroutine cmult(xr,xi,yr,yi,cr,ci) ! 167: c.. ok if cr and ci are really xr and xi or yr and yi ! 168: implicit double precision (a-h,o-z) ! 169: xrtemp=xr ! 170: xitemp=xi ! 171: yrtemp=yr ! 172: yitemp=yi ! 173: cr=xrtemp*yrtemp-xitemp*yitemp ! 174: ci=xitemp*yrtemp+xrtemp*yitemp ! 175: return ! 176: end ! 177: subroutine dblsgl(carray,nwds) ! 178: c.. note that carray really contains complex*16 ! 179: complex*8 carray(1) ! 180: complex*8 ctemp8(2),ctemp3 ! 181: complex*16 ctemp ! 182: equivalence (ctemp,ctemp8(1)) ! 183: c ! 184: c.. gather up numpos 16-bit words from dbl-complex to ! 185: c.. make up sgl-complex ! 186: c ! 187: num=nwds/4 ! 188: do 10 i=1,num ! 189: ndex=2*i-1 ! 190: ctemp8(1)=carray(ndex) ! 191: ctemp8(2)=carray(ndex+1) ! 192: ctemp3=ctemp ! 193: carray(i)=ctemp3 ! 194: 10 continue ! 195: return ! 196: end ! 197: subroutine acdcmp ! 198: implicit double precision (a-h,o-z) ! 199: c ! 200: c this routine performs an lu factorization of the circuit equation ! 201: c coefficient matrix. ! 202: c ! 203: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 204: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 205: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 206: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 207: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 208: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 209: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 210: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 211: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, ! 212: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof ! 213: common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, ! 214: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox ! 215: common /blank/ value(1000) ! 216: integer nodplc(64) ! 217: complex*16 cvalue(32) ! 218: equivalence (value(1),nodplc(1),cvalue(1)) ! 219: c ! 220: c ! 221: do 100 i=2,nstop ! 222: io=nodplc(iorder+i) ! 223: gdiag=dabs(value(lynl+io))+dabs(value(imynl+io)) ! 224: if (gdiag.ge.gmin) go to 10 ! 225: value(lynl+io)=gmin ! 226: value(imynl+io)=0.0d0 ! 227: igoof=igoof+1 ! 228: 10 jstart=nodplc(ilc+i) ! 229: jstop=nodplc(ilc+i+1)-1 ! 230: if (jstart.gt.jstop) go to 100 ! 231: do 90 j=jstart,jstop ! 232: call cdiv(value(lyl+j),value(imynl+nstop+nut+j),value(lynl+io), ! 233: 1 value(imynl+io),value(lyl+j),value(imynl+nstop+nut+j)) ! 234: icol=nodplc(ilr+j) ! 235: kstart=nodplc(iur+i) ! 236: kstop=nodplc(iur+i+1)-1 ! 237: if (kstart.gt.kstop) go to 90 ! 238: do 80 k=kstart,kstop ! 239: irow=nodplc(iuc+k) ! 240: if (icol-irow) 20,60,40 ! 241: c ! 242: c find (icol,irow) matrix term (upper triangle) ! 243: c ! 244: 20 l=nodplc(iur+icol+1) ! 245: 30 l=l-1 ! 246: if (nodplc(iuc+l).ne.irow) go to 30 ! 247: ispot=lyu+l ! 248: ispot2=imynl+nstop+l ! 249: go to 70 ! 250: c ! 251: c find (icol,irow) matrix term (lower triangle) ! 252: c ! 253: 40 l=nodplc(ilc+irow+1) ! 254: 50 l=l-1 ! 255: if (nodplc(ilr+l).ne.icol) go to 50 ! 256: ispot=lyl+l ! 257: ispot2=imynl+nstop+nut+l ! 258: go to 70 ! 259: c ! 260: c find (icol,irow) matrix term (diagonal) ! 261: c ! 262: 60 ispot=lynl+nodplc(iorder+irow) ! 263: ispot2=imynl+nodplc(iorder+irow) ! 264: c ! 265: 70 call cmult(value(lyl+j),value(imynl+nstop+nut+j), ! 266: 1 value(lyu+k),value(imynl+nstop+k),xreal,ximag) ! 267: value(ispot)=value(ispot)-xreal ! 268: value(ispot2)=value(ispot2)-ximag ! 269: 80 continue ! 270: 90 continue ! 271: 100 continue ! 272: return ! 273: end ! 274: subroutine acsol ! 275: implicit double precision (a-h,o-z) ! 276: c ! 277: c this routine solves the circuit equations by performing a forward ! 278: c and backward substitution using the previously-computed lu factors. ! 279: c ! 280: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 281: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 282: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 283: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 284: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 285: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 286: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 287: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 288: common /blank/ value(1000) ! 289: integer nodplc(64) ! 290: complex*16 cvalue(32) ! 291: equivalence (value(1),nodplc(1),cvalue(1)) ! 292: c ! 293: c forward substitution ! 294: c ! 295: do 20 i=2,nstop ! 296: jstart=nodplc(ilc+i) ! 297: jstop=nodplc(ilc+i+1)-1 ! 298: if (jstart.gt.jstop) go to 20 ! 299: io=nodplc(iorder+i) ! 300: if (value(lvn+io).ne.0.0d0) go to 5 ! 301: if (value(imvn+io).eq.0.0d0) go to 20 ! 302: 5 do 10 j=jstart,jstop ! 303: jo=nodplc(ilr+j) ! 304: jo=nodplc(iorder+jo) ! 305: call cmult(value(lyl+j),value(imynl+nstop+nut+j),value(lvn+io), ! 306: 1 value(imvn+io),xreal,ximag) ! 307: value(lvn+jo)=value(lvn+jo)-xreal ! 308: value(imvn+jo)=value(imvn+jo)-ximag ! 309: 10 continue ! 310: 20 continue ! 311: c ! 312: c back substitution ! 313: c ! 314: k=nstop+1 ! 315: do 50 i=2,nstop ! 316: k=k-1 ! 317: io=nodplc(iorder+k) ! 318: jstart=nodplc(iur+k) ! 319: jstop=nodplc(iur+k+1)-1 ! 320: if (jstart.gt.jstop) go to 40 ! 321: do 30 j=jstart,jstop ! 322: jo=nodplc(iuc+j) ! 323: jo=nodplc(iorder+jo) ! 324: call cmult(value(lyu+j),value(imynl+nstop+j),value(lvn+jo), ! 325: 1 value(imvn+jo),xreal,ximag) ! 326: value(lvn+io)=value(lvn+io)-xreal ! 327: value(imvn+io)=value(imvn+io)-ximag ! 328: 30 continue ! 329: 40 call cdiv(value(lvn+io),value(imvn+io),value(lynl+io), ! 330: 1 value(imynl+io),value(lvn+io),value(imvn+io)) ! 331: 50 continue ! 332: do 100 i=2,nstop ! 333: cvalue(lcvn+i)=dcmplx(value(lvn+i),value(imvn+i)) ! 334: 100 continue ! 335: cvalue(lcvn+1)=dcmplx(0.0d0,0.0d0) ! 336: return ! 337: end ! 338: subroutine acload ! 339: implicit double precision (a-h,o-z) ! 340: c ! 341: c this routine zeroes-out and then loads the complex coefficient ! 342: c matrix. ! 343: c ! 344: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 345: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 346: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 347: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 348: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 349: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 350: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 351: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 352: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, ! 353: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, ! 354: 2 itemno,nosolv,ipostp,iscrch ! 355: common /blank/ value(1000) ! 356: integer nodplc(64) ! 357: complex*16 cvalue(32) ! 358: equivalence (value(1),nodplc(1),cvalue(1)) ! 359: c ! 360: c ! 361: complex*16 cval ! 362: c ! 363: c zero y matrix and current vector ! 364: c ! 365: call zero8(value(lvn+1),nstop) ! 366: call zero8(value(imvn+1),nstop) ! 367: call zero8(value(lynl+1),nstop+nut+nlt) ! 368: call zero8(value(imynl+1),nstop+nut+nlt) ! 369: c ! 370: c resistors ! 371: c ! 372: loc=locate(1) ! 373: 20 if (loc.eq.0) go to 30 ! 374: locv=nodplc(loc+1) ! 375: val=value(locv+1) ! 376: locy=lynl+nodplc(loc+6) ! 377: value(locy)=value(locy)+val ! 378: locy=lynl+nodplc(loc+7) ! 379: value(locy)=value(locy)+val ! 380: locy=lynl+nodplc(loc+4) ! 381: value(locy)=value(locy)-val ! 382: locy=lynl+nodplc(loc+5) ! 383: value(locy)=value(locy)-val ! 384: loc=nodplc(loc) ! 385: go to 20 ! 386: c ! 387: c capacitors ! 388: c ! 389: 30 loc=locate(2) ! 390: 40 if (loc.eq.0) go to 50 ! 391: locv=nodplc(loc+1) ! 392: val=omega*value(locv+1) ! 393: locyi=imynl+nodplc(loc+10) ! 394: value(locyi)=value(locyi)+val ! 395: locyi=imynl+nodplc(loc+11) ! 396: value(locyi)=value(locyi)+val ! 397: locyi=imynl+nodplc(loc+5) ! 398: value(locyi)=value(locyi)-val ! 399: locyi=imynl+nodplc(loc+6) ! 400: value(locyi)=value(locyi)-val ! 401: loc=nodplc(loc) ! 402: go to 40 ! 403: c ! 404: c inductors ! 405: c ! 406: 50 loc=locate(3) ! 407: 60 if (loc.eq.0) go to 70 ! 408: locv=nodplc(loc+1) ! 409: val=omega*value(locv+1) ! 410: locyi=imynl+nodplc(loc+13) ! 411: locy=lynl+nodplc(loc+13) ! 412: value(locy)=0.0d0 ! 413: value(locyi)=-val ! 414: locy=lynl+nodplc(loc+6) ! 415: locyi=imynl+nodplc(loc+6) ! 416: value(locy)=1.0d0 ! 417: value(locyi)=0.0d0 ! 418: locy=lynl+nodplc(loc+7) ! 419: locyi=imynl+nodplc(loc+7) ! 420: value(locy)=-1.0d0 ! 421: value(locyi)=0.0d0 ! 422: locy=lynl+nodplc(loc+8) ! 423: locyi=imynl+nodplc(loc+8) ! 424: value(locy)=1.0d0 ! 425: value(locyi)=0.0d0 ! 426: locy=lynl+nodplc(loc+9) ! 427: locyi=imynl+nodplc(loc+9) ! 428: value(locy)=-1.0d0 ! 429: value(locyi)=0.0d0 ! 430: loc=nodplc(loc) ! 431: go to 60 ! 432: c ! 433: c mutual inductors ! 434: c ! 435: 70 loc=locate(4) ! 436: 80 if (loc.eq.0) go to 90 ! 437: locv=nodplc(loc+1) ! 438: val=omega*value(locv+1) ! 439: locy=lynl+nodplc(loc+4) ! 440: locyi=imynl+nodplc(loc+4) ! 441: value(locy)=0.0d0 ! 442: value(locyi)=-val ! 443: locy=lynl+nodplc(loc+5) ! 444: locyi=imynl+nodplc(loc+5) ! 445: value(locy)=0.0d0 ! 446: value(locyi)=-val ! 447: loc=nodplc(loc) ! 448: go to 80 ! 449: c ! 450: c nonlinear voltage controlled current sources ! 451: c ! 452: 90 loc=locate(5) ! 453: 95 if (loc.eq.0) go to 100 ! 454: ndim=nodplc(loc+4) ! 455: lmat=nodplc(loc+7) ! 456: loct=lx0+nodplc(loc+12)+2 ! 457: do 97 i=1,ndim ! 458: val=value(loct) ! 459: loct=loct+2 ! 460: locy=lynl+nodplc(lmat+1) ! 461: value(locy)=value(locy)+val ! 462: locy=lynl+nodplc(lmat+2) ! 463: value(locy)=value(locy)-val ! 464: locy=lynl+nodplc(lmat+3) ! 465: value(locy)=value(locy)-val ! 466: locy=lynl+nodplc(lmat+4) ! 467: value(locy)=value(locy)+val ! 468: lmat=lmat+4 ! 469: 97 continue ! 470: loc=nodplc(loc) ! 471: go to 95 ! 472: c ! 473: c nonlinear voltage controlled voltage sources ! 474: c ! 475: 100 loc=locate(6) ! 476: 105 if (loc.eq.0) go to 110 ! 477: ndim=nodplc(loc+4) ! 478: lmat=nodplc(loc+8) ! 479: loct=lx0+nodplc(loc+13)+3 ! 480: locy=lynl+nodplc(lmat+1) ! 481: locyi=imynl+nodplc(lmat+1) ! 482: value(locy)=+1.0d0 ! 483: value(locyi)=0.0d0 ! 484: locy=lynl+nodplc(lmat+2) ! 485: locyi=imynl+nodplc(lmat+2) ! 486: value(locy)=-1.0d0 ! 487: value(locyi)=0.0d0 ! 488: locy=lynl+nodplc(lmat+3) ! 489: locyi=imynl+nodplc(lmat+3) ! 490: value(locy)=+1.0d0 ! 491: value(locyi)=0.0d0 ! 492: locy=lynl+nodplc(lmat+4) ! 493: locyi=imynl+nodplc(lmat+4) ! 494: value(locy)=-1.0d0 ! 495: value(locyi)=0.0d0 ! 496: lmat=lmat+4 ! 497: do 107 i=1,ndim ! 498: val=value(loct) ! 499: loct=loct+2 ! 500: locy=lynl+nodplc(lmat+1) ! 501: value(locy)=value(locy)-val ! 502: locy=lynl+nodplc(lmat+2) ! 503: value(locy)=value(locy)+val ! 504: lmat=lmat+2 ! 505: 107 continue ! 506: loc=nodplc(loc) ! 507: go to 105 ! 508: c ! 509: c nonlinear current controlled current sources ! 510: c ! 511: 110 loc=locate(7) ! 512: 115 if (loc.eq.0) go to 120 ! 513: ndim=nodplc(loc+4) ! 514: lmat=nodplc(loc+7) ! 515: loct=lx0+nodplc(loc+12)+2 ! 516: do 117 i=1,ndim ! 517: val=value(loct) ! 518: loct=loct+2 ! 519: locy=lynl+nodplc(lmat+1) ! 520: locyi=imynl+nodplc(lmat+1) ! 521: value(locy)=+val ! 522: value(locyi)=0.0d0 ! 523: locy=lynl+nodplc(lmat+2) ! 524: locyi=imynl+nodplc(lmat+2) ! 525: value(locy)=-val ! 526: value(locyi)=0.0d0 ! 527: lmat=lmat+2 ! 528: 117 continue ! 529: loc=nodplc(loc) ! 530: go to 115 ! 531: c ! 532: c nonlinear current controlled voltage sources ! 533: c ! 534: 120 loc=locate(8) ! 535: 125 if (loc.eq.0) go to 140 ! 536: ndim=nodplc(loc+4) ! 537: lmat=nodplc(loc+8) ! 538: loct=lx0+nodplc(loc+13)+3 ! 539: locy=lynl+nodplc(lmat+1) ! 540: locyi=imynl+nodplc(lmat+1) ! 541: value(locy)=+1.0d0 ! 542: value(locyi)=0.0d0 ! 543: locy=lynl+nodplc(lmat+2) ! 544: locyi=imynl+nodplc(lmat+2) ! 545: value(locy)=-1.0d0 ! 546: value(locyi)=0.0d0 ! 547: locy=lynl+nodplc(lmat+3) ! 548: locyi=imynl+nodplc(lmat+3) ! 549: value(locy)=+1.0d0 ! 550: value(locyi)=0.0d0 ! 551: locy=lynl+nodplc(lmat+4) ! 552: locyi=imynl+nodplc(lmat+4) ! 553: value(locy)=-1.0d0 ! 554: value(locyi)=0.0d0 ! 555: lmat=lmat+4 ! 556: do 127 i=1,ndim ! 557: val=value(loct) ! 558: loct=loct+2 ! 559: locy=lynl+nodplc(lmat+i) ! 560: value(locy)=value(locy)-val ! 561: 127 continue ! 562: loc=nodplc(loc) ! 563: go to 125 ! 564: c ! 565: c voltage sources ! 566: c ! 567: 140 loc=locate(9) ! 568: 150 if (loc.eq.0) go to 160 ! 569: locv=nodplc(loc+1) ! 570: iptr=nodplc(loc+6) ! 571: value(lvn+iptr)=value(locv+2) ! 572: value(imvn+iptr)=value(locv+3) ! 573: locy=lynl+nodplc(loc+7) ! 574: value(locy)=value(locy)+1.0d0 ! 575: locy=lynl+nodplc(loc+8) ! 576: value(locy)=value(locy)-1.0d0 ! 577: locy=lynl+nodplc(loc+9) ! 578: value(locy)=value(locy)+1.0d0 ! 579: locy=lynl+nodplc(loc+10) ! 580: value(locy)=value(locy)-1.0d0 ! 581: loc=nodplc(loc) ! 582: go to 150 ! 583: c ! 584: c current sources ! 585: c ! 586: 160 loc=locate(10) ! 587: 170 if (loc.eq.0) go to 200 ! 588: locv=nodplc(loc+1) ! 589: node1=nodplc(loc+2) ! 590: node2=nodplc(loc+3) ! 591: value(lvn+node1)=value(lvn+node1)-value(locv+2) ! 592: value(imvn+node1)=value(imvn+node1)-value(locv+3) ! 593: value(lvn+node2)=value(lvn+node2)+value(locv+2) ! 594: value(imvn+node2)=value(imvn+node2)+value(locv+3) ! 595: loc=nodplc(loc) ! 596: go to 170 ! 597: c ! 598: c diodes ! 599: c ! 600: 200 loc=locate(11) ! 601: 210 if (loc.eq.0) go to 250 ! 602: locv=nodplc(loc+1) ! 603: area=value(locv+1) ! 604: locm=nodplc(loc+5) ! 605: locm=nodplc(locm+1) ! 606: loct=lx0+nodplc(loc+11) ! 607: gspr=value(locm+2)*area ! 608: geq=value(loct+2) ! 609: xceq=value(loct+4)*omega ! 610: locy=lynl+nodplc(loc+13) ! 611: value(locy)=value(locy)+gspr ! 612: locy=lynl+nodplc(loc+14) ! 613: locyi=imynl+nodplc(loc+14) ! 614: value(locy)=value(locy)+geq ! 615: value(locyi)=value(locyi)+xceq ! 616: locy=lynl+nodplc(loc+15) ! 617: locyi=imynl+nodplc(loc+15) ! 618: value(locy)=value(locy)+geq+gspr ! 619: value(locyi)=value(locyi)+xceq ! 620: locy=lynl+nodplc(loc+7) ! 621: value(locy)=value(locy)-gspr ! 622: locy=lynl+nodplc(loc+8) ! 623: locyi=imynl+nodplc(loc+8) ! 624: value(locy)=value(locy)-geq ! 625: value(locyi)=value(locyi)-xceq ! 626: locy=lynl+nodplc(loc+9) ! 627: value(locy)=value(locy)-gspr ! 628: locy=lynl+nodplc(loc+10) ! 629: locyi=imynl+nodplc(loc+10) ! 630: value(locy)=value(locy)-geq ! 631: value(locyi)=value(locyi)-xceq ! 632: loc=nodplc(loc) ! 633: go to 210 ! 634: c ! 635: c bjts ! 636: c ! 637: 250 loc=locate(12) ! 638: 260 if (loc.eq.0) go to 300 ! 639: locv=nodplc(loc+1) ! 640: area=value(locv+1) ! 641: locm=nodplc(loc+8) ! 642: locm=nodplc(locm+1) ! 643: loct=lx0+nodplc(loc+22) ! 644: gcpr=value(locm+20)*area ! 645: gepr=value(locm+19)*area ! 646: gpi=value(loct+4) ! 647: gmu=value(loct+5) ! 648: gm=value(loct+6) ! 649: go=value(loct+7) ! 650: xgm=0.0d0 ! 651: td=value(locm+28) ! 652: if(td.eq.0.0d0) go to 270 ! 653: arg=td*omega ! 654: gm=gm+go ! 655: xgm=-gm*dsin(arg) ! 656: gm=gm*dcos(arg)-go ! 657: 270 gx=value(loct+16) ! 658: xcpi=value(loct+9)*omega ! 659: xcmu=value(loct+11)*omega ! 660: xcbx=value(loct+15)*omega ! 661: xccs=value(loct+13)*omega ! 662: xcmcb=value(loct+17)*omega ! 663: locy=lynl+nodplc(loc+24) ! 664: value(locy)=value(locy)+gcpr ! 665: locy=lynl+nodplc(loc+25) ! 666: locyi=imynl+nodplc(loc+25) ! 667: value(locy)=value(locy)+gx ! 668: value(locyi)=value(locyi)+xcbx ! 669: locy=lynl+nodplc(loc+26) ! 670: value(locy)=value(locy)+gepr ! 671: locy=lynl+nodplc(loc+27) ! 672: locyi=imynl+nodplc(loc+27) ! 673: value(locy)=value(locy)+gmu+go+gcpr ! 674: value(locyi)=value(locyi)+xcmu+xccs+xcbx ! 675: locy=lynl+nodplc(loc+28) ! 676: locyi=imynl+nodplc(loc+28) ! 677: value(locy)=value(locy)+gx+gpi+gmu ! 678: value(locyi)=value(locyi)+xcpi+xcmu+xcmcb ! 679: locy=lynl+nodplc(loc+29) ! 680: locyi=imynl+nodplc(loc+29) ! 681: value(locy)=value(locy)+gpi+gepr+gm+go ! 682: value(locyi)=value(locyi)+xcpi+xgm ! 683: locy=lynl+nodplc(loc+10) ! 684: value(locy)=value(locy)-gcpr ! 685: locy=lynl+nodplc(loc+11) ! 686: value(locy)=value(locy)-gx ! 687: locy=lynl+nodplc(loc+12) ! 688: value(locy)=value(locy)-gepr ! 689: locy=lynl+nodplc(loc+13) ! 690: value(locy)=value(locy)-gcpr ! 691: locy=lynl+nodplc(loc+14) ! 692: locyi=imynl+nodplc(loc+14) ! 693: value(locy)=value(locy)-gmu+gm ! 694: value(locyi)=value(locyi)-xcmu+xgm ! 695: locy=lynl+nodplc(loc+15) ! 696: locyi=imynl+nodplc(loc+15) ! 697: value(locy)=value(locy)-gm-go ! 698: value(locyi)=value(locyi)-xgm ! 699: locy=lynl+nodplc(loc+16) ! 700: value(locy)=value(locy)-gx ! 701: locy=lynl+nodplc(loc+17) ! 702: locyi=imynl+nodplc(loc+17) ! 703: value(locy)=value(locy)-gmu ! 704: value(locyi)=value(locyi)-xcmu-xcmcb ! 705: locy=lynl+nodplc(loc+18) ! 706: locyi=imynl+nodplc(loc+18) ! 707: value(locy)=value(locy)-gpi ! 708: value(locyi)=value(locyi)-xcpi ! 709: locy=lynl+nodplc(loc+19) ! 710: value(locy)=value(locy)-gepr ! 711: locy=lynl+nodplc(loc+20) ! 712: locyi=imynl+nodplc(loc+20) ! 713: value(locy)=value(locy)-go ! 714: value(locyi)=value(locyi)+xcmcb ! 715: locy=lynl+nodplc(loc+21) ! 716: locyi=imynl+nodplc(loc+21) ! 717: value(locy)=value(locy)-gpi-gm ! 718: value(locyi)=value(locyi)-xcpi-xgm-xcmcb ! 719: locyi=imynl+nodplc(loc+31) ! 720: value(locyi)=value(locyi)+xccs ! 721: locyi=imynl+nodplc(loc+32) ! 722: value(locyi)=value(locyi)-xccs ! 723: locyi=imynl+nodplc(loc+33) ! 724: value(locyi)=value(locyi)-xccs ! 725: locyi=imynl+nodplc(loc+34) ! 726: value(locyi)=value(locyi)-xcbx ! 727: locyi=imynl+nodplc(loc+35) ! 728: value(locyi)=value(locyi)-xcbx ! 729: loc=nodplc(loc) ! 730: go to 260 ! 731: c ! 732: c jfets ! 733: c ! 734: 300 loc=locate(13) ! 735: 310 if (loc.eq.0) go to 350 ! 736: locv=nodplc(loc+1) ! 737: area=value(locv+1) ! 738: locm=nodplc(loc+7) ! 739: locm=nodplc(locm+1) ! 740: loct=lx0+nodplc(loc+19) ! 741: gdpr=value(locm+4)*area ! 742: gspr=value(locm+5)*area ! 743: gm=value(loct+5) ! 744: gds=value(loct+6) ! 745: ggs=value(loct+7) ! 746: xgs=value(loct+9)*omega ! 747: ggd=value(loct+8) ! 748: xgd=value(loct+11)*omega ! 749: locy=lynl+nodplc(loc+20) ! 750: value(locy)=value(locy)+gdpr ! 751: locy=lynl+nodplc(loc+21) ! 752: locyi=imynl+nodplc(loc+21) ! 753: value(locy)=value(locy)+ggd+ggs ! 754: value(locyi)=value(locyi)+xgd+xgs ! 755: locy=lynl+nodplc(loc+22) ! 756: value(locy)=value(locy)+gspr ! 757: locy=lynl+nodplc(loc+23) ! 758: locyi=imynl+nodplc(loc+23) ! 759: value(locy)=value(locy)+gdpr+gds+ggd ! 760: value(locyi)=value(locyi)+xgd ! 761: locy=lynl+nodplc(loc+24) ! 762: locyi=imynl+nodplc(loc+24) ! 763: value(locy)=value(locy)+gspr+gds+gm+ggs ! 764: value(locyi)=value(locyi)+xgs ! 765: locy=lynl+nodplc(loc+9) ! 766: value(locy)=value(locy)-gdpr ! 767: locy=lynl+nodplc(loc+10) ! 768: locyi=imynl+nodplc(loc+10) ! 769: value(locy)=value(locy)-ggd ! 770: value(locyi)=value(locyi)-xgd ! 771: locy=lynl+nodplc(loc+11) ! 772: locyi=imynl+nodplc(loc+11) ! 773: value(locy)=value(locy)-ggs ! 774: value(locyi)=value(locyi)-xgs ! 775: locy=lynl+nodplc(loc+12) ! 776: value(locy)=value(locy)-gspr ! 777: locy=lynl+nodplc(loc+13) ! 778: value(locy)=value(locy)-gdpr ! 779: locy=lynl+nodplc(loc+14) ! 780: locyi=imynl+nodplc(loc+14) ! 781: value(locy)=value(locy)-ggd+gm ! 782: value(locyi)=value(locyi)-xgd ! 783: locy=lynl+nodplc(loc+15) ! 784: value(locy)=value(locy)-gds-gm ! 785: locy=lynl+nodplc(loc+16) ! 786: locyi=imynl+nodplc(loc+16) ! 787: value(locy)=value(locy)-ggs-gm ! 788: value(locyi)=value(locyi)-xgs ! 789: locy=lynl+nodplc(loc+17) ! 790: value(locy)=value(locy)-gspr ! 791: locy=lynl+nodplc(loc+18) ! 792: value(locy)=value(locy)-gds ! 793: loc=nodplc(loc) ! 794: go to 310 ! 795: c ! 796: c mosfets ! 797: c ! 798: 350 loc=locate(14) ! 799: 360 if (loc.eq.0) go to 400 ! 800: locv=nodplc(loc+1) ! 801: locm=nodplc(loc+8) ! 802: itype=nodplc(locm+2) ! 803: locm=nodplc(locm+1) ! 804: loct=lx0+nodplc(loc+26) ! 805: gdpr=value(locv+11) ! 806: gspr=value(locv+12) ! 807: if(itype.eq.0) go to 380 ! 808: xl=value(locv+1)-2.0d0*value(locm+20) ! 809: xw=value(locv+2)-2.0d0*value(locm+36) ! 810: covlgs=value(locm+8)*xw ! 811: covlgd=value(locm+9)*xw ! 812: covlgb=value(locm+10)*xl ! 813: didvg=value(loct) ! 814: didvd=value(loct+1) ! 815: didvs=value(loct+2) ! 816: geqbd=value(loct+3) ! 817: geqbs=value(loct+5) ! 818: ccgg=value(loct+8) ! 819: ccgd=value(loct+9) ! 820: ccgs=value(loct+10) ! 821: ccbg=value(loct+11) ! 822: ccbd=value(loct+12) ! 823: ccbs=value(loct+13) ! 824: capbd=value(loct+14) ! 825: capbs=value(loct+15) ! 826: xccg2=-0.5d0*(ccgg+ccbg)*omega ! 827: xccd2=-0.5d0*(ccgd+ccbd)*omega ! 828: xccs2=-0.5d0*(ccgs+ccbs)*omega ! 829: xccdg=xccg2-covlgd*omega ! 830: xccdd=xccd2+(capbd+covlgd)*omega ! 831: xccds=xccs2 ! 832: xccsg=xccg2-covlgs*omega ! 833: xccsd=xccd2 ! 834: xccss=xccs2+(capbs+covlgs)*omega ! 835: xccgg=(ccgg+covlgd+covlgs+covlgb)*omega ! 836: xccgd=(ccgd-covlgd)*omega ! 837: xccgs=(ccgs-covlgs)*omega ! 838: xccbg=(ccbg-covlgb)*omega ! 839: xccbd=xccbd+(ccbd-capbd)*omega ! 840: xccbs=xccbs+(ccbs-capbs)*omega ! 841: gccdg=didvg ! 842: gccdd=geqbd+didvd ! 843: gccds=didvs ! 844: gccsg=-didvg ! 845: gccsd=-didvd ! 846: gccss=geqbs-didvs ! 847: gccbd=-geqbd ! 848: gccbs=-geqbs ! 849: locyi=imynl+nodplc(loc+28) ! 850: value(locyi)=value(locyi)+xccgg ! 851: locyi=imynl+nodplc(loc+30) ! 852: value(locyi)=value(locyi)-xccbg-xccbd-xccbs ! 853: locyi=imynl+nodplc(loc+31) ! 854: value(locyi)=value(locyi)+xccdd ! 855: locyi=imynl+nodplc(loc+32) ! 856: value(locyi)=value(locyi)+xccss ! 857: locyi=imynl+nodplc(loc+11) ! 858: value(locyi)=value(locyi)-xccgg-xccgd-xccgs ! 859: locyi=imynl+nodplc(loc+12) ! 860: value(locyi)=value(locyi)+xccgd ! 861: locyi=imynl+nodplc(loc+13) ! 862: value(locyi)=value(locyi)+xccgs ! 863: locyi=imynl+nodplc(loc+15) ! 864: value(locyi)=value(locyi)+xccbg ! 865: locyi=imynl+nodplc(loc+16) ! 866: value(locyi)=value(locyi)+xccbd ! 867: locyi=imynl+nodplc(loc+17) ! 868: value(locyi)=value(locyi)+xccbs ! 869: locyi=imynl+nodplc(loc+19) ! 870: value(locyi)=value(locyi)+xccdg ! 871: locyi=imynl+nodplc(loc+20) ! 872: value(locyi)=value(locyi)-xccdg-xccdd-xccds ! 873: locyi=imynl+nodplc(loc+21) ! 874: value(locyi)=value(locyi)+xccds ! 875: locyi=imynl+nodplc(loc+22) ! 876: value(locyi)=value(locyi)+xccsg ! 877: locyi=imynl+nodplc(loc+24) ! 878: value(locyi)=value(locyi)-xccsg-xccsd-xccss ! 879: locyi=imynl+nodplc(loc+25) ! 880: value(locyi)=value(locyi)+xccsd ! 881: locy=lynl+nodplc(loc+27) ! 882: value(locy)=value(locy)+gdpr ! 883: locy=lynl+nodplc(loc+29) ! 884: value(locy)=value(locy)+gspr ! 885: locy=lynl+nodplc(loc+30) ! 886: value(locy)=value(locy)-gccbd-gccbs ! 887: locy=lynl+nodplc(loc+31) ! 888: value(locy)=value(locy)+gdpr+gccdd ! 889: locy=lynl+nodplc(loc+32) ! 890: value(locy)=value(locy)+gspr+gccss ! 891: locy=lynl+nodplc(loc+10) ! 892: value(locy)=value(locy)-gdpr ! 893: locy=lynl+nodplc(loc+14) ! 894: value(locy)=value(locy)-gspr ! 895: locy=lynl+nodplc(loc+16) ! 896: value(locy)=value(locy)+gccbd ! 897: locy=lynl+nodplc(loc+17) ! 898: value(locy)=value(locy)+gccbs ! 899: locy=lynl+nodplc(loc+18) ! 900: value(locy)=value(locy)-gdpr ! 901: locy=lynl+nodplc(loc+19) ! 902: value(locy)=value(locy)+gccdg ! 903: locy=lynl+nodplc(loc+20) ! 904: value(locy)=value(locy)-gccdg-gccdd-gccds ! 905: locy=lynl+nodplc(loc+21) ! 906: value(locy)=value(locy)+gccds ! 907: locy=lynl+nodplc(loc+22) ! 908: value(locy)=value(locy)+gccsg ! 909: locy=lynl+nodplc(loc+23) ! 910: value(locy)=value(locy)-gspr ! 911: locy=lynl+nodplc(loc+24) ! 912: value(locy)=value(locy)-gccsg-gccsd-gccss ! 913: locy=lynl+nodplc(loc+25) ! 914: value(locy)=value(locy)+gccsd ! 915: loc=nodplc(loc) ! 916: go to 360 ! 917: c... ga-as fets ! 918: 380 continue ! 919: devmod=value(locv+8) ! 920: ggd=value(loct+6) ! 921: gm=0.0d0 ! 922: gds=0.0d0 ! 923: gmj1=value(loct+7) ! 924: gdb=value(loct+8) ! 925: ggs=value(loct+9) ! 926: xcds=value(loct+10)*omega ! 927: gsb=value(loct+11) ! 928: xcgs=value(loct+12)*omega ! 929: gmj2=value(loct+13) ! 930: xcgd=value(loct+14)*omega ! 931: xcgb=value(loct+16)*omega ! 932: c write(6,1001) ggd,gm,gds,gmj1,gdb,ggs,gsb,gmj2 ! 933: 1001 format(' ggd gm gds gmj1 gdb ggs gsb gmj2'/,1x,1p8e9.1) ! 934: if(devmod.gt.0.0d0) go to 385 ! 935: gmrev=gm ! 936: gmnrm=0.0d0 ! 937: gm=0.0d0 ! 938: gmj1r=gmj1 ! 939: gmj1=0.0d0 ! 940: gmj1n=0.0d0 ! 941: gmj2n=0.0d0 ! 942: gmj2r=0.0d0 ! 943: go to 390 ! 944: 385 gmnrm=gm ! 945: gmrev=0.0d0 ! 946: gm=0.0d0 ! 947: gmj2n=gmj2 ! 948: gmj2r=0.0d0 ! 949: gmj2=0.0d0 ! 950: gmj1r=0.0d0 ! 951: gmj1n=0.0d0 ! 952: 390 locy=lynl+nodplc(loc+27) ! 953: value(locy)=value(locy)+gdpr ! 954: locy=lynl+nodplc(loc+28) ! 955: locyi=imynl+nodplc(loc+28) ! 956: value(locy)=value(locy)+ggd+ggs ! 957: value(locyi)=value(locyi)+xcgd+xcgs+xcgb ! 958: locy=lynl+nodplc(loc+29) ! 959: value(locy)=value(locy)+gspr ! 960: locy=lynl+nodplc(loc+30) ! 961: locyi=imynl+nodplc(loc+30) ! 962: value(locy)=value(locy)+gdb+gsb+gmj1+gmj2 ! 963: value(locyi)=value(locyi)+xcgb ! 964: locy=lynl+nodplc(loc+31) ! 965: locyi=imynl+nodplc(loc+31) ! 966: value(locy)=value(locy)+gdpr+gds+gdb+ggd-gmrev-gmj1r ! 967: value(locyi)=value(locyi)+xcds+xcgd ! 968: locy=lynl+nodplc(loc+32) ! 969: locyi=imynl+nodplc(loc+32) ! 970: value(locy)=value(locy)+gspr+gds+gsb+ggs+gmnrm-gmj2n ! 971: value(locyi)=value(locyi)+xcds+xcgs ! 972: locy=lynl+nodplc(loc+10) ! 973: value(locy)=value(locy)-gdpr ! 974: locyi=imynl+nodplc(loc+11) ! 975: value(locyi)=value(locyi)-xcgb ! 976: locy=lynl+nodplc(loc+12) ! 977: locyi=imynl+nodplc(loc+12) ! 978: value(locy)=value(locy)-ggd ! 979: value(locyi)=value(locyi)-xcgd ! 980: locy=lynl+nodplc(loc+13) ! 981: locyi=imynl+nodplc(loc+13) ! 982: value(locy)=value(locy)-ggs ! 983: value(locyi)=value(locyi)-xcgs ! 984: locy=lynl+nodplc(loc+14) ! 985: value(locy)=value(locy)-gspr ! 986: locy=lynl+nodplc(loc+15) ! 987: locyi=imynl+nodplc(loc+15) ! 988: value(locy)=value(locy)-gmj2n-gmj1n-gmj1r-gmj2r-gmj1-gmj2 ! 989: value(locyi)=value(locyi)-xcgb ! 990: locy=lynl+nodplc(loc+16) ! 991: value(locy)=value(locy)-gdb+gmj2r+gmj1r ! 992: locy=lynl+nodplc(loc+17) ! 993: value(locy)=value(locy)-gsb+gmj1n+gmj2n ! 994: locy=lynl+nodplc(loc+18) ! 995: value(locy)=value(locy)-gdpr ! 996: locy=lynl+nodplc(loc+19) ! 997: locyi=imynl+nodplc(loc+19) ! 998: value(locy)=value(locy)-ggd+gmnrm+gmrev+gmj1r+gmj1n+gmj1+gm ! 999: value(locyi)=value(locyi)-xcgd ! 1000: locy=lynl+nodplc(loc+20) ! 1001: value(locy)=value(locy)-gdb-gmj1-gm ! 1002: locy=lynl+nodplc(loc+21) ! 1003: locyi=imynl+nodplc(loc+21) ! 1004: value(locy)=value(locy)-gds-gmnrm-gmj1n ! 1005: value(locyi)=value(locyi)-xcds ! 1006: locy=lynl+nodplc(loc+22) ! 1007: locyi=imynl+nodplc(loc+22) ! 1008: value(locy)=value(locy)-ggs-gmnrm-gmrev+gmj2r+gmj2n+gmj2-gm ! 1009: value(locyi)=value(locyi)-xcgs ! 1010: locy=lynl+nodplc(loc+23) ! 1011: value(locy)=value(locy)-gspr ! 1012: locy=lynl+nodplc(loc+24) ! 1013: value(locy)=value(locy)-gsb-gmj2+gm ! 1014: locy=lynl+nodplc(loc+25) ! 1015: locyi=imynl+nodplc(loc+25) ! 1016: value(locy)=value(locy)-gds+gmrev-gmj2r ! 1017: value(locyi)=value(locyi)-xcds ! 1018: loc=nodplc(loc) ! 1019: go to 360 ! 1020: c ! 1021: c transmission lines ! 1022: c ! 1023: 400 loc=locate(17) ! 1024: 410 if (loc.eq.0) go to 1000 ! 1025: locv=nodplc(loc+1) ! 1026: z0=value(locv+1) ! 1027: y0=1.0d0/z0 ! 1028: td=value(locv+2) ! 1029: arg=-omega*td ! 1030: rval=dcos(arg) ! 1031: xval=dsin(arg) ! 1032: locy=lynl+nodplc(loc+10) ! 1033: value(locy)=value(locy)+y0 ! 1034: locy=lynl+nodplc(loc+11) ! 1035: locyi=imynl+nodplc(loc+11) ! 1036: value(locy)=-y0 ! 1037: value(locyi)=0.0d0 ! 1038: locy=lynl+nodplc(loc+12) ! 1039: locyi=imynl+nodplc(loc+12) ! 1040: value(locy)=-1.0d0 ! 1041: value(locyi)=0.0d0 ! 1042: locy=lynl+nodplc(loc+13) ! 1043: value(locy)=value(locy)+y0 ! 1044: locy=lynl+nodplc(loc+14) ! 1045: locyi=imynl+nodplc(loc+14) ! 1046: value(locy)=-1.0d0 ! 1047: value(locyi)=0.0d0 ! 1048: locy=lynl+nodplc(loc+15) ! 1049: locyi=imynl+nodplc(loc+15) ! 1050: value(locy)=-y0 ! 1051: value(locyi)=0.0d0 ! 1052: locy=lynl+nodplc(loc+16) ! 1053: locyi=imynl+nodplc(loc+16) ! 1054: value(locy)=+y0 ! 1055: value(locyi)=0.0d0 ! 1056: locy=lynl+nodplc(loc+17) ! 1057: locyi=imynl+nodplc(loc+17) ! 1058: value(locy)=+1.0d0 ! 1059: value(locyi)=0.0d0 ! 1060: locy=lynl+nodplc(loc+18) ! 1061: locyi=imynl+nodplc(loc+18) ! 1062: value(locy)=+y0 ! 1063: value(locyi)=0.0d0 ! 1064: locy=lynl+nodplc(loc+19) ! 1065: locyi=imynl+nodplc(loc+19) ! 1066: value(locy)=+1.0d0 ! 1067: value(locyi)=0.0d0 ! 1068: locy=lynl+nodplc(loc+20) ! 1069: locyi=imynl+nodplc(loc+20) ! 1070: value(locy)=-1.0d0 ! 1071: value(locyi)=0.0d0 ! 1072: locy=lynl+nodplc(loc+21) ! 1073: locyi=imynl+nodplc(loc+21) ! 1074: value(locy)=-rval ! 1075: value(locyi)=-xval ! 1076: locy=lynl+nodplc(loc+22) ! 1077: locyi=imynl+nodplc(loc+22) ! 1078: value(locy)=+rval ! 1079: value(locyi)=+xval ! 1080: locy=lynl+nodplc(loc+23) ! 1081: locyi=imynl+nodplc(loc+23) ! 1082: value(locy)=+1.0d0 ! 1083: value(locyi)=0.0d0 ! 1084: locy=lynl+nodplc(loc+24) ! 1085: locyi=imynl+nodplc(loc+24) ! 1086: value(locy)=-rval*z0 ! 1087: value(locyi)=-xval*z0 ! 1088: locy=lynl+nodplc(loc+25) ! 1089: locyi=imynl+nodplc(loc+25) ! 1090: value(locy)=-rval ! 1091: value(locyi)=-xval ! 1092: locy=lynl+nodplc(loc+26) ! 1093: locyi=imynl+nodplc(loc+26) ! 1094: value(locy)=+rval ! 1095: value(locyi)=+xval ! 1096: locy=lynl+nodplc(loc+27) ! 1097: locyi=imynl+nodplc(loc+27) ! 1098: value(locy)=-1.0d0 ! 1099: value(locyi)=0.0d0 ! 1100: locy=lynl+nodplc(loc+28) ! 1101: locyi=imynl+nodplc(loc+28) ! 1102: value(locy)=+1.0d0 ! 1103: value(locyi)=0.0d0 ! 1104: locy=lynl+nodplc(loc+29) ! 1105: locyi=imynl+nodplc(loc+29) ! 1106: value(locy)=-rval*z0 ! 1107: value(locyi)=-xval*z0 ! 1108: locy=lynl+nodplc(loc+31) ! 1109: locyi=imynl+nodplc(loc+31) ! 1110: value(locy)=-y0 ! 1111: value(locyi)=0.0d0 ! 1112: locy=lynl+nodplc(loc+32) ! 1113: locyi=imynl+nodplc(loc+32) ! 1114: value(locy)=-y0 ! 1115: value(locyi)=0.0d0 ! 1116: loc=nodplc(loc) ! 1117: go to 410 ! 1118: c ! 1119: c reorder right-hand side ! 1120: c ! 1121: 1000 do 1010 i=2,nstop ! 1122: j=nodplc(iswap+i) ! 1123: value(ndiag+i)=value(lvn+j) ! 1124: value(ndiag+i+nstop)=value(imvn+j) ! 1125: 1010 continue ! 1126: call copy8(value(ndiag+1),value(lvn+1),nstop) ! 1127: call copy8(value(ndiag+nstop+1),value(imvn+1),nstop) ! 1128: c ! 1129: c finished ! 1130: c ! 1131: return ! 1132: end ! 1133: subroutine noise(loco) ! 1134: implicit double precision (a-h,o-z) ! 1135: c ! 1136: c this routine computes the noise due to various circuit elements. ! 1137: c ! 1138: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 1139: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 1140: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 1141: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 1142: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 1143: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 1144: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 1145: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 1146: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, ! 1147: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, ! 1148: 2 itemno,nosolv,ipostp,iscrch ! 1149: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, ! 1150: 1 defas,rstats(50),iwidth,lwidth,nopage ! 1151: common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, ! 1152: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox ! 1153: common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq, ! 1154: 1 inoise,nosprt,nosout,nosin,idist,idprt ! 1155: common /blank/ value(1000) ! 1156: integer nodplc(64) ! 1157: complex*16 cvalue(32) ! 1158: equivalence (value(1),nodplc(1),cvalue(1)) ! 1159: c ! 1160: c ! 1161: dimension vno1(12),vno2(12),vno3(12),vno4(12),vno5(12),vno6(12) ! 1162: dimension vntot(12),anam(12),string(5) ! 1163: dimension titln(4),v(2) ! 1164: dimension afmt1(3),afmt2(3) ! 1165: complex*16 cval,c(1) ! 1166: equivalence (c(1),v(1),cval) ! 1167: equivalence (v(1),vreal),(v(2),vimag) ! 1168: data titln / 8hnoise an, 8halysis , 8h , 8h / ! 1169: data alsrb,alsrc,alsre,alsrs,alsrd / 2hrb,2hrc,2hre,2hrs,2hrd / ! 1170: data alsib,alsic,alsid,alsfn / 2hib,2hic,2hid,2hfn / ! 1171: data alstot / 5htotal / ! 1172: data aslash,ablnk / 1h/, 1h / ! 1173: data afmt1 /8h(////,11,8hx, (2x,,8ha8)) / ! 1174: data afmt2 /8h(1h0,a8,,8h1p d10.,8h3) / ! 1175: kntr=12 ! 1176: if(lwidth.le.80) kntr=7 ! 1177: ipos=11 ! 1178: call move(afmt1,ipos,ablnk,1,2) ! 1179: call alfnum(kntr,afmt1,ipos) ! 1180: ipos=11 ! 1181: call move(afmt2,ipos,ablnk,1,2) ! 1182: call alfnum(kntr,afmt2,ipos) ! 1183: nprnt=0 ! 1184: freq=omega/twopi ! 1185: if (icalc.ge.2) go to 10 ! 1186: fourkt=4.0d0*charge*vt ! 1187: twoq=2.0d0*charge ! 1188: noposo=nodplc(nosout+2) ! 1189: nonego=nodplc(nosout+3) ! 1190: kntlim=lwidth/11 ! 1191: nkntr=1 ! 1192: 10 if (nosprt.eq.0) go to 30 ! 1193: if (nkntr.gt.icalc) go to 30 ! 1194: nprnt=1 ! 1195: nkntr=nkntr+nosprt ! 1196: call title(0,lwidth,1,titln) ! 1197: write (6,16) freq ! 1198: 16 format('0 frequency = ',1pd10.3,' hz'/) ! 1199: c ! 1200: c obtain adjoint circuit solution ! 1201: c ! 1202: 30 vnrms=0.0d0 ! 1203: cval=cvalue(lcvn+noposo)-cvalue(lcvn+nonego) ! 1204: vout=dsqrt(vreal*vreal+vimag*vimag) ! 1205: vout=dmax1(vout,1.0d-20) ! 1206: call zero8(value(lvn+1),nstop) ! 1207: call zero8(value(imvn+1),nstop) ! 1208: value(lvn+noposo)=-1.0d0 ! 1209: value(lvn+nonego)=+1.0d0 ! 1210: call acasol ! 1211: c ! 1212: c resistors ! 1213: c ! 1214: if (jelcnt(1).eq.0) go to 200 ! 1215: ititle=0 ! 1216: 91 format(//'0**** resistor squared noise voltages (sq v/hz)') ! 1217: 100 loc=locate(1) ! 1218: kntr=0 ! 1219: 110 if (loc.eq.0) go to 130 ! 1220: kntr=kntr+1 ! 1221: locv=nodplc(loc+1) ! 1222: anam(kntr)=value(locv) ! 1223: node1=nodplc(loc+2) ! 1224: node2=nodplc(loc+3) ! 1225: cval=cvalue(lcvn+node1)-cvalue(lcvn+node2) ! 1226: vntot(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locv+1) ! 1227: vnrms=vnrms+vntot(kntr) ! 1228: if (kntr.ge.kntlim) go to 140 ! 1229: 120 loc=nodplc(loc) ! 1230: go to 110 ! 1231: 130 if (kntr.eq.0) go to 200 ! 1232: 140 if (nprnt.eq.0) go to 160 ! 1233: if (ititle.eq.0) write (6,91) ! 1234: ititle=1 ! 1235: write (6,afmt1) (anam(i),i=1,kntr) ! 1236: write (6,afmt2) alstot,(vntot(i),i=1,kntr) ! 1237: 160 kntr=0 ! 1238: if (loc.ne.0) go to 120 ! 1239: c ! 1240: c diodes ! 1241: c ! 1242: 200 if (jelcnt(11).eq.0) go to 300 ! 1243: ititle=0 ! 1244: 201 format(//'0**** diode squared noise voltages (sq v/hz)') ! 1245: 210 loc=locate(11) ! 1246: kntr=0 ! 1247: 220 if (loc.eq.0) go to 240 ! 1248: kntr=kntr+1 ! 1249: locv=nodplc(loc+1) ! 1250: anam(kntr)=value(locv) ! 1251: node1=nodplc(loc+2) ! 1252: node2=nodplc(loc+3) ! 1253: node3=nodplc(loc+4) ! 1254: locm=nodplc(loc+5) ! 1255: locm=nodplc(locm+1) ! 1256: loct=nodplc(loc+11) ! 1257: area=value(locv+1) ! 1258: fnk=value(locm+10) ! 1259: fna=value(locm+11) ! 1260: c ! 1261: c ohmic resistance ! 1262: c ! 1263: cval=cvalue(lcvn+node1)-cvalue(lcvn+node3) ! 1264: vno1(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locm+2)*area ! 1265: c ! 1266: c junction shot noise and flicker noise ! 1267: c ! 1268: cval=cvalue(lcvn+node3)-cvalue(lcvn+node2) ! 1269: vtemp=vreal*vreal+vimag*vimag ! 1270: arg=dmax1(dabs(value(lx0+loct+1)),1.0d-20) ! 1271: vno2(kntr)=vtemp*twoq*arg ! 1272: vno3(kntr)=vtemp*fnk*dexp(fna*dlog(arg))/freq ! 1273: vntot(kntr)=vno1(kntr)+vno2(kntr)+vno3(kntr) ! 1274: vnrms=vnrms+vntot(kntr) ! 1275: if (kntr.ge.kntlim) go to 250 ! 1276: 230 loc=nodplc(loc) ! 1277: go to 220 ! 1278: 240 if (kntr.eq.0) go to 300 ! 1279: 250 if (nprnt.eq.0) go to 260 ! 1280: if (ititle.eq.0) write (6,201) ! 1281: ititle=1 ! 1282: write (6,afmt1) (anam(i),i=1,kntr) ! 1283: write (6,afmt2) alsrs,(vno1(i),i=1,kntr) ! 1284: write (6,afmt2) alsid,(vno2(i),i=1,kntr) ! 1285: write (6,afmt2) alsfn,(vno3(i),i=1,kntr) ! 1286: write (6,afmt2) alstot,(vntot(i),i=1,kntr) ! 1287: 260 kntr=0 ! 1288: if (loc.ne.0) go to 230 ! 1289: c ! 1290: c bipolar junction transistors ! 1291: c ! 1292: 300 if (jelcnt(12).eq.0) go to 400 ! 1293: ititle=0 ! 1294: 301 format(//'0**** transistor squared noise voltages (sq v/hz)') ! 1295: 310 loc=locate(12) ! 1296: kntr=0 ! 1297: 320 if (loc.eq.0) go to 340 ! 1298: kntr=kntr+1 ! 1299: locv=nodplc(loc+1) ! 1300: anam(kntr)=value(locv) ! 1301: node1=nodplc(loc+2) ! 1302: node2=nodplc(loc+3) ! 1303: node3=nodplc(loc+4) ! 1304: node4=nodplc(loc+5) ! 1305: node5=nodplc(loc+6) ! 1306: node6=nodplc(loc+7) ! 1307: locm=nodplc(loc+8) ! 1308: locm=nodplc(locm+1) ! 1309: loct=nodplc(loc+22) ! 1310: area=value(locv+1) ! 1311: fnk=value(locm+44) ! 1312: fna=value(locm+45) ! 1313: c ! 1314: c extrinsic resistances ! 1315: c ! 1316: c... base resistance ! 1317: cval=cvalue(lcvn+node2)-cvalue(lcvn+node5) ! 1318: vno1(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(lx0+loct+16) ! 1319: 1 *area ! 1320: c... collector resistance ! 1321: cval=cvalue(lcvn+node1)-cvalue(lcvn+node4) ! 1322: vno2(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locm+20)*area ! 1323: c... emitter resistance ! 1324: cval=cvalue(lcvn+node3)-cvalue(lcvn+node6) ! 1325: vno3(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locm+19)*area ! 1326: c ! 1327: c base current shot noise and flicker noise ! 1328: c ! 1329: cval=cvalue(lcvn+node5)-cvalue(lcvn+node6) ! 1330: vtemp=vreal*vreal+vimag*vimag ! 1331: arg=dmax1(dabs(value(lx0+loct+3)),1.0d-20) ! 1332: vno4(kntr)=vtemp*twoq*arg ! 1333: vno5(kntr)=vtemp*fnk*dexp(fna*dlog(arg))/freq ! 1334: c ! 1335: c collector current shot noise ! 1336: c ! 1337: cval=cvalue(lcvn+node4)-cvalue(lcvn+node6) ! 1338: vno6(kntr)=(vreal*vreal+vimag*vimag)*twoq*dabs(value(lx0+loct+2)) ! 1339: vntot(kntr)=vno1(kntr)+vno2(kntr)+vno3(kntr)+vno4(kntr)+vno5(kntr) ! 1340: 1 +vno6(kntr) ! 1341: vnrms=vnrms+vntot(kntr) ! 1342: if (kntr.ge.kntlim) go to 350 ! 1343: 330 loc=nodplc(loc) ! 1344: go to 320 ! 1345: 340 if (kntr.eq.0) go to 400 ! 1346: 350 if (nprnt.eq.0) go to 360 ! 1347: if (ititle.eq.0) write (6,301) ! 1348: ititle=1 ! 1349: write (6,afmt1) (anam(i),i=1,kntr) ! 1350: write (6,afmt2) alsrb,(vno1(i),i=1,kntr) ! 1351: write (6,afmt2) alsrc,(vno2(i),i=1,kntr) ! 1352: write (6,afmt2) alsre,(vno3(i),i=1,kntr) ! 1353: write (6,afmt2) alsib,(vno4(i),i=1,kntr) ! 1354: write (6,afmt2) alsic,(vno6(i),i=1,kntr) ! 1355: write (6,afmt2) alsfn,(vno5(i),i=1,kntr) ! 1356: write (6,afmt2) alstot,(vntot(i),i=1,kntr) ! 1357: 360 kntr=0 ! 1358: if (loc.ne.0) go to 330 ! 1359: c ! 1360: c jfets ! 1361: c ! 1362: 400 if (jelcnt(13).eq.0) go to 500 ! 1363: ititle=0 ! 1364: 401 format(//'0**** jfet squared noise voltages (sq v/hz)') ! 1365: 410 loc=locate(13) ! 1366: kntr=0 ! 1367: 420 if (loc.eq.0) go to 440 ! 1368: kntr=kntr+1 ! 1369: locv=nodplc(loc+1) ! 1370: anam(kntr)=value(locv) ! 1371: node1=nodplc(loc+2) ! 1372: node2=nodplc(loc+3) ! 1373: node3=nodplc(loc+4) ! 1374: node4=nodplc(loc+5) ! 1375: node5=nodplc(loc+6) ! 1376: locm=nodplc(loc+7) ! 1377: locm=nodplc(locm+1) ! 1378: loct=nodplc(loc+19) ! 1379: area=value(locv+1) ! 1380: fnk=value(locm+10) ! 1381: fna=value(locm+11) ! 1382: c ! 1383: c extrinsic resistances ! 1384: c ! 1385: c... drain resistance ! 1386: cval=cvalue(lcvn+node1)-cvalue(lcvn+node4) ! 1387: vno1(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locm+4)*area ! 1388: c... source resistance ! 1389: cval=cvalue(lcvn+node3)-cvalue(lcvn+node5) ! 1390: vno2(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locm+5)*area ! 1391: c ! 1392: c drain current shot noise and flicker noise ! 1393: c ! 1394: cval=cvalue(lcvn+node4)-cvalue(lcvn+node5) ! 1395: vtemp=vreal*vreal+vimag*vimag ! 1396: vno3(kntr)=vtemp*fourkt*2.0d0*dabs(value(lx0+loct+5))/3.0d0 ! 1397: arg=dmax1(dabs(value(lx0+loct+3)),1.0d-20) ! 1398: vno4(kntr)=vtemp*fnk*dexp(fna*dlog(arg))/freq ! 1399: vntot(kntr)=vno1(kntr)+vno2(kntr)+vno3(kntr)+vno4(kntr) ! 1400: vnrms=vnrms+vntot(kntr) ! 1401: if (kntr.ge.kntlim) go to 450 ! 1402: 430 loc=nodplc(loc) ! 1403: go to 420 ! 1404: 440 if (kntr.eq.0) go to 500 ! 1405: 450 if (nprnt.eq.0) go to 460 ! 1406: if (ititle.eq.0) write (6,401) ! 1407: ititle=1 ! 1408: write (6,afmt1) (anam(i),i=1,kntr) ! 1409: write (6,afmt2) alsrd,(vno1(i),i=1,kntr) ! 1410: write (6,afmt2) alsrs,(vno2(i),i=1,kntr) ! 1411: write (6,afmt2) alsid,(vno3(i),i=1,kntr) ! 1412: write (6,afmt2) alsfn,(vno4(i),i=1,kntr) ! 1413: write (6,afmt2) alstot,(vntot(i),i=1,kntr) ! 1414: 460 kntr=0 ! 1415: if (loc.ne.0) go to 430 ! 1416: c ! 1417: c mosfets ! 1418: c ! 1419: 500 if (jelcnt(14).eq.0) go to 600 ! 1420: ititle=0 ! 1421: 501 format(//'0**** mosfet squared noise voltages (sq v/hz)') ! 1422: 510 loc=locate(14) ! 1423: kntr=0 ! 1424: 520 if (loc.eq.0) go to 540 ! 1425: kntr=kntr+1 ! 1426: locv=nodplc(loc+1) ! 1427: anam(kntr)=value(locv) ! 1428: node1=nodplc(loc+2) ! 1429: node2=nodplc(loc+3) ! 1430: node3=nodplc(loc+4) ! 1431: node4=nodplc(loc+5) ! 1432: node5=nodplc(loc+6) ! 1433: node6=nodplc(loc+7) ! 1434: locm=nodplc(loc+8) ! 1435: itype=nodplc(locm+2) ! 1436: loct=nodplc(loc+26) ! 1437: locm=nodplc(locm+1) ! 1438: if(itype.eq.0) go to 522 ! 1439: xl=value(locv+1)-2.0d0*value(locm+20) ! 1440: xw=value(locm+2)-2.0d0*value(locm+36) ! 1441: cox=value(locm+13)*xl*xw ! 1442: fnk=value(locm+27) ! 1443: fna=value(locm+28) ! 1444: c ! 1445: c extrinsic resistances ! 1446: c ! 1447: c... drain resistance ! 1448: 522 cval=cvalue(lcvn+node1)-cvalue(lcvn+node5) ! 1449: vno1(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locv+11) ! 1450: c... source resistance ! 1451: cval=cvalue(lcvn+node3)-cvalue(lcvn+node6) ! 1452: vno2(kntr)=(vreal*vreal+vimag*vimag)*fourkt*value(locv+12) ! 1453: c ! 1454: c drain current shot noise and flicker noise ! 1455: c ! 1456: cval=cvalue(lcvn+node5)-cvalue(lcvn+node6) ! 1457: vtemp=vreal*vreal+vimag*vimag ! 1458: gm=value(lx0+loct+7) ! 1459: arg=dmax1(dabs(value(lx0+loct+4)),1.0d-20) ! 1460: if(itype.ne.0) go to 524 ! 1461: modeop=value(locv+8) ! 1462: if(modeop.le.0) gm=value(lx0+loct+13) ! 1463: if(value(locm+10).ne.0.0d0) gm=value(locm+10) ! 1464: xnexp=value(locm+11) ! 1465: fnk=value(locm+12) ! 1466: fna=value(locm+13) ! 1467: vno4(kntr)=vtemp*fnk*dexp(fna*dlog(arg))/(freq**xnexp) ! 1468: 524 vno3(kntr)=vtemp*fourkt*dabs(gm)/1.5d0 ! 1469: if(itype.eq.0) go to 525 ! 1470: vno4(kntr)=vtemp*fnk*dexp(fna*dlog(arg))/(freq*cox) ! 1471: 525 vntot(kntr)=vno1(kntr)+vno2(kntr)+vno3(kntr)+vno4(kntr) ! 1472: vnrms=vnrms+vntot(kntr) ! 1473: if (kntr.ge.kntlim) go to 550 ! 1474: 530 loc=nodplc(loc) ! 1475: go to 520 ! 1476: 540 if (kntr.eq.0) go to 600 ! 1477: 550 if (nprnt.eq.0) go to 560 ! 1478: if (ititle.eq.0) write (6,501) ! 1479: ititle=1 ! 1480: write (6,afmt1) (anam(i),i=1,kntr) ! 1481: write (6,afmt2) alsrd,(vno1(i),i=1,kntr) ! 1482: write (6,afmt2) alsrs,(vno2(i),i=1,kntr) ! 1483: write (6,afmt2) alsid,(vno3(i),i=1,kntr) ! 1484: write (6,afmt2) alsfn,(vno4(i),i=1,kntr) ! 1485: write (6,afmt2) alstot,(vntot(i),i=1,kntr) ! 1486: 560 kntr=0 ! 1487: if (loc.ne.0) go to 530 ! 1488: c ! 1489: c compute equivalent input noise voltage ! 1490: c ! 1491: 600 vnout=dsqrt(vnrms) ! 1492: vnin=vnout/vout ! 1493: if (nprnt.eq.0) go to 620 ! 1494: do 610 i=1,5 ! 1495: string(i)=ablnk ! 1496: 610 continue ! 1497: ioutyp=1 ! 1498: ipos=1 ! 1499: call outnam(nosout,ioutyp,string,ipos) ! 1500: call move(string,ipos,aslash,1,1) ! 1501: ipos=ipos+1 ! 1502: locv=nodplc(nosin+1) ! 1503: anam1=value(locv) ! 1504: call move(string,ipos,anam1,1,8) ! 1505: write (6,611) vnrms,vnout,string,vout,anam1,vnin ! 1506: 611 format(////, ! 1507: 1 '0**** total output noise voltage',9x,'= ',1pd10.3,' sq v/hz'/, ! 1508: 2 1h0,40x,'= ',d10.3,' v/rt hz'/, ! 1509: 3 '0 transfer function value:', ! 1510: 4 1h0,7x,4a8,a1,'= ',d10.3,/, ! 1511: 5 '0 equivalent input noise at ',a8,' = ',d10.3,' /rt hz') ! 1512: c ! 1513: c save noise outputs ! 1514: c ! 1515: 620 loc=locate(44) ! 1516: 630 if (loc.eq.0) go to 1000 ! 1517: iseq=nodplc(loc+4) ! 1518: if (nodplc(loc+5).ne.2) go to 640 ! 1519: cvalue(loco+iseq)=vnout ! 1520: go to 650 ! 1521: 640 cvalue(loco+iseq)=vnin ! 1522: 650 loc=nodplc(loc) ! 1523: go to 630 ! 1524: c ! 1525: c finished ! 1526: c ! 1527: 1000 return ! 1528: end ! 1529: subroutine acasol ! 1530: implicit double precision (a-h,o-z) ! 1531: c ! 1532: c this routine evaluates the response of the adjoint circuit by ! 1533: c doing a forward/backward substitution step using the transpose of the ! 1534: c circuit equation coefficient matrix. ! 1535: c ! 1536: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 1537: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 1538: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 1539: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 1540: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 1541: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 1542: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 1543: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 1544: common /blank/ value(1000) ! 1545: integer nodplc(64) ! 1546: complex*16 cvalue(32) ! 1547: equivalence (value(1),nodplc(1),cvalue(1)) ! 1548: c ! 1549: c evaluates adjoint response by doing forward/backward substitution on ! 1550: c the transpose of the y matrix ! 1551: c ! 1552: c ! 1553: c forward substitution ! 1554: c ! 1555: do 20 i=2,nstop ! 1556: io=nodplc(iorder+i) ! 1557: call cdiv(value(lvn+io),value(imvn+io),value(lynl+io), ! 1558: 1 value(imynl+io),value(lvn+io),value(imvn+io)) ! 1559: jstart=nodplc(iur+i) ! 1560: jstop=nodplc(iur+i+1)-1 ! 1561: if (jstart.gt.jstop) go to 20 ! 1562: if (value(lvn+io).ne.0.0d0) go to 5 ! 1563: if (value(imvn+io).eq.0.0d0) go to 20 ! 1564: 5 do 10 j=jstart,jstop ! 1565: jo=nodplc(iuc+j) ! 1566: jo=nodplc(iorder+jo) ! 1567: call cmult(value(lyu+j),value(imynl+nstop+j),value(lvn+io), ! 1568: 1 value(imvn+io),xreal,ximag) ! 1569: value(lvn+jo)=value(lvn+jo)-xreal ! 1570: value(imvn+jo)=value(imvn+jo)-ximag ! 1571: 10 continue ! 1572: 20 continue ! 1573: c ! 1574: c backward substitution ! 1575: c ! 1576: k=nstop+1 ! 1577: do 40 i=2,nstop ! 1578: k=k-1 ! 1579: io=nodplc(iorder+k) ! 1580: jstart=nodplc(ilc+k) ! 1581: jstop=nodplc(ilc+k+1)-1 ! 1582: if (jstart.gt.jstop) go to 40 ! 1583: do 30 j=jstart,jstop ! 1584: jo=nodplc(ilr+j) ! 1585: jo=nodplc(iorder+jo) ! 1586: call cmult(value(lyl+j),value(imynl+nstop+nut+j),value(lvn+jo), ! 1587: 1 value(imvn+jo),xreal,ximag) ! 1588: value(lvn+io)=value(lvn+io)-xreal ! 1589: value(imvn+io)=value(imvn+io)-ximag ! 1590: 30 continue ! 1591: 40 continue ! 1592: c ! 1593: c reorder right-hand side ! 1594: c ! 1595: do 50 i=2,nstop ! 1596: j=nodplc(iswap+i) ! 1597: value(ndiag+i)=value(lvn+j) ! 1598: value(ndiag+i+nstop)=value(imvn+j) ! 1599: 50 continue ! 1600: call copy8(value(ndiag+1),value(lvn+1),nstop) ! 1601: call copy8(value(ndiag+nstop+1),value(imvn+1),nstop) ! 1602: do 120 i=2,nstop ! 1603: cvalue(lcvn+i)=dcmplx(value(lvn+i),value(imvn+i)) ! 1604: 120 continue ! 1605: cvalue(lcvn+1)=dcmplx(0.0d0,0.0d0) ! 1606: c ! 1607: c finished ! 1608: c ! 1609: return ! 1610: end ! 1611: subroutine dinit ! 1612: implicit double precision (a-h,o-z) ! 1613: c ! 1614: c this routine performs storage-allocation and one-time computation ! 1615: c needed to do the small-signal distortion analysis. ! 1616: c ! 1617: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 1618: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 1619: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 1620: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 1621: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 1622: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 1623: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 1624: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 1625: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, ! 1626: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, ! 1627: 2 itemno,nosolv,ipostp,iscrch ! 1628: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, ! 1629: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof ! 1630: common /blank/ value(1000) ! 1631: integer nodplc(64) ! 1632: complex*16 cvalue(32) ! 1633: equivalence (value(1),nodplc(1),cvalue(1)) ! 1634: c ! 1635: c ! 1636: call getm8(ld0,ndist) ! 1637: call getm16(ld1,5*nstop) ! 1638: c ! 1639: c bipolar junction transistors ! 1640: c ! 1641: loc=locate(12) ! 1642: 100 if (loc.eq.0) go to 200 ! 1643: locv=nodplc(loc+1) ! 1644: area=value(locv+1) ! 1645: locm=nodplc(loc+8) ! 1646: locm=nodplc(locm+1) ! 1647: loct=lx0+nodplc(loc+22) ! 1648: locd=ld0+nodplc(loc+23) ! 1649: csat=value(locm+1)*area ! 1650: ova=value(locm+4) ! 1651: tf=value(locm+24) ! 1652: tr=value(locm+33) ! 1653: czbe=value(locm+21)*area ! 1654: czbc=value(locm+29)*area ! 1655: pe=value(locm+22) ! 1656: xme=value(locm+23) ! 1657: pc=value(locm+30) ! 1658: xmc=value(locm+31) ! 1659: fcpe=value(locm+46) ! 1660: fcpc=value(locm+50) ! 1661: vbe=value(loct) ! 1662: vbc=value(loct+1) ! 1663: gpi=value(loct+4) ! 1664: go=value(loct+7) ! 1665: gm=value(loct+6) ! 1666: gmu=value(loct+5) ! 1667: if (vbe.gt.0.0d0) go to 110 ! 1668: evbe=1.0d0 ! 1669: cbe=csat*vbe/vt ! 1670: go to 120 ! 1671: 110 evbe=dexp(vbe/vt) ! 1672: cbe=csat*(evbe-1.0d0) ! 1673: 120 if (vbc.gt.0.0d0) go to 130 ! 1674: evbc=1.0d0 ! 1675: cbc=csat*vbc/vt ! 1676: arg=1.0d0-vbc/pc ! 1677: go to 140 ! 1678: 130 evbc=dexp(vbc/vt) ! 1679: cbc=csat*(evbc-1.0d0) ! 1680: 140 if (vbe.ge.fcpe) go to 150 ! 1681: arg=1.0d0-vbe/pe ! 1682: sarg=dexp(xme*dlog(arg)) ! 1683: cjeo=czbe/sarg ! 1684: argbe=pe-vbe ! 1685: cje1=xme*cjeo/argbe ! 1686: cje2=xme*(1.0d0+xme)*cje1/argbe ! 1687: go to 160 ! 1688: 150 denom=dexp((1.0d0+xme)*dlog(1.0d0-fcpe)) ! 1689: cjeo=czbe*(1.0d0-fcpe*(1.0d0+xme)+xme*vbe/pe)/denom ! 1690: cje1=czbe*xme/(denom*pe) ! 1691: cje2=0.0d0 ! 1692: 160 if (vbc.ge.fcpc) go to 170 ! 1693: arg=1.0d0-vbc/pc ! 1694: sarg=dexp(xmc*dlog(arg)) ! 1695: cjco=czbc/sarg ! 1696: argbc=pc-vbc ! 1697: cjc1=xmc*cjco/argbc ! 1698: cjc2=xmc*(1.0d0+xmc)*cjc1/argbc ! 1699: go to 180 ! 1700: 170 denom=dexp((1.0d0+xmc)*dlog(1.0d0-fcpc)) ! 1701: cjco=czbc*(1.0d0-fcpc*(1.0d0+xmc)+xmc*vbc/pc)/denom ! 1702: cjc1=czbc*xmc/(denom*pc) ! 1703: cjc2=0.0d0 ! 1704: 180 twovt=vt+vt ! 1705: go2=(-go+csat*(evbe+evbc)*ova)/twovt ! 1706: gmo2=(cbe+csat)*ova/vt-2.0d0*go2 ! 1707: gm2=(gm+go)/twovt-gmo2-go2 ! 1708: gmu2=gmu/twovt ! 1709: if (vbc.le.0.0d0) gmu2=0.0d0 ! 1710: gpi2=gpi/twovt ! 1711: if (vbe.le.0.0d0) gpi2=0.0d0 ! 1712: cbo=tf*csat*evbe/vt ! 1713: cbor=tr*csat*evbc/vt ! 1714: cb1=cbo/vt ! 1715: cb1r=cbor/vt ! 1716: trivt=3.0d0*vt ! 1717: go3=-(go2+(cbc+csat)*ova/twovt)/trivt ! 1718: gmo23=-3.0d0*go3 ! 1719: gm2o3=-gmo23+(cbe+csat)*ova/(vt*twovt) ! 1720: gm3=(gm2-(cbe-cbc)*ova/twovt)/trivt ! 1721: gmu3=gmu2/trivt ! 1722: gpi3=gpi2/trivt ! 1723: cb2=cb1/twovt ! 1724: cb2r=cb1r/twovt ! 1725: value(locd)=cje1 ! 1726: value(locd+1)=cje2 ! 1727: value(locd+2)=cjc1 ! 1728: value(locd+3)=cjc2 ! 1729: value(locd+4)=go2 ! 1730: value(locd+5)=gmo2 ! 1731: value(locd+6)=gm2 ! 1732: value(locd+7)=gmu2 ! 1733: value(locd+8)=gpi2 ! 1734: value(locd+9)=cbo ! 1735: value(locd+10)=cbor ! 1736: value(locd+11)=cb1 ! 1737: value(locd+12)=cb1r ! 1738: value(locd+13)=go3 ! 1739: value(locd+14)=gmo23 ! 1740: value(locd+15)=gm2o3 ! 1741: value(locd+16)=gm3 ! 1742: value(locd+17)=gmu3 ! 1743: value(locd+18)=gpi3 ! 1744: value(locd+19)=cb2 ! 1745: value(locd+20)=cb2r ! 1746: loc=nodplc(loc) ! 1747: go to 100 ! 1748: c ! 1749: c diodes ! 1750: c ! 1751: 200 loc=locate(11) ! 1752: 210 if (loc.eq.0) go to 300 ! 1753: locv=nodplc(loc+1) ! 1754: area=value(locv+1) ! 1755: locm=nodplc(loc+5) ! 1756: locm=nodplc(locm+1) ! 1757: loct=lx0+nodplc(loc+11) ! 1758: locd=ld0+nodplc(loc+12) ! 1759: csat=value(locm+1)*area ! 1760: vte=value(locm+3)*vt ! 1761: tau=value(locm+4) ! 1762: czero=value(locm+5)*area ! 1763: phib=value(locm+6) ! 1764: xm=value(locm+7) ! 1765: fcpb=value(locm+12) ! 1766: vd=value(loct) ! 1767: geq=value(loct+2) ! 1768: evd=1.0d0 ! 1769: if (vd.ge.0.0d0) evd=dexp(vd/vte) ! 1770: if (vd.ge.fcpb) go to 220 ! 1771: arg=1.0d0-vd/phib ! 1772: sarg=dexp(xm*dlog(arg)) ! 1773: cdjo=czero/sarg ! 1774: argd=phib-vd ! 1775: cdj1=xm*czero/argd ! 1776: cdj2=xm*(1.0d0+xm)*cdj1/argd ! 1777: go to 230 ! 1778: 220 denom=dexp((1.0d0+xm)*dlog(1.0d0-fcpb)) ! 1779: cdjo=czero*(1.0d0-fcpb*(1.0d0+xm)+xm*vd/phib)/denom ! 1780: cdj1=czero*xm/(denom*phib) ! 1781: cdj2=0.0d0 ! 1782: cdj2=0.0d0 ! 1783: 230 cdbo=tau*csat*evd/vte ! 1784: cdb1=cdbo/vte ! 1785: twovte=2.0d0*vte ! 1786: geq2=geq/twovte ! 1787: if (vd.le.0.0d0) geq2=0.0d0 ! 1788: trivte=3.0d0*vte ! 1789: geq3=geq2/trivte ! 1790: cdb2=cdb1/twovte ! 1791: value(locd)=cdj1 ! 1792: value(locd+1)=cdj2 ! 1793: value(locd+2)=cdbo ! 1794: value(locd+3)=cdb1 ! 1795: value(locd+4)=geq2 ! 1796: value(locd+5)=geq3 ! 1797: value(locd+6)=cdb2 ! 1798: loc=nodplc(loc) ! 1799: go to 210 ! 1800: c ! 1801: c finished ! 1802: c ! 1803: 300 return ! 1804: end ! 1805: subroutine disto(loco) ! 1806: implicit double precision (a-h,o-z) ! 1807: c ! 1808: c this routine performs the small-signal distortion analysis. ! 1809: c ! 1810: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 1811: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 1812: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 1813: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 1814: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 1815: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 1816: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, ! 1817: 1 defas,rstats(50),iwidth,lwidth,nopage ! 1818: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 1819: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 1820: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, ! 1821: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, ! 1822: 2 itemno,nosolv,ipostp,iscrch ! 1823: common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, ! 1824: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox ! 1825: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, ! 1826: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof ! 1827: common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq, ! 1828: 1 inoise,nosprt,nosout,nosin,idist,idprt ! 1829: common /blank/ value(1000) ! 1830: integer nodplc(64) ! 1831: complex*16 cvalue(32) ! 1832: equivalence (value(1),nodplc(1),cvalue(1)) ! 1833: c ! 1834: c ! 1835: complex*16 difvn1,difvn2,difvn3,difvi1,difvi2,difvi3,dsgo2,dsgm2, ! 1836: 1 dsgmu2,dsgpi2,dscb1,dscb1r,dscje1,dscjc1,disto1,disto2,disto3, ! 1837: 2 dsgmo2,dgm2o3,dgmo23,bew,cew,bcw,be2w,ce2w,bc2w,bew2,cew2, ! 1838: 3 bcw2,bew12,cew12,bcw12,dscdb1,dscdj1,dsg2,cvabe,cvabc,cvace, ! 1839: 4 cvout,cvdist ! 1840: dimension distit(4) ! 1841: dimension vdo(2,12) ! 1842: complex*16 cvdo(12) ! 1843: equivalence (cvdo(1),vdo(1,1)) ! 1844: data distit / 8hdistorti, 8hon analy, 8hsis , 8h / ! 1845: icvw1=ld1 ! 1846: icv2w1=icvw1+nstop ! 1847: icvw2=icv2w1+nstop ! 1848: icvw12=icvw2+nstop ! 1849: icvadj=icvw12+nstop ! 1850: iprnt=0 ! 1851: if (icalc.ge.2) go to 10 ! 1852: idnp=nodplc(idist+2) ! 1853: idnn=nodplc(idist+3) ! 1854: locv=nodplc(idist+1) ! 1855: rload=1.0d0/value(locv+1) ! 1856: kntr=1 ! 1857: 10 if (idprt.eq.0) go to 30 ! 1858: if (kntr.gt.icalc) go to 30 ! 1859: iprnt=1 ! 1860: kntr=kntr+idprt ! 1861: call title(0,lwidth,1,distit) ! 1862: 30 freq1=dreal(cvalue(loco+1)) ! 1863: freq2=skw2*freq1 ! 1864: call copy16(cvalue(lcvn+1),cvalue(icvw1+1),nstop) ! 1865: cvout=cvalue(icvw1+idnp)-cvalue(icvw1+idnn) ! 1866: call magphs(cvout,omag,ophase) ! 1867: c ! 1868: c begin the distortion analysis ! 1869: c ! 1870: do 1000 kdisto=1,7 ! 1871: cvdist=dcmplx(0.0d0,0.0d0) ! 1872: go to (1000,110,120,130,140,160,170),kdisto ! 1873: 110 freqd=2.0d0*freq1 ! 1874: arg=dsqrt(2.0d0*rload*refprl)/(omag*omag) ! 1875: if (iprnt.eq.0) go to 200 ! 1876: write (6,111) freq1,freqd,omag,ophase ! 1877: 111 format (///5x,'2nd harmonic distortion',30x,'freq1 = ',1pd9.2, ! 1878: 1 ' hz'//5x,'distortion frequency ',d9.2,' hz',16x, ! 1879: 2 'mag ',d9.3,3x,'phs ',0pf7.2) ! 1880: go to 200 ! 1881: 120 freqd=3.0d0*freq1 ! 1882: arg=2.0d0*rload*refprl/(omag*omag*omag) ! 1883: if (iprnt.eq.0) go to 200 ! 1884: write (6,121) freq1,freqd,omag,ophase ! 1885: 121 format (1h1,4x,'3rd harmonic distortion',30x,'freq1 = ',1pd9.2, ! 1886: 1 ' hz'//5x,'distortion frequency ',d9.2,' hz',16x, ! 1887: 2 'mag ',d9.3,3x,'phs ',0pf7.2) ! 1888: go to 200 ! 1889: 130 freqd=freq2 ! 1890: go to 200 ! 1891: 140 freqd=freq1-freq2 ! 1892: arg=dsqrt(2.0d0*rload*refprl)*spw2/(omag*omag) ! 1893: if (iprnt.eq.0) go to 200 ! 1894: write (6,151) freq1,freq2,freqd,omag,ophase,ow2mag,ow2phs ! 1895: 151 format (1h1,4x,'2nd order intermodulation difference component', ! 1896: 1 7x,'freq1 = ',1pd9.2,' hz',15x,'freq2 = ',d9.2,' hz'// ! 1897: 2 5x,'distortion frequency ',d9.2,' hz',16x,'mag ', ! 1898: 3 d9.3,3x,'phs ',0pf7.2,9x,'mag ',1pd9.3,3x,'phs ',0pf7.2) ! 1899: go to 200 ! 1900: 160 freqd=freq1+freq2 ! 1901: arg=dsqrt(2.0d0*rload*refprl)*spw2/(omag*omag) ! 1902: if (iprnt.eq.0) go to 200 ! 1903: write (6,161) freq1,freq2,freqd,omag,ophase,ow2mag,ow2phs ! 1904: 161 format (1h1,4x,'2nd order intermodulation sum component', ! 1905: 1 14x,'freq1 = ',1pd9.2,' hz',15x,'freq2 = ',d9.2,' hz'// ! 1906: 2 5x,'distortion frequency ',d9.2,' hz',16x,'mag ', ! 1907: 3 d9.3,3x,'phs ',0pf7.2,9x,'mag ',1pd9.3,3x,'phs ',0pf7.2) ! 1908: go to 200 ! 1909: 170 freqd=2.0d0*freq1-freq2 ! 1910: arg=2.0d0*rload*refprl*spw2/(omag*omag*omag) ! 1911: if (iprnt.eq.0) go to 200 ! 1912: write (6,171) freq1,freq2,freqd,omag,ophase,ow2mag,ow2phs ! 1913: 171 format (1h1,4x,'3rd order intermodulation difference component', ! 1914: 1 7x,'freq1 = ',1pd9.2,' hz',15x,'freq2 = ',d9.2,' hz'// ! 1915: 2 5x,'distortion frequency ',d9.2,' hz',16x,'mag ', ! 1916: 3 d9.3,3x,'phs ',0pf7.2,9x,'mag ',1pd9.3,3x,'phs ',0pf7.2) ! 1917: c ! 1918: c load and decompose y matrix ! 1919: c ! 1920: 200 omega=twopi*freqd ! 1921: igoof=0 ! 1922: call acload ! 1923: call acdcmp ! 1924: if (igoof.eq.0) go to 220 ! 1925: write (6,211) igoof,freqd ! 1926: 211 format('0warning: underflow ',i4,' time(s) in distortion analysis ! 1927: 1 at freq = ',1pd9.3,' hz') ! 1928: igoof=0 ! 1929: 220 if (kdisto.eq.4) go to 710 ! 1930: c ! 1931: c obtain adjoint solution ! 1932: c ! 1933: call zero8(value(lvn+1),nstop) ! 1934: call zero8(value(imvn+1),nstop) ! 1935: value(lvn+idnp)=-1.0d0 ! 1936: value(lvn+idnn)=+1.0d0 ! 1937: call acasol ! 1938: call copy16(cvalue(lcvn+1),cvalue(icvadj+1),nstop) ! 1939: call zero8(value(lvn+1),nstop) ! 1940: call zero8(value(imvn+1),nstop) ! 1941: c ! 1942: c bjts ! 1943: c ! 1944: if (jelcnt(12).eq.0) go to 500 ! 1945: ititle=0 ! 1946: 301 format (////1x,'bjt distortion components'//1x,'name',11x,'gm', ! 1947: 1 8x,'gpi',7x,'go',8x,'gmu',6x,'gmo2',7x,'cb',8x,'cbr',7x,'cje', ! 1948: 2 7x,'cjc',6x,'total') ! 1949: 311 format (////1x,'bjt distortion components'//1x,'name',11x,'gm', ! 1950: 1 8x,'gpi',7x,'go',8x,'gmu',6x,'gmo2',7x,'cb',8x,'cbr',7x,'cje', ! 1951: 2 7x,'cjc',6x,'gm203',5x,'gmo23',5x,'total') ! 1952: 320 loc=locate(12) ! 1953: 330 if (loc.eq.0) go to 500 ! 1954: locv=nodplc(loc+1) ! 1955: loct=lx0+nodplc(loc+22) ! 1956: locd=ld0+nodplc(loc+23) ! 1957: node1=nodplc(loc+5) ! 1958: node2=nodplc(loc+6) ! 1959: node3=nodplc(loc+7) ! 1960: cje1=value(locd) ! 1961: cje2=value(locd+1) ! 1962: cjc1=value(locd+2) ! 1963: cjc2=value(locd+3) ! 1964: go2=value(locd+4) ! 1965: gmo2=value(locd+5) ! 1966: gm2=value(locd+6) ! 1967: gmu2=value(locd+7) ! 1968: gpi2=value(locd+8) ! 1969: cb1=value(locd+11) ! 1970: cb1r=value(locd+12) ! 1971: go3=value(locd+13) ! 1972: gmo23=value(locd+14) ! 1973: gm2o3=value(locd+15) ! 1974: gm3=value(locd+16) ! 1975: gmu3=value(locd+17) ! 1976: gpi3=value(locd+18) ! 1977: cb2=value(locd+19) ! 1978: cb2r=value(locd+20) ! 1979: bew=cvalue(icvw1+node2)-cvalue(icvw1+node3) ! 1980: cew=cvalue(icvw1+node1)-cvalue(icvw1+node3) ! 1981: bcw=cvalue(icvw1+node2)-cvalue(icvw1+node1) ! 1982: if (kdisto.eq.2) go to 370 ! 1983: be2w=cvalue(icv2w1+node2)-cvalue(icv2w1+node3) ! 1984: ce2w=cvalue(icv2w1+node1)-cvalue(icv2w1+node3) ! 1985: bc2w=cvalue(icv2w1+node2)-cvalue(icv2w1+node1) ! 1986: if (kdisto.eq.3) go to 380 ! 1987: bew2=cvalue(icvw2+node2)-cvalue(icvw2+node3) ! 1988: cew2=cvalue(icvw2+node1)-cvalue(icvw2+node3) ! 1989: bcw2=cvalue(icvw2+node2)-cvalue(icvw2+node1) ! 1990: if (kdisto.eq.5) go to 390 ! 1991: if (kdisto.eq.6) go to 400 ! 1992: bew12=cvalue(icvw12+node2)-cvalue(icvw12+node3) ! 1993: cew12=cvalue(icvw12+node1)-cvalue(icvw12+node3) ! 1994: bcw12=cvalue(icvw12+node2)-cvalue(icvw12+node1) ! 1995: go to 410 ! 1996: c ! 1997: c calculate hd2 current generators ! 1998: c ! 1999: 370 difvn1=0.5d0*cew*cew ! 2000: difvn2=0.5d0*bew*bew ! 2001: difvn3=0.5d0*bcw*bcw ! 2002: dsgmo2=gmo2*0.5d0*bew*cew ! 2003: go to 420 ! 2004: c ! 2005: c calculate hd3 current generators ! 2006: c ! 2007: 380 difvi1=0.50d0*cew*ce2w ! 2008: difvn1=0.25d0*cew*cew*cew ! 2009: difvi2=0.50d0*bew*be2w ! 2010: difvn2=0.25d0*bew*bew*bew ! 2011: difvi3=0.50d0*bcw*bc2w ! 2012: difvn3=0.25d0*bcw*bcw*bcw ! 2013: dsgmo2=gmo2*(bew*ce2w+be2w*cew)*0.5d0 ! 2014: go to 430 ! 2015: c ! 2016: c calculate im2d current generators ! 2017: c ! 2018: 390 difvn1=cew*dconjg(cew2) ! 2019: difvn2=bew*dconjg(bew2) ! 2020: difvn3=bcw*dconjg(bcw2) ! 2021: dsgmo2=gmo2*0.5d0*(bew*dconjg(cew2)+cew*dconjg(bew2)) ! 2022: go to 420 ! 2023: c ! 2024: c calculate im2s current generators ! 2025: c ! 2026: 400 difvn1=cew*cew2 ! 2027: difvn2=bew*bew2 ! 2028: difvn3=bcw*bcw2 ! 2029: dsgmo2=gmo2*0.5d0*(bew*cew2+bew2*cew) ! 2030: go to 420 ! 2031: c ! 2032: c calculate im3 current generators ! 2033: c ! 2034: 410 difvi1=0.5d0*(ce2w*dconjg(cew2)+cew*cew12) ! 2035: difvi2=0.5d0*(be2w*dconjg(bew2)+bew*bew12) ! 2036: difvi3=0.5d0*(bc2w*dconjg(bcw2)+bcw*bcw12) ! 2037: difvn1=cew*cew*dconjg(cew2)*0.75d0 ! 2038: difvn2=bew*bew*dconjg(bew2)*0.75d0 ! 2039: difvn3=bcw*bcw*dconjg(bcw2)*0.75d0 ! 2040: dsgmo2=gmo2*0.5d0*(dconjg(bew2)*ce2w+bew*cew12+dconjg(cew2)*be2w+ ! 2041: 1 cew*bew12) ! 2042: go to 430 ! 2043: c ! 2044: 420 dsgo2=go2*difvn1 ! 2045: dsgm2=gm2*difvn2 ! 2046: dsgmu2=gmu2*difvn3 ! 2047: dsgpi2=gpi2*difvn2 ! 2048: dscb1=0.5d0*cb1*omega*dcmplx(-dimag(difvn2),dreal(difvn2)) ! 2049: dscb1r=0.5d0*cb1r*omega*dcmplx(-dimag(difvn3),dreal(difvn3)) ! 2050: dscje1=0.5d0*cje1*omega*dcmplx(-dimag(difvn2),dreal(difvn2)) ! 2051: dscjc1=0.5d0*cjc1*omega*dcmplx(-dimag(difvn3),dreal(difvn3)) ! 2052: go to 440 ! 2053: c ! 2054: 430 dsgo2=2.0d0*go2*difvi1+go3*difvn1 ! 2055: dsgm2=2.0d0*gm2*difvi2+gm3*difvn2 ! 2056: dsgmu2=2.0d0*gmu2*difvi3+gmu3*difvn3 ! 2057: dsgpi2=2.0d0*gpi2*difvi2+gpi3*difvn2 ! 2058: dscb1=omega*(cb1*difvi2+cb2*difvn2/3.0d0) ! 2059: dscb1=dcmplx(-dimag(dscb1),dreal(dscb1)) ! 2060: dscb1r=omega*(cb1r*difvi3+cb2r*difvn3/3.0d0) ! 2061: dscb1r=dcmplx(-dimag(dscb1r),dreal(dscb1r)) ! 2062: dscje1=omega*(cje1*difvi2+cje2*difvn2/3.0d0) ! 2063: dscje1=dcmplx(-dimag(dscje1),dreal(dscje1)) ! 2064: dscjc1=omega*(cjc1*difvi3+cjc2*difvn3/3.0d0) ! 2065: dscjc1=dcmplx(-dimag(dscjc1),dreal(dscjc1)) ! 2066: c ! 2067: c determine contribution of each distortion source ! 2068: c ! 2069: 440 cvabe=cvalue(icvadj+node2)-cvalue(icvadj+node3) ! 2070: cvabc=cvalue(icvadj+node2)-cvalue(icvadj+node1) ! 2071: cvace=cvalue(icvadj+node1)-cvalue(icvadj+node3) ! 2072: disto1=dsgm2+dsgo2+dsgmo2 ! 2073: disto2=dsgpi2+dscb1+dscje1 ! 2074: disto3=dsgmu2+dscb1r+dscjc1 ! 2075: cvdo(1)=dsgm2*cvace*arg ! 2076: cvdo(2)=dsgpi2*cvabe*arg ! 2077: cvdo(3)=dsgo2*cvace*arg ! 2078: cvdo(4)=dsgmu2*cvabc*arg ! 2079: cvdo(5)=dsgmo2*cvace*arg ! 2080: cvdo(6)=dscb1*cvabe*arg ! 2081: cvdo(7)=dscb1r*cvabc*arg ! 2082: cvdo(8)=dscje1*cvabe*arg ! 2083: cvdo(9)=dscjc1*cvabc*arg ! 2084: if (kdisto.eq.3) go to 450 ! 2085: if (kdisto.eq.7) go to 460 ! 2086: cvdo(10)=cvdo(1)+cvdo(2)+cvdo(3)+cvdo(4)+cvdo(5)+cvdo(6)+cvdo(7)+ ! 2087: 1 cvdo(8)+cvdo(9) ! 2088: cvdist=cvdist+cvdo(10) ! 2089: if (iprnt.eq.0) go to 480 ! 2090: do 445 j=1,10 ! 2091: call magphs(cvdo(j),xmag,xphs) ! 2092: cvdo(j)=dcmplx(xmag,xphs) ! 2093: 445 continue ! 2094: if (ititle.eq.0) write (6,301) ! 2095: ititle=1 ! 2096: write (6,446) value(locv),(vdo(1,j),j=1,10) ! 2097: 446 format(1h0,a8,'mag',1p12d10.3) ! 2098: write (6,447) (vdo(2,j),j=1,10) ! 2099: 447 format(9x,'phs',12(1x,f7.2,2x)) ! 2100: go to 480 ! 2101: 450 dgm2o3=gm2o3*cew*bew*bew*0.25d0 ! 2102: dgmo23=gmo23*bew*cew*cew*0.25d0 ! 2103: go to 470 ! 2104: 460 dgm2o3=gm2o3*(0.5d0*bew*dconjg(bew2)*cew+0.25d0*bew*bew* ! 2105: 1 dconjg(cew2)) ! 2106: dgmo23=gmo23*(0.5d0*cew*dconjg(cew2)*bew+0.25d0*cew*cew* ! 2107: 1 dconjg(bew2)) ! 2108: 470 disto1=disto1+dgm2o3+dgmo23 ! 2109: cvdo(10)=dgm2o3*cvace*arg ! 2110: cvdo(11)=dgmo23*cvace*arg ! 2111: cvdo(12)=cvdo(1)+cvdo(2)+cvdo(3)+cvdo(4)+cvdo(5)+cvdo(6)+cvdo(7)+ ! 2112: 1 cvdo(8)+cvdo(9)+cvdo(10)+cvdo(11) ! 2113: cvdist=cvdist+cvdo(12) ! 2114: if (iprnt.eq.0) go to 480 ! 2115: do 475 j=1,12 ! 2116: call magphs(cvdo(j),xmag,xphs) ! 2117: cvdo(j)=dcmplx(xmag,xphs) ! 2118: 475 continue ! 2119: if (ititle.eq.0) write (6,311) ! 2120: ititle=1 ! 2121: write (6,446) value(locv),(vdo(1,j),j=1,12) ! 2122: write (6,447) (vdo(2,j),j=1,12) ! 2123: 480 value(lvn+node1)=value(lvn+node1) ! 2124: 1 -dreal(disto1-disto3) ! 2125: value(lvn+node2)=value(lvn+node2) ! 2126: 1 -dreal(disto2+disto3) ! 2127: value(lvn+node3)=value(lvn+node3) ! 2128: 1 +dreal(disto1+disto2) ! 2129: value(imvn+node1)=value(imvn+node1) ! 2130: 1 -dimag(disto1-disto3) ! 2131: value(imvn+node2)=value(imvn+node2) ! 2132: 1 -dimag(disto2+disto3) ! 2133: value(imvn+node3)=value(imvn+node3) ! 2134: 1 +dimag(disto1+disto2) ! 2135: loc=nodplc(loc) ! 2136: go to 330 ! 2137: c ! 2138: c junction diodes ! 2139: c ! 2140: 500 if (jelcnt(11).eq.0) go to 700 ! 2141: ititle=0 ! 2142: 501 format (////1x,'diode distortion components'//1x,'name', ! 2143: 1 11x,'geq',7x,'cb',8x,'cj',7x,'total') ! 2144: 510 loc=locate(11) ! 2145: 520 if (loc.eq.0) go to 700 ! 2146: locv=nodplc(loc+1) ! 2147: node1=nodplc(loc+2) ! 2148: node2=nodplc(loc+3) ! 2149: node3=nodplc(loc+4) ! 2150: locm=nodplc(loc+5) ! 2151: locm=nodplc(locm+1) ! 2152: loct=lx0+nodplc(loc+11) ! 2153: locd=ld0+nodplc(loc+12) ! 2154: cdj1=value(locd) ! 2155: cdj2=value(locd+1) ! 2156: cdb1=value(locd+3) ! 2157: geq2=value(locd+4) ! 2158: geq3=value(locd+5) ! 2159: cdb2=value(locd+6) ! 2160: bew=cvalue(icvw1+node3)-cvalue(icvw1+node2) ! 2161: if (kdisto.eq.2) go to 540 ! 2162: be2w=cvalue(icv2w1+node3)-cvalue(icv2w1+node2) ! 2163: if (kdisto.eq.3) go to 550 ! 2164: bew2=cvalue(icvw2+node3)-cvalue(icvw2+node2) ! 2165: if (kdisto.eq.5) go to 560 ! 2166: if (kdisto.eq.6) go to 570 ! 2167: bew12=cvalue(icvw12+node3)-cvalue(icvw12+node2) ! 2168: go to 580 ! 2169: c ! 2170: c calculate hd2 current generators ! 2171: c ! 2172: 540 difvn1=0.5d0*bew*bew ! 2173: go to 590 ! 2174: c ! 2175: c calculate hd3 current generators ! 2176: c ! 2177: 550 difvi1=0.5d0*bew*be2w ! 2178: difvn1=0.25d0*bew*bew*bew ! 2179: go to 600 ! 2180: c ! 2181: c calculate im2d current generators ! 2182: c ! 2183: 560 difvn1=bew*dconjg(bew2) ! 2184: go to 590 ! 2185: c ! 2186: c calculate im2s current generators ! 2187: c ! 2188: 570 difvn1=bew*bew2 ! 2189: go to 590 ! 2190: c ! 2191: c calculate im3 current generators ! 2192: c ! 2193: 580 difvi1=0.5d0*(be2w*dconjg(bew2)+bew*bew12) ! 2194: difvn1=bew*bew*dconjg(bew2)*0.75d0 ! 2195: go to 600 ! 2196: 590 dsg2=geq2*difvn1 ! 2197: dscdb1=0.5d0*cdb1*omega*dcmplx(-dimag(difvn1),dreal(difvn1)) ! 2198: dscdj1=0.5d0*cdj1*omega*dcmplx(-dimag(difvn1),dreal(difvn1)) ! 2199: go to 610 ! 2200: c ! 2201: 600 dsg2=2.0d0*geq2*difvi1+geq3*difvn1 ! 2202: dscdb1=omega*(cdb1*difvi1+cdb2*difvn1/3.0d0) ! 2203: dscdb1=dcmplx(-dimag(dscdb1),dreal(dscdb1)) ! 2204: dscdj1=omega*(cdj1*difvi1+cdj2*difvn1/3.0d0) ! 2205: dscdj1=dcmplx(-dimag(dscdj1),dreal(dscdj1)) ! 2206: c ! 2207: c determine contribution of each distortion source ! 2208: c ! 2209: 610 cvabe=cvalue(icvadj+node3)-cvalue(icvadj+node2) ! 2210: disto1=dsg2+dscdb1+dscdj1 ! 2211: cvdo(1)=dsg2*cvabe*arg ! 2212: cvdo(2)=dscdb1*cvabe*arg ! 2213: cvdo(3)=dscdj1*cvabe*arg ! 2214: cvdo(4)=cvdo(1)+cvdo(2)+cvdo(3) ! 2215: cvdist=cvdist+cvdo(4) ! 2216: if (iprnt.eq.0) go to 680 ! 2217: do 670 j=1,4 ! 2218: call magphs(cvdo(j),xmag,xphs) ! 2219: cvdo(j)=dcmplx(xmag,xphs) ! 2220: 670 continue ! 2221: if (ititle.eq.0) write (6,501) ! 2222: ititle=1 ! 2223: write (6,446) value(locv),(vdo(1,j),j=1,4) ! 2224: write (6,447) (vdo(2,j),j=1,4) ! 2225: 680 value(lvn+node2)=value(lvn+node2)+dreal(disto1) ! 2226: value(lvn+node3)=value(lvn+node3)-dreal(disto1) ! 2227: value(imvn+node2)=value(imvn+node2)+dimag(disto1) ! 2228: value(imvn+node3)=value(imvn+node3)-dimag(disto1) ! 2229: loc=nodplc(loc) ! 2230: go to 520 ! 2231: c ! 2232: c obtain total distortion solution if necessary ! 2233: c ! 2234: 700 go to (1000,710,790,710,710,840,860),kdisto ! 2235: 710 call acsol ! 2236: c ! 2237: c store solution, print and store answers ! 2238: c ! 2239: 760 go to (1000,770,790,800,820,840,860),kdisto ! 2240: 770 call copy16(cvalue(lcvn+1),cvalue(icv2w1+1),nstop) ! 2241: call magphs(cvdist,o2mag,o2phs) ! 2242: if (iprnt.eq.0) go to 900 ! 2243: o2log=20.0d0*dlog10(o2mag) ! 2244: write (6,781) o2mag,o2phs,o2log ! 2245: 781 format (///5x,'hd2 magnitude ',1pd10.3,5x,'phase ',0pf7.2, ! 2246: 1 5x,'= ',f7.2,' db') ! 2247: go to 900 ! 2248: 790 call magphs(cvdist,o3mag,o3phs) ! 2249: if (iprnt.eq.0) go to 900 ! 2250: o3log=20.0d0*dlog10(o3mag) ! 2251: write (6,791) o3mag,o3phs,o3log ! 2252: 791 format (///5x,'hd3 magnitude ',1pd10.3,5x,'phase ',0pf7.2, ! 2253: 1 5x,'= ',f7.2,' db') ! 2254: go to 900 ! 2255: 800 call copy16(cvalue(lcvn+1),cvalue(icvw2+1),nstop) ! 2256: cvout=cvalue(icvw2+idnp)-cvalue(icvw2+idnn) ! 2257: call magphs(cvout,ow2mag,ow2phs) ! 2258: go to 1000 ! 2259: 820 call copy16(cvalue(lcvn+1),cvalue(icvw12+1),nstop) ! 2260: 840 call magphs(cvdist,o12mag,o12phs) ! 2261: if (iprnt.eq.0) go to 900 ! 2262: o12log=20.0d0*dlog10(o12mag) ! 2263: if (kdisto.eq.6) go to 850 ! 2264: write (6,841) o12mag,o12phs,o12log ! 2265: 841 format (///5x,'im2d magnitude ',1pd10.3,5x,'phase ',0pf7.2, ! 2266: 1 5x,'= ',f7.2,' db') ! 2267: go to 900 ! 2268: 850 write (6,851) o12mag,o12phs,o12log ! 2269: 851 format (///5x,'im2s magnitude ',1pd10.3,5x,'phase ',0pf7.2, ! 2270: 1 5x,'= ',f7.2,' db') ! 2271: go to 900 ! 2272: 860 call magphs(cvdist,o21mag,o21phs) ! 2273: if (iprnt.eq.0) go to 900 ! 2274: o21log=20.0d0*dlog10(o21mag) ! 2275: write (6,861) o21mag,o21phs,o21log ! 2276: 861 format (///5x,'im3 magnitude ',1pd10.3,5x,'phase ',0pf7.2, ! 2277: 1 5x,'= ',f7.2,' db') ! 2278: cma=dabs(4.0d0*o21mag*dcos((o21phs-ophase)/rad)) ! 2279: cma=dmax1(cma,1.0d-20) ! 2280: cmp=dabs(4.0d0*o21mag*dsin((o21phs-ophase)/rad)) ! 2281: cmp=dmax1(cmp,1.0d-20) ! 2282: cmalog=20.0d0*dlog10(cma) ! 2283: cmplog=20.0d0*dlog10(cmp) ! 2284: write (6,866) ! 2285: 866 format (////5x,'approximate cross modulation components') ! 2286: write (6,871) cma,cmalog ! 2287: 871 format (/5x,'cma magnitude ',1pd10.3,24x,'= ',0pf7.2,' db') ! 2288: write (6,881) cmp,cmplog ! 2289: 881 format (/5x,'cmp magnitude ',1pd10.3,24x,'= ',0pf7.2,' db') ! 2290: c ! 2291: c save distortion outputs ! 2292: c ! 2293: 900 iflag=kdisto+2 ! 2294: if (iflag.ge.7) iflag=iflag-1 ! 2295: loc=locate(45) ! 2296: 910 if (loc.eq.0) go to 1000 ! 2297: if (nodplc(loc+5).ne.iflag) go to 920 ! 2298: iseq=nodplc(loc+4) ! 2299: cvalue(loco+iseq)=cvdist ! 2300: 920 loc=nodplc(loc) ! 2301: go to 910 ! 2302: 1000 continue ! 2303: c ! 2304: c finished ! 2305: c ! 2306: 2000 return ! 2307: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.