Memosa-FVM  0.2
CaptureDiscretization.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 _CAPTUREDISCRETIZATION_H_
6 #define _CAPTUREDISCRETIZATION_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 Capture model modifies all diag: d00, d01, d10, d11
36 and x0, x1
37 
38 *************************************************/
39 
40 template <class X, class Diag, class OffDiag>
42 {
43 
44  public:
48  typedef typename CCMatrix::DiagArray DiagArray;
50  typedef Array<X> XArray;
52 
54  const GeomFields& geomFields,
55  const Field& varField,
56  const Field& capturecrossField,
57  const ElectricModelConstants<T_Scalar>& constants):
58  Discretization(meshes),
59  _geomFields(geomFields),
60  _varField(varField),
61  _capturecrossField(capturecrossField),
62  _constants(constants)
63  {}
64 
65  void discretize(const Mesh& mesh, MultiFieldMatrix& mfmatrix,
66  MultiField& xField, MultiField& rField)
67  {
68  const StorageSite& cells = mesh.getCells();
69 
70  const int nCells = cells.getSelfCount();
71 
72  const TArray& cellVolume = dynamic_cast<const TArray&>(_geomFields.volume[cells]);
73 
74  const VectorTNArray& free_electron_capture_cross = dynamic_cast<const VectorTNArray&> (_capturecrossField[cells]);
75 
76  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
77 
78  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,cVarIndex));
79 
80  const XArray& xCell = dynamic_cast<const XArray&>(xField[cVarIndex]);
81 
82  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
83 
84  DiagArray& diag = matrix.getDiag();
85 
86  //OffDiagArray& offdiag = matrix.getOffDiag();
87 
88  const T_Scalar electron_effmass = _constants["electron_effmass"];
89 
90  const T_Scalar temperature = _constants["OP_temperature"];
91 
92  const int nTrap = _constants["nTrap"];
93 
94  vector<T_Scalar> electron_trapdensity = _constants.electron_trapdensity;
95 
96  const T_Scalar velocity = sqrt(8.0 * K_SI * temperature / (PI * ME * electron_effmass));
97 
98  for(int c=0; c<nCells; c++){
99 
100  for (int i=0; i<nTrap; i++){
101 
102  T_Scalar fluxCoeff = cellVolume[c] * velocity * free_electron_capture_cross[c][i];
103 
104  rCell[c][i] += fluxCoeff * xCell[c][nTrap] * (electron_trapdensity[i] - xCell[c][i]);
105  diag[c](i,i) -= fluxCoeff * xCell[c][nTrap];
106  //diag[c][i] -= fluxCoeff * xCell[c][nTrap];
107  diag[c](i,nTrap) += fluxCoeff * (electron_trapdensity[i]-xCell[c][i]);
108  //diag[c][i+nTrap] += fluxCoeff * (electron_trapdensity[i]-xCell[c][i]);
109 
110  rCell[c][nTrap] -= fluxCoeff * xCell[c][nTrap] * (electron_trapdensity[i] - xCell[c][i]);
111  diag[c](nTrap,nTrap) -= fluxCoeff * (electron_trapdensity[i]-xCell[c][i]);
112  //diag[c][3*nTrap] -= fluxCoeff * (electron_trapdensity[i]-xCell[c][i]);
113  diag[c](nTrap,i) += fluxCoeff * xCell[c][nTrap];
114  //diag[c][2*nTrap+i] += fluxCoeff * xCell[c][nTrap];
115  }
116  }
117  }
118 
119 
120  private:
122  const Field& _varField;
125 };
126 
127 
128 #endif
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
#define PI
int getSelfCount() const
Definition: StorageSite.h:40
CaptureDiscretization(const MeshList &meshes, const GeomFields &geomFields, const Field &varField, const Field &capturecrossField, const ElectricModelConstants< T_Scalar > &constants)
CRMatrix< Diag, OffDiag, X > CCMatrix
Definition: Field.h:14
#define K_SI
CCMatrix::DiagArray DiagArray
Definition: Mesh.h:49
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
CCMatrix::OffDiagArray OffDiagArray
#define ME
Tangent sqrt(const Tangent &a)
Definition: Tangent.h:317
Array< Vector< T_Scalar, 3 > > VectorTNArray
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
vector< T > electron_trapdensity
Definition: ElectricBC.h:76
const ElectricModelConstants< T_Scalar > & _constants
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
const StorageSite & getCells() const
Definition: Mesh.h:109
Field volume
Definition: GeomFields.h:26
Definition: Array.h:14
const GeomFields & _geomFields
vector< Mesh * > MeshList
Definition: Mesh.h:439
NumTypeTraits< X >::T_Scalar T_Scalar