Actual source code: mfnsetup.c
1: /*
2: MFN routines related to problem setup.
4: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5: SLEPc - Scalable Library for Eigenvalue Problem Computations
6: Copyright (c) 2002-2013, Universitat Politecnica de Valencia, Spain
8: This file is part of SLEPc.
10: SLEPc is free software: you can redistribute it and/or modify it under the
11: terms of version 3 of the GNU Lesser General Public License as published by
12: the Free Software Foundation.
14: SLEPc is distributed in the hope that it will be useful, but WITHOUT ANY
15: WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16: FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
17: more details.
19: You should have received a copy of the GNU Lesser General Public License
20: along with SLEPc. If not, see <http://www.gnu.org/licenses/>.
21: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
22: */
24: #include <slepc-private/mfnimpl.h> /*I "slepcmfn.h" I*/
25: #include <slepc-private/ipimpl.h>
29: /*@
30: MFNSetUp - Sets up all the internal data structures necessary for the
31: execution of the matrix function solver.
33: Collective on MFN
35: Input Parameter:
36: . mfn - matrix function context
38: Notes:
39: This function need not be called explicitly in most cases, since MFNSolve()
40: calls it. It can be useful when one wants to measure the set-up time
41: separately from the solve time.
43: Level: advanced
45: .seealso: MFNCreate(), MFNSolve(), MFNDestroy()
46: @*/
47: PetscErrorCode MFNSetUp(MFN mfn)
48: {
53: if (mfn->setupcalled) return(0);
54: PetscLogEventBegin(MFN_SetUp,mfn,0,0,0);
56: /* reset the convergence flag from the previous solves */
57: mfn->reason = MFN_CONVERGED_ITERATING;
59: /* Set default solver type (MFNSetFromOptions was not called) */
60: if (!((PetscObject)mfn)->type_name) {
61: MFNSetType(mfn,MFNKRYLOV);
62: }
63: if (!mfn->ip) { MFNGetIP(mfn,&mfn->ip); }
64: if (!((PetscObject)mfn->ip)->type_name) {
65: IPSetType_Default(mfn->ip);
66: }
67: IPSetMatrix(mfn->ip,NULL);
68: if (!mfn->ds) { MFNGetDS(mfn,&mfn->ds); }
69: DSReset(mfn->ds);
70: if (!((PetscObject)mfn->rand)->type_name) {
71: PetscRandomSetFromOptions(mfn->rand);
72: }
74: /* Set problem dimensions */
75: if (!mfn->A) SETERRQ(PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_WRONGSTATE,"MFNSetOperator must be called first");
76: MatGetSize(mfn->A,&mfn->n,NULL);
77: MatGetLocalSize(mfn->A,&mfn->nloc,NULL);
78: VecDestroy(&mfn->t);
79: SlepcMatGetVecsTemplate(mfn->A,&mfn->t,NULL);
80: PetscLogObjectParent(mfn,mfn->t);
82: /* Set default function */
83: if (!mfn->function) {
84: MFNSetFunction(mfn,SLEPC_FUNCTION_EXP);
85: }
87: if (mfn->ncv > mfn->n) mfn->ncv = mfn->n;
89: /* call specific solver setup */
90: (*mfn->ops->setup)(mfn);
92: /* set tolerance if not yet set */
93: if (mfn->tol==PETSC_DEFAULT) mfn->tol = SLEPC_DEFAULT_TOL;
95: PetscLogEventEnd(MFN_SetUp,mfn,0,0,0);
96: mfn->setupcalled = 1;
97: return(0);
98: }
102: /*@
103: MFNSetOperator - Sets the matrix for which the matrix function is to be computed.
105: Collective on MFN and Mat
107: Input Parameters:
108: + mfn - the matrix function context
109: - A - the problem matrix
111: Notes:
112: It must be called after MFNSetUp(). If it is called again after MFNSetUp() then
113: the MFN object is reset.
115: Level: beginner
117: .seealso: MFNSolve(), MFNSetUp(), MFNReset()
118: @*/
119: PetscErrorCode MFNSetOperator(MFN mfn,Mat A)
120: {
122: PetscInt m,n;
129: MatGetSize(A,&m,&n);
130: if (m!=n) SETERRQ(PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_WRONG,"A is a non-square matrix");
131: if (mfn->setupcalled) { MFNReset(mfn); }
132: PetscObjectReference((PetscObject)A);
133: MatDestroy(&mfn->A);
134: mfn->A = A;
135: return(0);
136: }
140: /*@
141: MFNGetOperator - Gets the matrix associated with the MFN object.
143: Collective on MFN and Mat
145: Input Parameter:
146: . mfn - the MFN context
148: Output Parameters:
149: . A - the matrix for which the matrix function is to be computed
151: Level: intermediate
153: .seealso: MFNSolve(), MFNSetOperator()
154: @*/
155: PetscErrorCode MFNGetOperator(MFN mfn,Mat *A)
156: {
160: *A = mfn->A;
161: return(0);
162: }