xref: /petsc/src/mat/interface/matnull.c (revision f7765cec48af37dbfe327d22e68b1bee19f0dfa2)
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