5 #ifndef _BATTERYPCDIFFUSIONDISCRETIZATION_H_
6 #define _BATTERYPCDIFFUSIONDISCRETIZATION_H_
26 for (
int v=0; v<vectorLength; v++)
29 harmAvg[v] = 2.0*x0[v]*x1[v]/sum[v];
34 template<
class X,
class Diag,
class OffDiag>
72 const Field& diffusivityField,
73 const Field& varGradientField) :
98 const XArray& xCell =
dynamic_cast<const XArray&
>(xField[cVarIndex]);
99 XArray& rCell =
dynamic_cast<XArray&
>(rField[cVarIndex]);
111 const int nFaces = faces.
getCount();
115 const TArray& faceAreaMag =
123 for(
int f=0; f<nFaces; f++)
125 const int c0 = faceCells(f,0);
126 const int c1 = faceCells(f,1);
131 VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
157 faceDiffusivity = (diffCell[c1]);
159 faceDiffusivity = (diffCell[c0]);
165 const T_Scalar diffMetric = faceAreaMag[f]*faceAreaMag[f]/
dot(faceArea[f],ds);
170 for(
int v=0; v<XLength; v++)
172 const T_Scalar diffCoeff = (faceDiffusivity[v])*diffMetric;
174 const VectorT3 secondaryCoeff = (faceDiffusivity[v])*(faceArea[f]-ds*diffMetric);
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];
182 gradF[2] = gradF_X[2][v];
184 const T_Scalar dFluxSecondary = gradF*secondaryCoeff;
186 const T_Scalar dFlux = diffCoeff*((xCell[c1])[v]-(xCell[c0])[v]) + dFluxSecondary;
188 (rCell[c0])[v] += dFlux;
189 (rCell[c1])[v] -= dFlux;
194 (diag[c0])[v] -= diffCoeff;
195 (diag[c1])[v] -= diffCoeff;
const GeomFields & _geomFields
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
shared_ptr< FaceGroup > FaceGroupPtr
NumTypeTraits< X >::T_Scalar T_Scalar
Vector< T_Scalar, 3 > VectorT3
const FaceGroupList & getAllFaceGroups() const
OffDiag & getCoeff10(const int np)
Array< Diag > & getDiag()
CCMatrix::PairWiseAssembler CCAssembler
Gradient< T_Scalar > TGrad
const Field & _diffusivityField
T harmonicAverageVector(const T &x0, const T &x1)
pair< const Field *, const StorageSite * > ArrayIndex
CRMatrix< Diag, OffDiag, X > CCMatrix
const StorageSite & getCells() const
OffDiag & getCoeff01(const int np)
const CRConnectivity & getFaceCells(const StorageSite &site) const
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
const Field & _varGradientField
Array< VectorT3 > VectorT3Array
PairWiseAssembler & getPairWiseAssembler(const CRConnectivity &pairs)
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
vector< Mesh * > MeshList
BatteryPCDiffusionDiscretization(const MeshList &meshes, const GeomFields &geomFields, Field &varField, const Field &diffusivityField, const Field &varGradientField)
CCMatrix::DiagArray DiagArray