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

📄 integuse.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1991 Regents of the University of California.  All rights reserved.Author:	1987 Kartikeya Mayaram, U. C. Berkeley CAD Group**********/#include <stdio.h>#include <math.h>#include "numglobs.h"#include "numenum.h"#include "nummacs.h"#include "gendev.h"/* function to compute the integrated variables discretization */#define ccap qcap+1doubleintegrate( devStates, info, qcap )double **devStates;TranInfo *info;int qcap;{    double value;    double *coeff = info->intCoeff;    switch ( info->method ) {    case BDF:	switch( info->order ) {	case 1:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap));	    break;	case 2:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap));	    break;	case 3:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap));	    break;	case 4:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap)) +		    coeff[4] * (*(devStates[4]+qcap));	    break;	case 5:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap)) +		    coeff[4] * (*(devStates[4]+qcap)) +		    coeff[5] * (*(devStates[5]+qcap));	    break;	case 6:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap)) +		    coeff[4] * (*(devStates[4]+qcap)) +		    coeff[5] * (*(devStates[5]+qcap)) +		    coeff[6] * (*(devStates[6]+qcap));	    break;	default:	    printf( "\n integration order %d !! STOP \n", info->order );	    exit( 0 );	}	break;    case TRAPEZOIDAL:    default:	switch( info->order ) {	case 1:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap));	    *(devStates[0]+ccap) = value;	    break;	case 2:	    value = coeff[0] * (*(devStates[0]+qcap)) +		    coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[1]+ccap));	    *(devStates[0]+ccap) = value;            break;        default:	    printf( "\n integration order %d !! STOP \n", info->order );	    exit( 0 );	}	break;    }    return( value );}/* function to predict the value of the variables */doublepredict( devStates, info, qcap )double **devStates;TranInfo *info;int qcap;{    double value;    double *coeff = info->predCoeff;    switch ( info->method ) {    case BDF:		switch( info->order ) {	case 1:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap));	    break;	case 2:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[3]+qcap));	    break;	case 3:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[3]+qcap)) +		    coeff[3] * (*(devStates[4]+qcap));	    break;	case 4:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[3]+qcap)) +		    coeff[3] * (*(devStates[4]+qcap)) +		    coeff[4] * (*(devStates[5]+qcap));	    break;	case 5:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[3]+qcap)) +		    coeff[3] * (*(devStates[4]+qcap)) +		    coeff[4] * (*(devStates[5]+qcap)) +		    coeff[5] * (*(devStates[6]+qcap));	    break;	case 6:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[3]+qcap)) +		    coeff[3] * (*(devStates[4]+qcap)) +		    coeff[4] * (*(devStates[5]+qcap)) +		    coeff[5] * (*(devStates[6]+qcap)) +		    coeff[6] * (*(devStates[7]+qcap));	    break;	default:	    printf( "\n prediction order %d !! STOP \n", info->order );	    exit( 0 );	}	break;    case TRAPEZOIDAL:	    default:	switch( info->order ) {	case 1:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap));	    break;	case 2:	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[3]+qcap));	    /*	    value = coeff[0] * (*(devStates[1]+qcap)) +		    coeff[1] * (*(devStates[2]+qcap)) +		    coeff[2] * (*(devStates[1]+ccap));	    */	    break;	default:	    printf( "\n prediction order %d !! STOP \n", info->order );	    exit( 0 );	}	break;    }	    return( value );}doublecomputeLTECoeff( info )TranInfo *info;{    double *delta = info->delta;    double temp, denom, lteCoeff;    switch ( info->method ) {    case BDF:	switch( info->order ) {	    case 1:		denom = delta[ 0 ] + delta[ 1 ];		break;	    case 2:		denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ];		break;	    case 3:		denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] +			delta[ 3 ];		break;	    case 4:		denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] +			delta[ 3 ] + delta[ 4 ];		break;	    case 5:		denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] +			delta[ 3 ] + delta[ 4 ] + delta[ 5 ];		break;	    case 6:		denom = delta[ 0 ] + delta[ 1 ] + delta[ 2 ] +			delta[ 3 ] + delta[ 4 ] + delta[ 5 ] + delta[ 6 ];		break;	    default:		printf( "\n integration order %d !! STOP \n", info->order );		exit( 0 );		break;	}	break;    case TRAPEZOIDAL:    default:	switch( info->order ) {	    case 1:		denom = delta[ 0 ] + delta[ 1 ];		break;	    case 2:		/*		denom = delta[ 0 ] + delta[ 1 ];		*/		temp = delta[ 0 ] + delta [ 1 ];		denom = 2.0 * temp * (temp + delta[ 2 ]) / delta[ 0 ];		break;	    default:		printf( "\n integration order %d !! STOP \n", info->order );		exit( 0 );		break;	}	break;    }    lteCoeff = delta[ 0 ] / denom;    return( lteCoeff );}/* function to integrate a linear DAE */doubleintegrateLin( devStates, info, qcap )double **devStates;TranInfo *info;int qcap;{    double value;    double *coeff = info->intCoeff;    switch ( info->method ) {    case BDF:	switch( info->order ) {	case 1:	    value = coeff[1] * (*(devStates[1]+qcap));	    break;	case 2:	    value = coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap));	    break;	case 3:	    value = coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap));	    break;	case 4:	    value = coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap)) +		    coeff[4] * (*(devStates[4]+qcap));	    break;	case 5:	    value = coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap)) +		    coeff[4] * (*(devStates[4]+qcap)) +		    coeff[5] * (*(devStates[5]+qcap));	    break;	case 6:	    value = coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[2]+qcap)) +		    coeff[3] * (*(devStates[3]+qcap)) +		    coeff[4] * (*(devStates[4]+qcap)) +		    coeff[5] * (*(devStates[5]+qcap)) +		    coeff[6] * (*(devStates[6]+qcap));	    break;	default:	    printf( "\n integration order %d !! STOP \n", info->order );	    exit( 0 );	}	break;    case TRAPEZOIDAL:    default:	switch( info->order ) {	case 1:	    value = coeff[1] * (*(devStates[1]+qcap));	    break;	case 2:	    value = coeff[1] * (*(devStates[1]+qcap)) +		    coeff[2] * (*(devStates[1]+ccap));            break;        default:	    printf( "\n integration order %d !! STOP \n", info->order );	    exit( 0 );	}	break;    }    return( value );}

⌨️ 快捷键说明

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