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: }