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