Xyce  6.1
N_DEV_MaterialLayer.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright (c) 2002-2015, 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.14 $
25 //
26 // Revision Date : $Date: 2015/09/03 16:13:45 $
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 
36 namespace Xyce {
37 namespace Device {
38 
39 template<>
41 {
42  // Set up map for double precision variables:
43  addPar ("DIEL", 13.1, &MaterialLayer::diel)
44  .setGivenMember(&MaterialLayer::dielGiven);
45  //
46  addPar ("CON", 1.422482, &MaterialLayer::Ec)
47  .setGivenMember(&MaterialLayer::EcGiven);
48 
49  addPar ("VAL", 0.0, &MaterialLayer::Ev)
50  .setGivenMember(&MaterialLayer::EvGiven);
51 
52  addPar ("NDOPE", 0.0, &MaterialLayer::Cdonor)
53  .setGivenMember(&MaterialLayer::CdonorGiven);
54 
55  addPar ("PDOPE", 5.0e+19, &MaterialLayer::Cacceptor)
56  .setGivenMember(&MaterialLayer::CacceptorGiven);
57 
58  ////////
59  addPar ("NARCO", 0.047, &MaterialLayer::narco)
60  .setGivenMember(&MaterialLayer::narcoGiven);
61 
62  addPar ("NARVA", 0.047, &MaterialLayer::narva)
63  .setGivenMember(&MaterialLayer::narvaGiven);
64 
65  //////
66  addPar ("EMASS", 0.067, &MaterialLayer::emass)
67  .setGivenMember(&MaterialLayer::emassGiven);
68 
69  addPar ("HMASS", 0.5, &MaterialLayer::hmass)
70  .setGivenMember(&MaterialLayer::hmassGiven);
71 
72  /////
73  addPar ("ELMOB0", 2240.0, &MaterialLayer::elmob0)
74  .setGivenMember(&MaterialLayer::elmob0Given);
75 
76  addPar ("HOMOB0", 30.0, &MaterialLayer::homob0)
77  .setGivenMember(&MaterialLayer::homob0Given);
78 
79  /////
80  addPar ("ELVSAT", 7.7e+6, &MaterialLayer::elvsat)
81  .setGivenMember(&MaterialLayer::elvsatGiven);
82 
83  addPar ("HOVSAT", 7.7e+6, &MaterialLayer::hovsat)
84  .setGivenMember(&MaterialLayer::hovsatGiven);
85 
86  addPar ("NI", 1.79e+6, &MaterialLayer::Ni)
87  .setGivenMember(&MaterialLayer::NiGiven);
88 
89  addPar ("WIDTH", 1.0e-6, &MaterialLayer::width)
90  .setGivenMember(&MaterialLayer::widthGiven);
91 
92  addPar ("GRADEDWIDTH", 0.0, &MaterialLayer::gradedLayerWidth)
93  .setGivenMember(&MaterialLayer::gradedLayerWidthGiven),
94 
95  // non-doubles
96  addPar ("MATERIAL", "gaas", &MaterialLayer::material)
97  .setGivenMember(&MaterialLayer::materialGiven);
98 
99  addPar ("NAME", "EMITTER", &MaterialLayer::name)
100  .setGivenMember(&MaterialLayer::nameGiven);
101 
102  addPar ("NX", 25, &MaterialLayer::NX)
103  .setGivenMember(&MaterialLayer::NXGiven);
104 
105  addPar ("ValenceBandDOS", 2.66e19, &MaterialLayer::Nv)
106  .setGivenMember(&MaterialLayer::NvGiven);
107 
108  addPar ("ConductionBandDOS", 2.89e19, &MaterialLayer::Nc)
109  .setGivenMember(&MaterialLayer::NcGiven);
110 
111 }
112 
114  static ParametricData<MaterialLayer> parMap;
115 
116  return parMap;
117 }
118 
119 template <typename ScalarT> ScalarT Xycemax ( ScalarT f1, ScalarT f2) { return f1 > f2 ? f1 : f2; }
120 template <typename ScalarT> ScalarT Xycemin ( ScalarT f1, ScalarT f2) { return f1 < f2 ? f1 : f2; }
121 
122 // Class MaterialLayer
123 //-----------------------------------------------------------------------------
124 // Function : MaterialLayer
125 // Purpose :
126 // Special Notes :
127 // Scope : public
128 // Creator : Eric Keiter, SNL
129 // Creation Date : 07/01/11
130 //-----------------------------------------------------------------------------
131  MaterialLayer::MaterialLayer(std::string materialName,
132  double donor, double acceptor)
133  : CompositeParam(getParametricData()),
134  material(materialName),
135  materialGiven(false),
136  name("EMITTER"),
137  nameGiven(false),
138  NX(25),
139  NXGiven(false),
140  LX(24),
141  begin(0), // beginning mesh point
142  end(25), // end mesh point (+1)
143  diel(13.1), // dielectric constant
144  dielGiven(false), // dielectric constant given flag
145 
146  Ec(1.422482), // conduction band edge
147  EcGiven(false), // conduction band edge given flag
148  Ev(0), // valance band edge
149  EvGiven(false), // valance band edge given flag
150  EcEff(1.375482), // conduction band edge, including BGN
151  EvEff(0.047), // valance band edge, including BGN
152  bg(1.422482), // bandgap
153  bgEff(1.328482), // effective bandgap (including band-gap narrowing, bgn)
154  Cdonor(donor), // n doping concentration
155  CdonorGiven(true), // n doping concentration given flag
156  Cacceptor(acceptor), // p doping concentration
157  CacceptorGiven(true), // p doping concentration given flag
158 
159 
160  // these defaults assume band-gap narrowing is turned off:
161  narco(0.0), // band gap narrowing of conduction band
162  narcoGiven(false), // band gap narrowing of conduction band given flag
163  narva(0.0), // band gap narrowing of valence band
164  narvaGiven(false), // band gap narrowing of valence band given flag
165 
166 
167  dnco(0.01734), // conduction band density of states multiplier ((md*/mo)^3/2
168  dnva(0.4318), // valence band density of states multiplier ((md*/mo)^3/2
169  Nc(1.0), // conduction band DOS
170  NcGiven(false),
171  Nv(1.0), // valance band DOS
172  NvGiven(false),
173  emass(0.067), // electron DOS effective mass
174  emassGiven(false), // electron DOS effective mass given flag
175  hmass(0.5), // hole DOS effective mass
176  hmassGiven(false), // hole DOS effective mass given flag
177  elmob0(2240), // zero field mobility for electrons (cm2/Vs)
178  elmob0Given(false), // zero field mobility for electrons (cm2/Vs) given flag
179 
180  elvsat (7.70E+06), // saturation velocity for electrons (cm/s)
181  elvsatGiven (false), // saturation velocity for electrons (cm/s) given flag
182  eleo(4000), // Eo(V/cm) in mobility field dependence
183  homob0 (30), // zero field mobility for holes (cm2/Vs)
184  homob0Given(false), // zero field mobility for holes (cm2/Vs) given flag
185  hovsat (7.70E+06), // saturation velocity for holes (cm/s)
186  hovsatGiven (false), // saturation velocity for holes (cm/s) given flag
187 
188  dir(1.00E-10), // direct recombination rate coefficient (cm3/s)
189  dirGiven(false), // direct recombination rate coefficient (cm3/s) given flag
190  augnpp(1.00E-30), // Auger recombination rate coefficient for npp (cm3/s)
191  augpnn(1.00E-30), // Auger recombination rate coefficient for pnn (cm3/s)
192  augnppGiven(false), // Auger recombination rate coefficient for npp (cm3/s) given flag
193  augpnnGiven(false), // Auger recombination rate coefficient for pnn (cm3/s) given flag
194  srh(0), // SRH rate coeff (inverse lifetime)
195  srhdet(0), // energy shift from midgap for SRH
196  Ni(1.79e+6),
197  NiGiven(false),
198  NiEff(1.79e+6), // Ni including BGN
199  width(1.0e-5),
200  widthGiven(false),
201  gradedLayerWidth(0.0),
202  gradedLayerWidthGiven(false),
203  temperature(CONSTREFTEMP),
204  electronThermalV(2.3e7),
205  electronThermalVGiven(false),
206  holeThermalV(1.9e7),
207  holeThermalVGiven(false),
208  latticeConstant(4.25e-7),
209  latticeConstantGiven(false),
210  defectReactionRadius(4.25e-7),
211  defectReactionRadiusGiven(false)
212 {
213 
214  //this is getting silly
215  ExtendedString mN = material;
216  mN.toLower();
217  material = mN;
218 
219  if (NXGiven)
220  {
221  end = begin + NX;
222  }
223 
224  processParams ();
225 }
226 
227 //-----------------------------------------------------------------------------
228 // Function : MaterialLayer::processParams
229 // Purpose :
230 // Special Notes :
231 // Scope : public
232 // Creator : Eric Keiter, SNL
233 // Creation Date : 02/28/12
234 //-----------------------------------------------------------------------------
236 {
237  // set some material parameters to appropriate values
238  ExtendedString tmpMat = material;
239  tmpMat.toUpper ();
240 
243 
244  dnco = pow(emass,1.5);
245  dnva = pow(hmass,1.5);
246 
247  if(!NcGiven)
249  if(!NvGiven)
251 
252  if (!narcoGiven)
253  {
254  narco = 0.047;
255  }
256  if (!narvaGiven)
257  {
258  narva = 0.047;
259  }
260 
261  if (tmpMat == "GAAS")
262  {
263  if (!dielGiven) { diel = 13.1;}
264  if (!elmob0Given) { elmob0 = 2240;}
265  if (!homob0Given) { homob0 = 30;}
266  if (!NiGiven) { Ni = 1.79e+6; }
267  if (!EcGiven) {Ec = 1.422482;}
268  if (!EvGiven) {Ev = 0;}
269  if (!elvsatGiven) {elvsat = 7.7e+6;}
270  if (!hovsatGiven) {hovsat = 7.7e+6;}
271  if (!electronThermalVGiven) {electronThermalV = 4.5e7;}
272  if (!holeThermalVGiven) {holeThermalV = 4.5e7;}
274  if (!latticeConstantGiven) {latticeConstant = 5.63e-8;}
275  if (!narcoGiven) { narco = 0.047;}
276  if (!narvaGiven) { narva = 0.047;}
277  if (!CdonorGiven) { Cdonor = 0.0;}
278  if (!CacceptorGiven) { Cacceptor = 5.0e+19;}
279  if (!augpnnGiven) { augpnn = 1.0e-30;}
280  if (!augnppGiven) { augnpp = 1.0e-30;}
281  if (!dirGiven) { dir = 1.0e-10;}
282  }
283  else if(tmpMat == "INGAP")
284  {
285  if (!dielGiven) { diel=11.8;}
286  if (!elmob0Given) { elmob0 = 850;}
287  if (!homob0Given) { homob0 = 30;}
288  if (!NiGiven) { Ni = 1.2e+3;}
289  if (!EcGiven) {Ec = 1.45248;}
290  if (!EvGiven) {Ev = -0.4085;}
291  if (!elvsatGiven) {elvsat = 7.7e+6;}
292  if (!hovsatGiven) {hovsat = 7.7e+6;}
293  if (!narcoGiven) { narco = 0.013;}
294  if (!narvaGiven) { narva = 0.013;}
295  if (!CdonorGiven) { Cdonor = 5.0e+17;}
296  if (!CacceptorGiven) { Cacceptor = 0.0;}
297  }
298  else if(tmpMat == "ALGAAS")
299  {
300  if (!dielGiven) { diel=12.95;}
301  if (!elmob0Given) { elmob0 = 600;}
302  if (!homob0Given) { homob0 = 80;}
303  if (!NiGiven) { Ni = 2.1e+3;}
304  if (!EcGiven) {Ec = 1.45248;}
305  if (!EvGiven) {Ev = -0.4085;}
306  if (!elvsatGiven) {elvsat = 7.7e+6;}
307  if (!hovsatGiven) {hovsat = 7.7e+6;}
308  if (!narcoGiven) { narco = 0.010;}
309  if (!narvaGiven) { narva = 0.010;}
310  if (!CdonorGiven) { Cdonor = 0.0;}
311  if (!CacceptorGiven) { Cacceptor = 5.0e+17;}
312  }
313  else if (tmpMat == "INALAS")
314  {
315  if (!dielGiven) { diel = 12.5;}
316  if (!elmob0Given) { elmob0 = 1000;}
317  if (!homob0Given) { homob0 = 30;}
318  if (!NiGiven) { Ni = 1.79e+6; }
319  if (!EcGiven) {Ec = 1.46;}
320  if (!EvGiven) {Ev = 0;}
321  if (!elvsatGiven) {elvsat = 4.7e+6;}
322  if (!hovsatGiven) {hovsat = 3.0e+6;}
323  if (!narcoGiven) { narco = 0.0;}
324  if (!narvaGiven) { narva = 0.0;}
325  if (!CdonorGiven) { Cdonor = 0.0;}
326  if (!CacceptorGiven) { Cacceptor = 5.0e+19;}
327  }
328  else if (tmpMat == "INGAAS")
329  {
330  if (!dielGiven) { diel = 14;}
331  if (!elmob0Given) { elmob0 = 3000;}
332  if (!homob0Given) { homob0 = 76;}
333  if (!NiGiven) { Ni = 1.79e+6; }
334  if (!EcGiven) {Ec = 0.96;}
335  if (!EvGiven) {Ev = 0.21;}
336  if (!elvsatGiven) {elvsat = 8.4e+6;}
337  if (!hovsatGiven) {hovsat = 4.8e+6;}
338  if (!narcoGiven) { narco = 0.036;}
339  if (!narvaGiven) { narva = 0.036;}
340  if (!CdonorGiven) { Cdonor = 0.0;}
341  if (!CacceptorGiven) { Cacceptor = 5.0e+19;}
342  }
343  else if (tmpMat == "INGAAP")
344  {
345  if (!dielGiven) { diel = 14;}
346  if (!elmob0Given) { elmob0 = 3500;}
347  if (!homob0Given) { homob0 = 50;}
348  if (!NiGiven) { Ni = 1.79e+6; }
349  if (!EcGiven) {Ec = 0.75;}
350  if (!EvGiven) {Ev = 0;}
351  if (!elvsatGiven) {elvsat = 1.3e+7;}
352  if (!hovsatGiven) {hovsat = 6.6e+6;}
353  if (!narcoGiven) { narco = 0.047;}
354  if (!narvaGiven) { narva = 0.047;}
355  if (!CdonorGiven) { Cdonor = 0.0;}
356  if (!CacceptorGiven) { Cacceptor = 5.0e+19;}
357  }
358  else if (tmpMat == "INT")
359  {
360  if (!dielGiven) { diel = 12.6;}
361  if (!elmob0Given) { elmob0 = 4100;}
362  if (!homob0Given) { homob0 = 150;}
363  if (!NiGiven) { Ni = 1.79e+6; }
364  if (!EcGiven) {Ec = 1.21;}
365  if (!EvGiven) {Ev = -0.14;}
366  if (!elvsatGiven) {elvsat = 1.3e+7;}
367  if (!hovsatGiven) {hovsat = 6.6e+6;}
368  if (!narcoGiven) { narco = 0.047;}
369  if (!narvaGiven) { narva = 0.047;}
370  if (!CdonorGiven) { Cdonor = 0.0;}
371  if (!CacceptorGiven) { Cacceptor = 2.0e+16;}
372  }
373  else if(tmpMat == "SI")
374  {
375  double Eg = MaterialSupport::bandgap(tmpMat,300.0);
376  double chi = MaterialSupport::affin(tmpMat);
377 #if 0
378  // relative permitivity of Si is 11.68 according to: https://en.wikipedia.org/wiki/Relative_permittivity
379  if (!dielGiven) { diel=11.68;}
380 #else
381  // old standard value for e_si. Using this for now as a test.
382  if (!dielGiven) { diel=11.8;}
383 #endif
384 
385  if (!elmob0Given) { elmob0 = 850;} // check this! copied from ingap
386  if (!homob0Given) { homob0 = 30;} // check this! copied from ingap
387  if (!NiGiven) { Ni = 1.25e+10;}
388 
389  // Eg = 1.12 according to http://www.ioffe.ru/SVA/NSM/Semicond/Si/bandstr.html
390  if (!EcGiven) {Ec = 1.12;}
391  if (!EvGiven) {Ev = 0.0;}
392 
393  if (!elvsatGiven) {elvsat = 7.7e+6;} // check this!
394  if (!hovsatGiven) {hovsat = 7.7e+6;} // check this!
395 
396  // band-gap narrowing: this is doping dependent, so should be computing.
397  // By default is zero for typical Si devices.
398  //if (!narcoGiven) { narco = 0.013;} //check this!
399  //if (!narvaGiven) { narva = 0.013;} //check this!
400  if (!narcoGiven) { narco = 0.0;} //check this!
401  if (!narvaGiven) { narva = 0.0;} //check this!
402 
403  if (!CdonorGiven) { Cdonor = 5.0e+17;}
404  if (!CacceptorGiven) { Cacceptor = 0.0;}
405  if (!augpnnGiven) { augpnn = 2.8e-31;}
406  if (!augnppGiven) { augnpp = 9.9e-32;}
407  if (!dirGiven) { dir = 0.0;}
408  if (!electronThermalVGiven) {electronThermalV = 2.3e7;}
409  if (!holeThermalVGiven) {holeThermalV = 1.9e7;}
411  if (!latticeConstantGiven) {latticeConstant = 5.00e-8;} //This should be 5.43e-8
412 #if 0
413  // from http://www.ioffe.ru/SVA/NSM/Semicond/Si/bandstr.html
414  if (!NcGiven){Nc = 3.2e19;}
415  if (!NvGiven){Nv = 1.8e19;}
416 #else
417  // from Larry to match XPD
418  if (!NcGiven){Nc = 2.86e19;}
419  if (!NvGiven){Nv = 2.66e19;}
420 #endif
421  }
422 
423  EcEff = Ec-narco;
424  EvEff = Ev-narva;
425 }
426 
427 //-----------------------------------------------------------------------------
428 // Function : MaterialLayer::operator<<
429 // Purpose : "<<" operator
430 // Special Notes :
431 // Scope : public
432 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
433 // Creation Date : 2/28/12
434 //-----------------------------------------------------------------------------
435 std::ostream & operator<<(std::ostream & os, const MaterialLayer & ml)
436 {
437  os << " Material Layer Data: name = " << ml.name ;
438  os << " material = " << ml.material;
439 
440  os << " NX = " << ml.NX<<std::endl;
441  os << " LX = " << ml.LX<<std::endl;
442  os << " begin = " << ml.begin<<std::endl;
443  os << " end = " << ml.end<<std::endl;
444  os << " diel = " << ml.diel<<std::endl;
445  os << " Ec = " << ml.Ec<<std::endl;
446  os << " Ev = " << ml.Ev<<std::endl;
447  os << " Cdonor = " << ml.Cdonor<<std::endl;
448  os << " Cacceptor = " << ml.Cacceptor<<std::endl;
449  os << " narco = " << ml.narco<<std::endl;
450  os << " narva = " << ml.narva<<std::endl;
451  os << " dnco = " << ml.dnco<<std::endl;
452  os << " dnva = " << ml.dnva<<std::endl;
453  os << " Nc = " << ml.Nc<<std::endl;
454  os << " Nv = " << ml.Nv<<std::endl;
455  os << " emass = " << ml.emass<<std::endl;
456  os << " hmass = " << ml.hmass<<std::endl;
457  os << " elmob0 = " << ml.elmob0<<std::endl;
458  os << " elvsat = " << ml.elvsat<<std::endl;
459  os << " eleo = " << ml.eleo<<std::endl;
460  os << " homob0 = " << ml.homob0<<std::endl;
461  os << " hovsat = " << ml.hovsat<<std::endl;
462  os << " dir = " << ml.dir<<std::endl;
463  os << " augnpp = " << ml.augnpp<<std::endl;
464  os << " srh = " << ml.srh<<std::endl;
465  os << " Ni = " << ml.Ni<<std::endl;
466  os << " width = " << ml.width<<std::endl;
467  os << " gradedLayerWidth = " << ml.gradedLayerWidth<<std::endl;
468  os << " temperature = " << ml.temperature<<std::endl;
469 
470  os << std::endl;
471 
472  return os;
473 }
474 
475 } // namespace Device
476 } // namespace Xyce
static ParametricData< MaterialLayer > & getParametricData()
double get_DOS_EffectiveMassP(const std::string &material)
#define CONSTREFTEMP
Definition: N_DEV_Const.h:56
Pure virtual class to augment a linear system.
ScalarT Xycemin(ScalarT f1, ScalarT f2)
double getNc(const std::string &material, double temp)
double bandgap(const std::string &material, double temp)
MaterialLayer(std::string materialName=std::string("gaas"), double donor=0.0, double acceptor=5.00E+19)
ScalarT Xycemax(ScalarT f1, ScalarT f2)
void processParams()
processParams post processes the parameters that have been set in the object of the derived class...
double affin(const std::string &material)
ParametricData()
Constructs the parameter data map.
Definition: N_DEV_Pars.h:1392
double getNv(const std::string &material, double temp)
Manages parameter binding for class C.
Definition: N_DEV_Pars.h:214
double get_DOS_EffectiveMassN(const std::string &material)
CompositeParam is the base class for classes that wish to only manage the processing of parameter dat...
std::ostream & operator<<(std::ostream &os, const Configuration &configuration)
Definition: N_DEV_Dump.C:134