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: {
11: PetscErrorCode ierr;
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(&st->sigma,x,y);
25: }
26: return(0);
27: }
31: PetscErrorCode STApplyB_Shift(ST st,Vec x,Vec y)
32: {
33: PetscErrorCode ierr;
36: VecCopy( x, y );
37: return(0);
38: }
42: PetscErrorCode STBackTransform_Shift(ST st,PetscScalar *eigr,PetscScalar *eigi)
43: {
45: if (eigr) *eigr -= st->sigma;
46: return(0);
47: }
51: PetscErrorCode STSetUp_Shift(ST st)
52: {
53: PetscErrorCode ierr;
56: if (st->B) {
57: KSPSetOperators(st->ksp,st->B,st->B,DIFFERENT_NONZERO_PATTERN);
58: KSPSetUp(st->ksp);
59: }
60: return(0);
61: }
66: PetscErrorCode STView_Shift(ST st,PetscViewer viewer)
67: {
68: PetscErrorCode ierr;
71: if (st->B) {
72: STView_Default(st,viewer);
73: }
74: return(0);
75: }
77: EXTERN_C_BEGIN
80: PetscErrorCode STCreate_Shift(ST st)
81: {
83: st->ops->apply = STApply_Shift;
84: st->ops->applyB = STApplyB_Shift;
85: st->ops->applynoB = STApply_Shift;
86: st->ops->backtr = STBackTransform_Shift;
87: st->ops->setup = STSetUp_Shift;
88: st->ops->view = STView_Shift;
89: st->checknullspace = 0;
90: return(0);
91: }
92: EXTERN_C_END