implicit double precision (a-h,o-z)
c this routine prints out the operating points of the nonlinear
common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
2 itemno,nosolv,ipostp,iscrch
common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
1 defas,rstats(50),iwidth,lwidth,nopage
common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
1 kinel,kidin,kovar,kidout
common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
1 inoise,nosprt,nosout,nosin,idist,idprt
common /blank/ value(1000)
equivalence (value(1),nodplc(1),cvalue(1))
dimension anam(12),av1(12),ai1(12),req(12)
dimension amod(12),vd(12),cap(12)
dimension cb(12),cc(12),vbe(12),vbc(12),vce(12),rpi(12),
1 ro(12),cpi(12),cmu(12),betadc(12),betaac(12),ft(12),
dimension cg(12),vgs(12),vds(12),gds(12),vbs(12),cbd(12),cbs(12),
2 cgsov(12),cgdov(12),cgbov(12),vth(12),vdsat(12),cd(12),gm(12),
3 ccgg(12),ccgd(12),ccgs(12),ccbg(12),ccbd(12),ccbs(12),
dimension cgs(12),cgd(12),cgb(12),cds(12)
equivalence(cb(1),cg(1)),(cc(1),vgs(1)),(vbe(1),vds(1)),
1(vbc(1),gds(1)),(vce(1),vbs(1)),(rpi(1),cbd(1)),
2(ro(1),cbs(1)),(cpi(1),cgsov(1)),(cmu(1),cgdov(1)),
3(betadc(1),cgbov(1)),(betaac(1),vth(1)),(ft(1),vdsat(1)),
4(ccs(1),cd(1)),(cbx(1),ccgg(1)),(rx(1),ccgd(1))
equivalence(vd(1),cg(1)),(cap(1),vgs(1)),(av1(1),vds(1)),
1 (ai1(1),gds(1)),(req(1),vbs(1))
equivalence (cgs(1),ccgg(1)),(cgd(1),ccgd(1)),(cgb(1),ccgs(1)),
dimension afmt1(3),afmt2(2),afmt3(3),afmt4(3)
data optitl / 8hoperatin, 8hg point , 8hinformat, 8hion /
data av,avd,avbe,avbc,avce,avgs,avds,avbs / 1hv,2hvd,3hvbe,3hvbc,
1 3hvce,3hvgs,3hvds,3hvbs /
data acntrv,acntri,asrcv,asrci,atrang,atranr,avgain,aigain /
1 8hv-contrl, 8hi-contrl, 8hv-source, 8hi-source,
2 8htrans-g , 8htrans-r , 8hv gain , 8hi gain /
data ai,aid,aib,aic,aig / 1hi,2hid,2hib,2hic,2hig /
data areq,arpi,aro / 3hreq,3hrpi,2hro /
data acap,acpi,acmu,acgs,acgd,acbd,acbs / 3hcap,3hcpi,3hcmu,3hcgs,
data acgsov,acgdov,acgbov /6hcgsovl,6hcgdovl,6hcgbovl/
data accgg,accgd,accgs,accbg,accbd,accbs /7hdqgdvgb,7hdqgdvdb,
1 7hdqgdvsb,7hdqbdvgb,7hdqbdvdb,7hdqbdvsb/
data acgb,acds / 3hcgb,3hcds /
data avth, avdsat / 3hvth, 5hvdsat /
data agm,agds / 2hgm,3hgds /
data accs,acbx,arx /3hccs,3hcbx,2hrx/
data abetad,abetaa / 6hbetadc,6hbetaac /
data afmt1 /8h(//1h0,1,8h0x, (2x,8h,a8)) /
data afmt2 /8h(1h ,a8,,8h f10.3)/
data afmt3 /8h(1h ,a8,,8h1p d10.,8h2) /
data afmt4 /8h('0model,8h ', (,8h2x,a8)) /
c.. fix-up the format statements
call move(afmt1,ipos,ablnk,1,2)
call alfnum(kntr,afmt1,ipos)
call move(afmt2,ipos,ablnk,1,2)
call alfnum(kntr,afmt2,ipos)
call move(afmt3,ipos,ablnk,1,2)
call alfnum(kntr,afmt3,ipos)
call move(afmt4,ipos,ablnk,1,2)
call alfnum(kntr,afmt4,ipos)
c compute voltage source currents and power dissipation
if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 700
if (jelcnt(9).eq.0) go to 50
11 format (////5x,'voltage source currents'//5x,'name',
20 if (loc.eq.0) go to 50
power=power-creal*value(locv+1)
if (ititle.eq.0) write (6,11)
write (6,21) value(locv),creal
21 format (/5x,a8,1x,1pd10.3)
60 if (loc.eq.0) go to 90
power=power-value(locv+1)
1 *(value(lvnim1+node1)-value(lvnim1+node2))
91 format (//5x,'total power dissipation ',1pd9.2,' watts')
c small signal device parameters
numdev=jelcnt(5)+jelcnt(6)+jelcnt(7)+jelcnt(8)+jelcnt(11)
1 +jelcnt(12)+jelcnt(13)+jelcnt(14)
if (numdev.eq.0) go to 600
call title(0,lwidth,1,optitl)
c nonlinear voltage controlled current sources
if (jelcnt(5).eq.0) go to 175
111 format(1h0,/,'0**** voltage-controlled current sources')
120 if (loc.eq.0) go to 140
if (kntr.ge.kntlim) go to 150
140 if (kntr.eq.0) go to 175
150 if (ititle.eq.0) write (6,111)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt3) asrci,(ai1(i),i=1,kntr)
c nonlinear voltage controlled voltage sources
175 if (jelcnt(6).eq.0) go to 186
176 format(1h0,/,'0**** voltage-controlled voltage sources')
178 if (loc.eq.0) go to 182
if (kntr.ge.kntlim) go to 184
182 if (kntr.eq.0) go to 186
184 if (ititle.eq.0) write (6,176)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt2) asrcv,(av1(i),i=1,kntr)
write (6,afmt3) asrci,(ai1(i),i=1,kntr)
c nonlinear current controlled current sources
186 if (jelcnt(7).eq.0) go to 196
187 format(1h0,/,'0**** current-controlled current sources')
188 if (loc.eq.0) go to 192
if (kntr.ge.kntlim) go to 194
192 if (kntr.eq.0) go to 196
194 if (ititle.eq.0) write (6,187)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt3) asrci,(ai1(i),i=1,kntr)
c nonlinear current controlled voltage sources
196 if (jelcnt(8).eq.0) go to 210
197 format(1h0,/,'0**** current-controlled voltage sources')
198 if (loc.eq.0) go to 202
if (kntr.ge.kntlim) go to 204
202 if (kntr.eq.0) go to 210
204 if (ititle.eq.0) write (6,197)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt2) asrcv,(av1(i),i=1,kntr)
write (6,afmt3) asrci,(ai1(i),i=1,kntr)
210 if (jelcnt(11).eq.0) go to 300
211 format(1h0,/,'0**** diodes')
220 if (loc.eq.0) go to 240
vd(kntr)=value(lvnim1+node1)-value(lvnim1+node2)
if (modedc.ne.1) go to 225
req(kntr)=1.0d0/value(loct+2)
225 if (kntr.ge.kntlim) go to 250
240 if (kntr.eq.0) go to 300
250 if (ititle.eq.0) write (6,211)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt4) (amod(i),i=1,kntr)
write (6,afmt3) aid,(cd(i),i=1,kntr)
write (6,afmt2) avd,(vd(i),i=1,kntr)
if (modedc.ne.1) go to 260
write (6,afmt3) areq,(req(i),i=1,kntr)
write (6,afmt3) acap,(cap(i),i=1,kntr)
c bipolar junction transistors
300 if (jelcnt(12).eq.0) go to 400
301 format(1h0,/,'0**** bipolar junction transistors')
320 if (loc.eq.0) go to 340
cb(kntr)=type*value(loct+3)
cc(kntr)=type*value(loct+2)
vbe(kntr)=value(lvnim1+node2)-value(lvnim1+node3)
vbc(kntr)=value(lvnim1+node2)-value(lvnim1+node1)
vce(kntr)=vbe(kntr)-vbc(kntr)
betadc(kntr)=cc(kntr)/dsign(dmax1(dabs(cb(kntr)),1.0d-20),
if (modedc.ne.1) go to 325
if(value(loct+16).ne.0.0d0) rx(kntr)=1.0d0/value(loct+16)
rpi(kntr)=1.0d0/value(loct+4)
ro(kntr)=1.0d0/value(loct+7)
betaac(kntr)=gm(kntr)*rpi(kntr)
ft(kntr)=gm(kntr)/(twopi*dmax1(cpi(kntr)+cmu(kntr)+cbx(kntr),
325 if (kntr.ge.kntlim) go to 350
340 if (kntr.eq.0) go to 400
350 if (ititle.eq.0) write (6,301)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt4) (amod(i),i=1,kntr)
write (6,afmt3) aib,(cb(i),i=1,kntr)
write (6,afmt3) aic,(cc(i),i=1,kntr)
write (6,afmt2) avbe,(vbe(i),i=1,kntr)
write (6,afmt2) avbc,(vbc(i),i=1,kntr)
write (6,afmt2) avce,(vce(i),i=1,kntr)
write (6,afmt2) abetad,(betadc(i),i=1,kntr)
if (modedc.ne.1) go to 360
write (6,afmt3) agm,(gm(i),i=1,kntr)
write (6,afmt3) arpi,(rpi(i),i=1,kntr)
write(6,afmt3) arx,(rx(i),i=1,kntr)
write (6,afmt3) aro,(ro(i),i=1,kntr)
write (6,afmt3) acpi,(cpi(i),i=1,kntr)
write (6,afmt3) acmu,(cmu(i),i=1,kntr)
write(6,afmt3) acbx,(cbx(i),i=1,kntr)
write(6,afmt3) accs,(ccs(i),i=1,kntr)
write (6,afmt2) abetaa,(betaac(i),i=1,kntr)
write (6,afmt3) aft,(ft(i),i=1,kntr)
400 if (jelcnt(13).eq.0) go to 500
401 format(1h0,/,'0**** jfets')
420 if (loc.eq.0) go to 440
cd(kntr)=type*(value(loct+3)-value(loct+4))
vgs(kntr)=value(lvnim1+node2)-value(lvnim1+node3)
vds(kntr)=value(lvnim1+node1)-value(lvnim1+node3)
if (modedc.ne.1) go to 425
425 if (kntr.ge.kntlim) go to 450
440 if (kntr.eq.0) go to 500
450 if (ititle.eq.0) write (6,401)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt4) (amod(i),i=1,kntr)
write (6,afmt3) aid,(cd(i),i=1,kntr)
write (6,afmt2) avgs,(vgs(i),i=1,kntr)
write (6,afmt2) avds,(vds(i),i=1,kntr)
if (modedc.ne.1) go to 460
write (6,afmt3) agm,(gm(i),i=1,kntr)
write (6,afmt3) agds,(gds(i),i=1,kntr)
write (6,afmt3) acgs,(cgs(i),i=1,kntr)
write (6,afmt3) acgd,(cgd(i),i=1,kntr)
500 if (jelcnt(14).eq.0) go to 600
501 format(1h0,/,'0**** mosfets')
520 if (loc.eq.0) go to 540
if(type.eq.0.0d0) go to 522
cd(kntr)=type*value(loct+4)
vgs(kntr)=value(lvnim1+node2)-value(lvnim1+node3)
vds(kntr)=value(lvnim1+node1)-value(lvnim1+node3)
vbs(kntr)=value(lvnim1+node4)-value(lvnim1+node3)
if (modedc.ne.1) go to 525
xl=value(locv+1)-2.0d0*value(locm+20)
xw=value(locv+2)-2.0d0*value(locm+36)
vdsat(kntr)=value(locv+10)
vth(kntr)=value(locv+9)+type*(value(lvnim1+node4)-
gmb(kntr)=-(value(loct)+value(loct+1)+value(loct+2))
if(devmod.gt.0.0d0) go to 521
vth(kntr)=value(locv+9)+type*(value(lvnim1+node4)-
521 cbd(kntr)=value(loct+14)
ccgs(kntr)=value(loct+10)
ccbg(kntr)=value(loct+11)
ccbd(kntr)=value(loct+12)
ccbs(kntr)=value(loct+13)
c... special case for ga-as
522 cd(kntr)=value(loct+4)
vgs(kntr)=value(lvnim1+node2)-value(lvnim1+node3)
vds(kntr)=value(lvnim1+node1)-value(lvnim1+node3)
vbs(kntr)=value(lvnim1+node4)-value(lvnim1+node3)
if(modedc.ne.1) go to 525
gds(kntr)=(value(loct+8)*value(loct+11))
1 /(value(loct+8)+value(loct+11))
if(modeop.le.0) gm(kntr)=value(loct+13)
525 if (kntr.ge.kntlim) go to 550
540 if (kntr.eq.0) go to 600
550 if (ititle.eq.0) write (6,501)
write (6,afmt1) (anam(i),i=1,kntr)
write (6,afmt4) (amod(i),i=1,kntr)
if(type.eq.0.0d0) go to 555
write (6,afmt3) aid,(cd(i),i=1,kntr)
write (6,afmt2) avgs,(vgs(i),i=1,kntr)
write (6,afmt2) avds,(vds(i),i=1,kntr)
write (6,afmt2) avbs,(vbs(i),i=1,kntr)
if (modedc.ne.1) go to 560
write (6,afmt2) avth,(vth(i),i=1,kntr)
write (6,afmt2) avdsat,(vdsat(i),i=1,kntr)
write (6,afmt3) agm,(gm(i),i=1,kntr)
write (6,afmt3) agds,(gds(i),i=1,kntr)
write (6,afmt3) agmb,(gmb(i),i=1,kntr)
write (6,afmt3) acbd,(cbd(i),i=1,kntr)
write (6,afmt3) acbs,(cbs(i),i=1,kntr)
write (6,afmt3) acgsov,(cgsov(i),i=1,kntr)
write (6,afmt3) acgdov,(cgdov(i),i=1,kntr)
write (6,afmt3) acgbov,(cgbov(i),i=1,kntr)
551 format(' derivatives of gate (dqgdvx) and bulk (dqbdvx) charges')
write (6,afmt3) accgg,(ccgg(i),i=1,kntr)
write (6,afmt3) accgd,(ccgd(i),i=1,kntr)
write (6,afmt3) accgs,(ccgs(i),i=1,kntr)
write (6,afmt3) accbg,(ccbg(i),i=1,kntr)
write (6,afmt3) accbd,(ccbd(i),i=1,kntr)
write (6,afmt3) accbs,(ccbs(i),i=1,kntr)
555 write(6,afmt3) aid,(cd(i),i=1,kntr)
write(6,afmt3) aig,(cg(i),i=1,kntr)
write (6,afmt2) avgs,(vgs(i),i=1,kntr)
write (6,afmt2) avds,(vds(i),i=1,kntr)
write (6,afmt2) avbs,(vbs(i),i=1,kntr)
if (modedc.ne.1) go to 560
write (6,afmt3) agm,(gm(i),i=1,kntr)
write (6,afmt3) agds,(gds(i),i=1,kntr)
write (6,afmt3) acgs,(cgs(i),i=1,kntr)
write (6,afmt3) acgd,(cgd(i),i=1,kntr)
write (6,afmt3) acgb,(cgb(i),i=1,kntr)
write (6,afmt3) acds,(cds(i),i=1,kntr)
600 if (modedc.ne.1) go to 700
if (kinel.eq.0) go to 610
610 if (nsens.eq.0) go to 700
700 if (modedc.eq.2) go to 710
if (jacflg.ne.0) go to 705
rstats(5)=rstats(5)+t2-t1
implicit double precision (a-h,o-z)
c this routine computes the value of the small-signal transfer
c function specified by the user.
common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
1 kinel,kidin,kovar,kidout
common /blank/ value(1000)
equivalence (value(1),nodplc(1),cvalue(1))
dimension string(5),save(3)
data aslash, ablnk / 1h/, 1h /
c setup current vector for input resistance and transfer function
call zero8(value(lvn+1),nstop)
c... voltage source input
c... current source input
c lu decompose and solve the system of circuit equations
c... reorder the right-hand side
value(ndiag+i)=value(lvn+j)
call copy8(value(ndiag+1),value(lvn+1),nstop)
c evaluate transfer function
if (nodplc(kovar+5).ne.0) go to 30
trfn=value(lvn+noposo)-value(lvn+nonego)
c... current output (through voltage source)
c evaluate input resistance
40 if (kidin.eq.9) go to 50
c... current source input
zin=value(lvn+nonegi)-value(lvn+noposi)
c... voltage source input
50 creal=value(lvn+iptri)
if (dabs(creal).ge.1.0d-20) go to 60
c setup current vector for output resistance
70 call zero8(value(lvn+1),nstop)
if (nodplc(kovar+5).ne.0) go to 80
80 if (nodplc(kovar+2).ne.kinel) go to 85
c... current output (through voltage source)
85 value(lvn+iptro)=+1.0d0
c perform new forward and backward substitution
c... reorder the right-hand side
value(ndiag+i)=value(lvn+j)
call copy8(value(ndiag+1),value(lvn+1),nstop)
c evaluate output resistance
100 if (nodplc(kovar+5).ne.0) go to 110
zout=value(lvn+nonego)-value(lvn+noposo)
c... current output (through voltage source)
110 creal=value(lvn+iptro)
if (dabs(creal).ge.1.0d-20) go to 120
call outnam(kovar,1,string,ipos)
call copy8(string,save,3)
call move(string,ipos,aslash,1,1)
call move(string,ipos,anam,1,8)
write (6,231) string,trfn,anam,zin,save,zout
231 format(////,'0**** small-signal characteristics'//,
1 1h0,5x,5a8,3h = ,1pd10.3,/,
2 1h0,5x,'input resistance at ',a8,12x,3h = ,d10.3,/,
3 1h0,5x,'output resistance at ',2a8,a3,3h = ,d10.3)
implicit double precision (a-h,o-z)
c this routine computes the dc sensitivities of circuit elements
c with respect to user specified outputs.
common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
2 itemno,nosolv,ipostp,iscrch
common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
1 defas,rstats(50),iwidth,lwidth,nopage
common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
1 kinel,kidin,kovar,kidout
common /blank/ value(1000)
equivalence (value(1),nodplc(1),cvalue(1))
dimension string(5),sentit(4)
data alsrs,alsis,alsn,alsrb,alsrc,alsre / 2hrs,2his,1hn,2hrb,2hrc,
data alsbf,alsc2,alsbr,alsc4,alsne,alsnc,alsik,alsikr,alsva,alsvb
1 / 2hbf,3hjle,2hbr,3hjlc,3hnle,3hnlc,3hjbf,3hjbr,3hvbf,3hvbr/
data sentit / 8hdc sensi, 8htivity a, 8hnalysis , 8h /
c prepare adjoint excitation vector
call zero8(value(lvn+1),nstop)
if (ioutyp.ne.0) go to 10
c... current output (through voltage source)
c obtain adjoint solution by doing forward/backward substitution on
c the transpose of the y matrix
c real solution in lvnim1; adjoint solution in lvn ...
call title(0,lwidth,1,sentit)
call outnam(locs,1,string,ipos)
call move(string,ipos,ablnk,1,7)
write (6,36) (string(j),j=1,jstop)
36 format('0dc sensitivities of output ',5a8)
if(ivolts.ne.0) write (6,41)
if(ivolts.eq.0) write(6,42)
41 format(1h0,8x,'element',9x,'element',7x,'element',7x,'normalized'/
1 10x,'name',12x,'value',6x,'sensitivity sensitivity'/35x,
2 ' (volts/unit) (volts/percent)'/)
42 format(1h0,8x,'element',9x,'element',7x,'element',7x,'normalized'/
1 10x,'name',12x,'value',6x,'sensitivity sensitivity'/35x,
2 ' (amps/unit) (amps/percent)'/)
100 if (loc.eq.0) go to 110
sens=-(value(lvnim1+node1)-value(lvnim1+node2))*
1 (value(lvn +node1)-value(lvn +node2))/(val*val)
write (6,101) value(locv),val,sens,sensn
101 format(10x,a8,4x,1pd10.3,5x,d10.3,5x,d10.3)
140 if (loc.eq.0) go to 150
write (6,101) value(locv),val,sens,sensn
160 if (loc.eq.0) go to 170
sens=value(lvn+node1)-value(lvn+node2)
write (6,101) value(locv),val,sens,sensn
180 if (loc.eq.0) go to 210
write (6,181) value(locv)
if (val.ne.0.0d0) go to 190
186 format(10x,a8,5x,2h0.,13x,2h0.,13x,2h0.)
sens=-(value(lvnim1+node1)-value(lvnim1+node3))*
1 (value(lvn +node1)-value(lvn +node3))/(val*val)
write (6,101) alsrs,val,sens,sensn
200 csat=value(locm+1)*area
vbe=value(lvnim1+node3)-value(lvnim1+node2)
vabe=value(lvn+node3)-value(lvn+node2)
c saturation current (is)
write (6,101) alsis,csat,sens,sensn
sens=-vabe*(csat/xn)*(vbe/vte)*evbe
if (dabs(sens).lt.1.0d-50) sens=0.0d0
write (6,101) alsn,xn,sens,sensn
c bipolar junction transistors
220 if (loc.eq.0) go to 1000
write (6,181) value(locv)
if (val.ne.0.0d0) go to 230
sens=-(value(lvnim1+node2)-value(lvnim1+node5))*
1 (value(lvn +node2)-value(lvn +node5))/(val*val)
write (6,101) alsrb,val,sens,sensn
c collector resistance (rc)
240 val=value(locm+20)*area
if (val.ne.0.0d0) go to 250
sens=-(value(lvnim1+node1)-value(lvnim1+node4))*
1 (value(lvn +node1)-value(lvn +node4))/(val*val)
write (6,101) alsrc,val,sens,sensn
c emitter resistance (re)
260 val=value(locm+19)*area
if (val.ne.0.0d0) go to 270
sens=-(value(lvnim1+node3)-value(lvnim1+node6))*
1 (value(lvn +node3)-value(lvn +node6))/(val*val)
write (6,101) alsre,val,sens,sensn
vbe=type*(value(lvnim1+node5)-value(lvnim1+node6))
vbc=type*(value(lvnim1+node5)-value(lvnim1+node4))
vabe=type*(value(lvn+node5)-value(lvn+node6))
vabc=type*(value(lvn+node5)-value(lvn+node4))
if (vbe.le.-vt) go to 320
evbe=dexp(vbe/vt/value(locm+3))
gbe=csat*evbe/vt/value(locm+3)
if (c2.ne.0.0d0) go to 310
350 if (vbc.le.-vt) go to 370
evbc=dexp(vbc/vt/value(locm+9))
gbc=csat*evbc/vt/value(locm+9)
if (c4.ne.0.0d0) go to 360
400 q1=1.0d0/(1.0d0-ova*vbc-ovb*vbe)
sqarg=dsqrt(1.0d0+4.0d0*q2)
qb=q1*(1.0d0+sqarg)/2.0d0
sqarg=dsqrt(1.0d0+4.0d0*q2)
dq1=dqb*(1.0d0+sqarg)+(q1*q1)/2.0d0
write (6,101) alsbf,bf,sens,sensn
if (c2.ne.0.0d0) go to 430
write (6,101) alsc2,c2,sens,sensn
write (6,101) alsbr,br,sens,sensn
if (c4.ne.0.0d0) go to 450
write (6,101) alsc4,c4,sens,sensn
460 sens=(vabe*(cbe/bf)+vabc*(cbc/br)
1 +vace*(dqb*qb-dq2*q2))/csat
write (6,101) alsjs,csat,sens,sensn
write (6,101) alsne,xne,sens,sensn
write (6,101) alsnc,xnc,sens,sensn
if (oik.ne.0.0d0) go to 470
sens=vace*dq2*cbe/(val*val)
write (6,101) alsik,val,sens,sensn
480 if (oikr.ne.0.0d0) go to 490
sens=vace*dq2*cbc/(val*val)
write (6,101) alsikr,val,sens,sensn
500 if (ova.ne.0.0d0) go to 510
sens=vace*dq1*vbc/(va*va)
write (6,101) alsva,va,sens,sensn
520 if (ovb.ne.0.0d0) go to 530
sens=vace*dq1*vbe/(vb*vb)
write (6,101) alsvb,vb,sens,sensn
implicit double precision (a-h,o-z)
c this routine evaluates the adjoint circuit response by doing a
c forward/backward substitution on the transpose of the coefficient
common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
common /blank/ value(1000)
equivalence (value(1),nodplc(1),cvalue(1))
value(lvn+io)=value(lvn+io)/value(lynl+io)
if (jstart.gt.jstop) go to 20
if (value(lvn+io).eq.0.0d0) go to 20
value(lvn+jo)=value(lvn+jo)-value(lyu+j)*value(lvn+io)
if (jstart.gt.jstop) go to 40
value(lvn+io)=value(lvn+io)-value(lyl+j)*value(lvn+jo)
c reorder right-hand side
value(ndiag+i)=value(lvn+j)
call copy8(value(ndiag+1),value(lvn+1),nstop)