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

📄 indsupd.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********//* update the  charge sensitivities and their derivatives */#include "spice.h"#include <stdio.h>#include "util.h"#include "smpdefs.h"#include "cktdefs.h"#include "inddefs.h"#include "sperror.h"#include "suffix.h"intINDsUpdate(inModel,ckt)    GENmodel *inModel;    register CKTcircuit *ckt;{    register INDmodel *model = (INDmodel*)inModel;    register INDinstance *here;    double   cind;     double sxp;    double  s1;    double  s2;    double  s;    int iparmno;    double  dummy1;    double  dummy2;    SENstruct *info;#ifdef MUTUAL    register MUTinstance *muthere;    register MUTmodel *mutmodel;    double sxp1;    double sxp2;    double   cind1,cind2;    double   rootl1,rootl2;    int ktype;    int itype;#endif    info = ckt->CKTsenInfo;    if(ckt->CKTmode & MODEINITTRAN) return(OK);    /*  loop through all the inductor models */    for( ; model != NULL; model = model->INDnextModel ) {        /* loop through all the instances of the model */        for (here = model->INDinstances; here != NULL ;                here=here->INDnextInstance) {	    if (here->INDowner != ARCHme) continue;            for(iparmno = 1;iparmno<=info->SENparms;iparmno++){                cind = *(ckt->CKTrhsOld + here->INDbrEq);                s = *(info->SEN_Sap[here->INDbrEq] + iparmno);                sxp = here->INDinduct * s;#ifdef SENSDEBUG                printf("iparmno = %d,s=%.5e,cind = %.5e\n",iparmno,s,cind);                printf("sxp(before mut) = %.5e\n",sxp);#endif /* SENSDEBUG */                if(iparmno == here->INDsenParmNo) sxp += cind;                *(ckt->CKTstate0 + here->INDsensxp + 2 * (iparmno - 1)) = sxp;            }#ifdef MUTUAL        }    }    ktype = CKTtypelook("mutual");    mutmodel = (MUTmodel *)(ckt->CKThead[ktype]);    /*  loop through all the mutual inductor models */    for( ; mutmodel != NULL; mutmodel = mutmodel->MUTnextModel ) {        /* loop through all the instances of the model */        for (muthere = mutmodel->MUTinstances; muthere != NULL ;                muthere=muthere->MUTnextInstance) {            cind1 = *(ckt->CKTrhsOld + muthere->MUTind1->INDbrEq);            cind2 = *(ckt->CKTrhsOld + muthere->MUTind2->INDbrEq);            rootl1 = sqrt( muthere->MUTind1->INDinduct );            rootl2 = sqrt( muthere->MUTind2->INDinduct );            for(iparmno = 1;iparmno<=info->SENparms;iparmno++){                s1 = *(info->SEN_Sap[muthere->MUTind1->INDbrEq] + iparmno);                s2 = *(info->SEN_Sap[muthere->MUTind2->INDbrEq] + iparmno);                sxp2 = muthere->MUTcoupling*rootl1*rootl2 * s1;                sxp1 = muthere->MUTcoupling*rootl1*rootl2 * s2;                if(iparmno == muthere->MUTsenParmNo){                    sxp1 += cind2 * rootl1 * rootl2;                    sxp2 += cind1 * rootl1 * rootl2;                }                if(iparmno == muthere->MUTind1->INDsenParmNo){                    sxp1 += cind2 * muthere->MUTcoupling * rootl2 /(2 * rootl1);                    sxp2 += cind1 * muthere->MUTcoupling * rootl2 /(2 * rootl1);                }                if(iparmno == muthere->MUTind2->INDsenParmNo){                    sxp1 += cind2 * muthere->MUTcoupling * rootl1 /(2 * rootl2);                    sxp2 += cind1 * muthere->MUTcoupling * rootl1 /(2 * rootl2);                }                *(ckt->CKTstate0 + muthere->MUTind1->INDsensxp + 2 *                         (iparmno - 1)) += sxp1;                *(ckt->CKTstate0 + muthere->MUTind2->INDsensxp + 2 *                         (iparmno - 1)) += sxp2;#ifdef SENSDEBUG                printf("iparmno = %d\n",iparmno);                printf("sxp1 = %.5e,sxp2 = %.5e\n",sxp1,sxp2);#endif /* SENSDEBUG */            }        }    }    itype = CKTtypelook("Inductor");    model = (INDmodel *)(ckt->CKThead[itype]);    /*  loop through all the inductor models */    for( ; model != NULL; model = model->INDnextModel ) {        /* loop through all the instances of the model */        for (here = model->INDinstances; here != NULL ;                here=here->INDnextInstance) {#endif /* MUTUAL */                for(iparmno = 1;iparmno<=info->SENparms;iparmno++){                if(ckt->CKTmode&MODETRANOP){                    *(ckt->CKTstate0 + here->INDsensxp + 2 *                             (iparmno - 1) + 1) = 0;                } else{                    NIintegrate(ckt,&dummy1,&dummy2,here->INDinduct,                            (here->INDsensxp + 2*(iparmno - 1)));                }#ifdef SENSDEBUG                printf("sxp = %.5e,sdotxp = %.5e\n",                        *(ckt->CKTstate0 + here->INDsensxp + 2 *                         (iparmno - 1)),                        *(ckt->CKTstate0 + here->INDsensxp + 2 *                        (iparmno - 1) + 1));#endif /* SENSDEBUG */            }        }    }    return(OK);}

⌨️ 快捷键说明

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