| 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: "cyclic" | ||
| 12 | |||
| 13 | Method: Uses a Hermitian eigensolver for H(A) = [ 0 A ; A^T 0 ] | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/ | ||
| 17 | #include <slepc/private/bvimpl.h> | ||
| 18 | #include "cyclic.h" | ||
| 19 | |||
| 20 | 91112 | static PetscErrorCode MatMult_Cyclic(Mat B,Vec x,Vec y) | |
| 21 | { | ||
| 22 | 91112 | SVD_CYCLIC_SHELL *ctx; | |
| 23 | 91112 | const PetscScalar *px; | |
| 24 | 91112 | PetscScalar *py; | |
| 25 | 91112 | PetscInt m; | |
| 26 | |||
| 27 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
91112 | PetscFunctionBegin; |
| 28 |
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.
|
91112 | PetscCall(MatShellGetContext(B,&ctx)); |
| 29 |
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.
|
91112 | PetscCall(MatGetLocalSize(ctx->A,&m,NULL)); |
| 30 |
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.
|
91112 | PetscCall(VecGetArrayRead(x,&px)); |
| 31 |
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.
|
91112 | PetscCall(VecGetArrayWrite(y,&py)); |
| 32 |
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.
|
91112 | PetscCall(VecPlaceArray(ctx->x1,px)); |
| 33 |
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.
|
91112 | PetscCall(VecPlaceArray(ctx->x2,px+m)); |
| 34 |
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.
|
91112 | PetscCall(VecPlaceArray(ctx->y1,py)); |
| 35 |
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.
|
91112 | PetscCall(VecPlaceArray(ctx->y2,py+m)); |
| 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.
|
91112 | PetscCall(MatMult(ctx->A,ctx->x2,ctx->y1)); |
| 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.
|
91112 | PetscCall(MatMult(ctx->AT,ctx->x1,ctx->y2)); |
| 38 |
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.
|
91112 | PetscCall(VecResetArray(ctx->x1)); |
| 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.
|
91112 | PetscCall(VecResetArray(ctx->x2)); |
| 40 |
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.
|
91112 | PetscCall(VecResetArray(ctx->y1)); |
| 41 |
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.
|
91112 | PetscCall(VecResetArray(ctx->y2)); |
| 42 |
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.
|
91112 | PetscCall(VecRestoreArrayRead(x,&px)); |
| 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.
|
91112 | PetscCall(VecRestoreArrayWrite(y,&py)); |
| 44 |
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.
|
18480 | PetscFunctionReturn(PETSC_SUCCESS); |
| 45 | } | ||
| 46 | |||
| 47 | ✗ | static PetscErrorCode MatGetDiagonal_Cyclic(Mat B,Vec diag) | |
| 48 | { | ||
| 49 | ✗ | PetscFunctionBegin; | |
| 50 | ✗ | PetscCall(VecSet(diag,0.0)); | |
| 51 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 52 | } | ||
| 53 | |||
| 54 | 286 | static PetscErrorCode MatDestroy_Cyclic(Mat B) | |
| 55 | { | ||
| 56 | 286 | SVD_CYCLIC_SHELL *ctx; | |
| 57 | |||
| 58 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
286 | PetscFunctionBegin; |
| 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.
|
286 | PetscCall(MatShellGetContext(B,&ctx)); |
| 60 |
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.
|
286 | PetscCall(VecDestroy(&ctx->x1)); |
| 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.
|
286 | PetscCall(VecDestroy(&ctx->x2)); |
| 62 |
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.
|
286 | PetscCall(VecDestroy(&ctx->y1)); |
| 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.
|
286 | PetscCall(VecDestroy(&ctx->y2)); |
| 64 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
|
286 | if (ctx->misaligned) { |
| 65 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
6 | PetscCall(VecDestroy(&ctx->wx2)); |
| 66 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
6 | PetscCall(VecDestroy(&ctx->wy2)); |
| 67 | } | ||
| 68 |
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.
|
286 | PetscCall(PetscFree(ctx)); |
| 69 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
| 70 | } | ||
| 71 | |||
| 72 | /* | ||
| 73 | Builds cyclic matrix C = | 0 A | | ||
| 74 | | AT 0 | | ||
| 75 | */ | ||
| 76 | 455 | static PetscErrorCode SVDCyclicGetCyclicMat(SVD svd,Mat A,Mat AT,Mat *C) | |
| 77 | { | ||
| 78 | 455 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 79 | 455 | SVD_CYCLIC_SHELL *ctx; | |
| 80 | 455 | PetscInt i,M,N,m,n,Istart,Iend; | |
| 81 | 455 | VecType vtype; | |
| 82 | 455 | Mat Zm,Zn; | |
| 83 | #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) | ||
| 84 | 184 | PetscBool gpu; | |
| 85 | 184 | const PetscInt *ranges; | |
| 86 | 184 | PetscMPIInt size; | |
| 87 | #endif | ||
| 88 | |||
| 89 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
455 | PetscFunctionBegin; |
| 90 |
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.
|
455 | PetscCall(MatGetSize(A,&M,&N)); |
| 91 |
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.
|
455 | PetscCall(MatGetLocalSize(A,&m,&n)); |
| 92 | |||
| 93 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
455 | if (cyclic->explicitmatrix) { |
| 94 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
169 | PetscCheck(svd->expltrans,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Cannot use explicit cyclic matrix with implicit transpose"); |
| 95 |
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.
|
169 | PetscCall(MatCreate(PetscObjectComm((PetscObject)svd),&Zm)); |
| 96 |
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.
|
169 | PetscCall(MatSetSizes(Zm,m,m,M,M)); |
| 97 |
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.
|
169 | PetscCall(MatSetFromOptions(Zm)); |
| 98 |
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.
|
169 | PetscCall(MatGetOwnershipRange(Zm,&Istart,&Iend)); |
| 99 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
20542 | for (i=Istart;i<Iend;i++) PetscCall(MatSetValue(Zm,i,i,0.0,INSERT_VALUES)); |
| 100 |
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.
|
169 | PetscCall(MatAssemblyBegin(Zm,MAT_FINAL_ASSEMBLY)); |
| 101 |
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.
|
169 | PetscCall(MatAssemblyEnd(Zm,MAT_FINAL_ASSEMBLY)); |
| 102 |
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.
|
169 | PetscCall(MatCreate(PetscObjectComm((PetscObject)svd),&Zn)); |
| 103 |
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.
|
169 | PetscCall(MatSetSizes(Zn,n,n,N,N)); |
| 104 |
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.
|
169 | PetscCall(MatSetFromOptions(Zn)); |
| 105 |
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.
|
169 | PetscCall(MatGetOwnershipRange(Zn,&Istart,&Iend)); |
| 106 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
11933 | for (i=Istart;i<Iend;i++) PetscCall(MatSetValue(Zn,i,i,0.0,INSERT_VALUES)); |
| 107 |
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.
|
169 | PetscCall(MatAssemblyBegin(Zn,MAT_FINAL_ASSEMBLY)); |
| 108 |
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.
|
169 | PetscCall(MatAssemblyEnd(Zn,MAT_FINAL_ASSEMBLY)); |
| 109 |
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.
|
169 | PetscCall(MatCreateTile(1.0,Zm,1.0,A,1.0,AT,1.0,Zn,C)); |
| 110 |
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.
|
169 | PetscCall(MatDestroy(&Zm)); |
| 111 |
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.
|
169 | PetscCall(MatDestroy(&Zn)); |
| 112 | } else { | ||
| 113 |
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.
|
286 | PetscCall(PetscNew(&ctx)); |
| 114 | 286 | ctx->A = A; | |
| 115 | 286 | ctx->AT = AT; | |
| 116 | 286 | ctx->swapped = svd->swapped; | |
| 117 |
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.
|
286 | PetscCall(MatCreateVecsEmpty(A,&ctx->x2,&ctx->x1)); |
| 118 |
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.
|
286 | PetscCall(MatCreateVecsEmpty(A,&ctx->y2,&ctx->y1)); |
| 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.
|
286 | PetscCall(MatCreateShell(PetscObjectComm((PetscObject)svd),m+n,m+n,M+N,M+N,ctx,C)); |
| 120 |
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.
|
286 | PetscCall(MatShellSetOperation(*C,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_Cyclic)); |
| 121 |
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.
|
286 | PetscCall(MatShellSetOperation(*C,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_Cyclic)); |
| 122 | #if defined(PETSC_HAVE_CUDA) | ||
| 123 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
105 | PetscCall(PetscObjectTypeCompareAny((PetscObject)(svd->swapped?AT:A),&gpu,MATSEQAIJCUSPARSE,MATMPIAIJCUSPARSE,"")); |
| 124 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
57 | if (gpu) PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Cyclic_CUDA)); |
| 125 | else | ||
| 126 | #elif defined(PETSC_HAVE_HIP) | ||
| 127 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
105 | PetscCall(PetscObjectTypeCompareAny((PetscObject)(svd->swapped?AT:A),&gpu,MATSEQAIJHIPSPARSE,MATMPIAIJHIPSPARSE,"")); |
| 128 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
57 | if (gpu) PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Cyclic_HIP)); |
| 129 | else | ||
| 130 | #endif | ||
| 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.
|
274 | PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Cyclic)); |
| 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.
|
286 | PetscCall(MatGetVecType(A,&vtype)); |
| 133 |
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.
|
286 | PetscCall(MatSetVecType(*C,vtype)); |
| 134 | #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) | ||
| 135 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
114 | if (gpu) { |
| 136 | /* check alignment of bottom block */ | ||
| 137 |
2/6✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
12 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)ctx->x1),&size)); |
| 138 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
12 | PetscCall(VecGetOwnershipRanges(ctx->x1,&ranges)); |
| 139 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
18 | for (i=0;i<size;i++) { |
| 140 | 12 | ctx->misaligned = (((ranges[i+1]-ranges[i])*sizeof(PetscScalar))%16)? PETSC_TRUE: PETSC_FALSE; | |
| 141 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
12 | if (ctx->misaligned) break; |
| 142 | } | ||
| 143 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
12 | if (ctx->misaligned) { /* create work vectors for MatMult */ |
| 144 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
6 | PetscCall(VecDuplicate(ctx->x2,&ctx->wx2)); |
| 145 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
6 | PetscCall(VecDuplicate(ctx->y2,&ctx->wy2)); |
| 146 | } | ||
| 147 | } | ||
| 148 | #endif | ||
| 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.
|
89 | PetscFunctionReturn(PETSC_SUCCESS); |
| 151 | } | ||
| 152 | |||
| 153 | 71423 | static PetscErrorCode MatMult_ECross(Mat B,Vec x,Vec y) | |
| 154 | { | ||
| 155 | 71423 | SVD_CYCLIC_SHELL *ctx; | |
| 156 | 71423 | const PetscScalar *px; | |
| 157 | 71423 | PetscScalar *py; | |
| 158 | 71423 | PetscInt mn,m,n; | |
| 159 | |||
| 160 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
71423 | PetscFunctionBegin; |
| 161 |
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.
|
71423 | PetscCall(MatShellGetContext(B,&ctx)); |
| 162 |
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.
|
71423 | PetscCall(MatGetLocalSize(ctx->A,NULL,&n)); |
| 163 |
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.
|
71423 | PetscCall(VecGetLocalSize(y,&mn)); |
| 164 | 71423 | m = mn-n; | |
| 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.
|
71423 | PetscCall(VecGetArrayRead(x,&px)); |
| 166 |
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.
|
71423 | PetscCall(VecGetArrayWrite(y,&py)); |
| 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.
|
71423 | PetscCall(VecPlaceArray(ctx->x1,px)); |
| 168 |
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.
|
71423 | PetscCall(VecPlaceArray(ctx->x2,px+m)); |
| 169 |
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.
|
71423 | PetscCall(VecPlaceArray(ctx->y1,py)); |
| 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.
|
71423 | PetscCall(VecPlaceArray(ctx->y2,py+m)); |
| 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.
|
71423 | PetscCall(VecCopy(ctx->x1,ctx->y1)); |
| 172 |
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.
|
71423 | PetscCall(MatMult(ctx->A,ctx->x2,ctx->w)); |
| 173 |
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.
|
71423 | PetscCall(MatMult(ctx->AT,ctx->w,ctx->y2)); |
| 174 |
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.
|
71423 | PetscCall(VecResetArray(ctx->x1)); |
| 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.
|
71423 | PetscCall(VecResetArray(ctx->x2)); |
| 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.
|
71423 | PetscCall(VecResetArray(ctx->y1)); |
| 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.
|
71423 | PetscCall(VecResetArray(ctx->y2)); |
| 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.
|
71423 | PetscCall(VecRestoreArrayRead(x,&px)); |
| 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.
|
71423 | PetscCall(VecRestoreArrayWrite(y,&py)); |
| 180 |
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.
|
14284 | PetscFunctionReturn(PETSC_SUCCESS); |
| 181 | } | ||
| 182 | |||
| 183 | 63 | static PetscErrorCode MatGetDiagonal_ECross(Mat B,Vec d) | |
| 184 | { | ||
| 185 | 63 | SVD_CYCLIC_SHELL *ctx; | |
| 186 | 63 | PetscScalar *pd; | |
| 187 | 63 | PetscMPIInt len; | |
| 188 | 63 | PetscInt mn,m,n,N,i,j,start,end,ncols; | |
| 189 | 63 | PetscScalar *work1,*work2,*diag; | |
| 190 | 63 | const PetscInt *cols; | |
| 191 | 63 | const PetscScalar *vals; | |
| 192 | |||
| 193 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
63 | PetscFunctionBegin; |
| 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.
|
63 | PetscCall(MatShellGetContext(B,&ctx)); |
| 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.
|
63 | PetscCall(MatGetLocalSize(ctx->A,NULL,&n)); |
| 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.
|
63 | PetscCall(VecGetLocalSize(d,&mn)); |
| 197 | 63 | m = mn-n; | |
| 198 |
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.
|
63 | PetscCall(VecGetArrayWrite(d,&pd)); |
| 199 |
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.
|
63 | PetscCall(VecPlaceArray(ctx->y1,pd)); |
| 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.
|
63 | PetscCall(VecSet(ctx->y1,1.0)); |
| 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.
|
63 | PetscCall(VecResetArray(ctx->y1)); |
| 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.
|
63 | PetscCall(VecPlaceArray(ctx->y2,pd+m)); |
| 203 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
63 | if (!ctx->diag) { |
| 204 | /* compute diagonal from rows and store in ctx->diag */ | ||
| 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.
|
63 | PetscCall(VecDuplicate(ctx->y2,&ctx->diag)); |
| 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.
|
63 | PetscCall(MatGetSize(ctx->A,NULL,&N)); |
| 207 |
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.
|
63 | PetscCall(PetscCalloc2(N,&work1,N,&work2)); |
| 208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
63 | if (ctx->swapped) { |
| 209 | ✗ | PetscCall(MatGetOwnershipRange(ctx->AT,&start,&end)); | |
| 210 | ✗ | for (i=start;i<end;i++) { | |
| 211 | ✗ | PetscCall(MatGetRow(ctx->AT,i,&ncols,NULL,&vals)); | |
| 212 | ✗ | for (j=0;j<ncols;j++) work1[i] += vals[j]*vals[j]; | |
| 213 | ✗ | PetscCall(MatRestoreRow(ctx->AT,i,&ncols,NULL,&vals)); | |
| 214 | } | ||
| 215 | } else { | ||
| 216 |
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.
|
63 | PetscCall(MatGetOwnershipRange(ctx->A,&start,&end)); |
| 217 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1416 | for (i=start;i<end;i++) { |
| 218 |
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.
|
1353 | PetscCall(MatGetRow(ctx->A,i,&ncols,&cols,&vals)); |
| 219 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9548 | for (j=0;j<ncols;j++) work1[cols[j]] += vals[j]*vals[j]; |
| 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.
|
1353 | PetscCall(MatRestoreRow(ctx->A,i,&ncols,&cols,&vals)); |
| 221 | } | ||
| 222 | } | ||
| 223 |
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.
|
63 | PetscCall(PetscMPIIntCast(N,&len)); |
| 224 |
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.
|
63 | PetscCallMPI(MPIU_Allreduce(work1,work2,len,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)B))); |
| 225 |
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.
|
63 | PetscCall(VecGetOwnershipRange(ctx->diag,&start,&end)); |
| 226 |
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.
|
63 | PetscCall(VecGetArrayWrite(ctx->diag,&diag)); |
| 227 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1273 | for (i=start;i<end;i++) diag[i-start] = work2[i]; |
| 228 |
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.
|
63 | PetscCall(VecRestoreArrayWrite(ctx->diag,&diag)); |
| 229 |
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.
|
63 | PetscCall(PetscFree2(work1,work2)); |
| 230 | } | ||
| 231 |
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.
|
63 | PetscCall(VecCopy(ctx->diag,ctx->y2)); |
| 232 |
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.
|
63 | PetscCall(VecResetArray(ctx->y2)); |
| 233 |
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.
|
63 | PetscCall(VecRestoreArrayWrite(d,&pd)); |
| 234 |
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.
|
11 | PetscFunctionReturn(PETSC_SUCCESS); |
| 235 | } | ||
| 236 | |||
| 237 | 63 | static PetscErrorCode MatDestroy_ECross(Mat B) | |
| 238 | { | ||
| 239 | 63 | SVD_CYCLIC_SHELL *ctx; | |
| 240 | |||
| 241 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
63 | PetscFunctionBegin; |
| 242 |
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.
|
63 | PetscCall(MatShellGetContext(B,&ctx)); |
| 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.
|
63 | PetscCall(VecDestroy(&ctx->x1)); |
| 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.
|
63 | PetscCall(VecDestroy(&ctx->x2)); |
| 245 |
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.
|
63 | PetscCall(VecDestroy(&ctx->y1)); |
| 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.
|
63 | PetscCall(VecDestroy(&ctx->y2)); |
| 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.
|
63 | PetscCall(VecDestroy(&ctx->diag)); |
| 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.
|
63 | PetscCall(VecDestroy(&ctx->w)); |
| 249 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
|
63 | if (ctx->misaligned) { |
| 250 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | PetscCall(VecDestroy(&ctx->wx2)); |
| 251 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | PetscCall(VecDestroy(&ctx->wy2)); |
| 252 | } | ||
| 253 |
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.
|
63 | PetscCall(PetscFree(ctx)); |
| 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.
|
11 | PetscFunctionReturn(PETSC_SUCCESS); |
| 255 | } | ||
| 256 | |||
| 257 | /* | ||
| 258 | Builds extended cross product matrix C = | I_m 0 | | ||
| 259 | | 0 AT*A | | ||
| 260 | t is an auxiliary Vec used to take the dimensions of the upper block | ||
| 261 | */ | ||
| 262 | 134 | static PetscErrorCode SVDCyclicGetECrossMat(SVD svd,Mat A,Mat AT,Mat *C,Vec t) | |
| 263 | { | ||
| 264 | 134 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 265 | 134 | SVD_CYCLIC_SHELL *ctx; | |
| 266 | 134 | PetscInt i,M,N,m,n,Istart,Iend; | |
| 267 | 134 | VecType vtype; | |
| 268 | 134 | Mat Id,Zm,Zn,ATA; | |
| 269 | #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) | ||
| 270 | 62 | PetscBool gpu; | |
| 271 | 62 | const PetscInt *ranges; | |
| 272 | 62 | PetscMPIInt size; | |
| 273 | #endif | ||
| 274 | |||
| 275 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
134 | PetscFunctionBegin; |
| 276 |
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.
|
134 | PetscCall(MatGetSize(A,NULL,&N)); |
| 277 |
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.
|
134 | PetscCall(MatGetLocalSize(A,NULL,&n)); |
| 278 |
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.
|
134 | PetscCall(VecGetSize(t,&M)); |
| 279 |
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.
|
134 | PetscCall(VecGetLocalSize(t,&m)); |
| 280 | |||
| 281 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
134 | if (cyclic->explicitmatrix) { |
| 282 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
71 | PetscCheck(svd->expltrans,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Cannot use explicit cyclic matrix with implicit transpose"); |
| 283 |
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.
|
71 | PetscCall(MatCreateConstantDiagonal(PetscObjectComm((PetscObject)svd),m,m,M,M,1.0,&Id)); |
| 284 |
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.
|
71 | PetscCall(MatCreate(PetscObjectComm((PetscObject)svd),&Zm)); |
| 285 |
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.
|
71 | PetscCall(MatSetSizes(Zm,m,n,M,N)); |
| 286 |
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.
|
71 | PetscCall(MatSetFromOptions(Zm)); |
| 287 |
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.
|
71 | PetscCall(MatGetOwnershipRange(Zm,&Istart,&Iend)); |
| 288 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4218 | for (i=Istart;i<Iend;i++) { |
| 289 |
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.
|
4147 | if (i<N) PetscCall(MatSetValue(Zm,i,i,0.0,INSERT_VALUES)); |
| 290 | } | ||
| 291 |
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.
|
71 | PetscCall(MatAssemblyBegin(Zm,MAT_FINAL_ASSEMBLY)); |
| 292 |
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.
|
71 | PetscCall(MatAssemblyEnd(Zm,MAT_FINAL_ASSEMBLY)); |
| 293 |
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.
|
71 | PetscCall(MatCreate(PetscObjectComm((PetscObject)svd),&Zn)); |
| 294 |
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.
|
71 | PetscCall(MatSetSizes(Zn,n,m,N,M)); |
| 295 |
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.
|
71 | PetscCall(MatSetFromOptions(Zn)); |
| 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.
|
71 | PetscCall(MatGetOwnershipRange(Zn,&Istart,&Iend)); |
| 297 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4363 | for (i=Istart;i<Iend;i++) { |
| 298 |
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.
|
4292 | if (i<m) PetscCall(MatSetValue(Zn,i,i,0.0,INSERT_VALUES)); |
| 299 | } | ||
| 300 |
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.
|
71 | PetscCall(MatAssemblyBegin(Zn,MAT_FINAL_ASSEMBLY)); |
| 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.
|
71 | PetscCall(MatAssemblyEnd(Zn,MAT_FINAL_ASSEMBLY)); |
| 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.
|
71 | PetscCall(MatProductCreate(AT,A,NULL,&ATA)); |
| 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.
|
71 | PetscCall(MatProductSetType(ATA,MATPRODUCT_AB)); |
| 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.
|
71 | PetscCall(MatProductSetFromOptions(ATA)); |
| 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.
|
71 | PetscCall(MatProductSymbolic(ATA)); |
| 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.
|
71 | PetscCall(MatProductNumeric(ATA)); |
| 307 |
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.
|
71 | PetscCall(MatCreateTile(1.0,Id,1.0,Zm,1.0,Zn,1.0,ATA,C)); |
| 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.
|
71 | PetscCall(MatDestroy(&Id)); |
| 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.
|
71 | PetscCall(MatDestroy(&Zm)); |
| 310 |
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.
|
71 | PetscCall(MatDestroy(&Zn)); |
| 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.
|
71 | PetscCall(MatDestroy(&ATA)); |
| 312 | } else { | ||
| 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.
|
63 | PetscCall(PetscNew(&ctx)); |
| 314 | 63 | ctx->A = A; | |
| 315 | 63 | ctx->AT = AT; | |
| 316 | 63 | ctx->swapped = svd->swapped; | |
| 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.
|
63 | PetscCall(VecDuplicateEmpty(t,&ctx->x1)); |
| 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.
|
63 | PetscCall(VecDuplicateEmpty(t,&ctx->y1)); |
| 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.
|
63 | PetscCall(MatCreateVecsEmpty(A,&ctx->x2,NULL)); |
| 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.
|
63 | PetscCall(MatCreateVecsEmpty(A,&ctx->y2,NULL)); |
| 321 |
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.
|
63 | PetscCall(MatCreateVecs(A,NULL,&ctx->w)); |
| 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.
|
63 | PetscCall(MatCreateShell(PetscObjectComm((PetscObject)svd),m+n,m+n,M+N,M+N,ctx,C)); |
| 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.
|
63 | PetscCall(MatShellSetOperation(*C,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_ECross)); |
| 324 |
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.
|
63 | PetscCall(MatShellSetOperation(*C,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_ECross)); |
| 325 | #if defined(PETSC_HAVE_CUDA) | ||
| 326 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
30 | PetscCall(PetscObjectTypeCompareAny((PetscObject)(svd->swapped?AT:A),&gpu,MATSEQAIJCUSPARSE,MATMPIAIJCUSPARSE,"")); |
| 327 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
15 | if (gpu) PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_ECross_CUDA)); |
| 328 | else | ||
| 329 | #elif defined(PETSC_HAVE_HIP) | ||
| 330 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
30 | PetscCall(PetscObjectTypeCompareAny((PetscObject)(svd->swapped?AT:A),&gpu,MATSEQAIJHIPSPARSE,MATMPIAIJHIPSPARSE,"")); |
| 331 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
15 | if (gpu) PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_ECross_HIP)); |
| 332 | else | ||
| 333 | #endif | ||
| 334 |
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.
|
55 | PetscCall(MatShellSetOperation(*C,MATOP_MULT,(PetscErrorCodeFn*)MatMult_ECross)); |
| 335 |
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.
|
63 | PetscCall(MatGetVecType(A,&vtype)); |
| 336 |
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.
|
63 | PetscCall(MatSetVecType(*C,vtype)); |
| 337 | #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) | ||
| 338 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
30 | if (gpu) { |
| 339 | /* check alignment of bottom block */ | ||
| 340 |
2/6✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
8 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)ctx->x1),&size)); |
| 341 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
8 | PetscCall(VecGetOwnershipRanges(ctx->x1,&ranges)); |
| 342 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
12 | for (i=0;i<size;i++) { |
| 343 | 8 | ctx->misaligned = (((ranges[i+1]-ranges[i])*sizeof(PetscScalar))%16)? PETSC_TRUE: PETSC_FALSE; | |
| 344 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
8 | if (ctx->misaligned) break; |
| 345 | } | ||
| 346 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
8 | if (ctx->misaligned) { /* create work vectors for MatMult */ |
| 347 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
4 | PetscCall(VecDuplicate(ctx->x2,&ctx->wx2)); |
| 348 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
4 | PetscCall(VecDuplicate(ctx->y2,&ctx->wy2)); |
| 349 | } | ||
| 350 | } | ||
| 351 | #endif | ||
| 352 | } | ||
| 353 |
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); |
| 354 | } | ||
| 355 | |||
| 356 | /* Convergence test relative to the norm of R (used in GSVD only) */ | ||
| 357 | 1749 | static PetscErrorCode EPSConv_Cyclic(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx) | |
| 358 | { | ||
| 359 | 1749 | SVD svd = (SVD)ctx; | |
| 360 | |||
| 361 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1749 | PetscFunctionBegin; |
| 362 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1749 | *errest = res/PetscMax(svd->nrma,svd->nrmb); |
| 363 |
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.
|
1749 | PetscFunctionReturn(PETSC_SUCCESS); |
| 364 | } | ||
| 365 | |||
| 366 | 455 | static PetscErrorCode SVDSetUp_Cyclic(SVD svd) | |
| 367 | { | ||
| 368 | 455 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 369 | 455 | PetscInt M,N,m,n,p,k,i,isl,offset,nev,ncv,mpd,maxit; | |
| 370 | 455 | PetscReal tol; | |
| 371 | 455 | const PetscScalar *isa,*oa; | |
| 372 | 455 | PetscScalar *va; | |
| 373 | 455 | EPSProblemType ptype; | |
| 374 | 455 | PetscBool trackall,issinv; | |
| 375 | 455 | Vec v,t; | |
| 376 | 455 | ST st; | |
| 377 | 455 | Mat Omega; | |
| 378 | 455 | MatType Atype; | |
| 379 | |||
| 380 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
455 | PetscFunctionBegin; |
| 381 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
455 | if (svd->nsv==0) svd->nsv = 1; |
| 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.
|
455 | PetscCall(MatGetSize(svd->A,&M,&N)); |
| 383 |
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.
|
455 | PetscCall(MatGetLocalSize(svd->A,&m,&n)); |
| 384 |
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.
|
455 | if (!cyclic->eps) PetscCall(SVDCyclicGetEPS(svd,&cyclic->eps)); |
| 385 |
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.
|
455 | PetscCall(MatDestroy(&cyclic->C)); |
| 386 |
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.
|
455 | PetscCall(MatDestroy(&cyclic->D)); |
| 387 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
455 | if (svd->isgeneralized) { |
| 388 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
134 | if (svd->which==SVD_SMALLEST) { /* alternative pencil */ |
| 389 |
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.
|
20 | PetscCall(MatCreateVecs(svd->B,NULL,&t)); |
| 390 |
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.
|
20 | PetscCall(SVDCyclicGetCyclicMat(svd,svd->B,svd->BT,&cyclic->C)); |
| 391 |
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.
|
20 | PetscCall(SVDCyclicGetECrossMat(svd,svd->A,svd->AT,&cyclic->D,t)); |
| 392 | } else { | ||
| 393 |
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.
|
114 | PetscCall(MatCreateVecs(svd->A,NULL,&t)); |
| 394 |
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.
|
114 | PetscCall(SVDCyclicGetCyclicMat(svd,svd->A,svd->AT,&cyclic->C)); |
| 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.
|
114 | PetscCall(SVDCyclicGetECrossMat(svd,svd->B,svd->BT,&cyclic->D,t)); |
| 396 | } | ||
| 397 |
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.
|
134 | PetscCall(VecDestroy(&t)); |
| 398 |
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.
|
134 | PetscCall(EPSSetOperators(cyclic->eps,cyclic->C,cyclic->D)); |
| 399 |
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.
|
134 | PetscCall(EPSGetProblemType(cyclic->eps,&ptype)); |
| 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.
|
134 | if (!ptype) PetscCall(EPSSetProblemType(cyclic->eps,EPS_GHEP)); |
| 401 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
321 | } else if (svd->ishyperbolic) { |
| 402 |
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.
|
59 | PetscCall(SVDCyclicGetCyclicMat(svd,svd->A,svd->AT,&cyclic->C)); |
| 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.
|
59 | PetscCall(MatCreateVecs(cyclic->C,&v,NULL)); |
| 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.
|
59 | PetscCall(VecSet(v,1.0)); |
| 405 |
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.
|
59 | PetscCall(VecGetArrayRead(svd->omega,&oa)); |
| 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.
|
59 | PetscCall(VecGetArray(v,&va)); |
| 407 |
6/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
59 | if (svd->swapped) PetscCall(PetscArraycpy(va+m,oa,n)); |
| 408 |
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.
|
47 | else PetscCall(PetscArraycpy(va,oa,m)); |
| 409 |
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.
|
59 | PetscCall(VecRestoreArrayRead(svd->omega,&oa)); |
| 410 |
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.
|
59 | PetscCall(VecRestoreArray(v,&va)); |
| 411 |
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.
|
59 | PetscCall(MatGetType(svd->OP,&Atype)); |
| 412 |
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.
|
59 | PetscCall(MatCreate(PetscObjectComm((PetscObject)svd),&Omega)); |
| 413 |
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.
|
59 | PetscCall(MatSetSizes(Omega,m+n,m+n,M+N,M+N)); |
| 414 |
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.
|
59 | PetscCall(MatSetType(Omega,Atype)); |
| 415 |
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.
|
59 | PetscCall(MatDiagonalSet(Omega,v,INSERT_VALUES)); |
| 416 |
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.
|
59 | PetscCall(EPSSetOperators(cyclic->eps,cyclic->C,Omega)); |
| 417 |
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.
|
59 | PetscCall(EPSSetProblemType(cyclic->eps,EPS_GHIEP)); |
| 418 |
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.
|
59 | PetscCall(MatDestroy(&Omega)); |
| 419 |
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.
|
59 | PetscCall(VecDestroy(&v)); |
| 420 | } else { | ||
| 421 |
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.
|
262 | PetscCall(SVDCyclicGetCyclicMat(svd,svd->A,svd->AT,&cyclic->C)); |
| 422 |
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.
|
262 | PetscCall(EPSSetOperators(cyclic->eps,cyclic->C,NULL)); |
| 423 |
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.
|
262 | PetscCall(EPSSetProblemType(cyclic->eps,EPS_HEP)); |
| 424 | } | ||
| 425 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
455 | if (!cyclic->usereps) { |
| 426 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
441 | if (svd->which == SVD_LARGEST) { |
| 427 |
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.
|
396 | PetscCall(EPSGetST(cyclic->eps,&st)); |
| 428 |
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.
|
396 | PetscCall(PetscObjectTypeCompare((PetscObject)st,STSINVERT,&issinv)); |
| 429 |
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.
|
396 | if (issinv) PetscCall(EPSSetWhichEigenpairs(cyclic->eps,EPS_TARGET_MAGNITUDE)); |
| 430 |
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.
|
388 | else if (svd->ishyperbolic) PetscCall(EPSSetWhichEigenpairs(cyclic->eps,EPS_LARGEST_MAGNITUDE)); |
| 431 |
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.
|
334 | else PetscCall(EPSSetWhichEigenpairs(cyclic->eps,EPS_LARGEST_REAL)); |
| 432 | } else { | ||
| 433 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
45 | if (svd->isgeneralized) { /* computes sigma^{-1} via alternative pencil */ |
| 434 |
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.
|
20 | PetscCall(EPSSetWhichEigenpairs(cyclic->eps,EPS_LARGEST_REAL)); |
| 435 | } else { | ||
| 436 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 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.
|
25 | if (svd->ishyperbolic) PetscCall(EPSSetWhichEigenpairs(cyclic->eps,EPS_TARGET_MAGNITUDE)); |
| 437 |
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 | else PetscCall(EPSSetEigenvalueComparison(cyclic->eps,SlepcCompareSmallestPosReal,NULL)); |
| 438 |
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 | PetscCall(EPSSetTarget(cyclic->eps,0.0)); |
| 439 | } | ||
| 440 | } | ||
| 441 |
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.
|
441 | PetscCall(EPSGetDimensions(cyclic->eps,&nev,&ncv,&mpd)); |
| 442 |
3/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
441 | PetscCheck(nev==1 || nev>=2*svd->nsv,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_WRONG,"The number of requested eigenvalues %" PetscInt_FMT " must be at least 2*%" PetscInt_FMT,nev,svd->nsv); |
| 443 | 441 | nev = PetscMax(nev,2*svd->nsv); | |
| 444 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
441 | if (ncv==PETSC_DETERMINE && svd->ncv!=PETSC_DETERMINE) ncv = PetscMax(3*svd->nsv,svd->ncv); |
| 445 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
441 | if (mpd==PETSC_DETERMINE && svd->mpd!=PETSC_DETERMINE) mpd = svd->mpd; |
| 446 |
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.
|
441 | PetscCall(EPSSetDimensions(cyclic->eps,nev,ncv,mpd)); |
| 447 |
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.
|
441 | PetscCall(EPSGetTolerances(cyclic->eps,&tol,&maxit)); |
| 448 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
497 | if (tol==(PetscReal)PETSC_DETERMINE) tol = svd->tol==(PetscReal)PETSC_DETERMINE? SLEPC_DEFAULT_TOL/10.0: svd->tol; |
| 449 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
441 | if (maxit==PETSC_DETERMINE) maxit = svd->max_it; |
| 450 |
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.
|
441 | PetscCall(EPSSetTolerances(cyclic->eps,tol,maxit)); |
| 451 |
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.
|
441 | switch (svd->conv) { |
| 452 | 36 | case SVD_CONV_ABS: | |
| 453 |
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.
|
36 | PetscCall(EPSSetConvergenceTest(cyclic->eps,EPS_CONV_ABS));break; |
| 454 | 271 | case SVD_CONV_REL: | |
| 455 |
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.
|
271 | PetscCall(EPSSetConvergenceTest(cyclic->eps,EPS_CONV_REL));break; |
| 456 | 134 | case SVD_CONV_NORM: | |
| 457 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
134 | if (svd->isgeneralized) { |
| 458 |
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.
|
134 | if (!svd->nrma) PetscCall(MatNorm(svd->OP,NORM_INFINITY,&svd->nrma)); |
| 459 |
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.
|
134 | if (!svd->nrmb) PetscCall(MatNorm(svd->OPb,NORM_INFINITY,&svd->nrmb)); |
| 460 |
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.
|
134 | PetscCall(EPSSetConvergenceTestFunction(cyclic->eps,EPSConv_Cyclic,svd,NULL)); |
| 461 | } else { | ||
| 462 | ✗ | PetscCall(EPSSetConvergenceTest(cyclic->eps,EPS_CONV_NORM));break; | |
| 463 | } | ||
| 464 | break; | ||
| 465 | ✗ | case SVD_CONV_MAXIT: | |
| 466 | ✗ | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Maxit convergence test not supported in this solver"); | |
| 467 | ✗ | case SVD_CONV_USER: | |
| 468 | ✗ | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"User-defined convergence test not supported in this solver"); | |
| 469 | } | ||
| 470 | 2 | } | |
| 471 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
455 | SVDCheckUnsupported(svd,SVD_FEATURE_STOPPING); |
| 472 | /* Transfer the trackall option from svd to eps */ | ||
| 473 |
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.
|
455 | PetscCall(SVDGetTrackAll(svd,&trackall)); |
| 474 |
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.
|
455 | PetscCall(EPSSetTrackAll(cyclic->eps,trackall)); |
| 475 | /* Transfer the initial subspace from svd to eps */ | ||
| 476 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
455 | if (svd->nini<0 || svd->ninil<0) { |
| 477 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
96 | for (i=0;i<-PetscMin(svd->nini,svd->ninil);i++) { |
| 478 |
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.
|
48 | PetscCall(MatCreateVecs(cyclic->C,&v,NULL)); |
| 479 |
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.
|
48 | PetscCall(VecGetArrayWrite(v,&va)); |
| 480 |
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.
|
48 | if (svd->isgeneralized) PetscCall(MatGetLocalSize(svd->B,&p,NULL)); |
| 481 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
48 | k = (svd->isgeneralized && svd->which==SVD_SMALLEST)? p: m; /* size of upper block row */ |
| 482 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
48 | if (i<-svd->ninil) { |
| 483 |
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.
|
48 | PetscCall(VecGetArrayRead(svd->ISL[i],&isa)); |
| 484 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
48 | if (svd->isgeneralized) { |
| 485 |
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(VecGetLocalSize(svd->ISL[i],&isl)); |
| 486 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10 | PetscCheck(isl==m+p,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Size mismatch for left initial vector"); |
| 487 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | offset = (svd->which==SVD_SMALLEST)? m: 0; |
| 488 |
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(PetscArraycpy(va,isa+offset,k)); |
| 489 | } else { | ||
| 490 |
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.
|
38 | PetscCall(VecGetLocalSize(svd->ISL[i],&isl)); |
| 491 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
38 | PetscCheck(isl==k,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Size mismatch for left initial vector"); |
| 492 |
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.
|
38 | PetscCall(PetscArraycpy(va,isa,k)); |
| 493 | } | ||
| 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.
|
48 | PetscCall(VecRestoreArrayRead(svd->IS[i],&isa)); |
| 495 | ✗ | } else PetscCall(PetscArrayzero(&va,k)); | |
| 496 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
48 | if (i<-svd->nini) { |
| 497 |
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.
|
48 | PetscCall(VecGetLocalSize(svd->IS[i],&isl)); |
| 498 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
48 | PetscCheck(isl==n,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Size mismatch for right initial vector"); |
| 499 |
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.
|
48 | PetscCall(VecGetArrayRead(svd->IS[i],&isa)); |
| 500 |
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.
|
48 | PetscCall(PetscArraycpy(va+k,isa,n)); |
| 501 |
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.
|
48 | PetscCall(VecRestoreArrayRead(svd->IS[i],&isa)); |
| 502 | ✗ | } else PetscCall(PetscArrayzero(va+k,n)); | |
| 503 |
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.
|
48 | PetscCall(VecRestoreArrayWrite(v,&va)); |
| 504 |
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.
|
48 | PetscCall(VecDestroy(&svd->IS[i])); |
| 505 | 48 | svd->IS[i] = v; | |
| 506 | } | ||
| 507 | 48 | svd->nini = PetscMin(svd->nini,svd->ninil); | |
| 508 |
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.
|
48 | PetscCall(EPSSetInitialSpace(cyclic->eps,-svd->nini,svd->IS)); |
| 509 |
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.
|
48 | PetscCall(SlepcBasisDestroy_Private(&svd->nini,&svd->IS)); |
| 510 |
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.
|
48 | PetscCall(SlepcBasisDestroy_Private(&svd->ninil,&svd->ISL)); |
| 511 | } | ||
| 512 |
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.
|
455 | PetscCall(EPSSetUp(cyclic->eps)); |
| 513 |
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.
|
455 | PetscCall(EPSGetDimensions(cyclic->eps,NULL,&svd->ncv,&svd->mpd)); |
| 514 | 455 | svd->ncv = PetscMin(svd->ncv,PetscMin(M,N)); | |
| 515 |
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.
|
455 | PetscCall(EPSGetTolerances(cyclic->eps,NULL,&svd->max_it)); |
| 516 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
455 | if (svd->tol==(PetscReal)PETSC_DETERMINE) svd->tol = SLEPC_DEFAULT_TOL; |
| 517 | |||
| 518 | 455 | svd->leftbasis = PETSC_TRUE; | |
| 519 |
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.
|
455 | PetscCall(SVDAllocateSolution(svd,0)); |
| 520 |
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.
|
89 | PetscFunctionReturn(PETSC_SUCCESS); |
| 521 | } | ||
| 522 | |||
| 523 | 309812 | static PetscErrorCode SVDCyclicCheckEigenvalue(SVD svd,PetscScalar er,PetscScalar ei,PetscReal *sigma,PetscBool *isreal) | |
| 524 | { | ||
| 525 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
309812 | PetscFunctionBegin; |
| 526 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 5 times.
|
309812 | if (svd->ishyperbolic && PetscDefined(USE_COMPLEX) && PetscAbsReal(PetscImaginaryPart(er))>10*PetscAbsReal(PetscRealPart(er))) { |
| 527 | 704 | *sigma = PetscImaginaryPart(er); | |
| 528 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
704 | if (isreal) *isreal = PETSC_FALSE; |
| 529 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
309108 | } else if (svd->ishyperbolic && !PetscDefined(USE_COMPLEX) && PetscAbsScalar(ei)>10*PetscAbsScalar(er)) { |
| 530 | 13638 | *sigma = PetscRealPart(ei); | |
| 531 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
|
13638 | if (isreal) *isreal = PETSC_FALSE; |
| 532 | } else { | ||
| 533 | 295470 | *sigma = PetscRealPart(er); | |
| 534 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
295470 | if (isreal) *isreal = PETSC_TRUE; |
| 535 | } | ||
| 536 |
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.
|
309812 | PetscFunctionReturn(PETSC_SUCCESS); |
| 537 | } | ||
| 538 | |||
| 539 | 455 | static PetscErrorCode SVDSolve_Cyclic(SVD svd) | |
| 540 | { | ||
| 541 | 455 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 542 | 455 | PetscInt i,j,nconv; | |
| 543 | 455 | PetscScalar er,ei; | |
| 544 | 455 | PetscReal sigma; | |
| 545 | |||
| 546 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
455 | PetscFunctionBegin; |
| 547 |
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.
|
455 | PetscCall(EPSSolve(cyclic->eps)); |
| 548 |
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.
|
455 | PetscCall(EPSGetConverged(cyclic->eps,&nconv)); |
| 549 | 455 | nconv = PetscMin(nconv,svd->ncv); | |
| 550 |
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.
|
455 | PetscCall(EPSGetIterationNumber(cyclic->eps,&svd->its)); |
| 551 |
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.
|
455 | PetscCall(EPSGetConvergedReason(cyclic->eps,(EPSConvergedReason*)&svd->reason)); |
| 552 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5642 | for (i=0,j=0;i<nconv;i++) { |
| 553 |
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.
|
5187 | PetscCall(EPSGetEigenvalue(cyclic->eps,i,&er,&ei)); |
| 554 |
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.
|
5187 | PetscCall(SVDCyclicCheckEigenvalue(svd,er,ei,&sigma,NULL)); |
| 555 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5187 | if (sigma>0.0) { |
| 556 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 10 times.
|
3909 | if (svd->isgeneralized && svd->which==SVD_SMALLEST) svd->sigma[j] = 1.0/sigma; |
| 557 | 3789 | else svd->sigma[j] = sigma; | |
| 558 | 3909 | j++; | |
| 559 | } | ||
| 560 | } | ||
| 561 | 455 | svd->nconv = j; | |
| 562 |
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.
|
455 | PetscFunctionReturn(PETSC_SUCCESS); |
| 563 | } | ||
| 564 | |||
| 565 | 222 | static PetscErrorCode SVDComputeVectors_Cyclic_Standard(SVD svd) | |
| 566 | { | ||
| 567 | 222 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 568 | 222 | PetscInt i,j,m,nconv; | |
| 569 | 222 | PetscScalar er,ei; | |
| 570 | 222 | PetscReal sigma; | |
| 571 | 222 | const PetscScalar *px; | |
| 572 | 222 | Vec x,x1,x2; | |
| 573 | |||
| 574 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
222 | 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.
|
222 | PetscCall(MatCreateVecs(cyclic->C,&x,NULL)); |
| 576 |
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.
|
222 | PetscCall(MatGetLocalSize(svd->A,&m,NULL)); |
| 577 |
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.
|
222 | PetscCall(MatCreateVecsEmpty(svd->A,&x2,&x1)); |
| 578 |
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.
|
222 | PetscCall(EPSGetConverged(cyclic->eps,&nconv)); |
| 579 | 222 | nconv = PetscMin(nconv,svd->ncv); | |
| 580 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1816 | for (i=0,j=0;i<nconv;i++) { |
| 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.
|
1594 | PetscCall(EPSGetEigenpair(cyclic->eps,i,&er,&ei,x,NULL)); |
| 582 |
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.
|
1594 | PetscCall(SVDCyclicCheckEigenvalue(svd,er,ei,&sigma,NULL)); |
| 583 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
1594 | if (sigma<0.0) continue; |
| 584 |
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.
|
1594 | PetscCall(VecGetArrayRead(x,&px)); |
| 585 |
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.
|
1594 | PetscCall(VecPlaceArray(x1,px)); |
| 586 |
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.
|
1594 | PetscCall(VecPlaceArray(x2,px+m)); |
| 587 |
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.
|
1594 | PetscCall(BVInsertVec(svd->U,j,x1)); |
| 588 |
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.
|
1594 | PetscCall(BVScaleColumn(svd->U,j,PETSC_SQRT2)); |
| 589 |
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.
|
1594 | PetscCall(BVInsertVec(svd->V,j,x2)); |
| 590 |
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.
|
1594 | PetscCall(BVScaleColumn(svd->V,j,PETSC_SQRT2)); |
| 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.
|
1594 | PetscCall(VecResetArray(x1)); |
| 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.
|
1594 | PetscCall(VecResetArray(x2)); |
| 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.
|
1594 | PetscCall(VecRestoreArrayRead(x,&px)); |
| 594 | 1594 | j++; | |
| 595 | } | ||
| 596 |
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.
|
222 | PetscCall(VecDestroy(&x)); |
| 597 |
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.
|
222 | PetscCall(VecDestroy(&x1)); |
| 598 |
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.
|
222 | PetscCall(VecDestroy(&x2)); |
| 599 |
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.
|
42 | PetscFunctionReturn(PETSC_SUCCESS); |
| 600 | } | ||
| 601 | |||
| 602 | 134 | static PetscErrorCode SVDComputeVectors_Cyclic_Generalized(SVD svd) | |
| 603 | { | ||
| 604 | 134 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 605 | 134 | PetscInt i,j,m,p,nconv; | |
| 606 | 134 | PetscScalar *dst,er,ei; | |
| 607 | 134 | PetscReal sigma; | |
| 608 | 134 | const PetscScalar *src,*px; | |
| 609 | 134 | Vec u,v,x,x1,x2,uv; | |
| 610 | |||
| 611 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
134 | PetscFunctionBegin; |
| 612 |
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.
|
134 | PetscCall(MatGetLocalSize(svd->A,&m,NULL)); |
| 613 |
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.
|
134 | PetscCall(MatGetLocalSize(svd->B,&p,NULL)); |
| 614 |
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.
|
134 | PetscCall(MatCreateVecs(cyclic->C,&x,NULL)); |
| 615 |
6/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 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.
|
134 | if (svd->which==SVD_SMALLEST) PetscCall(MatCreateVecsEmpty(svd->B,&x1,&x2)); |
| 616 |
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.
|
114 | else PetscCall(MatCreateVecsEmpty(svd->A,&x2,&x1)); |
| 617 |
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.
|
134 | PetscCall(MatCreateVecs(svd->A,NULL,&u)); |
| 618 |
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.
|
134 | PetscCall(MatCreateVecs(svd->B,NULL,&v)); |
| 619 |
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.
|
134 | PetscCall(EPSGetConverged(cyclic->eps,&nconv)); |
| 620 | 134 | nconv = PetscMin(nconv,svd->ncv); | |
| 621 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1045 | for (i=0,j=0;i<nconv;i++) { |
| 622 |
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.
|
911 | PetscCall(EPSGetEigenpair(cyclic->eps,i,&er,&ei,x,NULL)); |
| 623 |
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.
|
911 | PetscCall(SVDCyclicCheckEigenvalue(svd,er,ei,&sigma,NULL)); |
| 624 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
911 | if (sigma<0.0) continue; |
| 625 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
911 | if (svd->which==SVD_SMALLEST) { |
| 626 | /* evec_i = 1/sqrt(2)*[ v_i; w_i ], w_i = x_i/c_i */ | ||
| 627 |
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.
|
120 | PetscCall(VecGetArrayRead(x,&px)); |
| 628 |
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.
|
120 | PetscCall(VecPlaceArray(x2,px)); |
| 629 |
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.
|
120 | PetscCall(VecPlaceArray(x1,px+p)); |
| 630 |
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.
|
120 | PetscCall(VecCopy(x2,v)); |
| 631 |
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.
|
120 | PetscCall(VecScale(v,PETSC_SQRT2)); /* v_i = sqrt(2)*evec_i_1 */ |
| 632 |
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.
|
120 | PetscCall(VecScale(x1,PETSC_SQRT2)); /* w_i = sqrt(2)*evec_i_2 */ |
| 633 |
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.
|
120 | PetscCall(MatMult(svd->A,x1,u)); /* A*w_i = u_i */ |
| 634 |
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.
|
120 | PetscCall(VecScale(x1,1.0/PetscSqrtScalar(1.0+sigma*sigma))); /* x_i = w_i*c_i */ |
| 635 |
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.
|
120 | PetscCall(BVInsertVec(svd->V,j,x1)); |
| 636 |
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.
|
120 | PetscCall(VecResetArray(x2)); |
| 637 |
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.
|
120 | PetscCall(VecResetArray(x1)); |
| 638 |
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.
|
120 | PetscCall(VecRestoreArrayRead(x,&px)); |
| 639 | } else { | ||
| 640 | /* evec_i = 1/sqrt(2)*[ u_i; w_i ], w_i = x_i/s_i */ | ||
| 641 |
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.
|
791 | PetscCall(VecGetArrayRead(x,&px)); |
| 642 |
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.
|
791 | PetscCall(VecPlaceArray(x1,px)); |
| 643 |
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.
|
791 | PetscCall(VecPlaceArray(x2,px+m)); |
| 644 |
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.
|
791 | PetscCall(VecCopy(x1,u)); |
| 645 |
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.
|
791 | PetscCall(VecScale(u,PETSC_SQRT2)); /* u_i = sqrt(2)*evec_i_1 */ |
| 646 |
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.
|
791 | PetscCall(VecScale(x2,PETSC_SQRT2)); /* w_i = sqrt(2)*evec_i_2 */ |
| 647 |
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.
|
791 | PetscCall(MatMult(svd->B,x2,v)); /* B*w_i = v_i */ |
| 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.
|
791 | PetscCall(VecScale(x2,1.0/PetscSqrtScalar(1.0+sigma*sigma))); /* x_i = w_i*s_i */ |
| 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.
|
791 | PetscCall(BVInsertVec(svd->V,j,x2)); |
| 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.
|
791 | PetscCall(VecResetArray(x1)); |
| 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.
|
791 | PetscCall(VecResetArray(x2)); |
| 652 |
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.
|
791 | PetscCall(VecRestoreArrayRead(x,&px)); |
| 653 | } | ||
| 654 | /* copy [u;v] to U[j] */ | ||
| 655 |
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.
|
911 | PetscCall(BVGetColumn(svd->U,j,&uv)); |
| 656 |
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.
|
911 | PetscCall(VecGetArrayWrite(uv,&dst)); |
| 657 |
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.
|
911 | PetscCall(VecGetArrayRead(u,&src)); |
| 658 |
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.
|
911 | PetscCall(PetscArraycpy(dst,src,m)); |
| 659 |
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.
|
911 | PetscCall(VecRestoreArrayRead(u,&src)); |
| 660 |
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.
|
911 | PetscCall(VecGetArrayRead(v,&src)); |
| 661 |
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.
|
911 | PetscCall(PetscArraycpy(dst+m,src,p)); |
| 662 |
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.
|
911 | PetscCall(VecRestoreArrayRead(v,&src)); |
| 663 |
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.
|
911 | PetscCall(VecRestoreArrayWrite(uv,&dst)); |
| 664 |
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.
|
911 | PetscCall(BVRestoreColumn(svd->U,j,&uv)); |
| 665 | 911 | j++; | |
| 666 | } | ||
| 667 |
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.
|
134 | PetscCall(VecDestroy(&x)); |
| 668 |
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.
|
134 | PetscCall(VecDestroy(&x1)); |
| 669 |
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.
|
134 | PetscCall(VecDestroy(&x2)); |
| 670 |
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.
|
134 | PetscCall(VecDestroy(&u)); |
| 671 |
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.
|
134 | PetscCall(VecDestroy(&v)); |
| 672 |
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); |
| 673 | } | ||
| 674 | |||
| 675 | #if defined(PETSC_USE_COMPLEX) | ||
| 676 | /* VecMaxAbs: returns the entry of x that has max(abs(x(i))), using w as a workspace vector */ | ||
| 677 | 12 | static PetscErrorCode VecMaxAbs(Vec x,Vec w,PetscScalar *v) | |
| 678 | { | ||
| 679 | 12 | PetscMPIInt size,rank,root; | |
| 680 | 12 | const PetscScalar *xx; | |
| 681 | 12 | const PetscInt *ranges; | |
| 682 | 12 | PetscReal val; | |
| 683 | 12 | PetscInt p; | |
| 684 | |||
| 685 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
12 | PetscFunctionBegin; |
| 686 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecCopy(x,w)); |
| 687 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecAbs(w)); |
| 688 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecMax(w,&p,&val)); |
| 689 |
14/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 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.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
12 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)x),&size)); |
| 690 |
14/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 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.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
12 | PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)x),&rank)); |
| 691 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecGetOwnershipRanges(x,&ranges)); |
| 692 |
3/6✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
12 | for (root=0;root<size;root++) if (p>=ranges[root] && p<ranges[root+1]) break; |
| 693 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
12 | if (rank==root) { |
| 694 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecGetArrayRead(x,&xx)); |
| 695 | 12 | *v = xx[p-ranges[root]]; | |
| 696 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecRestoreArrayRead(x,&xx)); |
| 697 | } | ||
| 698 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
24 | PetscCallMPI(MPI_Bcast(v,1,MPIU_SCALAR,root,PetscObjectComm((PetscObject)x))); |
| 699 |
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.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
| 700 | } | ||
| 701 | #endif | ||
| 702 | |||
| 703 | 59 | static PetscErrorCode SVDComputeVectors_Cyclic_Hyperbolic(SVD svd) | |
| 704 | { | ||
| 705 | 59 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 706 | 59 | PetscInt i,j,m,n,nconv; | |
| 707 | 59 | PetscScalar er,ei; | |
| 708 | 59 | PetscReal sigma,nrm; | |
| 709 | 59 | PetscBool isreal; | |
| 710 | 59 | const PetscScalar *px; | |
| 711 | 59 | Vec u,x,xi=NULL,x1,x2,x1i=NULL,x2i; | |
| 712 | 59 | BV U=NULL,V=NULL; | |
| 713 | #if !defined(PETSC_USE_COMPLEX) | ||
| 714 | 32 | const PetscScalar *pxi; | |
| 715 | 32 | PetscReal nrmr,nrmi; | |
| 716 | #else | ||
| 717 | 27 | PetscScalar alpha; | |
| 718 | #endif | ||
| 719 | |||
| 720 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
59 | PetscFunctionBegin; |
| 721 |
6/8✓ 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 2 times.
|
59 | PetscCall(MatCreateVecs(cyclic->C,&x,svd->ishyperbolic?&xi:NULL)); |
| 722 |
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.
|
59 | PetscCall(MatGetLocalSize(svd->A,&m,NULL)); |
| 723 |
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.
|
59 | PetscCall(MatCreateVecsEmpty(svd->OP,&x2,&x1)); |
| 724 | #if defined(PETSC_USE_COMPLEX) | ||
| 725 |
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.
|
27 | PetscCall(MatCreateVecs(svd->OP,&x2i,&x1i)); |
| 726 | #else | ||
| 727 |
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.
|
32 | PetscCall(MatCreateVecsEmpty(svd->OP,&x2i,&x1i)); |
| 728 | #endif | ||
| 729 | /* set-up Omega-normalization of U */ | ||
| 730 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
|
59 | U = svd->swapped? svd->V: svd->U; |
| 731 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
|
59 | V = svd->swapped? svd->U: svd->V; |
| 732 |
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.
|
59 | PetscCall(BVGetSizes(U,&n,NULL,NULL)); |
| 733 |
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.
|
59 | PetscCall(BV_SetMatrixDiagonal(U,svd->omega,svd->A)); |
| 734 |
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.
|
59 | PetscCall(EPSGetConverged(cyclic->eps,&nconv)); |
| 735 | 59 | nconv = PetscMin(nconv,svd->ncv); | |
| 736 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2626 | for (i=0,j=0;i<nconv;i++) { |
| 737 |
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.
|
2567 | PetscCall(EPSGetEigenpair(cyclic->eps,i,&er,&ei,x,xi)); |
| 738 |
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.
|
2567 | PetscCall(SVDCyclicCheckEigenvalue(svd,er,ei,&sigma,&isreal)); |
| 739 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2567 | if (sigma<0.0) continue; |
| 740 |
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.
|
1289 | PetscCall(VecGetArrayRead(x,&px)); |
| 741 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
|
1289 | if (svd->swapped) { |
| 742 |
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.
|
79 | PetscCall(VecPlaceArray(x2,px)); |
| 743 |
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.
|
79 | PetscCall(VecPlaceArray(x1,px+m)); |
| 744 | } else { | ||
| 745 |
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.
|
1210 | PetscCall(VecPlaceArray(x1,px)); |
| 746 |
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.
|
1210 | PetscCall(VecPlaceArray(x2,px+n)); |
| 747 | } | ||
| 748 | #if defined(PETSC_USE_COMPLEX) | ||
| 749 |
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.
|
605 | PetscCall(BVInsertVec(U,j,x1)); |
| 750 |
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.
|
605 | PetscCall(BVInsertVec(V,j,x2)); |
| 751 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
|
605 | if (!isreal) { |
| 752 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(VecMaxAbs(x1,x1i,&alpha)); |
| 753 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(BVScaleColumn(U,j,PetscAbsScalar(alpha)/alpha)); |
| 754 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
12 | PetscCall(BVScaleColumn(V,j,PetscAbsScalar(alpha)/(alpha*PETSC_i))); |
| 755 | } | ||
| 756 | #else | ||
| 757 |
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.
|
684 | PetscCall(VecGetArrayRead(xi,&pxi)); |
| 758 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
|
684 | if (svd->swapped) { |
| 759 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
37 | PetscCall(VecPlaceArray(x2i,pxi)); |
| 760 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
37 | PetscCall(VecPlaceArray(x1i,pxi+m)); |
| 761 | } else { | ||
| 762 |
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.
|
647 | PetscCall(VecPlaceArray(x1i,pxi)); |
| 763 |
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.
|
647 | PetscCall(VecPlaceArray(x2i,pxi+n)); |
| 764 | } | ||
| 765 |
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.
|
684 | PetscCall(VecNorm(x2,NORM_2,&nrmr)); |
| 766 |
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.
|
684 | PetscCall(VecNorm(x2i,NORM_2,&nrmi)); |
| 767 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
|
684 | if (nrmi>nrmr) { |
| 768 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
8 | if (isreal) { |
| 769 | ✗ | PetscCall(BVInsertVec(U,j,x1i)); | |
| 770 | ✗ | PetscCall(BVInsertVec(V,j,x2i)); | |
| 771 | } else { | ||
| 772 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8 | PetscCall(BVInsertVec(U,j,x1)); |
| 773 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
8 | PetscCall(BVInsertVec(V,j,x2i)); |
| 774 | } | ||
| 775 | } else { | ||
| 776 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
|
676 | if (isreal) { |
| 777 |
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.
|
672 | PetscCall(BVInsertVec(U,j,x1)); |
| 778 |
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.
|
672 | PetscCall(BVInsertVec(V,j,x2)); |
| 779 | } else { | ||
| 780 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(BVInsertVec(U,j,x1i)); |
| 781 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(BVScaleColumn(U,j,-1.0)); |
| 782 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
4 | PetscCall(BVInsertVec(V,j,x2)); |
| 783 | } | ||
| 784 | } | ||
| 785 |
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.
|
684 | PetscCall(VecResetArray(x1i)); |
| 786 |
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.
|
684 | PetscCall(VecResetArray(x2i)); |
| 787 |
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.
|
684 | PetscCall(VecRestoreArrayRead(xi,&pxi)); |
| 788 | #endif | ||
| 789 |
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.
|
1289 | PetscCall(VecResetArray(x1)); |
| 790 |
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.
|
1289 | PetscCall(VecResetArray(x2)); |
| 791 |
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.
|
1289 | PetscCall(VecRestoreArrayRead(x,&px)); |
| 792 |
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.
|
1289 | PetscCall(BVGetColumn(U,j,&u)); |
| 793 |
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.
|
1289 | PetscCall(VecPointwiseMult(u,u,svd->omega)); |
| 794 |
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.
|
1289 | PetscCall(BVRestoreColumn(U,j,&u)); |
| 795 |
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.
|
1289 | PetscCall(BVNormColumn(U,j,NORM_2,&nrm)); |
| 796 |
7/8✓ Branch 0 taken 6 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.
|
1289 | PetscCall(BVScaleColumn(U,j,1.0/PetscAbs(nrm))); |
| 797 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
1289 | svd->sign[j] = PetscSign(nrm); |
| 798 |
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.
|
1289 | PetscCall(BVNormColumn(V,j,NORM_2,&nrm)); |
| 799 |
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.
|
1289 | PetscCall(BVScaleColumn(V,j,1.0/nrm)); |
| 800 | 1289 | j++; | |
| 801 | } | ||
| 802 |
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.
|
59 | PetscCall(VecDestroy(&x)); |
| 803 |
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.
|
59 | PetscCall(VecDestroy(&x1)); |
| 804 |
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.
|
59 | PetscCall(VecDestroy(&x2)); |
| 805 |
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.
|
59 | PetscCall(VecDestroy(&xi)); |
| 806 |
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.
|
59 | PetscCall(VecDestroy(&x1i)); |
| 807 |
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.
|
59 | PetscCall(VecDestroy(&x2i)); |
| 808 |
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.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
| 809 | } | ||
| 810 | |||
| 811 | 415 | static PetscErrorCode SVDComputeVectors_Cyclic(SVD svd) | |
| 812 | { | ||
| 813 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
415 | PetscFunctionBegin; |
| 814 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
415 | switch (svd->problem_type) { |
| 815 | 222 | case SVD_STANDARD: | |
| 816 |
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.
|
222 | PetscCall(SVDComputeVectors_Cyclic_Standard(svd)); |
| 817 | break; | ||
| 818 | 134 | case SVD_GENERALIZED: | |
| 819 |
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.
|
134 | PetscCall(SVDComputeVectors_Cyclic_Generalized(svd)); |
| 820 | break; | ||
| 821 | 59 | case SVD_HYPERBOLIC: | |
| 822 |
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.
|
59 | PetscCall(SVDComputeVectors_Cyclic_Hyperbolic(svd)); |
| 823 | break; | ||
| 824 | ✗ | default: | |
| 825 | ✗ | SETERRQ(PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_WRONG,"Unknown singular value problem type"); | |
| 826 | } | ||
| 827 |
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.
|
81 | PetscFunctionReturn(PETSC_SUCCESS); |
| 828 | } | ||
| 829 | |||
| 830 | 11587 | static PetscErrorCode EPSMonitor_Cyclic(EPS eps,PetscInt its,PetscInt nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt nest,void *ctx) | |
| 831 | { | ||
| 832 | 11587 | PetscInt i,j; | |
| 833 | 11587 | SVD svd = (SVD)ctx; | |
| 834 | 11587 | PetscScalar er,ei; | |
| 835 | 11587 | PetscReal sigma; | |
| 836 | 11587 | ST st; | |
| 837 | |||
| 838 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
11587 | PetscFunctionBegin; |
| 839 | 11587 | nconv = 0; | |
| 840 |
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.
|
11587 | PetscCall(EPSGetST(eps,&st)); |
| 841 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
311140 | for (i=0,j=0;i<PetscMin(nest,svd->ncv);i++) { |
| 842 | 299553 | er = eigr[i]; ei = eigi[i]; | |
| 843 |
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.
|
299553 | PetscCall(STBackTransform(st,1,&er,&ei)); |
| 844 |
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.
|
299553 | PetscCall(SVDCyclicCheckEigenvalue(svd,er,ei,&sigma,NULL)); |
| 845 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
299553 | if (sigma>0.0) { |
| 846 | 153241 | svd->sigma[j] = sigma; | |
| 847 | 153241 | svd->errest[j] = errest[i]; | |
| 848 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
153241 | if (errest[i] && errest[i] < svd->tol) nconv++; |
| 849 | 153241 | j++; | |
| 850 | } | ||
| 851 | } | ||
| 852 | 11587 | nest = j; | |
| 853 |
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.
|
11587 | PetscCall(SVDMonitor(svd,its,nconv,svd->sigma,svd->errest,nest)); |
| 854 |
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.
|
2283 | PetscFunctionReturn(PETSC_SUCCESS); |
| 855 | } | ||
| 856 | |||
| 857 | 327 | static PetscErrorCode SVDSetFromOptions_Cyclic(SVD svd,PetscOptionItems PetscOptionsObject) | |
| 858 | { | ||
| 859 | 327 | PetscBool set,val; | |
| 860 | 327 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 861 | 327 | ST st; | |
| 862 | |||
| 863 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
327 | PetscFunctionBegin; |
| 864 |
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.
|
327 | PetscOptionsHeadBegin(PetscOptionsObject,"SVD Cyclic Options"); |
| 865 | |||
| 866 |
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.
|
327 | PetscCall(PetscOptionsBool("-svd_cyclic_explicitmatrix","Use cyclic explicit matrix","SVDCyclicSetExplicitMatrix",cyclic->explicitmatrix,&val,&set)); |
| 867 |
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.
|
327 | if (set) PetscCall(SVDCyclicSetExplicitMatrix(svd,val)); |
| 868 | |||
| 869 |
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.
|
327 | PetscOptionsHeadEnd(); |
| 870 | |||
| 871 |
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.
|
327 | if (!cyclic->eps) PetscCall(SVDCyclicGetEPS(svd,&cyclic->eps)); |
| 872 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
327 | if (!cyclic->explicitmatrix && !cyclic->usereps) { |
| 873 | /* use as default an ST with shell matrix and Jacobi */ | ||
| 874 |
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.
|
192 | PetscCall(EPSGetST(cyclic->eps,&st)); |
| 875 |
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.
|
192 | PetscCall(STSetMatMode(st,ST_MATMODE_SHELL)); |
| 876 | } | ||
| 877 |
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.
|
327 | PetscCall(EPSSetFromOptions(cyclic->eps)); |
| 878 |
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.
|
65 | PetscFunctionReturn(PETSC_SUCCESS); |
| 879 | } | ||
| 880 | |||
| 881 | 206 | static PetscErrorCode SVDCyclicSetExplicitMatrix_Cyclic(SVD svd,PetscBool explicitmat) | |
| 882 | { | ||
| 883 | 206 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 884 | |||
| 885 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
206 | PetscFunctionBegin; |
| 886 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
206 | if (cyclic->explicitmatrix != explicitmat) { |
| 887 | 135 | cyclic->explicitmatrix = explicitmat; | |
| 888 | 135 | svd->state = SVD_STATE_INITIAL; | |
| 889 | } | ||
| 890 |
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.
|
206 | PetscFunctionReturn(PETSC_SUCCESS); |
| 891 | } | ||
| 892 | |||
| 893 | /*@ | ||
| 894 | SVDCyclicSetExplicitMatrix - Indicate if the eigensolver operator | ||
| 895 | $H(A)=\begin{bmatrix}0&A\\A^*&0\end{bmatrix}$ must be computed explicitly. | ||
| 896 | |||
| 897 | Logically Collective | ||
| 898 | |||
| 899 | Input Parameters: | ||
| 900 | + svd - the singular value solver context | ||
| 901 | - explicitmat - `PETSC_TRUE` if $H(A)$ must be built explicitly | ||
| 902 | |||
| 903 | Options Database Key: | ||
| 904 | . -svd_cyclic_explicitmatrix - toggle the explicit construction of the matrix | ||
| 905 | |||
| 906 | Notes: | ||
| 907 | In GSVD and HSVD the equivalent eigenvalue problem has generalized form, | ||
| 908 | and hence two matrices are built. See [](#sec:svdback) for details. | ||
| 909 | |||
| 910 | By default the matrices are not built explicitly, but handled as shell matrices, | ||
| 911 | see `MATSHELL`. | ||
| 912 | |||
| 913 | Level: advanced | ||
| 914 | |||
| 915 | .seealso: [](ch:svd), [](#sec:svdback), `SVDCYCLIC`, `SVDCyclicGetExplicitMatrix()`, `MATSHELL` | ||
| 916 | @*/ | ||
| 917 | 206 | PetscErrorCode SVDCyclicSetExplicitMatrix(SVD svd,PetscBool explicitmat) | |
| 918 | { | ||
| 919 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
206 | PetscFunctionBegin; |
| 920 |
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.
|
206 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 921 |
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.
|
206 | PetscValidLogicalCollectiveBool(svd,explicitmat,2); |
| 922 |
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.
|
206 | PetscTryMethod(svd,"SVDCyclicSetExplicitMatrix_C",(SVD,PetscBool),(svd,explicitmat)); |
| 923 |
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.
|
206 | PetscFunctionReturn(PETSC_SUCCESS); |
| 924 | } | ||
| 925 | |||
| 926 | 14 | static PetscErrorCode SVDCyclicGetExplicitMatrix_Cyclic(SVD svd,PetscBool *explicitmat) | |
| 927 | { | ||
| 928 | 14 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 929 | |||
| 930 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
14 | PetscFunctionBegin; |
| 931 | 14 | *explicitmat = cyclic->explicitmatrix; | |
| 932 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 933 | } | ||
| 934 | |||
| 935 | /*@ | ||
| 936 | SVDCyclicGetExplicitMatrix - Returns the flag indicating if the cyclic | ||
| 937 | matrix $H(A)$ is built explicitly. | ||
| 938 | |||
| 939 | Not Collective | ||
| 940 | |||
| 941 | Input Parameter: | ||
| 942 | . svd - the singular value solver context | ||
| 943 | |||
| 944 | Output Parameter: | ||
| 945 | . explicitmat - the mode flag | ||
| 946 | |||
| 947 | Level: advanced | ||
| 948 | |||
| 949 | .seealso: [](ch:svd), `SVDCYCLIC`, `SVDCyclicSetExplicitMatrix()` | ||
| 950 | @*/ | ||
| 951 | 14 | PetscErrorCode SVDCyclicGetExplicitMatrix(SVD svd,PetscBool *explicitmat) | |
| 952 | { | ||
| 953 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
14 | PetscFunctionBegin; |
| 954 |
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.
|
14 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 955 |
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.
|
14 | PetscAssertPointer(explicitmat,2); |
| 956 |
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.
|
14 | PetscUseMethod(svd,"SVDCyclicGetExplicitMatrix_C",(SVD,PetscBool*),(svd,explicitmat)); |
| 957 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 958 | } | ||
| 959 | |||
| 960 | 14 | static PetscErrorCode SVDCyclicSetEPS_Cyclic(SVD svd,EPS eps) | |
| 961 | { | ||
| 962 | 14 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 963 | |||
| 964 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
14 | PetscFunctionBegin; |
| 965 |
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.
|
14 | PetscCall(PetscObjectReference((PetscObject)eps)); |
| 966 |
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.
|
14 | PetscCall(EPSDestroy(&cyclic->eps)); |
| 967 | 14 | cyclic->eps = eps; | |
| 968 | 14 | cyclic->usereps = PETSC_TRUE; | |
| 969 | 14 | svd->state = SVD_STATE_INITIAL; | |
| 970 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 971 | } | ||
| 972 | |||
| 973 | /*@ | ||
| 974 | SVDCyclicSetEPS - Associate an eigensolver object (`EPS`) to the | ||
| 975 | singular value solver. | ||
| 976 | |||
| 977 | Collective | ||
| 978 | |||
| 979 | Input Parameters: | ||
| 980 | + svd - the singular value solver context | ||
| 981 | - eps - the linear eigensolver context | ||
| 982 | |||
| 983 | Level: advanced | ||
| 984 | |||
| 985 | .seealso: [](ch:svd), `SVDCYCLIC`, `SVDCyclicGetEPS()` | ||
| 986 | @*/ | ||
| 987 | 14 | PetscErrorCode SVDCyclicSetEPS(SVD svd,EPS eps) | |
| 988 | { | ||
| 989 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
14 | PetscFunctionBegin; |
| 990 |
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.
|
14 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 991 |
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.
|
14 | PetscValidHeaderSpecific(eps,EPS_CLASSID,2); |
| 992 |
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.
|
14 | PetscCheckSameComm(svd,1,eps,2); |
| 993 |
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.
|
14 | PetscTryMethod(svd,"SVDCyclicSetEPS_C",(SVD,EPS),(svd,eps)); |
| 994 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 995 | } | ||
| 996 | |||
| 997 | 333 | static PetscErrorCode SVDCyclicGetEPS_Cyclic(SVD svd,EPS *eps) | |
| 998 | { | ||
| 999 | 333 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 1000 | |||
| 1001 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
333 | PetscFunctionBegin; |
| 1002 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
333 | if (!cyclic->eps) { |
| 1003 |
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.
|
333 | PetscCall(EPSCreate(PetscObjectComm((PetscObject)svd),&cyclic->eps)); |
| 1004 |
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.
|
333 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)cyclic->eps,(PetscObject)svd,1)); |
| 1005 |
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.
|
333 | PetscCall(EPSSetOptionsPrefix(cyclic->eps,((PetscObject)svd)->prefix)); |
| 1006 |
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.
|
333 | PetscCall(EPSAppendOptionsPrefix(cyclic->eps,"svd_cyclic_")); |
| 1007 |
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.
|
333 | PetscCall(PetscObjectSetOptions((PetscObject)cyclic->eps,((PetscObject)svd)->options)); |
| 1008 |
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.
|
333 | PetscCall(EPSSetWhichEigenpairs(cyclic->eps,EPS_LARGEST_REAL)); |
| 1009 |
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.
|
333 | PetscCall(EPSMonitorSet(cyclic->eps,EPSMonitor_Cyclic,svd,NULL)); |
| 1010 | } | ||
| 1011 | 333 | *eps = cyclic->eps; | |
| 1012 |
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.
|
333 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1013 | } | ||
| 1014 | |||
| 1015 | /*@ | ||
| 1016 | SVDCyclicGetEPS - Retrieve the eigensolver object (`EPS`) associated | ||
| 1017 | to the singular value solver. | ||
| 1018 | |||
| 1019 | Collective | ||
| 1020 | |||
| 1021 | Input Parameter: | ||
| 1022 | . svd - the singular value solver context | ||
| 1023 | |||
| 1024 | Output Parameter: | ||
| 1025 | . eps - the linear eigensolver context | ||
| 1026 | |||
| 1027 | Level: advanced | ||
| 1028 | |||
| 1029 | .seealso: [](ch:svd), `SVDCYCLIC`, `SVDCyclicSetEPS()` | ||
| 1030 | @*/ | ||
| 1031 | 333 | PetscErrorCode SVDCyclicGetEPS(SVD svd,EPS *eps) | |
| 1032 | { | ||
| 1033 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
333 | PetscFunctionBegin; |
| 1034 |
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.
|
333 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
| 1035 |
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.
|
333 | PetscAssertPointer(eps,2); |
| 1036 |
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.
|
333 | PetscUseMethod(svd,"SVDCyclicGetEPS_C",(SVD,EPS*),(svd,eps)); |
| 1037 |
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.
|
333 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1038 | } | ||
| 1039 | |||
| 1040 | 8 | static PetscErrorCode SVDView_Cyclic(SVD svd,PetscViewer viewer) | |
| 1041 | { | ||
| 1042 | 8 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 1043 | 8 | PetscBool isascii; | |
| 1044 | |||
| 1045 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8 | PetscFunctionBegin; |
| 1046 |
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(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 1047 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | if (isascii) { |
| 1048 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
|
8 | if (!cyclic->eps) PetscCall(SVDCyclicGetEPS(svd,&cyclic->eps)); |
| 1049 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8 | PetscCall(PetscViewerASCIIPrintf(viewer," %s matrix\n",cyclic->explicitmatrix?"explicit":"implicit")); |
| 1050 |
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(PetscViewerASCIIPushTab(viewer)); |
| 1051 |
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(EPSView(cyclic->eps,viewer)); |
| 1052 |
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(PetscViewerASCIIPopTab(viewer)); |
| 1053 | } | ||
| 1054 |
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); |
| 1055 | } | ||
| 1056 | |||
| 1057 | 357 | static PetscErrorCode SVDReset_Cyclic(SVD svd) | |
| 1058 | { | ||
| 1059 | 357 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 1060 | |||
| 1061 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
357 | PetscFunctionBegin; |
| 1062 |
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.
|
357 | PetscCall(EPSReset(cyclic->eps)); |
| 1063 |
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.
|
357 | PetscCall(MatDestroy(&cyclic->C)); |
| 1064 |
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.
|
357 | PetscCall(MatDestroy(&cyclic->D)); |
| 1065 |
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.
|
71 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1066 | } | ||
| 1067 | |||
| 1068 | 347 | static PetscErrorCode SVDDestroy_Cyclic(SVD svd) | |
| 1069 | { | ||
| 1070 | 347 | SVD_CYCLIC *cyclic = (SVD_CYCLIC*)svd->data; | |
| 1071 | |||
| 1072 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
347 | PetscFunctionBegin; |
| 1073 |
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.
|
347 | PetscCall(EPSDestroy(&cyclic->eps)); |
| 1074 |
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.
|
347 | PetscCall(PetscFree(svd->data)); |
| 1075 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicSetEPS_C",NULL)); |
| 1076 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicGetEPS_C",NULL)); |
| 1077 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicSetExplicitMatrix_C",NULL)); |
| 1078 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicGetExplicitMatrix_C",NULL)); |
| 1079 |
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.
|
69 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1080 | } | ||
| 1081 | |||
| 1082 | /*MC | ||
| 1083 | SVDCYCLIC - SVDCYCLIC = "cyclic" - Solve the singular value problem | ||
| 1084 | via an equivalent eigenvalue problem with the cyclic matrix. | ||
| 1085 | |||
| 1086 | Notes: | ||
| 1087 | This will do the computation with a subsidiary eigensolver on an | ||
| 1088 | equivalent eigenvalue problem. For the standard SVD, the eigensolver | ||
| 1089 | operates with the cyclic matrix | ||
| 1090 | $H(A)=\left[\begin{smallmatrix}0&A\\A^*&0\end{smallmatrix}\right]$. | ||
| 1091 | See the section [](#sec:svdback) for details on the formulation for | ||
| 1092 | each SVD type. | ||
| 1093 | |||
| 1094 | To manipulate the internal eigensolvers, use `SVDCyclicGetEPS()` or | ||
| 1095 | use the corresponding command-line options. | ||
| 1096 | |||
| 1097 | Level: beginner | ||
| 1098 | |||
| 1099 | .seealso: [](ch:svd), [](#sec:svdback), `SVD`, `SVDType`, `SVDSetType()`, `SVDSetProblemType()`, `SVDTRLANCZOS`, `SVDCyclicGetEPS()` | ||
| 1100 | M*/ | ||
| 1101 | 347 | SLEPC_EXTERN PetscErrorCode SVDCreate_Cyclic(SVD svd) | |
| 1102 | { | ||
| 1103 | 347 | SVD_CYCLIC *cyclic; | |
| 1104 | |||
| 1105 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
347 | PetscFunctionBegin; |
| 1106 |
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.
|
347 | PetscCall(PetscNew(&cyclic)); |
| 1107 | 347 | svd->data = (void*)cyclic; | |
| 1108 | 347 | svd->ops->solve = SVDSolve_Cyclic; | |
| 1109 | 347 | svd->ops->solveg = SVDSolve_Cyclic; | |
| 1110 | 347 | svd->ops->solveh = SVDSolve_Cyclic; | |
| 1111 | 347 | svd->ops->setup = SVDSetUp_Cyclic; | |
| 1112 | 347 | svd->ops->setfromoptions = SVDSetFromOptions_Cyclic; | |
| 1113 | 347 | svd->ops->destroy = SVDDestroy_Cyclic; | |
| 1114 | 347 | svd->ops->reset = SVDReset_Cyclic; | |
| 1115 | 347 | svd->ops->view = SVDView_Cyclic; | |
| 1116 | 347 | svd->ops->computevectors = SVDComputeVectors_Cyclic; | |
| 1117 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicSetEPS_C",SVDCyclicSetEPS_Cyclic)); |
| 1118 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicGetEPS_C",SVDCyclicGetEPS_Cyclic)); |
| 1119 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicSetExplicitMatrix_C",SVDCyclicSetExplicitMatrix_Cyclic)); |
| 1120 |
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.
|
347 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDCyclicGetExplicitMatrix_C",SVDCyclicGetExplicitMatrix_Cyclic)); |
| 1121 |
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.
|
69 | PetscFunctionReturn(PETSC_SUCCESS); |
| 1122 | } | ||
| 1123 |