xref: /petsc/src/ksp/pc/interface/pcset.c (revision e5c89e4ece6e3231999e6896bd6dacaf81d4b32f)
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