Actual source code: iguess.c
petsc-3.8.4 2018-03-24
1: #include <petsc/private/kspimpl.h>
3: PetscFunctionList KSPGuessList = 0;
4: static PetscBool KSPGuessRegisterAllCalled;
6: /*
7: KSPGuessRegister - Adds a method for initial guess computation in Krylov subspace solver package.
9: Not Collective
11: Input Parameters:
12: + name_solver - name of a new user-defined solver
13: - routine_create - routine to create method context
15: Notes:
16: KSPGuessRegister() may be called multiple times to add several user-defined solvers.
18: Sample usage:
19: .vb
20: KSPGuessRegister("my_initial_guess",MyInitialGuessCreate);
21: .ve
23: Then, it can be chosen with the procedural interface via
24: $ KSPSetGuessType(ksp,"my_initial_guess")
25: or at runtime via the option
26: $ -ksp_guess_type my_initial_guess
28: Level: advanced
30: .keywords: KSP, register, KSPGuess
32: .seealso: KSPGuess, KSPGuessRegisterAll()
34: @*/
35: PetscErrorCode KSPGuessRegister(const char sname[],PetscErrorCode (*function)(KSPGuess))
36: {
40: PetscFunctionListAdd(&KSPGuessList,sname,function);
41: return(0);
42: }
44: /*
45: KSPGuessRegisterAll - Registers all KSPGuess implementations in the KSP package.
47: Not Collective
49: Level: advanced
51: .keywords: KSPGuess, register, all
53: .seealso: KSPRegisterAll(), KSPInitializePackage()
54: */
55: PetscErrorCode KSPGuessRegisterAll(void)
56: {
60: if (KSPGuessRegisterAllCalled) return(0);
61: KSPGuessRegisterAllCalled = PETSC_TRUE;
62: KSPGuessRegister(KSPGUESSFISCHER,KSPGuessCreate_Fischer);
63: KSPGuessRegister(KSPGUESSPOD,KSPGuessCreate_POD);
64: return(0);
65: }
67: /*@
68: KSPGuessSetFromOptions
69: @*/
70: PetscErrorCode KSPGuessSetFromOptions(KSPGuess guess)
71: {
76: if (guess->ops->setfromoptions) { (*guess->ops->setfromoptions)(guess); }
77: return(0);
78: }
80: /*@
81: KSPGuessDestroy - Destroys KSPGuess context.
83: Collective on KSPGuess
85: Input Parameter:
86: . guess - initial guess object
88: Level: beginner
90: .keywords: KSP, destroy
92: .seealso: KSPGuessCreate(), KSPGuess, KSPGuessType
93: @*/
94: PetscErrorCode KSPGuessDestroy(KSPGuess *guess)
95: {
99: if (!*guess) return(0);
101: if (--((PetscObject)(*guess))->refct > 0) {*guess = 0; return(0);}
102: if ((*guess)->ops->destroy) { (*(*guess)->ops->destroy)(*guess); }
103: PetscHeaderDestroy(guess);
104: return(0);
105: }
107: /*@C
108: KSPGuessView - View the KSPGuess object
110: Logically Collective on KSPGuess
112: Input Parameters:
113: + guess - the initial guess object for the Krylov method
114: - viewer - the viewer object
116: Notes:
118: Level: intermediate
120: .seealso: KSP, KSPGuess, KSPGuessType, KSPGuessRegister(), KSPGuessCreate(), PetscViewer
121: @*/
122: PetscErrorCode KSPGuessView(KSPGuess guess, PetscViewer view)
123: {
125: PetscBool ascii;
129: if (!view) {
130: PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)guess),&view);
131: }
134: PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&ascii);
135: if (ascii) {
136: PetscObjectPrintClassNamePrefixType((PetscObject)guess,view);
137: if (guess->ops->view) {
138: PetscViewerASCIIPushTab(view);
139: (*guess->ops->view)(guess,view);
140: PetscViewerASCIIPopTab(view);
141: }
142: }
143: return(0);
144: }
146: /*@
147: KSPGuessCreate - Creates the default KSPGuess context.
149: Collective on MPI_Comm
151: Input Parameter:
152: . comm - MPI communicator
154: Output Parameter:
155: . guess - location to put the KSPGuess context
157: Notes:
158: The default KSPGuess type is XXX
160: Level: beginner
162: .keywords: KSP, create, context
164: .seealso: KSPSolve(), KSPGuessDestroy(), KSPGuess, KSPGuessType, KSP
165: @*/
166: PetscErrorCode KSPGuessCreate(MPI_Comm comm,KSPGuess *guess)
167: {
168: KSPGuess tguess;
173: *guess = 0;
174: KSPInitializePackage();
175: PetscHeaderCreate(tguess,KSPGUESS_CLASSID,"KSPGuess","Initial guess for Krylov Method","KSPGuess",comm,KSPGuessDestroy,KSPGuessView);
176: *guess = tguess;
177: return(0);
178: }
180: /*@C
181: KSPGuessSetType - Sets the type of a KSPGuess
183: Logically Collective on KSPGuess
185: Input Parameters:
186: + guess - the initial guess object for the Krylov method
187: - type - a known KSPGuess method
189: Options Database Key:
190: . -ksp_guess_type <method> - Sets the method; use -help for a list
191: of available methods
193: Notes:
195: Level: intermediate
197: .seealso: KSP, KSPGuess, KSPGuessType, KSPGuessRegister(), KSPGuessCreate()
199: @*/
200: PetscErrorCode KSPGuessSetType(KSPGuess guess, KSPGuessType type)
201: {
202: PetscErrorCode ierr,(*r)(KSPGuess);
203: PetscBool match;
209: PetscObjectTypeCompare((PetscObject)guess,type,&match);
210: if (match) return(0);
212: PetscFunctionListFind(KSPGuessList,type,&r);
213: if (!r) SETERRQ1(PetscObjectComm((PetscObject)guess),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested KSPGuess type %s",type);
214: if (guess->ops->destroy) {
215: (*guess->ops->destroy)(guess);
216: guess->ops->destroy = NULL;
217: }
218: PetscMemzero(guess->ops,sizeof(struct _KSPGuessOps));
219: PetscObjectChangeTypeName((PetscObject)guess,type);
220: (*r)(guess);
221: return(0);
222: }
224: /*@C
225: KSPGuessGetType - Gets the KSPGuess type as a string from the KSPGuess object.
227: Not Collective
229: Input Parameter:
230: . guess - the initial guess context
232: Output Parameter:
233: . name - name of KSPGuess method
235: Level: intermediate
237: .keywords: KSP, get, method, name
239: .seealso: KSPGuessSetType()
240: @*/
241: PetscErrorCode KSPGuessGetType(KSPGuess guess,KSPGuessType *type)
242: {
246: *type = ((PetscObject)guess)->type_name;
247: return(0);
248: }
250: /*@
251: KSPGuessUpdate - Updates the guess object with the current solution and rhs vector
253: Collective on KSPGuess
255: Input Parameter:
256: + guess - the initial guess context
257: . rhs - the corresponding rhs
258: - sol - the computed solution
260: Level: intermediate
262: .keywords: KSP, get, method, name
264: .seealso: KSPGuessCreate(), KSPGuess
265: @*/
266: PetscErrorCode KSPGuessUpdate(KSPGuess guess, Vec rhs, Vec sol)
267: {
274: if (guess->ops->update) { (*guess->ops->update)(guess,rhs,sol); }
275: return(0);
276: }
278: /*@
279: KSPGuessFormGuess - Form the initial guess
281: Collective on KSPGuess
283: Input Parameter:
284: + guess - the initial guess context
285: . rhs - the current rhs vector
286: - sol - the initial guess vector
288: Level: intermediate
290: .keywords: KSP, get, method, name
292: .seealso: KSPGuessCreate(), KSPGuess
293: @*/
294: PetscErrorCode KSPGuessFormGuess(KSPGuess guess, Vec rhs, Vec sol)
295: {
302: if (guess->ops->formguess) { (*guess->ops->formguess)(guess,rhs,sol); }
303: return(0);
304: }
306: /*@
307: KSPGuessSetUp - Setup the initial guess object
309: Collective on KSPGuess
311: Input Parameter:
312: - guess - the initial guess context
314: Level: intermediate
316: .keywords: KSP, get, method, name
318: .seealso: KSPGuessCreate(), KSPGuess
319: @*/
320: PetscErrorCode KSPGuessSetUp(KSPGuess guess)
321: {
322: PetscErrorCode ierr;
323: PetscObjectState omatstate = -1, matstate;
324: PetscInt oM = 0, oN = 0, M, N;
328: if (guess->A) {
329: PetscObjectStateGet((PetscObject)guess->A,&omatstate);
330: MatGetSize(guess->A,&oM,&oN);
331: }
332: KSPGetOperators(guess->ksp,&guess->A,NULL);
333: MatGetSize(guess->A,&M,&N);
334: PetscObjectStateGet((PetscObject)guess->A,&matstate);
335: if (omatstate != matstate || M != oM || N != oN) {
336: PetscInfo6(guess,"Resetting KSPGuess since mat state or sizes have changed (%D != %D, %D != %D, %D != %D)\n",omatstate,matstate,oM,M,oN,N);
337: if (guess->ops->reset) { (*guess->ops->reset)(guess); }
338: } else {
339: PetscInfo(guess,"KSPGuess status unchanged\n");
340: }
341: if (guess->ops->setup) { (*guess->ops->setup)(guess); }
342: return(0);
343: }