/********************************************************************* C2025_07_08 by Yoshiaki Hagiwara, hagiwara@ofc.sojo-u.ac.jp ********************************************************************** **************************************** 重要な関係式 **************************************** EG=1.11 eV; kT=0.0259 eV; Esi=648 e/(V・μm); NC=10400000 e/(μm)**3; NV=28000000e/(μm)**3; ************************************************************* { DP = Nv exp( - VBP/kT ) - Nc exp( (VBP-EG)/kT );} { DN = Nc exp( - VBN/kT ) - Nv exp( (VBN-EG)/kT );} { EG = Vout + VBP + VBN + VB ; } { DPN = (DP*DN)/( DP + DN ); } { WD = sqrt( 2*Esi*VB/DPN ) ; } ************************************************************* (1) if { DP=0; }, { VBPP=(EG+kT*ln(NV/NC))/2=0.567826 ;} (2) if { DN=0; }, { VBNN=(EG+kT*ln(NC/NV))/2=0.542174 ;} ************************************************************* ****************************** C-Code ****************************/ #include #include double EG=1.11,kT=0.0259,Esi=648,NC=10400000,NV=28000000; double VBPP=0.567826,VBNN=0.542174; double VBN1,VBN2,VBN3,DN1,DN2,DN3; double VBP1,VBP2,VBP3,DP1,DP2,DP3; double Vout,DN,DP,DPN,VBN,VBP,VB,WD,WDN; int k,j,i,iDP,jDN; char c; FILE *fpBB; /****************************************************/ void Obtain_VBN( void ) { k=0; VBN1=0; VBN2=VBNN; NEXT_VBN: VBN3=(VBN1+VBN2)/2; DN1 = NC*exp( - VBN1/kT ) - NV*exp( (VBN1-EG)/kT ); DN2 = NC*exp( - VBN2/kT ) - NV*exp( (VBN2-EG)/kT ); DN3 = NC*exp( - VBN3/kT ) - NV*exp( (VBN3-EG)/kT ); if( DN3 < DN ) VBN2=VBN3; if( DN3 > DN ) VBN1=VBN3; k=k+1; if(k<100) goto NEXT_VBN; VBN=VBN3; } /****************************************************/ void Obtain_VBP( void ) { k=0; VBP1=0; VBP2=VBPP; NEXT_VBP: VBP3=(VBP1+VBP2)/2; DP1 = NV*exp( - VBP1/kT ) - NV*exp( (VBP1-EG)/kT ); DP2 = NV*exp( - VBP2/kT ) - NV*exp( (VBP2-EG)/kT ); DP3 = NV*exp( - VBP3/kT ) - NV*exp( (VBP3-EG)/kT ); if( DP3 < DP ) VBP2=VBP3; if( DP3 > DP ) VBP1=VBP3; k=k+1; if(k<100) goto NEXT_VBP; VBP=VBP3; } /****************************************************/ void main(void){ fpBB=fopen( "BB.txt","w"); Vout=0; NEXT_Vout: printf( "\n\n Vout = %f \n\n", Vout); fprintf(fpBB,"\n\n Vout = %f \n\n", Vout); iDP=100; i=1; NEXT_DP: DP=iDP; Obtain_VBP( ); printf( "\n\n\n *********************************************** \n"); fprintf(fpBB,"\n\n\n *********************************************** \n"); printf( "\n DP = %d \n",iDP); fprintf(fpBB,"\n DP = %d \n",iDP); printf( "\n\n\n *********************************************** \n"); fprintf(fpBB,"\n\n\n *********************************************** \n"); jDN=iDP; j=1; NEXT_DN: DN=jDN; Obtain_VBN( ); VB=EG-Vout-VBP-VBN; if(VB<0) goto JUMP; DPN=DP*DN/(DP+DN); WD=sqrt(2*Esi*VB/DPN); WDN=DP*WD/(DP+DN); printf( "\n WD=%f WDN=%f DN/DP=%d \n",WD,WDN,jDN/iDP); fprintf(fpBB,"\n WD=%f WDN=%f DN/DP=%d \n",WD,WDN,jDN/iDP); JUMP: j=j+1; jDN=jDN*10; if(j<6) goto NEXT_DN; i=i+1; printf( "\n *********************************************** \n\n\n"); fprintf(fpBB,"\n *********************************************** \n\n\n"); iDP=iDP+100; if(i<11) goto NEXT_DP; Vout=Vout+0.1; if(Vout<0.6) goto NEXT_Vout; /****************************************************/ c=getchar( ); if(c=='!') printf("\n\n Good-bye !!"); fclose(fpBB); } /******************* End of C-code *******************/