00001 #ifndef _MY_MixedHybridBase_
00002 #define _MY_MixedHybridBase_
00003 #include "dynamicbase.h"
00004 #include <grid/tria.h>
00005 #include <lac/sparse_matrix.h>
00006 #include <lac/vector.h>
00007 #include "orthomesh.h"
00008 #include <lac/sparse_direct.h>
00009 #include <set>
00010 #include "sfunctions.h"
00011
00012
00053 class MixedHybridBase
00054 {
00055 protected:
00056
00057
00058 struct _ScalarBC
00059 {
00060 OrthoMesh::Face_It face;
00061 double value;
00062 _ScalarBC(){value=NAN;}
00063 };
00064
00065 typedef std::vector<_ScalarBC> ScalarBC;
00066
00067
00068 enum BCType {Dirichlet,Neumann};
00069
00070 struct _HybridFaceBC
00071 {
00072 OrthoMesh::Face_It face;
00073 BCType bcType;
00074 double value;
00075
00076
00077
00078
00079
00080
00081 _HybridFaceBC()
00082 {
00083 value=NAN;
00084 }
00085
00086 _HybridFaceBC(OrthoMesh::Face_It &pface)
00087 :face(pface)
00088 {
00089 face = pface;
00090 value=NAN;
00091 }
00092 _HybridFaceBC(OrthoMesh::Face_It &pface,BCType ptype,double pvalue)
00093 {
00094 face=pface;
00095 value=pvalue;
00096 bcType=ptype;
00097 }
00098 void print()
00099 {
00100 if (bcType == Dirichlet)
00101 printf("P = %g at %d",value,face->index());
00102 else
00103 printf("Vel = %g at %d",value,face->index());
00104 }
00105
00106 };
00107 typedef std::vector<_HybridFaceBC> HybridFaceBC;
00108
00109 protected:
00110
00111
00112
00113 protected:
00114 void setBoundaryCondition(HybridFaceBC &vBC,OrthoMesh &mesh,Function3D &fInwardVel,Function3D &fP,bool bCheckNoBC);
00115 void addPcTerm(VecDouble &B,OrthoMesh &mesh, ScalarBC &bc,const VecDouble &KPc, const VecDouble &vPc);
00116 void assemblySystem(SparseMatrix<double> &A, VecDouble &B,OrthoMesh &mesh, HybridFaceBC &bc,const VecDouble &K, const VecDouble &vMobT, const VecDouble &vGravTerm);
00117 void assemblySystem(SparseMatrix<double> &A, VecDouble &B,OrthoMesh &mesh, HybridFaceBC &bc,const VecDouble &K);
00118
00119
00120 void assemblySystem(SparseMatrix<double> &A, VecDouble &B,OrthoMesh &mesh, ScalarBC &bc,const VecDouble &vCoeff);
00121
00122
00123 void getNormalVelocitiesFromPressure(VecDouble &Vq,OrthoMesh &mesh,HybridFaceBC &bc,const VecDouble &K,const VecDouble &vP,const VecDouble &vMobT, const VecDouble &vGravTerm);
00124 void getNormalVelocitiesFromPressure(VecDouble &Vq,OrthoMesh &mesh,HybridFaceBC &bc,const VecDouble &K,const VecDouble &vP);
00125
00126
00127 void getNormalVelocitiesFromPressure(VecDouble &Vq,OrthoMesh &mesh,HybridFaceBC &bc,const VecDouble &K,const VecDouble &vP,const VecDouble &vMobT, const VecDouble &vGravTerm, ScalarBC &vPcBC,const VecDouble &KPc, const VecDouble &vPc);
00128 void buildSparsityPattern(OrthoMesh &mesh,SparsityPattern &sparsePattern);
00129
00130
00131 MixedHybridBase(){}
00132 ~MixedHybridBase(){}
00133
00134
00135
00136
00137
00138
00139 };
00140
00141 #endif