| 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 | #include <slepc/private/slepcimpl.h> /*I "slepcsys.h" I*/ | ||
| 12 | |||
| 13 | /*@ | ||
| 14 | MatCreateBSE - Create a matrix that can be used to define a structured eigenvalue | ||
| 15 | problem of type BSE (Bethe-Salpeter Equation). | ||
| 16 | |||
| 17 | Collective | ||
| 18 | |||
| 19 | Input Parameters: | ||
| 20 | + R - matrix for the diagonal block (resonant) | ||
| 21 | - C - matrix for the off-diagonal block (coupling) | ||
| 22 | |||
| 23 | Output Parameter: | ||
| 24 | . H - the resulting matrix | ||
| 25 | |||
| 26 | Notes: | ||
| 27 | The resulting matrix has the block form $$H = \begin{bmatrix} R & C \\ -C^* & -R^T \end{bmatrix},$$ | ||
| 28 | where $R$ is assumed | ||
| 29 | to be (complex) Hermitian and $C$ complex symmetric. Note that this function does | ||
| 30 | not check these properties, so if the matrices provided by the user do not satisfy | ||
| 31 | them, then the solver will not behave as expected. | ||
| 32 | |||
| 33 | The obtained matrix can be used as an input matrix to `EPS` eigensolvers via | ||
| 34 | `EPSSetOperators()` for the case that the problem type is `EPS_BSE`. Note that the user | ||
| 35 | cannot just build a matrix with the required structure, it must be done via this | ||
| 36 | function. | ||
| 37 | |||
| 38 | In the current implementation, `H` is a `MATNEST` matrix, where `R` and `C` form the top | ||
| 39 | block row, while the bottom block row is composed of matrices of type | ||
| 40 | `MATTRANSPOSEVIRTUAL` and `MATHERMITIANTRANSPOSEVIRTUAL` scaled by -1. | ||
| 41 | |||
| 42 | Level: intermediate | ||
| 43 | |||
| 44 | .seealso: [](sec:structured), `MatCreateNest()`, `EPSSetOperators()`, `EPSSetProblemType()`, `MatCreateHamiltonian()`, `MatCreateLREP()` | ||
| 45 | @*/ | ||
| 46 | 505 | PetscErrorCode MatCreateBSE(Mat R,Mat C,Mat *H) | |
| 47 | { | ||
| 48 | 505 | PetscInt Mr,Mc,Nr,Nc,mr,mc,nr,nc; | |
| 49 | 505 | Mat block[4] = { R, C, NULL, NULL }; | |
| 50 | 505 | SlepcMatStruct mctx; | |
| 51 | |||
| 52 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
505 | PetscFunctionBegin; |
| 53 |
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.
|
505 | PetscValidHeaderSpecific(R,MAT_CLASSID,1); |
| 54 |
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.
|
505 | PetscValidHeaderSpecific(C,MAT_CLASSID,2); |
| 55 |
13/32✓ 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 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.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
505 | PetscCheckSameTypeAndComm(R,1,C,2); |
| 56 |
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.
|
505 | PetscAssertPointer(H,3); |
| 57 | |||
| 58 | /* check sizes */ | ||
| 59 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatGetSize(R,&Mr,&Nr)); |
| 60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatGetLocalSize(R,&mr,&nr)); |
| 61 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatGetSize(C,&Mc,&Nc)); |
| 62 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatGetLocalSize(C,&mc,&nc)); |
| 63 |
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.
|
505 | PetscCheck(Mc==Mr && mc==mr,PetscObjectComm((PetscObject)R),PETSC_ERR_ARG_INCOMP,"Incompatible row dimensions"); |
| 64 |
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.
|
505 | PetscCheck(Nc==Nr && nc==nr,PetscObjectComm((PetscObject)R),PETSC_ERR_ARG_INCOMP,"Incompatible column dimensions"); |
| 65 | |||
| 66 | /* bottom block row */ | ||
| 67 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatCreateHermitianTranspose(C,&block[2])); |
| 68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatScale(block[2],-1.0)); |
| 69 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatCreateTranspose(R,&block[3])); |
| 70 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatScale(block[3],-1.0)); |
| 71 | |||
| 72 | /* create nest matrix and compose context */ | ||
| 73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatCreateNest(PetscObjectComm((PetscObject)R),2,NULL,2,NULL,block,H)); |
| 74 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatDestroy(&block[2])); |
| 75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(MatDestroy(&block[3])); |
| 76 | |||
| 77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(PetscNew(&mctx)); |
| 78 | 505 | mctx->cookie = SLEPC_MAT_STRUCT_BSE; | |
| 79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
505 | PetscCall(PetscObjectContainerCompose((PetscObject)*H,"SlepcMatStruct",mctx,PetscCtxDestroyDefault)); |
| 80 |
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.
|
77 | PetscFunctionReturn(PETSC_SUCCESS); |
| 81 | } | ||
| 82 | |||
| 83 | /*@ | ||
| 84 | MatCreateHamiltonian - Create a matrix that can be used to define a structured | ||
| 85 | eigenvalue problem of Hamiltonian type. | ||
| 86 | |||
| 87 | Collective | ||
| 88 | |||
| 89 | Input Parameters: | ||
| 90 | + A - matrix for the (0,0) block | ||
| 91 | . B - matrix for the (0,1) block, must be real symmetric or complex Hermitian | ||
| 92 | - C - matrix for the (1,0) block, must be real symmetric or complex Hermitian | ||
| 93 | |||
| 94 | Output Parameter: | ||
| 95 | . H - the resulting matrix | ||
| 96 | |||
| 97 | Notes: | ||
| 98 | The resulting matrix has the block form $$H = \begin{bmatrix} A & B \\ C & -A^* \end{bmatrix},$$ | ||
| 99 | where $B$ and $C$ are | ||
| 100 | assumed to be symmetric in the real case or Hermitian in the complex case. Note | ||
| 101 | that this function does not check this property, so if the matrices provided by | ||
| 102 | the user do not satisfy it, then the solver will not behave as expected. | ||
| 103 | |||
| 104 | The obtained matrix can be used as an input matrix to `EPS` eigensolvers via | ||
| 105 | `EPSSetOperators()` for the case that the problem type is `EPS_HAMILT`. Note that the | ||
| 106 | user cannot just build a matrix with the required structure, it must be done via | ||
| 107 | this function. | ||
| 108 | |||
| 109 | In the current implementation, `H` is a `MATNEST` matrix, where the (1,1) block is | ||
| 110 | a matrix of type `MATHERMITIANTRANSPOSEVIRTUAL` obtained from `A` and scaled by -1. | ||
| 111 | |||
| 112 | Level: intermediate | ||
| 113 | |||
| 114 | .seealso: [](sec:structured), `MatCreateNest()`, `EPSSetOperators()`, `EPSSetProblemType()`, `MatCreateBSE()`, `MatCreateLREP()` | ||
| 115 | @*/ | ||
| 116 | 95 | PetscErrorCode MatCreateHamiltonian(Mat A,Mat B,Mat C,Mat *H) | |
| 117 | { | ||
| 118 | 95 | PetscInt Ma,Mb,Mc,Na,Nb,Nc,ma,mb,mc,na,nb,nc; | |
| 119 | 95 | Mat block[4] = { A, B, C, NULL }; | |
| 120 | 95 | SlepcMatStruct mctx; | |
| 121 | |||
| 122 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
95 | PetscFunctionBegin; |
| 123 |
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.
|
95 | PetscValidHeaderSpecific(A,MAT_CLASSID,1); |
| 124 |
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.
|
95 | PetscValidHeaderSpecific(B,MAT_CLASSID,2); |
| 125 |
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.
|
95 | PetscValidHeaderSpecific(C,MAT_CLASSID,3); |
| 126 |
13/32✓ 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 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.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
95 | PetscCheckSameTypeAndComm(A,1,B,2); |
| 127 |
13/32✓ 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 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.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
95 | PetscCheckSameTypeAndComm(A,1,C,3); |
| 128 |
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.
|
95 | PetscAssertPointer(H,4); |
| 129 | |||
| 130 | /* check sizes */ | ||
| 131 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatGetSize(A,&Ma,&Na)); |
| 132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatGetLocalSize(A,&ma,&na)); |
| 133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatGetSize(B,&Mb,&Nb)); |
| 134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatGetLocalSize(B,&mb,&nb)); |
| 135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatGetSize(C,&Mc,&Nc)); |
| 136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatGetLocalSize(C,&mc,&nc)); |
| 137 |
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.
|
95 | PetscCheck(Mb==Ma && mb==ma,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_INCOMP,"Incompatible row dimensions"); |
| 138 |
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.
|
95 | PetscCheck(Nc==Na && nc==na,PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_INCOMP,"Incompatible column dimensions"); |
| 139 | |||
| 140 | /* (1,1) block */ | ||
| 141 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatCreateHermitianTranspose(A,&block[3])); |
| 142 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatScale(block[3],-1.0)); |
| 143 | |||
| 144 | /* create nest matrix and compose context */ | ||
| 145 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatCreateNest(PetscObjectComm((PetscObject)A),2,NULL,2,NULL,block,H)); |
| 146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(MatDestroy(&block[3])); |
| 147 | |||
| 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.
|
95 | PetscCall(PetscNew(&mctx)); |
| 149 | 95 | mctx->cookie = SLEPC_MAT_STRUCT_HAMILT; | |
| 150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
95 | PetscCall(PetscObjectContainerCompose((PetscObject)*H,"SlepcMatStruct",mctx,PetscCtxDestroyDefault)); |
| 151 |
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.
|
19 | PetscFunctionReturn(PETSC_SUCCESS); |
| 152 | } | ||
| 153 | |||
| 154 | /*@ | ||
| 155 | MatCreateLREP - Create a matrix that can be used to define a structured Linear | ||
| 156 | Response eigenvalue problem. | ||
| 157 | |||
| 158 | Collective | ||
| 159 | |||
| 160 | Input Parameters: | ||
| 161 | + AK - matrix for the diagonal block ($A$) or the top block ($K$) | ||
| 162 | . BM - matrix for the off-diagonal block ($B$) or the bottom block ($M$) | ||
| 163 | - red - whether the reduced form should be built | ||
| 164 | |||
| 165 | Output Parameter: | ||
| 166 | . H - the resulting matrix | ||
| 167 | |||
| 168 | Notes: | ||
| 169 | The resulting matrix has the block form $$H = \begin{bmatrix} A & B \\ -B & -A \end{bmatrix},$$ | ||
| 170 | where both $A$ and $B$ are assumed to be real symmetric. An alternative form, | ||
| 171 | called reduced form (`red`=`PETSC_TRUE`) is $$H = \begin{bmatrix} 0 & K \\ M & 0 \end{bmatrix},$$ | ||
| 172 | where both $K$ and $M$ are also assumed to be real symmetric. Note that this function | ||
| 173 | does not check these properties, so if the matrices provided by the user do not | ||
| 174 | satisfy them, then the solver will not behave as expected. | ||
| 175 | |||
| 176 | The reduced form can be obtained from the original formulation by setting $K=A-B$ | ||
| 177 | and $M=A+B$. However, $K$ and $M$ need not have such relation, in which case the | ||
| 178 | computed eigenvalues will be $\pm\lambda_i$, where $\lambda_i^2$ are the eigenvalues | ||
| 179 | of the _product eigenvalue problem_ $KM$ (or $MK$). | ||
| 180 | |||
| 181 | The obtained matrix can be used as an input matrix to `EPS` eigensolvers via | ||
| 182 | `EPSSetOperators()` for the case that the problem type is `EPS_LREP`. Note that the | ||
| 183 | user cannot just build a matrix with the required structure, it must be done via | ||
| 184 | this function. | ||
| 185 | |||
| 186 | In the current implementation, `H` is a `MATNEST` matrix, where `A` and `B` form the | ||
| 187 | top block row, while the bottom block row is composed of shell matrices scaled by -1. | ||
| 188 | Similarly, in the reduced formulation, the `MATNEST` has two zero blocks. | ||
| 189 | |||
| 190 | Internally, the eigensolver will work with the reduced form, and it will carry out | ||
| 191 | the conversion transparently if the first form is provided by the user. | ||
| 192 | |||
| 193 | Level: intermediate | ||
| 194 | |||
| 195 | .seealso: [](sec:structured), `MatCreateNest()`, `EPSSetOperators()`, `EPSSetProblemType()`, `MatCreateBSE()`, `MatCreateHamiltonian()` | ||
| 196 | @*/ | ||
| 197 | 154 | PetscErrorCode MatCreateLREP(Mat AK,Mat BM,PetscBool red,Mat *H) | |
| 198 | { | ||
| 199 | 154 | PetscInt Ma,Mb,Na,Nb,ma,mb,na,nb; | |
| 200 | 154 | SlepcMatStruct mbtx; | |
| 201 | |||
| 202 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
154 | PetscFunctionBegin; |
| 203 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 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.
|
154 | PetscValidHeaderSpecific(AK,MAT_CLASSID,1); |
| 204 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 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.
|
154 | PetscValidHeaderSpecific(BM,MAT_CLASSID,2); |
| 205 |
13/32✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
154 | PetscCheckSameTypeAndComm(AK,1,BM,2); |
| 206 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
154 | PetscValidLogicalCollectiveBool(AK,red,3); |
| 207 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
154 | PetscAssertPointer(H,4); |
| 208 | |||
| 209 | /* check sizes */ | ||
| 210 |
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.
|
154 | PetscCall(MatGetSize(AK,&Ma,&Na)); |
| 211 |
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.
|
154 | PetscCall(MatGetLocalSize(AK,&ma,&na)); |
| 212 |
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.
|
154 | PetscCall(MatGetSize(BM,&Mb,&Nb)); |
| 213 |
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.
|
154 | PetscCall(MatGetLocalSize(BM,&mb,&nb)); |
| 214 |
2/6✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
154 | PetscCheck(Mb==Ma && mb==ma,PetscObjectComm((PetscObject)AK),PETSC_ERR_ARG_INCOMP,"Incompatible row dimensions"); |
| 215 |
2/6✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
154 | PetscCheck(Nb==Na && nb==na,PetscObjectComm((PetscObject)AK),PETSC_ERR_ARG_INCOMP,"Incompatible column dimensions"); |
| 216 | |||
| 217 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
154 | if (red) { /* reduced form */ |
| 218 | |||
| 219 | 77 | Mat block[4] = { NULL, AK, BM, NULL }; | |
| 220 | |||
| 221 | /* create nest matrix */ | ||
| 222 |
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.
|
77 | PetscCall(MatCreateNest(PetscObjectComm((PetscObject)AK),2,NULL,2,NULL,block,H)); |
| 223 | |||
| 224 | } else { /* original LREP form */ | ||
| 225 | |||
| 226 | 77 | Mat block[4] = { AK, BM, NULL, NULL }; | |
| 227 | 77 | const PetscScalar scal[] = { -1.0 }; | |
| 228 | |||
| 229 | /* bottom block row, using MATCOMPOSITE */ | ||
| 230 |
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.
|
77 | PetscCall(MatCreate(PetscObjectComm((PetscObject)AK),&block[2])); |
| 231 |
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.
|
77 | PetscCall(MatSetSizes(block[2],mb,nb,Mb,Nb)); |
| 232 |
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.
|
77 | PetscCall(MatSetType(block[2],MATCOMPOSITE)); |
| 233 |
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.
|
77 | PetscCall(MatCompositeAddMat(block[2],BM)); |
| 234 |
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.
|
77 | PetscCall(MatAssemblyBegin(block[2],MAT_FINAL_ASSEMBLY)); |
| 235 |
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.
|
77 | PetscCall(MatAssemblyEnd(block[2],MAT_FINAL_ASSEMBLY)); |
| 236 |
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.
|
77 | PetscCall(MatCompositeSetScalings(block[2],scal)); |
| 237 | |||
| 238 |
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.
|
77 | PetscCall(MatCreate(PetscObjectComm((PetscObject)AK),&block[3])); |
| 239 |
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.
|
77 | PetscCall(MatSetSizes(block[3],ma,na,Ma,Na)); |
| 240 |
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.
|
77 | PetscCall(MatSetType(block[3],MATCOMPOSITE)); |
| 241 |
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.
|
77 | PetscCall(MatCompositeAddMat(block[3],AK)); |
| 242 |
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.
|
77 | PetscCall(MatAssemblyBegin(block[3],MAT_FINAL_ASSEMBLY)); |
| 243 |
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.
|
77 | PetscCall(MatAssemblyEnd(block[3],MAT_FINAL_ASSEMBLY)); |
| 244 |
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.
|
77 | PetscCall(MatCompositeSetScalings(block[3],scal)); |
| 245 | |||
| 246 | /* create nest matrix */ | ||
| 247 |
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.
|
77 | PetscCall(MatCreateNest(PetscObjectComm((PetscObject)AK),2,NULL,2,NULL,block,H)); |
| 248 |
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.
|
77 | PetscCall(MatDestroy(&block[2])); |
| 249 |
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.
|
77 | PetscCall(MatDestroy(&block[3])); |
| 250 | |||
| 251 | } | ||
| 252 | |||
| 253 | /* compose context */ | ||
| 254 |
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.
|
154 | PetscCall(PetscNew(&mbtx)); |
| 255 | 154 | mbtx->cookie = SLEPC_MAT_STRUCT_LREP; | |
| 256 |
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.
|
154 | PetscCall(PetscObjectContainerCompose((PetscObject)*H,"SlepcMatStruct",mbtx,PetscCtxDestroyDefault)); |
| 257 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
26 | PetscFunctionReturn(PETSC_SUCCESS); |
| 258 | } | ||
| 259 |