Dear PETSc-Team,

I am having a bit of trouble understanding the way the Anderson mixing method is implemented inPETSc.

On the corresponding website (http://www.mcs.anl.gov/petsc/petsc-3.5/docs/manualpages/SNES/SNESAnderson.html) it says in the
"Option database" section

X_{update} = X + \beta F

which looks to me as if the new solution is calculated from the old solution plus something which depends on the old residual F.

However, in the "Notes" section it says that the new solution is found by combining "m previous solutions" which I interpret as the last m values of X.

In most other sources on Anderson mixing (e.g. the original one referd to on the website mentioned above) the update procedure looks something like

X^{k+1} = (1-\beta) \sum_{i=0}^{m} \alpha_i^k X^{k-m+1} + \beta \sum_{i=0}^m \alpha_i^k G(X^{k-m+i}) where G = F + X.

Therefore, the new value of X is calculated from the last m values of X and F.

Unfortunately, I was not able to understand and follow the actual source code in src/snes/impls/ngmres/anderson.c <http://www.mcs.anl.gov/petsc/petsc-3.5/src/snes/impls/ngmres/anderson.c.html#SNESAnderson>

Could you please tell me whether the last values of X, F or both are used in the update scheme of PETSc's Anderson mixing implementation?

And is \beta used in a "regular line search way" where X^{new} = X^{old} + \beta* "undamped update"

or as in the equation above

X^{new} = (1-\beta) \sum "function of last m X" + \beta \sum "function of last m G"

which would explain to me why beta is not set via -snes_linesearch_damping but using the extra option -snes_anderson_beta.


Thank you very much for your help!
Jonas

Reply via email to