xref: /petsc/src/ksp/pc/interface/pcset.c (revision 183d698644e4d6bd6287c5dd5b6b9241d448ca24)
1 #define PETSCKSP_DLL
2 /*
3     Routines to set PC methods and options.
4 */
5 
6 #include "private/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   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,PCSide,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 /*@
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   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
157   PetscValidPointer(meth,2);
158   *meth = (PCType) pc->type_name;
159   PetscFunctionReturn(0);
160 }
161 
162 EXTERN PetscErrorCode PCGetDefaultType_Private(PC,const char*[]);
163 
164 #undef __FUNCT__
165 #define __FUNCT__ "PCSetFromOptions"
166 /*@
167    PCSetFromOptions - Sets PC options from the options database.
168    This routine must be called before PCSetUp() if the user is to be
169    allowed to set the preconditioner method.
170 
171    Collective on PC
172 
173    Input Parameter:
174 .  pc - the preconditioner context
175 
176    Level: developer
177 
178 .keywords: PC, set, from, options, database
179 
180 .seealso:
181 
182 @*/
183 PetscErrorCode PETSCKSP_DLLEXPORT PCSetFromOptions(PC pc)
184 {
185   PetscErrorCode ierr;
186   char           type[256];
187   const char     *def;
188   PetscTruth     flg;
189 
190   PetscFunctionBegin;
191   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
192 
193   if (!PCRegisterAllCalled) {ierr = PCRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
194   ierr = PetscOptionsBegin(pc->comm,pc->prefix,"Preconditioner (PC) Options","PC");CHKERRQ(ierr);
195     if (!pc->type_name) {
196       ierr = PCGetDefaultType_Private(pc,&def);CHKERRQ(ierr);
197     } else {
198       def = pc->type_name;
199     }
200 
201     ierr = PetscOptionsList("-pc_type","Preconditioner","PCSetType",PCList,def,type,256,&flg);CHKERRQ(ierr);
202     if (flg) {
203       ierr = PCSetType(pc,type);CHKERRQ(ierr);
204     } else if (!pc->type_name){
205       ierr = PCSetType(pc,def);CHKERRQ(ierr);
206     }
207 
208     if (pc->ops->setfromoptions) {
209       ierr = (*pc->ops->setfromoptions)(pc);CHKERRQ(ierr);
210     }
211   ierr = PetscOptionsEnd();CHKERRQ(ierr);
212   PetscFunctionReturn(0);
213 }
214