\path[draw, arr] (Y2h) -- (Y3h) node [midway] {$D$};
%
\path[draw, arr] (X0h) -- (X1h) node [midway] {$\gradtm$};
\path[draw, arr] (X1h) -- (X2h) node [midway] {$\curltm$};
\path[draw, arr] (X2h) -- (X3h) node [midway] {$\divergtm$};
%
\path[draw, arr] (X0) -- (Y0) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,0}$};
\path[draw, arr] (X1) -- (Y1) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,1}$};
\path[draw, arr] (X2) -- (Y2) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,2}$};
\path[draw, arr] (X3) -- (Y3) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,3}$};
%
\path[draw, arr] (Y0) -- (Y0h) node [midway, anchor=west, yshift=0.8mm] {$\Pi^0$};
\path[draw, arr] (Y1) -- (Y1h) node [midway, anchor=west, yshift=0.8mm] {$\Pi^1 \times \Pi^0$};
\path[draw, arr] (Y2) -- (Y2h) node [midway, anchor=west, yshift=0.8mm] {$\Pi^{1*} \times \Pi^2$};
\path[draw, arr] (Y3) -- (Y3h) node [midway, anchor=west, yshift=0.8mm] {$\Pi^2$};
%
\path[draw, arr] (Y0h) -- (X0h) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,0}^{-1}$};
\path[draw, arr] (Y1h) -- (X1h) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,1}^{-1}$};
\path[draw, arr] (Y2h) -- (X2h) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,2}^{-1}$};
\path[draw, arr] (Y3h) -- (X3h) node [midway, anchor=west, yshift=0.8mm] {$\eta_{m, \,3}^{-1}$};
\end{tikzpicture}
%%\includegraphics{img/de_rham/de_rham_2D_grad_rot_cont}\fsp,
\end{split}$$ summarizes the general strategy for the discretization that will be explained in the remaining section.

The first step is the definition of a set of operators $\eta_{m, \,
    k}, 