|
|
1.1 ! root 1: subroutine dcop ! 2: implicit double precision (a-h,o-z) ! 3: c ! 4: c ! 5: c this routine prints out the operating points of the nonlinear ! 6: c circuit elements. ! 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 /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, ! 20: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox ! 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 /blank/ value(1000) ! 28: integer nodplc(64) ! 29: complex*16 cvalue(32) ! 30: equivalence (value(1),nodplc(1),cvalue(1)) ! 31: c ! 32: c ! 33: dimension optitl(4) ! 34: dimension anam(12),av1(12),ai1(12),req(12) ! 35: dimension amod(12),vd(12),cap(12) ! 36: dimension cb(12),cc(12),vbe(12),vbc(12),vce(12),rpi(12), ! 37: 1 ro(12),cpi(12),cmu(12),betadc(12),betaac(12),ft(12), ! 38: 2 ccs(12),cbx(12),rx(12) ! 39: dimension cg(12),vgs(12),vds(12),gds(12),vbs(12),cbd(12),cbs(12), ! 40: 2 cgsov(12),cgdov(12),cgbov(12),vth(12),vdsat(12),cd(12),gm(12), ! 41: 3 ccgg(12),ccgd(12),ccgs(12),ccbg(12),ccbd(12),ccbs(12), ! 42: 4 gmb(12) ! 43: dimension cgs(12),cgd(12),cgb(12),cds(12) ! 44: equivalence(cb(1),cg(1)),(cc(1),vgs(1)),(vbe(1),vds(1)), ! 45: 1(vbc(1),gds(1)),(vce(1),vbs(1)),(rpi(1),cbd(1)), ! 46: 2(ro(1),cbs(1)),(cpi(1),cgsov(1)),(cmu(1),cgdov(1)), ! 47: 3(betadc(1),cgbov(1)),(betaac(1),vth(1)),(ft(1),vdsat(1)), ! 48: 4(ccs(1),cd(1)),(cbx(1),ccgg(1)),(rx(1),ccgd(1)) ! 49: equivalence(vd(1),cg(1)),(cap(1),vgs(1)),(av1(1),vds(1)), ! 50: 1 (ai1(1),gds(1)),(req(1),vbs(1)) ! 51: equivalence (cgs(1),ccgg(1)),(cgd(1),ccgd(1)),(cgb(1),ccgs(1)), ! 52: 1 (cds(1),ccbg(1)) ! 53: dimension afmt1(3),afmt2(2),afmt3(3),afmt4(3) ! 54: data optitl / 8hoperatin, 8hg point , 8hinformat, 8hion / ! 55: data av,avd,avbe,avbc,avce,avgs,avds,avbs / 1hv,2hvd,3hvbe,3hvbc, ! 56: 1 3hvce,3hvgs,3hvds,3hvbs / ! 57: data acntrv,acntri,asrcv,asrci,atrang,atranr,avgain,aigain / ! 58: 1 8hv-contrl, 8hi-contrl, 8hv-source, 8hi-source, ! 59: 2 8htrans-g , 8htrans-r , 8hv gain , 8hi gain / ! 60: data ai,aid,aib,aic,aig / 1hi,2hid,2hib,2hic,2hig / ! 61: data areq,arpi,aro / 3hreq,3hrpi,2hro / ! 62: data acap,acpi,acmu,acgs,acgd,acbd,acbs / 3hcap,3hcpi,3hcmu,3hcgs, ! 63: 1 3hcgd,3hcbd,3hcbs / ! 64: data acgsov,acgdov,acgbov /6hcgsovl,6hcgdovl,6hcgbovl/ ! 65: data accgg,accgd,accgs,accbg,accbd,accbs /7hdqgdvgb,7hdqgdvdb, ! 66: 1 7hdqgdvsb,7hdqbdvgb,7hdqbdvdb,7hdqbdvsb/ ! 67: data acgb,acds / 3hcgb,3hcds / ! 68: data avth, avdsat / 3hvth, 5hvdsat / ! 69: data agm,agds / 2hgm,3hgds / ! 70: data agmb / 4hgmb / ! 71: data accs,acbx,arx /3hccs,3hcbx,2hrx/ ! 72: data abetad,abetaa / 6hbetadc,6hbetaac / ! 73: data aft / 2hft / ! 74: c ! 75: data ablnk /1h / ! 76: data afmt1 /8h(//1h0,1,8h0x, (2x,8h,a8)) / ! 77: data afmt2 /8h(1h ,a8,,8h f10.3)/ ! 78: data afmt3 /8h(1h ,a8,,8h1p d10.,8h2) / ! 79: data afmt4 /8h('0model,8h ', (,8h2x,a8)) / ! 80: c ! 81: c.. fix-up the format statements ! 82: c ! 83: kntr=12 ! 84: if(lwidth.le.80) kntr=7 ! 85: ipos=12 ! 86: call move(afmt1,ipos,ablnk,1,2) ! 87: call alfnum(kntr,afmt1,ipos) ! 88: ipos=9 ! 89: call move(afmt2,ipos,ablnk,1,2) ! 90: call alfnum(kntr,afmt2,ipos) ! 91: ipos=11 ! 92: call move(afmt3,ipos,ablnk,1,2) ! 93: call alfnum(kntr,afmt3,ipos) ! 94: ipos=14 ! 95: call move(afmt4,ipos,ablnk,1,2) ! 96: call alfnum(kntr,afmt4,ipos) ! 97: c ! 98: c compute voltage source currents and power dissipation ! 99: c ! 100: call second(t1) ! 101: if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 700 ! 102: power=0.0d0 ! 103: if (jelcnt(9).eq.0) go to 50 ! 104: ititle=0 ! 105: 11 format (////5x,'voltage source currents'//5x,'name', ! 106: 1 7x,'current'/) ! 107: loc=locate(9) ! 108: 20 if (loc.eq.0) go to 50 ! 109: locv=nodplc(loc+1) ! 110: iptr=nodplc(loc+6) ! 111: creal=value(lvnim1+iptr) ! 112: power=power-creal*value(locv+1) ! 113: if (ititle.eq.0) write (6,11) ! 114: ititle=1 ! 115: write (6,21) value(locv),creal ! 116: 21 format (/5x,a8,1x,1pd10.3) ! 117: 30 loc=nodplc(loc) ! 118: go to 20 ! 119: 50 loc=locate(10) ! 120: 60 if (loc.eq.0) go to 90 ! 121: locv=nodplc(loc+1) ! 122: node1=nodplc(loc+2) ! 123: node2=nodplc(loc+3) ! 124: power=power-value(locv+1) ! 125: 1 *(value(lvnim1+node1)-value(lvnim1+node2)) ! 126: loc=nodplc(loc) ! 127: go to 60 ! 128: 90 write (6,91) power ! 129: 91 format (//5x,'total power dissipation ',1pd9.2,' watts') ! 130: c ! 131: c small signal device parameters ! 132: c ! 133: numdev=jelcnt(5)+jelcnt(6)+jelcnt(7)+jelcnt(8)+jelcnt(11) ! 134: 1 +jelcnt(12)+jelcnt(13)+jelcnt(14) ! 135: if (numdev.eq.0) go to 600 ! 136: call title(0,lwidth,1,optitl) ! 137: kntlim=lwidth/11 ! 138: c ! 139: c nonlinear voltage controlled current sources ! 140: c ! 141: if (jelcnt(5).eq.0) go to 175 ! 142: ititle=0 ! 143: 111 format(1h0,/,'0**** voltage-controlled current sources') ! 144: loc=locate(5) ! 145: kntr=0 ! 146: 120 if (loc.eq.0) go to 140 ! 147: kntr=kntr+1 ! 148: locv=nodplc(loc+1) ! 149: loct=lx0+nodplc(loc+12) ! 150: anam(kntr)=value(locv) ! 151: ai1(kntr)=value(loct) ! 152: if (kntr.ge.kntlim) go to 150 ! 153: 130 loc=nodplc(loc) ! 154: go to 120 ! 155: 140 if (kntr.eq.0) go to 175 ! 156: 150 if (ititle.eq.0) write (6,111) ! 157: ititle=1 ! 158: write (6,afmt1) (anam(i),i=1,kntr) ! 159: write (6,afmt3) asrci,(ai1(i),i=1,kntr) ! 160: kntr=0 ! 161: if (loc.ne.0) go to 130 ! 162: c ! 163: c nonlinear voltage controlled voltage sources ! 164: c ! 165: 175 if (jelcnt(6).eq.0) go to 186 ! 166: ititle=0 ! 167: 176 format(1h0,/,'0**** voltage-controlled voltage sources') ! 168: loc=locate(6) ! 169: kntr=0 ! 170: 178 if (loc.eq.0) go to 182 ! 171: kntr=kntr+1 ! 172: locv=nodplc(loc+1) ! 173: loct=lx0+nodplc(loc+13) ! 174: anam(kntr)=value(locv) ! 175: av1(kntr)=value(loct) ! 176: ai1(kntr)=value(loct+1) ! 177: if (kntr.ge.kntlim) go to 184 ! 178: 180 loc=nodplc(loc) ! 179: go to 178 ! 180: 182 if (kntr.eq.0) go to 186 ! 181: 184 if (ititle.eq.0) write (6,176) ! 182: ititle=1 ! 183: write (6,afmt1) (anam(i),i=1,kntr) ! 184: write (6,afmt2) asrcv,(av1(i),i=1,kntr) ! 185: write (6,afmt3) asrci,(ai1(i),i=1,kntr) ! 186: kntr=0 ! 187: if (loc.ne.0) go to 180 ! 188: c ! 189: c nonlinear current controlled current sources ! 190: c ! 191: 186 if (jelcnt(7).eq.0) go to 196 ! 192: ititle=0 ! 193: 187 format(1h0,/,'0**** current-controlled current sources') ! 194: loc=locate(7) ! 195: kntr=0 ! 196: 188 if (loc.eq.0) go to 192 ! 197: kntr=kntr+1 ! 198: locv=nodplc(loc+1) ! 199: loct=lx0+nodplc(loc+12) ! 200: anam(kntr)=value(locv) ! 201: ai1(kntr)=value(loct) ! 202: if (kntr.ge.kntlim) go to 194 ! 203: 190 loc=nodplc(loc) ! 204: go to 188 ! 205: 192 if (kntr.eq.0) go to 196 ! 206: 194 if (ititle.eq.0) write (6,187) ! 207: ititle=1 ! 208: write (6,afmt1) (anam(i),i=1,kntr) ! 209: write (6,afmt3) asrci,(ai1(i),i=1,kntr) ! 210: kntr=0 ! 211: if (loc.ne.0) go to 190 ! 212: c ! 213: c nonlinear current controlled voltage sources ! 214: c ! 215: 196 if (jelcnt(8).eq.0) go to 210 ! 216: ititle=0 ! 217: 197 format(1h0,/,'0**** current-controlled voltage sources') ! 218: loc=locate(8) ! 219: kntr=0 ! 220: 198 if (loc.eq.0) go to 202 ! 221: kntr=kntr+1 ! 222: locv=nodplc(loc+1) ! 223: loct=lx0+nodplc(loc+13) ! 224: anam(kntr)=value(locv) ! 225: av1(kntr)=value(loct) ! 226: ai1(kntr)=value(loct+1) ! 227: if (kntr.ge.kntlim) go to 204 ! 228: 200 loc=nodplc(loc) ! 229: go to 198 ! 230: 202 if (kntr.eq.0) go to 210 ! 231: 204 if (ititle.eq.0) write (6,197) ! 232: ititle=1 ! 233: write (6,afmt1) (anam(i),i=1,kntr) ! 234: write (6,afmt2) asrcv,(av1(i),i=1,kntr) ! 235: write (6,afmt3) asrci,(ai1(i),i=1,kntr) ! 236: kntr=0 ! 237: if (loc.ne.0) go to 200 ! 238: c ! 239: c diodes ! 240: c ! 241: 210 if (jelcnt(11).eq.0) go to 300 ! 242: ititle=0 ! 243: 211 format(1h0,/,'0**** diodes') ! 244: loc=locate(11) ! 245: kntr=0 ! 246: 220 if (loc.eq.0) go to 240 ! 247: kntr=kntr+1 ! 248: locv=nodplc(loc+1) ! 249: node1=nodplc(loc+2) ! 250: node2=nodplc(loc+3) ! 251: locm=nodplc(loc+5) ! 252: locm=nodplc(locm+1) ! 253: loct=lx0+nodplc(loc+11) ! 254: anam(kntr)=value(locv) ! 255: amod(kntr)=value(locm) ! 256: cd(kntr)=value(loct+1) ! 257: vd(kntr)=value(lvnim1+node1)-value(lvnim1+node2) ! 258: if (modedc.ne.1) go to 225 ! 259: req(kntr)=1.0d0/value(loct+2) ! 260: cap(kntr)=value(loct+4) ! 261: 225 if (kntr.ge.kntlim) go to 250 ! 262: 230 loc=nodplc(loc) ! 263: go to 220 ! 264: 240 if (kntr.eq.0) go to 300 ! 265: 250 if (ititle.eq.0) write (6,211) ! 266: ititle=1 ! 267: write (6,afmt1) (anam(i),i=1,kntr) ! 268: write (6,afmt4) (amod(i),i=1,kntr) ! 269: write (6,afmt3) aid,(cd(i),i=1,kntr) ! 270: write (6,afmt2) avd,(vd(i),i=1,kntr) ! 271: if (modedc.ne.1) go to 260 ! 272: write (6,afmt3) areq,(req(i),i=1,kntr) ! 273: write (6,afmt3) acap,(cap(i),i=1,kntr) ! 274: 260 kntr=0 ! 275: if (loc.ne.0) go to 230 ! 276: c ! 277: c bipolar junction transistors ! 278: c ! 279: 300 if (jelcnt(12).eq.0) go to 400 ! 280: ititle=0 ! 281: 301 format(1h0,/,'0**** bipolar junction transistors') ! 282: loc=locate(12) ! 283: kntr=0 ! 284: 320 if (loc.eq.0) go to 340 ! 285: kntr=kntr+1 ! 286: locv=nodplc(loc+1) ! 287: node1=nodplc(loc+2) ! 288: node2=nodplc(loc+3) ! 289: node3=nodplc(loc+4) ! 290: locm=nodplc(loc+8) ! 291: type=nodplc(locm+2) ! 292: locm=nodplc(locm+1) ! 293: loct=lx0+nodplc(loc+22) ! 294: anam(kntr)=value(locv) ! 295: amod(kntr)=value(locm) ! 296: cb(kntr)=type*value(loct+3) ! 297: cc(kntr)=type*value(loct+2) ! 298: vbe(kntr)=value(lvnim1+node2)-value(lvnim1+node3) ! 299: vbc(kntr)=value(lvnim1+node2)-value(lvnim1+node1) ! 300: vce(kntr)=vbe(kntr)-vbc(kntr) ! 301: betadc(kntr)=cc(kntr)/dsign(dmax1(dabs(cb(kntr)),1.0d-20), ! 302: 1 cb(kntr)) ! 303: if (modedc.ne.1) go to 325 ! 304: rx(kntr)=0.0d0 ! 305: if(value(loct+16).ne.0.0d0) rx(kntr)=1.0d0/value(loct+16) ! 306: ccs(kntr)=value(loct+13) ! 307: cbx(kntr)=value(loct+15) ! 308: rpi(kntr)=1.0d0/value(loct+4) ! 309: gm(kntr)=value(loct+6) ! 310: ro(kntr)=1.0d0/value(loct+7) ! 311: cpi(kntr)=value(loct+9) ! 312: cmu(kntr)=value(loct+11) ! 313: betaac(kntr)=gm(kntr)*rpi(kntr) ! 314: ft(kntr)=gm(kntr)/(twopi*dmax1(cpi(kntr)+cmu(kntr)+cbx(kntr), ! 315: 1 1.0d-20)) ! 316: 325 if (kntr.ge.kntlim) go to 350 ! 317: 330 loc=nodplc(loc) ! 318: go to 320 ! 319: 340 if (kntr.eq.0) go to 400 ! 320: 350 if (ititle.eq.0) write (6,301) ! 321: ititle=1 ! 322: write (6,afmt1) (anam(i),i=1,kntr) ! 323: write (6,afmt4) (amod(i),i=1,kntr) ! 324: write (6,afmt3) aib,(cb(i),i=1,kntr) ! 325: write (6,afmt3) aic,(cc(i),i=1,kntr) ! 326: write (6,afmt2) avbe,(vbe(i),i=1,kntr) ! 327: write (6,afmt2) avbc,(vbc(i),i=1,kntr) ! 328: write (6,afmt2) avce,(vce(i),i=1,kntr) ! 329: write (6,afmt2) abetad,(betadc(i),i=1,kntr) ! 330: if (modedc.ne.1) go to 360 ! 331: write (6,afmt3) agm,(gm(i),i=1,kntr) ! 332: write (6,afmt3) arpi,(rpi(i),i=1,kntr) ! 333: write(6,afmt3) arx,(rx(i),i=1,kntr) ! 334: write (6,afmt3) aro,(ro(i),i=1,kntr) ! 335: write (6,afmt3) acpi,(cpi(i),i=1,kntr) ! 336: write (6,afmt3) acmu,(cmu(i),i=1,kntr) ! 337: write(6,afmt3) acbx,(cbx(i),i=1,kntr) ! 338: write(6,afmt3) accs,(ccs(i),i=1,kntr) ! 339: write (6,afmt2) abetaa,(betaac(i),i=1,kntr) ! 340: write (6,afmt3) aft,(ft(i),i=1,kntr) ! 341: 360 kntr=0 ! 342: if (loc.ne.0) go to 330 ! 343: c ! 344: c jfets ! 345: c ! 346: 400 if (jelcnt(13).eq.0) go to 500 ! 347: ititle=0 ! 348: 401 format(1h0,/,'0**** jfets') ! 349: loc=locate(13) ! 350: kntr=0 ! 351: 420 if (loc.eq.0) go to 440 ! 352: kntr=kntr+1 ! 353: locv=nodplc(loc+1) ! 354: node1=nodplc(loc+2) ! 355: node2=nodplc(loc+3) ! 356: node3=nodplc(loc+4) ! 357: locm=nodplc(loc+7) ! 358: type=nodplc(locm+2) ! 359: locm=nodplc(locm+1) ! 360: loct=lx0+nodplc(loc+19) ! 361: anam(kntr)=value(locv) ! 362: amod(kntr)=value(locm) ! 363: cd(kntr)=type*(value(loct+3)-value(loct+4)) ! 364: vgs(kntr)=value(lvnim1+node2)-value(lvnim1+node3) ! 365: vds(kntr)=value(lvnim1+node1)-value(lvnim1+node3) ! 366: if (modedc.ne.1) go to 425 ! 367: gm(kntr)=value(loct+5) ! 368: gds(kntr)=value(loct+6) ! 369: cgs(kntr)=value(loct+9) ! 370: cgd(kntr)=value(loct+11) ! 371: 425 if (kntr.ge.kntlim) go to 450 ! 372: 430 loc=nodplc(loc) ! 373: go to 420 ! 374: 440 if (kntr.eq.0) go to 500 ! 375: 450 if (ititle.eq.0) write (6,401) ! 376: ititle=1 ! 377: write (6,afmt1) (anam(i),i=1,kntr) ! 378: write (6,afmt4) (amod(i),i=1,kntr) ! 379: write (6,afmt3) aid,(cd(i),i=1,kntr) ! 380: write (6,afmt2) avgs,(vgs(i),i=1,kntr) ! 381: write (6,afmt2) avds,(vds(i),i=1,kntr) ! 382: if (modedc.ne.1) go to 460 ! 383: write (6,afmt3) agm,(gm(i),i=1,kntr) ! 384: write (6,afmt3) agds,(gds(i),i=1,kntr) ! 385: write (6,afmt3) acgs,(cgs(i),i=1,kntr) ! 386: write (6,afmt3) acgd,(cgd(i),i=1,kntr) ! 387: 460 kntr=0 ! 388: if (loc.ne.0) go to 430 ! 389: c ! 390: c mosfets ! 391: c ! 392: 500 if (jelcnt(14).eq.0) go to 600 ! 393: ititle=0 ! 394: 501 format(1h0,/,'0**** mosfets') ! 395: loc=locate(14) ! 396: kntr=0 ! 397: 520 if (loc.eq.0) go to 540 ! 398: kntr=kntr+1 ! 399: locv=nodplc(loc+1) ! 400: node1=nodplc(loc+2) ! 401: node2=nodplc(loc+3) ! 402: node3=nodplc(loc+4) ! 403: node4=nodplc(loc+5) ! 404: node5=nodplc(loc+6) ! 405: node6=nodplc(loc+7) ! 406: locm=nodplc(loc+8) ! 407: type=nodplc(locm+2) ! 408: locm=nodplc(locm+1) ! 409: loct=lx0+nodplc(loc+26) ! 410: anam(kntr)=value(locv) ! 411: amod(kntr)=value(locm) ! 412: if(type.eq.0.0d0) go to 522 ! 413: cd(kntr)=type*value(loct+4) ! 414: vgs(kntr)=value(lvnim1+node2)-value(lvnim1+node3) ! 415: vds(kntr)=value(lvnim1+node1)-value(lvnim1+node3) ! 416: vbs(kntr)=value(lvnim1+node4)-value(lvnim1+node3) ! 417: if (modedc.ne.1) go to 525 ! 418: xl=value(locv+1)-2.0d0*value(locm+20) ! 419: xw=value(locv+2)-2.0d0*value(locm+36) ! 420: covlgs=value(locm+8)*xw ! 421: covlgd=value(locm+9)*xw ! 422: covlgb=value(locm+10)*xl ! 423: devmod=value(locv+8) ! 424: vdsat(kntr)=value(locv+10) ! 425: vth(kntr)=value(locv+9)+type*(value(lvnim1+node4)- ! 426: 1 value(lvnim1+node6)) ! 427: gds(kntr)=value(loct+1) ! 428: gm(kntr)=value(loct) ! 429: gmb(kntr)=-(value(loct)+value(loct+1)+value(loct+2)) ! 430: if(devmod.gt.0.0d0) go to 521 ! 431: gds(kntr)=value(loct+2) ! 432: vth(kntr)=value(locv+9)+type*(value(lvnim1+node4)- ! 433: 1 value(lvnim1+node5)) ! 434: 521 cbd(kntr)=value(loct+14) ! 435: cbs(kntr)=value(loct+15) ! 436: cgsov(kntr)=covlgs ! 437: cgdov(kntr)=covlgd ! 438: cgbov(kntr)=covlgb ! 439: ccgg(kntr)=value(loct+8) ! 440: ccgd(kntr)=value(loct+9) ! 441: ccgs(kntr)=value(loct+10) ! 442: ccbg(kntr)=value(loct+11) ! 443: ccbd(kntr)=value(loct+12) ! 444: ccbs(kntr)=value(loct+13) ! 445: go to 525 ! 446: c... special case for ga-as ! 447: 522 cd(kntr)=value(loct+4) ! 448: cg(kntr)=value(loct+5) ! 449: vgs(kntr)=value(lvnim1+node2)-value(lvnim1+node3) ! 450: vds(kntr)=value(lvnim1+node1)-value(lvnim1+node3) ! 451: vbs(kntr)=value(lvnim1+node4)-value(lvnim1+node3) ! 452: if(modedc.ne.1) go to 525 ! 453: modeop=value(locv+8) ! 454: gm(kntr)=value(loct+7) ! 455: gds(kntr)=(value(loct+8)*value(loct+11)) ! 456: 1 /(value(loct+8)+value(loct+11)) ! 457: if(modeop.le.0) gm(kntr)=value(loct+13) ! 458: cds(kntr)=value(loct+10) ! 459: cgs(kntr)=value(loct+12) ! 460: cgd(kntr)=value(loct+14) ! 461: cgb(kntr)=value(loct+16) ! 462: 525 if (kntr.ge.kntlim) go to 550 ! 463: 530 loc=nodplc(loc) ! 464: go to 520 ! 465: 540 if (kntr.eq.0) go to 600 ! 466: 550 if (ititle.eq.0) write (6,501) ! 467: ititle=1 ! 468: write (6,afmt1) (anam(i),i=1,kntr) ! 469: write (6,afmt4) (amod(i),i=1,kntr) ! 470: if(type.eq.0.0d0) go to 555 ! 471: write (6,afmt3) aid,(cd(i),i=1,kntr) ! 472: write (6,afmt2) avgs,(vgs(i),i=1,kntr) ! 473: write (6,afmt2) avds,(vds(i),i=1,kntr) ! 474: write (6,afmt2) avbs,(vbs(i),i=1,kntr) ! 475: if (modedc.ne.1) go to 560 ! 476: write (6,afmt2) avth,(vth(i),i=1,kntr) ! 477: write (6,afmt2) avdsat,(vdsat(i),i=1,kntr) ! 478: write (6,afmt3) agm,(gm(i),i=1,kntr) ! 479: write (6,afmt3) agds,(gds(i),i=1,kntr) ! 480: write (6,afmt3) agmb,(gmb(i),i=1,kntr) ! 481: write (6,afmt3) acbd,(cbd(i),i=1,kntr) ! 482: write (6,afmt3) acbs,(cbs(i),i=1,kntr) ! 483: write (6,afmt3) acgsov,(cgsov(i),i=1,kntr) ! 484: write (6,afmt3) acgdov,(cgdov(i),i=1,kntr) ! 485: write (6,afmt3) acgbov,(cgbov(i),i=1,kntr) ! 486: write(6,551) ! 487: 551 format(' derivatives of gate (dqgdvx) and bulk (dqbdvx) charges') ! 488: write (6,afmt3) accgg,(ccgg(i),i=1,kntr) ! 489: write (6,afmt3) accgd,(ccgd(i),i=1,kntr) ! 490: write (6,afmt3) accgs,(ccgs(i),i=1,kntr) ! 491: write (6,afmt3) accbg,(ccbg(i),i=1,kntr) ! 492: write (6,afmt3) accbd,(ccbd(i),i=1,kntr) ! 493: write (6,afmt3) accbs,(ccbs(i),i=1,kntr) ! 494: go to 560 ! 495: 555 write(6,afmt3) aid,(cd(i),i=1,kntr) ! 496: write(6,afmt3) aig,(cg(i),i=1,kntr) ! 497: write (6,afmt2) avgs,(vgs(i),i=1,kntr) ! 498: write (6,afmt2) avds,(vds(i),i=1,kntr) ! 499: write (6,afmt2) avbs,(vbs(i),i=1,kntr) ! 500: if (modedc.ne.1) go to 560 ! 501: write (6,afmt3) agm,(gm(i),i=1,kntr) ! 502: write (6,afmt3) agds,(gds(i),i=1,kntr) ! 503: write (6,afmt3) acgs,(cgs(i),i=1,kntr) ! 504: write (6,afmt3) acgd,(cgd(i),i=1,kntr) ! 505: write (6,afmt3) acgb,(cgb(i),i=1,kntr) ! 506: write (6,afmt3) acds,(cds(i),i=1,kntr) ! 507: 560 kntr=0 ! 508: if (loc.ne.0) go to 530 ! 509: 600 if (modedc.ne.1) go to 700 ! 510: if (kinel.eq.0) go to 610 ! 511: call sstf ! 512: 610 if (nsens.eq.0) go to 700 ! 513: call sencal ! 514: c ! 515: c finished ! 516: c ! 517: 700 if (modedc.eq.2) go to 710 ! 518: if (jacflg.ne.0) go to 705 ! 519: call clrmem(lvnim1) ! 520: call clrmem(lx0) ! 521: 705 call clrmem(lvn) ! 522: call clrmem(ndiag) ! 523: 710 call second(t2) ! 524: rstats(5)=rstats(5)+t2-t1 ! 525: return ! 526: end ! 527: subroutine sstf ! 528: implicit double precision (a-h,o-z) ! 529: c ! 530: c this routine computes the value of the small-signal transfer ! 531: c function specified by the user. ! 532: c ! 533: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 534: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 535: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 536: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 537: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 538: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 539: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 540: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 541: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, ! 542: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof ! 543: common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop, ! 544: 1 kinel,kidin,kovar,kidout ! 545: common /blank/ value(1000) ! 546: integer nodplc(64) ! 547: complex*16 cvalue(32) ! 548: equivalence (value(1),nodplc(1),cvalue(1)) ! 549: c ! 550: c ! 551: dimension string(5),save(3) ! 552: data aslash, ablnk / 1h/, 1h / ! 553: c ! 554: c setup current vector for input resistance and transfer function ! 555: c ! 556: call zero8(value(lvn+1),nstop) ! 557: if (kidin.eq.10) go to 5 ! 558: c... voltage source input ! 559: iptri=nodplc(kinel+6) ! 560: value(lvn+iptri)=+1.0d0 ! 561: go to 10 ! 562: c... current source input ! 563: 5 noposi=nodplc(kinel+2) ! 564: nonegi=nodplc(kinel+3) ! 565: value(lvn+noposi)=-1.0d0 ! 566: value(lvn+nonegi)=+1.0d0 ! 567: c ! 568: c lu decompose and solve the system of circuit equations ! 569: c ! 570: c... reorder the right-hand side ! 571: 10 do 15 i=2,nstop ! 572: j=nodplc(iswap+i) ! 573: value(ndiag+i)=value(lvn+j) ! 574: 15 continue ! 575: call copy8(value(ndiag+1),value(lvn+1),nstop) ! 576: 20 call dcdcmp ! 577: call dcsol ! 578: value(lvn+1)=0.0d0 ! 579: c ! 580: c evaluate transfer function ! 581: c ! 582: if (nodplc(kovar+5).ne.0) go to 30 ! 583: c... voltage output ! 584: noposo=nodplc(kovar+2) ! 585: nonego=nodplc(kovar+3) ! 586: trfn=value(lvn+noposo)-value(lvn+nonego) ! 587: go to 40 ! 588: c... current output (through voltage source) ! 589: 30 iptro=nodplc(kovar+2) ! 590: iptro=nodplc(iptro+6) ! 591: trfn=value(lvn+iptro) ! 592: c ! 593: c evaluate input resistance ! 594: c ! 595: 40 if (kidin.eq.9) go to 50 ! 596: c... current source input ! 597: zin=value(lvn+nonegi)-value(lvn+noposi) ! 598: go to 70 ! 599: c... voltage source input ! 600: 50 creal=value(lvn+iptri) ! 601: if (dabs(creal).ge.1.0d-20) go to 60 ! 602: zin=1.0d20 ! 603: go to 70 ! 604: 60 zin=-1.0d0/creal ! 605: c ! 606: c setup current vector for output resistance ! 607: c ! 608: 70 call zero8(value(lvn+1),nstop) ! 609: if (nodplc(kovar+5).ne.0) go to 80 ! 610: c... voltage output ! 611: value(lvn+noposo)=-1.0d0 ! 612: value(lvn+nonego)=+1.0d0 ! 613: go to 90 ! 614: 80 if (nodplc(kovar+2).ne.kinel) go to 85 ! 615: zout=zin ! 616: go to 200 ! 617: c... current output (through voltage source) ! 618: 85 value(lvn+iptro)=+1.0d0 ! 619: c ! 620: c perform new forward and backward substitution ! 621: c ! 622: c... reorder the right-hand side ! 623: 90 do 95 i=2,nstop ! 624: j=nodplc(iswap+i) ! 625: value(ndiag+i)=value(lvn+j) ! 626: 95 continue ! 627: call copy8(value(ndiag+1),value(lvn+1),nstop) ! 628: call dcsol ! 629: value(lvn+1)=0.0d0 ! 630: c ! 631: c evaluate output resistance ! 632: c ! 633: 100 if (nodplc(kovar+5).ne.0) go to 110 ! 634: c... voltage output ! 635: zout=value(lvn+nonego)-value(lvn+noposo) ! 636: go to 200 ! 637: c... current output (through voltage source) ! 638: 110 creal=value(lvn+iptro) ! 639: if (dabs(creal).ge.1.0d-20) go to 120 ! 640: zout=1.0d20 ! 641: go to 200 ! 642: 120 zout=-1.0d0/creal ! 643: c ! 644: c print results ! 645: c ! 646: 200 do 210 i=1,5 ! 647: string(i)=ablnk ! 648: 210 continue ! 649: ipos=1 ! 650: call outnam(kovar,1,string,ipos) ! 651: call copy8(string,save,3) ! 652: call move(string,ipos,aslash,1,1) ! 653: ipos=ipos+1 ! 654: locv=nodplc(kinel+1) ! 655: anam=value(locv) ! 656: call move(string,ipos,anam,1,8) ! 657: write (6,231) string,trfn,anam,zin,save,zout ! 658: 231 format(////,'0**** small-signal characteristics'//, ! 659: 1 1h0,5x,5a8,3h = ,1pd10.3,/, ! 660: 2 1h0,5x,'input resistance at ',a8,12x,3h = ,d10.3,/, ! 661: 3 1h0,5x,'output resistance at ',2a8,a3,3h = ,d10.3) ! 662: return ! 663: end ! 664: subroutine sencal ! 665: implicit double precision (a-h,o-z) ! 666: c ! 667: c this routine computes the dc sensitivities of circuit elements ! 668: c with respect to user specified outputs. ! 669: c ! 670: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 671: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 672: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 673: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 674: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 675: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 676: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 677: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 678: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, ! 679: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno, ! 680: 2 itemno,nosolv,ipostp,iscrch ! 681: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad, ! 682: 1 defas,rstats(50),iwidth,lwidth,nopage ! 683: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts, ! 684: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof ! 685: common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop, ! 686: 1 kinel,kidin,kovar,kidout ! 687: common /blank/ value(1000) ! 688: integer nodplc(64) ! 689: complex*16 cvalue(32) ! 690: equivalence (value(1),nodplc(1),cvalue(1)) ! 691: c ! 692: c ! 693: dimension string(5),sentit(4) ! 694: data alsrs,alsis,alsn,alsrb,alsrc,alsre / 2hrs,2his,1hn,2hrb,2hrc, ! 695: 1 2hre / ! 696: data alsbf,alsc2,alsbr,alsc4,alsne,alsnc,alsik,alsikr,alsva,alsvb ! 697: 1 / 2hbf,3hjle,2hbr,3hjlc,3hnle,3hnlc,3hjbf,3hjbr,3hvbf,3hvbr/ ! 698: data alsjs /2hjs/ ! 699: data sentit / 8hdc sensi, 8htivity a, 8hnalysis , 8h / ! 700: data ablnk / 1h / ! 701: c ! 702: c ! 703: if (kinel.ne.0) go to 8 ! 704: 4 call dcdcmp ! 705: c ! 706: c ! 707: 8 do 1000 n=1,nsens ! 708: c ! 709: c prepare adjoint excitation vector ! 710: c ! 711: call zero8(value(lvn+1),nstop) ! 712: locs=nodplc(isens+n) ! 713: ioutyp=nodplc(locs+5) ! 714: if (ioutyp.ne.0) go to 10 ! 715: c... voltage output ! 716: ivolts=1 ! 717: noposo=nodplc(locs+2) ! 718: nonego=nodplc(locs+3) ! 719: value(lvn+noposo)=-1.0d0 ! 720: value(lvn+nonego)=+1.0d0 ! 721: go to 20 ! 722: c... current output (through voltage source) ! 723: 10 iptro=nodplc(locs+2) ! 724: ivolts=0 ! 725: iptro=nodplc(iptro+6) ! 726: value(lvn+iptro)=-1.0d0 ! 727: c ! 728: c obtain adjoint solution by doing forward/backward substitution on ! 729: c the transpose of the y matrix ! 730: c ! 731: 20 call asol ! 732: value(lvn+1)=0.0d0 ! 733: c ! 734: c real solution in lvnim1; adjoint solution in lvn ... ! 735: c ! 736: call title(0,lwidth,1,sentit) ! 737: ipos=1 ! 738: call outnam(locs,1,string,ipos) ! 739: call move(string,ipos,ablnk,1,7) ! 740: jstop=(ipos+6)/8 ! 741: write (6,36) (string(j),j=1,jstop) ! 742: 36 format('0dc sensitivities of output ',5a8) ! 743: if(ivolts.ne.0) write (6,41) ! 744: if(ivolts.eq.0) write(6,42) ! 745: 41 format(1h0,8x,'element',9x,'element',7x,'element',7x,'normalized'/ ! 746: 1 10x,'name',12x,'value',6x,'sensitivity sensitivity'/35x, ! 747: 2 ' (volts/unit) (volts/percent)'/) ! 748: 42 format(1h0,8x,'element',9x,'element',7x,'element',7x,'normalized'/ ! 749: 1 10x,'name',12x,'value',6x,'sensitivity sensitivity'/35x, ! 750: 2 ' (amps/unit) (amps/percent)'/) ! 751: c ! 752: c resistors ! 753: c ! 754: loc=locate(1) ! 755: 100 if (loc.eq.0) go to 110 ! 756: locv=nodplc(loc+1) ! 757: node1=nodplc(loc+2) ! 758: node2=nodplc(loc+3) ! 759: val=1.0d0/value(locv+1) ! 760: sens=-(value(lvnim1+node1)-value(lvnim1+node2))* ! 761: 1 (value(lvn +node1)-value(lvn +node2))/(val*val) ! 762: sensn=val*sens/100.0d0 ! 763: write (6,101) value(locv),val,sens,sensn ! 764: 101 format(10x,a8,4x,1pd10.3,5x,d10.3,5x,d10.3) ! 765: 105 loc=nodplc(loc) ! 766: go to 100 ! 767: c ! 768: c voltage sources ! 769: c ! 770: 110 loc=locate(9) ! 771: 140 if (loc.eq.0) go to 150 ! 772: locv=nodplc(loc+1) ! 773: val=value(locv+1) ! 774: iptrv=nodplc(loc+6) ! 775: sens=-value(lvn+iptrv) ! 776: sensn=val*sens/100.0d0 ! 777: write (6,101) value(locv),val,sens,sensn ! 778: 145 loc=nodplc(loc) ! 779: go to 140 ! 780: c ! 781: c current sources ! 782: c ! 783: 150 loc=locate(10) ! 784: 160 if (loc.eq.0) go to 170 ! 785: locv=nodplc(loc+1) ! 786: node1=nodplc(loc+2) ! 787: node2=nodplc(loc+3) ! 788: val=value(locv+1) ! 789: sens=value(lvn+node1)-value(lvn+node2) ! 790: sensn=val*sens/100.0d0 ! 791: write (6,101) value(locv),val,sens,sensn ! 792: 165 loc=nodplc(loc) ! 793: go to 160 ! 794: c ! 795: c diodes ! 796: c ! 797: 170 loc=locate(11) ! 798: 180 if (loc.eq.0) go to 210 ! 799: locv=nodplc(loc+1) ! 800: write (6,181) value(locv) ! 801: 181 format(1x,a8) ! 802: node1=nodplc(loc+2) ! 803: node2=nodplc(loc+3) ! 804: node3=nodplc(loc+4) ! 805: locm=nodplc(loc+5) ! 806: locm=nodplc(locm+1) ! 807: area=value(locv+1) ! 808: c ! 809: c series resistance (rs) ! 810: c ! 811: val=value(locm+2)*area ! 812: if (val.ne.0.0d0) go to 190 ! 813: write (6,186) alsrs ! 814: 186 format(10x,a8,5x,2h0.,13x,2h0.,13x,2h0.) ! 815: go to 200 ! 816: 190 val=1.0d0/val ! 817: sens=-(value(lvnim1+node1)-value(lvnim1+node3))* ! 818: 1 (value(lvn +node1)-value(lvn +node3))/(val*val) ! 819: sensn=val*sens/100.0d0 ! 820: write (6,101) alsrs,val,sens,sensn ! 821: c ! 822: c intrinsic parameters ! 823: c ! 824: 200 csat=value(locm+1)*area ! 825: xn=value(locm+3) ! 826: vbe=value(lvnim1+node3)-value(lvnim1+node2) ! 827: vte=xn*vt ! 828: evbe=dexp(vbe/vte) ! 829: vabe=value(lvn+node3)-value(lvn+node2) ! 830: c ! 831: c saturation current (is) ! 832: c ! 833: sens=vabe*(evbe-1.0d0) ! 834: sensn=csat*sens/100.0d0 ! 835: write (6,101) alsis,csat,sens,sensn ! 836: c ! 837: c ideality factor (n) ! 838: c ! 839: sens=-vabe*(csat/xn)*(vbe/vte)*evbe ! 840: if (dabs(sens).lt.1.0d-50) sens=0.0d0 ! 841: sensn=xn*sens/100.0d0 ! 842: write (6,101) alsn,xn,sens,sensn ! 843: 205 loc=nodplc(loc) ! 844: go to 180 ! 845: c ! 846: c bipolar junction transistors ! 847: c ! 848: 210 loc=locate(12) ! 849: 220 if (loc.eq.0) go to 1000 ! 850: locv=nodplc(loc+1) ! 851: write (6,181) value(locv) ! 852: node1=nodplc(loc+2) ! 853: node2=nodplc(loc+3) ! 854: node3=nodplc(loc+4) ! 855: node4=nodplc(loc+5) ! 856: node5=nodplc(loc+6) ! 857: node6=nodplc(loc+7) ! 858: locm=nodplc(loc+8) ! 859: type=nodplc(locm+2) ! 860: locm=nodplc(locm+1) ! 861: loct=lx0+nodplc(loc+22) ! 862: area=value(locv+1) ! 863: c ! 864: c base resistance (rb) ! 865: c ! 866: val=value(loct+16) ! 867: if (val.ne.0.0d0) go to 230 ! 868: write (6,186) alsrb ! 869: go to 240 ! 870: 230 val=1.0d0/val ! 871: sens=-(value(lvnim1+node2)-value(lvnim1+node5))* ! 872: 1 (value(lvn +node2)-value(lvn +node5))/(val*val) ! 873: sensn=val*sens/100.0d0 ! 874: write (6,101) alsrb,val,sens,sensn ! 875: c ! 876: c collector resistance (rc) ! 877: c ! 878: 240 val=value(locm+20)*area ! 879: if (val.ne.0.0d0) go to 250 ! 880: write (6,186) alsrc ! 881: go to 260 ! 882: 250 val=1.0d0/val ! 883: sens=-(value(lvnim1+node1)-value(lvnim1+node4))* ! 884: 1 (value(lvn +node1)-value(lvn +node4))/(val*val) ! 885: sensn=val*sens/100.0d0 ! 886: write (6,101) alsrc,val,sens,sensn ! 887: c ! 888: c emitter resistance (re) ! 889: c ! 890: 260 val=value(locm+19)*area ! 891: if (val.ne.0.0d0) go to 270 ! 892: write (6,186) alsre ! 893: go to 280 ! 894: 270 val=1.0d0/val ! 895: sens=-(value(lvnim1+node3)-value(lvnim1+node6))* ! 896: 1 (value(lvn +node3)-value(lvn +node6))/(val*val) ! 897: sensn=val*sens/100.0d0 ! 898: write (6,101) alsre,val,sens,sensn ! 899: c ! 900: c intrinsic parameters ! 901: c ! 902: 280 bf=value(locm+2) ! 903: br=value(locm+8) ! 904: csat=value(locm+1)*area ! 905: ova=value(locm+4) ! 906: ovb=value(locm+19) ! 907: oik=value(locm+5)/area ! 908: c2=value(locm+6)*area ! 909: xne=value(locm+7) ! 910: vte=xne*vt ! 911: oikr=value(locm+11)/area ! 912: c4=value(locm+12)*area ! 913: xnc=value(locm+13) ! 914: vtc=xnc*vt ! 915: vbe=type*(value(lvnim1+node5)-value(lvnim1+node6)) ! 916: vbc=type*(value(lvnim1+node5)-value(lvnim1+node4)) ! 917: vabe=type*(value(lvn+node5)-value(lvn+node6)) ! 918: vabc=type*(value(lvn+node5)-value(lvn+node4)) ! 919: vace=vabe-vabc ! 920: if (vbe.le.-vt) go to 320 ! 921: evbe=dexp(vbe/vt/value(locm+3)) ! 922: cbe=csat*(evbe-1.0d0) ! 923: gbe=csat*evbe/vt/value(locm+3) ! 924: if (c2.ne.0.0d0) go to 310 ! 925: cben=0.0d0 ! 926: gben=0.0d0 ! 927: go to 350 ! 928: 310 evben=dexp(vbe/vte) ! 929: cben=c2 *(evben-1.0d0) ! 930: gben=c2 *evben/vte ! 931: go to 350 ! 932: 320 gbe=-csat/vbe ! 933: cbe=gbe*vbe ! 934: gben=-c2/vbe ! 935: cben=gben*vbe ! 936: 350 if (vbc.le.-vt) go to 370 ! 937: evbc=dexp(vbc/vt/value(locm+9)) ! 938: cbc=csat*(evbc-1.0d0) ! 939: gbc=csat*evbc/vt/value(locm+9) ! 940: if (c4.ne.0.0d0) go to 360 ! 941: cbcn=0.0d0 ! 942: gbcn=0.0d0 ! 943: go to 400 ! 944: 360 evbcn=dexp(vbc/vtc) ! 945: cbcn=c4 *(evbcn-1.0d0) ! 946: gbcn=c4 *evbcn/vtc ! 947: go to 400 ! 948: 370 gbc=-csat/vbc ! 949: cbc=gbc*vbc ! 950: gbcn=-c4/vbc ! 951: cbcn=gbcn*vbc ! 952: 400 q1=1.0d0/(1.0d0-ova*vbc-ovb*vbe) ! 953: q2=oik*cbe+oikr*cbc ! 954: sqarg=dsqrt(1.0d0+4.0d0*q2) ! 955: qb=q1*(1.0d0+sqarg)/2.0d0 ! 956: dqb=(cbe-cbc)/(qb*qb) ! 957: sqarg=dsqrt(1.0d0+4.0d0*q2) ! 958: dq1=dqb*(1.0d0+sqarg)+(q1*q1)/2.0d0 ! 959: dq2=q1*dqb/sqarg ! 960: c ! 961: c compute sensitivities ! 962: c ! 963: c... bf ! 964: sens=-vabe*cbe/bf/bf ! 965: sensn=bf*sens/100.0d0 ! 966: write (6,101) alsbf,bf,sens,sensn ! 967: c... jle ! 968: if (c2.ne.0.0d0) go to 430 ! 969: write (6,186) alsc2 ! 970: go to 440 ! 971: 430 sens=vabe*cben/c2 ! 972: sensn=c2*sens/100.0d0 ! 973: write (6,101) alsc2,c2,sens,sensn ! 974: c... br ! 975: 440 sens=-vabc*cbc/br/br ! 976: sensn=br*sens/100.0d0 ! 977: write (6,101) alsbr,br,sens,sensn ! 978: c... jlc ! 979: if (c4.ne.0.0d0) go to 450 ! 980: write (6,186) alsc4 ! 981: go to 460 ! 982: 450 sens=vabc*cbcn/c4 ! 983: sensn=c4*sens/100.0d0 ! 984: write (6,101) alsc4,c4,sens,sensn ! 985: c... is ! 986: 460 sens=(vabe*(cbe/bf)+vabc*(cbc/br) ! 987: 1 +vace*(dqb*qb-dq2*q2))/csat ! 988: sensn=csat*sens/100.0d0 ! 989: write (6,101) alsjs,csat,sens,sensn ! 990: c... ne ! 991: sens=-vabe*gben*vbe/xne ! 992: sensn=xne*sens/100.0d0 ! 993: write (6,101) alsne,xne,sens,sensn ! 994: c... nc ! 995: sens=-vabc*gbcn*vbc/xnc ! 996: sensn=xnc*sens/100.0d0 ! 997: write (6,101) alsnc,xnc,sens,sensn ! 998: c... ik ! 999: if (oik.ne.0.0d0) go to 470 ! 1000: write (6,186) alsik ! 1001: go to 480 ! 1002: 470 val=1.0d0/oik ! 1003: sens=vace*dq2*cbe/(val*val) ! 1004: sensn=val*sens/100.0d0 ! 1005: write (6,101) alsik,val,sens,sensn ! 1006: c... ikr ! 1007: 480 if (oikr.ne.0.0d0) go to 490 ! 1008: write (6,186) alsikr ! 1009: go to 500 ! 1010: 490 val=1.0d0/oikr ! 1011: sens=vace*dq2*cbc/(val*val) ! 1012: sensn=val*sens/100.0d0 ! 1013: write (6,101) alsikr,val,sens,sensn ! 1014: c... va ! 1015: 500 if (ova.ne.0.0d0) go to 510 ! 1016: write (6,186) alsva ! 1017: go to 520 ! 1018: 510 va=1.0d0/ova ! 1019: sens=vace*dq1*vbc/(va*va) ! 1020: sensn=va*sens/100.0d0 ! 1021: write (6,101) alsva,va,sens,sensn ! 1022: c... vb ! 1023: 520 if (ovb.ne.0.0d0) go to 530 ! 1024: write (6,186) alsvb ! 1025: go to 540 ! 1026: 530 vb=1.0d0/ovb ! 1027: sens=vace*dq1*vbe/(vb*vb) ! 1028: sensn=vb*sens/100.0d0 ! 1029: write (6,101) alsvb,vb,sens,sensn ! 1030: c ! 1031: c ! 1032: 540 loc=nodplc(loc) ! 1033: go to 220 ! 1034: c ! 1035: c finished ! 1036: c ! 1037: 1000 continue ! 1038: return ! 1039: end ! 1040: subroutine asol ! 1041: implicit double precision (a-h,o-z) ! 1042: c ! 1043: c this routine evaluates the adjoint circuit response by doing a ! 1044: c forward/backward substitution on the transpose of the coefficient ! 1045: c matrix. ! 1046: c ! 1047: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, ! 1048: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, ! 1049: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, ! 1050: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, ! 1051: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, ! 1052: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval ! 1053: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, ! 1054: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs ! 1055: common /blank/ value(1000) ! 1056: integer nodplc(64) ! 1057: complex*16 cvalue(32) ! 1058: equivalence (value(1),nodplc(1),cvalue(1)) ! 1059: c ! 1060: c forward substitution ! 1061: c ! 1062: do 20 i=2,nstop ! 1063: io=nodplc(iorder+i) ! 1064: value(lvn+io)=value(lvn+io)/value(lynl+io) ! 1065: jstart=nodplc(iur+i) ! 1066: jstop=nodplc(iur+i+1)-1 ! 1067: if (jstart.gt.jstop) go to 20 ! 1068: if (value(lvn+io).eq.0.0d0) go to 20 ! 1069: do 10 j=jstart,jstop ! 1070: jo=nodplc(iuc+j) ! 1071: jo=nodplc(iorder+jo) ! 1072: value(lvn+jo)=value(lvn+jo)-value(lyu+j)*value(lvn+io) ! 1073: 10 continue ! 1074: 20 continue ! 1075: c ! 1076: c backward substitution ! 1077: c ! 1078: k=nstop+1 ! 1079: do 40 i=2,nstop ! 1080: k=k-1 ! 1081: io=nodplc(iorder+k) ! 1082: jstart=nodplc(ilc+k) ! 1083: jstop=nodplc(ilc+k+1)-1 ! 1084: if (jstart.gt.jstop) go to 40 ! 1085: do 30 j=jstart,jstop ! 1086: jo=nodplc(ilr+j) ! 1087: jo=nodplc(iorder+jo) ! 1088: value(lvn+io)=value(lvn+io)-value(lyl+j)*value(lvn+jo) ! 1089: 30 continue ! 1090: 40 continue ! 1091: c ! 1092: c reorder right-hand side ! 1093: c ! 1094: do 50 i=2,nstop ! 1095: j=nodplc(iswap+i) ! 1096: value(ndiag+i)=value(lvn+j) ! 1097: 50 continue ! 1098: call copy8(value(ndiag+1),value(lvn+1),nstop) ! 1099: c ! 1100: c finished ! 1101: c ! 1102: return ! 1103: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.