]> Creatis software - CreaPhase.git/blob - octave_packages/secs2d-0.0.8/ThDDGOX/ThDDGOXthermaliteration.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / secs2d-0.0.8 / ThDDGOX / ThDDGOXthermaliteration.m
1 function [thermdata,nrm] = ThDDGOXthermaliteration(imesh,Dsides,...
2                                                    Simesh,Sinodes,Sielements,...
3                                                    SiDsides,thermdata,toll,...
4                                                    maxit,verbose)
5   
6
7   %%  [thermdata,innrm] = ThDDGOXthermaliteration(imesh,Dsides,...
8   %%                                              Simesh,Sinodes,Sielements,...
9   %%                                              SiDsides,thermdata,toll,...
10   %%                                              maxit,verbose)
11
12   %%%%%%%%%%%%%%%
13   %% RRE param %%
14   RREnnit      = [10,2];
15   RRErank      = maxit;  
16   RREpattern   = URREcyclingpattern(RREnnit,RRErank,maxit);
17   %%%%%%%%%%%%%%%
18
19   %% Set list of nodes with Dirichlet BCs
20   Dnodes = Unodesonside(imesh,Dsides);
21   SiDnodes = Unodesonside(Simesh,SiDsides);
22
23   Tl  = thermdata.Tl;
24   Tn  = thermdata.Tn;
25   Tp  = thermdata.Tp;
26   
27   tldampcoef = 1;
28   tndampcoef = 10;
29   tpdampcoef = 10;
30   
31   mobn0 = thermdata.mobn0(imesh,Simesh,Sinodes,Sielements,thermdata);
32   mobp0 = thermdata.mobp0(imesh,Simesh,Sinodes,Sielements,thermdata);
33   mobn1 = thermdata.mobn1(imesh,Simesh,Sinodes,Sielements,thermdata);
34   mobp1 = thermdata.mobp1(imesh,Simesh,Sinodes,Sielements,thermdata);
35   twn0  = thermdata.twn0 (imesh,Simesh,Sinodes,Sielements,thermdata);
36   twp0  = thermdata.twp0 (imesh,Simesh,Sinodes,Sielements,thermdata);
37   twn1  = thermdata.twn1 (imesh,Simesh,Sinodes,Sielements,thermdata);
38   twp1  = thermdata.twp1 (imesh,Simesh,Sinodes,Sielements,thermdata);
39   [Ex,Ey] = Updegrad(Simesh,-thermdata.V(Sinodes));
40   E =  [Ex;Ey];  
41
42   [jnx,jny] = Ufvsgcurrent3(Simesh,thermdata.n,...
43                             mobn0,mobn1,Tn,thermdata.V(Sinodes)-Tn);
44   [jpx,jpy] = Ufvsgcurrent3(Simesh,thermdata.p,...
45                             -mobp0,mobp1,Tp,-thermdata.V(Sinodes)-Tp);
46
47   Jn = [jnx;jny];
48   Jp = [jpx;jpy];
49   
50   for ith=1:maxit
51     
52     if (verbose>=1)
53       fprintf(1,"*** start of inner iteration number: %d\n",ith);
54     end
55
56     if (verbose>=1)
57       fprintf(1,'\t***updating electron temperature\n');
58     end
59     
60     Tn =  ThDDGOXupdateelectron_temp(Simesh,SiDnodes,thermdata.Tn,...
61                                      thermdata.n,thermdata.p,...
62                                      thermdata.Tl,Jn,E,mobn0,...
63                                      twn0,twn1,thermdata.tn,thermdata.tp,...
64                                      thermdata.ni,thermdata.ni);
65
66     ##Tn(Tn<thermdata.Tl) = thermdata.Tl(Tn<thermdata.Tl);
67     
68     dtn     = norm(Tn-thermdata.Tn,inf);
69     if (dtn>0) 
70       tndampfact_n = log(1+tndampcoef*dtn)/(tndampcoef*dtn);
71       Tn  = tndampfact_n * Tn + (1-tndampfact_n) * thermdata.Tn;
72     end
73     
74     if (verbose>=1)
75       fprintf(1,'\t***updating hole temperature\n');
76     end
77     
78
79     Tp = ThDDGOXupdatehole_temp(Simesh,SiDnodes,thermdata.Tp,...
80                                 thermdata.n,thermdata.p,...
81                                 thermdata.Tl,Jp,E,mobp0,...
82                                 twp0,twp1,thermdata.tn,thermdata.tp,...
83                                 thermdata.ni,thermdata.ni);
84
85     ##Tp(Tp<thermdata.Tl) = thermdata.Tl(Tp<thermdata.Tl);
86
87     dtp     = norm(Tp-thermdata.Tp,inf);
88     if (dtp>0) 
89       tpdampfact_p = log(1+tpdampcoef*dtp)/(tpdampcoef*dtp);
90       Tp  = tpdampfact_p * Tp + (1-tpdampfact_p) * thermdata.Tp;
91     end
92     
93     if (verbose>=1)
94       fprintf(1,'\t***updating lattice temperature\n');
95     end
96     
97     ## store result for RRE
98     if RREpattern(ith)>0
99       TEMPstore(:,RREpattern(ith)) = [Tn;Tp;Tl];
100       if RREpattern(ith+1)==0 % Apply RRE extrapolation
101         if (verbose>=1)         
102           fprintf(1,"\n\t**********\n\tRRE EXTRAPOLATION STEP\n\t**********\n\n");
103         end
104         TEMP = Urrextrapolation(TEMPstore);
105         Tn = TEMP(1:rows(Tn));
106         Tp = TEMP(rows(Tn)+1:rows(Tn)+rows(Tp));
107         Tl = TEMP(rows(Tn)+rows(Tp)+1:end);
108     end
109   end
110
111   Tl = ThDDGOXupdatelattice_temp(Simesh,SiDnodes,thermdata.Tl,...
112                                  Tn,Tp,thermdata.n,...
113                                  thermdata.p,thermdata.kappa,thermdata.Egap,...
114                                  thermdata.tn,thermdata.tp,twn0,...
115                                  twp0,twn1,twp1,...
116                                  thermdata.ni,thermdata.ni);
117   
118   ##Tl(Tl<thermdata.Tl) = thermdata.Tl(Tl<thermdata.Tl);
119
120   dtl = norm(Tl-thermdata.Tl,inf);
121   if (dtl > 0)
122     tldampfact = log(1+tldampcoef*dtl)/(tldampcoef*dtl);
123     Tl    = tldampfact * Tl + (1-tldampfact) * thermdata.Tl; 
124   end
125   
126   
127   if (verbose>=1)
128     fprintf(1,"\t*** checking for convergence:\n ");
129   end
130   
131   nrm(ith) = max([dtl,dtn,dtp]);        
132   
133   if (verbose>=1)
134     fprintf (1,"\t\t|dTL|= %g\n",dtl);
135     fprintf (1,"\t\t|dTn|= %g\n",dtn);
136     fprintf (1,"\t\t|dTp|= %g\n",dtp);
137   end
138   
139   thermdata.Tl = Tl;
140   thermdata.Tn = Tn;
141   thermdata.Tp = Tp;
142   if (verbose>1)
143     subplot(1,3,2);
144     title("max(|dTl|,|dTn|,|dTn|)")
145     semilogy(nrm)
146     pause(.1)
147   end
148   if nrm(ith)< toll
149     if (verbose>=1)
150       fprintf(1,"\n***\n***\texit from thermal iteration \n");
151     end
152     
153     break
154   end
155   
156 end