5 #ifndef _ELECDIFFUSIONDISCRETIZATION_H_
6 #define _ELECDIFFUSIONDISCRETIZATION_H_
30 template<
class X,
class Diag,
class OffDiag>
54 const Field& diffusivityField,
55 const Field& varGradientField) :
75 const TArray& faceAreaMag =
92 const XArray& xCell =
dynamic_cast<const XArray&
>(xField[cVarIndex]);
93 XArray& rCell =
dynamic_cast<XArray&
>(rField[cVarIndex]);
103 const int nFaces = faces.
getCount();
104 for(
int f=0; f<nFaces; f++)
106 const int c0 = faceCells(f,0);
107 const int c1 = faceCells(f,1);
112 VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
123 ds = faceCentroid[f]-cellCentroid[c0];
128 ds = cellCentroid[c1]-faceCentroid[f];
134 faceDiffusivity = diffCell[c1];
136 faceDiffusivity = diffCell[c0];
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);
144 const XGrad gradF = (xGradCell[c0]*vol0+xGradCell[c1]*vol1)/(vol0+vol1);
146 const X dFluxSecondary = gradF*secondaryCoeff;
148 const X dFlux = diffCoeff*(xCell[c1]-xCell[c0]) + dFluxSecondary;
150 rCell[c0][1] += dFlux[1];
151 rCell[c1][1] -= dFlux[1];
156 diag[c0][3] -= diffCoeff;
157 diag[c1][3] -= diffCoeff;
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
T harmonicAverage(const T &x0, const T &x1)
const Field & _varGradientField
NumTypeTraits< X >::T_Scalar T_Scalar
OffDiag & getCoeff10(const int np)
Array< Diag > & getDiag()
Array< VectorT3 > VectorT3Array
CCMatrix::PairWiseAssembler CCAssembler
const CRConnectivity & getAllFaceCells() const
CCMatrix::DiagArray DiagArray
const Field & _diffusivityField
pair< const Field *, const StorageSite * > ArrayIndex
ElecDiffusionDiscretization(const MeshList &meshes, const GeomFields &geomFields, Field &varField, const Field &diffusivityField, const Field &varGradientField)
const StorageSite & getFaces() const
const StorageSite & getCells() const
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
OffDiag & getCoeff01(const int np)
CRMatrix< Diag, OffDiag, X > CCMatrix
PairWiseAssembler & getPairWiseAssembler(const CRConnectivity &pairs)
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
const GeomFields & _geomFields
Vector< T_Scalar, 3 > VectorT3
vector< Mesh * > MeshList