1 #define PETSCKSP_DLL 2 /* 3 Routines to set PC methods and options. 4 */ 5 6 #include "src/ksp/pc/pcimpl.h" /*I "petscpc.h" I*/ 7 #include "petscsys.h" 8 9 PetscTruth PCRegisterAllCalled = PETSC_FALSE; 10 /* 11 Contains the list of registered KSP routines 12 */ 13 PetscFList PCList = 0; 14 15 #undef __FUNCT__ 16 #define __FUNCT__ "PCSetType" 17 /*@C 18 PCSetType - Builds PC for a particular preconditioner. 19 20 Collective on PC 21 22 Input Parameter: 23 + pc - the preconditioner context. 24 - type - a known method 25 26 Options Database Key: 27 . -pc_type <type> - Sets PC type 28 29 Use -help for a list of available methods (for instance, 30 jacobi or bjacobi) 31 32 Notes: 33 See "petsc/include/petscpc.h" for available methods (for instance, 34 PCJACOBI, PCILU, or PCBJACOBI). 35 36 Normally, it is best to use the KSPSetFromOptions() command and 37 then set the PC type from the options database rather than by using 38 this routine. Using the options database provides the user with 39 maximum flexibility in evaluating the many different preconditioners. 40 The PCSetType() routine is provided for those situations where it 41 is necessary to set the preconditioner independently of the command 42 line or options database. This might be the case, for example, when 43 the choice of preconditioner changes during the execution of the 44 program, and the user's application is taking responsibility for 45 choosing the appropriate preconditioner. In other words, this 46 routine is not for beginners. 47 48 Level: intermediate 49 50 .keywords: PC, set, method, type 51 52 .seealso: KSPSetType(), PCType 53 54 @*/ 55 PetscErrorCode PETSCKSP_DLLEXPORT PCSetType(PC pc, PCType type) 56 { 57 PetscErrorCode ierr,(*r)(PC); 58 PetscTruth match; 59 60 PetscFunctionBegin; 61 PetscValidHeaderSpecific(pc,PC_COOKIE,1); 62 PetscValidCharPointer(type,2); 63 64 ierr = PetscTypeCompare((PetscObject)pc,type,&match);CHKERRQ(ierr); 65 if (match) PetscFunctionReturn(0); 66 67 if (pc->ops->destroy) {ierr = (*pc->ops->destroy)(pc);CHKERRQ(ierr);} 68 ierr = PetscFListDestroy(&pc->qlist);CHKERRQ(ierr); 69 pc->data = 0; 70 pc->setupcalled = 0; 71 72 /* Get the function pointers for the method requested */ 73 if (!PCRegisterAllCalled) {ierr = PCRegisterAll(0);CHKERRQ(ierr);} 74 75 /* Determine the PCCreateXXX routine for a particular preconditioner */ 76 ierr = PetscFListFind(pc->comm,PCList,type,(void (**)(void)) &r);CHKERRQ(ierr); 77 if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested PC type %s",type); 78 if (pc->data) {ierr = PetscFree(pc->data);CHKERRQ(ierr);} 79 80 pc->ops->setup = (PetscErrorCode (*)(PC)) 0; 81 pc->ops->apply = (PetscErrorCode (*)(PC,Vec,Vec)) 0; 82 pc->ops->applyrichardson = (PetscErrorCode (*)(PC,Vec,Vec,Vec,PetscReal,PetscReal,PetscReal,PetscInt)) 0; 83 pc->ops->applyBA = (PetscErrorCode (*)(PC,PetscInt,Vec,Vec,Vec)) 0; 84 pc->ops->applytranspose = (PetscErrorCode (*)(PC,Vec,Vec)) 0; 85 pc->ops->applyBAtranspose = (PetscErrorCode (*)(PC,PetscInt,Vec,Vec,Vec)) 0; 86 pc->ops->setfromoptions = (PetscErrorCode (*)(PC)) 0; 87 pc->ops->presolve = (PetscErrorCode (*)(PC,KSP,Vec,Vec)) 0; 88 pc->ops->postsolve = (PetscErrorCode (*)(PC,KSP,Vec,Vec)) 0; 89 pc->ops->getfactoredmatrix = (PetscErrorCode (*)(PC,Mat*)) 0; 90 pc->ops->applysymmetricleft = (PetscErrorCode (*)(PC,Vec,Vec)) 0; 91 pc->ops->applysymmetricright = (PetscErrorCode (*)(PC,Vec,Vec)) 0; 92 pc->ops->setuponblocks = (PetscErrorCode (*)(PC)) 0; 93 pc->ops->destroy = (PetscErrorCode (*)(PC)) 0; 94 pc->ops->view = (PetscErrorCode (*)(PC,PetscViewer)) 0; 95 pc->modifysubmatrices = (PetscErrorCode (*)(PC,PetscInt,const IS[],const IS[],Mat[],void*)) 0; 96 97 /* Call the PCCreateXXX routine for this particular preconditioner */ 98 ierr = (*r)(pc);CHKERRQ(ierr); 99 100 ierr = PetscObjectChangeTypeName((PetscObject)pc,type);CHKERRQ(ierr); 101 PetscFunctionReturn(0); 102 } 103 104 #undef __FUNCT__ 105 #define __FUNCT__ "PCRegisterDestroy" 106 /*@C 107 PCRegisterDestroy - Frees the list of preconditioners that were 108 registered by PCRegisterDynamic(). 109 110 Not Collective 111 112 Level: advanced 113 114 .keywords: PC, register, destroy 115 116 .seealso: PCRegisterAll(), PCRegisterAll() 117 118 @*/ 119 PetscErrorCode PETSCKSP_DLLEXPORT PCRegisterDestroy(void) 120 { 121 PetscErrorCode ierr; 122 123 PetscFunctionBegin; 124 if (PCList) { 125 ierr = PetscFListDestroy(&PCList);CHKERRQ(ierr); 126 PCList = 0; 127 } 128 PCRegisterAllCalled = PETSC_FALSE; 129 PetscFunctionReturn(0); 130 } 131 132 #undef __FUNCT__ 133 #define __FUNCT__ "PCGetType" 134 /*@C 135 PCGetType - Gets the PC method type and name (as a string) from the PC 136 context. 137 138 Not Collective 139 140 Input Parameter: 141 . pc - the preconditioner context 142 143 Output Parameter: 144 . name - name of preconditioner 145 146 Level: intermediate 147 148 .keywords: PC, get, method, name, type 149 150 .seealso: PCSetType() 151 152 @*/ 153 PetscErrorCode PETSCKSP_DLLEXPORT PCGetType(PC pc,PCType *meth) 154 { 155 PetscFunctionBegin; 156 *meth = (PCType) pc->type_name; 157 PetscFunctionReturn(0); 158 } 159 160 EXTERN PetscErrorCode PCGetDefaultType_Private(PC,const char*[]); 161 162 #undef __FUNCT__ 163 #define __FUNCT__ "PCSetFromOptions" 164 /*@ 165 PCSetFromOptions - Sets PC options from the options database. 166 This routine must be called before PCSetUp() if the user is to be 167 allowed to set the preconditioner method. 168 169 Collective on PC 170 171 Input Parameter: 172 . pc - the preconditioner context 173 174 Level: developer 175 176 .keywords: PC, set, from, options, database 177 178 .seealso: 179 180 @*/ 181 PetscErrorCode PETSCKSP_DLLEXPORT PCSetFromOptions(PC pc) 182 { 183 PetscErrorCode ierr; 184 char type[256]; 185 const char *def; 186 PetscTruth flg; 187 188 PetscFunctionBegin; 189 PetscValidHeaderSpecific(pc,PC_COOKIE,1); 190 191 if (!PCRegisterAllCalled) {ierr = PCRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 192 ierr = PetscOptionsBegin(pc->comm,pc->prefix,"Preconditioner (PC) Options","PC");CHKERRQ(ierr); 193 if (!pc->type_name) { 194 ierr = PCGetDefaultType_Private(pc,&def);CHKERRQ(ierr); 195 } else { 196 def = pc->type_name; 197 } 198 199 ierr = PetscOptionsList("-pc_type","Preconditioner","PCSetType",PCList,def,type,256,&flg);CHKERRQ(ierr); 200 if (flg) { 201 ierr = PCSetType(pc,type);CHKERRQ(ierr); 202 } else if (!pc->type_name){ 203 ierr = PCSetType(pc,def);CHKERRQ(ierr); 204 } 205 206 if (pc->ops->setfromoptions) { 207 ierr = (*pc->ops->setfromoptions)(pc);CHKERRQ(ierr); 208 } 209 ierr = PetscOptionsEnd();CHKERRQ(ierr); 210 PetscFunctionReturn(0); 211 } 212