| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
| 4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
| 5 | |||
| 6 | This file is part of SLEPc. | ||
| 7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
| 8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <slepc/private/dsimpl.h> | ||
| 12 | #include <slepcblaslapack.h> | ||
| 13 | |||
| 14 | 4310 | static PetscErrorCode DSAllocate_NHEP(DS ds,PetscInt ld) | |
| 15 | { | ||
| 16 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4310 | PetscFunctionBegin; |
| 17 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4310 | PetscCall(DSAllocateMat_Private(ds,DS_MAT_A)); |
| 18 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4310 | PetscCall(DSAllocateMat_Private(ds,DS_MAT_Q)); |
| 19 |
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.
|
4310 | PetscCall(PetscFree(ds->perm)); |
| 20 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4310 | PetscCall(PetscMalloc1(ld,&ds->perm)); |
| 21 |
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.
|
832 | PetscFunctionReturn(PETSC_SUCCESS); |
| 22 | } | ||
| 23 | |||
| 24 | 107 | static PetscErrorCode DSView_NHEP(DS ds,PetscViewer viewer) | |
| 25 | { | ||
| 26 | 107 | PetscViewerFormat format; | |
| 27 | |||
| 28 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
107 | PetscFunctionBegin; |
| 29 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
107 | PetscCall(PetscViewerGetFormat(viewer,&format)); |
| 30 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
107 | if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) PetscFunctionReturn(PETSC_SUCCESS); |
| 31 | ✗ | PetscCall(DSViewMat(ds,viewer,DS_MAT_A)); | |
| 32 | ✗ | if (ds->state>DS_STATE_INTERMEDIATE) PetscCall(DSViewMat(ds,viewer,DS_MAT_Q)); | |
| 33 | ✗ | if (ds->omat[DS_MAT_X]) PetscCall(DSViewMat(ds,viewer,DS_MAT_X)); | |
| 34 | ✗ | if (ds->omat[DS_MAT_Y]) PetscCall(DSViewMat(ds,viewer,DS_MAT_Y)); | |
| 35 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 36 | } | ||
| 37 | |||
| 38 | 827 | static PetscErrorCode DSVectors_NHEP_Refined_Some(DS ds,PetscInt *k,PetscReal *rnorm,PetscBool left) | |
| 39 | { | ||
| 40 | 827 | PetscInt i,j; | |
| 41 | 827 | PetscBLASInt info,ld,n,n1,lwork,inc=1; | |
| 42 | 827 | PetscScalar sdummy,done=1.0,zero=0.0; | |
| 43 | 827 | PetscReal *sigma; | |
| 44 | 827 | PetscBool iscomplex = PETSC_FALSE; | |
| 45 | 827 | PetscScalar *X,*W; | |
| 46 | 827 | const PetscScalar *A,*Q; | |
| 47 | |||
| 48 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
827 | PetscFunctionBegin; |
| 49 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
827 | PetscCheck(!left,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Not implemented for left vectors"); |
| 50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 51 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 52 | 827 | n1 = n+1; | |
| 53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(DSAllocateWork_Private(ds,5*ld,6*ld,0)); |
| 54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(DSAllocateMat_Private(ds,DS_MAT_W)); |
| 55 | 827 | lwork = 5*ld; | |
| 56 | 827 | sigma = ds->rwork+5*ld; | |
| 57 | |||
| 58 | /* build A-w*I in W */ | ||
| 59 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_A],&A)); |
| 60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(MatDenseGetArrayWrite(ds->omat[DS_MAT_W],&W)); |
| 61 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
827 | if ((*k)<n-1 && A[(*k)+1+(*k)*ld]!=0.0) iscomplex = PETSC_TRUE; |
| 62 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
367 | PetscCheck(!iscomplex,PETSC_COMM_SELF,PETSC_ERR_SUP,"Not implemented for complex eigenvalues yet"); |
| 63 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35151 | for (j=0;j<n;j++) |
| 64 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1509846 | for (i=0;i<=n;i++) |
| 65 | 1475522 | W[i+j*ld] = A[i+j*ld]; | |
| 66 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35151 | for (i=0;i<n;i++) |
| 67 | 34324 | W[i+i*ld] -= A[(*k)+(*k)*ld]; | |
| 68 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_A],&A)); |
| 69 | |||
| 70 | /* compute SVD of W */ | ||
| 71 | #if !defined(PETSC_USE_COMPLEX) | ||
| 72 |
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.
|
583 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","O",&n1,&n,W,&ld,sigma,&sdummy,&ld,&sdummy,&ld,ds->work,&lwork,&info)); |
| 73 | #else | ||
| 74 |
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.
|
244 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","O",&n1,&n,W,&ld,sigma,&sdummy,&ld,&sdummy,&ld,ds->work,&lwork,ds->rwork,&info)); |
| 75 | #endif | ||
| 76 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
827 | SlepcCheckLapackInfo("gesvd",info); |
| 77 | |||
| 78 | /* the smallest singular value is the new error estimate */ | ||
| 79 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
827 | if (rnorm) *rnorm = sigma[n-1]; |
| 80 | |||
| 81 | /* update vector with right singular vector associated to smallest singular value, | ||
| 82 | accumulating the transformation matrix Q */ | ||
| 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.
|
827 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 84 |
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.
|
1654 | PetscCall(MatDenseGetArray(ds->omat[left?DS_MAT_Y:DS_MAT_X],&X)); |
| 85 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
827 | PetscCallBLAS("BLASgemv",BLASgemv_("N",&n,&n,&done,Q,&ld,W+n-1,&ld,&zero,X+(*k)*ld,&inc)); |
| 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.
|
827 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 87 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
827 | PetscCall(MatDenseRestoreArray(ds->omat[left?DS_MAT_Y:DS_MAT_X],&X)); |
| 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.
|
827 | PetscCall(MatDenseRestoreArrayWrite(ds->omat[DS_MAT_W],&W)); |
| 89 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 90 | } | ||
| 91 | |||
| 92 | 10 | static PetscErrorCode DSVectors_NHEP_Refined_All(DS ds,PetscBool left) | |
| 93 | { | ||
| 94 | 10 | PetscInt i; | |
| 95 | |||
| 96 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 97 |
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.
|
20 | for (i=0;i<ds->n;i++) PetscCall(DSVectors_NHEP_Refined_Some(ds,&i,NULL,left)); |
| 98 |
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); |
| 99 | } | ||
| 100 | |||
| 101 | 68108 | static PetscErrorCode DSVectors_NHEP_Eigen_Some(DS ds,PetscInt *k,PetscReal *rnorm,PetscBool left) | |
| 102 | { | ||
| 103 | 68108 | PetscInt i; | |
| 104 | 68108 | PetscBLASInt mm=1,mout,info,ld,n,*select,inc=1,cols=1,zero=0; | |
| 105 | 68108 | PetscScalar sone=1.0,szero=0.0; | |
| 106 | 68108 | PetscReal norm,done=1.0; | |
| 107 | 68108 | PetscBool iscomplex = PETSC_FALSE; | |
| 108 | 68108 | PetscScalar *X,*Y; | |
| 109 | 68108 | const PetscScalar *A,*Q; | |
| 110 | |||
| 111 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
68108 | PetscFunctionBegin; |
| 112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 113 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 114 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(DSAllocateWork_Private(ds,0,0,ld)); |
| 115 | 68108 | select = ds->iwork; | |
| 116 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1555336 | for (i=0;i<n;i++) select[i] = (PetscBLASInt)PETSC_FALSE; |
| 117 | |||
| 118 | /* compute k-th eigenvector Y of A */ | ||
| 119 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_A],&A)); |
| 120 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
132947 | PetscCall(MatDenseGetArray(ds->omat[left?DS_MAT_Y:DS_MAT_X],&X)); |
| 121 | 68108 | Y = X+(*k)*ld; | |
| 122 | 68108 | select[*k] = (PetscBLASInt)PETSC_TRUE; | |
| 123 | #if !defined(PETSC_USE_COMPLEX) | ||
| 124 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
33895 | if ((*k)<n-1 && A[(*k)+1+(*k)*ld]!=0.0) iscomplex = PETSC_TRUE; |
| 125 | 33895 | mm = iscomplex? 2: 1; | |
| 126 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
33895 | if (iscomplex) select[(*k)+1] = (PetscBLASInt)PETSC_TRUE; |
| 127 |
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.
|
33895 | PetscCall(DSAllocateWork_Private(ds,3*ld,0,0)); |
| 128 |
13/22✓ Branch 0 taken 5 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 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
66204 | PetscCallBLAS("LAPACKtrevc",LAPACKtrevc_(left?"L":"R","S",select,&n,(PetscScalar*)A,&ld,Y,&ld,Y,&ld,&mm,&mout,ds->work,&info)); |
| 129 | #else | ||
| 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.
|
34213 | PetscCall(DSAllocateWork_Private(ds,2*ld,ld,0)); |
| 131 |
13/22✓ Branch 0 taken 5 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 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
66743 | PetscCallBLAS("LAPACKtrevc",LAPACKtrevc_(left?"L":"R","S",select,&n,(PetscScalar*)A,&ld,Y,&ld,Y,&ld,&mm,&mout,ds->work,ds->rwork,&info)); |
| 132 | #endif | ||
| 133 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
68108 | SlepcCheckLapackInfo("trevc",info); |
| 134 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
68108 | PetscCheck(mout==mm,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Inconsistent arguments"); |
| 135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_A],&A)); |
| 136 | |||
| 137 | /* accumulate and normalize eigenvectors */ | ||
| 138 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
68108 | if (ds->state>=DS_STATE_CONDENSED) { |
| 139 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(PetscArraycpy(ds->work,Y,mout*ld)); |
| 141 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
68108 | PetscCallBLAS("BLASgemv",BLASgemv_("N",&n,&n,&sone,Q,&ld,ds->work,&inc,&szero,Y,&inc)); |
| 142 | #if !defined(PETSC_USE_COMPLEX) | ||
| 143 |
12/22✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
33895 | if (iscomplex) PetscCallBLAS("BLASgemv",BLASgemv_("N",&n,&n,&sone,Q,&ld,ds->work+ld,&inc,&szero,Y+ld,&inc)); |
| 144 | #endif | ||
| 145 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 146 | 68108 | cols = 1; | |
| 147 | 68108 | norm = BLASnrm2_(&n,Y,&inc); | |
| 148 | #if !defined(PETSC_USE_COMPLEX) | ||
| 149 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
33895 | if (iscomplex) { |
| 150 | 3876 | norm = SlepcAbsEigenvalue(norm,BLASnrm2_(&n,Y+ld,&inc)); | |
| 151 | 3876 | cols = 2; | |
| 152 | } | ||
| 153 | #endif | ||
| 154 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
68108 | PetscCallBLAS("LAPACKlascl",LAPACKlascl_("G",&zero,&zero,&norm,&done,&n,&cols,Y,&ld,&info)); |
| 155 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
68108 | SlepcCheckLapackInfo("lascl",info); |
| 156 | } | ||
| 157 | |||
| 158 | /* set output arguments */ | ||
| 159 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
68108 | if (iscomplex) (*k)++; |
| 160 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
68108 | if (rnorm) { |
| 161 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
57536 | if (iscomplex) *rnorm = SlepcAbsEigenvalue(Y[n-1],Y[n-1+ld]); |
| 162 | 53680 | else *rnorm = PetscAbsScalar(Y[n-1]); | |
| 163 | } | ||
| 164 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
68108 | PetscCall(MatDenseRestoreArray(ds->omat[left?DS_MAT_Y:DS_MAT_X],&X)); |
| 165 |
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.
|
13079 | PetscFunctionReturn(PETSC_SUCCESS); |
| 166 | } | ||
| 167 | |||
| 168 | 5288 | static PetscErrorCode DSVectors_NHEP_Eigen_All(DS ds,PetscBool left) | |
| 169 | { | ||
| 170 | 5288 | PetscInt i; | |
| 171 | 5288 | PetscBLASInt n,ld,mout,info,inc=1,cols,zero=0; | |
| 172 | 5288 | PetscBool iscomplex; | |
| 173 | 5288 | PetscScalar *X,*Y,*Z; | |
| 174 | 5288 | const PetscScalar *A,*Q; | |
| 175 | 5288 | PetscReal norm,done=1.0; | |
| 176 | 5288 | const char *side,*back; | |
| 177 | |||
| 178 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5288 | PetscFunctionBegin; |
| 179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5288 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_A],&A)); |
| 180 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5288 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 181 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5288 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 182 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5288 | if (left) { |
| 183 | 10 | X = NULL; | |
| 184 |
4/6✓ Branch 0 taken 2 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(MatDenseGetArray(ds->omat[DS_MAT_Y],&Y)); |
| 185 | side = "L"; | ||
| 186 | } else { | ||
| 187 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5278 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_X],&X)); |
| 188 | 5278 | Y = NULL; | |
| 189 | 5278 | side = "R"; | |
| 190 | } | ||
| 191 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5288 | Z = left? Y: X; |
| 192 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5288 | if (ds->state>=DS_STATE_CONDENSED) { |
| 193 | /* DSSolve() has been called, backtransform with matrix Q */ | ||
| 194 | 1107 | back = "B"; | |
| 195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1107 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 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.
|
1107 | PetscCall(PetscArraycpy(Z,Q,ld*ld)); |
| 197 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1107 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 198 | } else back = "A"; | ||
| 199 | #if !defined(PETSC_USE_COMPLEX) | ||
| 200 |
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.
|
2687 | PetscCall(DSAllocateWork_Private(ds,3*ld,0,0)); |
| 201 |
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.
|
2687 | PetscCallBLAS("LAPACKtrevc",LAPACKtrevc_(side,back,NULL,&n,(PetscScalar*)A,&ld,Y,&ld,X,&ld,&n,&mout,ds->work,&info)); |
| 202 | #else | ||
| 203 |
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.
|
2601 | PetscCall(DSAllocateWork_Private(ds,2*ld,ld,0)); |
| 204 |
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.
|
2601 | PetscCallBLAS("LAPACKtrevc",LAPACKtrevc_(side,back,NULL,&n,(PetscScalar*)A,&ld,Y,&ld,X,&ld,&n,&mout,ds->work,ds->rwork,&info)); |
| 205 | #endif | ||
| 206 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5288 | SlepcCheckLapackInfo("trevc",info); |
| 207 | |||
| 208 | /* normalize eigenvectors */ | ||
| 209 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
47839 | for (i=0;i<n;i++) { |
| 210 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
42551 | iscomplex = (i<n-1 && A[i+1+i*ld]!=0.0)? PETSC_TRUE: PETSC_FALSE; |
| 211 | 42551 | cols = 1; | |
| 212 | 42551 | norm = BLASnrm2_(&n,Z+i*ld,&inc); | |
| 213 | #if !defined(PETSC_USE_COMPLEX) | ||
| 214 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
19725 | if (iscomplex) { |
| 215 | 1515 | norm = SlepcAbsEigenvalue(norm,BLASnrm2_(&n,Z+(i+1)*ld,&inc)); | |
| 216 | 1515 | cols = 2; | |
| 217 | } | ||
| 218 | #endif | ||
| 219 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
42551 | PetscCallBLAS("LAPACKlascl",LAPACKlascl_("G",&zero,&zero,&norm,&done,&n,&cols,Z+i*ld,&ld,&info)); |
| 220 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
42551 | SlepcCheckLapackInfo("lascl",info); |
| 221 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
42551 | if (iscomplex) i++; |
| 222 | } | ||
| 223 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5288 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_A],&A)); |
| 224 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
10566 | PetscCall(MatDenseRestoreArray(ds->omat[left?DS_MAT_Y:DS_MAT_X],&Z)); |
| 225 |
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.
|
1001 | PetscFunctionReturn(PETSC_SUCCESS); |
| 226 | } | ||
| 227 | |||
| 228 | 74223 | static PetscErrorCode DSVectors_NHEP(DS ds,DSMatType mat,PetscInt *j,PetscReal *rnorm) | |
| 229 | { | ||
| 230 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
74223 | PetscFunctionBegin; |
| 231 |
2/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
74223 | switch (mat) { |
| 232 | 70944 | case DS_MAT_X: | |
| 233 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70944 | if (ds->refined) { |
| 234 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
827 | PetscCheck(ds->extrarow,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Refined vectors require activating the extra row"); |
| 235 |
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.
|
827 | if (j) PetscCall(DSVectors_NHEP_Refined_Some(ds,j,rnorm,PETSC_FALSE)); |
| 236 |
4/6✓ Branch 0 taken 2 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 | else PetscCall(DSVectors_NHEP_Refined_All(ds,PETSC_FALSE)); |
| 237 | } else { | ||
| 238 |
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.
|
70117 | if (j) PetscCall(DSVectors_NHEP_Eigen_Some(ds,j,rnorm,PETSC_FALSE)); |
| 239 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
5278 | else PetscCall(DSVectors_NHEP_Eigen_All(ds,PETSC_FALSE)); |
| 240 | } | ||
| 241 | break; | ||
| 242 | 3279 | case DS_MAT_Y: | |
| 243 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3279 | PetscCheck(!ds->refined,PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Not implemented yet"); |
| 244 |
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.
|
3279 | if (j) PetscCall(DSVectors_NHEP_Eigen_Some(ds,j,rnorm,PETSC_TRUE)); |
| 245 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | else PetscCall(DSVectors_NHEP_Eigen_All(ds,PETSC_TRUE)); |
| 246 | break; | ||
| 247 | ✗ | case DS_MAT_U: | |
| 248 | case DS_MAT_V: | ||
| 249 | ✗ | SETERRQ(PetscObjectComm((PetscObject)ds),PETSC_ERR_SUP,"Not implemented yet"); | |
| 250 | ✗ | default: | |
| 251 | ✗ | SETERRQ(PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_OUTOFRANGE,"Invalid mat parameter"); | |
| 252 | } | ||
| 253 |
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.
|
14241 | PetscFunctionReturn(PETSC_SUCCESS); |
| 254 | } | ||
| 255 | |||
| 256 | 236 | static PetscErrorCode DSSort_NHEP_Arbitrary(DS ds,PetscScalar *wr,PetscScalar *wi,PetscScalar *rr,PetscScalar *ri,PetscInt *k) | |
| 257 | { | ||
| 258 | 236 | PetscInt i; | |
| 259 | 236 | PetscBLASInt info,n,ld,mout,lwork,*selection; | |
| 260 | 236 | PetscScalar *T,*Q,*work; | |
| 261 | 236 | PetscReal dummy; | |
| 262 | #if !defined(PETSC_USE_COMPLEX) | ||
| 263 | 85 | PetscBLASInt *iwork,liwork; | |
| 264 | #endif | ||
| 265 | |||
| 266 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
236 | PetscFunctionBegin; |
| 267 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
236 | PetscCheck(k,PetscObjectComm((PetscObject)ds),PETSC_ERR_ARG_WRONG,"Must supply argument k"); |
| 268 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
236 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&T)); |
| 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.
|
236 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_Q],&Q)); |
| 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.
|
236 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 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.
|
236 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 272 | #if !defined(PETSC_USE_COMPLEX) | ||
| 273 | 85 | lwork = n; | |
| 274 | 85 | liwork = 1; | |
| 275 |
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.
|
85 | PetscCall(DSAllocateWork_Private(ds,lwork,0,liwork+n)); |
| 276 | 85 | work = ds->work; | |
| 277 |
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.
|
85 | PetscCall(PetscBLASIntCast(ds->lwork,&lwork)); |
| 278 | 85 | selection = ds->iwork; | |
| 279 | 85 | iwork = ds->iwork + n; | |
| 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.
|
85 | PetscCall(PetscBLASIntCast(ds->liwork-n,&liwork)); |
| 281 | #else | ||
| 282 | 151 | lwork = 1; | |
| 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.
|
151 | PetscCall(DSAllocateWork_Private(ds,lwork,0,n)); |
| 284 | 151 | work = ds->work; | |
| 285 | 151 | selection = ds->iwork; | |
| 286 | #endif | ||
| 287 | /* Compute the selected eigenvalue to be in the leading position */ | ||
| 288 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
236 | PetscCall(DSSortEigenvalues_Private(ds,rr,ri,ds->perm,PETSC_FALSE)); |
| 289 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
236 | PetscCall(PetscArrayzero(selection,n)); |
| 290 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
959 | for (i=0;i<*k;i++) selection[ds->perm[i]] = 1; |
| 291 | #if !defined(PETSC_USE_COMPLEX) | ||
| 292 |
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.
|
85 | PetscCallBLAS("LAPACKtrsen",LAPACKtrsen_("N","V",selection,&n,T,&ld,Q,&ld,wr,wi,&mout,&dummy,&dummy,work,&lwork,iwork,&liwork,&info)); |
| 293 | #else | ||
| 294 |
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.
|
151 | PetscCallBLAS("LAPACKtrsen",LAPACKtrsen_("N","V",selection,&n,T,&ld,Q,&ld,wr,&mout,&dummy,&dummy,work,&lwork,&info)); |
| 295 | #endif | ||
| 296 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
236 | SlepcCheckLapackInfo("trsen",info); |
| 297 | 236 | *k = mout; | |
| 298 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
236 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&T)); |
| 299 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
236 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_Q],&Q)); |
| 300 |
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); |
| 301 | } | ||
| 302 | |||
| 303 | 41909 | static PetscErrorCode DSSort_NHEP(DS ds,PetscScalar *wr,PetscScalar *wi,PetscScalar *rr,PetscScalar *ri,PetscInt *k) | |
| 304 | { | ||
| 305 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
41909 | PetscFunctionBegin; |
| 306 |
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.
|
41909 | if (!rr || wr == rr) PetscCall(DSSort_NHEP_Total(ds,DS_MAT_A,DS_MAT_Q,wr,wi)); |
| 307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
236 | else PetscCall(DSSort_NHEP_Arbitrary(ds,wr,wi,rr,ri,k)); |
| 308 |
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.
|
8081 | PetscFunctionReturn(PETSC_SUCCESS); |
| 309 | } | ||
| 310 | |||
| 311 | 10 | static PetscErrorCode DSSortWithPermutation_NHEP(DS ds,PetscInt *perm,PetscScalar *wr,PetscScalar *wi) | |
| 312 | { | ||
| 313 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 314 |
4/6✓ Branch 0 taken 2 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(DSSortWithPermutation_NHEP_Private(ds,perm,DS_MAT_A,DS_MAT_Q,wr,wi)); |
| 315 |
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); |
| 316 | } | ||
| 317 | |||
| 318 | 31363 | static PetscErrorCode DSUpdateExtraRow_NHEP(DS ds) | |
| 319 | { | ||
| 320 | 31363 | PetscInt i; | |
| 321 | 31363 | PetscBLASInt n,ld,incx=1; | |
| 322 | 31363 | PetscScalar *A,*x,*y,one=1.0,zero=0.0; | |
| 323 | 31363 | const PetscScalar *Q; | |
| 324 | |||
| 325 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
31363 | PetscFunctionBegin; |
| 326 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
31363 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
31363 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 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.
|
31363 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A)); |
| 329 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
31363 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 330 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
31363 | PetscCall(DSAllocateWork_Private(ds,2*ld,0,0)); |
| 331 | 31363 | x = ds->work; | |
| 332 | 31363 | y = ds->work+ld; | |
| 333 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
633447 | for (i=0;i<n;i++) x[i] = PetscConj(A[n+i*ld]); |
| 334 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
31363 | PetscCallBLAS("BLASgemv",BLASgemv_("C",&n,&n,&one,Q,&ld,x,&incx,&zero,y,&incx)); |
| 335 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
633447 | for (i=0;i<n;i++) A[n+i*ld] = PetscConj(y[i]); |
| 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.
|
31363 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A)); |
| 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.
|
31363 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 338 | 31363 | ds->k = n; | |
| 339 |
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.
|
31363 | PetscFunctionReturn(PETSC_SUCCESS); |
| 340 | } | ||
| 341 | |||
| 342 | 37818 | static PetscErrorCode DSSolve_NHEP(DS ds,PetscScalar *wr,PetscScalar *wi) | |
| 343 | { | ||
| 344 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
37818 | PetscFunctionBegin; |
| 345 | #if !defined(PETSC_USE_COMPLEX) | ||
| 346 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
18941 | PetscAssertPointer(wi,3); |
| 347 | #endif | ||
| 348 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
37818 | PetscCall(DSSolve_NHEP_Private(ds,DS_MAT_A,DS_MAT_Q,wr,wi)); |
| 349 |
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.
|
7245 | PetscFunctionReturn(PETSC_SUCCESS); |
| 350 | } | ||
| 351 | |||
| 352 | #if !defined(PETSC_HAVE_MPIUNI) | ||
| 353 | 310 | static PetscErrorCode DSSynchronize_NHEP(DS ds,PetscScalar eigr[],PetscScalar eigi[]) | |
| 354 | { | ||
| 355 | 310 | PetscInt ld=ds->ld,l=ds->l,k; | |
| 356 | 310 | PetscMPIInt n,rank,off=0,size,ldn; | |
| 357 | 310 | PetscScalar *A,*Q; | |
| 358 | |||
| 359 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
310 | PetscFunctionBegin; |
| 360 | 310 | k = (ds->n-l)*ld; | |
| 361 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
310 | if (ds->state>DS_STATE_RAW) k += (ds->n-l)*ld; |
| 362 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
310 | if (eigr) k += ds->n-l; |
| 363 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
310 | if (eigi) k += ds->n-l; |
| 364 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
310 | PetscCall(DSAllocateWork_Private(ds,k,0,0)); |
| 365 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
310 | PetscCall(PetscMPIIntCast(k*sizeof(PetscScalar),&size)); |
| 366 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
310 | PetscCall(PetscMPIIntCast(ds->n-l,&n)); |
| 367 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
310 | PetscCall(PetscMPIIntCast(ld*(ds->n-l),&ldn)); |
| 368 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
310 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A)); |
| 369 |
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.
|
310 | if (ds->state>DS_STATE_RAW) PetscCall(MatDenseGetArray(ds->omat[DS_MAT_Q],&Q)); |
| 370 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
310 | PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)ds),&rank)); |
| 371 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
310 | if (!rank) { |
| 372 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
150 | PetscCallMPI(MPI_Pack(A+l*ld,ldn,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds))); |
| 373 |
15/30✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 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.
|
150 | if (ds->state>DS_STATE_RAW) PetscCallMPI(MPI_Pack(Q+l*ld,ldn,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds))); |
| 374 |
15/30✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 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.
|
150 | if (eigr) PetscCallMPI(MPI_Pack(eigr+l,n,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds))); |
| 375 | #if !defined(PETSC_USE_COMPLEX) | ||
| 376 |
15/30✓ 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 taken 4 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
75 | if (eigi) PetscCallMPI(MPI_Pack(eigi+l,n,MPIU_SCALAR,ds->work,size,&off,PetscObjectComm((PetscObject)ds))); |
| 377 | #endif | ||
| 378 | } | ||
| 379 |
15/30✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 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.
|
620 | PetscCallMPI(MPI_Bcast(ds->work,size,MPI_BYTE,0,PetscObjectComm((PetscObject)ds))); |
| 380 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
310 | if (rank) { |
| 381 |
14/28✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
160 | PetscCallMPI(MPI_Unpack(ds->work,size,&off,A+l*ld,ldn,MPIU_SCALAR,PetscObjectComm((PetscObject)ds))); |
| 382 |
15/30✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 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.
|
160 | if (ds->state>DS_STATE_RAW) PetscCallMPI(MPI_Unpack(ds->work,size,&off,Q+l*ld,ldn,MPIU_SCALAR,PetscObjectComm((PetscObject)ds))); |
| 383 |
15/30✓ 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 taken 8 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.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 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.
|
160 | if (eigr) PetscCallMPI(MPI_Unpack(ds->work,size,&off,eigr+l,n,MPIU_SCALAR,PetscObjectComm((PetscObject)ds))); |
| 384 | #if !defined(PETSC_USE_COMPLEX) | ||
| 385 |
15/30✓ 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 taken 4 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
80 | if (eigi) PetscCallMPI(MPI_Unpack(ds->work,size,&off,eigi+l,n,MPIU_SCALAR,PetscObjectComm((PetscObject)ds))); |
| 386 | #endif | ||
| 387 | } | ||
| 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.
|
310 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A)); |
| 389 |
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.
|
310 | if (ds->state>DS_STATE_RAW) PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_Q],&Q)); |
| 390 |
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); |
| 391 | } | ||
| 392 | #endif | ||
| 393 | |||
| 394 | 22267 | static PetscErrorCode DSTruncate_NHEP(DS ds,PetscInt n,PetscBool trim) | |
| 395 | { | ||
| 396 | 22267 | PetscInt i,ld=ds->ld,l=ds->l; | |
| 397 | 22267 | PetscScalar *A; | |
| 398 | |||
| 399 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
22267 | PetscFunctionBegin; |
| 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.
|
22267 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A)); |
| 401 | #if defined(PETSC_USE_DEBUG) | ||
| 402 | /* make sure diagonal 2x2 block is not broken */ | ||
| 403 |
7/10✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
4209 | PetscCheck(ds->state<DS_STATE_CONDENSED || n==0 || n==ds->n || A[n+(n-1)*ld]==0.0,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"The given size would break a 2x2 block, call DSGetTruncateSize() first"); |
| 404 | #endif | ||
| 405 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
22267 | if (trim) { |
| 406 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3579 | if (ds->extrarow) { /* clean extra row */ |
| 407 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
63792 | for (i=l;i<ds->n;i++) A[ds->n+i*ld] = 0.0; |
| 408 | } | ||
| 409 | 3579 | ds->l = 0; | |
| 410 | 3579 | ds->k = 0; | |
| 411 | 3579 | ds->n = n; | |
| 412 | 3579 | ds->t = ds->n; /* truncated length equal to the new dimension */ | |
| 413 | } else { | ||
| 414 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
18688 | if (ds->extrarow && ds->k==ds->n) { |
| 415 | /* copy entries of extra row to the new position, then clean last row */ | ||
| 416 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
194147 | for (i=l;i<n;i++) A[n+i*ld] = A[ds->n+i*ld]; |
| 417 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
371979 | for (i=l;i<ds->n;i++) A[ds->n+i*ld] = 0.0; |
| 418 | } | ||
| 419 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
18688 | ds->k = (ds->extrarow)? n: 0; |
| 420 | 18688 | ds->t = ds->n; /* truncated length equal to previous dimension */ | |
| 421 | 18688 | ds->n = n; | |
| 422 | } | ||
| 423 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
22267 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A)); |
| 424 |
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.
|
4209 | PetscFunctionReturn(PETSC_SUCCESS); |
| 425 | } | ||
| 426 | |||
| 427 | 406 | static PetscErrorCode DSCond_NHEP(DS ds,PetscReal *cond) | |
| 428 | { | ||
| 429 | 406 | PetscScalar *work; | |
| 430 | 406 | PetscReal *rwork; | |
| 431 | 406 | PetscBLASInt *ipiv; | |
| 432 | 406 | PetscBLASInt lwork,info,n,ld; | |
| 433 | 406 | PetscReal hn,hin; | |
| 434 | 406 | PetscScalar *A; | |
| 435 | |||
| 436 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
406 | PetscFunctionBegin; |
| 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.
|
406 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 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.
|
406 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 439 | 406 | lwork = 8*ld; | |
| 440 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
406 | PetscCall(DSAllocateWork_Private(ds,lwork,ld,ld)); |
| 441 | 406 | work = ds->work; | |
| 442 | 406 | rwork = ds->rwork; | |
| 443 | 406 | ipiv = ds->iwork; | |
| 444 | |||
| 445 | /* use workspace matrix W to avoid overwriting A */ | ||
| 446 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
406 | PetscCall(DSAllocateMat_Private(ds,DS_MAT_W)); |
| 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.
|
406 | PetscCall(MatCopy(ds->omat[DS_MAT_A],ds->omat[DS_MAT_W],SAME_NONZERO_PATTERN)); |
| 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.
|
406 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_W],&A)); |
| 449 | |||
| 450 | /* norm of A */ | ||
| 451 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
406 | if (ds->state<DS_STATE_INTERMEDIATE) hn = LAPACKlange_("I",&n,&n,A,&ld,rwork); |
| 452 | 406 | else hn = LAPACKlanhs_("I",&n,A,&ld,rwork); | |
| 453 | |||
| 454 | /* norm of inv(A) */ | ||
| 455 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
406 | PetscCallBLAS("LAPACKgetrf",LAPACKgetrf_(&n,&n,A,&ld,ipiv,&info)); |
| 456 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
406 | SlepcCheckLapackInfo("getrf",info); |
| 457 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
406 | PetscCallBLAS("LAPACKgetri",LAPACKgetri_(&n,A,&ld,ipiv,work,&lwork,&info)); |
| 458 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
406 | SlepcCheckLapackInfo("getri",info); |
| 459 | 406 | hin = LAPACKlange_("I",&n,&n,A,&ld,rwork); | |
| 460 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
406 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_W],&A)); |
| 461 | |||
| 462 | 406 | *cond = hn*hin; | |
| 463 |
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.
|
406 | PetscFunctionReturn(PETSC_SUCCESS); |
| 464 | } | ||
| 465 | |||
| 466 | 995 | static PetscErrorCode DSTranslateHarmonic_NHEP(DS ds,PetscScalar tau,PetscReal beta,PetscBool recover,PetscScalar *gin,PetscReal *gammaout) | |
| 467 | { | ||
| 468 | 995 | PetscInt i,j; | |
| 469 | 995 | PetscBLASInt *ipiv,info,n,ld,one=1,ncol; | |
| 470 | 995 | PetscScalar *A,*B,*g=gin,*ghat,done=1.0,dmone=-1.0,dzero=0.0; | |
| 471 | 995 | const PetscScalar *Q; | |
| 472 | 995 | PetscReal gamma=1.0; | |
| 473 | |||
| 474 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
995 | PetscFunctionBegin; |
| 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.
|
995 | PetscCall(PetscBLASIntCast(ds->n,&n)); |
| 476 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
995 | PetscCall(PetscBLASIntCast(ds->ld,&ld)); |
| 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.
|
995 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_A],&A)); |
| 478 | |||
| 479 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
995 | if (!recover) { |
| 480 | |||
| 481 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(DSAllocateWork_Private(ds,0,0,ld)); |
| 482 | 722 | ipiv = ds->iwork; | |
| 483 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
722 | if (!g) { |
| 484 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
389 | PetscCall(DSAllocateWork_Private(ds,ld,0,0)); |
| 485 | 389 | g = ds->work; | |
| 486 | } | ||
| 487 | /* use workspace matrix W to factor A-tau*eye(n) */ | ||
| 488 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(DSAllocateMat_Private(ds,DS_MAT_W)); |
| 489 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(MatCopy(ds->omat[DS_MAT_A],ds->omat[DS_MAT_W],SAME_NONZERO_PATTERN)); |
| 490 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(MatDenseGetArray(ds->omat[DS_MAT_W],&B)); |
| 491 | |||
| 492 | /* Vector g initially stores b = beta*e_n^T */ | ||
| 493 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(PetscArrayzero(g,n)); |
| 494 | 722 | g[n-1] = beta; | |
| 495 | |||
| 496 | /* g = (A-tau*eye(n))'\b */ | ||
| 497 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
14200 | for (i=0;i<n;i++) B[i+i*ld] -= tau; |
| 498 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
722 | PetscCallBLAS("LAPACKgetrf",LAPACKgetrf_(&n,&n,B,&ld,ipiv,&info)); |
| 499 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
722 | SlepcCheckLapackInfo("getrf",info); |
| 500 |
3/6✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(PetscLogFlops(2.0*n*n*n/3.0)); |
| 501 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
722 | PetscCallBLAS("LAPACKgetrs",LAPACKgetrs_("C",&n,&one,B,&ld,ipiv,g,&ld,&info)); |
| 502 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
722 | SlepcCheckLapackInfo("getrs",info); |
| 503 |
3/6✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
722 | PetscCall(PetscLogFlops(2.0*n*n-n)); |
| 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.
|
722 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_W],&B)); |
| 505 | |||
| 506 | /* A = A + g*b' */ | ||
| 507 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
14200 | for (i=0;i<n;i++) A[i+(n-1)*ld] += g[i]*beta; |
| 508 | |||
| 509 | } else { /* recover */ | ||
| 510 | |||
| 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.
|
273 | PetscCall(DSAllocateWork_Private(ds,ld,0,0)); |
| 512 | 273 | ghat = ds->work; | |
| 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.
|
273 | PetscCall(MatDenseGetArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 514 | |||
| 515 | /* g^ = -Q(:,idx)'*g */ | ||
| 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.
|
273 | PetscCall(PetscBLASIntCast(ds->l+ds->k,&ncol)); |
| 517 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
273 | PetscCallBLAS("BLASgemv",BLASgemv_("C",&n,&ncol,&dmone,Q,&ld,g,&one,&dzero,ghat,&one)); |
| 518 | |||
| 519 | /* A = A + g^*b' */ | ||
| 520 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2677 | for (i=0;i<ds->l+ds->k;i++) |
| 521 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
23592 | for (j=ds->l;j<ds->l+ds->k;j++) |
| 522 | 21188 | A[i+j*ld] += ghat[i]*Q[n-1+j*ld]*beta; | |
| 523 | |||
| 524 | /* g~ = (I-Q(:,idx)*Q(:,idx)')*g = g+Q(:,idx)*g^ */ | ||
| 525 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
273 | PetscCallBLAS("BLASgemv",BLASgemv_("N",&n,&ncol,&done,Q,&ld,ghat,&one,&done,g,&one)); |
| 526 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
273 | PetscCall(MatDenseRestoreArrayRead(ds->omat[DS_MAT_Q],&Q)); |
| 527 | } | ||
| 528 | |||
| 529 | /* Compute gamma factor */ | ||
| 530 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
995 | if (gammaout || (recover && ds->extrarow)) gamma = SlepcAbs(1.0,BLASnrm2_(&n,g,&one)); |
| 531 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
995 | if (gammaout) *gammaout = gamma; |
| 532 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
995 | if (recover && ds->extrarow) { |
| 533 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2666 | for (j=ds->l;j<ds->l+ds->k;j++) A[ds->n+j*ld] *= gamma; |
| 534 | } | ||
| 535 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
995 | PetscCall(MatDenseRestoreArray(ds->omat[DS_MAT_A],&A)); |
| 536 |
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.
|
161 | PetscFunctionReturn(PETSC_SUCCESS); |
| 537 | } | ||
| 538 | |||
| 539 | 10 | static PetscErrorCode DSReallocate_NHEP(DS ds,PetscInt ld) | |
| 540 | { | ||
| 541 | 10 | PetscInt i,*perm=ds->perm; | |
| 542 | |||
| 543 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 544 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
230 | for (i=0;i<DS_NUM_MAT;i++) { |
| 545 |
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.
|
220 | if (i!=DS_MAT_A && i!=DS_MAT_Q) PetscCall(MatDestroy(&ds->omat[i])); |
| 546 | } | ||
| 547 | |||
| 548 |
4/6✓ Branch 0 taken 2 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(DSReallocateMat_Private(ds,DS_MAT_A,ld)); |
| 549 |
4/6✓ Branch 0 taken 2 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(DSReallocateMat_Private(ds,DS_MAT_Q,ld)); |
| 550 | |||
| 551 |
4/6✓ Branch 0 taken 2 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(PetscMalloc1(ld,&ds->perm)); |
| 552 |
4/6✓ Branch 0 taken 2 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(PetscArraycpy(ds->perm,perm,ds->ld)); |
| 553 |
6/8✓ 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.
|
10 | PetscCall(PetscFree(perm)); |
| 554 |
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); |
| 555 | } | ||
| 556 | |||
| 557 | /*MC | ||
| 558 | DSNHEP - Dense Non-Hermitian Eigenvalue Problem. | ||
| 559 | |||
| 560 | Notes: | ||
| 561 | The problem is expressed as $AX = X\Lambda$, where $A$ is the input matrix. | ||
| 562 | $\Lambda$ is a diagonal matrix whose diagonal elements are the arguments of | ||
| 563 | `DSSolve()`. After solve, $A$ is overwritten with the upper quasi-triangular | ||
| 564 | matrix $T$ of the (real) Schur form, $AQ = QT$. | ||
| 565 | |||
| 566 | In the intermediate state $A$ is reduced to upper Hessenberg form. | ||
| 567 | |||
| 568 | Computation of left eigenvectors is supported, but two-sided Krylov solvers | ||
| 569 | usually rely on the related `DSNHEPTS`. | ||
| 570 | |||
| 571 | Used DS matrices: | ||
| 572 | + `DS_MAT_A` - problem matrix | ||
| 573 | - `DS_MAT_Q` - orthogonal/unitary transformation that reduces to Hessenberg form | ||
| 574 | (intermediate step) or matrix of orthogonal Schur vectors | ||
| 575 | |||
| 576 | Implemented methods: | ||
| 577 | . 0 - Implicit QR (`_hseqr`) | ||
| 578 | |||
| 579 | Level: beginner | ||
| 580 | |||
| 581 | .seealso: [](sec:ds), `DSCreate()`, `DSSetType()`, `DSType` | ||
| 582 | M*/ | ||
| 583 | 9871 | SLEPC_EXTERN PetscErrorCode DSCreate_NHEP(DS ds) | |
| 584 | { | ||
| 585 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
9871 | PetscFunctionBegin; |
| 586 | 9871 | ds->ops->allocate = DSAllocate_NHEP; | |
| 587 | 9871 | ds->ops->view = DSView_NHEP; | |
| 588 | 9871 | ds->ops->vectors = DSVectors_NHEP; | |
| 589 | 9871 | ds->ops->solve[0] = DSSolve_NHEP; | |
| 590 | 9871 | ds->ops->sort = DSSort_NHEP; | |
| 591 | 9871 | ds->ops->sortperm = DSSortWithPermutation_NHEP; | |
| 592 | #if !defined(PETSC_HAVE_MPIUNI) | ||
| 593 | 9871 | ds->ops->synchronize = DSSynchronize_NHEP; | |
| 594 | #endif | ||
| 595 | 9871 | ds->ops->gettruncatesize = DSGetTruncateSize_Default; | |
| 596 | 9871 | ds->ops->truncate = DSTruncate_NHEP; | |
| 597 | 9871 | ds->ops->update = DSUpdateExtraRow_NHEP; | |
| 598 | 9871 | ds->ops->cond = DSCond_NHEP; | |
| 599 | 9871 | ds->ops->transharm = DSTranslateHarmonic_NHEP; | |
| 600 | 9871 | ds->ops->reallocate = DSReallocate_NHEP; | |
| 601 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
9871 | PetscFunctionReturn(PETSC_SUCCESS); |
| 602 | } | ||
| 603 |