[petsc-users] Understanding index sets for PCGASM

Barry Smith bsmith at petsc.dev
Tue May 9 13:45:37 CDT 2023


  It is simplier than you are making it out to be. Each IS[] is a list of rows (and columns) in the sub (domain) matrix. In your case with the matrix of 144 by 144 the indices will go from 0 to 143.

  In your simple Fortran code you have a completely different problem. A matrix with 8 rows and columns. In that case if you want the first IS to represent just the first row (and column) in the matrix then it should contain only 0. The second submatrix which is all rows (but the first) should have 1,2,3,4,5,6,7

  I do not understand why your code has 

>>>> indices_first_domain = [0,1,8,9] ! corresponds to diag(1,1)

it should just be 0





> On May 9, 2023, at 12:44 PM, LEONARDO MUTTI <leonardo.mutti01 at universitadipavia.it> wrote:
> 
> Partial typo: I expect 9x(16+16) numbers to be stored in subdomain_IS : # subdomains x (row indices of the submatrix + col indices of the submatrix).
> 
> Il giorno mar 9 mag 2023 alle ore 18:31 LEONARDO MUTTI <leonardo.mutti01 at universitadipavia.it <mailto:leonardo.mutti01 at universitadipavia.it>> ha scritto:
>> 
>> 
>> ---------- Forwarded message ---------
>> Da: LEONARDO MUTTI <leonardo.mutti01 at universitadipavia.it <mailto:leonardo.mutti01 at universitadipavia.it>>
>> Date: mar 9 mag 2023 alle ore 18:29
>> Subject: Re: [petsc-users] Understanding index sets for PCGASM
>> To: Matthew Knepley <knepley at gmail.com <mailto:knepley at gmail.com>>
>> 
>> 
>> Thank you for your answer, but I am still confused, sorry. 
>> Consider https://gitlab.com/petsc/petsc/-/blob/main/src/ksp/ksp/tests/ex71f.F90 on one processor.
>> Let M=12 for the sake of simplicity, i.e. we deal with a 12x12 2D grid, hence, a  144x144 matrix.
>> Let NSubx = 3, so that on the grid we do 3 vertical and 3 horizontal subdivisions.
>> We should obtain 9 subdomains that are grids of 4x4 nodes each, thus corresponding to 9 submatrices of size 16x16. 
>> In my run I obtain NSub = 9 (great) and subdomain_IS(i), i=1,...,9, reads:
>> 
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 0
>> 1 1
>> 2 2
>> 3 3
>> 4 12
>> 5 13
>> 6 14
>> 7 15
>> 8 24
>> 9 25
>> 10 26
>> 11 27
>> 12 36
>> 13 37
>> 14 38
>> 15 39
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 4
>> 1 5
>> 2 6
>> 3 7
>> 4 16
>> 5 17
>> 6 18
>> 7 19
>> 8 28
>> 9 29
>> 10 30
>> 11 31
>> 12 40
>> 13 41
>> 14 42
>> 15 43
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 8
>> 1 9
>> 2 10
>> 3 11
>> 4 20
>> 5 21
>> 6 22
>> 7 23
>> 8 32
>> 9 33
>> 10 34
>> 11 35
>> 12 44
>> 13 45
>> 14 46
>> 15 47
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 48
>> 1 49
>> 2 50
>> 3 51
>> 4 60
>> 5 61
>> 6 62
>> 7 63
>> 8 72
>> 9 73
>> 10 74
>> 11 75
>> 12 84
>> 13 85
>> 14 86
>> 15 87
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 52
>> 1 53
>> 2 54
>> 3 55
>> 4 64
>> 5 65
>> 6 66
>> 7 67
>> 8 76
>> 9 77
>> 10 78
>> 11 79
>> 12 88
>> 13 89
>> 14 90
>> 15 91
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 56
>> 1 57
>> 2 58
>> 3 59
>> 4 68
>> 5 69
>> 6 70
>> 7 71
>> 8 80
>> 9 81
>> 10 82
>> 11 83
>> 12 92
>> 13 93
>> 14 94
>> 15 95
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 96
>> 1 97
>> 2 98
>> 3 99
>> 4 108
>> 5 109
>> 6 110
>> 7 111
>> 8 120
>> 9 121
>> 10 122
>> 11 123
>> 12 132
>> 13 133
>> 14 134
>> 15 135
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 100
>> 1 101
>> 2 102
>> 3 103
>> 4 112
>> 5 113
>> 6 114
>> 7 115
>> 8 124
>> 9 125
>> 10 126
>> 11 127
>> 12 136
>> 13 137
>> 14 138
>> 15 139
>> IS Object: 1 MPI process
>>   type: general
>> Number of indices in set 16
>> 0 104
>> 1 105
>> 2 106
>> 3 107
>> 4 116
>> 5 117
>> 6 118
>> 7 119
>> 8 128
>> 9 129
>> 10 130
>> 11 131
>> 12 140
>> 13 141
>> 14 142
>> 15 143
>> 
>> As you said, no number here reaches 144. 
>> But the number stored in subdomain_IS are 9x16= #subdomains x 16, whereas I would expect, also given your latest reply, 9x16x16x2=#subdomains x submatrix height x submatrix width x length of a (row,column) pair.
>> It would really help me if you could briefly explain how the output above encodes the subdivision into subdomains.
>> Many thanks again,
>> Leonardo
>> 
>> 
>> Il giorno mar 9 mag 2023 alle ore 16:24 Matthew Knepley <knepley at gmail.com <mailto:knepley at gmail.com>> ha scritto:
>>> On Tue, May 9, 2023 at 10:05 AM LEONARDO MUTTI <leonardo.mutti01 at universitadipavia.it <mailto:leonardo.mutti01 at universitadipavia.it>> wrote:
>>>> Great thanks! I can now successfully run https://gitlab.com/petsc/petsc/-/blob/main/src/ksp/ksp/tests/ex71f.F90.
>>>> 
>>>> Going forward with my experiments, let me post a new code snippet (very similar to  ex71f.F90) that I cannot get to work, probably I must be setting up the IS objects incorrectly.
>>>> 
>>>> I have an 8x8 matrix A=diag(1,1,2,2,...,2) and a vector  b=(0.5,...,0.5). We have only one processor, and I want to solve Ax=b using GASM. In particular, KSP is set to preonly, GASM is the preconditioner and it uses on each submatrix an lu direct solver (sub_ksp = preonly, sub_pc = lu).
>>>> 
>>>> For the GASM algorithm, I divide A into diag(1,1) and diag(2,2,...,2). For simplicity I set 0 overlap. Now I want to use GASM to solve Ax=b. The code follows.
>>>> 
>>>> #include <petsc/finclude/petscmat.h>
>>>> #include <petsc/finclude/petscksp.h>
>>>> #include <petsc/finclude/petscpc.h>
>>>>       USE petscmat
>>>>       USE petscksp
>>>>       USE petscpc
>>>>       USE MPI
>>>> 
>>>>       Mat   :: A
>>>>       Vec   :: b, x
>>>>       PetscInt :: M, I, J, ISLen, NSub
>>>>       PetscMPIInt :: size
>>>>       PetscErrorCode :: ierr
>>>>       PetscScalar :: v
>>>>       KSP            :: ksp
>>>>       PC             :: pc
>>>>       IS :: subdomains_IS(2), inflated_IS(2)
>>>>       PetscInt,DIMENSION(4) :: indices_first_domain
>>>>       PetscInt,DIMENSION(36) :: indices_second_domain
>>>>       
>>>>       call PetscInitialize(PETSC_NULL_CHARACTER, ierr)
>>>>       call MPI_Comm_size(PETSC_COMM_WORLD, size, ierr)
>>>> 
>>>> 
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       ! INTRO: create matrix and right hand side
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       
>>>>       WRITE(*,*) "Assembling A,b"
>>>> 
>>>>       M = 8
>>>>       call MatCreateAIJ(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE,
>>>>      & M, M, PETSC_DEFAULT_INTEGER, PETSC_NULL_INTEGER,
>>>>      & PETSC_DEFAULT_INTEGER, PETSC_NULL_INTEGER,A, ierr)
>>>>       DO I=1,M
>>>>          DO J=1,M
>>>>             IF ((I .EQ. J) .AND. (I .LE. 2 )) THEN
>>>>                v = 1
>>>>             ELSE IF ((I .EQ. J) .AND. (I .GT. 2 )) THEN
>>>>                v = 2
>>>>             ELSE
>>>>                v = 0
>>>>             ENDIF
>>>>             call MatSetValue(A, I-1, J-1, v, INSERT_VALUES, ierr)
>>>>          END DO
>>>>       END DO
>>>> 
>>>>       call MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)
>>>>       call MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)
>>>>       
>>>>       call VecCreate(PETSC_COMM_WORLD,b,ierr)
>>>>       call VecSetSizes(b, PETSC_DECIDE, M,ierr)
>>>>       call VecSetFromOptions(b,ierr)
>>>>       
>>>>       do I=1,M
>>>>          v = 0.5
>>>>          call VecSetValue(b,I-1,v, INSERT_VALUES,ierr)
>>>>       end do
>>>>       
>>>>       call VecAssemblyBegin(b,ierr)
>>>>       call VecAssemblyEnd(b,ierr)
>>>>                  
>>>>   
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       ! FIRST KSP/PC SETUP
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       
>>>>       WRITE(*,*) "KSP/PC first setup"
>>>>       
>>>>       call KSPCreate(PETSC_COMM_WORLD, ksp, ierr)
>>>>       call KSPSetOperators(ksp, A, A, ierr)
>>>>       call KSPSetType(ksp, 'preonly', ierr)
>>>>       call KSPGetPC(ksp, pc, ierr)
>>>>       call KSPSetUp(ksp, ierr)
>>>>       call PCSetType(pc, PCGASM, ierr)
>>>>      
>>>>   
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       ! GASM, SETTING SUBDOMAINS
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       
>>>>       WRITE(*,*) "Setting GASM subdomains"
>>>>       
>>>>       ! Let's create the subdomain IS and inflated_IS
>>>>       ! They are equal if no overlap is present
>>>>       ! They are 1: 0,1,8,9
>>>>       !          2: 10,...,15,18,...,23,...,58,...,63  
>>>>       
>>>>       indices_first_domain = [0,1,8,9] ! corresponds to diag(1,1)
>>>>       do I=0,5
>>>>          do J=0,5
>>>>             indices_second_domain(I*6+1+J) = 18 + J + 8*I ! corresponds to diag(2,2,...,2)
>>>>             !WRITE(*,*) I*6+1+J, 18 + J + 8*I
>>>>          end do
>>>>       end do
>>>>       
>>>>       ! Convert into IS
>>>>       ISLen = 4
>>>>       call ISCreateGeneral(PETSC_COMM_WORLD,ISLen,indices_first_domain,
>>>>      & PETSC_COPY_VALUES, subdomains_IS(1), ierr)
>>>>       call ISCreateGeneral(PETSC_COMM_WORLD,ISLen,indices_first_domain,
>>>>      & PETSC_COPY_VALUES, inflated_IS(1), ierr)
>>>>       ISLen = 36
>>>>       call ISCreateGeneral(PETSC_COMM_WORLD,ISLen,indices_second_domain,
>>>>      & PETSC_COPY_VALUES, subdomains_IS(2), ierr)
>>>>       call ISCreateGeneral(PETSC_COMM_WORLD,ISLen,indices_second_domain,
>>>>      & PETSC_COPY_VALUES, inflated_IS(2), ierr)
>>>> 
>>>>       NSub = 2
>>>>       call PCGASMSetSubdomains(pc,NSub,
>>>>      & subdomains_IS,inflated_IS,ierr)
>>>>       call PCGASMDestroySubdomains(NSub,
>>>>      & subdomains_IS,inflated_IS,ierr)
>>>>       
>>>>       
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       ! GASM: SET SUBSOLVERS
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!      
>>>>       
>>>>       WRITE(*,*) "Setting subsolvers for GASM"
>>>>       
>>>>       call PCSetUp(pc, ierr) ! should I add this?
>>>>       
>>>>       call PetscOptionsSetValue(PETSC_NULL_OPTIONS,
>>>>      & "-sub_pc_type", "lu", ierr)
>>>>       call PetscOptionsSetValue(PETSC_NULL_OPTIONS,
>>>>      & "-sub_ksp_type", "preonly", ierr)
>>>>       
>>>>       call KSPSetFromOptions(ksp, ierr)
>>>>       call PCSetFromOptions(pc, ierr)
>>>>      
>>>>   
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>>>       ! DUMMY SOLUTION: DID IT WORK?
>>>>       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
>>>>       
>>>>       WRITE(*,*) "Solve"
>>>>       
>>>>       call VecDuplicate(b,x,ierr)
>>>>       call KSPSolve(ksp,b,x,ierr)
>>>>         
>>>>       call MatDestroy(A, ierr)
>>>>       call KSPDestroy(ksp, ierr)
>>>>       call PetscFinalize(ierr)
>>>> 
>>>> This code is failing in multiple points. At  call PCSetUp(pc, ierr) it produces:
>>>> 
>>>> [0]PETSC ERROR: Argument out of range
>>>> [0]PETSC ERROR: Scatter indices in ix are out of range
>>>> ...
>>>> [0]PETSC ERROR: #1 VecScatterCreate() at ***\src\vec\is\sf\INTERF~1\vscat.c:736
>>>> [0]PETSC ERROR: #2 PCSetUp_GASM() at ***\src\ksp\pc\impls\gasm\gasm.c:433
>>>> [0]PETSC ERROR: #3 PCSetUp() at ***\src\ksp\pc\INTERF~1\precon.c:994
>>>> 
>>>> And at call KSPSolve(ksp,b,x,ierr) it produces:
>>>> 
>>>> forrtl: severe (157): Program Exception - access violation
>>>> 
>>>> The index sets are setup coherently with the outputs of e.g. https://gitlab.com/petsc/petsc/-/blob/main/src/ksp/ksp/tests/output/ex71f_1.out: in particular each element of the matrix A corresponds to a number from 0 to 63.
>>> 
>>> This is not correct, I believe. The indices are row/col indices, not indices into dense blocks, so for
>>> your example, they are all in [0, 8].
>>> 
>>>   Thanks,
>>> 
>>>      Matt
>>>  
>>>> Note that each submatrix does not represent some physical subdomain, the subdivision is just at the algebraic level.
>>>> I thus have the following questions:
>>>> is this the correct way of creating the IS objects, given my objective at the beginning of the email? Is the ordering correct?
>>>> what am I doing wrong that is generating the above errors?
>>>> Thanks for the patience and the time.
>>>> Best, 
>>>> Leonardo
>>>> 
>>>> Il giorno ven 5 mag 2023 alle ore 18:43 Barry Smith <bsmith at petsc.dev <mailto:bsmith at petsc.dev>> ha scritto:
>>>>> 
>>>>>   Added in barry/2023-05-04/add-pcgasm-set-subdomains see also https://gitlab.com/petsc/petsc/-/merge_requests/6419
>>>>> 
>>>>>   Barry
>>>>> 
>>>>> 
>>>>>> On May 4, 2023, at 11:23 AM, LEONARDO MUTTI <leonardo.mutti01 at universitadipavia.it <mailto:leonardo.mutti01 at universitadipavia.it>> wrote:
>>>>>> 
>>>>>> Thank you for the help. 
>>>>>> Adding to my example:
>>>>>>       call PCGASMSetSubdomains(pc,NSub, subdomains_IS, inflated_IS,ierr)
>>>>>>       call PCGASMDestroySubdomains(NSub,subdomains_IS,inflated_IS,ierr)
>>>>>> results in:
>>>>>>       Error LNK2019 unresolved external symbol PCGASMDESTROYSUBDOMAINS referenced in function ...  
>>>>>>       Error LNK2019 unresolved external symbol PCGASMSETSUBDOMAINS referenced in function ...  
>>>>>> I'm not sure if the interfaces are missing or if I have a compilation problem.
>>>>>> Thank you again. 
>>>>>> Best,
>>>>>> Leonardo
>>>>>> 
>>>>>> Il giorno sab 29 apr 2023 alle ore 20:30 Barry Smith <bsmith at petsc.dev <mailto:bsmith at petsc.dev>> ha scritto:
>>>>>>> 
>>>>>>>    Thank you for the test code. I have a fix in the branch  barry/2023-04-29/fix-pcasmcreatesubdomains2d <https://gitlab.com/petsc/petsc/-/commits/barry/2023-04-29/fix-pcasmcreatesubdomains2d> with merge request https://gitlab.com/petsc/petsc/-/merge_requests/6394
>>>>>>> 
>>>>>>>    The functions did not have proper Fortran stubs and interfaces so I had to provide them manually in the new branch.
>>>>>>> 
>>>>>>>    Use
>>>>>>> 
>>>>>>>    git fetch
>>>>>>>    git checkout barry/2023-04-29/fix-pcasmcreatesubdomains2d <https://gitlab.com/petsc/petsc/-/commits/barry/2023-04-29/fix-pcasmcreatesubdomains2d>
>>>>>>>    ./configure etc
>>>>>>> 
>>>>>>>    Your now working test code is in src/ksp/ksp/tests/ex71f.F90  I had to change things slightly and I updated the error handling for the latest version.
>>>>>>> 
>>>>>>>    Please let us know if you have any later questions.
>>>>>>> 
>>>>>>>   Barry
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> On Apr 28, 2023, at 12:07 PM, LEONARDO MUTTI <leonardo.mutti01 at universitadipavia.it <mailto:leonardo.mutti01 at universitadipavia.it>> wrote:
>>>>>>>> 
>>>>>>>> Hello. I am having a hard time understanding the index sets to feed PCGASMSetSubdomains, and I am working in Fortran (as a PETSc novice). To get more intuition on how the IS objects behave I tried the following minimal (non) working example, which should tile a 16x16 matrix into 16 square, non-overlapping submatrices:
>>>>>>>> 
>>>>>>>> #include <petsc/finclude/petscmat.h>
>>>>>>>> #include <petsc/finclude/petscksp.h>
>>>>>>>> #include <petsc/finclude/petscpc.h>
>>>>>>>>       USE petscmat
>>>>>>>>       USE petscksp
>>>>>>>>       USE petscpc
>>>>>>>>       
>>>>>>>>       Mat   :: A
>>>>>>>>       PetscInt :: M, NSubx, dof, overlap, NSub
>>>>>>>>       INTEGER :: I,J
>>>>>>>>       PetscErrorCode      :: ierr
>>>>>>>>       PetscScalar :: v
>>>>>>>>       KSP            :: ksp
>>>>>>>>       PC             :: pc
>>>>>>>>       IS :: subdomains_IS, inflated_IS
>>>>>>>>       
>>>>>>>>       call PetscInitialize(PETSC_NULL_CHARACTER , ierr)
>>>>>>>>       
>>>>>>>> !-----Create a dummy matrix
>>>>>>>>       M = 16
>>>>>>>>       call MatCreateAIJ(MPI_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE,
>>>>>>>>      & M, M,
>>>>>>>>      & PETSC_DEFAULT_INTEGER, PETSC_NULL_INTEGER,
>>>>>>>>      & PETSC_DEFAULT_INTEGER, PETSC_NULL_INTEGER,
>>>>>>>>      & A, ierr)
>>>>>>>>       
>>>>>>>>       DO I=1,M
>>>>>>>>          DO J=1,M
>>>>>>>>             v = I*J
>>>>>>>>             CALL MatSetValue (A,I-1,J-1,v,
>>>>>>>>      &                     INSERT_VALUES , ierr)
>>>>>>>>          END DO
>>>>>>>>       END DO
>>>>>>>>       
>>>>>>>>       call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY , ierr)
>>>>>>>>       call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY , ierr)
>>>>>>>>       
>>>>>>>> !-----Create KSP and PC
>>>>>>>>       call KSPCreate(PETSC_COMM_WORLD,ksp, ierr)
>>>>>>>>       call KSPSetOperators(ksp,A,A, ierr)
>>>>>>>>       call KSPSetType(ksp,"bcgs",ierr)
>>>>>>>>       call KSPGetPC(ksp,pc,ierr)
>>>>>>>>       call KSPSetUp(ksp, ierr)
>>>>>>>>       call PCSetType(pc,PCGASM, ierr)
>>>>>>>>       call PCSetUp(pc , ierr)
>>>>>>>>       
>>>>>>>> !-----GASM setup
>>>>>>>>       NSubx = 4
>>>>>>>>       dof = 1
>>>>>>>>       overlap = 0
>>>>>>>>       
>>>>>>>>       call PCGASMCreateSubdomains2D(pc, 
>>>>>>>>      &      M, M,
>>>>>>>>      &      NSubx, NSubx,
>>>>>>>>      &      dof, overlap,
>>>>>>>>      &      NSub, subdomains_IS, inflated_IS, ierr)
>>>>>>>> 
>>>>>>>>       call ISView(subdomains_IS, PETSC_VIEWER_STDOUT_WORLD, ierr)
>>>>>>>>       
>>>>>>>>       call KSPDestroy(ksp, ierr)  
>>>>>>>>       call PetscFinalize(ierr)
>>>>>>>> 
>>>>>>>> Running this on one processor, I get NSub = 4.
>>>>>>>> If PCASM and PCASMCreateSubdomains2D are used instead, I get NSub = 16 as expected.
>>>>>>>> Moreover, I get in the end "forrtl: severe (157): Program Exception - access violation". So:
>>>>>>>> 1) why do I get two different results with ASM, and GASM?
>>>>>>>> 2) why do I get access violation and how can I solve this?
>>>>>>>> In fact, in C, subdomains_IS, inflated_IS should pointers to IS objects. As I see on the Fortran interface, the arguments to PCGASMCreateSubdomains2D are IS objects:
>>>>>>>> 
>>>>>>>>        subroutine PCGASMCreateSubdomains2D(a,b,c,d,e,f,g,h,i,j,z)
>>>>>>>>        import tPC,tIS
>>>>>>>>        PC a ! PC
>>>>>>>>        PetscInt b ! PetscInt
>>>>>>>>        PetscInt c ! PetscInt
>>>>>>>>        PetscInt d ! PetscInt
>>>>>>>>        PetscInt e ! PetscInt
>>>>>>>>        PetscInt f ! PetscInt
>>>>>>>>        PetscInt g ! PetscInt
>>>>>>>>        PetscInt h ! PetscInt
>>>>>>>>        IS i ! IS
>>>>>>>>        IS j ! IS
>>>>>>>>        PetscErrorCode z
>>>>>>>>        end subroutine PCGASMCreateSubdomains2D
>>>>>>>> Thus:
>>>>>>>> 3) what should be inside e.g., subdomains_IS? I expect it to contain, for every created subdomain, the list of rows and columns defining the subblock in the matrix, am I right?
>>>>>>>> 
>>>>>>>> Context: I have a block-tridiagonal system arising from space-time finite elements, and I want to solve it with GMRES+PCGASM preconditioner, where each overlapping submatrix is on the diagonal and of size 3x3 blocks (and spanning multiple processes). This is PETSc 3.17.1 on Windows.
>>>>>>>> 
>>>>>>>> Thanks in advance,
>>>>>>>> Leonardo
>>>>>>> 
>>>>> 
>>> 
>>> 
>>> -- 
>>> 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
>>> 
>>> https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>

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


More information about the petsc-users mailing list