ngspice/src/ciderlib/support/globals.c

158 lines
4.4 KiB
C

/**********
Copyright 1991 Regents of the University of California. All rights reserved.
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
Author: 1991 David A. Gates, U. C. Berkeley CAD Group
**********/
#include "ngspice/ngspice.h"
#include "ngspice/numglobs.h"
#include "ngspice/numconst.h"
#include "ngspice/numenum.h"
#include "ngspice/cidersupt.h"
/* Global Variable Declarations
char *LogFileName = "cider.log";
int BandGapNarrowing;
int TempDepMobility, ConcDepMobility, FieldDepMobility, TransDepMobility;
int SurfaceMobility, MatchingMobility, MobDeriv;
int CCScattering;
int Srh, Auger, ConcDepLifetime, AvalancheGen;
int FreezeOut = FALSE;
int OneCarrier;
int MaxIterations = 100;
int AcAnalysisMethod = DIRECT;
double Temp, RelTemp, Vt, RefPsi;
double EpsNorm, VNorm, NNorm, LNorm, TNorm, JNorm, GNorm, ENorm;
RefPsi is the potential at Infinity */
/*
* Compute global values for this device.
*/
void GLOBcomputeGlobals(GLOBvalues *pGlobals, double temp)
/* GLOBvalues *pGlobals Global Parameter Data Structure */
/* double temp Instance Temperature */
{
double tmp1;
double mnSi, mpSi; /* electron and hole conduction mass */
double eg0; /* band gap */
double nc0, nv0; /* conduction/valence band states */
/* compute temp. dependent global parameters */
Temp = temp;
RelTemp = Temp / 300.0;
tmp1 = pow( RelTemp, 1.5 );
Vt = BOLTZMANN_CONSTANT * Temp / CHARGE;
eg0 = EGAP300_SI + DGAPDT_SI * ( (300.0 * 300.0) / (300.0 + TREF_EG_SI)
- (Temp * Temp) / (Temp + TREF_EG_SI) );
mnSi = 1.039 + 5.477e-4 * Temp - 2.326e-7 * Temp * Temp;
mpSi = 0.262 * log( 0.259 * Temp );
nc0 = NCV_NOM * pow( mnSi, 1.5 ) * tmp1;
nv0 = NCV_NOM * pow( mpSi, 1.5 ) * tmp1;
RefPsi = 0.0;
/* set up the normalization factors */
EpsNorm = EPS_SI;
VNorm = Vt;
NNorm = sqrt( nc0 ) * sqrt( nv0 ); /* this way no overflow */
LNorm = sqrt( ( VNorm * EpsNorm ) / ( CHARGE * NNorm ) );
TNorm = LNorm * LNorm / VNorm;
JNorm = CHARGE * NNorm * VNorm / LNorm;
GNorm = JNorm / VNorm;
ENorm = VNorm / LNorm;
RefPsi /= VNorm;
/* Save Globals */
GLOBputGlobals( pGlobals );
/*
* GLOBprnGlobals( stdout, pGlobals );
*/
}
void GLOBputGlobals(GLOBvalues *values)
{
if ( values == NULL ) {
fprintf( stderr, "Error: tried to get from NIL GLOBvalues\n");
exit(-1);
}
/* Temperature-related globals */
values->Temp = Temp;
values->RelTemp = RelTemp;
values->Vt = Vt;
values->RefPsi = RefPsi;
/* Normalization Factors */
values->EpsNorm = EpsNorm;
values->VNorm = VNorm;
values->NNorm = NNorm;
values->LNorm = LNorm;
values->TNorm = TNorm;
values->JNorm = JNorm;
values->GNorm = GNorm;
values->ENorm = ENorm;
return;
}
/*
* Reload all globals needed during DEV loading routines
* and DEV output routines
*/
void GLOBgetGlobals(GLOBvalues *values)
{
if ( values == NULL ) {
fprintf( stderr, "Error: tried to get from NIL GLOBvalues\n");
exit(-1);
}
/* Temperature-related globals */
Temp = values->Temp;
RelTemp = values->RelTemp;
Vt = values->Vt;
RefPsi = values->RefPsi;
/* Normalization Factors */
EpsNorm = values->EpsNorm;
VNorm = values->VNorm;
NNorm = values->NNorm;
LNorm = values->LNorm;
TNorm = values->TNorm;
JNorm = values->JNorm;
GNorm = values->GNorm;
ENorm = values->ENorm;
return;
}
void GLOBprnGlobals(FILE *file, GLOBvalues *values)
{
static const char tabformat[] = "%12s: % .4e %-12s\t";
static const char newformat[] = "%12s: % .4e %-12s\n";
if ( values == NULL ) {
fprintf( stderr, "Error: tried to print NIL GLOBvalues\n");
exit(-1);
}
fprintf( file, "*** GLOBAL PARAMETERS AT %g deg K\n", values->Temp );
fprintf( file, "****** Temperature-Dependent Voltages\n" );
fprintf( file, tabformat, "Vt", values->Vt, "V" );
fprintf( file, newformat, "RefPsi", values->RefPsi * values->VNorm, "V" );
fprintf( file, "****** Normalization Factors\n" );
fprintf( file, newformat, "EpsNorm", values->EpsNorm, "F/cm" );
fprintf( file, newformat, "VNorm", values->VNorm, "V" );
fprintf( file, newformat, "NNorm", values->NNorm, "/cm^3" );
fprintf( file, newformat, "LNorm", values->LNorm, "cm" );
fprintf( file, newformat, "TNorm", values->TNorm, "s" );
fprintf( file, newformat, "JNorm", values->JNorm, "A/cm^2" );
fprintf( file, newformat, "GNorm", values->GNorm, "A/V" );
fprintf( file, newformat, "ENorm", values->ENorm, "V/cm" );
return;
}