GCC Code Coverage Report


Directory: ./
File: src/sys/classes/ds/interface/dsops.c
Date: 2025-12-10 04:20:18
Exec Total Coverage
Lines: 374 377 99.2%
Functions: 27 27 100.0%
Branches: 1157 2610 44.3%

Line Branch Exec Source
1 /*
2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 SLEPc - Scalable Library for Eigenvalue Problem Computations
4 Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5
6 This file is part of SLEPc.
7 SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 */
10 /*
11 DS operations: DSSolve(), DSVectors(), etc
12 */
13
14 #include <slepc/private/dsimpl.h> /*I "slepcds.h" I*/
15
16 /*@
17 DSGetLeadingDimension - Returns the leading dimension of the allocated
18 matrices.
19
20 Not Collective
21
22 Input Parameter:
23 . ds - the direct solver context
24
25 Output Parameter:
26 . ld - leading dimension (maximum allowed dimension for the matrices)
27
28 Level: advanced
29
30 .seealso: [](sec:ds), `DSAllocate()`, `DSSetDimensions()`
31 @*/
32 364681 PetscErrorCode DSGetLeadingDimension(DS ds,PetscInt *ld)
33 {
34
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
364681 PetscFunctionBegin;
35
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.
364681 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
36
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
364681 PetscAssertPointer(ld,2);
37 364681 *ld = ds->ld;
38
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.
364681 PetscFunctionReturn(PETSC_SUCCESS);
39 }
40
41 /*@
42 DSSetState - Change the state of the `DS` object.
43
44 Logically Collective
45
46 Input Parameters:
47 + ds - the direct solver context
48 - state - the new state
49
50 Notes:
51 The state indicates that the dense system is in an initial state (raw),
52 in an intermediate state (such as tridiagonal, Hessenberg or
53 Hessenberg-triangular), in a condensed state (such as diagonal, Schur or
54 generalized Schur), or in a truncated state.
55
56 The state is automatically changed in functions such as `DSSolve()` or `DSTruncate()`.
57 This function is normally used to return to the raw state when the
58 condensed structure is destroyed, or to indicate that `DSSolve()` must
59 start with a problem that already has an intermediate form.
60
61 Level: advanced
62
63 .seealso: [](sec:ds), `DSGetState()`, `DSSolve()`, `DSTruncate()`
64 @*/
65 221917 PetscErrorCode DSSetState(DS ds,DSStateType state)
66 {
67
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
221917 PetscFunctionBegin;
68
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.
221917 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
69
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.
221917 PetscValidLogicalCollectiveEnum(ds,state,2);
70
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
221917 switch (state) {
71 221917 case DS_STATE_RAW:
72 case DS_STATE_INTERMEDIATE:
73 case DS_STATE_CONDENSED:
74 case DS_STATE_TRUNCATED:
75
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.
221917 if (ds->state!=state) PetscCall(PetscInfo(ds,"State has changed from %s to %s\n",DSStateTypes[ds->state],DSStateTypes[state]));
76 221917 ds->state = state;
77 221917 break;
78 default:
79 SETERRQ(PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_WRONG,"Wrong state");
80 }
81
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.
221917 PetscFunctionReturn(PETSC_SUCCESS);
82 }
83
84 /*@
85 DSGetState - Returns the current state.
86
87 Not Collective
88
89 Input Parameter:
90 . ds - the direct solver context
91
92 Output Parameter:
93 . state - current state
94
95 Level: advanced
96
97 .seealso: [](sec:ds), `DSSetState()`
98 @*/
99 20 PetscErrorCode DSGetState(DS ds,DSStateType *state)
100 {
101
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
102
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
20 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
103
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
20 PetscAssertPointer(state,2);
104 20 *state = ds->state;
105
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
20 PetscFunctionReturn(PETSC_SUCCESS);
106 }
107
108 /*@
109 DSSetDimensions - Resize the matrices in the `DS` object.
110
111 Logically Collective
112
113 Input Parameters:
114 + ds - the direct solver context
115 . n - the new size
116 . l - number of locked (inactive) leading columns
117 - k - intermediate dimension (e.g., position of arrow)
118
119 Notes:
120 The internal arrays are not reallocated.
121
122 Some `DS` types have additional dimensions, e.g., the number of columns
123 in `DSSVD`. For these, you should call a specific interface function.
124
125 Use `PETSC_CURRENT` to leave any of the values unchanged. Use `PETSC_DETERMINE`
126 to set `n` to the leading dimension, `l` to the minimum value (0), and `k` to `n/2`.
127
128 Level: intermediate
129
130 .seealso: [](sec:ds), `DSGetDimensions()`, `DSAllocate()`, `DSSVDSetDimensions()`
131 @*/
132 297311 PetscErrorCode DSSetDimensions(DS ds,PetscInt n,PetscInt l,PetscInt k)
133 {
134 297311 PetscInt on,ol,ok;
135 297311 PetscBool issvd;
136
137
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
297311 PetscFunctionBegin;
138
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.
297311 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
139
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
297311 DSCheckAlloc(ds,1);
140
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.
297311 PetscValidLogicalCollectiveInt(ds,n,2);
141
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.
297311 PetscValidLogicalCollectiveInt(ds,l,3);
142
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.
297311 PetscValidLogicalCollectiveInt(ds,k,4);
143 297311 on = ds->n; ol = ds->l; ok = ds->k;
144
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
297311 if (n == PETSC_DETERMINE) {
145
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1417 ds->n = ds->extrarow? ds->ld-1: ds->ld;
146
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
295894 } else if (n != PETSC_CURRENT) {
147
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.
295894 PetscCheck(n>=0 && n<=ds->ld,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of n. Must be between 0 and ld");
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
295894 PetscCall(PetscObjectTypeCompareAny((PetscObject)ds,&issvd,DSSVD,DSGSVD,"")); /* SVD and GSVD have extra column instead of extra row */
149
5/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
295894 PetscCheck(!ds->extrarow || n<ds->ld || issvd,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"A value of n equal to ld leaves no room for extra row");
150 295894 ds->n = n;
151 }
152 297311 ds->t = ds->n; /* truncated length equal to the new dimension */
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
297311 if (l == PETSC_DETERMINE) {
154 4927 ds->l = 0;
155
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
292384 } else if (l != PETSC_CURRENT) {
156
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.
292384 PetscCheck(l>=0 && l<=ds->n,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of l. Must be between 0 and n");
157 292384 ds->l = l;
158 }
159
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
297311 if (k == PETSC_DETERMINE) {
160 14431 ds->k = ds->n/2;
161
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
282880 } else if (k != PETSC_CURRENT) {
162
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.
282880 PetscCheck(k>=0 || k<=ds->n,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of k. Must be between 0 and n");
163 282880 ds->k = k;
164 }
165
10/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
297311 if (on!=ds->n || ol!=ds->l || ok!=ds->k) PetscCall(PetscInfo(ds,"New dimensions are: n=%" PetscInt_FMT ", l=%" PetscInt_FMT ", k=%" PetscInt_FMT "\n",ds->n,ds->l,ds->k));
166
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.
57265 PetscFunctionReturn(PETSC_SUCCESS);
167 }
168
169 /*@
170 DSGetDimensions - Returns the current dimensions.
171
172 Not Collective
173
174 Input Parameter:
175 . ds - the direct solver context
176
177 Output Parameters:
178 + n - the current size
179 . l - number of locked (inactive) leading columns
180 . k - intermediate dimension (e.g., position of arrow)
181 - t - truncated length
182
183 Notes:
184 The `t` parameter makes sense only if `DSTruncate()` has been called.
185 Otherwise its value equals `n`.
186
187 Some `DS` types have additional dimensions, e.g., the number of columns
188 in `DSSVD`. For these, you should call a specific interface function.
189
190 Level: intermediate
191
192 .seealso: [](sec:ds), `DSSetDimensions()`, `DSTruncate()`, `DSSVDGetDimensions()`
193 @*/
194 196514 PetscErrorCode DSGetDimensions(DS ds,PetscInt *n,PetscInt *l,PetscInt *k,PetscInt *t)
195 {
196
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
196514 PetscFunctionBegin;
197
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.
196514 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
198
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
196514 DSCheckAlloc(ds,1);
199
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196514 if (n) *n = ds->n;
200
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196514 if (l) *l = ds->l;
201
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196514 if (k) *k = ds->k;
202
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196514 if (t) *t = ds->t;
203
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.
196514 PetscFunctionReturn(PETSC_SUCCESS);
204 }
205
206 /*@
207 DSTruncate - Truncates the system represented in the `DS` object.
208
209 Logically Collective
210
211 Input Parameters:
212 + ds - the direct solver context
213 . n - the new size
214 - trim - a flag to indicate if the factorization must be trimmed
215
216 Note:
217 The new size is set to `n`. Note that in some cases the new size could
218 be `n+1` or `n-1` to avoid breaking a 2x2 diagonal block (e.g., in real
219 Schur form). In cases where the extra row is meaningful, the first
220 `n` elements are kept as the extra row for the new system.
221
222 If the flag `trim` is turned on, it resets the locked and intermediate
223 dimensions to zero, see `DSSetDimensions()`, and sets the state to
224 `DS_STATE_RAW`. It also cleans the extra row if being used.
225
226 The typical usage of `trim=PETSC_TRUE` is to truncate the Schur decomposition
227 at the end of a Krylov iteration. In this case, the state must be
228 changed to `DS_STATE_RAW` so that `DSVectors()` computes eigenvectors from scratch.
229
230 Level: advanced
231
232 .seealso: [](sec:ds), `DSSetDimensions()`, `DSSetExtraRow()`, `DSStateType`
233 @*/
234 79276 PetscErrorCode DSTruncate(DS ds,PetscInt n,PetscBool trim)
235 {
236 79276 DSStateType old;
237
238
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
79276 PetscFunctionBegin;
239
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.
79276 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
240
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
79276 PetscValidType(ds,1);
241
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
79276 DSCheckAlloc(ds,1);
242
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.
79276 PetscValidLogicalCollectiveInt(ds,n,2);
243
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.
79276 PetscValidLogicalCollectiveBool(ds,trim,3);
244
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.
79276 PetscCheck(n>=ds->l && n<=ds->n,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of n (%" PetscInt_FMT "). Must be between l (%" PetscInt_FMT ") and n (%" PetscInt_FMT ")",n,ds->l,ds->n);
245
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79276 PetscCall(PetscLogEventBegin(DS_Other,ds,0,0,0));
246
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79276 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
247
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
79276 PetscUseTypeMethod(ds,truncate,n,trim);
248
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79276 PetscCall(PetscFPTrapPop());
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79276 PetscCall(PetscLogEventEnd(DS_Other,ds,0,0,0));
250
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
150457 PetscCall(PetscInfo(ds,"Decomposition %s to size n=%" PetscInt_FMT "\n",trim?"trimmed":"truncated",ds->n));
251 79276 old = ds->state;
252
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
79276 ds->state = trim? DS_STATE_RAW: DS_STATE_TRUNCATED;
253
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
79276 if (old!=ds->state) PetscCall(PetscInfo(ds,"State has changed from %s to %s\n",DSStateTypes[old],DSStateTypes[ds->state]));
254
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
79276 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
255
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.
79276 PetscFunctionReturn(PETSC_SUCCESS);
256 }
257
258 /*@
259 DSMatGetSize - Returns the numbers of rows and columns of one of the `DS` matrices.
260
261 Not Collective
262
263 Input Parameters:
264 + ds - the direct solver context
265 - t - the requested matrix
266
267 Output Parameters:
268 + n - the number of rows
269 - m - the number of columns
270
271 Note:
272 This is equivalent to `MatGetSize()` on a matrix obtained with `DSGetMat()`.
273
274 Level: developer
275
276 .seealso: [](sec:ds), `DSSetDimensions()`, `DSGetMat()`
277 @*/
278 584533 PetscErrorCode DSMatGetSize(DS ds,DSMatType t,PetscInt *m,PetscInt *n)
279 {
280 584533 PetscInt rows,cols;
281
282
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
584533 PetscFunctionBegin;
283
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.
584533 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
284
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
584533 PetscValidType(ds,1);
285
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584533 DSCheckValidMat(ds,t,2);
286
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.
584533 if (ds->ops->matgetsize) PetscUseTypeMethod(ds,matgetsize,t,&rows,&cols);
287 else {
288
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
448254 if (ds->state==DS_STATE_TRUNCATED && t>=DS_MAT_Q) rows = ds->t;
289
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
397677 else rows = (t==DS_MAT_A && ds->extrarow)? ds->n+1: ds->n;
290
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
448254 if (t==DS_MAT_T) cols = PetscDefined(USE_COMPLEX)? 2: 3;
291
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
424859 else if (t==DS_MAT_D) cols = 1;
292 413666 else cols = ds->n;
293 }
294
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
584533 if (m) *m = rows;
295
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
584533 if (n) *n = cols;
296
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.
113462 PetscFunctionReturn(PETSC_SUCCESS);
297 }
298
299 /*@
300 DSMatIsHermitian - Checks if one of the `DS` matrices is known to be Hermitian.
301
302 Not Collective
303
304 Input Parameters:
305 + ds - the direct solver context
306 - t - the requested matrix
307
308 Output Parameter:
309 . flg - the Hermitian flag
310
311 Note:
312 Does not check the matrix values directly. The flag is set according to the
313 problem structure. For instance, in `DSHEP` matrix `A` is Hermitian.
314
315 Level: developer
316
317 .seealso: [](sec:ds), `DSGetMat()`
318 @*/
319 584233 PetscErrorCode DSMatIsHermitian(DS ds,DSMatType t,PetscBool *flg)
320 {
321
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
584233 PetscFunctionBegin;
322
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.
584233 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
584233 PetscValidType(ds,1);
324
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584233 DSCheckValidMat(ds,t,2);
325
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584233 PetscAssertPointer(flg,3);
326 584233 *flg = PETSC_FALSE;
327
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.
584233 PetscTryTypeMethod(ds,hermitian,t,flg);
328
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.
113402 PetscFunctionReturn(PETSC_SUCCESS);
329 }
330
331 18713 PetscErrorCode DSGetTruncateSize_Default(DS ds,PetscInt l,PetscInt n,PetscInt *k)
332 {
333 #if !defined(PETSC_USE_COMPLEX)
334 9273 PetscScalar val;
335 #endif
336
337
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18713 PetscFunctionBegin;
338 #if !defined(PETSC_USE_COMPLEX)
339
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.
9273 PetscCall(MatGetValue(ds->omat[DS_MAT_A],l+(*k),l+(*k)-1,&val));
340
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
9273 if (val != 0.0) {
341
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2258 if (l+(*k)<n-1) (*k)++;
342 else (*k)--;
343 }
344 #endif
345
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.
11162 PetscFunctionReturn(PETSC_SUCCESS);
346 }
347
348 /*@
349 DSGetTruncateSize - Gets the correct size to be used in `DSTruncate()`
350 to avoid breaking a 2x2 block.
351
352 Not Collective
353
354 Input Parameters:
355 + ds - the direct solver context
356 . l - the size of the locked part (set to 0 to use `ds->l`)
357 - n - the total matrix size (set to 0 to use `ds->n`)
358
359 Output Parameter:
360 . k - the wanted truncation size (possibly modified)
361
362 Notes:
363 This should be called before `DSTruncate()` to make sure that the truncation
364 does not break a 2x2 block corresponding to a complex conjugate eigenvalue.
365
366 The total size is `n` (either user-provided or `ds->n` if 0 is passed). The
367 size where the truncation is intended is equal to `l+k` (where `l` can be
368 equal to the locked size `ds->l` if set to 0). Then if there is a 2x2 block
369 at the `l+k` limit, the value of `k` is increased (or decreased) by 1.
370
371 Level: advanced
372
373 .seealso: [](sec:ds), `DSTruncate()`, `DSSetDimensions()`
374 @*/
375 29504 PetscErrorCode DSGetTruncateSize(DS ds,PetscInt l,PetscInt n,PetscInt *k)
376 {
377
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
29504 PetscFunctionBegin;
378
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.
29504 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
379
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
29504 DSCheckAlloc(ds,1);
380
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
29504 PetscValidLogicalCollectiveInt(ds,l,2);
381
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.
29504 PetscValidLogicalCollectiveInt(ds,n,3);
382
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
29504 PetscAssertPointer(k,4);
383
9/14
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
29504 PetscUseTypeMethod(ds,gettruncatesize,l?l:ds->l,n?n:ds->n,k);
384
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.
5689 PetscFunctionReturn(PETSC_SUCCESS);
385 }
386
387 /*@
388 DSGetMat - Returns a sequential dense `Mat` object containing the requested
389 matrix.
390
391 Not Collective
392
393 Input Parameters:
394 + ds - the direct solver context
395 - m - the requested matrix
396
397 Output Parameter:
398 . A - Mat object
399
400 Notes:
401 The returned `Mat` has sizes equal to the current `DS` dimensions (see `DSSetDimensions()`),
402 and contains the values that would be obtained with `DSGetArray()`
403 (not `DSGetArrayReal()`). If the `DS` was truncated, then the number of rows
404 is equal to the dimension prior to truncation, see `DSTruncate()`.
405 The communicator is always `PETSC_COMM_SELF`.
406
407 It is implemented with `MatDenseGetSubMatrix()`, and when no longer needed
408 the user must call `DSRestoreMat()` which will invoke `MatDenseRestoreSubMatrix()`.
409
410 For matrices `DS_MAT_T` and `DS_MAT_D`, this function will return a `Mat` object
411 that cannot be used directly for computations, since it uses compact storage
412 (three and one diagonals for $T$ and $D$, respectively). In complex scalars, the
413 internal array stores real values, so it is sufficient with two columns for $T$.
414
415 Level: advanced
416
417 .seealso: [](sec:ds), `DSRestoreMat()`, `DSSetDimensions()`, `DSGetArray()`, `DSGetArrayReal()`, `DSTruncate()`, `DSGetMatAndColumn()`
418 @*/
419 584233 PetscErrorCode DSGetMat(DS ds,DSMatType m,Mat *A)
420 {
421 584233 PetscInt rows=0,cols=0;
422 584233 PetscBool flg;
423
424
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
584233 PetscFunctionBegin;
425
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.
584233 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
426
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
584233 DSCheckAlloc(ds,1);
427
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584233 DSCheckValidMat(ds,m,2);
428
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584233 PetscAssertPointer(A,3);
429
430
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
584233 PetscCall(DSMatGetSize(ds,m,&rows,&cols));
431
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.
584233 PetscCheck(rows && cols,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"Must call DSSetDimensions() first");
432
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
584233 PetscCall(MatDenseGetSubMatrix(ds->omat[m],0,rows,0,cols,A));
433
434 /* set Hermitian flag */
435
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
584233 PetscCall(DSMatIsHermitian(ds,m,&flg));
436
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
584233 PetscCall(MatSetOption(*A,MAT_SYMMETRIC,flg));
437
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
584233 PetscCall(MatSetOption(*A,MAT_HERMITIAN,flg));
438
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.
113402 PetscFunctionReturn(PETSC_SUCCESS);
439 }
440
441 /*@
442 DSRestoreMat - Restores the matrix after `DSGetMat()` was called.
443
444 Not Collective
445
446 Input Parameters:
447 + ds - the direct solver context
448 . m - the requested matrix
449 - A - the fetched `Mat` object
450
451 Note:
452 A call to this function must match a previous call of `DSGetMat()`.
453
454 Level: advanced
455
456 .seealso: [](sec:ds), `DSGetMat()`, `DSRestoreArray()`, `DSRestoreArrayReal()`
457 @*/
458 584233 PetscErrorCode DSRestoreMat(DS ds,DSMatType m,Mat *A)
459 {
460
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
584233 PetscFunctionBegin;
461
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.
584233 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
462
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
584233 DSCheckAlloc(ds,1);
463
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584233 DSCheckValidMat(ds,m,2);
464
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
584233 PetscAssertPointer(A,3);
465
466
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
584233 PetscCall(MatDenseRestoreSubMatrix(ds->omat[m],A));
467
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
584233 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
468
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.
584233 PetscFunctionReturn(PETSC_SUCCESS);
469 }
470
471 /*@
472 DSGetMatAndColumn - Returns a sequential dense `Mat` object containing the requested
473 matrix and one of its columns as a `Vec`.
474
475 Not Collective
476
477 Input Parameters:
478 + ds - the direct solver context
479 . m - the requested matrix
480 - col - the index of the requested column
481
482 Output Parameters:
483 + A - `Mat` object
484 - v - `Vec` object (the column)
485
486 Notes:
487 This calls `DSGetMat()` and then it extracts the selected column.
488 The user must call `DSRestoreMatAndColumn()` to recover the original state.
489 For matrices `DS_MAT_T` and `DS_MAT_D`, in complex scalars this function implies
490 copying from real values stored internally to scalar values in the Vec.
491
492 Level: advanced
493
494 .seealso: [](sec:ds), `DSRestoreMatAndColumn()`, `DSGetMat()`
495 @*/
496 13685 PetscErrorCode DSGetMatAndColumn(DS ds,DSMatType m,PetscInt col,Mat *A,Vec *v)
497 {
498
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13685 PetscFunctionBegin;
499
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.
13685 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
500
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13685 DSCheckAlloc(ds,1);
501
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13685 DSCheckValidMat(ds,m,2);
502
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13685 PetscAssertPointer(A,4);
503
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13685 PetscAssertPointer(v,5);
504
505
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13685 PetscCall(DSGetMat(ds,m,A));
506
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
13685 if (PetscDefined(USE_COMPLEX) && (m==DS_MAT_T || m==DS_MAT_D)) {
507 2232 const PetscScalar *as;
508 2232 PetscScalar *vs;
509 2232 PetscReal *ar;
510 2232 PetscInt i,n,lda;
511
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.
2232 PetscCall(MatCreateVecs(*A,NULL,v));
512
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.
2232 PetscCall(VecGetSize(*v,&n));
513
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.
2232 PetscCall(MatDenseGetLDA(*A,&lda));
514
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.
2232 PetscCall(MatDenseGetArrayRead(*A,&as));
515
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.
2232 PetscCall(VecGetArrayWrite(*v,&vs));
516 2232 ar = (PetscReal*)as;
517
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
36131 for (i=0;i<n;i++) vs[i] = ar[i+col*lda];
518
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.
2232 PetscCall(VecRestoreArrayWrite(*v,&vs));
519
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.
2232 PetscCall(MatDenseRestoreArrayRead(*A,&as));
520
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.
11453 } else PetscCall(MatDenseGetColumnVec(*A,col,v));
521
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.
2719 PetscFunctionReturn(PETSC_SUCCESS);
522 }
523
524 /*@
525 DSRestoreMatAndColumn - Restores the matrix and vector after `DSGetMatAndColumn()`
526 was called.
527
528 Not Collective
529
530 Input Parameters:
531 + ds - the direct solver context
532 . m - the requested matrix
533 . col - the requested column
534 . A - the fetched `Mat` object
535 - v - the fetched `Vec` object
536
537 Note:
538 A call to this function must match a previous call of `DSGetMatAndColumn()`.
539
540 Level: advanced
541
542 .seealso: [](sec:ds), `DSGetMatAndColumn()`, `DSRestoreMat()`
543 @*/
544 13685 PetscErrorCode DSRestoreMatAndColumn(DS ds,DSMatType m,PetscInt col,Mat *A,Vec *v)
545 {
546
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13685 PetscFunctionBegin;
547
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.
13685 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
548
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13685 DSCheckAlloc(ds,1);
549
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13685 DSCheckValidMat(ds,m,2);
550
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13685 PetscAssertPointer(A,4);
551
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13685 PetscAssertPointer(v,5);
552
553
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
13685 if (PetscDefined(USE_COMPLEX) && (m==DS_MAT_T || m==DS_MAT_D)) {
554 2232 const PetscScalar *vs;
555 2232 PetscScalar *as;
556 2232 PetscReal *ar;
557 2232 PetscInt i,n,lda;
558
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.
2232 PetscCall(VecGetSize(*v,&n));
559
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.
2232 PetscCall(MatDenseGetLDA(*A,&lda));
560
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.
2232 PetscCall(MatDenseGetArray(*A,&as));
561
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.
2232 PetscCall(VecGetArrayRead(*v,&vs));
562 2232 ar = (PetscReal*)as;
563
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
36131 for (i=0;i<n;i++) ar[i+col*lda] = PetscRealPart(vs[i]);
564
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.
2232 PetscCall(VecRestoreArrayRead(*v,&vs));
565
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.
2232 PetscCall(MatDenseRestoreArray(*A,&as));
566
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.
2232 PetscCall(VecDestroy(v));
567
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.
11453 } else PetscCall(MatDenseRestoreColumnVec(*A,col,v));
568
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13685 PetscCall(DSRestoreMat(ds,m,A));
569
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.
2719 PetscFunctionReturn(PETSC_SUCCESS);
570 }
571
572 /*@C
573 DSGetArray - Returns a pointer to the internal array of one of the
574 matrices. You MUST call `DSRestoreArray()` when you no longer
575 need to access the array.
576
577 Not Collective
578
579 Input Parameters:
580 + ds - the direct solver context
581 - m - the requested matrix
582
583 Output Parameter:
584 . a - pointer to the values
585
586 Note:
587 To get read-only access, use `DSGetMat()` followed by `MatDenseGetArrayRead()`.
588
589 Level: advanced
590
591 .seealso: [](sec:ds), `DSRestoreArray()`, `DSGetArrayReal()`
592 @*/
593 628856 PetscErrorCode DSGetArray(DS ds,DSMatType m,PetscScalar *a[])
594 {
595
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
628856 PetscFunctionBegin;
596
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.
628856 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
597
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
628856 DSCheckAlloc(ds,1);
598
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
628856 DSCheckValidMat(ds,m,2);
599
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
628856 PetscAssertPointer(a,3);
600
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
628856 PetscCall(MatDenseGetArray(ds->omat[m],a));
601
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.
125816 PetscFunctionReturn(PETSC_SUCCESS);
602 }
603
604 /*@C
605 DSRestoreArray - Restores the matrix after `DSGetArray()` was called.
606
607 Not Collective
608
609 Input Parameters:
610 + ds - the direct solver context
611 . m - the requested matrix
612 - a - pointer to the values
613
614 Level: advanced
615
616 .seealso: [](sec:ds), `DSGetArray()`, `DSGetArrayReal()`
617 @*/
618 627787 PetscErrorCode DSRestoreArray(DS ds,DSMatType m,PetscScalar *a[])
619 {
620
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
627787 PetscFunctionBegin;
621
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.
627787 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
622
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
627787 DSCheckAlloc(ds,1);
623
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
627787 DSCheckValidMat(ds,m,2);
624
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
627787 PetscAssertPointer(a,3);
625
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
627787 PetscCall(MatDenseRestoreArray(ds->omat[m],a));
626
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
627787 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
627
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.
627787 PetscFunctionReturn(PETSC_SUCCESS);
628 }
629
630 /*@C
631 DSGetArrayReal - Returns a real pointer to the internal array of $T$ or $D$.
632 You MUST call `DSRestoreArrayReal()` when you no longer need to access the array.
633
634 Not Collective
635
636 Input Parameters:
637 + ds - the direct solver context
638 - m - the requested matrix
639
640 Output Parameter:
641 . a - pointer to the values
642
643 Note:
644 This function can be used only for `DS_MAT_T` and `DS_MAT_D`. These matrices always
645 store real values, even in complex scalars, that is why the returned pointer is
646 `PetscReal`.
647
648 Level: advanced
649
650 .seealso: [](sec:ds), `DSRestoreArrayReal()`, `DSGetArray()`
651 @*/
652 937262 PetscErrorCode DSGetArrayReal(DS ds,DSMatType m,PetscReal *a[])
653 {
654 #if defined(PETSC_USE_COMPLEX)
655 365493 PetscScalar *as;
656 #endif
657
658
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
937262 PetscFunctionBegin;
659
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.
937262 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
660
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
937262 DSCheckAlloc(ds,1);
661
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
937262 DSCheckValidMatReal(ds,m,2);
662
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
937262 PetscAssertPointer(a,3);
663 #if defined(PETSC_USE_COMPLEX)
664
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.
365493 PetscCall(MatDenseGetArray(ds->omat[m],&as));
665 365493 *a = (PetscReal*)as;
666 #else
667
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.
571769 PetscCall(MatDenseGetArray(ds->omat[m],a));
668 #endif
669
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.
473980 PetscFunctionReturn(PETSC_SUCCESS);
670 }
671
672 /*@C
673 DSRestoreArrayReal - Restores the matrix after `DSGetArrayReal()` was called.
674
675 Not Collective
676
677 Input Parameters:
678 + ds - the direct solver context
679 . m - the requested matrix
680 - a - pointer to the values
681
682 Level: advanced
683
684 .seealso: [](sec:ds), `DSGetArrayReal()`, `DSGetArray()`
685 @*/
686 937256 PetscErrorCode DSRestoreArrayReal(DS ds,DSMatType m,PetscReal *a[])
687 {
688 #if defined(PETSC_USE_COMPLEX)
689 365487 PetscScalar *as;
690 #endif
691
692
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
937256 PetscFunctionBegin;
693
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.
937256 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
694
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
937256 DSCheckAlloc(ds,1);
695
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
937256 DSCheckValidMatReal(ds,m,2);
696
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
937256 PetscAssertPointer(a,3);
697 #if defined(PETSC_USE_COMPLEX)
698
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.
365487 PetscCall(MatDenseRestoreArray(ds->omat[m],&as));
699 365487 *a = NULL;
700 #else
701
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.
571769 PetscCall(MatDenseRestoreArray(ds->omat[m],a));
702 #endif
703
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
937256 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
704
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.
937256 PetscFunctionReturn(PETSC_SUCCESS);
705 }
706
707 /*@
708 DSSolve - Solve the problem.
709
710 Logically Collective
711
712 Input Parameters:
713 + ds - the direct solver context
714 . eigr - array to store the computed eigenvalues (real part)
715 - eigi - array to store the computed eigenvalues (imaginary part)
716
717 Notes:
718 This call brings the dense system to condensed form. No ordering
719 of the eigenvalues is enforced (for this, call `DSSort()` afterwards).
720
721 In some `DS` types, the arguments will hold singular values,
722 instead of eigenvalues. Singular values are always real.
723
724 Level: intermediate
725
726 .seealso: [](sec:ds), `DSSort()`, `DSStateType`
727 @*/
728 221963 PetscErrorCode DSSolve(DS ds,PetscScalar eigr[],PetscScalar eigi[])
729 {
730
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
221963 PetscFunctionBegin;
731
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.
221963 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
732
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
221963 PetscValidType(ds,1);
733
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
221963 DSCheckAlloc(ds,1);
734
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
221963 PetscAssertPointer(eigr,2);
735
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 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.
221963 if (ds->state>=DS_STATE_CONDENSED) PetscFunctionReturn(PETSC_SUCCESS);
736
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
221699 PetscCheck(ds->ops->solve[ds->method],PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"The specified method number does not exist for this DS");
737
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
221699 PetscCall(PetscInfo(ds,"Starting solve with problem sizes: n=%" PetscInt_FMT ", l=%" PetscInt_FMT ", k=%" PetscInt_FMT "\n",ds->n,ds->l,ds->k));
738
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
221699 PetscCall(PetscLogEventBegin(DS_Solve,ds,0,0,0));
739
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
221699 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
740
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
221699 PetscUseTypeMethod(ds,solve[ds->method],eigr,eigi);
741
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
221699 PetscCall(PetscFPTrapPop());
742
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
221699 PetscCall(PetscLogEventEnd(DS_Solve,ds,0,0,0));
743
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
221699 PetscCall(PetscInfo(ds,"State has changed from %s to CONDENSED\n",DSStateTypes[ds->state]));
744 221699 ds->state = DS_STATE_CONDENSED;
745
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
221699 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
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.
221699 PetscFunctionReturn(PETSC_SUCCESS);
747 }
748
749 /*@
750 DSSort - Sort the result of `DSSolve()` according to a given sorting
751 criterion.
752
753 Logically Collective
754
755 Input Parameters:
756 + ds - the direct solver context
757 . rr - (optional) array containing auxiliary values (real part)
758 - ri - (optional) array containing auxiliary values (imaginary part)
759
760 Input/Output Parameters:
761 + eigr - array containing the computed eigenvalues (real part)
762 . eigi - array containing the computed eigenvalues (imaginary part)
763 - k - (optional) number of elements in the leading group
764
765 Notes:
766 This routine sorts the arrays provided in `eigr` and `eigi`, and also
767 sorts the dense system stored inside `ds` (assumed to be in condensed form).
768 The sorting criterion is specified with `DSSetSlepcSC()`.
769
770 If arrays `rr` and `ri` are provided, then a (partial) reordering based on these
771 values rather than on the eigenvalues is performed. In symmetric problems
772 a total order is obtained (parameter `k` is ignored), but otherwise the result
773 is sorted only partially. In this latter case, it is only guaranteed that
774 all the first `k` elements satisfy the comparison with any of the last `n-k`
775 elements. The output value of parameter `k` is the final number of elements in
776 the first set.
777
778 Level: intermediate
779
780 .seealso: [](sec:ds), `DSSolve()`, `DSSetSlepcSC()`, `DSSortWithPermutation()`
781 @*/
782 302568 PetscErrorCode DSSort(DS ds,PetscScalar eigr[],PetscScalar eigi[],PetscScalar rr[],PetscScalar ri[],PetscInt *k)
783 {
784 302568 PetscInt i;
785
786
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
302568 PetscFunctionBegin;
787
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.
302568 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
788
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
302568 PetscValidType(ds,1);
789
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
302568 DSCheckSolved(ds,1);
790
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
302568 PetscAssertPointer(eigr,2);
791
3/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
302568 if (rr) PetscAssertPointer(rr,4);
792
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
302568 PetscCheck(ds->state<DS_STATE_TRUNCATED,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"Cannot sort a truncated DS");
793
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
302568 PetscCheck(ds->sc,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"Must provide a sorting criterion first");
794
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
302568 PetscCheck(!k || rr,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_WRONG,"Argument k can only be used together with rr");
795
796
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4471697 for (i=0;i<ds->n;i++) ds->perm[i] = i; /* initialize to trivial permutation */
797
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
302568 PetscCall(PetscLogEventBegin(DS_Other,ds,0,0,0));
798
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
302568 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
799
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
302568 PetscUseTypeMethod(ds,sort,eigr,eigi,rr,ri,k);
800
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
302568 PetscCall(PetscFPTrapPop());
801
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
302568 PetscCall(PetscLogEventEnd(DS_Other,ds,0,0,0));
802
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
302568 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
803
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
302568 PetscCall(PetscInfo(ds,"Finished sorting\n"));
804
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.
58338 PetscFunctionReturn(PETSC_SUCCESS);
805 }
806
807 /*@
808 DSSortWithPermutation - Reorders the result of `DSSolve()` according to a given
809 permutation.
810
811 Logically Collective
812
813 Input Parameters:
814 + ds - the direct solver context
815 - perm - permutation that indicates the new ordering
816
817 Input/Output Parameters:
818 + eigr - array with the reordered eigenvalues (real part)
819 - eigi - array with the reordered eigenvalues (imaginary part)
820
821 Notes:
822 This routine reorders the arrays provided in `eigr` and `eigi`, and also the dense
823 system stored inside `ds` (assumed to be in condensed form). There is no sorting
824 criterion, as opposed to `DSSort()`. Instead, the new ordering is given in argument
825 `perm`.
826
827 Level: advanced
828
829 .seealso: [](sec:ds), `DSSolve()`, `DSSort()`
830 @*/
831 10 PetscErrorCode DSSortWithPermutation(DS ds,PetscInt perm[],PetscScalar eigr[],PetscScalar eigi[])
832 {
833
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10 PetscFunctionBegin;
834
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.
10 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
835
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 PetscValidType(ds,1);
836
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 DSCheckSolved(ds,1);
837
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
10 PetscAssertPointer(perm,2);
838
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
10 PetscAssertPointer(eigr,3);
839
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 PetscCheck(ds->state<DS_STATE_TRUNCATED,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"Cannot sort a truncated DS");
840
841
4/6
✓ Branch 0 taken 2 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(PetscLogEventBegin(DS_Other,ds,0,0,0));
842
4/6
✓ Branch 0 taken 2 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(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
843
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
10 PetscUseTypeMethod(ds,sortperm,perm,eigr,eigi);
844
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PetscFPTrapPop());
845
4/6
✓ Branch 0 taken 2 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(PetscLogEventEnd(DS_Other,ds,0,0,0));
846
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
10 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
847
4/6
✓ Branch 0 taken 2 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(PetscInfo(ds,"Finished sorting\n"));
848
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2 PetscFunctionReturn(PETSC_SUCCESS);
849 }
850
851 /*@
852 DSSynchronize - Make sure that all processes have the same data, performing
853 communication if necessary.
854
855 Collective
856
857 Input Parameter:
858 . ds - the direct solver context
859
860 Input/Output Parameters:
861 + eigr - (optional) array with the computed eigenvalues (real part)
862 - eigi - (optional) array with the computed eigenvalues (imaginary part)
863
864 Notes:
865 When the `DS` has been created with a communicator with more than one process,
866 the internal data, especially the computed matrices, may diverge in the
867 different processes. This happens when using multithreaded BLAS and may
868 cause numerical issues in some ill-conditioned problems. This function
869 performs the necessary communication among the processes so that the
870 internal data is exactly equal in all of them.
871
872 Depending on the parallel mode as set with `DSSetParallel()`, this function
873 will either do nothing or synchronize the matrices computed by `DSSolve()`
874 and `DSSort()`. The arguments `eigr` and `eigi` are typically those used in the
875 calls to `DSSolve()` and `DSSort()`.
876
877 Level: developer
878
879 .seealso: [](sec:ds), `DSSetParallel()`, `DSSolve()`, `DSSort()`
880 @*/
881 219195 PetscErrorCode DSSynchronize(DS ds,PetscScalar eigr[],PetscScalar eigi[])
882 {
883 219195 PetscMPIInt size;
884
885
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
219195 PetscFunctionBegin;
886
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.
219195 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
887
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
219195 PetscValidType(ds,1);
888
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
219195 DSCheckAlloc(ds,1);
889
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.
219195 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)ds),&size));
890
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
219195 if (size>1 && ds->pmode==DS_PARALLEL_SYNCHRONIZED) {
891
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3464 PetscCall(PetscLogEventBegin(DS_Synchronize,ds,0,0,0));
892
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
3464 PetscUseTypeMethod(ds,synchronize,eigr,eigi);
893
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3464 PetscCall(PetscLogEventEnd(DS_Synchronize,ds,0,0,0));
894
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
3464 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
895
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3464 PetscCall(PetscInfo(ds,"Synchronization completed (%s)\n",DSParallelTypes[ds->pmode]));
896 }
897
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.
42134 PetscFunctionReturn(PETSC_SUCCESS);
898 }
899
900 /*@
901 DSVectors - Compute vectors associated to the dense system such
902 as eigenvectors.
903
904 Logically Collective
905
906 Input Parameters:
907 + ds - the direct solver context
908 - mat - the matrix, used to indicate which vectors are required
909
910 Input/Output Parameter:
911 . j - (optional) index of vector to be computed
912
913 Output Parameter:
914 . rnorm - (optional) computed residual norm
915
916 Notes:
917 Allowed values for mat are `DS_MAT_X`, `DS_MAT_Y`, `DS_MAT_U` and `DS_MAT_V`, to
918 compute right or left eigenvectors, or left or right singular vectors,
919 respectively.
920
921 If `NULL` is passed in argument `j` then all vectors are computed,
922 otherwise `j` indicates which vector must be computed. In real non-symmetric
923 problems, on exit the index `j` will be incremented when a complex conjugate
924 pair is found.
925
926 This function can be invoked after the dense problem has been solved,
927 to get the residual norm estimate of the associated Ritz pair. In that
928 case, the relevant information is returned in `rnorm`.
929
930 For computing eigenvectors, LAPACK's `_trevc` is used so the matrix must
931 be in (quasi-)triangular form, or call `DSSolve()` first.
932
933 Level: intermediate
934
935 .seealso: [](sec:ds), `DSSolve()`
936 @*/
937 473504 PetscErrorCode DSVectors(DS ds,DSMatType mat,PetscInt *j,PetscReal *rnorm)
938 {
939
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
473504 PetscFunctionBegin;
940
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.
473504 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
941
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
473504 PetscValidType(ds,1);
942
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
473504 DSCheckAlloc(ds,1);
943
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.
473504 PetscValidLogicalCollectiveEnum(ds,mat,2);
944
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
473504 PetscCheck(mat<DS_NUM_MAT,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_WRONG,"Invalid matrix");
945
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
473504 PetscCheck(!rnorm || j,PetscObjectComm((PetscObject)ds),PETSC_ERR_ORDER,"Must give a value of j");
946
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.
473504 if (!ds->omat[mat]) PetscCall(DSAllocateMat_Private(ds,mat));
947
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.
473504 if (!j) PetscCall(PetscInfo(ds,"Computing all vectors on %s\n",DSMatName[mat]));
948
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
473504 PetscCall(PetscLogEventBegin(DS_Vectors,ds,0,0,0));
949
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
473504 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
950
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
473504 PetscUseTypeMethod(ds,vectors,mat,j,rnorm);
951
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
473504 PetscCall(PetscFPTrapPop());
952
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
473504 PetscCall(PetscLogEventEnd(DS_Vectors,ds,0,0,0));
953
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
473504 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
954
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.
473504 PetscFunctionReturn(PETSC_SUCCESS);
955 }
956
957 /*@
958 DSUpdateExtraRow - Performs all necessary operations so that the extra
959 row gets up-to-date after a call to `DSSolve()`.
960
961 Logically Collective
962
963 Input Parameter:
964 . ds - the direct solver context
965
966 Level: advanced
967
968 .seealso: [](sec:ds), `DSSolve()`, `DSSetExtraRow()`
969 @*/
970 95152 PetscErrorCode DSUpdateExtraRow(DS ds)
971 {
972
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
95152 PetscFunctionBegin;
973
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.
95152 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
974
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
95152 PetscValidType(ds,1);
975
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
95152 DSCheckAlloc(ds,1);
976
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
95152 PetscCheck(ds->extrarow,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_WRONGSTATE,"Should have called DSSetExtraRow");
977
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
95152 PetscCall(PetscInfo(ds,"Updating extra row\n"));
978
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
95152 PetscCall(PetscLogEventBegin(DS_Other,ds,0,0,0));
979
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
95152 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
980
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
95152 PetscUseTypeMethod(ds,update);
981
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
95152 PetscCall(PetscFPTrapPop());
982
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
95152 PetscCall(PetscLogEventEnd(DS_Other,ds,0,0,0));
983
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.
17767 PetscFunctionReturn(PETSC_SUCCESS);
984 }
985
986 /*@
987 DSCond - Compute the condition number.
988
989 Logically Collective
990
991 Input Parameters:
992 + ds - the direct solver context
993 - cond - the computed condition number
994
995 Notes:
996 In standard eigenvalue problems, returns the $\infty$-norm condition number of the first
997 matrix, computed as $\kappa_\infty(A) = \|A\|_\infty\|A^{-1}\|_\infty$.
998
999 In GSVD problems, returns the maximum of $\kappa_2(A)$ and $\kappa_2(B)$, where $\kappa_2(\cdot)$ is
1000 computed as the ratio of the largest and smallest singular values.
1001
1002 Does not take into account the extra row.
1003
1004 Level: advanced
1005
1006 .seealso: [](sec:ds), `DSSolve()`, `DSSetExtraRow()`
1007 @*/
1008 1972 PetscErrorCode DSCond(DS ds,PetscReal *cond)
1009 {
1010
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1972 PetscFunctionBegin;
1011
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.
1972 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
1012
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1972 PetscValidType(ds,1);
1013
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1972 DSCheckAlloc(ds,1);
1014
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1972 PetscAssertPointer(cond,2);
1015
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1972 PetscCall(PetscLogEventBegin(DS_Other,ds,0,0,0));
1016
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1972 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
1017
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1972 PetscUseTypeMethod(ds,cond,cond);
1018
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1972 PetscCall(PetscFPTrapPop());
1019
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1972 PetscCall(PetscLogEventEnd(DS_Other,ds,0,0,0));
1020
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1972 PetscCall(PetscInfo(ds,"Computed condition number = %g\n",(double)*cond));
1021
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.
366 PetscFunctionReturn(PETSC_SUCCESS);
1022 }
1023
1024 /*@
1025 DSTranslateHarmonic - Computes a translation of the dense system.
1026
1027 Logically Collective
1028
1029 Input Parameters:
1030 + ds - the direct solver context
1031 . tau - the translation amount
1032 . beta - last component of vector $b$
1033 - recover - boolean flag to indicate whether to recover or not
1034
1035 Output Parameters:
1036 + g - the computed vector (optional)
1037 - gamma - scale factor (optional)
1038
1039 Notes:
1040 This function is intended for use in the context of Krylov methods only.
1041 It computes a translation of a Krylov decomposition in order to extract
1042 eigenpair approximations by harmonic Rayleigh-Ritz.
1043 The matrix is updated as $A + gb^*$ where $g = (A-\tau I)^{-*}b$ and
1044 vector $b$ is assumed to be $\beta e_n^*$.
1045
1046 The $\gamma$ factor is defined as $\sqrt{1+g^*g}$ and can be interpreted as
1047 the factor by which the residual of the Krylov decomposition is scaled.
1048
1049 If the `recover` flag is activated, the computed translation undoes the
1050 translation done previously. In that case, parameter `tau` is ignored.
1051
1052 Level: developer
1053
1054 .seealso: [](sec:ds), `DSTranslateRKS()`
1055 @*/
1056 995 PetscErrorCode DSTranslateHarmonic(DS ds,PetscScalar tau,PetscReal beta,PetscBool recover,PetscScalar g[],PetscReal *gamma)
1057 {
1058
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
995 PetscFunctionBegin;
1059
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.
995 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
1060
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
995 PetscValidType(ds,1);
1061
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
995 DSCheckAlloc(ds,1);
1062
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.
995 if (recover) PetscCall(PetscInfo(ds,"Undoing the translation\n"));
1063
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
722 else PetscCall(PetscInfo(ds,"Computing the translation\n"));
1064
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
995 PetscCall(PetscLogEventBegin(DS_Other,ds,0,0,0));
1065
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
995 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
1066
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
995 PetscUseTypeMethod(ds,transharm,tau,beta,recover,g,gamma);
1067
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
995 PetscCall(PetscFPTrapPop());
1068
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
995 PetscCall(PetscLogEventEnd(DS_Other,ds,0,0,0));
1069 995 ds->state = DS_STATE_RAW;
1070
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
995 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
1071
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.
995 PetscFunctionReturn(PETSC_SUCCESS);
1072 }
1073
1074 /*@
1075 DSTranslateRKS - Computes a modification of the dense system corresponding
1076 to an update of the shift in a rational Krylov method.
1077
1078 Logically Collective
1079
1080 Input Parameters:
1081 + ds - the direct solver context
1082 - alpha - the translation amount
1083
1084 Notes:
1085 This function is intended for use in the context of Krylov methods only.
1086 It takes the leading $(k+1,k)$ submatrix of $A$, containing the truncated
1087 Rayleigh quotient of a Krylov-Schur relation computed from a shift
1088 $\sigma_1$ and transforms it to obtain a Krylov relation as if computed
1089 from a different shift $\sigma_2$. The new matrix is computed as
1090 $\alpha^{-1}(I-QR^{-1})$, where $QR=I-\alpha A$ and
1091 $\alpha = \sigma_1-\sigma_2$.
1092
1093 Matrix $Q$ is placed in `DS_MAT_Q` so that it can be used to update the
1094 Krylov basis.
1095
1096 Level: developer
1097
1098 .seealso: [](sec:ds), `DSTranslateHarmonic()`
1099 @*/
1100 124 PetscErrorCode DSTranslateRKS(DS ds,PetscScalar alpha)
1101 {
1102
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
124 PetscFunctionBegin;
1103
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.
124 PetscValidHeaderSpecific(ds,DS_CLASSID,1);
1104
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
124 PetscValidType(ds,1);
1105
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
124 DSCheckAlloc(ds,1);
1106
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
124 PetscCall(PetscInfo(ds,"Translating with alpha=%g\n",(double)PetscRealPart(alpha)));
1107
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
124 PetscCall(DSSetCompact(ds,PETSC_FALSE));
1108
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
124 PetscCall(PetscLogEventBegin(DS_Other,ds,0,0,0));
1109
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
124 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
1110
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
124 PetscUseTypeMethod(ds,transrks,alpha);
1111
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
124 PetscCall(PetscFPTrapPop());
1112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
124 PetscCall(PetscLogEventEnd(DS_Other,ds,0,0,0));
1113 124 ds->state = DS_STATE_RAW;
1114
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
124 PetscCall(PetscObjectStateIncrease((PetscObject)ds));
1115
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.
124 PetscFunctionReturn(PETSC_SUCCESS);
1116 }
1117