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

#include <GenericKineticIBDiscretization.h>

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

Public Types

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

Public Member Functions

 GenericKineticIBDiscretization (const MeshList &meshes, const GeomFields &geomFields, Field &varField, const double cx, const double cy, const double cz, MacroFields &macroFields)
 
void discretize (const Mesh &mesh, MultiFieldMatrix &matrix, MultiField &xField, MultiField &rField)
 
- Public Member Functions inherited from Discretization
 Discretization (const MeshList &meshes)
 
virtual ~Discretization ()
 
 DEFINE_TYPENAME ("Discretization")
 

Private Attributes

const GeomFields_geomFields
 
Field_varField
 
const double _cx
 
const double _cy
 
const double _cz
 
MacroFields_macroFields
 

Additional Inherited Members

- Protected Attributes inherited from Discretization
const MeshList_meshes
 

Detailed Description

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

Definition at line 24 of file GenericKineticIBDiscretization.h.

Member Typedef Documentation

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

Definition at line 31 of file GenericKineticIBDiscretization.h.

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

Definition at line 30 of file GenericKineticIBDiscretization.h.

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

Definition at line 32 of file GenericKineticIBDiscretization.h.

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

Definition at line 35 of file GenericKineticIBDiscretization.h.

template<class X , class Diag , class OffDiag >
typedef CCMatrix::OffDiagArray GenericKineticIBDiscretization< X, Diag, OffDiag >::OffDiagArray

Definition at line 33 of file GenericKineticIBDiscretization.h.

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

Definition at line 28 of file GenericKineticIBDiscretization.h.

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

Definition at line 37 of file GenericKineticIBDiscretization.h.

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

Definition at line 38 of file GenericKineticIBDiscretization.h.

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

Definition at line 39 of file GenericKineticIBDiscretization.h.

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

Definition at line 36 of file GenericKineticIBDiscretization.h.

Constructor & Destructor Documentation

template<class X , class Diag , class OffDiag >
GenericKineticIBDiscretization< X, Diag, OffDiag >::GenericKineticIBDiscretization ( const MeshList meshes,
const GeomFields geomFields,
Field varField,
const double  cx,
const double  cy,
const double  cz,
MacroFields macroFields 
)
inline

Definition at line 41 of file GenericKineticIBDiscretization.h.

Member Function Documentation

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

Implements Discretization.

Definition at line 57 of file GenericKineticIBDiscretization.h.

References GenericKineticIBDiscretization< X, Diag, OffDiag >::_cx, GenericKineticIBDiscretization< X, Diag, OffDiag >::_cy, GenericKineticIBDiscretization< X, Diag, OffDiag >::_cz, GenericKineticIBDiscretization< X, Diag, OffDiag >::_geomFields, GenericKineticIBDiscretization< X, Diag, OffDiag >::_macroFields, GenericKineticIBDiscretization< X, Diag, OffDiag >::_varField, GeomFields::area, GeomFields::areaMag, Mesh::getAllFaceCells(), Mesh::getCells(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff01(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff10(), StorageSite::getCount(), StorageSite::getCountLevel1(), CRMatrix< T_Diag, T_OffDiag, X >::getDiag(), Mesh::getFaces(), Mesh::getIBFaces(), MultiFieldMatrix::getMatrix(), CRMatrix< T_Diag, T_OffDiag, X >::getPairWiseAssembler(), GeomFields::ibFaceIndex, GeomFields::ibType, Mesh::IBTYPE_BOUNDARY, Mesh::IBTYPE_FLUID, CRMatrix< T_Diag, T_OffDiag, X >::setDirichlet(), MacroFields::velocity, and Array< T >::zero().

59  {
60  const StorageSite& ibFaces = mesh.getIBFaces();
61  if (ibFaces.getCount() == 0)
62  return;
63  VectorT3Array& v = dynamic_cast<VectorT3Array&>(_macroFields.velocity[ibFaces]);
64  const StorageSite& cells = mesh.getCells();
65  const StorageSite& faces = mesh.getFaces();
66 
67  const CRConnectivity& faceCells = mesh.getAllFaceCells();
68 
69  const MultiField::ArrayIndex xIndex(&_varField,&cells);
70  CCMatrix& dRdX = dynamic_cast<CCMatrix&>(matrix.getMatrix(xIndex,xIndex));
71  CCAssembler& assembler = dRdX.getPairWiseAssembler(faceCells);
72  DiagArray& dRdXDiag=dRdX.getDiag();
73 
74  XArray& xcell =
75  dynamic_cast<XArray&> (xField[xIndex]);
76  XArray& varcell =
77  dynamic_cast<XArray&> (_varField[cells]);
78  XArray& rCell = dynamic_cast<XArray&>(rField[xIndex]);
79 
80  const XArray& xib =
81  dynamic_cast<const XArray&>(_varField[mesh.getIBFaces()]);
82 
83  const IntArray& ibType = dynamic_cast<const IntArray&>(_geomFields.ibType[cells]);
84 
85  const IntArray& ibFaceIndex = dynamic_cast<const IntArray&>(_geomFields.ibFaceIndex[faces]);
86 
87  const Field& areaMagField = _geomFields.areaMag;
88  const XArray& faceAreaMag = dynamic_cast<const XArray&>(areaMagField[faces]);
89  const Field& areaField = _geomFields.area;
90  const VectorT3Array& faceArea=dynamic_cast<const VectorT3Array&>(areaField[faces]);
91 
92  // used for computing the average value in IBTYPE_BOUNDARY cells.
93  // we can't use the xcell storage during the loop below since a
94  // cell may have more than one ib face and the current value of
95  // x in the cell is required to correctly impose the dirichlet
96  // condition. so we accumulate the boundary cell value and counts
97  // in the following arrays and after all the faces have been
98  // visited, overwrite any boundary cell values with the average of
99  // all the ib faces
100  const int nCells = cells.getCountLevel1();
101  XArray xB(nCells);
102  Array<int> wB(nCells);
103 
104  xB.zero();
105  wB.zero();
106 
107 
108  const int nFaces = faces.getCount();
109  for(int f=0; f<nFaces; f++)
110  {
111  const int c0 = faceCells(f,0);
112  const int c1 = faceCells(f,1);
113 
114  if (((ibType[c0] == Mesh::IBTYPE_FLUID) && (ibType[c1] == Mesh::IBTYPE_BOUNDARY)) ||
115  ((ibType[c1] == Mesh::IBTYPE_FLUID) && (ibType[c0] == Mesh::IBTYPE_BOUNDARY)))
116  {
117  // this is an iBFace, determine which cell is interior and which boundary
118 
119  const int ibFace = ibFaceIndex[f];
120  if (ibFace < 0)
121  throw CException("invalid ib face index");
122  const X& xface = xib[ibFace];
123  const X uwall = v[ibFace][0];
124  const X vwall = v[ibFace][1];
125  const X wwall = v[ibFace][2];
126  if (ibType[c0] == Mesh::IBTYPE_FLUID)
127  {
128  const VectorT3 en = faceArea[f]/faceAreaMag[f];
129  const X c_dot_en = _cx*en[0]+_cy*en[1]+_cz*en[2];
130  const X wallv_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
131  if(c_dot_en - wallv_dot_en <0 ){
132  rCell[c0] += assembler.getCoeff01(f)*(xface-varcell[c1]);
133  rCell[c1] = NumTypeTraits<X>::getZero();
134  assembler.getCoeff01(f) = OffDiag(0);
135  dRdX.setDirichlet(c1);
136  xB[c1] += xface;
137  wB[c1]++;
138  }
139  }
140 
141  else
142  {
143  const VectorT3 en = faceArea[f]/faceAreaMag[f];
144  const X c_dot_en = _cx*en[0]+_cy*en[1]+_cz*en[2];
145  const X wallv_dot_en = uwall*en[0]+vwall*en[1]+wwall*en[2];
146  if(c_dot_en - wallv_dot_en> 0){
147  rCell[c1] += assembler.getCoeff10(f)*(xface-varcell[c0]);
148  rCell[c0] = NumTypeTraits<X>::getZero();
149  assembler.getCoeff10(f) = OffDiag(0);
150  dRdX.setDirichlet(c0);
151  xB[c0] += xface;
152  wB[c0]++;
153  }
154  }
155  }
156  else if ((ibType[c0] == Mesh::IBTYPE_FLUID) &&
157  (ibType[c1] == Mesh::IBTYPE_FLUID))
158  {
159  // leave as is
160  }
161  else
162  {
163  // setup to get zero corrections
164  rCell[c0] = NumTypeTraits<X>::getZero();
165  rCell[c1] = NumTypeTraits<X>::getZero();
166  assembler.getCoeff01(f)=NumTypeTraits<OffDiag>::getZero();
168  assembler.getCoeff10(f)=NumTypeTraits<OffDiag>::getZero();
170 
171  }
172  }
173 
174  // set the phi for boundary cells as average of the ib face values
175  for(int c=0; c<nCells; c++)
176  {
177  if (wB[c] > 0)
178  varcell[c] = xB[c] / T_Scalar(wB[c]);
179 
180  }
181  }
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
const StorageSite & getIBFaces() const
Definition: Mesh.h:111
Definition: Field.h:14
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
Field ibFaceIndex
Definition: GeomFields.h:40
const StorageSite & getCells() const
Definition: Mesh.h:109
int getCountLevel1() const
Definition: StorageSite.h:72
Field velocity
Definition: MacroFields.h:15
int getCount() const
Definition: StorageSite.h:39
Field area
Definition: GeomFields.h:23
Field areaMag
Definition: GeomFields.h:25

Member Data Documentation

template<class X , class Diag , class OffDiag >
const double GenericKineticIBDiscretization< X, Diag, OffDiag >::_cx
private
template<class X , class Diag , class OffDiag >
const double GenericKineticIBDiscretization< X, Diag, OffDiag >::_cy
private
template<class X , class Diag , class OffDiag >
const double GenericKineticIBDiscretization< X, Diag, OffDiag >::_cz
private
template<class X , class Diag , class OffDiag >
const GeomFields& GenericKineticIBDiscretization< X, Diag, OffDiag >::_geomFields
private
template<class X , class Diag , class OffDiag >
MacroFields& GenericKineticIBDiscretization< X, Diag, OffDiag >::_macroFields
private
template<class X , class Diag , class OffDiag >
Field& GenericKineticIBDiscretization< X, Diag, OffDiag >::_varField
private

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