GCC Code Coverage Report


Directory: ./
File: src/sys/classes/ds/impls/gsvd/dsgsvd.c
Date: 2025-12-10 04:20:18
Exec Total Coverage
Lines: 473 508 93.1%
Functions: 18 18 100.0%
Branches: 1300 2387 54.5%

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 #include <slepc/private/dsimpl.h> /*I "slepcds.h" I*/
11 #include <slepcblaslapack.h>
12
13 typedef struct {
14 PetscInt m; /* number of columns */
15 PetscInt p; /* number of rows of B */
16 PetscInt tm; /* number of rows of X after truncating */
17 PetscInt tp; /* number of rows of V after truncating */
18 } DS_GSVD;
19
20 684 static PetscErrorCode DSAllocate_GSVD(DS ds,PetscInt ld)
21 {
22
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
684 PetscFunctionBegin;
23
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_A));
24
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_B));
25
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_X));
26
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_U));
27
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_V));
28
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_T));
29
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(DSAllocateMat_Private(ds,DS_MAT_D));
30
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.
684 PetscCall(PetscFree(ds->perm));
31
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(PetscMalloc1(ld,&ds->perm));
32
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.
140 PetscFunctionReturn(PETSC_SUCCESS);
33 }
34
35 /*
36 In compact form, A is either in form (a) or (b):
37
38 (a) (b)
39 lower bidiagonal with upper arrow (n=m+1) square upper bidiagonal with upper arrow (n=m)
40 0 l k m-1
41 ----------------------------------------- 0 l k m-1
42 |* . | -----------------------------------------
43 | * . | |* . |
44 | * . | | * . |
45 | * . | | * . |
46 l |. . . . o o | l |. . . o o |
47 | o o | | o o |
48 | o o | | o o |
49 | o o | | o o |
50 | o o | | o o |
51 | o o | | o o |
52 k |. . . . . . . . . . o | k |. . . . . . . . . o x |
53 | x x | | x x |
54 | x x | | x x |
55 | x x | | x x |
56 | x x | | x x |
57 | x x | | x x |
58 | x x | | x x |
59 | x x | | x x |
60 | x x | | x x |
61 | x x| | x x|
62 n-1 | x| n-1 | x|
63 ----------------------------------------- -----------------------------------------
64
65 and B is square bidiagonal with upper arrow (p=m)
66
67 0 l k m-1
68 -----------------------------------------
69 |* . |
70 | * . |
71 | * . |
72 | * . |
73 l |. . . . o o |
74 | o o |
75 | o o |
76 | o o |
77 | o o |
78 | o o |
79 k |. . . . . . . . . . o x |
80 | x x |
81 | x x |
82 | x x |
83 | x x |
84 | x x |
85 | x x |
86 | x x |
87 | x x|
88 p-1 | x|
89 ----------------------------------------
90 */
91 300 static PetscErrorCode DSView_GSVD(DS ds,PetscViewer viewer)
92 {
93 300 DS_GSVD *ctx = (DS_GSVD*)ds->data;
94 300 PetscViewerFormat format;
95 300 PetscInt i,j,r,k=ds->k,n=ds->n,m=ctx->m,p=ctx->p,rowsa,rowsb,colsa,colsb;
96 300 PetscReal *T,*S,value;
97
98
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
300 PetscFunctionBegin;
99
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(PetscViewerGetFormat(viewer,&format));
100
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.
300 if (format == PETSC_VIEWER_ASCII_INFO) PetscFunctionReturn(PETSC_SUCCESS);
101
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
300 if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
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.
170 PetscCall(PetscViewerASCIIPrintf(viewer,"number of columns: %" PetscInt_FMT "\n",m));
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.
170 PetscCall(PetscViewerASCIIPrintf(viewer,"number of rows of B: %" PetscInt_FMT "\n",p));
104
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.
34 PetscFunctionReturn(PETSC_SUCCESS);
105 }
106
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
130 PetscCheck(ctx->m,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"You should set the other dimensions with DSGSVDSetDimensions()");
107
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
130 if (ds->compact) {
108
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
109
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(DSGetArrayReal(ds,DS_MAT_D,&S));
110
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
111 10 rowsa = n;
112
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 colsa = ds->extrarow? m+1: m;
113 10 rowsb = p;
114 10 colsb = ds->extrarow? m+1: m;
115
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (format == PETSC_VIEWER_ASCII_MATLAB) {
116 PetscCall(PetscViewerASCIIPrintf(viewer,"%% Size = %" PetscInt_FMT " %" PetscInt_FMT "\n",rowsa,colsa));
117 PetscCall(PetscViewerASCIIPrintf(viewer,"zzz = zeros(%" PetscInt_FMT ",3);\n",2*ds->n));
118 PetscCall(PetscViewerASCIIPrintf(viewer,"zzz = [\n"));
119 for (i=0;i<PetscMin(rowsa,colsa);i++) PetscCall(PetscViewerASCIIPrintf(viewer,"%" PetscInt_FMT " %" PetscInt_FMT " %18.16e\n",i+1,i+1,(double)T[i]));
120 for (i=0;i<k;i++) PetscCall(PetscViewerASCIIPrintf(viewer,"%" PetscInt_FMT " %" PetscInt_FMT " %18.16e\n",i+1,k+1,(double)T[i+ds->ld]));
121 if (n>m) { /* A lower bidiagonal */
122 for (i=k;i<rowsa-1;i++) PetscCall(PetscViewerASCIIPrintf(viewer,"%" PetscInt_FMT " %" PetscInt_FMT " %18.16e\n",i+2,i+1,(double)T[i+ds->ld]));
123 } else { /* A (square) upper bidiagonal */
124 for (i=k;i<colsa-1;i++) PetscCall(PetscViewerASCIIPrintf(viewer,"%" PetscInt_FMT " %" PetscInt_FMT " %18.16e\n",i+1,i+2,(double)T[i+ds->ld]));
125 }
126 PetscCall(PetscViewerASCIIPrintf(viewer,"];\n%s = spconvert(zzz);\n",DSMatName[DS_MAT_T]));
127 PetscCall(PetscViewerASCIIPrintf(viewer,"%% Size = %" PetscInt_FMT " %" PetscInt_FMT "\n",rowsb,colsb));
128 PetscCall(PetscViewerASCIIPrintf(viewer,"zzz = zeros(%" PetscInt_FMT ",3);\n",2*ds->n));
129 PetscCall(PetscViewerASCIIPrintf(viewer,"zzz = [\n"));
130 for (i=0;i<rowsb;i++) PetscCall(PetscViewerASCIIPrintf(viewer,"%" PetscInt_FMT " %" PetscInt_FMT " %18.16e\n",i+1,i+1,(double)S[i]));
131 for (i=0;i<colsb-1;i++) {
132 r = PetscMax(i+2,ds->k+1);
133 PetscCall(PetscViewerASCIIPrintf(viewer,"%" PetscInt_FMT " %" PetscInt_FMT " %18.16e\n",i+1,r,(double)T[i+2*ds->ld]));
134 }
135 PetscCall(PetscViewerASCIIPrintf(viewer,"];\n%s = spconvert(zzz);\n",DSMatName[DS_MAT_D]));
136 } else {
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.
10 PetscCall(PetscViewerASCIIPrintf(viewer,"Matrix %s =\n",DSMatName[DS_MAT_T]));
138
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
110 for (i=0;i<rowsa;i++) {
139
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1100 for (j=0;j<colsa;j++) {
140
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1000 if (i==j) value = T[i];
141
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
900 else if (i<ds->k && j==ds->k) value = T[i+ds->ld];
142
1/6
✗ 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.
900 else if (n>m && i==j+1 && i>ds->k) value = T[j+ds->ld];
143
4/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
900 else if (n<=m && i+1==j && i>=ds->k) value = T[i+ds->ld];
144 else value = 0.0;
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.
1000 PetscCall(PetscViewerASCIIPrintf(viewer," %18.16e ",(double)value));
146 }
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.
100 PetscCall(PetscViewerASCIIPrintf(viewer,"\n"));
148 }
149
4/6
✓ Branch 0 taken 2 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(PetscViewerASCIIPrintf(viewer,"Matrix %s =\n",DSMatName[DS_MAT_D]));
150
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
110 for (i=0;i<rowsb;i++) {
151
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1100 for (j=0;j<colsb;j++) {
152
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1000 if (i==j) value = S[i];
153
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
900 else if (i<ds->k && j==ds->k) value = T[PetscMin(i,j)+2*ds->ld];
154
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
900 else if (i+1==j && i>=ds->k) value = T[i+2*ds->ld];
155 else value = 0.0;
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.
1000 PetscCall(PetscViewerASCIIPrintf(viewer," %18.16e ",(double)value));
157 }
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.
100 PetscCall(PetscViewerASCIIPrintf(viewer,"\n"));
159 }
160 }
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.
10 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
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.
10 PetscCall(PetscViewerFlush(viewer));
163
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
164
4/6
✓ Branch 0 taken 2 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(DSRestoreArrayReal(ds,DS_MAT_D,&S));
165 } else {
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.
120 PetscCall(DSViewMat(ds,viewer,DS_MAT_A));
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.
120 PetscCall(DSViewMat(ds,viewer,DS_MAT_B));
168 }
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
130 if (ds->state>DS_STATE_INTERMEDIATE) {
170 PetscCall(DSViewMat(ds,viewer,DS_MAT_X));
171 PetscCall(DSViewMat(ds,viewer,DS_MAT_U));
172 PetscCall(DSViewMat(ds,viewer,DS_MAT_V));
173 }
174
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.
26 PetscFunctionReturn(PETSC_SUCCESS);
175 }
176
177 170 static PetscErrorCode DSVectors_GSVD(DS ds,DSMatType mat,PetscInt *j,PetscReal *rnorm)
178 {
179
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
170 PetscFunctionBegin;
180
1/3
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
170 switch (mat) {
181 case DS_MAT_U:
182 case DS_MAT_V:
183 if (rnorm) *rnorm = 0.0;
184 break;
185 case DS_MAT_X:
186 break;
187 default:
188 SETERRQ(PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Invalid mat parameter");
189 }
190
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.
34 PetscFunctionReturn(PETSC_SUCCESS);
191 }
192
193 6331 static PetscErrorCode DSSort_GSVD(DS ds,PetscScalar *wr,PetscScalar *wi,PetscScalar *rr,PetscScalar *ri,PetscInt *k)
194 {
195 6331 DS_GSVD *ctx = (DS_GSVD*)ds->data;
196 6331 PetscInt t,l,ld=ds->ld,i,*perm,*perm2;
197 6331 PetscReal *T=NULL,*D=NULL,*eig;
198 6331 PetscScalar *A=NULL,*B=NULL;
199 6331 PetscBool compact=ds->compact;
200
201
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6331 PetscFunctionBegin;
202
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.
6331 if (!ds->sc) PetscFunctionReturn(PETSC_SUCCESS);
203
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6331 PetscCheck(ctx->m,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"You should set the other dimensions with DSGSVDSetDimensions()");
204 6331 l = ds->l;
205 6331 t = ds->t;
206 6331 perm = ds->perm;
207
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscMalloc2(t,&eig,t,&perm2));
208
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6331 if (compact) {
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.
6141 PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
210
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(DSGetArrayReal(ds,DS_MAT_D,&D));
211
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
63763 for (i=0;i<t;i++) eig[i] = (D[i]==0)?PETSC_INFINITY:T[i]/D[i];
212 } else {
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.
190 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A));
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.
190 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_B],&B));
215
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2300 for (i=0;i<t;i++) eig[i] = (B[i+i*ld]==0)?PETSC_INFINITY:PetscRealPart(A[i+i*ld])/PetscRealPart(B[i*(1+ld)]);
216 }
217
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(DSSortEigenvaluesReal_Private(ds,eig,perm));
218
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscArraycpy(perm2,perm,t));
219
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
62688 for (i=l;i<t;i++) wr[i] = eig[perm[i]];
220
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6331 if (compact) {
221
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(PetscArraycpy(eig,T,t));
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60388 for (i=l;i<t;i++) T[i] = eig[perm[i]];
223
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(PetscArraycpy(eig,D,t));
224
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60388 for (i=l;i<t;i++) D[i] = eig[perm[i]];
225
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
226
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(DSRestoreArrayReal(ds,DS_MAT_D,&D));
227 } else {
228
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2300 for (i=l;i<t;i++) eig[i] = PetscRealPart(A[i*(1+ld)]);
229
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2300 for (i=l;i<t;i++) A[i*(1+ld)] = eig[perm[i]];
230
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2300 for (i=l;i<t;i++) eig[i] = PetscRealPart(B[i*(1+ld)]);
231
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2300 for (i=l;i<t;i++) B[i*(1+ld)] = eig[perm[i]];
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.
190 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A));
233
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
190 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_B],&B));
234 }
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.
6331 PetscCall(DSPermuteColumns_Private(ds,l,t,ds->n,DS_MAT_U,perm2));
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.
6331 PetscCall(PetscArraycpy(perm2,perm,t));
237
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(DSPermuteColumns_Private(ds,l,t,ctx->m,DS_MAT_X,perm2));
238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(DSPermuteColumns_Private(ds,l,t,ctx->p,DS_MAT_V,perm));
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.
6331 PetscCall(PetscFree2(eig,perm2));
240
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.
1254 PetscFunctionReturn(PETSC_SUCCESS);
241 }
242
243 6111 static PetscErrorCode DSUpdateExtraRow_GSVD(DS ds)
244 {
245 6111 DS_GSVD *ctx = (DS_GSVD*)ds->data;
246 6111 PetscInt i;
247 6111 PetscBLASInt n=0,m=0,ld=0;
248 6111 const PetscScalar *U,*V;
249 6111 PetscReal *T,*e,*f,alpha,beta,betah;
250
251
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6111 PetscFunctionBegin;
252
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6111 PetscCheck(ctx->m,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"You should set the other dimensions with DSGSVDSetDimensions()");
253
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6111 PetscCheck(ds->compact,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Not implemented for non-compact storage");
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.
6111 PetscCall(PetscBLASIntCast(ds->n,&n));
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.
6111 PetscCall(PetscBLASIntCast(ctx->m,&m));
256
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6111 PetscCall(PetscBLASIntCast(ds->ld,&ld));
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.
6111 PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
258 6111 e = T+ld;
259 6111 f = T+2*ld;
260
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6111 PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_U],&U));
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.
6111 PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_V],&V));
262
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6111 if (n<=m) { /* upper variant, A is square upper bidiagonal */
263 2488 beta = e[m-1]; /* in compact, we assume all entries are zero except the last one */
264 2488 betah = f[m-1];
265
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25084 for (i=0;i<m;i++) {
266 22596 e[i] = PetscRealPart(beta*U[m-1+i*ld]);
267 22596 f[i] = PetscRealPart(betah*V[m-1+i*ld]);
268 }
269 } else { /* lower variant, A is (m+1)xm lower bidiagonal */
270 3623 alpha = T[m];
271 3623 betah = f[m-1];
272
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
38349 for (i=0;i<m;i++) {
273 34726 e[i] = PetscRealPart(alpha*U[m+i*ld]);
274 34726 f[i] = PetscRealPart(betah*V[m-1+i*ld]);
275 }
276 3623 T[m] = PetscRealPart(alpha*U[m+m*ld]);
277 }
278 6111 ds->k = m;
279
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6111 PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_U],&U));
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.
6111 PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_V],&V));
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.
6111 PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
282
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.
1210 PetscFunctionReturn(PETSC_SUCCESS);
283 }
284
285 5986 static PetscErrorCode DSTruncate_GSVD(DS ds,PetscInt n,PetscBool trim)
286 {
287 5986 DS_GSVD *ctx = (DS_GSVD*)ds->data;
288 5986 PetscScalar *U;
289 5986 PetscReal *T;
290 5986 PetscInt i,m=ctx->m,ld=ds->ld;
291 5986 PetscBool lower=(ds->n>ctx->m)?PETSC_TRUE:PETSC_FALSE;
292
293
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5986 PetscFunctionBegin;
294
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5986 PetscCheck(ds->compact,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Not implemented for non-compact storage");
295
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5986 if (trim) {
296 508 ds->l = 0;
297 508 ds->k = 0;
298
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
508 ds->n = lower? n+1: n;
299 508 ctx->m = n;
300 508 ctx->p = n;
301 508 ds->t = ds->n; /* truncated length equal to the new dimension */
302 508 ctx->tm = ctx->m; /* must also keep the previous dimension of X */
303 508 ctx->tp = ctx->p; /* must also keep the previous dimension of V */
304 } else {
305
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5478 if (lower) {
306 /* move value of diagonal element of arrow (alpha) */
307
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3193 PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
308 3193 T[n] = T[m];
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.
3193 PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
310 /* copy last column of U so that it updates the next initial vector of U1 */
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.
3193 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_U],&U));
312
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
36764 for (i=0;i<=m;i++) U[i+n*ld] = U[i+m*ld];
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.
3193 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_U],&U));
314 }
315
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5478 ds->k = (ds->extrarow)? n: 0;
316 5478 ds->t = ds->n; /* truncated length equal to previous dimension */
317 5478 ctx->tm = ctx->m; /* must also keep the previous dimension of X */
318 5478 ctx->tp = ctx->p; /* must also keep the previous dimension of V */
319
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5478 ds->n = lower? n+1: n;
320 5478 ctx->m = n;
321 5478 ctx->p = n;
322 }
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.
1185 PetscFunctionReturn(PETSC_SUCCESS);
324 }
325
326 6261 static PetscErrorCode DSSwitchFormat_GSVD(DS ds)
327 {
328 6261 DS_GSVD *ctx = (DS_GSVD*)ds->data;
329 6261 PetscReal *T,*D;
330 6261 PetscScalar *A,*B;
331 6261 PetscInt i,n=ds->n,k=ds->k,ld=ds->ld,m=ctx->m;
332
333
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6261 PetscFunctionBegin;
334
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6261 PetscCheck(ctx->m,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"You should set the other dimensions with DSGSVDSetDimensions()");
335 /* switch from compact (arrow) to dense storage */
336 /* bidiagonal associated to B is stored in D and T+2*ld */
337
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(MatDenseGetArrayWrite(ds->omat[DS_MAT_A],&A));
338
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(MatDenseGetArrayWrite(ds->omat[DS_MAT_B],&B));
339
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
340
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(DSGetArrayReal(ds,DS_MAT_D,&D));
341
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(PetscArrayzero(A,ld*ld));
342
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(PetscArrayzero(B,ld*ld));
343
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
30939 for (i=0;i<k;i++) {
344 24678 A[i+i*ld] = T[i];
345 24678 A[i+k*ld] = T[i+ld];
346 24678 B[i+i*ld] = D[i];
347 24678 B[i+k*ld] = T[i+2*ld];
348 }
349 /* B is upper bidiagonal */
350 6261 B[k+k*ld] = D[k];
351
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
33914 for (i=k+1;i<m;i++) {
352 27653 B[i+i*ld] = D[i];
353 27653 B[i-1+i*ld] = T[i-1+2*ld];
354 }
355 /* A can be upper (square) or lower bidiagonal */
356
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
40105 for (i=k;i<m;i++) A[i+i*ld] = T[i];
357
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
26719 if (n>m) for (i=k;i<m;i++) A[i+1+i*ld] = T[i+ld];
358
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
13386 else for (i=k+1;i<m;i++) A[i-1+i*ld] = T[i-1+ld];
359
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(MatDenseRestoreArrayWrite(ds->omat[DS_MAT_A],&A));
360
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(MatDenseRestoreArrayWrite(ds->omat[DS_MAT_B],&B));
361
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
362
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6261 PetscCall(DSRestoreArrayReal(ds,DS_MAT_D,&D));
363
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
1240 PetscFunctionReturn(PETSC_SUCCESS);
364 }
365
366 /*
367 Compact format is used when [A;B] has orthonormal columns.
368 In this case R=I and the GSVD of (A,B) is the CS decomposition
369 */
370 6331 static PetscErrorCode DSSolve_GSVD(DS ds,PetscScalar *wr,PetscScalar *wi)
371 {
372 6331 DS_GSVD *ctx = (DS_GSVD*)ds->data;
373 6331 PetscInt i,j;
374 6331 PetscBLASInt n1,m1,info,lc = 0,n = 0,m = 0,p = 0,p1,l,k,q,ld,off,lwork,r;
375 6331 PetscScalar *A,*B,*X,*U,*V,sone=1.0,smone=-1.0;
376 6331 PetscReal *alpha,*beta,*T,*D;
377 #if !defined(SLEPC_MISSING_LAPACK_GGSVD3)
378 6331 PetscScalar a,dummy;
379 6331 PetscReal rdummy;
380 6331 PetscBLASInt idummy;
381 #endif
382
383
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6331 PetscFunctionBegin;
384
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6331 PetscCheck(ctx->m,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"You should set the other dimensions with DSGSVDSetDimensions()");
385
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscBLASIntCast(ds->n,&m));
386
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscBLASIntCast(ctx->m,&n));
387
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscBLASIntCast(ctx->p,&p));
388
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscBLASIntCast(ds->l,&lc));
389
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6331 PetscCheck(ds->compact || lc==0,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"DSGSVD with non-compact format does not support locking");
390 /* In compact storage B is always nxn and A can be either nxn or (n+1)xn */
391
6/10
✓ 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 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
6331 PetscCheck(!ds->compact || (p==n && (m==p || m==p+1)),PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Dimensions not supported in compact format");
392
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscBLASIntCast(ds->ld,&ld));
393 6331 n1 = n-lc; /* n1 = size of leading block, excl. locked + size of trailing block */
394 6331 m1 = m-lc;
395 6331 p1 = p-lc;
396 6331 off = lc+lc*ld;
397
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A));
398
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_B],&B));
399
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_X],&X));
400
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_U],&U));
401
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_V],&V));
402
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscArrayzero(X,ld*ld));
403
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9706 for (i=0;i<lc;i++) X[i+i*ld] = 1.0;
404
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscArrayzero(U,ld*ld));
405
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9706 for (i=0;i<lc;i++) U[i+i*ld] = 1.0;
406
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(PetscArrayzero(V,ld*ld));
407
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9706 for (i=0;i<lc;i++) V[i+i*ld] = 1.0;
408
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.
6331 if (ds->compact) PetscCall(DSSwitchFormat_GSVD(ds));
409
410 #if !defined(SLEPC_MISSING_LAPACK_GGSVD3)
411 /* workspace query and memory allocation */
412 6331 lwork = -1;
413 #if !defined (PETSC_USE_COMPLEX)
414
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
3521 PetscCallBLAS("LAPACKggsvd3",LAPACKggsvd3_("U","V","Q",&m1,&n1,&p1,&k,&l,&dummy,&ld,&dummy,&ld,&rdummy,&rdummy,&dummy,&ld,&dummy,&ld,&dummy,&ld,&a,&lwork,&idummy,&info));
415
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.
3521 PetscCall(PetscBLASIntCast((PetscInt)a,&lwork));
416 #else
417
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2810 PetscCallBLAS("LAPACKggsvd3",LAPACKggsvd3_("U","V","Q",&m1,&n1,&p1,&k,&l,&dummy,&ld,&dummy,&ld,&rdummy,&rdummy,&dummy,&ld,&dummy,&ld,&dummy,&ld,&a,&lwork,&rdummy,&idummy,&info));
418
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.
2810 PetscCall(PetscBLASIntCast((PetscInt)PetscRealPart(a),&lwork));
419 #endif
420
421 #if !defined (PETSC_USE_COMPLEX)
422
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.
3521 PetscCall(DSAllocateWork_Private(ds,lwork,2*ds->ld,ds->ld));
423 3521 alpha = ds->rwork;
424 3521 beta = ds->rwork+ds->ld;
425
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
3521 PetscCallBLAS("LAPACKggsvd3",LAPACKggsvd3_("U","V","Q",&m1,&n1,&p1,&k,&l,A+off,&ld,B+off,&ld,alpha,beta,U+off,&ld,V+off,&ld,X+off,&ld,ds->work,&lwork,ds->iwork,&info));
426 #else
427
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.
2810 PetscCall(DSAllocateWork_Private(ds,lwork,4*ds->ld,ds->ld));
428 2810 alpha = ds->rwork+2*ds->ld;
429 2810 beta = ds->rwork+3*ds->ld;
430
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2810 PetscCallBLAS("LAPACKggsvd3",LAPACKggsvd3_("U","V","Q",&m1,&n1,&p1,&k,&l,A+off,&ld,B+off,&ld,alpha,beta,U+off,&ld,V+off,&ld,X+off,&ld,ds->work,&lwork,ds->rwork,ds->iwork,&info));
431 #endif
432
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6331 SlepcCheckLapackInfo("ggsvd3",info);
433
434 #else /* defined(SLEPC_MISSING_LAPACK_GGSVD3) */
435
436 lwork = PetscMax(PetscMax(3*n,m),p)+n;
437 #if !defined (PETSC_USE_COMPLEX)
438 PetscCall(DSAllocateWork_Private(ds,lwork,2*ds->ld,ds->ld));
439 alpha = ds->rwork;
440 beta = ds->rwork+ds->ld;
441 PetscCallBLAS("LAPACKggsvd",LAPACKggsvd_("U","V","Q",&m1,&n1,&p1,&k,&l,A+off,&ld,B+off,&ld,alpha,beta,U+off,&ld,V+off,&ld,X+off,&ld,ds->work,ds->iwork,&info));
442 #else
443 PetscCall(DSAllocateWork_Private(ds,lwork,4*ds->ld,ds->ld));
444 alpha = ds->rwork+2*ds->ld;
445 beta = ds->rwork+3*ds->ld;
446 PetscCallBLAS("LAPACKggsvd",LAPACKggsvd_("U","V","Q",&m1,&n1,&p1,&k,&l,A+off,&ld,B+off,&ld,alpha,beta,U+off,&ld,V+off,&ld,X+off,&ld,ds->work,ds->rwork,ds->iwork,&info));
447 #endif
448 SlepcCheckLapackInfo("ggsvd",info);
449
450 #endif
451
452
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6331 PetscCheck(k+l>=n1,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"The rank deficient case not supported yet");
453
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6331 if (ds->compact) {
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.
6141 PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
455
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(DSGetArrayReal(ds,DS_MAT_D,&D));
456 /* R is the identity matrix (except the sign) */
457
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60388 for (i=lc;i<n;i++) {
458
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54247 if (PetscRealPart(A[i+i*ld])<0.0) { /* scale column i */
459
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
320242 for (j=lc;j<n;j++) X[j+i*ld] = -X[j+i*ld];
460 }
461 }
462
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(PetscArrayzero(T+ld,m-1));
463
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(PetscArrayzero(T+2*ld,n-1));
464
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60388 for (i=lc;i<n;i++) {
465 54247 T[i] = alpha[i-lc];
466 54247 D[i] = beta[i-lc];
467
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
54247 if (D[i]==0.0) wr[i] = PETSC_INFINITY;
468 54247 else wr[i] = T[i]/D[i];
469 }
470 6141 ds->t = n;
471
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(DSRestoreArrayReal(ds,DS_MAT_D,&D));
472
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6141 PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
473 } else {
474 /* X = X*inv(R) */
475 190 q = PetscMin(m,n);
476
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
190 PetscCallBLAS("BLAStrsm",BLAStrsm_("R","U","N","N",&n,&q,&sone,A,&ld,X,&ld));
477
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
190 if (m<n) {
478 40 r = n-m;
479
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40 PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&n,&r,&m,&sone,X,&ld,A,&ld,&smone,X+m*ld,&ld));
480
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
40 PetscCallBLAS("BLAStrsm",BLAStrsm_("R","U","N","N",&n,&r,&sone,B+m*ld,&ld,X+m*ld,&ld));
481 }
482
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
190 if (k>0) {
483
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
130 for (i=k;i<PetscMin(m,k+l);i++) {
484
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
110 PetscCall(PetscArraycpy(X+(i-k)*ld,X+i*ld,ld));
485
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
110 PetscCall(PetscArraycpy(U+(i-k)*ld,U+i*ld,ld));
486 }
487 }
488 /* singular values */
489
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
190 PetscCall(PetscArrayzero(A,ld*ld));
490
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
190 PetscCall(PetscArrayzero(B,ld*ld));
491
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2300 for (j=k;j<PetscMin(m,k+l);j++) {
492 2110 A[(j-k)*(1+ld)] = alpha[j];
493 2110 B[(j-k)*(1+ld)] = beta[j];
494 2110 wr[j-k] = alpha[j]/beta[j];
495 }
496 190 ds->t = PetscMin(m,k+l)-k; /* set number of computed values */
497 }
498
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A));
499
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_B],&B));
500
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_X],&X));
501
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_U],&U));
502
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6331 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_V],&V));
503
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.
1254 PetscFunctionReturn(PETSC_SUCCESS);
504 }
505
506 240 static PetscErrorCode DSCond_GSVD(DS ds,PetscReal *cond)
507 {
508 240 DS_GSVD *ctx = (DS_GSVD*)ds->data;
509 240 PetscBLASInt lwork,lrwork=0,info,m,n,p,ld;
510 240 PetscScalar *A,*work;
511 240 const PetscScalar *M;
512 240 PetscReal *sigma,conda,condb;
513 #if defined(PETSC_USE_COMPLEX)
514 120 PetscReal *rwork;
515 #endif
516
517
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
240 PetscFunctionBegin;
518
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(PetscBLASIntCast(ds->n,&m));
519
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(PetscBLASIntCast(ctx->m,&n));
520
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(PetscBLASIntCast(ctx->p,&p));
521
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(PetscBLASIntCast(ds->ld,&ld));
522 240 lwork = 5*n;
523 #if defined(PETSC_USE_COMPLEX)
524 120 lrwork = 5*n;
525 #endif
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.
240 PetscCall(DSAllocateWork_Private(ds,ld*n+lwork,n+lrwork,0));
527 240 A = ds->work;
528 240 work = ds->work+ld*n;
529 240 sigma = ds->rwork;
530 #if defined(PETSC_USE_COMPLEX)
531 120 rwork = ds->rwork+n;
532 #endif
533
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.
240 if (ds->compact) PetscCall(DSSwitchFormat_GSVD(ds));
534
535
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_A],&M));
536
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(PetscArraycpy(A,M,ld*n));
537
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_A],&M));
538 #if defined(PETSC_USE_COMPLEX)
539
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
120 PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","N",&m,&n,A,&ld,sigma,NULL,&ld,NULL,&ld,work,&lwork,rwork,&info));
540 #else
541
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
120 PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","N",&m,&n,A,&ld,sigma,NULL,&ld,NULL,&ld,work,&lwork,&info));
542 #endif
543
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
240 SlepcCheckLapackInfo("gesvd",info);
544
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
240 conda = sigma[0]/sigma[PetscMin(m,n)-1];
545
546
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_B],&M));
547
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(PetscArraycpy(A,M,ld*n));
548
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
240 PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_B],&M));
549 #if defined(PETSC_USE_COMPLEX)
550
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
120 PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","N",&p,&n,A,&ld,sigma,NULL,&ld,NULL,&ld,work,&lwork,rwork,&info));
551 #else
552
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
120 PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","N",&p,&n,A,&ld,sigma,NULL,&ld,NULL,&ld,work,&lwork,&info));
553 #endif
554
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
240 SlepcCheckLapackInfo("gesvd",info);
555
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
240 condb = sigma[0]/sigma[PetscMin(p,n)-1];
556
557
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
240 *cond = PetscMax(conda,condb);
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.
240 PetscFunctionReturn(PETSC_SUCCESS);
559 }
560
561 #if !defined(PETSC_HAVE_MPIUNI)
562 300 static PetscErrorCode DSSynchronize_GSVD(DS ds,PetscScalar eigr[],PetscScalar eigi[])
563 {
564 300 DS_GSVD *ctx = (DS_GSVD*)ds->data;
565 300 PetscInt ld=ds->ld,l=ds->l,k=0,kr=0;
566 300 PetscMPIInt m,rank,off=0,size,n,ldn,ld3;
567 300 PetscScalar *A,*U,*V,*X;
568 300 PetscReal *T;
569
570
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
300 PetscFunctionBegin;
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.
300 PetscCall(PetscMPIIntCast(ctx->m,&m));
572
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
300 if (ds->compact) kr = 3*ld;
573 50 else k = 2*(m-l)*ld;
574
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
300 if (ds->state>DS_STATE_RAW) k += 3*(m-l)*ld;
575
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
300 if (eigr) k += m-l;
576
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(DSAllocateWork_Private(ds,k+kr,0,0));
577
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(PetscMPIIntCast(k*sizeof(PetscScalar)+kr*sizeof(PetscReal),&size));
578
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(PetscMPIIntCast(m-l,&n));
579
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(PetscMPIIntCast(ld*(m-l),&ldn));
580
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(PetscMPIIntCast(3*ld,&ld3));
581
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.
300 if (ds->compact) PetscCall(DSGetArrayReal(ds,DS_MAT_T,&T));
582
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50 else PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A));
583
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
300 if (ds->state>DS_STATE_RAW) {
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.
300 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_U],&U));
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.
300 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_V],&V));
586
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(MatDenseGetArray(ds->omat[DS_MAT_X],&X));
587 }
588
14/28
✓ 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 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.
300 PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)ds),&rank));
589
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
300 if (!rank) {
590
16/30
✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
145 if (ds->compact) PetscCallMPI(MPI_Pack(T,ld3,MPIU_REAL,ds->work,size,&off,PetscObjectComm((PetscObject)ds)));
591
14/28
✓ 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 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.
20 else PetscCallMPI(MPI_Pack(A+l*ld,ldn,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds)));
592
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
145 if (ds->state>DS_STATE_RAW) {
593
14/28
✓ 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 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.
145 PetscCallMPI(MPI_Pack(U+l*ld,ldn,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds)));
594
14/28
✓ 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 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.
145 PetscCallMPI(MPI_Pack(V+l*ld,ldn,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds)));
595
14/28
✓ 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 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.
145 PetscCallMPI(MPI_Pack(X+l*ld,ldn,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds)));
596 }
597
15/30
✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
145 if (eigr) PetscCallMPI(MPI_Pack(eigr+l,n,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds)));
598 }
599
15/30
✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
600 PetscCallMPI(MPI_Bcast(ds->work,size,MPI_BYTE,0,PetscObjectComm((PetscObject)ds)));
600
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
300 if (rank) {
601
16/30
✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
155 if (ds->compact) PetscCallMPI(MPI_Unpack(ds->work,size,&off,T,ld3,MPIU_REAL,PetscObjectComm((PetscObject)ds)));
602
14/28
✓ 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 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.
30 else PetscCallMPI(MPI_Unpack(ds->work,size,&off,A+l*ld,ldn,MPIU_SCALAR,PetscObjectComm((PetscObject)ds)));
603
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
155 if (ds->state>DS_STATE_RAW) {
604
14/28
✓ 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 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.
155 PetscCallMPI(MPI_Unpack(ds->work,size,&off,U+l*ld,ldn,MPIU_SCALAR,PetscObjectComm((PetscObject)ds)));
605
14/28
✓ 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 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.
155 PetscCallMPI(MPI_Unpack(ds->work,size,&off,V+l*ld,ldn,MPIU_SCALAR,PetscObjectComm((PetscObject)ds)));
606
14/28
✓ 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 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.
155 PetscCallMPI(MPI_Unpack(ds->work,size,&off,X+l*ld,ldn,MPIU_SCALAR,PetscObjectComm((PetscObject)ds)));
607 }
608
15/30
✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
155 if (eigr) PetscCallMPI(MPI_Unpack(ds->work,size,&off,eigr+l,n,MPIU_SCALAR,PetscObjectComm((PetscObject)ds)));
609 }
610
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.
300 if (ds->compact) PetscCall(DSRestoreArrayReal(ds,DS_MAT_T,&T));
611
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50 else PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A));
612
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
300 if (ds->state>DS_STATE_RAW) {
613
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_U],&U));
614
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_V],&V));
615
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
300 PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_X],&X));
616 }
617
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.
60 PetscFunctionReturn(PETSC_SUCCESS);
618 }
619 #endif
620
621 18848 static PetscErrorCode DSMatGetSize_GSVD(DS ds,DSMatType t,PetscInt *rows,PetscInt *cols)
622 {
623 18848 DS_GSVD *ctx = (DS_GSVD*)ds->data;
624
625
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18848 PetscFunctionBegin;
626
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18848 PetscCheck(ctx->m,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"You should set the other dimensions with DSGSVDSetDimensions()");
627
5/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
18848 switch (t) {
628 190 case DS_MAT_A:
629 190 *rows = ds->n;
630
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
190 *cols = ds->extrarow? ctx->m+1: ctx->m;
631 190 break;
632 190 case DS_MAT_B:
633 190 *rows = ctx->p;
634
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
190 *cols = ds->extrarow? ctx->m+1: ctx->m;
635 190 break;
636 case DS_MAT_T:
637 *rows = ds->n;
638 *cols = PetscDefined(USE_COMPLEX)? 2: 3;
639 break;
640 case DS_MAT_D:
641 *rows = ctx->p;
642 *cols = 1;
643 break;
644 6156 case DS_MAT_U:
645
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6156 *rows = ds->state==DS_STATE_TRUNCATED? ds->t: ds->n;
646 6156 *cols = ds->n;
647 6156 break;
648 6156 case DS_MAT_V:
649
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6156 *rows = ds->state==DS_STATE_TRUNCATED? ctx->tp: ctx->p;
650 6156 *cols = ctx->p;
651 6156 break;
652 6156 case DS_MAT_X:
653
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6156 *rows = ds->state==DS_STATE_TRUNCATED? ctx->tm: ctx->m;
654 6156 *cols = ctx->m;
655 6156 break;
656 default:
657 SETERRQ(PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Invalid t parameter");
658 }
659
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.
3733 PetscFunctionReturn(PETSC_SUCCESS);
660 }
661
662 6331 static PetscErrorCode DSGSVDSetDimensions_GSVD(DS ds,PetscInt m,PetscInt p)
663 {
664 6331 DS_GSVD *ctx = (DS_GSVD*)ds->data;
665
666
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6331 PetscFunctionBegin;
667
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6331 DSCheckAlloc(ds,1);
668
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
6331 if (m == PETSC_DETERMINE) {
669 ctx->m = ds->ld;
670
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6331 } else if (m != PETSC_CURRENT) {
671
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6331 PetscCheck(m>0 && m<=ds->ld,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of m. Must be between 1 and ld");
672 6331 ctx->m = m;
673 }
674
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6331 if (p == PETSC_DETERMINE) {
675 30 ctx->p = ds->n;
676
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6301 } else if (p != PETSC_CURRENT) {
677
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6301 PetscCheck(p>0 && p<=ds->ld,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of p. Must be between 1 and ld");
678 6301 ctx->p = p;
679 }
680
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.
1254 PetscFunctionReturn(PETSC_SUCCESS);
681 }
682
683 /*@
684 DSGSVDSetDimensions - Sets the number of columns and rows for a `DSGSVD`.
685
686 Logically Collective
687
688 Input Parameters:
689 + ds - the direct solver context
690 . m - the number of columns
691 - p - the number of rows for the second matrix (`DS_MAT_B`)
692
693 Notes:
694 This call is complementary to `DSSetDimensions()`, to provide two dimensions
695 that are specific to this `DS` type. The number of rows for the first matrix
696 (`DS_MAT_A`) is set by `DSSetDimensions()`.
697
698 Use `PETSC_CURRENT` to leave any of the values unchanged. Use `PETSC_DETERMINE`
699 to set `m` to the leading dimension and `p` to the number of columns of $B$.
700
701 Level: intermediate
702
703 .seealso: [](sec:ds), `DSGSVD`, `DSGSVDGetDimensions()`, `DSSetDimensions()`
704 @*/
705 6331 PetscErrorCode DSGSVDSetDimensions(DS ds,PetscInt m,PetscInt p)
706 {
707
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6331 PetscFunctionBegin;
708
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.
6331 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
709
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.
6331 PetscValidLogicalCollectiveInt(ds,m,2);
710
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.
6331 PetscValidLogicalCollectiveInt(ds,p,3);
711
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.
6331 PetscTryMethod(ds,"DSGSVDSetDimensions_C",(DS,PetscInt,PetscInt),(ds,m,p));
712
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.
6331 PetscFunctionReturn(PETSC_SUCCESS);
713 }
714
715 120 static PetscErrorCode DSGSVDGetDimensions_GSVD(DS ds,PetscInt *m,PetscInt *p)
716 {
717 120 DS_GSVD *ctx = (DS_GSVD*)ds->data;
718
719
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBegin;
720
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
120 if (m) *m = ctx->m;
721
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
120 if (p) *p = ctx->p;
722
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.
120 PetscFunctionReturn(PETSC_SUCCESS);
723 }
724
725 /*@
726 DSGSVDGetDimensions - Returns the number of columns and rows for a `DSGSVD`.
727
728 Not Collective
729
730 Input Parameter:
731 . ds - the direct solver context
732
733 Output Parameters:
734 + m - the number of columns
735 - p - the number of rows for the second problem matrix (`DS_MAT_B`)
736
737 Level: intermediate
738
739 .seealso: [](sec:ds), `DSGSVD`, `DSGSVDSetDimensions()`
740 @*/
741 120 PetscErrorCode DSGSVDGetDimensions(DS ds,PetscInt *m,PetscInt *p)
742 {
743
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBegin;
744
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.
120 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
745
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.
120 PetscUseMethod(ds,"DSGSVDGetDimensions_C",(DS,PetscInt*,PetscInt*),(ds,m,p));
746
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.
120 PetscFunctionReturn(PETSC_SUCCESS);
747 }
748
749 684 static PetscErrorCode DSDestroy_GSVD(DS ds)
750 {
751
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
684 PetscFunctionBegin;
752
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.
684 PetscCall(PetscFree(ds->data));
753
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(PetscObjectComposeFunction((PetscObject)ds,"DSGSVDSetDimensions_C",NULL));
754
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(PetscObjectComposeFunction((PetscObject)ds,"DSGSVDGetDimensions_C",NULL));
755
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.
140 PetscFunctionReturn(PETSC_SUCCESS);
756 }
757
758 10 static PetscErrorCode DSReallocate_GSVD(DS ds,PetscInt ld)
759 {
760 10 PetscInt i,*perm=ds->perm;
761
762
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
10 PetscFunctionBegin;
763
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
230 for (i=0;i<DS_NUM_MAT;i++) {
764
10/12
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 5 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
220 if (i!=DS_MAT_A && i!=DS_MAT_B && i!=DS_MAT_X && i!=DS_MAT_U && i!=DS_MAT_V && i!=DS_MAT_T && i!=DS_MAT_D) PetscCall(MatDestroy(&ds->omat[i]));
765 }
766
767
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_A,ld));
768
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_B,ld));
769
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_X,ld));
770
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_U,ld));
771
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_V,ld));
772
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_T,ld));
773
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.
10 PetscCall(DSReallocateMat_Private(ds,DS_MAT_D,ld));
774
775
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.
10 PetscCall(PetscMalloc1(ld,&ds->perm));
776
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.
10 PetscCall(PetscArraycpy(ds->perm,perm,ds->ld));
777
6/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
10 PetscCall(PetscFree(perm));
778
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
2 PetscFunctionReturn(PETSC_SUCCESS);
779 }
780
781 /*MC
782 DSGSVD - Dense Generalized Singular Value Decomposition.
783
784 Notes:
785 The problem is expressed as $AX = UC$, $BX = VS$, where $A$ and $B$ are
786 matrices with the same number of columns, $m$, $U$ and $V$ are orthogonal
787 (unitary), and $X$ is an $m\times m$ invertible matrix. The `DS` object does not
788 expose matrices $C$ and $S$, instead the singular values $\sigma_i$, which are
789 the ratios $c_i/s_i$, are returned in the arguments of `DSSolve()`.
790 Note that the number of columns of the returned $X$, $U$, $V$ may be smaller
791 in the case that some $c_i$ or $s_i$ are zero.
792
793 The number of rows of $A$ (and $U$) is the value $n$ passed with `DSSetDimensions()`.
794 The number of columns $m$ and the number of rows of $B$ (and $V$) must be
795 set via `DSGSVDSetDimensions()`.
796
797 Internally, LAPACK's representation is used, $U^*AQ = C[0,R]$, $V^*BQ = S[0, R]$,
798 where $X = QR^{-1}$ is computed at the end of `DSSolve()`.
799
800 If the compact storage format is selected, then a simplified problem is
801 solved, where $A$ and $B$ are bidiagonal (possibly with an arrow), and the
802 stacked matrix $\begin{bmatrix}A^* &B^*\end{bmatrix}^*$
803 is assumed to have orthonormal columns. We consider two cases,
804
805 1. $A$ and $B$ are square $m\times m$ upper bidiagonal, or
806 2. $A$ is lower bidiagonal with $m+1$ rows and $B$ is square upper bidiagonal.
807
808 In these cases, $R=I$ so it corresponds to the CS decomposition {cite:p}`Gol96`.
809 The first matrix is stored in two diagonals of `DS_MAT_T`, while the second matrix
810 is stored in `DS_MAT_D` and the remaining diagonal of `DS_MAT_T`.
811
812 Allowed arguments of `DSVectors()` are `DS_MAT_U`, `DS_MAT_V` and `DS_MAT_X`.
813
814 Used DS matrices:
815 + `DS_MAT_A` - first problem matrix
816 . `DS_MAT_B` - second problem matrix
817 . `DS_MAT_T` - first upper bidiagonal matrix (if compact storage is selected)
818 . `DS_MAT_D` - second upper bidiagonal matrix (if compact storage is selected)
819 . `DS_MAT_U` - (upper) left generalized singular vectors
820 . `DS_MAT_V` - (lower) left generalized singular vectors
821 - `DS_MAT_X` - right generalized singular vectors
822
823 Implemented methods:
824 . 0 - Lapack (`_ggsvd3` if available, or `_ggsvd`)
825
826 Level: beginner
827
828 .seealso: [](sec:ds), `DSCreate()`, `DSSetType()`, `DSType`, `DSGSVDSetDimensions()`
829 M*/
830 684 SLEPC_EXTERN PetscErrorCode DSCreate_GSVD(DS ds)
831 {
832 684 DS_GSVD *ctx;
833
834
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
684 PetscFunctionBegin;
835
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(PetscNew(&ctx));
836 684 ds->data = (void*)ctx;
837
838 684 ds->ops->allocate = DSAllocate_GSVD;
839 684 ds->ops->view = DSView_GSVD;
840 684 ds->ops->vectors = DSVectors_GSVD;
841 684 ds->ops->sort = DSSort_GSVD;
842 684 ds->ops->solve[0] = DSSolve_GSVD;
843 #if !defined(PETSC_HAVE_MPIUNI)
844 684 ds->ops->synchronize = DSSynchronize_GSVD;
845 #endif
846 684 ds->ops->truncate = DSTruncate_GSVD;
847 684 ds->ops->update = DSUpdateExtraRow_GSVD;
848 684 ds->ops->cond = DSCond_GSVD;
849 684 ds->ops->matgetsize = DSMatGetSize_GSVD;
850 684 ds->ops->destroy = DSDestroy_GSVD;
851 684 ds->ops->reallocate = DSReallocate_GSVD;
852
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(PetscObjectComposeFunction((PetscObject)ds,"DSGSVDSetDimensions_C",DSGSVDSetDimensions_GSVD));
853
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
684 PetscCall(PetscObjectComposeFunction((PetscObject)ds,"DSGSVDGetDimensions_C",DSGSVDGetDimensions_GSVD));
854
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
140 PetscFunctionReturn(PETSC_SUCCESS);
855 }
856