Usage of PETSc's 'Mat' type

Hi all,

I am new to FreeFEM and I am figuring out how to use FreeFEM with the PETSc interface. Now I am learning about the Mat type of the PETSc package, but I do not fully understand all the functions that come with it. I am following the tutorial with examples by Pierre Jolivet (this one) and in the tutorial there are two specific opertations of which I am not sure what it does. The first one is
real[int] v;
Mat J;
J(v, v);

What does the J(v, v) operation do? (and is there any place where I could read about this?) I saw in the tutorial something about the weighted dot product, but what would determine the weight?

The second one is a way of creating a new mat as:
Mat A, C;
matrix Loc;
Mat B(A, C, Loc);

Again, what does this do? And how can I find out what this does? Is there any documentation on this or a way of searching for it in the source code?
Thanks in advance for any help. If anyone has any other good tutorials that can help me in understanding the FreeFEM-PETSc interface please let me know.

Kind regards,


  1. J(v, v) computes a scalar product according to the domain decomposition of J. It is basically a weighted local scalar product, followed by a reduction. See line 43 of this parallel example vs. line 28 of this sequential example.
  2. Given one distributed matrix Mat A, you can create a new distributed matrix B following the same column and row distribution using a local matrix Loc with the syntax Mat B(A, Loc). If you have a different column and row distribution, here A for the rows, C for the columns, and Loc is a rectangular matrix, you create a distributed rectangular matrix using the syntax Mat B(A, C, Loc). See this Stokes example where there is a different column and row distribution (for velocity and pressure unknowns).

Here is some more materials if you are interested: Pierre Jolivet introduction to parallel FreeFEM part 1 - YouTube + Pierre Jolivet introduction to parallel FreeFEM part 2 - YouTube.
Don’t hesitate if you have other questions.


Thank you for the swift response. This helps me out in further understanding the language!