]> Creatis software - CreaPhase.git/blob - octave_packages/secs2d-0.0.8/ThDDGOX/ThDDGOXeletiteration.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / secs2d-0.0.8 / ThDDGOX / ThDDGOXeletiteration.m
1 function [odata,nrm]=ThDDGOXeletiteration(imesh,Dsides,...
2                                           Simesh,Sinodes,Sielements,SiDsides,...
3                                           idata,toll,maxit,ptoll,pmaxit,verbose)
4   
5   ## function [odata,nrm]=ThDDGOXeletiteration(imesh,Dsides,...
6   ##                                           Simesh,Sinodes,Sielements,SiDsides,areaSi,SiPatch,...
7   ##                                           idata,toll,maxit,ptoll,pmaxit,verbose)
8   
9   
10   global DDGOXNLPOISSON_LAP DDGOXNLPOISSON_MASS DDGOXNLPOISSON_RHS DDG_RHS DDG_MASS
11   
12   %%%%%%%%%%%%%%%
13   %% RRE param %%
14   RREnnit      = [1,2];
15   RRErank      = 7;  
16   RREpattern   = URREcyclingpattern(RREnnit,RRErank,maxit);
17   %%%%%%%%%%%%%%%
18
19   odata   = idata;
20   V(:,1)  = idata.V;
21   Fn(:,1) = idata.Fn;
22   Fp(:,1) = idata.Fp;
23   n(:,1)  = idata.n;
24   p(:,1)  = idata.p;
25   Tl      = idata.Tl;
26   Tn      = idata.Tn;
27   Tp      = idata.Tp;
28   
29   %% Set list of nodes with Dirichlet BCs
30   Dnodes   = Unodesonside(imesh,Dsides);
31   SiDnodes = Unodesonside(Simesh,SiDsides);
32
33   SiNelements  = columns(Simesh.t);
34   D            = idata.D;
35   
36   nrm          = 1;
37
38   for ielet=1:maxit
39
40     if (verbose>=1)
41       fprintf(1,"*** start of inner iteration number: %d\n",ielet);
42     end
43     
44     if (verbose>=1)
45       fprintf(1,"\t*** solving non linear poisson equation\n");
46     end
47     
48     
49
50     Fnshift =  log(idata.ni) .* (1-Tn);
51     Fpshift = -log(idata.ni) .* (1-Tp);
52     
53     [V(:,2),n(:,2),p(:,2)] = ThDDGOXnlpoisson (imesh,Dsides,Sinodes,SiDnodes,Sielements,...
54                                                V(:,1),Tn,Tp,...
55                                                n(:,1),p(:,1),Fn(:,1)+Fnshift,Fp(:,1)+Fpshift,D,...
56                                                idata.l2,idata.l2ox,ptoll,pmaxit,verbose-1);
57     
58     V(Dnodes,2) = idata.V(Dnodes);
59     
60     if (verbose>=1)
61       fprintf (1,"\t***\tupdating electron qfl\n");
62     end
63     
64     odata.V = V(:,2);
65     odata.n = n(:,2);
66     odata.p = p(:,2);
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);
71
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);
75     
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);
79     
80     if (verbose>=1)
81       fprintf(1,"\t***\tupdating hole qfl\n");
82     end
83     
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);
87     
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);
91     
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
96         if (verbose>=1)         
97           fprintf(1,"\n\t**********\n\tRRE EXTRAPOLATION STEP\n\t**********\n\n");
98         end
99         Fermi = Urrextrapolation(Fermistore);
100         Fn(:,2) = Fermi(1:rows(Fn));
101         Fp(:,2) = Fermi(rows(Fn)+1:end);
102     end
103   end
104   
105   if (verbose>=1)
106     fprintf(1,"*** checking for convergence: ");
107   end
108   
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]);
113   
114   if (verbose>=1)
115     subplot(1,3,3);
116     semilogy(nrm)
117     %%title("max(|dV|,|dFn|,|dFp|)");
118     pause(.1)
119   end
120   
121   if (verbose>=1)
122     fprintf (1," max(|dFn|,|dFp|,|dV| )= %g\n\n",...
123              nrm(ielet));
124   end
125   if (nrm(ielet)<toll)
126     break
127   end
128   
129   V(:,1) = V(:,2);
130   n(:,1) = n(:,3);
131   p(:,1) = p(:,3);
132   Fn(:,1)= Fn(:,2);
133   Fp(:,1)= Fp(:,2);
134   
135 end
136
137 if (verbose>0)
138   fprintf(1,"\n*** DD simulation over: # of electrical Gummel iterations = %d\n\n",ielet);
139 end
140
141 odata = idata;
142
143 odata.n    = n(:,end);
144 odata.p    = p(:,end);
145 odata.V    = V(:,end);
146 odata.Fn   = Fn(:,end);
147 odata.Fp   = Fp(:,end);