Interpolation of arbitrary quantities¶
Once a solution has been computed, it is quite easy to extract any quantity of interest on it with the interpolation functions for instance for post-treatment.
Basic interpolation¶
The file getfem/getfem_interpolation.h
defines the function
getfem::interpolation(...)
to interpolate a solution from a given mesh/finite
element method on another mesh and/or another Lagrange finite element method:
getfem::interpolation(mf1, mf2, U, V, extrapolation = 0);
where mf1
is a variable of type getfem::mesh_fem
and describes the finite element
method on which the source field U
is defined, mf2
is the finite element
method on which U
will be interpolated. extrapolation
is an optional
parameter. The values are 0
not to allow the extrapolation, 1
for an
extrapolation of the exterior points near the boundary and 2
for the
extrapolation of all exterior points (could be expensive).
The dimension of U
should be a multiple of mf1.nb_dof()
, and the
interpolated data V
should be correctly sized (multiple of mf2.nb_dof()
).
… important:
``mf2`` should be of Lagrange type for the interpolation to make sense but the
meshes linked to ``mf1`` and ``mf2`` may be different (and this is the
interest of this function). There is no restriction for the dimension of the
domain (you can interpolate a 2D mesh on a line etc.).
If you need to perform more than one interpolation between the same finite element methods, it might be more efficient to use the function:
getfem::interpolation(mf1, mf2, M, extrapolation = 0);
where M
is a row matrix which will be filled with the linear map representing
the interpolation (i.e. such that V = MU
). The matrix should have the correct
dimensions (i.e. mf2.nb_dof()``x``mf1.nb_dof()
). Once this matrix is built,
the interpolation is done with a simple matrix multiplication:
gmm::mult(M, U, V);
Interpolation based on the generic weak form language (GWFL)¶
It is possible to extract some arbitrary expressions on possibly several fields thanks to GWFL and the interpolation functions.
This is specially dedicated to the model object (but it can also be used with a ga_workspace object). For instance if md
is a valid object containing some defined variables u
(vectorial) and p
(scalar), one can interpolate on a Lagrange finite element method an expression such as p*Trace(Grad_u)
. The resulting expression can be scalar, vectorial or tensorial. The size of the resulting vector is automatically adapted.
The high-level generic interpolation functions are defined in the file getfem/getfem_generic_assembly.h
.
There is different interpolation functions corresponding to the interpolation on a Lagrange fem on the same mesh, the interpolation on a cloud on points or on a getfem::im_data
object.
Interpolation on a Lagrange fem:
void getfem::ga_interpolation_Lagrange_fem(workspace, mf, result);
where workspace
is a getfem::ga_workspace
object which aims to store the different variables and data (see Compute arbitrary terms - high-level generic assembly procedures - Generic Weak-Form Language (GWFL)), mf
is the getfem::mesh_fem
object reresenting the Lagrange fem on which the interpolation is to be done and result
is a beot::base_vector
which store the interpolatin. Note that the workspace should contain the epression to be interpolated.
void getfem::ga_interpolation_Lagrange_fem(md, expr, mf, result, rg=mesh_region::all_convexes());
where md
is a getfem::model
object (containing the variables and data), expr
(std::string object) is the expression to be interpolated, mf
is the getfem::mesh_fem
object reresenting the Lagrange fem on which the interpolation is to be done, result
is the vector in which the interpolation is stored and rg
is the optional mesh region.
Interpolation on a cloud of points:
void getfem::ga_interpolation_mti(md, expr, mti, result, extrapolation = 0, rg=mesh_region::all_convexes(), nbpoints = size_type(-1));
where md
is a getfem::model
object (containing the variables and data), expr
(std::string object) is the expression to be interpolated, mti
is a getfem::mesh_trans_inv
object which stores the cloud of points (see getfem/getfem_interpolation.h
), result
is the vector in which the interpolation is stored, extrapolation
is an option for extrapolating the field outside the mesh for outside points, rg
is the optional mesh region and nbpoints
is the optional maximal number of points.
Interpolation on an im_data object (on the Gauss points of an integration method):
void getfem::ga_interpolation_im_data(md, expr, im_data &imd,
base_vector &result, const mesh_region &rg=mesh_region::all_convexes());
where md
is a getfem::model
object (containing the variables and data), expr
(std::string object) is the expression to be interpolated, imd
is a getfem::im_data
object which refers to a integration method (see getfem/getfem_im_data.h
), result
is the vector in which the interpolation is stored and rg
is the optional mesh region.