| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
| 4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
| 5 | |||
| 6 | This file is part of SLEPc. | ||
| 7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
| 8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 9 | */ | ||
| 10 | /* | ||
| 11 | Shift spectral transformation, applies (A + sigma I) as operator, or | ||
| 12 | inv(B)(A + sigma B) for generalized problems | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <slepc/private/stimpl.h> | ||
| 16 | #include <petsc/private/matimpl.h> /* Mat_MPIDense */ | ||
| 17 | |||
| 18 | /* | ||
| 19 | Special STApply() for the BSE structured matrix | ||
| 20 | |||
| 21 | H = [ R C; -C^H -R^T ]. | ||
| 22 | |||
| 23 | Assumes that H is a MATNEST and x,y are VECNEST. | ||
| 24 | |||
| 25 | Only the upper part of the product y=H*x is computed. | ||
| 26 | |||
| 27 | y1 = R*x1+C*x2 | ||
| 28 | |||
| 29 | The bottom part of the input vector x2 is computed as | ||
| 30 | either conj(x1) or -conj(x1), where the sign is given by | ||
| 31 | s in the context SlepcMatStruct. | ||
| 32 | The bottom part of the output vector y2 is not referenced. | ||
| 33 | */ | ||
| 34 | 75628 | static PetscErrorCode STApply_Shift_BSE(ST st,Vec x,Vec y) | |
| 35 | { | ||
| 36 | 75628 | Mat H,R,C; | |
| 37 | 75628 | Vec x1,x2,y1; | |
| 38 | 75628 | PetscContainer container; | |
| 39 | 75628 | SlepcMatStruct mctx; | |
| 40 | |||
| 41 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
75628 | PetscFunctionBegin; |
| 42 | 75628 | H = st->T[0]; | |
| 43 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
| 44 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
| 45 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(MatNestGetSubMat(H,0,0,&R)); |
| 46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(MatNestGetSubMat(H,0,1,&C)); |
| 47 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(VecNestGetSubVec(x,0,&x1)); |
| 48 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(VecNestGetSubVec(x,1,&x2)); |
| 49 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(VecNestGetSubVec(y,0,&y1)); |
| 50 | |||
| 51 | /* x2 = +/-conj(x1) */ | ||
| 52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(VecCopy(x1,x2)); |
| 53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(VecConjugate(x2)); |
| 54 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
75628 | if (mctx->s==-1.0) PetscCall(VecScale(x2,-1.0)); |
| 55 | |||
| 56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(MatMult(C,x2,y1)); |
| 57 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75628 | PetscCall(MatMultAdd(R,x1,y1,y1)); |
| 58 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
14560 | PetscFunctionReturn(PETSC_SUCCESS); |
| 59 | } | ||
| 60 | |||
| 61 | /* | ||
| 62 | Specialized version that avoids communication for multiplication by R. | ||
| 63 | It needs to access internal data structures of MATMPIDENSE. | ||
| 64 | */ | ||
| 65 | 2910 | static PetscErrorCode STApply_Shift_BSE_Dense(ST st,Vec x,Vec y) | |
| 66 | { | ||
| 67 | 2910 | Mat H,R,C; | |
| 68 | 2910 | Vec x1,x2,y1; | |
| 69 | 2910 | Mat_MPIDense *mdnR,*mdnC; | |
| 70 | 2910 | PetscContainer container; | |
| 71 | 2910 | SlepcMatStruct mctx; | |
| 72 | |||
| 73 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2910 | PetscFunctionBegin; |
| 74 | 2910 | H = st->T[0]; | |
| 75 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container)); |
| 76 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(PetscContainerGetPointer(container,(void**)&mctx)); |
| 77 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(MatNestGetSubMat(H,0,0,&R)); |
| 78 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(MatNestGetSubMat(H,0,1,&C)); |
| 79 | 2910 | mdnR = (Mat_MPIDense*)R->data; | |
| 80 | 2910 | mdnC = (Mat_MPIDense*)C->data; | |
| 81 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecNestGetSubVec(x,0,&x1)); |
| 82 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecNestGetSubVec(x,1,&x2)); |
| 83 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecNestGetSubVec(y,0,&y1)); |
| 84 | |||
| 85 | /* x2 = +/-conj(x1) */ | ||
| 86 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecCopy(x1,x2)); |
| 87 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecConjugate(x2)); |
| 88 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
2910 | if (mctx->s==-1.0) PetscCall(VecScale(x2,-1.0)); |
| 89 | |||
| 90 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(MatMult(C,x2,y1)); |
| 91 | /* PetscCall(MatMultAdd(R,x1,y1,y1)); */ | ||
| 92 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecConjugate(mdnC->lvec)); |
| 93 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
2910 | if (mctx->s==-1.0) PetscCall(VecScale(mdnC->lvec,-1.0)); |
| 94 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(PetscLogEventBegin(MAT_MultAdd,R,mdnC->lvec,y1,y1)); |
| 95 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecLockReadPush(mdnC->lvec)); |
| 96 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall((*mdnR->A->ops->multadd)(mdnR->A,mdnC->lvec,y1,y1)); |
| 97 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(VecLockReadPop(mdnC->lvec)); |
| 98 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
2910 | PetscCall(PetscLogEventEnd(MAT_MultAdd,R,mdnC->lvec,y1,y1)); |
| 99 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
2910 | PetscCall(PetscObjectStateIncrease((PetscObject)y1)); |
| 100 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
2910 | PetscFunctionReturn(PETSC_SUCCESS); |
| 101 | } | ||
| 102 | |||
| 103 | 11270669 | static PetscErrorCode STBackTransform_Shift(ST st,PetscInt n,PetscScalar *eigr,PetscScalar *eigi) | |
| 104 | { | ||
| 105 | 11270669 | PetscInt j; | |
| 106 | |||
| 107 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
11270669 | PetscFunctionBegin; |
| 108 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
33368809 | for (j=0;j<n;j++) { |
| 109 | 22098140 | eigr[j] += st->sigma; | |
| 110 | } | ||
| 111 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
11270669 | PetscFunctionReturn(PETSC_SUCCESS); |
| 112 | } | ||
| 113 | |||
| 114 | 6584 | static PetscErrorCode STPostSolve_Shift(ST st) | |
| 115 | { | ||
| 116 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6584 | PetscFunctionBegin; |
| 117 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6584 | if (st->matmode == ST_MATMODE_INPLACE) { |
| 118 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
35 | if (st->nmat>1) PetscCall(MatAXPY(st->A[0],st->sigma,st->A[1],st->str)); |
| 119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
25 | else PetscCall(MatShift(st->A[0],st->sigma)); |
| 120 | 35 | st->Astate[0] = ((PetscObject)st->A[0])->state; | |
| 121 | 35 | st->state = ST_STATE_INITIAL; | |
| 122 | 35 | st->opready = PETSC_FALSE; | |
| 123 | } | ||
| 124 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1245 | PetscFunctionReturn(PETSC_SUCCESS); |
| 125 | } | ||
| 126 | |||
| 127 | /* | ||
| 128 | Operator (shift): | ||
| 129 | Op P M | ||
| 130 | if nmat=1: A-sI NULL A-sI | ||
| 131 | if nmat=2: B^-1 (A-sB) B A-sB | ||
| 132 | */ | ||
| 133 | 4888 | static PetscErrorCode STComputeOperator_Shift(ST st) | |
| 134 | { | ||
| 135 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4888 | PetscFunctionBegin; |
| 136 | 4888 | st->usesksp = (st->nmat>1)? PETSC_TRUE: PETSC_FALSE; | |
| 137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4888 | PetscCall(PetscObjectReference((PetscObject)st->A[1])); |
| 138 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4888 | PetscCall(MatDestroy(&st->T[1])); |
| 139 | 4888 | st->T[1] = st->A[1]; | |
| 140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4888 | PetscCall(STMatMAXPY_Private(st,-st->sigma,0.0,0,NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[0])); |
| 141 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
4888 | if (st->nmat>1) PetscCall(PetscObjectReference((PetscObject)st->T[1])); |
| 142 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4888 | PetscCall(MatDestroy(&st->P)); |
| 143 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4888 | st->P = (st->nmat>1)? st->T[1]: NULL; |
| 144 | 4888 | st->M = st->T[0]; | |
| 145 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
4888 | if (st->nmat>1 && st->Psplit) { /* build custom preconditioner from the split matrices */ |
| 146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(MatDestroy(&st->Pmat)); |
| 147 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscObjectReference((PetscObject)st->Psplit[1])); |
| 148 | 10 | st->Pmat = st->Psplit[1]; | |
| 149 | } | ||
| 150 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
925 | PetscFunctionReturn(PETSC_SUCCESS); |
| 151 | } | ||
| 152 | |||
| 153 | 5715 | static PetscErrorCode STSetUp_Shift(ST st) | |
| 154 | { | ||
| 155 | 5715 | PetscInt k,nc,nmat=st->nmat; | |
| 156 | 5715 | PetscScalar *coeffs=NULL; | |
| 157 | 5715 | PetscBool denseR,denseC; | |
| 158 | 5715 | Mat H,R,C; | |
| 159 | |||
| 160 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5715 | PetscFunctionBegin; |
| 161 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
5715 | if (nmat>1) PetscCall(STSetWorkVecs(st,1)); |
| 162 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2472 | if (nmat>2) { /* set-up matrices for polynomial eigenproblems */ |
| 163 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
827 | if (st->transform) { |
| 164 | 154 | nc = (nmat*(nmat+1))/2; | |
| 165 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
154 | PetscCall(PetscMalloc1(nc,&coeffs)); |
| 166 | /* Compute coeffs */ | ||
| 167 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
154 | PetscCall(STCoeffs_Monomial(st,coeffs)); |
| 168 | /* T[n] = A_n */ | ||
| 169 | 154 | k = nmat-1; | |
| 170 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
154 | PetscCall(PetscObjectReference((PetscObject)st->A[k])); |
| 171 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
154 | PetscCall(MatDestroy(&st->T[k])); |
| 172 | 154 | st->T[k] = st->A[k]; | |
| 173 |
8/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
|
492 | for (k=0;k<nmat-1;k++) PetscCall(STMatMAXPY_Private(st,nmat>2?st->sigma:-st->sigma,0.0,k,coeffs?coeffs+((nmat-k)*(nmat-k-1))/2:NULL,PetscNot(st->state==ST_STATE_UPDATED),PETSC_FALSE,&st->T[k])); |
| 174 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
154 | PetscCall(PetscFree(coeffs)); |
| 175 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
154 | PetscCall(PetscObjectReference((PetscObject)st->T[nmat-1])); |
| 176 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
154 | PetscCall(MatDestroy(&st->P)); |
| 177 | 154 | st->P = st->T[nmat-1]; | |
| 178 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
154 | if (st->Psplit) { /* build custom preconditioner from the split matrices */ |
| 179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(STMatMAXPY_Private(st,st->sigma,0.0,nmat-1,coeffs?coeffs:NULL,PETSC_TRUE,PETSC_TRUE,&st->Pmat)); |
| 180 | } | ||
| 181 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
154 | PetscCall(ST_KSPSetOperators(st,st->P,st->Pmat?st->Pmat:st->P)); |
| 182 | } else { | ||
| 183 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2852 | for (k=0;k<nmat;k++) { |
| 184 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2179 | PetscCall(PetscObjectReference((PetscObject)st->A[k])); |
| 185 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2179 | PetscCall(MatDestroy(&st->T[k])); |
| 186 | 2179 | st->T[k] = st->A[k]; | |
| 187 | } | ||
| 188 | } | ||
| 189 | } | ||
| 190 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
5715 | if (st->P) PetscCall(KSPSetUp(st->ksp)); |
| 191 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5715 | if (st->structured) { |
| 192 | 256 | H = st->T[0]; | |
| 193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
256 | PetscCall(MatNestGetSubMat(H,0,0,&R)); |
| 194 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
256 | PetscCall(MatNestGetSubMat(H,0,1,&C)); |
| 195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
256 | PetscCall(PetscObjectTypeCompareAny((PetscObject)R,&denseR,MATMPIDENSE,MATMPIDENSECUDA,MATMPIDENSEHIP,"")); |
| 196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
256 | PetscCall(PetscObjectTypeCompareAny((PetscObject)C,&denseC,MATMPIDENSE,MATMPIDENSECUDA,MATMPIDENSEHIP,"")); |
| 197 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
482 | st->ops->apply = (denseR && denseC)? STApply_Shift_BSE_Dense: STApply_Shift_BSE; |
| 198 | } | ||
| 199 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
1084 | PetscFunctionReturn(PETSC_SUCCESS); |
| 200 | } | ||
| 201 | |||
| 202 | 165 | static PetscErrorCode STSetShift_Shift(ST st,PetscScalar newshift) | |
| 203 | { | ||
| 204 | 165 | PetscInt k,nc,nmat=PetscMax(st->nmat,2); | |
| 205 | 165 | PetscScalar *coeffs=NULL; | |
| 206 | |||
| 207 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
165 | PetscFunctionBegin; |
| 208 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
165 | if (st->transform) { |
| 209 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
145 | if (st->matmode == ST_MATMODE_COPY && nmat>2) { |
| 210 | 20 | nc = (nmat*(nmat+1))/2; | |
| 211 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(PetscMalloc1(nc,&coeffs)); |
| 212 | /* Compute coeffs */ | ||
| 213 |
3/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
20 | PetscCall(STCoeffs_Monomial(st,coeffs)); |
| 214 | } | ||
| 215 |
13/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
|
350 | for (k=0;k<nmat-1;k++) PetscCall(STMatMAXPY_Private(st,nmat>2?newshift:-newshift,nmat>2?st->sigma:-st->sigma,k,coeffs?coeffs+((nmat-k)*(nmat-k-1))/2:NULL,PETSC_FALSE,PETSC_FALSE,&st->T[k])); |
| 216 |
9/12✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
145 | if (st->matmode == ST_MATMODE_COPY && nmat>2) PetscCall(PetscFree(coeffs)); |
| 217 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
145 | if (st->nmat<=2) st->M = st->T[0]; |
| 218 | } | ||
| 219 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
33 | PetscFunctionReturn(PETSC_SUCCESS); |
| 220 | } | ||
| 221 | |||
| 222 | /*MC | ||
| 223 | STSHIFT - STSHIFT = "shift" - A shift of origin, where the spectrum is | ||
| 224 | shifted by a constant amount. | ||
| 225 | |||
| 226 | Level: beginner | ||
| 227 | |||
| 228 | Notes: | ||
| 229 | The operator in this `ST` is $B^{-1}A-\sigma I$, where $A$ and $B$ are the | ||
| 230 | matrices set with `STSetMatrices()` and the shift $\sigma$ is given in | ||
| 231 | `STSetShift()`. | ||
| 232 | |||
| 233 | This is the default `ST`. If no shift is given, the default is $\sigma=0$, | ||
| 234 | i.e., no transformation. | ||
| 235 | |||
| 236 | .seealso: [](ch:st), `ST`, `STType`, `STSetType()`, `STSetMatrices()`, `STSetShift()` | ||
| 237 | M*/ | ||
| 238 | |||
| 239 | 6526 | SLEPC_EXTERN PetscErrorCode STCreate_Shift(ST st) | |
| 240 | { | ||
| 241 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6526 | PetscFunctionBegin; |
| 242 | 6526 | st->usesksp = PETSC_TRUE; | |
| 243 | |||
| 244 | 6526 | st->ops->apply = STApply_Generic; | |
| 245 | 6526 | st->ops->applytrans = STApplyTranspose_Generic; | |
| 246 | 6526 | st->ops->applyhermtrans = STApplyHermitianTranspose_Generic; | |
| 247 | 6526 | st->ops->backtransform = STBackTransform_Shift; | |
| 248 | 6526 | st->ops->setshift = STSetShift_Shift; | |
| 249 | 6526 | st->ops->getbilinearform = STGetBilinearForm_Default; | |
| 250 | 6526 | st->ops->setup = STSetUp_Shift; | |
| 251 | 6526 | st->ops->computeoperator = STComputeOperator_Shift; | |
| 252 | 6526 | st->ops->postsolve = STPostSolve_Shift; | |
| 253 | 6526 | st->ops->setdefaultksp = STSetDefaultKSP_Default; | |
| 254 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
6526 | PetscFunctionReturn(PETSC_SUCCESS); |
| 255 | } | ||
| 256 |