GCC Code Coverage Report


Directory: ./
File: src/sys/classes/ds/interface/dsops.c
Date: 2025-11-19 04:19:03
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 364341 PetscErrorCode DSGetLeadingDimension(DS ds,PetscInt *ld)
33 {
34
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
364341 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.
364341 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.
364341 PetscAssertPointer(ld,2);
37 364341 *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.
364341 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 221580 PetscErrorCode DSSetState(DS ds,DSStateType state)
66 {
67
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
221580 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.
221580 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.
221580 PetscValidLogicalCollectiveEnum(ds,state,2);
70
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
221580 switch (state) {
71 221580 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.
221580 if (ds->state!=state) PetscCall(PetscInfo(ds,"State has changed from %s to %s\n",DSStateTypes[ds->state],DSStateTypes[state]));
76 221580 ds->state = state;
77 221580 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.
221580 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 296974 PetscErrorCode DSSetDimensions(DS ds,PetscInt n,PetscInt l,PetscInt k)
133 {
134 296974 PetscInt on,ol,ok;
135 296974 PetscBool issvd;
136
137
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
296974 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.
296974 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.
296974 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.
296974 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.
296974 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.
296974 PetscValidLogicalCollectiveInt(ds,k,4);
143 296974 on = ds->n; ol = ds->l; ok = ds->k;
144
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
296974 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.
295557 } 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.
295557 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.
295557 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.
295557 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 295557 ds->n = n;
151 }
152 296974 ds->t = ds->n; /* truncated length equal to the new dimension */
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
296974 if (l == PETSC_DETERMINE) {
154 4927 ds->l = 0;
155
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
292047 } 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.
292047 PetscCheck(l>=0 && l<=ds->n,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of l. Must be between 0 and n");
157 292047 ds->l = l;
158 }
159
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
296974 if (k == PETSC_DETERMINE) {
160 14431 ds->k = ds->n/2;
161
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
282543 } 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.
282543 PetscCheck(k>=0 || k<=ds->n,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of k. Must be between 0 and n");
163 282543 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.
296974 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.
57283 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 196513 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.
196513 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.
196513 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.
196513 DSCheckAlloc(ds,1);
199
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196513 if (n) *n = ds->n;
200
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196513 if (l) *l = ds->l;
201
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196513 if (k) *k = ds->k;
202
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
196513 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.
196513 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 78940 PetscErrorCode DSTruncate(DS ds,PetscInt n,PetscBool trim)
235 {
236 78940 DSStateType old;
237
238
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
78940 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.
78940 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.
78940 PetscValidType(ds,1);
241
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
78940 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.
78940 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.
78940 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.
78940 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.
78940 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.
78940 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.
78940 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.
78940 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.
78940 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.
149785 PetscCall(PetscInfo(ds,"Decomposition %s to size n=%" PetscInt_FMT "\n",trim?"trimmed":"truncated",ds->n));
251 78940 old = ds->state;
252
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
78940 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.
78940 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.
78940 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.
78940 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 583859 PetscErrorCode DSMatGetSize(DS ds,DSMatType t,PetscInt *m,PetscInt *n)
279 {
280 583859 PetscInt rows,cols;
281
282
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
583859 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.
583859 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.
583859 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.
583859 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.
583859 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.
448252 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.
397675 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.
448252 if (t==DS_MAT_T) cols = PetscDefined(USE_COMPLEX)? 2: 3;
291
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
424857 else if (t==DS_MAT_D) cols = 1;
292 413664 else cols = ds->n;
293 }
294
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
583859 if (m) *m = rows;
295
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
583859 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.
113496 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 583559 PetscErrorCode DSMatIsHermitian(DS ds,DSMatType t,PetscBool *flg)
320 {
321
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
583559 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.
583559 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.
583559 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.
583559 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.
583559 PetscAssertPointer(flg,3);
326 583559 *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.
583559 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.
113436 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 9271 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.
9271 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.
9271 if (val != 0.0) {
341
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2260 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.
11165 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.
5690 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 583559 PetscErrorCode DSGetMat(DS ds,DSMatType m,Mat *A)
420 {
421 583559 PetscInt rows=0,cols=0;
422 583559 PetscBool flg;
423
424
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
113436 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 583559 PetscErrorCode DSRestoreMat(DS ds,DSMatType m,Mat *A)
459 {
460
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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.
583559 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 628830 PetscErrorCode DSGetArray(DS ds,DSMatType m,PetscScalar *a[])
594 {
595
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
628830 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.
628830 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.
628830 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.
628830 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.
628830 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.
628830 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 627761 PetscErrorCode DSRestoreArray(DS ds,DSMatType m,PetscScalar *a[])
619 {
620
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
627761 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.
627761 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.
627761 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.
627761 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.
627761 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.
627761 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.
627761 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.
627761 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 935242 PetscErrorCode DSGetArrayReal(DS ds,DSMatType m,PetscReal *a[])
653 {
654 #if defined(PETSC_USE_COMPLEX)
655 366107 PetscScalar *as;
656 #endif
657
658
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
935242 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.
935242 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.
935242 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.
935242 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.
935242 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.
366107 PetscCall(MatDenseGetArray(ds->omat[m],&as));
665 366107 *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.
569135 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.
474642 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 935236 PetscErrorCode DSRestoreArrayReal(DS ds,DSMatType m,PetscReal *a[])
687 {
688 #if defined(PETSC_USE_COMPLEX)
689 366101 PetscScalar *as;
690 #endif
691
692
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
935236 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.
935236 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.
935236 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.
935236 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.
935236 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.
366101 PetscCall(MatDenseRestoreArray(ds->omat[m],&as));
699 366101 *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.
569135 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.
935236 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.
935236 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 221626 PetscErrorCode DSSolve(DS ds,PetscScalar eigr[],PetscScalar eigi[])
729 {
730
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
221626 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.
221626 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.
221626 PetscValidType(ds,1);
733
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
221626 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.
221626 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.
221626 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.
221362 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.
221362 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.
221362 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.
221362 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.
221362 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.
221362 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.
221362 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.
221362 PetscCall(PetscInfo(ds,"State has changed from %s to CONDENSED\n",DSStateTypes[ds->state]));
744 221362 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.
221362 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.
221362 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 302230 PetscErrorCode DSSort(DS ds,PetscScalar eigr[],PetscScalar eigi[],PetscScalar rr[],PetscScalar ri[],PetscInt *k)
783 {
784 302230 PetscInt i;
785
786
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
302230 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.
302230 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.
302230 PetscValidType(ds,1);
789
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
302230 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.
302230 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.
302230 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.
302230 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.
302230 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.
302230 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.
4467975 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.
302230 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.
302230 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.
302230 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.
302230 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.
302230 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.
302230 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.
302230 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.
58355 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 218858 PetscErrorCode DSSynchronize(DS ds,PetscScalar eigr[],PetscScalar eigi[])
882 {
883 218858 PetscMPIInt size;
884
885
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
218858 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.
218858 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.
218858 PetscValidType(ds,1);
888
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
218858 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.
218858 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.
218858 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.
42151 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 473479 PetscErrorCode DSVectors(DS ds,DSMatType mat,PetscInt *j,PetscReal *rnorm)
938 {
939
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
473479 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.
473479 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.
473479 PetscValidType(ds,1);
942
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
473479 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.
473479 PetscValidLogicalCollectiveEnum(ds,mat,2);
944
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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.
473479 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 94816 PetscErrorCode DSUpdateExtraRow(DS ds)
971 {
972
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
94816 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.
94816 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.
94816 PetscValidType(ds,1);
975
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
94816 DSCheckAlloc(ds,1);
976
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
94816 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.
94816 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.
94816 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.
94816 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.
94816 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.
94816 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.
94816 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.
17784 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