Sophie,

    Great, everything looks good. 

    So the new version takes about 7 times longer, due to the relatively modest 
increase (about 25 percent) in the number of iterations from the poorer 
preconditioner convergence and the rest from the much slower matrix-vector 
product due to using matrix free instead of matrix based precondtioner. Both of 
these are expected.

    The matrix is taking about 10% of the memory it used to require, also 
expected.

     I noticed in the logging the memory for the vectors 

             Vector    85             85     82303208     0.
              Matrix    15             15      8744032     0.

   is substantial/huge, with the much smaller matrix memory the vector memory 
dominates.

   It indicates 85 vectors are used. This is a large number, there are some 
needed for the TS (maybe 5?) and some needed for the KSP solve (maybe about 37) 
but I am not sure why there are so many. Perhaps this number could be reduced. 
Are there are lot of vectors created in the Xolotyl code? I would it could run 
with about 45 vectors.

  Barry




> On Sep 15, 2020, at 5:12 PM, Blondel, Sophie <[email protected]> wrote:
> 
> Hi Barry,
> 
> I fixed everything and re-ran the 4 cases in 1D. They took more time than 
> before because I used the Kokkos serial backend on the Xolotl side instead of 
> the CUDA one previously (long story short, I tried to update CUDA and messed 
> up the whole installation). Step 4 looks much better than prevously, I was 
> even able to remove MatSetOptions(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE) 
> from the code and it ran without throwing errors. The log files are attached.
> 
> Cheers,
> 
> Sophie
> From: Barry Smith <[email protected]>
> Sent: Friday, September 11, 2020 18:03
> To: Blondel, Sophie <[email protected]>
> Cc: [email protected] <[email protected]>; 
> [email protected] 
> <[email protected]>
> Subject: Re: [petsc-users] Matrix Free Method questions
>  
> 
> 
>> On Sep 11, 2020, at 7:45 AM, Blondel, Sophie <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Thank you Barry,
>> 
>> Step 3 worked after I moved MatSetOption at the beginning of 
>> computeJacobian(). Attached is the updated log which is pretty similar to 
>> what I had before. Step 4 still uses many more iterations. 
>> 
>> I checked the Jacobian using -ksp_view_pmat ascii (on a simpler case), I can 
>> see the difference between step 3 and 4 is that the contribution from the 
>> reactions is not included in the step 4 Jacobian (as expected from the fact 
>> that I removed their setting from the code).
>> 
>> Looking back at one of your previous email, you wrote "This routine should 
>> only compute the elements of the Jacobian needed for this reduced matrix 
>> Jacobian, so the diagonals and the diffusion/convection terms. ", does it 
>> mean that I should still include the contributions from the reactions that 
>> affect the pure diagonal terms? 
> 
>   Yes, you need to leave in everything that affects the diagonal otherwise 
> the "Jacobi" preconditioner will not reflect the true Jacobi preconditioner 
> and likely perform poorly.
> 
>   Barry
> 
>> 
>> Cheers,
>> 
>> Sophie
>> From: Barry Smith <[email protected] <mailto:[email protected]>>
>> Sent: Thursday, September 10, 2020 17:04
>> To: Blondel, Sophie <[email protected] <mailto:[email protected]>>
>> Cc: [email protected] <mailto:[email protected]> 
>> <[email protected] <mailto:[email protected]>>; 
>> [email protected] 
>> <mailto:[email protected]> 
>> <[email protected] 
>> <mailto:[email protected]>>
>> Subject: Re: [petsc-users] Matrix Free Method questions
>>  
>> 
>> 
>>> On Sep 10, 2020, at 2:46 PM, Blondel, Sophie <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> Hi Barry,
>>> 
>>> Going through the different changes again to understand what was going 
>>> wrong with the last step, I discovered that my changes from 2 to 3  
>>> (keeping only the pure diagonal for the reaction Jacobian setup and adding 
>>> MatSetOptions(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);) were wrong: the 
>>> sparsity of the matrix was correct but then the RHSJacobian method was 
>>> wrong. I updated it
>> 
>>    I'm not sure what you mean here. My hope was that in step 3 you won't 
>> need to change RHSJacobian at all (that is just for step 4).
>> 
>>> but now when I run step 3 again I get the following error:
>>> 
>>> [2]PETSC ERROR: --------------------- Error Message 
>>> --------------------------------------------------------------
>>> [2]PETSC ERROR: Argument out of range
>>> [2]PETSC ERROR: Inserting a new nonzero at global row/column (310400, 
>>> 316825) into matrix
>>> [2]PETSC ERROR: See https://www.mcs.anl.gov/petsc/documentation/faq.html 
>>> <https://www.mcs.anl.gov/petsc/documentation/faq.html> for trouble shooting.
>>> [2]PETSC ERROR: Petsc Development GIT revision: v3.13.4-885-gf58a62b032  
>>> GIT Date: 2020-09-01 13:07:58 -0500
>>> [2]PETSC ERROR: Unknown Name on a 20200902 named iguazu by bqo Thu Sep 10 
>>> 15:38:58 2020
>>> [2]PETSC ERROR: Configure options 
>>> PETSC_DIR=/home2/bqo/libraries/petsc-barry PETSC_ARCH=20200902 
>>> --with-cc=mpicc --with-cxx=mpicxx --with-fc=mpif77 --with-debugging=no 
>>> --with-shared-libraries --download-fblaslapack=1
>>> [2]PETSC ERROR: #1 MatSetValues_MPIAIJ() line 606 in 
>>> /home2/bqo/libraries/petsc-barry/src/mat/impls/aij/mpi/mpiaij.c
>>> [2]PETSC ERROR: #2 MatSetValues() line 1392 in 
>>> /home2/bqo/libraries/petsc-barry/src/mat/interface/matrix.c
>>> [2]PETSC ERROR: #3 MatSetValuesLocal() line 2207 in 
>>> /home2/bqo/libraries/petsc-barry/src/mat/interface/matrix.c
>>> [2]PETSC ERROR: #4 MatSetValuesStencil() line 1595 in 
>>> /home2/bqo/libraries/petsc-barry/src/mat/interface/matrix.c
>>> PetscSolverExpHandler::computeJacobian: MatSetValuesStencil (reactions) 
>>> failed.
>>> 
>>> Because the RHSJacobian method is trying to update the elements 
>>> corresponding to the reactions. I'm not sure I understood correctly what 
>>> step 3 was supposed to be.
>> 
>>   In step the three the RHSJacobian was suppose to be unchanged, only the 
>> option to ignore the "unneeded" Jacobian entries inside MatSetValues (set 
>> with MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);) was needed 
>> (plus changing the DMDASetBlockFillsXXX argument). 
>> 
>>   The error message  Inserting a new nonzero at global row/column (310400, 
>> 316825) into matrix indicates that somehow the MatOption 
>> MAT_NEW_NONZERO_LOCATION_ERR is in control instead of the option 
>> MAT_NEW_NONZERO_LOCATIONS, when it is setting values the Jacobian values. 
>> 
>>  The MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS_ERR,PETSC_TRUE);)  is 
>> normally called inside the DMCreateMatrix() so I am not sure how they could 
>> be getting called in the wrong order but it seems somehow it is
>> 
>>   When do you call MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);) 
>> in the code?  You can call it at the beginning of computeJacobian(). 
>> 
>>   If this still doesn't work and you get the same error you can run in the 
>> debugger on one process and put a breakpoint for MatSetOptions() to found 
>> out how the MAT_NEW_NONZERO_LOCATIONS_ERR comes in late to upset the apple 
>> cart. You should see MatSetOption() called at least twice and the last one 
>> should have the MAT_NEW_NONZERO_LOCATION flag.
>> 
>>   Barry
>> 
>> 
>> 
>> 
>>> 
>>> Cheers,
>>> 
>>> Sophie
>>> 
>>> 
>>> From: Barry Smith <[email protected] <mailto:[email protected]>>
>>> Sent: Friday, September 4, 2020 01:06
>>> To: Blondel, Sophie <[email protected] <mailto:[email protected]>>
>>> Cc: [email protected] <mailto:[email protected]> 
>>> <[email protected] <mailto:[email protected]>>; 
>>> [email protected] 
>>> <mailto:[email protected]> 
>>> <[email protected] 
>>> <mailto:[email protected]>>
>>> Subject: Re: [petsc-users] Matrix Free Method questions
>>>  
>>> 
>>>   Sophie,
>>> 
>>>   Thanks.  I have started looking through the logs
>>> 
>>>    The change to matrix-free multiple (from 1 to 2) which reduces the 
>>> accuracy of the multiply to about half the digits is not surprising. 
>>> 
>>>     * It roughly doubles the time since doing the matrix-free product 
>>> requires a function evaluation 
>>> 
>>>     * It increases the iteration count, but not significantly since the 
>>> reduced precision of the multiple induces some additional linear iterations
>>> 
>>>   The change from 2 to 3 (not storing the entire matrix) 
>>> 
>>>     * number of nonzeros goes from 49459966 to 1558766  = 3.15 percent so 
>>> it succeds in not storing the unneeded part of the matrix
>>> 
>>>     * the number of MatMult_MF goes from 2331 to 2418. I don't understand 
>>> this, I expected it to be identical because it should be using the same 
>>> preconditioner in 3 as in 2 and thus get the same convergence. Could 
>>> possibility be due to the variability in convergence due to different runs 
>>> with the matrix-free preconditioner preconditioner and not related to not 
>>> storing the entire matrix.
>>> 
>>>     * the KSPSolve() time goes from 3.8774e+0 to 3.7855e+02 a trivial 
>>> difference which is what I would expect
>>> 
>>>     * the SNESSolve time goes from  5.0047e+02 to 4.3275e+02 about a 14 
>>> percent drop which is reasonable because 3 doesn't spend as much time 
>>> inserting matrix values (it still computes them but doesn't insert the ones 
>>> we don't want for the preconditioner).
>>> 
>>>   The change from 3 to 4
>>> 
>>>     * something goes seriously wrong here. The total number of linear solve 
>>> iterations goes from 2282 to 97403 so something has gone seriously wrong 
>>> with the preconditioner, but since the preconditioner operations are the 
>>> same it seems something has gone wrong with the new reduced preconditioner.
>>> 
>>>  I think there is an error in computing the reduced matrix entries, that is 
>>> the new compute Jacobian code is not computing the entries it needs to 
>>> correctly.  
>>> 
>>>   To debug this you can run case 3 and case 4 for a single time step with 
>>> -ksp_view_pmat  binary This should create a binary file with the initial 
>>> Jacobian matrices in each. You can use Matlab or Python to do the 
>>> difference in the matrices and see how possibly the new Jacobian 
>>> computation code is not producing the  correct values in some locations.
>>> 
>>>    Good luck,
>>> 
>>>    Barry
>>> 
>>> 
>>> 
>>> 
>>>> On Sep 3, 2020, at 12:26 PM, Blondel, Sophie <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> Hi Barry,
>>>> 
>>>> Attached are the log files for the 1D case, for each of the 4 steps. I 
>>>> don't know how I did it yesterday but the differences between steps look 
>>>> better today, except for step 4 that takes many more iterations and 
>>>> smaller time steps.
>>>> 
>>>> Cheers,
>>>> 
>>>> Sophie
>>>>   
>>>> De : Barry Smith <[email protected] <mailto:[email protected]>>
>>>> Envoyé : mercredi 2 septembre 2020 15:53
>>>> À : Blondel, Sophie <[email protected] <mailto:[email protected]>>
>>>> Cc : [email protected] <mailto:[email protected]> 
>>>> <[email protected] <mailto:[email protected]>>; 
>>>> [email protected] 
>>>> <mailto:[email protected]> 
>>>> <[email protected] 
>>>> <mailto:[email protected]>>
>>>> Objet : Re: [petsc-users] Matrix Free Method questions
>>>>  
>>>> 
>>>> 
>>>>> On Sep 2, 2020, at 1:44 PM, Blondel, Sophie <[email protected] 
>>>>> <mailto:[email protected]>> wrote:
>>>>> 
>>>>> Thank you Barry,
>>>>> 
>>>>> The code ran with your branch but it's much slower than running with the 
>>>>> full Jacobian and Jacobi PC subtype (around 10 times slower). It is using 
>>>>> less memory as expected. I tried step 2 as well and it's even slower.
>>>> 
>>>>   Sophie,
>>>> 
>>>>   That is puzzling. It should be using the same matrix in the solver so 
>>>> should be the same speed and the setup time should be a bit better since 
>>>> it does not form the full Jacobian. (We'll get to this later)
>>>> 
>>>>> The TS iteration for step 1 are the same as with full Jacobian. Let me 
>>>>> know what I can look at to check if I've done something wrong.
>>>> 
>>>>   We need to see if the  KSP iterations are pretty similar for four 
>>>> approaches (1) original code with Jacobi PC subtype (2) matrix free with 
>>>> Jacobi PC (just add -snes_mf_operator to case 1) (3) the new code with the 
>>>> MatSetOption() to not store the entire Jacobian also with the 
>>>> -snes_mf_operator and (4) the new code that doesn't compute the unneeded 
>>>> part of the Jacobian also with the -snes_mf_operator 
>>>> 
>>>>   You could run each case with same 20 timesteps and -ts_monitor 
>>>> -ksp_monitor and -ts_view and send the four output files around.
>>>> 
>>>>  Once we are sure the four cases are behaving as expected then you can get 
>>>> timings for them but let's not do that until we confirm the similar 
>>>> results. There could easily be a flaw in my reasoning or the PETSc code 
>>>> somewhere that affects the correctness so its best to check that first.
>>>> 
>>>> 
>>>>   Barry
>>>> 
>>>>> 
>>>>> Cheers,
>>>>> 
>>>>> Sophie
>>>>> De : Barry Smith <[email protected] <mailto:[email protected]>>
>>>>> Envoyé : mardi 1 septembre 2020 14:12
>>>>> À : Blondel, Sophie <[email protected] <mailto:[email protected]>>
>>>>> Cc : [email protected] <mailto:[email protected]> 
>>>>> <[email protected] <mailto:[email protected]>>; 
>>>>> [email protected] 
>>>>> <mailto:[email protected]> 
>>>>> <[email protected] 
>>>>> <mailto:[email protected]>>
>>>>> Objet : Re: [petsc-users] Matrix Free Method questions
>>>>>  
>>>>> 
>>>>>   Sophie,
>>>>> 
>>>>>    Sorry, looks like an old bug in PETSc that was undetected due to lack 
>>>>> of use. The code is trying to use the first of the two matrices to 
>>>>> determine the preconditioner which won't work in your case since it is 
>>>>> matrix-free. It should be using the second matrix.
>>>>> 
>>>>>   I hope the branch barry/2020-09-01/fix-fieldsplit-mf resolves this 
>>>>> issue for you.
>>>>> 
>>>>>   Barry
>>>>> 
>>>>> 
>>>>>> On Sep 1, 2020, at 12:45 PM, Blondel, Sophie <[email protected] 
>>>>>> <mailto:[email protected]>> wrote:
>>>>>> 
>>>>>> Hi Barry,
>>>>>> 
>>>>>> I'm working through step 1) but I think I am doing something wrong. I'm 
>>>>>> using DMDASetBlockFillsSparse to set the non-zeros only for the 
>>>>>> diffusing clusters (small He clusters here, from size 1 to 7) and all 
>>>>>> the diagonal entries. Then I added a few lines in the code:
>>>>>> Mat mat;
>>>>>> DMCreateMatrix(da, &mat);
>>>>>> MatSetOption(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);
>>>>>> 
>>>>>> When I try to run with the following options: -snes_mf_operator -ts_dt 
>>>>>> 1.0e-12 -ts_adapt_time_step_increase_delay 2 -snes_force_iteration 
>>>>>> -pc_fieldsplit_detect_coupling -pc_type fieldsplit -fieldsplit_0_pc_type 
>>>>>> jacobi -fieldsplit_1_pc_type redundant -ts_max_time 1000.0 
>>>>>> -ts_adapt_dt_max 2.0e-3 -ts_adapt_wnormtype INFINITY 
>>>>>> -ts_exact_final_time stepover -ts_max_snes_failures -1 -ts_monitor 
>>>>>> -ts_max_steps 20
>>>>>> 
>>>>>> I get an error:
>>>>>> [0]PETSC ERROR: --------------------- Error Message 
>>>>>> --------------------------------------------------------------
>>>>>> [0]PETSC ERROR: No support for this operation for this object type
>>>>>> [0]PETSC ERROR: Matrix type mffd does not have a find off block diagonal 
>>>>>> entries defined
>>>>>> [0]PETSC ERROR: See https://www.mcs.anl.gov/petsc/documentation/faq.html 
>>>>>> <https://www.mcs.anl.gov/petsc/documentation/faq.html> for trouble 
>>>>>> shooting.
>>>>>> [0]PETSC ERROR: Petsc Development GIT revision: v3.13.4-851-gde18fec8da  
>>>>>> GIT Date: 2020-08-28 16:47:50 +0000
>>>>>> [0]PETSC ERROR: Unknown Name on a 20200828 named sophie-Precision-5530 
>>>>>> by sophie Tue Sep  1 10:58:44 2020
>>>>>> [0]PETSC ERROR: Configure options PETSC_DIR=/home/sophie/Code/petsc 
>>>>>> PETSC_ARCH=20200828 --with-cc=mpicc --with-cxx=mpicxx --with-fc=mpif77 
>>>>>> --with-debugging=no --with-shared-libraries
>>>>>> [0]PETSC ERROR: #1 MatFindOffBlockDiagonalEntries() line 9847 in 
>>>>>> /home/sophie/Code/petsc/src/mat/interface/matrix.c
>>>>>> [0]PETSC ERROR: #2 PCFieldSplitSetDefaults() line 504 in 
>>>>>> /home/sophie/Code/petsc/src/ksp/pc/impls/fieldsplit/fieldsplit.c
>>>>>> [0]PETSC ERROR: #3 PCSetUp_FieldSplit() line 606 in 
>>>>>> /home/sophie/Code/petsc/src/ksp/pc/impls/fieldsplit/fieldsplit.c
>>>>>> [0]PETSC ERROR: #4 PCSetUp() line 1009 in 
>>>>>> /home/sophie/Code/petsc/src/ksp/pc/interface/precon.c
>>>>>> [0]PETSC ERROR: #5 KSPSetUp() line 406 in 
>>>>>> /home/sophie/Code/petsc/src/ksp/ksp/interface/itfunc.c
>>>>>> [0]PETSC ERROR: #6 KSPSolve_Private() line 658 in 
>>>>>> /home/sophie/Code/petsc/src/ksp/ksp/interface/itfunc.c
>>>>>> [0]PETSC ERROR: #7 KSPSolve() line 889 in 
>>>>>> /home/sophie/Code/petsc/src/ksp/ksp/interface/itfunc.c
>>>>>> [0]PETSC ERROR: #8 SNESSolve_NEWTONLS() line 225 in 
>>>>>> /home/sophie/Code/petsc/src/snes/impls/ls/ls.c
>>>>>> [0]PETSC ERROR: #9 SNESSolve() line 4524 in 
>>>>>> /home/sophie/Code/petsc/src/snes/interface/snes.c
>>>>>> [0]PETSC ERROR: #10 TSStep_ARKIMEX() line 811 in 
>>>>>> /home/sophie/Code/petsc/src/ts/impls/arkimex/arkimex.c
>>>>>> [0]PETSC ERROR: #11 TSStep() line 3731 in 
>>>>>> /home/sophie/Code/petsc/src/ts/interface/ts.c
>>>>>> [0]PETSC ERROR: #12 TSSolve() line 4128 in 
>>>>>> /home/sophie/Code/petsc/src/ts/interface/ts.c
>>>>>> PetscSolver::solve: TSSolve failed.
>>>>>> 
>>>>>> Cheers,
>>>>>> 
>>>>>> Sophie
>>>>>> De : Barry Smith <[email protected] <mailto:[email protected]>>
>>>>>> Envoyé : lundi 31 août 2020 14:50
>>>>>> À : Blondel, Sophie <[email protected] <mailto:[email protected]>>
>>>>>> Cc : [email protected] <mailto:[email protected]> 
>>>>>> <[email protected] <mailto:[email protected]>>; 
>>>>>> [email protected] 
>>>>>> <mailto:[email protected]> 
>>>>>> <[email protected] 
>>>>>> <mailto:[email protected]>>
>>>>>> Objet : Re: [petsc-users] Matrix Free Method questions
>>>>>>  
>>>>>> 
>>>>>>  Sophie,
>>>>>> 
>>>>>>    Thanks. 
>>>>>> 
>>>>>>    The factor of 4 is lot, the 1.5 not so bad.
>>>>>> 
>>>>>>    You will definitely want to retain the full matrix assembly codes for 
>>>>>> speed and to verify a reduced matrix version.
>>>>>> 
>>>>>>    It is worth trying a "reduced matrix version" with matrix-free 
>>>>>> multiply based on these numbers. This reduced matrix Jacobian will only 
>>>>>> have the diagonals and all the terms connected to the cluster sizes that 
>>>>>> move. In other words you will be building just the part of the Jacobian 
>>>>>> needed for the new preconditioner (PC subtype for Jacobi) and doing the 
>>>>>> matrix-vector product matrix free. (SOR requires all the Jacobian 
>>>>>> entries).
>>>>>> 
>>>>>>    Fortunately this is hopefully pretty straightforward for this code. 
>>>>>> You will not have to change the structure of the main code at all.
>>>>>> 
>>>>>>   Step 1) create a new "sparse matrix" that will be passed to 
>>>>>> DMDASetBlockFillsSparse(). This new "sparse matrix" needs to retain all 
>>>>>> the diagonal entries and also all the entries that are associated with 
>>>>>> the variables that diffuse. If I remember correctly these are just the 
>>>>>> smallest cluster size, plain Helium?
>>>>>> 
>>>>>>   Call MatSetOptions(mat,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE); 
>>>>>> 
>>>>>> Then you would run the code with -snes_mf_operator and the new PC 
>>>>>> subtype for Jacobi.
>>>>>> 
>>>>>>   A test that the new reduced Jacobian is correct will be that you get 
>>>>>> almost the same iterations as the runs you just make using the PC 
>>>>>> subtype of Jacobi. Hopefully not slower and using a great deal less 
>>>>>> memory. The iterations will not be identical because of the matrix-free 
>>>>>> multiple.
>>>>>> 
>>>>>>  Step 2) create a new version of the Jacobian computation routine. This 
>>>>>> routine should only compute the elements of the Jacobian needed for this 
>>>>>> reduced matrix Jacobian, so the diagonals and the diffusion/convection 
>>>>>> terms. 
>>>>>> 
>>>>>>    Again run with with -snes_mf_operator and the new PC subtype for 
>>>>>> Jacobi and you should again get the same convergence history.
>>>>>> 
>>>>>>    I made two steps because it makes it easier to validate and debug to 
>>>>>> get the same results as before. The first step cheats in that it still 
>>>>>> computes the full Jacobian but ignores the entries that we don't need to 
>>>>>> store for the preconditioner. The second step is more efficient because 
>>>>>> it only computes the Jacobian entries needed for the preconditioner but 
>>>>>> it requires you going through the Jacobian code and making sure only the 
>>>>>> needed parts are computed.
>>>>>> 
>>>>>>   
>>>>>>   If you have any questions please let me know. 
>>>>>> 
>>>>>>   Barry
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Aug 31, 2020, at 1:13 PM, Blondel, Sophie <[email protected] 
>>>>>>> <mailto:[email protected]>> wrote:
>>>>>>> 
>>>>>>> Hi Barry,
>>>>>>> 
>>>>>>> I ran the 2 cases to look at the effect of the Jacobi pre-conditionner:
>>>>>>> 1D with 200 grid points and 7759 DOF per grid point (for the PSI 
>>>>>>> application), for 20 TS: the factor between SOR and Jacobi is ~4 (976 
>>>>>>> MatMult for SOR and 4162 MatMult for Jacobi)
>>>>>>> 2D with 63x63 grid points and 4124 DOF per grid point (for the NE 
>>>>>>> application), for 20 TS: the factor is 1.5 (6657 for SOR, 10379 for 
>>>>>>> Jacobi)
>>>>>>> Cheers,
>>>>>>> 
>>>>>>> Sophie
>>>>>>> De : Barry Smith <[email protected] <mailto:[email protected]>>
>>>>>>> Envoyé : vendredi 28 août 2020 18:31
>>>>>>> À : Blondel, Sophie <[email protected] <mailto:[email protected]>>
>>>>>>> Cc : [email protected] <mailto:[email protected]> 
>>>>>>> <[email protected] <mailto:[email protected]>>; 
>>>>>>> [email protected] 
>>>>>>> <mailto:[email protected]> 
>>>>>>> <[email protected] 
>>>>>>> <mailto:[email protected]>>
>>>>>>> Objet : Re: [petsc-users] Matrix Free Method questions
>>>>>>>  
>>>>>>> 
>>>>>>> 
>>>>>>>> On Aug 28, 2020, at 4:11 PM, Blondel, Sophie <[email protected] 
>>>>>>>> <mailto:[email protected]>> wrote:
>>>>>>>> 
>>>>>>>> Thank you Jed and Barry,
>>>>>>>> 
>>>>>>>> First, attached are the logs from the benchmark runs I did without 
>>>>>>>> (log_std.txt) and with MF method (log_mf.txt). It took me some trouble 
>>>>>>>> to get the -log_view to work because I'm using push and pop for the 
>>>>>>>> options which means that PETSc is initialized with no argument so the 
>>>>>>>> command line argument was not taken into account, but I guess this is 
>>>>>>>> for a separate discussion.
>>>>>>>> 
>>>>>>>> To answer questions about the current per-conditioners:
>>>>>>>> I used the same pre-conditioner options as listed in my previous email 
>>>>>>>> when I added the -snes_mf option; I did try to remove all the PC 
>>>>>>>> related options at one point with the MF method but didn't see a 
>>>>>>>> change in runtime so I put them back in
>>>>>>>> this benchmark is for a 1D DMDA using 20 grid points; when running in 
>>>>>>>> 2D or 3D I switch the PC options to: -pc_type fieldsplit 
>>>>>>>> -fieldsplit_0_pc_type sor -fieldsplit_1_pc_type gamg 
>>>>>>>> -fieldsplit_1_ksp_type gmres -ksp_type fgmres 
>>>>>>>> -fieldsplit_1_pc_gamg_threshold -1
>>>>>>>> I haven't tried a Jacobi PC instead of SOR, I will run a set of more 
>>>>>>>> realistic runs (1D and 2D) without MF but with Jacobi and report on it 
>>>>>>>> next week. When you say "iterations" do you mean what is given by 
>>>>>>>> -ksp_monitor?
>>>>>>> 
>>>>>>>   Yes, the number of MatMult is a good enough surrogate.
>>>>>>> 
>>>>>>>   So using matrix-free (which means no preconditioning) has 
>>>>>>> 
>>>>>>>   35846/160
>>>>>>> 
>>>>>>> ans =
>>>>>>> 
>>>>>>>   224.0375
>>>>>>> 
>>>>>>>   or 224 as many iterations. So even for this modest 1d problem 
>>>>>>> preconditioning is doing a great deal.
>>>>>>> 
>>>>>>>   Barry
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> Cheers,
>>>>>>>> 
>>>>>>>> Sophie
>>>>>>>> De : Barry Smith <[email protected] <mailto:[email protected]>>
>>>>>>>> Envoyé : vendredi 28 août 2020 12:12
>>>>>>>> À : Blondel, Sophie <[email protected] <mailto:[email protected]>>
>>>>>>>> Cc : [email protected] <mailto:[email protected]> 
>>>>>>>> <[email protected] <mailto:[email protected]>>; 
>>>>>>>> [email protected] 
>>>>>>>> <mailto:[email protected]> 
>>>>>>>> <[email protected] 
>>>>>>>> <mailto:[email protected]>>
>>>>>>>> Objet : Re: [petsc-users] Matrix Free Method questions
>>>>>>>>  
>>>>>>>> [External Email]
>>>>>>>> 
>>>>>>>>   Sophie,
>>>>>>>> 
>>>>>>>>    This is exactly what i would expect. If you run with -ksp_monitor 
>>>>>>>> you will see the -snes_mf run takes many more iterations.
>>>>>>>> 
>>>>>>>>    I am puzzled that the argument -pc_type fieldsplit did not stop the 
>>>>>>>> run since this is under normal circumstances not a viable 
>>>>>>>> preconditioner with -snes_mf. Did you also remove the -pc_type 
>>>>>>>> fieldsplit argument?
>>>>>>>> 
>>>>>>>>    In order to see how one can avoid forming the entire matrix and use 
>>>>>>>> matrix-free to do the matrix-vector but still have an effective 
>>>>>>>> preconditioner let's look at what the current preconditioner options 
>>>>>>>> do.
>>>>>>>> 
>>>>>>>>>  -pc_fieldsplit_detect_coupling 
>>>>>>>> 
>>>>>>>> creates two sub-preconditioners, the first for all the variables and 
>>>>>>>> the second for those that are coupled by the matrix to variables in 
>>>>>>>> neighboring cells Since only the smallest cluster sizes have 
>>>>>>>> diffusion/advection this second set contains only the cluster size one 
>>>>>>>> variables.
>>>>>>>> 
>>>>>>>>> -fieldsplit_0_pc_type sor 
>>>>>>>> 
>>>>>>>> Runs SOR on all the variables; you can think of this as running SOR on 
>>>>>>>> the reactions, it is a pretty good preconditioner for the reactions 
>>>>>>>> since the reactions are local, per cell.
>>>>>>>> 
>>>>>>>>>  -fieldsplit_1_pc_type redundant
>>>>>>>> 
>>>>>>>>   
>>>>>>>> This runs the default preconditioner (ILU) on just the variables that 
>>>>>>>> diffuse, i.e. the elliptic part. For smallish problems this is fine, 
>>>>>>>> for larger problems and 2d and 3d presumably you have also 
>>>>>>>> -redundant_pc_type gamg to use algebraic multigrid for the diffusion.  
>>>>>>>> This part of the matrix will always need to be formed and used in the 
>>>>>>>> preconditioner. It  is very important since the diffusion is what 
>>>>>>>> brings in most of the ill-conditioning for larger problems into the 
>>>>>>>> linear system. Note that it only needs the matrix entries for the 
>>>>>>>> cluster size of 1 so it is very small compared to the entire sparse 
>>>>>>>> matrix.
>>>>>>>> 
>>>>>>>> ----
>>>>>>>>  The first preconditioner SOR requires ALL the matrix entries which 
>>>>>>>> are almost all (except for the diffusion terms) the coupling between 
>>>>>>>> different size clusters within a cell. Especially each cell has its 
>>>>>>>> own sparse matrix of the size of total number of clusters, it is 
>>>>>>>> sparse but not super sparse.
>>>>>>>> 
>>>>>>>>  So the to significantly lower memory usage we need to remove the SOR 
>>>>>>>> and the storing of all the matrix entries but still have an efficient 
>>>>>>>> preconditioner for the "reaction" terms. 
>>>>>>>> 
>>>>>>>>  The simplest thing would be to use Jacobi instead of SOR for the 
>>>>>>>> first subpreconditioner since it only requires the diagonal entries in 
>>>>>>>> the matrix. But Jacobi is a worse preconditioner than SOR (since it 
>>>>>>>> totally ignores the matrix coupling) and sometimes can be much worse.
>>>>>>>> 
>>>>>>>>   Before anyone writes additional code we need to know if doing 
>>>>>>>> something along these lines does not ruin the convergence that.
>>>>>>>> 
>>>>>>>>  Have you used the same options as before but with  
>>>>>>>> -fieldsplit_0_pc_type jacobi ? (Not using any matrix free). We need to 
>>>>>>>> get an idea of how many more linear iterations it requires (not time, 
>>>>>>>> comparing time won't be helpful for this exercise.) We also need this 
>>>>>>>> information for realistic size problems in 2 or 3 dimensions that you 
>>>>>>>> really want to run; for small problems this approach will work ok and 
>>>>>>>> give misleading information about what happens for large problems.
>>>>>>>> 
>>>>>>>>   I suspect the iteration counts will shot up. Can you run some cases 
>>>>>>>> and see how the iteration counts change?
>>>>>>>> 
>>>>>>>>   Based on that we can decide if we still retain "good convergence" by 
>>>>>>>> changing the SOR to Jacobi and then change the code to make this 
>>>>>>>> change efficient (basically by skipping the explicit computation of 
>>>>>>>> the reaction Jacobian terms and using matrix-free on the outside of 
>>>>>>>> the PCFIELDSPLIT.)
>>>>>>>> 
>>>>>>>>   Barry
>>>>>>>> 
>>>>>>>> 
>>>>>>>>   
>>>>>>>> 
>>>>>>>>   
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On Aug 28, 2020, at 9:49 AM, Blondel, Sophie via petsc-users 
>>>>>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>>>>>> 
>>>>>>>>> Hi everyone,
>>>>>>>>> 
>>>>>>>>> I have been using PETSc for a few years with a fully implicit TS 
>>>>>>>>> ARKIMEX method and am now exploring the matrix free method option. 
>>>>>>>>> Here is the list of PETSc options I typically use: -ts_dt 1.0e-12 
>>>>>>>>> -ts_adapt_time_step_increase_delay 5 -snes_force_iteration 
>>>>>>>>> -ts_max_time 1000.0 -ts_adapt_dt_max 2.0e-3 -ts_adapt_wnormtype 
>>>>>>>>> INFINITY -ts_exact_final_time stepover -fieldsplit_0_pc_type sor 
>>>>>>>>> -ts_max_snes_failures -1 -pc_fieldsplit_detect_coupling -ts_monitor 
>>>>>>>>> -pc_type fieldsplit -fieldsplit_1_pc_type redundant -ts_max_steps 100
>>>>>>>>> 
>>>>>>>>> I started to compare the performance of the code without changing 
>>>>>>>>> anything of the executable and simply adding "-snes_mf", I see a 
>>>>>>>>> reduction of memory usage as expected and a benchmark that would 
>>>>>>>>> usually take ~5min to run now takes ~50min. Reading the documentation 
>>>>>>>>> I saw that there are a few option to play with the matrix free method 
>>>>>>>>> like -snes_mf_err, -snes_mf_umin, or switching to -snes_mf_type wp. I 
>>>>>>>>> used and modified the values of each of these options separately but 
>>>>>>>>> never saw a sizable change in runtime, is it expected?
>>>>>>>>> 
>>>>>>>>> And are there other ways to make the matrix free method faster? I saw 
>>>>>>>>> in the documentation that you can define your own per-conditioner for 
>>>>>>>>> instance. Let me know if you need additional information about the 
>>>>>>>>> PETSc setup in the application I use.
>>>>>>>>> 
>>>>>>>>> Best,
>>>>>>>>> 
>>>>>>>>> Sophie
>>>>>>>> 
>>>>>>>> <log_mf.txt><log_std.txt>
>>>> 
>>>> <log_1D_1.txt><log_1D_2.txt><log_1D_3.txt><log_1D_4.txt>
>> 
>> <log_1D_3_bis.txt>
> 
> <log_1D_1.txt><log_1D_2.txt><log_1D_3.txt><log_1D_4.txt>

Reply via email to