[petsc-users] preallocation after DMCreateMatrix?

Matteo Semplice matteo.semplice at unito.it
Wed Nov 29 06:36:39 CST 2017



On 29/11/2017 12:46, Matthew Knepley wrote:
> On Wed, Nov 29, 2017 at 2:26 AM, Matteo Semplice 
> <matteo.semplice at unito.it <mailto:matteo.semplice at unito.it>> wrote:
>
>     On 25/11/2017 02:05, Matthew Knepley wrote:
>>     On Fri, Nov 24, 2017 at 4:21 PM, Matteo Semplice
>>     <matteo.semplice at unito.it <mailto:matteo.semplice at unito.it>> wrote:
>>
>>         Hi.
>>
>>         The manual for DMCreateMatrix says "Notes: This properly
>>         preallocates the number of nonzeros in the sparse matrix so
>>         you do not need to do it yourself", so I got the impression
>>         that one does not need to call the preallocation routine for
>>         the matrix and indeed in most examples listed in the manual
>>         page for DMCreateMatrix this is not done or (KSP tutorial
>>         ex4) it is called declaring 0 entries per row.
>>
>>         However, if read in a mesh in a DMPlex ore create a DMDA and
>>         then call DMCreateMatrix, the resulting matrix errors out
>>         when I call MatSetValues. I have currently followed the
>>         suggestion of the error message and call MatSetOption(A,
>>         MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE), but I'd like to
>>         fix this properly.
>>
>>
>>     It sounds like your nonzero pattern does not obey the topology.
>>     What nonzero pattern are you trying to input?
>
>     Hi.
>
>         The problem with the DMDA was a bug in our code. Sorry for the
>     noise.
>
>     On the other hand, with the DMPLex, I still experience problems.
>     It's a FV code and I reduced it to the case of the simple case of
>     a laplacian operator: I need non-diagonal entries at (i,j) if cell
>     i and cell j have a common face.
>     Here below is my code that reads in a grid of 4 cells (unit square
>     divided by the diagonals), create a section with 1 dof per cell,
>     creates a matrix and assembles it.
>
>
>       ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, "square1.msh",
>     PETSC_TRUE, &dm);CHKERRQ(ierr);
>
>
> Can you show me the mesh?
>
>          ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr);
>
> and then run with -dm_view ::ascii_info_detail
>
>
>       ierr = DMPlexSetAdjacencyUseCone(dm, PETSC_TRUE); CHKERRQ(ierr);
>       ierr = DMPlexSetAdjacencyUseClosure(dm, PETSC_FALSE); CHKERRQ(ierr);
>
>
> This looks like the right FVM adjacency, but your matrix is diagonal 
> it appears below. TS ex11
> has an identical call, but produces the correct matrix, which is why I 
> want to look at your mesh.

I have put the DMViewFromOptions call after the SetAdjacency calls and 
this is the output:

matteo at signalkuppe:~/software/petscMplex$ ./mplexMatrix -dm_view 
::ascii_info_detail
DM Object: 1 MPI processes
   type: plex
Mesh 'DM_0x557496ad8380_0':
orientation is missing
cap --> base:
[0] Max sizes cone: 3 support: 4
[0]: 4 ----> 9
[0]: 4 ----> 11
[0]: 4 ----> 12
[0]: 5 ----> 10
[0]: 5 ----> 11
[0]: 5 ----> 15
[0]: 6 ----> 14
[0]: 6 ----> 15
[0]: 6 ----> 16
[0]: 7 ----> 12
[0]: 7 ----> 13
[0]: 7 ----> 16
[0]: 8 ----> 9
[0]: 8 ----> 10
[0]: 8 ----> 13
[0]: 8 ----> 14
[0]: 9 ----> 0
[0]: 9 ----> 1
[0]: 10 ----> 0
[0]: 10 ----> 2
[0]: 11 ----> 0
[0]: 12 ----> 1
[0]: 13 ----> 1
[0]: 13 ----> 3
[0]: 14 ----> 2
[0]: 14 ----> 3
[0]: 15 ----> 2
[0]: 16 ----> 3
base <-- cap:
[0]: 0 <---- 9 (0)
[0]: 0 <---- 10 (0)
[0]: 0 <---- 11 (0)
[0]: 1 <---- 12 (0)
[0]: 1 <---- 13 (0)
[0]: 1 <---- 9 (-2)
[0]: 2 <---- 10 (-2)
[0]: 2 <---- 14 (0)
[0]: 2 <---- 15 (0)
[0]: 3 <---- 14 (-2)
[0]: 3 <---- 13 (-2)
[0]: 3 <---- 16 (0)
[0]: 9 <---- 4 (0)
[0]: 9 <---- 8 (0)
[0]: 10 <---- 8 (0)
[0]: 10 <---- 5 (0)
[0]: 11 <---- 5 (0)
[0]: 11 <---- 4 (0)
[0]: 12 <---- 4 (0)
[0]: 12 <---- 7 (0)
[0]: 13 <---- 7 (0)
[0]: 13 <---- 8 (0)
[0]: 14 <---- 8 (0)
[0]: 14 <---- 6 (0)
[0]: 15 <---- 6 (0)
[0]: 15 <---- 5 (0)
[0]: 16 <---- 7 (0)
[0]: 16 <---- 6 (0)
coordinates with 1 fields
   field 0 with 2 components
Process 0:
   (   4) dim  2 offset   0 0. 0.
   (   5) dim  2 offset   2 0. 1.
   (   6) dim  2 offset   4 1. 1.
   (   7) dim  2 offset   6 1. 0.
   (   8) dim  2 offset   8 0.5 0.5

For the records, the mesh is loaded from the (gmsh generated) file

==== square1.msh =====
$MeshFormat
2.2 0 8
$EndMeshFormat
$Nodes
5
1 0 0 0
2 0 1 0
3 1 1 0
4 1 0 0
5 0.5 0.5 0
$EndNodes
$Elements
12
1 15 2 0 1 1
2 15 2 0 2 2
3 15 2 0 3 3
4 15 2 0 4 4
5 1 2 0 1 4 3
6 1 2 0 2 3 2
7 1 2 0 3 2 1
8 1 2 0 4 1 4
9 2 2 0 6 1 5 2
10 2 2 0 6 1 4 5
11 2 2 0 6 2 5 3
12 2 2 0 6 3 5 4
$EndElements
===================

Thanks,
     Matteo


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20171129/c60c54c5/attachment.html>


More information about the petsc-users mailing list