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