Forked from
Sbalzarini Lab / Software / Parallel Computing / OpenFPM / openfpm_numerics
1096 commits behind the upstream repository.
-
Pietro Incardona authoredPietro Incardona authored
eq.hpp 2.27 KiB
/*
* eq.hpp
*
* Created on: Oct 5, 2015
* Author: i-bird
*/
#ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_HPP_
#define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_HPP_
#define EQS_FIELD 0
#define EQS_POS 1
//#define PERIODIC true
//#define NON_PERIODIC false
#include "data_type/scalar.hpp"
#include "util/util_num.hpp"
/*! \brief Equation
*
* It model an equation like expr1 = expr2
*
* \tparam expr1
* \tparam expr2
*
*/
template<typename expr1,typename expr2,typename Sys_eqs>
class Eq
{
/*! \brief Create the row of the Matrix
*
* \tparam ord
*
*/
template<unsigned int ord=EQS_FIELD> static void value(const grid_key_dx<Sys_eqs::dims> & pos)
{
if (EQS_FIELD)
value_f(pos);
else
value_s(pos);
}
/*! \brief fill the row
*
*
*/
static openfpm::vector<cval<typename Sys_eqs::stype>> value_s(grid_key_dx<Sys_eqs::dims> & it)
{
return expr1::value_s(it) - expr2::value_s(it);
}
/*! \brief fill the row
*
*
*/
static void value_f(grid_key_dx<Sys_eqs::dims> & it)
{
return expr1::value_s(it) - expr2::value_s(it);
}
};
// spatial position + value
template<unsigned int dim,typename T>
struct pos_val
{
/*! \brief Initialize to zero the value
*
*/
pos_val()
{
value = 0.0;
}
grid_key_dx<dim> pos;
T value;
};
template<unsigned int f, typename Sys_eqs>
class Field
{
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;
public:
/*! \brief fill the row
*
*
*/
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)
{
cols[g_map.template get<0>(kmap)*Sys_eqs::nvar + f] += coeff;
}
/*! \brief
*
*
*/
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])
{
return grid_key_dx<Sys_eqs::dims>(s_pos[f]);
}
};
class ConstField
{
};
inline size_t mat_factor(size_t nvar, size_t sz, const size_t ord)
{
return nvar;
}
#endif /* OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_HPP_ */