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