37 #ifndef GETFEM_CONVECT_H__ 38 #define GETFEM_CONVECT_H__ 46 enum convect_boundary_option { CONVECT_EXTRAPOLATION, CONVECT_UNCHANGED, CONVECT_PERIODICITY };
58 template<
class VECT1,
class VECT2>
60 const VECT2 &V, scalar_type dt,
size_type nt,
61 convect_boundary_option option = CONVECT_EXTRAPOLATION,
62 base_node &per_min = base_node(),
63 base_node &per_max = base_node()) {
72 typedef typename gmm::linalg_traits<VECT1>::value_type T;
73 int extra = (option == CONVECT_EXTRAPOLATION) ? 2 : 0;
78 "This convection algorithm work only on pure Lagrange fems");
80 for (dal::bv_visitor cv(mf.
convex_index()); !cv.finished();++cv) {
82 GMM_ASSERT1(pf_t->target_dim() == 1 && pf_t->is_lagrange(),
83 "This convection algorithm work only on pure Lagrange fems");
89 if (option == CONVECT_PERIODICITY)
90 GMM_ASSERT1(per_min.size() == N && per_max.size() == N,
91 "Wrong size of box extremity for PERIODICITY option");
93 getfem::mesh_trans_inv mti(msh, 1E-10);
96 std::vector<base_node> nodes(nbpts);
102 GMM_ASSERT1(qqdimt == N,
"The velocity field should be a vector field " 103 "of the same dimension as the mesh");
104 std::vector<T> VI(nbpts*N);
108 scalar_type ddt = dt / scalar_type(nt);
112 mti.add_points(nodes);
114 dal::bit_vector dof_untouched;
116 for (dal::bv_visitor j(dof_untouched); !j.finished();++j)
121 gmm::add(gmm::scaled(gmm::sub_vector(VI, gmm::sub_interval(N*j, N)),
123 if (option == CONVECT_PERIODICITY) {
125 if (per_max[k] > per_min[k]) {
126 while (nodes[j][k] > per_max[k]) nodes[j][k] -= per_max[k];
127 while (nodes[j][k] < per_min[k]) nodes[j][k] += per_max[k];
134 std::vector<T> UI(nbpts*qdim);
136 mti.add_points(nodes);
137 dal::bit_vector dof_untouched;
139 for (dal::bv_visitor i(dof_untouched); !i.finished();++i)
virtual size_type nb_dof() const
Return the total number of degrees of freedom.
Define the getfem::mesh_fem class.
void interpolation(const mesh_fem &mf_source, const mesh_fem &mf_target, const VECTU &U, VECTV &V, int extrapolation=0, double EPS=1E-10, mesh_region rg_source=mesh_region::all_convexes(), mesh_region rg_target=mesh_region::all_convexes())
interpolation/extrapolation of (mf_source, U) on mf_target.
virtual pfem fem_of_element(size_type cv) const
Return the basic fem associated with an element (if no fem is associated, the function will crash! us...
Describe a mesh (collection of convexes (elements) and points).
size_t size_type
used as the common size type in the library
virtual size_type nb_basic_dof() const
Return the total number of basic degrees of freedom (before the optional reduction).
void convect(const mesh_fem &mf, VECT1 &U, const mesh_fem &mf_v, const VECT2 &V, scalar_type dt, size_type nt, convect_boundary_option option=CONVECT_EXTRAPOLATION, base_node &per_min=base_node(), base_node &per_max=base_node())
Compute the convection of a quantity on a getfem::mesh_fem with respect to a velocity field...
Interpolation of fields from a mesh_fem onto another.
virtual dim_type get_qdim() const
Return the Q dimension.
virtual base_node point_of_basic_dof(size_type cv, size_type i) const
Return the geometrical location of a degree of freedom.
bool is_reduced() const
Return true if a reduction matrix is applied to the dofs.
GEneric Tool for Finite Element Methods.
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
Describe a finite element method linked to a mesh.
const mesh & linked_mesh() const
Return a reference to the underlying mesh.
const dal::bit_vector & convex_index() const
Get the set of convexes where a finite element has been assigned.