| 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 | SLEPc eigensolver: "lyapii" | ||
| 12 | |||
| 13 | Method: Lyapunov inverse iteration | ||
| 14 | |||
| 15 | Algorithm: | ||
| 16 | |||
| 17 | Lyapunov inverse iteration using LME solvers | ||
| 18 | |||
| 19 | References: | ||
| 20 | |||
| 21 | [1] H.C. Elman and M. Wu, "Lyapunov inverse iteration for computing a | ||
| 22 | few rightmost eigenvalues of large generalized eigenvalue problems", | ||
| 23 | SIAM J. Matrix Anal. Appl. 34(4):1685-1707, 2013. | ||
| 24 | |||
| 25 | [2] K. Meerbergen and A. Spence, "Inverse iteration for purely imaginary | ||
| 26 | eigenvalues with application to the detection of Hopf bifurcations in | ||
| 27 | large-scale problems", SIAM J. Matrix Anal. Appl. 31:1982-1999, 2010. | ||
| 28 | */ | ||
| 29 | |||
| 30 | #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/ | ||
| 31 | #include <slepcblaslapack.h> | ||
| 32 | |||
| 33 | typedef struct { | ||
| 34 | LME lme; /* Lyapunov solver */ | ||
| 35 | DS ds; /* used to compute the SVD for compression */ | ||
| 36 | PetscInt rkl; /* prescribed rank for the Lyapunov solver */ | ||
| 37 | PetscInt rkc; /* the compressed rank, cannot be larger than rkl */ | ||
| 38 | } EPS_LYAPII; | ||
| 39 | |||
| 40 | typedef struct { | ||
| 41 | Mat S; /* the operator matrix, S=A^{-1}*B */ | ||
| 42 | BV Q; /* orthogonal basis of converged eigenvectors */ | ||
| 43 | } EPS_LYAPII_MATSHELL; | ||
| 44 | |||
| 45 | typedef struct { | ||
| 46 | Mat S; /* the matrix from which the implicit operator is built */ | ||
| 47 | PetscInt n; /* the size of matrix S, the operator is nxn */ | ||
| 48 | LME lme; /* dummy LME object */ | ||
| 49 | #if PetscDefined(USE_COMPLEX) | ||
| 50 | Mat A,B,F; | ||
| 51 | Vec w; | ||
| 52 | #endif | ||
| 53 | } EPS_EIG_MATSHELL; | ||
| 54 | |||
| 55 | 35 | static PetscErrorCode EPSSetUp_LyapII(EPS eps) | |
| 56 | { | ||
| 57 | 35 | PetscRandom rand; | |
| 58 | 35 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 59 | |||
| 60 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 61 |
6/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
35 | EPSCheckSinvert(eps); |
| 62 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | EPSCheckNotStructured(eps); |
| 63 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35 | if (eps->nev==0) eps->nev = 1; |
| 64 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
35 | if (eps->ncv!=PETSC_DETERMINE) { |
| 65 | ✗ | PetscCheck(eps->ncv>=eps->nev+1,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev+1"); | |
| 66 | 35 | } else eps->ncv = eps->nev+1; | |
| 67 |
1/8✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
35 | if (eps->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: parameter mpd ignored\n")); |
| 68 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
35 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(1000*eps->nev,100*eps->n); |
| 69 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
35 | if (!eps->which) eps->which=EPS_LARGEST_REAL; |
| 70 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
35 | PetscCheck(eps->which==EPS_LARGEST_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only largest real eigenvalues"); |
| 71 |
11/30✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 10 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 10 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 10 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
35 | EPSCheckUnsupported(eps,EPS_FEATURE_BALANCE | EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD | EPS_FEATURE_TWOSIDED); |
| 72 | |||
| 73 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35 | if (!ctx->rkc) ctx->rkc = 10; |
| 74 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35 | if (!ctx->rkl) ctx->rkl = 3*ctx->rkc; |
| 75 |
1/8✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
35 | if (!ctx->lme) PetscCall(EPSLyapIIGetLME(eps,&ctx->lme)); |
| 76 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMESetProblemType(ctx->lme,LME_LYAPUNOV)); |
| 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.
|
35 | PetscCall(LMESetErrorIfNotConverged(ctx->lme,PETSC_TRUE)); |
| 78 | |||
| 79 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
35 | if (!ctx->ds) { |
| 80 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSCreate(PetscObjectComm((PetscObject)eps),&ctx->ds)); |
| 81 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSSetType(ctx->ds,DSSVD)); |
| 82 | } | ||
| 83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSAllocate(ctx->ds,ctx->rkl)); |
| 84 | |||
| 85 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSSetType(eps->ds,DSNHEP)); |
| 86 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSAllocate(eps->ds,eps->ncv)); |
| 87 | |||
| 88 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSAllocateSolution(eps,0)); |
| 89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVGetRandomContext(eps->V,&rand)); /* make sure the random context is available when duplicating */ |
| 90 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSSetWorkVecs(eps,3)); |
| 91 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 92 | } | ||
| 93 | |||
| 94 | 42015 | static PetscErrorCode MatMult_EPSLyapIIOperator(Mat M,Vec x,Vec r) | |
| 95 | { | ||
| 96 | 42015 | EPS_LYAPII_MATSHELL *matctx; | |
| 97 | |||
| 98 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
42015 | PetscFunctionBegin; |
| 99 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42015 | PetscCall(MatShellGetContext(M,&matctx)); |
| 100 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42015 | PetscCall(MatMult(matctx->S,x,r)); |
| 101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
42015 | PetscCall(BVOrthogonalizeVec(matctx->Q,r,NULL,NULL,NULL)); |
| 102 |
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.
|
6655 | PetscFunctionReturn(PETSC_SUCCESS); |
| 103 | } | ||
| 104 | |||
| 105 | 35 | static PetscErrorCode MatDestroy_EPSLyapIIOperator(Mat M) | |
| 106 | { | ||
| 107 | 35 | EPS_LYAPII_MATSHELL *matctx; | |
| 108 | |||
| 109 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 110 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatShellGetContext(M,&matctx)); |
| 111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatDestroy(&matctx->S)); |
| 112 |
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.
|
35 | PetscCall(PetscFree(matctx)); |
| 113 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 114 | } | ||
| 115 | |||
| 116 | 8730 | static PetscErrorCode MatMult_EigOperator(Mat M,Vec x,Vec y) | |
| 117 | { | ||
| 118 | 8730 | EPS_EIG_MATSHELL *matctx; | |
| 119 | #if !PetscDefined(USE_COMPLEX) | ||
| 120 | 5282 | PetscInt n,lds; | |
| 121 | 5282 | PetscScalar *Y,*C,zero=0.0,done=1.0,dtwo=2.0; | |
| 122 | 5282 | const PetscScalar *S,*X; | |
| 123 | 5282 | PetscBLASInt n_,lds_; | |
| 124 | #endif | ||
| 125 | |||
| 126 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8730 | PetscFunctionBegin; |
| 127 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8730 | PetscCall(MatShellGetContext(M,&matctx)); |
| 128 | |||
| 129 | #if PetscDefined(USE_COMPLEX) | ||
| 130 |
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.
|
3448 | PetscCall(MatMult(matctx->B,x,matctx->w)); |
| 131 |
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.
|
3448 | PetscCall(MatSolve(matctx->F,matctx->w,y)); |
| 132 | #else | ||
| 133 |
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.
|
5282 | PetscCall(VecGetArrayRead(x,&X)); |
| 134 |
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.
|
5282 | PetscCall(VecGetArray(y,&Y)); |
| 135 |
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.
|
5282 | PetscCall(MatDenseGetArrayRead(matctx->S,&S)); |
| 136 |
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.
|
5282 | PetscCall(MatDenseGetLDA(matctx->S,&lds)); |
| 137 | |||
| 138 | 5282 | n = matctx->n; | |
| 139 |
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.
|
5282 | PetscCall(PetscCalloc1(n*n,&C)); |
| 140 |
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.
|
5282 | PetscCall(PetscBLASIntCast(n,&n_)); |
| 141 |
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.
|
5282 | PetscCall(PetscBLASIntCast(lds,&lds_)); |
| 142 | |||
| 143 | /* C = 2*S*X*S.' */ | ||
| 144 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
5282 | PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&n_,&n_,&n_,&dtwo,S,&lds_,X,&n_,&zero,Y,&n_)); |
| 145 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
5282 | PetscCallBLAS("BLASgemm",BLASgemm_("N","T",&n_,&n_,&n_,&done,Y,&n_,S,&lds_,&zero,C,&n_)); |
| 146 | |||
| 147 | /* Solve S*Y + Y*S' = -C */ | ||
| 148 |
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.
|
5282 | PetscCall(LMEDenseLyapunov(matctx->lme,n,(PetscScalar*)S,lds,C,n,Y,n)); |
| 149 | |||
| 150 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
5282 | PetscCall(PetscFree(C)); |
| 151 |
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.
|
5282 | PetscCall(VecRestoreArrayRead(x,&X)); |
| 152 |
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.
|
5282 | PetscCall(VecRestoreArray(y,&Y)); |
| 153 |
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.
|
5282 | PetscCall(MatDenseRestoreArrayRead(matctx->S,&S)); |
| 154 | #endif | ||
| 155 |
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.
|
1737 | PetscFunctionReturn(PETSC_SUCCESS); |
| 156 | } | ||
| 157 | |||
| 158 | 64 | static PetscErrorCode MatDestroy_EigOperator(Mat M) | |
| 159 | { | ||
| 160 | 64 | EPS_EIG_MATSHELL *matctx; | |
| 161 | |||
| 162 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
64 | PetscFunctionBegin; |
| 163 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(MatShellGetContext(M,&matctx)); |
| 164 | #if PetscDefined(USE_COMPLEX) | ||
| 165 |
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.
|
15 | PetscCall(MatDestroy(&matctx->A)); |
| 166 |
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.
|
15 | PetscCall(MatDestroy(&matctx->B)); |
| 167 |
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.
|
15 | PetscCall(MatDestroy(&matctx->F)); |
| 168 |
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.
|
15 | PetscCall(VecDestroy(&matctx->w)); |
| 169 | #else | ||
| 170 |
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.
|
49 | PetscCall(MatDestroy(&matctx->S)); |
| 171 | #endif | ||
| 172 |
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.
|
64 | PetscCall(PetscFree(matctx)); |
| 173 |
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.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 174 | } | ||
| 175 | |||
| 176 | /* | ||
| 177 | EV2x2: solve the eigenproblem for a 2x2 matrix M | ||
| 178 | */ | ||
| 179 | 242 | static PetscErrorCode EV2x2(PetscScalar *M,PetscInt ld,PetscScalar *wr,PetscScalar *wi,PetscScalar *vec) | |
| 180 | { | ||
| 181 | 242 | PetscBLASInt lwork=10,ld_; | |
| 182 | 242 | PetscScalar work[10]; | |
| 183 | 242 | PetscBLASInt two=2; | |
| 184 | #if PetscDefined(USE_COMPLEX) | ||
| 185 | 125 | PetscReal rwork[6]; | |
| 186 | #endif | ||
| 187 | |||
| 188 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
242 | PetscFunctionBegin; |
| 189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(PetscBLASIntCast(ld,&ld_)); |
| 190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
| 191 | #if !PetscDefined(USE_COMPLEX) | ||
| 192 |
13/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ 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.
|
117 | PetscCallLAPACKInfo("LAPACKgeev",LAPACKgeev_("N","V",&two,M,&ld_,wr,wi,NULL,&ld_,vec,&ld_,work,&lwork,&info)); |
| 193 | #else | ||
| 194 |
13/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ 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.
|
125 | PetscCallLAPACKInfo("LAPACKgeev",LAPACKgeev_("N","V",&two,M,&ld_,wr,NULL,&ld_,vec,&ld_,work,&lwork,rwork,&info)); |
| 195 | #endif | ||
| 196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(PetscFPTrapPop()); |
| 197 |
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.
|
48 | PetscFunctionReturn(PETSC_SUCCESS); |
| 198 | } | ||
| 199 | |||
| 200 | /* | ||
| 201 | LyapIIBuildRHS: prepare the right-hand side of the Lyapunov equation SY + YS' = -2*S*Z*S' | ||
| 202 | in factored form: | ||
| 203 | if (V) U=sqrt(2)*S*V (uses 1 work vector) | ||
| 204 | else U=sqrt(2)*S*U (uses 2 work vectors) | ||
| 205 | where U,V are assumed to have rk columns. | ||
| 206 | */ | ||
| 207 | 447 | static PetscErrorCode LyapIIBuildRHS(Mat S,PetscInt rk,Mat U,BV V,Vec *work) | |
| 208 | { | ||
| 209 | 447 | PetscScalar *array,*uu; | |
| 210 | 447 | PetscInt i,nloc; | |
| 211 | 447 | Vec v,u=work[0]; | |
| 212 | |||
| 213 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
447 | PetscFunctionBegin; |
| 214 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatGetLocalSize(U,&nloc,NULL)); |
| 215 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1076 | for (i=0;i<rk;i++) { |
| 216 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(MatDenseGetColumn(U,i,&array)); |
| 217 |
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.
|
629 | if (V) PetscCall(BVGetColumn(V,i,&v)); |
| 218 | else { | ||
| 219 | 554 | v = work[1]; | |
| 220 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
554 | PetscCall(VecPlaceArray(v,array)); |
| 221 | } | ||
| 222 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(MatMult(S,v,u)); |
| 223 |
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.
|
629 | if (V) PetscCall(BVRestoreColumn(V,i,&v)); |
| 224 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
554 | else PetscCall(VecResetArray(v)); |
| 225 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(VecScale(u,PETSC_SQRT2)); |
| 226 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(VecGetArray(u,&uu)); |
| 227 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(PetscArraycpy(array,uu,nloc)); |
| 228 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(VecRestoreArray(u,&uu)); |
| 229 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
629 | PetscCall(MatDenseRestoreColumn(U,&array)); |
| 230 | } | ||
| 231 |
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.
|
62 | PetscFunctionReturn(PETSC_SUCCESS); |
| 232 | } | ||
| 233 | |||
| 234 | /* | ||
| 235 | LyapIIBuildEigenMat: create shell matrix Op=A\B with A = kron(I,S)+kron(S,I), B = -2*kron(S,S) | ||
| 236 | where S is a sequential square dense matrix of order n. | ||
| 237 | v0 is the initial vector, should have the form v0 = w*w' (for instance 1*1') | ||
| 238 | */ | ||
| 239 | 447 | static PetscErrorCode LyapIIBuildEigenMat(LME lme,Mat S,Mat *Op,Vec *v0) | |
| 240 | { | ||
| 241 | 447 | PetscInt n,m; | |
| 242 | 447 | PetscBool create=PETSC_FALSE; | |
| 243 | 447 | EPS_EIG_MATSHELL *matctx; | |
| 244 | #if PetscDefined(USE_COMPLEX) | ||
| 245 | 140 | PetscScalar theta,*aa,*bb; | |
| 246 | 140 | const PetscScalar *ss; | |
| 247 | 140 | PetscInt i,j,f,c,off,ld,lds; | |
| 248 | 140 | IS perm; | |
| 249 | #endif | ||
| 250 | |||
| 251 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
447 | PetscFunctionBegin; |
| 252 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatGetSize(S,&n,NULL)); |
| 253 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
447 | if (!*Op) create=PETSC_TRUE; |
| 254 | else { | ||
| 255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
412 | PetscCall(MatGetSize(*Op,&m,NULL)); |
| 256 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
412 | if (m!=n*n) create=PETSC_TRUE; |
| 257 | } | ||
| 258 | 383 | if (create) { | |
| 259 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(MatDestroy(Op)); |
| 260 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(VecDestroy(v0)); |
| 261 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(PetscNew(&matctx)); |
| 262 | #if PetscDefined(USE_COMPLEX) | ||
| 263 |
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.
|
15 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,n*n,n*n,NULL,&matctx->A)); |
| 264 |
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.
|
15 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,n*n,n*n,NULL,&matctx->B)); |
| 265 |
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.
|
15 | PetscCall(MatCreateVecs(matctx->A,NULL,&matctx->w)); |
| 266 | #else | ||
| 267 |
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.
|
49 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,n,n,NULL,&matctx->S)); |
| 268 | #endif | ||
| 269 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(MatCreateShell(PETSC_COMM_SELF,n*n,n*n,PETSC_DETERMINE,PETSC_DETERMINE,matctx,Op)); |
| 270 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(MatShellSetOperation(*Op,MATOP_MULT,(PetscErrorCodeFn*)MatMult_EigOperator)); |
| 271 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(MatShellSetOperation(*Op,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_EigOperator)); |
| 272 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
64 | PetscCall(MatCreateVecs(*Op,NULL,v0)); |
| 273 | } else { | ||
| 274 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
383 | PetscCall(MatShellGetContext(*Op,&matctx)); |
| 275 | #if PetscDefined(USE_COMPLEX) | ||
| 276 |
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.
|
125 | PetscCall(MatZeroEntries(matctx->A)); |
| 277 | #endif | ||
| 278 | } | ||
| 279 | #if PetscDefined(USE_COMPLEX) | ||
| 280 |
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.
|
140 | PetscCall(MatDenseGetArray(matctx->A,&aa)); |
| 281 |
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.
|
140 | PetscCall(MatDenseGetArray(matctx->B,&bb)); |
| 282 |
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.
|
140 | PetscCall(MatDenseGetArrayRead(S,&ss)); |
| 283 |
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.
|
140 | PetscCall(MatDenseGetLDA(S,&lds)); |
| 284 | 140 | ld = n*n; | |
| 285 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
1410 | for (f=0;f<n;f++) { |
| 286 | 1270 | off = f*n+f*n*ld; | |
| 287 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
121210 | for (i=0;i<n;i++) for (j=0;j<n;j++) aa[off+i+j*ld] = ss[i+j*lds]; |
| 288 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
12930 | for (c=0;c<n;c++) { |
| 289 | 11660 | off = f*n+c*n*ld; | |
| 290 | 11660 | theta = ss[f+c*lds]; | |
| 291 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
119940 | for (i=0;i<n;i++) aa[off+i+i*ld] += theta; |
| 292 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
1136180 | for (i=0;i<n;i++) for (j=0;j<n;j++) bb[off+i+j*ld] = -2*theta*ss[i+j*lds]; |
| 293 | } | ||
| 294 | } | ||
| 295 |
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.
|
140 | PetscCall(MatDenseRestoreArray(matctx->A,&aa)); |
| 296 |
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.
|
140 | PetscCall(MatDenseRestoreArray(matctx->B,&bb)); |
| 297 |
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.
|
140 | PetscCall(MatDenseRestoreArrayRead(S,&ss)); |
| 298 |
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.
|
140 | PetscCall(ISCreateStride(PETSC_COMM_SELF,n*n,0,1,&perm)); |
| 299 |
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.
|
140 | PetscCall(MatDestroy(&matctx->F)); |
| 300 |
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.
|
140 | PetscCall(MatDuplicate(matctx->A,MAT_COPY_VALUES,&matctx->F)); |
| 301 |
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.
|
140 | PetscCall(MatLUFactor(matctx->F,perm,perm,NULL)); |
| 302 |
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.
|
140 | PetscCall(ISDestroy(&perm)); |
| 303 | #else | ||
| 304 |
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.
|
307 | PetscCall(MatCopy(S,matctx->S,SAME_NONZERO_PATTERN)); |
| 305 | #endif | ||
| 306 | 447 | matctx->lme = lme; | |
| 307 | 447 | matctx->n = n; | |
| 308 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(VecSet(*v0,1.0)); |
| 309 |
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.
|
62 | PetscFunctionReturn(PETSC_SUCCESS); |
| 310 | } | ||
| 311 | |||
| 312 | 35 | static PetscErrorCode EPSSolve_LyapII(EPS eps) | |
| 313 | { | ||
| 314 | 35 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 315 | 35 | PetscInt i,ldds,rk,nloc,mloc,nv,idx,k; | |
| 316 | 35 | Vec v,w,z=eps->work[0],v0=NULL; | |
| 317 | 35 | Mat S,C,Ux[2],Y,Y1,R,U,W,X,Op=NULL; | |
| 318 | 35 | BV V; | |
| 319 | 35 | BVOrthogType type; | |
| 320 | 35 | BVOrthogRefineType refine; | |
| 321 | 35 | PetscScalar eigr[2],eigi[2],*array,er,ei,*uu,*s,*xx,*aa,pM[4],vec[4]; | |
| 322 | 35 | PetscReal eta; | |
| 323 | 35 | EPS epsrr; | |
| 324 | 35 | PetscReal norm; | |
| 325 | 35 | EPS_LYAPII_MATSHELL *matctx; | |
| 326 | |||
| 327 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 328 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSGetLeadingDimension(ctx->ds,&ldds)); |
| 329 | |||
| 330 | /* Operator for the Lyapunov equation */ | ||
| 331 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscNew(&matctx)); |
| 332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(STGetOperator(eps->st,&matctx->S)); |
| 333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatGetLocalSize(matctx->S,&mloc,&nloc)); |
| 334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatCreateShell(PetscObjectComm((PetscObject)eps),mloc,nloc,PETSC_DETERMINE,PETSC_DETERMINE,matctx,&S)); |
| 335 | 35 | matctx->Q = eps->V; | |
| 336 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatShellSetOperation(S,MATOP_MULT,(PetscErrorCodeFn*)MatMult_EPSLyapIIOperator)); |
| 337 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatShellSetOperation(S,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_EPSLyapIIOperator)); |
| 338 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMESetCoefficients(ctx->lme,S,NULL,NULL,NULL)); |
| 339 | |||
| 340 | /* Right-hand side */ | ||
| 341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVDuplicateResize(eps->V,ctx->rkl,&V)); |
| 342 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVGetOrthogonalization(V,&type,&refine,&eta,NULL)); |
| 343 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVSetOrthogonalization(V,type,refine,eta,BV_ORTHOG_BLOCK_TSQR)); |
| 344 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatCreateDense(PetscObjectComm((PetscObject)eps),eps->nloc,PETSC_DECIDE,PETSC_DECIDE,1,NULL,&Ux[0])); |
| 345 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatCreateDense(PetscObjectComm((PetscObject)eps),eps->nloc,PETSC_DECIDE,PETSC_DECIDE,2,NULL,&Ux[1])); |
| 346 | 35 | nv = ctx->rkl; | |
| 347 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscMalloc1(nv,&s)); |
| 348 | |||
| 349 | /* Initialize first column */ | ||
| 350 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSGetStartVector(eps,0,NULL)); |
| 351 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVGetColumn(eps->V,0,&v)); |
| 352 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVInsertVec(V,0,v)); |
| 353 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVRestoreColumn(eps->V,0,&v)); |
| 354 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVSetActiveColumns(eps->V,0,0)); /* no deflation at the beginning */ |
| 355 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LyapIIBuildRHS(S,1,Ux[0],V,eps->work)); |
| 356 | 35 | idx = 0; | |
| 357 | |||
| 358 | /* EPS for rank reduction */ | ||
| 359 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSCreate(PETSC_COMM_SELF,&epsrr)); |
| 360 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSSetOptionsPrefix(epsrr,((PetscObject)eps)->prefix)); |
| 361 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSAppendOptionsPrefix(epsrr,"eps_lyapii_")); |
| 362 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSSetDimensions(epsrr,1,PETSC_CURRENT,PETSC_CURRENT)); |
| 363 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSSetTolerances(epsrr,PETSC_MACHINE_EPSILON*100,PETSC_CURRENT)); |
| 364 | |||
| 365 | 482 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
| 366 | 447 | eps->its++; | |
| 367 | |||
| 368 | /* Matrix for placing the solution of the Lyapunov equation (an alias of V) */ | ||
| 369 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVSetActiveColumns(V,0,nv)); |
| 370 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVGetMat(V,&Y1)); |
| 371 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatZeroEntries(Y1)); |
| 372 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatCreateLRC(NULL,Y1,NULL,NULL,&Y)); |
| 373 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(LMESetSolution(ctx->lme,Y)); |
| 374 | |||
| 375 | /* Solve the Lyapunov equation SY + YS' = -2*S*Z*S' */ | ||
| 376 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatCreateLRC(NULL,Ux[idx],NULL,NULL,&C)); |
| 377 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(LMESetRHS(ctx->lme,C)); |
| 378 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatDestroy(&C)); |
| 379 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(LMESolve(ctx->lme)); |
| 380 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVRestoreMat(V,&Y1)); |
| 381 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatDestroy(&Y)); |
| 382 | |||
| 383 | /* SVD of the solution: [Q,R]=qr(V); [U,Sigma,~]=svd(R) */ | ||
| 384 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSetDimensions(ctx->ds,nv,0,0)); |
| 385 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSVDSetDimensions(ctx->ds,nv)); |
| 386 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSGetMat(ctx->ds,DS_MAT_A,&R)); |
| 387 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVOrthogonalize(V,R)); |
| 388 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSRestoreMat(ctx->ds,DS_MAT_A,&R)); |
| 389 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSetState(ctx->ds,DS_STATE_RAW)); |
| 390 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSolve(ctx->ds,s,NULL)); |
| 391 | |||
| 392 | /* Determine rank */ | ||
| 393 | 6040 | rk = nv; | |
| 394 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
6040 | for (i=1;i<nv;i++) if (PetscAbsScalar(s[i]/s[0])<PETSC_SQRT_MACHINE_EPSILON) {rk=i; break;} |
| 395 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(PetscInfo(eps,"The computed solution of the Lyapunov equation has rank %" PetscInt_FMT "\n",rk)); |
| 396 | 447 | rk = PetscMin(rk,ctx->rkc); | |
| 397 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSGetMat(ctx->ds,DS_MAT_U,&U)); |
| 398 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVMultInPlace(V,U,0,rk)); |
| 399 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSRestoreMat(ctx->ds,DS_MAT_U,&U)); |
| 400 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVSetActiveColumns(V,0,rk)); |
| 401 | |||
| 402 | /* Rank reduction */ | ||
| 403 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSetDimensions(ctx->ds,rk,0,0)); |
| 404 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSVDSetDimensions(ctx->ds,rk)); |
| 405 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSGetMat(ctx->ds,DS_MAT_A,&W)); |
| 406 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVMatProject(V,S,V,W)); |
| 407 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(LyapIIBuildEigenMat(ctx->lme,W,&Op,&v0)); /* Op=A\B, A=kron(I,S)+kron(S,I), B=-2*kron(S,S) */ |
| 408 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSRestoreMat(ctx->ds,DS_MAT_A,&W)); |
| 409 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(EPSSetOperators(epsrr,Op,NULL)); |
| 410 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(EPSSetInitialSpace(epsrr,1,&v0)); |
| 411 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(EPSSolve(epsrr)); |
| 412 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(EPSComputeVectors(epsrr)); |
| 413 | /* Copy first eigenvector, vec(A)=x */ | ||
| 414 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVGetArray(epsrr->V,&xx)); |
| 415 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSGetArray(ctx->ds,DS_MAT_A,&aa)); |
| 416 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
3404 | for (i=0;i<rk;i++) PetscCall(PetscArraycpy(aa+i*ldds,xx+i*rk,rk)); |
| 417 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSRestoreArray(ctx->ds,DS_MAT_A,&aa)); |
| 418 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVRestoreArray(epsrr->V,&xx)); |
| 419 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSetState(ctx->ds,DS_STATE_RAW)); |
| 420 | /* Compute [U,Sigma,~] = svd(A), its rank should be 1 or 2 */ | ||
| 421 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSSolve(ctx->ds,s,NULL)); |
| 422 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
447 | if (PetscAbsScalar(s[1]/s[0])<PETSC_SQRT_MACHINE_EPSILON) rk=1; |
| 423 | 242 | else rk = 2; | |
| 424 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(PetscInfo(eps,"The eigenvector has rank %" PetscInt_FMT "\n",rk)); |
| 425 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSGetMat(ctx->ds,DS_MAT_U,&U)); |
| 426 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVMultInPlace(V,U,0,rk)); |
| 427 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(DSRestoreMat(ctx->ds,DS_MAT_U,&U)); |
| 428 | |||
| 429 | /* Save V in Ux */ | ||
| 430 | 447 | idx = (rk==2)?1:0; | |
| 431 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1136 | for (i=0;i<rk;i++) { |
| 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.
|
689 | PetscCall(BVGetColumn(V,i,&v)); |
| 433 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
689 | PetscCall(VecGetArray(v,&uu)); |
| 434 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
689 | PetscCall(MatDenseGetColumn(Ux[idx],i,&array)); |
| 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.
|
689 | PetscCall(PetscArraycpy(array,uu,eps->nloc)); |
| 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.
|
689 | PetscCall(MatDenseRestoreColumn(Ux[idx],&array)); |
| 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.
|
689 | PetscCall(VecRestoreArray(v,&uu)); |
| 438 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
689 | PetscCall(BVRestoreColumn(V,i,&v)); |
| 439 | } | ||
| 440 | |||
| 441 | /* Eigenpair approximation */ | ||
| 442 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVGetColumn(V,0,&v)); |
| 443 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(MatMult(S,v,z)); |
| 444 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(VecDot(z,v,pM)); |
| 445 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVRestoreColumn(V,0,&v)); |
| 446 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
447 | if (rk>1) { |
| 447 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(BVGetColumn(V,1,&w)); |
| 448 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(VecDot(z,w,pM+1)); |
| 449 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(MatMult(S,w,z)); |
| 450 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(VecDot(z,w,pM+3)); |
| 451 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(BVGetColumn(V,0,&v)); |
| 452 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(VecDot(z,v,pM+2)); |
| 453 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(BVRestoreColumn(V,0,&v)); |
| 454 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(BVRestoreColumn(V,1,&w)); |
| 455 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(EV2x2(pM,2,eigr,eigi,vec)); |
| 456 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,2,2,vec,&X)); |
| 457 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(BVSetActiveColumns(V,0,rk)); |
| 458 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(BVMultInPlace(V,X,0,rk)); |
| 459 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
242 | PetscCall(MatDestroy(&X)); |
| 460 | #if !PetscDefined(USE_COMPLEX) | ||
| 461 | 117 | norm = eigr[0]*eigr[0]+eigi[0]*eigi[0]; | |
| 462 | 117 | er = eigr[0]/norm; ei = -eigi[0]/norm; | |
| 463 | #else | ||
| 464 | 125 | er =1.0/eigr[0]; ei = 0.0; | |
| 465 | #endif | ||
| 466 | } else { | ||
| 467 | 205 | eigr[0] = pM[0]; eigi[0] = 0.0; | |
| 468 | 205 | er = 1.0/eigr[0]; ei = 0.0; | |
| 469 | } | ||
| 470 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVGetColumn(V,0,&v)); |
| 471 |
6/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
447 | if (eigi[0]!=0.0) PetscCall(BVGetColumn(V,1,&w)); |
| 472 | 305 | else w = NULL; | |
| 473 | 447 | eps->eigr[eps->nconv] = eigr[0]; eps->eigi[eps->nconv] = eigi[0]; | |
| 474 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,er,ei,v,w,eps->work,&norm)); |
| 475 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall(BVRestoreColumn(V,0,&v)); |
| 476 |
6/8✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
447 | if (w) PetscCall(BVRestoreColumn(V,1,&w)); |
| 477 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall((*eps->converged)(eps,er,ei,norm,&eps->errest[eps->nconv],eps->convergedctx)); |
| 478 | 447 | k = 0; | |
| 479 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
447 | if (eps->errest[eps->nconv]<eps->tol) { |
| 480 | 75 | k++; | |
| 481 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
75 | if (rk==2) { |
| 482 | #if !PetscDefined(USE_COMPLEX) | ||
| 483 | 30 | eps->eigr[eps->nconv+k] = eigr[0]; eps->eigi[eps->nconv+k] = -eigi[0]; | |
| 484 | #else | ||
| 485 | 30 | eps->eigr[eps->nconv+k] = PetscConj(eps->eigr[eps->nconv]); | |
| 486 | #endif | ||
| 487 | 60 | k++; | |
| 488 | } | ||
| 489 | /* Store converged eigenpairs and vectors for deflation */ | ||
| 490 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
210 | for (i=0;i<k;i++) { |
| 491 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
135 | PetscCall(BVGetColumn(V,i,&v)); |
| 492 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
135 | PetscCall(BVInsertVec(eps->V,eps->nconv+i,v)); |
| 493 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
135 | PetscCall(BVRestoreColumn(V,i,&v)); |
| 494 | } | ||
| 495 | 75 | eps->nconv += k; | |
| 496 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv-rk,eps->nconv)); |
| 497 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75 | PetscCall(BVOrthogonalize(eps->V,NULL)); |
| 498 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75 | PetscCall(DSSetDimensions(eps->ds,eps->nconv,0,0)); |
| 499 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&W)); |
| 500 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75 | PetscCall(BVMatProject(eps->V,matctx->S,eps->V,W)); |
| 501 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
75 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&W)); |
| 502 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
75 | if (eps->nconv<eps->nev) { |
| 503 | 40 | idx = 0; | |
| 504 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(BVSetRandomColumn(V,0)); |
| 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.
|
40 | PetscCall(BVNormColumn(V,0,NORM_2,&norm)); |
| 506 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(BVScaleColumn(V,0,1.0/norm)); |
| 507 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(LyapIIBuildRHS(S,1,Ux[idx],V,eps->work)); |
| 508 | } | ||
| 509 | } else { | ||
| 510 | /* Prepare right-hand side */ | ||
| 511 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
372 | PetscCall(LyapIIBuildRHS(S,rk,Ux[idx],NULL,eps->work)); |
| 512 | } | ||
| 513 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
447 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx)); |
| 514 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
482 | PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,eps->nconv+1)); |
| 515 | } | ||
| 516 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(STRestoreOperator(eps->st,&matctx->S)); |
| 517 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatDestroy(&S)); |
| 518 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatDestroy(&Ux[0])); |
| 519 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatDestroy(&Ux[1])); |
| 520 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(MatDestroy(&Op)); |
| 521 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(VecDestroy(&v0)); |
| 522 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(BVDestroy(&V)); |
| 523 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(EPSDestroy(&epsrr)); |
| 524 |
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.
|
35 | PetscCall(PetscFree(s)); |
| 525 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 526 | } | ||
| 527 | |||
| 528 | 35 | static PetscErrorCode EPSSetFromOptions_LyapII(EPS eps,PetscOptionItems PetscOptionsObject) | |
| 529 | { | ||
| 530 | 35 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 531 | 35 | PetscInt k,array[2]={PETSC_DETERMINE,PETSC_DETERMINE}; | |
| 532 | 35 | PetscBool flg; | |
| 533 | |||
| 534 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 535 |
1/12✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
35 | PetscOptionsHeadBegin(PetscOptionsObject,"EPS Lyapunov Inverse Iteration Options"); |
| 536 | |||
| 537 | 35 | k = 2; | |
| 538 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscOptionsIntArray("-eps_lyapii_ranks","Ranks for Lyapunov equation (one or two comma-separated integers)","EPSLyapIISetRanks",array,&k,&flg)); |
| 539 |
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.
|
35 | if (flg) PetscCall(EPSLyapIISetRanks(eps,array[0],array[1])); |
| 540 | |||
| 541 |
2/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
35 | PetscOptionsHeadEnd(); |
| 542 | |||
| 543 |
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.
|
35 | if (!ctx->lme) PetscCall(EPSLyapIIGetLME(eps,&ctx->lme)); |
| 544 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMESetFromOptions(ctx->lme)); |
| 545 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 546 | } | ||
| 547 | |||
| 548 | 10 | static PetscErrorCode EPSLyapIISetRanks_LyapII(EPS eps,PetscInt rkc,PetscInt rkl) | |
| 549 | { | ||
| 550 | 10 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 551 | |||
| 552 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 553 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (rkc==PETSC_DETERMINE) { |
| 554 | ✗ | if (ctx->rkc != 10) eps->state = EPS_STATE_INITIAL; | |
| 555 | ✗ | ctx->rkc = 10; | |
| 556 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | } else if (rkc!=PETSC_CURRENT) { |
| 557 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10 | PetscCheck(rkc>1,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The compressed rank %" PetscInt_FMT " must be larger than 1",rkc); |
| 558 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (ctx->rkc != rkc) eps->state = EPS_STATE_INITIAL; |
| 559 | 10 | ctx->rkc = rkc; | |
| 560 | } | ||
| 561 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (rkl==PETSC_DETERMINE) { |
| 562 | ✗ | if (ctx->rkl != 3*rkc) eps->state = EPS_STATE_INITIAL; | |
| 563 | ✗ | ctx->rkl = 3*rkc; | |
| 564 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | } else if (rkl!=PETSC_CURRENT) { |
| 565 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10 | PetscCheck(rkl>=rkc,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The Lyapunov rank %" PetscInt_FMT " cannot be smaller than the compressed rank %" PetscInt_FMT,rkl,rkc); |
| 566 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (ctx->rkl != rkl) eps->state = EPS_STATE_INITIAL; |
| 567 | 10 | ctx->rkl = rkl; | |
| 568 | } | ||
| 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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 570 | } | ||
| 571 | |||
| 572 | /*@ | ||
| 573 | EPSLyapIISetRanks - Set the ranks used in the solution of the Lyapunov equation. | ||
| 574 | |||
| 575 | Logically Collective | ||
| 576 | |||
| 577 | Input Parameters: | ||
| 578 | + eps - the linear eigensolver context | ||
| 579 | . rkc - the compressed rank | ||
| 580 | - rkl - the Lyapunov rank | ||
| 581 | |||
| 582 | Options Database Key: | ||
| 583 | . -eps_lyapii_ranks rkc,rkl - sets the rank parameters | ||
| 584 | |||
| 585 | Notes: | ||
| 586 | `PETSC_CURRENT` can be used to preserve the current value of any of the | ||
| 587 | arguments, and `PETSC_DETERMINE` to set them to a default value. | ||
| 588 | |||
| 589 | Lyapunov inverse iteration needs to solve a large-scale Lyapunov equation | ||
| 590 | at each iteration of the eigensolver. For this, an iterative solver (`LME`) | ||
| 591 | is used, which requires to prescribe the rank of the solution matrix $X$. This | ||
| 592 | is the meaning of parameter `rkl`. Later, this matrix is compressed into | ||
| 593 | another matrix of rank `rkc`. If not provided, `rkl` is a small multiple of `rkc`. | ||
| 594 | |||
| 595 | Level: intermediate | ||
| 596 | |||
| 597 | .seealso: [](ch:eps), `EPSLYAPII`, `EPSLyapIIGetRanks()` | ||
| 598 | @*/ | ||
| 599 | 10 | PetscErrorCode EPSLyapIISetRanks(EPS eps,PetscInt rkc,PetscInt rkl) | |
| 600 | { | ||
| 601 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 602 |
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(eps,EPS_CLASSID,1); |
| 603 |
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.
|
10 | PetscValidLogicalCollectiveInt(eps,rkc,2); |
| 604 |
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.
|
10 | PetscValidLogicalCollectiveInt(eps,rkl,3); |
| 605 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
10 | PetscTryMethod(eps,"EPSLyapIISetRanks_C",(EPS,PetscInt,PetscInt),(eps,rkc,rkl)); |
| 606 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 607 | } | ||
| 608 | |||
| 609 | 10 | static PetscErrorCode EPSLyapIIGetRanks_LyapII(EPS eps,PetscInt *rkc,PetscInt *rkl) | |
| 610 | { | ||
| 611 | 10 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 612 | |||
| 613 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 614 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (rkc) *rkc = ctx->rkc; |
| 615 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (rkl) *rkl = ctx->rkl; |
| 616 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 617 | } | ||
| 618 | |||
| 619 | /*@ | ||
| 620 | EPSLyapIIGetRanks - Return the rank values used for the Lyapunov step. | ||
| 621 | |||
| 622 | Not Collective | ||
| 623 | |||
| 624 | Input Parameter: | ||
| 625 | . eps - the linear eigensolver context | ||
| 626 | |||
| 627 | Output Parameters: | ||
| 628 | + rkc - the compressed rank | ||
| 629 | - rkl - the Lyapunov rank | ||
| 630 | |||
| 631 | Level: intermediate | ||
| 632 | |||
| 633 | .seealso: [](ch:eps), `EPSLYAPII`, `EPSLyapIISetRanks()` | ||
| 634 | @*/ | ||
| 635 | 10 | PetscErrorCode EPSLyapIIGetRanks(EPS eps,PetscInt *rkc,PetscInt *rkl) | |
| 636 | { | ||
| 637 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 638 |
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(eps,EPS_CLASSID,1); |
| 639 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
10 | PetscUseMethod(eps,"EPSLyapIIGetRanks_C",(EPS,PetscInt*,PetscInt*),(eps,rkc,rkl)); |
| 640 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 641 | } | ||
| 642 | |||
| 643 | ✗ | static PetscErrorCode EPSLyapIISetLME_LyapII(EPS eps,LME lme) | |
| 644 | { | ||
| 645 | ✗ | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 646 | |||
| 647 | ✗ | PetscFunctionBegin; | |
| 648 | ✗ | PetscCall(PetscObjectReference((PetscObject)lme)); | |
| 649 | ✗ | PetscCall(LMEDestroy(&ctx->lme)); | |
| 650 | ✗ | ctx->lme = lme; | |
| 651 | ✗ | eps->state = EPS_STATE_INITIAL; | |
| 652 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 653 | } | ||
| 654 | |||
| 655 | /*@ | ||
| 656 | EPSLyapIISetLME - Associate a linear matrix equation solver object (`LME`) to the | ||
| 657 | eigenvalue solver. | ||
| 658 | |||
| 659 | Collective | ||
| 660 | |||
| 661 | Input Parameters: | ||
| 662 | + eps - the linear eigensolver context | ||
| 663 | - lme - the linear matrix equation solver context | ||
| 664 | |||
| 665 | Level: advanced | ||
| 666 | |||
| 667 | .seealso: [](ch:eps), `EPSLYAPII`, `EPSLyapIIGetLME()` | ||
| 668 | @*/ | ||
| 669 | ✗ | PetscErrorCode EPSLyapIISetLME(EPS eps,LME lme) | |
| 670 | { | ||
| 671 | ✗ | PetscFunctionBegin; | |
| 672 | ✗ | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); | |
| 673 | ✗ | PetscValidHeaderSpecific(lme,LME_CLASSID,2); | |
| 674 | ✗ | PetscCheckSameComm(eps,1,lme,2); | |
| 675 | ✗ | PetscTryMethod(eps,"EPSLyapIISetLME_C",(EPS,LME),(eps,lme)); | |
| 676 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 677 | } | ||
| 678 | |||
| 679 | 35 | static PetscErrorCode EPSLyapIIGetLME_LyapII(EPS eps,LME *lme) | |
| 680 | { | ||
| 681 | 35 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 682 | |||
| 683 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 684 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
35 | if (!ctx->lme) { |
| 685 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMECreate(PetscObjectComm((PetscObject)eps),&ctx->lme)); |
| 686 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMESetOptionsPrefix(ctx->lme,((PetscObject)eps)->prefix)); |
| 687 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMEAppendOptionsPrefix(ctx->lme,"eps_lyapii_")); |
| 688 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)ctx->lme,(PetscObject)eps,1)); |
| 689 | } | ||
| 690 | 35 | *lme = ctx->lme; | |
| 691 |
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.
|
35 | PetscFunctionReturn(PETSC_SUCCESS); |
| 692 | } | ||
| 693 | |||
| 694 | /*@ | ||
| 695 | EPSLyapIIGetLME - Retrieve the linear matrix equation solver object (`LME`) | ||
| 696 | associated with the eigenvalue solver. | ||
| 697 | |||
| 698 | Not Collective | ||
| 699 | |||
| 700 | Input Parameter: | ||
| 701 | . eps - the linear eigensolver context | ||
| 702 | |||
| 703 | Output Parameter: | ||
| 704 | . lme - the linear matrix equation solver context | ||
| 705 | |||
| 706 | Level: advanced | ||
| 707 | |||
| 708 | .seealso: [](ch:eps), `EPSLYAPII`, `EPSLyapIISetLME()` | ||
| 709 | @*/ | ||
| 710 | 35 | PetscErrorCode EPSLyapIIGetLME(EPS eps,LME *lme) | |
| 711 | { | ||
| 712 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 713 |
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.
|
35 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 714 |
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.
|
35 | PetscAssertPointer(lme,2); |
| 715 |
9/16✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
35 | PetscUseMethod(eps,"EPSLyapIIGetLME_C",(EPS,LME*),(eps,lme)); |
| 716 |
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.
|
35 | PetscFunctionReturn(PETSC_SUCCESS); |
| 717 | } | ||
| 718 | |||
| 719 | 10 | static PetscErrorCode EPSView_LyapII(EPS eps,PetscViewer viewer) | |
| 720 | { | ||
| 721 | 10 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 722 | 10 | PetscBool isascii; | |
| 723 | |||
| 724 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 725 |
4/6✓ Branch 0 taken 2 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(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 726 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (isascii) { |
| 727 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscViewerASCIIPrintf(viewer," ranks: for Lyapunov solver=%" PetscInt_FMT ", after compression=%" PetscInt_FMT "\n",ctx->rkl,ctx->rkc)); |
| 728 |
1/8✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
10 | if (!ctx->lme) PetscCall(EPSLyapIIGetLME(eps,&ctx->lme)); |
| 729 |
4/6✓ Branch 0 taken 2 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(PetscViewerASCIIPushTab(viewer)); |
| 730 |
4/6✓ Branch 0 taken 2 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(LMEView(ctx->lme,viewer)); |
| 731 |
4/6✓ Branch 0 taken 2 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(PetscViewerASCIIPopTab(viewer)); |
| 732 | } | ||
| 733 |
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); |
| 734 | } | ||
| 735 | |||
| 736 | 35 | static PetscErrorCode EPSReset_LyapII(EPS eps) | |
| 737 | { | ||
| 738 | 35 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 739 | |||
| 740 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 741 |
1/8✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
35 | if (!ctx->lme) PetscCall(LMEReset(ctx->lme)); |
| 742 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 743 | } | ||
| 744 | |||
| 745 | 35 | static PetscErrorCode EPSDestroy_LyapII(EPS eps) | |
| 746 | { | ||
| 747 | 35 | EPS_LYAPII *ctx = (EPS_LYAPII*)eps->data; | |
| 748 | |||
| 749 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 750 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(LMEDestroy(&ctx->lme)); |
| 751 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(DSDestroy(&ctx->ds)); |
| 752 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
35 | PetscCall(PetscFree(eps->data)); |
| 753 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIISetLME_C",NULL)); |
| 754 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIIGetLME_C",NULL)); |
| 755 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIISetRanks_C",NULL)); |
| 756 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIIGetRanks_C",NULL)); |
| 757 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 758 | } | ||
| 759 | |||
| 760 | 70 | static PetscErrorCode EPSSetDefaultST_LyapII(EPS eps) | |
| 761 | { | ||
| 762 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
70 | PetscFunctionBegin; |
| 763 |
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.
|
70 | if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STSINVERT)); |
| 764 |
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.
|
14 | PetscFunctionReturn(PETSC_SUCCESS); |
| 765 | } | ||
| 766 | |||
| 767 | /*MC | ||
| 768 | EPSLYAPII - EPSLYAPII = "lyapii" - The Lyapunov inverse iteration. | ||
| 769 | |||
| 770 | Notes: | ||
| 771 | This solver implements the method of Lyapunov inverse iteration | ||
| 772 | {cite:p}`Mee10,Elm13` to compute rightmost eigenvalues of | ||
| 773 | non-Hermitian matrices (or matrix pencils). | ||
| 774 | |||
| 775 | At each step of the eigensolver, a Lyapunov equation must be solved, | ||
| 776 | and this is done with an `LME` object, see `EPSLyapIIGetLME()`. | ||
| 777 | |||
| 778 | This solver may be useful for analyzing the stability of PDE's. | ||
| 779 | Note that the method requires the input matrix to be stable, so | ||
| 780 | it generally requires to shift the matrix before passing it in | ||
| 781 | `EPSSetOperators()`. | ||
| 782 | |||
| 783 | Level: beginner | ||
| 784 | |||
| 785 | .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()`, `EPSLyapIIGetLME()`, `EPSSetOperators()` | ||
| 786 | M*/ | ||
| 787 | 35 | SLEPC_EXTERN PetscErrorCode EPSCreate_LyapII(EPS eps) | |
| 788 | { | ||
| 789 | 35 | EPS_LYAPII *ctx; | |
| 790 | |||
| 791 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
35 | PetscFunctionBegin; |
| 792 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscNew(&ctx)); |
| 793 | 35 | eps->data = (void*)ctx; | |
| 794 | |||
| 795 | 35 | eps->useds = PETSC_TRUE; | |
| 796 | |||
| 797 | 35 | eps->ops->solve = EPSSolve_LyapII; | |
| 798 | 35 | eps->ops->setup = EPSSetUp_LyapII; | |
| 799 | 35 | eps->ops->setupsort = EPSSetUpSort_Default; | |
| 800 | 35 | eps->ops->setfromoptions = EPSSetFromOptions_LyapII; | |
| 801 | 35 | eps->ops->reset = EPSReset_LyapII; | |
| 802 | 35 | eps->ops->destroy = EPSDestroy_LyapII; | |
| 803 | 35 | eps->ops->view = EPSView_LyapII; | |
| 804 | 35 | eps->ops->setdefaultst = EPSSetDefaultST_LyapII; | |
| 805 | 35 | eps->ops->backtransform = EPSBackTransform_Default; | |
| 806 | 35 | eps->ops->computevectors = EPSComputeVectors_Schur; | |
| 807 | |||
| 808 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIISetLME_C",EPSLyapIISetLME_LyapII)); |
| 809 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIIGetLME_C",EPSLyapIIGetLME_LyapII)); |
| 810 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIISetRanks_C",EPSLyapIISetRanks_LyapII)); |
| 811 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
35 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLyapIIGetRanks_C",EPSLyapIIGetRanks_LyapII)); |
| 812 |
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.
|
7 | PetscFunctionReturn(PETSC_SUCCESS); |
| 813 | } | ||
| 814 |