00001 #ifndef _MY_MappingOrthoMesh_
00002 #define _MY_MappingOrthoMesh_
00003 #include "orthomesh.h"
00004
00005
00012 class MappingOrthoMesh
00013 {
00014 protected:
00015 Point3D _X0;
00016 double _j;
00017 Matrix _invGradT,_GradT;
00018 double _dx,_dy,_dz;
00019 const OrthoMesh *_pMesh;
00020 public:
00021
00022
00023 void reinit(const OrthoMesh &mesh)
00024 {
00025 _j=mesh.cellVolume();
00026 _invGradT.reinit(3,3);
00027 _GradT.reinit(3,3);
00028 _invGradT=0.0;
00029 _GradT=0.0;
00030
00031 _dx=mesh.get_dx();
00032 _dy=mesh.get_dy();
00033 _dz=mesh.get_dz();
00034
00035 _invGradT(0,0)=1.0/_dx;
00036 _invGradT(1,1)=1.0/_dy;
00037 _invGradT(2,2)=1.0/_dz;
00038
00039 _GradT(0,0)=_dx;
00040 _GradT(1,1)=_dy;
00041 _GradT(2,2)=_dz;
00042 _pMesh = &mesh;
00043 }
00044
00045
00046
00047 void reinit(OrthoMesh::Cell_It &cell)
00048 {
00049
00050
00051 assert(&(cell->getMesh()) == _pMesh);
00052 cell->vertex(VERTEX_000,_X0);
00053 }
00054
00067 virtual double J(Point3D &p)
00068 {
00069 return _j;
00070 }
00071
00072
00088 virtual void Inv_T_Grad(const VecDouble &xi,Matrix &InvTGrad)
00089 {
00090 assert(xi.size() ==3);
00091 InvTGrad = _invGradT;
00092 }
00093
00094
00103 virtual void T_grad(const VecDouble &xi,Matrix &gradT)
00104 {
00105 assert(xi.size() == 3);
00106 gradT=_GradT;
00107 }
00108
00109
00117 virtual void T(const VecDouble &p,VecDouble &resp)
00118 {
00119 assert(p.size() == 3);
00120 assert(resp.size() == 3);
00121 resp(0)=_X0[0] + _dx*p(0);
00122 resp(1)=_X0[1] + _dy*p(1);
00123 resp(2)=_X0[2] + _dz*p(2);
00124
00125 }
00126
00127 };
00128
00129 #endif