Xyce  6.1
 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<>
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 
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 //-----------------------------------------------------------------------------
207 {
208  // set some material parameters to appropriate values
209  if (true)
210  {
211  ExtendedString tmpMat = material;
212  tmpMat.toUpper ();
213 
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 
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