Xyce
6.1
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
N_DEV_MaterialLayer.C
Go to the documentation of this file.
1
//-----------------------------------------------------------------------------
2
// Copyright Notice
3
//
4
// Copyright (c) 2002, 2013, Sandia Corporation, Albuquerque, NM, USA. Under the
5
// terms of Contract DE-AC04-94AL85000, there is a non-exclusive license for
6
// use of this work by or on behalf of the U.S. Government. Export of this
7
// program may require a license from the United States Government.
8
//-----------------------------------------------------------------------------
9
10
//----------------------------------------------------------------------------
11
// Filename : $RCSfile: N_DEV_MaterialLayer.C,v $
12
//
13
// Purpose :
14
//
15
// Special Notes :
16
//
17
// Creator : Eric R. Keiter, SNL
18
//
19
// Creation Date : 07/01/11
20
//
21
// Revision Information:
22
// ---------------------
23
//
24
// Revision Number: $Revision: 1.6 $
25
//
26
// Revision Date : $Date: 2014/04/30 23:55:34 $
27
//
28
// Current Owner : $Author: erkeite $
29
//----------------------------------------------------------------------------
30
#include <Xyce_config.h>
31
32
#include <
N_DEV_MaterialLayer.h
>
33
#include <
N_DEV_Const.h
>
34
35
#include <N_UTL_Misc.h>
36
37
namespace
Xyce {
38
namespace
Device {
39
40
template
<>
41
ParametricData<MaterialLayer>::ParametricData
()
42
{
43
// Set up map for double precision variables:
44
addPar (
"DIEL"
, 13.1, &
MaterialLayer::diel
)
45
.setGivenMember(&
MaterialLayer::dielGiven
);
46
//
47
addPar (
"CON"
, 1.422482, &
MaterialLayer::Ec
)
48
.setGivenMember(&
MaterialLayer::EcGiven
);
49
50
addPar (
"VAL"
, 0.0, &
MaterialLayer::Ev
)
51
.setGivenMember(&
MaterialLayer::EvGiven
);
52
53
addPar (
"NDOPE"
, 0.0, &
MaterialLayer::Cdonor
)
54
.setGivenMember(&
MaterialLayer::CdonorGiven
);
55
56
addPar (
"PDOPE"
, 5.0e+19, &
MaterialLayer::Cacceptor
)
57
.setGivenMember(&
MaterialLayer::CacceptorGiven
);
58
59
////////
60
addPar (
"NARCO"
, 0.047, &
MaterialLayer::narco
)
61
.setGivenMember(&
MaterialLayer::narcoGiven
);
62
63
addPar (
"NARVA"
, 0.047, &
MaterialLayer::narva
)
64
.setGivenMember(&
MaterialLayer::narvaGiven
);
65
66
//////
67
addPar (
"EMASS"
, 0.067, &
MaterialLayer::emass
)
68
.setGivenMember(&
MaterialLayer::emassGiven
);
69
70
addPar (
"HMASS"
, 0.5, &
MaterialLayer::hmass
)
71
.setGivenMember(&
MaterialLayer::hmassGiven
);
72
73
/////
74
addPar (
"ELMOB0"
, 2240.0, &
MaterialLayer::elmob0
)
75
.setGivenMember(&
MaterialLayer::elmob0Given
);
76
77
addPar (
"HOMOB0"
, 30.0, &
MaterialLayer::homob0
)
78
.setGivenMember(&
MaterialLayer::homob0Given
);
79
80
/////
81
addPar (
"ELVSAT"
, 7.7e+6, &
MaterialLayer::elvsat
)
82
.setGivenMember(&
MaterialLayer::elvsatGiven
);
83
84
addPar (
"HOVSAT"
, 7.7e+6, &
MaterialLayer::hovsat
)
85
.setGivenMember(&
MaterialLayer::hovsatGiven
);
86
87
addPar (
"NI"
, 1.79e+6, &
MaterialLayer::Ni
)
88
.setGivenMember(&
MaterialLayer::NiGiven
);
89
90
addPar (
"WIDTH"
, 1.0e-6, &
MaterialLayer::width
)
91
.setGivenMember(&
MaterialLayer::widthGiven
);
92
93
addPar (
"GRADEDWIDTH"
, 0.0, &
MaterialLayer::gradedLayerWidth
)
94
.setGivenMember(&
MaterialLayer::gradedLayerWidthGiven
),
95
96
// non-doubles
97
addPar (
"MATERIAL"
,
"GAAS"
, &
MaterialLayer::material
)
98
.setGivenMember(&
MaterialLayer::materialGiven
);
99
100
addPar (
"NAME"
,
"EMITTER"
, &
MaterialLayer::name
)
101
.setGivenMember(&
MaterialLayer::nameGiven
);
102
103
addPar (
"NX"
, 25, &
MaterialLayer::NX
)
104
.setGivenMember(&
MaterialLayer::NXGiven
);
105
106
}
107
108
ParametricData<MaterialLayer>
&
MaterialLayer::getParametricData
() {
109
static
ParametricData<MaterialLayer>
parMap;
110
111
return
parMap;
112
}
113
114
template
<
typename
ScalarT> ScalarT
Xycemax
( ScalarT f1, ScalarT f2) {
return
f1 > f2 ? f1 : f2; }
115
template
<
typename
ScalarT> ScalarT
Xycemin
( ScalarT f1, ScalarT f2) {
return
f1 < f2 ? f1 : f2; }
116
117
// Class MaterialLayer
118
//-----------------------------------------------------------------------------
119
// Function : MaterialLayer
120
// Purpose :
121
// Special Notes :
122
// Scope : public
123
// Creator : Eric Keiter, SNL
124
// Creation Date : 07/01/11
125
//-----------------------------------------------------------------------------
126
MaterialLayer::MaterialLayer
(std::string materialName)
127
:
CompositeParam
(getParametricData()),
128
material(materialName),
129
materialGiven(false),
130
name(
"EMITTER"
),
131
nameGiven(false),
132
NX(25),
133
NXGiven(false),
134
LX(24),
135
begin(0),
// beginning mesh point
136
end(25),
// end mesh point (+1)
137
diel(13.1),
// dielectric constant
138
dielGiven(false),
// dielectric constant given flag
139
140
Ec(1.422482),
// conduction band edge
141
EcGiven(false),
// conduction band edge given flag
142
Ev(0),
// valance band edge
143
EvGiven(false),
// valance band edge given flag
144
EcEff(1.375482),
// conduction band edge, including BGN
145
EvEff(0.047),
// valance band edge, including BGN
146
bg(1.422482),
// bandgap
147
bgEff(1.328482),
// effective bandgap (including band-gap narrowing, bgn)
148
Cdonor(0.0),
// n doping concentration
149
CdonorGiven(false),
// n doping concentration given flag
150
Cacceptor(5.00E+19),
// p doping concentration
151
CacceptorGiven(false),
// p doping concentration given flag
152
153
narco(0.047),
// band gap narrowing of conduction band
154
narcoGiven(false),
// band gap narrowing of conduction band given flag
155
narva(0.047),
// band gap narrowing of valence band
156
narvaGiven(false),
// band gap narrowing of valence band given flag
157
dnco(0.01734),
// conduction band density of states multiplier ((md*/mo)^3/2
158
dnva(0.4318),
// valence band density of states multiplier ((md*/mo)^3/2
159
Nc(4.35195e+17),
// conduction band DOS
160
Nv(9.37726e+18),
// valance band DOS
161
emass(0.067),
// electron DOS effective mass
162
emassGiven(false),
// electron DOS effective mass given flag
163
hmass(0.5),
// hole DOS effective mass
164
hmassGiven(false),
// hole DOS effective mass given flag
165
elmob0(2240),
// zero field mobility for electrons (cm2/Vs)
166
elmob0Given(false),
// zero field mobility for electrons (cm2/Vs) given flag
167
168
elvsat (7.70E+06),
// saturation velocity for electrons (cm/s)
169
elvsatGiven (false),
// saturation velocity for electrons (cm/s) given flag
170
eleo(4000),
// Eo(V/cm) in mobility field dependence
171
homob0 (30),
// zero field mobility for holes (cm2/Vs)
172
homob0Given(false),
// zero field mobility for holes (cm2/Vs) given flag
173
hovsat (7.70E+06),
// saturation velocity for holes (cm/s)
174
hovsatGiven (false),
// saturation velocity for holes (cm/s) given flag
175
176
dir(1.00E-10),
// direct recombination rate coefficient (cm3/s)
177
augnpp(1.00E-30),
// Auger recombination rate coefficient for npp (cm3/s)
178
augpnn(1.00E-30),
// Auger recombination rate coefficient for pnn (cm3/s)
179
srh(0),
// SRH rate coeff (inverse lifetime)
180
srhdet(0),
// energy shift from midgap for SRH
181
Ni(1.79e+6),
182
NiGiven(false),
183
NiEff(1.79e+6),
// Ni including BGN
184
width(1.0e-5),
185
widthGiven(false),
186
gradedLayerWidth(0.0),
187
gradedLayerWidthGiven(false),
188
temperature(
CONSTREFTEMP
)
189
{
190
if
(
NXGiven
)
191
{
192
end
=
begin
+
NX
;
193
}
194
195
processParams
();
196
}
197
198
//-----------------------------------------------------------------------------
199
// Function : MaterialLayer::processParams
200
// Purpose :
201
// Special Notes :
202
// Scope : public
203
// Creator : Eric Keiter, SNL
204
// Creation Date : 02/28/12
205
//-----------------------------------------------------------------------------
206
void
MaterialLayer::processParams
()
207
{
208
// set some material parameters to appropriate values
209
if
(
true
)
210
{
211
ExtendedString tmpMat =
material
;
212
tmpMat.toUpper ();
213
214
if
(!
emassGiven
) {
emass
=
MaterialSupport::get_DOS_EffectiveMassN
(tmpMat); }
215
if
(!
hmassGiven
) {
hmass
=
MaterialSupport::get_DOS_EffectiveMassP
(tmpMat); }
216
217
#if 0
218
std::cout <<
"emass = "
<<
emass
<<std::endl;;
219
std::cout <<
"hmass = "
<<
hmass
<<std::endl;;
220
#endif
221
222
dnco
= pow(
emass
,1.5);
223
dnva
= pow(
hmass
,1.5);
224
#if 0
225
std::cout <<
"new dnco = emass^(1.5) for "
<< tmpMat <<
" = "
<<
dnco
<<std::endl;
226
std::cout <<
"new dnva = hmass^(1.5) for "
<< tmpMat <<
" = "
<<
dnva
<<std::endl;
227
#endif
228
229
Nc
=
MaterialSupport::getNc
(tmpMat,
temperature
);
230
Nv
=
MaterialSupport::getNv
(tmpMat,
temperature
);
231
232
if
(tmpMat ==
"GAAS"
)
233
{
234
if
(!
dielGiven
) {
diel
= 13.1;}
235
if
(!
elmob0Given
) {
elmob0
= 2240;}
236
if
(!
homob0Given
) {
homob0
= 30;}
237
if
(!
NiGiven
) {
Ni
= 1.79e+6; }
238
if
(!
EcGiven
) {
Ec
= 1.422482;}
239
if
(!
EvGiven
) {
Ev
= 0;}
240
if
(!
elvsatGiven
) {
elvsat
= 7.7e+6;}
241
if
(!
hovsatGiven
) {
hovsat
= 7.7e+6;}
242
//dnco= 0.01734;
243
//dnva= 0.4318;
244
#if 0
245
std::cout <<
"actual dnco for "
<< tmpMat <<
" = "
<<
dnco
<<std::endl;
246
std::cout <<
"actual dnva for "
<< tmpMat <<
" = "
<<
dnva
<<std::endl;
247
#endif
248
if
(!
narcoGiven
) {
narco
= 0.047;}
249
if
(!
narvaGiven
) {
narva
= 0.047;}
250
if
(!
CdonorGiven
) {
Cdonor
= 0.0;}
251
if
(!
CacceptorGiven
) {
Cacceptor
= 5.0e+19;}
252
}
253
else
if
(tmpMat ==
"INGAP"
)
254
{
255
if
(!
dielGiven
) {
diel
=11.8;}
256
if
(!
elmob0Given
) {
elmob0
= 850;}
257
if
(!
homob0Given
) {
homob0
= 30;}
258
if
(!
NiGiven
) {
Ni
= 1.2e+3;}
259
if
(!
EcGiven
) {
Ec
= 1.45248;}
260
if
(!
EvGiven
) {
Ev
= -0.4085;}
261
if
(!
elvsatGiven
) {
elvsat
= 7.7e+6;}
262
if
(!
hovsatGiven
) {
hovsat
= 7.7e+6;}
263
//dnco = 0.02391; // testing.
264
//dnva = 0.5423;
265
#if 0
266
std::cout <<
"actual dnco for "
<< tmpMat <<
" = "
<<
dnco
<<std::endl;
267
std::cout <<
"actual dnva for "
<< tmpMat <<
" = "
<<
dnva
<<std::endl;
268
#endif
269
if
(!
narcoGiven
) {
narco
= 0.013;}
270
if
(!
narvaGiven
) {
narva
= 0.013;}
271
if
(!
CdonorGiven
) {
Cdonor
= 5.0e+17;}
272
if
(!
CacceptorGiven
) {
Cacceptor
= 0.0;}
273
}
274
else
if
(tmpMat ==
"ALGAAS"
)
275
{
276
if
(!
dielGiven
) {
diel
=12.95;}
277
if
(!
elmob0Given
) {
elmob0
= 600;}
278
if
(!
homob0Given
) {
homob0
= 80;}
279
if
(!
NiGiven
) {
Ni
= 2.1e+3;}
280
if
(!
EcGiven
) {
Ec
= 1.45248;}
281
if
(!
EvGiven
) {
Ev
= -0.4085;}
282
if
(!
elvsatGiven
) {
elvsat
= 7.7e+6;}
283
if
(!
hovsatGiven
) {
hovsat
= 7.7e+6;}
284
if
(!
narcoGiven
) {
narco
= 0.010;}
285
if
(!
narvaGiven
) {
narva
= 0.010;}
286
if
(!
CdonorGiven
) {
Cdonor
= 0.0;}
287
if
(!
CacceptorGiven
) {
Cacceptor
= 5.0e+17;}
288
}
289
else
if
(tmpMat ==
"INALAS"
)
290
{
291
if
(!
dielGiven
) {
diel
= 12.5;}
292
if
(!
elmob0Given
) {
elmob0
= 1000;}
293
if
(!
homob0Given
) {
homob0
= 30;}
294
if
(!
NiGiven
) {
Ni
= 1.79e+6; }
295
if
(!
EcGiven
) {
Ec
= 1.46;}
296
if
(!
EvGiven
) {
Ev
= 0;}
297
if
(!
elvsatGiven
) {
elvsat
= 4.7e+6;}
298
if
(!
hovsatGiven
) {
hovsat
= 3.0e+6;}
299
if
(!
narcoGiven
) {
narco
= 0.0;}
300
if
(!
narvaGiven
) {
narva
= 0.0;}
301
if
(!
CdonorGiven
) {
Cdonor
= 0.0;}
302
if
(!
CacceptorGiven
) {
Cacceptor
= 5.0e+19;}
303
}
304
else
if
(tmpMat ==
"INGAAS"
)
305
{
306
if
(!
dielGiven
) {
diel
= 14;}
307
if
(!
elmob0Given
) {
elmob0
= 3000;}
308
if
(!
homob0Given
) {
homob0
= 76;}
309
if
(!
NiGiven
) {
Ni
= 1.79e+6; }
310
if
(!
EcGiven
) {
Ec
= 0.96;}
311
if
(!
EvGiven
) {
Ev
= 0.21;}
312
if
(!
elvsatGiven
) {
elvsat
= 8.4e+6;}
313
if
(!
hovsatGiven
) {
hovsat
= 4.8e+6;}
314
if
(!
narcoGiven
) {
narco
= 0.06;}
315
if
(!
narvaGiven
) {
narva
= 0.06;}
316
if
(!
CdonorGiven
) {
Cdonor
= 0.0;}
317
if
(!
CacceptorGiven
) {
Cacceptor
= 5.0e+19;}
318
}
319
else
if
(tmpMat ==
"INGAASP"
)
320
{
321
if
(!
dielGiven
) {
diel
= 14;}
322
if
(!
elmob0Given
) {
elmob0
= 3500;}
323
if
(!
homob0Given
) {
homob0
= 50;}
324
if
(!
NiGiven
) {
Ni
= 1.79e+6; }
325
if
(!
EcGiven
) {
Ec
= 0.75;}
326
if
(!
EvGiven
) {
Ev
= 0;}
327
if
(!
elvsatGiven
) {
elvsat
= 1.3e+7;}
328
if
(!
hovsatGiven
) {
hovsat
= 6.6e+6;}
329
if
(!
narcoGiven
) {
narco
= 0.047;}
330
if
(!
narvaGiven
) {
narva
= 0.047;}
331
if
(!
CdonorGiven
) {
Cdonor
= 0.0;}
332
if
(!
CacceptorGiven
) {
Cacceptor
= 5.0e+19;}
333
}
334
else
if
(tmpMat ==
"INP"
)
335
{
336
if
(!
dielGiven
) {
diel
= 12.6;}
337
if
(!
elmob0Given
) {
elmob0
= 4100;}
338
if
(!
homob0Given
) {
homob0
= 150;}
339
if
(!
NiGiven
) {
Ni
= 1.79e+6; }
340
if
(!
EcGiven
) {
Ec
= 1.21;}
341
if
(!
EvGiven
) {
Ev
= -0.14;}
342
if
(!
elvsatGiven
) {
elvsat
= 1.3e+7;}
343
if
(!
hovsatGiven
) {
hovsat
= 6.6e+6;}
344
if
(!
narcoGiven
) {
narco
= 0.047;}
345
if
(!
narvaGiven
) {
narva
= 0.047;}
346
if
(!
CdonorGiven
) {
Cdonor
= 0.0;}
347
if
(!
CacceptorGiven
) {
Cacceptor
= 2.0e+16;}
348
}
349
else
if
(tmpMat ==
"SI"
)
350
{
351
double
Eg =
MaterialSupport::bandgap
(tmpMat,300.0);
352
double
chi =
MaterialSupport::affin
(tmpMat);
353
354
if
(!
dielGiven
) {
diel
=11.8;}
355
if
(!
elmob0Given
) {
elmob0
= 850;}
// check this! copied from ingap
356
if
(!
homob0Given
) {
homob0
= 30;}
// check this! copied from ingap
357
if
(!
NiGiven
) {
Ni
= 1.25e+10;}
358
if
(!
EcGiven
) {
Ec
= 1.45248;}
359
if
(!
EvGiven
) {
Ev
= -0.4085;}
360
if
(!
elvsatGiven
) {
elvsat
= 7.7e+6;}
// check this!
361
if
(!
hovsatGiven
) {
hovsat
= 7.7e+6;}
// check this!
362
if
(!
narcoGiven
) {
narco
= 0.013;}
//check this!
363
if
(!
narvaGiven
) {
narva
= 0.013;}
//check this!
364
if
(!
CdonorGiven
) {
Cdonor
= 5.0e+17;}
365
if
(!
CacceptorGiven
) {
Cacceptor
= 0.0;}
366
}
367
368
EcEff
=
Ec
-
narco
;
369
EvEff
=
Ev
-
narva
;
370
}
371
}
372
373
374
//-----------------------------------------------------------------------------
375
// Function : MaterialLayer::operator<<
376
// Purpose : "<<" operator
377
// Special Notes :
378
// Scope : public
379
// Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
380
// Creation Date : 2/28/12
381
//-----------------------------------------------------------------------------
382
std::ostream &
operator<<
(std::ostream & os,
const
MaterialLayer
& ml)
383
{
384
os <<
" Material Layer Data: name = "
<< ml.
name
;
385
os <<
" material = "
<< ml.
material
;
386
387
os <<
" NX = "
<< ml.
NX
<<std::endl;
388
os <<
" LX = "
<< ml.
LX
<<std::endl;
389
os <<
" begin = "
<< ml.
begin
<<std::endl;
390
os <<
" end = "
<< ml.
end
<<std::endl;
391
os <<
" diel = "
<< ml.
diel
<<std::endl;
392
os <<
" Ec = "
<< ml.
Ec
<<std::endl;
393
os <<
" Ev = "
<< ml.
Ev
<<std::endl;
394
os <<
" Cdonor = "
<< ml.
Cdonor
<<std::endl;
395
os <<
" Cacceptor = "
<< ml.
Cacceptor
<<std::endl;
396
os <<
" narco = "
<< ml.
narco
<<std::endl;
397
os <<
" narva = "
<< ml.
narva
<<std::endl;
398
os <<
" dnco = "
<< ml.
dnco
<<std::endl;
399
os <<
" dnva = "
<< ml.
dnva
<<std::endl;
400
os <<
" Nc = "
<< ml.
Nc
<<std::endl;
401
os <<
" Nv = "
<< ml.
Nv
<<std::endl;
402
os <<
" emass = "
<< ml.
emass
<<std::endl;
403
os <<
" hmass = "
<< ml.
hmass
<<std::endl;
404
os <<
" elmob0 = "
<< ml.
elmob0
<<std::endl;
405
os <<
" elvsat = "
<< ml.
elvsat
<<std::endl;
406
os <<
" eleo = "
<< ml.
eleo
<<std::endl;
407
os <<
" homob0 = "
<< ml.
homob0
<<std::endl;
408
os <<
" hovsat = "
<< ml.
hovsat
<<std::endl;
409
os <<
" dir = "
<< ml.
dir
<<std::endl;
410
os <<
" augnpp = "
<< ml.
augnpp
<<std::endl;
411
os <<
" srh = "
<< ml.
srh
<<std::endl;
412
os <<
" Ni = "
<< ml.
Ni
<<std::endl;
413
os <<
" width = "
<< ml.
width
<<std::endl;
414
os <<
" gradedLayerWidth = "
<< ml.
gradedLayerWidth
<<std::endl;
415
os <<
" temperature = "
<< ml.
temperature
<<std::endl;
416
417
os << std::endl;
418
419
return
os;
420
}
421
422
}
// namespace Device
423
}
// namespace Xyce
src
DeviceModelPKG
TCADModels
src
N_DEV_MaterialLayer.C
Generated on Thu Sep 25 2014 15:20:25 for Xyce by
1.8.3.1