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: BVCreateTensor() | ||
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 ... 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: 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: 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 a NULL vector for any of the arguments that is not needed. | ||
641 | |||
642 | Level: advanced | ||
643 | |||
644 | .seealso: 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: 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 | 1765 | SLEPC_EXTERN PetscErrorCode BVCreate_Tensor(BV bv) | |
716 | { | ||
717 | 1765 | BV_TENSOR *ctx; | |
718 | |||
719 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1765 | PetscFunctionBegin; |
720 |
4/6✓ Branch 0 taken 2 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)); |
721 | 1765 | bv->data = (void*)ctx; | |
722 | 1765 | ctx->puk = -1; | |
723 | |||
724 | 1765 | bv->ops->multinplace = BVMultInPlace_Tensor; | |
725 | 1765 | bv->ops->multinplacetrans = BVMultInPlaceHermitianTranspose_Tensor; | |
726 | 1765 | bv->ops->dot = BVDot_Tensor; | |
727 | 1765 | bv->ops->scale = BVScale_Tensor; | |
728 | 1765 | bv->ops->norm = BVNorm_Tensor; | |
729 | 1765 | bv->ops->copycolumn = BVCopyColumn_Tensor; | |
730 | 1765 | bv->ops->gramschmidt = BVOrthogonalizeGS1_Tensor; | |
731 | 1765 | bv->ops->destroy = BVDestroy_Tensor; | |
732 | 1765 | bv->ops->view = BVView_Tensor; | |
733 | |||
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(PetscObjectComposeFunction((PetscObject)bv,"BVTensorBuildFirstColumn_C",BVTensorBuildFirstColumn_Tensor)); |
735 |
4/6✓ Branch 0 taken 2 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)); |
736 |
4/6✓ Branch 0 taken 2 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)); |
737 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorGetFactors_C",BVTensorGetFactors_Tensor)); |
738 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscObjectComposeFunction((PetscObject)bv,"BVTensorRestoreFactors_C",BVTensorRestoreFactors_Tensor)); |
739 |
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); |
740 | } | ||
741 | |||
742 | /*@ | ||
743 | BVCreateTensor - Creates a tensor BV that is represented in compact form | ||
744 | as V = (I otimes U) S, where U has orthonormal columns. | ||
745 | |||
746 | Collective | ||
747 | |||
748 | Input Parameters: | ||
749 | + U - a basis vectors object | ||
750 | - d - the number of blocks (degree) of the tensor BV | ||
751 | |||
752 | Output Parameter: | ||
753 | . V - the new basis vectors context | ||
754 | |||
755 | Notes: | ||
756 | The new basis vectors object is V = (I otimes U) S, where otimes denotes | ||
757 | the Kronecker product, I is the identity matrix of order d, and S is a | ||
758 | sequential matrix allocated internally. This compact representation is | ||
759 | used e.g. to represent the Krylov basis generated with the linearization | ||
760 | of a matrix polynomial of degree d. | ||
761 | |||
762 | The size of V (number of rows) is equal to d times n, where n is the size | ||
763 | of U. The dimensions of S are d times m rows and m-d+1 columns, where m is | ||
764 | the number of columns of U, so m should be at least d. | ||
765 | |||
766 | The communicator of V will be the same as U. | ||
767 | |||
768 | On input, the content of U is irrelevant. Alternatively, it may contain | ||
769 | some nonzero columns that will be used by BVTensorBuildFirstColumn(). | ||
770 | |||
771 | Level: advanced | ||
772 | |||
773 | .seealso: BVTensorGetDegree(), BVTensorGetFactors(), BVTensorBuildFirstColumn() | ||
774 | @*/ | ||
775 | 1765 | PetscErrorCode BVCreateTensor(BV U,PetscInt d,BV *V) | |
776 | { | ||
777 | 1765 | PetscBool match; | |
778 | 1765 | PetscInt n,N,m; | |
779 | 1765 | VecType vtype; | |
780 | 1765 | BV_TENSOR *ctx; | |
781 | |||
782 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1765 | PetscFunctionBegin; |
783 |
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); |
784 |
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); |
785 |
4/6✓ Branch 0 taken 2 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)); |
786 |
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"); |
787 | |||
788 |
4/6✓ Branch 0 taken 2 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)); |
789 |
4/6✓ Branch 0 taken 2 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)); |
790 |
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); |
791 |
4/6✓ Branch 0 taken 2 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)); |
792 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(BVGetVecType(U,&vtype)); |
793 |
4/6✓ Branch 0 taken 2 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)); |
794 |
4/6✓ Branch 0 taken 2 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)); |
795 |
4/6✓ Branch 0 taken 2 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)); |
796 |
4/6✓ Branch 0 taken 2 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)); |
797 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1765 | PetscCall(PetscLogEventEnd(BV_Create,*V,0,0,0)); |
798 | |||
799 | 1765 | ctx = (BV_TENSOR*)(*V)->data; | |
800 | 1765 | ctx->U = U; | |
801 | 1765 | ctx->d = d; | |
802 | 1765 | ctx->ld = m; | |
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(PetscObjectReference((PetscObject)U)); |
804 |
4/6✓ Branch 0 taken 2 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)); |
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(PetscObjectSetName((PetscObject)ctx->S,"S")); |
806 | |||
807 | /* Copy user-provided attributes of U */ | ||
808 | 1765 | (*V)->orthog_type = U->orthog_type; | |
809 | 1765 | (*V)->orthog_ref = U->orthog_ref; | |
810 | 1765 | (*V)->orthog_eta = U->orthog_eta; | |
811 | 1765 | (*V)->orthog_block = U->orthog_block; | |
812 | 1765 | (*V)->vmm = U->vmm; | |
813 | 1765 | (*V)->rrandom = U->rrandom; | |
814 |
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); |
815 | } | ||
816 |