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