Actual source code: ipform.c
1: /*
2: Routines for setting the matrix representation of the inner product.
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/ipimpl.h> /*I "slepcip.h" I*/
28: /*@
29: IPSetMatrix - Specifies the matrix representation of the inner product.
31: Collective on IP
33: Input Parameters:
34: + ip - the inner product context
35: - mat - the matrix (may be NULL)
37: Notes:
38: A NULL has the same effect as if the identity matrix was passed.
40: This function is called by EPSSetProblemType() and usually need not be
41: called by the user.
43: Level: developer
45: .seealso: IPGetMatrix(), IPInnerProduct(), IPNorm(), EPSSetProblemType()
46: @*/
47: PetscErrorCode IPSetMatrix(IP ip,Mat mat)
48: {
53: if (mat) {
55: PetscObjectReference((PetscObject)mat);
56: }
57: IPReset(ip);
58: ip->matrix = mat;
59: if (mat) {
60: MatGetVecs(mat,&ip->Bx,NULL);
61: PetscLogObjectParent(ip,ip->Bx);
62: }
63: return(0);
64: }
68: /*@C
69: IPGetMatrix - Retrieves the matrix representation of the inner product.
71: Not collective, though a parallel Mat may be returned
73: Input Parameter:
74: . ip - the inner product context
76: Output Parameter:
77: . mat - the matrix of the inner product (may be NULL)
79: Level: developer
81: .seealso: IPSetMatrix(), IPInnerProduct(), IPNorm(), EPSSetProblemType()
82: @*/
83: PetscErrorCode IPGetMatrix(IP ip,Mat* mat)
84: {
88: *mat = ip->matrix;
89: return(0);
90: }
94: PetscErrorCode IPApplyMatrix_Private(IP ip,Vec x)
95: {
99: if (((PetscObject)x)->id != ip->xid || ((PetscObject)x)->state != ip->xstate) {
100: PetscLogEventBegin(IP_ApplyMatrix,ip,0,0,0);
101: MatMult(ip->matrix,x,ip->Bx);
102: ip->xid = ((PetscObject)x)->id;
103: ip->xstate = ((PetscObject)x)->state;
104: PetscLogEventEnd(IP_ApplyMatrix,ip,0,0,0);
105: }
106: return(0);
107: }
111: /*@
112: IPApplyMatrix - Multiplies a vector by the matrix representing the IP.
114: Neighbor-wise Collective on IP and Vec
116: Input Parameters:
117: + ip - the inner product context
118: - x - the vector
120: Output Parameter:
121: . y - the result
123: Note:
124: If no matrix was specified this function copies the vector.
126: Level: developer
128: .seealso: IPSetMatrix(), IPInnerProduct(), IPNorm(), EPSSetProblemType()
129: @*/
130: PetscErrorCode IPApplyMatrix(IP ip,Vec x,Vec y)
131: {
136: if (ip->matrix) {
137: IPApplyMatrix_Private(ip,x);
138: VecCopy(ip->Bx,y);
139: } else {
140: VecCopy(x,y);
141: }
142: return(0);
143: }