1 | /* |
2 | * eq.hpp |
3 | * |
4 | * Created on: Oct 5, 2015 |
5 | * Author: i-bird |
6 | */ |
7 | |
8 | #ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_HPP_ |
9 | #define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_HPP_ |
10 | |
11 | #define EQS_FIELD 0 |
12 | #define EQS_POS 1 |
13 | |
14 | //#define PERIODIC true |
15 | //#define NON_PERIODIC false |
16 | |
17 | #include "util/util_num.hpp" |
18 | #include "Matrix/SparseMatrix.hpp" |
19 | |
20 | /*! \brief Equation |
21 | * |
22 | * It model an equation like expr1 = expr2 |
23 | * |
24 | * \tparam expr1 |
25 | * \tparam expr2 |
26 | * |
27 | */ |
28 | template<typename expr1,typename expr2,typename Sys_eqs> |
29 | class Eq |
30 | { |
31 | /*! \brief Create the row of the Matrix |
32 | * |
33 | * \tparam ord |
34 | * |
35 | */ |
36 | template<unsigned int ord=EQS_FIELD> static void value(const grid_key_dx<Sys_eqs::dims> & pos) |
37 | { |
38 | if (EQS_FIELD) |
39 | value_f(pos); |
40 | else |
41 | value_s(pos); |
42 | } |
43 | |
44 | /*! \brief fill the row |
45 | * |
46 | * |
47 | */ |
48 | static openfpm::vector<cval<typename Sys_eqs::stype>> value_s(grid_key_dx<Sys_eqs::dims> & it) |
49 | { |
50 | return expr1::value_s(it) - expr2::value_s(it); |
51 | } |
52 | |
53 | /*! \brief fill the row |
54 | * |
55 | * |
56 | */ |
57 | static void value_f(grid_key_dx<Sys_eqs::dims> & it) |
58 | { |
59 | return expr1::value_s(it) - expr2::value_s(it); |
60 | } |
61 | }; |
62 | |
63 | |
64 | // spatial position + value |
65 | |
66 | template<unsigned int dim,typename T> |
67 | struct pos_val |
68 | { |
69 | /*! \brief Initialize to zero the value |
70 | * |
71 | */ |
72 | pos_val() |
73 | { |
74 | value = 0.0; |
75 | } |
76 | |
77 | grid_key_dx<dim> pos; |
78 | T value; |
79 | }; |
80 | |
81 | template<unsigned int f, typename Sys_eqs> |
82 | class Field |
83 | { |
84 | typedef typename stub_or_real<Sys_eqs,Sys_eqs::dims,typename Sys_eqs::stype,typename Sys_eqs::b_grid::decomposition::extended_type::extended_type>::type map_grid; |
85 | |
86 | public: |
87 | |
88 | /*! \brief fill the row |
89 | * |
90 | * |
91 | */ |
92 | static void value(const map_grid & g_map, grid_dist_key_dx<Sys_eqs::dims> & kmap, const grid_sm<Sys_eqs::dims,void> & gs, typename Sys_eqs::stype (& spacing )[Sys_eqs::dims] , std::unordered_map<long int,typename Sys_eqs::stype > & cols, typename Sys_eqs::stype coeff) |
93 | { |
94 | cols[g_map.template get<0>(kmap)*Sys_eqs::nvar + f] += coeff; |
95 | } |
96 | |
97 | /*! \brief |
98 | * |
99 | * |
100 | */ |
101 | static grid_key_dx<Sys_eqs::dims> position(grid_key_dx<Sys_eqs::dims> & pos, const grid_sm<Sys_eqs::dims,void> & gs, const comb<Sys_eqs::dims> (& s_pos)[Sys_eqs::nvar]) |
102 | { |
103 | return grid_key_dx<Sys_eqs::dims>(s_pos[f]); |
104 | } |
105 | }; |
106 | |
107 | class ConstField |
108 | { |
109 | |
110 | }; |
111 | |
112 | inline size_t mat_factor(size_t nvar, size_t sz, const size_t ord) |
113 | { |
114 | return nvar; |
115 | } |
116 | |
117 | #include "mul.hpp" |
118 | #include "Average.hpp" |
119 | #include "Derivative.hpp" |
120 | #include "sum.hpp" |
121 | #include "Laplacian.hpp" |
122 | |
123 | #endif /* OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_HPP_ */ |
124 | |