Memosa-FVM  0.2
DriftDiscretization.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 _DRIFTDISCRETIZATION_H_
6 #define _DRIFTDISCRETIZATION_H_
7 
8 #include "CRMatrix.h"
9 #include "Field.h"
10 #include "MultiField.h"
11 #include "MultiFieldMatrix.h"
12 #include "Mesh.h"
13 #include "Discretization.h"
14 #include "StorageSite.h"
15 
16 
17 template<class X, class Diag, class OffDiag>
19 {
20 public:
23  typedef typename CCMatrix::DiagArray DiagArray;
26  typedef Array<X> XArray;
27 
31 
32 
34  const GeomFields& geomFields,
35  Field& varField,
36  const Field& convectingFluxField,
37  const int nTrap,
38  const bool useCentralDifference=false ) :
39  Discretization(meshes),
40  _geomFields(geomFields),
41  _varField(varField),
42  _convectingFluxField(convectingFluxField),
43  _nTrap(nTrap),
44  _useCentralDifference(useCentralDifference)
45  {}
46 
47  void discretize(const Mesh& mesh, MultiFieldMatrix& mfmatrix,
48  MultiField& xField, MultiField& rField)
49  {
50 
51  const StorageSite& cells = mesh.getCells();
52  const StorageSite& faces = mesh.getFaces();
53 
54 
55  // should there be some other checks ?
56  if (!_convectingFluxField.hasArray(faces))
57  return;
58 
59  const TArray& convectingFlux =
60  dynamic_cast<const TArray&>(_convectingFluxField[faces]);
61 
62  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
63  CCMatrix& matrix =
64  dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,cVarIndex));
65 
66  const CRConnectivity& faceCells = mesh.getAllFaceCells();
67 
68  CCAssembler& assembler = matrix.getPairWiseAssembler(faceCells);
69 
70  DiagArray& diag = matrix.getDiag();
71 
72  const XArray& xCell = dynamic_cast<const XArray&>(xField[cVarIndex]);
73 
74  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
75 
76  //const IntArray& ibType = dynamic_cast<const IntArray&>(_geomFields.ibType[cells]);
77 
78  const int nTrap = _nTrap;
79 
80  const int nFaces = faces.getCount();
81 
82  //drift only applies to conductance charge.
83  for(int f=0; f<nFaces; f++)
84  {
85  const int c0 = faceCells(f,0);
86  const int c1 = faceCells(f,1);
87  const T_Scalar faceCFlux = convectingFlux[f];
88 
89  T_Scalar varFlux;
90 
91  if (faceCFlux > T_Scalar(0))
92  {
93  varFlux = faceCFlux*xCell[c0][nTrap];
94  diag[c0](nTrap,nTrap) -= faceCFlux;
95  assembler.getCoeff10(f)(nTrap,nTrap) += faceCFlux;
96  //diag[c0][3*nTrap] -= faceCFlux;
97  //assembler.getCoeff10(f)[3*nTrap] += faceCFlux;
98  //assembler.getCoeff10(f) += faceCFlux;
99  }
100  else
101  {
102  varFlux = faceCFlux*xCell[c1][nTrap];
103  diag[c1](nTrap,nTrap) += faceCFlux;
104  assembler.getCoeff01(f)(nTrap,nTrap) -= faceCFlux;
105  //diag[c1][3*nTrap] += faceCFlux;
106  //assembler.getCoeff01(f)[3*nTrap] -= faceCFlux;
107  //assembler.getCoeff01(f) -= faceCFlux;
108  }
109 
110  rCell[c0][nTrap] -= varFlux;
111  rCell[c1][nTrap] += varFlux;
112  }
113 
114 
115  }
116 private:
118  const Field& _varField;
120  const int _nTrap;
122 };
123 
124 #endif
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
const GeomFields & _geomFields
bool hasArray(const StorageSite &s) const
Definition: Field.cpp:37
DriftDiscretization(const MeshList &meshes, const GeomFields &geomFields, Field &varField, const Field &convectingFluxField, const int nTrap, const bool useCentralDifference=false)
Definition: Field.h:14
Definition: Mesh.h:49
Vector< T_Scalar, 3 > VectorT3
OffDiag & getCoeff10(const int np)
Definition: CRMatrix.h:131
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
Array< T_Scalar > TArray
const CRConnectivity & getAllFaceCells() const
Definition: Mesh.cpp:378
NumTypeTraits< X >::T_Scalar T_Scalar
const Field & _convectingFluxField
Array< VectorT3 > VectorT3Array
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
CCMatrix::PairWiseAssembler CCAssembler
CCMatrix::DiagArray DiagArray
const StorageSite & getFaces() const
Definition: Mesh.h:108
const StorageSite & getCells() const
Definition: Mesh.h:109
OffDiag & getCoeff01(const int np)
Definition: CRMatrix.h:126
CRMatrix< Diag, OffDiag, X > CCMatrix
int getCount() const
Definition: StorageSite.h:39
PairWiseAssembler & getPairWiseAssembler(const CRConnectivity &pairs)
Definition: CRMatrix.h:867
vector< Mesh * > MeshList
Definition: Mesh.h:439