> On Sep 24, 2020, at 3:08 PM, Matthew Knepley <[email protected]> wrote:
>
> On Thu, Sep 24, 2020 at 4:03 PM Blondel, Sophie via petsc-users
> <[email protected] <mailto:[email protected]>> wrote:
> Hi Barry,
>
> I probably should have sent this output before (with -log_view_memory to get
> an idea of where the vectors are created). I looked at it but it doesn't help
> me much...
>
> Just quickie, there is 82M in 85 vectors, but your system has 1.5M unknowns,
> so a single vector is about 12M. Thus, there are probably 5 or 6 systems
> vectors, and a bunch of small ones.
Matt is right, maybe the vectors are as expected.
But there is something totally off about the memory used for the matrix.
type: mpiaij
rows=1552000, cols=1552000, bs=7760
total: nonzeros=1558766, allocated nonzeros=1558766
lower bound should be 12*1558766 = 18,705,192 but it prints
Matrix 15 15 8744032 0.
Not sure why it is not logging correctly.
Anyways probably not important.
>
> Thanks,
>
> Matt
>
> Cheers,
>
> Sophie
> From: Barry Smith <[email protected] <mailto:[email protected]>>
> Sent: Wednesday, September 16, 2020 16:38
> 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
>
>
> Yikes, GAMG is using a lot of vectors. But many of these are much smaller
> vectors so not of major concern.
>
> I think this will just have to be an ongoing issue to see where the
> vectors are created internally and reuse or eliminate as many extra as
> possible.
>
> The option -log_view_memory causes the PETSc logging summary to print
> additional columns showing the memory allocated during the different events
> in PETSc. This can be useful to see "when" the memory is mostly created; it
> does not tell us "why" it is created but at least tells us were to look.
>
> Barry
>
>
>> On Sep 16, 2020, at 1:54 PM, Blondel, Sophie <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Hi Barry,
>>
>> I don't think we're explicitly creating many PETSc vectors in Xolotl. There
>> is a global one created for the solution when the TS is set up, and local
>> ones in RHSFunction and RHSJacobian; everywhere else we just get the array
>> from it with DMDAVecGetArrayDOF and DMDAVecRestoreArrayDOF. I tried a few
>> things to see if it changed the number of Vec from 85 (removing monitors,
>> fewer time steps, fewer MPI tasks) but it stayed the same, except when I
>> changed the PC option from "-fieldsplit_1_pc_type redundant" to
>> "-fieldsplit_1_pc_type gamg -fieldsplit_1_ksp_type gmres -ksp_type fgmres
>> -fieldsplit_1_pc_gamg_threshold -1" where I got 10567 vectors.
>>
>> Cheers,
>>
>> Sophie
>> From: Barry Smith <[email protected] <mailto:[email protected]>>
>> Sent: Tuesday, September 15, 2020 18:37
>> 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,
>>
>> 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]
>>> <mailto:[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] <mailto:[email protected]>>
>>> Sent: Friday, September 11, 2020 18:03
>>> 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 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>
>
>
>
> --
> 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/>