1 /*************************************************************************** 2 JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992 3 Author: 1992 Stephen R. Whiteley 4 ****************************************************************************/ 5 6 #include "spice.h" 7 #include <stdio.h> 8 #include "jjdefs.h" 9 #include "sperror.h" 10 #include "util.h" 11 12 int JJaccept(ckt,inModel)13JJaccept(ckt,inModel) 14 15 CKTcircuit *ckt; 16 GENmodel *inModel; 17 { 18 JJmodel *model = (JJmodel *)inModel; 19 JJinstance *here; 20 double phi,ag0; 21 double vj,vmax = 0; 22 int pint; 23 24 ag0 = ckt->CKTag[0]; 25 26 for ( ; model != NULL; model = model->JJnextModel) { 27 28 if (model->JJictype != 0 && vmax < model->JJvdpbak) 29 vmax = model->JJvdpbak; 30 31 for (here = model->JJinstances; here != NULL; 32 here = here->JJnextInstance) { 33 34 vj = *(ckt->CKTstate0 + here->JJvoltage); 35 36 /* update */ 37 *(ckt->CKTstate0 + here->JJdvdt) = here->JJdelVdelT + ag0*vj; 38 39 /* keep phase > -2*PI and < 2*PI */ 40 phi = *(ckt->CKTstate0 + here->JJphase); 41 pint = *(int *)(ckt->CKTstate1 + here->JJphsInt); 42 if (phi > 2*M_PI) { 43 phi -= 2*M_PI; 44 pint++; 45 } 46 else if (phi < -2*M_PI) { 47 phi += 2*M_PI; 48 pint--; 49 } 50 *(ckt->CKTstate0 + here->JJphase) = phi; 51 *(int *)(ckt->CKTstate0 + here->JJphsInt) = pint; 52 53 /* find max vj for time step */ 54 if (model->JJictype != 0 && here->JJcriti > 0) { 55 if (vj < 0) 56 vj = -vj; 57 if (vmax < vj) vmax = vj; 58 } 59 60 if (here->JJphsNode) 61 *(ckt->CKTrhsOld + here->JJphsNode) = phi + (2*M_PI)*pint; 62 } 63 } 64 /* set next time step */ 65 if (ckt->CKTjjPresent) /* not set if jj's have cct=0 */ 66 ckt->CKTdelta = JJdphi/vmax; 67 return (OK); 68 } 69