Annotation of 3BSD/cmd/spice/dctrans.f, revision 1.1

1.1     ! root        1:       subroutine dctran
        !             2:       implicit double precision (a-h,o-z)
        !             3: c
        !             4: c
        !             5: c     this routine controls the dc transfer curve, dc operating point,
        !             6: c and transient analyses.  the variables mode and modedc (defined below)
        !             7: c determine exactly which analysis is performed.
        !             8: c
        !             9:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !            10:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !            11:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !            12:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !            13:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !            14:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !            15:       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
        !            16:      1  defas,rstats(50),iwidth,lwidth,nopage
        !            17:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !            18:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !            19:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !            20:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !            21:      2   itemno,nosolv,ipostp,iscrch
        !            22:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !            23:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !            24:       common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
        !            25:      1   kinel,kidin,kovar,kidout
        !            26:       common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
        !            27:       common /cje/ maxtim,itime,icost
        !            28:       common /blank/ value(1000)
        !            29:       integer nodplc(64)
        !            30:       complex*16 cvalue(32)
        !            31:       equivalence (value(1),nodplc(1),cvalue(1))
        !            32: c
        !            33: c
        !            34:       dimension subtit(4,2)
        !            35:       dimension avhdr(3),avfrm(4)
        !            36:        data aendor /9.87654321d+27/
        !            37:       data avhdr / 8h( (2x,a4, 8h,3x,a7,3, 5hx)//) /
        !            38:       data avfrm / 8h( (1h ,a, 8h1,i3,1h), 8h,f10.4,3, 4hx)/) /
        !            39:       data anode, avltg / 4hnode, 7hvoltage /
        !            40:       data subtit / 8hsmall si, 8hgnal bia, 8hs soluti, 8hon      ,
        !            41:      1              8hinitial , 8htransien, 8ht soluti, 8hon      /
        !            42:       data lprn /1h(/
        !            43: c
        !            44: c      the variables *mode*, *modedc*, and *initf* are used by spice to
        !            45: c keep track of the state of the analysis.  the values of these flags
        !            46: c (and the corresponding meanings) are as follows:
        !            47: c
        !            48: c        flag    value    meaning
        !            49: c        ----    -----    -------
        !            50: c
        !            51: c        mode      1      dc analysis (subtype defined by *modedc*)
        !            52: c                  2      transient analysis
        !            53: c                  3      ac analysis (small signal)
        !            54: c
        !            55: c        modedc    1      dc operating point
        !            56: c                  2      initial operating point for transient analysis
        !            57: c                  3      dc transfer curve computation
        !            58: c
        !            59: c        initf     1      converge with 'off' devices allowed to float
        !            60: c                  2      initialize junction voltages
        !            61: c                  3      converge with 'off' devices held 'off'
        !            62: c                  4      store small-signal parameters away
        !            63: c                  5      first timepoint in transient analysis
        !            64: c                  6      prediction step
        !            65: c
        !            66: c note:  *modedc* is only significant if *mode* = 1.
        !            67: c
        !            68: c
        !            69: c  initialize
        !            70: c
        !            71:       call second(t1)
        !            72: c.. don't take any chances with lx3, set to large number
        !            73:       lx3=20000000
        !            74:       lx2=20000000
        !            75:       nolx2=0
        !            76:       nolx3=0
        !            77:       loctim=5
        !            78: c.. post-processing initialization
        !            79:       if(ipostp.eq.0) go to 1
        !            80:       numcur=jelcnt(9)
        !            81:       numpos=nunods+numcur
        !            82:       call getm8(ibuff,numpos)
        !            83:       numpos=numpos*4
        !            84:       if(numcur.eq.0) go to 1
        !            85:       loc=locate(9)
        !            86:       loccur=nodplc(loc+6)-1
        !            87: c...  set up format
        !            88:     1 nvprln=4+(lwidth-72)/19
        !            89:       nvprln=min0(nvprln,ncnods-1)
        !            90:       ipos=2
        !            91:       call alfnum(nvprln,avfrm,ipos)
        !            92:       ipos=2
        !            93:       call alfnum(nvprln,avhdr,ipos)
        !            94: c...  allocate storage
        !            95:       if (mode.eq.2) go to 5
        !            96:       need=4*nstop+nut+nlt+nxtrm
        !            97:       call avlm8(navl)
        !            98:       if(need.le.navl) go to 4
        !            99: c...  not enough memory for dc operating point analysis
        !           100:       write(6,3) need,navl
        !           101:     3 format('0insufficient memory available for dc analysis.',/
        !           102:      1' memory required ',i6,', memory available ',i6,'.')
        !           103:       nogo=1
        !           104:       go to 1100
        !           105:     4 call getm8(lvnim1,nstop)
        !           106:       call getm8(ndiag,nstop)
        !           107:       call getm8(lvn,nstop+nstop+nut+nlt)
        !           108:       call getm8(lx0,nxtrm)
        !           109:       if (modedc.ne.3) go to 15
        !           110:     5 call getm8(lx1,nxtrm)
        !           111:       if(nolx2.eq.0) call getm8(lx2,nxtrm)
        !           112:       if (mode.ne.2) go to 12
        !           113:       if(nolx3.eq.0) call getm8(lx3,nxtrm)
        !           114:       call getm8(ltd,0)
        !           115:    12 call getm8(loutpt,0)
        !           116:    15 call crunch
        !           117:       lynl=lvn+nstop
        !           118:       lyu=lynl+nstop
        !           119:       lyl=lyu+nut
        !           120:    20 if (mode.eq.2) go to 500
        !           121:       time=0.0d0
        !           122:       ag(1)=0.0d0
        !           123:       call sorupd
        !           124:       if (modedc.eq.3) go to 300
        !           125: c
        !           126: c  ....  single point dc analysis
        !           127: c
        !           128: c
        !           129: c  compute dc operating point
        !           130: c
        !           131:   100 initf=2
        !           132:       call iter8(itl1)
        !           133:       rstats(6)=rstats(6)+iterno
        !           134:       if (igoof.ne.0) go to 150
        !           135:       if (modedc.ne.1) go to 120
        !           136:       initf=4
        !           137:       call diode
        !           138:       call bjt
        !           139:       call jfet
        !           140:       call mosfet
        !           141: c
        !           142: c  print operating point
        !           143: c
        !           144:   120 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 1000
        !           145:       call title(-1,lwidth,1,subtit(1,modedc))
        !           146:       write (6,avhdr) (anode,avltg,i=1,nvprln)
        !           147:       write (6,avfrm) (lprn,nodplc(junode+i),value(lvnim1+i),i=2,ncnods)
        !           148:       go to 1000
        !           149: c
        !           150: c  no convergence
        !           151: c
        !           152:   150 nogo=1
        !           153:       write (6,151)
        !           154:   151 format('1*error*:  no convergence in dc analysis'/'0last node vol'
        !           155:      1   ,'tages:'/)
        !           156:       write (6,avhdr) (anode,avltg,i=1,nvprln)
        !           157:       write (6,avfrm) (lprn,nodplc(junode+i),value(lvnim1+i),i=2,ncnods)
        !           158:       go to 1000
        !           159: c
        !           160: c  ....  dc transfer curves
        !           161: c
        !           162:   300 numout=jelcnt(41)+1
        !           163:       if(ipostp.ne.0) call pheadr(atitle)
        !           164:       itemp=itcelm(1)
        !           165:       locs=nodplc(itemp+1)
        !           166:       temval=value(locs+1)
        !           167:       icvfl2=1
        !           168:       if(itcelm(2).eq.0) go to 310
        !           169:       itemp=itcelm(2)
        !           170:       locs2=nodplc(itemp+1)
        !           171:       temv2=value(locs2+1)
        !           172:       value(locs2+1)=tcstar(2)
        !           173:       temp=dabs((tcstop(2)-tcstar(2))/tcincr(2))+0.5d0
        !           174:       icvfl2=idint(temp)+1
        !           175:       icvfl2=max0(icvfl2,1)
        !           176:   310 delta=tcincr(1)
        !           177:       do 320 i=1,7
        !           178:       delold(i)=delta
        !           179:   320 continue
        !           180:       icvfl1=icvflg/icvfl2
        !           181:       value(locs+1)=tcstar(1)
        !           182:       icalc=0
        !           183:       ical2=0
        !           184:       loctim=3
        !           185:   340 initf=2
        !           186:       call iter8(itl1)
        !           187:       rstats(4)=rstats(4)+iterno
        !           188:       call copy8(value(lx0+1),value(lx1+1),nxtrm)
        !           189:       if(nolx2.eq.0) call copy8(value(lx0+1),value(lx2+1),nxtrm)
        !           190:       if (igoof.ne.0) go to 450
        !           191:       go to 360
        !           192:   350 call getcje
        !           193:       if ((maxtim-itime).le.limtim) go to 460
        !           194:       initf=6
        !           195:       call iter8(itl2)
        !           196:       rstats(4)=rstats(4)+iterno
        !           197:       if (igoof.ne.0) go to 340
        !           198: c
        !           199: c  store outputs
        !           200: c
        !           201:   360 call extmem(loutpt,numout)
        !           202:       loco=loutpt+icalc*numout
        !           203:       icalc=icalc+1
        !           204:       ical2=ical2+1
        !           205:       value(loco+1)=value(locs+1)
        !           206:       loc=locate(41)
        !           207:   370 if (loc.eq.0) go to 400
        !           208:       if (nodplc(loc+5).ne.0) go to 380
        !           209:       node1=nodplc(loc+2)
        !           210:       node2=nodplc(loc+3)
        !           211:       iseq=nodplc(loc+4)
        !           212:       value(loco+iseq)=value(lvnim1+node1)-value(lvnim1+node2)
        !           213:       loc=nodplc(loc)
        !           214:       go to 370
        !           215:   380 iptr=nodplc(loc+2)
        !           216:       iptr=nodplc(iptr+6)
        !           217:       iseq=nodplc(loc+4)
        !           218:       value(loco+iseq)=value(lvnim1+iptr)
        !           219:       loc=nodplc(loc)
        !           220:       go to 370
        !           221: c
        !           222: c  increment source value
        !           223: c
        !           224:   400 if(ipostp.eq.0) go to 410
        !           225:       value(ibuff+1)=value(locs+1)
        !           226:       call copy8(value(lvnim1+2),value(ibuff+2),nunods-1)
        !           227:       if(numcur.ne.0) call copy8(value(lvnim1+loccur+1),
        !           228:      1  value(ibuff+nunods+1),numcur)
        !           229:       call fwrite(value(ibuff+1),numpos)
        !           230:   410 if (icalc.ge.icvflg) go to 490
        !           231:       if(ical2.ge.icvfl1) go to 480
        !           232:       if(nolx2.ne.0) go to 420
        !           233:       call ptrmem(lx2,itemp)
        !           234:       call ptrmem(lx1,lx2)
        !           235:       go to 430
        !           236:   420 call ptrmem(lx1,itemp)
        !           237:   430 call ptrmem(lx0,lx1)
        !           238:       call ptrmem(itemp,lx0)
        !           239:       value(locs+1)=tcstar(1)+dfloat(ical2)*delta
        !           240:       go to 350
        !           241: c
        !           242: c  no convergence
        !           243: c
        !           244:   450 itemp=itcelm(1)
        !           245:       loce=nodplc(itemp+1)
        !           246:       write (6,451) value(loce),value(locs+1)
        !           247:   451 format('1*error*:  no convergence in dc transfer curves at ',a8,
        !           248:      1   ' = ',1pd10.3/'0last node voltages:'/)
        !           249:       write (6,avhdr) (anode,avltg,i=1,nvprln)
        !           250:       write (6,avfrm) (lprn,nodplc(junode+i),value(lvnim1+i),i=2,ncnods)
        !           251:       go to 470
        !           252:   460 write (6,461)
        !           253:   461 format('0*error*:  cpu time limit exceeded ... analysis stopped'/)
        !           254:   470 nogo=1
        !           255:       go to 490
        !           256: c... reset first sweep variable ... step second
        !           257:   480 ical2=0
        !           258:       value(locs+1)=tcstar(1)
        !           259:       value(locs2+1)=value(locs2+1)+tcincr(2)
        !           260:       go to 340
        !           261: c
        !           262: c  finished with dc transfer curves
        !           263: c
        !           264:   490 value(locs+1)=temval
        !           265:       if(itcelm(2).ne.0) value(locs2+1)=temv2
        !           266:       if(ipostp.eq.0) go to 1000
        !           267:       value(ibuff+1)=aendor
        !           268:       call fwrite(value(ibuff+1),numpos)
        !           269:       go to 1000
        !           270: c
        !           271: c  ....  transient analysis
        !           272: c
        !           273:   500 numout=jelcnt(42)+1
        !           274:       if(ipostp.ne.0) call pheadr(atitle)
        !           275:       numese=jelcnt(2)+jelcnt(3)+jelcnt(11)+jelcnt(12)+jelcnt(13)
        !           276:      1   +jelcnt(14)
        !           277:       if (numese.eq.0) delmax=dmin1(delmax,tstep)
        !           278:       initf=5
        !           279:       iord=1
        !           280:       loctim=9
        !           281:       icalc=0
        !           282:       numtp=0
        !           283:       numrtp=0
        !           284:       numnit=0
        !           285:       time=0.0d0
        !           286:       ibkflg=1
        !           287:       delbkp=delmax
        !           288:       nbkpt=1
        !           289:       delta=delmax
        !           290:       do 510 i=1,7
        !           291:       delold(i)=delta
        !           292:   510 continue
        !           293:       delmin=1.0d-9*delmax
        !           294:       go to 650
        !           295: c
        !           296: c  increment time, update sources, and solve next timepoint
        !           297: c
        !           298:   600 time=time+delta
        !           299:       call sorupd
        !           300:       if (nogo.ne.0) go to 950
        !           301:       call getcje
        !           302:       if ((maxtim-itime).le.limtim) go to 920
        !           303:       if ((itl5.ne.0).and.(numnit.ge.itl5)) go to 905
        !           304:       call comcof
        !           305:       if (initf.ne.5) initf=6
        !           306:       itrlim=itl4
        !           307:       if ((numtp.eq.0).and.(nosolv.ne.0)) itrlim=itl1
        !           308:       call iter8(itrlim)
        !           309:       if(itl5.ne.0) numnit=numnit+iterno
        !           310:       numtp=numtp+1
        !           311:       if (numtp.ne.1) go to 605
        !           312:       if(nolx2.eq.0) call copy8(value(lx1+1),value(lx2+1),nxtrm)
        !           313:       if(nolx3.eq.0) call copy8(value(lx1+1),value(lx3+1),nxtrm)
        !           314: c.. note that time-point is cut when itrlim exceeded regardless
        !           315: c.. of which time-step contol is specified thru 'lvltim'.
        !           316:   605 if (igoof.eq.0) go to 610
        !           317:       jord=iord
        !           318:       iord=1
        !           319:       if (jord.ge.5) call clrmem(lx7)
        !           320:       if (jord.ge.4) call clrmem(lx6)
        !           321:       if (jord.ge.3) call clrmem(lx5)
        !           322:       if ((jord.ge.2).and.(method.ne.1)) call clrmem(lx4)
        !           323:       igoof=0
        !           324:       time=time-delta
        !           325:       delta=delta/8.0d0
        !           326:       go to 620
        !           327:   610 delnew=delta
        !           328:       if (numtp.eq.1) go to 630
        !           329:       call trunc(delnew)
        !           330:       if (delnew.ge.(0.9d0*delta)) go to 630
        !           331:       time=time-delta
        !           332:       delta=delnew
        !           333:   620 numrtp=numrtp+1
        !           334:       ibkflg=0
        !           335:       delold(1)=delta
        !           336:       if (delta.ge.delmin) go to 600
        !           337:       time=time+delta
        !           338:       go to 900
        !           339: c.. time-point accepted
        !           340:   630 call copy8(delold(1),delold(2),6)
        !           341:       delta=delnew
        !           342:       delold(1)=delta
        !           343: c
        !           344: c  determine order of integration method
        !           345: c
        !           346: c...  skip if trapezoidal algorithm used
        !           347:       if ((method.eq.1).and.(iord.eq.2)) go to 650
        !           348:       if (numtp.eq.1) go to 650
        !           349:       ordrat=1.05d0
        !           350:       if (iord.gt.1) go to 635
        !           351:       iord=2
        !           352:       call trunc(delnew)
        !           353:       iord=1
        !           354:       if ((delnew/delta).le.ordrat) go to 650
        !           355:       if (maxord.le.1) go to 650
        !           356:       iord=2
        !           357:       if (method.eq.1) go to 650
        !           358:       call getm8(lx4,nxtrm)
        !           359:       go to 650
        !           360:   635 if (iord.lt.maxord) go to 640
        !           361:       iord=iord-1
        !           362:       call trunc(delnew)
        !           363:       iord=iord+1
        !           364:       if ((delnew/delta).le.ordrat) go to 650
        !           365:       go to 642
        !           366:   640 iord=iord-1
        !           367:       call trunc(delnew)
        !           368:       iord=iord+1
        !           369:       if ((delnew/delta).le.ordrat) go to 645
        !           370:   642 iord=iord-1
        !           371:       if (iord.eq.1) call clrmem(lx4)
        !           372:       if (iord.eq.2) call clrmem(lx5)
        !           373:       if (iord.eq.3) call clrmem(lx6)
        !           374:       if (iord.eq.4) call clrmem(lx7)
        !           375:       go to 650
        !           376:   645 iord=iord+1
        !           377:       call trunc(delnew)
        !           378:       iord=iord-1
        !           379:       if ((delnew/delta).le.ordrat) go to 650
        !           380:       iord=iord+1
        !           381:       if (iord.eq.2) call getm8(lx4,nxtrm)
        !           382:       if (iord.eq.3) call getm8(lx5,nxtrm)
        !           383:       if (iord.eq.4) call getm8(lx6,nxtrm)
        !           384:       if (iord.eq.5) call getm8(lx7,nxtrm)
        !           385: c
        !           386: c  store outputs
        !           387: c
        !           388:   650 if ((time+delta).le.tstart) go to 685
        !           389:       if ((numtp.eq.0).and.(nosolv.ne.0)) go to 685
        !           390:       call extmem(loutpt,numout)
        !           391:       loco=loutpt+icalc*numout
        !           392:       icalc=icalc+1
        !           393:       value(loco+1)=time
        !           394:       loc=locate(42)
        !           395:   670 if (loc.eq.0) go to 682
        !           396:       if (nodplc(loc+5).ne.0) go to 680
        !           397:       node1=nodplc(loc+2)
        !           398:       node2=nodplc(loc+3)
        !           399:       iseq=nodplc(loc+4)
        !           400:       value(loco+iseq)=value(lvnim1+node1)-value(lvnim1+node2)
        !           401:       loc=nodplc(loc)
        !           402:       go to 670
        !           403:   680 iptr=nodplc(loc+2)
        !           404:       iptr=nodplc(iptr+6)
        !           405:       iseq=nodplc(loc+4)
        !           406:       value(loco+iseq)=value(lvnim1+iptr)
        !           407:       loc=nodplc(loc)
        !           408:       go to 670
        !           409:   682 if(ipostp.eq.0) go to 684
        !           410:       value(ibuff+1)=time
        !           411:       call copy8(value(lvnim1+2),value(ibuff+2),nunods-1)
        !           412:       if(numcur.ne.0) call copy8(value(lvnim1+loccur+1),
        !           413:      1  value(ibuff+nunods+1),numcur)
        !           414:       call fwrite(value(ibuff+1),numpos)
        !           415:   684 continue
        !           416:   685 if (jelcnt(17).eq.0) go to 694
        !           417:       call sizmem(ltd,ltdsiz)
        !           418:       numtd=ltdsiz/ntlin
        !           419:       if (numtd.le.3) go to 689
        !           420:       baktim=time-tdmax
        !           421:       if (baktim.lt.0.0d0) go to 689
        !           422:       lcntr=0
        !           423:       ltemp=ltd
        !           424:       do 686 i=1,numtd
        !           425:       if (value(ltemp+1).ge.baktim) go to 687
        !           426:       ltemp=ltemp+ntlin
        !           427:       lcntr=lcntr+1
        !           428:   686 continue
        !           429:       go to 689
        !           430:   687 if (lcntr.le.2) go to 689
        !           431:       lcntr=lcntr-2
        !           432:       nwords=lcntr*ntlin
        !           433:       ltemp=ltemp-ntlin-ntlin
        !           434:       call copy8(value(ltemp+1),value(ltd+1),ltdsiz-nwords)
        !           435:       call relmem(ltd,nwords)
        !           436:       call sizmem(ltd,ltdsiz)
        !           437:   689 call extmem(ltd,ntlin)
        !           438:       ltdptr=ltd+ltdsiz
        !           439:       value(ltdptr+1)=time
        !           440:       loc=locate(17)
        !           441:   690 if (loc.eq.0) go to 693
        !           442:       locv=nodplc(loc+1)
        !           443:       z0=value(locv+1)
        !           444:       node1=nodplc(loc+2)
        !           445:       node2=nodplc(loc+3)
        !           446:       node3=nodplc(loc+4)
        !           447:       node4=nodplc(loc+5)
        !           448:       ibr1=nodplc(loc+8)
        !           449:       ibr2=nodplc(loc+9)
        !           450:       lspot=nodplc(loc+30)+ltdptr
        !           451:       if ((initf.eq.5).and.(nosolv.ne.0)) go to 691
        !           452:       value(lspot)=value(lvnim1+node3)-value(lvnim1+node4)
        !           453:      1   +value(lvnim1+ibr2)*z0
        !           454:       value(lspot+1)=value(lvnim1+node1)-value(lvnim1+node2)
        !           455:      1   +value(lvnim1+ibr1)*z0
        !           456:       go to 692
        !           457:   691 value(lspot)=value(locv+7)+value(locv+8)*z0
        !           458:       value(lspot+1)=value(locv+5)+value(locv+6)*z0
        !           459:   692 loc=nodplc(loc)
        !           460:       go to 690
        !           461: c
        !           462: c  add two *fake* backpoints to ltd for interpolation near time=0.0d0
        !           463: c
        !           464:   693 if (numtd.ne.0) go to 694
        !           465:       call extmem(ltd,ntlin+ntlin)
        !           466:       call copy8(value(ltd+1),value(ltd+ntlin+1),ntlin)
        !           467:       call copy8(value(ltd+1),value(ltd+2*ntlin+1),ntlin)
        !           468:       value(ltd+2*ntlin+1)=time
        !           469:       value(ltd+ntlin+1)=time-delta
        !           470:       value(ltd+1)=time-delta-delta
        !           471: c
        !           472: c  rotate state vector storage
        !           473: c
        !           474:   694 go to (710,706,702,698,696,696), iord
        !           475:   696 call ptrmem(lx7,itemp)
        !           476:       call ptrmem(lx6,lx7)
        !           477:       go to 700
        !           478:   698 call ptrmem(lx6,itemp)
        !           479:   700 call ptrmem(lx5,lx6)
        !           480:       go to 704
        !           481:   702 call ptrmem(lx5,itemp)
        !           482:   704 call ptrmem(lx4,lx5)
        !           483:       go to 708
        !           484:   706 if (method.eq.1) go to 710
        !           485:       call ptrmem(lx4,itemp)
        !           486:   708 call ptrmem(lx3,lx4)
        !           487:       go to 713
        !           488:   710 if(nolx3.eq.0) go to 712
        !           489:       if(nolx2.eq.0) go to 711
        !           490:       call ptrmem(lx1,itemp)
        !           491:       go to 714
        !           492:   711 call ptrmem(lx2,itemp)
        !           493:       call ptrmem(lx1,lx2)
        !           494:       go to 714
        !           495:   712 call ptrmem(lx3,itemp)
        !           496:   713 call ptrmem(lx2,lx3)
        !           497:       call ptrmem(lx1,lx2)
        !           498:   714 call ptrmem(lx0,lx1)
        !           499:       call ptrmem(itemp,lx0)
        !           500: c
        !           501: c  check breakpoints
        !           502: c
        !           503:   750 if (ibkflg.eq.0) go to 760
        !           504: c.. just accepted analysis at breakpoint
        !           505:       jord=iord
        !           506:       iord=1
        !           507:       if (jord.ge.5) call clrmem(lx7)
        !           508:       if (jord.ge.4) call clrmem(lx6)
        !           509:       if (jord.ge.3) call clrmem(lx5)
        !           510:       if ((jord.ge.2).and.(method.ne.1)) call clrmem(lx4)
        !           511:       ibkflg=0
        !           512:       nbkpt=nbkpt+1
        !           513:       if (nbkpt.gt.numbkp) go to 950
        !           514:       temp=dmin1(delbkp,value(lsbkpt+nbkpt)-time)
        !           515:       delta=dmin1(delta,0.1d0*temp,delmax)
        !           516:       if (numtp.eq.0) delta=delta/10.0d0
        !           517:       delold(1)=delta
        !           518:       go to 600
        !           519:   760 del1=value(lsbkpt+nbkpt)-time
        !           520:       if ((1.01d0*delta).le.del1) go to 600
        !           521:       ibkflg=1
        !           522:       delbkp=delta
        !           523:       delta=del1
        !           524:       delold(1)=delta
        !           525:       go to 600
        !           526: c
        !           527: c  transient analysis failed
        !           528: c
        !           529:   900 write (6,901)
        !           530:   901 format('1*error*:  internal timestep too small in transient analys
        !           531:      1is'/)
        !           532:       go to 910
        !           533:   905 write (6,906) itl5
        !           534:   906 format('1*error*:  transient analysis iterations exceed limit of '
        !           535:      1,i5,/'0this limit may be overridden using the itl5 parameter on th
        !           536:      2e .option card')
        !           537:   910 write (6,911) time,delta,numnit
        !           538:   911 format(1h0,10x,'time = ',1pd12.5,';  delta = ',d12.5,';  numnit =
        !           539:      1',i6/)
        !           540:       write (6,916)
        !           541:   916 format(1h0/'0last node voltages:'/)
        !           542:       write (6,avhdr) (anode,avltg,i=1,nvprln)
        !           543:       write (6,avfrm) (lprn,nodplc(junode+i),value(lvnim1+i),i=2,ncnods)
        !           544:       go to 930
        !           545:   920 write (6,921) time
        !           546:   921 format('0*error*:  cpu time limit exceeded in transient analysis '
        !           547:      1   ,'at time = ',1pd13.6/)
        !           548:   930 nogo=1
        !           549: c
        !           550: c  finished with transient analysis
        !           551: c
        !           552:   950 rstats(10)=rstats(10)+numnit
        !           553:       rstats(30)=rstats(30)+numtp
        !           554:       rstats(31)=rstats(31)+numrtp
        !           555:       rstats(32)=rstats(32)+numnit
        !           556:       if(ipostp.eq.0) go to 1000
        !           557:       value(ibuff+1)=aendor
        !           558:       call fwrite(value(ibuff+1),numpos)
        !           559: c
        !           560: c  return unneeded memory
        !           561: c
        !           562:  1000 if (mode.eq.2) go to 1010
        !           563:       if (modedc.ne.3) go to 1100
        !           564:  1010 call clrmem(lvnim1)
        !           565:       call clrmem(lx0)
        !           566:       call clrmem(ndiag)
        !           567:       call clrmem(lvn)
        !           568:       call clrmem(lx1)
        !           569:       if(nolx2.eq.0) call clrmem(lx2)
        !           570:       if ((mode.eq.1).and.(modedc.eq.3)) go to 1020
        !           571:       if(nolx3.eq.0) call clrmem(lx3)
        !           572:       if (mode.eq.1) go to 1020
        !           573:       call clrmem(ltd)
        !           574:       if (iord.eq.1) go to 1020
        !           575:       if (method.eq.1) go to 1020
        !           576:       call clrmem(lx4)
        !           577:       if (iord.eq.2) go to 1020
        !           578:       call clrmem(lx5)
        !           579:       if (iord.eq.3) go to 1020
        !           580:       call clrmem(lx6)
        !           581:       if (iord.eq.4) go to 1020
        !           582:       call clrmem(lx7)
        !           583:  1020 call extmem(loutpt,2*numout)
        !           584:  1100 if(ipostp.ne.0) call clrmem(ibuff)
        !           585:       call second(t2)
        !           586:       rstats(loctim)=rstats(loctim)+t2-t1
        !           587:       return
        !           588:       end
        !           589:       subroutine fwrite(iarray,numwds)
        !           590: c
        !           591: c   write onto 'punch' file numwds 16-bit words starting
        !           592: c   with location iarray(/1/)
        !           593: c
        !           594:       integer iarray(1)
        !           595: c
        !           596: c... data must be written out in 40 word (80 byte) chunks
        !           597: c
        !           598:       integer idata(20)
        !           599:       numwd4=(numwds+1)/2
        !           600:       numblk=(numwd4-1)/20+1
        !           601:       kntr=1
        !           602:       numlft=numwd4
        !           603:       do 10 i=1,numblk
        !           604:       kstop=min0(numlft,20)
        !           605:       call copy4(iarray(kntr),idata(1),kstop)
        !           606:       write(7) idata
        !           607:       kntr=kntr+20
        !           608:       numlft=numlft-20
        !           609:    10 continue
        !           610:       return
        !           611:       end
        !           612:       subroutine pheadr(aheadr)
        !           613:       implicit double precision (a-h,o-z)
        !           614:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !           615:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !           616:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !           617:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !           618:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !           619:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !           620:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !           621:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !           622:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !           623:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !           624:      2   itemno,nosolv,ipostp,iscrch
        !           625:       common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
        !           626:      1   kinel,kidin,kovar,kidout
        !           627:       common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
        !           628:      1  defas,rstats(50),iwidth,lwidth,nopage
        !           629:       common /blank/ value(1000)
        !           630:       integer nodplc(64)
        !           631:       complex*16 cvalue(32)
        !           632:       integer*2 int2,nodpl2(128)
        !           633:       equivalence (value(1),nodpl2(1))
        !           634:       equivalence (value(1),nodplc(1),cvalue(1))
        !           635:       dimension aheadr(10)
        !           636: c
        !           637: c  put out the header records onto the post-processing file
        !           638: c  routine is used for all analysis modes (mode=1,2,3)
        !           639: c
        !           640:       dimension xtype(2)
        !           641:       data xtype /4htime,4hfreq/
        !           642:       data ablnk,aletv,aleti /1h ,1hv,1hi/
        !           643:       call getm8(ibuff,12)
        !           644:       call copy8(aheadr(1),value(ibuff+1),10)
        !           645:       value(ibuff+11)=adate
        !           646:       value(ibuff+12)=atime
        !           647:       call fwrite(value(ibuff+1),48)
        !           648:       numout=nunods+jelcnt(9)
        !           649:       info=3
        !           650:       call getm8(inames,numout)
        !           651:       call getm4(itypes,numout)
        !           652:       call getm4(iseqs,numout)
        !           653:       itype2=itypes*2
        !           654:       iseq2=iseqs*2
        !           655:       iknt=1
        !           656:       nodpl2(iseq2+1)=1
        !           657:       if(mode.ne.1) go to 10
        !           658:       loc=itcelm(1)
        !           659:       locv=nodplc(loc+1)
        !           660:       value(inames+1)=value(locv)
        !           661:       anam=ablnk
        !           662:       call move(anam,1,value(locv),1,1)
        !           663:       ityp=0
        !           664:       if(anam.eq.aletv) ityp=3
        !           665:       if(anam.eq.aleti) ityp=4
        !           666:       nodpl2(itype2+1)=ityp
        !           667:       go to 20
        !           668:    10 value(inames+1)=xtype(mode-1)
        !           669:       nodpl2(itype2+1)=mode-1
        !           670:    20 do 30 i=2,nunods
        !           671:       nodpl2(itype2+i)=3
        !           672:       nodpl2(iseq2+i)=i
        !           673:       value(inames+i)=ablnk
        !           674:       ipos=1
        !           675:       call alfnum(nodplc(junode+i),value(inames+i),ipos)
        !           676:    30 continue
        !           677:       loc=locate(9)
        !           678:       iknt=nunods
        !           679:    40 if(loc.eq.0) go to 50
        !           680:       iknt=iknt+1
        !           681:       nodpl2(itype2+iknt)=4
        !           682:       nodpl2(iseq2+iknt)=iknt
        !           683:       locv=nodplc(loc+1)
        !           684:       value(inames+iknt)=value(locv)
        !           685:       loc=nodplc(loc)
        !           686:       go to 40
        !           687:    50 int2=numout
        !           688:       call fwrite(int2,1)
        !           689:       int2=info
        !           690:       call fwrite(int2,1)
        !           691:       nwds=numout*4
        !           692:       call fwrite(value(inames+1),nwds)
        !           693:       call fwrite(nodpl2(itype2+1),numout)
        !           694:       call fwrite(nodpl2(iseq2+1),numout)
        !           695:       call clrmem(ibuff)
        !           696:       call clrmem(inames)
        !           697:       call clrmem(itypes)
        !           698:       call clrmem(iseqs)
        !           699:       return
        !           700:       end
        !           701:       subroutine comcof
        !           702:       implicit double precision (a-h,o-z)
        !           703: c
        !           704: c     this routine calculates the timestep-dependent terms used in the
        !           705: c numerical integration.
        !           706: c
        !           707:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !           708:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !           709:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !           710:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !           711:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !           712:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !           713:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !           714:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !           715:      2   itemno,nosolv,ipostp,iscrch
        !           716:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !           717:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !           718:       common /blank/ value(1000)
        !           719:       integer nodplc(64)
        !           720:       complex*16 cvalue(32)
        !           721:       equivalence (value(1),nodplc(1),cvalue(1))
        !           722:       dimension gmat(7,7)
        !           723: c
        !           724: c  compute coefficients for particular integration method
        !           725: c
        !           726:       if (method.ne.1) go to 5
        !           727:       if (iord.eq.1) go to 5
        !           728: c...  trapezoidal method
        !           729:       ag(1)=1.0d0/delta/(1.0d0-xmu)
        !           730:       ag(2)=xmu/(1.0d0-xmu)
        !           731:       go to 200
        !           732: c
        !           733: c  construct gear coefficient matrix
        !           734: c
        !           735:     5 istop=iord+1
        !           736:       call zero8(ag,istop)
        !           737:       ag(2)=-1.0d0
        !           738:       do 10 i=1,istop
        !           739:       gmat(1,i)=1.0d0
        !           740:    10 continue
        !           741:       do 20 i=2,istop
        !           742:       gmat(i,1)=0.0d0
        !           743:    20 continue
        !           744:       arg=0.0d0
        !           745:       do 40 i=2,istop
        !           746:       arg=arg+delold(i-1)
        !           747:       arg1=1.0d0
        !           748:       do 30 j=2,istop
        !           749:       arg1=arg1*arg
        !           750:       gmat(j,i)=arg1
        !           751:    30 continue
        !           752:    40 continue
        !           753: c
        !           754: c  solve for gear coefficients ag(*)
        !           755: c
        !           756: c
        !           757: c  lu decomposition
        !           758: c
        !           759:       do 70 i=2,istop
        !           760:       jstart=i+1
        !           761:       if (jstart.gt.istop) go to 70
        !           762:       do 60 j=jstart,istop
        !           763:       gmat(j,i)=gmat(j,i)/gmat(i,i)
        !           764:       do 50 k=jstart,istop
        !           765:       gmat(j,k)=gmat(j,k)-gmat(j,i)*gmat(i,k)
        !           766:    50 continue
        !           767:    60 continue
        !           768:    70 continue
        !           769: c
        !           770: c  forward substitution
        !           771: c
        !           772:       do 90 i=2,istop
        !           773:       jstart=i+1
        !           774:       if (jstart.gt.istop) go to 90
        !           775:       do 80 j=jstart,istop
        !           776:       ag(j)=ag(j)-gmat(j,i)*ag(i)
        !           777:    80 continue
        !           778:    90 continue
        !           779: c
        !           780: c  backward substitution
        !           781: c
        !           782:       ag(istop)=ag(istop)/gmat(istop,istop)
        !           783:       ir=istop
        !           784:       do 110 i=2,istop
        !           785:       jstart=ir
        !           786:       ir=ir-1
        !           787:       do 100 j=jstart,istop
        !           788:       ag(ir)=ag(ir)-gmat(ir,j)*ag(j)
        !           789:   100 continue
        !           790:       ag(ir)=ag(ir)/gmat(ir,ir)
        !           791:   110 continue
        !           792: c
        !           793: c  finished
        !           794: c
        !           795:   200 return
        !           796:       end
        !           797:       subroutine trunc(delnew)
        !           798:       implicit double precision (a-h,o-z)
        !           799: c
        !           800: c     this routine determines the new transient stepsize by either
        !           801: c calling terr to estimate the local truncation error, or by checking
        !           802: c on the number of iterations needed to converge at the last timepoint.
        !           803: c
        !           804:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !           805:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !           806:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !           807:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !           808:      2   itemno,nosolv,ipostp,iscrch
        !           809:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !           810:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !           811:       common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
        !           812:       common /blank/ value(1000)
        !           813:       integer nodplc(64)
        !           814:       complex*16 cvalue(32)
        !           815:       equivalence (value(1),nodplc(1),cvalue(1))
        !           816: c
        !           817: c
        !           818:       if (lvltim.ne.0) go to 5
        !           819:       delnew=dmin1(tstep,delmax)
        !           820:       return
        !           821:     5 if (lvltim.ne.1) go to 10
        !           822:       delnew=delta
        !           823:       if (iterno.gt.itl3) return
        !           824:       delnew=dmin1(2.0d0*delta,tstep,delmax)
        !           825:       return
        !           826: c
        !           827: c  capacitors
        !           828: c
        !           829:    10 delnew=1.0d20
        !           830:       loc=locate(2)
        !           831:    20 if (loc.eq.0) go to 30
        !           832:       loct=nodplc(loc+8)
        !           833:       call terr(loct,delnew)
        !           834:       loc=nodplc(loc)
        !           835:       go to 20
        !           836: c
        !           837: c  inductors
        !           838: c
        !           839:    30 loc=locate(3)
        !           840:    40 if (loc.eq.0) go to 50
        !           841:       loct=nodplc(loc+11)
        !           842:       call terr(loct,delnew)
        !           843:       loc=nodplc(loc)
        !           844:       go to 40
        !           845: c
        !           846: c  diodes
        !           847: c
        !           848:    50 loc=locate(11)
        !           849:    60 if (loc.eq.0) go to 70
        !           850:       loct=nodplc(loc+11)
        !           851:       call terr(loct+3,delnew)
        !           852:       loc=nodplc(loc)
        !           853:       go to 60
        !           854: c
        !           855: c  bjts
        !           856: c
        !           857:    70 loc=locate(12)
        !           858:    80 if (loc.eq.0) go to 90
        !           859:       loct=nodplc(loc+22)
        !           860:       call terr(loct+8,delnew)
        !           861:       call terr(loct+10,delnew)
        !           862:       call terr(loct+12,delnew)
        !           863:       loc=nodplc(loc)
        !           864:       go to 80
        !           865: c
        !           866: c  jfets
        !           867: c
        !           868:    90 loc=locate(13)
        !           869:   100 if (loc.eq.0) go to 110
        !           870:       loct=nodplc(loc+19)
        !           871:       call terr(loct+9,delnew)
        !           872:       call terr(loct+11,delnew)
        !           873:       loc=nodplc(loc)
        !           874:       go to 100
        !           875: c
        !           876: c  mosfets
        !           877: c
        !           878:   110 loc=locate(14)
        !           879:   120 if (loc.eq.0) go to 200
        !           880:       loct=nodplc(loc+26)
        !           881:       call terr(loct+12,delnew)
        !           882:       call terr(loct+14,delnew)
        !           883:       call terr(loct+16,delnew)
        !           884:       call terr(loct+18,delnew)
        !           885:       call terr(loct+20,delnew)
        !           886:       loc=nodplc(loc)
        !           887:       go to 120
        !           888: c
        !           889: c  delta is allowed only to double at each timepoint
        !           890: c
        !           891:   200 delnew=dmin1(2.0d0*delta,delnew,delmax)
        !           892:       return
        !           893:       end
        !           894:       subroutine terr(loct,delnew)
        !           895:       implicit double precision (a-h,o-z)
        !           896: c
        !           897: c     this routine estimates the local truncation error for a particular
        !           898: c circuit element.  it then computes the appropriate stepsize which
        !           899: c should be used.
        !           900: c
        !           901:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !           902:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !           903:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !           904:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !           905:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !           906:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !           907:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !           908:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !           909:      2   itemno,nosolv,ipostp,iscrch
        !           910:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !           911:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !           912:       common /blank/ value(1000)
        !           913:       integer nodplc(64)
        !           914:       complex*16 cvalue(32)
        !           915:       equivalence (value(1),nodplc(1),cvalue(1))
        !           916: c
        !           917: c
        !           918:       dimension qcap(1),ccap(1),diff(8),deltmp(7),coef(6)
        !           919:       equivalence (qcap(1),value(1)),(ccap(1),value(2))
        !           920:       data coef / 5.000000000d-1, 2.222222222d-1, 1.363636364d-1,
        !           921:      1            9.600000000d-2, 7.299270073d-2, 5.830903790d-2 /
        !           922:       data xtwelv / 8.333333333d-2 /
        !           923: c
        !           924: c
        !           925:       tol=reltol*dmax1(dabs(ccap(lx0+loct)),dabs(ccap(lx1+loct)))+abstol
        !           926:       ctol=reltol*dmax1(dabs(qcap(lx0+loct)),dabs(qcap(lx1+loct)),
        !           927:      1   chgtol)/delta
        !           928:       tol=dmax1(tol,ctol)
        !           929: c
        !           930: c  determine divided differences
        !           931: c
        !           932:       go to (6,5,4,3,2,1), iord
        !           933:     1 diff(8)=qcap(lx7+loct)
        !           934:     2 diff(7)=qcap(lx6+loct)
        !           935:     3 diff(6)=qcap(lx5+loct)
        !           936:     4 diff(5)=qcap(lx4+loct)
        !           937:     5 diff(4)=qcap(lx3+loct)
        !           938:     6 diff(3)=qcap(lx2+loct)
        !           939:       diff(2)=qcap(lx1+loct)
        !           940:       diff(1)=qcap(lx0+loct)
        !           941:       istop=iord+1
        !           942:       do 10 i=1,istop
        !           943:       deltmp(i)=delold(i)
        !           944:    10 continue
        !           945:    20 do 30 i=1,istop
        !           946:       diff(i)=(diff(i)-diff(i+1))/deltmp(i)
        !           947:    30 continue
        !           948:       istop=istop-1
        !           949:       if (istop.eq.0) go to 100
        !           950:       do 40 i=1,istop
        !           951:       deltmp(i)=deltmp(i+1)+delold(i)
        !           952:    40 continue
        !           953:       go to 20
        !           954: c
        !           955: c  diff(1) contains divided difference
        !           956: c
        !           957:   100 const=coef(iord)
        !           958:       if ((method.eq.1).and.(iord.eq.2)) const=xtwelv
        !           959:       del=trtol*tol/dmax1(abstol,const*dabs(diff(1)))
        !           960:       if (iord.eq.1) go to 200
        !           961:       if (iord.ge.3) go to 150
        !           962:       del=dsqrt(del)
        !           963:       go to 200
        !           964:   150 del=dexp(dlog(del)/dfloat(iord))
        !           965:   200 delnew=dmin1(delnew,del)
        !           966:       return
        !           967:       end
        !           968:       subroutine sorupd
        !           969:       implicit double precision (a-h,o-z)
        !           970: c
        !           971: c     this routine updates the independent voltage and current sources
        !           972: c used in the circuit.  it also updates the ltd table (which contains
        !           973: c previous (delayed) values of the sources used to model transmission
        !           974: c lines).
        !           975: c
        !           976:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !           977:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !           978:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !           979:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !           980:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !           981:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !           982:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !           983:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !           984:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !           985:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !           986:      2   itemno,nosolv,ipostp,iscrch
        !           987:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !           988:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !           989:       common /blank/ value(1000)
        !           990:       integer nodplc(64)
        !           991:       complex*16 cvalue(32)
        !           992:       equivalence (value(1),nodplc(1),cvalue(1))
        !           993: c
        !           994: c
        !           995:       do 500 id=9,10
        !           996:       loc=locate(id)
        !           997:    10 if (loc.eq.0) go to 500
        !           998:       locv=nodplc(loc+1)
        !           999:       locp=nodplc(loc+5)
        !          1000:       itype=nodplc(loc+4)+1
        !          1001:       go to (490,100,200,300,400,450), itype
        !          1002: c
        !          1003: c  pulse source
        !          1004: c
        !          1005:   100 v1=value(locp+1)
        !          1006:       v2=value(locp+2)
        !          1007:       t1=value(locp+3)
        !          1008:       t2=value(locp+4)
        !          1009:       t3=value(locp+5)
        !          1010:       t4=value(locp+6)
        !          1011:       period=value(locp+7)
        !          1012:       time1=time
        !          1013:       if (time1.le.0.0d0) go to 160
        !          1014:   110 if (time1.lt.t1+period) go to 120
        !          1015:       time1=time1-period
        !          1016:       go to 110
        !          1017:   120 if (time1.lt.t4) go to 130
        !          1018:       value(locv+1)=v1
        !          1019:       go to 490
        !          1020:   130 if (time1.lt.t3) go to 140
        !          1021:       value(locv+1)=v2+(time1-t3)*(v1-v2)/(t4-t3)
        !          1022:       go to 490
        !          1023:   140 if (time1.lt.t2) go to 150
        !          1024:       value(locv+1)=v2
        !          1025:       go to 490
        !          1026:   150 if (time1.lt.t1) go to 160
        !          1027:       value(locv+1)=v1+(time1-t1)*(v2-v1)/(t2-t1)
        !          1028:       go to 490
        !          1029:   160 value(locv+1)=v1
        !          1030:       go to 490
        !          1031: c
        !          1032: c  sinusoidal source
        !          1033: c
        !          1034:   200 v1=value(locp+1)
        !          1035:       v2=value(locp+2)
        !          1036:       omeg=value(locp+3)
        !          1037:       t1=value(locp+4)
        !          1038:       theta=value(locp+5)
        !          1039:       time1=time-t1
        !          1040:       if (time1.gt.0.0d0) go to 210
        !          1041:       value(locv+1)=v1
        !          1042:       go to 490
        !          1043:   210 if (theta.ne.0.0d0) go to 220
        !          1044:       value(locv+1)=v1+v2*dsin(omeg*time1)
        !          1045:       go to 490
        !          1046:   220 value(locv+1)=v1+v2*dsin(omeg*time1)*dexp(-time1*theta)
        !          1047:       go to 490
        !          1048: c
        !          1049: c  exponential source
        !          1050: c
        !          1051:   300 v1=value(locp+1)
        !          1052:       v2=value(locp+2)
        !          1053:       t1=value(locp+3)
        !          1054:       tau1=value(locp+4)
        !          1055:       t2=value(locp+5)
        !          1056:       tau2=value(locp+6)
        !          1057:       time1=time
        !          1058:       if (time1.gt.t1) go to 310
        !          1059:       value(locv+1)=v1
        !          1060:       go to 490
        !          1061:   310 if (time1.gt.t2) go to 320
        !          1062:       value(locv+1)=v1+(v2-v1)*(1.0d0-dexp((t1-time1)/tau1))
        !          1063:       go to 490
        !          1064:   320 value(locv+1)=v1+(v2-v1)*(1.0d0-dexp((t1-time1)/tau1))
        !          1065:      1   +(v1-v2)*(1.0d0-dexp((t2-time1)/tau2))
        !          1066:       go to 490
        !          1067: c
        !          1068: c  piecewise-linear source
        !          1069: c
        !          1070:   400 t1=value(locp+1)
        !          1071:       v1=value(locp+2)
        !          1072:       t2=value(locp+3)
        !          1073:       v2=value(locp+4)
        !          1074:       iknt=4
        !          1075:   410 if (time.le.t2) go to 420
        !          1076:       t1=t2
        !          1077:       v1=v2
        !          1078:       t2=value(locp+iknt+1)
        !          1079:       v2=value(locp+iknt+2)
        !          1080:       iknt=iknt+2
        !          1081:       go to 410
        !          1082:   420 value(locv+1)=v1+((time-t1)/(t2-t1))*(v2-v1)
        !          1083:       go to 490
        !          1084: c
        !          1085: c  single-frequency fm
        !          1086: c
        !          1087:   450 v1=value(locp+1)
        !          1088:       v2=value(locp+2)
        !          1089:       omegc=value(locp+3)
        !          1090:       xmod=value(locp+4)
        !          1091:       omegs=value(locp+5)
        !          1092:       value(locv+1)=v1+v2*dsin(omegc*time+xmod*dsin(omegs*time))
        !          1093:   490 loc=nodplc(loc)
        !          1094:       go to 10
        !          1095:   500 continue
        !          1096: c
        !          1097: c  update transmission line sources
        !          1098: c
        !          1099:       if (jelcnt(17).eq.0) go to 1000
        !          1100:       if (mode.ne.2) go to 1000
        !          1101:       call sizmem(ltd,ltdsiz)
        !          1102:       numtd=ltdsiz/ntlin
        !          1103:       if (numtd.lt.3) go to 900
        !          1104:       loc=locate(17)
        !          1105:   610 if (loc.eq.0) go to 1000
        !          1106:       locv=nodplc(loc+1)
        !          1107:       td=value(locv+2)
        !          1108:       baktim=time-td
        !          1109:       if (baktim.lt.0.0d0) go to 640
        !          1110:       ltdptr=nodplc(loc+30)
        !          1111:       icntr=2
        !          1112:       l1=ltd
        !          1113:       l2=l1+ntlin
        !          1114:       l3=l2+ntlin
        !          1115:       t1=value(l1+1)
        !          1116:       t2=value(l2+1)
        !          1117:   620 t3=value(l3+1)
        !          1118:       icntr=icntr+1
        !          1119:       if (baktim.le.t3) go to 630
        !          1120:       if (icntr.eq.numtd) go to 900
        !          1121:       l1=l2
        !          1122:       l2=l3
        !          1123:       l3=l2+ntlin
        !          1124:       t1=t2
        !          1125:       t2=t3
        !          1126:       go to 620
        !          1127:   630 dt1t2=t1-t2
        !          1128:       dt1t3=t1-t3
        !          1129:       dt2t3=t2-t3
        !          1130:       tdnom1=1.0d0/(dt1t2*dt1t3)
        !          1131:       tdnom2=-1.0d0/(dt1t2*dt2t3)
        !          1132:       tdnom3=1.0d0/(dt2t3*dt1t3)
        !          1133:       dtt1=baktim-t1
        !          1134:       dtt2=baktim-t2
        !          1135:       dtt3=baktim-t3
        !          1136:       tfact1=dtt2*dtt3*tdnom1
        !          1137:       tfact2=dtt1*dtt3*tdnom2
        !          1138:       tfact3=dtt1*dtt2*tdnom3
        !          1139:       value(locv+3)=value(l1+ltdptr+0)*tfact1+value(l2+ltdptr+0)*tfact2
        !          1140:      1   +value(l3+ltdptr+0)*tfact3
        !          1141:       value(locv+4)=value(l1+ltdptr+1)*tfact1+value(l2+ltdptr+1)*tfact2
        !          1142:      1   +value(l3+ltdptr+1)*tfact3
        !          1143:   640 loc=nodplc(loc)
        !          1144:       go to 610
        !          1145: c
        !          1146: c  internal logic error:  less than 3 entries in ltd
        !          1147: c
        !          1148:   900 nogo=1
        !          1149:       write (6,901) numtd,icntr
        !          1150:   901 format('0*abort*:  internal spice error:  sorupd:  ',2i5/)
        !          1151: c
        !          1152: c  finished
        !          1153: c
        !          1154:  1000 return
        !          1155:       end
        !          1156:       subroutine iter8(itlim)
        !          1157:       implicit double precision (a-h,o-z)
        !          1158: c
        !          1159: c     this routine drives the newton-raphson iteration technique used to
        !          1160: c solve the set of nonlinear circuit equations.
        !          1161: c
        !          1162:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          1163:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          1164:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          1165:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          1166:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          1167:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          1168:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          1169:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          1170:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          1171:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          1172:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          1173:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          1174:      2   itemno,nosolv,ipostp,iscrch
        !          1175:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !          1176:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !          1177:       common /blank/ value(1000)
        !          1178:       integer nodplc(64)
        !          1179:       complex*16 cvalue(32)
        !          1180:       equivalence (value(1),nodplc(1),cvalue(1))
        !          1181: c
        !          1182: c
        !          1183:       igoof=0
        !          1184:       iterno=0
        !          1185:       ndrflo=0
        !          1186:       noncon=0
        !          1187:       ipass=0
        !          1188: c
        !          1189: c  construct linear equations and check convergence
        !          1190: c
        !          1191:    10 call load
        !          1192:       if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 300
        !          1193:       iterno=iterno+1
        !          1194:       go to (20,30,40,50,50,50),initf
        !          1195:    20 if(mode.ne.1) go to 22
        !          1196:       call sizmem(nsnod,nic)
        !          1197:       if(nic.eq.0) go to 22
        !          1198:       if(ipass.ne.0) noncon=ipass
        !          1199:       ipass=0
        !          1200:    22 if(noncon.eq.0) go to 300
        !          1201:       go to 100
        !          1202:    30 initf=3
        !          1203:    40 if (noncon.eq.0) initf=1
        !          1204:       ipass=1
        !          1205:       go to 100
        !          1206:    50 initf=1
        !          1207: c
        !          1208: c  solve equations for next iteration
        !          1209: c
        !          1210:   100 if (iterno.ge.itlim) go to 200
        !          1211:   110 call dcdcmp
        !          1212:       call dcsol
        !          1213:   120 if (igoof.eq.0) go to 130
        !          1214:       ndrflo=ndrflo+1
        !          1215:       igoof=0
        !          1216:   130 value(lvn+1)=0.0d0
        !          1217:       ntemp=noncon
        !          1218:       noncon=0
        !          1219:       if (ntemp.gt.0) go to 150
        !          1220:       if (iterno.eq.1) go to 150
        !          1221:       do 140 i=2,numnod
        !          1222:       vold=value(lvnim1+i)
        !          1223:       vnew=value(lvn+i)
        !          1224:       tol=reltol*dmax1(dabs(vold),dabs(vnew))+vntol
        !          1225:       if (dabs(vold-vnew).le.tol) go to 140
        !          1226:       noncon=noncon+1
        !          1227:   140 continue
        !          1228:   150 call copy8(value(lvn+1),value(lvnim1+1),nstop)
        !          1229:       go to 10
        !          1230: c
        !          1231: c  no convergence
        !          1232: c
        !          1233:   200 igoof=1
        !          1234:   300 if (ndrflo.eq.0) go to 400
        !          1235:       write (6,301) ndrflo
        !          1236:   301 format('0warning:  underflow occurred ',i4,' time(s)')
        !          1237: c
        !          1238: c  finished
        !          1239: c
        !          1240:   400 return
        !          1241:       end
        !          1242:       subroutine load
        !          1243:       implicit double precision (a-h,o-z)
        !          1244: c
        !          1245: c     this routine zeroes-out and then loads the coefficient matrix.
        !          1246: c the active devices and the controlled sources are loaded by separate
        !          1247: c subroutines.
        !          1248: c
        !          1249:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          1250:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          1251:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          1252:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          1253:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          1254:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          1255:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          1256:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          1257:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          1258:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          1259:      2   itemno,nosolv,ipostp,iscrch
        !          1260:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !          1261:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !          1262:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          1263:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          1264:       common /blank/ value(1000)
        !          1265:       integer nodplc(64)
        !          1266:       complex*16 cvalue(32)
        !          1267:       equivalence (value(1),nodplc(1),cvalue(1))
        !          1268: c
        !          1269: c
        !          1270:       dimension qcap(1),ccap(1)
        !          1271:       equivalence (qcap(1),value(1)),(ccap(1),value(2))
        !          1272:       dimension find(1),vind(1)
        !          1273:       equivalence (find(1),value(1)),(vind(1),value(2))
        !          1274: c
        !          1275: c  zero y matrix and current vector
        !          1276: c
        !          1277:       call zero8(value(lvn+1),nstop+nstop+nut+nlt)
        !          1278: c
        !          1279: c  resistors
        !          1280: c
        !          1281:       loc=locate(1)
        !          1282:    20 if (loc.eq.0) go to 30
        !          1283:       locv=nodplc(loc+1)
        !          1284:       val=value(locv+1)
        !          1285:       locy=lynl+nodplc(loc+6)
        !          1286:       value(locy)=value(locy)+val
        !          1287:       locy=lynl+nodplc(loc+7)
        !          1288:       value(locy)=value(locy)+val
        !          1289:       locy=lynl+nodplc(loc+4)
        !          1290:       value(locy)=value(locy)-val
        !          1291:       locy=lynl+nodplc(loc+5)
        !          1292:       value(locy)=value(locy)-val
        !          1293:       loc=nodplc(loc)
        !          1294:       go to 20
        !          1295: c
        !          1296: c  capacitors
        !          1297: c
        !          1298:    30 loc=locate(2)
        !          1299:    40 if (loc.eq.0) go to 100
        !          1300:       locv=nodplc(loc+1)
        !          1301:       node1=nodplc(loc+2)
        !          1302:       node2=nodplc(loc+3)
        !          1303:       lcoef=nodplc(loc+7)
        !          1304:       call sizmem(nodplc(loc+7),ncoef)
        !          1305:       loct=nodplc(loc+8)
        !          1306:       vcap=value(locv+2)
        !          1307:       if ((mode.eq.1).and.(initf.eq.2)) go to 45
        !          1308:       if ((nosolv.ne.0).and.(initf.eq.5)) go to 45
        !          1309:       vcap=value(lvnim1+node1)-value(lvnim1+node2)
        !          1310:    45 value(locv+3)=vcap
        !          1311:       if (mode.eq.1) go to 60
        !          1312:       if (initf.ne.6) go to 50
        !          1313:       qcap(lx0+loct)=qcap(lx1+loct)
        !          1314:       go to 60
        !          1315:    50 call evpoly(qcap(lx0+loct),-1,lcoef,ncoef,locv+2,1,loc+8)
        !          1316:       if (initf.ne.5) go to 60
        !          1317:       if (nosolv.eq.0) go to 55
        !          1318:       vcap=value(locv+2)
        !          1319:       value(locv+3)=vcap
        !          1320:       call evpoly(qcap(lx0+loct),-1,lcoef,ncoef,locv+2,1,loc+8)
        !          1321:    55 qcap(lx1+loct)=qcap(lx0+loct)
        !          1322:    60 call evpoly(value(locv+1),0,lcoef,ncoef,locv+2,1,loc+8)
        !          1323:       if (mode.eq.1) go to 90
        !          1324:       call intgr8(geq,ceq,value(locv+1),loct)
        !          1325:       ceq=ceq-geq*vcap+ag(1)*qcap(lx0+loct)
        !          1326:       if(initf.ne.5) go to 70
        !          1327:       ccap(lx1+loct)=ccap(lx0+loct)
        !          1328:    70 locy=lynl+nodplc(loc+10)
        !          1329:       value(locy)=value(locy)+geq
        !          1330:       locy=lynl+nodplc(loc+11)
        !          1331:       value(locy)=value(locy)+geq
        !          1332:       locy=lynl+nodplc(loc+5)
        !          1333:       value(locy)=value(locy)-geq
        !          1334:       locy=lynl+nodplc(loc+6)
        !          1335:       value(locy)=value(locy)-geq
        !          1336:       value(lvn+node1)=value(lvn+node1)-ceq
        !          1337:       value(lvn+node2)=value(lvn+node2)+ceq
        !          1338:    90 loc=nodplc(loc)
        !          1339:       go to 40
        !          1340: c
        !          1341: c  inductors
        !          1342: c
        !          1343:   100 if (jelcnt(3).eq.0) go to 400
        !          1344:       if (mode.eq.1) go to 150
        !          1345:       if (initf.eq.6) go to 150
        !          1346:       loc=locate(3)
        !          1347:   110 if (loc.eq.0) go to 120
        !          1348:       locv=nodplc(loc+1)
        !          1349:       iptr=nodplc(loc+5)
        !          1350:       lcoef=nodplc(loc+10)
        !          1351:       call sizmem(nodplc(loc+10),ncoef)
        !          1352:       loct=nodplc(loc+11)
        !          1353:       cind=value(lvnim1+iptr)
        !          1354:       if ((mode.eq.1).and.(initf.eq.2)) cind=value(locv+2)
        !          1355:       if ((initf.eq.5).and.(nosolv.ne.0)) cind=value(locv+2)
        !          1356:       value(locv+3)=cind
        !          1357:       call evpoly(find(lx0+loct),-1,lcoef,ncoef,locv+2,1,loc+11)
        !          1358:       loc=nodplc(loc)
        !          1359:       go to 110
        !          1360:   120 loc=locate(4)
        !          1361:   130 if (loc.eq.0) go to 150
        !          1362:       locv=nodplc(loc+1)
        !          1363:       nl1=nodplc(loc+2)
        !          1364:       nl2=nodplc(loc+3)
        !          1365:       iptr1=nodplc(nl1+5)
        !          1366:       iptr2=nodplc(nl2+5)
        !          1367:       loct1=nodplc(nl1+11)
        !          1368:       loct2=nodplc(nl2+11)
        !          1369:       find(lx0+loct1)=find(lx0+loct1)+value(locv+1)*value(lvnim1+iptr2)
        !          1370:       find(lx0+loct2)=find(lx0+loct2)+value(locv+1)*value(lvnim1+iptr1)
        !          1371:       loc=nodplc(loc)
        !          1372:       go to 130
        !          1373:   150 loc=locate(3)
        !          1374:   160 if (loc.eq.0) go to 300
        !          1375:       locv=nodplc(loc+1)
        !          1376:       iptr=nodplc(loc+5)
        !          1377:       lcoef=nodplc(loc+10)
        !          1378:       call sizmem(nodplc(loc+10),ncoef)
        !          1379:       loct=nodplc(loc+11)
        !          1380:       cind=value(lvnim1+iptr)
        !          1381:       if ((mode.eq.1).and.(initf.eq.2)) cind=value(locv+2)
        !          1382:       if ((nosolv.ne.0).and.(initf.eq.5)) cind=value(locv+2)
        !          1383:       value(locv+3)=cind
        !          1384:       if (mode.ne.1) go to 200
        !          1385:       veq=0.0d0
        !          1386:       req=0.0d0
        !          1387:       go to 210
        !          1388:   200 if (initf.ne.6) go to 205
        !          1389:       find(lx0+loct)=find(lx1+loct)
        !          1390:       go to 210
        !          1391:   205 if (initf.ne.5) go to 210
        !          1392:       find(lx1+loct)=find(lx0+loct)
        !          1393:   210 call evpoly(value(locv+1),0,lcoef,ncoef,locv+2,1,loc+11)
        !          1394:       if (mode.eq.1) go to 250
        !          1395:       call intgr8(req,veq,value(locv+1),loct)
        !          1396:       if (ncoef.eq.1) go to 250
        !          1397:       veq=veq-req*cind+ag(1)*find(lx0+loct)
        !          1398:   250 value(lvn+iptr)=veq
        !          1399:       if(initf.ne.5) go to 260
        !          1400:       vind(lx1+loct)=vind(lx0+loct)
        !          1401:   260 locy=lynl+nodplc(loc+13)
        !          1402:       value(locy)=-req
        !          1403:       locy=lynl+nodplc(loc+6)
        !          1404:       value(locy)=1.0d0
        !          1405:       locy=lynl+nodplc(loc+7)
        !          1406:       value(locy)=-1.0d0
        !          1407:       locy=lynl+nodplc(loc+8)
        !          1408:       value(locy)=1.0d0
        !          1409:       locy=lynl+nodplc(loc+9)
        !          1410:       value(locy)=-1.0d0
        !          1411:       loc=nodplc(loc)
        !          1412:       go to 160
        !          1413: c
        !          1414: c  mutual inductances
        !          1415: c
        !          1416:   300 loc=locate(4)
        !          1417:   310 if (loc.eq.0) go to 400
        !          1418:       locv=nodplc(loc+1)
        !          1419:       req=ag(1)*value(locv+1)
        !          1420:       locy=lynl+nodplc(loc+4)
        !          1421:       value(locy)=-req
        !          1422:       locy=lynl+nodplc(loc+5)
        !          1423:       value(locy)=-req
        !          1424:       loc=nodplc(loc)
        !          1425:       go to 310
        !          1426: c
        !          1427: c  nonlinear controlled sources
        !          1428: c
        !          1429:   400 call nlcsrc
        !          1430: c
        !          1431: c  voltage sources
        !          1432: c
        !          1433:       loc=locate(9)
        !          1434:   610 if (loc.eq.0) go to 700
        !          1435:       locv=nodplc(loc+1)
        !          1436:       iptr=nodplc(loc+6)
        !          1437:       value(lvn+iptr)=value(locv+1)
        !          1438:       locy=lynl+nodplc(loc+7)
        !          1439:       value(locy)=value(locy)+1.0d0
        !          1440:       locy=lynl+nodplc(loc+8)
        !          1441:       value(locy)=value(locy)-1.0d0
        !          1442:       locy=lynl+nodplc(loc+9)
        !          1443:       value(locy)=value(locy)+1.0d0
        !          1444:       locy=lynl+nodplc(loc+10)
        !          1445:       value(locy)=value(locy)-1.0d0
        !          1446:       loc=nodplc(loc)
        !          1447:       go to 610
        !          1448: c
        !          1449: c  current sources
        !          1450: c
        !          1451:   700 loc=locate(10)
        !          1452:   710 if (loc.eq.0) go to 800
        !          1453:       locv=nodplc(loc+1)
        !          1454:       node1=nodplc(loc+2)
        !          1455:       node2=nodplc(loc+3)
        !          1456:       val=value(locv+1)
        !          1457:       value(lvn+node1)=value(lvn+node1)-val
        !          1458:       value(lvn+node2)=value(lvn+node2)+val
        !          1459:       loc=nodplc(loc)
        !          1460:       go to 710
        !          1461: c
        !          1462: c  call device model routines
        !          1463: c
        !          1464:   800 call diode
        !          1465:       call bjt
        !          1466:       call jfet
        !          1467:       call mosfet
        !          1468: c
        !          1469: c  transmission lines
        !          1470: c
        !          1471:       loc=locate(17)
        !          1472:   910 if (loc.eq.0) go to 980
        !          1473:       locv=nodplc(loc+1)
        !          1474:       z0=value(locv+1)
        !          1475:       y0=1.0d0/z0
        !          1476:       node1=nodplc(loc+2)
        !          1477:       node2=nodplc(loc+3)
        !          1478:       node3=nodplc(loc+4)
        !          1479:       node4=nodplc(loc+5)
        !          1480:       ibr1=nodplc(loc+8)
        !          1481:       ibr2=nodplc(loc+9)
        !          1482:       locy=lynl+nodplc(loc+10)
        !          1483:       value(locy)=value(locy)+y0
        !          1484:       locy=lynl+nodplc(loc+11)
        !          1485:       value(locy)=-y0
        !          1486:       locy=lynl+nodplc(loc+12)
        !          1487:       value(locy)=-1.0d0
        !          1488:       locy=lynl+nodplc(loc+13)
        !          1489:       value(locy)=value(locy)+y0
        !          1490:       locy=lynl+nodplc(loc+14)
        !          1491:       value(locy)=-1.0d0
        !          1492:       locy=lynl+nodplc(loc+15)
        !          1493:       value(locy)=-y0
        !          1494:       locy=lynl+nodplc(loc+16)
        !          1495:       value(locy)=+y0
        !          1496:       locy=lynl+nodplc(loc+17)
        !          1497:       value(locy)=+1.0d0
        !          1498:       locy=lynl+nodplc(loc+18)
        !          1499:       value(locy)=+y0
        !          1500:       locy=lynl+nodplc(loc+19)
        !          1501:       value(locy)=+1.0d0
        !          1502:       locy=lynl+nodplc(loc+20)
        !          1503:       value(locy)=-1.0d0
        !          1504:       locy=lynl+nodplc(loc+23)
        !          1505:       value(locy)=+1.0d0
        !          1506:       locy=lynl+nodplc(loc+27)
        !          1507:       value(locy)=-1.0d0
        !          1508:       locy=lynl+nodplc(loc+28)
        !          1509:       value(locy)=+1.0d0
        !          1510:       locy=lynl+nodplc(loc+31)
        !          1511:       value(locy)=-y0
        !          1512:       locy=lynl+nodplc(loc+32)
        !          1513:       value(locy)=-y0
        !          1514:       if (mode.ne.1) go to 920
        !          1515:       locy=lynl+nodplc(loc+21)
        !          1516:       value(locy)=-1.0d0
        !          1517:       locy=lynl+nodplc(loc+22)
        !          1518:       value(locy)=+1.0d0
        !          1519:       locy=lynl+nodplc(loc+24)
        !          1520:       value(locy)=-(1.0d0-gmin)*z0
        !          1521:       locy=lynl+nodplc(loc+25)
        !          1522:       value(locy)=-1.0d0
        !          1523:       locy=lynl+nodplc(loc+26)
        !          1524:       value(locy)=+1.0d0
        !          1525:       locy=lynl+nodplc(loc+29)
        !          1526:       value(locy)=-(1.0d0-gmin)*z0
        !          1527:       go to 950
        !          1528:   920 if (initf.ne.5) go to 930
        !          1529:       if (nosolv.ne.0) go to 925
        !          1530:       value(locv+3)=value(lvnim1+node3)-value(lvnim1+node4)
        !          1531:      1   +value(lvnim1+ibr2)*z0
        !          1532:       value(locv+4)=value(lvnim1+node1)-value(lvnim1+node2)
        !          1533:      1   +value(lvnim1+ibr1)*z0
        !          1534:       go to 930
        !          1535:   925 value(locv+3)=value(locv+7)+value(locv+8)*z0
        !          1536:       value(locv+4)=value(locv+5)+value(locv+6)*z0
        !          1537:   930 value(lvn+ibr1)=value(locv+3)
        !          1538:       value(lvn+ibr2)=value(locv+4)
        !          1539:   950 loc=nodplc(loc)
        !          1540:       go to 910
        !          1541: c
        !          1542: c  initialize nodes
        !          1543: c
        !          1544:   980 if(mode.ne.1) go to 995
        !          1545:       if(initf.ne.3.and.initf.ne.2) go to 1000
        !          1546:       call sizmem(nsnod,nic)
        !          1547:       if(nic.eq.0) go to 995
        !          1548:       call sizmem(icnod,ntest)
        !          1549:       if(modedc.eq.2.and.ntest.ne.0) go to 995
        !          1550:       g=1.0d0
        !          1551:       do 990 i=1,nic
        !          1552:       locy=lynl+nodplc(nsmat+i)
        !          1553:       value(locy)=value(locy)+g
        !          1554:       node=nodplc(nsnod+i)
        !          1555:       value(lvn+node)=value(lvn+node)+value(nsval+i)*g
        !          1556:   990 continue
        !          1557: c
        !          1558: c  transient initial conditions (uic not specified)
        !          1559: c
        !          1560:   995 if(mode.ne.1) go to 1000
        !          1561:       if(modedc.ne.2) go to 1000
        !          1562:       if(nosolv.ne.0) go to 1000
        !          1563:       call sizmem(icnod,nic)
        !          1564:       if(nic.eq.0) go to 1000
        !          1565:       g=1.0d0
        !          1566:       do 996 i=1,nic
        !          1567:       locy=lynl+nodplc(icmat+i)
        !          1568:       value(locy)=value(locy)+g
        !          1569:       node=nodplc(icnod+i)
        !          1570:       value(lvn+node)=value(lvn+node)+value(icval+i)*g
        !          1571:   996 continue
        !          1572: c
        !          1573: c  reorder right-hand side
        !          1574: c
        !          1575:  1000 do 1010 i=2,nstop
        !          1576:       j=nodplc(iswap+i)
        !          1577:       value(ndiag+i)=value(lvn+j)
        !          1578:  1010 continue
        !          1579:       call copy8(value(ndiag+1),value(lvn+1),nstop)
        !          1580: c
        !          1581: c  finished
        !          1582: c
        !          1583:       return
        !          1584:       end
        !          1585:       subroutine nlcsrc
        !          1586:       implicit double precision (a-h,o-z)
        !          1587: c
        !          1588: c     this routine loads the nonlinear controlled sources into the
        !          1589: c coefficient matrix.
        !          1590: c
        !          1591:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          1592:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          1593:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          1594:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          1595:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          1596:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          1597:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          1598:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          1599:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          1600:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          1601:      2   itemno,nosolv,ipostp,iscrch
        !          1602:       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
        !          1603:      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
        !          1604:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          1605:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          1606:       common /blank/ value(1000)
        !          1607:       integer nodplc(64)
        !          1608:       complex*16 cvalue(32)
        !          1609:       equivalence (value(1),nodplc(1),cvalue(1))
        !          1610: c
        !          1611: c  nonlinear voltage-controlled current sources
        !          1612: c
        !          1613:       loc=locate(5)
        !          1614:    10 if (loc.eq.0) go to 100
        !          1615:       node1=nodplc(loc+2)
        !          1616:       node2=nodplc(loc+3)
        !          1617:       ndim=nodplc(loc+4)
        !          1618:       lnod=nodplc(loc+6)
        !          1619:       lmat=nodplc(loc+7)
        !          1620:       lcoef=nodplc(loc+8)
        !          1621:       call sizmem(nodplc(loc+8),ncoef)
        !          1622:       larg=nodplc(loc+9)
        !          1623:       lexp=nodplc(loc+10)
        !          1624:       lic=nodplc(loc+11)
        !          1625:       loct=nodplc(loc+12)+1
        !          1626:       icheck=0
        !          1627:       do 20 i=1,ndim
        !          1628:       call update(value(lic+i),loct,nodplc(lnod+1),nodplc(lnod+2),2,
        !          1629:      1   icheck)
        !          1630:       value(larg+i)=value(lx0+loct)
        !          1631:       loct=loct+2
        !          1632:       lnod=lnod+2
        !          1633:    20 continue
        !          1634:       call evpoly(cold,0,lcoef,ncoef,larg,ndim,lexp)
        !          1635:       loct=nodplc(loc+12)
        !          1636:       if (icheck.eq.1) go to 30
        !          1637:       if (initf.eq.6) go to 30
        !          1638:       tol=reltol*dmax1(dabs(cold),dabs(value(lx0+loct)))+abstol
        !          1639:       if (dabs(cold-value(lx0+loct)).lt.tol) go to 40
        !          1640:    30 noncon=noncon+1
        !          1641:    40 value(lx0+loct)=cold
        !          1642:       ceq=cold
        !          1643:       do 50 i=1,ndim
        !          1644:       call evpoly(geq,i,lcoef,ncoef,larg,ndim,lexp)
        !          1645:       loct=loct+2
        !          1646:       value(lx0+loct)=geq
        !          1647:       ceq=ceq-geq*value(larg+i)
        !          1648:       locy=lynl+nodplc(lmat+1)
        !          1649:       value(locy)=value(locy)+geq
        !          1650:       locy=lynl+nodplc(lmat+2)
        !          1651:       value(locy)=value(locy)-geq
        !          1652:       locy=lynl+nodplc(lmat+3)
        !          1653:       value(locy)=value(locy)-geq
        !          1654:       locy=lynl+nodplc(lmat+4)
        !          1655:       value(locy)=value(locy)+geq
        !          1656:       lmat=lmat+4
        !          1657:    50 continue
        !          1658:       value(lvn+node1)=value(lvn+node1)-ceq
        !          1659:       value(lvn+node2)=value(lvn+node2)+ceq
        !          1660:       loc=nodplc(loc)
        !          1661:       go to 10
        !          1662: c
        !          1663: c  nonlinear voltage controlled voltage sources
        !          1664: c
        !          1665:   100 loc=locate(6)
        !          1666:   110 if (loc.eq.0) go to 200
        !          1667:       node1=nodplc(loc+2)
        !          1668:       node2=nodplc(loc+3)
        !          1669:       ndim=nodplc(loc+4)
        !          1670:       iptr=nodplc(loc+6)
        !          1671:       lnod=nodplc(loc+7)
        !          1672:       lmat=nodplc(loc+8)
        !          1673:       lcoef=nodplc(loc+9)
        !          1674:       call sizmem(nodplc(loc+9),ncoef)
        !          1675:       larg=nodplc(loc+10)
        !          1676:       lexp=nodplc(loc+11)
        !          1677:       lic=nodplc(loc+12)
        !          1678:       loct=nodplc(loc+13)+2
        !          1679:       icheck=0
        !          1680:       do 120 i=1,ndim
        !          1681:       call update(value(lic+i),loct,nodplc(lnod+1),nodplc(lnod+2),2,
        !          1682:      1   icheck)
        !          1683:       value(larg+i)=value(lx0+loct)
        !          1684:       loct=loct+2
        !          1685:       lnod=lnod+2
        !          1686:   120 continue
        !          1687:       call evpoly(volt,0,lcoef,ncoef,larg,ndim,lexp)
        !          1688:       loct=nodplc(loc+13)
        !          1689:       if (icheck.eq.1) go to 130
        !          1690:       if (initf.eq.6) go to 130
        !          1691:       tol=reltol*dmax1(dabs(volt),dabs(value(lx0+loct)))+vntol
        !          1692:       if (dabs(volt-value(lx0+loct)).lt.tol) go to 140
        !          1693:   130 noncon=noncon+1
        !          1694:   140 value(lx0+loct)=volt
        !          1695:       value(lx0+loct+1)=value(lvnim1+iptr)
        !          1696:       veq=volt
        !          1697:       locy=lynl+nodplc(lmat+1)
        !          1698:       value(locy)=+1.0d0
        !          1699:       locy=lynl+nodplc(lmat+2)
        !          1700:       value(locy)=-1.0d0
        !          1701:       locy=lynl+nodplc(lmat+3)
        !          1702:       value(locy)=+1.0d0
        !          1703:       locy=lynl+nodplc(lmat+4)
        !          1704:       value(locy)=-1.0d0
        !          1705:       lmat=lmat+4
        !          1706:       loct=loct+1
        !          1707:       do 150 i=1,ndim
        !          1708:       call evpoly(vgain,i,lcoef,ncoef,larg,ndim,lexp)
        !          1709:       loct=loct+2
        !          1710:       value(lx0+loct)=vgain
        !          1711:       veq=veq-vgain*value(larg+i)
        !          1712:       locy=lynl+nodplc(lmat+1)
        !          1713:       value(locy)=value(locy)-vgain
        !          1714:       locy=lynl+nodplc(lmat+2)
        !          1715:       value(locy)=value(locy)+vgain
        !          1716:       lmat=lmat+2
        !          1717:   150 continue
        !          1718:       value(lvn+iptr)=veq
        !          1719:       loc=nodplc(loc)
        !          1720:       go to 110
        !          1721: c
        !          1722: c  nonlinear current-controlled current sources
        !          1723: c
        !          1724:   200 loc=locate(7)
        !          1725:   210 if (loc.eq.0) go to 300
        !          1726:       node1=nodplc(loc+2)
        !          1727:       node2=nodplc(loc+3)
        !          1728:       ndim=nodplc(loc+4)
        !          1729:       lvs=nodplc(loc+6)
        !          1730:       lmat=nodplc(loc+7)
        !          1731:       lcoef=nodplc(loc+8)
        !          1732:       call sizmem(nodplc(loc+8),ncoef)
        !          1733:       larg=nodplc(loc+9)
        !          1734:       lexp=nodplc(loc+10)
        !          1735:       lic=nodplc(loc+11)
        !          1736:       loct=nodplc(loc+12)+1
        !          1737:       icheck=0
        !          1738:       do 220 i=1,ndim
        !          1739:       iptr=nodplc(lvs+i)
        !          1740:       iptr=nodplc(iptr+6)
        !          1741:       call update(value(lic+i),loct,iptr,1,2,icheck)
        !          1742:       value(larg+i)=value(lx0+loct)
        !          1743:       loct=loct+2
        !          1744:   220 continue
        !          1745:       call evpoly(csrc,0,lcoef,ncoef,larg,ndim,lexp)
        !          1746:       loct=nodplc(loc+12)
        !          1747:       if (icheck.eq.1) go to 230
        !          1748:       if (initf.eq.6) go to 230
        !          1749:       tol=reltol*dmax1(dabs(csrc),dabs(value(lx0+loct)))+abstol
        !          1750:       if (dabs(csrc-value(lx0+loct)).lt.tol) go to 240
        !          1751:   230 noncon=noncon+1
        !          1752:   240 value(lx0+loct)=csrc
        !          1753:       ceq=csrc
        !          1754:       do 250 i=1,ndim
        !          1755:       call evpoly(cgain,i,lcoef,ncoef,larg,ndim,lexp)
        !          1756:       loct=loct+2
        !          1757:       value(lx0+loct)=cgain
        !          1758:       ceq=ceq-cgain*value(larg+i)
        !          1759:       locy=lynl+nodplc(lmat+1)
        !          1760:       value(locy)=value(locy)+cgain
        !          1761:       locy=lynl+nodplc(lmat+2)
        !          1762:       value(locy)=value(locy)-cgain
        !          1763:       lmat=lmat+2
        !          1764:   250 continue
        !          1765:       value(lvn+node1)=value(lvn+node1)-ceq
        !          1766:       value(lvn+node2)=value(lvn+node2)+ceq
        !          1767:       loc=nodplc(loc)
        !          1768:       go to 210
        !          1769: c
        !          1770: c  nonlinear current controlled voltage sources
        !          1771: c
        !          1772:   300 loc=locate(8)
        !          1773:   310 if (loc.eq.0) go to 1000
        !          1774:       node1=nodplc(loc+2)
        !          1775:       node2=nodplc(loc+3)
        !          1776:       ndim=nodplc(loc+4)
        !          1777:       ibr=nodplc(loc+6)
        !          1778:       lvs=nodplc(loc+7)
        !          1779:       lmat=nodplc(loc+8)
        !          1780:       lcoef=nodplc(loc+9)
        !          1781:       call sizmem(nodplc(loc+9),ncoef)
        !          1782:       larg=nodplc(loc+10)
        !          1783:       lexp=nodplc(loc+11)
        !          1784:       lic=nodplc(loc+12)
        !          1785:       loct=nodplc(loc+13)+2
        !          1786:       icheck=0
        !          1787:       do 320 i=1,ndim
        !          1788:       iptr=nodplc(lvs+i)
        !          1789:       iptr=nodplc(iptr+6)
        !          1790:       call update(value(lic+i),loct,iptr,1,2,icheck)
        !          1791:       value(larg+i)=value(lx0+loct)
        !          1792:       loct=loct+2
        !          1793:   320 continue
        !          1794:       call evpoly(volt,0,lcoef,ncoef,larg,ndim,lexp)
        !          1795:       loct=nodplc(loc+13)
        !          1796:       if (icheck.eq.1) go to 330
        !          1797:       if (initf.eq.6) go to 330
        !          1798:       tol=reltol*dmax1(dabs(volt),dabs(value(lx0+loct)))+vntol
        !          1799:       if (dabs(volt-value(lx0+loct)).lt.tol) go to 340
        !          1800:   330 noncon=noncon+1
        !          1801:   340 value(lx0+loct)=volt
        !          1802:       value(lx0+loct+1)=value(lvnim1+ibr)
        !          1803:       veq=volt
        !          1804:       locy=lynl+nodplc(lmat+1)
        !          1805:       value(locy)=+1.0d0
        !          1806:       locy=lynl+nodplc(lmat+2)
        !          1807:       value(locy)=-1.0d0
        !          1808:       locy=lynl+nodplc(lmat+3)
        !          1809:       value(locy)=+1.0d0
        !          1810:       locy=lynl+nodplc(lmat+4)
        !          1811:       value(locy)=-1.0d0
        !          1812:       lmat=lmat+4
        !          1813:       loct=loct+1
        !          1814:       do 350 i=1,ndim
        !          1815:       call evpoly(transr,i,lcoef,ncoef,larg,ndim,lexp)
        !          1816:       loct=loct+2
        !          1817:       value(lx0+loct)=transr
        !          1818:       veq=veq-transr*value(larg+i)
        !          1819:       locy=lynl+nodplc(lmat+i)
        !          1820:       value(locy)=value(locy)-transr
        !          1821:   350 continue
        !          1822:       value(lvn+ibr)=veq
        !          1823:       loc=nodplc(loc)
        !          1824:       go to 310
        !          1825: c
        !          1826: c  finished
        !          1827: c
        !          1828:  1000 return
        !          1829:       end
        !          1830:       subroutine update(vinit,loct,node1,node2,nupda,icheck)
        !          1831:       implicit double precision (a-h,o-z)
        !          1832: c
        !          1833: c     this routine updates and limits the controlling variables for the
        !          1834: c nonlinear controlled sources.
        !          1835: c
        !          1836:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          1837:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          1838:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          1839:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          1840:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          1841:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          1842:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          1843:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          1844:      2   itemno,nosolv,ipostp,iscrch
        !          1845:       common /blank/ value(1000)
        !          1846:       integer nodplc(64)
        !          1847:       complex*16 cvalue(32)
        !          1848:       equivalence (value(1),nodplc(1),cvalue(1))
        !          1849: c
        !          1850: c
        !          1851:       go to (40,10,40,20,30,50), initf
        !          1852:    10 vnew=vinit
        !          1853:       go to 70
        !          1854:    20 vnew=value(lx0+loct)
        !          1855:       go to 70
        !          1856:    30 vnew=value(lx1+loct)
        !          1857:       go to 70
        !          1858:    40 vnew=value(lvnim1+node1)-value(lvnim1+node2)
        !          1859:       go to 60
        !          1860:    50 call copy8(value(lx1+loct),value(lx0+loct),nupda)
        !          1861:       xfact=delta/delold(2)
        !          1862:       vnew=(1.0d0+xfact)*value(lx1+loct)-xfact*value(lx2+loct)
        !          1863:    60 if (dabs(vnew).le.1.0d0) go to 80
        !          1864:       delv=vnew-value(lx0+loct)
        !          1865:       if (dabs(delv).le.0.1d0) go to 80
        !          1866:       vlim=dmax1(dabs(0.1d0*value(lx0+loct)),0.1d0)
        !          1867:       vnew=value(lx0+loct)+dsign(dmin1(dabs(delv),vlim),delv)
        !          1868:       go to 70
        !          1869:    70 icheck=1
        !          1870:    80 value(lx0+loct)=vnew
        !          1871:       return
        !          1872:       end
        !          1873:       subroutine evpoly(result,itype,lcoef,ncoef,larg,
        !          1874:      1  narg,lexp)
        !          1875:       implicit double precision (a-h,o-z)
        !          1876: c
        !          1877: c     this routine evaluates a polynomial.  lcoef points to the coef-
        !          1878: c ficients, and larg points to the values of the polynomial argument(s).
        !          1879: c
        !          1880:       common /blank/ value(1000)
        !          1881:       integer nodplc(64)
        !          1882:       complex*16 cvalue(32)
        !          1883:       equivalence (value(1),nodplc(1),cvalue(1))
        !          1884: c
        !          1885: c
        !          1886:       if (itype) 100,200,300
        !          1887: c
        !          1888: c  integration (polynomial *must* be one-dimensional)
        !          1889: c
        !          1890:   100 result=0.0d0
        !          1891:       arg=1.0d0
        !          1892:       arg1=value(larg+1)
        !          1893:       do 110 i=1,ncoef
        !          1894:       arg=arg*arg1
        !          1895:       result=result+value(lcoef+i)*arg/dfloat(i)
        !          1896:   110 continue
        !          1897:       go to 1000
        !          1898: c
        !          1899: c  evaluation of the polynomial
        !          1900: c
        !          1901:   200 result=value(lcoef+1)
        !          1902:       if (ncoef.eq.1) go to 1000
        !          1903:       call zero4(nodplc(lexp+1),narg)
        !          1904:       do 220 i=2,ncoef
        !          1905:       call nxtpwr(nodplc(lexp+1),narg)
        !          1906:       if (value(lcoef+i).eq.0.0d0) go to 220
        !          1907:       arg=1.0d0
        !          1908:       do 210 j=1,narg
        !          1909:       call evterm(val,value(larg+j),nodplc(lexp+j))
        !          1910:       arg=arg*val
        !          1911:   210 continue
        !          1912:       result=result+value(lcoef+i)*arg
        !          1913:   220 continue
        !          1914:       go to 1000
        !          1915: c
        !          1916: c  partial derivative with respect to the itype*th variable
        !          1917: c
        !          1918:   300 result=0.0d0
        !          1919:       if (ncoef.eq.1) go to 1000
        !          1920:       call zero4(nodplc(lexp+1),narg)
        !          1921:       do 330 i=2,ncoef
        !          1922:       call nxtpwr(nodplc(lexp+1),narg)
        !          1923:       if (nodplc(lexp+itype).eq.0) go to 330
        !          1924:       if (value(lcoef+i).eq.0.0d0) go to 330
        !          1925:       arg=1.0d0
        !          1926:       do 320 j=1,narg
        !          1927:       if (j.eq.itype) go to 310
        !          1928:       call evterm(val,value(larg+j),nodplc(lexp+j))
        !          1929:       arg=arg*val
        !          1930:       go to 320
        !          1931:   310 call evterm(val,value(larg+j),nodplc(lexp+j)-1)
        !          1932:       arg=arg*dfloat(nodplc(lexp+j))*val
        !          1933:   320 continue
        !          1934:       result=result+value(lcoef+i)*arg
        !          1935:   330 continue
        !          1936: c
        !          1937: c  finished
        !          1938: c
        !          1939:  1000 return
        !          1940:       end
        !          1941:       subroutine evterm(val,arg,iexp)
        !          1942:       implicit double precision (a-h,o-z)
        !          1943: c
        !          1944: c     this routine evaluates one term of a polynomial.
        !          1945: c
        !          1946:       jexp=iexp+1
        !          1947:       if (jexp.ge.6) go to 60
        !          1948:       go to (10,20,30,40,50), jexp
        !          1949:    10 val=1.0d0
        !          1950:       go to 100
        !          1951:    20 val=arg
        !          1952:       go to 100
        !          1953:    30 val=arg*arg
        !          1954:       go to 100
        !          1955:    40 val=arg*arg*arg
        !          1956:       go to 100
        !          1957:    50 val=arg*arg
        !          1958:       val=val*val
        !          1959:       go to 100
        !          1960:    60 if (arg.eq.0.0d0) go to 70
        !          1961:       argexp=dfloat(iexp)*dlog(dabs(arg))
        !          1962:       if (argexp.lt.-200.0d0) go to 70
        !          1963:       val=dexp(argexp)
        !          1964:       if((iexp/2)*2.eq.iexp) go to 100
        !          1965:       val=dsign(val,arg)
        !          1966:       go to 100
        !          1967:    70 val=0.0d0
        !          1968: c
        !          1969: c  finished
        !          1970: c
        !          1971:   100 return
        !          1972:       end
        !          1973:       subroutine nxtpwr(pwrseq,pdim)
        !          1974:       implicit double precision (a-h,o-z)
        !          1975: c
        !          1976: c     this routine determines the 'next' set of exponents for the
        !          1977: c different dimensions of a polynomial.
        !          1978: c
        !          1979:       integer pwrseq(1),pdim,psum
        !          1980: c
        !          1981: c
        !          1982:       if (pdim.eq.1) go to 80
        !          1983:       k=pdim
        !          1984:    10 if (pwrseq(k).ne.0) go to 20
        !          1985:       k=k-1
        !          1986:       if (k.ne.0) go to 10
        !          1987:       go to 80
        !          1988:    20 if (k.eq.pdim) go to 30
        !          1989:       pwrseq(k)=pwrseq(k)-1
        !          1990:       pwrseq(k+1)=pwrseq(k+1)+1
        !          1991:       go to 100
        !          1992:    30 km1=k-1
        !          1993:       do 40 i=1,km1
        !          1994:       if (pwrseq(i).ne.0) go to 50
        !          1995:    40 continue
        !          1996:       pwrseq(1)=pwrseq(pdim)+1
        !          1997:       pwrseq(pdim)=0
        !          1998:       go to 100
        !          1999:    50 psum=1
        !          2000:       k=pdim
        !          2001:    60 if (pwrseq(k-1).ge.1) go to 70
        !          2002:       psum=psum+pwrseq(k)
        !          2003:       pwrseq(k)=0
        !          2004:       k=k-1
        !          2005:       go to 60
        !          2006:    70 pwrseq(k)=pwrseq(k)+psum
        !          2007:       pwrseq(k-1)=pwrseq(k-1)-1
        !          2008:       go to 100
        !          2009:    80 pwrseq(1)=pwrseq(1)+1
        !          2010: c
        !          2011: c  finished
        !          2012: c
        !          2013:   100 return
        !          2014:       end
        !          2015:       subroutine intgr8(geq,ceq,capval,loct)
        !          2016:       implicit double precision (a-h,o-z)
        !          2017: c
        !          2018: c     this routine performs the actual numerical integration for each
        !          2019: c circuit element.
        !          2020: c
        !          2021:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          2022:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          2023:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          2024:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          2025:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          2026:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          2027:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          2028:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          2029:      2   itemno,nosolv,ipostp,iscrch
        !          2030:       common /blank/ value(1000)
        !          2031:       integer nodplc(64)
        !          2032:       complex*16 cvalue(32)
        !          2033:       equivalence (value(1),nodplc(1),cvalue(1))
        !          2034: c
        !          2035: c
        !          2036:       dimension qcap(1),ccap(1)
        !          2037:       equivalence (qcap(1),value(1)),(ccap(1),value(2))
        !          2038: c
        !          2039: c
        !          2040:       if (method.eq.2) go to 100
        !          2041: c
        !          2042: c  trapezoidal algorithm
        !          2043: c
        !          2044:       if (iord.eq.1) go to 100
        !          2045:       ccap(lx0+loct)=-ccap(lx1+loct)*ag(2)
        !          2046:      1   +ag(1)*(qcap(lx0+loct)-qcap(lx1+loct))
        !          2047:       go to 190
        !          2048: c
        !          2049: c  gears algorithm
        !          2050: c
        !          2051:   100 go to (110,120,130,140,150,160), iord
        !          2052:   110 ccap(lx0+loct)=ag(1)*qcap(lx0+loct)+ag(2)*qcap(lx1+loct)
        !          2053:       go to 190
        !          2054:   120 ccap(lx0+loct)=ag(1)*qcap(lx0+loct)+ag(2)*qcap(lx1+loct)
        !          2055:      1              +ag(3)*qcap(lx2+loct)
        !          2056:       go to 190
        !          2057:   130 ccap(lx0+loct)=ag(1)*qcap(lx0+loct)+ag(2)*qcap(lx1+loct)
        !          2058:      1              +ag(3)*qcap(lx2+loct)+ag(4)*qcap(lx3+loct)
        !          2059:       go to 190
        !          2060:   140 ccap(lx0+loct)=ag(1)*qcap(lx0+loct)+ag(2)*qcap(lx1+loct)
        !          2061:      1              +ag(3)*qcap(lx2+loct)+ag(4)*qcap(lx3+loct)
        !          2062:      2              +ag(5)*qcap(lx4+loct)
        !          2063:       go to 190
        !          2064:   150 ccap(lx0+loct)=ag(1)*qcap(lx0+loct)+ag(2)*qcap(lx1+loct)
        !          2065:      1              +ag(3)*qcap(lx2+loct)+ag(4)*qcap(lx3+loct)
        !          2066:      2              +ag(5)*qcap(lx4+loct)+ag(6)*qcap(lx5+loct)
        !          2067:       go to 190
        !          2068:   160 ccap(lx0+loct)=ag(1)*qcap(lx0+loct)+ag(2)*qcap(lx1+loct)
        !          2069:      1              +ag(3)*qcap(lx2+loct)+ag(4)*qcap(lx3+loct)
        !          2070:      2              +ag(5)*qcap(lx4+loct)+ag(6)*qcap(lx5+loct)
        !          2071:      3              +ag(7)*qcap(lx6+loct)
        !          2072: c... ceq is the equivalent current applicable to linear capacitance
        !          2073: c    (inductance) only, i.e. q=c*v
        !          2074:   190 ceq=ccap(lx0+loct)-ag(1)*qcap(lx0+loct)
        !          2075:       geq=ag(1)*capval
        !          2076:       return
        !          2077:       end
        !          2078:       subroutine pnjlim(vnew,vold,vt,vcrit,icheck)
        !          2079:       implicit double precision (a-h,o-z)
        !          2080: c
        !          2081: c     this routine limits the change-per-iteration of device pn-junction
        !          2082: c voltages.
        !          2083: c
        !          2084:       if (vnew.le.vcrit) go to 30
        !          2085:       vlim=vt+vt
        !          2086:       delv=vnew-vold
        !          2087:       if (dabs(delv).le.vlim) go to 30
        !          2088:       if (vold.le.0.0d0) go to 20
        !          2089:       arg=1.0d0+delv/vt
        !          2090:       if (arg.le.0.0d0) go to 10
        !          2091:       vnew=vold+vt*dlog(arg)
        !          2092:       icheck=1
        !          2093:       go to 100
        !          2094:    10 vnew=vcrit
        !          2095:       icheck=1
        !          2096:       go to 100
        !          2097:    20 vnew=vt*dlog(vnew/vt)
        !          2098:       icheck=1
        !          2099:       go to 100
        !          2100:    30 continue
        !          2101: c
        !          2102: c  finished
        !          2103: c
        !          2104:   100 return
        !          2105:       end
        !          2106:       subroutine diode
        !          2107:       implicit double precision (a-h,o-z)
        !          2108: c
        !          2109: c     this routine processes diodes for dc and transient analyses.
        !          2110: c
        !          2111:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          2112:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          2113:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          2114:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          2115:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          2116:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          2117:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          2118:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          2119:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          2120:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          2121:      2   itemno,nosolv,ipostp,iscrch
        !          2122:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          2123:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          2124:       common /blank/ value(1000)
        !          2125:       integer nodplc(64)
        !          2126:       complex*16 cvalue(32)
        !          2127:       equivalence (value(1),nodplc(1),cvalue(1))
        !          2128: c
        !          2129: c
        !          2130:       dimension vdo(1),cdo(1),gdo(1),qd(1),cqd(1)
        !          2131:       equivalence (vdo(1),value(1)),(cdo(1),value(2)),
        !          2132:      1   (gdo(1),value(3)),(qd(1),value(4)),(cqd(1),value(5))
        !          2133: c
        !          2134: c
        !          2135:       loc=locate(11)
        !          2136:    10 if (loc.eq.0) return
        !          2137:       locv=nodplc(loc+1)
        !          2138:       node1=nodplc(loc+2)
        !          2139:       node2=nodplc(loc+3)
        !          2140:       node3=nodplc(loc+4)
        !          2141:       locm=nodplc(loc+5)
        !          2142:       ioff=nodplc(loc+6)
        !          2143:       locm=nodplc(locm+1)
        !          2144:       loct=nodplc(loc+11)
        !          2145: c
        !          2146: c  dc model parameters
        !          2147: c
        !          2148:       area=value(locv+1)
        !          2149:       csat=value(locm+1)*area
        !          2150:       gspr=value(locm+2)*area
        !          2151:       vte=value(locm+3)*vt
        !          2152:       bv=value(locm+13)
        !          2153:       vcrit=value(locm+18)
        !          2154: c
        !          2155: c  initialization
        !          2156: c
        !          2157:       icheck=1
        !          2158:       go to (100,20,30,50,60,70),initf
        !          2159:    20 if(mode.ne.1.or.modedc.ne.2.or.nosolv.eq.0) go to 25
        !          2160:       vd=value(locv+2)
        !          2161:       go to 300
        !          2162:    25 if(ioff.ne.0) go to 40
        !          2163:       vd=vcrit
        !          2164:       go to 300
        !          2165:    30 if (ioff.eq.0) go to 100
        !          2166:    40 vd=0.0d0
        !          2167:       go to 300
        !          2168:    50 vd=vdo(lx0+loct)
        !          2169:       go to 300
        !          2170:    60 vd=vdo(lx1+loct)
        !          2171:       go to 300
        !          2172:    70 xfact=delta/delold(2)
        !          2173:       vdo(lx0+loct)=vdo(lx1+loct)
        !          2174:       vd=(1.0d0+xfact)*vdo(lx1+loct)-xfact*vdo(lx2+loct)
        !          2175:       cdo(lx0+loct)=cdo(lx1+loct)
        !          2176:       gdo(lx0+loct)=gdo(lx1+loct)
        !          2177:       go to 110
        !          2178: c
        !          2179: c  compute new nonlinear branch voltage
        !          2180: c
        !          2181:   100 vd=value(lvnim1+node3)-value(lvnim1+node2)
        !          2182:   110 delvd=vd-vdo(lx0+loct)
        !          2183:       cdhat=cdo(lx0+loct)+gdo(lx0+loct)*delvd
        !          2184: c
        !          2185: c  bypass if solution has not changed
        !          2186: c
        !          2187:       if (6    .eq.6) go to 200
        !          2188:       tol=reltol*dmax1(dabs(vd),dabs(vdo(lx0+loct)))+vntol
        !          2189:       if (dabs(delvd).ge.tol) go to 200
        !          2190:       tol=reltol*dmax1(dabs(cdhat),dabs(cdo(lx0+loct)))+abstol
        !          2191:       if (dabs(cdhat-cdo(lx0+loct)).ge.tol) go to 200
        !          2192:       vd=vdo(lx0+loct)
        !          2193:       cd=cdo(lx0+loct)
        !          2194:       gd=gdo(lx0+loct)
        !          2195:       go to 800
        !          2196: c
        !          2197: c  limit new junction voltage
        !          2198: c
        !          2199:   200 vlim=vte+vte
        !          2200:       if(bv.eq.0.0d0) go to 205
        !          2201:       if (vd.lt.dmin1(0.0d0,-bv+10.0d0*vte)) go to 210
        !          2202:   205 icheck=0
        !          2203:       call pnjlim(vd,vdo(lx0+loct),vte,vcrit,icheck)
        !          2204:       go to 300
        !          2205:   210 vdtemp=-(vd+bv)
        !          2206:       call pnjlim(vdtemp,-(vdo(lx0+loct)+bv),vte,vcrit,icheck)
        !          2207:       vd=-(vdtemp+bv)
        !          2208: c
        !          2209: c  compute dc current and derivitives
        !          2210: c
        !          2211:   300 if (vd.lt.-5.0d0*vte) go to 310
        !          2212:       evd=dexp(vd/vte)
        !          2213:       cd=csat*(evd-1.0d0)+gmin*vd
        !          2214:       gd=csat*evd/vte+gmin
        !          2215:       go to 330
        !          2216:   310 if(bv.eq.0.0d0) go to 315
        !          2217:       if(vd.lt.-bv) go to 320
        !          2218:   315 gd=-csat/vd+gmin
        !          2219:       cd=gd*vd
        !          2220:       go to 330
        !          2221:   320 evrev=dexp(-(bv+vd)/vt)
        !          2222:       cd=-csat*(evrev-1.0d0+bv/vt)
        !          2223:       gd=csat*evrev/vt
        !          2224:   330 if (mode.ne.1) go to 500
        !          2225:       if ((modedc.eq.2).and.(nosolv.ne.0)) go to 500
        !          2226:       if (initf.eq.4) go to 500
        !          2227:       go to 700
        !          2228: c
        !          2229: c  charge storage elements
        !          2230: c
        !          2231:   500 tau=value(locm+4)
        !          2232:       czero=value(locm+5)*area
        !          2233:       pb=value(locm+6)
        !          2234:       xm=value(locm+7)
        !          2235:       fcpb=value(locm+12)
        !          2236:       if (vd.ge.fcpb) go to 510
        !          2237:       arg=1.0d0-vd/pb
        !          2238:       sarg=dexp(-xm*dlog(arg))
        !          2239:       qd(lx0+loct)=tau*cd+pb*czero*(1.0d0-arg*sarg)/(1.0d0-xm)
        !          2240:       capd=tau*gd+czero*sarg
        !          2241:       go to 520
        !          2242:   510 f1=value(locm+15)
        !          2243:       f2=value(locm+16)
        !          2244:       f3=value(locm+17)
        !          2245:       czof2=czero/f2
        !          2246:       qd(lx0+loct)=tau*cd+czero*f1+czof2*(f3*(vd-fcpb)
        !          2247:      1   +(xm/(pb+pb))*(vd*vd-fcpb*fcpb))
        !          2248:       capd=tau*gd+czof2*(f3+xm*vd/pb)
        !          2249: c
        !          2250: c  store small-signal parameters
        !          2251: c
        !          2252:   520 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 700
        !          2253:       if (initf.ne.4) go to 600
        !          2254:       value(lx0+loct+4)=capd
        !          2255:       go to 1000
        !          2256: c
        !          2257: c  transient analysis
        !          2258: c
        !          2259:   600 if (initf.ne.5) go to 610
        !          2260:       qd(lx1+loct)=qd(lx0+loct)
        !          2261:   610 call intgr8(geq,ceq,capd,loct+3)
        !          2262:       gd=gd+geq
        !          2263:       cd=cd+cqd(lx0+loct)
        !          2264:       if (initf.ne.5) go to 700
        !          2265:       cqd(lx1+loct)=cqd(lx0+loct)
        !          2266: c
        !          2267: c  check convergence
        !          2268: c
        !          2269:   700 if (initf.ne.3) go to 710
        !          2270:       if (ioff.eq.0) go to 710
        !          2271:       go to 750
        !          2272:   710 if (icheck.eq.1) go to 720
        !          2273:       tol=reltol*dmax1(dabs(cdhat),dabs(cd))+abstol
        !          2274:       if (dabs(cdhat-cd).le.tol) go to 750
        !          2275:   720 noncon=noncon+1
        !          2276:   750 vdo(lx0+loct)=vd
        !          2277:       cdo(lx0+loct)=cd
        !          2278:       gdo(lx0+loct)=gd
        !          2279: c
        !          2280: c  load current vector
        !          2281: c
        !          2282:   800 cdeq=cd-gd*vd
        !          2283:       value(lvn+node2)=value(lvn+node2)+cdeq
        !          2284:       value(lvn+node3)=value(lvn+node3)-cdeq
        !          2285: c
        !          2286: c  load matrix
        !          2287: c
        !          2288:       locy=lynl+nodplc(loc+13)
        !          2289:       value(locy)=value(locy)+gspr
        !          2290:       locy=lynl+nodplc(loc+14)
        !          2291:       value(locy)=value(locy)+gd
        !          2292:       locy=lynl+nodplc(loc+15)
        !          2293:       value(locy)=value(locy)+gd+gspr
        !          2294:       locy=lynl+nodplc(loc+7)
        !          2295:       value(locy)=value(locy)-gspr
        !          2296:       locy=lynl+nodplc(loc+8)
        !          2297:       value(locy)=value(locy)-gd
        !          2298:       locy=lynl+nodplc(loc+9)
        !          2299:       value(locy)=value(locy)-gspr
        !          2300:       locy=lynl+nodplc(loc+10)
        !          2301:       value(locy)=value(locy)-gd
        !          2302:  1000 loc=nodplc(loc)
        !          2303:       go to 10
        !          2304:       end
        !          2305:       subroutine bjt
        !          2306:       implicit double precision (a-h,o-z)
        !          2307: c
        !          2308: c     this routine processes bjts for dc and transient analyses.
        !          2309: c
        !          2310:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          2311:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          2312:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          2313:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          2314:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          2315:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          2316:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          2317:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          2318:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          2319:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          2320:      2   itemno,nosolv,ipostp,iscrch
        !          2321:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          2322:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          2323:       common /blank/ value(1000)
        !          2324:       integer nodplc(64)
        !          2325:       complex*16 cvalue(32)
        !          2326:       equivalence (value(1),nodplc(1),cvalue(1))
        !          2327: c
        !          2328: c
        !          2329:       dimension vbeo(1),vbco(1),cco(1),cbo(1),gpio(1),gmuo(1),gmo(1),
        !          2330:      1   goo(1),qbe(1),cqbe(1),qbc(1),cqbc(1),qcs(1),cqcs(1),qbx(1),
        !          2331:      2   cqbx(1),gxo(1),cexbc(1)
        !          2332:       equivalence (vbeo(1),value(1)),(vbco(1),value(2)),
        !          2333:      1   (cco(1),value(3)),(cbo(1),value(4)),(gpio(1),value(5)),
        !          2334:      2   (gmuo(1),value(6)),(gmo(1),value(7)),(goo(1),value(8)),
        !          2335:      3   (qbe(1),value(9)),(cqbe(1),value(10)),(qbc(1),value(11)),
        !          2336:      4   (cqbc(1),value(12)),(qcs(1),value(13)),(cqcs(1),value(14)),
        !          2337:      5   (qbx(1),value(15)),(cqbx(1),value(16)),(gxo(1),value(17)),
        !          2338:      6   (cexbc(1),value(18))
        !          2339: c
        !          2340: c
        !          2341:       loc=locate(12)
        !          2342:    10 if (loc.eq.0) return
        !          2343:       locv=nodplc(loc+1)
        !          2344:       node1=nodplc(loc+2)
        !          2345:       node2=nodplc(loc+3)
        !          2346:       node3=nodplc(loc+4)
        !          2347:       node4=nodplc(loc+5)
        !          2348:       node5=nodplc(loc+6)
        !          2349:       node6=nodplc(loc+7)
        !          2350:       node7=nodplc(loc+30)
        !          2351:       locm=nodplc(loc+8)
        !          2352:       ioff=nodplc(loc+9)
        !          2353:       type=nodplc(locm+2)
        !          2354:       locm=nodplc(locm+1)
        !          2355:       loct=nodplc(loc+22)
        !          2356:       gccs=0.0d0
        !          2357:       ceqcs=0.0d0
        !          2358:       geqbx=0.0d0
        !          2359:       ceqbx=0.0d0
        !          2360:       geqcb=0.0d0
        !          2361: c
        !          2362: c  dc model paramters
        !          2363: c
        !          2364:       area=value(locv+1)
        !          2365:       bfm=value(locm+2)
        !          2366:       brm=value(locm+8)
        !          2367:       csat=value(locm+1)*area
        !          2368:       rbpr=value(locm+18)/area
        !          2369:       rbpi=value(locm+16)/area-rbpr
        !          2370:       gcpr=value(locm+20)*area
        !          2371:       gepr=value(locm+19)*area
        !          2372:       ova=value(locm+4)
        !          2373:       ovb=value(locm+10)
        !          2374:       oik=value(locm+5)/area
        !          2375:       c2=value(locm+6)*area
        !          2376:       vte=value(locm+7)*vt
        !          2377:       oikr=value(locm+11)/area
        !          2378:       c4=value(locm+12)*area
        !          2379:       vtc=value(locm+13)*vt
        !          2380:       vcrit=value(locm+54)
        !          2381:       td=value(locm+28)
        !          2382:       xjrb=value(locm+17)*area
        !          2383: c
        !          2384: c  initialization
        !          2385: c
        !          2386:       icheck=1
        !          2387:       go to (100,20,30,50,60,70),initf
        !          2388:    20 if(mode.ne.1.or.modedc.ne.2.or.nosolv.eq.0) go to 25
        !          2389:       vbe=type*value(locv+2)
        !          2390:       vce=type*value(locv+3)
        !          2391:       vbc=vbe-vce
        !          2392:       vbx=vbc
        !          2393:       vcs=0.0d0
        !          2394:       go to 300
        !          2395:    25 if(ioff.ne.0) go to 40
        !          2396:       vbe=vcrit
        !          2397:       vbc=0.0d0
        !          2398:       go to 300
        !          2399:    30 if (ioff.eq.0) go to 100
        !          2400:    40 vbe=0.0d0
        !          2401:       vbc=0.0d0
        !          2402:       go to 300
        !          2403:    50 vbe=vbeo(lx0+loct)
        !          2404:       vbc=vbco(lx0+loct)
        !          2405:       vbx=type*(value(lvnim1+node2)-value(lvnim1+node4))
        !          2406:       vcs=type*(value(lvnim1+node7)-value(lvnim1+node4))
        !          2407:       go to 300
        !          2408:    60 vbe=vbeo(lx1+loct)
        !          2409:       vbc=vbco(lx1+loct)
        !          2410:       vbx=type*(value(lvnim1+node2)-value(lvnim1+node4))
        !          2411:       vcs=type*(value(lvnim1+node7)-value(lvnim1+node4))
        !          2412:       if(mode.ne.2.or.nosolv.eq.0) go to 300
        !          2413:       vbx=type*(value(locv+2)-value(locv+3))
        !          2414:       vcs=0.0d0
        !          2415:       go to 300
        !          2416:    70 xfact=delta/delold(2)
        !          2417:       vbeo(lx0+loct)=vbeo(lx1+loct)
        !          2418:       vbe=(1.0d0+xfact)*vbeo(lx1+loct)-xfact*vbeo(lx2+loct)
        !          2419:       vbco(lx0+loct)=vbco(lx1+loct)
        !          2420:       vbc=(1.0d0+xfact)*vbco(lx1+loct)-xfact*vbco(lx2+loct)
        !          2421:       cco(lx0+loct)=cco(lx1+loct)
        !          2422:       cbo(lx0+loct)=cbo(lx1+loct)
        !          2423:       gpio(lx0+loct)=gpio(lx1+loct)
        !          2424:       gmuo(lx0+loct)=gmuo(lx1+loct)
        !          2425:       gmo(lx0+loct)=gmo(lx1+loct)
        !          2426:       goo(lx0+loct)=goo(lx1+loct)
        !          2427:       go to 110
        !          2428: c
        !          2429: c  compute new nonlinear branch voltages
        !          2430: c
        !          2431:   100 vbe=type*(value(lvnim1+node5)-value(lvnim1+node6))
        !          2432:       vbc=type*(value(lvnim1+node5)-value(lvnim1+node4))
        !          2433:   110 delvbe=vbe-vbeo(lx0+loct)
        !          2434:       delvbc=vbc-vbco(lx0+loct)
        !          2435:       vbx=type*(value(lvnim1+node2)-value(lvnim1+node4))
        !          2436:       vcs=type*(value(lvnim1+node7)-value(lvnim1+node4))
        !          2437:       cchat=cco(lx0+loct)+(gmo(lx0+loct)+goo(lx0+loct))*delvbe
        !          2438:      1   -(goo(lx0+loct)+gmuo(lx0+loct))*delvbc
        !          2439:       cbhat=cbo(lx0+loct)+gpio(lx0+loct)*delvbe+gmuo(lx0+loct)*delvbc
        !          2440: c
        !          2441: c  limit nonlinear branch voltages
        !          2442: c
        !          2443:   200 icheck=0
        !          2444:       call pnjlim(vbe,vbeo(lx0+loct),vt,vcrit,icheck)
        !          2445:       call pnjlim(vbc,vbco(lx0+loct),vt,vcrit,icheck)
        !          2446: c
        !          2447: c  determine dc current and derivitives
        !          2448: c
        !          2449:   300 vtn=vt*value(locm+3)
        !          2450:       if(vbe.le.-5.0d0*vtn) go to 320
        !          2451:       evbe=dexp(vbe/vtn)
        !          2452:       cbe=csat*(evbe-1.0d0)+gmin*vbe
        !          2453:       gbe=csat*evbe/vtn+gmin
        !          2454:       if (c2.ne.0.0d0) go to 310
        !          2455:       cben=0.0d0
        !          2456:       gben=0.0d0
        !          2457:       go to 350
        !          2458:   310 evben=dexp(vbe/vte)
        !          2459:       cben=c2*(evben-1.0d0)
        !          2460:       gben=c2*evben/vte
        !          2461:       go to 350
        !          2462:   320 gbe=-csat/vbe+gmin
        !          2463:       cbe=gbe*vbe
        !          2464:       gben=-c2/vbe
        !          2465:       cben=gben*vbe
        !          2466:   350 vtn=vt*value(locm+9)
        !          2467:       if(vbc.le.-5.0d0*vtn) go to 370
        !          2468:       evbc=dexp(vbc/vtn)
        !          2469:       cbc=csat*(evbc-1.0d0)+gmin*vbc
        !          2470:       gbc=csat*evbc/vtn+gmin
        !          2471:       if (c4.ne.0.0d0) go to 360
        !          2472:       cbcn=0.0d0
        !          2473:       gbcn=0.0d0
        !          2474:       go to 400
        !          2475:   360 evbcn=dexp(vbc/vtc)
        !          2476:       cbcn=c4*(evbcn-1.0d0)
        !          2477:       gbcn=c4*evbcn/vtc
        !          2478:       go to 400
        !          2479:   370 gbc=-csat/vbc+gmin
        !          2480:       cbc=gbc*vbc
        !          2481:       gbcn=-c4/vbc
        !          2482:       cbcn=gbcn*vbc
        !          2483: c
        !          2484: c  determine base charge terms
        !          2485: c
        !          2486:   400 q1=1.0d0/(1.0d0-ova*vbc-ovb*vbe)
        !          2487:       if (oik.ne.0.0d0) go to 405
        !          2488:       if (oikr.ne.0.0d0) go to 405
        !          2489:       qb=q1
        !          2490:       dqbdve=q1*qb*ovb
        !          2491:       dqbdvc=q1*qb*ova
        !          2492:       go to 410
        !          2493:   405 q2=oik*cbe+oikr*cbc
        !          2494:       arg=dmax1(0.0d0,1.0d0+4.0d0*q2)
        !          2495:       sqarg=1.0d0
        !          2496:       if(arg.ne.0.0d0) sqarg=dsqrt(arg)
        !          2497:       qb=q1*(1.0d0+sqarg)/2.0d0
        !          2498:       dqbdve=q1*(qb*ovb+oik*gbe/sqarg)
        !          2499:       dqbdvc=q1*(qb*ova+oikr*gbc/sqarg)
        !          2500: c
        !          2501: c  weil's approx. for excess phase applied with backward-
        !          2502: c  euler integration
        !          2503: c
        !          2504:   410 cc=0.0d0
        !          2505:       cex=cbe
        !          2506:       gex=gbe
        !          2507:       if(mode.eq.1) go to 420
        !          2508:       if(td.eq.0.0d0) go to 420
        !          2509:       arg1=delta/td
        !          2510:       arg2=3.0d0*arg1
        !          2511:       arg1=arg2*arg1
        !          2512:       denom=1.0d0+arg1+arg2
        !          2513:       arg3=arg1/denom
        !          2514:       if(initf.ne.5) go to 411
        !          2515:       cexbc(lx1+loct)=cbe/qb
        !          2516:       cexbc(lx2+loct)=cexbc(lx1+loct)
        !          2517:   411 cc=(cexbc(lx1+loct)*(1.0d0+delta/delold(2)+arg2)
        !          2518:      1  -cexbc(lx2+loct)*delta/delold(2))/denom
        !          2519:       cex=cbe*arg3
        !          2520:       gex=gbe*arg3
        !          2521:       cexbc(lx0+loct)=cc+cex/qb
        !          2522: c
        !          2523: c  determine dc incremental conductances
        !          2524: c
        !          2525:   420 cc=cc+(cex-cbc)/qb-cbc/brm-cbcn
        !          2526:       cb=cbe/bfm+cben+cbc/brm+cbcn
        !          2527:       gx=rbpr+rbpi/qb
        !          2528:       if(xjrb.eq.0.0d0) go to 430
        !          2529:       arg1=dmax1(cb/xjrb,1.0d-9)
        !          2530:       arg2=(-1.0d0+dsqrt(1.0d0+14.59025d0*arg1))/2.4317d0/dsqrt(arg1)
        !          2531:       arg1=dtan(arg2)
        !          2532:       gx=rbpr+3.0d0*rbpi*(arg1-arg2)/arg2/arg1/arg1
        !          2533:   430 if(gx.ne.0.0d0) gx=1.0d0/gx
        !          2534:       gpi=gbe/bfm+gben
        !          2535:       gmu=gbc/brm+gbcn
        !          2536:       go=(gbc+(cex-cbc)*dqbdvc/qb)/qb
        !          2537:       gm=(gex-(cex-cbc)*dqbdve/qb)/qb-go
        !          2538:       if (mode.ne.1) go to 500
        !          2539:       if ((modedc.eq.2).and.(nosolv.ne.0)) go to 500
        !          2540:       if (initf.eq.4) go to 500
        !          2541:       go to 700
        !          2542: c
        !          2543: c  charge storage elements
        !          2544: c
        !          2545:   500 tf=value(locm+24)
        !          2546:       tr=value(locm+33)
        !          2547:       czbe=value(locm+21)*area
        !          2548:       pe=value(locm+22)
        !          2549:       xme=value(locm+23)
        !          2550:       cdis=value(locm+32)
        !          2551:       ctot=value(locm+29)*area
        !          2552:       czbc=ctot*cdis
        !          2553:       czbx=ctot-czbc
        !          2554:       pc=value(locm+30)
        !          2555:       xmc=value(locm+31)
        !          2556:       fcpe=value(locm+46)
        !          2557:       czcs=value(locm+38)*area
        !          2558:       ps=value(locm+39)
        !          2559:       xms=value(locm+40)
        !          2560:       xtf=value(locm+25)
        !          2561:       ovtf=value(locm+26)
        !          2562:       xjtf=value(locm+27)*area
        !          2563:       if(tf.eq.0.0d0) go to 505
        !          2564:       if(vbe.le.0.0d0) go to 505
        !          2565:       argtf=0.0d0
        !          2566:       arg2=0.0d0
        !          2567:       arg3=0.0d0
        !          2568:       if(xtf.eq.0.0d0) go to 504
        !          2569:       argtf=xtf
        !          2570:       if(ovtf.ne.0.0d0) argtf=argtf*dexp(vbc*ovtf)
        !          2571:       arg2=argtf
        !          2572:       if(xjtf.eq.0.0d0) go to 503
        !          2573:       temp=cbe/(cbe+xjtf)
        !          2574:       argtf=argtf*temp*temp
        !          2575:       arg2=argtf*(3.0d0-temp-temp)
        !          2576:   503 arg3=cbe*argtf*ovtf
        !          2577:   504 cbe=cbe*(1.0d0+argtf)/qb
        !          2578:       gbe=(gbe*(1.0d0+arg2)-cbe*dqbdve)/qb
        !          2579:       geqcb=tf*(arg3-cbe*dqbdvc)/qb
        !          2580:   505 if (vbe.ge.fcpe) go to 510
        !          2581:       arg=1.0d0-vbe/pe
        !          2582:       sarg=dexp(-xme*dlog(arg))
        !          2583:       qbe(lx0+loct)=tf*cbe+pe*czbe*(1.0d0-arg*sarg)/(1.0d0-xme)
        !          2584:       capbe=tf*gbe+czbe*sarg
        !          2585:       go to 520
        !          2586:   510 f1=value(locm+47)
        !          2587:       f2=value(locm+48)
        !          2588:       f3=value(locm+49)
        !          2589:       czbef2=czbe/f2
        !          2590:       qbe(lx0+loct)=tf*cbe+czbe*f1+czbef2*(f3*(vbe-fcpe)
        !          2591:      1   +(xme/(pe+pe))*(vbe*vbe-fcpe*fcpe))
        !          2592:       capbe=tf*gbe+czbef2*(f3+xme*vbe/pe)
        !          2593:   520 fcpc=value(locm+50)
        !          2594:       f1=value(locm+51)
        !          2595:       f2=value(locm+52)
        !          2596:       f3=value(locm+53)
        !          2597:       if (vbc.ge.fcpc) go to 530
        !          2598:       arg=1.0d0-vbc/pc
        !          2599:       sarg=dexp(-xmc*dlog(arg))
        !          2600:       qbc(lx0+loct)=tr*cbc+pc*czbc*(1.0d0-arg*sarg)/(1.0d0-xmc)
        !          2601:       capbc=tr*gbc+czbc*sarg
        !          2602:       go to 540
        !          2603:   530 czbcf2=czbc/f2
        !          2604:       qbc(lx0+loct)=tr*cbc+czbc*f1+czbcf2*(f3*(vbc-fcpc)
        !          2605:      1   +(xmc/(pc+pc))*(vbc*vbc-fcpc*fcpc))
        !          2606:       capbc=tr*gbc+czbcf2*(f3+xmc*vbc/pc)
        !          2607:   540 if(vbx.ge.fcpc) go to 550
        !          2608:       arg=1.0d0-vbx/pc
        !          2609:       sarg=dexp(-xmc*dlog(arg))
        !          2610:       qbx(lx0+loct)=pc*czbx*(1.0d0-arg*sarg)/(1.0d0-xmc)
        !          2611:       capbx=czbx*sarg
        !          2612:       go to 560
        !          2613:   550 czbxf2=czbx/f2
        !          2614:       qbx(lx0+loct)=czbx*f1+czbxf2*(f3*(vbx-fcpc)+(xmc/(pc+pc))*
        !          2615:      1   (vbx*vbx-fcpc*fcpc))
        !          2616:       capbx=czbxf2*(f3+xmc*vbx/pc)
        !          2617:   560 if(vcs.ge.0.0d0) go to 570
        !          2618:       arg=1.0d0-vcs/ps
        !          2619:       sarg=dexp(-xms*dlog(arg))
        !          2620:       qcs(lx0+loct)=ps*czcs*(1.0d0-arg*sarg)/(1.0d0-xms)
        !          2621:       capcs=czcs*sarg
        !          2622:       go to 580
        !          2623:   570 qcs(lx0+loct)=vcs*czcs*(1.0d0+xms*vcs/(2.0d0*ps))
        !          2624:       capcs=czcs*(1.0d0+xms*vcs/ps)
        !          2625: c
        !          2626: c  store small-signal parameters
        !          2627: c
        !          2628:   580 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 700
        !          2629:       if (initf.ne.4) go to 600
        !          2630:       value(lx0+loct+9)=capbe
        !          2631:       value(lx0+loct+11)=capbc
        !          2632:       value(lx0+loct+13)=capcs
        !          2633:       value(lx0+loct+15)=capbx
        !          2634:       value(lx0+loct+17)=geqcb
        !          2635:       go to 1000
        !          2636: c
        !          2637: c  transient analysis
        !          2638: c
        !          2639:   600 if (initf.ne.5) go to 610
        !          2640:       qbe(lx1+loct)=qbe(lx0+loct)
        !          2641:       qbc(lx1+loct)=qbc(lx0+loct)
        !          2642:       qbx(lx1+loct)=qbx(lx0+loct)
        !          2643:       qcs(lx1+loct)=qcs(lx0+loct)
        !          2644:   610 call intgr8(geq,ceq,capbe,loct+8)
        !          2645:       geqcb=geqcb*ag(1)
        !          2646:       gpi=gpi+geq
        !          2647:       cb=cb+cqbe(lx0+loct)
        !          2648:       call intgr8(geq,ceq,capbc,loct+10)
        !          2649:       gmu=gmu+geq
        !          2650:       cb=cb+cqbc(lx0+loct)
        !          2651:       cc=cc-cqbc(lx0+loct)
        !          2652:       call intgr8(gccs,ceq,capcs,loct+12)
        !          2653:       ceqcs=type*(cqcs(lx0+loct)-vcs*gccs)
        !          2654:       call intgr8(geqbx,ceq,capbx,loct+14)
        !          2655:       ceqbx=type*(cqbx(lx0+loct)-vbx*geqbx)
        !          2656:       if (initf.ne.5) go to 700
        !          2657:       cqbe(lx1+loct)=cqbe(lx0+loct)
        !          2658:       cqbc(lx1+loct)=cqbc(lx0+loct)
        !          2659:       cqbx(lx1+loct)=cqbx(lx0+loct)
        !          2660:       cqcs(lx1+loct)=cqcs(lx0+loct)
        !          2661: c
        !          2662: c  check convergence
        !          2663: c
        !          2664:   700 if (initf.ne.3) go to 710
        !          2665:       if (ioff.eq.0) go to 710
        !          2666:       go to 750
        !          2667:   710 if (icheck.eq.1) go to 720
        !          2668:       tol=reltol*dmax1(dabs(cchat),dabs(cc))+abstol
        !          2669:       if (dabs(cchat-cc).gt.tol) go to 720
        !          2670:       tol=reltol*dmax1(dabs(cbhat),dabs(cb))+abstol
        !          2671:       if (dabs(cbhat-cb).le.tol) go to 750
        !          2672:   720 noncon=noncon+1
        !          2673:   750 vbeo(lx0+loct)=vbe
        !          2674:       vbco(lx0+loct)=vbc
        !          2675:       cco(lx0+loct)=cc
        !          2676:       cbo(lx0+loct)=cb
        !          2677:       gpio(lx0+loct)=gpi
        !          2678:       gmuo(lx0+loct)=gmu
        !          2679:       gmo(lx0+loct)=gm
        !          2680:       goo(lx0+loct)=go
        !          2681:       gxo(lx0+loct)=gx
        !          2682: c
        !          2683: c  load current excitation vector
        !          2684: c
        !          2685:   900 ceqbe=type*(cc+cb-vbe*(gm+go+gpi)+vbc*(go-geqcb))
        !          2686:       ceqbc=type*(-cc+vbe*(gm+go)-vbc*(gmu+go))
        !          2687:       value(lvn+node2)=value(lvn+node2)-ceqbx
        !          2688:       value(lvn+node4)=value(lvn+node4)+ceqcs+ceqbx+ceqbc
        !          2689:       value(lvn+node5)=value(lvn+node5)-ceqbe-ceqbc
        !          2690:       value(lvn+node6)=value(lvn+node6)+ceqbe
        !          2691:       value(lvn+node7)=value(lvn+node7)-ceqcs
        !          2692: c
        !          2693: c  load y matrix
        !          2694: c
        !          2695:       locy=lynl+nodplc(loc+24)
        !          2696:       value(locy)=value(locy)+gcpr
        !          2697:       locy=lynl+nodplc(loc+25)
        !          2698:       value(locy)=value(locy)+gx+geqbx
        !          2699:       locy=lynl+nodplc(loc+26)
        !          2700:       value(locy)=value(locy)+gepr
        !          2701:       locy=lynl+nodplc(loc+27)
        !          2702:       value(locy)=value(locy)+gmu+go+gcpr+gccs+geqbx
        !          2703:       locy=lynl+nodplc(loc+28)
        !          2704:       value(locy)=value(locy)+gx  +gpi+gmu+geqcb
        !          2705:       locy=lynl+nodplc(loc+29)
        !          2706:       value(locy)=value(locy)+gpi+gepr+gm+go
        !          2707:       locy=lynl+nodplc(loc+10)
        !          2708:       value(locy)=value(locy)-gcpr
        !          2709:       locy=lynl+nodplc(loc+11)
        !          2710:       value(locy)=value(locy)-gx
        !          2711:       locy=lynl+nodplc(loc+12)
        !          2712:       value(locy)=value(locy)-gepr
        !          2713:       locy=lynl+nodplc(loc+13)
        !          2714:       value(locy)=value(locy)-gcpr
        !          2715:       locy=lynl+nodplc(loc+14)
        !          2716:       value(locy)=value(locy)-gmu+gm
        !          2717:       locy=lynl+nodplc(loc+15)
        !          2718:       value(locy)=value(locy)-gm-go
        !          2719:       locy=lynl+nodplc(loc+16)
        !          2720:       value(locy)=value(locy)-gx
        !          2721:       locy=lynl+nodplc(loc+17)
        !          2722:       value(locy)=value(locy)-gmu-geqcb
        !          2723:       locy=lynl+nodplc(loc+18)
        !          2724:       value(locy)=value(locy)-gpi
        !          2725:       locy=lynl+nodplc(loc+19)
        !          2726:       value(locy)=value(locy)-gepr
        !          2727:       locy=lynl+nodplc(loc+20)
        !          2728:       value(locy)=value(locy)-go+geqcb
        !          2729:       locy=lynl+nodplc(loc+21)
        !          2730:       value(locy)=value(locy)-gpi-gm-geqcb
        !          2731:       locy=lynl+nodplc(loc+31)
        !          2732:       value(locy)=value(locy)+gccs
        !          2733:       locy=lynl+nodplc(loc+32)
        !          2734:       value(locy)=value(locy)-gccs
        !          2735:       locy=lynl+nodplc(loc+33)
        !          2736:       value(locy)=value(locy)-gccs
        !          2737:       locy=lynl+nodplc(loc+34)
        !          2738:       value(locy)=value(locy)-geqbx
        !          2739:       locy=lynl+nodplc(loc+35)
        !          2740:       value(locy)=value(locy)-geqbx
        !          2741:  1000 loc=nodplc(loc)
        !          2742:       go to 10
        !          2743:       end
        !          2744:       subroutine fetlim(vnew,vold,vto,icheck)
        !          2745: c     
        !          2746: c     *** fetlim is not used in this version ***
        !          2747: c     *   if problems arrise with the conver-  *
        !          2748: c     *   gence of MOSFET circuit it should be *
        !          2749: c     *   re-installed.   R.Newton.            *
        !          2750: c     ***                                    ***
        !          2751: c
        !          2752:       return
        !          2753:       end
        !          2754:       subroutine jfet
        !          2755:       implicit double precision (a-h,o-z)
        !          2756: c
        !          2757: c     this routine processes jfets for dc and transient analyses.
        !          2758: c
        !          2759:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          2760:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          2761:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          2762:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          2763:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          2764:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          2765:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          2766:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          2767:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          2768:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          2769:      2   itemno,nosolv,ipostp,iscrch
        !          2770:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          2771:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          2772:       common /blank/ value(1000)
        !          2773:       integer nodplc(64)
        !          2774:       complex*16 cvalue(32)
        !          2775:       equivalence (value(1),nodplc(1),cvalue(1))
        !          2776: c
        !          2777: c
        !          2778:       dimension vgso(1),vgdo(1),cgo(1),cdo(1),cgdo(1),gmo(1),gdso(1),
        !          2779:      1   ggso(1),ggdo(1),qgs(1),cqgs(1),qgd(1),cqgd(1)
        !          2780:       equivalence (vgso(1),value( 1)),(vgdo(1),value( 2)),
        !          2781:      1            (cgo (1),value( 3)),(cdo (1),value( 4)),
        !          2782:      2            (cgdo(1),value( 5)),(gmo (1),value( 6)),
        !          2783:      3            (gdso(1),value( 7)),(ggso(1),value( 8)),
        !          2784:      4            (ggdo(1),value( 9)),(qgs (1),value(10)),
        !          2785:      5            (cqgs(1),value(11)),(qgd (1),value(12)),
        !          2786:      6            (cqgd(1),value(13))
        !          2787: c
        !          2788: c
        !          2789:       loc=locate(13)
        !          2790:    10 if (loc.eq.0) return
        !          2791:       locv=nodplc(loc+1)
        !          2792:       node1=nodplc(loc+2)
        !          2793:       node2=nodplc(loc+3)
        !          2794:       node3=nodplc(loc+4)
        !          2795:       node4=nodplc(loc+5)
        !          2796:       node5=nodplc(loc+6)
        !          2797:       locm=nodplc(loc+7)
        !          2798:       ioff=nodplc(loc+8)
        !          2799:       type=nodplc(locm+2)
        !          2800:       locm=nodplc(locm+1)
        !          2801:       loct=nodplc(loc+19)
        !          2802: c
        !          2803: c  dc model parameters
        !          2804: c
        !          2805:       area=value(locv+1)
        !          2806:       vto=value(locm+1)
        !          2807:       beta=value(locm+2)*area
        !          2808:       xlamb=value(locm+3)
        !          2809:       gdpr=value(locm+4)*area
        !          2810:       gspr=value(locm+5)*area
        !          2811:       csat=value(locm+9)*area
        !          2812:       vcrit=value(locm+16)
        !          2813: c
        !          2814: c  initialization
        !          2815: c
        !          2816:       icheck=1
        !          2817:       go to (100,20,30,50,60,70), initf
        !          2818:    20 if(mode.ne.1.or.modedc.ne.2.or.nosolv.eq.0) go to 25
        !          2819:       vds=type*value(locv+2)
        !          2820:       vgs=type*value(locv+3)
        !          2821:       vgd=vgs-vds
        !          2822:       go to 300
        !          2823:    25 if(ioff.ne.0) go to 40
        !          2824:       vgs=-1.0d0
        !          2825:       vgd=-1.0d0
        !          2826:       go to 300
        !          2827:    30 if (ioff.eq.0) go to 100
        !          2828:    40 vgs=0.0d0
        !          2829:       vgd=0.0d0
        !          2830:       go to 300
        !          2831:    50 vgs=vgso(lx0+loct)
        !          2832:       vgd=vgdo(lx0+loct)
        !          2833:       go to 300
        !          2834:    60 vgs=vgso(lx1+loct)
        !          2835:       vgd=vgdo(lx1+loct)
        !          2836:       go to 300
        !          2837:    70 xfact=delta/delold(2)
        !          2838:       vgso(lx0+loct)=vgso(lx1+loct)
        !          2839:       vgs=(1.0d0+xfact)*vgso(lx1+loct)-xfact*vgso(lx2+loct)
        !          2840:       vgdo(lx0+loct)=vgdo(lx1+loct)
        !          2841:       vgd=(1.0d0+xfact)*vgdo(lx1+loct)-xfact*vgdo(lx2+loct)
        !          2842:       cgo(lx0+loct)=cgo(lx1+loct)
        !          2843:       cdo(lx0+loct)=cdo(lx1+loct)
        !          2844:       cgdo(lx0+loct)=cgdo(lx1+loct)
        !          2845:       gmo(lx0+loct)=gmo(lx1+loct)
        !          2846:       gdso(lx0+loct)=gdso(lx1+loct)
        !          2847:       ggso(lx0+loct)=ggso(lx1+loct)
        !          2848:       ggdo(lx0+loct)=ggdo(lx1+loct)
        !          2849:       go to 110
        !          2850: c
        !          2851: c  compute new nonlinear branch voltages
        !          2852: c
        !          2853:   100 vgs=type*(value(lvnim1+node2)-value(lvnim1+node5))
        !          2854:       vgd=type*(value(lvnim1+node2)-value(lvnim1+node4))
        !          2855:   110 delvgs=vgs-vgso(lx0+loct)
        !          2856:       delvgd=vgd-vgdo(lx0+loct)
        !          2857:       delvds=delvgs-delvgd
        !          2858:       cghat=cgo(lx0+loct)+ggdo(lx0+loct)*delvgd+ggso(lx0+loct)*delvgs
        !          2859:       cdhat=cdo(lx0+loct)+gmo(lx0+loct)*delvgs+gdso(lx0+loct)*delvds
        !          2860:      1   -ggdo(lx0+loct)*delvgd
        !          2861: c
        !          2862: c  bypass if solution has not changed
        !          2863: c
        !          2864:       if (initf.eq.6) go to 200
        !          2865:       tol=reltol*dmax1(dabs(vgs),dabs(vgso(lx0+loct)))+vntol
        !          2866:       if (dabs(delvgs).ge.tol) go to 200
        !          2867:       tol=reltol*dmax1(dabs(vgd),dabs(vgdo(lx0+loct)))+vntol
        !          2868:       if (dabs(delvgd).ge.tol) go to 200
        !          2869:       tol=reltol*dmax1(dabs(cghat),dabs(cgo(lx0+loct)))+abstol
        !          2870:       if (dabs(cghat-cgo(lx0+loct)).ge.tol) go to 200
        !          2871:       tol=reltol*dmax1(dabs(cdhat),dabs(cdo(lx0+loct)))+abstol
        !          2872:       if (dabs(cdhat-cdo(lx0+loct)).ge.tol) go to 200
        !          2873:       vgs=vgso(lx0+loct)
        !          2874:       vgd=vgdo(lx0+loct)
        !          2875:       vds=vgs-vgd
        !          2876:       cg=cgo(lx0+loct)
        !          2877:       cd=cdo(lx0+loct)
        !          2878:       cgd=cgdo(lx0+loct)
        !          2879:       gm=gmo(lx0+loct)
        !          2880:       gds=gdso(lx0+loct)
        !          2881:       ggs=ggso(lx0+loct)
        !          2882:       ggd=ggdo(lx0+loct)
        !          2883:       go to 900
        !          2884: c
        !          2885: c  limit nonlinear branch voltages
        !          2886: c
        !          2887:   200 icheck=0
        !          2888:       call pnjlim(vgs,vgso(lx0+loct),vt,vcrit,icheck)
        !          2889:       call pnjlim(vgd,vgdo(lx0+loct),vt,vcrit,icheck)
        !          2890:       call fetlim(vgs,vgso(lx0+loct),vto,icheck)
        !          2891:       call fetlim(vgd,vgdo(lx0+loct),vto,icheck)
        !          2892: c
        !          2893: c  determine dc current and derivatives
        !          2894: c
        !          2895:   300 vds=vgs-vgd
        !          2896:       if (vgs.gt.-5.0d0*vt) go to 310
        !          2897:       ggs=-csat/vgs+gmin
        !          2898:       cg=ggs*vgs
        !          2899:       go to 320
        !          2900:   310 evgs=dexp(vgs/vt)
        !          2901:       ggs=csat*evgs/vt+gmin
        !          2902:       cg=csat*(evgs-1.0d0)+gmin*vgs
        !          2903:   320 if (vgd.gt.-5.0d0*vt) go to 330
        !          2904:       ggd=-csat/vgd+gmin
        !          2905:       cgd=ggd*vgd
        !          2906:       go to 340
        !          2907:   330 evgd=dexp(vgd/vt)
        !          2908:       ggd=csat*evgd/vt+gmin
        !          2909:       cgd=csat*(evgd-1.0d0)+gmin*vgd
        !          2910:   340 cg=cg+cgd
        !          2911: c
        !          2912: c  compute drain current and derivitives for normal mode
        !          2913: c
        !          2914:   400 if (vds.lt.0.0d0) go to 450
        !          2915:       vgst=vgs-vto
        !          2916: c
        !          2917: c  normal mode, cutoff region
        !          2918: c
        !          2919:       if (vgst.gt.0.0d0) go to 410
        !          2920:       cdrain=0.0d0
        !          2921:       gm=0.0d0
        !          2922:       gds=0.0d0
        !          2923:       go to 490
        !          2924: c
        !          2925: c  normal mode, saturation region
        !          2926: c
        !          2927:   410 betap=beta*(1.0d0+xlamb*vds)
        !          2928:       twob=betap+betap
        !          2929:       if (vgst.gt.vds) go to 420
        !          2930:       cdrain=betap*vgst*vgst
        !          2931:       gm=twob*vgst
        !          2932:       gds=xlamb*beta*vgst*vgst
        !          2933:       go to 490
        !          2934: c
        !          2935: c  normal mode, linear region
        !          2936: c
        !          2937:   420 cdrain=betap*vds*(vgst+vgst-vds)
        !          2938:       gm=twob*vds
        !          2939:       gds=twob*(vgst-vds)+xlamb*beta*vds*(vgst+vgst-vds)
        !          2940:       go to 490
        !          2941: c
        !          2942: c  compute drain current and derivitives for inverse mode
        !          2943: c
        !          2944:   450 vgdt=vgd-vto
        !          2945: c
        !          2946: c  inverse mode, cutoff region
        !          2947: c
        !          2948:       if (vgdt.gt.0.0d0) go to 460
        !          2949:       cdrain=0.0d0
        !          2950:       gm=0.0d0
        !          2951:       gds=0.0d0
        !          2952:       go to 490
        !          2953: c
        !          2954: c  inverse mode, saturation region
        !          2955: c
        !          2956:   460 betap=beta*(1.0d0-xlamb*vds)
        !          2957:       twob=betap+betap
        !          2958:       if (vgdt.gt.-vds) go to 470
        !          2959:       cdrain=-betap*vgdt*vgdt
        !          2960:       gm=-twob*vgdt
        !          2961:       gds=xlamb*beta*vgdt*vgdt-gm
        !          2962:       go to 490
        !          2963: c
        !          2964: c  inverse mode, linear region
        !          2965: c
        !          2966:   470 cdrain=betap*vds*(vgdt+vgdt+vds)
        !          2967:       gm=twob*vds
        !          2968:       gds=twob*vgdt-xlamb*beta*vds*(vgdt+vgdt+vds)
        !          2969: c
        !          2970: c  compute equivalent drain current source
        !          2971: c
        !          2972:   490 cd=cdrain-cgd
        !          2973:       if (mode.ne.1) go to 500
        !          2974:       if ((modedc.eq.2).and.(nosolv.ne.0)) go to 500
        !          2975:       if (initf.eq.4) go to 500
        !          2976:       go to 700
        !          2977: c
        !          2978: c  charge storage elements
        !          2979: c
        !          2980:   500 czgs=value(locm+6)*area
        !          2981:       czgd=value(locm+7)*area
        !          2982:       phib=value(locm+8)
        !          2983:       twop=phib+phib
        !          2984:       fcpb=value(locm+12)
        !          2985:       fcpb2=fcpb*fcpb
        !          2986:       f1=value(locm+13)
        !          2987:       f2=value(locm+14)
        !          2988:       f3=value(locm+15)
        !          2989:       czgsf2=czgs/f2
        !          2990:       czgdf2=czgd/f2
        !          2991:       if (vgs.ge.fcpb) go to 510
        !          2992:       sarg=dsqrt(1.0d0-vgs/phib)
        !          2993:       qgs(lx0+loct)=twop*czgs*(1.0d0-sarg)
        !          2994:       capgs=czgs/sarg
        !          2995:       go to 520
        !          2996:   510 qgs(lx0+loct)=czgs*f1+czgsf2*(f3*(vgs-fcpb)
        !          2997:      1   +(vgs*vgs-fcpb2)/(twop+twop))
        !          2998:       capgs=czgsf2*(f3+vgs/twop)
        !          2999:   520 if (vgd.ge.fcpb) go to 530
        !          3000:       sarg=dsqrt(1.0d0-vgd/phib)
        !          3001:       qgd(lx0+loct)=twop*czgd*(1.0d0-sarg)
        !          3002:       capgd=czgd/sarg
        !          3003:       go to 560
        !          3004:   530 qgd(lx0+loct)=czgd*f1+czgdf2*(f3*(vgd-fcpb)
        !          3005:      1   +(vgd*vgd-fcpb2)/(twop+twop))
        !          3006:       capgd=czgdf2*(f3+vgd/twop)
        !          3007: c
        !          3008: c  store small-signal parameters
        !          3009: c
        !          3010:   560 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 700
        !          3011:       if (initf.ne.4) go to 600
        !          3012:       value(lx0+loct+9)=capgs
        !          3013:       value(lx0+loct+11)=capgd
        !          3014:       go to 1000
        !          3015: c
        !          3016: c  transient analysis
        !          3017: c
        !          3018:   600 if (initf.ne.5) go to 610
        !          3019:       qgs(lx1+loct)=qgs(lx0+loct)
        !          3020:       qgd(lx1+loct)=qgd(lx0+loct)
        !          3021:   610 call intgr8(geq,ceq,capgs,loct+9)
        !          3022:       ggs=ggs+geq
        !          3023:       cg=cg+cqgs(lx0+loct)
        !          3024:       call intgr8(geq,ceq,capgd,loct+11)
        !          3025:       ggd=ggd+geq
        !          3026:       cg=cg+cqgd(lx0+loct)
        !          3027:       cd=cd-cqgd(lx0+loct)
        !          3028:       cgd=cgd+cqgd(lx0+loct)
        !          3029:       if (initf.ne.5) go to 700
        !          3030:       cqgs(lx1+loct)=cqgs(lx0+loct)
        !          3031:       cqgd(lx1+loct)=cqgd(lx0+loct)
        !          3032: c
        !          3033: c  check convergence
        !          3034: c
        !          3035:   700 if (initf.ne.3) go to 710
        !          3036:       if (ioff.eq.0) go to 710
        !          3037:       go to 750
        !          3038:   710 if (icheck.eq.1) go to 720
        !          3039:       tol=reltol*dmax1(dabs(cghat),dabs(cg))+abstol
        !          3040:       if (dabs(cghat-cg).ge.tol) go to 720
        !          3041:       tol=reltol*dmax1(dabs(cdhat),dabs(cd))+abstol
        !          3042:       if (dabs(cdhat-cd).le.tol) go to 750
        !          3043:   720 noncon=noncon+1
        !          3044:   750 vgso(lx0+loct)=vgs
        !          3045:       vgdo(lx0+loct)=vgd
        !          3046:       cgo(lx0+loct)=cg
        !          3047:       cdo(lx0+loct)=cd
        !          3048:       cgdo(lx0+loct)=cgd
        !          3049:       gmo(lx0+loct)=gm
        !          3050:       gdso(lx0+loct)=gds
        !          3051:       ggso(lx0+loct)=ggs
        !          3052:       ggdo(lx0+loct)=ggd
        !          3053: c
        !          3054: c  load current vector
        !          3055: c
        !          3056:   900 ceqgd=type*(cgd-ggd*vgd)
        !          3057:       ceqgs=type*((cg-cgd)-ggs*vgs)
        !          3058:       cdreq=type*((cd+cgd)-gds*vds-gm*vgs)
        !          3059:       value(lvn+node2)=value(lvn+node2)-ceqgs-ceqgd
        !          3060:       value(lvn+node4)=value(lvn+node4)-cdreq+ceqgd
        !          3061:       value(lvn+node5)=value(lvn+node5)+cdreq+ceqgs
        !          3062: c
        !          3063: c  load y matrix
        !          3064: c
        !          3065:       locy=lynl+nodplc(loc+20)
        !          3066:       value(locy)=value(locy)+gdpr
        !          3067:       locy=lynl+nodplc(loc+21)
        !          3068:       value(locy)=value(locy)+ggd+ggs
        !          3069:       locy=lynl+nodplc(loc+22)
        !          3070:       value(locy)=value(locy)+gspr
        !          3071:       locy=lynl+nodplc(loc+23)
        !          3072:       value(locy)=value(locy)+gdpr+gds+ggd
        !          3073:       locy=lynl+nodplc(loc+24)
        !          3074:       value(locy)=value(locy)+gspr+gds+gm+ggs
        !          3075:       locy=lynl+nodplc(loc+9)
        !          3076:       value(locy)=value(locy)-gdpr
        !          3077:       locy=lynl+nodplc(loc+10)
        !          3078:       value(locy)=value(locy)-ggd
        !          3079:       locy=lynl+nodplc(loc+11)
        !          3080:       value(locy)=value(locy)-ggs
        !          3081:       locy=lynl+nodplc(loc+12)
        !          3082:       value(locy)=value(locy)-gspr
        !          3083:       locy=lynl+nodplc(loc+13)
        !          3084:       value(locy)=value(locy)-gdpr
        !          3085:       locy=lynl+nodplc(loc+14)
        !          3086:       value(locy)=value(locy)+gm-ggd
        !          3087:       locy=lynl+nodplc(loc+15)
        !          3088:       value(locy)=value(locy)-gds-gm
        !          3089:       locy=lynl+nodplc(loc+16)
        !          3090:       value(locy)=value(locy)-ggs-gm
        !          3091:       locy=lynl+nodplc(loc+17)
        !          3092:       value(locy)=value(locy)-gspr
        !          3093:       locy=lynl+nodplc(loc+18)
        !          3094:       value(locy)=value(locy)-gds
        !          3095:  1000 loc=nodplc(loc)
        !          3096:       go to 10
        !          3097:       end
        !          3098:       subroutine mosfet
        !          3099:       implicit double precision (a-h,o-z)
        !          3100: c
        !          3101: c     this routine processes mosfets for dc and transient analyses.
        !          3102: c
        !          3103:       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
        !          3104:      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
        !          3105:      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
        !          3106:      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
        !          3107:      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
        !          3108:      5   imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
        !          3109:       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
        !          3110:      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
        !          3111:       common /mosarg/ gamma,beta,vto,phi,cox,vbi,xnfs,xnsub,xd,xj,xl,
        !          3112:      1   xlamda,utra,uexp,vbp,von,vdsat,theta,vcrit,vtra,gleff,cdrain
        !          3113:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          3114:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          3115:      2   itemno,nosolv,ipostp,iscrch
        !          3116:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          3117:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          3118:       common /blank/ value(1000)
        !          3119:       integer nodplc(64)
        !          3120:       complex*16 cvalue(32)
        !          3121:       equivalence (value(1),nodplc(1),cvalue(1))
        !          3122: c
        !          3123: c
        !          3124:       dimension vbdo(1),vbso(1),vgbo(1),gdgo(1),cdo(1),cbo(1),
        !          3125:      1   gddo(1),gdso(1),gbgo(1),gbdo(1),gbso(1),qb(1),cqb(1),qg(1),
        !          3126:      2   cqg(1),qd(1),cqd(1)
        !          3127: c.. note: for direct indexing with 'value', use, e.g. loct+2 to find vgbo
        !          3128:       equivalence (vbdo (1),value( 1)),(vbso (1),value( 2)),
        !          3129:      1            (vgbo (1),value( 3)),
        !          3130:      2            (cdo  (1),value( 5)),(cbo  (1),value( 6)),
        !          3131:      3            (gddo (1),value( 7)),(gdgo (1),value(8)),
        !          3132:      4            (gdso (1),value( 9)),(gbgo (1),value(10)),
        !          3133:      5            (gbdo (1),value(11)),(gbso (1),value(12)),
        !          3134:      6            (qb   (1),value(13)),(cqb  (1),value(14)),
        !          3135:      7            (qg   (1),value(15)),(cqg  (1),value(16)),
        !          3136:      8            (qd   (1),value(17)),(cqd  (1),value(18))
        !          3137: c
        !          3138: c
        !          3139:       loc=locate(14)
        !          3140:    10 if (loc.eq.0) return
        !          3141:       locm=nodplc(loc+8)
        !          3142:       if(nodplc(locm+2).ne.0) go to 15
        !          3143:       call gasfet(loc)
        !          3144:       go to 1000
        !          3145:    15 locv=nodplc(loc+1)
        !          3146:       node1=nodplc(loc+2)
        !          3147:       node2=nodplc(loc+3)
        !          3148:       node3=nodplc(loc+4)
        !          3149:       node4=nodplc(loc+5)
        !          3150:       node5=nodplc(loc+6)
        !          3151:       node6=nodplc(loc+7)
        !          3152:       ioff=nodplc(loc+9)
        !          3153:       type=nodplc(locm+2)
        !          3154:       locm=nodplc(locm+1)
        !          3155:       loct=nodplc(loc+26)
        !          3156: c
        !          3157: c  dc model parameters
        !          3158: c
        !          3159:       xj=value(locm+19)
        !          3160:       xl=value(locv+1)-2.0d0*value(locm+20)
        !          3161:       xw=value(locv+2)-2.0d0*value(locm+36)
        !          3162:       devmod=value(locv+8)
        !          3163:       vto=type*value(locm+1)
        !          3164:       beta=value(locm+2)*xw/xl
        !          3165:       gamma=value(locm+3)
        !          3166:       phi=value(locm+4)
        !          3167:       xlamda=value(locm+5)
        !          3168:       csat=value(locm+15)
        !          3169:       ad=value(locv+3)
        !          3170:       as=value(locv+4)
        !          3171:       cdsat=csat*ad
        !          3172:       cssat=csat*as
        !          3173:       gdpr=value(locv+11)
        !          3174:       gspr=value(locv+12)
        !          3175:       covlgs=value(locm+8)*xw
        !          3176:       covlgd=value(locm+9)*xw
        !          3177:       covlgb=value(locm+10)*xl
        !          3178:       cox=value(locm+13)
        !          3179:       xnsub=value(locm+16)
        !          3180:       xnfs=value(locm+18)
        !          3181:       vbp=value(locm+24)
        !          3182:       uexp=value(locm+25)
        !          3183:       utra=value(locm+26)
        !          3184:       vbi=type*value(locm+34)
        !          3185:       xd=value(locm+35)
        !          3186:       vcrit=value(locm+37)*xl
        !          3187:       vtra=value(locm+38)*xl
        !          3188:       theta=value(locm+39)
        !          3189:       gleff=value(locm+40)
        !          3190: c
        !          3191: c  initialization
        !          3192: c
        !          3193:       icheck=1
        !          3194:       go to (100,20,30,50,60,70), initf
        !          3195:    20 if(mode.ne.1.or.modedc.ne.2.or.nosolv.eq.0) go to 25
        !          3196:       vbs=type*value(locv+7)
        !          3197:       vbd=type*value(locv+5)-vbs
        !          3198:       vgb=type*value(locv+6)-vbs
        !          3199:       go to 300
        !          3200:    25 if(ioff.ne.0) go to 40
        !          3201:       vbs=0.0d0
        !          3202:       vbd=0.0d0
        !          3203:       vgb=vto
        !          3204:       go to 300
        !          3205:    30 if (ioff.eq.0) go to 100
        !          3206:    40 vbs=0.0d0
        !          3207:       vbd=0.0d0
        !          3208:       vgb=0.0d0
        !          3209:       go to 300
        !          3210:    50 vbs=vbso(lx0+loct)
        !          3211:       vbd=vbdo(lx0+loct)
        !          3212:       vgb=vgbo(lx0+loct)
        !          3213:       go to 300
        !          3214:    60 vbs=vbso(lx1+loct)
        !          3215:       vbd=vbdo(lx1+loct)
        !          3216:       vgb=vgbo(lx1+loct)
        !          3217:       go to 300
        !          3218:    70 xfact=delta/delold(2)
        !          3219:       vbso(lx0+loct)=vbso(lx1+loct)
        !          3220:       vbs=(1.0d0+xfact)*vbso(lx1+loct)-xfact*vbso(lx2+loct)
        !          3221:       vbdo(lx0+loct)=vbdo(lx1+loct)
        !          3222:       vbd=(1.0d0+xfact)*vbdo(lx1+loct)-xfact*vbdo(lx2+loct)
        !          3223:       vgbo(lx0+loct)=vgbo(lx1+loct)
        !          3224:       vgb=(1.0d0+xfact)*vgbo(lx1+loct)-xfact*vgbo(lx2+loct)
        !          3225:       cdo(lx0+loct)=cdo(lx1+loct)
        !          3226:       cbo(lx0+loct)=cbo(lx1+loct)
        !          3227:       gdgo(lx0+loct)=gdgo(lx1+loct)
        !          3228:       gddo(lx0+loct)=gddo(lx1+loct)
        !          3229:       gdso(lx0+loct)=gdso(lx1+loct)
        !          3230:       gbgo(lx0+loct)=gbgo(lx1+loct)
        !          3231:       gbdo(lx0+loct)=gbdo(lx1+loct)
        !          3232:       gbso(lx0+loct)=gbso(lx1+loct)
        !          3233:       go to 110
        !          3234: c
        !          3235: c  compute new nonlinear branch voltages
        !          3236: c
        !          3237:   100 vbs=type*(value(lvnim1+node4)-value(lvnim1+node6))
        !          3238:       vbd=type*(value(lvnim1+node4)-value(lvnim1+node5))
        !          3239:       vgb=type*(value(lvnim1+node2)-value(lvnim1+node4))
        !          3240:   110 delvbs=vbs-vbso(lx0+loct)
        !          3241:       delvbd=vbd-vbdo(lx0+loct)
        !          3242:       delvgb=vgb-vgbo(lx0+loct)
        !          3243:       cdhat=cdo(lx0+loct)+gdgo(lx0+loct)*delvgb-gddo(lx0+loct)*delvbd
        !          3244:      1  -gdso(lx0+loct)*delvbs
        !          3245:       cbhat=cbo(lx0+loct)+gbgo(lx0+loct)*delvgb-gbdo(lx0+loct)*delvbd
        !          3246:      1   -gbso(lx0+loct)*delvbs
        !          3247: c
        !          3248: c  bypass if solution has not changed
        !          3249: c
        !          3250: c********** kill bypass for now!!!!!
        !          3251:       if (6    .eq.6) go to 200
        !          3252:       tol=reltol*dmax1(dabs(vbs),dabs(vbso(lx0+loct)))+vntol
        !          3253:       if (dabs(delvbs).ge.tol) go to 200
        !          3254:       tol=reltol*dmax1(dabs(vbd),dabs(vbdo(lx0+loct)))+vntol
        !          3255:       if (dabs(delvbd).ge.tol) go to 200
        !          3256:       tol=reltol*dmax1(dabs(vgb),dabs(vgbo(lx0+loct)))+vntol
        !          3257:       if (dabs(delvgb).ge.tol) go to 200
        !          3258:       tol=reltol*dmax1(dabs(cdhat),dabs(cdo(lx0+loct)))+abstol
        !          3259:       if (dabs(cdhat-cdo(lx0+loct)).ge.tol) go to 200
        !          3260:       tol=reltol*dmax1(dabs(cbhat),dabs(cbo(lx0+loct)))+abstol
        !          3261:       if (dabs(cbhat-(cbo(lx0+loct))).ge.tol) go to 200
        !          3262:       vbd=vbdo(lx0+loct)
        !          3263:       vbs=vbso(lx0+loct)
        !          3264:       vgb=vgbo(lx0+loct)
        !          3265:       cdrain=cdo(lx0+loct)
        !          3266:       cbulk=cbo(lx0+loct)
        !          3267:       gccdg=gdgo(lx0+loct)
        !          3268:       gccdd=gddo(lx0+loct)
        !          3269:       gccds=gdso(lx0+loct)
        !          3270:       gccbg=gbgo(lx0+loct)
        !          3271:       gccbd=gbdo(lx0+loct)
        !          3272:       gccbs=gbso(lx0+loct)
        !          3273:       go to 900
        !          3274: c
        !          3275: c  limit nonlinear branch voltages
        !          3276: c
        !          3277:   200 von=type*value(locv+9)
        !          3278:       icheck=0
        !          3279:       call fetlim(vgb,vgbo(lx0+loct),von,icheck)
        !          3280:       vcornr=0.0d0
        !          3281: c     if(vbs.gt.0.0d0) vcornr=vt*dlog(vt/(root2*cssat))
        !          3282:       call pnjlim(vbs,vbso(lx0+loct),vt,vcornr,icheck)
        !          3283: c     vbs=dmax1(vbso(lx0+loct)-10.0d0,vbs)
        !          3284:       vcornr=0.0d0
        !          3285: c     if(vbd.gt.0.0d0) vcornr=vt*dlog(vt/(root2*cdsat))
        !          3286:       call pnjlim(vbd,vbdo(lx0+loct),vt,vcornr,icheck)
        !          3287: c     vbd=dmax1(vbdo(lx0+loct)-10.0d0,vbd)
        !          3288: c
        !          3289: c  determine bulk-drain and bulk-source diode terms
        !          3290: c
        !          3291:   300 fivevt=-5.0d0*vt
        !          3292:       if (vbs.gt.fivevt) go to 310
        !          3293:       geqbs=-cssat/vbs+gmin
        !          3294:       cbulk=geqbs*vbs
        !          3295:       go to 320
        !          3296:   310 evbs=dexp(vbs/vt)
        !          3297:       geqbs=cssat*evbs/vt+gmin
        !          3298:       cbulk=cssat*(evbs-1.0d0)+gmin*vbs
        !          3299:   320 if (vbd.gt.fivevt) go to 330
        !          3300:       geqbd=-cdsat/vbd+gmin
        !          3301:       cbd=geqbd*vbd
        !          3302:       cbulk=cbulk+cbd
        !          3303:       go to 340
        !          3304:   330 evbd=dexp(vbd/vt)
        !          3305:       geqbd=cdsat*evbd/vt+gmin
        !          3306:       cbd=cdsat*(evbd-1.0d0)+gmin*vbd
        !          3307:       cbulk=cbulk+cbd
        !          3308: c.. cbd must also be subtracted from drain current
        !          3309:   340 continue
        !          3310:       gccdd=geqbd
        !          3311:       gccbd=-geqbd
        !          3312:       gccss=geqbs
        !          3313:       gccbs=-geqbs
        !          3314:       if (mode.ne.1) go to 350
        !          3315: c.. zero out some conductances and cgate
        !          3316:       cgate=0.0d0
        !          3317:       gccgg=0.0d0
        !          3318:       gccgd=0.0d0
        !          3319:       gccgs=0.0d0
        !          3320:       gccbg=0.0d0
        !          3321: c
        !          3322: c  compute drain current and derivatives
        !          3323: c
        !          3324:   350 cox=cox*xl*xw
        !          3325:       if(vbd.gt.vbs) go to 360
        !          3326: c.. normal operation
        !          3327:       devmod=1.0d0
        !          3328:       call calcq(vgb,vbd,vbs,qgate,qchan,qbulk,
        !          3329:      1 ccgg,ccgd,ccgs,ccbg,ccbd,ccbs,didvg,didvd,didvs)
        !          3330:       didvg=beta*didvg
        !          3331:       didvd=beta*didvd
        !          3332:       didvs=beta*didvs
        !          3333:       go to 370
        !          3334: c.. inverted operation
        !          3335:   360 devmod=-1.0d0
        !          3336:       call calcq(vgb,vbs,vbd,qgate,qchan,qbulk,
        !          3337:      1 ccgg,ccgs,ccgd,ccbg,ccbs,ccbd,didvg,didvs,didvd)
        !          3338:       didvg=-beta*didvg
        !          3339:       didvd=-beta*didvd
        !          3340:       didvs=-beta*didvs
        !          3341:       cdrain=-cdrain
        !          3342:   370 cdrain=beta*cdrain-cbd
        !          3343: c     if(mode.ne.1) write(6,6666) qgate,qchan,qbulk,time,delta
        !          3344:  6666 format(' qg qc qb',1p3e11.3,' time delta ',2e11.3)
        !          3345:       value(locv+8)=devmod
        !          3346:       value(locv+9)=type*von
        !          3347:       value(locv+10)=type*vdsat
        !          3348:       if(mode.ne.1) go to 500
        !          3349:       if ((modedc.eq.2).and.(nosolv.ne.0)) go to 500
        !          3350:       if (initf.eq.4) go to 500
        !          3351:       gccdg=didvg
        !          3352:       gccdd=gccdd+didvd
        !          3353:       gccds=didvs
        !          3354:       gccsg=-didvg
        !          3355:       gccsd=-didvd
        !          3356:       gccss=gccss-didvs
        !          3357:       go to 700
        !          3358: c
        !          3359: c  charge storage elements
        !          3360: c
        !          3361: c.. bulk-drain and bulk-source depletion capacitances
        !          3362:   500 czbd=value(locm+11)*ad
        !          3363:       czbs=value(locm+12)*as
        !          3364:       phib=value(locm+14)
        !          3365:       twop=phib+phib
        !          3366:       fcpb=value(locm+29)
        !          3367:       if(vbs.lt.fcpb.and.vbd.lt.fcpb) go to 505
        !          3368:       fcpb2=fcpb*fcpb
        !          3369:       f1=value(locm+30)
        !          3370:       f2=value(locm+31)
        !          3371:       f3=value(locm+32)
        !          3372:       czbsf2=czbs/f2
        !          3373:       czbdf2=czbd/f2
        !          3374:       if (vbs.ge.fcpb) go to 510
        !          3375:   505 sarg=dsqrt(1.0d0-vbs/phib)
        !          3376:       qbs=twop*czbs*(1.0d0-sarg)
        !          3377:       capbs=czbs/sarg
        !          3378:       go to 520
        !          3379:   510 qbs=czbs*f1+czbsf2*(f3*(vbs-fcpb)
        !          3380:      1   +(vbs*vbs-fcpb2)/(twop+twop))
        !          3381:       capbs=czbsf2*(f3+vbs/twop)
        !          3382:   520 if (vbd.ge.fcpb) go to 530
        !          3383:       sarg=dsqrt(1.0d0-vbd/phib)
        !          3384:       qbd=twop*czbd*(1.0d0-sarg)
        !          3385:       capbd=czbd/sarg
        !          3386:       go to 540
        !          3387:   530 qbd=czbd*f1+czbdf2*(f3*(vbd-fcpb)
        !          3388:      1   +(vbd*vbd-fcpb2)/(twop+twop))
        !          3389:       capbd=czbdf2*(f3+vbd/twop)
        !          3390: c.. bulk and channel charge (plus overlaps)
        !          3391:   540 qgd=covlgd*(vgb+vbd)
        !          3392:       qgs=covlgs*(vgb+vbs)
        !          3393:       qgb=covlgb*vgb
        !          3394:       qg(lx0+loct)=qgate+qgb+qgd+qgs
        !          3395:       qd(lx0+loct)=qchan*0.5d0-qgd-qbd
        !          3396:       qb(lx0+loct)=qbulk+qbd+qbs-qgb
        !          3397: c
        !          3398: c  store small-signal parameters
        !          3399: c
        !          3400:   590 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 900
        !          3401:       if (initf.ne.4) go to 600
        !          3402:       value(lx0+loct)=didvg
        !          3403:       value(lx0+loct+1)=didvd
        !          3404:       value(lx0+loct+2)=didvs
        !          3405:       value(lx0+loct+3)=geqbd
        !          3406: c.. cdrain is used in printing as well as noise calculation
        !          3407:       value(lx0+loct+4)=cdrain
        !          3408:       value(lx0+loct+5)=geqbs
        !          3409: c..   (loct+6 not used)
        !          3410: c.. this is the 'gm' term used in the noise calculation
        !          3411:       value(lx0+loct+7)=didvg
        !          3412:       value(lx0+loct+8)=ccgg
        !          3413:       value(lx0+loct+9)=ccgd
        !          3414:       value(lx0+loct+10)=ccgs
        !          3415:       value(lx0+loct+11)=ccbg
        !          3416:       value(lx0+loct+12)=ccbd
        !          3417:       value(lx0+loct+13)=ccbs
        !          3418:       value(lx0+loct+14)=capbd
        !          3419:       value(lx0+loct+15)=capbs
        !          3420:       go to 1000
        !          3421: c
        !          3422: c  transient analysis
        !          3423: c
        !          3424:   600 if (initf.ne.5) go to 610
        !          3425:       qb(lx1+loct)=qb(lx0+loct)
        !          3426:       qg(lx1+loct)=qg(lx0+loct)
        !          3427:       qd(lx1+loct)=qd(lx0+loct)
        !          3428: c.. integrate qb
        !          3429:   610 call intgr8(geq,ceq,0.0d0,loct+12)
        !          3430: c.. integrate qg
        !          3431:       call intgr8(geq,ceq,0.0d0,loct+14)
        !          3432: c.. integrate qd
        !          3433:       call intgr8(geq,ceq,0.0d0,loct+16)
        !          3434: c.. divvey up the channel charge 50/50 to source and drain
        !          3435: c.. note that symmetry also precludes need for 'devmod' decisions
        !          3436:       gccg2=-0.5d0*(ccgg+ccbg)*ag(1)
        !          3437:       gccd2=-0.5d0*(ccgd+ccbd)*ag(1)
        !          3438:       gccs2=-0.5d0*(ccgs+ccbs)*ag(1)
        !          3439:       gccdg=gccg2+didvg-covlgd*ag(1)
        !          3440:       gccdd=gccdd+gccd2+didvd+(capbd+covlgd)*ag(1)
        !          3441:       gccds=gccs2+didvs
        !          3442:       gccsg=gccg2-didvg-covlgs*ag(1)
        !          3443:       gccsd=gccd2-didvd
        !          3444:       gccss=gccss+gccs2-didvs+(capbs+covlgs)*ag(1)
        !          3445:       gccgg=(ccgg+covlgd+covlgs+covlgb)*ag(1)
        !          3446:       gccgd=(ccgd-covlgd)*ag(1)
        !          3447:       gccgs=(ccgs-covlgs)*ag(1)
        !          3448:       gccbg=(ccbg-covlgb)*ag(1)
        !          3449:       gccbd=gccbd+(ccbd-capbd)*ag(1)
        !          3450:       gccbs=gccbs+(ccbs-capbs)*ag(1)
        !          3451:       cgate=cqg(lx0+loct)
        !          3452:       cbulk=cbulk+cqb(lx0+loct)
        !          3453:       cdrain=cdrain+cqd(lx0+loct)
        !          3454:       if (initf.ne.5) go to 700
        !          3455:       cqb(lx1+loct)=cqb(lx0+loct)
        !          3456:       cqg(lx1+loct)=cqg(lx0+loct)
        !          3457:       cqd(lx1+loct)=cqd(lx0+loct)
        !          3458: c
        !          3459: c  check convergence
        !          3460: c
        !          3461:   700 if (initf.ne.3) go to 710
        !          3462:       if (ioff.ne.0) go to 750
        !          3463:   710 if (icheck.eq.1) go to 720
        !          3464: c     tol=reltol*dmax1(dabs(cdhat),dabs(cdrain))+abstol
        !          3465: c     if (dabs(cdhat-cdrain).ge.tol) go to 720
        !          3466: c     tol=reltol*dmax1(dabs(cbhat),dabs(cbulk))+abstol
        !          3467: c     if (dabs(cbhat-cbulk).le.tol) go to 750
        !          3468:       tol=reltol*dabs(vgb)+vntol
        !          3469:       if(dabs(delvgb).ge.tol) go to 720
        !          3470:       tol=reltol*dabs(vbd)+vntol
        !          3471:       if(dabs(delvbd).ge.tol) go to 720
        !          3472:       tol=reltol*dabs(vbs)+vntol
        !          3473:       if(dabs(delvbs).lt.tol) go to 750
        !          3474:   720 noncon=noncon+1
        !          3475:   750 vbdo(lx0+loct)=vbd
        !          3476:       vbso(lx0+loct)=vbs
        !          3477:       vgbo(lx0+loct)=vgb
        !          3478:       cdo(lx0+loct)=cdrain
        !          3479:       cbo(lx0+loct)=cbulk
        !          3480:       gdgo(lx0+loct)=gccdg
        !          3481:       gddo(lx0+loct)=gccdd
        !          3482:       gdso(lx0+loct)=gccds
        !          3483:       gbgo(lx0+loct)=gccbg
        !          3484:       gbdo(lx0+loct)=gccbd
        !          3485:       gbso(lx0+loct)=gccbs
        !          3486: c
        !          3487: c  load current vector
        !          3488: c
        !          3489:   900 ceqg=type*(cgate-gccgg*vgb+gccgd*vbd+gccgs*vbs)
        !          3490:       ceqb=type*(cbulk-gccbg*vgb+gccbd*vbd+gccbs*vbs)
        !          3491:       ceqd=type*(cdrain-gccdg*vgb+gccdd*vbd+gccds*vbs)
        !          3492:       value(lvn+node2)=value(lvn+node2)-ceqg
        !          3493:       value(lvn+node4)=value(lvn+node4)-ceqb
        !          3494:       value(lvn+node5)=value(lvn+node5)-ceqd
        !          3495:       value(lvn+node6)=value(lvn+node6)+ceqd+ceqg+ceqb
        !          3496: c
        !          3497: c  load y matrix
        !          3498: c
        !          3499:       locy=lynl+nodplc(loc+27)
        !          3500:       value(locy)=value(locy)+gdpr
        !          3501:       locy=lynl+nodplc(loc+28)
        !          3502:       value(locy)=value(locy)+gccgg
        !          3503:       locy=lynl+nodplc(loc+29)
        !          3504:       value(locy)=value(locy)+gspr
        !          3505:       locy=lynl+nodplc(loc+30)
        !          3506:       value(locy)=value(locy)-gccbg-gccbd-gccbs
        !          3507:       locy=lynl+nodplc(loc+31)
        !          3508:       value(locy)=value(locy)+gdpr+gccdd
        !          3509:       locy=lynl+nodplc(loc+32)
        !          3510:       value(locy)=value(locy)+gspr+gccss
        !          3511:       locy=lynl+nodplc(loc+10)
        !          3512:       value(locy)=value(locy)-gdpr
        !          3513:       locy=lynl+nodplc(loc+11)
        !          3514:       value(locy)=value(locy)-gccgg-gccgd-gccgs
        !          3515:       locy=lynl+nodplc(loc+12)
        !          3516:       value(locy)=value(locy)+gccgd
        !          3517:       locy=lynl+nodplc(loc+13)
        !          3518:       value(locy)=value(locy)+gccgs
        !          3519:       locy=lynl+nodplc(loc+14)
        !          3520:       value(locy)=value(locy)-gspr
        !          3521:       locy=lynl+nodplc(loc+15)
        !          3522:       value(locy)=value(locy)+gccbg
        !          3523:       locy=lynl+nodplc(loc+16)
        !          3524:       value(locy)=value(locy)+gccbd
        !          3525:       locy=lynl+nodplc(loc+17)
        !          3526:       value(locy)=value(locy)+gccbs
        !          3527:       locy=lynl+nodplc(loc+18)
        !          3528:       value(locy)=value(locy)-gdpr
        !          3529:       locy=lynl+nodplc(loc+19)
        !          3530:       value(locy)=value(locy)+gccdg
        !          3531:       locy=lynl+nodplc(loc+20)
        !          3532:       value(locy)=value(locy)-gccdg-gccdd-gccds
        !          3533:       locy=lynl+nodplc(loc+21)
        !          3534:       value(locy)=value(locy)+gccds
        !          3535:       locy=lynl+nodplc(loc+22)
        !          3536:       value(locy)=value(locy)+gccsg
        !          3537:       locy=lynl+nodplc(loc+23)
        !          3538:       value(locy)=value(locy)-gspr
        !          3539:       locy=lynl+nodplc(loc+24)
        !          3540:       value(locy)=value(locy)-gccsg-gccsd-gccss
        !          3541:       locy=lynl+nodplc(loc+25)
        !          3542:       value(locy)=value(locy)+gccsd
        !          3543:  1000 loc=nodplc(loc)
        !          3544:       go to 10
        !          3545:       end
        !          3546:       subroutine calcq(vgb,vbd,vbs,qg,qc,qb,
        !          3547:      1  ccgg,ccgd,ccgs,ccbg,ccbd,ccbs,
        !          3548:      2  didvg,didvd,didvs)
        !          3549:       implicit double precision (a-h,o-z)
        !          3550:       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
        !          3551:      1   xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
        !          3552:      2   itemno,nosolv,ipostp,iscrch
        !          3553:       common /mosarg/ gamma,beta,vto,phi,cox,vbi,xnfs,xnsub,xd,xj,xl,
        !          3554:      1   xlamda,utra,uexp,vbp,von,vdsat,theta,vcrit,vtra,gleff,cdrain
        !          3555:       common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
        !          3556:      1   gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
        !          3557:       iflag=1
        !          3558:       if(mode.ne.1) go to 5
        !          3559:       iflag=0
        !          3560:       if(modedc.eq.2.and.nosolv.ne.0) iflag=1
        !          3561:       if(initf.eq.4) iflag=1
        !          3562:     5 vd=dmax1(phi-vbd,1.0d-8)
        !          3563:       vg=vgb-vbi+phi
        !          3564:       vs=dmax1(phi-vbs,1.0d-8)
        !          3565:       vsp5=dsqrt(vs)
        !          3566:       gammad=gamma
        !          3567:       if(gamma.eq.0.0d0) go to 7
        !          3568:       if(xj.eq.0.0d0) go to 7
        !          3569:       arg=dsqrt(1.0d0+xd*2.0d0*vsp5/xj)
        !          3570:       gfact=1.0d0-xj/xl*(arg-1.0d0)
        !          3571:       gfact=dmax1(0.5d0,gfact)
        !          3572:       gammad=gamma*gfact
        !          3573:     7 vth=gammad*vsp5+vs
        !          3574: c.. von is referenced to vgb for 'fetlim'
        !          3575: c.. change mosfet to reference to vgs (von=vth+vbi-vs) for
        !          3576: c.. printing
        !          3577:       von=vth+vbi-phi
        !          3578:       vdsat=0.0d0
        !          3579:       if(vg.lt.vth) go to 100
        !          3580: c
        !          3581: c  'on' region (linear and saturated)
        !          3582: c
        !          3583:       gamma2=gammad*0.5d0
        !          3584:       sqarg=dsqrt(gamma2*gamma2+vg)
        !          3585:       vsat=(sqarg-gamma2)**2
        !          3586:       vsatcl=vsat
        !          3587:       vs2=vs*vs
        !          3588:       vs3=vs2*vs
        !          3589:       vs5=vs3*vs2
        !          3590:       vs1p5=vs*vsp5
        !          3591:       vs2p5=vs1p5*vs
        !          3592:       if(vcrit.eq.0.0d0) go to 9
        !          3593: c...... iterate to new vsat
        !          3594:       iter=1
        !          3595:     8 ve2=vsat*vsat
        !          3596: c     write(6,8878) iter,vsat
        !          3597:  8878 format(' iter vsat ',i4,1pd11.2)
        !          3598:       vep5=dsqrt(vsat)
        !          3599:       ve1p5=vsat*vep5
        !          3600:       arg2=0.5d0*(ve2-vs2)
        !          3601:       arg1p5=gammad*(ve1p5-vs1p5)/1.5d0
        !          3602:       cdrain=vg*(vsat-vs)-arg1p5-arg2
        !          3603:       didve=vg-gammad*vep5-vsat
        !          3604:       d2idve=-0.5d0*gammad/dmax1(vep5,1.0d-5)-1.0d0
        !          3605:       if(vtra.eq.0.0d0) go to 88
        !          3606:       trafac=1.0d0/(1.0d0+(vsat-vs)/vtra)
        !          3607:       dtrdve=-trafac*trafac/vtra
        !          3608:       d2idve=d2idve*trafac+(dtrdve+dtrdve)*(didve-cdrain*trafac/vtra)
        !          3609:       didve=didve*trafac+dtrdve*cdrain
        !          3610:       cdrain=cdrain*trafac
        !          3611:    88 delv=(didve*vcrit-cdrain)/dabs(didve-vcrit*d2idve)
        !          3612: c.. limit voltage excursion to 1/2 old vsat
        !          3613:       if(dabs(delv).gt.0.5d0*vsat) delv=vsat*dsign(0.5d0,delv)
        !          3614:       vsat=vsat+delv
        !          3615: c     vsat=dmax1(vsat,1.0d-5)
        !          3616: c     vsat=dmin1(vsat,vsatcl)
        !          3617:       if(dabs(delv).lt.1.0d-6) go to 9
        !          3618:       iter=iter+1
        !          3619:       if(iter.gt.20) write(6,7777) vg,vs,vsat,delv
        !          3620:  7777 format(' iteration count for vsat hit limit of 20'/,
        !          3621:      1  ' vg vs vsat delv ',1p4d11.3)
        !          3622:       if(iter.gt.20) go to 9
        !          3623:       go to 8
        !          3624: c.. end of iteration loop
        !          3625: c.. vdsat is referenced to vds for printing only
        !          3626:     9 vdsat=vsat-vs
        !          3627:       if(vsat.gt.vsatcl) write(6,9989) vsat,vsatcl
        !          3628:  9989 format(' ********error****** vsat is larger than classical vsat',/
        !          3629:      1' vsat ',1pd11.3,' classical vsat ',d11.3)
        !          3630:  9999 format(' vsat ',1pd11.3,' classical vsat ',d11.3)
        !          3631:       if(vd.ge.vsat) go to 10
        !          3632: c.. linear region
        !          3633:       ve=vd
        !          3634:       dvedvd=1.0d0
        !          3635:       dvedvg=0.0d0
        !          3636:       go to 15
        !          3637: c.. saturated region
        !          3638:    10 ve=vsat
        !          3639:       dvedvd=0.0d0
        !          3640: c**************** zero dvedvg!!!
        !          3641: c     dvedvg=1.0d0-gamma2/sqarg
        !          3642:       dvedvg=0.0d0
        !          3643: c
        !          3644:    15 ve2=ve*ve
        !          3645:       ve3=ve2*ve
        !          3646:       ve5=ve3*ve2
        !          3647:       vep5=dsqrt(ve)
        !          3648:       ve1p5=ve*vep5
        !          3649:       ve2p5=ve1p5*ve
        !          3650:       arg2=0.5d0*(ve2-vs2)
        !          3651:       arg1p5=gammad*(ve1p5-vs1p5)/1.5d0
        !          3652:       cdrain=vg*(ve-vs)-arg1p5-arg2
        !          3653:       didve=vg-gammad*vep5-ve
        !          3654:       didvg=ve-vs+didve*dvedvg
        !          3655:       didvs=-vg+gammad*vsp5+vs
        !          3656:       if(iflag.eq.0) go to 30
        !          3657:       if(dabs(cdrain).gt.1.0d-5) go to 20
        !          3658: c .. special case when ve almost equals vs and regular formulas don't work
        !          3659: c     write(6,5475) time,cdrain
        !          3660:  5475 format(' time = ',1pd15.6,' cdrain = ',e11.3)
        !          3661:       qg=cox*(vg-vs)
        !          3662:       ccgg=cox
        !          3663:       ccgd=-0.5d0*cox
        !          3664:       ccgs=ccgd
        !          3665:       qb=-cox*gammad*vsp5
        !          3666:       ccbg=0.0d0
        !          3667:       ccbd=-cox*0.25d0*gammad/dmax1(vsp5,1.0d-2)
        !          3668:       ccbs=ccbd
        !          3669:       go to 30
        !          3670: c
        !          3671:    20 arg2p5=gammad*0.4d0*(ve2p5-vs2p5)
        !          3672:       varg=(vg*arg2-arg2p5-(ve3-vs3)/3.0d0)/cdrain
        !          3673:       qg=cox*(vg-varg)
        !          3674:       dqgdve=cox/cdrain*(varg-ve)*didve
        !          3675:       ccgg=cox*(1.0d0-(arg2-varg*(ve-vs))/cdrain)
        !          3676:      1  +dqgdve*dvedvg
        !          3677:       ccgd=dqgdve*dvedvd
        !          3678:       ccgs=cox/cdrain*(varg-vs)*didvs
        !          3679:       qb=-cox/cdrain*(vg*arg1p5-gammad*gammad*arg2-arg2p5)
        !          3680:       dqbdve=-cox/cdrain*(gammad*vep5+qb/cox)*didve
        !          3681:       ccbd=dqbdve*dvedvd
        !          3682:       ccbs=-cox/cdrain*(gammad*vsp5+qb/cox)*didvs
        !          3683:       ccbg=-cox/cdrain*(arg1p5+qb/cox*(ve-vs))
        !          3684:      1  +dqbdve*dvedvg
        !          3685: c.. mobility factor (a-la bdm)
        !          3686:    30 if(uexp.eq.0.0d0) go to 35
        !          3687:       vdenom=vg-vth-utra*(ve-vs)
        !          3688:       if(vdenom.le.vbp) go to 45
        !          3689:       arg=vbp/vdenom
        !          3690:       ufact=dexp(uexp*dlog(arg))
        !          3691:       dcoef=-uexp*ufact*arg/vbp
        !          3692:       didvg=ufact*didvg+cdrain*dcoef
        !          3693:       didvs=ufact*didvs-cdrain*dcoef*(0.5d0*gammad/vsp5+1.0d0-utra)
        !          3694:       didve=ufact*didve-cdrain*dcoef*utra
        !          3695:       cdrain=cdrain*ufact
        !          3696:       go to 45
        !          3697: c.. lateral field effects 
        !          3698:    35 if(vtra.eq.0.0d0) go to 40
        !          3699:       trafac=1.0d0/(1.0d0+(ve-vs)/vtra)
        !          3700:       dtrdve=-trafac*trafac/vtra
        !          3701:       didve=didve*trafac+dtrdve*cdrain
        !          3702: c.. note that dtrdvs=-dtrdve
        !          3703:       didvs=didvs*trafac-dtrdve*cdrain
        !          3704:       didvg=didvg*trafac
        !          3705:       cdrain=cdrain*trafac
        !          3706: c.. mobility variation a-la sun-daseking
        !          3707:    40 if(theta.eq.0.0d0) go to 45
        !          3708:       ufact=1.0d0/(1.0d0+theta*(vg-vth))
        !          3709:       dufact=-theta*ufact*ufact
        !          3710:       didve=ufact*didve
        !          3711:       didvg=ufact*didvg+cdrain*dufact
        !          3712:       didvs=ufact*didvs-cdrain*dufact*(0.5d0*gammad/vsp5+1.0d0)
        !          3713:       cdrain=cdrain*ufact
        !          3714: c .. done with 've', use it
        !          3715:    45 didvd=didve*dvedvd
        !          3716: c.. channel length modulation
        !          3717:       if(vcrit.ne.0.0d0) go to 80
        !          3718:       if (xlamda.gt.0.0d0) go to 50
        !          3719:       if (xnsub.eq.0.0d0) go to 50
        !          3720: c.. frohman-grove (lousy) formulation modified a-la newton
        !          3721:       arg1=(vd-vsat)/4.0d0
        !          3722:       arg2=dsqrt(1.0d0+arg1*arg1)
        !          3723:       arg3=dsqrt(arg1+arg2)
        !          3724:       clfact=1.0d0/(1.0d0-xd/xl*arg3)
        !          3725:       if(clfact.le.0.0d0) go to 60
        !          3726:       dclfct=0.125d0*clfact*clfact*xd/xl*(1.0d0+arg1/arg2)/arg3
        !          3727:       didvd=clfact*didvd+cdrain*dclfct
        !          3728:       didvg=clfact*didvg-cdrain*dclfct*(1.0d0-gamma2/sqarg)
        !          3729:       didvs=clfact*didvs
        !          3730:       cdrain=cdrain*clfact
        !          3731:       go to 200
        !          3732: c.. simple (1+vds*lambda/l) formulation
        !          3733:    50 xlfact=xlamda/xl
        !          3734:       clfact=1.0d0+xlfact*(vd-vs)
        !          3735:       didvd=clfact*didvd+cdrain*xlfact
        !          3736:       didvs=clfact*didvs-cdrain*xlfact
        !          3737:       didvg=clfact*didvg
        !          3738:       cdrain=cdrain*clfact
        !          3739:       go to 200
        !          3740: c.. device punched thru
        !          3741:    60 clfact=1000.0d0
        !          3742:       if(ipunch.gt.50) go to 200
        !          3743:       ipunch=ipunch+1
        !          3744:       write(6,61)
        !          3745:    61 format('0warning:  channel length reduced to zero in mosfet')
        !          3746:       go to 200
        !          3747: c.. into saturation with vcrit ne 0
        !          3748:    80 if(vd.le.vsat) go to 200
        !          3749:       xk1=vcrit/2.0d0/xl/gleff
        !          3750:       temp=dsqrt(xk1*xk1+(vd-vsat)/gleff)
        !          3751:       clfact=1.0d0+(temp-xk1)/xl
        !          3752:       dclfct=0.5d0/xl/temp/gleff
        !          3753:       didvd=didvd*clfact+cdrain*dclfct
        !          3754:       didvs=didvs*clfact
        !          3755:       didvg=didvg*clfact
        !          3756:       cdrain=cdrain*clfact
        !          3757: c
        !          3758:       go to 200
        !          3759: c
        !          3760: c.. cut-off region (vg<vth)
        !          3761: c
        !          3762:   100 continue
        !          3763:       cdrain=0.0d0
        !          3764:       didvg=0.0d0
        !          3765:       didvd=0.0d0
        !          3766:       didvs=0.0d0
        !          3767:       if(iflag.eq.0) return
        !          3768:       if(vg.gt.0.0d0) go to 120
        !          3769:       qg=cox*vg
        !          3770:       ccgg=cox
        !          3771:       go to 130
        !          3772:   120 gamma2=gammad*0.5d0
        !          3773:       sqarg=dsqrt(gamma2*gamma2+vg)
        !          3774:       qg=gammad*cox*(sqarg-gamma2)
        !          3775:       ccgg=0.5d0*cox*gammad/sqarg
        !          3776:   130 qb=-qg
        !          3777:       ccbg=-ccgg
        !          3778:       ccgd=0.0d0
        !          3779:       ccgs=0.0d0
        !          3780:       ccbd=0.0d0
        !          3781:       ccbs=0.0d0
        !          3782:   200 qc=-(qg+qb)
        !          3783: c     write(6,7657) time,vg,vs,ve,qg,ccgg,ccgd,ccgs,qb,ccbg,ccbd,ccbs
        !          3784:  7657 format(' time = ',1pd12.5,' vg vs ve ',3d11.3,
        !          3785:      1 /,' qg ',4d11.3,' qb ',4d11.3)
        !          3786:       return
        !          3787:       end
        !          3788:       subroutine gasfet(loc)
        !          3789: c     *** a gasfet (or any other) model may ***
        !          3790: c     *   be inserted here... if you happen   *
        !          3791: c     *   to have a good one!                 *
        !          3792: c     ***                                   ***
        !          3793: c
        !          3794:       return
        !          3795:       end

unix.superglobalmegacorp.com

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