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: "lanczos" | ||
12 | |||
13 | Method: Explicitly restarted Lanczos | ||
14 | |||
15 | Algorithm: | ||
16 | |||
17 | Golub-Kahan-Lanczos bidiagonalization with explicit restart. | ||
18 | |||
19 | References: | ||
20 | |||
21 | [1] G.H. Golub and W. Kahan, "Calculating the singular values | ||
22 | and pseudo-inverse of a matrix", SIAM J. Numer. Anal. Ser. | ||
23 | B 2:205-224, 1965. | ||
24 | |||
25 | [2] V. Hernandez, J.E. Roman, and A. Tomas, "A robust and | ||
26 | efficient parallel SVD solver based on restarted Lanczos | ||
27 | bidiagonalization", Elec. Trans. Numer. Anal. 31:68-85, | ||
28 | 2008. | ||
29 | */ | ||
30 | |||
31 | #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/ | ||
32 | |||
33 | typedef struct { | ||
34 | PetscBool oneside; | ||
35 | } SVD_LANCZOS; | ||
36 | |||
37 | 215 | static PetscErrorCode SVDSetUp_Lanczos(SVD svd) | |
38 | { | ||
39 | 215 | SVD_LANCZOS *lanczos = (SVD_LANCZOS*)svd->data; | |
40 | 215 | PetscInt N; | |
41 | |||
42 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
215 | PetscFunctionBegin; |
43 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
215 | SVDCheckStandard(svd); |
44 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
215 | SVDCheckDefinite(svd); |
45 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
215 | PetscCall(MatGetSize(svd->A,NULL,&N)); |
46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
215 | PetscCall(SVDSetDimensions_Default(svd)); |
47 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
215 | PetscCheck(svd->ncv<=svd->nsv+svd->mpd,PetscObjectComm((PetscObject)svd),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd"); |
48 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
|
314 | if (svd->max_it==PETSC_DETERMINE) svd->max_it = PetscMax(N/svd->ncv,100)*((svd->stop==SVD_STOP_THRESHOLD)?10:1); |
49 | 215 | svd->leftbasis = PetscNot(lanczos->oneside); | |
50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
215 | PetscCall(SVDAllocateSolution(svd,1)); |
51 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
215 | PetscCall(DSSetType(svd->ds,DSSVD)); |
52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
215 | PetscCall(DSSetCompact(svd->ds,PETSC_TRUE)); |
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.
|
215 | PetscCall(DSSetExtraRow(svd->ds,PETSC_TRUE)); |
54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
215 | PetscCall(DSAllocate(svd->ds,svd->ncv+1)); |
55 |
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.
|
41 | PetscFunctionReturn(PETSC_SUCCESS); |
56 | } | ||
57 | |||
58 | 12992 | PetscErrorCode SVDTwoSideLanczos(SVD svd,PetscReal *alpha,PetscReal *beta,BV V,BV U,PetscInt k,PetscInt *n,PetscBool *breakdown) | |
59 | { | ||
60 | 12992 | PetscInt i; | |
61 | 12992 | Vec u,v; | |
62 | 12992 | PetscBool lindep=PETSC_FALSE; | |
63 | |||
64 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12992 | PetscFunctionBegin; |
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.
|
12992 | PetscCall(BVGetColumn(svd->V,k,&v)); |
66 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12992 | PetscCall(BVGetColumn(svd->U,k,&u)); |
67 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12992 | PetscCall(MatMult(svd->A,v,u)); |
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.
|
12992 | PetscCall(BVRestoreColumn(svd->V,k,&v)); |
69 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12992 | PetscCall(BVRestoreColumn(svd->U,k,&u)); |
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.
|
12992 | PetscCall(BVOrthonormalizeColumn(svd->U,k,PETSC_FALSE,alpha+k,&lindep)); |
71 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
12992 | if (PetscUnlikely(lindep)) { |
72 | ✗ | *n = k; | |
73 | ✗ | if (breakdown) *breakdown = lindep; | |
74 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
75 | } | ||
76 | |||
77 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
93286 | for (i=k+1;i<*n;i++) { |
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.
|
80294 | PetscCall(BVGetColumn(svd->V,i,&v)); |
79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
80294 | PetscCall(BVGetColumn(svd->U,i-1,&u)); |
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.
|
80294 | PetscCall(MatMult(svd->AT,u,v)); |
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.
|
80294 | PetscCall(BVRestoreColumn(svd->V,i,&v)); |
82 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
80294 | PetscCall(BVRestoreColumn(svd->U,i-1,&u)); |
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.
|
80294 | PetscCall(BVOrthonormalizeColumn(svd->V,i,PETSC_FALSE,beta+i-1,&lindep)); |
84 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
80294 | if (PetscUnlikely(lindep)) { |
85 | ✗ | *n = i; | |
86 | ✗ | break; | |
87 | } | ||
88 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
80294 | PetscCall(BVGetColumn(svd->V,i,&v)); |
89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
80294 | PetscCall(BVGetColumn(svd->U,i,&u)); |
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.
|
80294 | PetscCall(MatMult(svd->A,v,u)); |
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.
|
80294 | PetscCall(BVRestoreColumn(svd->V,i,&v)); |
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.
|
80294 | PetscCall(BVRestoreColumn(svd->U,i,&u)); |
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.
|
80294 | PetscCall(BVOrthonormalizeColumn(svd->U,i,PETSC_FALSE,alpha+i,&lindep)); |
94 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
80294 | if (PetscUnlikely(lindep)) { |
95 | ✗ | *n = i; | |
96 | ✗ | break; | |
97 | } | ||
98 | } | ||
99 | |||
100 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
12992 | if (!lindep) { |
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.
|
12992 | PetscCall(BVGetColumn(svd->V,*n,&v)); |
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.
|
12992 | PetscCall(BVGetColumn(svd->U,*n-1,&u)); |
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.
|
12992 | PetscCall(MatMult(svd->AT,u,v)); |
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.
|
12992 | PetscCall(BVRestoreColumn(svd->V,*n,&v)); |
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.
|
12992 | PetscCall(BVRestoreColumn(svd->U,*n-1,&u)); |
106 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12992 | PetscCall(BVOrthogonalizeColumn(svd->V,*n,NULL,beta+*n-1,&lindep)); |
107 | } | ||
108 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12992 | if (breakdown) *breakdown = lindep; |
109 |
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.
|
1942 | PetscFunctionReturn(PETSC_SUCCESS); |
110 | } | ||
111 | |||
112 | 688 | static PetscErrorCode SVDOneSideLanczos(SVD svd,PetscReal *alpha,PetscReal *beta,BV V,Vec u,Vec u_1,PetscInt k,PetscInt n,PetscScalar* work) | |
113 | { | ||
114 | 688 | PetscInt i,bvl,bvk; | |
115 | 688 | PetscReal a,b; | |
116 | 688 | Vec z,temp; | |
117 | |||
118 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
688 | PetscFunctionBegin; |
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.
|
688 | PetscCall(BVGetActiveColumns(V,&bvl,&bvk)); |
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.
|
688 | PetscCall(BVGetColumn(V,k,&z)); |
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.
|
688 | PetscCall(MatMult(svd->A,z,u)); |
122 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(BVRestoreColumn(V,k,&z)); |
123 | |||
124 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5980 | for (i=k+1;i<n;i++) { |
125 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVGetColumn(V,i,&z)); |
126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(MatMult(svd->AT,u,z)); |
127 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVRestoreColumn(V,i,&z)); |
128 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(VecNormBegin(u,NORM_2,&a)); |
129 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVSetActiveColumns(V,0,i)); |
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.
|
5292 | PetscCall(BVDotColumnBegin(V,i,work)); |
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.
|
5292 | PetscCall(VecNormEnd(u,NORM_2,&a)); |
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.
|
5292 | PetscCall(BVDotColumnEnd(V,i,work)); |
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.
|
5292 | PetscCall(VecScale(u,1.0/a)); |
134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVMultColumn(V,-1.0/a,1.0/a,i,work)); |
135 | |||
136 | /* h = V^* z, z = z - V h */ | ||
137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVDotColumn(V,i,work)); |
138 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVMultColumn(V,-1.0,1.0,i,work)); |
139 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(BVNormColumn(V,i,NORM_2,&b)); |
140 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5292 | PetscCheck(PetscAbsReal(b)>10*PETSC_MACHINE_EPSILON,PetscObjectComm((PetscObject)svd),PETSC_ERR_PLIB,"Recurrence generated a zero vector; use a two-sided variant"); |
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.
|
5292 | PetscCall(BVScaleColumn(V,i,1.0/b)); |
142 | |||
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.
|
5292 | PetscCall(BVGetColumn(V,i,&z)); |
144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5292 | PetscCall(MatMult(svd->A,z,u_1)); |
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.
|
5292 | PetscCall(BVRestoreColumn(V,i,&z)); |
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.
|
5292 | PetscCall(VecAXPY(u_1,-b,u)); |
147 | 5292 | alpha[i-1] = a; | |
148 | 5292 | beta[i-1] = b; | |
149 | 5292 | temp = u; | |
150 | 5292 | u = u_1; | |
151 | 5292 | u_1 = temp; | |
152 | } | ||
153 | |||
154 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(BVGetColumn(V,n,&z)); |
155 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(MatMult(svd->AT,u,z)); |
156 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(BVRestoreColumn(V,n,&z)); |
157 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(VecNormBegin(u,NORM_2,&a)); |
158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(BVDotColumnBegin(V,n,work)); |
159 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(VecNormEnd(u,NORM_2,&a)); |
160 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
688 | PetscCall(BVDotColumnEnd(V,n,work)); |
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.
|
688 | PetscCall(VecScale(u,1.0/a)); |
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.
|
688 | PetscCall(BVMultColumn(V,-1.0/a,1.0/a,n,work)); |
163 | |||
164 | /* h = V^* z, z = z - V h */ | ||
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.
|
688 | PetscCall(BVDotColumn(V,n,work)); |
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.
|
688 | PetscCall(BVMultColumn(V,-1.0,1.0,n,work)); |
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.
|
688 | PetscCall(BVNormColumn(V,i,NORM_2,&b)); |
168 | |||
169 | 688 | alpha[n-1] = a; | |
170 | 688 | beta[n-1] = b; | |
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.
|
688 | PetscCall(BVSetActiveColumns(V,bvl,bvk)); |
172 |
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.
|
108 | PetscFunctionReturn(PETSC_SUCCESS); |
173 | } | ||
174 | |||
175 | /* | ||
176 | SVDKrylovConvergence - Implements the loop that checks for convergence | ||
177 | in Krylov methods. | ||
178 | |||
179 | Input Parameters: | ||
180 | svd - the solver; some error estimates are updated in svd->errest | ||
181 | getall - whether all residuals must be computed | ||
182 | kini - initial value of k (the loop variable) | ||
183 | nits - number of iterations of the loop | ||
184 | normr - norm of triangular factor of qr([A;B]), used only in GSVD | ||
185 | |||
186 | Output Parameter: | ||
187 | kout - the first index where the convergence test failed | ||
188 | */ | ||
189 | 25161 | PetscErrorCode SVDKrylovConvergence(SVD svd,PetscBool getall,PetscInt kini,PetscInt nits,PetscReal normr,PetscInt *kout) | |
190 | { | ||
191 | 25161 | PetscInt k,marker,ld; | |
192 | 25161 | PetscReal *alpha,*beta,*betah,resnorm; | |
193 | 25161 | PetscBool extra; | |
194 | |||
195 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
25161 | PetscFunctionBegin; |
196 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
25161 | if (PetscUnlikely(svd->conv == SVD_CONV_MAXIT && svd->its >= svd->max_it)) *kout = svd->nsv; |
197 | else { | ||
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.
|
25161 | PetscCall(DSGetLeadingDimension(svd->ds,&ld)); |
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.
|
25161 | PetscCall(DSGetExtraRow(svd->ds,&extra)); |
200 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
25161 | PetscCheck(extra,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"Only implemented for DS with extra row"); |
201 | 25161 | marker = -1; | |
202 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
25161 | if (svd->trackall) getall = PETSC_TRUE; |
203 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
25161 | PetscCall(DSGetArrayReal(svd->ds,DS_MAT_T,&alpha)); |
204 | 25161 | beta = alpha + ld; | |
205 | 25161 | betah = alpha + 2*ld; | |
206 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
31979 | for (k=kini;k<kini+nits;k++) { |
207 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
31928 | if (svd->isgeneralized) resnorm = SlepcAbs(beta[k],betah[k])*normr; |
208 | 20819 | else resnorm = PetscAbsReal(beta[k]); | |
209 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
31928 | PetscCall((*svd->converged)(svd,svd->sigma[k],resnorm,&svd->errest[k],svd->convergedctx)); |
210 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
31928 | if (marker==-1 && svd->errest[k] >= svd->tol) marker = k; |
211 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
31928 | if (marker!=-1 && !getall) break; |
212 | } | ||
213 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
25161 | PetscCall(DSRestoreArrayReal(svd->ds,DS_MAT_T,&alpha)); |
214 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
25161 | if (marker!=-1) k = marker; |
215 | 25161 | *kout = k; | |
216 | } | ||
217 |
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.
|
4294 | PetscFunctionReturn(PETSC_SUCCESS); |
218 | } | ||
219 | |||
220 | 215 | static PetscErrorCode SVDSolve_Lanczos(SVD svd) | |
221 | { | ||
222 | 215 | SVD_LANCZOS *lanczos = (SVD_LANCZOS*)svd->data; | |
223 | 215 | PetscReal *alpha,*beta; | |
224 | 215 | PetscScalar *swork,*w,*P,*aux1,*aux2; | |
225 | 215 | PetscInt i,k,j,nv,ld; | |
226 | 215 | Vec u=NULL,u_1=NULL; | |
227 | 215 | Mat U,V; | |
228 | |||
229 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
215 | PetscFunctionBegin; |
230 | /* allocate working space */ | ||
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.
|
215 | PetscCall(DSGetLeadingDimension(svd->ds,&ld)); |
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.
|
215 | PetscCall(PetscMalloc2(ld,&w,svd->ncv,&swork)); |
233 | |||
234 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
215 | if (lanczos->oneside) { |
235 |
4/6✓ Branch 0 taken 2 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(MatCreateVecs(svd->A,NULL,&u)); |
236 |
4/6✓ Branch 0 taken 2 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(MatCreateVecs(svd->A,NULL,&u_1)); |
237 | } | ||
238 | |||
239 | /* normalize start vector */ | ||
240 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
215 | if (!svd->nini) { |
241 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
167 | PetscCall(BVSetRandomColumn(svd->V,0)); |
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.
|
167 | PetscCall(BVOrthonormalizeColumn(svd->V,0,PETSC_TRUE,NULL,NULL)); |
243 | } | ||
244 | |||
245 | 6874 | while (svd->reason == SVD_CONVERGED_ITERATING) { | |
246 | 6659 | svd->its++; | |
247 | |||
248 | /* inner loop */ | ||
249 | 6659 | nv = PetscMin(svd->nconv+svd->mpd,svd->ncv); | |
250 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(DSGetArrayReal(svd->ds,DS_MAT_T,&alpha)); |
251 | 6659 | beta = alpha + ld; | |
252 |
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.
|
6659 | if (lanczos->oneside) PetscCall(SVDOneSideLanczos(svd,alpha,beta,svd->V,u,u_1,svd->nconv,nv,swork)); |
253 | else { | ||
254 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5971 | PetscCall(SVDTwoSideLanczos(svd,alpha,beta,svd->V,svd->U,svd->nconv,&nv,NULL)); |
255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5971 | PetscCall(BVSetActiveColumns(svd->U,svd->nconv,nv)); |
256 | } | ||
257 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(DSRestoreArrayReal(svd->ds,DS_MAT_T,&alpha)); |
258 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(BVSetActiveColumns(svd->V,svd->nconv,nv)); |
259 | |||
260 | /* compute SVD of bidiagonal matrix */ | ||
261 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(DSSetDimensions(svd->ds,nv,svd->nconv,0)); |
262 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(DSSVDSetDimensions(svd->ds,nv)); |
263 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(DSSetState(svd->ds,DS_STATE_INTERMEDIATE)); |
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.
|
6659 | PetscCall(DSSolve(svd->ds,w,NULL)); |
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.
|
6659 | PetscCall(DSSort(svd->ds,w,NULL,NULL,NULL,NULL)); |
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.
|
6659 | PetscCall(DSUpdateExtraRow(svd->ds)); |
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.
|
6659 | PetscCall(DSSynchronize(svd->ds,w,NULL)); |
268 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
69157 | for (i=svd->nconv;i<nv;i++) svd->sigma[i] = PetscRealPart(w[i]); |
269 | |||
270 | /* check convergence */ | ||
271 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(SVDKrylovConvergence(svd,PETSC_FALSE,svd->nconv,nv-svd->nconv,1.0,&k)); |
272 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
6659 | SVDSetCtxThreshold(svd,svd->sigma,k); |
273 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall((*svd->stopping)(svd,svd->its,svd->max_it,k,svd->nsv,&svd->reason,svd->stoppingctx)); |
274 | |||
275 | /* compute restart vector */ | ||
276 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6659 | if (svd->reason == SVD_CONVERGED_ITERATING) { |
277 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
6444 | if (k<nv) { |
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.
|
6444 | PetscCall(DSGetArray(svd->ds,DS_MAT_V,&P)); |
279 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
67013 | for (j=svd->nconv;j<nv;j++) swork[j-svd->nconv] = PetscConj(P[j+k*ld]); |
280 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6444 | PetscCall(DSRestoreArray(svd->ds,DS_MAT_V,&P)); |
281 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6444 | PetscCall(BVMultColumn(svd->V,1.0,0.0,nv,swork)); |
282 | } else { | ||
283 | /* all approximations have converged, generate a new initial vector */ | ||
284 | ✗ | PetscCall(BVSetRandomColumn(svd->V,nv)); | |
285 | ✗ | PetscCall(BVOrthonormalizeColumn(svd->V,nv,PETSC_FALSE,NULL,NULL)); | |
286 | } | ||
287 | } | ||
288 | |||
289 | /* compute converged singular vectors */ | ||
290 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6659 | PetscCall(DSGetMat(svd->ds,DS_MAT_V,&V)); |
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.
|
6659 | PetscCall(BVMultInPlace(svd->V,V,svd->nconv,k)); |
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.
|
6659 | PetscCall(DSRestoreMat(svd->ds,DS_MAT_V,&V)); |
293 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6659 | if (!lanczos->oneside) { |
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.
|
5971 | PetscCall(DSGetMat(svd->ds,DS_MAT_U,&U)); |
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.
|
5971 | PetscCall(BVMultInPlace(svd->U,U,svd->nconv,k)); |
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.
|
5971 | PetscCall(DSRestoreMat(svd->ds,DS_MAT_U,&U)); |
297 | } | ||
298 | |||
299 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6659 | if (svd->reason == SVD_CONVERGED_ITERATING) { |
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.
|
6444 | PetscCall(BVCopyColumn(svd->V,nv,k)); /* copy restart vector from the last column */ |
301 |
4/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
|
6444 | if (svd->stop==SVD_STOP_THRESHOLD && nv-k<5) { /* reallocate */ |
302 | 8 | svd->ncv = svd->mpd+k; | |
303 |
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,svd->ncv+1)); |
304 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
66 | for (i=nv;i<svd->ncv;i++) svd->perm[i] = i; |
305 |
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(DSReallocate(svd->ds,svd->ncv+1)); |
306 | 8 | aux1 = w; | |
307 | 8 | aux2 = swork; | |
308 |
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(PetscMalloc2(svd->ncv+1,&w,svd->ncv,&swork)); |
309 |
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(PetscArraycpy(w,aux1,ld)); |
310 |
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(PetscFree2(aux1,aux2)); |
311 |
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(DSGetLeadingDimension(svd->ds,&ld)); |
312 | } | ||
313 | } | ||
314 | |||
315 | 6659 | svd->nconv = k; | |
316 |
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.
|
6874 | PetscCall(SVDMonitor(svd,svd->its,svd->nconv,svd->sigma,svd->errest,nv)); |
317 | } | ||
318 | |||
319 | /* free working space */ | ||
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.
|
215 | PetscCall(VecDestroy(&u)); |
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.
|
215 | PetscCall(VecDestroy(&u_1)); |
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.
|
215 | PetscCall(PetscFree2(w,swork)); |
323 |
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.
|
41 | PetscFunctionReturn(PETSC_SUCCESS); |
324 | } | ||
325 | |||
326 | 155 | static PetscErrorCode SVDSetFromOptions_Lanczos(SVD svd,PetscOptionItems PetscOptionsObject) | |
327 | { | ||
328 | 155 | PetscBool set,val; | |
329 | 155 | SVD_LANCZOS *lanczos = (SVD_LANCZOS*)svd->data; | |
330 | |||
331 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
155 | PetscFunctionBegin; |
332 |
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.
|
155 | PetscOptionsHeadBegin(PetscOptionsObject,"SVD Lanczos Options"); |
333 | |||
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.
|
155 | PetscCall(PetscOptionsBool("-svd_lanczos_oneside","Use one-side reorthogonalization","SVDLanczosSetOneSide",lanczos->oneside,&val,&set)); |
335 |
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.
|
155 | if (set) PetscCall(SVDLanczosSetOneSide(svd,val)); |
336 | |||
337 |
1/14✗ 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.
✗ 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.
|
155 | PetscOptionsHeadEnd(); |
338 |
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.
|
29 | PetscFunctionReturn(PETSC_SUCCESS); |
339 | } | ||
340 | |||
341 | 24 | static PetscErrorCode SVDLanczosSetOneSide_Lanczos(SVD svd,PetscBool oneside) | |
342 | { | ||
343 | 24 | SVD_LANCZOS *lanczos = (SVD_LANCZOS*)svd->data; | |
344 | |||
345 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
346 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
24 | if (lanczos->oneside != oneside) { |
347 | 24 | lanczos->oneside = oneside; | |
348 | 24 | svd->state = SVD_STATE_INITIAL; | |
349 | } | ||
350 |
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); |
351 | } | ||
352 | |||
353 | /*@ | ||
354 | SVDLanczosSetOneSide - Indicate if the variant of the Lanczos method | ||
355 | to be used is one-sided or two-sided. | ||
356 | |||
357 | Logically Collective | ||
358 | |||
359 | Input Parameters: | ||
360 | + svd - singular value solver | ||
361 | - oneside - boolean flag indicating if the method is one-sided or not | ||
362 | |||
363 | Options Database Key: | ||
364 | . -svd_lanczos_oneside <boolean> - Indicates the boolean flag | ||
365 | |||
366 | Note: | ||
367 | By default, a two-sided variant is selected, which is sometimes slightly | ||
368 | more robust. However, the one-sided variant is faster because it avoids | ||
369 | the orthogonalization associated to left singular vectors. It also saves | ||
370 | the memory required for storing such vectors. | ||
371 | |||
372 | Level: advanced | ||
373 | |||
374 | .seealso: SVDTRLanczosSetOneSide() | ||
375 | @*/ | ||
376 | 24 | PetscErrorCode SVDLanczosSetOneSide(SVD svd,PetscBool oneside) | |
377 | { | ||
378 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
24 | PetscFunctionBegin; |
379 |
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); |
380 |
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.
|
24 | PetscValidLogicalCollectiveBool(svd,oneside,2); |
381 |
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,"SVDLanczosSetOneSide_C",(SVD,PetscBool),(svd,oneside)); |
382 |
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); |
383 | } | ||
384 | |||
385 | 20 | static PetscErrorCode SVDLanczosGetOneSide_Lanczos(SVD svd,PetscBool *oneside) | |
386 | { | ||
387 | 20 | SVD_LANCZOS *lanczos = (SVD_LANCZOS*)svd->data; | |
388 | |||
389 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
390 | 20 | *oneside = lanczos->oneside; | |
391 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
392 | } | ||
393 | |||
394 | /*@ | ||
395 | SVDLanczosGetOneSide - Gets if the variant of the Lanczos method | ||
396 | to be used is one-sided or two-sided. | ||
397 | |||
398 | Not Collective | ||
399 | |||
400 | Input Parameters: | ||
401 | . svd - singular value solver | ||
402 | |||
403 | Output Parameters: | ||
404 | . oneside - boolean flag indicating if the method is one-sided or not | ||
405 | |||
406 | Level: advanced | ||
407 | |||
408 | .seealso: SVDLanczosSetOneSide() | ||
409 | @*/ | ||
410 | 20 | PetscErrorCode SVDLanczosGetOneSide(SVD svd,PetscBool *oneside) | |
411 | { | ||
412 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
413 |
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.
|
20 | PetscValidHeaderSpecific(svd,SVD_CLASSID,1); |
414 |
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.
|
20 | PetscAssertPointer(oneside,2); |
415 |
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.
|
20 | PetscUseMethod(svd,"SVDLanczosGetOneSide_C",(SVD,PetscBool*),(svd,oneside)); |
416 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
417 | } | ||
418 | |||
419 | 175 | static PetscErrorCode SVDDestroy_Lanczos(SVD svd) | |
420 | { | ||
421 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
175 | PetscFunctionBegin; |
422 |
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.
|
175 | PetscCall(PetscFree(svd->data)); |
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.
|
175 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDLanczosSetOneSide_C",NULL)); |
424 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
175 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDLanczosGetOneSide_C",NULL)); |
425 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
33 | PetscFunctionReturn(PETSC_SUCCESS); |
426 | } | ||
427 | |||
428 | ✗ | static PetscErrorCode SVDView_Lanczos(SVD svd,PetscViewer viewer) | |
429 | { | ||
430 | ✗ | SVD_LANCZOS *lanczos = (SVD_LANCZOS*)svd->data; | |
431 | ✗ | PetscBool isascii; | |
432 | |||
433 | ✗ | PetscFunctionBegin; | |
434 | ✗ | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); | |
435 | ✗ | if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer," %s-sided reorthogonalization\n",lanczos->oneside? "one": "two")); | |
436 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
437 | } | ||
438 | |||
439 | 175 | SLEPC_EXTERN PetscErrorCode SVDCreate_Lanczos(SVD svd) | |
440 | { | ||
441 | 175 | SVD_LANCZOS *ctx; | |
442 | |||
443 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
175 | PetscFunctionBegin; |
444 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
175 | PetscCall(PetscNew(&ctx)); |
445 | 175 | svd->data = (void*)ctx; | |
446 | |||
447 | 175 | svd->ops->setup = SVDSetUp_Lanczos; | |
448 | 175 | svd->ops->solve = SVDSolve_Lanczos; | |
449 | 175 | svd->ops->destroy = SVDDestroy_Lanczos; | |
450 | 175 | svd->ops->setfromoptions = SVDSetFromOptions_Lanczos; | |
451 | 175 | svd->ops->view = SVDView_Lanczos; | |
452 | 175 | svd->ops->computevectors = SVDComputeVectors_Left; | |
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.
|
175 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDLanczosSetOneSide_C",SVDLanczosSetOneSide_Lanczos)); |
454 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
175 | PetscCall(PetscObjectComposeFunction((PetscObject)svd,"SVDLanczosGetOneSide_C",SVDLanczosGetOneSide_Lanczos)); |
455 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
33 | PetscFunctionReturn(PETSC_SUCCESS); |
456 | } | ||
457 |