1a4963045SJacob Faibussowitsch #pragma once 219653cdaSPeter Brune 3af0996ceSBarry Smith #include <petsc/private/snesimpl.h> 419653cdaSPeter Brune 519653cdaSPeter Brune /* Data structure for the Nonlinear GMRES method. */ 619653cdaSPeter Brune typedef struct { 798b3e84cSPeter Brune /* Solver parameters and counters */ 898b3e84cSPeter Brune PetscInt msize; /* maximum size of krylov space */ 928ed4a04SPeter Brune PetscInt restart_it; /* number of iterations the restart conditions persist before restart */ 10dfbf837cSBarry Smith PetscViewer monitor; /* debugging output for NGMRES */ 1113a62661SPeter Brune PetscInt restart_periodic; /* number of iterations to restart after */ 1213a62661SPeter Brune 1313a62661SPeter Brune SNESNGMRESRestartType restart_type; 1413a62661SPeter Brune SNESNGMRESSelectType select_type; 1528ed4a04SPeter Brune 1698b3e84cSPeter Brune /* History and subspace data */ 17f109b39eSPeter Brune Vec *Fdot; /* residual history -- length msize */ 18f109b39eSPeter Brune Vec *Xdot; /* solution history -- length msize */ 19f109b39eSPeter Brune PetscReal *fnorms; /* the residual norm history */ 2018aa0c0cSPeter Brune PetscReal *xnorms; /* the solution norm history */ 2119653cdaSPeter Brune 2298b3e84cSPeter Brune /* General minimization problem context */ 2398b3e84cSPeter Brune PetscScalar *h; /* the constraint matrix */ 2498b3e84cSPeter Brune PetscScalar *beta; /* rhs for the minimization problem */ 2598b3e84cSPeter Brune PetscScalar *xi; /* the dot-product of the current and previous res. */ 2619653cdaSPeter Brune 27e7058c64SPeter Brune /* Line searches */ 28f1c6b773SPeter Brune SNESLineSearch additive_linesearch; /* Line search for the additive variant */ 294936d809SStefano Zampini PetscReal descent_ls_test; /* restart GMRES when X_A -X_M is not a descent direction */ 30e7058c64SPeter Brune 3198b3e84cSPeter Brune /* Selection constants */ 3238774f0aSPeter Brune PetscBool candidate; /* use candidate storage approach */ 33077c4231SPeter Brune PetscBool approxfunc; /* approximate the function rather than recomputing it */ 3498b3e84cSPeter Brune PetscReal gammaA; /* Criterion A residual tolerance */ 3598b3e84cSPeter Brune PetscReal epsilonB; /* Criterion B difference tolerance */ 3698b3e84cSPeter Brune PetscReal deltaB; /* Criterion B residual tolerance */ 3798b3e84cSPeter Brune PetscReal gammaC; /* Restart residual tolerance */ 3823b3e82cSAsbjørn Nilsen Riseth PetscBool restart_fm_rise; /* Restart on F_M residual increase */ 3919653cdaSPeter Brune 40f31c9d25SPeter Brune PetscReal andersonBeta; /* Relaxation parameter for Anderson Mixing */ 41f31c9d25SPeter Brune 42e7058c64SPeter Brune /* Least squares minimization solve context */ 4398b3e84cSPeter Brune PetscScalar *q; /* the matrix formed as q_ij = (rdot_i, rdot_j) */ 4498b3e84cSPeter Brune PetscBLASInt m; /* matrix dimension */ 4598b3e84cSPeter Brune PetscBLASInt n; /* matrix dimension */ 46*dd8e379bSPierre Jolivet PetscBLASInt nrhs; /* the number of right-hand sides */ 4798b3e84cSPeter Brune PetscBLASInt lda; /* the padded matrix dimension */ 4898b3e84cSPeter Brune PetscBLASInt ldb; /* the padded vector dimension */ 4998b3e84cSPeter Brune PetscReal *s; /* the singular values */ 5098b3e84cSPeter Brune PetscReal rcond; /* the exit condition */ 5198b3e84cSPeter Brune PetscBLASInt rank; /* the effective rank */ 5298b3e84cSPeter Brune PetscScalar *work; /* the work vector */ 5398b3e84cSPeter Brune PetscReal *rwork; /* the real work vector used for complex */ 5498b3e84cSPeter Brune PetscBLASInt lwork; /* the size of the work vector */ 5598b3e84cSPeter Brune PetscBLASInt info; /* the output condition */ 5619653cdaSPeter Brune 5778440776SJed Brown PetscBool setup_called; /* indicates whether SNESSetUp_NGMRES() has been called */ 5819653cdaSPeter Brune } SNES_NGMRES; 5919653cdaSPeter Brune 6019653cdaSPeter Brune #define H(i, j) ngmres->h[i * ngmres->msize + j] 6119653cdaSPeter Brune #define Q(i, j) ngmres->q[i * ngmres->msize + j] 6219653cdaSPeter Brune 6338774f0aSPeter Brune /* private functions that are shared components of the methods */ 64b30237c6SBarry Smith PETSC_INTERN PetscErrorCode SNESNGMRESUpdateSubspace_Private(SNES, PetscInt, PetscInt, Vec, PetscReal, Vec); 65b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESFormCombinedSolution_Private(SNES, PetscInt, PetscInt, Vec, Vec, PetscReal, Vec, Vec, Vec); 66b3c6a99cSPeter Brune PETSC_INTERN PetscErrorCode SNESNGMRESNorms_Private(SNES, PetscInt, Vec, Vec, Vec, Vec, Vec, Vec, Vec, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscReal *); 674936d809SStefano Zampini PETSC_INTERN PetscErrorCode SNESNGMRESSelect_Private(SNES, PetscInt, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscReal, Vec, Vec, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, Vec, Vec, Vec, PetscReal *, PetscReal *, PetscReal *); 684936d809SStefano Zampini PETSC_INTERN PetscErrorCode SNESNGMRESSelectRestart_Private(SNES, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal, PetscBool *); 6938774f0aSPeter Brune 704936d809SStefano Zampini PETSC_INTERN PetscErrorCode SNESNGMRESGetAdditiveLineSearch_Private(SNES, SNESLineSearch *); 7125acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESDestroy_NGMRES(SNES); 7225acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESReset_NGMRES(SNES); 7325acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESSetUp_NGMRES(SNES); 7425acbd8eSLisandro Dalcin PETSC_INTERN PetscErrorCode SNESView_NGMRES(SNES, PetscViewer); 75