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

📄 cktsncom.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********//* *//* CKTsenComp(ckt) * this is a program to solve the sensitivity equation  * of the given circuit  */#include "spice.h"#include <stdio.h>#include "smpdefs.h"#include "cktdefs.h"#include "devdefs.h"#include "sperror.h"#include "trandefs.h"#include "suffix.h"intCKTsenComp(ckt)register CKTcircuit *ckt;{    register int size;    int row;    int col;    SENstruct *info;#ifdef SENSDEBUG    char *rowe;    SMPelement *elt;#endif /* SENSDEBUG */#ifdef SENSDEBUG    printf("CKTsenComp\n");#endif /* SENSDEBUG */    size = SMPmatSize(ckt->CKTmatrix);    info = ckt->CKTsenInfo;    if((info->SENmode == DCSEN)||        (info->SENmode == TRANSEN))    {        /*  loop throgh all the columns of RHS            matrix - each column corresponding to a design            parameter */        for (col=1;col<=info->SENparms;col++) {            for(row=1;row<=size;row++){                *(ckt->CKTsenRhs + row ) = *(info->SEN_RHS[row] + col);            }            /* solve for the sensitivity values */            SMPsolve(ckt->CKTmatrix,ckt->CKTsenRhs,ckt->CKTrhsSpare);             /* store the sensitivity values */            for(row=1;row<=size;row++){                *(info->SEN_Sap[row] + col) = *(ckt->CKTsenRhs+row);                *(info->SEN_RHS[row] + col) = *(ckt->CKTsenRhs+row);            }        }#ifdef SENSDEBUG        printf("\n");        printf("Sensitivity matrix :\n");        for(row=1;row<=size;row++){            rowe=CKTnodName(ckt,row) ;            if(strcmp("4",rowe)==0){                for (col=1;col<=info->SENparms;col++) {                    printf("\t");                    printf("Sap(%s,%d) = %.5e\t",rowe,col,                            *(info->SEN_Sap[row] + col));                }                printf("\n\n");            }        }        printf("  RHS matrix   :\n");        for(row=1;row<=size;row++){            for (col=1;col<=info->SENparms;col++) {                printf("  ");                printf("RHS(%d,%d) = %.7e ",row,col,                        *(info->SEN_RHS[row] + col));            }            printf("\n");        }        printf("      Jacobian  matrix :\n");        for(row=1; row<=size; row++){            for(col=1; col<=size; col++){                if(elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)){                    printf("%.7e ",elt->SMPvalue);                }                else{                    printf("0.0000000e+00 ");                }            }            printf("\n");        }#endif     }    if(info->SENmode == ACSEN){        /*  loop throgh all the columns of RHS            matrix - each column corresponding to a design            parameter */        for (col=1;col<=info->SENparms;col++) {            for(row=1;row<=size;row++){                *(ckt->CKTsenRhs+row) = *(info->SEN_RHS[row] + col);                *(ckt->CKTseniRhs+row) = *(info->SEN_iRHS[row] + col);            }            /* solve for the sensitivity values ( both real and imag parts)*/            SMPcSolve(ckt->CKTmatrix,ckt->CKTsenRhs,ckt->CKTseniRhs,                    ckt->CKTrhsSpare,ckt->CKTirhsSpare);            /* store the sensitivity values ( both real and imag parts)*/            for(row=1;row<=size;row++){                *(info->SEN_RHS[row] + col) = *(ckt->CKTsenRhs+row);                *(info->SEN_iRHS[row] + col) = *(ckt->CKTseniRhs+row);            }           }#ifdef SENSDEBUG        printf("\n");        printf("CKTomega = %.7e rad/sec\t\n",ckt->CKTomega);        printf("Sensitivity matrix :\n");        for(row=1;row<=size;row++){            rowe=CKTnodName(ckt,row);            for (col=1;col<=info->SENparms;col++) {                printf("\t");                printf("RHS(%s,%d) = %.5e",rowe,col,                        *(info->SEN_RHS[row] + col));                printf(" + j %.5e\t",*(info->SEN_iRHS[row] + col));                printf("\n\n");            }            printf("\n");        }        printf("CKTomega = %.7e rad/sec\t\n",ckt->CKTomega);        printf("  RHS matrix   :\n");        for(row=1;row<=size;row++){            for (col=1;col<=info->SENparms;col++) {                printf("  ");                printf("RHS(%d,%d) = %.7e ",row,col,                        *(info->SEN_RHS[row] + col));                printf("+j %.7e ",*(info->SEN_iRHS[row] + col));            }            printf("\n");        }        printf("      Jacobian  matrix for AC :\n");        for(row=1; row<=size; row++){            for(col=1; col<=size; col++){                if(elt = SMPfindElt(ckt->CKTmatrix, row , col , 0)){                    printf("%.7e ",elt->SMPvalue);                    printf("+j%.7e\t",elt->SMPiValue);                }                else{                    printf("0.0000000e+00 ");                    printf("+j0.0000000e+00\t");                }            }            printf("\n\n");        }#endif    }    return(OK);}

⌨️ 快捷键说明

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