1*f7765cecSBarry Smith #ifndef lint 2*f7765cecSBarry Smith static char vcid[] = "$Id: pcset.c,v 1.30 1995/11/30 22:32:59 bsmith Exp $"; 3*f7765cecSBarry Smith #endif 4*f7765cecSBarry Smith /* 5*f7765cecSBarry Smith Routines to set PC methods and options. 6*f7765cecSBarry Smith */ 7*f7765cecSBarry Smith 8*f7765cecSBarry Smith #include "petsc.h" 9*f7765cecSBarry Smith #include "pcimpl.h" /*I "pc.h" I*/ 10*f7765cecSBarry Smith #include <stdio.h> 11*f7765cecSBarry Smith #include "sys/nreg.h" 12*f7765cecSBarry Smith #include "sys.h" 13*f7765cecSBarry Smith 14*f7765cecSBarry Smith static NRList *__PCList = 0; 15*f7765cecSBarry Smith 16*f7765cecSBarry Smith /*@ 17*f7765cecSBarry Smith PCSetMethod - Builds PC for a particular preconditioner. It is 18*f7765cecSBarry Smith best to use the SLESSetFromOptions() command and 19*f7765cecSBarry Smith set the PC method from the command line rather then 20*f7765cecSBarry Smith by using this routine. 21*f7765cecSBarry Smith 22*f7765cecSBarry Smith Input Parameter: 23*f7765cecSBarry Smith . pc - the preconditioner context. 24*f7765cecSBarry Smith . method - a known method 25*f7765cecSBarry Smith 26*f7765cecSBarry Smith Options Database Command: 27*f7765cecSBarry Smith $ -pc_method <method> 28*f7765cecSBarry Smith $ Use -help for a list of available methods 29*f7765cecSBarry Smith $ (for instance, jacobi or bjacobi) 30*f7765cecSBarry Smith 31*f7765cecSBarry Smith Notes: 32*f7765cecSBarry Smith See "petsc/include/pc.h" for available methods (for instance, 33*f7765cecSBarry Smith PCJACOBI, PCILU, or PCBJACOBI). 34*f7765cecSBarry Smith 35*f7765cecSBarry Smith .keywords: PC, set, method 36*f7765cecSBarry Smith @*/ 37*f7765cecSBarry Smith int PCSetMethod(PC ctx,PCMethod method) 38*f7765cecSBarry Smith { 39*f7765cecSBarry Smith int ierr,(*r)(PC); 40*f7765cecSBarry Smith PETSCVALIDHEADERSPECIFIC(ctx,PC_COOKIE); 41*f7765cecSBarry Smith if (ctx->setupcalled) { 42*f7765cecSBarry Smith if (ctx->destroy) ierr = (*ctx->destroy)((PetscObject)ctx); 43*f7765cecSBarry Smith else {if (ctx->data) PetscFree(ctx->data);} 44*f7765cecSBarry Smith ctx->data = 0; 45*f7765cecSBarry Smith } 46*f7765cecSBarry Smith /* Get the function pointers for the method requested */ 47*f7765cecSBarry Smith if (!__PCList) {PCRegisterAll();} 48*f7765cecSBarry Smith if (!__PCList) {SETERRQ(1,"PCSetMethod:Could not get list of methods");} 49*f7765cecSBarry Smith r = (int (*)(PC))NRFindRoutine( __PCList, (int)method, (char *)0 ); 50*f7765cecSBarry Smith if (!r) {SETERRQ(1,"PCSetMethod:Unknown method");} 51*f7765cecSBarry Smith if (ctx->data) PetscFree(ctx->data); 52*f7765cecSBarry Smith ctx->setfrom = ( int (*)(PC) ) 0; 53*f7765cecSBarry Smith ctx->printhelp = ( int (*)(PC) ) 0; 54*f7765cecSBarry Smith ctx->setup = ( int (*)(PC) ) 0; 55*f7765cecSBarry Smith ctx->destroy = ( int (*)(PetscObject) ) 0; 56*f7765cecSBarry Smith return (*r)(ctx); 57*f7765cecSBarry Smith } 58*f7765cecSBarry Smith 59*f7765cecSBarry Smith /*@C 60*f7765cecSBarry Smith PCRegister - Adds the iterative method to the preconditioner 61*f7765cecSBarry Smith package, given an iterative name (PCMethod) and a function pointer. 62*f7765cecSBarry Smith 63*f7765cecSBarry Smith Input Parameters: 64*f7765cecSBarry Smith . name - for instance PCJACOBI, ... 65*f7765cecSBarry Smith . sname - corresponding string for name 66*f7765cecSBarry Smith . create - routine to create method context 67*f7765cecSBarry Smith 68*f7765cecSBarry Smith .keywords: PC, register 69*f7765cecSBarry Smith 70*f7765cecSBarry Smith .seealso: PCRegisterAll(), PCRegisterDestroy() 71*f7765cecSBarry Smith @*/ 72*f7765cecSBarry Smith int PCRegister(PCMethod name,char *sname,int (*create)(PC)) 73*f7765cecSBarry Smith { 74*f7765cecSBarry Smith int ierr; 75*f7765cecSBarry Smith if (!__PCList) {ierr = NRCreate(&__PCList); CHKERRQ(ierr);} 76*f7765cecSBarry Smith return NRRegister( __PCList, (int) name, sname, (int (*)(void*)) create ); 77*f7765cecSBarry Smith } 78*f7765cecSBarry Smith 79*f7765cecSBarry Smith /*@C 80*f7765cecSBarry Smith PCRegisterDestroy - Frees the list of preconditioners that were 81*f7765cecSBarry Smith registered by PCRegister(). 82*f7765cecSBarry Smith 83*f7765cecSBarry Smith .keywords: PC, register, destroy 84*f7765cecSBarry Smith 85*f7765cecSBarry Smith .seealso: PCRegisterAll(), PCRegisterAll() 86*f7765cecSBarry Smith @*/ 87*f7765cecSBarry Smith int PCRegisterDestroy() 88*f7765cecSBarry Smith { 89*f7765cecSBarry Smith if (__PCList) { 90*f7765cecSBarry Smith NRDestroy( __PCList ); 91*f7765cecSBarry Smith __PCList = 0; 92*f7765cecSBarry Smith } 93*f7765cecSBarry Smith return 0; 94*f7765cecSBarry Smith } 95*f7765cecSBarry Smith 96*f7765cecSBarry Smith /* 97*f7765cecSBarry Smith PCGetMethodFromOptions_Private - Sets the selected PC method from the 98*f7765cecSBarry Smith options database. 99*f7765cecSBarry Smith 100*f7765cecSBarry Smith Input Parameter: 101*f7765cecSBarry Smith . pc - the preconditioner context 102*f7765cecSBarry Smith 103*f7765cecSBarry Smith Output Parameter: 104*f7765cecSBarry Smith . method - PC method 105*f7765cecSBarry Smith 106*f7765cecSBarry Smith Returns: 107*f7765cecSBarry Smith 1 if method is found; otherwise 0. 108*f7765cecSBarry Smith 109*f7765cecSBarry Smith Options Database Key: 110*f7765cecSBarry Smith $ -pc_method method 111*f7765cecSBarry Smith */ 112*f7765cecSBarry Smith int PCGetMethodFromOptions_Private(PC pc,PCMethod *method ) 113*f7765cecSBarry Smith { 114*f7765cecSBarry Smith int ierr; 115*f7765cecSBarry Smith char sbuf[50]; 116*f7765cecSBarry Smith if (OptionsGetString( pc->prefix,"-pc_method", sbuf, 50 )) { 117*f7765cecSBarry Smith if (!__PCList) {ierr = PCRegisterAll(); CHKERRQ(ierr);} 118*f7765cecSBarry Smith *method = (PCMethod)NRFindID( __PCList, sbuf ); 119*f7765cecSBarry Smith return 1; 120*f7765cecSBarry Smith } 121*f7765cecSBarry Smith return 0; 122*f7765cecSBarry Smith } 123*f7765cecSBarry Smith 124*f7765cecSBarry Smith /*@C 125*f7765cecSBarry Smith PCGetMethodName - Gets the PC method name (as a string) from the 126*f7765cecSBarry Smith method type. 127*f7765cecSBarry Smith 128*f7765cecSBarry Smith Input Parameter: 129*f7765cecSBarry Smith . meth - preconditioner method 130*f7765cecSBarry Smith 131*f7765cecSBarry Smith Output Parameter: 132*f7765cecSBarry Smith . name - name of preconditioner 133*f7765cecSBarry Smith 134*f7765cecSBarry Smith .keywords: PC, get, method, name 135*f7765cecSBarry Smith @*/ 136*f7765cecSBarry Smith int PCGetMethodName(PCMethod meth,char **name) 137*f7765cecSBarry Smith { 138*f7765cecSBarry Smith int ierr; 139*f7765cecSBarry Smith if (!__PCList) {ierr = PCRegisterAll(); CHKERRQ(ierr);} 140*f7765cecSBarry Smith *name = NRFindName( __PCList, (int)meth ); 141*f7765cecSBarry Smith return 0; 142*f7765cecSBarry Smith } 143*f7765cecSBarry Smith 144*f7765cecSBarry Smith /* 145*f7765cecSBarry Smith PCPrintMethods_Private - Prints the PC methods available from the options 146*f7765cecSBarry Smith database. 147*f7765cecSBarry Smith 148*f7765cecSBarry Smith Input Parameters: 149*f7765cecSBarry Smith . prefix - prefix (usually "-") 150*f7765cecSBarry Smith . name - the options database name (by default "pc_method") 151*f7765cecSBarry Smith */ 152*f7765cecSBarry Smith int PCPrintMethods_Private(char *prefix,char *name) 153*f7765cecSBarry Smith { 154*f7765cecSBarry Smith FuncList *entry; 155*f7765cecSBarry Smith int ierr; 156*f7765cecSBarry Smith if (!__PCList) {ierr = PCRegisterAll(); CHKERRQ(ierr);} 157*f7765cecSBarry Smith entry = __PCList->head; 158*f7765cecSBarry Smith MPIU_printf(MPI_COMM_WORLD," %s%s (one of)",prefix,name); 159*f7765cecSBarry Smith while (entry) { 160*f7765cecSBarry Smith MPIU_printf(MPI_COMM_WORLD," %s",entry->name); 161*f7765cecSBarry Smith entry = entry->next; 162*f7765cecSBarry Smith } 163*f7765cecSBarry Smith MPIU_printf(MPI_COMM_WORLD,"\n"); 164*f7765cecSBarry Smith return 0; 165*f7765cecSBarry Smith } 166*f7765cecSBarry Smith 167*f7765cecSBarry Smith /*@ 168*f7765cecSBarry Smith PCSetFromOptions - Sets PC options from the options database. 169*f7765cecSBarry Smith This routine must be called before PCSetUp() if the user is to be 170*f7765cecSBarry Smith allowed to set the preconditioner method. 171*f7765cecSBarry Smith 172*f7765cecSBarry Smith Input Parameters: 173*f7765cecSBarry Smith . pc - the preconditioner context 174*f7765cecSBarry Smith 175*f7765cecSBarry Smith .keywords: PC, set, from, options, database 176*f7765cecSBarry Smith 177*f7765cecSBarry Smith .seealso: PCPrintHelp() 178*f7765cecSBarry Smith @*/ 179*f7765cecSBarry Smith int PCSetFromOptions(PC pc) 180*f7765cecSBarry Smith { 181*f7765cecSBarry Smith PCMethod method; 182*f7765cecSBarry Smith PETSCVALIDHEADERSPECIFIC(pc,PC_COOKIE); 183*f7765cecSBarry Smith 184*f7765cecSBarry Smith if (PCGetMethodFromOptions_Private(pc,&method)) { 185*f7765cecSBarry Smith PCSetMethod(pc,method); 186*f7765cecSBarry Smith } 187*f7765cecSBarry Smith if (OptionsHasName(PetscNull,"-help")){ 188*f7765cecSBarry Smith PCPrintHelp(pc); 189*f7765cecSBarry Smith } 190*f7765cecSBarry Smith if (pc->setfrom) return (*pc->setfrom)(pc); 191*f7765cecSBarry Smith return 0; 192*f7765cecSBarry Smith } 193