1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1988 Jaijeet S Roychowdhury
4 Modified: 2000 AlansFixes
5 **********/
6 
7 #include "ngspice/ngspice.h"
8 #include "ngspice/cktdefs.h"
9 #include "bjtdefs.h"
10 #include "ngspice/sperror.h"
11 #include "ngspice/distodef.h"
12 #include "ngspice/suffix.h"
13 #include "bjtdset.h"
14 
15 
16 /* assuming here that ckt->CKTomega has been initialised to
17  * the correct value
18  */
19 int
BJTdisto(int mode,GENmodel * genmodel,CKTcircuit * ckt)20 BJTdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
21 {
22     BJTmodel *model = (BJTmodel *) genmodel;
23     DISTOAN* job = (DISTOAN*) ckt->CKTcurJob;
24     double td;
25     DpassStr pass;
26     double r1h1x = 0.0, i1h1x = 0.0;
27     double r1h1y = 0.0, i1h1y = 0.0;
28     double r1h1z = 0.0, i1h1z = 0.0;
29     double r1h2x = 0.0, i1h2x = 0.0;
30     double r1h2y = 0.0, i1h2y = 0.0;
31     double r1h2z = 0.0, i1h2z = 0.0;
32     double r1hm2x = 0.0, i1hm2x = 0.0;
33     double r1hm2y = 0.0, i1hm2y = 0.0;
34     double r1hm2z = 0.0, i1hm2z = 0.0;
35     double r2h11x = 0.0, i2h11x = 0.0;
36     double r2h11y = 0.0, i2h11y = 0.0;
37     double r2h11z = 0.0, i2h11z = 0.0;
38     double r2h1m2x = 0.0, i2h1m2x = 0.0;
39     double r2h1m2y = 0.0, i2h1m2y = 0.0;
40     double r2h1m2z = 0.0, i2h1m2z = 0.0;
41     double temp, itemp;
42     BJTinstance *here;
43 #ifdef DISTODEBUG
44     double time;
45 #endif
46 
47     if (mode == D_SETUP)
48 	return(BJTdSetup((GENmodel *)model,ckt));
49 
50     if ((mode == D_TWOF1) || (mode == D_THRF1) ||
51 	(mode == D_F1PF2) || (mode == D_F1MF2) ||
52 	(mode == D_2F1MF2)) {
53 
54 	/* loop through all the BJT models */
55 	for( ; model != NULL; model = BJTnextModel(model)) {
56 	    td = model->BJTexcessPhaseFactor;
57 
58 	    /* loop through all the instances of the model */
59 	    for (here = BJTinstances(model); here != NULL ;
60 		 here=BJTnextInstance(here)) {
61 
62 		/* getting Volterra kernels */
63 		/* until further notice x = vbe, y = vbc, z= vbed */
64 
65 		r1h1x = *(job->r1H1ptr + (here->BJTbasePrimeNode)) -
66 		    *(job->r1H1ptr + (here->BJTemitPrimeNode));
67 		i1h1x = *(job->i1H1ptr + (here->BJTbasePrimeNode)) -
68 		    *(job->i1H1ptr + (here->BJTemitPrimeNode));
69 
70 		r1h1y = *(job->r1H1ptr + (here->BJTbasePrimeNode)) -
71 		    *(job->r1H1ptr + (here->BJTcolPrimeNode));
72 		i1h1y = *(job->i1H1ptr + (here->BJTbasePrimeNode)) -
73 		    *(job->i1H1ptr + (here->BJTcolPrimeNode));
74 
75 		if (td != 0) {
76 
77 		    temp = job->Domega1 * td;
78 
79 		    /* multiplying r1h1x by exp(-j omega td) */
80 		    r1h1z = r1h1x*cos(temp) + i1h1x*sin(temp);
81 		    i1h1z = i1h1x*cos(temp) - r1h1x*sin(temp);
82 		}
83 		else {
84 		    r1h1z = r1h1x;
85 		    i1h1z = i1h1x;
86 		}
87 
88 		if ((mode == D_F1MF2) ||
89 		    (mode == D_2F1MF2)) {
90 
91 		    r1hm2x = *(job->r1H2ptr + (here->BJTbasePrimeNode)) -
92 			*(job->r1H2ptr + (here->BJTemitPrimeNode));
93 		    i1hm2x = -(*(job->i1H2ptr + (here->BJTbasePrimeNode)) -
94 			       *(job->i1H2ptr + (here->BJTemitPrimeNode)));
95 
96 		    r1hm2y = *(job->r1H2ptr + (here->BJTbasePrimeNode)) -
97 			*(job->r1H2ptr + (here->BJTcolPrimeNode));
98 		    i1hm2y = -(*(job->i1H2ptr + (here->BJTbasePrimeNode)) -
99 			       *(job->i1H2ptr + (here->BJTcolPrimeNode)));
100 
101 		    if (td != 0) {
102 
103 			temp = -job->Domega2 * td;
104 			r1hm2z = r1hm2x*cos(temp) + i1hm2x*sin(temp);
105 			i1hm2z = i1hm2x*cos(temp) - r1hm2x*sin(temp);
106 		    }
107 		    else {
108 			r1hm2z = r1hm2x;
109 			i1hm2z = i1hm2x;
110 		    }
111 		}
112 		if ((mode == D_THRF1) || (mode == D_2F1MF2)){
113 
114 
115 		    r2h11x = *(job->r2H11ptr + (here->BJTbasePrimeNode)) -
116 			*(job->r2H11ptr + (here->BJTemitPrimeNode));
117 		    i2h11x = *(job->i2H11ptr + (here->BJTbasePrimeNode)) -
118 			*(job->i2H11ptr + (here->BJTemitPrimeNode));
119 
120 		    r2h11y = *(job->r2H11ptr + (here->BJTbasePrimeNode)) -
121 			*(job->r2H11ptr + (here->BJTcolPrimeNode));
122 		    i2h11y = *(job->i2H11ptr + (here->BJTbasePrimeNode)) -
123 			*(job->i2H11ptr + (here->BJTcolPrimeNode));
124 
125 		    if (td != 0) {
126 			temp = 2*job->Domega1* td ;
127 			r2h11z = r2h11x*cos(temp) + i2h11x*sin(temp);
128 			i2h11z = i2h11x*cos(temp) - r2h11x*sin(temp);
129 		    }
130 		    else {
131 			r2h11z = r2h11x;
132 			i2h11z = i2h11x;
133 		    }
134 		}
135 
136 		if (mode == D_2F1MF2){
137 
138 		    r2h1m2x = *(job->r2H1m2ptr + (here->BJTbasePrimeNode)) -
139 			*(job->r2H1m2ptr + (here->BJTemitPrimeNode));
140 		    i2h1m2x = *(job->i2H1m2ptr + (here->BJTbasePrimeNode))
141 			- *(job->i2H1m2ptr + (here->BJTemitPrimeNode));
142 
143 		    r2h1m2y = *(job->r2H1m2ptr + (here->BJTbasePrimeNode)) -
144 			*(job->r2H1m2ptr + (here->BJTcolPrimeNode));
145 		    i2h1m2y = *(job->i2H1m2ptr + (here->BJTbasePrimeNode))
146 			- *(job->i2H1m2ptr + (here->BJTcolPrimeNode));
147 
148 		    if (td != 0) {
149 
150 			temp = (job->Domega1 - job->Domega2) * td;
151 			r2h1m2z = r2h1m2x*cos(temp)
152 			    + i2h1m2x*sin(temp);
153 			i2h1m2z = i2h1m2x*cos(temp)
154 			    - r2h1m2x*sin(temp);
155 		    }
156 		    else {
157 			r2h1m2z = r2h1m2x;
158 			i2h1m2z = i2h1m2x;
159 		    }
160 		}
161 		if (mode == D_F1PF2){
162 
163 		    r1h2x = *(job->r1H2ptr + (here->BJTbasePrimeNode)) -
164 			*(job->r1H2ptr + (here->BJTemitPrimeNode));
165 		    i1h2x = *(job->i1H2ptr + (here->BJTbasePrimeNode)) -
166 			*(job->i1H2ptr + (here->BJTemitPrimeNode));
167 
168 		    r1h2y = *(job->r1H2ptr + (here->BJTbasePrimeNode)) -
169 			*(job->r1H2ptr + (here->BJTcolPrimeNode));
170 		    i1h2y = *(job->i1H2ptr + (here->BJTbasePrimeNode)) -
171 			*(job->i1H2ptr + (here->BJTcolPrimeNode));
172 
173 
174 		    if (td != 0) {
175 			temp = job->Domega2 * td;
176 			r1h2z = r1h2x*cos(temp) + i1h2x*sin(temp);
177 			i1h2z = i1h2x*cos(temp) - r1h2x*sin(temp);
178 		    }
179 		    else {
180 			r1h2z = r1h2x;
181 			i1h2z = i1h2x;
182 		    }
183 		}
184 		/* loading starts here */
185 
186 		switch (mode) {
187 		case D_TWOF1:
188 
189 
190 		    /* ic term */
191 
192 #ifdef D_DBG_SMALLTIMES
193 		    time = SPfrontEnd->IFseconds();
194 #endif
195 		    temp = DFn2F1( here->ic_x2,
196 				   here->ic_y2,
197 				   here->ic_w2,
198 				   here->ic_xy,
199 				   here->ic_yw,
200 				   here->ic_xw,
201 				   r1h1x,
202 				   i1h1x,
203 				   r1h1y,
204 				   i1h1y,
205 				   r1h1z,
206 				   i1h1z);
207 
208 		    itemp = DFi2F1( here->ic_x2,
209 				    here->ic_y2,
210 				    here->ic_w2,
211 				    here->ic_xy,
212 				    here->ic_yw,
213 				    here->ic_xw,
214 				    r1h1x,
215 				    i1h1x,
216 				    r1h1y,
217 				    i1h1y,
218 				    r1h1z,
219 				    i1h1z);
220 #ifdef D_DBG_SMALLTIMES
221 		    time = SPfrontEnd->IFseconds() - time;
222 		    printf("Time for DFn2F1: %g seconds \n", time);
223 #endif
224 
225 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) -= temp;
226 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) -= itemp;
227 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
228 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
229 
230 		    /* finish ic term */
231 		    /* loading ib term */
232 		    /* x and y still the same */
233 		    temp = DFn2F1( here->ib_x2,
234 				   here->ib_y2,
235 				   0.0,
236 				   here->ib_xy,
237 				   0.0,
238 				   0.0,
239 				   r1h1x,
240 				   i1h1x,
241 				   r1h1y,
242 				   i1h1y,
243 				   0.0,
244 				   0.0);
245 
246 		    itemp = DFi2F1( here->ib_x2,
247 				    here->ib_y2,
248 				    0.0,
249 				    here->ib_xy,
250 				    0.0,
251 				    0.0,
252 				    r1h1x,
253 				    i1h1x,
254 				    r1h1y,
255 				    i1h1y,
256 				    0.0,
257 				    0.0);
258 
259 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
260 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
261 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
262 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
263 
264 		    /* ib term over */
265 		    /* loading ibb term */
266 		    /* now x = vbe, y = vbc, z = vbb */
267 		    if ( !((model->BJTminBaseResist == 0.0) &&
268 			   (model->BJTbaseResist == model->BJTminBaseResist))) {
269 
270 			r1h1z = *(job->r1H1ptr + (here->BJTbaseNode)) -
271 			    *(job->r1H1ptr + (here->BJTbasePrimeNode));
272 			i1h1z = *(job->i1H1ptr + (here->BJTbaseNode)) -
273 			    *(job->i1H1ptr + (here->BJTbasePrimeNode));
274 
275 			temp = DFn2F1( here->ibb_x2,
276 				       here->ibb_y2,
277 				       here->ibb_z2,
278 				       here->ibb_xy,
279 				       here->ibb_yz,
280 				       here->ibb_xz,
281 				       r1h1x,
282 				       i1h1x,
283 				       r1h1y,
284 				       i1h1y,
285 				       r1h1z,
286 				       i1h1z);
287 
288 			itemp = DFi2F1( here->ibb_x2,
289 					here->ibb_y2,
290 					here->ibb_z2,
291 					here->ibb_xy,
292 					here->ibb_yz,
293 					here->ibb_xz,
294 					r1h1x,
295 					i1h1x,
296 					r1h1y,
297 					i1h1y,
298 					r1h1z,
299 					i1h1z);
300 
301 			*(ckt->CKTrhs + here->BJTbaseNode) -= temp;
302 			*(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
303 			*(ckt->CKTrhs + here->BJTbasePrimeNode) += temp;
304 			*(ckt->CKTirhs + here->BJTbasePrimeNode) += itemp;
305 		    }
306 
307 		    /* ibb term over */
308 		    /* loading qbe term */
309 		    /* x = vbe, y = vbc, z not used */
310 		    /* (have to multiply by j omega for charge storage
311 		     * elements to get the current)
312 		     */
313 
314 		    temp = - ckt->CKTomega*
315 			DFi2F1( here->qbe_x2,
316 				here->qbe_y2,
317 				0.0,
318 				here->qbe_xy,
319 				0.0,
320 				0.0,
321 				r1h1x,
322 				i1h1x,
323 				r1h1y,
324 				i1h1y,
325 				0.0,
326 				0.0);
327 
328 		    itemp = ckt->CKTomega*
329 			DFn2F1( here->qbe_x2,
330 				here->qbe_y2,
331 				0.0,
332 				here->qbe_xy,
333 				0.0,
334 				0.0,
335 				r1h1x,
336 				i1h1x,
337 				r1h1y,
338 				i1h1y,
339 				0.0,
340 				0.0);
341 
342 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
343 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
344 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
345 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
346 
347 		    /* qbe term over */
348 		    /* loading qbx term */
349 		    /* z = vbx= vb - vcPrime */
350 
351 		    r1h1z = r1h1z + r1h1y;
352 		    i1h1z = i1h1z + i1h1y;
353 #ifdef D_DBG_SMALLTIMES
354 		    time = SPfrontEnd->IFseconds();
355 #endif
356 		    temp = - ckt->CKTomega *
357 			D1i2F1(here->capbx2,
358 			       r1h1z,
359 			       i1h1z);
360 		    itemp = ckt->CKTomega *
361 			D1n2F1(here->capbx2,
362 			       r1h1z,
363 			       i1h1z);
364 #ifdef D_DBG_SMALLTIMES
365 		    time = SPfrontEnd->IFseconds() - time;
366 		    printf("Time for D1n2F1: %g seconds \n", time);
367 #endif
368 
369 
370 		    *(ckt->CKTrhs + here->BJTbaseNode) -= temp;
371 		    *(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
372 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
373 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
374 
375 		    /* qbx term over */
376 
377 		    /* loading qbc term */
378 
379 		    temp = - ckt->CKTomega *
380 			D1i2F1(here->capbc2,
381 			       r1h1y,
382 			       i1h1y);
383 		    itemp = ckt->CKTomega *
384 			D1n2F1(here->capbc2,
385 			       r1h1y,
386 			       i1h1y);
387 
388 
389 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
390 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
391 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
392 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
393 
394 		    /* qbc term over */
395 
396 
397 		    /* loading qsc term */
398 		    /* z = vsc */
399 
400 
401 
402 		    r1h1z = *(job->r1H1ptr + (here->BJTsubstNode)) -
403 			*(job->r1H1ptr + (here->BJTcolPrimeNode));
404 		    i1h1z = *(job->i1H1ptr + (here->BJTsubstNode)) -
405 			*(job->i1H1ptr + (here->BJTcolPrimeNode));
406 
407 		    temp = - ckt->CKTomega *
408 			D1i2F1(here->capsc2,
409 			       r1h1z,
410 			       i1h1z);
411 		    itemp = ckt->CKTomega *
412 			D1n2F1(here->capsc2,
413 			       r1h1z,
414 			       i1h1z);
415 
416 
417 		    *(ckt->CKTrhs + here->BJTsubstNode) -= temp;
418 		    *(ckt->CKTirhs + here->BJTsubstNode) -= itemp;
419 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
420 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
421 
422 		    /* qsc term over */
423 
424 
425 		    break;
426 
427 		case D_THRF1:
428 		    /* ic term */
429 
430 #ifdef D_DBG_SMALLTIMES
431 		    time = SPfrontEnd->IFseconds();
432 #endif
433 		    temp = DFn3F1( here->ic_x2,
434 				   here->ic_y2,
435 				   here->ic_w2,
436 				   here->ic_xy,
437 				   here->ic_yw,
438 				   here->ic_xw,
439 				   here->ic_x3,
440 				   here->ic_y3,
441 				   here->ic_w3,
442 				   here->ic_x2y,
443 				   here->ic_x2w,
444 				   here->ic_xy2,
445 				   here->ic_y2w,
446 				   here->ic_xw2,
447 				   here->ic_yw2,
448 				   here->ic_xyw,
449 				   r1h1x,
450 				   i1h1x,
451 				   r1h1y,
452 				   i1h1y,
453 				   r1h1z,
454 				   i1h1z,
455 				   r2h11x,
456 				   i2h11x,
457 				   r2h11y,
458 				   i2h11y,
459 				   r2h11z,
460 				   i2h11z);
461 
462 		    itemp = DFi3F1( here->ic_x2,
463 				    here->ic_y2,
464 				    here->ic_w2,
465 				    here->ic_xy,
466 				    here->ic_yw,
467 				    here->ic_xw,
468 				    here->ic_x3,
469 				    here->ic_y3,
470 				    here->ic_w3,
471 				    here->ic_x2y,
472 				    here->ic_x2w,
473 				    here->ic_xy2,
474 				    here->ic_y2w,
475 				    here->ic_xw2,
476 				    here->ic_yw2,
477 				    here->ic_xyw,
478 				    r1h1x,
479 				    i1h1x,
480 				    r1h1y,
481 				    i1h1y,
482 				    r1h1z,
483 				    i1h1z,
484 				    r2h11x,
485 				    i2h11x,
486 				    r2h11y,
487 				    i2h11y,
488 				    r2h11z,
489 				    i2h11z);
490 #ifdef D_DBG_SMALLTIMES
491 		    time = SPfrontEnd->IFseconds() - time;
492 		    printf("Time for DFn3F1: %g seconds \n", time);
493 #endif
494 
495 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) -= temp;
496 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) -= itemp;
497 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
498 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
499 
500 		    /* finish ic term */
501 		    /* loading ib term */
502 		    /* x and y still the same */
503 		    temp = DFn3F1( here->ib_x2,
504 				   here->ib_y2,
505 				   0.0,
506 				   here->ib_xy,
507 				   0.0,
508 				   0.0,
509 				   here->ib_x3,
510 				   here->ib_y3,
511 				   0.0,
512 				   here->ib_x2y,
513 				   0.0,
514 				   here->ib_xy2,
515 				   0.0,
516 				   0.0,
517 				   0.0,
518 				   0.0,
519 				   r1h1x,
520 				   i1h1x,
521 				   r1h1y,
522 				   i1h1y,
523 				   0.0,
524 				   0.0,
525 				   r2h11x,
526 				   i2h11x,
527 				   r2h11y,
528 				   i2h11y,
529 				   0.0,
530 				   0.0);
531 
532 		    itemp = DFi3F1( here->ib_x2,
533 				    here->ib_y2,
534 				    0.0,
535 				    here->ib_xy,
536 				    0.0,
537 				    0.0,
538 				    here->ib_x3,
539 				    here->ib_y3,
540 				    0.0,
541 				    here->ib_x2y,
542 				    0.0,
543 				    here->ib_xy2,
544 				    0.0,
545 				    0.0,
546 				    0.0,
547 				    0.0,
548 				    r1h1x,
549 				    i1h1x,
550 				    r1h1y,
551 				    i1h1y,
552 				    0.0,
553 				    0.0,
554 				    r2h11x,
555 				    i2h11x,
556 				    r2h11y,
557 				    i2h11y,
558 				    0.0,
559 				    0.0);
560 
561 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
562 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
563 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
564 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
565 
566 		    /* ib term over */
567 		    /* loading ibb term */
568 		    if ( !((model->BJTminBaseResist == 0.0) &&
569 			   (model->BJTbaseResist == model->BJTminBaseResist))) {
570 
571 			/* now x = vbe, y = vbc, z = vbb */
572 			r1h1z = *(job->r1H1ptr + (here->BJTbaseNode)) -
573 			    *(job->r1H1ptr + (here->BJTbasePrimeNode));
574 			i1h1z = *(job->i1H1ptr + (here->BJTbaseNode)) -
575 			    *(job->i1H1ptr + (here->BJTbasePrimeNode));
576 
577 			r2h11z = *(job->r2H11ptr + (here->BJTbaseNode)) -
578 			    *(job->r2H11ptr + (here->BJTbasePrimeNode));
579 			i2h11z = *(job->i2H11ptr + (here->BJTbaseNode)) -
580 			    *(job->i2H11ptr + (here->BJTbasePrimeNode));
581 
582 			temp = DFn3F1( here->ibb_x2,
583 				       here->ibb_y2,
584 				       here->ibb_z2,
585 				       here->ibb_xy,
586 				       here->ibb_yz,
587 				       here->ibb_xz,
588 				       here->ibb_x3,
589 				       here->ibb_y3,
590 				       here->ibb_z3,
591 				       here->ibb_x2y,
592 				       here->ibb_x2z,
593 				       here->ibb_xy2,
594 				       here->ibb_y2z,
595 				       here->ibb_xz2,
596 				       here->ibb_yz2,
597 				       here->ibb_xyz,
598 				       r1h1x,
599 				       i1h1x,
600 				       r1h1y,
601 				       i1h1y,
602 				       r1h1z,
603 				       i1h1z,
604 				       r2h11x,
605 				       i2h11x,
606 				       r2h11y,
607 				       i2h11y,
608 				       r2h11z,
609 				       i2h11z);
610 
611 			itemp = DFi3F1( here->ibb_x2,
612 					here->ibb_y2,
613 					here->ibb_z2,
614 					here->ibb_xy,
615 					here->ibb_yz,
616 					here->ibb_xz,
617 					here->ibb_x3,
618 					here->ibb_y3,
619 					here->ibb_z3,
620 					here->ibb_x2y,
621 					here->ibb_x2z,
622 					here->ibb_xy2,
623 					here->ibb_y2z,
624 					here->ibb_xz2,
625 					here->ibb_yz2,
626 					here->ibb_xyz,
627 					r1h1x,
628 					i1h1x,
629 					r1h1y,
630 					i1h1y,
631 					r1h1z,
632 					i1h1z,
633 					r2h11x,
634 					i2h11x,
635 					r2h11y,
636 					i2h11y,
637 					r2h11z,
638 					i2h11z);
639 
640 			*(ckt->CKTrhs + here->BJTbaseNode) -= temp;
641 			*(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
642 			*(ckt->CKTrhs + here->BJTbasePrimeNode) += temp;
643 			*(ckt->CKTirhs + here->BJTbasePrimeNode) += itemp;
644 
645 		    }
646 		    /* ibb term over */
647 		    /* loading qbe term */
648 		    /* x = vbe, y = vbc, z not used */
649 		    /* (have to multiply by j omega for charge storage
650 		     * elements to get the current)
651 		     */
652 
653 		    temp = - ckt->CKTomega*
654 			DFi3F1( here->qbe_x2,
655 				here->qbe_y2,
656 				0.0,
657 				here->qbe_xy,
658 				0.0,
659 				0.0,
660 				here->qbe_x3,
661 				here->qbe_y3,
662 				0.0,
663 				here->qbe_x2y,
664 				0.0,
665 				here->qbe_xy2,
666 				0.0,
667 				0.0,
668 				0.0,
669 				0.0,
670 				r1h1x,
671 				i1h1x,
672 				r1h1y,
673 				i1h1y,
674 				0.0,
675 				0.0,
676 				r2h11x,
677 				i2h11x,
678 				r2h11y,
679 				i2h11y,
680 				0.0,
681 				0.0);
682 
683 		    itemp = ckt->CKTomega*
684 			DFn3F1( here->qbe_x2,
685 				here->qbe_y2,
686 				0.0,
687 				here->qbe_xy,
688 				0.0,
689 				0.0,
690 				here->qbe_x3,
691 				here->qbe_y3,
692 				0.0,
693 				here->qbe_x2y,
694 				0.0,
695 				here->qbe_xy2,
696 				0.0,
697 				0.0,
698 				0.0,
699 				0.0,
700 				r1h1x,
701 				i1h1x,
702 				r1h1y,
703 				i1h1y,
704 				0.0,
705 				0.0,
706 				r2h11x,
707 				i2h11x,
708 				r2h11y,
709 				i2h11y,
710 				0.0,
711 				0.0);
712 
713 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
714 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
715 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
716 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
717 
718 		    /* qbe term over */
719 		    /* loading qbx term */
720 		    /* z = vbx= vb - vcPrime */
721 
722 		    r1h1z = r1h1z + r1h1y;
723 		    i1h1z = i1h1z + i1h1y;
724 		    r2h11z = r2h11z + r2h11y;
725 		    i2h11z = i2h11z + i2h11y;
726 #ifdef D_DBG_SMALLTIMES
727 		    time = SPfrontEnd->IFseconds();
728 #endif
729 		    temp = - ckt->CKTomega *
730 			D1i3F1(here->capbx2,
731 			       here->capbx3,
732 			       r1h1z,
733 			       i1h1z,
734 			       r2h11z,
735 			       i2h11z);
736 		    itemp = ckt->CKTomega *
737 			D1n3F1(here->capbx2,
738 			       here->capbx3,
739 			       r1h1z,
740 			       i1h1z,
741 			       r2h11z,
742 			       i2h11z);
743 #ifdef D_DBG_SMALLTIMES
744 		    time = SPfrontEnd->IFseconds() - time;
745 		    printf("Time for D1n3F1: %g seconds \n", time);
746 #endif
747 
748 
749 		    *(ckt->CKTrhs + here->BJTbaseNode) -= temp;
750 		    *(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
751 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
752 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
753 
754 		    /* qbx term over */
755 
756 		    /* loading qbc term */
757 
758 		    temp = - ckt->CKTomega *
759 			D1i3F1(here->capbc2,
760 			       here->capbc3,
761 			       r1h1y,
762 			       i1h1y,
763 			       r2h11y,
764 			       i2h11y);
765 		    itemp = ckt->CKTomega *
766 			D1n3F1(here->capbc2,
767 			       here->capbc3,
768 			       r1h1y,
769 			       i1h1y,
770 			       r2h11y,
771 			       i2h11y);
772 
773 
774 
775 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
776 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
777 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
778 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
779 
780 		    /* qbc term over */
781 
782 
783 		    /* loading qsc term */
784 		    /* z = vsc */
785 
786 
787 
788 		    r1h1z = *(job->r1H1ptr + (here->BJTsubstNode)) -
789 			*(job->r1H1ptr + (here->BJTcolPrimeNode));
790 		    i1h1z = *(job->i1H1ptr + (here->BJTsubstNode)) -
791 			*(job->i1H1ptr + (here->BJTcolPrimeNode));
792 
793 		    r2h11z = *(job->r2H11ptr + (here->BJTsubstNode)) -
794 			*(job->r2H11ptr + (here->BJTcolPrimeNode));
795 		    i2h11z = *(job->i2H11ptr + (here->BJTsubstNode)) -
796 			*(job->i2H11ptr + (here->BJTcolPrimeNode));
797 
798 		    temp = - ckt->CKTomega *
799 			D1i3F1(here->capsc2,
800 			       here->capsc3,
801 			       r1h1z,
802 			       i1h1z,
803 			       r2h11z,
804 			       i2h11z);
805 
806 		    itemp = ckt->CKTomega *
807 			D1n3F1(here->capsc2,
808 			       here->capsc3,
809 			       r1h1z,
810 			       i1h1z,
811 			       r2h11z,
812 			       i2h11z);
813 
814 
815 		    *(ckt->CKTrhs + here->BJTsubstNode) -= temp;
816 		    *(ckt->CKTirhs + here->BJTsubstNode) -= itemp;
817 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
818 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
819 
820 		    /* qsc term over */
821 
822 
823 		    break;
824 		case D_F1PF2:
825 		    /* ic term */
826 
827 		    temp = DFnF12( here->ic_x2,
828 				   here->ic_y2,
829 				   here->ic_w2,
830 				   here->ic_xy,
831 				   here->ic_yw,
832 				   here->ic_xw,
833 				   r1h1x,
834 				   i1h1x,
835 				   r1h1y,
836 				   i1h1y,
837 				   r1h1z,
838 				   i1h1z,
839 				   r1h2x,
840 				   i1h2x,
841 				   r1h2y,
842 				   i1h2y,
843 				   r1h2z,
844 				   i1h2z);
845 
846 		    itemp = DFiF12( here->ic_x2,
847 				    here->ic_y2,
848 				    here->ic_w2,
849 				    here->ic_xy,
850 				    here->ic_yw,
851 				    here->ic_xw,
852 				    r1h1x,
853 				    i1h1x,
854 				    r1h1y,
855 				    i1h1y,
856 				    r1h1z,
857 				    i1h1z,
858 				    r1h2x,
859 				    i1h2x,
860 				    r1h2y,
861 				    i1h2y,
862 				    r1h2z,
863 				    i1h2z);
864 
865 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) -= temp;
866 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) -= itemp;
867 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
868 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
869 
870 		    /* finish ic term */
871 		    /* loading ib term */
872 		    /* x and y still the same */
873 #ifdef D_DBG_SMALLTIMES
874 		    time = SPfrontEnd->IFseconds();
875 #endif
876 		    temp = DFnF12( here->ib_x2,
877 				   here->ib_y2,
878 				   0.0,
879 				   here->ib_xy,
880 				   0.0,
881 				   0.0,
882 				   r1h1x,
883 				   i1h1x,
884 				   r1h1y,
885 				   i1h1y,
886 				   0.0,
887 				   0.0,
888 				   r1h2x,
889 				   i1h2x,
890 				   r1h2y,
891 				   i1h2y,
892 				   0.0,
893 				   0.0);
894 
895 		    itemp = DFiF12( here->ib_x2,
896 				    here->ib_y2,
897 				    0.0,
898 				    here->ib_xy,
899 				    0.0,
900 				    0.0,
901 				    r1h1x,
902 				    i1h1x,
903 				    r1h1y,
904 				    i1h1y,
905 				    0.0,
906 				    0.0,
907 				    r1h2x,
908 				    i1h2x,
909 				    r1h2y,
910 				    i1h2y,
911 				    0.0,
912 				    0.0);
913 #ifdef D_DBG_SMALLTIMES
914 		    time = SPfrontEnd->IFseconds() - time;
915 		    printf("Time for DFnF12: %g seconds \n", time);
916 #endif
917 
918 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
919 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
920 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
921 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
922 
923 		    /* ib term over */
924 		    /* loading ibb term */
925 		    if ( !((model->BJTminBaseResist == 0.0) &&
926 			   (model->BJTbaseResist == model->BJTminBaseResist))) {
927 
928 			/* now x = vbe, y = vbc, z = vbb */
929 			r1h1z = *(job->r1H1ptr + (here->BJTbaseNode)) -
930 			    *(job->r1H1ptr + (here->BJTbasePrimeNode));
931 			i1h1z = *(job->i1H1ptr + (here->BJTbaseNode)) -
932 			    *(job->i1H1ptr + (here->BJTbasePrimeNode));
933 
934 			r1h2z = *(job->r1H2ptr + (here->BJTbaseNode)) -
935 			    *(job->r1H2ptr + (here->BJTbasePrimeNode));
936 			i1h2z = *(job->i1H2ptr + (here->BJTbaseNode)) -
937 			    *(job->i1H2ptr + (here->BJTbasePrimeNode));
938 
939 			temp = DFnF12( here->ibb_x2,
940 				       here->ibb_y2,
941 				       here->ibb_z2,
942 				       here->ibb_xy,
943 				       here->ibb_yz,
944 				       here->ibb_xz,
945 				       r1h1x,
946 				       i1h1x,
947 				       r1h1y,
948 				       i1h1y,
949 				       r1h1z,
950 				       i1h1z,
951 				       r1h2x,
952 				       i1h2x,
953 				       r1h2y,
954 				       i1h2y,
955 				       r1h2z,
956 				       i1h2z);
957 
958 			itemp = DFiF12( here->ibb_x2,
959 					here->ibb_y2,
960 					here->ibb_z2,
961 					here->ibb_xy,
962 					here->ibb_yz,
963 					here->ibb_xz,
964 					r1h1x,
965 					i1h1x,
966 					r1h1y,
967 					i1h1y,
968 					r1h1z,
969 					i1h1z,
970 					r1h2x,
971 					i1h2x,
972 					r1h2y,
973 					i1h2y,
974 					r1h2z,
975 					i1h2z);
976 
977 			*(ckt->CKTrhs + here->BJTbaseNode) -= temp;
978 			*(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
979 			*(ckt->CKTrhs + here->BJTbasePrimeNode) += temp;
980 			*(ckt->CKTirhs + here->BJTbasePrimeNode) += itemp;
981 
982 		    }
983 		    /* ibb term over */
984 		    /* loading qbe term */
985 		    /* x = vbe, y = vbc, z not used */
986 		    /* (have to multiply by j omega for charge storage
987 		     * elements - to get the current)
988 		     */
989 
990 		    temp = - ckt->CKTomega*
991 			DFiF12( here->qbe_x2,
992 				here->qbe_y2,
993 				0.0,
994 				here->qbe_xy,
995 				0.0,
996 				0.0,
997 				r1h1x,
998 				i1h1x,
999 				r1h1y,
1000 				i1h1y,
1001 				0.0,
1002 				0.0,
1003 				r1h2x,
1004 				i1h2x,
1005 				r1h2y,
1006 				i1h2y,
1007 				0.0,
1008 				0.0);
1009 
1010 		    itemp = ckt->CKTomega*
1011 			DFnF12( here->qbe_x2,
1012 				here->qbe_y2,
1013 				0.0,
1014 				here->qbe_xy,
1015 				0.0,
1016 				0.0,
1017 				r1h1x,
1018 				i1h1x,
1019 				r1h1y,
1020 				i1h1y,
1021 				0.0,
1022 				0.0,
1023 				r1h2x,
1024 				i1h2x,
1025 				r1h2y,
1026 				i1h2y,
1027 				0.0,
1028 				0.0);
1029 
1030 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1031 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1032 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1033 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1034 
1035 		    /* qbe term over */
1036 		    /* loading qbx term */
1037 		    /* z = vbx= vb - vcPrime */
1038 
1039 		    r1h1z = r1h1z + r1h1y;
1040 		    i1h1z = i1h1z + i1h1y;
1041 		    r1h2z = r1h2z + r1h2y;
1042 		    i1h2z = i1h2z + i1h2y;
1043 #ifdef D_DBG_SMALLTIMES
1044 		    time = SPfrontEnd->IFseconds();
1045 #endif
1046 		    temp = - ckt->CKTomega *
1047 			D1iF12(here->capbx2,
1048 			       r1h1z,
1049 			       i1h1z,
1050 			       r1h2z,
1051 			       i1h2z);
1052 		    itemp = ckt->CKTomega *
1053 			D1nF12(here->capbx2,
1054 			       r1h1z,
1055 			       i1h1z,
1056 			       r1h2z,
1057 			       i1h2z);
1058 #ifdef D_DBG_SMALLTIMES
1059 		    time = SPfrontEnd->IFseconds() - time;
1060 		    printf("Time for D1nF12: %g seconds \n", time);
1061 #endif
1062 
1063 
1064 		    *(ckt->CKTrhs + here->BJTbaseNode) -= temp;
1065 		    *(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
1066 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1067 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1068 
1069 		    /* qbx term over */
1070 
1071 		    /* loading qbc term */
1072 
1073 		    temp = - ckt->CKTomega *
1074 			D1iF12(here->capbc2,
1075 			       r1h1y,
1076 			       i1h1y,
1077 			       r1h2y,
1078 			       i1h2y);
1079 		    itemp = ckt->CKTomega *
1080 			D1nF12(here->capbc2,
1081 			       r1h1y,
1082 			       i1h1y,
1083 			       r1h2y,
1084 			       i1h2y);
1085 
1086 
1087 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1088 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1089 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1090 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1091 
1092 		    /* qbc term over */
1093 
1094 
1095 		    /* loading qsc term */
1096 		    /* z = vsc */
1097 
1098 
1099 
1100 		    r1h1z = *(job->r1H1ptr + (here->BJTsubstNode)) -
1101 			*(job->r1H1ptr + (here->BJTcolPrimeNode));
1102 		    i1h1z = *(job->i1H1ptr + (here->BJTsubstNode)) -
1103 			*(job->i1H1ptr + (here->BJTcolPrimeNode));
1104 		    r1h2z = *(job->r1H2ptr + (here->BJTsubstNode)) -
1105 			*(job->r1H2ptr + (here->BJTcolPrimeNode));
1106 		    i1h2z = *(job->i1H2ptr + (here->BJTsubstNode)) -
1107 			*(job->i1H2ptr + (here->BJTcolPrimeNode));
1108 
1109 		    temp = - ckt->CKTomega *
1110 			D1iF12(here->capsc2,
1111 			       r1h1z,
1112 			       i1h1z,
1113 			       r1h2z,
1114 			       i1h2z);
1115 		    itemp = ckt->CKTomega *
1116 			D1nF12(here->capsc2,
1117 			       r1h1z,
1118 			       i1h1z,
1119 			       r1h2z,
1120 			       i1h2z);
1121 
1122 
1123 		    *(ckt->CKTrhs + here->BJTsubstNode) -= temp;
1124 		    *(ckt->CKTirhs + here->BJTsubstNode) -= itemp;
1125 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1126 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1127 
1128 		    /* qsc term over */
1129 
1130 
1131 		    break;
1132 		case D_F1MF2:
1133 		    /* ic term */
1134 
1135 		    temp = DFnF12( here->ic_x2,
1136 				   here->ic_y2,
1137 				   here->ic_w2,
1138 				   here->ic_xy,
1139 				   here->ic_yw,
1140 				   here->ic_xw,
1141 				   r1h1x,
1142 				   i1h1x,
1143 				   r1h1y,
1144 				   i1h1y,
1145 				   r1h1z,
1146 				   i1h1z,
1147 				   r1hm2x,
1148 				   i1hm2x,
1149 				   r1hm2y,
1150 				   i1hm2y,
1151 				   r1hm2z,
1152 				   i1hm2z);
1153 
1154 		    itemp = DFiF12( here->ic_x2,
1155 				    here->ic_y2,
1156 				    here->ic_w2,
1157 				    here->ic_xy,
1158 				    here->ic_yw,
1159 				    here->ic_xw,
1160 				    r1h1x,
1161 				    i1h1x,
1162 				    r1h1y,
1163 				    i1h1y,
1164 				    r1h1z,
1165 				    i1h1z,
1166 				    r1hm2x,
1167 				    i1hm2x,
1168 				    r1hm2y,
1169 				    i1hm2y,
1170 				    r1hm2z,
1171 				    i1hm2z);
1172 
1173 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) -= temp;
1174 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) -= itemp;
1175 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1176 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1177 
1178 		    /* finish ic term */
1179 		    /* loading ib term */
1180 		    /* x and y still the same */
1181 		    temp = DFnF12( here->ib_x2,
1182 				   here->ib_y2,
1183 				   0.0,
1184 				   here->ib_xy,
1185 				   0.0,
1186 				   0.0,
1187 				   r1h1x,
1188 				   i1h1x,
1189 				   r1h1y,
1190 				   i1h1y,
1191 				   0.0,
1192 				   0.0,
1193 				   r1hm2x,
1194 				   i1hm2x,
1195 				   r1hm2y,
1196 				   i1hm2y,
1197 				   0.0,
1198 				   0.0);
1199 
1200 		    itemp = DFiF12( here->ib_x2,
1201 				    here->ib_y2,
1202 				    0.0,
1203 				    here->ib_xy,
1204 				    0.0,
1205 				    0.0,
1206 				    r1h1x,
1207 				    i1h1x,
1208 				    r1h1y,
1209 				    i1h1y,
1210 				    0.0,
1211 				    0.0,
1212 				    r1hm2x,
1213 				    i1hm2x,
1214 				    r1hm2y,
1215 				    i1hm2y,
1216 				    0.0,
1217 				    0.0);
1218 
1219 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1220 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1221 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1222 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1223 
1224 		    /* ib term over */
1225 		    /* loading ibb term */
1226 		    if ( !((model->BJTminBaseResist == 0.0) &&
1227 			   (model->BJTbaseResist == model->BJTminBaseResist))) {
1228 
1229 			/* now x = vbe, y = vbc, z = vbb */
1230 			r1h1z = *(job->r1H1ptr + (here->BJTbaseNode)) -
1231 			    *(job->r1H1ptr + (here->BJTbasePrimeNode));
1232 			i1h1z = *(job->i1H1ptr + (here->BJTbaseNode)) -
1233 			    *(job->i1H1ptr + (here->BJTbasePrimeNode));
1234 
1235 			r1hm2z = *(job->r1H2ptr + (here->BJTbaseNode)) -
1236 			    *(job->r1H2ptr + (here->BJTbasePrimeNode));
1237 			i1hm2z = *(job->i1H2ptr + (here->BJTbaseNode)) -
1238 			    *(job->i1H2ptr + (here->BJTbasePrimeNode));
1239 
1240 			temp = DFnF12( here->ibb_x2,
1241 				       here->ibb_y2,
1242 				       here->ibb_z2,
1243 				       here->ibb_xy,
1244 				       here->ibb_yz,
1245 				       here->ibb_xz,
1246 				       r1h1x,
1247 				       i1h1x,
1248 				       r1h1y,
1249 				       i1h1y,
1250 				       r1h1z,
1251 				       i1h1z,
1252 				       r1hm2x,
1253 				       i1hm2x,
1254 				       r1hm2y,
1255 				       i1hm2y,
1256 				       r1hm2z,
1257 				       i1hm2z);
1258 
1259 			itemp = DFiF12( here->ibb_x2,
1260 					here->ibb_y2,
1261 					here->ibb_z2,
1262 					here->ibb_xy,
1263 					here->ibb_yz,
1264 					here->ibb_xz,
1265 					r1h1x,
1266 					i1h1x,
1267 					r1h1y,
1268 					i1h1y,
1269 					r1h1z,
1270 					i1h1z,
1271 					r1hm2x,
1272 					i1hm2x,
1273 					r1hm2y,
1274 					i1hm2y,
1275 					r1hm2z,
1276 					i1hm2z);
1277 
1278 			*(ckt->CKTrhs + here->BJTbaseNode) -= temp;
1279 			*(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
1280 			*(ckt->CKTrhs + here->BJTbasePrimeNode) += temp;
1281 			*(ckt->CKTirhs + here->BJTbasePrimeNode) += itemp;
1282 		    }
1283 
1284 		    /* ibb term over */
1285 		    /* loading qbe term */
1286 		    /* x = vbe, y = vbc, z not used */
1287 		    /* (have to multiply by j omega for charge storage
1288 		     * elements - to get the current)
1289 		     */
1290 
1291 		    temp = - ckt->CKTomega*
1292 			DFiF12( here->qbe_x2,
1293 				here->qbe_y2,
1294 				0.0,
1295 				here->qbe_xy,
1296 				0.0,
1297 				0.0,
1298 				r1h1x,
1299 				i1h1x,
1300 				r1h1y,
1301 				i1h1y,
1302 				0.0,
1303 				0.0,
1304 				r1hm2x,
1305 				i1hm2x,
1306 				r1hm2y,
1307 				i1hm2y,
1308 				0.0,
1309 				0.0);
1310 
1311 		    itemp = ckt->CKTomega*
1312 			DFnF12( here->qbe_x2,
1313 				here->qbe_y2,
1314 				0.0,
1315 				here->qbe_xy,
1316 				0.0,
1317 				0.0,
1318 				r1h1x,
1319 				i1h1x,
1320 				r1h1y,
1321 				i1h1y,
1322 				0.0,
1323 				0.0,
1324 				r1hm2x,
1325 				i1hm2x,
1326 				r1hm2y,
1327 				i1hm2y,
1328 				0.0,
1329 				0.0);
1330 
1331 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1332 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1333 		    *(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1334 		    *(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1335 
1336 		    /* qbe term over */
1337 		    /* loading qbx term */
1338 		    /* z = vbx= vb - vcPrime */
1339 
1340 		    r1h1z = r1h1z + r1h1y;
1341 		    i1h1z = i1h1z + i1h1y;
1342 		    r1hm2z = r1hm2z + r1hm2y;
1343 		    i1hm2z = i1hm2z + i1hm2y;
1344 		    temp = - ckt->CKTomega *
1345 			D1iF12(here->capbx2,
1346 			       r1h1z,
1347 			       i1h1z,
1348 			       r1hm2z,
1349 			       i1hm2z);
1350 		    itemp = ckt->CKTomega *
1351 			D1nF12(here->capbx2,
1352 			       r1h1z,
1353 			       i1h1z,
1354 			       r1hm2z,
1355 			       i1hm2z);
1356 
1357 
1358 		    *(ckt->CKTrhs + here->BJTbaseNode) -= temp;
1359 		    *(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
1360 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1361 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1362 
1363 		    /* qbx term over */
1364 
1365 		    /* loading qbc term */
1366 
1367 		    temp = - ckt->CKTomega *
1368 			D1iF12(here->capbc2,
1369 			       r1h1y,
1370 			       i1h1y,
1371 			       r1hm2y,
1372 			       i1hm2y);
1373 		    itemp = ckt->CKTomega *
1374 			D1nF12(here->capbc2,
1375 			       r1h1y,
1376 			       i1h1y,
1377 			       r1hm2y,
1378 			       i1hm2y);
1379 
1380 
1381 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1382 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1383 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1384 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1385 
1386 		    /* qbc term over */
1387 
1388 
1389 		    /* loading qsc term */
1390 		    /* z = vsc */
1391 
1392 
1393 
1394 		    r1h1z = *(job->r1H1ptr + (here->BJTsubstNode)) -
1395 			*(job->r1H1ptr + (here->BJTcolPrimeNode));
1396 		    i1h1z = *(job->i1H1ptr + (here->BJTsubstNode)) -
1397 			*(job->i1H1ptr + (here->BJTcolPrimeNode));
1398 		    r1hm2z = *(job->r1H2ptr + (here->BJTsubstNode)) -
1399 			*(job->r1H2ptr + (here->BJTcolPrimeNode));
1400 		    i1hm2z = *(job->i1H2ptr + (here->BJTsubstNode)) -
1401 			*(job->i1H2ptr + (here->BJTcolPrimeNode));
1402 
1403 		    temp = - ckt->CKTomega *
1404 			D1iF12(here->capsc2,
1405 			       r1h1z,
1406 			       i1h1z,
1407 			       r1hm2z,
1408 			       i1hm2z);
1409 		    itemp = ckt->CKTomega *
1410 			D1nF12(here->capsc2,
1411 			       r1h1z,
1412 			       i1h1z,
1413 			       r1hm2z,
1414 			       i1hm2z);
1415 
1416 
1417 		    *(ckt->CKTrhs + here->BJTsubstNode) -= temp;
1418 		    *(ckt->CKTirhs + here->BJTsubstNode) -= itemp;
1419 		    *(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1420 		    *(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1421 
1422 		    /* qsc term over */
1423 
1424 
1425 		    break;
1426 		case D_2F1MF2:
1427 		    /* ic term */
1428 
1429 		{
1430 		    pass.cxx =   here->ic_x2;
1431 		    pass.cyy =   here->ic_y2;
1432 		    pass.czz =   here->ic_w2;
1433 		    pass.cxy =   here->ic_xy;
1434 		    pass.cyz =   here->ic_yw;
1435 		    pass.cxz =   here->ic_xw;
1436 		    pass.cxxx =   here->ic_x3;
1437 		    pass.cyyy =   here->ic_y3;
1438 		    pass.czzz =   here->ic_w3;
1439 		    pass.cxxy =   here->ic_x2y;
1440 		    pass.cxxz =   here->ic_x2w;
1441 		    pass.cxyy =   here->ic_xy2;
1442 		    pass.cyyz =   here->ic_y2w;
1443 		    pass.cxzz =   here->ic_xw2;
1444 		    pass.cyzz =   here->ic_yw2;
1445 		    pass.cxyz =   here->ic_xyw;
1446 		    pass.r1h1x =   r1h1x;
1447 		    pass.i1h1x =   i1h1x;
1448 		    pass.r1h1y =   r1h1y;
1449 		    pass.i1h1y =   i1h1y;
1450 		    pass.r1h1z =   r1h1z;
1451 		    pass.i1h1z =   i1h1z;
1452 		    pass.r1h2x =   r1hm2x;
1453 		    pass.i1h2x =   i1hm2x;
1454 		    pass.r1h2y =   r1hm2y;
1455 		    pass.i1h2y =   i1hm2y;
1456 		    pass.r1h2z =   r1hm2z;
1457 		    pass.i1h2z =   i1hm2z;
1458 		    pass.r2h11x =   r2h11x;
1459 		    pass.i2h11x =  i2h11x;
1460 		    pass.r2h11y =   r2h11y;
1461 		    pass.i2h11y =  i2h11y;
1462 		    pass.r2h11z =   r2h11z;
1463 		    pass.i2h11z =  i2h11z;
1464 		    pass.h2f1f2x =   r2h1m2x;
1465 		    pass.ih2f1f2x =  i2h1m2x;
1466 		    pass.h2f1f2y =   r2h1m2y;
1467 		    pass.ih2f1f2y =  i2h1m2y;
1468 		    pass.h2f1f2z =  r2h1m2z;
1469 		    pass.ih2f1f2z =   i2h1m2z;
1470 #ifdef D_DBG_SMALLTIMES
1471 		    time = SPfrontEnd->IFseconds();
1472 #endif
1473 		    temp = DFn2F12(&pass);
1474 
1475 
1476 		    itemp = DFi2F12(&pass);
1477 #ifdef D_DBG_SMALLTIMES
1478 		    time = SPfrontEnd->IFseconds() - time;
1479 		    printf("Time for DFn2F12: %g seconds \n", time);
1480 #endif
1481 		}
1482 
1483 		*(ckt->CKTrhs + here->BJTcolPrimeNode) -= temp;
1484 		*(ckt->CKTirhs + here->BJTcolPrimeNode) -= itemp;
1485 		*(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1486 		*(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1487 
1488 		/* finish ic term */
1489 		/* loading ib term */
1490 		/* x and y still the same */
1491 		{
1492 		    pass.cxx = here->ib_x2;
1493 		    pass.cyy = here->ib_y2;
1494 		    pass.czz = 0.0;
1495 		    pass.cxy = here->ib_xy;
1496 		    pass.cyz = 0.0;
1497 		    pass.cxz = 0.0;
1498 		    pass.cxxx = here->ib_x3;
1499 		    pass.cyyy = here->ib_y3;
1500 		    pass.czzz = 0.0;
1501 		    pass.cxxy = here->ib_x2y;
1502 		    pass.cxxz = 0.0;
1503 		    pass.cxyy = here->ib_xy2;
1504 		    pass.cyyz = 0.0;
1505 		    pass.cxzz = 0.0;
1506 		    pass.cyzz = 0.0;
1507 		    pass.cxyz = 0.0;
1508 		    pass.r1h1x = r1h1x;
1509 		    pass.i1h1x = i1h1x;
1510 		    pass.r1h1y = r1h1y;
1511 		    pass.i1h1y = i1h1y;
1512 		    pass.r1h1z = 0.0;
1513 		    pass.i1h1z = 0.0;
1514 		    pass.r1h2x = r1hm2x;
1515 		    pass.i1h2x = i1hm2x;
1516 		    pass.r1h2y = r1hm2y;
1517 		    pass.i1h2y = i1hm2y;
1518 		    pass.r1h2z = 0.0;
1519 		    pass.i1h2z = 0.0;
1520 		    pass.r2h11x = r2h11x;
1521 		    pass.i2h11x = i2h11x;
1522 		    pass.r2h11y = r2h11y;
1523 		    pass.i2h11y = i2h11y;
1524 		    pass.r2h11z = 0.0;
1525 		    pass.i2h11z = 0.0;
1526 		    pass.h2f1f2x = r2h1m2x;
1527 		    pass.ih2f1f2x = i2h1m2x;
1528 		    pass.h2f1f2y = r2h1m2y;
1529 		    pass.ih2f1f2y = i2h1m2y;
1530 		    pass.h2f1f2z = 0.0;
1531 		    pass.ih2f1f2z = 0.0;
1532 		    temp = DFn2F12(&pass);
1533 
1534 		    itemp = DFi2F12(&pass);
1535 		}
1536 
1537 		*(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1538 		*(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1539 		*(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1540 		*(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1541 
1542 		/* ib term over */
1543 		/* loading ibb term */
1544 		if ( !((model->BJTminBaseResist == 0.0) &&
1545 		       (model->BJTbaseResist == model->BJTminBaseResist))) {
1546 
1547 		    /* now x = vbe, y = vbc, z = vbb */
1548 		    r1h1z = *(job->r1H1ptr + (here->BJTbaseNode)) -
1549 			*(job->r1H1ptr + (here->BJTbasePrimeNode));
1550 		    i1h1z = *(job->i1H1ptr + (here->BJTbaseNode)) -
1551 			*(job->i1H1ptr + (here->BJTbasePrimeNode));
1552 
1553 		    r1hm2z = *(job->r1H2ptr + (here->BJTbaseNode)) -
1554 			*(job->r1H2ptr + (here->BJTbasePrimeNode));
1555 		    i1hm2z = -(*(job->i1H2ptr + (here->BJTbaseNode)) -
1556 			       *(job->i1H2ptr + (here->BJTbasePrimeNode)));
1557 
1558 		    r2h11z = *(job->r2H11ptr + (here->BJTbaseNode)) -
1559 			*(job->r2H11ptr + (here->BJTbasePrimeNode));
1560 		    i2h11z = *(job->i2H11ptr + (here->BJTbaseNode)) -
1561 			*(job->i2H11ptr + (here->BJTbasePrimeNode));
1562 
1563 		    r2h1m2z = *(job->r2H1m2ptr + (here->BJTbaseNode)) -
1564 			*(job->r2H1m2ptr + (here->BJTbasePrimeNode));
1565 		    i2h1m2z = *(job->i2H1m2ptr + (here->BJTbaseNode)) -
1566 			*(job->i2H1m2ptr + (here->BJTbasePrimeNode));
1567 
1568 		    {
1569 			pass.cxx = here->ibb_x2;
1570 			pass.cyy = here->ibb_y2;
1571 			pass.czz = here->ibb_z2;
1572 			pass.cxy = here->ibb_xy;
1573 			pass.cyz = here->ibb_yz;
1574 			pass.cxz = here->ibb_xz;
1575 			pass.cxxx = here->ibb_x3;
1576 			pass.cyyy = here->ibb_y3;
1577 			pass.czzz = here->ibb_z3;
1578 			pass.cxxy = here->ibb_x2y;
1579 			pass.cxxz = here->ibb_x2z;
1580 			pass.cxyy = here->ibb_xy2;
1581 			pass.cyyz = here->ibb_y2z;
1582 			pass.cxzz = here->ibb_xz2;
1583 			pass.cyzz = here->ibb_yz2;
1584 			pass.cxyz = here->ibb_xyz;
1585 			pass.r1h1x = r1h1x;
1586 			pass.i1h1x = i1h1x;
1587 			pass.r1h1y = r1h1y;
1588 			pass.i1h1y = i1h1y;
1589 			pass.r1h1z = r1h1z;
1590 			pass.i1h1z = i1h1z;
1591 			pass.r1h2x = r1hm2x;
1592 			pass.i1h2x = i1hm2x;
1593 			pass.r1h2y = r1hm2y;
1594 			pass.i1h2y = i1hm2y;
1595 			pass.r1h2z = r1hm2z;
1596 			pass.i1h2z = i1hm2z;
1597 			pass.r2h11x = r2h11x;
1598 			pass.i2h11x = i2h11x;
1599 			pass.r2h11y = r2h11y;
1600 			pass.i2h11y = i2h11y;
1601 			pass.r2h11z = r2h11z;
1602 			pass.i2h11z = i2h11z;
1603 			pass.h2f1f2x = r2h1m2x;
1604 			pass.ih2f1f2x = i2h1m2x;
1605 			pass.h2f1f2y = r2h1m2y;
1606 			pass.ih2f1f2y = i2h1m2y;
1607 			pass.h2f1f2z = r2h1m2z;
1608 			pass.ih2f1f2z = i2h1m2z;
1609 			temp = DFn2F12(&pass);
1610 
1611 			itemp = DFi2F12(&pass);
1612 		    }
1613 
1614 		    *(ckt->CKTrhs + here->BJTbaseNode) -= temp;
1615 		    *(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
1616 		    *(ckt->CKTrhs + here->BJTbasePrimeNode) += temp;
1617 		    *(ckt->CKTirhs + here->BJTbasePrimeNode) += itemp;
1618 
1619 		}
1620 		/* ibb term over */
1621 		/* loading qbe term */
1622 		/* x = vbe, y = vbc, z not used */
1623 		/* (have to multiply by j omega for charge storage
1624 		 * elements to get the current)
1625 		 */
1626 
1627 		{
1628 		    pass.cxx = here->qbe_x2;
1629 		    pass.cyy = here->qbe_y2;
1630 		    pass.czz = 0.0;
1631 		    pass.cxy = here->qbe_xy;
1632 		    pass.cyz = 0.0;
1633 		    pass.cxz = 0.0;
1634 		    pass.cxxx = here->qbe_x3;
1635 		    pass.cyyy = here->qbe_y3;
1636 		    pass.czzz = 0.0;
1637 		    pass.cxxy = here->qbe_x2y;
1638 		    pass.cxxz = 0.0;
1639 		    pass.cxyy = here->qbe_xy2;
1640 		    pass.cyyz = 0.0;
1641 		    pass.cxzz = 0.0;
1642 		    pass.cyzz = 0.0;
1643 		    pass.cxyz = 0.0;
1644 		    pass.r1h1x = r1h1x;
1645 		    pass.i1h1x = i1h1x;
1646 		    pass.r1h1y = r1h1y;
1647 		    pass.i1h1y = i1h1y;
1648 		    pass.r1h1z = 0.0;
1649 		    pass.i1h1z = 0.0;
1650 		    pass.r1h2x = r1hm2x;
1651 		    pass.i1h2x = i1hm2x;
1652 		    pass.r1h2y = r1hm2y;
1653 		    pass.i1h2y = i1hm2y;
1654 		    pass.r1h2z = 0.0;
1655 		    pass.i1h2z = 0.0;
1656 		    pass.r2h11x = r2h11x;
1657 		    pass.i2h11x = i2h11x;
1658 		    pass.r2h11y = r2h11y;
1659 		    pass.i2h11y = i2h11y;
1660 		    pass.r2h11z = 0.0;
1661 		    pass.i2h11z = 0.0;
1662 		    pass.h2f1f2x = r2h1m2x;
1663 		    pass.ih2f1f2x = i2h1m2x;
1664 		    pass.h2f1f2y = r2h1m2y;
1665 		    pass.ih2f1f2y = i2h1m2y;
1666 		    pass.h2f1f2z = 0.0;
1667 		    pass.ih2f1f2z = 0.0;
1668 		    temp = - ckt->CKTomega*
1669 			DFi2F12(&pass);
1670 
1671 		    itemp = ckt->CKTomega*
1672 			DFn2F12(&pass);
1673 		}
1674 
1675 		*(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1676 		*(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1677 		*(ckt->CKTrhs + here->BJTemitPrimeNode) += temp;
1678 		*(ckt->CKTirhs + here->BJTemitPrimeNode) += itemp;
1679 
1680 		/* qbe term over */
1681 		/* loading qbx term */
1682 		/* z = vbx= vb - vcPrime */
1683 
1684 		r1h1z = r1h1z + r1h1y;
1685 		i1h1z = i1h1z + i1h1y;
1686 		r1hm2z = r1hm2z + r1hm2y;
1687 		i1hm2z = i1hm2z + i1hm2y;
1688 		r2h11z = r2h11z + r2h11y;
1689 		i2h11z = i2h11z + i2h11y;
1690 		r2h1m2z = r2h1m2z + r2h1m2y;
1691 		i2h1m2z = i2h1m2z + i2h1m2y;
1692 #ifdef D_DBG_SMALLTIMES
1693 		time = SPfrontEnd->IFseconds();
1694 #endif
1695 		temp = - ckt->CKTomega *
1696 		    D1i2F12(here->capbx2,
1697 			    here->capbx3,
1698 			    r1h1z,
1699 			    i1h1z,
1700 			    r1hm2z,
1701 			    i1hm2z,
1702 			    r2h11z,
1703 			    i2h11z,
1704 			    r2h1m2z,
1705 			    i2h1m2z);
1706 		itemp = ckt->CKTomega *
1707 		    D1n2F12(here->capbx2,
1708 			    here->capbx3,
1709 			    r1h1z,
1710 			    i1h1z,
1711 			    r1hm2z,
1712 			    i1hm2z,
1713 			    r2h11z,
1714 			    i2h11z,
1715 			    r2h1m2z,
1716 			    i2h1m2z);
1717 #ifdef D_DBG_SMALLTIMES
1718 		time = SPfrontEnd->IFseconds() - time;
1719 		printf("Time for D1n2F12: %g seconds \n", time);
1720 #endif
1721 
1722 
1723 		*(ckt->CKTrhs + here->BJTbaseNode) -= temp;
1724 		*(ckt->CKTirhs + here->BJTbaseNode) -= itemp;
1725 		*(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1726 		*(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1727 
1728 		/* qbx term over */
1729 
1730 		/* loading qbc term */
1731 
1732 		temp = - ckt->CKTomega *
1733 		    D1i2F12(here->capbc2,
1734 			    here->capbc3,
1735 			    r1h1y,
1736 			    i1h1y,
1737 			    r1hm2y,
1738 			    i1hm2y,
1739 			    r2h11y,
1740 			    i2h11y,
1741 			    r2h1m2y,
1742 			    i2h1m2y);
1743 		itemp = ckt->CKTomega *
1744 		    D1n2F12(here->capbc2,
1745 			    here->capbc3,
1746 			    r1h1y,
1747 			    i1h1y,
1748 			    r1hm2y,
1749 			    i1hm2y,
1750 			    r2h11y,
1751 			    i2h11y,
1752 			    r2h1m2y,
1753 			    i2h1m2y);
1754 
1755 
1756 
1757 
1758 		*(ckt->CKTrhs + here->BJTbasePrimeNode) -= temp;
1759 		*(ckt->CKTirhs + here->BJTbasePrimeNode) -= itemp;
1760 		*(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1761 		*(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1762 
1763 		/* qbc term over */
1764 
1765 
1766 		/* loading qsc term */
1767 		/* z = vsc */
1768 
1769 
1770 
1771 		r1h1z = *(job->r1H1ptr + (here->BJTsubstNode)) -
1772 		    *(job->r1H1ptr + (here->BJTcolPrimeNode));
1773 		i1h1z = *(job->i1H1ptr + (here->BJTsubstNode)) -
1774 		    *(job->i1H1ptr + (here->BJTcolPrimeNode));
1775 
1776 		r1hm2z = *(job->r1H2ptr + (here->BJTsubstNode)) -
1777 		    *(job->r1H2ptr + (here->BJTcolPrimeNode));
1778 		i1hm2z = -(*(job->i1H2ptr + (here->BJTsubstNode)) -
1779 			   *(job->i1H2ptr + (here->BJTcolPrimeNode)));
1780 
1781 		r2h11z = *(job->r2H11ptr + (here->BJTsubstNode)) -
1782 		    *(job->r2H11ptr + (here->BJTcolPrimeNode));
1783 		i2h11z = *(job->i2H11ptr + (here->BJTsubstNode)) -
1784 		    *(job->i2H11ptr + (here->BJTcolPrimeNode));
1785 
1786 		r2h1m2z = *(job->r2H1m2ptr + (here->BJTsubstNode)) -
1787 		    *(job->r2H1m2ptr + (here->BJTcolPrimeNode));
1788 		i2h1m2z = *(job->i2H1m2ptr + (here->BJTsubstNode)) -
1789 		    *(job->i2H1m2ptr + (here->BJTcolPrimeNode));
1790 
1791 		temp = - ckt->CKTomega *
1792 		    D1i2F12(here->capsc2,
1793 			    here->capsc3,
1794 			    r1h1z,
1795 			    i1h1z,
1796 			    r1hm2z,
1797 			    i1hm2z,
1798 			    r2h11z,
1799 			    i2h11z,
1800 			    r2h1m2z,
1801 			    i2h1m2z);
1802 
1803 		itemp = ckt->CKTomega *
1804 		    D1n2F12(here->capsc2,
1805 			    here->capsc3,
1806 			    r1h1z,
1807 			    i1h1z,
1808 			    r1hm2z,
1809 			    i1hm2z,
1810 			    r2h11z,
1811 			    i2h11z,
1812 			    r2h1m2z,
1813 			    i2h1m2z);
1814 
1815 
1816 		*(ckt->CKTrhs + here->BJTsubstNode) -= temp;
1817 		*(ckt->CKTirhs + here->BJTsubstNode) -= itemp;
1818 		*(ckt->CKTrhs + here->BJTcolPrimeNode) += temp;
1819 		*(ckt->CKTirhs + here->BJTcolPrimeNode) += itemp;
1820 
1821 		/* qsc term over */
1822 
1823 
1824 		break;
1825 		default:
1826 		    ;
1827 		    ;
1828 		}
1829 	    }
1830 	}
1831 	return(OK);
1832     }
1833     else
1834 	return(E_BADPARM);
1835 }
1836