[petsc-users] Convergence rate for spatially varying Helmholtz system

Barry Smith bsmith at petsc.dev
Thu Sep 30 17:34:50 CDT 2021



> On Sep 30, 2021, at 6:16 PM, Amneet Bhalla <mail2amneet at gmail.com> wrote:
> 
>  
> >> If you want to solve systems accurately, you should non-dimensionalize the system prior to discretization. This would mean that
> your C and b have elements in the [1, D] range, where D is the dynamic range of your problem, say 1e4, rather than these huge
> numbers you have now.
> 
> @Matt: We have done non-dimensionalization and the diagonal matrix ranges from 1 to 1e4 now. Still it takes 4-5 iterations to converge for the non-dimensional diagonal matrix. The convergence trend is looking much better now, though:
> 
> Residual norms for temperature_ solve.
>   0 KSP preconditioned resid norm 4.724547545716e-04 true resid norm 2.529423250889e+00 ||r(i)||/||b|| 4.397759655853e-05
>   1 KSP preconditioned resid norm 6.504853596318e-06 true resid norm 2.197130494439e-02 ||r(i)||/||b|| 3.820021755431e-07
>   2 KSP preconditioned resid norm 7.733420341215e-08 true resid norm 3.539290481432e-04 ||r(i)||/||b|| 6.153556501117e-09
>   3 KSP preconditioned resid norm 6.419092250844e-10 true resid norm 5.220398494466e-06 ||r(i)||/||b|| 9.076400273607e-11
>   4 KSP preconditioned resid norm 5.095955157158e-12 true resid norm 2.484163999489e-08 ||r(i)||/||b|| 4.319070053474e-13
>   5 KSP preconditioned resid norm 6.828200916501e-14 true resid norm 2.499229854610e-10 ||r(i)||/||b|| 4.345264170970e-15
> Linear temperature_ solve converged due to CONVERGED_RTOL iterations 5
> 
> 
> Only when all the equations are scaled individually the convergence is achieved in a single iteration. In the above, all equations are scaled using the same non-dimensional parameter. Do you think this is reasonable or do you expect the diagonal system to converge in a single iteration irrespective of the range of diagonal entries? 

   For a diagonal system with this modest range of values Jacobi should converge in a single iteration. 

   The output below is confusing, it is a system with 1 variable and should definitely converge in one iterations. 

   I am concerned we may be talking apples and oranges here and your test may not be as simple as you think it is (with regard to the diagonal).

> 
> @Barry: 
>> 
> 
>    What is the result of -ksp_view on the solve? 
> 
> KSP Object: (temperature_) 1 MPI processes
>   type: gmres
>     restart=30, using Classical (unmodified) Gram-Schmidt Orthogonalization with one step of iterative refinement when needed
>     happy breakdown tolerance 1e-30
>   maximum iterations=1000, nonzero initial guess
>   tolerances:  relative=1e-12, absolute=1e-50, divergence=10000.
>   left preconditioning
>   using PRECONDITIONED norm type for convergence test
> PC Object: (temperature_) 1 MPI processes
>   type: shell
>     IEPSemiImplicitHierarchyIntegrator::helmholtz_precond::Temperature
>   linear system matrix = precond matrix:
>   Mat Object: 1 MPI processes
>     type: shell
>     rows=1, cols=1 
>  
> 
>    The way you describe your implementation it does not sound like standard PETSc practice. 
> 
> Yes, we do it differently in IBAMR. Succinctly, the main solver is a matrix-free one, whereas the preconditioner is a FAC multigrid solver with its bottom solver formed on the coarsest level of AMR grid using PETSc (matrix-based KSP).  
> 
> In the above -ksp_view temperature_ is the matrix-free KSP solver and IEPSemiImplicitHierarchyIntegrator::helmholtz_precond is the FAC preconditioner.
> 
> With PETSc using a matrix-free operation mA and a matrix from which KSP will build the preconditioner  A one uses  KSPSetOperator(ksp,mA,A); and then just selects the preconditioner with -pc_type xxx  For example to use Jacobi preconditioning one uses -pc_type jacobi (note that this only uses the diagonal of A, the rest of A is never used).
> 
> We run -pc_type jacobi on the bottom solver of the FAC preconditioner.  
> 
> If you wish to precondition mA by fully solving with the matrix A one can use -ksp_monitor_true_residual -pc_type ksp -ksp_ksp_type yyy -ksp_pc_type xxx  -ksp_ksp_monitor_true_residual with, for example, yyy of richardson and xxx of jacobi
> 
> Yes, this is what we do.  
> 
>   Barry
> 
> 
> 
> 
>> To verify that I am indeed solving a diagonal system I printed the PETSc matrix from the preconditioner and viewed it in Matlab. It indeed shows it to be a diagonal system. Attached is the plot of the spy command on the printed matrix. The matrix in binary form is also attached. 
>> 
>> My understanding is that because the C coefficient is varying in 4 orders of magnitude, i.e., Max(C)/Min(C) ~ 10^4, the matrix is poorly scaled. When I rescale my matrix by 1/C then the system converges in 1 iteration as expected. Is my understanding correct, and that scaling 1/C should be done even for a diagonal system?
>> 
>> When D is non-zero, then scaling by 1/C seems to be very inconvenient as D is stored as side-centered data for the matrix free solver. 
>> 
>> In the case that I do not scale my equations by 1/C, is there some solver setting that improves the convergence rate? (With D as non-zero, I have also tried gmres as the ksp solver in the matrix-based preconditioner to get better performance, but it didn't matter much.)
>> 
>> 
>> Thanks,
>> Ramakrishnan Thirumalaisamy
>> San Diego State University.
>> <Temperature_fill.pdf><matrix_temperature>
> 
> 
> 
> -- 
> --Amneet 
> 
> 
> 

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


More information about the petsc-users mailing list