[petsc-users] Setting up a PETSc section for field-split

Luc Berger-Vergiat lb2653 at columbia.edu
Wed Jan 29 19:19:46 CST 2014


Hi Matt,
I thought I would spend the time writing a small c example of what I am 
doing in my FORTRAN code so that you can more easily see what it is I am 
doing wrong.

I attached the code and its makefile. I run the code the following 
arguments:

-ksp_type gmres -pc_type fieldsplit -fieldsplit_0_pc_type ilu 
-fieldsplit_0_ksp_type preonly -fieldsplit_1_pc_type jacobi 
-fieldsplit_1_ksp_type preonly -ksp_view -ksp_monitor

and get the following output:

start=1, End=9.
PetscSection with 2 fields
   field 0 with 1 components
Process 0:
   (   1) dim  1 offset   0
   (   2) dim  1 offset   0
   (   3) dim  1 offset   0
   (   4) dim  1 offset   0
   (   5) dim  0 offset   0
   (   6) dim  0 offset   0
   (   7) dim  0 offset   0
   (   8) dim  0 offset   0
   field 1 with 1 components
Process 0:
   (   1) dim  0 offset   1
   (   2) dim  0 offset   1
   (   3) dim  0 offset   1
   (   4) dim  0 offset   1
   (   5) dim  1 offset   0
   (   6) dim  1 offset   0
   (   7) dim  1 offset   0
   (   8) dim  1 offset   0
PC flag for GetDMSplits: true
   0 KSP Residual norm 0.000000000000e+00
KSP Object: 1 MPI processes
   type: gmres
     GMRES: restart=30, using Classical (unmodified) Gram-Schmidt 
Orthogonalization with no iterative refinement
     GMRES: happy breakdown tolerance 1e-30
   maximum iterations=10000, initial guess is zero
   tolerances:  relative=1e-05, absolute=1e-50, divergence=10000
   left preconditioning
   using PRECONDITIONED norm type for convergence test
PC Object: 1 MPI processes
   type: fieldsplit
     FieldSplit with MULTIPLICATIVE composition: total splits = 2
     Solver info for each split is in the following KSP objects:
     Split number 0 Defined by IS
     KSP Object:    (fieldsplit_Field_0_)     1 MPI processes
       type: preonly
       maximum iterations=10000, initial guess is zero
       tolerances:  relative=1e-05, absolute=1e-50, divergence=10000
       left preconditioning
       using NONE norm type for convergence test
     PC Object:    (fieldsplit_Field_0_)     1 MPI processes
       type: ilu
         ILU: out-of-place factorization
         0 levels of fill
         tolerance for zero pivot 2.22045e-14
         using diagonal shift on blocks to prevent zero pivot
         matrix ordering: natural
         factor fill ratio given 1, needed 1
           Factored matrix follows:
             Matrix Object:             1 MPI processes
               type: seqaij
               rows=0, cols=0
               package used to perform factorization: petsc
               total: nonzeros=0, allocated nonzeros=0
               total number of mallocs used during MatSetValues calls =0
                 not using I-node routines
       linear system matrix = precond matrix:
       Matrix Object:       1 MPI processes
         type: seqaij
         rows=0, cols=0
         total: nonzeros=0, allocated nonzeros=0
         total number of mallocs used during MatSetValues calls =0
           not using I-node routines
     Split number 1 Defined by IS
     KSP Object:    (fieldsplit_Field_1_)     1 MPI processes
       type: preonly
       maximum iterations=10000, initial guess is zero
       tolerances:  relative=1e-05, absolute=1e-50, divergence=10000
       left preconditioning
       using NONE norm type for convergence test
     PC Object:    (fieldsplit_Field_1_)     1 MPI processes
       type: ilu
         ILU: out-of-place factorization
         0 levels of fill
         tolerance for zero pivot 2.22045e-14
         using diagonal shift on blocks to prevent zero pivot
         matrix ordering: natural
         factor fill ratio given 1, needed 1
           Factored matrix follows:
             Matrix Object:             1 MPI processes
               type: seqaij
               rows=0, cols=0
               package used to perform factorization: petsc
               total: nonzeros=0, allocated nonzeros=0
               total number of mallocs used during MatSetValues calls =0
                 not using I-node routines
       linear system matrix = precond matrix:
       Matrix Object:       1 MPI processes
         type: seqaij
         rows=0, cols=0
         total: nonzeros=0, allocated nonzeros=0
         total number of mallocs used during MatSetValues calls =0
           not using I-node routines
   linear system matrix = precond matrix:
   Matrix Object:   1 MPI processes
     type: seqaij
     rows=8, cols=8
     total: nonzeros=64, allocated nonzeros=160
     total number of mallocs used during MatSetValues calls =8
       using I-node routines: found 2 nodes, limit used is 5
The solution to this problem is:
Vector Object: 1 MPI processes
   type: seq
0
0
0
0
0
0
0
0
WARNING! There are options you set that were not used!
WARNING! could be spelling mistake, etc!
Option left: name:-fieldsplit_0_ksp_type value: preonly
Option left: name:-fieldsplit_0_pc_type value: ilu
Option left: name:-fieldsplit_1_ksp_type value: preonly
Option left: name:-fieldsplit_1_pc_type value: jacobi

when I run it with the more simple arguements:

-ksp_type gmres -pc_type jacobi -ksp_view -ksp_monitor

I get the following output:

start=1, End=9.
PetscSection with 2 fields
   field 0 with 1 components
Process 0:
   (   1) dim  1 offset   0
   (   2) dim  1 offset   0
   (   3) dim  1 offset   0
   (   4) dim  1 offset   0
   (   5) dim  0 offset   0
   (   6) dim  0 offset   0
   (   7) dim  0 offset   0
   (   8) dim  0 offset   0
   field 1 with 1 components
Process 0:
   (   1) dim  0 offset   1
   (   2) dim  0 offset   1
   (   3) dim  0 offset   1
   (   4) dim  0 offset   1
   (   5) dim  1 offset   0
   (   6) dim  1 offset   0
   (   7) dim  1 offset   0
   (   8) dim  1 offset   0
   0 KSP Residual norm 4.759858191165e+00
   1 KSP Residual norm 2.344421567248e+00
   2 KSP Residual norm 3.208390394507e-01
   3 KSP Residual norm 7.171256210359e-02
   4 KSP Residual norm 1.301032901980e-02
   5 KSP Residual norm 1.104121978197e-15
KSP Object: 1 MPI processes
   type: gmres
     GMRES: restart=30, using Classical (unmodified) Gram-Schmidt 
Orthogonalization with no iterative refinement
     GMRES: happy breakdown tolerance 1e-30
   maximum iterations=10000, initial guess is zero
   tolerances:  relative=1e-05, absolute=1e-50, divergence=10000
   left preconditioning
   using PRECONDITIONED norm type for convergence test
PC Object: 1 MPI processes
   type: jacobi
   linear system matrix = precond matrix:
   Matrix Object:   1 MPI processes
     type: seqaij
     rows=8, cols=8
     total: nonzeros=64, allocated nonzeros=160
     total number of mallocs used during MatSetValues calls =8
       using I-node routines: found 2 nodes, limit used is 5
The solution to this problem is:
Vector Object: 1 MPI processes
   type: seq
-0.977778
-0.0444444
-0.844444
-0.327778
3
1
1.5
3

It is obvious that something goes wrong in the fieldsplit, I'm just 
clueless to what it is. I think that everything is setup correctly but 
I'm missing something to get the KSP to recognize my splits...

Thanks for your help.

Best,
Luc

On 01/28/2014 11:20 AM, Matthew Knepley wrote:
> On Tue, Jan 28, 2014 at 10:11 AM, Luc Berger-Vergiat 
> <lb2653 at columbia.edu <mailto:lb2653 at columbia.edu>> wrote:
>
>     What I don't really understand is why the size of all the sub
>     fields is zero?
>     As you can see all the matrix object in my fieldsplit
>     preconditioner have total:nonzeros=0, allocated nonzeros=0.
>
>     This seems strange since I issued the following command:
>     //call DMSetDefaultSection(FSDM, FSSection, ierr)
>
>
> That section looks like you never called PetscSectionSetUp().
>
>    Matt
>
>     with a the following FSSection:
>     PetscSection with 4 fields
>       field 0 with 1 components
>     Process 0:
>       (   0) dim  0 offset   0
>       (   1) dim  1 offset   0
>       (   2) dim  0 offset   0
>       (   3) dim  0 offset   0
>       (   4) dim  1 offset   0
>       (   5) dim  0 offset   0
>       (   6) dim  0 offset   0
>       (   7) dim  0 offset   0
>       (   8) dim  0 offset   0
>       (   9) dim  0 offset   0
>       (  10) dim  0 offset   0
>       (  11) dim  0 offset   0
>       (  12) dim  0 offset   0
>       (  13) dim  0 offset   0
>       (  14) dim  0 offset   0
>       (  15) dim  0 offset   0
>       field 1 with 1 components
>     Process 0:
>       (   0) dim  1 offset   0
>       (   1) dim  0 offset   1
>       (   2) dim  1 offset   0
>       (   3) dim  1 offset   0
>       (   4) dim  0 offset   1
>       (   5) dim  1 offset   0
>       (   6) dim  0 offset   0
>       (   7) dim  0 offset   0
>       (   8) dim  0 offset   0
>       (   9) dim  0 offset   0
>       (  10) dim  0 offset   0
>       (  11) dim  0 offset   0
>       (  12) dim  0 offset   0
>       (  13) dim  0 offset   0
>       (  14) dim  0 offset   0
>       (  15) dim  0 offset   0
>       field 2 with 1 components
>     Process 0:
>       (   0) dim  0 offset   1
>       (   1) dim  0 offset   1
>       (   2) dim  0 offset   1
>       (   3) dim  0 offset   1
>       (   4) dim  0 offset   1
>       (   5) dim  0 offset   1
>       (   6) dim  1 offset   0
>       (   7) dim  1 offset   0
>       (   8) dim  1 offset   0
>       (   9) dim  1 offset   0
>       (  10) dim  1 offset   0
>       (  11) dim  1 offset   0
>       (  12) dim  0 offset   0
>       (  13) dim  0 offset   0
>       (  14) dim  0 offset   0
>       (  15) dim  0 offset   0
>       field 3 with 1 components
>     Process 0:
>       (   0) dim  0 offset   1
>       (   1) dim  0 offset   1
>       (   2) dim  0 offset   1
>       (   3) dim  0 offset   1
>       (   4) dim  0 offset   1
>       (   5) dim  0 offset   1
>       (   6) dim  0 offset   1
>       (   7) dim  0 offset   1
>       (   8) dim  0 offset   1
>       (   9) dim  0 offset   1
>       (  10) dim  0 offset   1
>       (  11) dim  0 offset   1
>       (  12) dim  1 offset   0
>       (  13) dim  1 offset   0
>       (  14) dim  1 offset   0
>       (  15) dim  1 offset   0
>
>     I thought that by using DMSetDefaultSection() I would be done
>     setting the fields and that the fieldsplit would detect that
>     section and use it to construct the splits.
>
>     Should I use another command to tell the PC to use the DM section?
>
>     Best,
>     Luc
>
>     On 01/28/2014 10:25 AM, Matthew Knepley wrote:
>>     On Mon, Jan 27, 2014 at 1:35 PM, Luc Berger-Vergiat
>>     <lb2653 at columbia.edu <mailto:lb2653 at columbia.edu>> wrote:
>>
>>         Thanks Matt,
>>         this indeed setting the number of fields earlier solve my issue!
>>
>>         I have now made some progress getting my DM setup but I am
>>         having troubles setting my splitfield options.
>>         I ran my problem with the -ksp_view option to see what is
>>         going on and I guess that somehow the section that I define
>>         in my DM is not used by the preconditioner to split the fields.
>>         Here is the output of PETSc
>>
>>         KSP Object: 1 MPI processes
>>           type: gmres
>>             GMRES: restart=30, using Classical (unmodified)
>>         Gram-Schmidt Orthogonalization with no iterative refinement
>>             GMRES: happy breakdown tolerance 1e-30
>>           maximum iterations=10000, initial guess is zero
>>           tolerances:  relative=1e-08, absolute=1e-16, divergence=1e+16
>>           left preconditioning
>>           using PRECONDITIONED norm type for convergence test
>>         PC Object: 1 MPI processes
>>           type: fieldsplit
>>             FieldSplit with MULTIPLICATIVE composition: total splits = 4
>>             Solver info for each split is in the following KSP objects:
>>             Split number 0 Defined by IS
>>
>>
>>     There are 4 splits here and they are defined by an IS. Why do you
>>     think that is not what you asked for?
>>
>>       Thanks,
>>
>>         Matt
>>
>>             KSP Object: (fieldsplit_Field_0_)     1 MPI processes
>>               type: preonly
>>               maximum iterations=10000, initial guess is zero
>>               tolerances:  relative=1e-05, absolute=1e-50,
>>         divergence=10000
>>               left preconditioning
>>               using NONE norm type for convergence test
>>             PC Object: (fieldsplit_Field_0_)     1 MPI processes
>>               type: ilu
>>                 ILU: out-of-place factorization
>>                 0 levels of fill
>>                 tolerance for zero pivot 2.22045e-14
>>                 using diagonal shift on blocks to prevent zero pivot
>>                 matrix ordering: natural
>>                 factor fill ratio given 1, needed 1
>>                   Factored matrix follows:
>>                     Matrix Object:             1 MPI processes
>>                       type: seqaij
>>                       rows=0, cols=0
>>                       package used to perform factorization: petsc
>>                       total: nonzeros=0, allocated nonzeros=0
>>                       total number of mallocs used during
>>         MatSetValues calls =0
>>                         not using I-node routines
>>               linear system matrix = precond matrix:
>>               Matrix Object:       1 MPI processes
>>                 type: seqaij
>>                 rows=0, cols=0
>>                 total: nonzeros=0, allocated nonzeros=0
>>                 total number of mallocs used during MatSetValues calls =0
>>                   not using I-node routines
>>             Split number 1 Defined by IS
>>             KSP Object: (fieldsplit_Field_1_)     1 MPI processes
>>               type: preonly
>>               maximum iterations=10000, initial guess is zero
>>               tolerances:  relative=1e-05, absolute=1e-50,
>>         divergence=10000
>>               left preconditioning
>>               using NONE norm type for convergence test
>>             PC Object: (fieldsplit_Field_1_)     1 MPI processes
>>               type: ilu
>>                 ILU: out-of-place factorization
>>                 0 levels of fill
>>                 tolerance for zero pivot 2.22045e-14
>>                 using diagonal shift on blocks to prevent zero pivot
>>                 matrix ordering: natural
>>                 factor fill ratio given 1, needed 1
>>                   Factored matrix follows:
>>                     Matrix Object:             1 MPI processes
>>                       type: seqaij
>>                       rows=0, cols=0
>>                       package used to perform factorization: petsc
>>                       total: nonzeros=0, allocated nonzeros=0
>>                       total number of mallocs used during
>>         MatSetValues calls =0
>>                         not using I-node routines
>>               linear system matrix = precond matrix:
>>               Matrix Object:       1 MPI processes
>>                 type: seqaij
>>                 rows=0, cols=0
>>                 total: nonzeros=0, allocated nonzeros=0
>>                 total number of mallocs used during MatSetValues calls =0
>>                   not using I-node routines
>>             Split number 2 Defined by IS
>>             KSP Object: (fieldsplit_Field_2_)     1 MPI processes
>>               type: preonly
>>               maximum iterations=10000, initial guess is zero
>>               tolerances:  relative=1e-05, absolute=1e-50,
>>         divergence=10000
>>               left preconditioning
>>               using NONE norm type for convergence test
>>             PC Object: (fieldsplit_Field_2_)     1 MPI processes
>>               type: ilu
>>                 ILU: out-of-place factorization
>>                 0 levels of fill
>>                 tolerance for zero pivot 2.22045e-14
>>                 using diagonal shift on blocks to prevent zero pivot
>>                 matrix ordering: natural
>>                 factor fill ratio given 1, needed 1
>>                   Factored matrix follows:
>>                     Matrix Object:             1 MPI processes
>>                       type: seqaij
>>                       rows=0, cols=0
>>                       package used to perform factorization: petsc
>>                       total: nonzeros=0, allocated nonzeros=0
>>                       total number of mallocs used during
>>         MatSetValues calls =0
>>                         not using I-node routines
>>               linear system matrix = precond matrix:
>>               Matrix Object:       1 MPI processes
>>                 type: seqaij
>>                 rows=0, cols=0
>>                 total: nonzeros=0, allocated nonzeros=0
>>                 total number of mallocs used during MatSetValues calls =0
>>                   not using I-node routines
>>             Split number 3 Defined by IS
>>             KSP Object: (fieldsplit_Field_3_)     1 MPI processes
>>               type: preonly
>>               maximum iterations=10000, initial guess is zero
>>               tolerances:  relative=1e-05, absolute=1e-50,
>>         divergence=10000
>>               left preconditioning
>>               using NONE norm type for convergence test
>>             PC Object: (fieldsplit_Field_3_)     1 MPI processes
>>               type: ilu
>>                 ILU: out-of-place factorization
>>                 0 levels of fill
>>                 tolerance for zero pivot 2.22045e-14
>>                 using diagonal shift on blocks to prevent zero pivot
>>                 matrix ordering: natural
>>                 factor fill ratio given 1, needed 1
>>                   Factored matrix follows:
>>                     Matrix Object:             1 MPI processes
>>                       type: seqaij
>>                       rows=0, cols=0
>>                       package used to perform factorization: petsc
>>                       total: nonzeros=0, allocated nonzeros=0
>>                       total number of mallocs used during
>>         MatSetValues calls =0
>>                         not using I-node routines
>>               linear system matrix = precond matrix:
>>               Matrix Object:       1 MPI processes
>>                 type: seqaij
>>                 rows=0, cols=0
>>                 total: nonzeros=0, allocated nonzeros=0
>>                 total number of mallocs used during MatSetValues calls =0
>>                   not using I-node routines
>>           linear system matrix = precond matrix:
>>           Matrix Object:   1 MPI processes
>>             type: seqaij
>>             rows=16, cols=16
>>             total: nonzeros=256, allocated nonzeros=256
>>             total number of mallocs used during MatSetValues calls =0
>>               using I-node routines: found 4 nodes, limit used is 5
>>
>>         I am also attaching part of my code which I use to generate
>>         the DM, the KSP and the PC objects.
>>
>>         Best,
>>         Luc
>>
>>         On 01/25/2014 10:31 AM, Matthew Knepley wrote:
>>>         On Fri, Jan 24, 2014 at 5:10 PM, Luc Berger-Vergiat
>>>         <lb2653 at columbia.edu <mailto:lb2653 at columbia.edu>> wrote:
>>>
>>>             Hi all,
>>>             I want to use PETSc as a solver for an FEM problem:
>>>             modelization of shear bands using a 4 fields mixed
>>>             formulation.
>>>
>>>             So far I am just trying to set up a two fields in a
>>>             Petsc section, assign dof too each field and then set up
>>>             the section to pass it to a DM. I am taking this
>>>             approach because in general I want for fieldsplit to
>>>             work purely on the algebraic level without knowledge of
>>>             boundary conditions or geometry.
>>>
>>>             As of now I have issues when I try to assign a point and
>>>             its associated degree of freedom to a field using:
>>>             PetscSectionSetFieldDof.
>>>             Is this the correct way to associate a dof/point to a field?
>>>
>>>
>>>         You have to set the number of fields before the chart. I am
>>>         updating the docs.
>>>
>>>          Thanks,
>>>
>>>             Matt
>>>
>>>             I attached an example code and its makefile.
>>>
>>>             -- 
>>>             Best,
>>>             Luc
>>>
>>>
>>>
>>>
>>>         -- 
>>>         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
>>
>>
>>
>>
>>     -- 
>>     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
>
>
>
>
> -- 
> 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/20140129/ceebe95a/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: DMshell_ex1.c
Type: text/x-csrc
Size: 4367 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20140129/ceebe95a/attachment-0001.c>
-------------- next part --------------
CFLAGS                =
FFLAGS                =
CPPFLAGS        =
FPPFLAGS        =
LOCDIR          = /home/luc/research/simulations/Petsc_DM/
EXAMPLESC       = DMshell_ex1.c
MANSEC          = DM
SUBMANSEC       = DMDA

include ${PETSC_DIR}/conf/variables
include ${PETSC_DIR}/conf/rules


ex1: DMshell_ex1.o   chkopts
	-${CLINKER} -o ex1 DMshell_ex1.o  ${PETSC_DM_LIB}
	${RM} -f DMshell_ex1.o


More information about the petsc-users mailing list