Memosa-FVM  0.2
PhononConvectionDiscretization< X, Diag, OffDiag > Class Template Reference

#include <PhononConvectionDiscretization.h>

Inheritance diagram for PhononConvectionDiscretization< X, Diag, OffDiag >:
Collaboration diagram for PhononConvectionDiscretization< X, Diag, OffDiag >:

Public Types

typedef NumTypeTraits< X >
::T_Scalar 
T_Scalar
 
typedef CRMatrix< Diag,
OffDiag, X > 
CCMatrix
 
typedef CCMatrix::DiagArray DiagArray
 
typedef CCMatrix::PairWiseAssembler CCAssembler
 
typedef Gradient< X > XGrad
 
typedef Array< int > IntArray
 
typedef Array< X > XArray
 
typedef Array< T_ScalarTArray
 
typedef Vector< T_Scalar, 3 > VectorT3
 
typedef Array< VectorT3VectorT3Array
 
typedef Array< XGradGradArray
 

Public Member Functions

 PhononConvectionDiscretization (const MeshList &meshes, const GeomFields &geomFields, Field &varField, const VectorT3 groupvel, const bool useCentralDifference=false)
 
void discretize (const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
 
- Public Member Functions inherited from Discretization
 Discretization (const MeshList &meshes)
 
virtual ~Discretization ()
 
 DEFINE_TYPENAME ("Discretization")
 

Private Attributes

const GeomFields_geomFields
 
const Field_varField
 
const VectorT3 _groupvel
 
const bool _useCentralDifference
 

Additional Inherited Members

- Protected Attributes inherited from Discretization
const MeshList_meshes
 

Detailed Description

template<class X, class Diag, class OffDiag>
class PhononConvectionDiscretization< X, Diag, OffDiag >

Definition at line 18 of file PhononConvectionDiscretization.h.

Member Typedef Documentation

template<class X , class Diag , class OffDiag >
typedef CCMatrix::PairWiseAssembler PhononConvectionDiscretization< X, Diag, OffDiag >::CCAssembler

Definition at line 25 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef CRMatrix<Diag,OffDiag,X> PhononConvectionDiscretization< X, Diag, OffDiag >::CCMatrix

Definition at line 23 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef CCMatrix::DiagArray PhononConvectionDiscretization< X, Diag, OffDiag >::DiagArray

Definition at line 24 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<XGrad> PhononConvectionDiscretization< X, Diag, OffDiag >::GradArray

Definition at line 35 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<int> PhononConvectionDiscretization< X, Diag, OffDiag >::IntArray

Definition at line 29 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef NumTypeTraits<X>::T_Scalar PhononConvectionDiscretization< X, Diag, OffDiag >::T_Scalar

Definition at line 21 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<T_Scalar> PhononConvectionDiscretization< X, Diag, OffDiag >::TArray

Definition at line 31 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Vector<T_Scalar,3> PhononConvectionDiscretization< X, Diag, OffDiag >::VectorT3

Definition at line 32 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<VectorT3> PhononConvectionDiscretization< X, Diag, OffDiag >::VectorT3Array

Definition at line 33 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Array<X> PhononConvectionDiscretization< X, Diag, OffDiag >::XArray

Definition at line 30 of file PhononConvectionDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef Gradient<X> PhononConvectionDiscretization< X, Diag, OffDiag >::XGrad

Definition at line 27 of file PhononConvectionDiscretization.h.

Constructor & Destructor Documentation

template<class X , class Diag , class OffDiag >
PhononConvectionDiscretization< X, Diag, OffDiag >::PhononConvectionDiscretization ( const MeshList meshes,
const GeomFields geomFields,
Field varField,
const VectorT3  groupvel,
const bool  useCentralDifference = false 
)
inline

Definition at line 37 of file PhononConvectionDiscretization.h.

41  :
42 
43  Discretization(meshes),
44  _geomFields(geomFields),
45  _varField(varField),
46  _groupvel(groupvel),
47  _useCentralDifference(useCentralDifference)
48  {}
Discretization(const MeshList &meshes)

Member Function Documentation

template<class X , class Diag , class OffDiag >
void PhononConvectionDiscretization< X, Diag, OffDiag >::discretize ( const Mesh mesh,
MultiFieldMatrix mfmatrix,
MultiField xField,
MultiField rField 
)
inlinevirtual

Implements Discretization.

Definition at line 50 of file PhononConvectionDiscretization.h.

References PhononConvectionDiscretization< X, Diag, OffDiag >::_geomFields, PhononConvectionDiscretization< X, Diag, OffDiag >::_groupvel, PhononConvectionDiscretization< X, Diag, OffDiag >::_useCentralDifference, PhononConvectionDiscretization< X, Diag, OffDiag >::_varField, GeomFields::area, Mesh::getAllFaceCells(), Mesh::getCells(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff01(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff10(), StorageSite::getCount(), CRMatrix< T_Diag, T_OffDiag, X >::getDiag(), Mesh::getFaces(), MultiFieldMatrix::getMatrix(), CRMatrix< T_Diag, T_OffDiag, X >::getPairWiseAssembler(), GeomFields::gridFlux, Field::hasArray(), GeomFields::ibType, Mesh::IBTYPE_BOUNDARY, and Mesh::IBTYPE_FLUID.

52  {
53 
54  const StorageSite& cells = mesh.getCells();
55  const StorageSite& faces = mesh.getFaces();
56 
57 
58  // should there be some other checks ?
59  //if (!_convectingFluxField.hasArray(faces))
60 
61 
62  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
63  CCMatrix& matrix =
64  dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,cVarIndex));
65 
66  const CRConnectivity& faceCells = mesh.getAllFaceCells();
67 
68  CCAssembler& assembler = matrix.getPairWiseAssembler(faceCells);
69  DiagArray& diag = matrix.getDiag();
70 
71  const XArray& xCell = dynamic_cast<const XArray&>(xField[cVarIndex]);
72  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
73 
74  //const GradArray& xGradCell = dynamic_cast<GradArray>(_varGradientField[cells]);
75 
76  const IntArray& ibType = dynamic_cast<const IntArray&>(_geomFields.ibType[cells]);
77 
78  const int nFaces = faces.getCount();
79 
80  const VectorT3Array& faceArea = dynamic_cast<const VectorT3Array&>(_geomFields.area[faces]);
81 
82  if (_geomFields.gridFlux.hasArray(faces))
83  {
84  shared_ptr<TArray> gridFluxPtr(new TArray(nFaces));
85  TArray& gridFlux = *gridFluxPtr;
86  gridFlux = dynamic_cast<const TArray&>(_geomFields.gridFlux[faces]);
87 
88  for(int f=0; f<nFaces; f++)
89  {
90  const int c0 = faceCells(f,0);
91  const int c1 = faceCells(f,1);
92  //const T_Scalar faceCFlux = convectingFlux[f] - gridFlux[f];
93  const T_Scalar faceCFlux = faceArea[f][0]*_groupvel[0]
94  +faceArea[f][1]*_groupvel[1]+faceArea[f][2]*_groupvel[2] - gridFlux[f];
95 
96  X varFlux;
97  if (faceCFlux > T_Scalar(0))
98  {
99  varFlux = faceCFlux*xCell[c0];
100  diag[c0] -= faceCFlux;
101  assembler.getCoeff10(f) += faceCFlux;
102  }
103  else
104  {
105  varFlux = faceCFlux*xCell[c1];
106  diag[c1] += faceCFlux;
107  assembler.getCoeff01(f)-= faceCFlux;
108  }
109 
110  rCell[c0] -= varFlux;
111  rCell[c1] += varFlux;
112  }
113  }
114  else
115  {
117  for(int f=0; f<nFaces; f++)
118  {
119  const int c0 = faceCells(f,0);
120  const int c1 = faceCells(f,1);
121  const T_Scalar faceCFlux = faceArea[f][0]*_groupvel[0]
122  +faceArea[f][1]*_groupvel[1]+faceArea[f][2]*_groupvel[2];
123 
124  bool isIBFace = (((ibType[c0] == Mesh::IBTYPE_FLUID)
125  && (ibType[c1] == Mesh::IBTYPE_BOUNDARY)) ||
126  ((ibType[c1] == Mesh::IBTYPE_FLUID)
127  && (ibType[c0] == Mesh::IBTYPE_BOUNDARY)));
128 
129 
130  X varFlux =0.5*faceCFlux*(xCell[c0] + xCell[c0]);
131 
132  rCell[c0] -= varFlux;
133  rCell[c1] += varFlux;
134 
135  if (isIBFace)
136  {
137  // linearize the actual flux as calculated
138  // above. this will ensure that the Ib
139  // discretization will be able to fix the value
140  // correctly using the ib face value
141 
142  diag[c0] -= 0.5*faceCFlux;
143  assembler.getCoeff10(f) -= 0.5*faceCFlux;
144  diag[c1] += 0.5*faceCFlux;
145  assembler.getCoeff01(f) += 0.5*faceCFlux;
146  }
147  else
148  {
149  // linearize as upwind flux so that linear system
150  // remains diagonally dominant
151  if (faceCFlux > T_Scalar(0))
152  {
153  diag[c0] -= faceCFlux;
154  assembler.getCoeff10(f) += faceCFlux;
155  }
156  else
157  {
158  diag[c1] += faceCFlux;
159  assembler.getCoeff01(f)-= faceCFlux;
160  }
161  }
162  }
163  }
164  else
165  for(int f=0; f<nFaces; f++)
166  {
167  const int c0 = faceCells(f,0);
168  const int c1 = faceCells(f,1);
169 
170  const T_Scalar faceCFlux = faceArea[f][0]*_groupvel[0]
171  +faceArea[f][1]*_groupvel[1]+faceArea[f][2]*_groupvel[2];
172 
173  X varFlux;
174 
175  if (faceCFlux > T_Scalar(0))
176  {
177  varFlux = faceCFlux*xCell[c0];
178  diag[c0] -= faceCFlux;
179  assembler.getCoeff10(f) += faceCFlux;
180  }
181  else
182  {
183  varFlux = faceCFlux*xCell[c1];
184  diag[c1] += faceCFlux;
185  assembler.getCoeff01(f)-= faceCFlux;
186  }
187 
188  rCell[c0] -= varFlux;
189  rCell[c1] += varFlux;
190  }
191  }
192 
193  //const int nCells = cells.getSelfCount();
194  //for(int c=0;c<nCells;c++)
195  //{
196  // const T_Scalar cImb = continuityResidual[c];
197  // diag[c] += cImb;
198  //}
199 
200  }
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
bool hasArray(const StorageSite &s) const
Definition: Field.cpp:37
Field gridFlux
Definition: GeomFields.h:31
Field ibType
Definition: GeomFields.h:38
const CRConnectivity & getAllFaceCells() const
Definition: Mesh.cpp:378
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
int getCount() const
Definition: StorageSite.h:39
Field area
Definition: GeomFields.h:23

Member Data Documentation

template<class X , class Diag , class OffDiag >
const GeomFields& PhononConvectionDiscretization< X, Diag, OffDiag >::_geomFields
private
template<class X , class Diag , class OffDiag >
const VectorT3 PhononConvectionDiscretization< X, Diag, OffDiag >::_groupvel
private
template<class X , class Diag , class OffDiag >
const bool PhononConvectionDiscretization< X, Diag, OffDiag >::_useCentralDifference
private
template<class X , class Diag , class OffDiag >
const Field& PhononConvectionDiscretization< X, Diag, OffDiag >::_varField
private

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