xref: /petsc/src/ksp/pc/impls/wb/wb.c (revision 7d6bfa3b9d7db0ccd4cc481237114ca8dbb0dbff)
1 #define PETSCKSP_DLL
2 
3 
4 #include "petscpc.h"   /*I "petscpc.h" I*/
5 #include "petscmg.h"   /*I "petscpc.h" I*/
6 #include "petscda.h"   /*I "petscda.h" I*/
7 
8 extern PetscErrorCode DAGetWireBasketInterpolation(DA,Mat,Mat*);
9 
10 #undef __FUNCT__
11 #define __FUNCT__ "PCSetUp_WB"
12 PetscErrorCode PCSetUp_WB(PC pc,void *ida)
13 {
14   PetscErrorCode ierr;
15   DA             da = (DA)ida;
16   Mat            A,P;
17 
18   PetscFunctionBegin;
19   ierr = PCGetOperators(pc,PETSC_NULL,&A,PETSC_NULL);CHKERRQ(ierr);
20   ierr = DAGetWireBasketInterpolation(da,A,&P);CHKERRQ(ierr);
21   ierr = PCMGSetInterpolation(pc,1,P);CHKERRQ(ierr);
22   ierr = MatDestroy(P);CHKERRQ(ierr);
23   PetscFunctionReturn(0);
24 }
25 
26 #undef __FUNCT__
27 #define __FUNCT__ "PCDestroy_WB"
28 PetscErrorCode PCDestroy_WB(PC pc,void *ida)
29 {
30   PetscErrorCode ierr;
31   DA             da = (DA)ida;
32 
33   PetscFunctionBegin;
34   ierr = DADestroy(da);CHKERRQ(ierr);
35   PetscFunctionReturn(0);
36 }
37 
38 #undef __FUNCT__
39 #define __FUNCT__ "PCSetUp_WB_Error"
40 PetscErrorCode PCSetUp_WB_Error(PC pc,void *ida)
41 {
42   PetscFunctionBegin;
43   SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"You are using the WB preconditioner but never called PDWBSetDA()");
44   PetscFunctionReturn(0);
45 }
46 
47 #undef __FUNCT__
48 #define __FUNCT__ "PCWBSetDA"
49 PetscErrorCode PETSCKSP_DLLEXPORT PCWBSetDA(PC pc,DA da)
50 {
51   PetscErrorCode ierr;
52 
53   PetscFunctionBegin;
54   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
55   PetscValidHeaderSpecific(da,DM_COOKIE,1);
56 
57   ierr = PCMGSetSetup(pc,PCSetUp_WB,PCDestroy_WB,da);CHKERRQ(ierr);
58   ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);
59   PetscFunctionReturn(0);
60 }
61 
62 
63 /*MC
64      PCWB - Wirebasket based coarse problem two level multigrid preconditioner
65 
66 .seealso:  PCMG, PCWBSetDA()
67 
68 M*/
69 
70 EXTERN_C_BEGIN
71 #undef __FUNCT__
72 #define __FUNCT__ "PCCreate_WB"
73 PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_WB(PC pc)
74 {
75   PetscErrorCode ierr;
76 
77   PetscFunctionBegin;
78   ierr = PCSetType(pc,PCMG);CHKERRQ(ierr);
79   ierr = PCMGSetLevels(pc,2,PETSC_NULL);CHKERRQ(ierr);
80   ierr = PCMGSetGalerkin(pc);CHKERRQ(ierr);
81   ierr = PCMGSetSetup(pc,PCSetUp_WB_Error,0,0);CHKERRQ(ierr);
82   PetscFunctionReturn(0);
83 }
84 EXTERN_C_END
85