| 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 | SLEPc singular value solver: "cross" | ||
| 12 | |||
| 13 | Method: Uses a Hermitian eigensolver for A^T*A | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/ | ||
| 17 | |||
| 18 | typedef struct { | ||
| 19 | PetscBool explicitmatrix; | ||
| 20 | EPS eps; | ||
| 21 | PetscBool usereps; | ||
| 22 | Mat C,D; | ||
| 23 | } SVD_CROSS; | ||
| 24 | |||
| 25 | typedef struct { | ||
| 26 | Mat A,AT; | ||
| 27 | Vec w,diag,omega; | ||
| 28 | PetscBool swapped; | ||
| 29 | } SVD_CROSS_SHELL; | ||
| 30 | |||
| 31 | 213744 | static PetscErrorCode MatMult_Cross(Mat B,Vec x,Vec y) | |
| 32 | { | ||
| 33 | 213744 | SVD_CROSS_SHELL *ctx; | |
| 34 | |||
| 35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
213744 | PetscFunctionBegin; |
| 36 |
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.
|
213744 | PetscCall(MatShellGetContext(B,&ctx)); |
| 37 |
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.
|
213744 | PetscCall(MatMult(ctx->A,x,ctx->w)); |
| 38 |
8/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
213744 | if (ctx->omega && !ctx->swapped) PetscCall(VecPointwiseMult(ctx->w,ctx->w,ctx->omega)); |
| 39 |
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.
|
213744 | PetscCall(MatMult(ctx->AT,ctx->w,y)); |
| 40 |
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.
|
39489 | PetscFunctionReturn(PETSC_SUCCESS); |
| 41 | } | ||
| 42 | |||
| 43 | 97 | static PetscErrorCode MatGetDiagonal_Cross(Mat B,Vec d) | |
| 44 | { | ||
| 45 | 97 | SVD_CROSS_SHELL *ctx; | |
| 46 | 97 | PetscMPIInt len; | |
| 47 | 97 | PetscInt N,n,i,j,start,end,ncols; | |
| 48 | 97 | PetscScalar *work1,*work2,*diag; | |
| 49 | 97 | const PetscInt *cols; | |
| 50 | 97 | const PetscScalar *vals; | |
| 51 | |||
| 52 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
97 | PetscFunctionBegin; |
| 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.
|
97 | PetscCall(MatShellGetContext(B,&ctx)); |
| 54 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
97 | if (!ctx->diag) { |
| 55 | /* compute diagonal from rows and store in ctx->diag */ | ||
| 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.
|
97 | PetscCall(VecDuplicate(d,&ctx->diag)); |
| 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.
|
97 | PetscCall(MatGetSize(ctx->A,NULL,&N)); |
| 58 |
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.
|
97 | PetscCall(MatGetLocalSize(ctx->A,NULL,&n)); |
| 59 |
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.
|
97 | PetscCall(PetscCalloc2(N,&work1,N,&work2)); |
| 60 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
97 | if (ctx->swapped) { |
| 61 |
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.
|
24 | PetscCall(MatGetOwnershipRange(ctx->AT,&start,&end)); |
| 62 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
504 | for (i=start;i<end;i++) { |
| 63 |
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.
|
480 | PetscCall(MatGetRow(ctx->AT,i,&ncols,NULL,&vals)); |
| 64 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1440 | for (j=0;j<ncols;j++) work1[i] += vals[j]*vals[j]; |
| 65 |
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.
|
480 | PetscCall(MatRestoreRow(ctx->AT,i,&ncols,NULL,&vals)); |
| 66 | } | ||
| 67 | } else { | ||
| 68 |
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.
|
73 | PetscCall(MatGetOwnershipRange(ctx->A,&start,&end)); |
| 69 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2551 | for (i=start;i<end;i++) { |
| 70 |
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.
|
2478 | PetscCall(MatGetRow(ctx->A,i,&ncols,&cols,&vals)); |
| 71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16588 | for (j=0;j<ncols;j++) work1[cols[j]] += vals[j]*vals[j]; |
| 72 |
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.
|
2478 | PetscCall(MatRestoreRow(ctx->A,i,&ncols,&cols,&vals)); |
| 73 | } | ||
| 74 | } | ||
| 75 |
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.
|
97 | PetscCall(PetscMPIIntCast(N,&len)); |
| 76 |
28/58✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
|
97 | PetscCallMPI(MPIU_Allreduce(work1,work2,len,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)B))); |
| 77 |
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.
|
97 | PetscCall(VecGetOwnershipRange(ctx->diag,&start,&end)); |
| 78 |
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.
|
97 | PetscCall(VecGetArrayWrite(ctx->diag,&diag)); |
| 79 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2887 | for (i=start;i<end;i++) diag[i-start] = work2[i]; |
| 80 |
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.
|
97 | PetscCall(VecRestoreArrayWrite(ctx->diag,&diag)); |
| 81 |
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.
|
97 | PetscCall(PetscFree2(work1,work2)); |
| 82 | } | ||
| 83 |
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.
|
97 | PetscCall(VecCopy(ctx->diag,d)); |
| 84 |
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.
|
17 | PetscFunctionReturn(PETSC_SUCCESS); |
| 85 | } | ||
| 86 | |||
| 87 | 481 | static PetscErrorCode MatDestroy_Cross(Mat B) | |
| 88 | { | ||
| 89 | 481 | SVD_CROSS_SHELL *ctx; | |
| 90 | |||
| 91 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
481 | PetscFunctionBegin; |
| 92 |
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.
|
481 | PetscCall(MatShellGetContext(B,&ctx)); |
| 93 |
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.
|
481 | PetscCall(VecDestroy(&ctx->w)); |
| 94 |
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.
|
481 | PetscCall(VecDestroy(&ctx->diag)); |
| 95 |
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.
|
481 | PetscCall(PetscFree(ctx)); |
| 96 |
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.
|
93 | PetscFunctionReturn(PETSC_SUCCESS); |
| 97 | } | ||
| 98 | |||
| 99 | 742 | static PetscErrorCode SVDCrossGetProductMat(SVD svd,Mat A,Mat AT,Mat *C) | |
| 100 | { | ||
| 101 | 742 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 102 | 742 | SVD_CROSS_SHELL *ctx; | |
| 103 | 742 | PetscInt n; | |
| 104 | 742 | VecType vtype; | |
| 105 | 742 | Mat B; | |
| 106 | |||
| 107 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
742 | PetscFunctionBegin; |
| 108 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
742 | if (cross->explicitmatrix) { |
| 109 |
8/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 5 times.
|
505 | if (!svd->ishyperbolic || svd->swapped) B = (!svd->expltrans && svd->swapped)? AT: A; |
| 110 | else { /* duplicate A and scale by signature */ | ||
| 111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9 | PetscCall(MatDuplicate(A,MAT_COPY_VALUES,&B)); |
| 112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
9 | PetscCall(MatDiagonalScale(B,svd->omega,NULL)); |
| 113 | } | ||
| 114 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
261 | if (svd->expltrans) { /* explicit transpose */ |
| 115 |
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.
|
245 | PetscCall(MatProductCreate(AT,B,NULL,C)); |
| 116 |
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.
|
245 | PetscCall(MatProductSetType(*C,MATPRODUCT_AB)); |
| 117 | } else { /* implicit transpose */ | ||
| 118 | #if defined(PETSC_USE_COMPLEX) | ||
| 119 | ✗ | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Must use explicit transpose with complex scalars"); | |
| 120 | #else | ||
| 121 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
16 | if (!svd->swapped) { |
| 122 |
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.
|
8 | PetscCall(MatProductCreate(A,B,NULL,C)); |
| 123 |
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.
|
8 | PetscCall(MatProductSetType(*C,MATPRODUCT_AtB)); |
| 124 | } else { | ||
| 125 |
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.
|
8 | PetscCall(MatProductCreate(B,AT,NULL,C)); |
| 126 |
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.
|
8 | PetscCall(MatProductSetType(*C,MATPRODUCT_ABt)); |
| 127 | } | ||
| 128 | #endif | ||
| 129 | } | ||
| 130 |
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.
|
261 | PetscCall(MatProductSetFromOptions(*C)); |
| 131 |
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.
|
261 | PetscCall(MatProductSymbolic(*C)); |
| 132 |
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.
|
261 | PetscCall(MatProductNumeric(*C)); |
| 133 |
8/10✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
261 | if (svd->ishyperbolic && !svd->swapped) PetscCall(MatDestroy(&B)); |
| 134 | } else { | ||
| 135 |
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.
|
481 | PetscCall(PetscNew(&ctx)); |
| 136 | 481 | ctx->A = A; | |
| 137 | 481 | ctx->AT = AT; | |
| 138 | 481 | ctx->omega = svd->omega; | |
| 139 | 481 | ctx->swapped = svd->swapped; | |
| 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.
|
481 | PetscCall(MatCreateVecs(A,NULL,&ctx->w)); |
| 141 |
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.
|
481 | PetscCall(MatGetLocalSize(A,NULL,&n)); |
| 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.
|
481 | PetscCall(MatCreateShell(PetscObjectComm((PetscObject)svd),n,n,PETSC_DETERMINE,PETSC_DETERMINE,(void*)ctx,C)); |
| 143 |
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.
|
481 | PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Cross)); |
| 144 |
8/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
481 | if (!svd->ishyperbolic || svd->swapped) PetscCall(MatShellSetOperation(*C,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_Cross)); |
| 145 |
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.
|
481 | PetscCall(MatShellSetOperation(*C,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_Cross)); |
| 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.
|
481 | PetscCall(MatGetVecType(A,&vtype)); |
| 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.
|
481 | PetscCall(MatSetVecType(*C,vtype)); |
| 148 | } | ||
| 149 |
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.
|
146 | PetscFunctionReturn(PETSC_SUCCESS); |
| 150 | } | ||
| 151 | |||
| 152 | /* Convergence test relative to the norm of R (used in GSVD only) */ | ||
| 153 | 3308 | static PetscErrorCode EPSConv_Cross(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 154 | { | ||
| 155 | 3308 | SVD svd = (SVD)ctx; | |
| 156 | |||
| 157 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3308 | PetscFunctionBegin; |
| 158 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3308 | *errest = res/PetscMax(svd->nrma,svd->nrmb); |
| 159 |
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.
|
3308 | PetscFunctionReturn(PETSC_SUCCESS); |
| 160 | } | ||
| 161 | |||
| 162 | 585 | static PetscErrorCode SVDSetUp_Cross(SVD svd) | |
| 163 | { | ||
| 164 | 585 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 165 | 585 | ST st; | |
| 166 | 585 | PetscBool trackall,issinv,isks; | |
| 167 | 585 | EPSProblemType ptype; | |
| 168 | 585 | EPSWhich which; | |
| 169 | 585 | Mat Omega; | |
| 170 | 585 | MatType Atype; | |
| 171 | 585 | PetscInt n,N; | |
| 172 | |||
| 173 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
585 | PetscFunctionBegin; |
| 174 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
|
585 | if (svd->nsv==0 && svd->stop!=SVD_STOP_THRESHOLD) svd->nsv = 1; |
| 175 |
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.
|
585 | if (!cross->eps) PetscCall(SVDCrossGetEPS(svd,&cross->eps)); |
| 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.
|
585 | PetscCall(MatDestroy(&cross->C)); |
| 177 |
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.
|
585 | PetscCall(MatDestroy(&cross->D)); |
| 178 |
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.
|
585 | PetscCall(SVDCrossGetProductMat(svd,svd->A,svd->AT,&cross->C)); |
| 179 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
585 | if (svd->isgeneralized) { |
| 180 |
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.
|
157 | PetscCall(SVDCrossGetProductMat(svd,svd->B,svd->BT,&cross->D)); |
| 181 |
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.
|
157 | PetscCall(EPSSetOperators(cross->eps,cross->C,cross->D)); |
| 182 |
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.
|
157 | PetscCall(EPSGetProblemType(cross->eps,&ptype)); |
| 183 |
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.
|
157 | if (!ptype) PetscCall(EPSSetProblemType(cross->eps,EPS_GHEP)); |
| 184 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 10 times.
|
428 | } else if (svd->ishyperbolic && svd->swapped) { |
| 185 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatGetType(svd->OP,&Atype)); |
| 186 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatGetSize(svd->A,NULL,&N)); |
| 187 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatGetLocalSize(svd->A,NULL,&n)); |
| 188 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatCreate(PetscObjectComm((PetscObject)svd),&Omega)); |
| 189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatSetSizes(Omega,n,n,N,N)); |
| 190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatSetType(Omega,Atype)); |
| 191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatDiagonalSet(Omega,svd->omega,INSERT_VALUES)); |
| 192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(EPSSetOperators(cross->eps,cross->C,Omega)); |
| 193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(EPSSetProblemType(cross->eps,EPS_GHIEP)); |
| 194 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatDestroy(&Omega)); |
| 195 | } else { | ||
| 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.
|
410 | PetscCall(EPSSetOperators(cross->eps,cross->C,NULL)); |
| 197 |
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.
|
410 | PetscCall(EPSSetProblemType(cross->eps,EPS_HEP)); |
| 198 | } | ||
| 199 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
585 | if (!cross->usereps) { |
| 200 |
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.
|
561 | PetscCall(EPSGetST(cross->eps,&st)); |
| 201 |
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.
|
561 | PetscCall(PetscObjectTypeCompare((PetscObject)st,STSINVERT,&issinv)); |
| 202 |
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.
|
561 | PetscCall(PetscObjectTypeCompare((PetscObject)cross->eps,EPSKRYLOVSCHUR,&isks)); |
| 203 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
561 | if (svd->isgeneralized && svd->which==SVD_SMALLEST) { |
| 204 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
35 | if (cross->explicitmatrix && isks && !issinv) { /* default to shift-and-invert */ |
| 205 |
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(STSetType(st,STSINVERT)); |
| 206 |
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(EPSSetTarget(cross->eps,0.0)); |
| 207 | which = EPS_TARGET_REAL; | ||
| 208 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
15 | } else which = issinv?EPS_TARGET_REAL:EPS_SMALLEST_REAL; |
| 209 | } else { | ||
| 210 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
526 | if (issinv) which = EPS_TARGET_MAGNITUDE; |
| 211 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 10 times.
|
521 | else if (svd->ishyperbolic) which = svd->which==SVD_LARGEST?EPS_LARGEST_MAGNITUDE:EPS_SMALLEST_MAGNITUDE; |
| 212 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
442 | else which = svd->which==SVD_LARGEST?EPS_LARGEST_MAGNITUDE:EPS_SMALLEST_MAGNITUDE; |
| 213 | } | ||
| 214 |
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.
|
561 | PetscCall(EPSSetWhichEigenpairs(cross->eps,which)); |
| 215 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 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.
|
1090 | PetscCall(EPSSetDimensions(cross->eps,svd->nsv?svd->nsv:PETSC_CURRENT,svd->ncv,svd->mpd)); |
| 216 |
6/8✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
561 | if (svd->stop==SVD_STOP_THRESHOLD) PetscCall(EPSSetThreshold(cross->eps,svd->thres*svd->thres,svd->threlative)); |
| 217 |
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.
|
743 | PetscCall(EPSSetTolerances(cross->eps,svd->tol==(PetscReal)PETSC_DETERMINE?SLEPC_DEFAULT_TOL/10.0:svd->tol,svd->max_it)); |
| 218 |
3/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
561 | switch (svd->conv) { |
| 219 | 35 | case SVD_CONV_ABS: | |
| 220 |
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.
|
35 | PetscCall(EPSSetConvergenceTest(cross->eps,EPS_CONV_ABS));break; |
| 221 | 369 | case SVD_CONV_REL: | |
| 222 |
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.
|
369 | PetscCall(EPSSetConvergenceTest(cross->eps,EPS_CONV_REL));break; |
| 223 | 157 | case SVD_CONV_NORM: | |
| 224 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
157 | if (svd->isgeneralized) { |
| 225 |
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.
|
157 | if (!svd->nrma) PetscCall(MatNorm(svd->OP,NORM_INFINITY,&svd->nrma)); |
| 226 |
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.
|
157 | if (!svd->nrmb) PetscCall(MatNorm(svd->OPb,NORM_INFINITY,&svd->nrmb)); |
| 227 |
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.
|
157 | PetscCall(EPSSetConvergenceTestFunction(cross->eps,EPSConv_Cross,svd,NULL)); |
| 228 | } else { | ||
| 229 | ✗ | PetscCall(EPSSetConvergenceTest(cross->eps,EPS_CONV_NORM));break; | |
| 230 | } | ||
| 231 | break; | ||
| 232 | ✗ | case SVD_CONV_MAXIT: | |
| 233 | ✗ | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Maxit convergence test not supported in this solver"); | |
| 234 | ✗ | case SVD_CONV_USER: | |
| 235 | ✗ | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"User-defined convergence test not supported in this solver"); | |
| 236 | } | ||
| 237 | 4 | } | |
| 238 | /* Transfer the trackall option from svd to eps */ | ||
| 239 |
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.
|
585 | PetscCall(SVDGetTrackAll(svd,&trackall)); |
| 240 |
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.
|
585 | PetscCall(EPSSetTrackAll(cross->eps,trackall)); |
| 241 | /* Transfer the initial space from svd to eps */ | ||
| 242 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
585 | if (svd->nini<0) { |
| 243 |
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.
|
57 | PetscCall(EPSSetInitialSpace(cross->eps,-svd->nini,svd->IS)); |
| 244 |
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.
|
57 | PetscCall(SlepcBasisDestroy_Private(&svd->nini,&svd->IS)); |
| 245 | } | ||
| 246 |
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.
|
585 | PetscCall(EPSSetUp(cross->eps)); |
| 247 |
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.
|
585 | PetscCall(EPSGetDimensions(cross->eps,NULL,&svd->ncv,&svd->mpd)); |
| 248 |
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.
|
585 | PetscCall(EPSGetTolerances(cross->eps,NULL,&svd->max_it)); |
| 249 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
585 | if (svd->tol==(PetscReal)PETSC_DETERMINE) svd->tol = SLEPC_DEFAULT_TOL; |
| 250 | |||
| 251 | 585 | svd->leftbasis = PETSC_FALSE; | |
| 252 |
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.
|
585 | PetscCall(SVDAllocateSolution(svd,0)); |
| 253 |
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.
|
117 | PetscFunctionReturn(PETSC_SUCCESS); |
| 254 | } | ||
| 255 | |||
| 256 | 585 | static PetscErrorCode SVDSolve_Cross(SVD svd) | |
| 257 | { | ||
| 258 | 585 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 259 | 585 | PetscInt i; | |
| 260 | 585 | PetscScalar lambda; | |
| 261 | 585 | PetscReal sigma; | |
| 262 | |||
| 263 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
585 | PetscFunctionBegin; |
| 264 |
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.
|
585 | PetscCall(EPSSolve(cross->eps)); |
| 265 |
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.
|
585 | PetscCall(EPSGetConverged(cross->eps,&svd->nconv)); |
| 266 |
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.
|
585 | PetscCall(EPSGetIterationNumber(cross->eps,&svd->its)); |
| 267 |
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.
|
585 | PetscCall(EPSGetConvergedReason(cross->eps,(EPSConvergedReason*)&svd->reason)); |
| 268 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6849 | for (i=0;i<svd->nconv;i++) { |
| 269 |
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.
|
6264 | PetscCall(EPSGetEigenvalue(cross->eps,i,&lambda,NULL)); |
| 270 | 6264 | sigma = PetscRealPart(lambda); | |
| 271 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6264 | if (svd->ishyperbolic) svd->sigma[i] = PetscSqrtReal(PetscAbsReal(sigma)); |
| 272 | else { | ||
| 273 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3932 | PetscCheck(sigma>-10*PETSC_MACHINE_EPSILON,PetscObjectComm((PetscObject)svd),PETSC_ERR_FP,"Negative eigenvalue computed by EPS: %g",(double)sigma); |
| 274 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3932 | if (sigma<0.0) { |
| 275 |
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.
|
30 | PetscCall(PetscInfo(svd,"Negative eigenvalue computed by EPS: %g, resetting to 0\n",(double)sigma)); |
| 276 | sigma = 0.0; | ||
| 277 | } | ||
| 278 | 3932 | svd->sigma[i] = PetscSqrtReal(sigma); | |
| 279 | } | ||
| 280 | } | ||
| 281 |
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.
|
117 | PetscFunctionReturn(PETSC_SUCCESS); |
| 282 | } | ||
| 283 | |||
| 284 | 525 | static PetscErrorCode SVDComputeVectors_Cross(SVD svd) | |
| 285 | { | ||
| 286 | 525 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 287 | 525 | PetscInt i,mloc,ploc; | |
| 288 | 525 | Vec u,v,x,uv,w,omega2=NULL; | |
| 289 | 525 | Mat Omega; | |
| 290 | 525 | PetscScalar *dst,alpha,lambda,*varray; | |
| 291 | 525 | const PetscScalar *src; | |
| 292 | 525 | PetscReal nrm; | |
| 293 | |||
| 294 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
525 | PetscFunctionBegin; |
| 295 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
525 | if (svd->isgeneralized) { |
| 296 |
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.
|
157 | PetscCall(MatCreateVecs(svd->A,NULL,&u)); |
| 297 |
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.
|
157 | PetscCall(VecGetLocalSize(u,&mloc)); |
| 298 |
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.
|
157 | PetscCall(MatCreateVecs(svd->B,NULL,&v)); |
| 299 |
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.
|
157 | PetscCall(VecGetLocalSize(v,&ploc)); |
| 300 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1570 | for (i=0;i<svd->nconv;i++) { |
| 301 |
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.
|
1413 | PetscCall(BVGetColumn(svd->V,i,&x)); |
| 302 |
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.
|
1413 | PetscCall(EPSGetEigenpair(cross->eps,i,&lambda,NULL,x,NULL)); |
| 303 |
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.
|
1413 | PetscCall(MatMult(svd->A,x,u)); /* u_i*c_i/alpha = A*x_i */ |
| 304 |
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.
|
1413 | PetscCall(VecNormalize(u,NULL)); |
| 305 |
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.
|
1413 | PetscCall(MatMult(svd->B,x,v)); /* v_i*s_i/alpha = B*x_i */ |
| 306 |
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.
|
1413 | PetscCall(VecNormalize(v,&nrm)); /* ||v||_2 = s_i/alpha */ |
| 307 | 1413 | alpha = 1.0/(PetscSqrtReal(1.0+PetscRealPart(lambda))*nrm); /* alpha=s_i/||v||_2 */ | |
| 308 |
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.
|
1413 | PetscCall(VecScale(x,alpha)); |
| 309 |
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.
|
1413 | PetscCall(BVRestoreColumn(svd->V,i,&x)); |
| 310 | /* copy [u;v] to U[i] */ | ||
| 311 |
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.
|
1413 | PetscCall(BVGetColumn(svd->U,i,&uv)); |
| 312 |
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.
|
1413 | PetscCall(VecGetArrayWrite(uv,&dst)); |
| 313 |
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.
|
1413 | PetscCall(VecGetArrayRead(u,&src)); |
| 314 |
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.
|
1413 | PetscCall(PetscArraycpy(dst,src,mloc)); |
| 315 |
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.
|
1413 | PetscCall(VecRestoreArrayRead(u,&src)); |
| 316 |
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.
|
1413 | PetscCall(VecGetArrayRead(v,&src)); |
| 317 |
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.
|
1413 | PetscCall(PetscArraycpy(dst+mloc,src,ploc)); |
| 318 |
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.
|
1413 | PetscCall(VecRestoreArrayRead(v,&src)); |
| 319 |
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.
|
1413 | PetscCall(VecRestoreArrayWrite(uv,&dst)); |
| 320 |
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.
|
1413 | PetscCall(BVRestoreColumn(svd->U,i,&uv)); |
| 321 | } | ||
| 322 |
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.
|
157 | PetscCall(VecDestroy(&v)); |
| 323 |
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.
|
157 | PetscCall(VecDestroy(&u)); |
| 324 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 6 times.
|
368 | } else if (svd->ishyperbolic && svd->swapped) { /* was solved as GHIEP, set u=Omega*u and normalize */ |
| 325 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(EPSGetOperators(cross->eps,NULL,&Omega)); |
| 326 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(MatCreateVecs(Omega,&w,NULL)); |
| 327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(VecCreateSeq(PETSC_COMM_SELF,svd->ncv,&omega2)); |
| 328 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(VecGetArrayWrite(omega2,&varray)); |
| 329 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
|
534 | for (i=0;i<svd->nconv;i++) { |
| 330 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(BVGetColumn(svd->V,i,&v)); |
| 331 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(EPSGetEigenvector(cross->eps,i,v,NULL)); |
| 332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(MatMult(Omega,v,w)); |
| 333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(VecDot(v,w,&alpha)); |
| 334 |
2/4✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
|
516 | svd->sign[i] = PetscSign(PetscRealPart(alpha)); |
| 335 | 516 | varray[i] = svd->sign[i]; | |
| 336 | 516 | alpha = 1.0/PetscSqrtScalar(PetscAbsScalar(alpha)); | |
| 337 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(VecScale(w,alpha)); |
| 338 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(VecCopy(w,v)); |
| 339 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
516 | PetscCall(BVRestoreColumn(svd->V,i,&v)); |
| 340 | } | ||
| 341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(BVSetSignature(svd->V,omega2)); |
| 342 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(VecRestoreArrayWrite(omega2,&varray)); |
| 343 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(VecDestroy(&omega2)); |
| 344 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(VecDestroy(&w)); |
| 345 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(SVDComputeVectors_Left(svd)); |
| 346 | } else { | ||
| 347 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4530 | for (i=0;i<svd->nconv;i++) { |
| 348 |
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.
|
4180 | PetscCall(BVGetColumn(svd->V,i,&v)); |
| 349 |
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.
|
4180 | PetscCall(EPSGetEigenvector(cross->eps,i,v,NULL)); |
| 350 |
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.
|
4180 | PetscCall(BVRestoreColumn(svd->V,i,&v)); |
| 351 | } | ||
| 352 |
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.
|
350 | PetscCall(SVDComputeVectors_Left(svd)); |
| 353 | } | ||
| 354 |
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.
|
105 | PetscFunctionReturn(PETSC_SUCCESS); |
| 355 | } | ||
| 356 | |||
| 357 | 8752 | static PetscErrorCode EPSMonitor_Cross(EPS eps,PetscInt its,PetscInt nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt nest,void *ctx) | |
| 358 | { | ||
| 359 | 8752 | PetscInt i,ncv; | |
| 360 | 8752 | SVD svd = (SVD)ctx; | |
| 361 | 8752 | SVD_CROSS *cross; | |
| 362 | 8752 | PetscScalar er,ei; | |
| 363 | 8752 | ST st; | |
| 364 | |||
| 365 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8752 | PetscFunctionBegin; |
| 366 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
|
8752 | if (svd->stop==SVD_STOP_THRESHOLD) { |
| 367 | 650 | cross = (SVD_CROSS*)svd->data; | |
| 368 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
650 | PetscCall(EPSGetDimensions(cross->eps,NULL,&ncv,NULL)); |
| 369 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
650 | if (ncv!=svd->ncv) { /* reallocate */ |
| 370 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(SVDReallocateSolution(svd,ncv)); |
| 371 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
82 | for (i=svd->ncv;i<ncv;i++) svd->perm[i] = i; |
| 372 | 8 | svd->ncv = ncv; | |
| 373 | } | ||
| 374 | } | ||
| 375 |
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.
|
8752 | PetscCall(EPSGetST(eps,&st)); |
| 376 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
134681 | for (i=0;i<PetscMin(nest,svd->ncv);i++) { |
| 377 | 125929 | er = eigr[i]; ei = eigi[i]; | |
| 378 |
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.
|
125929 | PetscCall(STBackTransform(st,1,&er,&ei)); |
| 379 | 125929 | svd->sigma[i] = PetscSqrtReal(PetscAbsReal(PetscRealPart(er))); | |
| 380 | 125929 | svd->errest[i] = errest[i]; | |
| 381 | } | ||
| 382 |
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.
|
8752 | PetscCall(SVDMonitor(svd,its,nconv,svd->sigma,svd->errest,nest)); |
| 383 |
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.
|
1779 | PetscFunctionReturn(PETSC_SUCCESS); |
| 384 | } | ||
| 385 | |||
| 386 | 461 | static PetscErrorCode SVDSetFromOptions_Cross(SVD svd,PetscOptionItems PetscOptionsObject) | |
| 387 | { | ||
| 388 | 461 | PetscBool set,val; | |
| 389 | 461 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 390 | 461 | ST st; | |
| 391 | |||
| 392 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
461 | PetscFunctionBegin; |
| 393 |
1/12✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
461 | PetscOptionsHeadBegin(PetscOptionsObject,"SVD Cross Options"); |
| 394 | |||
| 395 |
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.
|
461 | PetscCall(PetscOptionsBool("-svd_cross_explicitmatrix","Use cross explicit matrix","SVDCrossSetExplicitMatrix",cross->explicitmatrix,&val,&set)); |
| 396 |
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.
|
461 | if (set) PetscCall(SVDCrossSetExplicitMatrix(svd,val)); |
| 397 | |||
| 398 |
2/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
461 | PetscOptionsHeadEnd(); |
| 399 | |||
| 400 |
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.
|
461 | if (!cross->eps) PetscCall(SVDCrossGetEPS(svd,&cross->eps)); |
| 401 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
461 | if (!cross->explicitmatrix && !cross->usereps) { |
| 402 | /* use as default an ST with shell matrix and Jacobi */ | ||
| 403 |
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.
|
294 | PetscCall(EPSGetST(cross->eps,&st)); |
| 404 |
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.
|
294 | PetscCall(STSetMatMode(st,ST_MATMODE_SHELL)); |
| 405 | } | ||
| 406 |
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.
|
461 | PetscCall(EPSSetFromOptions(cross->eps)); |
| 407 |
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.
|
91 | PetscFunctionReturn(PETSC_SUCCESS); |
| 408 | } | ||
| 409 | |||
| 410 | 215 | static PetscErrorCode SVDCrossSetExplicitMatrix_Cross(SVD svd,PetscBool explicitmatrix) | |
| 411 | { | ||
| 412 | 215 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 413 | |||
| 414 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
215 | PetscFunctionBegin; |
| 415 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
215 | if (cross->explicitmatrix != explicitmatrix) { |
| 416 | 143 | cross->explicitmatrix = explicitmatrix; | |
| 417 | 143 | svd->state = SVD_STATE_INITIAL; | |
| 418 | } | ||
| 419 |
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.
|
215 | PetscFunctionReturn(PETSC_SUCCESS); |
| 420 | } | ||
| 421 | |||
| 422 | /*@ | ||
| 423 | SVDCrossSetExplicitMatrix - Indicate if the eigensolver operator $A^*A$ must | ||
| 424 | be computed explicitly. | ||
| 425 | |||
| 426 | Logically Collective | ||
| 427 | |||
| 428 | Input Parameters: | ||
| 429 | + svd - the singular value solver context | ||
| 430 | - explicitmat - `PETSC_TRUE` if $A^*A$ must be built explicitly | ||
| 431 | |||
| 432 | Options Database Key: | ||
| 433 | . -svd_cross_explicitmatrix - toggle the explicit construction of the matrix | ||
| 434 | |||
| 435 | Notes: | ||
| 436 | In GSVD there are two cross product matrices, $A^*A$ and $B^*B$. In HSVD the | ||
| 437 | expression for the cross product matrix is different, $A^*\Omega A$. See | ||
| 438 | [](#sec:svdback) for details. | ||
| 439 | |||
| 440 | By default the matrices are not built explicitly, but handled as shell matrices, | ||
| 441 | see `MATSHELL`. | ||
| 442 | |||
| 443 | Level: advanced | ||
| 444 | |||
| 445 | .seealso: [](ch:svd), [](#sec:svdback), `SVDCROSS`, `SVDCrossGetExplicitMatrix()`, `MATSHELL` | ||
| 446 | @*/ | ||
| 447 | 215 | PetscErrorCode SVDCrossSetExplicitMatrix(SVD svd,PetscBool explicitmat) | |
| 448 | { | ||
| 449 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
215 | PetscFunctionBegin; |
| 450 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
215 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 451 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
215 | PetscValidLogicalCollectiveBool(svd,explicitmat,2); |
| 452 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
215 | PetscTryMethod(svd,"SVDCrossSetExplicitMatrix_C",(SVD,PetscBool),(svd,explicitmat)); |
| 453 |
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.
|
215 | PetscFunctionReturn(PETSC_SUCCESS); |
| 454 | } | ||
| 455 | |||
| 456 | 24 | static PetscErrorCode SVDCrossGetExplicitMatrix_Cross(SVD svd,PetscBool *explicitmat) | |
| 457 | { | ||
| 458 | 24 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 459 | |||
| 460 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
| 461 | 24 | *explicitmat = cross->explicitmatrix; | |
| 462 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
| 463 | } | ||
| 464 | |||
| 465 | /*@ | ||
| 466 | SVDCrossGetExplicitMatrix - Returns the flag indicating if $A^*A$ is built explicitly. | ||
| 467 | |||
| 468 | Not Collective | ||
| 469 | |||
| 470 | Input Parameter: | ||
| 471 | . svd - the singular value solver context | ||
| 472 | |||
| 473 | Output Parameter: | ||
| 474 | . explicitmat - the mode flag | ||
| 475 | |||
| 476 | Level: advanced | ||
| 477 | |||
| 478 | .seealso: [](ch:svd), `SVDCROSS`, `SVDCrossSetExplicitMatrix()` | ||
| 479 | @*/ | ||
| 480 | 24 | PetscErrorCode SVDCrossGetExplicitMatrix(SVD svd,PetscBool *explicitmat) | |
| 481 | { | ||
| 482 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
| 483 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
24 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 484 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
24 | PetscAssertPointer(explicitmat,2); |
| 485 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
24 | PetscUseMethod(svd,"SVDCrossGetExplicitMatrix_C",(SVD,PetscBool*),(svd,explicitmat)); |
| 486 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
| 487 | } | ||
| 488 | |||
| 489 | 24 | static PetscErrorCode SVDCrossSetEPS_Cross(SVD svd,EPS eps) | |
| 490 | { | ||
| 491 | 24 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 492 | |||
| 493 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
| 494 |
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.
|
24 | PetscCall(PetscObjectReference((PetscObject)eps)); |
| 495 |
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.
|
24 | PetscCall(EPSDestroy(&cross->eps)); |
| 496 | 24 | cross->eps = eps; | |
| 497 | 24 | cross->usereps = PETSC_TRUE; | |
| 498 | 24 | svd->state = SVD_STATE_INITIAL; | |
| 499 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
| 500 | } | ||
| 501 | |||
| 502 | /*@ | ||
| 503 | SVDCrossSetEPS - Associate an eigensolver object (`EPS`) to the | ||
| 504 | singular value solver. | ||
| 505 | |||
| 506 | Collective | ||
| 507 | |||
| 508 | Input Parameters: | ||
| 509 | + svd - the singular value solver context | ||
| 510 | - eps - the linear eigensolver context | ||
| 511 | |||
| 512 | Level: advanced | ||
| 513 | |||
| 514 | .seealso: [](ch:svd), `SVDCROSS`, `SVDCrossGetEPS()` | ||
| 515 | @*/ | ||
| 516 | 24 | PetscErrorCode SVDCrossSetEPS(SVD svd,EPS eps) | |
| 517 | { | ||
| 518 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
| 519 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
24 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 520 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
24 | PetscValidHeaderSpecific(eps,EPS_CLASSID,2); |
| 521 |
13/32✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
24 | PetscCheckSameComm(svd,1,eps,2); |
| 522 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
24 | PetscTryMethod(svd,"SVDCrossSetEPS_C",(SVD,EPS),(svd,eps)); |
| 523 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
| 524 | } | ||
| 525 | |||
| 526 | 457 | static PetscErrorCode SVDCrossGetEPS_Cross(SVD svd,EPS *eps) | |
| 527 | { | ||
| 528 | 457 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 529 | |||
| 530 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
457 | PetscFunctionBegin; |
| 531 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
457 | if (!cross->eps) { |
| 532 |
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.
|
457 | PetscCall(EPSCreate(PetscObjectComm((PetscObject)svd),&cross->eps)); |
| 533 |
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.
|
457 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)cross->eps,(PetscObject)svd,1)); |
| 534 |
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.
|
457 | PetscCall(EPSSetOptionsPrefix(cross->eps,((PetscObject)svd)->prefix)); |
| 535 |
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.
|
457 | PetscCall(EPSAppendOptionsPrefix(cross->eps,"svd_cross_")); |
| 536 |
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.
|
457 | PetscCall(PetscObjectSetOptions((PetscObject)cross->eps,((PetscObject)svd)->options)); |
| 537 |
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.
|
457 | PetscCall(EPSSetWhichEigenpairs(cross->eps,EPS_LARGEST_MAGNITUDE)); |
| 538 |
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.
|
457 | PetscCall(EPSMonitorSet(cross->eps,EPSMonitor_Cross,svd,NULL)); |
| 539 | } | ||
| 540 | 457 | *eps = cross->eps; | |
| 541 |
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.
|
457 | PetscFunctionReturn(PETSC_SUCCESS); |
| 542 | } | ||
| 543 | |||
| 544 | /*@ | ||
| 545 | SVDCrossGetEPS - Retrieve the eigensolver object (`EPS`) associated | ||
| 546 | to the singular value solver. | ||
| 547 | |||
| 548 | Collective | ||
| 549 | |||
| 550 | Input Parameter: | ||
| 551 | . svd - the singular value solver context | ||
| 552 | |||
| 553 | Output Parameter: | ||
| 554 | . eps - the linear eigensolver context | ||
| 555 | |||
| 556 | Level: advanced | ||
| 557 | |||
| 558 | .seealso: [](ch:svd), `SVDCROSS`, `SVDCrossSetEPS()` | ||
| 559 | @*/ | ||
| 560 | 457 | PetscErrorCode SVDCrossGetEPS(SVD svd,EPS *eps) | |
| 561 | { | ||
| 562 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
457 | PetscFunctionBegin; |
| 563 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
457 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 564 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
457 | PetscAssertPointer(eps,2); |
| 565 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
457 | PetscUseMethod(svd,"SVDCrossGetEPS_C",(SVD,EPS*),(svd,eps)); |
| 566 |
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.
|
457 | PetscFunctionReturn(PETSC_SUCCESS); |
| 567 | } | ||
| 568 | |||
| 569 | 10 | static PetscErrorCode SVDView_Cross(SVD svd,PetscViewer viewer) | |
| 570 | { | ||
| 571 | 10 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 572 | 10 | PetscBool isascii; | |
| 573 | |||
| 574 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 575 |
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(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 576 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (isascii) { |
| 577 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
10 | if (!cross->eps) PetscCall(SVDCrossGetEPS(svd,&cross->eps)); |
| 578 |
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.
|
20 | PetscCall(PetscViewerASCIIPrintf(viewer," %s matrix\n",cross->explicitmatrix?"explicit":"implicit")); |
| 579 |
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(PetscViewerASCIIPushTab(viewer)); |
| 580 |
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(EPSView(cross->eps,viewer)); |
| 581 |
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(PetscViewerASCIIPopTab(viewer)); |
| 582 | } | ||
| 583 |
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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 584 | } | ||
| 585 | |||
| 586 | 491 | static PetscErrorCode SVDReset_Cross(SVD svd) | |
| 587 | { | ||
| 588 | 491 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 589 | |||
| 590 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
491 | PetscFunctionBegin; |
| 591 |
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.
|
491 | PetscCall(EPSReset(cross->eps)); |
| 592 |
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.
|
491 | PetscCall(MatDestroy(&cross->C)); |
| 593 |
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.
|
491 | PetscCall(MatDestroy(&cross->D)); |
| 594 |
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.
|
97 | PetscFunctionReturn(PETSC_SUCCESS); |
| 595 | } | ||
| 596 | |||
| 597 | 481 | static PetscErrorCode SVDDestroy_Cross(SVD svd) | |
| 598 | { | ||
| 599 | 481 | SVD_CROSS *cross = (SVD_CROSS*)svd->data; | |
| 600 | |||
| 601 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
481 | PetscFunctionBegin; |
| 602 |
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.
|
481 | PetscCall(EPSDestroy(&cross->eps)); |
| 603 |
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.
|
481 | PetscCall(PetscFree(svd->data)); |
| 604 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossSetEPS_C",NULL)); |
| 605 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossGetEPS_C",NULL)); |
| 606 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossSetExplicitMatrix_C",NULL)); |
| 607 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossGetExplicitMatrix_C",NULL)); |
| 608 |
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.
|
95 | PetscFunctionReturn(PETSC_SUCCESS); |
| 609 | } | ||
| 610 | |||
| 611 | /*MC | ||
| 612 | SVDCROSS - SVDCROSS = "cross" - Solve the singular value problem | ||
| 613 | via an equivalent eigenvalue problem with the cross product matrix. | ||
| 614 | |||
| 615 | Notes: | ||
| 616 | This will do the computation with a subsidiary eigensolver on an | ||
| 617 | equivalent eigenvalue problem. For the standard SVD, the eigensolver | ||
| 618 | operates with the cross product matrix $A^*A$. See the section | ||
| 619 | [](#sec:svdback) for details on the formulation for each SVD type. | ||
| 620 | |||
| 621 | This is the default solver. In the case of standard SVD, the computation | ||
| 622 | done by this solver will be almost identical to the one with `SVDTRLANCZOS`. | ||
| 623 | |||
| 624 | To manipulate the internal eigensolvers, use `SVDCrossGetEPS()` or | ||
| 625 | use the corresponding command-line options. | ||
| 626 | |||
| 627 | Level: beginner | ||
| 628 | |||
| 629 | .seealso: [](ch:svd), [](#sec:svdback), `SVD`, `SVDType`, `SVDSetType()`, `SVDSetProblemType()`, `SVDTRLANCZOS`, `SVDCrossGetEPS()` | ||
| 630 | M*/ | ||
| 631 | 481 | SLEPC_EXTERN PetscErrorCode SVDCreate_Cross(SVD svd) | |
| 632 | { | ||
| 633 | 481 | SVD_CROSS *cross; | |
| 634 | |||
| 635 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
481 | PetscFunctionBegin; |
| 636 |
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.
|
481 | PetscCall(PetscNew(&cross)); |
| 637 | 481 | svd->data = (void*)cross; | |
| 638 | |||
| 639 | 481 | svd->ops->solve = SVDSolve_Cross; | |
| 640 | 481 | svd->ops->solveg = SVDSolve_Cross; | |
| 641 | 481 | svd->ops->solveh = SVDSolve_Cross; | |
| 642 | 481 | svd->ops->setup = SVDSetUp_Cross; | |
| 643 | 481 | svd->ops->setfromoptions = SVDSetFromOptions_Cross; | |
| 644 | 481 | svd->ops->destroy = SVDDestroy_Cross; | |
| 645 | 481 | svd->ops->reset = SVDReset_Cross; | |
| 646 | 481 | svd->ops->view = SVDView_Cross; | |
| 647 | 481 | svd->ops->computevectors = SVDComputeVectors_Cross; | |
| 648 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossSetEPS_C",SVDCrossSetEPS_Cross)); |
| 649 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossGetEPS_C",SVDCrossGetEPS_Cross)); |
| 650 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossSetExplicitMatrix_C",SVDCrossSetExplicitMatrix_Cross)); |
| 651 |
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.
|
481 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCrossGetExplicitMatrix_C",SVDCrossGetExplicitMatrix_Cross)); |
| 652 |
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.
|
95 | PetscFunctionReturn(PETSC_SUCCESS); |
| 653 | } | ||
| 654 |