Memosa-FVM  0.2
LinearizeDielectric.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 _LINEARIZEDIELECTRIC_H_
6 #define _LINEARIZEDIELECTRIC_H_
7 
8 #include "Mesh.h"
9 #include "NumType.h"
10 #include "Array.h"
11 #include "Vector.h"
12 #include "Field.h"
13 #include "CRConnectivity.h"
14 #include "StorageSite.h"
15 #include "MultiFieldMatrix.h"
16 #include "CRMatrix.h"
17 #include "FluxJacobianMatrix.h"
18 #include "DiagonalMatrix.h"
19 
20 
21 
22 
23 template<class X, class Diag, class OffDiag>
25 {
26  public:
29  typedef typename CCMatrix::DiagArray DiagArray;
31  typedef Array<X> XArray;
34 
35 
36  LinearizeDielectric( const GeomFields& geomFields,
37  const Field& dielectric_constant,
38  const T_Scalar dielectric_thickness,
39  Field& varField,
40  const T_Scalar source=0.0):
41  _geomFields(geomFields),
42  _varField(varField),
43  _dielectric_constant(dielectric_constant),
44  _dielectric_thickness(dielectric_thickness),
45  _source(source)
46  {}
47 
48 
49  void discretize(const Mesh& mesh, MultiFieldMatrix& mfmatrix,
50  MultiField& xField, MultiField& rField)
51  {
52  const StorageSite& cells = mesh.getCells();
53  const StorageSite& faces = mesh.getParentFaceGroupSite();
54  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
55 
56  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,cVarIndex));
57  const TArray& faceAreaMag =
58  dynamic_cast<const TArray&>(_geomFields.areaMag[faces]);
59 
60  const XArray& xCell = dynamic_cast<const XArray&>(xField[cVarIndex]);
61 
62  const VectorT3Array& cellCentroid =
63  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[cells]);
64 
65  const CRConnectivity& cellCells = mesh.getCellCells();
66 
67  const TArray& dcCell =
68  dynamic_cast<const TArray&>(_dielectric_constant[cells]);
69 
70  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
71 
72  DiagArray& diag = matrix.getDiag();
73 
74  const int nCells = cells.getSelfCount();
75 
76  for (int c=0; c<nCells; c++)
77  {
78  const int c0 = c;
79  const int nb = cellCells.getCount(c);
80  if (nb!=2)
81  throw CException("invalid connectivity in shellMesh");
82 
83  //source term
84  const T_Scalar volume = faceAreaMag[c0] * _dielectric_thickness;
85 
86  const T_Scalar src = 0.0;
87 
88  rCell[c0] += src*volume;
89 
90  //diffusion term
91  for (int i=0; i<nb; i++){
92 
93  const int c1 = cellCells(c,i);
94 
95  OffDiag& offdiag = matrix.getCoeff(c0, c1);
96 
97  VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
98  T_Scalar dsMag = mag(ds);
99 
100  const T_Scalar dc = harmonicAverage(dcCell[c0], dcCell[c1]);
101 
102  const T_Scalar diffCoeff = dc*faceAreaMag[c0]/(dsMag + 0.5*_dielectric_thickness);
103 
104  const X dFlux = diffCoeff*(xCell[c1]-xCell[c0]);
105 
106  rCell[c0] += dFlux;
107 
108  offdiag = diffCoeff;
109 
110  diag[c0] -= diffCoeff;
111 
112  }
113  }
114  }
115 private:
116 
122 
123 };
124 
125 #endif
int getCount(const int i) const
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
int getSelfCount() const
Definition: StorageSite.h:40
Field coordinate
Definition: GeomFields.h:19
T harmonicAverage(const T &x0, const T &x1)
const GeomFields & _geomFields
const StorageSite & getParentFaceGroupSite() const
Definition: Mesh.h:329
CCMatrix::DiagArray DiagArray
NumTypeTraits< X >::T_Scalar T_Scalar
Definition: Field.h:14
OffDiag & getCoeff(const int i, const int j)
Definition: CRMatrix.h:836
Definition: Mesh.h:49
T mag(const Vector< T, 3 > &a)
Definition: Vector.h:260
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
Array< VectorT3 > VectorT3Array
const Field & _dielectric_constant
const T_Scalar _dielectric_thickness
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
Array< T_Scalar > TArray
CRMatrix< Diag, OffDiag, X > CCMatrix
const CRConnectivity & getCellCells() const
Definition: Mesh.cpp:480
Vector< T_Scalar, 3 > VectorT3
const StorageSite & getCells() const
Definition: Mesh.h:109
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
Field areaMag
Definition: GeomFields.h:25
LinearizeDielectric(const GeomFields &geomFields, const Field &dielectric_constant, const T_Scalar dielectric_thickness, Field &varField, const T_Scalar source=0.0)