You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
1.7 KiB
87 lines
1.7 KiB
/**********
|
|
Copyright 1991 Regents of the University of California. All rights reserved.
|
|
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
|
|
**********/
|
|
|
|
#include "ngspice.h"
|
|
#include "accuracy.h"
|
|
|
|
/*
|
|
* this function computes the bernoulli function
|
|
* f(x) = x / ( exp (x) - 1 ) and its derivatives. the function
|
|
* f(-x) alongwith its derivative is also computed.
|
|
*/
|
|
|
|
/*
|
|
* input delta-psi
|
|
* outputs f(x), df(x)/dx, f(-x), and df(-x)/dx
|
|
*/
|
|
|
|
void bernoulli (double x, double *pfx, double *pDfxDx, double *pfMx,
|
|
double *pDfMxDx, BOOLEAN derivAlso)
|
|
{
|
|
double fx, fMx;
|
|
double dFxDx = 0.0;
|
|
double dFMxDx = 0.0;
|
|
double expX, temp;
|
|
|
|
if( x <= -BMax ) {
|
|
fx = -x;
|
|
if( x <= -ExpLim ) {
|
|
fMx = 0.0;
|
|
if( derivAlso ) {
|
|
dFxDx = -1.0;
|
|
dFMxDx = 0.0;
|
|
}
|
|
}
|
|
else {
|
|
expX = exp( x );
|
|
fMx = -x * expX;
|
|
if( derivAlso ) {
|
|
dFxDx = fMx - 1.0;
|
|
dFMxDx = -expX * ( 1.0 + x );
|
|
}
|
|
}
|
|
}
|
|
else if ( ABS( x) <= BMin ) {
|
|
fx = 1.0 / (1.0 + 0.5 * x );
|
|
fMx = 1.0 / (1.0 - 0.5 * x );
|
|
if( derivAlso ) {
|
|
temp = 1.0 + x;
|
|
dFxDx = -(0.5 + x / 3.0) / temp;
|
|
dFMxDx = (0.5 + 2 * x /3.0 )/ temp;
|
|
}
|
|
}
|
|
else if ( x >= BMax ) {
|
|
fMx = x;
|
|
if( x >= ExpLim ) {
|
|
fx = 0.0;
|
|
if( derivAlso ) {
|
|
dFxDx = 0.0;
|
|
dFMxDx = 1.0;
|
|
}
|
|
}
|
|
else {
|
|
expX = exp( -x );
|
|
fx = x * expX;
|
|
if( derivAlso ) {
|
|
dFxDx = expX * ( 1.0 - x );
|
|
dFMxDx = 1.0 - fx;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
expX = exp( x );
|
|
temp = 1.0 / ( expX - 1.0 );
|
|
fx = x * temp;
|
|
fMx = expX * fx;
|
|
if( derivAlso ) {
|
|
dFxDx = temp * ( 1.0 - fMx );
|
|
dFMxDx = temp * ( expX - fMx );
|
|
}
|
|
}
|
|
*pfx = fx;
|
|
*pfMx = fMx;
|
|
*pDfxDx = dFxDx;
|
|
*pDfMxDx = dFMxDx;
|
|
}
|