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

#include <GenericIBDiscretization.h>

Inheritance diagram for GenericIBDiscretization< X, Diag, OffDiag >:
Collaboration diagram for GenericIBDiscretization< 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

 GenericIBDiscretization (const MeshList &meshes, const GeomFields &geomFields, Field &phiField)
 
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
 
Field_phiField
 

Additional Inherited Members

- Protected Attributes inherited from Discretization
const MeshList_meshes
 

Detailed Description

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

Definition at line 24 of file GenericIBDiscretization.h.

Member Typedef Documentation

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

Definition at line 31 of file GenericIBDiscretization.h.

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

Definition at line 30 of file GenericIBDiscretization.h.

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

Definition at line 32 of file GenericIBDiscretization.h.

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

Definition at line 35 of file GenericIBDiscretization.h.

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

Definition at line 33 of file GenericIBDiscretization.h.

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

Definition at line 28 of file GenericIBDiscretization.h.

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

Definition at line 37 of file GenericIBDiscretization.h.

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

Definition at line 38 of file GenericIBDiscretization.h.

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

Definition at line 39 of file GenericIBDiscretization.h.

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

Definition at line 36 of file GenericIBDiscretization.h.

Constructor & Destructor Documentation

template<class X , class Diag , class OffDiag >
GenericIBDiscretization< X, Diag, OffDiag >::GenericIBDiscretization ( const MeshList meshes,
const GeomFields geomFields,
Field phiField 
)
inline

Definition at line 41 of file GenericIBDiscretization.h.

43  :
44  Discretization(meshes),
45  _geomFields(geomFields),
46  _phiField(phiField)
47 {}
Discretization(const MeshList &meshes)

Member Function Documentation

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

Implements Discretization.

Definition at line 49 of file GenericIBDiscretization.h.

References GenericIBDiscretization< X, Diag, OffDiag >::_geomFields, GenericIBDiscretization< X, Diag, OffDiag >::_phiField, Mesh::getAllFaceCells(), Mesh::getCells(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff01(), CRMatrix< T_Diag, T_OffDiag, X >::PairWiseAssembler::getCoeff10(), StorageSite::getCount(), 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(), and Array< T >::zero().

51  {
52  const StorageSite& ibFaces = mesh.getIBFaces();
53 
54  if (ibFaces.getCount() == 0)
55  return;
56 
57  const StorageSite& cells = mesh.getCells();
58  const StorageSite& faces = mesh.getFaces();
59 
60  const CRConnectivity& faceCells = mesh.getAllFaceCells();
61 
62  const MultiField::ArrayIndex vIndex(&_phiField,&cells);
63  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(vIndex,vIndex));
64  CCAssembler& assembler = matrix.getPairWiseAssembler(faceCells);
65 
66  XArray& cellPhi =
67  dynamic_cast<XArray&> (_phiField[cells]);
68 
69  XArray& rCell = dynamic_cast<XArray&>(rField[vIndex]);
70 
71  const XArray& ibPhi =
72  dynamic_cast<const XArray&>(_phiField[mesh.getIBFaces()]);
73 
74  const IntArray& ibType = dynamic_cast<const IntArray&>(_geomFields.ibType[cells]);
75 
76  const IntArray& ibFaceIndex = dynamic_cast<const IntArray&>(_geomFields.ibFaceIndex[faces]);
77 
78 
79  // used for computing the average value in IBTYPE_BOUNDARY cells.
80  // we can't use the cellPhi storage during the loop below since a
81  // cell may have more than one ib face and the current value of
82  // phi in the cell is required to correctly impose the dirichlet
83  // condition. so we accumulate the boundary cell value and counts
84  // in the following arrays and after all the faces have been
85  // visited, overwrite any boundary cell values with the average of
86  // all the ib faces
87  const int nCells = cells.getCount();
88  XArray xB(nCells);
89  Array<int> wB(nCells);
90 
91  xB.zero();
92  wB.zero();
93 
94 
95  const int nFaces = faces.getCount();
96  for(int f=0; f<nFaces; f++)
97  {
98  const int c0 = faceCells(f,0);
99  const int c1 = faceCells(f,1);
100 
101  if (((ibType[c0] == Mesh::IBTYPE_FLUID) && (ibType[c1] == Mesh::IBTYPE_BOUNDARY)) ||
102  ((ibType[c1] == Mesh::IBTYPE_FLUID) && (ibType[c0] == Mesh::IBTYPE_BOUNDARY)))
103  {
104  // this is an iBFace, determine which cell is interior and which boundary
105 
106  const int ibFace = ibFaceIndex[f];
107  if (ibFace < 0)
108  throw CException("invalid ib face index");
109 
110  const X& facePhi = ibPhi[ibFace];
111  if (ibType[c0] == Mesh::IBTYPE_FLUID)
112  {
113  rCell[c0] += assembler.getCoeff01(f)*(facePhi-cellPhi[c1]);
114  rCell[c1] = NumTypeTraits<X>::getZero();
115  assembler.getCoeff01(f) = OffDiag(0);
116  matrix.setDirichlet(c1);
117  xB[c1] += facePhi;
118  wB[c1]++;
119  }
120  else
121  {
122  rCell[c1] += assembler.getCoeff10(f)*(facePhi-cellPhi[c0]);
123  rCell[c0] = NumTypeTraits<X>::getZero();
124  assembler.getCoeff10(f) = OffDiag(0);
125  matrix.setDirichlet(c0);
126  xB[c0] += facePhi;
127  wB[c0]++;
128  }
129  }
130  else if ((ibType[c0] == Mesh::IBTYPE_FLUID) &&
131  (ibType[c1] == Mesh::IBTYPE_FLUID))
132  {
133  // leave as is
134  }
135  else
136  {
137  // setup to get zero corrections
138  rCell[c0] = NumTypeTraits<X>::getZero();
139  rCell[c1] = NumTypeTraits<X>::getZero();
140  matrix.setDirichlet(c0);
141  matrix.setDirichlet(c1);
142  }
143  }
144 
145  // set the phi for boundary cells as average of the ib face values
146  for(int c=0; c<nCells; c++)
147  {
148  if (wB[c] > 0)
149  cellPhi[c] = xB[c] / T_Scalar(wB[c]);
150  }
151  }
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
const StorageSite & getIBFaces() const
Definition: Mesh.h:111
CRMatrix< Diag, OffDiag, X > CCMatrix
NumTypeTraits< X >::T_Scalar T_Scalar
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 getCount() const
Definition: StorageSite.h:39
CCMatrix::PairWiseAssembler CCAssembler

Member Data Documentation

template<class X , class Diag , class OffDiag >
const GeomFields& GenericIBDiscretization< X, Diag, OffDiag >::_geomFields
private
template<class X , class Diag , class OffDiag >
Field& GenericIBDiscretization< X, Diag, OffDiag >::_phiField
private

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