Actual source code: shift.c
1: /*
2: Shift spectral transformation, applies (A + sigma I) as operator, or
3: inv(B)(A + sigma B) for generalized problems
4: */
5: #include src/st/stimpl.h
9: PetscErrorCode STApply_Shift(ST st,Vec x,Vec y)
10: {
14: if (st->B) {
15: /* generalized eigenproblem: y = (B^-1 A + sI) x */
16: MatMult(st->A,x,st->w);
17: STAssociatedKSPSolve(st,st->w,y);
18: }
19: else {
20: /* standard eigenproblem: y = (A + sI) x */
21: MatMult(st->A,x,y);
22: }
23: if (st->sigma != 0.0) {
24: VecAXPY(y,st->sigma,x);
25: }
26: return(0);
27: }
31: PetscErrorCode STApplyTranspose_Shift(ST st,Vec x,Vec y)
32: {
36: if (st->B) {
37: /* generalized eigenproblem: y = (A^T B^-T + sI) x */
38: STAssociatedKSPSolveTranspose(st,x,st->w);
39: MatMultTranspose(st->A,st->w,y);
40: }
41: else {
42: /* standard eigenproblem: y = (A^T + sI) x */
43: MatMultTranspose(st->A,x,y);
44: }
45: if (st->sigma != 0.0) {
46: VecAXPY(y,st->sigma,x);
47: }
48: return(0);
49: }
53: PetscErrorCode STApplyB_Shift(ST st,Vec x,Vec y)
54: {
58: VecCopy( x, y );
59: return(0);
60: }
64: PetscErrorCode STBackTransform_Shift(ST st,PetscScalar *eigr,PetscScalar *eigi)
65: {
67: if (eigr) *eigr -= st->sigma;
68: return(0);
69: }
73: PetscErrorCode STSetUp_Shift(ST st)
74: {
78: if (st->B) {
79: KSPSetOperators(st->ksp,st->B,st->B,DIFFERENT_NONZERO_PATTERN);
80: KSPSetUp(st->ksp);
81: }
82: return(0);
83: }
87: PetscErrorCode STView_Shift(ST st,PetscViewer viewer)
88: {
92: if (st->B) {
93: STView_Default(st,viewer);
94: }
95: return(0);
96: }
101: PetscErrorCode STCreate_Shift(ST st)
102: {
104: st->ops->apply = STApply_Shift;
105: st->ops->applyB = STApplyB_Shift;
106: st->ops->applynoB = STApply_Shift;
107: st->ops->applytrans = STApplyTranspose_Shift;
108: st->ops->backtr = STBackTransform_Shift;
109: st->ops->setup = STSetUp_Shift;
110: st->ops->view = STView_Shift;
111: st->checknullspace = 0;
112: return(0);
113: }