Dear PETSc developers, I have a nice algorithm for solving a variational inequality that arises in fracture mechanics --- first do some iterations of nonlinear Gauss-Seidel-Newton with the nonlinear fieldsplit I've implemented to acquire a good initial guess, and then switch to VINEWTONRSLS for its quadratic convergence.
I've implemented this via a multiplicative SNESCOMPOSITE with my SNES first and a VINEWTONRSLS SNES second. This converges very nicely, but there's a problem --- the outer SNESCOMPOSITE doesn't know that its problem is a VI, and hence it doesn't compute the problem residual norm correctly. I have two fixes for this, a quick one and a more complicated one. First, since the problem has actually converged and the inner solves don't make any further changes, I can set the -snes_stol on the SNESCOMPOSITE and have it converge that way. At the moment SNESCOMPOSITE doesn't support step norms, but I have made a patch to fix this: https://bitbucket.org/petsc/petsc/pull-request/302/make-snescomposite-support-stol/diff Second, the SNESCOMPOSITE residual norm calculation should do the right thing and understand that it's solving a VI. One way would make the following changes: - snes->xl and snes->xu already exist in the SNES data structure. - Modify SNESVISetVariableBounds to not set the SNESType to SNESVINEWTONRSLS; I want to set the bounds on the SNESCOMPOSITE without having everything lost on the composite structure. I don't think the user interface should be coupled this way anyway; if the user wants a SNESVINEWTONRSLS the user should call SNESSetType themselves. - If the bounds are set on the SNESCOMPOSITE, have it use SNESVIComputeInactiveSetFnorm to compute the residual norm. What do you think? If you think this is the right approach I'm happy to implement it. Patrick
