AFEPack
MovingMesh.h
浏览该文件的文档。
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