[petsc-users] Problem in PCShellSetApply()

Rongliang Chen rongliang.chan at gmail.com
Mon Apr 18 21:42:48 CDT 2011


Hi,

I faced a problem when I used the function PCShellSetApply to set a
composite PC in Petsc 3.1. There was no problem when I compiled my code but
I got the following message when I run the code.
------------------------------------------------------------------------------------------------------------
[0]PETSC ERROR: [1]PETSC ERROR: --------------------- Error Message
------------------------------------
[1]PETSC ERROR: No support for this operation for this object type!
[1]PETSC ERROR: Matrix format mpiaij does not have a built-in PETSc direct
solver!
[1]PETSC ERROR:
------------------------------------------------------------------------
[1]PETSC ERROR: Petsc Release Version 3.1.0, Patch 8, Thu Mar 17 13:37:48
CDT 2011
...............................
[7]PETSC ERROR: MatGetFactor() line 3644 in src/mat/interface/matrix.c
[7]PETSC ERROR: PCSetUp_LU() line 133 in src/ksp/pc/impls/factor/lu/lu.c
[7]PETSC ERROR: PCSetUp() line 795 in src/ksp/pc/interface/precon.c
[7]PETSC ERROR: PCApply() line 353 in src/ksp/pc/interface/precon.c
[7]PETSC ERROR: PCApply_Composite_Additive() line 102 in
src/ksp/pc/impls/composite/composite.c
[7]PETSC ERROR: PCApply() line 357 in src/ksp/pc/interface/precon.c
[7]PETSC ERROR: PCApplyBAorAB() line 582 in src/ksp/pc/interface/precon.c
[7]PETSC ERROR: GMREScycle() line 161 in src/ksp/ksp/impls/gmres/gmres.c
[7]PETSC ERROR: KSPSolve_GMRES() line 241 in src/ksp/ksp/impls/gmres/gmres.c
[7]PETSC ERROR: KSPSolve() line 396 in src/ksp/ksp/interface/itfunc.c
[1]PETSC ERROR: SNES_KSPSolve() line 2944 in src/snes/interface/snes.c
[1]PETSC ERROR: SNESSolve_LS() line 191 in src/snes/impls/ls/ls.c
[1]PETSC ERROR: SNESSolve() line 2255 in src/snes/interface/snes.c
..............................
--------------------------------------------------------------------------------------------------------------

I found that the function PCShellSetApply did not call the user defined
function CoarseSolvePCApply (I called PCShellSetApply like this: ierr =
PCShellSetApply(coarsesolve, CoarseSolvePCApply);CHKERRQ(ierr); ). Can
anyone tell me what may be the problem? The related code attached.

-----------------------The related code-----------------------------------
PetscErrorCode SetupPreconditioner(JoabCtx* ctx, SNES snes)
{
  JoabParameters *parameters = &ctx->parameters;
  JoabView *view = &ctx->view;
  JoabGrid *grid = &ctx->grid;
  JoabGrid *coarsegrid = &ctx->coarsegrid;
  JoabAlgebra *algebra = &ctx->algebra;
  JoabAlgebra *coarsealgebra = &ctx->coarsealgebra;

  KSP fineksp;
  PC finepc, coarsepc;
  PC asmpc;
  PC coarsesolve;
  Vec fineones;
  PetscInt veclength;
  PetscScalar *values;
  int i;

  PetscErrorCode ierr;

  PetscFunctionBegin;
  ierr = SNESGetKSP(snes,&fineksp);CHKERRQ(ierr);
  ierr = KSPGetPC(fineksp,&finepc);CHKERRQ(ierr);
  ierr = KSPCreate(PETSC_COMM_WORLD,&ctx->coarseksp);CHKERRQ(ierr);

  ierr = SetMyKSPDefaults(ctx->coarseksp);CHKERRQ(ierr);
  ierr = KSPSetFromOptions(ctx->coarseksp);CHKERRQ(ierr);
  ierr = KSPSetOperators(ctx->coarseksp, coarsealgebra->H, coarsealgebra->H,
               SAME_NONZERO_PATTERN);CHKERRQ(ierr);
  if (parameters->geometric_asm) {
    ierr = KSPGetPC(ctx->coarseksp, &coarsepc);CHKERRQ(ierr);
    ierr = PCASMSetOverlap(coarsepc,0);CHKERRQ(ierr);
    ierr = PCASMSetLocalSubdomains(coarsepc,1,&coarsegrid->df_global_asm,
PETSC_NULL);CHKERRQ(ierr);
  }

  ierr = PCSetType(finepc,PCCOMPOSITE);CHKERRQ(ierr);
  ierr = PCCompositeAddPC(finepc,PCSHELL);CHKERRQ(ierr);
  ierr = PCCompositeAddPC(finepc,PCASM);CHKERRQ(ierr);

  /* set up asm (fine) part of two-level preconditioner */
  ierr = PCCompositeGetPC(finepc,1,&asmpc);CHKERRQ(ierr);
  if (parameters->geometric_asm) {
    ierr = PCSetType(asmpc,PCASM);CHKERRQ(ierr);
    ierr = PCASMSetOverlap(asmpc,0);CHKERRQ(ierr);
    ierr = PCASMSetLocalSubdomains(asmpc,1,&grid->df_global_asm,
PETSC_NULL);CHKERRQ(ierr);
  }
  ierr = SetMyPCDefaults(asmpc);CHKERRQ(ierr);
  ierr = PCSetFromOptions(asmpc);CHKERRQ(ierr);

  /* set up coarse solve part of two-level preconditioner */
  ierr = PCCompositeGetPC(finepc,0,&coarsesolve);CHKERRQ(ierr);
  ierr = PCShellSetContext(coarsesolve,ctx);CHKERRQ(ierr);
  ierr = PCShellSetApply(coarsesolve, CoarseSolvePCApply);CHKERRQ(ierr);

  PetscFunctionReturn(0);
}

PetscErrorCode CoarseSolvePCApply(PC pc, Vec xin, Vec xout)
{
  JoabCtx *ctx;
  PetscErrorCode ierr;
  JoabParameters *parameters;
  JoabView *view;
  JoabGrid *finegrid;
  JoabGrid *coarsegrid;
  JoabAlgebra *finealgebra;
  JoabAlgebra *coarsealgebra;
  PetscInt its;
  PetscLogDouble t1,t2,v1,v2;
  KSPConvergedReason reason;

  PetscFunctionBegin;
  ierr = PetscPrintf(PETSC_COMM_WORLD,"Setup coarse level
preconditioner.....\n");CHKERRQ(ierr);
  ierr = PCShellGetContext(pc,(void**)&ctx);CHKERRQ(ierr);
  parameters = &ctx->parameters;
  view = &ctx->view;
  finegrid = &ctx->grid;
  coarsegrid = &ctx->coarsegrid;
  finealgebra = &ctx->algebra;
  coarsealgebra = &ctx->coarsealgebra;

  ierr = PetscGetTime(&t1);CHKERRQ(ierr);

  parameters->whichlevel = COARSE_GRID;

  /* restrict fine grid to coarse grid */
  ierr = PetscGetTime(&v1);CHKERRQ(ierr);
  ierr =
VecSet(coarsealgebra->predictedShape_opt,0.0);CHKERRQ(ierr);CHKERRQ(ierr);
  ierr =
ApplyRestriction(ctx,xin,coarsealgebra->predictedShape_opt);CHKERRQ(ierr);

  ierr = VecSet(coarsealgebra->solutionShape_opt,0.0);CHKERRQ(ierr);
  ierr =
KSPSetTolerances(ctx->coarseksp,1e-6,1e-14,PETSC_DEFAULT,1000);CHKERRQ(ierr);
  ierr = KSPSolve(ctx->coarseksp, coarsealgebra->predictedShape_opt,
coarsealgebra->solutionShape_opt);CHKERRQ(ierr);

  /* interpolate coarse grid to fine grid */
  ierr =
MatInterpolate(ctx->Interp,coarsealgebra->solutionShape_opt,xout);CHKERRQ(ierr);


  PetscFunctionReturn(0);
}


Regards,
Rongliang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20110418/64656d75/attachment.htm>


More information about the petsc-users mailing list