Skip to main content
`Ctrl`+`K`

# KSPSetDiagonalScale

Tells `KSP` to symmetrically diagonally scale the system before solving. This actually CHANGES the matrix (and right-hand side).

## Synopsis

    #include "petscksp.h"
    #include "petscmat.h"
    PetscErrorCode KSPSetDiagonalScale(KSP ksp, PetscBool scale)

Logically Collective

## Input Parameters

- ksp - the `KSP` context

- scale - `PETSC_TRUE` or `PETSC_FALSE`

## Options Database Keys

- -ksp_diagonal_scale - perform a diagonal scaling before the solve

- -ksp_diagonal_scale_fix - scale the matrix back AFTER the solve

## Notes

Scales the matrix by \(D^{-1/2} A D^{-1/2} [D^{1/2} x ] = D^{-1/2} b \) where \(D_{ii}\) is \(1/abs(A_{ii}) \) unless \(A_{ii}\) is zero and then it is 1.

BE CAREFUL with this routine: it actually scales the matrix and right hand side that define the system. After the system is solved the matrix and right-hand side remain scaled unless you use `KSPSetDiagonalScaleFix()`

This should NOT be used within the `SNES` solves if you are using a line search.

If you use this with the `PCType` `PCEISENSTAT` preconditioner than you can use the `PCEisenstatSetNoDiagonalScaling()` option, or `-pc_eisenstat_no_diagonal_scaling` to save some unneeded, redundant flops.

## See Also

KSP: Linear System Solvers, `KSPGetDiagonalScale()`, `KSPSetDiagonalScaleFix()`, `KSP`

## Level

advanced

## Location

src/ksp/ksp/interface/itfunc.c

Index of all KSP routines
Table of Contents for all manual pages
Index of all manual pages