| 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 |