http://www.aiplab.com/Proposal _of_Pinned_Photodiode_Type_Solar_Cell_2020_09_28.html
http://www.aiplab.com/NPNP_junction_Pinned_Photodiode_in_1975_by_Hagiwara_A.jpg
http://www.aiplab.com/image3E_Hagiwara_at_Sony_invented_Pinned_Photodiode_in_1975.jpg
http://www.aiplab.com/AIPS003E__Hagiwara_at_Sony_invented_Pinned_Photodiode_in_1975.jpg
http://www.aiplab.com/Difference_of_Pinned_Photodiode_and_Buiried_Photodiode.jpg
Introduction
Proposed Pinne Photodiode type Solar Cell
Details of Numerical Calculation Algorithm
Sumamry of Numerical Calculation Algorithm
Results of Numerical Calculations by the C source coding Program at the
end .
Reference
http://www.aiplab.com/NPNP_junction_Pinned_Photodiode_in_1975_by_Hagiwara_A.jpg
http://www.aiplab.com/JP1975-134985_Patent_Claim_in_Japanese.jpg
http://www.aiplab.com/JP1975-127646_A.jpg
http://www.aiplab.com/JP1975-127646.pdf
http://www.aiplab.com/JP1975-127647_A.jpg
http://www.aiplab.com/JP1975-127647.pdf
http://www.aiplab.com/JP1975-34985_A.jpg
http://www.aiplab.com/JP1975-134985.pdf
http://www.aiplab.com/P1978_SSDM1978_Paper_on_Pinned_Photodiode_A.jpg
http://www.aiplab.com/P1978_Pinned_Photodiode_1978_Paper_by_Hagiwara.pdf
https://www.imagesensors.org/Past%20Workshops/1979%20CCD79/03-1%20Hagiwara.pdf
http://www.aiplab.com/P2001_ESSCIRC2001.pdf
http://www.aiplab.com/P2008_ESSCIRC2008Hagiwara.pdf
http://www.aiplab.com/P2013_ISSCC2013PanelTalk.pdf
http://www.aiplab.com/P1996_Pinned_Photodidoe_used_in_Sony_1980_FT_CCD_Image_Sensor.pdf
http://www.aiplab.com/P2019_3DIC2019Paper_on_3D_Pinned_Photodiode.pdf
http://www.aiplab.com/P2020_EDTM2020_PaperID_3C4_by_Hagiwara.pdf
http://www.aiplab.com/P2020_Pinned_Photodiode_Solar_Cell_1.pdf
http://www.aiplab.com/P2020_Pinned_Photodiode_Solar_Cell_2.pdf
******************************************
C-Coding for Numerical Computation
of Pinned Photodiode P+P Barrier Potentail V(x)
******************************************
/***********************************************
A Graph Plot Program
of Pinned Photodiode type Solar Cell
Computation of Barrier Potentail V(x)
& codings challenged by Yoshiaki Hagiwara.
2020.09.28 --> 2020.10.18 updated
/***********************************************
Graph Plot Program ( 2020.10.18 updated )
************************************************
This program gives at most ten graph plots
in A.html, A1.html, A2 html ... and A9.html.
And the following output files are also generated :
AA01_Set_Parameters.txt ,
AA02_Obtain_VV.txt ,
AA03_Check_Error_01.txt ,
AA04_Check_Error_02.txt ,
AA05_Obtain_YP_1A.txt ,
AA06_Obtain_YP_1B.txt ,
and AA07_Plot_Graph.txt .
*************************************************/
/************************************************
Source Program List
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
#include <stdio.h>
#include <math.h>
FILE *fpAA;
FILE *fpAAA;
FILE *fpBB;
FILE *fpCC;
FILE *fpDD;
FILE *fpC;
double AA, AAA, BB,dvdx,dvdxA,dvdxB,dv ;
int NOTE,Ni,Nj,KPLOT,NPLOT,ADD;
double dxmin,dxmax,dymin,dymax,dyoffset,xaxis,xaxiss,yaxis,yaxiss;
char c ;
int N =10000, N1,N2,NOTE,NOTEA,NOTEAA;
double YP[10][10001];
double YY[10001],ZZ[10001],TT[10001],D[10001],H[10001],HH[10001];
double DYDX[10001],VV[40001];
double xmin,xmax,ymin,ymax;
double xx,yy,y;
int ixmin,ixmax,iymin,iymax;
int nxx ;
int nx1=100,nx2=600,nyy,ny1=50,ny2=1050 ;
int i,j,k,ii,jj,kk,m,n,iw;
double X,Y,A,B,S,X1,X2;
double R,Wo,WB,VB,VBB,No,WBWo,WoWB;
int kk,kkk,kkkk[11];
double Err,ErrMax, ErrMin,EEr,EErMax,EErMin,E1,E2;
double FF,FFMax,FFMin,F,Z,Z1,Z2,ZA,DZZ,DD,T1,T2,Hole,PP ;
double dx, x , DP,Xc,Xa,Xd,Vo,Vc,Va,Vd;
double V,V1,V2,Err1,Err2;
double kT = 0.0259, Esi = 648 ;
double Np,Npp,Nppp,Nr,Lp,Lpp,Lppp,Hole;
double VW, XW, ZZZ,YYY,DVDX,a,b,XXAA,XXA,VVA,VVB,BB;
double z,v,vv,vvv,dv,dvdx,dvdxN;
/************************************************
Source Program
(1) void Graph_Plot(void)
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Graph_Plot(void) {
xmin = 0; xmax =1; ymin =0;ymax =1;
printf ("\n\n ********Graph_Plot( ) called for NPLOT = %d ******** \n\n", NPLOT);
if ( NPLOT == 0 ) fpC=fopen( "A.html","w");
if ( NPLOT == 1 ) fpC=fopen("A1.html","w");
if ( NPLOT == 2 ) fpC=fopen("A2.html","w");
if ( NPLOT == 3 ) fpC=fopen("A3.html","w");
if ( NPLOT == 4 ) fpC=fopen("A4.html","w");
if ( NPLOT == 5 ) fpC=fopen("A5.html","w");
if ( NPLOT == 6 ) fpC=fopen("A6.html","w");
if ( NPLOT == 7 ) fpC=fopen("A7.html","w");
if ( NPLOT == 8 ) fpC=fopen("A8.html","w");
if ( NPLOT == 9 ) fpC=fopen("A9.html","w");
fprintf(fpC,"<!DOCTYPE HTML PUBLIC \"");
fprintf(fpC,"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
fprintf(fpC,"<HTML>\n<HEAD>\n<META http-equiv=\"Content-Type\"");
fprintf(fpC," content=\"text/html; charset=Shift_JIS\">\n");
fprintf(fpC,"<META http-equiv=\"Content-Style-Type\" content=\"text/css\">\n");
fprintf(fpC,"<TITLE></TITLE>\n</HEAD>\n<BODY>\n<BR>\n");
fprintf(fpC,"<BR>\n<FONT size=\"+2\"><BR>\n<FONT size=\"+2\"></FONT><I><B><FONT color=\"#ff0000\">\n\n");
if( NPLOT == 0 ) {
fprintf(fpC," Output Graph File = A .html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 1 ) {
fprintf(fpC," Output Graph File = A1.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 2 ) {
fprintf(fpC," Output Graph File = A2.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 3 ) {
fprintf(fpC," Output Graph File = A3.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 4 ) {
fprintf(fpC," Output Graph File = A4.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 5 ) {
fprintf(fpC," Output Graph File = A5.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 6 ) {
fprintf(fpC," Output Graph File = A6.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 7 ) {
fprintf(fpC," Output Graph File = A7.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 8 ) {
fprintf(fpC," Output Graph File = A8.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
if( NPLOT == 9 ) {
fprintf(fpC," Output Graph File = A9.html \n<BR> " ) ;
fprintf(fpC," ----------------------------- \n\n<BR>" ) ; }
/*******************************************************/
fprintf(fpC,"</FONT><BR><FONT color=\"#ff0000\">\n");
fprintf(fpC,"</FONT> <BR>\n</B><BR>\n</I><BR>\n");
/*******************************************************
Graph Plot Frame is defined here.
*******************************************************/
for ( i =0 ; i<10000; i++) {
if(i<2000) { xx = xmin ;
yy= ymin + ( 2000 - i )*( ymax - ymin)/2000; goto NEXTT;}
if(i<4000) { xx = xmax ;
yy = ymin + ( 4000 - i )*( ymax - ymin)/2000; goto NEXTT;}
if(i<6000) { yy = ymin ;
xx = xmin + ( 6000 - i )*( xmax - xmin)/2000;goto NEXTT; }
if(i<8000) { yy = ymax ;
xx = xmin + ( 8000 - i )*( xmax - xmin)/2000; goto NEXTT; }
if(i<8500) { yy = yaxis ;
xx = xmin + ( 8500 - i )*( xmax - xmin)/500; goto NEXTT; }
if(i<9000) { yy = yaxis ;
xx = xmin + ( 9000 - i )*( xmax - xmin)/500; goto NEXTT; }
/************ Now 9000< i < 9500 **********************/
if( i < 9500) { xx = xaxis ;
yy= ymin + (9500 - i )*( ymax - ymin)/500 ; goto NEXTT ; }
/************ Now 9500< i < 10000 **********************/
xx = xaxiss ;
yy= ymin + (10000 - i )*( ymax - ymin)/500 ;
NEXTT:
/********************************************************/
/**************************************************************
Graph Cordinate (nxx,nyy) is computed
for Each Position Value (xx,yy).
**************************************************************/
nyy = ny1 + (xx-xmin)*(ny2-ny1)/(xmax-xmin) ;
nxx = nx2 + (yy-ymin)*(nx1-nx2)/(ymax-ymin) ;
/**************************************************************
At the cordinate (nxx,nyy) , the point symbol (.) is drawn.
**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,".");
fprintf(fpC,"</P></DIV>\n" ); }
/**************************************************************/
/*******************************************************
for the frame scale points, the symbol (*) is drawn.
*******************************************************/
for ( j = 0 ; j < Nj +1 ; j++) {
nxx = 100 + j*500/Nj + dyoffset ;
nyy = 50 - dymin;
/**************************************************************
At the cordinate (nxx,nyy) , the point symbol (*) is drawn.
**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,"*");
fprintf(fpC,"</P></DIV>\n" );
/****************************************************************/
nyy = 1050+dymax ;
/**************************************************************
At the cordinate (nxx,nyy) , the point symbol (*) is drawn.
**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,"*");
fprintf(fpC,"</P></DIV>\n" ); }
/****************************************************************/
for ( i = 0 ; i < Ni +1 ; i++) {
nyy = 45 + i*1000/Ni ;
nxx = 100 - dxmin;
/**************************************************************
At the cordinate (nxx,nyy) , the point symbol (*) is drawn.
**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,"*");
fprintf(fpC,"</P></DIV>\n" );
/****************************************************************/
nxx = 600 + dxmax;
/**************************************************************
At the cordinate (nxx,nyy) , the point symbol (*) is drawn.
**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,"*");
fprintf(fpC,"</P></DIV>\n" ); }
/****************************************************************/
/*******************************************************
The KPLOT-th Graph is plotted.
*******************************************************/
for ( i =0; i<10001 ; i++) {
xx= 0.0001*i ;
yy= YP[KPLOT][i];
/**************************************************************
Graph Cordinate (nxx,nyy) is computed
for Each Position Value (xx,yy).
**************************************************************/
nyy = ny1 + (xx-xmin)*(ny2-ny1)/(xmax-xmin) ;
nxx = nx2 + (yy-ymin)*(nx1-nx2)/(ymax-ymin) ;
/**************************************************************
At the cordinate (nxx,nyy) , the point symbol (.) is drawn.
**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,",");
fprintf(fpC,"</P></DIV>\n" ); }
/*******************************************************
The ADD-th Graph is added to the KPLOT-th Graph.
*******************************************************/
if(ADD==0) goto SKIP;
for ( i =0; i<10001 ; i++) {
xx= 0.0001*i ;
yy= YP[ADD][i];
/**************************************************************
Graph Cordinate (nxx,nyy) is computed
for Each Position Value (xx,yy).
**************************************************************/
nyy = ny1 + (xx-xmin)*(ny2-ny1)/(xmax-xmin) ;
nxx = nx2 + (yy-ymin)*(nx1-nx2)/(ymax-ymin) ;
/**************************************************************/
fprintf(fpC,"<DIV style=\"top :");
fprintf(fpC,"%d",nxx) ;
fprintf(fpC,"px;left :") ;
fprintf(fpC,"%d",nyy);
fprintf(fpC,"px; position : absolute; z-index : 1;\" id=\"Layer1\"><P>");
fprintf(fpC,".");
fprintf(fpC,"</P></DIV>\n" ); }
/**************************************************************/
SKIP:
fprintf(fpC,"</B></I></FONT>\n</BODY></HTML>\n");
fclose(fpC);
printf( "\n\n NPLOT = %d Push Enter Key >", NPLOT );
c=getchar( ); if(c =='c') printf("\n\n Good Bye ! \n\n");
if ( NPLOT == 0 )
printf("\n\n ******* See A.html *******\n\n");
if ( NPLOT > 0 )
printf("\n\n ******* See A%d.html *******\n\n",NPLOT); }
/************************************************************/
/************************************************
Source Program
(2) void ddope(void)
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void ddope(void) {
DP = Np + ( Npp -Np ) * exp ( - xx*xx/R/R ) ; }
/************************************************
Source Program
(3) void dope(void)
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void dope(void) {
if ( x < 0 ) { xx = 0 ; ddope( ) ; return ; }
if ( x > Xc ) { xx = Xc ; ddope( ) ; return ; }
xx = x ; ddope( ) ; }
/************************************************
Source Program
(4) void Barrier ( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Barrier ( void ) {
double Err, Vc,dvdx,dvdxN,dgdy,v,vv,vvv,z;
VV[0] = Vo ;
z = VV[0] / kT ;
dvdx = sqrt ( 2 * ( exp( - z ) - 1 + z ) ) ;
dvdx = kT* dvdx /Lpp;
VV[1] = VV[0] + dx*dvdx;
kk = 0 ;
for ( i = 2; i < 40001 ; ++ i ) {
x = ( i-1 )*dx ; dope( ) ;
VV[i] = 2*VV[i-1] - VV[i-2] + dx*dx*( DP - Npp*exp( -VV[i-1] /kT) )/Esi ;
if( VV[i] < 0 ) { kk = 1 ;
printf ( " \n k = %d kk = %d Vo = %f Out of Range : VV[%d] < 0 ",
k, kk, 100000000*Vo, i ) ; return ; } }
if( VV[N] > VB ) { kk = 2 ;
printf ( " \n k = %d kk = %d Vo = %f Out of Range : VV[%d] > VB ",
k, kk,100000000*Vo, i ) ; return ; }
FINISH: kk = 0; Vc = VV[N] ;
dvdxN= Lppp*( VV[N] - VV[N-1] )/dx;
z = ( Vc - VB ) / kT ;
dgdy = kT*sqrt ( 2 * ( exp( - z ) - 1 + z ) ) ;
Err = ( dvdxN - dgdy )*100000 ;
if( Err < 0 ) kk = 3;
if( Err > 0 ) kk = 4;
printf ( " \n k = %d kk = %d Vo = %f Err = %f Vc = %f ",
k, kk, 100000000*Vo, Err , 1000*Vc ) ; }
/*****************************************************************/
/************************************************
Source Program
(5) void Set_Parameters( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Set_Parameters( void ) {
fpAA=fopen("AA01_Set_Parameters.txt","w");
R = 0.1 ;
Xc = 0.5 ;
N=40000;
dx = Xc/N ;
Np =100; Npp = 10000;
xx = Xc ; ddope( ) ; Nppp = DP ;
VB = kT * log( Npp/Nppp ) ;
Lppp = sqrt( Esi*kT/Nppp) ;
Lpp = sqrt( Esi*kT/Npp);
Lp = sqrt( Esi*kT/Np );
x = R; dope( ) ; Nr = DP;
fprintf(fpAA, " \n\n ***************************************** ") ;
fprintf(fpAA, " \n\n kT = 0.0259 eV , Esi = 648 e/volt・um ") ;
fprintf(fpAA, " \n\n R = %f um , Xc = %f um ", R, Xc ) ;
fprintf(fpAA, " \n\n N =%d dx = Xc/N = %f um ", N,dx ) ;
fprintf(fpAA, " \n\n Np =100, Npp = 1000, Nppp = %f ", Nppp ) ;
fprintf(fpAA, " \n\n Lp = %f Lpp = %f Lppp =%f", Lp,Lpp, Lppp ) ;
fprintf(fpAA, " \n\n VB =1000* kT * log( Npp/Nppp ) = %f ", 1000*VB ) ;
fprintf(fpAA, " \n\n Nr =D(x) = %f at x = R = %f ",Nr , R ) ;
fprintf(fpAA, " \n\n *****************************************\n\n ");
printf( " \n\n ***************************************** ") ;
printf( " \n\n kT = 0.0259 eV , Esi = 648 e/volt・um ") ;
printf( " \n\n R = %f um , Xc = %f um ", R, Xc ) ;
printf( " \n\n N =%d dx = Xc/N = %f um ", N,dx ) ;
printf( " \n\n Np =100, Npp = 1000, Nppp = %f ", Nppp ) ;
printf( " \n\n Lp = %f Lpp = %f Lppp =%f", Lp,Lpp, Lppp ) ;
printf( " \n\n VB =1000* kT * log( Npp/Nppp ) = %f ", 1000*VB ) ;
printf( " \n\n Nr =D(x) = %f at x = R = %f ",Nr , R ) ;
printf( " \n\n *****************************************\n\n ");
fclose(fpAA) ; }
/************************************************************/
/************************************************
Source Program
(6) void Obtain_VV( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Obtain_VV( void ) {
fpAA=fopen("AA02_Obtain_VV.txt","w");
VVA = 0;
VVB = VB;
NEXT_Vo:
kkkk[0]=1;
fprintf(fpAA, "\n\n 100000000000000*VVA = %f \n\n", VVA*100000000000000);
fprintf(fpAA, "\n\n 100000000000000*VVB = %f \n\n", VVB*100000000000000);
for ( k = 0; k<11; ++k ) {
Vo = VVA + k* ( VVB - VVA ) /10;
Barrier ( ) ;
kkkk[k]=kk; if(kkkk[0]<kk) kkkk[0]=kk; }
if( kkkk[0] == 2 ) { for ( k=1;k<11;++k) { if( kkkk[k] == 2 ) goto JUMPK; } }
if( kkkk[0] == 3 ) { k = 10 ; JUMPKK :
if( kkkk[k] < 3 ) { k = k - 1 ; goto JUMPKK ; }
goto JUMPK; }
if( kkkk[0] == 4 ) { for ( k=1;k<11;++k) { if( kkkk[k] == 4 ) goto JUMPK; } }
JUMPK:
fprintf(fpAA, "\n\n ******* k = %d k_MAX = %d ******** \n\n ", k, kkkk[0] );
printf( "\n\n ******* k = %d k_MAX = %d ******** \n\n ", k, kkkk[0] );
printf( " \n\n Push s-key to stop. \n\n Push Enter-key to continue > " );
c=getchar( ); if(c =='s') goto NEXTY;
if( k == 0 ) {
Vo = VVA + k*( VVB - VVA ) /10;
VVB = VVA + ( k + 2 )*( VVB - VVA ) /10;
VVA = Vo; goto NEXT_Vo ; }
if( k == 10 ) {
Vo = VVA + ( k - 2 )*( VVB - VVA ) /10;
VVB = VVA + k*( VVB - VVA ) /10;
VVA = Vo; goto NEXT_Vo ; }
Vo = VVA + ( k - 1 )*( VVB - VVA ) /10;
VVB = VVA + ( k + 1 )*( VVB - VVA ) /10;
VVA = Vo;
goto NEXT_Vo ;
NEXTY:
Vo = ( VVB + VVA ) /2 ;
printf( "\n\n 100000000000000*Vo = %f \n\n", Vo*100000000000000);
fprintf(fpAA, "\n\n 100000000000000*Vo = %f \n\n", Vo*100000000000000);
Barrier ( ) ;
fclose(fpAA) ; }
/****************************************************************************/
/************************************************
Source Program
(7) void Check_Error_01( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Check_Error_01( void ) {
fpAA=fopen("AA03_Check_Error_01.txt","w");
for ( k=0;k<10001;++k) {
YP[1][k] = 1 - VV[k]/VB;
x = k*dx ; dope( );
Hole = Npp*exp( - VV[k]/kT ) ;
PP = DP - Hole;
YP[4][k] = 0.5 + PP/Npp ;
YP[2][k] = DP/Npp;
YP[3][k] = Hole/Npp;
YP[5][k] = 1 - kT*log( Npp/DP)/VB ;
if ( k < 2 ) { Err = 0 ; goto NEXTZ; }
if( k > N - 2 ) { Err = 0 ; goto NEXTZ; }
Err = ( Esi* ( VV[k+1] -2*VV[k] + VV[k-1] )/dx/dx - ( DP - Hole ) )/Npp ;
NEXTZ:
fprintf(fpAA, " \n x[%d] = %f, VV = %f DP = %f hole =%f PP = %f Err = %f ", k,x,VV[k], DP,Hole, PP, Err); }
fclose(fpAA) ; }
/*****************************************************************************************/
/************************************************
Source Program
(8) void Check_Error_02( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Check_Error_02( void ) {
fpAA=fopen("AA04_Check_Error_02.txt","w");
for ( k = 10001; k <40000; ++k) {
x = k*dx ; dope( );
Hole = Npp*exp( - VV[k]/kT ) ;
PP = DP - Hole;
Err = ( Esi* ( VV[k+1] -2*VV[k] + VV[k-1] )/dx/dx - ( DP - Hole ) )/Npp ;
fprintf(fpAA, " \n x[%d] = %f, VV = %f DP = %f hole =%f PP = %f Err = %f ", k,x,VV[k], DP,Hole, PP, Err); }
Vc = VV[40000] ;
Hole = Npp*exp( - Vc/kT ) ;
x = Xc ; dope( ); PP = DP - Hole;
fprintf(fpAA, " \n x[40000] = Vc = %f, VV = %f DP = %f hole =%f PP = %f ", x,Vc, DP,Hole, PP);
dvdx = ( VV[1] - VV[0] )/dx;
printf( " \n\n dvdx = ( VV[1] - VV[0] )/dx = %f ", dvdx);
fprintf(fpAA, " \n\n dvdx = ( VV[1] - VV[0] )/dx = %f ", dvdx);
dvdxN = (VV[40000] - VV[39999])/dx;
printf( " \n\n dvdxN = (VV[40000] - VV[39999])/dx = %f ", dvdxN);
fprintf(fpAA, " \n\n dvdxN = (VV[40000] - VV[39999])/dx = %f ", dvdxN);
fclose(fpAA) ; }
/**********************************************************************/
/************************************************
Source Program
(9) void Obtain_YP_1A( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Obtain_YP_1A( void ) {
fpAA=fopen("AA05_Obtain_YP_1A.txt","w");
N1 = 1000; N2= 3000;
YP[1][N1] = 1 - VV[0]/VB;
YP[1][N2] = 1 - VV[40000]/VB ;
dx = Xc/40001;
for ( i = N1+1 ; i < N2 ;++i) {
x = ( i - N1 )*Xc/( N2 - N1 ) ;
for ( j = 0; j<40001; ++j) {
xx = j*dx; if ( xx > x ) goto NEXTX; }
NEXTX:
YP[1][i] = 1 - ( VV[j-1] + ( VV[j] - VV[j-1] ) *( xx - x )/dx )/ VB ; }
fprintf( fpAA,"\n\n **********************************************\n\n");
fprintf( fpAA,"\n YP[1][%d] = %f VV = %f ", N1,YP[1][N1], ( 1 - YP[1][N1] )*VB ) ;
fprintf( fpAA,"\n YP[1][%d] = %f VV = %f ", i,YP[1][N2], ( 1 - YP[1][N2] )*VB ) ;
fprintf( fpAA,"\n\n **********************************************\n\n");
for ( i = N1; i<N2+1; ++i ) {
fprintf( fpAA,"\n YP[1][%d] = %f VV = %f ", i,YP[1][i], ( 1 - YP[1][i] )*VB ) ; }
fclose(fpAA) ; }
/*****************************************************************/
/************************************************
Source Program
(10) void Obtain_YP_1B( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Obtain_YP_1B( void ) {
fpAA=fopen("AA06_Obtain_YP_1B.txt","w");
Xa = N1*Xc/(N2 -N1) ;
Xd = 10000*Xc/(N2-N1) ;
fprintf(fpAA, "\n\n Region (1) [ - Xa = %f, 0 ] \n\n", - Xa );
printf( "\n\n Region (1) [ - Xa = %f, 0 ] \n\n", - Xa );
fprintf(fpAA, " [ i = 0 ; i = %d ] \n\n", N1) ;
printf( " [ i = 0 ; i = %d ] \n\n", N1) ;
fprintf(fpAA, "\n\n 100000000000000*Vo = %f ", Vo*100000000000000);
printf( "\n\n 100000000000000*Vo = %f ", Vo*100000000000000);
v = Vo/kT ; v = exp(-v) -1 +v;
v= kT*sqrt(2*v)/Lpp;
fprintf(fpAA, "\n\n at x = 0 , dV/dx = %f %f ", dvdx, v );
printf( "\n\n at x = 0 , dV/dx = %f %f " , dvdx, v );
fprintf(fpAA, "\n\n Region (2) [ 0 , Xc = %f ] \n\n", Xc );
printf( "\n\n Region (2) [ 0 , Xc = %f ] \n\n", Xc );
fprintf(fpAA, " [ i = %d ; i = %d ] \n\n", N1,N2) ;
printf( " [ i = %d ; i = %d ] \n\n", N1,N2) ;
fprintf(fpAA, "\n\n 100000000000000*Vc = %f ", Vc*100000000000000);
printf( "\n\n 100000000000000*Vc = %f ", Vc*100000000000000);
v = ( Vc - VB ) /kT ; v = exp(-v) -1 +v;
v= kT*sqrt(2*v)/Lppp;
fprintf(fpAA, "\n\n at x = Xc , dV/dx = %f %f ", dvdxN, v);
printf( "\n\n at x = Xc , dV/dx = %f %f ", dvdxN, v);
fprintf(fpAA, "\n\n Region (3) [ Xc = %f , Xd = %f ] \n\n", Xc, Xd );
printf( "\n\n Region (3) [ Xc = %f , Xd = %f ] \n\n", Xc, Xd );
fprintf(fpAA, " [ i = %d ; i = 10000 ] \n\n", N2) ;
printf( " [ i = %d ; i = 10000 ] \n\n", N2) ;
fprintf(fpAA, "\n\n 100000000000000*VB = %f \n\n", VB*100000000000000);
printf( "\n\n 100000000000000*VB = %f \n\n", VB*100000000000000);
/*************************************************************/
dx = Xc/(N2-N1) ;
v=Vo ;
for ( i = 1; i<N1+1; ++i ) {
j = N1 - i;
dv = exp( -v/kT ) - 1 + v/kT;
dv = kT*sqrt(2*dv)/Lpp;
v =v - dx*dv ;
if ( v < 0 ) v = 0;
YP[1][j] = 1 - v/VB; }
fprintf( fpAA,"\n\n **********************************************\n\n");
fprintf( fpAA,"\n\n YP[1][0] = %f VV = %f \n\n", YP[1][0], ( 1 - YP[1][0] )*VB ) ;
fprintf( fpAA,"\n\n YP[1][%d] = %f VV = %f \n\n", N1,YP[1][N1], ( 1 - YP[1][N1] )*VB ) ;
fprintf( fpAA,"\n\n **********************************************\n\n");
for ( i = 0; i<N1+1; ++i ) {
fprintf( fpAA,"\n YP[1][%d] = %f VV = %f ", i,YP[1][i], ( 1 - YP[1][i] )*VB ) ; }
v= Vc - VB ;
for ( i = N2+1 ; i<10001; ++i ) {
dv = exp( -v/kT ) - 1 + v/kT;
dv = kT*sqrt(2*dv)/Lppp;
v = v + dx*dv ;
if ( v > 0 ) v = 0 ;
vv = VB + v ;
YP[1][i] = 1 - vv/VB ; }
fprintf( fpAA,"\n\n **********************************************\n\n");
fprintf( fpAA,"\n\n YP[1][%d] = %f VV = %f \n\n", N2,YP[1][N2], ( 1 - YP[1][N2] )*VB ) ;
fprintf( fpAA,"\n\n YP[1][10000] = %f VV = %f \n\n", YP[1][10000], ( 1 - YP[1][10000] )*VB ) ;
fprintf( fpAA,"\n\n **********************************************\n\n");
for ( i = N2; i<10001; ++i ) {
fprintf( fpAA,"\n YP[1][%d] = %f VV = %f ", i,YP[1][i], ( 1 - YP[1][i] )*VB ) ; }
fclose(fpAA) ; }
/*****************************************************************/
/************************************************
Source Program
(11) void Plot_Graph ( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void Plot_Graph ( void ) {
fpAA=fopen("AA07_Plot_Graph.txt","w");
for ( i = 1; i<10001;++i) {
x = ( i - N1)*dx; dope( ); YP[2][i] = DP/Npp ;
v = ( 1 - YP[1][i])*VB ;
Hole = Npp*exp( - v/kT) ;
YP[3][i]= Hole/Npp ;
YP[4][i] = 0.5 + ( DP - Hole )/ Npp ; }
/************* Define Graph Plot Parameters **************/
Ni =10; Nj =10;
dxmin = 5 ; dxmax = 10 ; dymin = 10 ; dymax = 10 ;
dyoffset = 5;
xaxis = 0.1 ;
xaxiss = 0.3 ;
yaxis = 0.5 ;
yaxiss = 0.5 ;
/************************************************/
printf(" \n\n ***** V(x) ****** NPLOT =1 KPLOT =1 ADD = 0 \n\n");
fprintf(fpAA, " \n\n ***** V(x) ****** NPLOT =1 KPLOT =1 ADD = 0 \n\n");
NPLOT = 1 ; KPLOT = 1; ADD = 0; Graph_Plot( );
printf(" \n\n ***** D(x) ***** NPLOT =2 KPLOT =2 ADD = 0 \n\n");
fprintf(fpAA, "\n\n ***** D(x) ***** NPLOT =2 KPLOT =2 ADD = 0 \n\n");
NPLOT = 2 ; KPLOT = 2; ADD = 0; Graph_Plot( );
printf(" \n\n ***D(x) and Hole(x) = Npp*exp( - V(x)/kT ) ****** NPLOT =3 KPLOT =2 ADD = 3 \n\n");
fprintf(fpAA, "\n\n ***D(x) and Hole(x) = Npp*exp( - V(x)/kT ) ****** NPLOT =3 KPLOT =2 ADD = 3 \n\n");
NPLOT = 3 ; KPLOT = 2; ADD = 3; Graph_Plot( );
printf(" \n\n ***** PP(x) = D(x) - Hole(x) ****** NPLOT =4 KPLOT =4 ADD = 0 \n\n");
fprintf(fpAA, "\n\n ***** PP(x) = D(x) - Hole(x) ****** NPLOT =4 KPLOT =4 ADD = 0 \n\n");
NPLOT = 4; KPLOT = 4; ADD = 0; Graph_Plot( );
printf(" \n\n *** V(x) and PP(x) = D(x) - Hole(x) ****** NPLOT =5 KPLOT =1 ADD = 4 \n\n");
fprintf(fpAA, " \n\n *** V(x) and PP(x) = D(x) - Hole(x) ****** NPLOT =5 KPLOT =1 ADD = 4 \n\n");
NPLOT = 5; KPLOT = 1; ADD = 4; Graph_Plot( );
fclose(fpAA) ; }
/*****************************************************************/
/************************************************
Source Program
(12) void main( void )
************************************************
(1) void Graph_Plot(void)
(2) void ddope(void)
(3) void dope(void)
(4) void Barrier ( void )
(5) void Set_Parameters( void )
(6) void Obtain_VV( void )
(7) void Check_Error_01( void )
(8) void Check_Error_02( void )
(9) void Obtain_YP_1A( void )
(10) void Obtain_YP_1B( void )
(11) void Plot_Graph ( void )
(12) void main( void )
************************************************/
void main( void ) {
Set_Parameters( ) ;
Obtain_VV( ) ;
Check_Error_01( );
Check_Error_02( );
Obtain_YP_1A( ) ;
Obtain_YP_1B( ) ;
Plot_Graph( );
fclose(fpAA) ;
printf( "\n\n Push Enter Key to End > " );
c=getchar( ); if(c =='c') printf("\n\n Good Bye ! \n\n");
printf( "\n\n One More Push >" );
c=getchar( ); if(c =='c') printf("\n\n Good Bye ! \n\n"); }
/*************** END of Program Coding ****************/
Next Challenge
return to http://www.aiplab.com