Create another matrix B that contains "Selected parts of the matrix can be 
pre-calculated and stored to serve as the preconditioner." When you call 
KSPSetOperators() pass in B as the second matrix argument.

   Now if literally application of B is the preconditioner you want to use, 
then simply use PCMAT as the preconditioner, and it will apply B each time it 
needs to apply the preconditioner. With this, you do not even need a PCShell. 

   If your preconditioner uses B to construct your own specific data structure 
needed to apply your preconditioner, then you can use PCShellSetSetUp() and 
have your routine call PCGetOperators() to pull out the B matrix and use it to 
construct your preconditioner. 

   If you want PETSc to construct a standard preconditioner from B, then you 
don't need the PCShell; you simply pass in the B, as above, and use -pc_type 
type to set the preconditioner you want to use. 

   Barry


> On Aug 16, 2022, at 12:31 PM, Tu, Jiannan <jiannan...@uml.edu> wrote:
> 
> Barry,
> 
> Thank you very much for your instructions. I am sorry I may not ask clearer 
> questions.
> 
> I don't use SNES. What I am trying to solve is a very large linear equation 
> system with dense and ill-conditioned matrix. Selected parts of the matrix 
> can be pre-calculated and stored to serve as the preconditioner. My question 
> is how I can apply this matrix as the preconditioner. 
> 
> Here is the part of code from my linear equations solver. 
> MatrixFreePreconditioner is supposed to be the routine to provide the 
> preconditioner. But I don't understand how to use it. Should I use 
> SNESSetJacobian() even if this is a linear problem? 
> 
>     MatCreateMFFD(MPI_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, N, N, &A);
>     MatMFFDSetFunction(A, formfunction, &params);
>     MatSetFromOptions(A);
>     MatMFFDSetBase(A, X, NULL);
> 
>     KSPCreate(MPI_COMM_WORLD, &ksp);
>     KSPSetOperators(ksp, A, A);
>     KSPSetFromOptions(ksp);
> 
>     PC pc;
>     KSPGetPC(ksp,&pc);
>     PCSetType(pc,PCSHELL);
>     PCShellSetApply(pc,MatrixFreePreconditioner);
> 
> Thank you,
> Jiannan
> 
> From: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>>
> Sent: Tuesday, August 16, 2022 10:10 AM
> To: Tu, Jiannan <jiannan...@uml.edu <mailto:jiannan...@uml.edu>>
> Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> 
> <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>>
> Subject: Re: [petsc-users] Using matrix-free with KSP
>  
> CAUTION: This email was sent from outside the UMass Lowell network.
> 
> 
>   I don't fully understand your question so I will answer questions that I do 
> know the answer to :-)
> 
>   The function you provide to PCShellSetApply() applies the preconditioner to 
> the input vector and puts the result in the output vector.  This input vector 
> changes at every application of the preconditioner so should not be used in 
> constructing the preconditioner.
> 
>   If you are using the standard PETSc matrix-free matrix-vector product via 
> finite difference, -snes_mf_operator or via MatCreateSNESMF() or you are 
> using a MatShell, the matrix-vector product routines input changes for each 
> multiply and should not be used in constructing the preconditioner.
> 
>   The function you provide with SNESSetJacobian() is where you can compute 
> anything you need to help build your preconditioner. The input vector to that 
> function is the location at which the Jacobian is needed and is what you 
> should use to build your approximate/part of Jacobian. You can store your 
> approximate/part of Jacobian that you need to compute in the pmat and then in 
> a PCShellSetUp() function that you provide you will compute what you will 
> need latter to apply the preconditioner in your PCShellSetApply() function. 
> Note that the values you put in the pmat do not need to be the full Jacobian; 
> they can be anything you want since this pmat is not used to apply the matrix 
> vector product.
> 
>   If this is unclear, feel free to ask additional questions.
> 
>   Barry
> 
> 
>> On Aug 16, 2022, at 9:40 AM, Tu, Jiannan <jiannan...@uml.edu 
>> <mailto:jiannan...@uml.edu>> wrote:
>> 
>> I am trying to apply a user-defined preconditioner to speed up the 
>> convergency of matrix-free KSP solver. The user's manual provides an example 
>> of how to call the user-defined preconditioner routine. The routine has PC, 
>> input Vec and output Vec as arguments. I want to use part of the Jacobian as 
>> preconditioner matrix, the elements of which can be calculated using input 
>> Vec. My question is what the role of output Vec from the routine is in 
>> matrix-vector product? Or I just have the preconditioner matrix elements 
>> calculated in the routine and then Petsc handles applying the preconditioner 
>> to matrix-vector product? I used PCSetType(pc, PCSHELL) and PCShellSetApply.
>> 
>> Thank you and appreciate your help!
>> 
>> Jiannan 
>> From: Tu, Jiannan <jiannan...@uml.edu <mailto:jiannan...@uml.edu>>
>> Sent: Wednesday, July 6, 2022 2:34 PM
>> To: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>>
>> Cc: Jed Brown <j...@jedbrown.org <mailto:j...@jedbrown.org>>; 
>> petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> 
>> <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>>
>> Subject: Re: [petsc-users] Using matrix-free with KSP
>>  
>> Barry,
>> 
>> VecScatterCreateToAll solves the problem! The code now gives the correct 
>> answer with multiple processes. 
>> 
>> Thank you all so much!
>> 
>> Jiannan
>> From: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>>
>> Sent: Wednesday, July 6, 2022 2:08 PM
>> To: Tu, Jiannan <jiannan...@uml.edu <mailto:jiannan...@uml.edu>>
>> Cc: Jed Brown <j...@jedbrown.org <mailto:j...@jedbrown.org>>; 
>> petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> 
>> <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>>
>> Subject: Re: [petsc-users] Using matrix-free with KSP
>>  
>> 
>>   So your operator is a "dense" operator in that its matrix representation 
>> would be essentially dense. In that case, you can use specialized routines 
>> to do this efficiently. You can use VecScatterCreateToAll() and then 
>> VecScatterBegin/End to do the communication.
>> 
>>   Barry
>> 
>> 
>> 
>>> On Jul 6, 2022, at 1:39 PM, Tu, Jiannan <jiannan...@uml.edu 
>>> <mailto:jiannan...@uml.edu>> wrote:
>>> 
>>> Jed, thank you very much for the reply. 
>>> 
>>> I'm not sure GlobaltoLocal will work. Say the solution vector is of length 
>>> 10. Two processes then each process can see 5 elements of the vector. For A 
>>> x = b (10 equations), each process performs matrix-vector product for five 
>>> equations. And for each equation i , sum_j A_ij *  x_j = b_i requires the 
>>> process has access to all 10 unknows x_i (i=0,1,...,9). 
>>> 
>>> Can VecScatter and PetscSF make the entire vector accessible to each 
>>> process? I am reading the manual and trying to understand how VecScatter 
>>> and PetscSF work.
>>> 
>>> Jiannan
>>> From: Jed Brown <j...@jedbrown.org <mailto:j...@jedbrown.org>>
>>> Sent: Wednesday, July 6, 2022 10:09 AM
>>> To: Tu, Jiannan <jiannan...@uml.edu <mailto:jiannan...@uml.edu>>; Barry 
>>> Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>>
>>> Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> 
>>> <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>>
>>> Subject: Re: [petsc-users] Using matrix-free with KSP
>>>  
>>> You'll usually have a GlobalToLocal operation for each rank to get the halo 
>>> data it needs, then either a LocalToGlobal to collect the result (e.g., 
>>> finite element methods) or the local compute will write directly into the 
>>> owned portion of the global vector. If you're doing the communication 
>>> "raw", then you may find VecScatter or PetscSF useful to perform the 
>>> necessary communication.
>>> 
>>> "Tu, Jiannan" <jiannan...@uml.edu <mailto:jiannan...@uml.edu>> writes:
>>> 
>>> > Hi Barry,
>>> >
>>> > Following your instructions I implemented the matrix-free method to solve 
>>> > a large linear equation system resulted from a surface integration 
>>> > equation. The KSP solver works fine for single process, but it is 
>>> > problematic with multiple processes. The problem is that each process 
>>> > only can access its own part of solution vector so that each process only 
>>> > conducts part of matrix-vector multiplication. MPI can be used to 
>>> > assemble these partial matrix-vector multiplication together.  Does Petsc 
>>> > provide any ways to implement multi-process matrix-free method?
>>> >
>>> > Thanks,
>>> > Jiannan
>>> > ________________________________
>>> > From: Barry Smith <bsm...@petsc.dev <mailto:bsm...@petsc.dev>>
>>> > Sent: Tuesday, May 24, 2022 2:12 PM
>>> > To: Tu, Jiannan <jiannan...@uml.edu <mailto:jiannan...@uml.edu>>
>>> > Cc: petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov> 
>>> > <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>>
>>> > Subject: Re: [petsc-users] Using matrix-free with KSP
>>> >
>>> > This e-mail originated from outside the UMass Lowell network.
>>> > ________________________________
>>> >
>>> >    You can use MatCreateMFFD 
>>> > https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpetsc.org%2Fmain%2Fdocs%2Fmanualpages%2FMat%2FMatCreateMFFD%2F&amp;data=05%7C01%7CJiannan_Tu%40uml.edu%7Cab0859d8d154471590bc08da5f5918d6%7C4c25b8a617f746f983f054734ab81fb1%7C0%7C0%7C637927133525745809%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=A7wqegTfh94No5BpDiWLK3VxOuR44U2wlWHVm2k7l60%3D&amp;reserved=0<https://urldefense.com/v3/__https://petsc.org/main/docs/manualpages/Mat/MatCreateMFFD/__;!!PVKG_VDCxu5g!stxq2NWGVjUihvHBQC9Rlk0aHVoowcy0PTQYMcQxQ4DqOEC05KSw6TmstSXKckiUgelHzy4ue-d10-zlXkw$>
>>> >  
>>> > <https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpetsc.org%2Fmain%2Fdocs%2Fmanualpages%2FMat%2FMatCreateMFFD%2F&data=05%7C01%7CJiannan_Tu%40uml.edu%7C9cf9b4c72f7c4f0cd92a08da7f9120f4%7C4c25b8a617f746f983f054734ab81fb1%7C0%7C0%7C637962558562603998%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=BdPTAQcdmpnMYPbWECCabNQSzJfqpiH5G7iq1d%2FlY4k%3D&reserved=0>
>>> >  MatMFFDSetFunction MatSetFromOptions MatMFFDSetBase and provide the 
>>> > matrix to KSP. Note you will need to use -pc_type none or provide your 
>>> > own custom preconditioner 
>>> > withhttps://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpetsc.org%2Fmain%2Fdocs%2Fmanualpages%2FPC%2FPCSHELL%2F&amp;data=05%7C01%7CJiannan_Tu%40uml.edu%7Cab0859d8d154471590bc08da5f5918d6%7C4c25b8a617f746f983f054734ab81fb1%7C0%7C0%7C637927133525745809%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=Gb%2F9uFG3jp%2FbfWaSh2cSEQLItHS9CuLwarzN0KcNiJY%3D&amp;reserved=0<https://urldefense.com/v3/__https://petsc.org/main/docs/manualpages/PC/PCSHELL/__;!!PVKG_VDCxu5g!stxq2NWGVjUihvHBQC9Rlk0aHVoowcy0PTQYMcQxQ4DqOEC05KSw6TmstSXKckiUgelHzy4ue-d1cA4fKGw$>
>>> >  
>>> > <https://nam10.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpetsc.org%2Fmain%2Fdocs%2Fmanualpages%2FPC%2FPCSHELL%2F&data=05%7C01%7CJiannan_Tu%40uml.edu%7C9cf9b4c72f7c4f0cd92a08da7f9120f4%7C4c25b8a617f746f983f054734ab81fb1%7C0%7C0%7C637962558562603998%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=6XJ3yp6S8IbTevj%2BeUOHDjgCbeTq346j%2Fini%2BLGmkag%3D&reserved=0>
>>> >
>>> >
>>> >
>>> > On May 24, 2022, at 1:21 PM, Tu, Jiannan <jiannan...@uml.edu 
>>> > <mailto:jiannan...@uml.edu><mailto:jiannan...@uml.edu 
>>> > <mailto:jiannan...@uml.edu>>> wrote:
>>> >
>>> > I want to use a matrix-free matrix to solve a large linear equation 
>>> > system because the matrix is too large to be stored. Petsc user manual 
>>> > describes matrix-free method for SNES with examples. The matrix-free 
>>> > matrices section explains how to set up such a matrix, but I can't find 
>>> > any example of matrix-free method with KSP. I am wondering how to apply 
>>> > the method to KSP iterative solver in parallel.
>>> >
>>> > I greatly appreciate your help for me to understand this topic.
>>> >
>>> > Jiannan Tu

Reply via email to