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