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