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

📄 ifeval.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles$Id: ifeval.c,v 1.2 2005/06/10 07:14:30 sjborley Exp $**********/#include "ngspice.h"#include <stdio.h>#include "ifsim.h"#include "inpmacs.h"#include "fteext.h"#include "iferrmsg.h"#include "inpptree.h"#include "inp.h"/* Uncomment to allow tracing *//*#define TRACE*/extern double PTfudge_factor;static int PTeval(INPparseNode * tree, double gmin, double *res,		  double *vals);intIFeval(IFparseTree * tree, double gmin, double *result, double *vals,       double *derivs){    int i, err;    INPparseTree *myTree = (INPparseTree *) tree;;#ifdef TRACE    INPptPrint("calling PTeval, tree = ", myTree);    printf("values:");    for (i = 0; i < myTree->p.numVars; i++)	printf("\tvar%d = %lg\n", i, vals[i]);#endif    if ((err = PTeval(myTree->tree, gmin, result, vals)) != OK)	return (err);    for (i = 0; i < myTree->p.numVars; i++)	if ((err = PTeval(myTree->derivs[i], gmin, &derivs[i], vals)) !=	    OK) return (err);#ifdef TRACE    printf("results: function = %lg\n", *result);    for (i = 0; i < myTree->p.numVars; i++)	printf("\td / d var%d = %lg\n", i, derivs[i]);#endif    return (OK);}static intPTeval(INPparseNode * tree, double gmin, double *res, double *vals){    double r1, r2;    int err;    PTfudge_factor = gmin;    switch (tree->type) {    case PT_CONSTANT:	*res = tree->constant;	break;    case PT_VAR:	*res = vals[tree->valueIndex];	break;    case PT_FUNCTION:	err = PTeval(tree->left, gmin, &r1, vals);	if (err != OK)	    return (err);	*res = (*tree->function) (r1);	if (*res == HUGE) {	    fprintf(stderr, "Error: %g out of range for %s\n",		    r1, tree->funcname);	    return (E_PARMVAL);	}	break;    case PT_PLUS:    case PT_MINUS:    case PT_TIMES:    case PT_DIVIDE:    case PT_POWER:	err = PTeval(tree->left, gmin, &r1, vals);	if (err != OK)	    return (err);	err = PTeval(tree->right, gmin, &r2, vals);	if (err != OK)	    return (err);	*res = (*tree->function) (r1, r2);	if (*res == HUGE) {	    fprintf(stderr, "Error: %g, %g out of range for %s\n",		    r1, r2, tree->funcname);	    return (E_PARMVAL);	}	break;    default:	fprintf(stderr, "Internal Error: bad node type %d\n", tree->type);	return (E_PANIC);    }    return (OK);}

⌨️ 快捷键说明

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