5 #ifndef _TUNNELINGDISCRETIZATION_H_
6 #define _TUNNELINGDISCRETIZATION_H_
42 template <
class X,
class Diag,
class OffDiag>
58 const Field& varField,
59 const Field& conductionbandField,
100 TArray& transmission = *ts;
102 XArray& rCell =
dynamic_cast<XArray&
>(rField[cVarIndex]);
118 const int subID = _constants[
"substrate_id"];
120 const int nLevel = _constants[
"nLevel"];
121 const int normal = _constants[
"normal_direction"];
122 const int nTrap = _constants[
"nTrap"];
125 const vector<double> electron_trapdensity = _constants.electron_trapdensity;
127 if (
int(electron_trapdepth.size()) != nTrap ||
int(electron_trapdensity.size()) != nTrap)
128 throw CException (
"trap depth vector size error!");
130 T_Scalar fluxCoeff(0), fermilevel(0), scatterfactor(0);
133 for(
int c=0; c < cells.
getCount(); c++){
134 transmission[c] = 0.0;
147 fermilevel = fermilevelsubstrate;
154 for (
T_Scalar en = fermilevel-4.0; en <= fermilevel+4.0; en += energystep){
172 const int nFaces = faces.
getCount();
174 for(
int f=0; f<nFaces; f++){
176 int c0 = faceCells(f,0);
177 int c1 = faceCells(f,1);
179 transmission[c1] = 1.0;
185 for(
int l=0; l< nLevel; l++){
187 T_Scalar dX = cellCentroid[me][normal] - cellCentroid[low][normal];
198 transmission[me] = transmission[low] * exp(exponent);
200 const int nbc = cellCells.
getCount(me);
205 for(
int nc = 0; nc < nbc; nc++){
206 const int neighbor = cellCells(me, nc);
207 const T_Scalar dr = cellCentroid[me][normal] - cellCentroid[neighbor][normal];
210 neighborUp = neighbor;
214 if (neighborUp < nCells) {
226 for(
int c=0; c<nCells; c++){
228 for (
int i=0; i<nTrap; i++){
230 const T_Scalar stcap = electron_capture_cross * cellVolume[c];
232 const T_Scalar endiff = en - (conduction_band[c]-electron_trapdepth[i]);
236 if (en-conduction_band[c] < 0){
239 scatterfactor = exp(-
QE *
fabs(endiff)/(
K_SI*temperature));
240 else scatterfactor = 1.0;
242 fluxCoeff = alpha * stcap * transmission[c] * supplyfunction *
243 fermifunction * scatterfactor * energystep *
QE;
245 _fluxIn += (fluxCoeff * (electron_trapdensity[i] - xCell[c][i]));
246 rCell[c][i] += (fluxCoeff * (electron_trapdensity[i] - xCell[c][i]));
247 diag[c](i,i) -= fluxCoeff;
252 if(en - conduction_band[c] < 0){
254 scatterfactor = exp(-
QE *
fabs(endiff)/(
K_SI*temperature));
255 else scatterfactor = 1.0;
257 fluxCoeff = alpha * stcap * transmission[c] * supplyfunction *
258 (1-fermifunction) * scatterfactor * energystep *
QE;
260 _fluxOut += (fluxCoeff * (- xCell[c][i]));
261 rCell[c][i] += (fluxCoeff * (- xCell[c][i]));
262 diag[c](i,i) -= fluxCoeff;
272 for(
int c=0; c < cells.
getCount(); c++){
273 transmission[c] = 0.0;
276 fermilevel = fermilevelmembrane;
278 for (
T_Scalar en = fermilevel-4.0; en <= fermilevel+4.0; en += energystep){
292 const int nFaces = faces.
getCount();
294 for(
int f=0; f<nFaces; f++){
296 int c0 = faceCells(f,0);
297 int c1 = faceCells(f,1);
299 transmission[c1] = 1.0;
305 for(
int l=0; l<nLevel; l++){
307 T_Scalar dX = cellCentroid[me][normal] - cellCentroid[low][normal];
311 T_Scalar avg = (valueMe + valueLow) / 2.0;
313 transmission[me] = transmission[low] * exp(exponent);
315 const int nbc = cellCells.
getCount(me);
320 for(
int nc = 0; nc < nbc; nc++){
321 const int neighbor = cellCells(me, nc);
322 const T_Scalar dr = cellCentroid[me][normal] - cellCentroid[neighbor][normal];
325 neighborUp = neighbor;
328 if (neighborUp < nCells) {
338 for(
int c=0; c<nCells; c++){
340 for(
int i=0; i<nTrap; i++){
342 const T_Scalar stcap = electron_capture_cross * cellVolume[c];
344 const T_Scalar endiff = en - (conduction_band[c]-electron_trapdepth[i]);
348 if (en-conduction_band[c] < 0){
351 scatterfactor = exp(-
QE *
fabs(endiff)/(
K_SI*temperature));
352 else scatterfactor = 1.0;
354 fluxCoeff = alpha * stcap * transmission[c] * supplyfunction *
355 fermifunction * scatterfactor * energystep *
QE;
357 rCell[c][i] += (fluxCoeff * (electron_trapdensity[i] - xCell[c][i]));
358 diag[c](i,i) -= fluxCoeff;
362 if(en - conduction_band[c] < 0 ){
364 scatterfactor = exp(-
QE *
fabs(endiff)/(
K_SI*temperature));
365 else scatterfactor = 1.0;
367 fluxCoeff = alpha * stcap * transmission[c] * supplyfunction *
368 (1-fermifunction) * scatterfactor * energystep *
QE;
370 rCell[c][i] += (fluxCoeff * (-xCell[c][i]));
371 diag[c](i,i) -= fluxCoeff;
const FaceGroupList & getBoundaryFaceGroups() const
int getCount(const int i) const
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
shared_ptr< FaceGroup > FaceGroupPtr
NumTypeTraits< X >::T_Scalar T_Scalar
CCMatrix::OffDiagArray OffDiagArray
const T FermiFunction(const T &energy, const T &fermilevel, const T &temperature)
Array< Vector< T_Scalar, 3 > > VectorT3Array
CCMatrix::DiagArray DiagArray
Array< Diag > & getDiag()
TunnelingDiscretization(const MeshList &meshes, const GeomFields &geomFields, const Field &varField, const Field &conductionbandField, const ElectricModelConstants< T_Scalar > &constants, T_Scalar &fluxIn, T_Scalar &fluxOut)
CRMatrix< Diag, OffDiag, X > CCMatrix
Tangent sqrt(const Tangent &a)
pair< const Field *, const StorageSite * > ArrayIndex
const CRConnectivity & getCellCells() const
const ElectricModelConstants< T_Scalar > & _constants
const StorageSite & getCells() const
const T PositiveValueOf(T input)
const CRConnectivity & getFaceCells(const StorageSite &site) const
Tangent fabs(const Tangent &a)
const T ElectronSupplyFunction(const T &energy, const T &fermilevel, const T &temperature)
vector< T > electron_trapdepth
const GeomFields & _geomFields
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
const Field & _conductionbandField
vector< Mesh * > MeshList