|
|
1.1 root 1: subroutine readin
2: implicit double precision (a-h,o-z)
3: c
4: c
5: c this routine drives the input processing of spice. element cards
6: c and device models are handled by this routine.
7: c
8: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
9: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
10: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
11: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
12: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
13: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
14: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
15: 1 defas,rstats(50),iwidth,lwidth,nopage
16: common /line/ achar,afield(15),oldlin(15),kntrc,kntlim
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 /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
25: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
26: common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
27: 1 kinel,kidin,kovar,kidout
28: common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
29: 1 inoise,nosprt,nosout,nosin,idist,idprt
30: common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
31: common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
32: 1 ilogy(8),npoint,numout,kntr,numdgt
33: common /cje/ maxtim,itime,icost
34: common /blank/ value(1000)
35: integer nodplc(64)
36: complex*16 cvalue(32)
37: equivalence (value(1),nodplc(1),cvalue(1))
38: c
39: c control card identifiers
40: c
41: dimension aide(20),nnods(20),ntnods(20)
42: dimension numic(4)
43: dimension aidm(8),ipolar(8),modid(8),ipar(6),ampar(120)
44: dimension titinp(4)
45: dimension aidc(20)
46: dimension alibm(6),alpar(46,6),dummy1(92),dummy2(92),dummy3(92)
47: equivalence (alpar(1,1),dummy1(1)),(alpar(1,3),dummy2(1))
48: equivalence (alpar(1,5),dummy3(1))
49: data titinp / 8hinput li, 8hsting , 8h , 8h /
50: data naidc / 20 /
51: data aidc / 8hac , 8hdc , 8hdistorti, 8hend ,
52: 1 8hends , 8hfourier , 8hmodel , 8hnoise ,
53: 2 8hop , 8hoptions , 8hplot , 8hprint ,
54: 3 8hsubckt , 8hsensitiv, 8htransien, 8htf ,
55: 4 8htemperat, 8hwidth , 8hnodeset , 8hic /
56: c
57: c element card identifiers, keywords, and information
58: c
59: data aide / 1hr,1hc,1hl,1hk,1hg,1he,1hf,1hh,1hv,1hi,1hd,1hq,1hj,
60: 1 1hm,1hs,1hy,1ht,0.0d0,1hx,0.0d0 /
61: data alsac,alspu,alsex,alssi /2hac,2hpu,2hex,2hsi/
62: data alsoff,alsdc,alspw / 3hoff,2hdc,3hpw /
63: data alsz0,alszo,alsnl,alsf,alstd / 2hz0,2hzo,2hnl,1hf,2htd /
64: data alsl,alsw,alsas,alsad,alsrd,alsrs / 1hl,1hw,2has,2had,2hrd,
65: 1 2hrs /
66: data alszx /2hzx/
67: data alssf / 4hsf /
68: data apoly, aic, area / 4hpoly, 2hic, 4harea /
69: data alstc / 2htc /
70: data numic / 1, 2, 2, 3 /
71: data ablnk, aper / 1h , 1h. /
72: data nnods / 2,2,2,0,2,2,2,2,2,2,2,3,3,4,4,4,4,0,0,0 /
73: data ntnods / 2,2,2,0,2,2,2,2,2,2,3,6,5,6,4,4,4,0,0,0 /
74: c
75: c model card keywords
76: c
77: data aidm /1hd,3hnpn,3hpnp,3hnjf,3hpjf,4hnmos,4hpmos,4hgaas/
78: data ipolar /0,1,-1,1,-1,1,-1,0/
79: data modid /1,2,2,3,3,4,4,4/
80: data ipar / 0, 14, 60, 72, 106, 119 /
81: data ampar /
82: 1 6his ,6hrs ,6hn ,6htt ,6hcjo ,6hpb ,6hm ,
83: 2 6heg ,6hpt ,6hkf ,6haf ,6hfc ,6hbv ,6hibv ,
84: 1 6hjs ,6hbf ,6hnf ,6hvbf ,6hjbf ,6hjle ,6hnle ,
85: 2 6hbr ,6hnr ,6hvbr ,6hjbr ,6hjlc ,6hnlc ,6h0 ,
86: 3 6h0 ,6hrb ,6hjrb ,6hrbm ,6hre ,6hrc ,6hcje ,
87: 4 6hvje ,6hmje ,6htf ,6hxtf ,6hvtf ,6hjtf ,6hptf ,
88: 5 6hcjc ,6hvjc ,6hmjc ,6hcdis ,6htr ,6h0 ,6h0 ,
89: 6 6h0 ,6h0 ,6hcjs ,6hvjs ,6hmjs ,6htb ,6heg ,
90: 7 6hpt ,6hkf ,6haf ,6hfc ,
91: 1 6hvto ,6hbeta ,6hlambda,6hrd ,6hrs ,6hcgs ,6hcgd ,
92: 2 6hpb ,6his ,6hkf ,6haf ,6hfc ,
93: 1 6hvto ,6hkp ,6hgamma ,6hphi ,6hlambda,6hrd ,6hrs ,
94: 2 6hcgs ,6hcgd ,6hcgb ,6hcbd ,6hcbs ,6htox ,6hpb ,
95: 3 6hjs ,6hnsub ,6hnss ,6hnfs ,6hxj ,6hld ,6hngate ,
96: 4 6htps ,6huo ,6hucrit ,6huexp ,6hutra ,6hkf ,6haf ,
97: 5 6hfc ,6hwd ,6hecrit ,6hetra ,6hvnorm ,6hdesat ,
98: 1 6hvp ,6hvbr ,6hvbi ,6hvfwd ,6hnd ,6hkdso ,6hkdv ,
99: 2 6hcdso ,6hczg ,6hgnoise,6hnexp ,6hkf ,6haf ,0.0d0 /
100: data alibm /7hlib001n,7hlib002n,7hlib239n,7hlib250n,7hlib255n,
101: 1 7hlib620n/
102: data dummy1/
103: * 1.60d-16, 1.08d+02, 1.04d+00, 1.34d+02, 1.54d-02, 1.20d-14,
104: * 1.53d+00, 5.86d-01, 1.03d+00, 1.00d+10, 9.82d-03, 0.0d0,
105: * 0.0d0, 0.0d0, 1.04d+00, 2.40d+02, 6.47d-04, 1.80d+02,
106: * 3.90d+00, 9.20d+01, 1.90d-13, 6.70d-01, 3.33d-01, 1.51d-10,
107: * 0.0d0, 0.0d0, 0.0d0, 9.14d0, 1.60d-13, 4.20d-01,
108: * 3.33d-01, 9.70d-01, 1.51d-09, 0.0d0, 0.0d0, 0.0d0,
109: * 0.0d0, 1.60d-13, 4.20d-01, 3.33d-01, 1.10d+00, 1.11d+00,
110: * 0.0d0, 0.0d0, 0.0d0, 0.0d0,
111: * 6.17d-16, 1.64d+02, 1.05d+00, 7.60d+01, 3.34d-02, 2.50d-14,
112: * 1.49d+00, 1.36d+00, 1.05d+00, 1.00d+10, 2.15d-04, 0.0d0,
113: * 0.0d0, 0.0d0, 1.05d+00, 7.33d+01, 2.14d-03, 3.00d+01,
114: * 2.70d+00, 1.00d+01, 5.70d-13, 6.70d-01, 3.33d-01, 1.25d-10,
115: * 0.0d0, 0.0d0, 0.0d0, 10.22d0, 5.20d-13, 4.80d-01,
116: * 3.33d-01, 7.50d-01, 1.25d-09, 0.0d0, 0.0d0, 0.0d0,
117: * 0.0d0, 5.20d-13, 4.80d-01, 3.33d-01, 1.10d+00, 1.11d+00,
118: * 0.0d0, 0.0d0, 0.0d0, 0.0d0/
119: data dummy2 /
120: * 2.89d-16, 6.88d+01, 1.01d+00, 4.43d+01, 1.67d-01, 1.60d-13,
121: * 1.85d+00, 3.32d-01, 1.10d+00, 1.00d+10, 3.42d-03, 0.0d0,
122: * 0.0d0, 0.0d0, 1.01d+00, 2.00d+01, 8.18d-03, 1.00d+01,
123: * 1.90d+00, 5.50d+00, 5.70d-13, 1.20d+00, 5.00d-01, 1.80d-11,
124: * 0.0d0, 0.0d0, 0.0d0, 38.2d0, 5.60d-13, 8.20d-01,
125: * 5.00d-01, 3.50d-01, 1.80d-10, 0.0d0, 0.0d0, 0.0d0,
126: * 0.0d0, 5.60d-13, 8.20d-01, 5.00d-01, 1.10d+00, 1.11d+00,
127: * 0.0d0, 0.0d0, 0.0d0, 0.0d0,
128: * 1.90d-15, 1.02d+02, 1.08d+00, 5.50d+01, 7.63d-02, 8.80d-14,
129: * 1.98d+00, 5.54d+00, 1.05d+00, 1.00d+10, 1.36d-02, 0.0d0,
130: * 0.0d0, 0.0d0, 1.08d+00, 1.27d+02, 1.23d-03, 1.50d+01,
131: * 2.50d+00, 6.00d+00, 4.80d-13, 1.20d+00, 5.00d-01, 4.40d-11,
132: * 0.0d0, 0.0d0, 0.0d0, 16.15d0, 2.90d-13, 4.20d-01,
133: * 3.33d-01, 6.10d-01, 4.40d-10, 0.0d0, 0.0d0, 0.0d0,
134: * 0.0d0, 2.90d-13, 4.20d-01, 3.33d-01, 1.10d+00, 1.11d+00,
135: * 0.0d0, 0.0d0, 0.0d0, 0.0d0/
136: data dummy3 /
137: * 1.90d-16, 1.00d+02, 1.00d+00, 5.70d+01, 4.17d-02, 4.80d-16,
138: * 1.38d+00, 6.19d-01, 1.04d+00, 1.00d+10, 5.52d-03, 0.0d0,
139: * 0.0d0, 0.0d0, 1.00d+00, 1.33d+02, 1.17d-03, 1.60d+01,
140: * 2.40d+00, 7.00d+00, 3.20d-13, 1.20d+00, 5.00d-01, 4.70d-11,
141: * 0.0d0, 0.0d0, 0.0d0, 14.51d0, 2.40d-13, 3.60d-01,
142: * 3.33d-01, 4.50d-01, 4.70d-10, 0.0d0, 0.0d0, 0.0d0,
143: * 0.0d0, 2.40d-13, 3.60d-01, 3.33d-01, 1.10d+00, 1.11d+00,
144: * 0.0d0, 0.0d0, 0.0d0, 0.0d0,
145: * 1.59d-15, 9.14d+01, 1.03d+00, 6.00d+01, 2.06d-01, 1.33d-16,
146: * 1.23d+00, 1.27d+01, 1.00d+00, 1.00d+10, 5.39d-02, 0.0d0,
147: * 0.0d0, 0.0d0, 1.03d+00, 8.33d+01, 1.87d-03, 8.00d+00,
148: * 1.20d+00, 3.50d+00, 1.30d-12, 1.20d+00, 5.00d-01, 3.26d-11,
149: * 0.0d0, 0.0d0, 0.0d0, 45.87d0, 7.50d-13, 5.50d-01,
150: * 3.33d-01, 9.70d-01, 3.26d-10, 0.0d0, 0.0d0, 0.0d0,
151: * 0.0d0, 7.50d-13, 5.50d-01, 3.33d-01, 1.10d+00, 1.11d+00,
152: * 0.0d0, 0.0d0, 0.0d0, 0.0d0/
153: c
154: c initialize variables
155: c
156: call second(t1)
157: call getlin
158: if (keof.ne.0) go to 6000
159: call copy8(afield,atitle,15)
160: call getm4(ielmnt,0)
161: call getm8(itemps,1)
162: value(itemps+1)=25.0d0
163: itemno=1
164: nopage=0
165: call title(-1,72,1,titinp)
166: iwidth=80
167: do 5 i=1,8
168: achar=ablnk
169: call move(achar,1,atitle(10),i,1)
170: if(achar.eq.ablnk) go to 8
171: 5 continue
172: write(6,6)
173: 6 format('0warning: input line-width set to 72 columns because',/
174: 11x,'possible sequencing appears in cols 73-80')
175: iwidth=72
176: 8 do 10 i=1,15
177: afield(i)=ablnk
178: 10 continue
179: call copy8(afield,oldlin,15)
180: call getm4(isbckt,0)
181: nsbckt=0
182: call getm8(iunsat,0)
183: nunsat=0
184: lwidth=80
185: iprnta=1
186: iprntl=1
187: iprntm=1
188: iprntn=1
189: iprnto=0
190: gmin=1.0d-12
191: reltol=0.001d0
192: abstol=1.0d-12
193: vntol=50.0d-6
194: trtol=7.0d0
195: chgtol=1.0d-14
196: defl=1.0d0
197: defw=1.0d0
198: defad=1.0d-12
199: defas=1.0d-12
200: numdgt=4
201: numtem=1
202: itl1=100
203: itl2=50
204: itl3=4
205: itl4=10
206: itl5=5000
207: limtim=2
208: limpts=201
209: lvlcod=2
210: lvltim=1
211: method=1
212: xmu=0.5d0
213: maxord=2
214: nosolv=0
215: icvflg=0
216: itcelm(2)=0
217: idist=0
218: idprt=0
219: inoise=0
220: jacflg=0
221: jtrflg=0
222: call getm4(ifour,0)
223: nfour=0
224: call getm4(nsnod,0)
225: call getm8(nsval,0)
226: call getm4(icnod,0)
227: call getm8(icval,0)
228: kinel=0
229: kovar=0
230: kssop=0
231: nosprt=0
232: nsens=0
233: call getm4(isens,0)
234: numnod=0
235: ncnods=0
236: nunods=0
237: call zero4(locate,50)
238: call zero4(jelcnt,50)
239: insize=50
240: call getm8(ifield,insize)
241: call getm4(icode,insize)
242: call getm8(idelim,insize)
243: call getm4(icolum,insize)
244: go to 50
245: c
246: c error entry
247: c
248: 40 nogo=1
249: c
250: c read and decode next card in input deck
251: c
252: 50 igoof=0
253: call card
254: if (keof.ne.0) go to 5000
255: if (igoof.ne.0) go to 40
256: if (nodplc(icode+1).eq.0) go to 95
257: anam=value(ifield+1)
258: call move(anam,2,ablnk,1,7)
259: if (anam.ne.aper) go to 70
260: call move(anam,1,value(ifield+1),2,7)
261: call keysrc(aidc,naidc,anam,id)
262: if (id.le.0) go to 90
263: if (id.eq.4) go to 5000
264: if (id.eq.5) go to 800
265: if (id.eq.7) go to 500
266: if (id.eq.13) go to 700
267: if (nsbckt.ge.1) go to 85
268: call runcon(id)
269: if (igoof.ne.0) go to 40
270: go to 50
271: 70 id=0
272: 80 id=id+1
273: if (id.gt.20) go to 90
274: if (anam.eq.aide(id)) go to 100
275: go to 80
276: 85 write (6,86)
277: 86 format('0warning: above line not allowed within subcircuit -- ',
278: 1 'ignored'/)
279: go to 50
280: 90 write (6,91) value(ifield+1)
281: 91 format('0*error*: unknown data card: ',a8/)
282: go to 40
283: 95 write (6,96)
284: 96 format('0*error*: unrecognizable data card'/)
285: go to 40
286: c
287: c element and device cards
288: c
289: 100 call find(value(ifield+1),id,loc,1)
290: locv=nodplc(loc+1)
291: if (id.eq.4) go to 140
292: if (id.eq.19) go to 900
293: istop=nnods(id)+1
294: do 110 i=2,istop
295: if (nodplc(icode+i).ne.0) go to 410
296: if (value(ifield+i).lt.0.0d0) go to 400
297: 110 nodplc(loc+i)=value(ifield+i)
298: go to (120,130,130,140,150,150,180,180,200,200,300,300,300,300,
299: 1 390,390,350,390,390,390), id
300: c
301: c resistor
302: c
303: 120 if (nodplc(icode+4).ne.0) go to 420
304: if (value(ifield+4).eq.0.0d0) go to 480
305: value(locv+2)=value(ifield+4)
306: ifld=4
307: 122 ifld=ifld+1
308: if (nodplc(icode+ifld)) 50,122,124
309: 124 anam=value(ifield+ifld)
310: if (anam.ne.alstc) go to 460
311: ifld=ifld+1
312: if (nodplc(icode+ifld)) 50,126,124
313: 126 value(locv+3)=value(ifield+ifld)
314: ifld=ifld+1
315: if (nodplc(icode+ifld)) 50,128,124
316: 128 value(locv+4)=value(ifield+ifld)
317: go to 50
318: c
319: c capacitor or inductor
320: c
321: 130 ifld=3
322: iknt=0
323: ltab=7
324: if (id.eq.3) ltab=10
325: call getm8(nodplc(loc+ltab),0)
326: if (nodplc(icode+4).ne.1) go to 132
327: anam=value(ifield+4)
328: if (anam.ne.apoly) go to 450
329: ifld=4
330: 132 ifld=ifld+1
331: if (nodplc(icode+ifld).ne.0) go to 136
332: call extmem(nodplc(loc+ltab),1)
333: iknt=iknt+1
334: ispot=nodplc(loc+ltab)+iknt
335: value(ispot)=value(ifield+ifld)
336: go to 132
337: 136 if (iknt.eq.0) go to 420
338: if (nodplc(icode+ifld).ne.1) go to 50
339: anam=value(ifield+ifld)
340: if (anam.ne.aic) go to 460
341: ifld=ifld+1
342: if (nodplc(icode+ifld)) 50,138,136
343: 138 value(locv+2)=value(ifield+ifld)
344: go to 50
345: c
346: c mutual inductance
347: c
348: 140 if (nodplc(icode+2).ne.1) go to 430
349: anam=value(ifield+2)
350: call move(anam,2,ablnk,1,7)
351: if (anam.ne.aide(3)) go to 430
352: call extnam(value(ifield+2),nodplc(loc+2))
353: if (nodplc(icode+3).ne.1) go to 430
354: anam=value(ifield+3)
355: call move(anam,2,ablnk,1,7)
356: if (anam.ne.aide(3)) go to 430
357: call extnam(value(ifield+3),nodplc(loc+3))
358: if (nodplc(icode+4).ne.0) go to 420
359: xk=value(ifield+4)
360: if (xk.le.0.0d0) go to 420
361: if (xk.le.1.0d0) go to 145
362: xk=1.0d0
363: write (6,141)
364: 141 format('0warning: coefficient of coupling reset to 1.0d0'/)
365: 145 value(locv+1)=xk
366: go to 50
367: c
368: c voltage controlled (nonlinear) sources
369: c
370: 150 ndim=1
371: ifld=3
372: if (nodplc(icode+4)) 410,156,152
373: 152 anam=value(ifield+4)
374: if (anam.ne.apoly) go to 450
375: if (nodplc(icode+5).ne.0) go to 420
376: ndim=value(ifield+5)
377: if (ndim.le.0) go to 420
378: ifld=5
379: 156 nodplc(loc+4)=ndim
380: ltab=id+1
381: nssnod=2*ndim
382: nmat=4*ndim
383: if (id.eq.6) nmat=4+2*ndim
384: call getm4(nodplc(loc+ltab),nssnod)
385: call getm4(nodplc(loc+ltab+1),nmat)
386: call getm8(nodplc(loc+ltab+2),0)
387: call getm8(nodplc(loc+ltab+3),ndim)
388: call getm4(nodplc(loc+ltab+4),ndim)
389: call getm8(nodplc(loc+ltab+5),ndim)
390: ispot=nodplc(loc+ltab+5)
391: call zero8(value(ispot+1),ndim)
392: lnod=nodplc(loc+ltab)
393: do 158 i=1,nssnod
394: ifld=ifld+1
395: if (nodplc(icode+ifld).ne.0) go to 410
396: if (value(ifield+ifld).lt.0.0d0) go to 400
397: nodplc(lnod+i)=value(ifield+ifld)
398: 158 continue
399: 160 iknt=0
400: 162 ifld=ifld+1
401: if (nodplc(icode+ifld).ne.0) go to 164
402: call extmem(nodplc(loc+ltab+2),1)
403: iknt=iknt+1
404: ispot=nodplc(loc+ltab+2)+iknt
405: value(ispot)=value(ifield+ifld)
406: go to 162
407: 164 if (iknt.eq.0) go to 420
408: if (nodplc(icode+ifld).ne.1) go to 170
409: anam=value(ifield+ifld)
410: if (anam.ne.aic) go to 460
411: do 168 i=1,ndim
412: ifld=ifld+1
413: if (nodplc(icode+ifld)) 170,166,420
414: 166 ispot=nodplc(loc+ltab+5)+i
415: value(ispot)=value(ifield+ifld)
416: 168 continue
417: 170 if (ndim.ne.1) go to 50
418: if (iknt.ne.1) go to 50
419: call extmem(nodplc(loc+ltab+2),1)
420: ispot=nodplc(loc+ltab+2)
421: value(ispot+2)=value(ispot+1)
422: value(ispot+1)=0.0d0
423: go to 50
424: c
425: c current controlled (nonlinear) sources
426: c
427: 180 ndim=1
428: ifld=3
429: if (nodplc(icode+4).ne.1) go to 470
430: anam=value(ifield+4)
431: if (anam.ne.apoly) go to 182
432: ifld=5
433: if (nodplc(icode+5).ne.0) go to 420
434: ndim=value(ifield+5)
435: if (ndim.le.0) go to 420
436: 182 nodplc(loc+4)=ndim
437: ltab=id-1
438: nmat=2*ndim
439: if (id.eq.8) nmat=4+ndim
440: call getm4(nodplc(loc+ltab),ndim)
441: call getm4(nodplc(loc+ltab+1),nmat)
442: call getm8(nodplc(loc+ltab+2),0)
443: call getm8(nodplc(loc+ltab+3),ndim)
444: call getm4(nodplc(loc+ltab+4),ndim)
445: call getm8(nodplc(loc+ltab+5),ndim)
446: ispot=nodplc(loc+ltab+5)
447: call zero8(value(ispot+1),ndim)
448: do 184 i=1,ndim
449: ifld=ifld+1
450: if (nodplc(icode+ifld).ne.1) go to 470
451: anam=value(ifield+ifld)
452: call move(anam,2,ablnk,1,7)
453: if (anam.ne.aide(9)) go to 470
454: call extnam(value(ifield+ifld),loct)
455: ispot=nodplc(loc+ltab)+i
456: nodplc(ispot)=loct
457: 184 continue
458: go to 160
459: c
460: c independent sources
461: c
462: 200 ifld=3
463: call getm8(nodplc(loc+5),0)
464: 210 ifld=ifld+1
465: 215 if (nodplc(icode+ifld)) 50,220,230
466: 220 if (ifld.gt.4) go to 210
467: 225 value(locv+1)=value(ifield+ifld)
468: go to 210
469: 230 anam=value(ifield+ifld)
470: if (anam.ne.alsdc) go to 235
471: ifld=ifld+1
472: if (nodplc(icode+ifld)) 50,225,230
473: 235 if (anam.ne.alsac) go to 260
474: value(locv+2)=1.0d0
475: ifld=ifld+1
476: if (nodplc(icode+ifld)) 50,240,230
477: 240 value(locv+2)=value(ifield+ifld)
478: ifld=ifld+1
479: if (nodplc(icode+ifld)) 50,250,230
480: 250 value(locv+3)=value(ifield+ifld)
481: go to 210
482: 260 id=0
483: call move(anam,3,ablnk,1,6)
484: if (anam.eq.alspu) id=1
485: if (anam.eq.alssi) id=2
486: if (anam.eq.alsex) id=3
487: if (anam.eq.alspw) id=4
488: if (anam.eq.alssf) id=5
489: if (id.eq.0) go to 450
490: nodplc(loc+4)=id
491: iknt=0
492: 270 ifld=ifld+1
493: if (nodplc(icode+ifld).ne.0) go to 280
494: call extmem(nodplc(loc+5),1)
495: iknt=iknt+1
496: ispot=nodplc(loc+5)+iknt
497: value(ispot)=value(ifield+ifld)
498: go to 270
499: 280 aval=0.0d0
500: if (id.ne.4) go to 285
501: c... for pwl source function, force even number of input values
502: ibit=0
503: if(iknt.ne.(iknt/2)*2) ibit=1
504: aval=value(ispot)
505: if (ibit.eq.0) go to 290
506: call extmem(nodplc(loc+5),1)
507: aval=value(ispot-1)
508: iknt=iknt+1
509: ispot=nodplc(loc+5)+iknt
510: value(ispot)=aval
511: go to 290
512: 285 if (iknt.ge.7) go to 215
513: 290 call extmem(nodplc(loc+5),2)
514: ispot=nodplc(loc+5)+iknt
515: value(ispot+1)=0.0d0
516: value(ispot+2)=aval
517: iknt=iknt+2
518: go to 285
519: c
520: c device cards
521: c
522: 300 if(id.ne.14) value(locv+1)=1.0d0
523: locm=loc+ntnods(id)+2
524: ifld=nnods(id)+2
525: c
526: c temporarily (until modchk) put substrate node into nodplc(loc+5)
527: c
528: if(id.ne.12) go to 308
529: if(nodplc(icode+5).ne.0) go to 308
530: ifld=6
531: nodplc(loc+5)=value(ifield+5)
532: 308 continue
533: if (nodplc(icode+ifld).ne.1) go to 440
534: call extnam(value(ifield+ifld),nodplc(locm))
535: 310 ifld=ifld+1
536: if (nodplc(icode+ifld)) 50,325,315
537: 315 anam=value(ifield+ifld)
538: if (anam.ne.alsoff) go to 320
539: nodplc(locm+1)=1
540: go to 310
541: 320 if (anam.ne.area) go to 330
542: ifld=ifld+1
543: if (nodplc(icode+ifld)) 50,325,315
544: 325 if (value(ifield+ifld).le.0.0d0) go to 420
545: if (id.eq.14) go to 343
546: value(locv+1)=value(ifield+ifld)
547: go to 310
548: 330 if (anam.ne.aic) go to 341
549: iknt=0
550: icloc=0
551: if (id.eq.14) icloc=3
552: maxknt=numic(id-10)
553: 335 ifld=ifld+1
554: if (nodplc(icode+ifld)) 50,340,315
555: 340 iknt=iknt+1
556: if (iknt.gt.maxknt) go to 335
557: value(locv+icloc+iknt+1)=value(ifield+ifld)
558: go to 335
559: 341 if (id.ne.14) go to 460
560: ispot=0
561: if (anam.eq.alsl) ispot=1
562: if (anam.eq.alsw) ispot=2
563: if (anam.eq.alsad) ispot=3
564: if(anam.eq.alszx) ispot=3
565: if (anam.eq.alsas) ispot=4
566: if(anam.eq.alsrd) ispot=11
567: if(anam.eq.alsrs) ispot=12
568: if (ispot.eq.0) go to 460
569: ifld=ifld+1
570: if (nodplc(icode+ifld)) 50,342,315
571: 342 if (value(ifield+ifld).le.0.0d0) go to 420
572: value(locv+ispot)=value(ifield+ifld)
573: go to 310
574: 343 iknt=0
575: 344 iknt=iknt+1
576: if(value(ifield+ifld).le.0.0d0) go to 420
577: if(iknt.gt.12) go to 490
578: if(iknt.eq.5) iknt=11
579: value(locv+iknt)=value(ifield+ifld)
580: ifld=ifld+1
581: if(nodplc(icode+ifld)) 345,344,345
582: 345 if(nodplc(icode+ifld)) 50,50,315
583: c
584: c transmission lines
585: c
586: 350 ifld=5
587: xnl=0.25d0
588: tfreq=0.0d0
589: 355 ifld=ifld+1
590: if (nodplc(icode+ifld)) 378,355,360
591: 360 anam=value(ifield+ifld)
592: if (anam.eq.aic) go to 364
593: if (anam.eq.alsnl) go to 370
594: if (anam.eq.alsf) go to 374
595: id=0
596: if (anam.eq.alsz0) id=1
597: if (anam.eq.alszo) id=1
598: if (anam.eq.alstd) id=2
599: if (id.eq.0) go to 460
600: ifld=ifld+1
601: if (nodplc(icode+ifld)) 378,362,360
602: 362 if (value(ifield+ifld).le.0.0d0) go to 420
603: value(locv+id)=value(ifield+ifld)
604: go to 355
605: 364 iknt=0
606: 366 ifld=ifld+1
607: if (nodplc(icode+ifld)) 378,368,360
608: 368 iknt=iknt+1
609: if (iknt.gt.4) go to 366
610: value(locv+iknt+4)=value(ifield+ifld)
611: go to 366
612: 370 ifld=ifld+1
613: if (nodplc(icode+ifld)) 378,372,360
614: 372 if (value(ifield+ifld).le.0.0d0) go to 420
615: xnl=value(ifield+ifld)
616: go to 355
617: 374 ifld=ifld+1
618: if (nodplc(icode+ifld)) 378,376,360
619: 376 if (value(ifield+ifld).le.0.0d0) go to 420
620: tfreq=value(ifield+ifld)
621: go to 355
622: 378 if (value(locv+1).ne.0.0d0) go to 380
623: write (6,379)
624: 379 format('0*error*: z0 must be specified'/)
625: go to 40
626: 380 if (value(locv+2).ne.0.0d0) go to 50
627: if (tfreq.ne.0.0d0) go to 382
628: write (6,381)
629: 381 format('0*error*: either td or f must be specified'/)
630: go to 40
631: 382 value(locv+2)=xnl/tfreq
632: go to 50
633: c
634: c elements not yet implemented
635: c
636: 390 write (6,391)
637: 391 format('0*error*: element type not yet implemented'/)
638: go to 40
639: c
640: c element card errors
641: c
642: 400 write (6,401)
643: 401 format('0*error*: negative node number found'/)
644: go to 40
645: 410 write (6,411)
646: 411 format('0*error*: node numbers are missing'/)
647: go to 40
648: 420 write (6,421)
649: 421 format('0*error*: value is missing or is nonpositive'/)
650: go to 40
651: 430 write (6,431)
652: 431 format('0*error*: mutual inductance references are missing'/)
653: go to 40
654: 440 write (6,441)
655: 441 format('0*error*: model name is missing'/)
656: go to 40
657: 450 write (6,451) anam
658: 451 format('0*error*: unknown source function: ',a8)
659: go to 40
660: 460 write (6,461) anam
661: 461 format('0*error*: unknown parameter: ',a8/)
662: go to 40
663: 470 write (6,471)
664: 471 format('0*error*: voltage source not found on above line'/)
665: go to 40
666: 480 write (6,481)
667: 481 format('0*error*: value is zero'/)
668: go to 40
669: 490 write(6,491)
670: 491 format('0*error*: extra numerical data on mosfet card'/)
671: go to 40
672: c
673: c model card
674: c
675: 500 if (nodplc(icode+2).ne.1) go to 650
676: if (nodplc(icode+3).ne.1) go to 650
677: c
678: c process for library models
679: c
680: iknt=0
681: 502 iknt=iknt+1
682: if(iknt.gt.6) go to 506
683: if(alibm(iknt).ne.value(ifield+3)) go to 502
684: ipol=ipolar(2)
685: jtype=modid(2)
686: id=jtype+20
687: call find(value(ifield+2),id,loc,1)
688: nodplc(loc+2)=ipol
689: locv=nodplc(loc+1)
690: do 504 i=1,46
691: 504 value(locv+i)=alpar(i,iknt)
692: go to 520
693: 506 id=0
694: 510 id=id+1
695: if (id.gt.8) go to 660
696: if (value(ifield+3).ne.aidm(id)) go to 510
697: ipol=ipolar(id)
698: jtype=modid(id)
699: id=jtype+20
700: call find(value(ifield+2),id,loc,1)
701: c... adjust jtype for gaas
702: if(jtype.eq.4.and.ipol.eq.0) jtype=5
703: nodplc(loc+2)=ipol
704: locv=nodplc(loc+1)
705: 520 locm=ipar(jtype)
706: nopar=ipar(jtype+1)-locm
707: ifld=3
708: 530 ifld=ifld+1
709: if (nodplc(icode+ifld)) 50,530,560
710: 560 anam=value(ifield+ifld)
711: if(jtype.eq.2) anam=alias(anam)
712: iknt=0
713: 570 iknt=iknt+1
714: if (iknt.gt.nopar) go to 670
715: if (anam.ne.ampar(locm+iknt)) go to 570
716: ifld=ifld+1
717: if (nodplc(icode+ifld)) 50,580,560
718: 580 value(locv+iknt)=value(ifield+ifld)
719: ifld=ifld+1
720: if (nodplc(icode+ifld)) 50,590,560
721: 590 iknt=iknt+1
722: if (iknt.gt.nopar) go to 530
723: if (ablnk.ne.ampar(locm+iknt)) go to 530
724: go to 580
725: c
726: c model card errors
727: c
728: 650 write (6,651)
729: 651 format('0*error*: model type is missing'/)
730: go to 40
731: 660 write (6,661) value(ifield+3)
732: 661 format('0*error*: unknown model type: ',a8/)
733: go to 40
734: 670 write (6,671) anam
735: 671 format('0*error*: unknown model parameter: ',a8,/)
736: nogo=1
737: go to 530
738: c
739: c subcircuit definition
740: c
741: 700 if (nodplc(icode+2).ne.1) go to 780
742: call find(value(ifield+2),20,loc,1)
743: call extmem(isbckt,1)
744: nsbckt=nsbckt+1
745: nodplc(isbckt+nsbckt)=loc
746: ifld=2
747: if (nodplc(icode+3).ne.0) go to 790
748: call getm4(nodplc(loc+2),0)
749: iknt=0
750: 710 ifld=ifld+1
751: if (nodplc(icode+ifld)) 50,720,710
752: 720 call extmem(nodplc(loc+2),1)
753: iknt=iknt+1
754: ispot=nodplc(loc+2)+iknt
755: if (value(ifield+ifld).le.0.0d0) go to 770
756: nodplc(ispot)=value(ifield+ifld)
757: node=nodplc(ispot)
758: i=iknt-1
759: 730 if (i.eq.0) go to 710
760: ispot=ispot-1
761: if (nodplc(ispot).eq.node) go to 760
762: i=i-1
763: go to 730
764: 760 write (6,761) node
765: 761 format('0*error*: subcircuit definition duplicates node ',i5,/)
766: go to 40
767: 770 write (6,771)
768: 771 format('0*error*: nonpositive node number found in subcircuit ',
769: 1 'definition'/)
770: go to 40
771: 780 write (6,781)
772: 781 format('0*error*: subcircuit name missing'/)
773: go to 40
774: 790 write (6,791)
775: 791 format('0*error*: subcircuit nodes missing'/)
776: go to 40
777: c
778: c .ends processing
779: c
780: 800 if (nsbckt.eq.0) go to 890
781: iknt=1
782: if (nodplc(icode+2).le.0) go to 820
783: anam=value(ifield+2)
784: iknt=nsbckt
785: 810 loc=nodplc(isbckt+iknt)
786: locv=nodplc(loc+1)
787: anams=value(locv)
788: if (anam.eq.anams) go to 820
789: iknt=iknt-1
790: if (iknt.ne.0) go to 810
791: go to 880
792: 820 irel=nsbckt-iknt+1
793: call relmem(isbckt,irel)
794: nsbckt=nsbckt-irel
795: go to 50
796: 880 write (6,881) anam
797: 881 format('0*error*: unknown subcircuit name: ',a8/)
798: go to 40
799: 890 write (6,891)
800: 891 format('0warning: no subcircuit definition known -- line ignored'
801: 1/)
802: go to 50
803: c
804: c subcircuit call
805: c
806: 900 call getm4(nodplc(loc+2),0)
807: ifld=1
808: iknt=0
809: 910 ifld=ifld+1
810: if (nodplc(icode+ifld).ne.0) go to 920
811: call extmem(nodplc(loc+2),1)
812: iknt=iknt+1
813: ispot=nodplc(loc+2)+iknt
814: if (value(ifield+ifld).lt.0.0d0) go to 400
815: nodplc(ispot)=value(ifield+ifld)
816: go to 910
817: 920 if (iknt.eq.0) go to 410
818: if (nodplc(icode+ifld).ne.1) go to 990
819: call extnam(value(ifield+ifld),nodplc(loc+3))
820: go to 50
821: 990 write (6,991)
822: 991 format('0*error*: subcircuit name missing'/)
823: go to 40
824: c
825: c end
826: c
827: 5000 if (nsbckt.eq.0) go to 5010
828: nsbckt=0
829: write (6,5001)
830: 5001 format('0*error*: .ends card missing'/)
831: nogo=1
832: 5010 call clrmem(ifield)
833: call clrmem(icode)
834: call clrmem(idelim)
835: call clrmem(icolum)
836: call clrmem(isbckt)
837: if (nfour.eq.0) call clrmem(ifour)
838: if (nsens.eq.0) call clrmem(isens)
839: 6000 call second(t2)
840: rstats(1)=t2-t1
841: return
842: end
843: double precision function alias(anam)
844: implicit double precision (a-h,o-z)
845: dimension anam1(15),anam2(15)
846: data anam1 /3his ,3hva ,3hne ,3hvb ,3hnc ,3hccs,3hns ,
847: 1 3hpe ,3hme ,3hpc ,3hmc ,3hps ,3hms ,3hik ,3hikr/
848: data anam2 /3hjs ,3hvbf,3hnle,3hvbr,3hnlc,3hcjs,3hnss,
849: 1 3hvje,3hmje,3hvjc,3hmjc,3hvjs,3hmjs,3hjbf,3hjbr/
850: c
851: c this function returns the mgp equivalent of the gp parameters
852: c (those which apply)
853: c
854: iknt=0
855: alias=anam
856: 10 iknt=iknt+1
857: if(iknt.gt.15) return
858: if(anam1(iknt).ne.anam) go to 10
859: alias=anam2(iknt)
860: return
861: end
862: subroutine keysrc(keytab,lentab,tstwrd,index)
863: implicit double precision (a-h,o-z)
864: double precision keytab
865: c
866: c this routine searches the keyword table 'keytab' for the possible
867: c entry 'tstwrd'. abbreviations are considered as matches.
868: c
869: dimension keytab(lentab)
870: integer xxor
871: data ablnk / 1h /
872: c
873: c
874: index=0
875: lenwrd=0
876: achar=ablnk
877: do 10 i=1,8
878: call move(achar,8,tstwrd,i,1)
879: if (achar.eq.ablnk) go to 20
880: lenwrd=lenwrd+1
881: 10 continue
882: c
883: 20 if (lenwrd.eq.0) go to 40
884: tstchr=ablnk
885: call move(tstchr,8,tstwrd,1,1)
886: 30 index=index+1
887: if (index.gt.lentab) go to 40
888: akey=ablnk
889: call move(akey,1,keytab(index),1,lenwrd)
890: if (xxor(akey,tstwrd).eq.0) go to 50
891: go to 30
892: c
893: 40 index=-1
894: 50 return
895: end
896: subroutine extnam(aname,index)
897: implicit double precision (a-h,o-z)
898: c
899: c this routine adds 'aname' to the list of 'unsatisfied' names (that
900: c is, names which can only be resolved after subcircuit expansion).
901: c
902: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
903: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
904: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
905: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
906: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
907: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
908: common /blank/ value(1000)
909: integer nodplc(64)
910: complex*16 cvalue(32)
911: equivalence (value(1),nodplc(1),cvalue(1))
912: integer xxor
913: c
914: c
915: anam=aname
916: if (nunsat.eq.0) go to 20
917: do 10 index=1,nunsat
918: if (xxor(anam,value(iunsat+index)).eq.0) go to 30
919: 10 continue
920: c
921: 20 call extmem(iunsat,1)
922: nunsat=nunsat+1
923: index=nunsat
924: value(iunsat+index)=anam
925: 30 return
926: end
927: subroutine runcon(id)
928: implicit double precision (a-h,o-z)
929: c
930: c this routine processes run control cards.
931: c
932: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
933: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
934: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
935: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
936: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
937: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
938: common /cje/ maxtim,itime,icost
939: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
940: 1 defas,rstats(50),iwidth,lwidth,nopage
941: common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
942: 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs
943: common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet,
944: 1 xmu,mode,modedc,icalc,initf,method,iord,maxord,noncon,iterno,
945: 2 itemno,nosolv,ipostp,iscrch
946: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
947: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
948: common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
949: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
950: common /dc/ tcstar(2),tcstop(2),tcincr(2),icvflg,itcelm(2),kssop,
951: 1 kinel,kidin,kovar,kidout
952: common /ac/ fstart,fstop,fincr,skw2,refprl,spw2,jacflg,idfreq,
953: 1 inoise,nosprt,nosout,nosin,idist,idprt
954: common /tran/ tstep,tstop,tstart,delmax,tdmax,forfre,jtrflg
955: common /outinf/ xincr,string(15),xstart,yvar(8),itab(8),itype(8),
956: 1 ilogy(8),npoint,numout,kntr,numdgt
957: common /blank/ value(1000)
958: integer nodplc(64)
959: complex*16 cvalue(32)
960: equivalence (value(1),nodplc(1),cvalue(1))
961: dimension iprnt(5),limits(4),itrlim(5),contol(6),dflts(4)
962: equivalence (iprnt(1),iprnta),(limits(1),limtim),(itrlim(1),itl1),
963: 1 (contol(1),gmin),(dflts(1),defl)
964: c
965: c
966: integer xxor
967: c
968: c print/plot keywords
969: c
970: dimension aopt(5)
971: dimension aopts(31),lsetop(5)
972: dimension aide(20)
973: data aopt / 2hdc, 2htr, 2hac, 2hno, 2hdi /
974: c
975: c options card keywords
976: c
977: data aopts / 6hnoacct, 6hnolist, 6hnomod , 6hnonode, 6hopts ,
978: 1 6hitl1 , 6hitl2 , 6hitl3 , 6hitl4 , 6hitl5 ,
979: 2 6hlimtim, 6hlimpts, 6hlvlcod, 6hlvltim, 6hgmin ,
980: 3 6hreltol, 6habstol, 6hvntol , 6htrtol , 6hchgtol,
981: 4 6htnom , 6hnumdgt, 6hmaxord, 6hmethod, 6hnopage,
982: 5 6hmu , 6hcptime, 6hdefl , 6hdefw , 6hdefad ,
983: 6 6hdefas /
984: data lsetop / 0 ,0, 0, 0, 1 /
985: c
986: c
987: data aide / 1hr,1hc,1hl,1hk,1hg,1he,1hf,1hh,1hv,1hi,1hd,1hq,1hj,
988: 1 1hm,1hs,1hy,1ht,0.0d0,1hx,0.0d0 /
989: data alsde,alsoc,alsli / 3hdec, 3hoct, 3hlin /
990: data atrap, agear, auic / 4htrap, 4hgear, 3huic /
991: data ablnk, ain, aout / 1h , 2hin, 3hout /
992: data amiss / 8h*missing /
993: data ams / 2hms /
994: data minpts / 1 /
995: c
996: c
997: go to (1200,1100,1650,6000,6000,1700,6000,1600,1550,2000,3600,
998: 1 3500,6000,1750,1300,1500,1800,4000,4100,4200), id
999: c
1000: c dc transfer curves
1001: c
1002: 1100 ifld=2
1003: icvflg=0
1004: inum=1
1005: 1105 anam=value(ifield+ifld)
1006: if(inum.gt.2) go to 6000
1007: id=0
1008: call move(anam,2,ablnk,1,7)
1009: if (anam.eq.aide(9)) id=9
1010: if (anam.eq.aide(10)) id=10
1011: if (id.eq.0) go to 1130
1012: call find(value(ifield+ifld),id,itcelm(inum),0)
1013: ifld=ifld+1
1014: if (nodplc(icode+ifld).ne.0) go to 1130
1015: tcstar(inum)=value(ifield+ifld)
1016: ifld=ifld+1
1017: if (nodplc(icode+ifld).ne.0) go to 1130
1018: tcstop(inum)=value(ifield+ifld)
1019: ifld=ifld+1
1020: if (nodplc(icode+ifld).ne.0) go to 1130
1021: tcincr(inum)=value(ifield+ifld)
1022: if (tcincr(inum).eq.0.0d0) go to 1130
1023: temp=(tcstop(inum)-tcstar(inum))/tcincr(inum)
1024: if (temp.gt.0.0d0) go to 1110
1025: tcincr(inum)=-tcincr(inum)
1026: temp=-temp
1027: 1110 itemp=idint(temp+0.5d0)+1
1028: itemp=max0(itemp,minpts)
1029: if(inum.eq.1) icvflg=itemp
1030: if(inum.eq.2) icvflg=itemp*icvflg
1031: ifld=ifld+1
1032: inum=2
1033: if(nodplc(icode+ifld)) 6000,1130,1105
1034: 1130 write (6,1131)
1035: icvflg=0
1036: 1131 format('0warning: missing parameter(s) ... analysis omitted'/)
1037: go to 6000
1038: c
1039: c frequency specification
1040: c
1041: 1200 ifld=2
1042: if (nodplc(icode+2)) 1250,1250,1210
1043: 1210 id=0
1044: if (value(ifield+ifld).eq.alsde) id=1
1045: if (value(ifield+ifld).eq.alsoc) id=2
1046: if (value(ifield+ifld).eq.alsli) id=3
1047: if (id.eq.0) go to 1240
1048: idfreq=id
1049: ifld=ifld+1
1050: if (nodplc(icode+ifld).ne.0) go to 1250
1051: if (value(ifield+ifld).le.0.0d0) go to 1250
1052: fincr=value(ifield+ifld)
1053: ifld=ifld+1
1054: if (nodplc(icode+ifld).ne.0) go to 1250
1055: if (value(ifield+ifld).le.0.0d0) go to 1250
1056: fstart=value(ifield+ifld)
1057: ifld=ifld+1
1058: if (nodplc(icode+ifld).ne.0) go to 1250
1059: if (value(ifield+ifld).le.0.0d0) go to 1250
1060: fstop=value(ifield+ifld)
1061: if (fstart.gt.fstop) go to 1260
1062: jacflg=fincr
1063: if (idfreq-2) 1215,1220,1235
1064: 1215 fincr=dexp(xlog10/fincr)
1065: go to 1230
1066: 1220 fincr=dexp(xlog2/fincr)
1067: 1230 temp=dlog(fstop/fstart)/dlog(fincr)
1068: jacflg=idint(temp+0.999d0)+1
1069: 1235 jacflg=max0(jacflg,minpts)
1070: if (idfreq.ne.3) go to 6000
1071: fincr=(fstop-fstart)/dfloat(max0(jacflg-1,1))
1072: go to 6000
1073: 1240 write (6,1241) value(ifield+ifld)
1074: 1241 format('0warning: unknown frequency function: ',a8,' ... analys'
1075: 1 ,'is omitted'/)
1076: go to 6000
1077: 1250 write (6,1251)
1078: 1251 format('0warning: frequency parameters incorrect ... analysis om'
1079: 1 ,'itted'/)
1080: go to 6000
1081: 1260 write (6,1261)
1082: 1261 format('0warning: start freq > stop freq ... analysis omitted'/)
1083: go to 6000
1084: c
1085: c time specification
1086: c
1087: 1300 ifld=2
1088: if (nodplc(icode+ifld).ne.0) go to 1430
1089: if (value(ifield+ifld).le.0.0d0) go to 1430
1090: tstep=value(ifield+ifld)
1091: ifld=ifld+1
1092: if (nodplc(icode+ifld).ne.0) go to 1430
1093: if (value(ifield+ifld).le.0.0d0) go to 1430
1094: tstop=value(ifield+ifld)
1095: tstart=0.0d0
1096: delmax=tstop/50.0d0
1097: ifld=ifld+1
1098: if (nodplc(icode+ifld).ne.0) go to 1310
1099: if (value(ifield+ifld).lt.0.0d0) go to 1430
1100: tstart=value(ifield+ifld)
1101: delmax=(tstop-tstart)/50.0d0
1102: ifld=ifld+1
1103: if (nodplc(icode+ifld).ne.0) go to 1310
1104: if (value(ifield+ifld).le.0.0d0) go to 1430
1105: delmax=value(ifield+ifld)
1106: ifld=ifld+1
1107: 1310 if (nodplc(icode+ifld).ne.1) go to 1320
1108: if (value(ifield+ifld).ne.auic) go to 1320
1109: nosolv=1
1110: 1320 if (tstart.gt.tstop) go to 1440
1111: if (tstep.gt.tstop) go to 1430
1112: jtrflg=idint((tstop-tstart)/tstep+0.5d0)+1
1113: jtrflg=max0(jtrflg,minpts)
1114: go to 6000
1115: 1430 write (6,1431)
1116: 1431 format('0warning: time parameters incorrect ... analysis omitted'
1117: 1 /)
1118: go to 6000
1119: 1440 write (6,1441)
1120: 1441 format('0warning: start time > stop time ... analysis omitted'/)
1121: go to 6000
1122: c
1123: c transfer function
1124: c
1125: 1500 kssop=1
1126: ifld=2
1127: if (nodplc(icode+ifld).ne.1) go to 1530
1128: call outdef(ifld,1,kovar,ktype)
1129: if (igoof.ne.0) go to 1530
1130: if (ktype.ne.1) go to 1540
1131: ifld=ifld+1
1132: if (nodplc(icode+ifld).ne.1) go to 1530
1133: anam=value(ifield+ifld)
1134: call move(anam,2,ablnk,1,7)
1135: id=0
1136: if (anam.eq.aide(9)) id=9
1137: if (anam.eq.aide(10)) id=10
1138: if (id.eq.0) go to 1530
1139: call find(value(ifield+ifld),id,kinel,0)
1140: kidin=id
1141: go to 6000
1142: 1530 kovar=0
1143: kinel=0
1144: write (6,1131)
1145: igoof=0
1146: go to 6000
1147: 1540 kovar=0
1148: kinel=0
1149: write (6,1541)
1150: 1541 format('0warning: illegal output variable ... analysis omitted'/)
1151: igoof=0
1152: go to 6000
1153: c
1154: c operating point
1155: c
1156: 1550 kssop=1
1157: go to 6000
1158: c
1159: c noise analysis
1160: c
1161: 1600 ifld=2
1162: if (nodplc(icode+ifld).ne.1) go to 1610
1163: call outdef(ifld,2,nosout,ntype)
1164: if (igoof.ne.0) go to 1610
1165: if (ntype.ne.1) go to 1610
1166: if (nodplc(nosout+5).ne.0) go to 1610
1167: ifld=ifld+1
1168: if (nodplc(icode+ifld).ne.1) go to 1620
1169: anam=value(ifield+ifld)
1170: call move(anam,2,ablnk,1,7)
1171: id=0
1172: if (anam.eq.aide(9)) id=9
1173: if (anam.eq.aide(10)) id=10
1174: if (id.eq.0) go to 1620
1175: call find(value(ifield+ifld),id,nosin,0)
1176: nosprt=0
1177: ifld=ifld+1
1178: if (nodplc(icode+ifld).ne.0) go to 1605
1179: nosprt=dmax1(0.0d0,value(ifield+ifld))
1180: 1605 inoise=1
1181: go to 6000
1182: 1610 write (6,1611)
1183: 1611 format('0warning: voltage output unrecognizable ... analysis omit
1184: 1ted'/)
1185: igoof=0
1186: go to 6000
1187: 1620 write (6,1621)
1188: 1621 format('0warning: invalid input source ... analysis omitted'/)
1189: igoof=0
1190: go to 6000
1191: c
1192: c distortion analysis
1193: c
1194: 1650 ifld=2
1195: if (nodplc(icode+ifld).ne.1) go to 1660
1196: anam=value(ifield+ifld)
1197: call move(anam,2,ablnk,1,7)
1198: if (anam.ne.aide(1)) go to 1660
1199: call find(value(ifield+ifld),1,idist,0)
1200: idprt=0
1201: skw2=0.9d0
1202: refprl=1.0d-3
1203: spw2=1.0d0
1204: ifld=ifld+1
1205: if (nodplc(icode+ifld).ne.0) go to 6000
1206: idprt=value(ifield+ifld)
1207: idprt=max0(idprt,0)
1208: ifld=ifld+1
1209: if (nodplc(icode+ifld).ne.0) go to 6000
1210: if (value(ifield+ifld).le.0.001d0) go to 1670
1211: if (value(ifield+ifld).gt.0.999d0) go to 1670
1212: skw2=value(ifield+ifld)
1213: ifld=ifld+1
1214: if (nodplc(icode+ifld).ne.0) go to 6000
1215: if (value(ifield+ifld).lt.1.0d-10) go to 1670
1216: refprl=value(ifield+ifld)
1217: ifld=ifld+1
1218: if (nodplc(icode+ifld).ne.0) go to 6000
1219: if (value(ifield+ifld).lt.0.001d0) go to 1670
1220: spw2=value(ifield+ifld)
1221: go to 6000
1222: 1660 write (6,1661)
1223: 1661 format('0warning: distortion load resistor missing ... analysis '
1224: 1 ,'omitted'/)
1225: go to 6000
1226: 1670 idist=0
1227: write (6,1671)
1228: 1671 format('0warning: distortion parameters incorrect ... analysis o'
1229: 1 ,'mitted'/)
1230: go to 6000
1231: c
1232: c fourier analysis
1233: c
1234: 1700 ifld=2
1235: if (nodplc(icode+ifld).ne.0) go to 1720
1236: if (value(ifield+ifld).le.0.0d0) go to 1720
1237: forfre=value(ifield+ifld)
1238: 1705 ifld=ifld+1
1239: if (nodplc(icode+ifld).ne.1) go to 1710
1240: call outdef(ifld,2,loct,ltype)
1241: if (igoof.ne.0) go to 1720
1242: if (ltype.ne.1) go to 1720
1243: call extmem(ifour,1)
1244: nfour=nfour+1
1245: nodplc(ifour+nfour)=loct
1246: go to 1705
1247: 1710 if (nfour.ge.1) go to 6000
1248: 1720 write (6,1721)
1249: 1721 format('0warning: fourier parameters incorrect ... analysis omit'
1250: 1 ,'ted'/)
1251: igoof=0
1252: nfour=0
1253: call clrmem(ifour)
1254: call getm4(ifour,0)
1255: go to 6000
1256: c
1257: c sensitivity analysis
1258: c
1259: 1750 kssop=1
1260: ifld=1
1261: 1760 ifld=ifld+1
1262: if (nodplc(icode+ifld).ne.1) go to 6000
1263: call outdef(ifld,1,loct,ltype)
1264: if (igoof.ne.0) go to 1780
1265: if (ltype.ne.1) go to 1780
1266: call extmem(isens,1)
1267: nsens=nsens+1
1268: nodplc(isens+nsens)=loct
1269: go to 1760
1270: 1780 write (6,1781)
1271: 1781 format('0warning: output variable unrecognizable ... analysis om'
1272: 1 ,'mitted'/)
1273: igoof=0
1274: nsens=0
1275: call clrmem(isens)
1276: call getm4(isens,0)
1277: go to 6000
1278: c
1279: c temperature variation
1280: c
1281: 1800 ifld=1
1282: 1810 ifld=ifld+1
1283: if (nodplc(icode+ifld).ne.0) go to 6000
1284: if (value(ifield+ifld).le.-223.0d0) go to 1810
1285: call extmem(itemps,1)
1286: numtem=numtem+1
1287: value(itemps+numtem)=value(ifield+ifld)
1288: go to 1810
1289: c
1290: c options card
1291: c
1292: 2000 ifld=1
1293: 2010 ifld=ifld+1
1294: 2020 if (nodplc(icode+ifld)) 6000,2010,2030
1295: 2030 anam=value(ifield+ifld)
1296: do 2040 i=1,5
1297: if (anam.ne.aopts(i)) go to 2040
1298: iprnt(i)=lsetop(i)
1299: ifld=ifld+1
1300: if(nodplc(icode+ifld).ne.0) go to 2020
1301: iprnt(i)=value(ifield+ifld)
1302: go to 2010
1303: 2040 continue
1304: if (anam.eq.aopts(24)) go to 2110
1305: if (anam.eq.aopts(25)) go to 2120
1306: if(anam.eq.aopts(26)) go to 2130
1307: if(anam.eq.aopts(27)) go to 2150
1308: if (nodplc(icode+ifld+1).ne.0) go to 2510
1309: ifld=ifld+1
1310: aval=value(ifield+ifld)
1311: do 2050 i=6,10
1312: if (anam.ne.aopts(i)) go to 2050
1313: if(aval.le.0.0d0.and.i.ne.10) go to 2510
1314: itrlim(i-5)=aval
1315: go to 2010
1316: 2050 continue
1317: if (aval.le.0.0d0) go to 2510
1318: do 2060 i=11,14
1319: if (anam.ne.aopts(i)) go to 2060
1320: limits(i-10)=aval
1321: go to 2010
1322: 2060 continue
1323: do 2070 i=15,20
1324: if (anam.ne.aopts(i)) go to 2070
1325: contol(i-14)=aval
1326: go to 2010
1327: 2070 continue
1328: do 2075 i=28,31
1329: if(anam.ne.aopts(i)) go to 2075
1330: dflts(i-27)=aval
1331: go to 2010
1332: 2075 continue
1333: if (anam.ne.aopts(21)) go to 2080
1334: if (aval.lt.-223.0d0) go to 2510
1335: value(itemps+1)=aval
1336: go to 2010
1337: 2080 if (anam.ne.aopts(22)) go to 2100
1338: ndigit=aval
1339: if (ndigit.le.7) go to 2090
1340: ndigit=7
1341: write (6,2081) ndigit
1342: 2081 format('0warning: numdgt may not exceed',i2,
1343: 1 '; maximum value assumed'/)
1344: 2090 numdgt=ndigit
1345: go to 2010
1346: 2100 if (anam.ne.aopts(23)) go to 2500
1347: n=aval
1348: if ((n.le.1).or.(n.ge.7)) go to 2510
1349: maxord=n
1350: go to 2010
1351: 2110 if (nodplc(icode+ifld+1).ne.1) go to 2510
1352: ifld=ifld+1
1353: anam=value(ifield+ifld)
1354: call move(anam,5,ablnk,1,4)
1355: jtype=0
1356: if (anam.eq.atrap) jtype=1
1357: if (anam.eq.agear) jtype=2
1358: if (jtype.eq.0) go to 2510
1359: method=jtype
1360: go to 2010
1361: 2120 nopage=1
1362: go to 2010
1363: 2130 ifld=ifld+1
1364: if(nodplc(icode+ifld)) 6000,2140,2010
1365: 2140 aval=value(ifield+ifld)
1366: if(aval.lt.0.0d0.or.aval.gt.0.500001d0) go to 2510
1367: xmu=aval
1368: go to 2010
1369: 2150 ifld=ifld+1
1370: if(nodplc(icode+ifld)) 6000,2160,2010
1371: 2160 aval=value(ifield+ifld)
1372: maxtim=aval
1373: go to 2010
1374: 2500 write (6,2501) anam
1375: 2501 format('0warning: unknown option: ',a8,' ... ignored'/)
1376: go to 2010
1377: 2510 write (6,2511) anam
1378: 2511 format('0warning: illegal value specified for option: ',a8,' ...
1379: 1 ignored'/)
1380: go to 2010
1381: c
1382: c print card
1383: c
1384: 3500 iprpl=0
1385: go to 3610
1386: c
1387: c plot (and print) card
1388: c
1389: 3600 iprpl=1
1390: 3610 ifld=2
1391: 3613 anam=amiss
1392: if (nodplc(icode+ifld).ne.1) go to 3950
1393: anam=value(ifield+ifld)
1394: ms=0
1395: if (xxor(anam,ams).ne.0) go to 3615
1396: ms=1
1397: ifld=3
1398: if (nodplc(icode+ifld).ne.1) go to 3970
1399: anam=value(ifield+ifld)
1400: 3615 call move(anam,3,ablnk,1,6)
1401: do 3620 i=1,5
1402: if (anam.ne.aopt(i)) go to 3620
1403: ktype=i
1404: go to 3630
1405: 3620 continue
1406: go to 3950
1407: 3630 id=30+5*iprpl+ktype
1408: call find(dfloat(jelcnt(id)),id,loc,1)
1409: nodplc(loc+2)=ktype
1410: if (ms.eq.0) go to 3635
1411: locv=nodplc(loc+1)
1412: value(locv)=0.0d0
1413: 3635 numout=0
1414: 3640 ifld=ifld+1
1415: if (nodplc(icode+ifld)) 3900,3640,3650
1416: 3650 call outdef(ifld,ktype,loct,ltype)
1417: if (igoof.ne.0) go to 3970
1418: if (iprpl.eq.0) go to 3660
1419: plimlo=0.0d0
1420: plimhi=0.0d0
1421: if (nodplc(icode+ifld+1).ne.0) go to 3660
1422: if (nodplc(icode+ifld+2).ne.0) go to 3660
1423: plimlo=value(ifield+ifld+1)
1424: plimhi=value(ifield+ifld+2)
1425: ifld=ifld+2
1426: 3660 numout=numout+1
1427: lspot=loc+2*numout+2
1428: nodplc(lspot)=loct
1429: nodplc(lspot+1)=ltype
1430: if (iprpl.eq.0) go to 3670
1431: locv=nodplc(loc+1)
1432: lspot=locv+2*numout-1
1433: value(lspot)=plimlo
1434: value(lspot+1)=plimhi
1435: 3670 if (numout.eq.8) go to 3900
1436: go to 3640
1437: 3900 nodplc(loc+3)=numout
1438: if (iprpl.eq.0) go to 6000
1439: c... propogate plot limits downward
1440: if (numout.le.1) go to 6000
1441: locv=nodplc(loc+1)
1442: lspot=locv+2*numout-1
1443: plimlo=value(lspot)
1444: plimhi=value(lspot+1)
1445: i=numout-1
1446: 3905 lspot=lspot-2
1447: if (value(lspot).ne.0.0d0) go to 3910
1448: if (value(lspot+1).ne.0.0d0) go to 3910
1449: value(lspot)=plimlo
1450: value(lspot+1)=plimhi
1451: go to 3920
1452: 3910 plimlo=value(lspot)
1453: plimhi=value(lspot+1)
1454: 3920 i=i-1
1455: if (i.ge.1) go to 3905
1456: go to 6000
1457: c
1458: c errors
1459: c
1460: 3950 write (6,3951) anam
1461: 3951 format('0warning: unknown analysis mode: ',a8,
1462: 1 ' ... line ignored'/)
1463: go to 6000
1464: 3970 write (6,3971)
1465: 3971 format('0warning: unrecognizable output variable on above line'/)
1466: igoof=0
1467: go to 3640
1468: c
1469: c width card
1470: c
1471: 4000 ifld=1
1472: 4010 ifld=ifld+1
1473: if (nodplc(icode+ifld).ne.1) go to 6000
1474: 4020 anam=value(ifield+ifld)
1475: if (anam.ne.ain) go to 4040
1476: ifld=ifld+1
1477: if (nodplc(icode+ifld)) 6000,4030,4020
1478: 4030 iwidth=value(ifield+ifld)
1479: iwidth=min0(max0(iwidth,10),120)
1480: go to 4010
1481: 4040 if (anam.ne.aout) go to 6000
1482: ifld=ifld+1
1483: if (nodplc(icode+ifld)) 6000,4050,4020
1484: 4050 lwidth=dmin1(dmax1(value(ifield+ifld),72.0d0),132.0d0)
1485: go to 4010
1486: c
1487: c nodeset statement
1488: c
1489: 4100 ifld=1
1490: 4110 ifld=ifld+1
1491: if(nodplc(icode+ifld)) 6000,4120,4110
1492: 4120 nodnum=value(ifield+ifld)
1493: if(nodnum.le.0) go to 4190
1494: ifld=ifld+1
1495: if(nodplc(icode+ifld)) 4180,4130,4170
1496: 4130 call sizmem(nsnod,nic)
1497: call extmem(nsnod,1)
1498: call extmem(nsval,1)
1499: nodplc(nsnod+nic+1)=nodnum
1500: value(nsval+nic+1)=value(ifield+ifld)
1501: go to 4110
1502: c
1503: c errors on .nodeset statement
1504: c
1505: 4170 write(6,4171) value(ifield+ifld)
1506: 4171 format('0warning: out-of-place non-numeric field ',a8,
1507: 1 ' skipped'/)
1508: go to 4110
1509: 4180 write(6,4181) nodnum
1510: 4181 format('0warning: initial value missing for node ',i5,/)
1511: go to 6000
1512: 4190 write(6,4191)
1513: 4191 format('0warning: attempt to specify initial condition for ',
1514: 1 'ground ingnored',/)
1515: ifld=ifld+1
1516: if(nodplc(icode+ifld)) 6000,4110,4170
1517: c
1518: c initial conditions statement
1519: c
1520: 4200 ifld=1
1521: 4210 ifld=ifld+1
1522: if(nodplc(icode+ifld)) 6000,4220,4210
1523: 4220 nodnum=value(ifield+ifld)
1524: if(nodnum.le.0) go to 4290
1525: ifld=ifld+1
1526: if(nodplc(icode+ifld)) 4280,4230,4270
1527: 4230 call sizmem(icnod,nic)
1528: call extmem(icnod,1)
1529: call extmem(icval,1)
1530: nodplc(icnod+nic+1)=nodnum
1531: value(icval+nic+1)=value(ifield+ifld)
1532: go to 4210
1533: c
1534: c errors on .ic statement
1535: c
1536: 4270 write(6,4271) value(ifield+ifld)
1537: 4271 format('0warning: out-of-place non-numeric field ',a8,
1538: 1 ' skipped'/)
1539: go to 4210
1540: 4280 write(6,4281) nodnum
1541: 4281 format('0warning: initial value missing for node ',i5,/)
1542: go to 6000
1543: 4290 write(6,4291)
1544: 4291 format('0warning: attempt to specify initial condition for ',
1545: 1 'ground ingnored',/)
1546: ifld=ifld+1
1547: if(nodplc(icode+ifld)) 6000,4210,4270
1548: c
1549: c finished
1550: c
1551: 6000 return
1552: end
1553: subroutine outdef(ifld,mode,loct,ltype)
1554: implicit double precision (a-h,o-z)
1555: c
1556: c this routine constructs the internal list element for an output
1557: c variable defined on some input card.
1558: c
1559: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
1560: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
1561: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
1562: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
1563: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
1564: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
1565: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
1566: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
1567: common /blank/ value(1000)
1568: integer nodplc(64)
1569: complex*16 cvalue(32)
1570: equivalence (value(1),nodplc(1),cvalue(1))
1571: c
1572: integer xxor
1573: dimension aout(19),aopts(5)
1574: data aout / 4hv , 4hvm , 4hvr , 4hvi , 4hvp , 4hvdb ,
1575: 1 4hi , 4him , 4hir , 4hii , 4hip , 4hidb ,
1576: 2 4honoi, 4hinoi, 4hhd2 , 4hhd3 , 4hdim2, 4hsim2,
1577: 3 4hdim3 /
1578: data aopts / 1hm, 1hr, 1hi, 1hp, 1hd /
1579: data alprn, acomma, ablnk, aletv / 1h(, 1h,, 1h , 1hv /
1580: c
1581: if (nodplc(icode+ifld).ne.1) go to 300
1582: anam=value(ifield+ifld)
1583: call move(anam,5,ablnk,1,4)
1584: do 10 i=1,19
1585: if (xxor(anam,aout(i)).ne.0) go to 10
1586: idout=i
1587: go to 20
1588: 10 continue
1589: go to 300
1590: c
1591: c further error checking
1592: c
1593: 20 if (mode.ge.3) go to 25
1594: c... dc or tran
1595: if ((idout.ne.1).and.(idout.ne.7)) go to 300
1596: go to 38
1597: 25 if (mode.ge.4) go to 30
1598: c... ac
1599: if (idout.ge.13) go to 300
1600: go to 38
1601: 30 if (mode.eq.5) go to 35
1602: c... noise
1603: if ((idout.ne.13).and.(idout.ne.14)) go to 300
1604: go to 38
1605: c... distortion
1606: 35 if (idout.lt.15) go to 300
1607: 38 ktype=0
1608: ltype=idout
1609: if (idout.lt.7) go to 40
1610: ktype=1
1611: ltype=ltype-6
1612: if (idout.lt.13) go to 40
1613: ktype=idout-11
1614: ltype=1
1615: c
1616: c voltage output
1617: c
1618: 40 id=40+mode
1619: if (ktype.ne.0) go to 100
1620: if (nodplc(icode+ifld+1).ne.0) go to 300
1621: ifld=ifld+1
1622: n1=value(ifield+ifld)
1623: if (n1.lt.0) go to 300
1624: if(n1.gt.9999) go to 300
1625: n2=0
1626: adelim=value(idelim+ifld)
1627: if (adelim.eq.acomma) go to 45
1628: if (adelim.ne.ablnk) go to 50
1629: 45 if (nodplc(icode+ifld+1).ne.0) go to 300
1630: ifld=ifld+1
1631: n2=value(ifield+ifld)
1632: if (n2.lt.0) go to 300
1633: if(n2.gt.9999) go to 300
1634: 50 outnam=ablnk
1635: ipos=1
1636: call alfnum(n1,outnam,ipos)
1637: ipos=5
1638: call alfnum(n2,outnam,ipos)
1639: call find(outnam,id,loct,0)
1640: nodplc(loct+2)=n1
1641: nodplc(loct+3)=n2
1642: go to 400
1643: c
1644: c current output
1645: c
1646: 100 if (ktype.ne.1) go to 200
1647: if (nodplc(icode+ifld+1).ne.1) go to 300
1648: ifld=ifld+1
1649: avsrc=value(ifield+ifld)
1650: achek=avsrc
1651: call move(achek,2,ablnk,1,7)
1652: if (achek.ne.aletv) go to 300
1653: call find(avsrc,id,loct,0)
1654: call find(avsrc,9,nodplc(loct+2),0)
1655: nodplc(loct+5)=1
1656: go to 400
1657: c
1658: c noise or distortion outputs
1659: c
1660: 200 id=44
1661: if (ktype.ge.4) id=id+1
1662: if (value(idelim+ifld).ne.alprn) go to 220
1663: if (nodplc(icode+ifld+1).ne.1) go to 300
1664: ifld=ifld+1
1665: atype=value(ifield+ifld)
1666: call move(atype,2,ablnk,1,7)
1667: do 210 i=1,5
1668: if (atype.ne.aopts(i)) go to 210
1669: ltype=i+1
1670: go to 220
1671: 210 continue
1672: go to 300
1673: 220 call find(anam,id,loct,0)
1674: nodplc(loct+2)=0
1675: nodplc(loct+5)=ktype
1676: go to 400
1677: c
1678: c errors
1679: c
1680: 300 igoof=1
1681: c
1682: c finished
1683: c
1684: 400 return
1685: end
1686: subroutine card
1687: implicit double precision (a-h,o-z)
1688: c
1689: c this routine scans the input lines, storing each field into the
1690: c tables ifield, idelim, icolum, and icode. with the exception of the
1691: c '.end' line, card always reads the next line to check for a possible
1692: c continuation before it exits.
1693: c
1694: common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
1695: 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
1696: 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
1697: 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
1698: 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
1699: 5 imynl,imvn,lcvn,loutpt,nsnod,nsmat,nsval,icnod,icmat,icval
1700: common /miscel/ atime,aprog(3),adate,atitle(10),defl,defw,defad,
1701: 1 defas,rstats(50),iwidth,lwidth,nopage
1702: common /line/ achar,afield(15),oldlin(15),kntrc,kntlim
1703: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
1704: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
1705: common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok,
1706: 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox
1707: common /blank/ value(1000)
1708: integer nodplc(64)
1709: complex*16 cvalue(32)
1710: equivalence (value(1),nodplc(1),cvalue(1))
1711: c
1712: dimension adigit(10)
1713: data adigit / 1h0,1h1,1h2,1h3,1h4,1h5,1h6,1h7,1h8,1h9 /
1714: data ablnk,aper,aplus,aminus,astk / 1h , 1h., 1h+, 1h-, 1h* /
1715: data ag,ak,au,an,ap,ae,am,af,at /1hg,1hk,1hu,1hn,1hp,1he,1hm,
1716: 1 1hf,1ht/
1717: data ai / 1hi /
1718: data alprn, arprn, aequal / 1h(, 1h), 1h= /
1719: data aend / 4h.end /
1720: c
1721: c note: the value of the function *nxtchr* (used extensively in
1722: c this routine) is as follows:
1723: c
1724: c <0: end-of-line
1725: c =0: delimiter found
1726: c >0: non-delimiter found
1727: c
1728: numfld=0
1729: nofld=10
1730: go to 20
1731: c
1732: c read next card
1733: c
1734: 10 nofld=10
1735: call getlin
1736: if (keof.eq.0) go to 20
1737: c... error: unexpected end-of-file condition on input
1738: 15 keof=1
1739: nofld=1
1740: numfld=0
1741: igoof=1
1742: write (6,16)
1743: 16 format('0*error*: .end card missing'/)
1744: go to 1000
1745: c
1746: c eliminate trailing blanks rapidly
1747: c
1748: 20 if (afield(nofld).ne.ablnk) go to 40
1749: if (nofld.eq.1) go to 30
1750: nofld=nofld-1
1751: go to 20
1752: c... write blank card
1753: 30 write (6,31)
1754: 31 format(1x)
1755: go to 10
1756: c... copy the card to output listing
1757: 40 write (6,41) (afield(i),i=1,nofld)
1758: 41 format(1x,10a8)
1759: c
1760: c initialization for new card
1761: c
1762: 45 kntrc=0
1763: kntlim=min0(8*nofld,iwidth)
1764: c
1765: c fetch first non-delimiter (see routine *nxtchr* for list)
1766: c
1767: 50 if (nxtchr(0)) 600,50,60
1768: c... check for comment (leading asterisk)
1769: 60 if (achar.eq.astk) go to 10
1770: go to 100
1771: c
1772: c fetch next character
1773: c
1774: 70 if (nxtchr(0)) 600,80,100
1775: c
1776: c two consecutive delimiters imply numeric zero unless the delimiter
1777: c is a blank or parenthesis.
1778: c
1779: 80 if (achar.eq.ablnk) go to 70
1780: if (achar.eq.alprn) go to 70
1781: if (achar.eq.arprn) go to 70
1782: if (achar.eq.aequal) go to 70
1783: c... check for sufficient space in storage arrays
1784: if (numfld.lt.insize-1) go to 90
1785: call extmem(ifield,50)
1786: call extmem(icode,50)
1787: call extmem(idelim,50)
1788: call extmem(icolum,50)
1789: insize=insize+50
1790: 90 numfld=numfld+1
1791: value(ifield+numfld)=0.0d0
1792: nodplc(icode+numfld)=0
1793: value(idelim+numfld)=achar
1794: nodplc(icolum+numfld)=kntrc
1795: go to 70
1796: c
1797: c check for sufficient space in storage arrays
1798: c
1799: 100 if (numfld.lt.insize-1) go to 110
1800: call extmem(ifield,50)
1801: call extmem(icode,50)
1802: call extmem(idelim,50)
1803: call extmem(icolum,50)
1804: insize=insize+50
1805: c
1806: c begin scan of next field
1807: c
1808: c... initialization
1809: 110 jdelim=0
1810: xsign=1.0d0
1811: xmant=0.0d0
1812: idec=0
1813: iexp=0
1814: c... check for leading plus or minus sign
1815: if (achar.eq.aplus) go to 210
1816: if (achar.eq.aminus) go to 200
1817: c... finish initialization
1818: anam=ablnk
1819: kchr=1
1820: c... an isolated period indicates that a continuation card follows
1821: if (achar.ne.aper) go to 120
1822: c... alter initialization slightly if leading period found
1823: idec=1
1824: iexp=-1
1825: anam=aper
1826: kchr=2
1827: c... now take a look at the next character
1828: if (nxtchr(0)) 10,10,120
1829: c
1830: c test for number (any digit)
1831: c
1832: 120 do 130 i=1,10
1833: if (achar.ne.adigit(i)) go to 130
1834: xmant=dfloat(i-1)
1835: go to 210
1836: 130 continue
1837: c
1838: c assemble name
1839: c
1840: numfld=numfld+1
1841: call move(anam,kchr,achar,1,1)
1842: kchr=kchr+1
1843: do 150 i=kchr,8
1844: if (nxtchr(0)) 160,160,140
1845: 140 call move(anam,i,achar,1,1)
1846: 150 continue
1847: go to 170
1848: 160 jdelim=1
1849: 170 value(ifield+numfld)=anam
1850: nodplc(icode+numfld)=1
1851: nodplc(icolum+numfld)=kntrc
1852: c... no '+' format continuation possible for .end card
1853: if (numfld.ge.2) go to 400
1854: if (anam.ne.aend) go to 400
1855: nodplc(icode+numfld+1)=-1
1856: go to 1000
1857: c
1858: c process number
1859: c
1860: c... take note of leading minus sign
1861: 200 xsign=-1.0d0
1862: c... take a look at the next character
1863: 210 if (nxtchr(0)) 335,335,220
1864: c... test for digit
1865: 220 do 230 i=1,10
1866: if (achar.ne.adigit(i)) go to 230
1867: xmant=xmant*10.0d0+dfloat(i-1)
1868: if (idec.eq.0) go to 210
1869: iexp=iexp-1
1870: go to 210
1871: 230 continue
1872: c
1873: c check for decimal point
1874: c
1875: if (achar.ne.aper) go to 240
1876: c... make certain that this is the first one found
1877: if (idec.ne.0) go to 500
1878: idec=1
1879: go to 210
1880: c
1881: c test for exponent
1882: c
1883: 240 if (achar.ne.ae) go to 300
1884: if (nxtchr(0)) 335,335,250
1885: 250 itemp=0
1886: isign=1
1887: c... check for possible leading sign on exponent
1888: if (achar.eq.aplus) go to 260
1889: if (achar.ne.aminus) go to 270
1890: isign=-1
1891: 260 if (nxtchr(0)) 285,285,270
1892: c... test for digit
1893: 270 do 280 i=1,10
1894: if (achar.ne.adigit(i)) go to 280
1895: itemp=itemp*10+i-1
1896: go to 260
1897: 280 continue
1898: go to 290
1899: 285 jdelim=1
1900: c... correct internal exponent
1901: 290 iexp=iexp+isign*itemp
1902: go to 340
1903: c
1904: c test for scale factor
1905: c
1906: 300 if (achar.ne.am) go to 330
1907: c... special check for *me* (as distinguished from *m*)
1908: if (nxtchr(0)) 320,320,310
1909: 310 if (achar.ne.ae) go to 315
1910: iexp=iexp+6
1911: go to 340
1912: 315 if (achar.ne.ai) go to 325
1913: xmant=xmant*25.4d-6
1914: go to 340
1915: 320 jdelim=1
1916: 325 iexp=iexp-3
1917: go to 340
1918: 330 if (achar.eq.at) iexp=iexp+12
1919: if (achar.eq.ag) iexp=iexp+9
1920: if (achar.eq.ak) iexp=iexp+3
1921: if (achar.eq.au) iexp=iexp-6
1922: if (achar.eq.an) iexp=iexp-9
1923: if (achar.eq.ap) iexp=iexp-12
1924: if (achar.eq.af) iexp=iexp-15
1925: go to 340
1926: 335 jdelim=1
1927: c
1928: c assemble the final number
1929: c
1930: 340 if (xmant.eq.0.0d0) go to 350
1931: if (iexp.eq.0) go to 350
1932: if (iabs(iexp).ge.201) go to 500
1933: xmant=xmant*dexp(dfloat(iexp)*xlog10)
1934: if (xmant.gt.1.0d+35) go to 500
1935: if (xmant.lt.1.0d-35) go to 500
1936: 350 numfld=numfld+1
1937: value(ifield+numfld)=dsign(xmant,xsign)
1938: nodplc(icode+numfld)=0
1939: nodplc(icolum+numfld)=kntrc
1940: c
1941: c skip to non-blank delimiter (if necessary)
1942: c
1943: 400 if (jdelim.eq.0) go to 440
1944: 410 value(idelim+numfld)=achar
1945: c... the characters ) and . form a single delimiter if adjacent
1946: if (achar.ne.arprn) go to 70
1947: if (nxtchr(0)) 430,430,420
1948: 420 if (achar.ne.aper) go to 430
1949: call move(value(idelim+numfld),2,aper,1,1)
1950: go to 70
1951: 430 kntrc=kntrc-1
1952: go to 70
1953: 440 if (nxtchr(0)) 450,410,440
1954: 450 value(idelim+numfld)=achar
1955: go to 600
1956: c
1957: c errors
1958: c
1959: 500 write (6,501) kntrc
1960: 501 format('0*error*: illegal number -- scan stopped at column ',i3/)
1961: igoof=1
1962: numfld=numfld+1
1963: value(ifield+numfld)=0.0d0
1964: nodplc(icode+numfld)=0
1965: value(idelim+numfld)=achar
1966: nodplc(icolum+numfld)=kntrc
1967: c
1968: c finished
1969: c
1970: 600 nodplc(icode+numfld+1)=-1
1971: c
1972: c check next line for possible continuation
1973: c
1974: 610 call getlin
1975: if (keof.eq.1) go to 15
1976: nofld=10
1977: 620 if (afield(nofld).ne.ablnk) go to 630
1978: if (nofld.eq.1) go to 650
1979: nofld=nofld-1
1980: go to 620
1981: 630 kntrc=0
1982: kntlim=min0(8*nofld,iwidth)
1983: c... continuation line has a '+' as first non-delimiter on card
1984: 632 if(nxtchr(0)) 650,632,634
1985: 634 if(achar.ne.aplus) go to 640
1986: write(6,41) (afield(i),i=1,nofld)
1987: go to 70
1988: 640 if (achar.ne.astk) go to 1000
1989: 650 write (6,41) (afield(i),i=1,nofld)
1990: go to 610
1991: 1000 return
1992: end
1993: subroutine getlin
1994: implicit double precision (a-h,o-z)
1995: c
1996: c this routine reads the next line of input into the array afield.
1997: c if end-of-file is found, the variable keof is set to 1.
1998: c
1999: common /line/ achar,afield(15),oldlin(15),kntrc,kntlim
2000: common /flags/ iprnta,iprntl,iprntm,iprntn,iprnto,limtim,limpts,
2001: 1 lvlcod,lvltim,itl1,itl2,itl3,itl4,itl5,igoof,nogo,keof
2002: call copy8(afield,oldlin,15)
2003: read(5,6,end=10) (afield(i),i=1,10)
2004: go to 100
2005: 6 format(10a8)
2006: 10 keof=1
2007: 100 return
2008: end
2009: integer function nxtchr(int)
2010: implicit double precision (a-h,o-z)
2011: c
2012: c this routine advances the current line scan pointer one column
2013: c and checks whether or not the next character is a delimiter
2014: c
2015: common /line/ achar,afield(15),oldlin(15),kntrc,kntlim
2016: c
2017: dimension adelim(5)
2018: data adelim / 1h , 1h,, 1h=, 1h(, 1h) /
2019: data ablnk / 1h /
2020: data ichar /0/
2021: c
2022: c advance scan pointer (kntrc)
2023: kntrc=kntrc+1
2024: if (kntrc.gt.kntlim) go to 30
2025: call move(achar,1,afield,kntrc,1)
2026: call move(ichar,2,achar,1,1)
2027: if(ichar.gt.31.and.ichar.lt.91) go to 5
2028: c.. delete ascii control codes
2029: if(ichar.lt.32) ichar=32
2030: if(ichar.gt.96.and.ichar.lt.123) ichar=ichar-32
2031: if(ichar.eq.127) ichar=32
2032: call move(achar,1,ichar,2,1)
2033: 5 do 10 i=1,5
2034: if (achar.eq.adelim(i)) go to 20
2035: 10 continue
2036: c
2037: c non-delimiter
2038: c
2039: nxtchr=1
2040: return
2041: c
2042: c delimiter
2043: c
2044: 20 nxtchr=0
2045: return
2046: c
2047: c end-of-line
2048: c
2049: 30 nxtchr=-1
2050: achar=ablnk
2051: return
2052: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.