Actual source code: lgmresimpl.h

petsc-3.3-p5 2012-12-01
  1: /* A. Baker */
  2: /*
  3:    Private data structure used by the LGMRES method.
  4: */


  9: #include <petsc-private/kspimpl.h> /*includes petscksp.h */
 10: #define KSPGMRES_NO_MACROS
 11: #include <../src/ksp/ksp/impls/gmres/gmresimpl.h>

 13:   typedef struct {
 14:     KSPGMRESHEADER

 16:     /* LGMRES_MOD - make these for the z vectors - new storage for lgmres */
 17:     Vec         *augvecs;            /* holds the error approximation vectors for lgmres. */
 18:     Vec         **augvecs_user_work; /* same purpose as user_work above, but this one is
 19:                                          for our error approx vectors */
 20:           /* currently only augvecs_user_work[0] is used, not sure if this will be */
 21:           /* extended in the future to use more, or if this is a design bug */
 22:     PetscInt    aug_vv_allocated;      /* aug_vv_allocated is the number of allocated lgmres 
 23:                                           augmentation vectors */
 24:     PetscInt    aug_vecs_allocated;    /* aug_vecs_allocated is the total number of augmentation vecs 
 25:                                           available - used to simplify the dynamic
 26:                                        allocation of vectors */
 27:     PetscScalar *hwork;              /* work array to hold Hessenberg product */

 29:     PetscInt    augwork_alloc;       /*size of chunk allocated for augmentation vectors */

 31:     PetscInt    aug_dim;             /* max number of augmented directions to add */

 33:     PetscInt    aug_ct;              /* number of aug. vectors available */

 35:     PetscInt    *aug_order;          /*keeps track of order to use aug. vectors*/

 37:     PetscInt    approx_constant;   /* = 1 then the approx space at each restart will 
 38:                                   be  size max_k .  Therefore, more than (max_k - aug_dim) 
 39:                                   krylov vectors may be used if less than aug_dim error 
 40:                                   approximations are available (in the first few restarts,
 41:                                   for example) to keep the space a constant size. */
 42: 
 43:     PetscInt    matvecs;            /*keep track of matvecs */
 44: } KSP_LGMRES;


 47: #define HH(a,b)  (lgmres->hh_origin + (b)*(lgmres->max_k+2)+(a)) 
 48:                  /* HH will be size (max_k+2)*(max_k+1)  -  think of HH as 
 49:                     being stored columnwise (inc. zeros) for access purposes. */
 50: #define HES(a,b) (lgmres->hes_origin + (b)*(lgmres->max_k+1)+(a)) 
 51:                   /* HES will be size (max_k + 1) * (max_k + 1) - 
 52:                      again, think of HES as being stored columnwise */
 53: #define CC(a)    (lgmres->cc_origin + (a)) /* CC will be length (max_k+1) - cosines */
 54: #define SS(a)    (lgmres->ss_origin + (a)) /* SS will be length (max_k+1) - sines */
 55: #define GRS(a)    (lgmres->rs_origin + (a)) /* GRS will be length (max_k+2) - rt side */

 57: /* vector names */
 58: #define VEC_OFFSET     2
 59: #define VEC_TEMP       lgmres->vecs[0]               /* work space */  
 60: #define VEC_TEMP_MATOP lgmres->vecs[1]               /* work space */
 61: #define VEC_VV(i)      lgmres->vecs[VEC_OFFSET+i]    /* use to access
 62:                                                         othog basis vectors */
 63: /*LGMRES_MOD */
 64: #define AUG_OFFSET     1
 65: #define AUGVEC(i)      lgmres->augvecs[AUG_OFFSET+i]   /*error approx vecors */
 66: #define AUG_ORDER(i)   lgmres->aug_order[i]            /*order in which to augment */ 
 67: #define A_AUGVEC(i)    lgmres->augvecs[AUG_OFFSET+i+lgmres->aug_dim] /*A times error vector */
 68: #define AUG_TEMP       lgmres->augvecs[0]              /* work vector */ 
 69: #endif