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

#include <BatteryPCDiffusionDiscretization.h>

Inheritance diagram for BatteryPCDiffusionDiscretization< X, Diag, OffDiag >:
Collaboration diagram for BatteryPCDiffusionDiscretization< 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< X > XArray
 
typedef Array< T_ScalarTArray
 
typedef Vector< T_Scalar, 3 > VectorT3
 
typedef Array< VectorT3VectorT3Array
 
typedef Array< XGradGradArray
 
typedef Gradient< T_ScalarTGrad
 

Public Member Functions

 BatteryPCDiffusionDiscretization (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 BatteryPCDiffusionDiscretization< X, Diag, OffDiag >

Definition at line 35 of file BatteryPCDiffusionDiscretization.h.

Member Typedef Documentation

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

Definition at line 43 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 41 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 42 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 53 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 39 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 49 of file BatteryPCDiffusionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Gradient<T_Scalar> BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::TGrad

Definition at line 67 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 50 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 51 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 48 of file BatteryPCDiffusionDiscretization.h.

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

Definition at line 45 of file BatteryPCDiffusionDiscretization.h.

Constructor & Destructor Documentation

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

Definition at line 69 of file BatteryPCDiffusionDiscretization.h.

73  :
74  Discretization(meshes),
75  _geomFields(geomFields),
76  _varField(varField),
77  _diffusivityField(diffusivityField),
78  _varGradientField(varGradientField)
79  {}
Discretization(const MeshList &meshes)

Member Function Documentation

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

Implements Discretization.

Definition at line 81 of file BatteryPCDiffusionDiscretization.h.

References BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::_diffusivityField, BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::_geomFields, BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::_varField, BatteryPCDiffusionDiscretization< X, Diag, OffDiag >::_varGradientField, GeomFields::area, GeomFields::areaMag, GeomFields::coordinate, dot(), Mesh::getAllFaceGroups(), 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::getDimension(), Mesh::getFaceCells(), MultiFieldMatrix::getMatrix(), CRMatrix< T_Diag, T_OffDiag, X >::getPairWiseAssembler(), harmonicAverageVector(), FaceGroup::site, and GeomFields::volume.

83  {
84  const StorageSite& cells = mesh.getCells();
85 
86  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
87  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,
88  cVarIndex));
89 
90  const VectorT3Array& cellCentroid =
91  dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[cells]);
92 
93  const TArray& cellVolume =
94  dynamic_cast<const TArray&>(_geomFields.volume[cells]);
95 
96  DiagArray& diag = matrix.getDiag();
97 
98  const XArray& xCell = dynamic_cast<const XArray&>(xField[cVarIndex]);
99  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
100 
101  const GradArray& xGradCell =
102  dynamic_cast<const GradArray&>(_varGradientField[cells]);
103 
104  const XArray& diffCell =
105  dynamic_cast<const XArray&>(_diffusivityField[cells]);
106 
107  foreach(const FaceGroupPtr fgPtr, mesh.getAllFaceGroups())
108  {
109  const FaceGroup& fg = *fgPtr;
110  const StorageSite& faces = fg.site;
111  const int nFaces = faces.getCount();
112  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
113  const VectorT3Array& faceArea =
114  dynamic_cast<const VectorT3Array&>(_geomFields.area[faces]);
115  const TArray& faceAreaMag =
116  dynamic_cast<const TArray&>(_geomFields.areaMag[faces]);
117  //const VectorT3Array& faceCentroid = dynamic_cast<const VectorT3Array&>(_geomFields.coordinate[faces]);
118  CCAssembler& assembler = matrix.getPairWiseAssembler(faceCells);
119 
120  int XLength = 0;
121  NumTypeTraits<X>::getShape(&XLength);
122 
123  for(int f=0; f<nFaces; f++)
124  {
125  const int c0 = faceCells(f,0);
126  const int c1 = faceCells(f,1);
127 
128  T_Scalar vol0 = cellVolume[c0];
129  T_Scalar vol1 = cellVolume[c1];
130 
131  VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
132 
133 
134  // for ib faces ignore the solid cell and use the face centroid for diff metric
135  /*
136  if (((ibType[c0] == Mesh::IBTYPE_FLUID)
137  && (ibType[c1] == Mesh::IBTYPE_BOUNDARY)) ||
138  ((ibType[c1] == Mesh::IBTYPE_FLUID)
139  && (ibType[c0] == Mesh::IBTYPE_BOUNDARY)))
140  {
141  if (ibType[c0] == Mesh::IBTYPE_FLUID)
142  {
143  vol1 = 0.;
144  ds = faceCentroid[f]-cellCentroid[c0];
145  }
146  else
147  {
148  vol0 = 0.;
149  ds = cellCentroid[c1]-faceCentroid[f];
150  }
151  }*/
152 
153  //for(int v=0; v<XLength; v++)
154 
155  X faceDiffusivity(NumTypeTraits<X>::getZero());
156  if (vol0 == 0.)
157  faceDiffusivity = (diffCell[c1]);
158  else if (vol1 == 0.)
159  faceDiffusivity = (diffCell[c0]);
160  else
161  {
162  faceDiffusivity = harmonicAverageVector(diffCell[c0],diffCell[c1]);
163  }
164 
165  const T_Scalar diffMetric = faceAreaMag[f]*faceAreaMag[f]/dot(faceArea[f],ds);
166 
167  //do things element-wise manually
168  // Each 'v' below is on equation
169  // first equation is potential, followed by species equation, then thermal
170  for(int v=0; v<XLength; v++)
171  {
172  const T_Scalar diffCoeff = (faceDiffusivity[v])*diffMetric;
173 
174  const VectorT3 secondaryCoeff = (faceDiffusivity[v])*(faceArea[f]-ds*diffMetric);
175 
176  //extract this v's gradient
177  const XGrad gradF_X = ((xGradCell[c0]*vol0+xGradCell[c1]*vol1)/(vol0+vol1));
179  gradF[0] = gradF_X[0][v];
180  gradF[1] = gradF_X[1][v];
181  if (mesh.getDimension() == 3)
182  gradF[2] = gradF_X[2][v];
183 
184  const T_Scalar dFluxSecondary = gradF*secondaryCoeff;
185 
186  const T_Scalar dFlux = diffCoeff*((xCell[c1])[v]-(xCell[c0])[v]) + dFluxSecondary;
187 
188  (rCell[c0])[v] += dFlux;
189  (rCell[c1])[v] -= dFlux;
190 
191  (assembler.getCoeff01(f))[v] +=diffCoeff;
192  (assembler.getCoeff10(f))[v] +=diffCoeff;
193 
194  (diag[c0])[v] -= diffCoeff;
195  (diag[c1])[v] -= diffCoeff;
196  }
197 
198  }
199  }
200  }
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
Field coordinate
Definition: GeomFields.h:19
Definition: Mesh.h:28
const FaceGroupList & getAllFaceGroups() const
Definition: Mesh.h:193
T harmonicAverageVector(const T &x0, const T &x1)
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
const StorageSite & getCells() const
Definition: Mesh.h:109
Field volume
Definition: GeomFields.h:26
const CRConnectivity & getFaceCells(const StorageSite &site) const
Definition: Mesh.cpp:388
int getCount() const
Definition: StorageSite.h:39
Field area
Definition: GeomFields.h:23
int getDimension() const
Definition: Mesh.h:105
Field areaMag
Definition: GeomFields.h:25
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
Definition: Vector.h:253
StorageSite site
Definition: Mesh.h:40

Member Data Documentation

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

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