00001 #ifndef __DIFF_OP_H__
00002 #define __DIFF_OP_H__
00003
00004 #include "linalg.hpp"
00005 #include "func.hpp"
00006
00007 namespace bvp{
00008 using namespace linalg;
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 class diff_op{
00036 public:
00037 diff_op();
00038 double operator()(const realfunc &f, const point &p) const;
00039 virtual double at(const realfunc &f, const point &p) const = 0;
00040 virtual ~diff_op(){};
00041 };
00042
00043
00044 class linear_diff_op : virtual public diff_op{
00045 public:
00046 linear_diff_op(){};
00047 };
00048
00049
00050 class diff_op2 : virtual public diff_op{
00051 public:
00052 diff_op2(){};
00053 };
00054
00055
00056
00057 class linear_diff_op2 : public linear_diff_op, public diff_op2{
00058 public:
00059 double operator()(const realfunc &f, const point &p) const;
00060 };
00061
00062
00063
00064 class bdry_diff_op : public diff_op{
00065 public:
00066 double operator()(const realfunc &f, const point &p) const;
00067 double operator()(const realfunc &f, const point &p,
00068 const vector &n) const;
00069 virtual double at(const realfunc &f,
00070 const point &p) const =0;
00071 virtual double at(const realfunc &f, const point &p,
00072 const vector &n) const =0;
00073 };
00074
00075
00076 class dirichlet_op : public bdry_diff_op{
00077 public:
00078 double at(const realfunc &f, const point &p) const;
00079 double at(const realfunc &f, const point &p, const vector &n) const;
00080 };
00081
00082
00083
00084 class neumann_op : public bdry_diff_op{
00085 public:
00086 double at(const realfunc &f, const point &p, const vector &n) const;
00087 private:
00088 double at(const realfunc &f, const point &p) const {return f(p);};
00089 };
00090
00091
00092 class Id_op : public linear_diff_op2{
00093 double at(const realfunc &f, const point &p) const;
00094 };
00095
00096
00097
00098
00099 class del1 : public linear_diff_op2{
00100 public:
00101 double at(const realfunc &f, const point &p) const;
00102 double at(const realfunc &f, const point &p, size_t i) const;
00103 };
00104
00105
00106
00107
00108 class del2 : public linear_diff_op2{
00109 public:
00110 double at(const realfunc &f, const point &p) const;
00111 double at(const realfunc &f, const point &p, size_t i, size_t j) const;
00112 };
00113
00114
00115 class Laplacian : public linear_diff_op2{
00116 public:
00117 double at(const realfunc &f, const point &p) const;
00118 };
00119
00120 }
00121
00122 #endif //__DIFF_OP_H__