📄 txlload.c
字号:
q = pool_vi_txl; pool_vi_txl = pool_vi_txl->pool; return(q); } else return((VI_list_txl *) tmalloc (sizeof (VI_list_txl)));}static void free_vi_txl(VI_list_txl *q){ q->pool = pool_vi_txl; pool_vi_txl = q;}static int add_new_vi_txl(TXLinstance *here, CKTcircuit *ckt, int time){ VI_list_txl *vi; TXLine *tx, *tx2; tx = here->txline; tx2 = here->txline2; vi = new_vi_txl(); vi->time = time; tx->vi_tail->next = vi; tx2->vi_tail->next = vi; vi->next = NULL; tx->vi_tail = vi; tx2->vi_tail = vi; vi->v_i = *(ckt->CKTrhsOld + here->TXLposNode); vi->v_o = *(ckt->CKTrhsOld + here->TXLnegNode); vi->i_i = *(ckt->CKTrhsOld + here->TXLibr1); vi->i_o = *(ckt->CKTrhsOld + here->TXLibr2); return(1);}static int get_pvs_vi_txl(int t1, int t2, TXLine *tx, double *v1_i, double *v2_i, double *i1_i, double *i2_i, double *v1_o, double *v2_o, double *i1_o, double *i2_o){ double ta, tb; VI_list_txl *vi, *vi1; double f; int ext = 0; ta = t1 - tx->taul; tb = t2 - tx->taul; if (tb <= 0) { *v1_i = *v2_i = tx->dc1; *v2_o = *v1_o = tx->dc2; *i1_i = *i2_i = *i1_o = *i2_o = 0; return(ext); } if (ta <= 0) { *i1_i = *i1_o = 0.0; *v1_i = tx->dc1; *v1_o = tx->dc2; vi1 = tx->vi_head; vi = vi1->next; } else { vi1 = tx->vi_head; for (vi = vi1->next; vi->time < ta; vi = vi->next) { /* free_vi_txl(vi1); */ vi1 = vi; } f = (ta - vi1->time) / (vi->time - vi1->time); *v1_i = vi1->v_i + f * (vi->v_i - vi1->v_i); *v1_o = vi1->v_o + f * (vi->v_o - vi1->v_o); *i1_i = vi1->i_i + f * (vi->i_i - vi1->i_i); *i1_o = vi1->i_o + f * (vi->i_o - vi1->i_o); tx->vi_head = vi1; } if (tb > t1) { /* fprintf(stderr, "pvs: time = %d\n", t2); */ ext = 1; /* f = tb - t1; *v2_i = tx->in_node->V + tx->in_node->dv * f; *v2_o = tx->out_node->V + tx->out_node->dv * f; if (vi) { for (; vi->time != t1; vi = vi->next) vi1 = vi; f /= (double) (t1 - vi1->time); *i2_i = vi->i_i + f * (vi->i_i - vi1->i_i); *i2_o = vi->i_o + f * (vi->i_o - vi1->i_o); } else { *i2_i = vi1->i_i; *i2_o = vi1->i_o; } */ ratio[0] = f = (tb - t1) / (t2 - t1); if (vi) for (; vi->time != t1; vi = vi->next); else vi = vi1; f = 1 - f; *v2_i = vi->v_i * f; *v2_o = vi->v_o * f; *i2_i = vi->i_i * f; *i2_o = vi->i_o * f; } else { for (; vi->time < tb; vi = vi->next) vi1 = vi; f = (tb - vi1->time) / (vi->time - vi1->time); *v2_i = vi1->v_i + f * (vi->v_i - vi1->v_i); *v2_o = vi1->v_o + f * (vi->v_o - vi1->v_o); *i2_i = vi1->i_i + f * (vi->i_i - vi1->i_i); *i2_o = vi1->i_o + f * (vi->i_o - vi1->i_o); } return(ext);}static intright_consts_txl(TXLine *tx, int t, int time, double h, double h1, int l1, int l2, CKTcircuit *ckt)/*** h1 = 0.5 * h ***/{ int i; double ff=0.0, gg=0.0, e; double v1_i, v2_i, i1_i, i2_i; double v1_o, v2_o, i1_o, i2_o; int ext; if (! tx->lsl) { double ff1=0.0; for (i = 0; i < 3; i++) { tx->h1e[i] = e = exp((double) tx->h1_term[i].x * h); ff1 -= tx->h1_term[i].c * e; ff -= tx->h1_term[i].cnv_i * e; gg -= tx->h1_term[i].cnv_o * e; } ff += ff1 * h1 * tx->in_node->V; gg += ff1 * h1 * tx->out_node->V; } ext = get_pvs_vi_txl(t, time, tx, &v1_i, &v2_i, &i1_i, &i2_i, &v1_o, &v2_o, &i1_o, &i2_o); if (tx->lsl) { ff = tx->h3_aten * v2_o + tx->h2_aten * i2_o; gg = tx->h3_aten * v2_i + tx->h2_aten * i2_i; } else { if (tx->ifImg) { double a, b, er, ei, a1, b1, a2, b2; for (i = 0; i < 4; i++) { TERM *tm; tm = &(tx->h3_term[i]); e = exp((double) tm->x * h); tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (v1_i * e + v2_i); tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (v1_o * e + v2_o); } expC(tx->h3_term[4].x, tx->h3_term[5].x, h, &er, &ei); a2 = h1 * tx->h3_term[4].c; b2 = h1 * tx->h3_term[5].c; a = tx->h3_term[4].cnv_i; b = tx->h3_term[5].cnv_i; multC(a, b, er, ei, &a, &b); multC(a2, b2, v1_i * er + v2_i, v1_i * ei, &a1, &b1); tx->h3_term[4].cnv_i = a + a1; tx->h3_term[5].cnv_i = b + b1; a = tx->h3_term[4].cnv_o; b = tx->h3_term[5].cnv_o; multC(a, b, er, ei, &a, &b); multC(a2, b2, v1_o * er + v2_o, v1_o * ei, &a1, &b1); tx->h3_term[4].cnv_o = a + a1; tx->h3_term[5].cnv_o = b + b1; ff += tx->h3_aten * v2_o; gg += tx->h3_aten * v2_i; for (i = 0; i < 5; i++) { ff += tx->h3_term[i].cnv_o; gg += tx->h3_term[i].cnv_i; } ff += tx->h3_term[4].cnv_o; gg += tx->h3_term[4].cnv_i; { TERM *tm; tm = &(tx->h2_term[0]); e = exp((double) tm->x * h); tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (i1_i * e + i2_i); tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (i1_o * e + i2_o); } expC(tx->h2_term[1].x, tx->h2_term[2].x, h, &er, &ei); a2 = h1 * tx->h2_term[1].c; b2 = h1 * tx->h2_term[2].c; a = tx->h2_term[1].cnv_i; b = tx->h2_term[2].cnv_i; multC(a, b, er, ei, &a, &b); multC(a2, b2, i1_i * er + i2_i, i1_i * ei, &a1, &b1); tx->h2_term[1].cnv_i = a + a1; tx->h2_term[2].cnv_i = b + b1; a = tx->h2_term[1].cnv_o; b = tx->h2_term[2].cnv_o; multC(a, b, er, ei, &a, &b); multC(a2, b2, i1_o * er + i2_o, i1_o * ei, &a1, &b1); tx->h2_term[1].cnv_o = a + a1; tx->h2_term[2].cnv_o = b + b1; ff += tx->h2_aten * i2_o + tx->h2_term[0].cnv_o + 2.0 * tx->h2_term[1].cnv_o; gg += tx->h2_aten * i2_i + tx->h2_term[0].cnv_i + 2.0 * tx->h2_term[1].cnv_i; } else { for (i = 0; i < 6; i++) { TERM *tm; tm = &(tx->h3_term[i]); e = exp((double) tm->x * h); tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (v1_i * e + v2_i); tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (v1_o * e + v2_o); } ff += tx->h3_aten * v2_o; gg += tx->h3_aten * v2_i; for (i = 0; i < 6; i++) { ff += tx->h3_term[i].cnv_o; gg += tx->h3_term[i].cnv_i; } for (i = 0; i < 3; i++) { TERM *tm; tm = &(tx->h2_term[i]); e = exp((double) tm->x * h); tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (i1_i * e + i2_i); tm->cnv_o = tm->cnv_o * e + h1 * tm->c * (i1_o * e + i2_o); } ff += tx->h2_aten * i2_o; gg += tx->h2_aten * i2_i; for (i = 0; i < 3; i++) { ff += tx->h2_term[i].cnv_o; gg += tx->h2_term[i].cnv_i; } } } *(ckt->CKTrhs + l1) = ff; *(ckt->CKTrhs + l2) = gg; return(ext);}static int update_delayed_cnv_txl(TXLine *tx, float h){ float ratio; double f; VI_list_txl *vi; TERM *tms; h *= 0.5e-12; ratio = tx->ratio; vi = tx->vi_tail; if (ratio > 0.0) { tms = tx->h3_term; f = h * ratio * vi->v_i; tms[0].cnv_i += f * tms[0].c; tms[1].cnv_i += f * tms[1].c; tms[2].cnv_i += f * tms[2].c; tms[3].cnv_i += f * tms[3].c; tms[4].cnv_i += f * tms[4].c; tms[5].cnv_i += f * tms[5].c; f = h * ratio * vi->v_o; tms[0].cnv_o += f * tms[0].c; tms[1].cnv_o += f * tms[1].c; tms[2].cnv_o += f * tms[2].c; tms[3].cnv_o += f * tms[3].c; tms[4].cnv_o += f * tms[4].c; tms[5].cnv_o += f * tms[5].c; tms = tx->h2_term; f = h * ratio * vi->i_i; tms[0].cnv_i += f * tms[0].c; tms[1].cnv_i += f * tms[1].c; tms[2].cnv_i += f * tms[2].c; f = h * ratio * vi->i_o; tms[0].cnv_o += f * tms[0].c; tms[1].cnv_o += f * tms[1].c; tms[2].cnv_o += f * tms[2].c; } return(1);}static int expC(double ar, double ai, float h, double *cr, double *ci){ double e, cs, si; e = exp((double) ar * h); cs = cos((double) ai * h); si = sin((double) ai * h); *cr = e * cs; *ci = e * si; return(1);}static int multC(double ar, double ai, double br, double bi, double *cr, double *ci){ register double tp; tp = ar*br - ai*bi; *ci = ar*bi + ai*br; *cr = tp; return (1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -