AFEPack
|
00001 00011 #ifndef __MovingMesh_h__ 00012 #define __MovingMesh_h__ 00013 00014 #warning "This file is obsolete and will not be maintained any more! \ 00015 Please use MovingMesh2D.h instead! \ 00016 ע⣺㷨˱ȽϴĸĽѾΪMovingMesh2D \ 00017 Ժijµп౾һά \ 00018 һʱԺᱻ" 00019 00020 #include <lac/precondition.h> 00021 #include <lac/sparse_ilu.h> 00022 #include <lac/solver_control.h> 00023 #include <lac/solver_gmres.h> 00024 #include <lac/vector_memory.h> 00025 00026 #include "AMGSolver.h" 00027 #include "Geometry.h" 00028 #include "EasyMesh.h" 00029 00049 class MovingMesh : public EasyMesh 00050 { 00051 public: 00052 typedef GeometryBM::bmark_t bmark_t; 00053 struct Vertex : public afepack::Point<2> { 00054 int index; 00055 bmark_t boundary_mark; 00056 }; 00057 struct Edge { 00058 int index; 00059 int vertex[2]; 00060 bmark_t boundary_mark; 00061 }; 00062 struct Domain { 00063 int n_vertex; 00064 int n_edge; 00065 std::vector<Vertex> physical_domain_vertex; 00066 std::vector<Vertex> logical_domain_vertex; 00067 std::vector<Edge> edge; 00068 }; 00069 private: 00070 Domain domain; 00071 std::vector<afepack::Point<2> > logical_node; 00072 double move_step_length; 00073 int n_move_step; 00074 std::vector<afepack::Point<2> > move_direction; 00075 std::vector<afepack::Point<2> > logical_move_direction; 00076 std::vector<float> mon; 00077 00078 int n_interior_node; 00079 int n_boundary_node; 00080 std::vector<int> index; 00081 std::vector<int> interior_node_index; 00082 std::vector<int> boundary_node_index; 00083 std::vector<int> face_index; 00084 int n_boundary_face; 00085 std::vector<int> boundary_face; 00086 std::vector<std::vector<int> > mb_node; 00087 std::vector<std::vector<int> > mb_face; 00088 int n_boundary_constraint; 00089 00090 SparsityPattern spM; 00091 SparsityPattern spN; 00092 SparsityPattern spMb; 00093 public: 00094 MovingMesh(); 00095 virtual ~MovingMesh(); 00096 public: 00097 const std::vector<float>& monitor() const {return mon;}; 00098 std::vector<float>& monitor() {return mon;}; 00099 const float& monitor(const int& i) const {return mon[i];}; 00100 float& monitor(const int& i) {return mon[i];} 00101 const std::vector<afepack::Point<2> >& moveDirection() const {return move_direction;}; 00102 std::vector<afepack::Point<2> >& moveDirection() {return move_direction;}; 00103 const afepack::Point<2>& moveDirection(const int& i) const {return move_direction[i];}; 00104 afepack::Point<2>& moveDirection(const int& i) {return move_direction[i];}; 00105 00106 std::vector<double> moveDirection(const afepack::Point<2>& point, const int& element) const; 00107 std::vector<std::vector<double> > moveDirection(const std::vector<afepack::Point<2> >& point, const int& element) const; 00108 double moveDirectionDivergence(const int& element) const; 00109 const double& moveStepLength() const {return move_step_length;}; 00110 double& moveStepLength() {return move_step_length;}; 00111 const int& n_moveStep() const {return n_move_step;}; 00112 int& n_moveStep() {return n_move_step;}; 00113 00114 void moveMesh(); 00115 void outputPhysicalMesh(const std::string& file); 00116 void outputLogicalMesh(const std::string& file); 00117 virtual void getMonitor(); 00118 virtual void smoothMonitor(int step = 1); 00119 virtual void updateMesh(); 00120 virtual void updateSolution() = 0; 00121 virtual void outputSolution() = 0; 00122 virtual void getMoveStepLength(); 00123 void readDomain(const std::string& file); 00124 private: 00125 void getLogicalMesh(); 00126 void getMoveDirection(); 00127 void readDummy(std::ifstream& is); 00128 void parseBoundary(); 00129 }; 00130 00131 #endif // __MovingMesh_h__ 00132