1174b6946SBarry Smith #define PETSCKSP_DLL 2174b6946SBarry Smith 3174b6946SBarry Smith 4174b6946SBarry Smith #include "petscpc.h" /*I "petscpc.h" I*/ 5174b6946SBarry Smith #include "petscmg.h" /*I "petscpc.h" I*/ 6174b6946SBarry Smith #include "petscda.h" /*I "petscda.h" I*/ 77233f9f0SBarry Smith #include "../src/ksp/pc/impls/mg/mgimpl.h" 87233f9f0SBarry Smith 97233f9f0SBarry Smith const char *PCExoticTypes[] = {"face","wirebasket","PCExoticType","PC_Exotic",0}; 10174b6946SBarry Smith 11174b6946SBarry Smith extern PetscErrorCode DAGetWireBasketInterpolation(DA,Mat,Mat*); 123639cd1fSBarry Smith extern PetscErrorCode DAGetFaceInterpolation(DA,Mat,Mat*); 13174b6946SBarry Smith 147233f9f0SBarry Smith typedef struct { 157233f9f0SBarry Smith DA da; 167233f9f0SBarry Smith PCExoticType type; 177233f9f0SBarry Smith } PC_Exotic; 187233f9f0SBarry Smith 19174b6946SBarry Smith #undef __FUNCT__ 207233f9f0SBarry Smith #define __FUNCT__ "PCExoticSetType" 217233f9f0SBarry Smith /*@ 227233f9f0SBarry Smith PCExoticSetType - Sets the type of coarse grid interpolation to use 237233f9f0SBarry Smith 247233f9f0SBarry Smith Collective on PC 257233f9f0SBarry Smith 267233f9f0SBarry Smith Input Parameters: 277233f9f0SBarry Smith + pc - the preconditioner context 287233f9f0SBarry Smith - type - either PC_EXOTIC_FACE or PC_EXOTIC_WIREBASKET (defaults to face) 297233f9f0SBarry Smith 307233f9f0SBarry Smith Level: intermediate 317233f9f0SBarry Smith 327233f9f0SBarry Smith 337233f9f0SBarry Smith .seealso: PCEXOTIC, PCExoticType() 347233f9f0SBarry Smith @*/ 357233f9f0SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCExoticSetType(PC pc,PCExoticType type) 367233f9f0SBarry Smith { 377233f9f0SBarry Smith PetscErrorCode ierr,(*f)(PC,PCExoticType); 387233f9f0SBarry Smith 397233f9f0SBarry Smith PetscFunctionBegin; 407233f9f0SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 417233f9f0SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCExoticSetType_C",(void (**)(void))&f);CHKERRQ(ierr); 427233f9f0SBarry Smith if (f) { 437233f9f0SBarry Smith ierr = (*f)(pc,type);CHKERRQ(ierr); 447233f9f0SBarry Smith } 457233f9f0SBarry Smith PetscFunctionReturn(0); 467233f9f0SBarry Smith } 477233f9f0SBarry Smith 487233f9f0SBarry Smith #undef __FUNCT__ 497233f9f0SBarry Smith #define __FUNCT__ "PCExoticSetType_Exotic" 507233f9f0SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCExoticSetType_Exotic(PC pc,PCExoticType type) 517233f9f0SBarry Smith { 527233f9f0SBarry Smith PC_MG **mg = (PC_MG**)pc->data; 53bedee52eSLisandro Dalcin PC_Exotic *ctx = (PC_Exotic*) mg[0]->innerctx; 547233f9f0SBarry Smith 557233f9f0SBarry Smith PetscFunctionBegin; 567233f9f0SBarry Smith ctx->type = type; 577233f9f0SBarry Smith PetscFunctionReturn(0); 587233f9f0SBarry Smith } 597233f9f0SBarry Smith 607233f9f0SBarry Smith #undef __FUNCT__ 617233f9f0SBarry Smith #define __FUNCT__ "PCSetUp_Exotic" 627233f9f0SBarry Smith PetscErrorCode PCSetUp_Exotic(PC pc) 63174b6946SBarry Smith { 64174b6946SBarry Smith PetscErrorCode ierr; 65174b6946SBarry Smith Mat A,P; 667233f9f0SBarry Smith PC_MG **mg = (PC_MG**)pc->data; 677233f9f0SBarry Smith PC_Exotic *ex = (PC_Exotic*) mg[0]->innerctx; 687233f9f0SBarry Smith DA da = ex->da; 69174b6946SBarry Smith 70174b6946SBarry Smith PetscFunctionBegin; 71174b6946SBarry Smith ierr = PCGetOperators(pc,PETSC_NULL,&A,PETSC_NULL);CHKERRQ(ierr); 727233f9f0SBarry Smith if (ex->type == PC_EXOTIC_FACE) { 733639cd1fSBarry Smith ierr = DAGetFaceInterpolation(da,A,&P);CHKERRQ(ierr); 747233f9f0SBarry Smith } else if (ex->type == PC_EXOTIC_WIREBASKET) { 757233f9f0SBarry Smith ierr = DAGetWireBasketInterpolation(da,A,&P);CHKERRQ(ierr); 767233f9f0SBarry Smith } else SETERRQ1(PETSC_ERR_PLIB,"Unknown exotic coarse space %d",ex->type); 77174b6946SBarry Smith ierr = PCMGSetInterpolation(pc,1,P);CHKERRQ(ierr); 78174b6946SBarry Smith ierr = MatDestroy(P);CHKERRQ(ierr); 797233f9f0SBarry Smith ierr = PCSetUp_MG(pc);CHKERRQ(ierr); 80174b6946SBarry Smith PetscFunctionReturn(0); 81174b6946SBarry Smith } 82174b6946SBarry Smith 83174b6946SBarry Smith #undef __FUNCT__ 847233f9f0SBarry Smith #define __FUNCT__ "PCDestroy_Exotic" 857233f9f0SBarry Smith PetscErrorCode PCDestroy_Exotic(PC pc) 86174b6946SBarry Smith { 87174b6946SBarry Smith PetscErrorCode ierr; 887233f9f0SBarry Smith PC_MG **mg = (PC_MG**)pc->data; 89bedee52eSLisandro Dalcin PC_Exotic *ctx = (PC_Exotic*) mg[0]->innerctx; 90174b6946SBarry Smith 91174b6946SBarry Smith PetscFunctionBegin; 927233f9f0SBarry Smith ierr = DADestroy(ctx->da);CHKERRQ(ierr); 937233f9f0SBarry Smith ierr = PetscFree(ctx);CHKERRQ(ierr); 947233f9f0SBarry Smith ierr = PCDestroy_MG(pc);CHKERRQ(ierr); 95174b6946SBarry Smith PetscFunctionReturn(0); 96174b6946SBarry Smith } 97174b6946SBarry Smith 98174b6946SBarry Smith #undef __FUNCT__ 997233f9f0SBarry Smith #define __FUNCT__ "PCSetUp_Exotic_Error" 1007233f9f0SBarry Smith PetscErrorCode PCSetUp_Exotic_Error(PC pc) 101174b6946SBarry Smith { 102174b6946SBarry Smith PetscFunctionBegin; 1037233f9f0SBarry Smith SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"You are using the Exotic preconditioner but never called PCExoticSetDA()"); 104174b6946SBarry Smith PetscFunctionReturn(0); 105174b6946SBarry Smith } 106174b6946SBarry Smith 107174b6946SBarry Smith #undef __FUNCT__ 1087233f9f0SBarry Smith #define __FUNCT__ "PCExoticSetDA" 1097233f9f0SBarry Smith /*@ 1107233f9f0SBarry Smith PCExoticSetDA - Sets the DA that is to be used by the PCEXOTIC preconditioner 1117233f9f0SBarry Smith 1127233f9f0SBarry Smith Collective on PC 1137233f9f0SBarry Smith 1147233f9f0SBarry Smith Input Parameters: 1157233f9f0SBarry Smith + pc - the preconditioner context 1167233f9f0SBarry Smith - da - the da 1177233f9f0SBarry Smith 1187233f9f0SBarry Smith Level: intermediate 1197233f9f0SBarry Smith 1207233f9f0SBarry Smith 1217233f9f0SBarry Smith .seealso: PCEXOTIC, PCExoticType() 1227233f9f0SBarry Smith @*/ 1237233f9f0SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCExoticSetDA(PC pc,DA da) 124174b6946SBarry Smith { 1257233f9f0SBarry Smith PetscErrorCode ierr,(*f)(PC,DA); 126174b6946SBarry Smith 127174b6946SBarry Smith PetscFunctionBegin; 128174b6946SBarry Smith PetscValidHeaderSpecific(pc,PC_COOKIE,1); 129174b6946SBarry Smith PetscValidHeaderSpecific(da,DM_COOKIE,1); 1307233f9f0SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)pc,"PCExoticSetDA_C",(void (**)(void))&f);CHKERRQ(ierr); 1317233f9f0SBarry Smith if (f) { 1327233f9f0SBarry Smith ierr = (*f)(pc,da);CHKERRQ(ierr); 1337233f9f0SBarry Smith } 1347233f9f0SBarry Smith PetscFunctionReturn(0); 1357233f9f0SBarry Smith } 136174b6946SBarry Smith 1377233f9f0SBarry Smith 1387233f9f0SBarry Smith #undef __FUNCT__ 1397233f9f0SBarry Smith #define __FUNCT__ "PCExoticSetDA_Exotic" 1407233f9f0SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCExoticSetDA_Exotic(PC pc,DA da) 1417233f9f0SBarry Smith { 1427233f9f0SBarry Smith PetscErrorCode ierr; 1437233f9f0SBarry Smith PC_MG **mg = (PC_MG**)pc->data; 144bedee52eSLisandro Dalcin PC_Exotic *ctx = (PC_Exotic*) mg[0]->innerctx; 1457233f9f0SBarry Smith 1467233f9f0SBarry Smith PetscFunctionBegin; 1477233f9f0SBarry Smith ctx->da = da; 1487233f9f0SBarry Smith pc->ops->setup = PCSetUp_Exotic; 149174b6946SBarry Smith ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr); 150174b6946SBarry Smith PetscFunctionReturn(0); 151174b6946SBarry Smith } 152174b6946SBarry Smith 1537233f9f0SBarry Smith #undef __FUNCT__ 1547233f9f0SBarry Smith #define __FUNCT__ "PCView_Exotic" 1557233f9f0SBarry Smith PetscErrorCode PCView_Exotic(PC pc,PetscViewer viewer) 1567233f9f0SBarry Smith { 1577233f9f0SBarry Smith PC_MG **mg = (PC_MG**)pc->data; 1587233f9f0SBarry Smith PetscErrorCode ierr; 1597233f9f0SBarry Smith PetscTruth iascii; 160bedee52eSLisandro Dalcin PC_Exotic *ctx = (PC_Exotic*) mg[0]->innerctx; 1617233f9f0SBarry Smith 1627233f9f0SBarry Smith PetscFunctionBegin; 1637233f9f0SBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 1647233f9f0SBarry Smith if (iascii) { 1657233f9f0SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Exotic type = %s\n",PCExoticTypes[ctx->type]);CHKERRQ(ierr); 1667233f9f0SBarry Smith } 1677233f9f0SBarry Smith ierr = PCView_MG(pc,viewer);CHKERRQ(ierr); 1687233f9f0SBarry Smith PetscFunctionReturn(0); 1697233f9f0SBarry Smith } 1707233f9f0SBarry Smith 1717233f9f0SBarry Smith #undef __FUNCT__ 1727233f9f0SBarry Smith #define __FUNCT__ "PCSetFromOptions_Exotic" 1737233f9f0SBarry Smith PetscErrorCode PCSetFromOptions_Exotic(PC pc) 1747233f9f0SBarry Smith { 1757233f9f0SBarry Smith PetscErrorCode ierr; 1767233f9f0SBarry Smith PetscTruth flg; 1777233f9f0SBarry Smith PC_MG **mg = (PC_MG**)pc->data; 1787233f9f0SBarry Smith PCExoticType mgctype; 179bedee52eSLisandro Dalcin PC_Exotic *ctx = (PC_Exotic*) mg[0]->innerctx; 1807233f9f0SBarry Smith 1817233f9f0SBarry Smith PetscFunctionBegin; 1827233f9f0SBarry Smith ierr = PetscOptionsHead("Exotic coarse space options");CHKERRQ(ierr); 1837233f9f0SBarry Smith ierr = PetscOptionsEnum("-pc_exotic_type","face or wirebasket","PCExoticSetType",PCExoticTypes,(PetscEnum)ctx->type,(PetscEnum*)&mgctype,&flg);CHKERRQ(ierr); 1847233f9f0SBarry Smith if (flg) { 1857233f9f0SBarry Smith ierr = PCExoticSetType(pc,mgctype);CHKERRQ(ierr); 1867233f9f0SBarry Smith } 1877233f9f0SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 1887233f9f0SBarry Smith PetscFunctionReturn(0); 1897233f9f0SBarry Smith } 1907233f9f0SBarry Smith 191174b6946SBarry Smith 192174b6946SBarry Smith /*MC 1937233f9f0SBarry Smith PCEXOTIC - Two level overlapping Schwarz preconditioner with exotic (non-standard) coarse grid spaces 194174b6946SBarry Smith 1957233f9f0SBarry Smith This uses the PCMG infrastructure restricted to two levels and the face and wirebasket based coarse 196*3b65e785SBarry Smith grid spaces. These coarse grid spaces originate in the work of Bramble, Pasciak and Schatz, "The Construction 197*3b65e785SBarry Smith of Preconditioners for Elliptic Problems by Substructing IV", Mathematics of Computation, volume 53 pages 1--24, 1989. 198*3b65e785SBarry Smith They were generalized slightly in "Domain Decomposition Method for Linear Elasticity", Ph. D. thesis, Barry Smith, 199*3b65e785SBarry Smith New York University, 1990. They were then explored in great detail in Dryja, Smith, Widlund, "Schwarz Analysis 200*3b65e785SBarry Smith of Iterative Substructuring Methods for Elliptic Problems in Three Dimensions, SIAM Journal on Numerical 201*3b65e785SBarry Smith Analysis, volume 31. pages 1662-1694, 1994. These were developed in the context of iterative substructuring preconditioners. 202*3b65e785SBarry Smith They were then ingeniously applied as coarse grid spaces for overlapping Schwarz methods by Dohrmann and Widlund. 203*3b65e785SBarry Smith They refer to them as GDSW (generalized Dryja, Smith, Widlund preconditioners). See, for example, 204*3b65e785SBarry Smith Clark R. Dohrmann, Axel Klawonn, and Olof B. Widlund. Extending theory for domain decomposition algorithms to irregular subdomains. In Ulrich Langer, Marco 205*3b65e785SBarry Smith Discacciati, David Keyes, Olof Widlund, and Walter Zulehner, editors, Proceedings 206*3b65e785SBarry Smith of the 17th International Conference on Domain Decomposition Methods in 207*3b65e785SBarry Smith Science and Engineering, held in Strobl, Austria, July 3-7, 2006, number 60 in 208*3b65e785SBarry Smith Springer-Verlag, Lecture Notes in Computational Science and Engineering, pages 255-261, 2007. 209*3b65e785SBarry Smith Clark R. Dohrmann, Axel Klawonn, and Olof B. Widlund. A family of energy min- 210*3b65e785SBarry Smith imizing coarse spaces for overlapping Schwarz preconditioners. In Ulrich Langer, 211*3b65e785SBarry Smith Marco Discacciati, David Keyes, OlofWidlund, andWalter Zulehner, editors, Proceedings 212*3b65e785SBarry Smith of the 17th International Conference on Domain Decomposition Methods 213*3b65e785SBarry Smith in Science and Engineering, held in Strobl, Austria, July 3-7, 2006, number 60 in 214*3b65e785SBarry Smith Springer-Verlag, Lecture Notes in Computational Science and Engineering, pages 247-254, 2007 215*3b65e785SBarry Smith Clark R. Dohrmann, Axel Klawonn, and Olof B. Widlund. Domain decomposition 216*3b65e785SBarry Smith for less regular subdomains: Overlapping Schwarz in two dimensions. SIAM J. 217*3b65e785SBarry Smith Numer. Anal., 46(4):2153-2168, 2008. 218*3b65e785SBarry Smith Clark R. Dohrmann and Olof B. Widlund. An overlapping Schwarz 219*3b65e785SBarry Smith algorithm for almost incompressible elasticity. Technical Report 220*3b65e785SBarry Smith TR2008-912, Department of Computer Science, Courant Institute 221*3b65e785SBarry Smith of Mathematical Sciences, New York University, May 2008. URL: 222*3b65e785SBarry Smith http://cs.nyu.edu/csweb/Research/TechReports/TR2008-912/TR2008-912.pdf 2237233f9f0SBarry Smith 2247233f9f0SBarry Smith Options Database: The usual PCMG options are supported, such as -mg_levels_pc_type <type> -mg_coarse_pc_type <type> 2257233f9f0SBarry Smith -pc_mg_type <type> 2267233f9f0SBarry Smith 2277233f9f0SBarry Smith .seealso: PCMG, PCExoticSetDA(), PCExoticType, PCExoticSetType() 228174b6946SBarry Smith 229174b6946SBarry Smith M*/ 230174b6946SBarry Smith 231174b6946SBarry Smith EXTERN_C_BEGIN 232174b6946SBarry Smith #undef __FUNCT__ 2337233f9f0SBarry Smith #define __FUNCT__ "PCCreate_Exotic" 2347233f9f0SBarry Smith PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_Exotic(PC pc) 235174b6946SBarry Smith { 236174b6946SBarry Smith PetscErrorCode ierr; 2377233f9f0SBarry Smith PC_Exotic *ex; 2387233f9f0SBarry Smith PC_MG **mg; 239174b6946SBarry Smith 240174b6946SBarry Smith PetscFunctionBegin; 241174b6946SBarry Smith ierr = PCSetType(pc,PCMG);CHKERRQ(ierr); 242174b6946SBarry Smith ierr = PCMGSetLevels(pc,2,PETSC_NULL);CHKERRQ(ierr); 243174b6946SBarry Smith ierr = PCMGSetGalerkin(pc);CHKERRQ(ierr); 2447233f9f0SBarry Smith ierr = PetscNew(PC_Exotic,&ex);CHKERRQ(ierr); 2457233f9f0SBarry Smith ex->type = PC_EXOTIC_FACE; 2467233f9f0SBarry Smith mg = (void*)(PC_MG**)pc->data; 2477233f9f0SBarry Smith mg[0]->innerctx = ex; 2487233f9f0SBarry Smith 2497233f9f0SBarry Smith 2507233f9f0SBarry Smith pc->ops->setfromoptions = PCSetFromOptions_Exotic; 2517233f9f0SBarry Smith pc->ops->view = PCView_Exotic; 2527233f9f0SBarry Smith pc->ops->destroy = PCDestroy_Exotic; 2537233f9f0SBarry Smith pc->ops->setup = PCSetUp_Exotic_Error; 2547233f9f0SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCExoticSetType_C","PCExoticSetType_Exotic",PCExoticSetType_Exotic);CHKERRQ(ierr); 2557233f9f0SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCExoticSetDA_C","PCExoticSetDA_Exotic",PCExoticSetDA_Exotic);CHKERRQ(ierr); 256174b6946SBarry Smith PetscFunctionReturn(0); 257174b6946SBarry Smith } 258174b6946SBarry Smith EXTERN_C_END 259