void PetscDiffSolver::init () { START_LOG("init()", "PetscDiffSolver"); Parent::init(); int ierr=0; #if PETSC_VERSION_LESS_THAN(2,1,2) // At least until Petsc 2.1.1, the SNESCreate had a different // calling syntax. The second argument was of type SNESProblemType, // and could have a value of either SNES_NONLINEAR_EQUATIONS or // SNES_UNCONSTRAINED_MINIMIZATION. ierr = SNESCreate(libMesh::COMM_WORLD, SNES_NONLINEAR_EQUATIONS, &_snes); CHKERRABORT(libMesh::COMM_WORLD,ierr); #else ierr = SNESCreate(libMesh::COMM_WORLD,&_snes); CHKERRABORT(libMesh::COMM_WORLD,ierr); #endif #if PETSC_VERSION_LESS_THAN(2,3,3) ierr = SNESSetMonitor (_snes, __libmesh_petsc_diff_solver_monitor, this, PETSC_NULL); #else // API name change in PETSc 2.3.3 ierr = SNESMonitorSet (_snes, __libmesh_petsc_diff_solver_monitor, this, PETSC_NULL); #endif CHKERRABORT(libMesh::COMM_WORLD,ierr); ierr = SNESSetFromOptions(_snes); CHKERRABORT(libMesh::COMM_WORLD,ierr); STOP_LOG("init()", "PetscDiffSolver"); }
void PetscNonlinearSolver<T>::init () { // Initialize the data structures if not done so already. if (!this->initialized()) { this->_is_initialized = true; PetscErrorCode ierr=0; #if PETSC_VERSION_LESS_THAN(2,1,2) // At least until Petsc 2.1.1, the SNESCreate had a different calling syntax. // The second argument was of type SNESProblemType, and could have a value of // either SNES_NONLINEAR_EQUATIONS or SNES_UNCONSTRAINED_MINIMIZATION. ierr = SNESCreate(this->comm().get(), SNES_NONLINEAR_EQUATIONS, &_snes); LIBMESH_CHKERRABORT(ierr); #else ierr = SNESCreate(this->comm().get(),&_snes); LIBMESH_CHKERRABORT(ierr); #endif #if PETSC_VERSION_LESS_THAN(2,3,3) ierr = SNESSetMonitor (_snes, __libmesh_petsc_snes_monitor, this, PETSC_NULL); #else // API name change in PETSc 2.3.3 ierr = SNESMonitorSet (_snes, __libmesh_petsc_snes_monitor, this, PETSC_NULL); #endif LIBMESH_CHKERRABORT(ierr); #if PETSC_VERSION_LESS_THAN(3,1,0) // Cannot call SNESSetOptions before SNESSetFunction when using // any matrix free options with PETSc 3.1.0+ ierr = SNESSetFromOptions(_snes); LIBMESH_CHKERRABORT(ierr); #endif if(this->_preconditioner) { KSP ksp; ierr = SNESGetKSP (_snes, &ksp); LIBMESH_CHKERRABORT(ierr); PC pc; ierr = KSPGetPC(ksp,&pc); LIBMESH_CHKERRABORT(ierr); this->_preconditioner->init(); PCSetType(pc, PCSHELL); PCShellSetContext(pc,(void*)this->_preconditioner); //Re-Use the shell functions from petsc_linear_solver PCShellSetSetUp(pc,__libmesh_petsc_preconditioner_setup); PCShellSetApply(pc,__libmesh_petsc_preconditioner_apply); } } }