5 #ifndef _DIFFUSIONDISCRETIZATION_H_
6 #define _DIFFUSIONDISCRETIZATION_H_
30 template<
class X,
class Diag,
class OffDiag>
54 const Field& diffusivityField,
55 const Field& varGradientField,
82 const XArray& xCell =
dynamic_cast<const XArray&
>(xField[cVarIndex]);
83 XArray& rCell =
dynamic_cast<XArray&
>(rField[cVarIndex]);
97 if (fg.
groupType ==
"dielectric interface")
100 const int nFaces = faces.
getCount();
104 const TArray& faceAreaMag =
112 for(
int f=0; f<nFaces; f++)
114 const int c0 = faceCells(f,0);
115 const int c1 = faceCells(f,1);
120 VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
126 if (
dot(faceArea[f],ds) < 0.0)
130 const T_Scalar diffCoeff = faceDiffusivity*diffMetric;
134 const X dFlux = diffCoeff*(xCell[c1]-xCell[c0]);
142 diag[c0] -= diffCoeff;
143 diag[c1] -= diffCoeff;
156 const int nFaces = faces.
getCount();
160 const TArray& faceAreaMag =
165 for(
int f=0; f<nFaces; f++)
167 const int c0 = faceCells(f,0);
168 const int c1 = faceCells(f,1);
173 VectorT3 ds=cellCentroid[c1]-cellCentroid[c0];
184 ds = faceCentroid[f]-cellCentroid[c0];
189 ds = cellCentroid[c1]-faceCentroid[f];
195 faceDiffusivity = diffCell[c1];
197 faceDiffusivity = diffCell[c0];
201 const T_Scalar diffMetric = faceAreaMag[f]*faceAreaMag[f]/
dot(faceArea[f],ds);
202 const T_Scalar diffCoeff = faceDiffusivity*diffMetric;
203 const VectorT3 secondaryCoeff = faceDiffusivity*(faceArea[f]-ds*diffMetric);
205 const XGrad gradF = (xGradCell[c0]*vol0+xGradCell[c1]*vol1)/(vol0+vol1);
207 const X dFluxSecondary = gradF*secondaryCoeff;
209 const X dFlux = diffCoeff*(xCell[c1]-xCell[c0]) + dFluxSecondary;
217 diag[c0] -= diffCoeff;
218 diag[c1] -= diffCoeff;
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
shared_ptr< FaceGroup > FaceGroupPtr
T harmonicAverage(const T &x0, const T &x1)
const FaceGroupList & getAllFaceGroups() const
CCMatrix::DiagArray DiagArray
CCMatrix::PairWiseAssembler CCAssembler
T mag(const Vector< T, 3 > &a)
OffDiag & getCoeff10(const int np)
Array< Diag > & getDiag()
DiffusionDiscretization(const MeshList &meshes, const GeomFields &geomFields, Field &varField, const Field &diffusivityField, const Field &varGradientField, const T_Scalar thickness=0.0)
const Field & _diffusivityField
pair< const Field *, const StorageSite * > ArrayIndex
NumTypeTraits< X >::T_Scalar T_Scalar
const StorageSite & getCells() const
OffDiag & getCoeff01(const int np)
const CRConnectivity & getFaceCells(const StorageSite &site) const
const T_Scalar _thickness
CRMatrix< Diag, OffDiag, X > CCMatrix
const GeomFields & _geomFields
PairWiseAssembler & getPairWiseAssembler(const CRConnectivity &pairs)
Array< VectorT3 > VectorT3Array
T dot(const Vector< T, 3 > &a, const Vector< T, 3 > &b)
const Field & _varGradientField
vector< Mesh * > MeshList
Vector< T_Scalar, 3 > VectorT3