AFEPack
MovingMeshFB.h
浏览该文件的文档。
00001 
00011 #ifndef __MovingMeshFB_h__
00012 #define __MovingMeshFB_h__
00013 
00014 #include "AMGSolver.h"
00015 #include "Geometry.h"
00016 #include "EasyMesh.h"
00017 
00022 class MovingMeshFB : public EasyMesh
00023 {
00024         std::vector<afepack::Point<2> > logical_node;
00025         double move_step_length;
00026         int n_move_step;
00027         std::vector<afepack::Point<2> > move_direction;
00028         std::vector<afepack::Point<2> > logical_move_direction;
00029         std::vector<float> mon;
00030 
00031         int n_interior_node;
00032         int n_boundary_node;
00033         std::vector<int> index;
00034         std::vector<int> interior_node_index;
00035         std::vector<int> boundary_node_index;
00036 
00037         SparsityPattern spM;
00038         SparsityPattern spN;
00039         SparseMatrix<double> M, N;
00040         AMGSolver solver;
00041 public:
00042         MovingMeshFB();
00043         virtual ~MovingMeshFB();
00044 public:
00045         const std::vector<float>& monitor() const {return mon;};
00046         std::vector<float>& monitor() {return mon;};
00047         const float& monitor(const int& i) const {return mon[i];};
00048         float& monitor(const int& i) {return mon[i];}
00049         const std::vector<afepack::Point<2> >& moveDirection() const {return move_direction;};
00050         std::vector<afepack::Point<2> >& moveDirection() {return move_direction;};
00051         const afepack::Point<2>& moveDirection(const int& i) const {return move_direction[i];};
00052         afepack::Point<2>& moveDirection(const int& i) {return move_direction[i];};
00053         
00054         std::vector<double> moveDirection(const afepack::Point<2>& point, const int& element) const;
00055         std::vector<std::vector<double> > moveDirection(const std::vector<afepack::Point<2> >& point, const int& element) const;
00056         double moveDirectionDivergence(const int& element) const;
00057         const double& moveStepLength() const {return move_step_length;};
00058         double& moveStepLength() {return move_step_length;};
00059         const int& n_moveStep() const {return n_move_step;};
00060         int& n_moveStep() {return n_move_step;};
00061         
00062         void moveMesh();
00063         void outputPhysicalMesh(const std::string& file);
00064         void outputLogicalMesh(const std::string& file);
00065         virtual void getMonitor();
00066         virtual void smoothMonitor(int step = 1);
00067         virtual void updateMesh();
00068         virtual void updateSolution() = 0;
00069         virtual void outputSolution() = 0;
00070         virtual void getMoveStepLength();
00071         void readDomain(const std::string& file);
00072         virtual void getLogicalMesh();
00073 private:
00074         void getMoveDirection();
00075         void readDummy(std::ifstream& is);
00076 };
00077 
00078 #endif // __MovingMeshFB_h__
00079