Update ChangeLog
[gss-tcad.git] / src / include / zonedata.h
blob1696bebfb206bab3008b9e23db39f67c24af244d
1 /*****************************************************************************/
2 /* 8888888 88888888 88888888 */
3 /* 8 8 8 */
4 /* 8 8 8 */
5 /* 8 88888888 88888888 */
6 /* 8 8888 8 8 */
7 /* 8 8 8 8 */
8 /* 888888 888888888 888888888 */
9 /* */
10 /* A Two-Dimensional General Purpose Semiconductor Simulator. */
11 /* */
12 /* GSS 0.4x */
13 /* Last update: Feb 26, 2007 */
14 /* */
15 /* Gong Ding */
16 /* gdiso@ustc.edu */
17 /* NINT, No.69 P.O.Box, Xi'an City, China */
18 /* */
19 /*****************************************************************************/
20 #ifndef _zonedata_h_
21 #define _zonedata_h_
22 #include "bzonedata.h"
23 #include "petscsnes.h"
24 #include "soldata.h"
25 #include "solverdef.h"
26 #include "bc.h"
28 //----------------------------------------------------------------
29 //The Vacuum zone,only used for EM solver
30 //----------------------------------------------------------------
31 class VacuumZone: public BZoneData
33 public:
34 VacuumData *fs;
35 VacuumAuxData *aux;
36 MatVacuum *mt;
37 int Init(ZONE*,double,PhysicalUnitScale *);
38 void report();
39 public:
40 VacuumZone() {mt=0; fs=0; aux=0;}
41 ~VacuumZone() {delete mt; delete [] fs; delete [] aux;}
45 //----------------------------------------------------------------
46 //The PML zone,only used for EM solver
47 //----------------------------------------------------------------
48 class PMLZone: public BZoneData
50 public:
51 PMLData *fs;
52 PMLAuxData *aux;
53 MatPML *mt;
54 int Init(ZONE*,double,PhysicalUnitScale *);
55 void report();
56 public:
57 PMLZone() {mt=0; fs=0; aux=0;}
58 ~PMLZone() {delete mt; delete [] fs; delete [] aux;}
61 //----------------------------------------------------------------
62 //an insulator zone
63 //----------------------------------------------------------------
64 class ISZone: public BZoneData
66 public:
67 MatInsulator *mt;
68 ISData *fs;
69 ISAuxData *aux;
70 vector<int> electrode;
71 public:
72 void F1_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
73 void F1_ddm_gatebc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
74 void F1_ddm_semiconductor_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, SMCZone *,int);
75 void F1_ddm_electrode_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, ElZone *,int);
76 void F1_ddm_insulator_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, ISZone *,int);
77 void F1_ddm_chargebc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
78 void F1_gate_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
79 void F1_charge_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
80 void J1_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
81 void J1_ddm_gatebc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
82 void J1_ddm_semiconductor_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
83 void J1_ddm_electrode_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
84 void J1_ddm_insulator_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
85 void J1_ddm_chargebc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
86 void J1_gate_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
87 void J1_charge_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &);
88 void F1_efield_update(PetscScalar *,vector<int> &, DABC &,vector<BZoneData *>);
90 void AC1_ddm_inner (int, PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &);
91 void AC1_ddm_gatebc(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &);
92 void AC1_ddm_chargebc(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &);
93 void AC1_ddm_semiconductor_insulator_interface(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, SMCZone *,int);
94 void AC1_ddm_electrode_insulator_interface(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, ElZone *,int);
95 void AC1_ddm_insulator_insulator_interface(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, ISZone *,int);
96 void AC1_gate_electrode(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &, DABC &, PetscScalar);
97 void AC1_charge_electrode(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &, DABC &);
98 void AC1_gate_electrode_current(int ,PetscScalar, PetscScalar *, Vec *, vector<int> &, DABC &, PetscScalar,PetscScalar &, PetscScalar &);
100 void F1_mix_ddm_gatebc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
101 void J1_mix_ddm_gatebc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
102 void F1_mix_gate_electrode_current(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
103 void F1_mix_gate_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
105 //--------------------------------------------------------------------------------------------------------
106 void F2_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
107 void F2_ddm_neumannbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
108 void F2_ddm_gatebc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
109 void F2_ddm_gatebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
110 void F2_ddm_chargebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
111 void F2_ddm_semiconductor_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
112 void F2_ddm_electrode_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
113 void F2_ddm_insulator_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
114 void F2_gate_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
115 void F2_charge_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
116 void J2_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
117 void J2_ddm_neumannbc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
118 void J2_ddm_gatebc_segment(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
119 void J2_ddm_gatebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
120 void J2_ddm_chargebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
121 void J2_ddm_semiconductor_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
122 void J2_ddm_electrode_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
123 void J2_ddm_insulator_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
124 void J2_gate_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
125 void J2_charge_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &);
126 void F2_efield_update(PetscScalar *,vector<int> &, DABC &,vector<BZoneData *>);
128 void F2_mix_ddm_gatebc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
129 void F2_mix_ddm_gatebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
130 void J2_mix_ddm_gatebc_segment(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
131 void J2_mix_ddm_gatebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
132 void F2_mix_gate_electrode_current(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
133 void F2_mix_gate_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
135 //--------------------------------------------------------------------------------------------------------
136 void F3_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
137 void F3_ddm_neumannbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
138 void F3_ddm_gatebc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
139 void F3_ddm_gatebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
140 void F3_ddm_chargebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
141 void F3_ddm_semiconductor_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
142 void F3_ddm_electrode_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
143 void F3_ddm_insulator_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
144 void F3_gate_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
145 void F3_charge_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
146 void J3_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
147 void J3_ddm_neumannbc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
148 void J3_ddm_gatebc_segment(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
149 void J3_ddm_gatebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
150 void J3_ddm_chargebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
151 void J3_ddm_semiconductor_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
152 void J3_ddm_electrode_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
153 void J3_ddm_insulator_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
154 void J3_gate_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
155 void J3_charge_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &);
156 void F3_efield_update(PetscScalar *,vector<int> &, DABC &,vector<BZoneData *>);
158 //--------------------------------------------------------------------------------------------------------
159 void F1Q_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
160 void F1Q_ddm_gatebc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
161 void F1Q_ddm_semiconductor_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, SMCZone *,int);
162 void F1Q_ddm_electrode_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, ElZone *,int);
163 void F1Q_ddm_insulator_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, ISZone *,int);
164 void F1Q_ddm_chargebc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
165 void F1Q_gate_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
166 void F1Q_charge_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
167 void J1Q_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
168 void J1Q_ddm_gatebc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
169 void J1Q_ddm_semiconductor_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
170 void J1Q_ddm_electrode_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ElZone *,int);
171 void J1Q_ddm_insulator_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
172 void J1Q_ddm_chargebc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
173 void J1Q_gate_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
174 void J1Q_charge_electrode(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &);
175 void F1Q_efield_update(PetscScalar *,vector<int> &, DABC &,vector<BZoneData *>);
177 //--------------------------------------------------------------------------------------------------------
178 public:
179 int import_solution(char *,char *,DABC &,PhysicalUnitScale *);
180 int export_solution(char *,char *,DABC &,PhysicalUnitScale *);
181 public:
182 int Init(ZONE*,double,PhysicalUnitScale *);
183 void report();
184 public:
185 ISZone() {mt=0; fs=0; aux=0;}
186 ~ISZone() {delete mt; delete [] fs; delete [] aux;}
190 //----------------------------------------------------------------
191 //an electrode zone
192 //----------------------------------------------------------------
193 class ElZone: public BZoneData
195 public:
196 ELData *fs;
197 ELAuxData *aux;
198 MatConductor *mt;
199 public:
200 vector<int> electrode;
201 public:
202 //--------------------------------------------------------------------------------------------------------
203 void F1_ddm_inner(int , PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & );
204 void F1_ddm_om_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,SMCZone *, int );
205 void F1_ddm_stk_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,SMCZone *, int );
206 void F1_ddm_gate_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,ISZone *, int );
207 void F1_ddm_charge_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,ISZone *, int );
208 void J1_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
209 void J1_ddm_om_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
210 void J1_ddm_stk_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
211 void J1_ddm_gate_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
212 void J1_ddm_charge_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
213 //--------------------------------------------------------------------------------------------------------
214 void AC1_ddm_inner (int, PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &);
215 void AC1_ddm_om_contact(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, SMCZone *,int);
216 void AC1_ddm_stk_contact(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, SMCZone *,int);
217 void AC1_ddm_gate_contact(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, ISZone *,int);
218 void AC1_ddm_charge_contact(int ,PetscScalar, PetscScalar *, Vec *, Mat *, vector<int> &,DABC &, ISZone *,int);
219 //--------------------------------------------------------------------------------------------------------
220 void F2_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
221 void F2_ddm_neumannbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
222 void F2_ddm_ombc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
223 void F2_ddm_stkbc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
224 void F2_ddm_gatebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
225 void F2_ddm_chargebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
226 void F2_ddm_elec_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
227 void J2_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
228 void J2_ddm_neumannbc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
229 void J2_ddm_ombc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
230 void J2_ddm_stkbc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
231 void J2_ddm_gatebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
232 void J2_ddm_chargebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ISZone *,int);
233 void J2_ddm_elec_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
234 //--------------------------------------------------------------------------------------------------------
235 void F3_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
236 void F3_ddm_neumannbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
237 void F3_ddm_ombc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
238 void F3_ddm_stkbc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
239 void F3_ddm_gatebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
240 void F3_ddm_chargebc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
241 void F3_ddm_elec_insulator_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
242 void J3_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
243 void J3_ddm_neumannbc(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &);
244 void J3_ddm_ombc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
245 void J3_ddm_stkbc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
246 void J3_ddm_gatebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
247 void J3_ddm_chargebc_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &,DABC &,ISZone *,int);
248 void J3_ddm_elec_insulator_interface(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
249 //--------------------------------------------------------------------------------------------------------
250 void F1Q_ddm_inner(int , PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & );
251 void F1Q_ddm_om_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,SMCZone *, int );
252 void F1Q_ddm_stk_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,SMCZone *, int );
253 void F1Q_ddm_gate_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,ISZone *, int );
254 void F1Q_ddm_charge_contact(int ,PetscScalar *,PetscScalar *, ODE_Formula &, vector<int> & , DABC &,ISZone *, int );
255 void J1Q_ddm_inner(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &);
256 void J1Q_ddm_om_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
257 void J1Q_ddm_stk_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
258 void J1Q_ddm_gate_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
259 void J1Q_ddm_charge_contact(int ,PetscScalar *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
260 public:
261 int import_solution(char *,char *,DABC &,PhysicalUnitScale *);
262 int export_solution(char *,char *,DABC &,PhysicalUnitScale *);
263 public:
264 int Init(ZONE*,double,PhysicalUnitScale *);
265 void report();
266 public:
267 ElZone() {mt=0; fs=0; aux=0;}
268 ~ElZone() {delete mt; delete [] fs; delete [] aux;}
272 //----------------------------------------------------------------
273 //the semiconductor zone
274 //----------------------------------------------------------------
275 class SMCZone: public BZoneData
277 public:
278 MatSemiconductor *mt;
279 SemiData *fs;
280 SemiAuxData *aux;
281 bool HighFieldMobility;
282 bool ImpactIonization;
283 bool BandBandTunneling;
284 bool Fermi;
285 bool IncompleteIonization;
286 bool QuantumMechanical;
287 bool EJModel;
288 bool pad1;
289 bool pad2;
290 int IIType;
291 double QNFactor;
292 double QPFactor;
295 public:
296 vector<int> electrode;
298 void F1E_Tri_ddm(Tri *,PetscScalar *,PetscScalar *, vector<int> &);
299 void F1E_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
300 void F1E_ddm_ombc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
301 void F1E_ddm_stkbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
302 void F1E_ddm_insulator_gate(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &);
303 void F1E_ddm_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
304 void F1E_ddm_homojunction(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
305 void F1E_ddm_heterojunction(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
306 void F1E_om_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
307 void F1E_stk_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
308 void F1E_ins_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
309 void J1E_Tri_ddm(Tri *,PetscScalar *,Mat *, vector<int> &);
310 void J1E_ddm_inner(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &);
311 void J1E_ddm_ombc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
312 void J1E_ddm_stkbc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
313 void J1E_ddm_insulator_gate(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &);
314 void J1E_ddm_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
315 void J1E_ddm_homojunction(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
316 void J1E_ddm_heterojunction(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
317 void J1E_om_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
318 void J1E_stk_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
319 void J1E_ins_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
320 void F1E_efield_update(PetscScalar *, vector<int> &, DABC &, vector<BZoneData *>);
321 void F1E_om_electrode_Trace(int , PetscScalar &, Vec &, Vec &, Vec &,Mat *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
322 void F1E_stk_electrode_Trace(int , PetscScalar &, Vec &, Vec &, Vec &,Mat *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
325 void AC1_ddm_inner(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &);
326 void AC1_ddm_ombc(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &);
327 void AC1_ddm_stkbc(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &);
328 void AC1_ddm_insulator_gate(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &);
329 void AC1_ddm_interface(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &,ISZone *,int);
330 void AC1_ddm_homojunction(int ,PetscScalar,PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &,SMCZone *,int);
331 void AC1_ddm_heterojunction(int ,PetscScalar,PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &,SMCZone *,int);
332 void AC1_om_electrode(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &, PetscScalar);
333 void AC1_stk_electrode(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &, PetscScalar);
334 void AC1_ins_electrode(int, PetscScalar, PetscScalar *, Mat *, Vec *, Mat *, vector<int> &, DABC &, PetscScalar);
335 void AC1_om_electrode_current(int, PetscScalar, PetscScalar *,Vec *, Mat *, vector<int> &, DABC &, PetscScalar, PetscScalar &, PetscScalar &);
336 void AC1_stk_electrode_current(int, PetscScalar, PetscScalar *,Vec *, Mat *, vector<int> &, DABC &, PetscScalar, PetscScalar &, PetscScalar &);
337 void AC1_ins_electrode_current(int, PetscScalar, PetscScalar *,Vec *, Mat *, vector<int> &, DABC &, PetscScalar, PetscScalar &, PetscScalar &);
340 void F1E_mix_ddm_ombc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
341 void F1E_mix_ddm_stkbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
342 void F1E_mix_ddm_insulator_gate(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &);
343 void J1E_mix_ddm_ombc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
344 void J1E_mix_ddm_stkbc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
345 void J1E_mix_ddm_insulator_gate(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &);
346 void F1E_mix_om_electrode_current (int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
347 void F1E_mix_stk_electrode_current(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
348 void F1E_mix_ins_electrode_current(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
349 void F1E_mix_om_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
350 void F1E_mix_stk_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
351 void F1E_mix_ins_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
353 void F2E_Tri_ddm(Tri *,PetscScalar *,PetscScalar *, vector<int> &);
354 void F2E_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
355 void F2E_ddm_neumannbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
356 void F2E_ddm_ombc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
357 void F2E_ddm_ombc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
358 void F2E_ddm_stkbc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
359 void F2E_ddm_stkbc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
360 void F2E_ddm_insulator_gate(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &);
361 void F2E_ddm_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
362 void F2E_ddm_homojunction(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
363 void F2E_ddm_heterojunction(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
364 void F2E_om_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
365 void F2E_stk_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
366 void F2E_ins_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
367 void J2E_Tri_ddm(Tri *,PetscScalar *,Mat *, vector<int> &);
368 void J2E_ddm_inner(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &);
369 void J2E_ddm_neumannbc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
370 void J2E_ddm_ombc_segment(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
371 void J2E_ddm_ombc_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
372 void J2E_ddm_stkbc_segment(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
373 void J2E_ddm_stkbc_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
374 void J2E_ddm_insulator_gate(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &);
375 void J2E_ddm_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
376 void J2E_ddm_homojunction(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
377 void J2E_ddm_heterojunction(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
378 void J2E_om_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
379 void J2E_stk_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
380 void J2E_ins_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
381 void F2E_efield_update(PetscScalar *, vector<int> &, DABC &, vector<BZoneData *>);
382 void F2E_om_electrode_Trace(int , PetscScalar &, Vec &, Vec &, Vec &,Mat *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
383 void F2E_stk_electrode_Trace(int , PetscScalar &, Vec &, Vec &, Vec &,Mat *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
385 void F2E_mix_ddm_ombc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
386 void F2E_mix_ddm_ombc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
387 void F2E_mix_ddm_stkbc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
388 void F2E_mix_ddm_stkbc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
389 void F2E_mix_ddm_insulator_gate(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &);
390 void J2E_mix_ddm_ombc_segment(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
391 void J2E_mix_ddm_ombc_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
392 void J2E_mix_ddm_stkbc_segment(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
393 void J2E_mix_ddm_stkbc_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
394 void J2E_mix_ddm_insulator_gate(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &);
395 void F2E_mix_om_electrode_current (int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
396 void F2E_mix_stk_electrode_current(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
397 void F2E_mix_ins_electrode_current(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
398 void F2E_mix_om_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
399 void F2E_mix_stk_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
400 void F2E_mix_ins_electrode_Load(int , double &, PetscScalar &, Vec &, Vec &, PetscScalar *,Mat *, ODE_Formula &, vector<int> &, DABC &,PetscScalar);
403 void F3E_Tri_ddm(Tri *,PetscScalar *,PetscScalar *, vector<int> &);
404 void J3E_Tri_ddm(Tri *,PetscScalar *,Mat *, vector<int> &);
405 void F3E_ddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
406 void F3E_ddm_neumannbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
407 void F3E_ddm_ombc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
408 void F3E_ddm_ombc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
409 void F3E_ddm_stkbc_segment(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
410 void F3E_ddm_stkbc_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
411 void F3E_ddm_insulator_gate(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &);
412 void F3E_ddm_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
413 void F3E_ddm_homojunction(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
414 //void F3E_ddm_heterojunction(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
415 void F3E_om_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
416 void F3E_stk_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
417 void F3E_ins_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
418 void J3E_ddm_inner(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &);
419 void J3E_ddm_neumannbc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
420 void J3E_ddm_ombc_segment(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
421 void J3E_ddm_ombc_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
422 void J3E_ddm_stkbc_segment(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
423 void J3E_ddm_stkbc_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &,ElZone *,int);
424 void J3E_ddm_insulator_gate(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &);
425 void J3E_ddm_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
426 void J3E_ddm_homojunction(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,SMCZone *,int);
427 void J3E_om_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
428 void J3E_stk_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
429 void J3E_ins_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
430 void F3E_efield_update(PetscScalar *, vector<int> &, DABC &, vector<BZoneData *>);
432 void F1Q_Tri_qddm(Tri *,PetscScalar *,PetscScalar *, vector<int> &);
433 void F1Q_qddm_inner(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &);
434 void F1Q_qddm_ombc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
435 void F1Q_qddm_stkbc(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &,DABC &);
436 void F1Q_qddm_insulator_gate(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &);
437 void F1Q_qddm_interface(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
438 void F1Q_om_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
439 void F1Q_stk_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
440 void F1Q_ins_electrode(int ,PetscScalar *,PetscScalar *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
441 void J1Q_Tri_qddm(Tri *,PetscScalar *,Mat *, vector<int> &);
442 void J1Q_qddm_inner(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &);
443 void J1Q_qddm_ombc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
444 void J1Q_qddm_stkbc(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &,DABC &);
445 void J1Q_qddm_insulator_gate(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &);
446 void J1Q_qddm_interface(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &,ISZone *,int);
447 void J1Q_om_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
448 void J1Q_stk_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
449 void J1Q_ins_electrode(int ,PetscScalar *,Mat *,Mat *,ODE_Formula &, vector<int> &, DABC &, PetscScalar);
450 void F1Q_efield_update(PetscScalar *, vector<int> &, DABC &, vector<BZoneData *>);
451 public:
452 int import_doping(char *, PhysicalUnitScale *);
453 int export_doping(char *, PhysicalUnitScale *);
454 int import_mole(char *,int);
455 int export_mole(char *,int);
456 int import_solution(char *, char *, DABC &, PhysicalUnitScale *);
457 int export_solution(char *, char *, DABC &, PhysicalUnitScale *);
458 public:
459 int Init(ZONE*,double, PhysicalUnitScale *);
460 void report();
461 public:
462 SMCZone()
464 mt=0;
465 fs=0;
466 aux=0;
468 ~SMCZone()
470 delete mt;
471 delete [] fs;
472 delete [] aux;
478 #endif