1 function [odata,nrm]=ThDDGOXeletiteration(imesh,Dsides,...
2 Simesh,Sinodes,Sielements,SiDsides,...
3 idata,toll,maxit,ptoll,pmaxit,verbose)
5 ## function [odata,nrm]=ThDDGOXeletiteration(imesh,Dsides,...
6 ## Simesh,Sinodes,Sielements,SiDsides,areaSi,SiPatch,...
7 ## idata,toll,maxit,ptoll,pmaxit,verbose)
10 global DDGOXNLPOISSON_LAP DDGOXNLPOISSON_MASS DDGOXNLPOISSON_RHS DDG_RHS DDG_MASS
16 RREpattern = URREcyclingpattern(RREnnit,RRErank,maxit);
29 %% Set list of nodes with Dirichlet BCs
30 Dnodes = Unodesonside(imesh,Dsides);
31 SiDnodes = Unodesonside(Simesh,SiDsides);
33 SiNelements = columns(Simesh.t);
41 fprintf(1,"*** start of inner iteration number: %d\n",ielet);
45 fprintf(1,"\t*** solving non linear poisson equation\n");
50 Fnshift = log(idata.ni) .* (1-Tn);
51 Fpshift = -log(idata.ni) .* (1-Tp);
53 [V(:,2),n(:,2),p(:,2)] = ThDDGOXnlpoisson (imesh,Dsides,Sinodes,SiDnodes,Sielements,...
55 n(:,1),p(:,1),Fn(:,1)+Fnshift,Fp(:,1)+Fpshift,D,...
56 idata.l2,idata.l2ox,ptoll,pmaxit,verbose-1);
58 V(Dnodes,2) = idata.V(Dnodes);
61 fprintf (1,"\t***\tupdating electron qfl\n");
67 mobn0 = idata.mobn0(imesh,Simesh,Sinodes,Sielements,odata);
68 mobp0 = idata.mobp0(imesh,Simesh,Sinodes,Sielements,odata);
69 mobn1 = idata.mobn1(imesh,Simesh,Sinodes,Sielements,odata);
70 mobp1 = idata.mobp1(imesh,Simesh,Sinodes,Sielements,odata);
72 n(:,3) = ThDDGOXelectron_driftdiffusion(Simesh,SiDnodes,n(:,2),p(:,2),...
73 V(Sinodes,2),Tn,mobn0,mobn1,...
74 idata.tn,idata.tp,idata.ni,idata.ni);
76 Fn(:,2)=V(Sinodes,2) - Tn .* log(n(:,3)) - Fnshift;
77 n(SiDnodes,3) = idata.n(SiDnodes);
78 Fn(SiDnodes,2) = idata.Fn(SiDnodes);
81 fprintf(1,"\t***\tupdating hole qfl\n");
84 p(:,3) = ThDDGOXhole_driftdiffusion(Simesh,SiDnodes,n(:,3),p(:,2),...
85 V(Sinodes,2),Tp,mobp0,mobp1,...
86 idata.tn,idata.tp,idata.ni,idata.ni);
88 Fp(:,2)= V(Sinodes,2) + Tp .* log(p(:,3)) - Fpshift;
89 p(SiDnodes,3) = idata.p(SiDnodes);
90 Fp(SiDnodes,2) = idata.Fp(SiDnodes);
92 ## store result for RRE
93 if RREpattern(ielet)>0
94 Fermistore(:,RREpattern(ielet)) = [Fn(:,2);Fp(:,2)];
95 if RREpattern(ielet+1)==0 % Apply RRE extrapolation
97 fprintf(1,"\n\t**********\n\tRRE EXTRAPOLATION STEP\n\t**********\n\n");
99 Fermi = Urrextrapolation(Fermistore);
100 Fn(:,2) = Fermi(1:rows(Fn));
101 Fp(:,2) = Fermi(rows(Fn)+1:end);
106 fprintf(1,"*** checking for convergence: ");
109 nrfn= norm (Fn(:,2)-Fn(:,1),inf);
110 nrfp= norm (Fp(:,2)-Fp(:,1),inf);
111 nrv = norm (V(:,2)-V(:,1),inf);
112 nrm(ielet) = max([nrfn;nrfp;nrv]);
117 %%title("max(|dV|,|dFn|,|dFp|)");
122 fprintf (1," max(|dFn|,|dFp|,|dV| )= %g\n\n",...
138 fprintf(1,"\n*** DD simulation over: # of electrical Gummel iterations = %d\n\n",ielet);
146 odata.Fn = Fn(:,end);
147 odata.Fp = Fp(:,end);