Annotation of 3BSD/cmd/spice/dcops.f, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.