PetscErrorCode SNESSetUp_VINEWTONRSLS(SNES snes) { PetscErrorCode ierr; SNES_VINEWTONRSLS *vi = (SNES_VINEWTONRSLS*) snes->data; PetscInt *indices; PetscInt i,n,rstart,rend; SNESLineSearch linesearch; PetscFunctionBegin; ierr = SNESSetUp_VI(snes);CHKERRQ(ierr); /* Set up previous active index set for the first snes solve vi->IS_inact_prev = 0,1,2,....N */ ierr = VecGetOwnershipRange(snes->vec_sol,&rstart,&rend);CHKERRQ(ierr); ierr = VecGetLocalSize(snes->vec_sol,&n);CHKERRQ(ierr); ierr = PetscMalloc(n*sizeof(PetscInt),&indices);CHKERRQ(ierr); for (i=0;i < n; i++) indices[i] = rstart + i; ierr = ISCreateGeneral(((PetscObject)snes)->comm,n,indices,PETSC_OWN_POINTER,&vi->IS_inact_prev);CHKERRQ(ierr); /* set the line search functions */ if (!snes->linesearch) { ierr = SNESGetSNESLineSearch(snes, &linesearch);CHKERRQ(ierr); ierr = SNESLineSearchSetType(linesearch, SNESLINESEARCHBT);CHKERRQ(ierr); } PetscFunctionReturn(0); }
/* SNESSetUp_VINEWTONSSLS - Sets up the internal data structures for the later use of the SNES nonlinear solver. Input Parameter: . snes - the SNES context Application Interface Routine: SNESSetUp() Notes: For basic use of the SNES solvers, the user need not explicitly call SNESSetUp(), since these actions will automatically occur during the call to SNESSolve(). */ PetscErrorCode SNESSetUp_VINEWTONSSLS(SNES snes) { PetscErrorCode ierr; SNES_VINEWTONSSLS *vi = (SNES_VINEWTONSSLS*) snes->data; PetscFunctionBegin; ierr = SNESSetUp_VI(snes);CHKERRQ(ierr); ierr = VecDuplicate(snes->vec_sol, &vi->dpsi);CHKERRQ(ierr); ierr = VecDuplicate(snes->vec_sol, &vi->phi);CHKERRQ(ierr); ierr = VecDuplicate(snes->vec_sol, &vi->Da);CHKERRQ(ierr); ierr = VecDuplicate(snes->vec_sol, &vi->Db);CHKERRQ(ierr); ierr = VecDuplicate(snes->vec_sol, &vi->z);CHKERRQ(ierr); ierr = VecDuplicate(snes->vec_sol, &vi->t);CHKERRQ(ierr); PetscFunctionReturn(0); }