home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / sorupd.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  5.5 KB  |  198 lines

  1.       subroutine sorupd
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine updates the independent voltage and current sources
  5. c used in the circuit.  it also updates the ltd table (which contains
  6. c previous (delayed) values of the sources used to model transmission
  7. c lines).
  8. c
  9. c spice version 2g.6  sccsid=tabinf 3/15/83
  10.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  11.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  12.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  13.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  14.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  15.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  16.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  17.      7   irowno,jcolno,nttbr,nttar,lvntmp
  18. c spice version 2g.6  sccsid=cirdat 3/15/83
  19.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  20.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  21. c spice version 2g.6  sccsid=status 3/15/83
  22.       common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
  23.      1   xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon,
  24.      2   iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile
  25. c spice version 2g.6  sccsid=flags 3/15/83
  26.       common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
  27.      1   lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,itl6,igoof,nogo,keof
  28. c spice version 2g.6  sccsid=blank 3/15/83
  29.       common /blank/ value(200000)
  30.       integer nodplc(64)
  31.       complex cvalue(32)
  32.       equivalence (value(1),nodplc(1),cvalue(1))
  33. c
  34. c
  35.       do 500 id=9,10
  36.       loc=locate(id)
  37.    10 if (loc.eq.0) go to 500
  38.       if ((id.eq.9).and.(nodplc(loc+11).ne.0)) go to 500
  39.       if ((id.eq.10).and.(nodplc(loc+6).ne.0)) go to 500
  40.       locv=nodplc(loc+1)
  41.       locp=nodplc(loc+5)
  42.       itype=nodplc(loc+4)+1
  43.       go to (490,100,200,300,400,450), itype
  44. c
  45. c  pulse source
  46. c
  47.   100 v1=value(locp+1)
  48.       v2=value(locp+2)
  49.       t1=value(locp+3)
  50.       t2=value(locp+4)
  51.       t3=value(locp+5)
  52.       t4=value(locp+6)
  53.       period=value(locp+7)
  54.       time1=time
  55.       if (time1.le.0.0d0) go to 160
  56.   110 if (time1.lt.t1+period) go to 120
  57.       time1=time1-period
  58.       go to 110
  59.   120 if (time1.lt.t4) go to 130
  60.       value(locv+1)=v1
  61.       go to 490
  62.   130 if (time1.lt.t3) go to 140
  63.       value(locv+1)=v2+(time1-t3)*(v1-v2)/(t4-t3)
  64.       go to 490
  65.   140 if (time1.lt.t2) go to 150
  66.       value(locv+1)=v2
  67.       go to 490
  68.   150 if (time1.lt.t1) go to 160
  69.       value(locv+1)=v1+(time1-t1)*(v2-v1)/(t2-t1)
  70.       go to 490
  71.   160 value(locv+1)=v1
  72.       go to 490
  73. c
  74. c  sinusoidal source
  75. c
  76.   200 v1=value(locp+1)
  77.       v2=value(locp+2)
  78.       omeg=value(locp+3)
  79.       t1=value(locp+4)
  80.       theta=value(locp+5)
  81.       time1=time-t1
  82.       if (time1.gt.0.0d0) go to 210
  83.       value(locv+1)=v1
  84.       go to 490
  85.   210 if (theta.ne.0.0d0) go to 220
  86.       value(locv+1)=v1+v2*dsin(omeg*time1)
  87.       go to 490
  88.   220 value(locv+1)=v1+v2*dsin(omeg*time1)*dexp(-time1*theta)
  89.       go to 490
  90. c
  91. c  exponential source
  92. c
  93.   300 v1=value(locp+1)
  94.       v2=value(locp+2)
  95.       t1=value(locp+3)
  96.       tau1=value(locp+4)
  97.       t2=value(locp+5)
  98.       tau2=value(locp+6)
  99.       time1=time
  100.       if (time1.gt.t1) go to 310
  101.       value(locv+1)=v1
  102.       go to 490
  103.   310 if (time1.gt.t2) go to 320
  104.       value(locv+1)=v1+(v2-v1)*(1.0d0-dexp((t1-time1)/tau1))
  105.       go to 490
  106.   320 value(locv+1)=v1+(v2-v1)*(1.0d0-dexp((t1-time1)/tau1))
  107.      1   +(v1-v2)*(1.0d0-dexp((t2-time1)/tau2))
  108.       go to 490
  109. c
  110. c  piecewise-linear source
  111. c
  112.   400 t1=value(locp+1)
  113.       v1=value(locp+2)
  114.       t2=value(locp+3)
  115.       v2=value(locp+4)
  116.       iknt=4
  117.   410 if (time.le.t2) go to 420
  118.       t1=t2
  119.       v1=v2
  120.       t2=value(locp+iknt+1)
  121.       v2=value(locp+iknt+2)
  122.       iknt=iknt+2
  123.       go to 410
  124.   420 value(locv+1)=v1+((time-t1)/(t2-t1))*(v2-v1)
  125.       go to 490
  126. c
  127. c  single-frequency fm
  128. c
  129.   450 v1=value(locp+1)
  130.       v2=value(locp+2)
  131.       omegc=value(locp+3)
  132.       xmod=value(locp+4)
  133.       omegs=value(locp+5)
  134.       value(locv+1)=v1+v2*dsin(omegc*time+xmod*dsin(omegs*time))
  135.   490 loc=nodplc(loc)
  136.       go to 10
  137.   500 continue
  138. c
  139. c  update transmission line sources
  140. c
  141.       if (jelcnt(17).eq.0) go to 1000
  142.       if (mode.ne.2) go to 1000
  143.       call sizmem(ltd,ltdsiz)
  144.       numtd=ltdsiz/ntlin
  145.       if (numtd.lt.3) go to 900
  146.       loc=locate(17)
  147.   610 if (loc.eq.0) go to 1000
  148.       locv=nodplc(loc+1)
  149.       td=value(locv+2)
  150.       baktim=time-td
  151.       if (baktim.lt.0.0d0) go to 640
  152.       ltdptr=nodplc(loc+30)
  153.       icntr=2
  154.       l1=ltd
  155.       l2=l1+ntlin
  156.       l3=l2+ntlin
  157.       t1=value(l1+1)
  158.       t2=value(l2+1)
  159.   620 t3=value(l3+1)
  160.       icntr=icntr+1
  161.       if (baktim.le.t3) go to 630
  162.       if (icntr.eq.numtd) go to 900
  163.       l1=l2
  164.       l2=l3
  165.       l3=l2+ntlin
  166.       t1=t2
  167.       t2=t3
  168.       go to 620
  169.   630 dt1t2=t1-t2
  170.       dt1t3=t1-t3
  171.       dt2t3=t2-t3
  172.       tdnom1=1.0d0/(dt1t2*dt1t3)
  173.       tdnom2=-1.0d0/(dt1t2*dt2t3)
  174.       tdnom3=1.0d0/(dt2t3*dt1t3)
  175.       dtt1=baktim-t1
  176.       dtt2=baktim-t2
  177.       dtt3=baktim-t3
  178.       tfact1=dtt2*dtt3*tdnom1
  179.       tfact2=dtt1*dtt3*tdnom2
  180.       tfact3=dtt1*dtt2*tdnom3
  181.       value(locv+3)=value(l1+ltdptr+0)*tfact1+value(l2+ltdptr+0)*tfact2
  182.      1   +value(l3+ltdptr+0)*tfact3
  183.       value(locv+4)=value(l1+ltdptr+1)*tfact1+value(l2+ltdptr+1)*tfact2
  184.      1   +value(l3+ltdptr+1)*tfact3
  185.   640 loc=nodplc(loc)
  186.       go to 610
  187. c
  188. c  internal logic error:  less than 3 entries in ltd
  189. c
  190.   900 nogo=1
  191.       write (iofile,901) numtd,icntr
  192.   901 format('0*abort*:  internal spice error:  sorupd:  ',2i5/)
  193. c
  194. c  finished
  195. c
  196.  1000 return
  197.       end
  198.