[petsc-users] How to get a matrix and vector for a coupled system of equations?

Matthew Knepley knepley at gmail.com
Mon Nov 28 07:25:42 CST 2016


On Mon, Nov 28, 2016 at 4:43 AM, Rolf Kuiper <kuiper at mpia.de> wrote:

> Hi Dave,
>
> Thanks a lot for your prompt reply! This is even easier than I thought
> (and that is most likely the reason, why I could not think into this
> direction) :)
> And yes, I might/should upgrade our PETSc version used (3.1), but it will
> take me some days to check the full code package.
>
> Now, I will create my DA (now in 3.6 called DMDA) for the coupled system
> via
> DACreate3d(PETSC_COMM_WORLD, Periodicity, DA_STENCIL_BOX, Nx, Ny, Nz, Px,
> Py, Pz, 4, 1, lx, ly, lz, &MyDA);
> instead of
> DACreate3d(PETSC_COMM_WORLD, Periodicity, DA_STENCIL_BOX, Nx, Ny, Nz, Px,
> Py, Pz, 1, 1, lx, ly, lz, &MyDA);
> which I have used for the single equation.
>
> I would like to ask one follow-up question:
> Currently, I loop over my matrix (and vectors) via three for-loops over
> the 3 spatial directions, and set the columns indices in the following way:
> for(k){
>         row.k    = k;
>         col[0].k = k;
>         col[1].k = k;
>         col[2].k = k;
>         col[3].k = k;
>         col[4].k = k+1;
>         col[5].k = k-1;
>         for(j){
>             row.j    = j;
>             col[0].j = j;
>             col[1].j = j;
>             col[2].j = j+1;
>             col[3].j = j-1;
>             col[4].j = j;
>             col[5].j = j;
>             for(i){
>                 row.i    = i;
>                 col[0].i = i+1;
>                 col[1].i = i-1;
>                 col[2].i = i;
>                 col[3].i = i;
>                 col[4].i = i;
>                 col[5].i = i;
> Now for the coupled equations, I should overall additionally loop over the
> number of DOFs (just 2 in my previous email example). Could you give me an
> easy example or pseudo-code for the associated assignment of columns (I
> have the same stencil in each of the submatrices, so for the 2 DOFs in 3D,
> I would get 7+6=13 column entries per row)? Or can you link me to an
> existing example within the PETSc help?
>

SNES ex19 uses multiple dofs.

  Thanks,

     Matt


> Again, Thanks a lot!
> Rolf
>
>
>
>
> Am 24.11.2016 um 22:30 schrieb Dave May <dave.mayhem23 at gmail.com>:
>
> When you create the DMDA, set the number of DOFs (degrees of freedom) per
> point to be 2 instead of 1.
>
> You must be using and ancient version of petsc given the function names
> you quoted. Consider upgrading to 3.7
>
> Thanks,
> Dave
>
> On Thu, 24 Nov 2016 at 20:24, Rolf Kuiper <kuiper at mpia.de> wrote:
>
>> Dear PETSc users,
>>
>> maybe this is an easy question, but I can’t find the information right
>> away in the user’s guide nor online.
>>
>> What I am currently doing and which works fine:
>> To solve a partial differential equation for the quantity q on a parallel
>> distributed grid, which is represented by the Distributed Array MyDA, I am
>> currently creating the associated sparse matrix for the KSP solver via
>> DAGetMatrix(MyDA, MATMPIAIJ, &MyMatrix);
>>
>> The solution vector and right hand side vector are created via
>> DACreateGlobalVector(MyDA, &MyRightHandSideVector);
>> VecDuplicate(MyRightHandSideVector, &GlobalSolutionVector);
>>
>> The DA is constructed using DACreate3d() with the corresponding regular
>> structured grid information.
>>
>> And here is my problem:
>> Now, I would like to solve a coupled system of equations for the
>> quantities q1 and q2 on the same grid. I.e., the matrix should just get the
>> double number of rows and columns, the vectors contain twice the number of
>> entries (e.g. first all q1s and then all q2s). And I would like to be sure
>> that the entries of q1 and q2, which are associated with the same grid cell
>> are located on the same processor.
>> Is there already a pre-defined structures available (such as MATMPIAIJ)
>> within PETSc to enlarge such a single equation to store the entries of
>> coupled equations? Such as
>> DACreateTwiceTheGlobalVector()?
>>
>> The equation is (simplified) of the form
>> d/dt q1 + grad q2 = 0
>> d/dt q2 + f(q1) = 0
>> with an arbitrary function f depending on q1.
>>
>> Thanks a lot for your help in advance,
>> Rolf
>>
>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20161128/087a5b3c/attachment-0001.html>


More information about the petsc-users mailing list