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

📄 ltraacld.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rightsreserved.Author: 1990 Jaijeet S. Roychowdhury**********/#include "spice.h"#include <stdio.h>#include "util.h"#include "cktdefs.h"#include "ltradefs.h"#include "trandefs.h"#include "sperror.h"#include "suffix.h"intLTRAacLoad(inModel, ckt)  GENmodel *inModel;  CKTcircuit *ckt;/* * load the appropriate values for the current timepoint into the sparse * matrix and the right-hand-side vector */{  register LTRAmodel *model = (LTRAmodel *) inModel;  register LTRAinstance *here;  double y0_r, y0_i, lambda_r, lambda_i, mag, theta;  double exparg_r, exparg_i, explambda_r, explambda_i;  double y0exp_r, y0exp_i;  int savemode, error;  /*   * LTRAacLoad - loads for LTRA lines for the s.s. ac case the equations are   * the following:   *    * Y_0(s) * V_1(s) - I_1(s) = exp(-lambda(s)*length) * (Y_0(s) * V_2(s) +   * I_2(s)) Y_0(s) * V_2(s) - I_2(s) = exp(-lambda(s)*length) * (Y_0(s) *   * V_1(s) + I_1(s))   *    * where Y_0(s) and lambda(s) are as follows:   *    * Y_0(s) = sqrt( (sC+G)/(sL+R) ) lambda(s) = sqrt( (sC+G)*(sL+R) )   *    * for the RC, RLC, and LC cases, G=0. The RG case is handled exactly as the   * DC case, (and the above equations require reformulation because they   * become identical for the DC case.)   */  /* loop through all the transmission line models */  for (; model != NULL; model = model->LTRAnextModel) {    switch (model->LTRAspecialCase) {    case LTRA_MOD_LC:      y0_r = model->LTRAadmit;      y0_i = 0.0;      lambda_i = model->LTRAtd * ckt->CKTomega;      lambda_r = 0.0;      break;    case LTRA_MOD_RLC:      theta = 0.5 * atan(model->LTRAresist / (ckt->CKTomega*model->LTRAinduct));      mag = sqrt(ckt->CKTomega * model->LTRAcapac /	  sqrt(model->LTRAresist * model->LTRAresist +	      ckt->CKTomega * ckt->CKTomega * model->LTRAinduct *	      model->LTRAinduct));      y0_r = mag * cos(theta);      y0_i = mag * sin(theta);      theta = M_PI / 2 - theta;      mag *= sqrt(model->LTRAresist * model->LTRAresist +	  ckt->CKTomega * ckt->CKTomega * model->LTRAinduct *	  model->LTRAinduct);      lambda_r = mag * cos(theta);      lambda_i = mag * sin(theta);      break;    case LTRA_MOD_RC:      y0_r = y0_i = sqrt(0.5 * ckt->CKTomega * model->LTRAcByR);      lambda_r = lambda_i =	  sqrt(0.5 * ckt->CKTomega * model->LTRAresist * model->LTRAcapac);      break;    case LTRA_MOD_RG:      savemode = ckt->CKTmode;      ckt->CKTmode |= MODEDC;      error = LTRAload(inModel, ckt);      ckt->CKTmode = savemode;      return (error);      break;    default:      return (E_BADPARM);    }    exparg_r = -lambda_r * model->LTRAlength;    exparg_i = -lambda_i * model->LTRAlength;    explambda_r = exp(exparg_r) * cos(exparg_i);    explambda_i = exp(exparg_r) * sin(exparg_i);    y0exp_r = y0_r * explambda_r - y0_i * explambda_i;    y0exp_i = y0_r * explambda_i + y0_i * explambda_r;    /* loop through all the instances of the model */    for (here = model->LTRAinstances; here != NULL;	here = here->LTRAnextInstance) {      if (here->LTRAowner != ARCHme) continue;      *(here->LTRAibr1Pos1Ptr + 0) += y0_r;      *(here->LTRAibr1Pos1Ptr + 1) += y0_i;      *(here->LTRAibr1Neg1Ptr + 0) -= y0_r;      *(here->LTRAibr1Neg1Ptr + 1) -= y0_i;      *(here->LTRAibr1Ibr1Ptr + 0) -= 1.0;      *(here->LTRAibr1Pos2Ptr + 0) -= y0exp_r;      *(here->LTRAibr1Pos2Ptr + 1) -= y0exp_i;      *(here->LTRAibr1Neg2Ptr + 0) += y0exp_r;      *(here->LTRAibr1Neg2Ptr + 1) += y0exp_i;      *(here->LTRAibr1Ibr2Ptr + 0) -= explambda_r;      *(here->LTRAibr1Ibr2Ptr + 1) -= explambda_i;      *(here->LTRAibr2Pos2Ptr + 0) += y0_r;      *(here->LTRAibr2Pos2Ptr + 1) += y0_i;      *(here->LTRAibr2Neg2Ptr + 0) -= y0_r;      *(here->LTRAibr2Neg2Ptr + 1) -= y0_i;      *(here->LTRAibr2Ibr2Ptr + 0) -= 1.0;      *(here->LTRAibr2Pos1Ptr + 0) -= y0exp_r;      *(here->LTRAibr2Pos1Ptr + 1) -= y0exp_i;      *(here->LTRAibr2Neg1Ptr + 0) += y0exp_r;      *(here->LTRAibr2Neg1Ptr + 1) += y0exp_i;      *(here->LTRAibr2Ibr1Ptr + 0) -= explambda_r;      *(here->LTRAibr2Ibr1Ptr + 1) -= explambda_i;      *(here->LTRApos1Ibr1Ptr + 0) += 1.0;      *(here->LTRAneg1Ibr1Ptr + 0) -= 1.0;      *(here->LTRApos2Ibr2Ptr + 0) += 1.0;      *(here->LTRAneg2Ibr2Ptr + 0) -= 1.0;    }  }  return (OK);}

⌨️ 快捷键说明

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