Memosa-FVM  0.2
IbmDiscretization.h
Go to the documentation of this file.
1 // This file os part of FVM
2 // Copyright (c) 2012 FVM Authors
3 // See LICENSE file for terms.
4 
5 #ifndef _IBMDISCRETIZATION_H_
6 #define _IBMDISCRETIZATION_H_
7 
8 #include "CRMatrix.h"
9 #include "Field.h"
10 #include "MultiField.h"
11 #include "MultiFieldMatrix.h"
12 #include "Mesh.h"
13 #include "Discretization.h"
14 #include "StorageSite.h"
15 #include "DiagonalMatrix.h"
16 #include "DiagonalTensor.h"
17 #include "FlowFields.h"
18 #include "GeomFields.h"
19 #include "Vector.h"
20 #include "NumType.h"
21 
22 #include <iostream>
23 #include <fstream>
24 
25 
26 
27 template <class X, class Diag, class OffDiag>
29 {
30 public:
31 
33 
35  typedef typename CCMatrix::DiagArray DiagArray;
37 
38  typedef Array<X> XArray;
42 
43  IbmDiscretization (const MeshList& meshes,
44  const GeomFields& geomFields,
45  FlowFields& flowFields) :
46  Discretization(meshes),
47  _geomFields(geomFields),
48  _flowFields(flowFields)
49 {}
50 
51  void discretize(const Mesh& mesh, MultiFieldMatrix& mfmatrix,
52  MultiField& xField, MultiField& rField)
53  {
54  const StorageSite& cells = mesh.getCells();
55 
56  const MultiField::ArrayIndex vIndex(&_flowFields.velocity,&cells);
57  CCMatrix& matrix = dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(vIndex,vIndex));
58  DiagArray& diag = matrix.getDiag();
59  OffDiagArray& offdiag = matrix.getOffDiag();
60 
61  const CRConnectivity& conn=matrix.getConnectivity();
62  const Array<int>& row=conn.getRow();
63  const Array<int>& col=conn.getCol();
64  const VectorT3Array& cellCentroid = dynamic_cast<const VectorT3Array&> (_geomFields.coordinate[cells]);
65  VectorT3Array& cellVelocity = dynamic_cast<VectorT3Array&> (_flowFields.velocity[cells]);
66  const XArray& xCell = dynamic_cast<const XArray&>(xField[vIndex]);
67  XArray& rCell = dynamic_cast<XArray&>(rField[vIndex]);
68 
69  const int nCells = cells.getSelfCount();
70  const VectorT3 zeroVelocity(NumTypeTraits<VectorT3>::getZero());
71  VectorT3 dR; //local variable dR=r[c]-r[j]
72  //set up solid cell veloicty to be solidVelocity
73  //ofstream fp1, fp2;
74  //fp1.open ("/home/linsun/Work/prism/app-memosa/src/fvm/test/ibm_velocity");
75  //fp2.open ("/home/linsun/Work/prism/app-memosa/src/fvm/test/solid_velocity");
76 
77  // fp=fopen("/home/linsun/Work/prism/app-memosa/src/fvm/test/ibm_velocity","w");
78  for (int c=0; c<nCells; c++)
79  {
81  int cellIBType = mesh.getIBTypeForCell(c);
82  if (cellIBType == 2) //solid cells
83  {
84  //cout << "cellID" << c << "velocity" << _flowFields.velocity << endl;
85  //printf("cellID = %i and velocity is %f\t%f\t%f\n", c,cellVelocity[c][0],cellVelocity[c][1],cellVelocity[c][2]);
86  diag[c] = (-1); //ap=(-1)
87  //diag[c] = NumTypeTraits<Diag>::getNegativeUnity;
88  cellVelocity[c]=zeroVelocity; //Cell velocity is set as prescribed
89  for (int nbpos=row[c]; nbpos<row[c+1]; nbpos++){
90  //const int j=col[nbpos];
91  offdiag[nbpos]=0; //anb=0
92  //offdiag[nbpos] = NumTypeTraits<offDiag>::getZero;
93  }
94  rCell[c]=0; //residual is zero
95  //rCell[c]= NumTypeTraits<VectorT3>::getZero;
96  //fprintf(fp, "%i\t%f\t%f\t%f\n", c,cellVelocity[c][0],cellVelocity[c][1],cellVelocity[c][2]);
97  //fp2 << c << cellVelocity[c] << endl;
98 
99  }
100  //fclose(fp);
101 
102 
103  #if 1
104  else if (cellIBType == 1) //immersed boundary cells
105  {
106  //cout << "cellID" << c << "velocity" << _flowFields.velocity\n;
107  diag[c] = (-1); //aP=-1
108  //diag[c] = NumTypeTraits<Diag>::getNegativeUnity;
109  double sumCellDist=0;
110  //offdiag[nb]=alfa[nb] (distance weight function)
111  //r=-v[c]+sum(alfa[nb]*v[nb])
112  /*
113  for (int nbpos=row[c]; nbpos<row[c+1]; nbpos++){
114  const int j=col[nbpos];
115  dR=cellCentroid[c]-cellCentroid[j];
116  offdiag[nbpos]=1./mag(dR);
117  sumCellDist+=offdiag[nbpos];
118  }
119  */
120 
121  for (int nbpos=row[c]; nbpos<row[c+1]; nbpos++){
122  //offdiag[nbpos]/=sumCellDist;
123  const int j=col[nbpos];
124  offdiag[nbpos]=1.0/(row[c+1]-row[c]);
125  rCell[c]-=offdiag[nbpos]*cellVelocity[j];
126  }
127  rCell[c]+=cellVelocity[c];
128  //fp1 << c << cellVelocity[c] << endl;
129 
130  }
131  #endif
132  }
133  //fp1.close();
134  //fp2.close();
135  }
136 
137  private:
140 };
141 
142 #endif
const Array< int > & getCol() const
Vector< T_Scalar, 3 > VectorT3
const Array< int > & getRow() const
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
int getSelfCount() const
Definition: StorageSite.h:40
Field coordinate
Definition: GeomFields.h:19
CRMatrix< Diag, OffDiag, X > CCMatrix
Definition: Mesh.h:49
CCMatrix::OffDiagArray OffDiagArray
const GeomFields & _geomFields
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
Array< T_Scalar > TArray
virtual const CRConnectivity & getConnectivity() const
Definition: CRMatrix.h:834
IbmDiscretization(const MeshList &meshes, const GeomFields &geomFields, FlowFields &flowFields)
NumTypeTraits< X >::T_Scalar T_Scalar
FlowFields & _flowFields
Array< OffDiag > & getOffDiag()
Definition: CRMatrix.h:857
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
const StorageSite & getCells() const
Definition: Mesh.h:109
Array< VectorT3 > VectorT3Array
vector< Mesh * > MeshList
Definition: Mesh.h:439
Field velocity
Definition: FlowFields.h:15
CCMatrix::DiagArray DiagArray