Memosa-FVM  0.2
ElecDiffusionDiscretization< X, Diag, OffDiag > Class Template Reference

#include <ElecDiffusionDiscretization.h>

Inheritance diagram for ElecDiffusionDiscretization< X, Diag, OffDiag >:
Collaboration diagram for ElecDiffusionDiscretization< X, Diag, OffDiag >:

Public Types

typedef NumTypeTraits< X >
::T_Scalar 
T_Scalar
 
typedef CRMatrix< Diag,
OffDiag, X > 
CCMatrix
 
typedef CCMatrix::DiagArray DiagArray
 
typedef CCMatrix::PairWiseAssembler CCAssembler
 
typedef Gradient< X > XGrad
 
typedef Array< int > IntArray
 
typedef Array< X > XArray
 
typedef Array< T_ScalarTArray
 
typedef Vector< T_Scalar, 3 > VectorT3
 
typedef Array< VectorT3VectorT3Array
 
typedef Array< XGradGradArray
 

Public Member Functions

 ElecDiffusionDiscretization (const MeshList &meshes, const GeomFields &geomFields, Field &varField, const Field &diffusivityField, const Field &varGradientField)
 
void discretize (const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
 
- Public Member Functions inherited from Discretization
 Discretization (const MeshList &meshes)
 
virtual ~Discretization ()
 
 DEFINE_TYPENAME ("Discretization")
 

Private Attributes

const GeomFields_geomFields
 
Field_varField
 
const Field_diffusivityField
 
const Field_varGradientField
 

Additional Inherited Members

- Protected Attributes inherited from Discretization
const MeshList_meshes
 

Detailed Description

template<class X, class Diag, class OffDiag>
class ElecDiffusionDiscretization< X, Diag, OffDiag >

Definition at line 31 of file ElecDiffusionDiscretization.h.

Member Typedef Documentation

template<class X , class Diag , class OffDiag >
typedef CCMatrix::PairWiseAssembler ElecDiffusionDiscretization< X, Diag, OffDiag >::CCAssembler

Definition at line 39 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef CRMatrix<Diag,OffDiag,X> ElecDiffusionDiscretization< X, Diag, OffDiag >::CCMatrix

Definition at line 37 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef CCMatrix::DiagArray ElecDiffusionDiscretization< X, Diag, OffDiag >::DiagArray

Definition at line 38 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<XGrad> ElecDiffusionDiscretization< X, Diag, OffDiag >::GradArray

Definition at line 49 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<int> ElecDiffusionDiscretization< X, Diag, OffDiag >::IntArray

Definition at line 43 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef NumTypeTraits<X>::T_Scalar ElecDiffusionDiscretization< X, Diag, OffDiag >::T_Scalar

Definition at line 35 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<T_Scalar> ElecDiffusionDiscretization< X, Diag, OffDiag >::TArray

Definition at line 45 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Vector<T_Scalar,3> ElecDiffusionDiscretization< X, Diag, OffDiag >::VectorT3

Definition at line 46 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<VectorT3> ElecDiffusionDiscretization< X, Diag, OffDiag >::VectorT3Array

Definition at line 47 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<X> ElecDiffusionDiscretization< X, Diag, OffDiag >::XArray

Definition at line 44 of file ElecDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Gradient<X> ElecDiffusionDiscretization< X, Diag, OffDiag >::XGrad

Definition at line 41 of file ElecDiffusionDiscretization.h.

Constructor & Destructor Documentation

template<class X , class Diag , class OffDiag >
ElecDiffusionDiscretization< X, Diag, OffDiag >::ElecDiffusionDiscretization ( const MeshList meshes,
const GeomFields geomFields,
Field varField,
const Field diffusivityField,
const Field varGradientField 
)
inline

Definition at line 51 of file ElecDiffusionDiscretization.h.

55  :
56  Discretization(meshes),
57  _geomFields(geomFields),
58  _varField(varField),
59  _diffusivityField(diffusivityField),
60  _varGradientField(varGradientField)
61  {}
Discretization(const MeshList &meshes)

Member Function Documentation

template<class X , class Diag , class OffDiag >
void ElecDiffusionDiscretization< X, Diag, OffDiag >::discretize ( const Mesh mesh,
MultiFieldMatrix mfmatrix,
MultiField xField,
MultiField rField 
)
inlinevirtual

Implements Discretization.

Definition at line 63 of file ElecDiffusionDiscretization.h.

References ElecDiffusionDiscretization< X, Diag, OffDiag >::_diffusivityField, ElecDiffusionDiscretization< X, Diag, OffDiag >::_geomFields, ElecDiffusionDiscretization< X, Diag, OffDiag >::_varField, ElecDiffusionDiscretization< X, Diag, OffDiag >::_varGradientField, GeomFields::area, GeomFields::areaMag, GeomFields::coordinate, dot(), Mesh::getAllFaceCells(), Mesh::getCells(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff01(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff10(), StorageSite::getCount(), CRMatrix< T_Diag, T_OffDiag, X >::getDiag(), Mesh::getFaces(), MultiFieldMatrix::getMatrix(), CRMatrix< T_Diag, T_OffDiag, X >::getPairWiseAssembler(), harmonicAverage(), GeomFields::ibType, Mesh::IBTYPE_BOUNDARY, Mesh::IBTYPE_FLUID, and GeomFields::volume.

65  {
66  const StorageSite& cells = mesh.getCells();
67  const StorageSite& faces = mesh.getFaces();
68  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
69  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,
70  cVarIndex));
71 
72  const VectorT3Array& faceArea =
73  dynamic_cast<const VectorT3Array&>(_geomFields.area[faces]);
74 
75  const TArray& faceAreaMag =
76  dynamic_cast<const TArray&>(_geomFields.areaMag[faces]);
77 
78  const VectorT3Array& cellCentroid =
79  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[cells]);
80 
81  const VectorT3Array& faceCentroid =
82  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[faces]);
83 
84  const TArray& cellVolume =
85  dynamic_cast<const TArray&>(_geomFields.volume[cells]);
86 
87  const CRConnectivity& faceCells = mesh.getAllFaceCells();
88 
89  CCAssembler& assembler = matrix.getPairWiseAssembler(faceCells);
90  DiagArray& diag = matrix.getDiag();
91 
92  const XArray& xCell = dynamic_cast<const XArray&>(xField[cVarIndex]);
93  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
94 
95  const GradArray& xGradCell =
96  dynamic_cast<const GradArray&>(_varGradientField[cells]);
97 
98  const TArray& diffCell =
99  dynamic_cast<const TArray&>(_diffusivityField[cells]);
100 
101  const IntArray& ibType = dynamic_cast<const IntArray&>(_geomFields.ibType[cells]);
102 
103  const int nFaces = faces.getCount();
104  for(int f=0; f<nFaces; f++)
105  {
106  const int c0 = faceCells(f,0);
107  const int c1 = faceCells(f,1);
108 
109  T_Scalar vol0 = cellVolume[c0];
110  T_Scalar vol1 = cellVolume[c1];
111 
112  VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
113 
114  // for ib faces ignore the solid cell and use the face centroid for diff metric
115  if (((ibType[c0] == Mesh::IBTYPE_FLUID)
116  && (ibType[c1] == Mesh::IBTYPE_BOUNDARY)) ||
117  ((ibType[c1] == Mesh::IBTYPE_FLUID)
118  && (ibType[c0] == Mesh::IBTYPE_BOUNDARY)))
119  {
120  if (ibType[c0] == Mesh::IBTYPE_FLUID)
121  {
122  vol1 = 0.;
123  ds = faceCentroid[f]-cellCentroid[c0];
124  }
125  else
126  {
127  vol0 = 0.;
128  ds = cellCentroid[c1]-faceCentroid[f];
129  }
130  }
131 
132  T_Scalar faceDiffusivity(1.0);
133  if (vol0 == 0.)
134  faceDiffusivity = diffCell[c1];
135  else if (vol1 == 0.)
136  faceDiffusivity = diffCell[c0];
137  else
138  faceDiffusivity = harmonicAverage(diffCell[c0],diffCell[c1]);
139 
140  const T_Scalar diffMetric = faceAreaMag[f]*faceAreaMag[f]/dot(faceArea[f],ds);
141  const T_Scalar diffCoeff = faceDiffusivity*diffMetric;
142  const VectorT3 secondaryCoeff = faceDiffusivity*(faceArea[f]-ds*diffMetric);
143 
144  const XGrad gradF = (xGradCell[c0]*vol0+xGradCell[c1]*vol1)/(vol0+vol1);
145 
146  const X dFluxSecondary = gradF*secondaryCoeff;
147 
148  const X dFlux = diffCoeff*(xCell[c1]-xCell[c0]) + dFluxSecondary;
149 
150  rCell[c0][1] += dFlux[1];
151  rCell[c1][1] -= dFlux[1];
152 
153  assembler.getCoeff01(f)[3] +=diffCoeff;
154  assembler.getCoeff10(f)[3] +=diffCoeff;
155 
156  diag[c0][3] -= diffCoeff;
157  diag[c1][3] -= diffCoeff;
158  }
159  }
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
Field coordinate
Definition: GeomFields.h:19
T harmonicAverage(const T &x0, const T &x1)
NumTypeTraits< X >::T_Scalar T_Scalar
CCMatrix::PairWiseAssembler CCAssembler
Field ibType
Definition: GeomFields.h:38
const CRConnectivity & getAllFaceCells() const
Definition: Mesh.cpp:378
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
const StorageSite & getFaces() const
Definition: Mesh.h:108
const StorageSite & getCells() const
Definition: Mesh.h:109
Field volume
Definition: GeomFields.h:26
CRMatrix< Diag, OffDiag, X > CCMatrix
int getCount() const
Definition: StorageSite.h:39
Field area
Definition: GeomFields.h:23
Field areaMag
Definition: GeomFields.h:25
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
Definition: Vector.h:253

Member Data Documentation

template<class X , class Diag , class OffDiag >
const Field& ElecDiffusionDiscretization< X, Diag, OffDiag >::_diffusivityField
private
template<class X , class Diag , class OffDiag >
const GeomFields& ElecDiffusionDiscretization< X, Diag, OffDiag >::_geomFields
private
template<class X , class Diag , class OffDiag >
Field& ElecDiffusionDiscretization< X, Diag, OffDiag >::_varField
private
template<class X , class Diag , class OffDiag >
const Field& ElecDiffusionDiscretization< X, Diag, OffDiag >::_varGradientField
private

The documentation for this class was generated from the following file: