Memosa-FVM  0.2
EmissionDiscretization.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _EMISSIONDISCRETIZATION_H_
6 #define _EMISSIONDISCRETIZATION_H_
7 
8 #include "PhysicsConstant.h"
9 #include "ElectricBC.h"
10 #include "Field.h"
11 #include "MultiField.h"
12 #include "MultiFieldMatrix.h"
13 #include "Mesh.h"
14 #include "Discretization.h"
15 #include "StorageSite.h"
16 #include "DiagonalMatrix.h"
17 #include "CRMatrix.h"
18 
19 /**************************************************
20 Diag type: 2x2Tensor
21  | d00, d01 |
22  | d10, d11 |
23 
24 OffDiag type: 2x2Tensor
25  | o00, o01 |
26  | o10, o11 |
27 
28 X type: VectorT2
29  | x0 |
30  | x1 |
31 
32 "0" is trapped charge
33 "1" is band charge
34 
35 Emission model modifies d00, x0, x1
36 
37 *************************************************/
38 
39 
40 template <class X, class Diag, class OffDiag>
42 {
43  public:
44 
49  typedef typename CCMatrix::DiagArray DiagArray;
51  typedef Array<X> XArray;
52 
54  const GeomFields& geomFields,
55  const Field& varField,
56  const Field& electricField,
57  const ElectricModelConstants<T_Scalar>& constants):
58  Discretization(meshes),
59  _geomFields(geomFields),
60  _varField(varField),
61  _electricField(electricField),
62  _constants(constants)
63  {}
64 
65 
66  void discretize(const Mesh& mesh, MultiFieldMatrix& mfmatrix,
67  MultiField& xField, MultiField& rField)
68  {
69  const StorageSite& cells = mesh.getCells();
70 
71  const int nCells = cells.getSelfCount();
72 
73  const VectorT3Array& electric_field = dynamic_cast<const VectorT3Array&> (_electricField[cells]);
74 
75  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
76 
77  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,cVarIndex));
78 
79  const XArray& xCell = dynamic_cast<const XArray&>(_varField[cells]);
80 
81  const TArray& cellVolume =
82  dynamic_cast<const TArray&>(_geomFields.volume[cells]);
83 
84  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
85 
86  DiagArray& diag = matrix.getDiag();
87 
88  //OffDiagArray& offdiag = matrix.getOffDiag();
89 
90  const T_Scalar optical_dielectric_constant = _constants["optical_dielectric_constant"];
91  const T_Scalar temperature = _constants["OP_temperature"];
92  const T_Scalar poole_frenkel_emission_frequency = _constants["poole_frenkel_emission_frequency"];
93  const int nTrap = _constants["nTrap"];
94  vector<T_Scalar> electron_trapdepth = _constants.electron_trapdepth;
95  const T_Scalar beta = sqrt( QE / (PI * E0_SI * optical_dielectric_constant) );
96 
97  for(int c=0; c<nCells; c++){
98 
99  for (int i=0; i<nTrap; i++){
100 
101  T_Scalar expt = (electron_trapdepth[i] - beta * sqrt(mag(electric_field[c]))) * QE / (K_SI * temperature);
102 
103  //if (expt < 0.0)
104  //throw CException("exponential error in Emission model");
105  if (expt > 0.0)
106  {
107 
108  T_Scalar fluxCoeff = cellVolume[c] * poole_frenkel_emission_frequency * exp(-expt);
109 
110  rCell[c][i] -= (fluxCoeff * xCell[c][i]);
111 
112  diag[c](i,i) -= fluxCoeff;
113  //diag[c][i] -= fluxCoeff;
114 
115  rCell[c][nTrap] += fluxCoeff * xCell[c][i];
116  }
117  }
118  }
119  }
120 
121  private:
123  const Field& _varField;
126 
127 };
128 
129 
130 #endif
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
#define PI
int getSelfCount() const
Definition: StorageSite.h:40
NumTypeTraits< X >::T_Scalar T_Scalar
Definition: Field.h:14
#define K_SI
Definition: Mesh.h:49
T mag(const Vector< T, 3 > &a)
Definition: Vector.h:260
CRMatrix< Diag, OffDiag, X > CCMatrix
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
CCMatrix::OffDiagArray OffDiagArray
const ElectricModelConstants< T_Scalar > & _constants
Tangent sqrt(const Tangent &a)
Definition: Tangent.h:317
CCMatrix::DiagArray DiagArray
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
#define QE
const StorageSite & getCells() const
Definition: Mesh.h:109
Field volume
Definition: GeomFields.h:26
EmissionDiscretization(const MeshList &meshes, const GeomFields &geomFields, const Field &varField, const Field &electricField, const ElectricModelConstants< T_Scalar > &constants)
const GeomFields & _geomFields
Definition: Array.h:14
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
Array< Vector< T_Scalar, 3 > > VectorT3Array
#define E0_SI
vector< T > electron_trapdepth
Definition: ElectricBC.h:77
vector< Mesh * > MeshList
Definition: Mesh.h:439