PetscErrorCode KSPSetUp_LGMRES(KSP ksp) { PetscErrorCode ierr; PetscInt max_k,k, aug_dim; KSP_LGMRES *lgmres = (KSP_LGMRES*)ksp->data; PetscFunctionBegin; max_k = lgmres->max_k; aug_dim = lgmres->aug_dim; ierr = KSPSetUp_GMRES(ksp);CHKERRQ(ierr); /* need array of pointers to augvecs*/ ierr = PetscMalloc1((2 * aug_dim + AUG_OFFSET),&lgmres->augvecs);CHKERRQ(ierr); lgmres->aug_vecs_allocated = 2 *aug_dim + AUG_OFFSET; ierr = PetscMalloc1((2* aug_dim + AUG_OFFSET),&lgmres->augvecs_user_work);CHKERRQ(ierr); ierr = PetscMalloc1(aug_dim,&lgmres->aug_order);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)ksp,(aug_dim)*(4*sizeof(void*) + sizeof(PetscInt)) + AUG_OFFSET*2*sizeof(void*));CHKERRQ(ierr); /* for now we will preallocate the augvecs - because aug_dim << restart ... also keep in mind that we need to keep augvecs from cycle to cycle*/ lgmres->aug_vv_allocated = 2* aug_dim + AUG_OFFSET; lgmres->augwork_alloc = 2* aug_dim + AUG_OFFSET; ierr = KSPGetVecs(ksp,lgmres->aug_vv_allocated,&lgmres->augvecs_user_work[0],0,NULL);CHKERRQ(ierr); ierr = PetscMalloc1((max_k+1),&lgmres->hwork);CHKERRQ(ierr); ierr = PetscLogObjectParents(ksp,lgmres->aug_vv_allocated,lgmres->augvecs_user_work[0]);CHKERRQ(ierr); for (k=0; k<lgmres->aug_vv_allocated; k++) { lgmres->augvecs[k] = lgmres->augvecs_user_work[0][k]; } PetscFunctionReturn(0); }
/* KSPSetUp_PIPEFGMRES - Sets up the workspace needed by pipefgmres. This is called once, usually automatically by KSPSolve() or KSPSetUp(), but can be called directly by KSPSetUp(). */ static PetscErrorCode KSPSetUp_PIPEFGMRES(KSP ksp) { PetscErrorCode ierr; PetscInt k; KSP_PIPEFGMRES *pipefgmres = (KSP_PIPEFGMRES*)ksp->data; const PetscInt max_k = pipefgmres->max_k; PetscFunctionBegin; ierr = KSPSetUp_GMRES(ksp);CHKERRQ(ierr); ierr = PetscMalloc1((VEC_OFFSET+max_k),&pipefgmres->prevecs);CHKERRQ(ierr); ierr = PetscMalloc1((VEC_OFFSET+max_k),&pipefgmres->prevecs_user_work);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)ksp,(VEC_OFFSET+max_k)*(2*sizeof(void*)));CHKERRQ(ierr); ierr = KSPCreateVecs(ksp,pipefgmres->vv_allocated,&pipefgmres->prevecs_user_work[0],0,NULL);CHKERRQ(ierr); ierr = PetscLogObjectParents(ksp,pipefgmres->vv_allocated,pipefgmres->prevecs_user_work[0]);CHKERRQ(ierr); for (k=0; k < pipefgmres->vv_allocated; k++) { pipefgmres->prevecs[k] = pipefgmres->prevecs_user_work[0][k]; } ierr = PetscMalloc1((VEC_OFFSET+max_k),&pipefgmres->zvecs);CHKERRQ(ierr); ierr = PetscMalloc1((VEC_OFFSET+max_k),&pipefgmres->zvecs_user_work);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)ksp,(VEC_OFFSET+max_k)*(2*sizeof(void*)));CHKERRQ(ierr); ierr = PetscMalloc1((VEC_OFFSET+max_k),&pipefgmres->redux);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)ksp,(VEC_OFFSET+max_k)*(sizeof(void*)));CHKERRQ(ierr); ierr = KSPCreateVecs(ksp,pipefgmres->vv_allocated,&pipefgmres->zvecs_user_work[0],0,NULL);CHKERRQ(ierr); ierr = PetscLogObjectParents(ksp,pipefgmres->vv_allocated,pipefgmres->zvecs_user_work[0]);CHKERRQ(ierr); for (k=0; k < pipefgmres->vv_allocated; k++) { pipefgmres->zvecs[k] = pipefgmres->zvecs_user_work[0][k]; } PetscFunctionReturn(0); }
/* KSPSetUp_FGMRES - Sets up the workspace needed by fgmres. This is called once, usually automatically by KSPSolve() or KSPSetUp(), but can be called directly by KSPSetUp(). */ PetscErrorCode KSPSetUp_FGMRES(KSP ksp) { PetscErrorCode ierr; PetscInt max_k,k; KSP_FGMRES *fgmres = (KSP_FGMRES*)ksp->data; PetscFunctionBegin; max_k = fgmres->max_k; ierr = KSPSetUp_GMRES(ksp);CHKERRQ(ierr); ierr = PetscMalloc1(max_k+2,&fgmres->prevecs);CHKERRQ(ierr); ierr = PetscMalloc1(max_k+2,&fgmres->prevecs_user_work);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)ksp,(max_k+2)*(2*sizeof(void*)));CHKERRQ(ierr); /* fgmres->vv_allocated includes extra work vectors, which are not used in the additional block of vectors used to store the preconditioned directions, hence the -VEC_OFFSET term for this first allocation of vectors holding preconditioned directions */ ierr = KSPCreateVecs(ksp,fgmres->vv_allocated-VEC_OFFSET,&fgmres->prevecs_user_work[0],0,NULL);CHKERRQ(ierr); ierr = PetscLogObjectParents(ksp,fgmres->vv_allocated-VEC_OFFSET,fgmres->prevecs_user_work[0]);CHKERRQ(ierr); for (k=0; k < fgmres->vv_allocated - VEC_OFFSET ; k++) { fgmres->prevecs[k] = fgmres->prevecs_user_work[0][k]; } PetscFunctionReturn(0); }
static PetscErrorCode KSPSetUp_PGMRES(KSP ksp) { PetscErrorCode ierr; PetscFunctionBegin; ierr = KSPSetUp_GMRES(ksp);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode KSPSetUp_FGMRES(KSP ksp) { PetscErrorCode ierr; PetscInt max_k,k; KSP_FGMRES *fgmres = (KSP_FGMRES*)ksp->data; PetscFunctionBegin; max_k = fgmres->max_k; ierr = KSPSetUp_GMRES(ksp);CHKERRQ(ierr); ierr = PetscMalloc1((VEC_OFFSET+2+max_k),&fgmres->prevecs);CHKERRQ(ierr); ierr = PetscMalloc1((VEC_OFFSET+2+max_k),&fgmres->prevecs_user_work);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)ksp,(VEC_OFFSET+2+max_k)*(2*sizeof(void*)));CHKERRQ(ierr); ierr = KSPGetVecs(ksp,fgmres->vv_allocated,&fgmres->prevecs_user_work[0],0,NULL);CHKERRQ(ierr); ierr = PetscLogObjectParents(ksp,fgmres->vv_allocated,fgmres->prevecs_user_work[0]);CHKERRQ(ierr); for (k=0; k < fgmres->vv_allocated; k++) { fgmres->prevecs[k] = fgmres->prevecs_user_work[0][k]; } PetscFunctionReturn(0); }