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