⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traload.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********//* */#include "spice.h"#include <stdio.h>#include "util.h"#include "cktdefs.h"#include "tradefs.h"#include "trandefs.h"#include "sperror.h"#include "suffix.h"/*ARGSUSED*/intTRAload(inModel,ckt)    GENmodel *inModel;    CKTcircuit *ckt;        /* actually load the current values into the          * sparse matrix previously provided          */{    register TRAmodel *model = (TRAmodel *)inModel;    register TRAinstance *here;    double t1,t2,t3;    double f1,f2,f3;    register int i;    /*  loop through all the transmission line models */    for( ; model != NULL; model = model->TRAnextModel ) {        /* loop through all the instances of the model */        for (here = model->TRAinstances; here != NULL ;                here=here->TRAnextInstance) {	    if (here->TRAowner != ARCHme) continue;                        *(here->TRApos1Pos1Ptr) += here->TRAconduct;            *(here->TRApos1Int1Ptr) -= here->TRAconduct;            *(here->TRAneg1Ibr1Ptr) -= 1;            *(here->TRApos2Pos2Ptr) += here->TRAconduct;            *(here->TRAneg2Ibr2Ptr) -= 1;            *(here->TRAint1Pos1Ptr) -= here->TRAconduct;            *(here->TRAint1Int1Ptr) += here->TRAconduct;            *(here->TRAint1Ibr1Ptr) += 1;            *(here->TRAint2Int2Ptr) += here->TRAconduct;            *(here->TRAint2Ibr2Ptr) += 1;            *(here->TRAibr1Neg1Ptr) -= 1;            *(here->TRAibr1Int1Ptr) += 1;            *(here->TRAibr2Neg2Ptr) -= 1;            *(here->TRAibr2Int2Ptr) += 1;            *(here->TRApos2Int2Ptr) -= here->TRAconduct;            *(here->TRAint2Pos2Ptr) -= here->TRAconduct;            if(ckt->CKTmode & MODEDC) {                *(here->TRAibr1Pos2Ptr) -= 1;                *(here->TRAibr1Neg2Ptr) += 1;                *(here->TRAibr1Ibr2Ptr) -= (1-ckt->CKTgmin)*here->TRAimped;                *(here->TRAibr2Pos1Ptr) -= 1;                *(here->TRAibr2Neg1Ptr) += 1;                *(here->TRAibr2Ibr1Ptr) -= (1-ckt->CKTgmin)*here->TRAimped;            } else {                if (ckt->CKTmode & MODEINITTRAN) {                    if(ckt->CKTmode & MODEUIC) {                        here->TRAinput1 = here->TRAinitVolt2 + here->TRAinitCur2                            * here->TRAimped;                        here->TRAinput2 = here->TRAinitVolt1 + here->TRAinitCur1                            * here->TRAimped;                    } else {                        here->TRAinput1 =                             ( *(ckt->CKTrhsOld+here->TRAposNode2)                            - *(ckt->CKTrhsOld+here->TRAnegNode2) )                            + ( *(ckt->CKTrhsOld+here->TRAbrEq2)                                 *here->TRAimped);                        here->TRAinput2 =                             ( *(ckt->CKTrhsOld+here->TRAposNode1)                            - *(ckt->CKTrhsOld+here->TRAnegNode1) )                            + ( *(ckt->CKTrhsOld+here->TRAbrEq1)                                 *here->TRAimped);                    }                    *(here->TRAdelays  ) = -2*here->TRAtd;                    *(here->TRAdelays+3) = -here->TRAtd;                    *(here->TRAdelays+6) = 0;                    *(here->TRAdelays+1) = *(here->TRAdelays +4) =                             *(here->TRAdelays+7) = here->TRAinput1;                    *(here->TRAdelays+2) = *(here->TRAdelays +5) =                             *(here->TRAdelays+8) = here->TRAinput2;                    here->TRAsizeDelay = 2;                } else {                    if(ckt->CKTmode & MODEINITPRED) {                        for(i=2;(i<here->TRAsizeDelay) &&                             (*(here->TRAdelays +3*i) <=                            (ckt->CKTtime-here->TRAtd));i++) {;/*loop does it*/}                        t1 = *(here->TRAdelays + (3*(i-2)));                        t2 = *(here->TRAdelays + (3*(i-1)));                        t3 = *(here->TRAdelays + (3*(i  )));                        if( (t2-t1)==0  || (t3-t2) == 0) continue;                        f1 = (ckt->CKTtime - here->TRAtd - t2) *                              (ckt->CKTtime - here->TRAtd - t3) ;                        f2 = (ckt->CKTtime - here->TRAtd - t1) *                             (ckt->CKTtime - here->TRAtd - t3) ;                        f3 = (ckt->CKTtime - here->TRAtd - t1) *                             (ckt->CKTtime - here->TRAtd - t2) ;                        if((t2-t1)==0) { /* should never happen, but don't want                                          * to divide by zero, EVER... */                            f1=0;                            f2=0;                        } else {                            f1 /= (t1-t2);                            f2 /= (t2-t1);                        }                        if((t3-t2)==0) { /* should never happen, but don't want                                          * to divide by zero, EVER... */                            f2=0;                            f3=0;                        } else {                            f2 /= (t2-t3);                            f3 /= (t2-t3);                        }                        if((t3-t1)==0) { /* should never happen, but don't want                                          * to divide by zero, EVER... */                            f1=0;                            f2=0;                        } else {                            f1 /= (t1-t3);                            f3 /= (t1-t3);                        }                        /*printf("at time %g, using %g, %g, %g\n",ckt->CKTtime,                                t1,t2,t3);                        printf("values %g, %g, %g \n",                            *(here->TRAdelays + (3*(i-2))+1),                            *(here->TRAdelays + (3*(i-1))+1),                            *(here->TRAdelays + (3*(i  ))+1) );                        printf("and    %g, %g, %g \n",                            *(here->TRAdelays + (3*(i-2))+2),                            *(here->TRAdelays + (3*(i-1))+2),                            *(here->TRAdelays + (3*(i  ))+2) );*/                        here->TRAinput1 = f1 * *(here->TRAdelays + (3*(i-2))+1)                                        + f2 * *(here->TRAdelays + (3*(i-1))+1)                                        + f3 * *(here->TRAdelays + (3*(i  ))+1);                        here->TRAinput2 = f1 * *(here->TRAdelays + (3*(i-2))+2)                                        + f2 * *(here->TRAdelays + (3*(i-1))+2)                                        + f3 * *(here->TRAdelays + (3*(i  ))+2);                    }                }            *(ckt->CKTrhs + here->TRAbrEq1) += here->TRAinput1;            *(ckt->CKTrhs + here->TRAbrEq2) += here->TRAinput2;            }        }    }    return(OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -