AFEPack
|
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