| 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 | Tensor BV that is represented in compact form as V = (I otimes U) S | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/bvimpl.h> /*I "slepcbv.h" I*/ | ||
| 15 | #include <slepcblaslapack.h> | ||
| 16 | |||
| 17 | typedef struct { | ||
| 18 | BV U; /* first factor */ | ||
| 19 | Mat S; /* second factor */ | ||
| 20 | PetscScalar *qB; /* auxiliary matrix used in non-standard inner products */ | ||
| 21 | PetscScalar *sw; /* work space */ | ||
| 22 | PetscInt d; /* degree of the tensor BV */ | ||
| 23 | PetscInt ld; /* leading dimension of a single block in S */ | ||
| 24 | PetscInt puk; /* copy of the k value */ | ||
| 25 | Vec u; /* auxiliary work vector */ | ||
| 26 | } BV_TENSOR; | ||
| 27 | |||
| 28 | 12742 | static PetscErrorCode BVMultInPlace_Tensor(BV V,Mat Q,PetscInt s,PetscInt e) | |
| 29 | { | ||
| 30 | 12742 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 31 | 12742 | PetscScalar *pS; | |
| 32 | 12742 | const PetscScalar *q; | |
| 33 | 12742 | PetscInt ldq,lds = ctx->ld*ctx->d; | |
| 34 | |||
| 35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12742 | PetscFunctionBegin; |
| 36 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12742 | PetscCall(MatDenseGetLDA(Q,&ldq)); |
| 37 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12742 | PetscCall(MatDenseGetArray(ctx->S,&pS)); |
| 38 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12742 | PetscCall(MatDenseGetArrayRead(Q,&q)); |
| 39 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12742 | PetscCall(BVMultInPlace_BLAS_Private(V,lds,V->k-V->l,s-V->l,e-V->l,pS+(V->nc+V->l)*lds,lds,q+V->l*ldq+V->l,ldq,PETSC_FALSE)); |
| 40 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12742 | PetscCall(MatDenseRestoreArrayRead(Q,&q)); |
| 41 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12742 | PetscCall(MatDenseRestoreArray(ctx->S,&pS)); |
| 42 |
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.
|
2455 | PetscFunctionReturn(PETSC_SUCCESS); |
| 43 | } | ||
| 44 | |||
| 45 | ✗ | static PetscErrorCode BVMultInPlaceHermitianTranspose_Tensor(BV V,Mat Q,PetscInt s,PetscInt e) | |
| 46 | { | ||
| 47 | ✗ | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 48 | ✗ | PetscScalar *pS; | |
| 49 | ✗ | const PetscScalar *q; | |
| 50 | ✗ | PetscInt ldq,lds = ctx->ld*ctx->d; | |
| 51 | |||
| 52 | ✗ | PetscFunctionBegin; | |
| 53 | ✗ | PetscCall(MatDenseGetLDA(Q,&ldq)); | |
| 54 | ✗ | PetscCall(MatDenseGetArray(ctx->S,&pS)); | |
| 55 | ✗ | PetscCall(MatDenseGetArrayRead(Q,&q)); | |
| 56 | ✗ | PetscCall(BVMultInPlace_BLAS_Private(V,lds,V->k-V->l,s-V->l,e-V->l,pS+(V->nc+V->l)*lds,lds,q+V->l*ldq+V->l,ldq,PETSC_TRUE)); | |
| 57 | ✗ | PetscCall(MatDenseRestoreArrayRead(Q,&q)); | |
| 58 | ✗ | PetscCall(MatDenseRestoreArray(ctx->S,&pS)); | |
| 59 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 60 | } | ||
| 61 | |||
| 62 | 104 | static PetscErrorCode BVDot_Tensor(BV X,BV Y,Mat M) | |
| 63 | { | ||
| 64 | 104 | BV_TENSOR *x = (BV_TENSOR*)X->data,*y = (BV_TENSOR*)Y->data; | |
| 65 | 104 | PetscScalar *m; | |
| 66 | 104 | const PetscScalar *px,*py; | |
| 67 | 104 | PetscInt ldm,lds = x->ld*x->d; | |
| 68 | |||
| 69 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
104 | PetscFunctionBegin; |
| 70 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
104 | PetscCheck(x->U==y->U,PetscObjectComm((PetscObject)X),PETSC_ERR_SUP,"BVDot() in BVTENSOR requires that both operands have the same U factor"); |
| 71 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
104 | PetscCheck(lds==y->ld*y->d,PetscObjectComm((PetscObject)X),PETSC_ERR_ARG_SIZ,"Mismatching dimensions ld*d %" PetscInt_FMT " %" PetscInt_FMT,lds,y->ld*y->d); |
| 72 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseGetLDA(M,&ldm)); |
| 73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseGetArrayRead(x->S,&px)); |
| 74 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseGetArrayRead(y->S,&py)); |
| 75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseGetArray(M,&m)); |
| 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.
|
104 | PetscCall(BVDot_BLAS_Private(X,Y->k-Y->l,X->k-X->l,lds,py+(Y->nc+Y->l)*lds,lds,px+(X->nc+X->l)*lds,lds,m+X->l*ldm+Y->l,ldm,PETSC_FALSE)); |
| 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.
|
104 | PetscCall(MatDenseRestoreArray(M,&m)); |
| 78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseRestoreArrayRead(x->S,&px)); |
| 79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseRestoreArrayRead(y->S,&py)); |
| 80 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
16 | PetscFunctionReturn(PETSC_SUCCESS); |
| 81 | } | ||
| 82 | |||
| 83 | 150089 | static PetscErrorCode BVScale_Tensor(BV bv,PetscInt j,PetscScalar alpha) | |
| 84 | { | ||
| 85 | 150089 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 86 | 150089 | PetscScalar *pS; | |
| 87 | 150089 | PetscInt lds = ctx->ld*ctx->d; | |
| 88 | |||
| 89 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
150089 | PetscFunctionBegin; |
| 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.
|
150089 | PetscCall(MatDenseGetArray(ctx->S,&pS)); |
| 91 |
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.
|
150089 | if (PetscUnlikely(j<0)) PetscCall(BVScale_BLAS_Private(bv,(bv->k-bv->l)*lds,pS+(bv->nc+bv->l)*lds,alpha)); |
| 92 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
150089 | else PetscCall(BVScale_BLAS_Private(bv,lds,pS+(bv->nc+j)*lds,alpha)); |
| 93 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
150089 | PetscCall(MatDenseRestoreArray(ctx->S,&pS)); |
| 94 |
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.
|
29095 | PetscFunctionReturn(PETSC_SUCCESS); |
| 95 | } | ||
| 96 | |||
| 97 | 104 | static PetscErrorCode BVNorm_Tensor(BV bv,PetscInt j,NormType type,PetscReal *val) | |
| 98 | { | ||
| 99 | 104 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 100 | 104 | const PetscScalar *pS; | |
| 101 | 104 | PetscInt lds = ctx->ld*ctx->d; | |
| 102 | |||
| 103 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
104 | PetscFunctionBegin; |
| 104 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseGetArrayRead(ctx->S,&pS)); |
| 105 |
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.
|
104 | if (j<0) PetscCall(BVNorm_LAPACK_Private(bv,lds,bv->k-bv->l,pS+(bv->nc+bv->l)*lds,lds,type,val,PETSC_FALSE)); |
| 106 | ✗ | else PetscCall(BVNorm_LAPACK_Private(bv,lds,1,pS+(bv->nc+j)*lds,lds,type,val,PETSC_FALSE)); | |
| 107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(MatDenseRestoreArrayRead(ctx->S,&pS)); |
| 108 |
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.
|
16 | PetscFunctionReturn(PETSC_SUCCESS); |
| 109 | } | ||
| 110 | |||
| 111 | 12448 | static PetscErrorCode BVCopyColumn_Tensor(BV V,PetscInt j,PetscInt i) | |
| 112 | { | ||
| 113 | 12448 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 114 | 12448 | PetscScalar *pS; | |
| 115 | 12448 | PetscInt lds = ctx->ld*ctx->d; | |
| 116 | |||
| 117 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12448 | PetscFunctionBegin; |
| 118 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12448 | PetscCall(MatDenseGetArray(ctx->S,&pS)); |
| 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.
|
12448 | PetscCall(PetscArraycpy(pS+(V->nc+i)*lds,pS+(V->nc+j)*lds,lds)); |
| 120 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12448 | PetscCall(MatDenseRestoreArray(ctx->S,&pS)); |
| 121 |
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.
|
2401 | PetscFunctionReturn(PETSC_SUCCESS); |
| 122 | } | ||
| 123 | |||
| 124 | 445078 | static PetscErrorCode BVTensorNormColumn(BV bv,PetscInt j,PetscReal *norm) | |
| 125 | { | ||
| 126 | 445078 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 127 | 445078 | PetscBLASInt one=1,lds_; | |
| 128 | 445078 | PetscScalar sone=1.0,szero=0.0,*x,dot; | |
| 129 | 445078 | const PetscScalar *S; | |
| 130 | 445078 | PetscReal alpha=1.0,scale=0.0,aval; | |
| 131 | 445078 | PetscInt i,lds,ld=ctx->ld; | |
| 132 | |||
| 133 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
445078 | PetscFunctionBegin; |
| 134 | 445078 | lds = ld*ctx->d; | |
| 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.
|
445078 | PetscCall(MatDenseGetArrayRead(ctx->S,&S)); |
| 136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
445078 | PetscCall(PetscBLASIntCast(lds,&lds_)); |
| 137 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
445078 | if (PetscUnlikely(ctx->qB)) { |
| 138 | 44576 | x = ctx->sw; | |
| 139 |
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.
|
44576 | PetscCallBLAS("BLASgemv",BLASgemv_("N",&lds_,&lds_,&sone,ctx->qB,&lds_,S+j*lds,&one,&szero,x,&one)); |
| 140 | 44576 | dot = PetscRealPart(BLASdot_(&lds_,S+j*lds,&one,x,&one)); | |
| 141 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
44576 | PetscCall(BV_SafeSqrt(bv,dot,norm)); |
| 142 | } else { | ||
| 143 | /* Compute *norm = BLASnrm2_(&lds_,S+j*lds,&one); */ | ||
| 144 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
400502 | if (lds==1) *norm = PetscAbsScalar(S[j*lds]); |
| 145 | else { | ||
| 146 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
75908407 | for (i=0;i<lds;i++) { |
| 147 | 75507905 | aval = PetscAbsScalar(S[i+j*lds]); | |
| 148 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
75507905 | if (aval!=0.0) { |
| 149 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54476269 | if (PetscUnlikely(scale<aval)) { |
| 150 | 2449971 | alpha = 1.0 + alpha*PetscSqr(scale/aval); | |
| 151 | 2449971 | scale = aval; | |
| 152 | 52026298 | } else alpha += PetscSqr(aval/scale); | |
| 153 | } | ||
| 154 | } | ||
| 155 | 400502 | *norm = scale*PetscSqrtReal(alpha); | |
| 156 | } | ||
| 157 | } | ||
| 158 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
445078 | PetscCall(MatDenseRestoreArrayRead(ctx->S,&S)); |
| 159 |
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.
|
85480 | PetscFunctionReturn(PETSC_SUCCESS); |
| 160 | } | ||
| 161 | |||
| 162 | 288331 | static PetscErrorCode BVOrthogonalizeGS1_Tensor(BV bv,PetscInt k,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm) | |
| 163 | { | ||
| 164 | 288331 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 165 | 288331 | PetscScalar *pS,*cc,*x,dot,sonem=-1.0,sone=1.0,szero=0.0; | |
| 166 | 288331 | PetscInt i,lds = ctx->ld*ctx->d; | |
| 167 | 288331 | PetscBLASInt lds_,k_,one=1; | |
| 168 | 288331 | const PetscScalar *omega; | |
| 169 | |||
| 170 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
288331 | PetscFunctionBegin; |
| 171 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
288331 | PetscCheck(!v,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Orthogonalization against an external vector is not allowed in BVTENSOR"); |
| 172 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
288331 | PetscCall(MatDenseGetArray(ctx->S,&pS)); |
| 173 |
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.
|
288331 | if (!c) PetscCall(VecGetArray(bv->buffer,&cc)); |
| 174 | ✗ | else cc = c; | |
| 175 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
288331 | PetscCall(PetscBLASIntCast(lds,&lds_)); |
| 176 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
288331 | PetscCall(PetscBLASIntCast(k,&k_)); |
| 177 | |||
| 178 |
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.
|
288331 | if (onorm) PetscCall(BVTensorNormColumn(bv,k,onorm)); |
| 179 | |||
| 180 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
288331 | if (ctx->qB) x = ctx->sw; |
| 181 | 199865 | else x = pS+k*lds; | |
| 182 | |||
| 183 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
288331 | if (PetscUnlikely(bv->orthog_type==BV_ORTHOG_MGS)) { /* modified Gram-Schmidt */ |
| 184 | |||
| 185 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
1160 | if (PetscUnlikely(bv->indef)) { /* signature */ |
| 186 | ✗ | PetscCall(VecGetArrayRead(bv->omega,&omega)); | |
| 187 | } | ||
| 188 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16450 | for (i=-bv->nc;i<k;i++) { |
| 189 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15290 | if (which && i>=0 && !which[i]) continue; |
| 190 |
1/22✗ 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.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
15290 | if (ctx->qB) PetscCallBLAS("BLASgemv",BLASgemv_("N",&lds_,&lds_,&sone,ctx->qB,&lds_,pS+k*lds,&one,&szero,x,&one)); |
| 191 | /* c_i = (s_k, s_i) */ | ||
| 192 | 15290 | dot = PetscRealPart(BLASdot_(&lds_,pS+i*lds,&one,x,&one)); | |
| 193 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
15290 | if (bv->indef) dot /= PetscRealPart(omega[i]); |
| 194 |
5/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
21406 | PetscCall(BV_SetValue(bv,i,0,cc,dot)); |
| 195 | /* s_k = s_k - c_i s_i */ | ||
| 196 | 15290 | dot = -dot; | |
| 197 |
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.
|
15290 | PetscCallBLAS("BLASaxpy",BLASaxpy_(&lds_,&dot,pS+i*lds,&one,pS+k*lds,&one)); |
| 198 | } | ||
| 199 |
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.
|
1160 | if (PetscUnlikely(bv->indef)) PetscCall(VecRestoreArrayRead(bv->omega,&omega)); |
| 200 | |||
| 201 | } else { /* classical Gram-Schmidt */ | ||
| 202 |
12/22✓ 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 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
287171 | if (ctx->qB) PetscCallBLAS("BLASgemv",BLASgemv_("N",&lds_,&lds_,&sone,ctx->qB,&lds_,pS+k*lds,&one,&szero,x,&one)); |
| 203 | |||
| 204 | /* cc = S_{0:k-1}^* s_k */ | ||
| 205 |
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.
|
287171 | PetscCallBLAS("BLASgemv",BLASgemv_("C",&lds_,&k_,&sone,pS,&lds_,x,&one,&szero,cc,&one)); |
| 206 | |||
| 207 | /* s_k = s_k - S_{0:k-1} cc */ | ||
| 208 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
322603 | if (PetscUnlikely(bv->indef)) PetscCall(BV_ApplySignature(bv,k,cc,PETSC_TRUE)); |
| 209 |
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.
|
287171 | PetscCallBLAS("BLASgemv",BLASgemv_("N",&lds_,&k_,&sonem,pS,&lds_,cc,&one,&sone,pS+k*lds,&one)); |
| 210 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
322603 | if (PetscUnlikely(bv->indef)) PetscCall(BV_ApplySignature(bv,k,cc,PETSC_FALSE)); |
| 211 | } | ||
| 212 | |||
| 213 |
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.
|
288331 | if (norm) PetscCall(BVTensorNormColumn(bv,k,norm)); |
| 214 |
5/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
403377 | PetscCall(BV_AddCoefficients(bv,k,h,cc)); |
| 215 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
288331 | PetscCall(MatDenseRestoreArray(ctx->S,&pS)); |
| 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.
|
288331 | PetscCall(VecRestoreArray(bv->buffer,&cc)); |
| 217 |
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.
|
55922 | PetscFunctionReturn(PETSC_SUCCESS); |
| 218 | } | ||
| 219 | |||
| 220 | 104 | static PetscErrorCode BVView_Tensor(BV bv,PetscViewer viewer) | |
| 221 | { | ||
| 222 | 104 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 223 | 104 | PetscViewerFormat format; | |
| 224 | 104 | PetscBool isascii; | |
| 225 | 104 | const char *bvname,*uname,*sname; | |
| 226 | |||
| 227 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
104 | PetscFunctionBegin; |
| 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.
|
104 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 229 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
104 | if (isascii) { |
| 230 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(PetscViewerGetFormat(viewer,&format)); |
| 231 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
104 | if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { |
| 232 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(PetscViewerASCIIPrintf(viewer,"number of tensor blocks (degree): %" PetscInt_FMT "\n",ctx->d)); |
| 233 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
104 | PetscCall(PetscViewerASCIIPrintf(viewer,"number of columns of U factor: %" PetscInt_FMT "\n",ctx->ld)); |
| 234 |
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.
|
16 | PetscFunctionReturn(PETSC_SUCCESS); |
| 235 | } | ||
| 236 | ✗ | PetscCall(BVView(ctx->U,viewer)); | |
| 237 | ✗ | PetscCall(MatView(ctx->S,viewer)); | |
| 238 | ✗ | if (format == PETSC_VIEWER_ASCII_MATLAB) { | |
| 239 | ✗ | PetscCall(PetscObjectGetName((PetscObject)bv,&bvname)); | |
| 240 | ✗ | PetscCall(PetscObjectGetName((PetscObject)ctx->U,&uname)); | |
| 241 | ✗ | PetscCall(PetscObjectGetName((PetscObject)ctx->S,&sname)); | |
| 242 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer,"%s=kron(eye(%" PetscInt_FMT "),%s)*%s(:,1:%" PetscInt_FMT ");\n",bvname,ctx->d,uname,sname,bv->k)); | |
| 243 | } | ||
| 244 | } else { | ||
| 245 | ✗ | PetscCall(BVView(ctx->U,viewer)); | |
| 246 | ✗ | PetscCall(MatView(ctx->S,viewer)); | |
| 247 | } | ||
| 248 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 249 | } | ||
| 250 | |||
| 251 | 56633 | static PetscErrorCode BVTensorUpdateMatrix(BV V,PetscInt ini,PetscInt end) | |
| 252 | { | ||
| 253 | 56633 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 254 | 56633 | PetscInt i,j,r,c,l,k,ld=ctx->ld,lds=ctx->d*ctx->ld; | |
| 255 | 56633 | PetscScalar *qB,*sqB; | |
| 256 | 56633 | Vec u; | |
| 257 | 56633 | Mat A; | |
| 258 | |||
| 259 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
56633 | PetscFunctionBegin; |
| 260 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
56633 | if (!V->matrix) PetscFunctionReturn(PETSC_SUCCESS); |
| 261 | 44407 | l = ctx->U->l; k = ctx->U->k; | |
| 262 | /* update inner product matrix */ | ||
| 263 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
44407 | if (!ctx->qB) { |
| 264 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(PetscCalloc2(lds*lds,&ctx->qB,lds,&ctx->sw)); |
| 265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(BVCreateVec(ctx->U,&ctx->u)); |
| 266 | } | ||
| 267 | 44407 | ctx->U->l = 0; | |
| 268 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
133221 | for (r=0;r<ctx->d;r++) { |
| 269 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
222035 | for (c=0;c<=r;c++) { |
| 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.
|
133221 | PetscCall(MatNestGetSubMat(V->matrix,r,c,&A)); |
| 271 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
133221 | if (A) { |
| 272 | 89094 | qB = ctx->qB+c*ld*lds+r*ld; | |
| 273 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
179398 | for (i=ini;i<end;i++) { |
| 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.
|
90304 | PetscCall(BVGetColumn(ctx->U,i,&u)); |
| 275 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
90304 | PetscCall(MatMult(A,u,ctx->u)); |
| 276 | 90304 | ctx->U->k = i+1; | |
| 277 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
90304 | PetscCall(BVDotVec(ctx->U,ctx->u,qB+i*lds)); |
| 278 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
90304 | PetscCall(BVRestoreColumn(ctx->U,i,&u)); |
| 279 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2094316 | for (j=0;j<i;j++) qB[i+j*lds] = PetscConj(qB[j+i*lds]); |
| 280 | 44984 | qB[i*lds+i] = PetscRealPart(qB[i+i*lds]); | |
| 281 | } | ||
| 282 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
89094 | if (PetscUnlikely(c!=r)) { |
| 283 | 560 | sqB = ctx->qB+r*ld*lds+c*ld; | |
| 284 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
7960 | for (i=ini;i<end;i++) for (j=0;j<=i;j++) { |
| 285 | 6840 | sqB[i+j*lds] = PetscConj(qB[j+i*lds]); | |
| 286 | 6840 | sqB[j+i*lds] = qB[j+i*lds]; | |
| 287 | } | ||
| 288 | } | ||
| 289 | } | ||
| 290 | } | ||
| 291 | } | ||
| 292 | 44407 | ctx->U->l = l; ctx->U->k = k; | |
| 293 |
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.
|
44407 | PetscFunctionReturn(PETSC_SUCCESS); |
| 294 | } | ||
| 295 | |||
| 296 | 1685 | static PetscErrorCode BVTensorBuildFirstColumn_Tensor(BV V,PetscInt k) | |
| 297 | { | ||
| 298 | 1685 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 299 | 1685 | PetscInt i,nq=0; | |
| 300 | 1685 | PetscScalar *pS,*omega; | |
| 301 | 1685 | PetscReal norm; | |
| 302 | 1685 | PetscBool breakdown=PETSC_FALSE; | |
| 303 | |||
| 304 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1685 | PetscFunctionBegin; |
| 305 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1685 | PetscCall(MatDenseGetArray(ctx->S,&pS)); |
| 306 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9231 | for (i=0;i<ctx->d;i++) { |
| 307 |
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.
|
7546 | if (i>=k) PetscCall(BVSetRandomColumn(ctx->U,nq)); |
| 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.
|
370 | else PetscCall(BVCopyColumn(ctx->U,i,nq)); |
| 309 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7546 | PetscCall(BVOrthogonalizeColumn(ctx->U,nq,pS+i*ctx->ld,&norm,&breakdown)); |
| 310 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
7546 | if (!breakdown) { |
| 311 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
7541 | PetscCall(BVScaleColumn(ctx->U,nq,1.0/norm)); |
| 312 | 7541 | pS[nq+i*ctx->ld] = norm; | |
| 313 | 7541 | nq++; | |
| 314 | } | ||
| 315 | } | ||
| 316 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1685 | PetscCall(MatDenseRestoreArray(ctx->S,&pS)); |
| 317 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1685 | PetscCheck(nq,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_SIZ,"Cannot build first column of tensor BV; U should contain k=%" PetscInt_FMT " nonzero columns",k); |
| 318 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1685 | PetscCall(BVTensorUpdateMatrix(V,0,nq)); |
| 319 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1685 | PetscCall(BVTensorNormColumn(V,0,&norm)); |
| 320 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1685 | PetscCall(BVScale_Tensor(V,0,1.0/norm)); |
| 321 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1685 | if (V->indef) { |
| 322 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(BV_AllocateSignature(V)); |
| 323 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(VecGetArray(V->omega,&omega)); |
| 324 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
343 | omega[0] = (norm<0.0)? -1.0: 1.0; |
| 325 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(VecRestoreArray(V->omega,&omega)); |
| 326 | } | ||
| 327 | /* set active columns */ | ||
| 328 | 1685 | ctx->U->l = 0; | |
| 329 | 1685 | ctx->U->k = nq; | |
| 330 |
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.
|
1685 | PetscFunctionReturn(PETSC_SUCCESS); |
| 331 | } | ||
| 332 | |||
| 333 | /*@ | ||
| 334 | BVTensorBuildFirstColumn - Builds the first column of the tensor basis vectors | ||
| 335 | `V` from the data contained in the first `k` columns of `U`. | ||
| 336 | |||
| 337 | Collective | ||
| 338 | |||
| 339 | Input Parameters: | ||
| 340 | + V - the basis vectors context | ||
| 341 | - k - the number of columns of `U` with relevant information | ||
| 342 | |||
| 343 | Notes: | ||
| 344 | At most $d$ columns are considered, where $d$ is the degree of the tensor `BV`. | ||
| 345 | Given $V = (I \otimes U) S$, this function computes the first column of $V$, that | ||
| 346 | is, it computes the coefficients of the first column of $S$ by orthogonalizing | ||
| 347 | the first $d$ columns of $U$. If `k` is less than $d$ (or linearly dependent columns | ||
| 348 | are found) then additional random columns are used. | ||
| 349 | |||
| 350 | The computed column has unit norm. | ||
| 351 | |||
| 352 | Level: advanced | ||
| 353 | |||
| 354 | .seealso: [](sec:bv), `BVTENSOR`, `BVCreateTensor()`, `BVTensorGetDegree()` | ||
| 355 | @*/ | ||
| 356 | 1685 | PetscErrorCode BVTensorBuildFirstColumn(BV V,PetscInt k) | |
| 357 | { | ||
| 358 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1685 | PetscFunctionBegin; |
| 359 |
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.
|
1685 | PetscValidHeaderSpecific(V,BV_CLASSID,1); |
| 360 |
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.
|
1685 | PetscValidLogicalCollectiveInt(V,k,2); |
| 361 |
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.
|
1685 | PetscUseMethod(V,"BVTensorBuildFirstColumn_C",(BV,PetscInt),(V,k)); |
| 362 |
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.
|
1685 | PetscFunctionReturn(PETSC_SUCCESS); |
| 363 | } | ||
| 364 | |||
| 365 | 12698 | static PetscErrorCode BVTensorCompress_Tensor(BV V,PetscInt newc) | |
| 366 | { | ||
| 367 | 12698 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 368 | 12698 | PetscInt nwu=0,nnc,nrow,lwa,r,c; | |
| 369 | 12698 | PetscInt i,j,k,n,lds=ctx->ld*ctx->d,deg=ctx->d,lock,cs1=V->k,rs1=ctx->U->k,rk=0,offu; | |
| 370 | 12698 | PetscScalar *S,*M,*Z,*pQ,*SS,*SS2,t,sone=1.0,zero=0.0,mone=-1.0,*p,*tau,*work,*qB,*sqB; | |
| 371 | 12698 | PetscReal *sg,tol,*rwork; | |
| 372 | 12698 | PetscBLASInt ld_,cs1_,rs1_,cs1tdeg,n_,info,lw_,newc_,newctdeg,nnc_,nrow_,nnctdeg,lds_,rk_; | |
| 373 | 12698 | Mat Q,A; | |
| 374 | |||
| 375 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12698 | PetscFunctionBegin; |
| 376 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
12698 | if (!cs1) PetscFunctionReturn(PETSC_SUCCESS); |
| 377 | 12658 | lwa = 6*ctx->ld*lds+2*cs1; | |
| 378 | 12658 | n = PetscMin(rs1,deg*cs1); | |
| 379 | 12658 | lock = ctx->U->l; | |
| 380 | 12658 | nnc = cs1-lock-newc; | |
| 381 | 12658 | nrow = rs1-lock; | |
| 382 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscCalloc6(deg*newc*nnc,&SS,newc*nnc,&SS2,(rs1+lock+newc)*n,&pQ,deg*rs1,&tau,lwa,&work,6*n,&rwork)); |
| 383 | 12658 | offu = lock*(rs1+1); | |
| 384 | 12658 | M = work+nwu; | |
| 385 | 12658 | nwu += rs1*cs1*deg; | |
| 386 | 12658 | sg = rwork; | |
| 387 | 12658 | Z = work+nwu; | |
| 388 | 12658 | nwu += deg*cs1*n; | |
| 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.
|
12658 | PetscCall(PetscBLASIntCast(n,&n_)); |
| 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.
|
12658 | PetscCall(PetscBLASIntCast(nnc,&nnc_)); |
| 391 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(cs1,&cs1_)); |
| 392 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(rs1,&rs1_)); |
| 393 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(newc,&newc_)); |
| 394 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(newc*deg,&newctdeg)); |
| 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.
|
12658 | PetscCall(PetscBLASIntCast(nnc*deg,&nnctdeg)); |
| 396 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(cs1*deg,&cs1tdeg)); |
| 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.
|
12658 | PetscCall(PetscBLASIntCast(lwa-nwu,&lw_)); |
| 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.
|
12658 | PetscCall(PetscBLASIntCast(nrow,&nrow_)); |
| 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.
|
12658 | PetscCall(PetscBLASIntCast(lds,&lds_)); |
| 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.
|
12658 | PetscCall(MatDenseGetArray(ctx->S,&S)); |
| 401 | |||
| 402 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12658 | if (newc>0) { |
| 403 | /* truncate columns associated with new converged eigenpairs */ | ||
| 404 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20480 | for (j=0;j<deg;j++) { |
| 405 |
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.
|
69361 | for (i=lock;i<lock+newc;i++) PetscCall(PetscArraycpy(M+(i-lock+j*newc)*nrow,S+i*lds+j*ctx->ld+lock,nrow)); |
| 406 | } | ||
| 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.
|
3088 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
| 408 | #if !defined (PETSC_USE_COMPLEX) | ||
| 409 |
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.
|
1536 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("S","S",&nrow_,&newctdeg,M,&nrow_,sg,pQ+offu,&rs1_,Z,&n_,work+nwu,&lw_,&info)); |
| 410 | #else | ||
| 411 |
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.
|
1552 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("S","S",&nrow_,&newctdeg,M,&nrow_,sg,pQ+offu,&rs1_,Z,&n_,work+nwu,&lw_,rwork+n,&info)); |
| 412 | #endif | ||
| 413 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3088 | SlepcCheckLapackInfo("gesvd",info); |
| 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.
|
3088 | PetscCall(PetscFPTrapPop()); |
| 415 | /* SVD has rank min(newc,nrow) */ | ||
| 416 | 3088 | rk = PetscMin(newc,nrow); | |
| 417 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
18500 | for (i=0;i<rk;i++) { |
| 418 | 15412 | t = sg[i]; | |
| 419 |
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.
|
15412 | PetscCallBLAS("BLASscal",BLASscal_(&newctdeg,&t,Z+i,&n_)); |
| 420 | } | ||
| 421 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20480 | for (i=0;i<deg;i++) { |
| 422 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
69361 | for (j=lock;j<lock+newc;j++) { |
| 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.
|
51969 | PetscCall(PetscArraycpy(S+j*lds+i*ctx->ld+lock,Z+(newc*i+j-lock)*n,rk)); |
| 424 |
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.
|
67753 | PetscCall(PetscArrayzero(S+j*lds+i*ctx->ld+lock+rk,(ctx->ld-lock-rk))); |
| 425 | } | ||
| 426 | } | ||
| 427 | /* | ||
| 428 | update columns associated with non-converged vectors, orthogonalize | ||
| 429 | against pQ so that next M has rank nnc+d-1 instead of nrow+d-1 | ||
| 430 | */ | ||
| 431 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20480 | for (i=0;i<deg;i++) { |
| 432 |
13/22✓ 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 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
17392 | PetscCallBLAS("BLASgemm",BLASgemm_("C","N",&newc_,&nnc_,&nrow_,&sone,pQ+offu,&rs1_,S+(lock+newc)*lds+i*ctx->ld+lock,&lds_,&zero,PetscSafePointerPlusOffset(SS,i*nnc*newc),&newc_)); |
| 433 |
13/22✓ 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 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
17392 | PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&nrow_,&nnc_,&newc_,&mone,pQ+offu,&rs1_,PetscSafePointerPlusOffset(SS,i*nnc*newc),&newc_,&sone,S+(lock+newc)*lds+i*ctx->ld+lock,&lds_)); |
| 434 | /* repeat orthogonalization step */ | ||
| 435 |
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.
|
17392 | PetscCallBLAS("BLASgemm",BLASgemm_("C","N",&newc_,&nnc_,&nrow_,&sone,pQ+offu,&rs1_,S+(lock+newc)*lds+i*ctx->ld+lock,&lds_,&zero,SS2,&newc_)); |
| 436 |
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.
|
17392 | PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&nrow_,&nnc_,&newc_,&mone,pQ+offu,&rs1_,SS2,&newc_,&sone,S+(lock+newc)*lds+i*ctx->ld+lock,&lds_)); |
| 437 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
172328 | for (j=0;j<newc*nnc;j++) *(SS+i*newc*nnc+j) += SS2[j]; |
| 438 | } | ||
| 439 | } | ||
| 440 | |||
| 441 | /* truncate columns associated with non-converged eigenpairs */ | ||
| 442 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
67758 | for (j=0;j<deg;j++) { |
| 443 |
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.
|
547714 | for (i=lock+newc;i<cs1;i++) PetscCall(PetscArraycpy(M+(i-lock-newc+j*nnc)*nrow,S+i*lds+j*ctx->ld+lock,nrow)); |
| 444 | } | ||
| 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.
|
12658 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
| 446 | #if !defined (PETSC_USE_COMPLEX) | ||
| 447 |
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.
|
6206 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("S","S",&nrow_,&nnctdeg,M,&nrow_,sg,pQ+offu+newc*rs1,&rs1_,Z,&n_,work+nwu,&lw_,&info)); |
| 448 | #else | ||
| 449 |
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.
|
6452 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("S","S",&nrow_,&nnctdeg,M,&nrow_,sg,pQ+offu+newc*rs1,&rs1_,Z,&n_,work+nwu,&lw_,rwork+n,&info)); |
| 450 | #endif | ||
| 451 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12658 | SlepcCheckLapackInfo("gesvd",info); |
| 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.
|
12658 | PetscCall(PetscFPTrapPop()); |
| 453 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12658 | tol = PetscMax(rs1,deg*cs1)*PETSC_MACHINE_EPSILON*sg[0]; |
| 454 | 12658 | rk = 0; | |
| 455 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
282984 | for (i=0;i<PetscMin(nrow,nnctdeg);i++) if (sg[i]>tol) rk++; |
| 456 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12658 | rk = PetscMin(nnc+deg-1,rk); |
| 457 | /* the SVD has rank (at most) nnc+deg-1 */ | ||
| 458 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
175211 | for (i=0;i<rk;i++) { |
| 459 | 162553 | t = sg[i]; | |
| 460 |
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.
|
162553 | PetscCallBLAS("BLASscal",BLASscal_(&nnctdeg,&t,Z+i,&n_)); |
| 461 | } | ||
| 462 | /* update S */ | ||
| 463 |
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.
|
12658 | PetscCall(PetscArrayzero(S+cs1*lds,(V->m-cs1)*lds)); |
| 464 | 12658 | k = ctx->ld-lock-newc-rk; | |
| 465 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
67758 | for (i=0;i<deg;i++) { |
| 466 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
547714 | for (j=lock+newc;j<cs1;j++) { |
| 467 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
492614 | PetscCall(PetscArraycpy(S+j*lds+i*ctx->ld+lock+newc,Z+(nnc*i+j-lock-newc)*n,rk)); |
| 468 |
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.
|
645794 | PetscCall(PetscArrayzero(S+j*lds+i*ctx->ld+lock+newc+rk,k)); |
| 469 | } | ||
| 470 | } | ||
| 471 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12658 | if (newc>0) { |
| 472 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20480 | for (i=0;i<deg;i++) { |
| 473 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
17392 | p = PetscSafePointerPlusOffset(SS,i*nnc*newc); |
| 474 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
112920 | for (j=lock+newc;j<cs1;j++) { |
| 475 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
250464 | for (k=0;k<newc;k++) S[j*lds+i*ctx->ld+lock+k] = *(p++); |
| 476 | } | ||
| 477 | } | ||
| 478 | } | ||
| 479 | |||
| 480 | /* orthogonalize pQ */ | ||
| 481 | 12658 | rk = rk+newc; | |
| 482 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(rk,&rk_)); |
| 483 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscBLASIntCast(cs1-lock,&nnc_)); |
| 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.
|
12658 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
| 485 |
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.
|
12658 | PetscCallBLAS("LAPACKgeqrf",LAPACKgeqrf_(&nrow_,&rk_,pQ+offu,&rs1_,tau,work+nwu,&lw_,&info)); |
| 486 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12658 | SlepcCheckLapackInfo("geqrf",info); |
| 487 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
67758 | for (i=0;i<deg;i++) { |
| 488 |
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.
|
55100 | PetscCallBLAS("BLAStrmm",BLAStrmm_("L","U","N","N",&rk_,&nnc_,&sone,pQ+offu,&rs1_,S+lock*lds+lock+i*ctx->ld,&lds_)); |
| 489 | } | ||
| 490 |
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.
|
12658 | PetscCallBLAS("LAPACKorgqr",LAPACKorgqr_(&nrow_,&rk_,&rk_,pQ+offu,&rs1_,tau,work+nwu,&lw_,&info)); |
| 491 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12658 | SlepcCheckLapackInfo("orgqr",info); |
| 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.
|
12658 | PetscCall(PetscFPTrapPop()); |
| 493 | |||
| 494 | /* update vectors U(:,idx) = U*Q(:,idx) */ | ||
| 495 | 12658 | rk = rk+lock; | |
| 496 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
27852 | for (i=0;i<lock;i++) pQ[i*(1+rs1)] = 1.0; |
| 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.
|
12658 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,rs1,rk,pQ,&Q)); |
| 498 | 12658 | ctx->U->k = rs1; | |
| 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.
|
12658 | PetscCall(BVMultInPlace(ctx->U,Q,lock,rk)); |
| 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.
|
12658 | PetscCall(MatDestroy(&Q)); |
| 501 | |||
| 502 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12658 | if (ctx->qB) { |
| 503 | /* update matrix qB */ | ||
| 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.
|
3675 | PetscCall(PetscBLASIntCast(ctx->ld,&ld_)); |
| 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.
|
3675 | PetscCall(PetscBLASIntCast(rk,&rk_)); |
| 506 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11025 | for (r=0;r<ctx->d;r++) { |
| 507 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
18375 | for (c=0;c<=r;c++) { |
| 508 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11025 | PetscCall(MatNestGetSubMat(V->matrix,r,c,&A)); |
| 509 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
11025 | if (A) { |
| 510 | 7380 | qB = ctx->qB+r*ctx->ld+c*ctx->ld*lds; | |
| 511 |
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.
|
7380 | PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&rs1_,&rk_,&rs1_,&sone,qB,&lds_,pQ,&rs1_,&zero,work+nwu,&rs1_)); |
| 512 |
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.
|
7380 | PetscCallBLAS("BLASgemm",BLASgemm_("C","N",&rk_,&rk_,&rs1_,&sone,pQ,&rs1_,work+nwu,&rs1_,&zero,qB,&lds_)); |
| 513 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
125010 | for (i=0;i<rk;i++) { |
| 514 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1191800 | for (j=0;j<i;j++) qB[i+j*lds] = PetscConj(qB[j+i*lds]); |
| 515 | 117630 | qB[i+i*lds] = PetscRealPart(qB[i+i*lds]); | |
| 516 | } | ||
| 517 |
7/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 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.
|
120666 | for (i=rk;i<ctx->ld;i++) PetscCall(PetscArrayzero(qB+i*lds,ctx->ld)); |
| 518 |
7/8✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 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.
|
125010 | for (i=0;i<rk;i++) PetscCall(PetscArrayzero(qB+i*lds+rk,(ctx->ld-rk))); |
| 519 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
7380 | if (c!=r) { |
| 520 | 60 | sqB = ctx->qB+r*ctx->ld*lds+c*ctx->ld; | |
| 521 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
25260 | for (i=0;i<ctx->ld;i++) for (j=0;j<ctx->ld;j++) sqB[i+j*lds] = PetscConj(qB[j+i*lds]); |
| 522 | } | ||
| 523 | } | ||
| 524 | } | ||
| 525 | } | ||
| 526 | } | ||
| 527 | |||
| 528 | /* free work space */ | ||
| 529 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(PetscFree6(SS,SS2,pQ,tau,work,rwork)); |
| 530 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
12658 | PetscCall(MatDenseRestoreArray(ctx->S,&S)); |
| 531 | |||
| 532 | /* set active columns */ | ||
| 533 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12658 | if (newc) ctx->U->l += newc; |
| 534 | 12658 | ctx->U->k = rk; | |
| 535 |
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.
|
12658 | PetscFunctionReturn(PETSC_SUCCESS); |
| 536 | } | ||
| 537 | |||
| 538 | /*@ | ||
| 539 | BVTensorCompress - Updates the $U$ and $S$ factors of the tensor basis vectors | ||
| 540 | object `V` by means of an SVD, removing redundant information. | ||
| 541 | |||
| 542 | Collective | ||
| 543 | |||
| 544 | Input Parameters: | ||
| 545 | + V - the tensor basis vectors context | ||
| 546 | - newc - additional columns to be locked | ||
| 547 | |||
| 548 | Notes: | ||
| 549 | This function is typically used when restarting Krylov solvers. Truncating a | ||
| 550 | tensor `BV` $V = (I \otimes U) S$ to its leading columns amounts to keeping the | ||
| 551 | leading columns of $S$. However, to effectively reduce the size of the | ||
| 552 | decomposition, it is necessary to compress it in a way that fewer columns of | ||
| 553 | $U$ are employed. This can be achieved by means of an update that involves the | ||
| 554 | SVD of the low-rank matrix $[S_0, S_1, \dots, S_{d-1}]$, where $S_i$ are the pieces of $S$. | ||
| 555 | |||
| 556 | If `newc` is nonzero, then `newc` columns are added to the leading columns of `V`. | ||
| 557 | This means that the corresponding columns of the $U$ and $S$ factors will remain | ||
| 558 | invariant in subsequent operations. | ||
| 559 | |||
| 560 | Level: advanced | ||
| 561 | |||
| 562 | .seealso: [](sec:bv), `BVTENSOR`, `BVCreateTensor()`, `BVSetActiveColumns()` | ||
| 563 | @*/ | ||
| 564 | 12698 | PetscErrorCode BVTensorCompress(BV V,PetscInt newc) | |
| 565 | { | ||
| 566 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
12698 | PetscFunctionBegin; |
| 567 |
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.
|
12698 | PetscValidHeaderSpecific(V,BV_CLASSID,1); |
| 568 |
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.
|
12698 | PetscValidLogicalCollectiveInt(V,newc,2); |
| 569 |
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.
|
12698 | PetscUseMethod(V,"BVTensorCompress_C",(BV,PetscInt),(V,newc)); |
| 570 |
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.
|
12698 | PetscFunctionReturn(PETSC_SUCCESS); |
| 571 | } | ||
| 572 | |||
| 573 | 3163 | static PetscErrorCode BVTensorGetDegree_Tensor(BV bv,PetscInt *d) | |
| 574 | { | ||
| 575 | 3163 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 576 | |||
| 577 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3163 | PetscFunctionBegin; |
| 578 | 3163 | *d = ctx->d; | |
| 579 |
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.
|
3163 | PetscFunctionReturn(PETSC_SUCCESS); |
| 580 | } | ||
| 581 | |||
| 582 | /*@ | ||
| 583 | BVTensorGetDegree - Returns the number of blocks (degree) of the tensor `BV`. | ||
| 584 | |||
| 585 | Not Collective | ||
| 586 | |||
| 587 | Input Parameter: | ||
| 588 | . bv - the basis vectors context | ||
| 589 | |||
| 590 | Output Parameter: | ||
| 591 | . d - the degree | ||
| 592 | |||
| 593 | Level: advanced | ||
| 594 | |||
| 595 | .seealso: [](sec:bv), `BVTENSOR`, `BVCreateTensor()` | ||
| 596 | @*/ | ||
| 597 | 3163 | PetscErrorCode BVTensorGetDegree(BV bv,PetscInt *d) | |
| 598 | { | ||
| 599 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3163 | PetscFunctionBegin; |
| 600 |
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.
|
3163 | PetscValidHeaderSpecific(bv,BV_CLASSID,1); |
| 601 |
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.
|
3163 | PetscAssertPointer(d,2); |
| 602 |
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.
|
3163 | PetscUseMethod(bv,"BVTensorGetDegree_C",(BV,PetscInt*),(bv,d)); |
| 603 |
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.
|
3163 | PetscFunctionReturn(PETSC_SUCCESS); |
| 604 | } | ||
| 605 | |||
| 606 | 54948 | static PetscErrorCode BVTensorGetFactors_Tensor(BV V,BV *U,Mat *S) | |
| 607 | { | ||
| 608 | 54948 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 609 | |||
| 610 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54948 | PetscFunctionBegin; |
| 611 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
54948 | PetscCheck(ctx->puk==-1,PetscObjectComm((PetscObject)V),PETSC_ERR_ORDER,"Previous call to BVTensonGetFactors without a BVTensorRestoreFactors call"); |
| 612 | 54948 | ctx->puk = ctx->U->k; | |
| 613 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54948 | if (U) *U = ctx->U; |
| 614 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
54948 | if (S) *S = ctx->S; |
| 615 |
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.
|
10896 | PetscFunctionReturn(PETSC_SUCCESS); |
| 616 | } | ||
| 617 | |||
| 618 | /*@ | ||
| 619 | BVTensorGetFactors - Returns the two factors involved in the definition of the | ||
| 620 | tensor basis vectors object, $V = (I \otimes U) S$. | ||
| 621 | |||
| 622 | Logically Collective | ||
| 623 | |||
| 624 | Input Parameter: | ||
| 625 | . V - the basis vectors context | ||
| 626 | |||
| 627 | Output Parameters: | ||
| 628 | + U - the `BV` factor | ||
| 629 | - S - the `Mat` factor | ||
| 630 | |||
| 631 | Notes: | ||
| 632 | The returned factors are references (not copies) of the internal factors, | ||
| 633 | so modifying them will change the tensor `BV` as well. Some operations of the | ||
| 634 | tensor `BV` assume that `U` has orthonormal columns, so if the user modifies `U` | ||
| 635 | this restriction must be taken into account. | ||
| 636 | |||
| 637 | The returned factors must not be destroyed. `BVTensorRestoreFactors()` must | ||
| 638 | be called when they are no longer needed. | ||
| 639 | |||
| 640 | Pass `NULL` for any of the arguments that is not needed. | ||
| 641 | |||
| 642 | Level: advanced | ||
| 643 | |||
| 644 | .seealso: [](sec:bv), `BVTENSOR`, `BVCreateTensor()`, `BVTensorRestoreFactors()` | ||
| 645 | @*/ | ||
| 646 | 54948 | PetscErrorCode BVTensorGetFactors(BV V,BV *U,Mat *S) | |
| 647 | { | ||
| 648 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54948 | PetscFunctionBegin; |
| 649 |
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.
|
54948 | PetscValidHeaderSpecific(V,BV_CLASSID,1); |
| 650 |
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.
|
54948 | PetscUseMethod(V,"BVTensorGetFactors_C",(BV,BV*,Mat*),(V,U,S)); |
| 651 |
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.
|
54948 | PetscFunctionReturn(PETSC_SUCCESS); |
| 652 | } | ||
| 653 | |||
| 654 | 54948 | static PetscErrorCode BVTensorRestoreFactors_Tensor(BV V,BV *U,Mat *S) | |
| 655 | { | ||
| 656 | 54948 | BV_TENSOR *ctx = (BV_TENSOR*)V->data; | |
| 657 | |||
| 658 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54948 | PetscFunctionBegin; |
| 659 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
54948 | PetscCall(PetscObjectStateIncrease((PetscObject)V)); |
| 660 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54948 | if (U) *U = NULL; |
| 661 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
54948 | if (S) *S = NULL; |
| 662 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
54948 | PetscCall(BVTensorUpdateMatrix(V,ctx->puk,ctx->U->k)); |
| 663 | 54948 | ctx->puk = -1; | |
| 664 |
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.
|
54948 | PetscFunctionReturn(PETSC_SUCCESS); |
| 665 | } | ||
| 666 | |||
| 667 | /*@ | ||
| 668 | BVTensorRestoreFactors - Restore the two factors that were obtained with | ||
| 669 | `BVTensorGetFactors()`. | ||
| 670 | |||
| 671 | Logically Collective | ||
| 672 | |||
| 673 | Input Parameters: | ||
| 674 | + V - the basis vectors context | ||
| 675 | . U - the `BV` factor (or `NULL`) | ||
| 676 | - S - the `Mat` factor (or `NULL`) | ||
| 677 | |||
| 678 | Notes: | ||
| 679 | The arguments must match the corresponding call to `BVTensorGetFactors()`. | ||
| 680 | |||
| 681 | Level: advanced | ||
| 682 | |||
| 683 | .seealso: [](sec:bv), `BVTENSOR`, `BVTensorGetFactors()` | ||
| 684 | @*/ | ||
| 685 | 54948 | PetscErrorCode BVTensorRestoreFactors(BV V,BV *U,Mat *S) | |
| 686 | { | ||
| 687 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
54948 | PetscFunctionBegin; |
| 688 |
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.
|
54948 | PetscValidHeaderSpecific(V,BV_CLASSID,1); |
| 689 |
5/18✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
54948 | if (U) PetscValidHeaderSpecific(*U,BV_CLASSID,2); |
| 690 |
4/18✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
54948 | if (S) PetscValidHeaderSpecific(*S,MAT_CLASSID,3); |
| 691 |
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.
|
54948 | PetscUseMethod(V,"BVTensorRestoreFactors_C",(BV,BV*,Mat*),(V,U,S)); |
| 692 |
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.
|
54948 | PetscFunctionReturn(PETSC_SUCCESS); |
| 693 | } | ||
| 694 | |||
| 695 | 1765 | static PetscErrorCode BVDestroy_Tensor(BV bv) | |
| 696 | { | ||
| 697 | 1765 | BV_TENSOR *ctx = (BV_TENSOR*)bv->data; | |
| 698 | |||
| 699 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1765 | PetscFunctionBegin; |
| 700 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVDestroy(&ctx->U)); |
| 701 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(MatDestroy(&ctx->S)); |
| 702 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1765 | if (ctx->u) { |
| 703 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(PetscFree2(ctx->qB,ctx->sw)); |
| 704 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
343 | PetscCall(VecDestroy(&ctx->u)); |
| 705 | } | ||
| 706 |
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.
|
1765 | PetscCall(PetscFree(bv->data)); |
| 707 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorBuildFirstColumn_C",NULL)); |
| 708 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorCompress_C",NULL)); |
| 709 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorGetDegree_C",NULL)); |
| 710 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorGetFactors_C",NULL)); |
| 711 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorRestoreFactors_C",NULL)); |
| 712 |
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.
|
337 | PetscFunctionReturn(PETSC_SUCCESS); |
| 713 | } | ||
| 714 | |||
| 715 | /*MC | ||
| 716 | BVTENSOR - BVTENSOR = "tensor" - A special basis vectors object represented | ||
| 717 | in compact form as $V = (I \otimes U) S$. | ||
| 718 | |||
| 719 | Level: beginner | ||
| 720 | |||
| 721 | Note: | ||
| 722 | This is not a general-purpose `BV` and cannot be used interchangeably with other | ||
| 723 | `BV` types. It is intended to store structured Krylov bases for eigensolvers | ||
| 724 | based on linearization. | ||
| 725 | |||
| 726 | .seealso: [](sec:bv), `BV`, `BVType`, `BVSetType()`, `BVCreateTensor()` | ||
| 727 | M*/ | ||
| 728 | |||
| 729 | 1765 | SLEPC_EXTERN PetscErrorCode BVCreate_Tensor(BV bv) | |
| 730 | { | ||
| 731 | 1765 | BV_TENSOR *ctx; | |
| 732 | |||
| 733 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1765 | PetscFunctionBegin; |
| 734 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscNew(&ctx)); |
| 735 | 1765 | bv->data = (void*)ctx; | |
| 736 | 1765 | ctx->puk = -1; | |
| 737 | |||
| 738 | 1765 | bv->ops->multinplace = BVMultInPlace_Tensor; | |
| 739 | 1765 | bv->ops->multinplacetrans = BVMultInPlaceHermitianTranspose_Tensor; | |
| 740 | 1765 | bv->ops->dot = BVDot_Tensor; | |
| 741 | 1765 | bv->ops->scale = BVScale_Tensor; | |
| 742 | 1765 | bv->ops->norm = BVNorm_Tensor; | |
| 743 | 1765 | bv->ops->copycolumn = BVCopyColumn_Tensor; | |
| 744 | 1765 | bv->ops->gramschmidt = BVOrthogonalizeGS1_Tensor; | |
| 745 | 1765 | bv->ops->destroy = BVDestroy_Tensor; | |
| 746 | 1765 | bv->ops->view = BVView_Tensor; | |
| 747 | |||
| 748 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorBuildFirstColumn_C",BVTensorBuildFirstColumn_Tensor)); |
| 749 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorCompress_C",BVTensorCompress_Tensor)); |
| 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.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorGetDegree_C",BVTensorGetDegree_Tensor)); |
| 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.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorGetFactors_C",BVTensorGetFactors_Tensor)); |
| 752 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorRestoreFactors_C",BVTensorRestoreFactors_Tensor)); |
| 753 |
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.
|
337 | PetscFunctionReturn(PETSC_SUCCESS); |
| 754 | } | ||
| 755 | |||
| 756 | /*@ | ||
| 757 | BVCreateTensor - Creates a tensor `BV` that is represented in compact form | ||
| 758 | as $V = (I \otimes U) S$, where $U$ has orthonormal columns. | ||
| 759 | |||
| 760 | Collective | ||
| 761 | |||
| 762 | Input Parameters: | ||
| 763 | + U - a basis vectors object | ||
| 764 | - d - the number of blocks (degree) of the tensor `BV` | ||
| 765 | |||
| 766 | Output Parameter: | ||
| 767 | . V - the new basis vectors context | ||
| 768 | |||
| 769 | Notes: | ||
| 770 | The new basis vectors object is $V = (I \otimes U) S$, where $\otimes$ denotes | ||
| 771 | the Kronecker product, $I$ is the identity matrix of order $d$, and $S$ is a | ||
| 772 | sequential matrix allocated internally. This compact representation is | ||
| 773 | used, e.g., to represent the Krylov basis generated with the linearization | ||
| 774 | of a matrix polynomial of degree $d$. | ||
| 775 | |||
| 776 | The size of `V` (number of rows) is equal to `d` times `n`, where `n` is the size | ||
| 777 | of `U`. Matrix $S$ has $d \times m$ rows and $m-d+1$ columns, where `m` is | ||
| 778 | the number of columns of `U`, so `m` should be at least `d`. | ||
| 779 | |||
| 780 | The communicator of `V` will be the same as `U`. | ||
| 781 | |||
| 782 | On input, the content of `U` is irrelevant. Alternatively, it may contain | ||
| 783 | some nonzero columns that will be used by `BVTensorBuildFirstColumn()`. | ||
| 784 | |||
| 785 | Level: advanced | ||
| 786 | |||
| 787 | .seealso: [](sec:bv), `BVTensorGetDegree()`, `BVTensorGetFactors()`, `BVTensorBuildFirstColumn()` | ||
| 788 | @*/ | ||
| 789 | 1765 | PetscErrorCode BVCreateTensor(BV U,PetscInt d,BV *V) | |
| 790 | { | ||
| 791 | 1765 | PetscBool match; | |
| 792 | 1765 | PetscInt n,N,m; | |
| 793 | 1765 | VecType vtype; | |
| 794 | 1765 | BV_TENSOR *ctx; | |
| 795 | |||
| 796 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1765 | PetscFunctionBegin; |
| 797 |
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.
|
1765 | PetscValidHeaderSpecific(U,BV_CLASSID,1); |
| 798 |
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.
|
1765 | PetscValidLogicalCollectiveInt(U,d,2); |
| 799 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectTypeCompare((PetscObject)U,BVTENSOR,&match)); |
| 800 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1765 | PetscCheck(!match,PetscObjectComm((PetscObject)U),PETSC_ERR_SUP,"U cannot be of type tensor"); |
| 801 | |||
| 802 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVCreate(PetscObjectComm((PetscObject)U),V)); |
| 803 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVGetSizes(U,&n,&N,&m)); |
| 804 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1765 | PetscCheck(m>=d,PetscObjectComm((PetscObject)U),PETSC_ERR_ARG_SIZ,"U has %" PetscInt_FMT " columns, it should have at least d=%" PetscInt_FMT,m,d); |
| 805 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVSetSizes(*V,d*n,d*N,m-d+1)); |
| 806 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVGetVecType(U,&vtype)); |
| 807 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVSetVecType(*V,vtype)); |
| 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.
|
1765 | PetscCall(PetscObjectChangeTypeName((PetscObject)*V,BVTENSOR)); |
| 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.
|
1765 | PetscCall(PetscLogEventBegin(BV_Create,*V,0,0,0)); |
| 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.
|
1765 | PetscCall(BVCreate_Tensor(*V)); |
| 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.
|
1765 | PetscCall(PetscLogEventEnd(BV_Create,*V,0,0,0)); |
| 812 | |||
| 813 | 1765 | ctx = (BV_TENSOR*)(*V)->data; | |
| 814 | 1765 | ctx->U = U; | |
| 815 | 1765 | ctx->d = d; | |
| 816 | 1765 | ctx->ld = m; | |
| 817 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectReference((PetscObject)U)); |
| 818 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,d*m,m-d+1,NULL,&ctx->S)); |
| 819 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectSetName((PetscObject)ctx->S,"S")); |
| 820 | |||
| 821 | /* Copy user-provided attributes of U */ | ||
| 822 | 1765 | (*V)->orthog_type = U->orthog_type; | |
| 823 | 1765 | (*V)->orthog_ref = U->orthog_ref; | |
| 824 | 1765 | (*V)->orthog_eta = U->orthog_eta; | |
| 825 | 1765 | (*V)->orthog_block = U->orthog_block; | |
| 826 | 1765 | (*V)->vmm = U->vmm; | |
| 827 | 1765 | (*V)->rrandom = U->rrandom; | |
| 828 |
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.
|
1765 | PetscFunctionReturn(PETSC_SUCCESS); |
| 829 | } | ||
| 830 |