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

📄 indsload.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********//* actually load the current ac sensitivity  * information into the  array previously provided  */#include "spice.h"#include <stdio.h>#include "util.h"#include "smpdefs.h"#include "cktdefs.h"#include "inddefs.h"#include "sperror.h"#include "suffix.h"intINDsLoad(inModel,ckt)    GENmodel *inModel;    register CKTcircuit *ckt;{    register INDmodel *model = (INDmodel*)inModel;    register  INDinstance *here;    int       iparmno;    double    cind;    double    Osxp;    double    tag0;    double    tag1;    SENstruct *info;#ifdef MUTUAL    register MUTinstance *muthere;    register MUTmodel *mutmodel;    double   cind1;    double   cind2;    double   rootl1;    double   rootl2;    int ktype;    int itype;    int IND1_brEq;    int IND2_brEq;#endif    info = ckt->CKTsenInfo;    if((info->SENmode == DCSEN)||(ckt->CKTmode&MODETRANOP)) return( OK );    if((info->SENmode == TRANSEN) && (ckt->CKTmode & MODEINITTRAN))  return(OK);#ifdef SENSDEBUG    fprintf(file,"INDsenLoad\n");    fprintf(file,"time = %.5e\n",ckt->CKTtime);#endif /* SENSDEBUG */    tag0 = ckt->CKTag[0];    tag1 = ckt->CKTag[1];    if(ckt->CKTorder == 1){        tag1 = 0;    }    /*  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;#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) {	    if (muthere->MUTowner != ARCHme) continue;            if(muthere->MUTsenParmNo ||                muthere->MUTind1->INDsenParmNo ||                muthere->MUTind2->INDsenParmNo){                IND1_brEq = muthere->MUTind1->INDbrEq;                IND2_brEq = muthere->MUTind2->INDbrEq;                cind1 = *(ckt->CKTrhsOld + IND1_brEq);                cind2 = *(ckt->CKTrhsOld + IND2_brEq);                rootl1 = sqrt( muthere->MUTind1->INDinduct );                rootl2 = sqrt( muthere->MUTind2->INDinduct );                if(muthere->MUTsenParmNo){                    *(info->SEN_RHS[IND1_brEq] + muthere->MUTsenParmNo)                         += tag0*cind2*rootl2*rootl1;                    *(info->SEN_RHS[IND2_brEq] + muthere->MUTsenParmNo)                         += tag0*cind1*rootl2*rootl1;                }                if(muthere->MUTind1->INDsenParmNo){                    *(info->SEN_RHS[IND1_brEq] + muthere->MUTind1->INDsenParmNo)                        += tag0*cind2*muthere->MUTcoupling*rootl2 / (2*rootl1);                    *(info->SEN_RHS[IND2_brEq] + muthere->MUTind1->INDsenParmNo)                        += tag0*cind1*muthere->MUTcoupling*rootl2 / (2*rootl1);                }                if(muthere->MUTind2->INDsenParmNo){                    *(info->SEN_RHS[IND1_brEq] + muthere->MUTind2->INDsenParmNo)                        += tag0*cind2*muthere->MUTcoupling*rootl1 / (2*rootl2);                    *(info->SEN_RHS[IND2_brEq] + muthere->MUTind2->INDsenParmNo)                        += tag0*cind1*muthere->MUTcoupling*rootl1 / (2*rootl2);                 }            }#ifdef  SENSDEBUG             fprintf(file,"cind1 = %.5e,cind2 = %.5e\n",cind1,cind2);#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) {	    if (here->INDowner != ARCHme) continue;#endif /* MUTUAL */            cind = *(ckt->CKTrhsOld + here->INDbrEq);#ifdef SENSDEBUG            fprintf(file,"\n cind=%.5e\n",cind);            fprintf(file,"\n tag0=%.5e,tag1=%.5e\n",tag0,tag1);#endif /* SENSDEBUG */            for(iparmno = 1;iparmno<=info->SENparms;iparmno++){                Osxp = tag0 * *(ckt->CKTstate1 + here->INDsensxp                        + 2*(iparmno - 1))                    + tag1 * *(ckt->CKTstate1 + here->INDsensxp                        + 2*(iparmno - 1) + 1);                if(iparmno == here->INDsenParmNo) Osxp = Osxp - tag0 * cind;#ifdef SENSDEBUG                fprintf(file,"\n Osxp=%.5e\n",Osxp);#endif /* SENSDEBUG */                *(info->SEN_RHS[here->INDbrEq] + iparmno) -= Osxp;            }        }    }    return(OK);}

⌨️ 快捷键说明

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