## SYNOPSIS

form(const space& V, const space& V, "mass");

form(const space& M, const space& V, "mass");

form (const space& V, const space& V, "mass", const domain& gamma);

form_diag(const space& V, "mass");

## DESCRIPTION

Assembly the matrix associated to the L2 scalar product of the finite element space V.

/ | m(u,v) = | u v dx | / Omega

The V space may be either a
**P0**, **P1**, **P2**,
**bubble**, **P1d**
and
**P1d**
finite
element spaces for building a form
see form(2).

The use of quadrature formulae is sometime usefull
for building diagonal matrix.
These approximate matrix are eay to invert.
This procedure is available
for **P0** and **P1** approximations.

Notes that when dealing with discontinuous finite
element space, i.e.
**P0** and **P1d**, the corresponding
mass matrix is block diagonal, and the
**inv_mass** form may be usefull.

When two different space M and V are supplied, assembly the matrix associated to the projection operator from one finite element space M to space V.

/ | m(q,v) = | q v dx | / Omegafor all q in M and v in V.

This form is usefull for instance to convert discontinuous gradient components to a continuous approximation. The transpose operator may also be usefull to performs the opposite operation.

The following $V$ and $M$ space approximation
combinations are supported for the **mass** form:
P0-P1,
P0-P1d,
P1d-P2,
P1-P1d
and
P1-P2.

## EXAMPLE

The following piece of code build the mass matrix associated to the P1 approximation:

geo g("square"); space V(g, "P1"); form m(V, V, "mass");The use of lumped mass form write also:

form_diag md(V, "mass");The following piece of code build the projection form:

geo g("square"); space V(g, "P1"); space M(g, "P0"); form m(M, V, "mass");

## SCALAR PRODUCT ON THE BOUNDARY

Assembly the matrix associated to the L2 scalar product related to a boundary domain of a mesh and a specified polynomial approximation. These forms are usefull when defining non-homogeneous Neumann or Robin boundary conditions.

Let W be a space of functions defined on Gamma, a subset of the boundary of the whole domain Omega.

/ | m(u,v) = | u v dx | / Gammafor all u, v in W. Let V a space of functions defined on Omega and gamma the trace operator from V into W. For all u in W and v in V:

/ | mb(u,v) = | u gamma(v) dx | / GammaFor all u and v in V:

/ | ab(u,v) = | gamma(u) gamma(v) dx | / Gamma

## EXAMPLE

The following piece of code build forms for the P1 approximation,
assuming that the mesh contains a domain named **boundary**:

geo omega ("square"); domain gamma = omega.boundary(); space V (omega, "P1"); space W (omega, gamma, "P1"); form m (W, W, "mass"); form mb (W, V, "mass"); form ab (V, V, "mass", gamma);