Memosa-FVM  0.2
MomentumPressureGradientDiscretization< X > Class Template Reference

#include <MomentumPressureGradientDiscretization.h>

Inheritance diagram for MomentumPressureGradientDiscretization< X >:
Collaboration diagram for MomentumPressureGradientDiscretization< X >:

Public Types

typedef NumTypeTraits< X >
::T_Scalar 
T_Scalar
 
typedef MatrixTraitHelper< X >
::T_Matrix 
CCMatrix
 
typedef Gradient< X > XGrad
 
typedef GradientMatrix< X > GradMatrix
 
typedef GradMatrix::Coord VPCoeff
 
typedef Array< X > XArray
 
typedef Array< T_ScalarTArray
 
typedef Vector< T_Scalar, 3 > VectorT3
 
typedef Array< VectorT3VectorT3Array
 
typedef Array< XGradGradArray
 

Public Member Functions

 MomentumPressureGradientDiscretization (const MeshList &meshes, const GeomFields &geomFields, FlowFields &flowFields, GradientModel< X > &pressureGradientModel)
 
void discretize (const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &, MultiField &rField)
 
- Public Member Functions inherited from Discretization
 Discretization (const MeshList &meshes)
 
virtual ~Discretization ()
 
 DEFINE_TYPENAME ("Discretization")
 

Private Attributes

const GeomFields_geomFields
 
FlowFields_flowFields
 
GradientModel< X > & _pressureGradientModel
 

Additional Inherited Members

- Protected Attributes inherited from Discretization
const MeshList_meshes
 

Detailed Description

template<class X>
class MomentumPressureGradientDiscretization< X >

Definition at line 26 of file MomentumPressureGradientDiscretization.h.

Member Typedef Documentation

template<class X >
typedef MatrixTraitHelper<X>::T_Matrix MomentumPressureGradientDiscretization< X >::CCMatrix

Definition at line 32 of file MomentumPressureGradientDiscretization.h.

template<class X >
typedef Array<XGrad> MomentumPressureGradientDiscretization< X >::GradArray

Definition at line 43 of file MomentumPressureGradientDiscretization.h.

Definition at line 35 of file MomentumPressureGradientDiscretization.h.

template<class X >
typedef Array<T_Scalar> MomentumPressureGradientDiscretization< X >::TArray

Definition at line 39 of file MomentumPressureGradientDiscretization.h.

template<class X >
typedef Vector<T_Scalar,3> MomentumPressureGradientDiscretization< X >::VectorT3

Definition at line 40 of file MomentumPressureGradientDiscretization.h.

template<class X >
typedef Array<X> MomentumPressureGradientDiscretization< X >::XArray

Definition at line 38 of file MomentumPressureGradientDiscretization.h.

template<class X >
typedef Gradient<X> MomentumPressureGradientDiscretization< X >::XGrad

Definition at line 34 of file MomentumPressureGradientDiscretization.h.

Constructor & Destructor Documentation

template<class X >
MomentumPressureGradientDiscretization< X >::MomentumPressureGradientDiscretization ( const MeshList meshes,
const GeomFields geomFields,
FlowFields flowFields,
GradientModel< X > &  pressureGradientModel 
)
inline

Definition at line 49 of file MomentumPressureGradientDiscretization.h.

52  :
53  Discretization(meshes),
54  _geomFields(geomFields),
55  _flowFields(flowFields),
56  _pressureGradientModel(pressureGradientModel)
57  {}
Discretization(const MeshList &meshes)

Member Function Documentation

template<class X >
void MomentumPressureGradientDiscretization< X >::discretize ( const Mesh mesh,
MultiFieldMatrix mfmatrix,
MultiField ,
MultiField rField 
)
inlinevirtual

Implements Discretization.

Definition at line 60 of file MomentumPressureGradientDiscretization.h.

References MomentumPressureGradientDiscretization< X >::_flowFields, MomentumPressureGradientDiscretization< X >::_geomFields, MomentumPressureGradientDiscretization< X >::_pressureGradientModel, GeomFields::area, GeomFields::areaMag, Mesh::getAllFaceCells(), Mesh::getBoundaryFaceGroups(), Mesh::getCells(), GradientMatrix< T_Scalar >::getCoeffs(), StorageSite::getCount(), Mesh::getFaceCells(), Mesh::getFaces(), MultiFieldMatrix::getMatrix(), CRConnectivity::getRow(), StorageSite::getSelfCount(), FaceGroup::groupType, MultiFieldMatrix::hasMatrix(), FlowFields::pressure, FlowFields::pressureGradient, reflectGradient(), FaceGroup::site, FlowFields::velocity, GeomFields::volume, and Array< T >::zero().

62  {
63  const StorageSite& cells = mesh.getCells();
64 
65  const TArray& cellVolume = dynamic_cast<const TArray&>(_geomFields.volume[cells]);
66 
67  const MultiField::ArrayIndex vIndex(&_flowFields.velocity,&cells);
68  VectorT3Array& rCell = dynamic_cast<VectorT3Array&>(rField[vIndex]);
69  GradArray& pGradCell = dynamic_cast<GradArray&>(_flowFields.pressureGradient[cells]);
70 
71  const int nCells = cells.getSelfCount();
72 
73 
74  const StorageSite& faces = mesh.getFaces();
75  const CRConnectivity& faceCells = mesh.getAllFaceCells();
76  const VectorT3Array& faceArea =
77  dynamic_cast<const VectorT3Array&>(_geomFields.area[faces]);
78  const TArray& facePressure = dynamic_cast<const TArray&>(_flowFields.pressure[faces]);
79 
80  pGradCell.zero();
81 
82  const int nFaces = faces.getCount();
83  for(int f=0; f<nFaces; f++)
84  {
85  const int c0 = faceCells(f,0);
86  const int c1 = faceCells(f,1);
87  pGradCell[c0].accumulate(faceArea[f],facePressure[f]);
88  pGradCell[c1].accumulate(faceArea[f],-facePressure[f]);
89  }
90 
91  for(int c=0; c<nCells; c++)
92  pGradCell[c] /= cellVolume[c];
93 
94  // copy boundary values from adjacent cells
95  foreach(const FaceGroupPtr fgPtr, mesh.getBoundaryFaceGroups())
96  {
97  const FaceGroup& fg = *fgPtr;
98  const StorageSite& faces = fg.site;
99  const CRConnectivity& faceCells = mesh.getFaceCells(faces);
100  const int faceCount = faces.getCount();
101 
102  if (fg.groupType == "symmetry")
103  {
104  const VectorT3Array& faceArea =
105  dynamic_cast<const VectorT3Array&>(_geomFields.area[faces]);
106  const TArray& faceAreaMag =
107  dynamic_cast<const TArray&>(_geomFields.areaMag[faces]);
108  for(int f=0; f<faceCount; f++)
109  {
110  const int c0 = faceCells(f,0);
111  const int c1 = faceCells(f,1);
112  const VectorT3 en = faceArea[f]/faceAreaMag[f];
113  reflectGradient(pGradCell[c1], pGradCell[c0], en);
114  }
115  }
116  else
117  {
118  for(int f=0; f<faceCount; f++)
119  {
120  const int c0 = faceCells(f,0);
121  const int c1 = faceCells(f,1);
122 
123  pGradCell[c1] = pGradCell[c0];
124  }
125  }
126  }
127 
128 
129  for(int c=0; c<nCells; c++)
130  {
131  rCell[c][0] -= cellVolume[c]*pGradCell[c][0];
132  rCell[c][1] -= cellVolume[c]*pGradCell[c][1];
133  rCell[c][2] -= cellVolume[c]*pGradCell[c][2];
134 
135  }
136 
137 
138 #ifdef PV_COUPLED
139  const MultiField::ArrayIndex pIndex(&_flowFields.pressure,&cells);
140  if (mfmatrix.hasMatrix(vIndex,pIndex))
141  {
142  VPMatrix& vpMatrix =
143  dynamic_cast<VPMatrix&>(mfmatrix.getMatrix(vIndex,pIndex));
144 
145  const GradientMatrix<X>& gradMatrix =
146  _pressureGradientModel.getGradientMatrix(mesh, _geomFields);
147 
148  const Array<VPCoeff>& gradMatrixCoeffs = gradMatrix.getCoeffs();
149  Array<VPCoeff>& vpDiag = vpMatrix.getDiag();
150  Array<VPCoeff>& vpOffDiag = vpMatrix.getOffDiag();
151 
152  const CRConnectivity& conn = vpMatrix.getConnectivity();
153  const Array<int>& row = conn.getRow();
154 
155  // all of this assumes that the connectivity of the gradient
156  // matrix and vp matrix is the same
157  for(int c=0; c<nCells; c++)
158  {
159  for(int nnb=row[c]; nnb<row[c+1]; nnb++)
160  {
161  const VPCoeff& coeff = gradMatrixCoeffs[nnb];
162  vpDiag[c] += coeff*cellVolume[c];
163  vpOffDiag[nnb] -= coeff*cellVolume[c];
164  }
165  }
166  }
167 #endif
168  }
const FaceGroupList & getBoundaryFaceGroups() const
Definition: Mesh.h:187
Field pressure
Definition: FlowFields.h:16
const Array< int > & getRow() const
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
shared_ptr< FaceGroup > FaceGroupPtr
Definition: Mesh.h:46
int getSelfCount() const
Definition: StorageSite.h:40
Definition: Mesh.h:28
void reflectGradient(Gradient< T > &gr, const Gradient< T > &g0, const Vector< T, 3 > &en)
Definition: GradientModel.h:23
bool hasMatrix(const Index &rowIndex, const Index &colIndex) const
string groupType
Definition: Mesh.h:42
const CRConnectivity & getAllFaceCells() const
Definition: Mesh.cpp:378
Array< Coord > & getCoeffs()
Field pressureGradient
Definition: FlowFields.h:19
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
const StorageSite & getFaces() const
Definition: Mesh.h:108
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
Field areaMag
Definition: GeomFields.h:25
Field velocity
Definition: FlowFields.h:15
StorageSite site
Definition: Mesh.h:40

Member Data Documentation

template<class X >
const GeomFields& MomentumPressureGradientDiscretization< X >::_geomFields
private
template<class X >
GradientModel<X>& MomentumPressureGradientDiscretization< X >::_pressureGradientModel
private

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