The Fermi-Energy is calculated in the temperature range Tmin <= T <= Tmax at max temperatures. For the upper edge of the valence-band EV = 7.00eV was chosen. Change the parameter to calculate the Fermi-Energy for a other configuration. The chosen value for EG = EC - EV = 1.12eV correspond to the band-gap of silicon. For the effective mass mn* = mn* = 0.3·me is chosen where me is the electron mass.
#include<math.h> #include<stdio.h> const float EC = 7.00 + 1.12 ; /* lower edge of the conduction-band in eV */ const float EV = 7.00 ; /* upper edge of the valence -band in eV */ const float EA = 7.00 + 0.03; /* level of the acceptors in eV */ const float ED = 7.00 + 1.12 - 0.03; /* level of the donators in eV */ const float NA = 1.00E+12; /* acceptor-concentration in cm^-3 */ const float ND = 1.00E+15; /* donntor -concentration in cm^-3 */ const float kB = 1.38066E-23; /* Boltzman konstant in J/K */ const float e = 1.60230E-19; /* elemetal charge in C */ const float mstar = 0.3*9.10939E-31; /* effevtive mass in kg */ const float hplanck = 6.626076E-34; /* Planck konstant in Js */ const float pi = 3.141592654; const float TempMin = 0.00; /* min temperature in K */ const float TempMax = 1000.00; /* max temperature in K */ const int max = 200; /* number of computations */ FILE *out; int i; double temp,ct,ef; float SearchEF(float actfermi) { float exparg1,exparg2,exparg3,exparg4,Faktor; float exp1,exp2,exp3,exp4,dummy,ctemp; Faktor = e/(kB*temp); exparg1 = (actfermi - ED)*Faktor; /* EFn-Term */ exparg2 = (EV - actfermi)*Faktor; /* p-Term */ exparg3 = (actfermi - EC)*Faktor; /* n-Term */ exparg4 = (EA - actfermi)*Faktor; /* EFp-Term */ if (exparg1 > - 70.00) exp1 = exp(exparg1); else exp1 = 0.00; if (exparg2 > - 70.00) exp2 = exp(exparg2); else exp2 = 0.00; if (exparg3 > - 70.00) exp3 = exp(exparg3); else exp3 = 0.00; if (exparg4 > - 70.00) exp4 = exp(exparg4); else exp4 = 0.00; ctemp = exp(3.00/2.00*log(temp)); dummy = 1E+6*(ND/(1.00 + exp1) - NA/(1.00 + exp4)) + ct*ctemp*(exp2 - exp3); return dummy; } int IterationFinished(double IFW, double IFD) { int h1,h2; h1 = 0; h2 = 0; if (fabs(IFW) < 1E-6) h1 = 1; if (IFD < 1E-10) h2 = 1; h1 = !(h1 || h2); return h1; } double CalculateEF(void) { double exparg,dummy; double EFL,EFM,EFR; double W3,delta; ct = 2.00*pi*mstar*kB/(hplanck*hplanck); ct = 2.00*exp(3.00/2.00*log(ct)); /* use 2.00 or (float)2 */ if (temp == 0.00) { return (EC + ED)/2.00; } else { exparg = (EC - ED)*e/(kB*temp); if (exparg > 70.00) { dummy = exp(3.00/2.00*log(temp)); dummy = (EC + ED)/2.00 + kB*temp/(2.00*e)*log(1E+16*ND/(ct*dummy)); return dummy; } else { EFL = EV; EFR = EC; do { EFM = (EFL + EFR)/2.00; W3 = SearchEF(EFM); if (W3 > 0.00) { EFL = EFM; EFR = EFR; delta = fabs(EFR - EFM); } else { EFL = EFL; EFR = EFM; delta = fabs(EFL - EFM); } /* printf("D = %f",delta); printf(" Error = %f\n",W3); */ } /* do */ while (IterationFinished((EFR-EFL)/EFM,delta) == 1); return EFM; } /* if (exparg > 70) */ } /* if (temp == 0) */ } void main(void) { out = fopen("FERMI.DAT","w"); printf("\n\n\n computation of the fermi-enery temperature dependence\n"); printf(" by Jens Korallus, October 1999 \n\n"); for (i = 1; i <= max; i++) { temp = ((TempMax - TempMin)/(max - 1)*(i - 1)) + TempMin; ef = CalculateEF(); printf(" T = %f",temp); printf(" EF = %f\n",ef); fprintf(out,"%f",temp); fprintf(out," %f\n",ef); } printf("finished!"); }