Memosa-FVM  0.2
TimeDerivativeDiscretization_Kmodel.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 
6 #ifndef _TIMEDERIVATIVEDISCRETIZATION_KMODEL_H_
7 #define _TIMEDERIVATIVEDISCRETIZATION_KMODEL_H_
8 
9 #include <stdio.h>
10 #include <math.h>
11 #include "CRMatrix.h"
12 #include "Field.h"
13 #include "MultiField.h"
14 #include "MultiFieldMatrix.h"
15 #include "Mesh.h"
16 #include "Discretization.h"
17 #include "StorageSite.h"
18 #include "GeomFields.h"
19 
20 template<class X, class Diag, class OffDiag>
22 {
23 public:
25 
27  typedef typename CCMatrix::DiagArray DiagArray;
29 
30  typedef Array<X> XArray;
32 
33 
35  const GeomFields& geomFields,
36  Field& varField,Field& varN1Field,Field& varN2Field,
37  const T_Scalar dT,
38  const T_Scalar nonDimLength,
39  const int Order):
40 
41  Discretization(meshes),
42  _geomFields(geomFields),
43  _varField(varField),
44  _varN1Field(varN1Field),
45  _varN2Field(varN2Field),
46  _dT(dT),
47  _nonDimLength(nonDimLength),
48  _Order(Order)
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 TArray& dsff =
57  // dynamic_cast<const TArray&>(_dsff[cells]);
58 
59  const TArray& cellVolume =
60  dynamic_cast<const TArray&>(_geomFields.volume[cells]);
61 
62  // Field& _varField = *_dsff.dsf[_direction];
63  //Field& _varN1Field = *_dsffN1.dsf[_direction];
64  //Field& _varN2Field = *_dsffN2.dsf[_direction];
65 
66 
67  const MultiField::ArrayIndex cVarIndex(&_varField,&cells);
68  CCMatrix& matrix =
69  dynamic_cast<CCMatrix&>(mfmatrix.getMatrix(cVarIndex,cVarIndex));
70 
71  DiagArray& diag = matrix.getDiag();
72 
73  const XArray& x = dynamic_cast<const XArray&>(_varField[cells]);
74  const XArray& xN1 = dynamic_cast<const XArray&>(_varN1Field[cells]);
75 
76  XArray& rCell = dynamic_cast<XArray&>(rField[cVarIndex]);
77 
78 
79  const int nCells = cells.getSelfCount();//getSelfCount();
80 
81  //cout << "cellVolume" << cellVolume[0] << endl ;
82  if (_Order > 1)
83  {
84  // second order
85  const XArray& xN2 = dynamic_cast<const XArray&>(_varN2Field[cells]);
86 
87  T_Scalar onePointFive(1.5);
88  T_Scalar two(2.0);
89  T_Scalar pointFive(0.5);
90 
91 
92  for(int c=0; c<nCells; c++)
93  {
94  const T_Scalar fbydT = cellVolume[c]/_dT; //pow(_nonDimLength,3);
95  rCell[c] -= fbydT*(onePointFive*x[c]- two*xN1[c]
96  + pointFive*xN2[c]);
97  diag[c] -= fbydT*onePointFive;
98  }
99  //cout << "Second diag[0] = " << diag[0] << endl ;
100  }
101 
102  else
103  {
104  for(int c=0; c<nCells; c++)
105  {
106  const T_Scalar fbydT = cellVolume[c]/_dT; //pow(_nonDimLength,3);
107  rCell[c] -= fbydT*(x[c]- xN1[c]);
108  diag[c] -= fbydT;
109  }
110  //cout << "First diag[0] = " << diag[0] << endl ;
111  }
112 
113  }
114 private:
116  const Field& _varField;
119  //const DistFunctFields<X>& _dsff;
120  //const DistFunctFields<X>& _dsffN1;
121  //const DistFunctFields<X>& _dsffN2;
122  //const int _direction;
123  const T_Scalar _dT;
125  const int _Order;
126 };
127 
128 #endif
Matrix & getMatrix(const Index &rowIndex, const Index &colIndex)
int getSelfCount() const
Definition: StorageSite.h:40
Definition: Field.h:14
Definition: Mesh.h:49
Array< Diag > & getDiag()
Definition: CRMatrix.h:856
pair< const Field *, const StorageSite * > ArrayIndex
Definition: MultiField.h:21
TimeDerivativeDiscretization_Kmodel(const MeshList &meshes, const GeomFields &geomFields, Field &varField, Field &varN1Field, Field &varN2Field, const T_Scalar dT, const T_Scalar nonDimLength, const int Order)
const StorageSite & getCells() const
Definition: Mesh.h:109
Field volume
Definition: GeomFields.h:26
void discretize(const Mesh &mesh, MultiFieldMatrix &mfmatrix, MultiField &xField, MultiField &rField)
vector< Mesh * > MeshList
Definition: Mesh.h:439