/*MC SNESVINEWTONSSLS - Semi-smooth solver for variational inequalities based on Newton's method Options Database: + -snes_type <vinewtonssls,vinewtonrsls> a semi-smooth solver, a reduced space active set method - -snes_vi_monitor - prints the number of active constraints at each iteration. Level: beginner References: + 1. - T. S. Munson, F. Facchinei, M. C. Ferris, A. Fischer, and C. Kanzow. The semismooth algorithm for large scale complementarity problems. INFORMS Journal on Computing, 13 (2001). - 2. - T. S. Munson, and S. Benson. Flexible Complementarity Solvers for Large Scale Applications, Optimization Methods and Software, 21 (2006). .seealso: SNESVISetVariableBounds(), SNESVISetComputeVariableBounds(), SNESCreate(), SNES, SNESSetType(), SNESVINEWTONRSLS, SNESNEWTONTR, SNESLineSearchSetType(),SNESLineSearchSetPostCheck(), SNESLineSearchSetPreCheck() M*/ PETSC_EXTERN PetscErrorCode SNESCreate_VINEWTONSSLS(SNES snes) { PetscErrorCode ierr; SNES_VINEWTONSSLS *vi; SNESLineSearch linesearch; PetscFunctionBegin; snes->ops->reset = SNESReset_VINEWTONSSLS; snes->ops->setup = SNESSetUp_VINEWTONSSLS; snes->ops->solve = SNESSolve_VINEWTONSSLS; snes->ops->destroy = SNESDestroy_VI; snes->ops->setfromoptions = SNESSetFromOptions_VINEWTONSSLS; snes->ops->view = NULL; snes->usesksp = PETSC_TRUE; snes->usesnpc = PETSC_FALSE; ierr = SNESGetLineSearch(snes, &linesearch);CHKERRQ(ierr); ierr = SNESLineSearchSetType(linesearch, SNESLINESEARCHBT);CHKERRQ(ierr); ierr = SNESLineSearchBTSetAlpha(linesearch, 0.0);CHKERRQ(ierr); snes->alwayscomputesfinalresidual = PETSC_FALSE; ierr = PetscNewLog(snes,&vi);CHKERRQ(ierr); snes->data = (void*)vi; ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESVISetVariableBounds_C",SNESVISetVariableBounds_VI);CHKERRQ(ierr); ierr = PetscObjectComposeFunction((PetscObject)snes,"SNESVISetComputeVariableBounds_C",SNESVISetComputeVariableBounds_VI);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode SNESSetFromOptions_VI(SNES snes) { PetscErrorCode ierr; PetscBool flg; SNESLineSearch linesearch; PetscFunctionBegin; ierr = PetscOptionsHead("SNES VI options");CHKERRQ(ierr); ierr = PetscOptionsBool("-snes_vi_monitor","Monitor all non-active variables","None",PETSC_FALSE,&flg,0);CHKERRQ(ierr); if (flg) { ierr = SNESMonitorSet(snes,SNESMonitorVI,0,0);CHKERRQ(ierr); } if (!snes->linesearch) { ierr = SNESGetSNESLineSearch(snes, &linesearch);CHKERRQ(ierr); ierr = SNESLineSearchSetType(linesearch, SNESLINESEARCHBT);CHKERRQ(ierr); ierr = SNESLineSearchBTSetAlpha(linesearch, 0.0);CHKERRQ(ierr); } ierr = PetscOptionsTail();CHKERRQ(ierr); PetscFunctionReturn(0); }