Actual source code: pcdmmg.c

  1: #define PETSCSNES_DLL

 3:  #include private/pcimpl.h
 4:  #include petscdmmg.h

  6: /* 
  7:    Private context (data structure) for the DMMG preconditioner.  
  8: */
  9: typedef struct {
 10:   DMMG *dmmg;
 11: } PC_DMMG;

 16: PetscErrorCode  PCDMMGSetDMMG_DMMG(PC pc,DMMG *dmmg)
 17: {
 18:   PC_DMMG        *pcdmmg = (PC_DMMG*)pc->data;

 21:   pcdmmg->dmmg = dmmg;
 22:   return(0);
 23: }
 27: static PetscErrorCode PCSetUp_DMMG(PC pc)
 28: {
 29:   PC_DMMG        *pcdmmg = (PC_DMMG*)pc->data;
 30:   DMMG           *dmmg = pcdmmg->dmmg;

 33:   /* when used as preconditioner cannot provide right hand size (it is provided by PCApply()) */
 34:   dmmg[dmmg[0]->nlevels-1]->rhs = PETSC_NULL;
 35:   return(0);
 36: }
 37: /* -------------------------------------------------------------------------- */
 40: static PetscErrorCode PCApply_DMMG(PC pc,Vec x,Vec y)
 41: {
 42:   PC_DMMG        *pcdmmg = (PC_DMMG*)pc->data;

 46:   VecCopy(x,DMMGGetRHS(pcdmmg->dmmg));
 47:   DMMGSolve(pcdmmg->dmmg);
 48:   VecCopy(DMMGGetx(pcdmmg->dmmg),y);
 49:   return(0);
 50: }

 54: static PetscErrorCode PCDestroy_DMMG(PC pc)
 55: {
 56:   PC_DMMG        *pcdmmg = (PC_DMMG*)pc->data;

 60:   if (pcdmmg->dmmg) {DMMGDestroy(pcdmmg->dmmg);}
 61:   PetscFree(pcdmmg);
 62:   return(0);
 63: }

 67: static PetscErrorCode PCSetFromOptions_DMMG(PC pc)
 68: {

 72:   PetscOptionsHead("DMMG options");
 73:   PetscOptionsTail();
 74:   return(0);
 75: }

 79: static PetscErrorCode PCView_DMMG(PC pc,PetscViewer viewer)
 80: {
 81:   PC_DMMG        *pcdmmg = (PC_DMMG*)pc->data;
 83:   PetscTruth     iascii;

 86:   PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);
 87:   if (iascii) {
 88:     PetscViewerASCIIPrintf(viewer,"  DMMG based preconditioner: \n");
 89:   }
 90:   PetscViewerASCIIPushTab(viewer);
 91:     DMMGView(pcdmmg->dmmg,viewer);
 92:   PetscViewerASCIIPopTab(viewer);
 93:   return(0);
 94: }

 96: /*MC
 97:      PCDMMG - DMMG based preconditioner

 99:    Level: Intermediate

101:   Concepts: DMMG, diagonal scaling, preconditioners


104: .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
105:            PCDMMGSetDMMG()
106: M*/

111: PetscErrorCode  PCCreate_DMMG(PC pc)
112: {
113:   PC_DMMG        *pcdmmg;

117:   /*
118:      Creates the private data structure for this preconditioner and
119:      attach it to the PC object.
120:   */
121:   PetscNew(PC_DMMG,&pcdmmg);
122:   pc->data      = (void*)pcdmmg;
123:   pcdmmg->dmmg  = 0;

125:   pc->ops->apply               = PCApply_DMMG;
126:   pc->ops->applytranspose      = PCApply_DMMG;
127:   pc->ops->setup               = PCSetUp_DMMG;
128:   pc->ops->destroy             = PCDestroy_DMMG;
129:   pc->ops->setfromoptions      = PCSetFromOptions_DMMG;
130:   pc->ops->view                = PCView_DMMG;
131:   pc->ops->applyrichardson     = 0;
132:   pc->ops->applysymmetricleft  = 0;
133:   pc->ops->applysymmetricright = 0;
134:   PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCDMMGSetDMMG_C","PCDMMGSetDMMG_DMMG",PCDMMGSetDMMG_DMMG);
135:   return(0);
136: }

141: /*@
142:    PCDMMGSetDMMG - Sets the DMMG that is to be used to build the preconditioner

144:    Collective on PC

146:    Input Parameters:
147: +  pc - the preconditioner context
148: -  dmmg - the DMMG object

150:    Concepts: DMMG preconditioner

152: .seealso: PCDMMG
153: @*/
154: PetscErrorCode  PCDMMGSetDMMG(PC pc,DMMG *dmmg)
155: {
156:   PetscErrorCode ierr,(*f)(PC,DMMG*);

160:   PetscObjectQueryFunction((PetscObject)pc,"PCDMMGSetDMMG_C",(void (**)(void))&f);
161:   if (f) {
162:     (*f)(pc,dmmg);
163:   }
164:   return(0);
165: }