| 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 | #pragma once | ||
| 12 | |||
| 13 | #include <slepcbv.h> | ||
| 14 | #include <slepc/private/slepcimpl.h> | ||
| 15 | |||
| 16 | /* SUBMANSEC = BV */ | ||
| 17 | |||
| 18 | SLEPC_EXTERN PetscBool BVRegisterAllCalled; | ||
| 19 | SLEPC_EXTERN PetscErrorCode BVRegisterAll(void); | ||
| 20 | |||
| 21 | SLEPC_EXTERN PetscLogEvent BV_Create,BV_Copy,BV_Mult,BV_MultVec,BV_MultInPlace,BV_Dot,BV_DotVec,BV_Orthogonalize,BV_OrthogonalizeVec,BV_Scale,BV_Norm,BV_NormVec,BV_Normalize,BV_SetRandom,BV_MatMult,BV_MatMultVec,BV_MatProject,BV_SVDAndRank; | ||
| 22 | |||
| 23 | typedef struct _BVOps *BVOps; | ||
| 24 | |||
| 25 | struct _BVOps { | ||
| 26 | PetscErrorCode (*mult)(BV,PetscScalar,PetscScalar,BV,Mat); | ||
| 27 | PetscErrorCode (*multvec)(BV,PetscScalar,PetscScalar,Vec,PetscScalar*); | ||
| 28 | PetscErrorCode (*multinplace)(BV,Mat,PetscInt,PetscInt); | ||
| 29 | PetscErrorCode (*multinplacetrans)(BV,Mat,PetscInt,PetscInt); | ||
| 30 | PetscErrorCode (*dot)(BV,BV,Mat); | ||
| 31 | PetscErrorCode (*dotvec)(BV,Vec,PetscScalar*); | ||
| 32 | PetscErrorCode (*dotvec_local)(BV,Vec,PetscScalar*); | ||
| 33 | PetscErrorCode (*dotvec_begin)(BV,Vec,PetscScalar*); | ||
| 34 | PetscErrorCode (*dotvec_end)(BV,Vec,PetscScalar*); | ||
| 35 | PetscErrorCode (*scale)(BV,PetscInt,PetscScalar); | ||
| 36 | PetscErrorCode (*norm)(BV,PetscInt,NormType,PetscReal*); | ||
| 37 | PetscErrorCode (*norm_local)(BV,PetscInt,NormType,PetscReal*); | ||
| 38 | PetscErrorCode (*norm_begin)(BV,PetscInt,NormType,PetscReal*); | ||
| 39 | PetscErrorCode (*norm_end)(BV,PetscInt,NormType,PetscReal*); | ||
| 40 | PetscErrorCode (*normalize)(BV,PetscScalar*); | ||
| 41 | PetscErrorCode (*matmult)(BV,Mat,BV); | ||
| 42 | PetscErrorCode (*copy)(BV,BV); | ||
| 43 | PetscErrorCode (*copycolumn)(BV,PetscInt,PetscInt); | ||
| 44 | PetscErrorCode (*resize)(BV,PetscInt,PetscBool); | ||
| 45 | PetscErrorCode (*getcolumn)(BV,PetscInt,Vec*); | ||
| 46 | PetscErrorCode (*restorecolumn)(BV,PetscInt,Vec*); | ||
| 47 | PetscErrorCode (*getarray)(BV,PetscScalar**); | ||
| 48 | PetscErrorCode (*restorearray)(BV,PetscScalar**); | ||
| 49 | PetscErrorCode (*getarrayread)(BV,const PetscScalar**); | ||
| 50 | PetscErrorCode (*restorearrayread)(BV,const PetscScalar**); | ||
| 51 | PetscErrorCode (*restoresplit)(BV,BV*,BV*); | ||
| 52 | PetscErrorCode (*restoresplitrows)(BV,IS,IS,BV*,BV*); | ||
| 53 | PetscErrorCode (*gramschmidt)(BV,PetscInt,Vec,PetscBool*,PetscScalar*,PetscScalar*,PetscReal*,PetscReal*); | ||
| 54 | PetscErrorCode (*getmat)(BV,Mat*); | ||
| 55 | PetscErrorCode (*restoremat)(BV,Mat*); | ||
| 56 | PetscErrorCode (*duplicate)(BV,BV); | ||
| 57 | PetscErrorCode (*create)(BV); | ||
| 58 | PetscErrorCode (*setfromoptions)(BV,PetscOptionItems); | ||
| 59 | PetscErrorCode (*view)(BV,PetscViewer); | ||
| 60 | PetscErrorCode (*destroy)(BV); | ||
| 61 | }; | ||
| 62 | |||
| 63 | struct _p_BV { | ||
| 64 | PETSCHEADER(struct _BVOps); | ||
| 65 | /*------------------------- User parameters --------------------------*/ | ||
| 66 | PetscLayout map; /* layout of columns */ | ||
| 67 | VecType vtype; /* vector type */ | ||
| 68 | PetscInt n,N; /* dimensions of vectors (local, global) */ | ||
| 69 | PetscInt m; /* number of vectors */ | ||
| 70 | PetscInt l; /* number of leading columns */ | ||
| 71 | PetscInt k; /* number of active columns */ | ||
| 72 | PetscInt nc; /* number of constraints */ | ||
| 73 | PetscInt ld; /* leading dimension */ | ||
| 74 | BVOrthogType orthog_type; /* the method of vector orthogonalization */ | ||
| 75 | BVOrthogRefineType orthog_ref; /* refinement method */ | ||
| 76 | PetscReal orthog_eta; /* refinement threshold */ | ||
| 77 | BVOrthogBlockType orthog_block; /* the method of block orthogonalization */ | ||
| 78 | Mat matrix; /* inner product matrix */ | ||
| 79 | PetscBool indef; /* matrix is indefinite */ | ||
| 80 | BVMatMultType vmm; /* version of matmult operation */ | ||
| 81 | PetscBool rrandom; /* reproducible random vectors */ | ||
| 82 | PetscReal deftol; /* tolerance for BV_SafeSqrt */ | ||
| 83 | |||
| 84 | /*---------------------- Cached data and workspace -------------------*/ | ||
| 85 | Vec buffer; /* buffer vector used in orthogonalization */ | ||
| 86 | Mat Abuffer; /* auxiliary seqdense matrix that wraps the buffer */ | ||
| 87 | Vec Bx; /* result of matrix times a vector x */ | ||
| 88 | PetscObjectId xid; /* object id of vector x */ | ||
| 89 | PetscObjectState xstate; /* state of vector x */ | ||
| 90 | Vec cv[2]; /* column vectors obtained with BVGetColumn() */ | ||
| 91 | PetscInt ci[2]; /* column indices of obtained vectors */ | ||
| 92 | PetscObjectState st[2]; /* state of obtained vectors */ | ||
| 93 | PetscObjectId id[2]; /* object id of obtained vectors */ | ||
| 94 | PetscScalar *h,*c; /* orthogonalization coefficients */ | ||
| 95 | Vec omega; /* signature matrix values for indefinite case */ | ||
| 96 | PetscBool defersfo; /* deferred call to setfromoptions */ | ||
| 97 | BV cached; /* cached BV to store result of matrix times BV */ | ||
| 98 | PetscObjectState bvstate; /* state of BV when BVApplyMatrixBV() was called */ | ||
| 99 | BV L,R; /* BV objects obtained with BVGetSplit/Rows() */ | ||
| 100 | PetscObjectState lstate,rstate;/* state of L and R when BVGetSplit/Rows() was called */ | ||
| 101 | PetscInt lsplit; /* value of l when BVGetSplit() was called (-1 if BVGetSplitRows()) */ | ||
| 102 | PetscInt issplit; /* !=0 if BV is from split (1=left, 2=right, -1=top, -2=bottom) */ | ||
| 103 | BV splitparent; /* my parent if I am a split BV */ | ||
| 104 | PetscRandom rand; /* random number generator */ | ||
| 105 | Mat Acreate; /* matrix given at BVCreateFromMat() */ | ||
| 106 | Mat Aget; /* matrix returned for BVGetMat() */ | ||
| 107 | PetscBool cuda; /* true if NVIDIA GPU must be used */ | ||
| 108 | PetscBool hip; /* true if AMD GPU must be used */ | ||
| 109 | PetscBool sfocalled; /* setfromoptions has been called */ | ||
| 110 | PetscScalar *work; | ||
| 111 | PetscInt lwork; | ||
| 112 | void *data; | ||
| 113 | }; | ||
| 114 | |||
| 115 | /* | ||
| 116 | BV_SafeSqrt - Computes the square root of a scalar value alpha, which is | ||
| 117 | assumed to be z'*B*z. The result is | ||
| 118 | if definite inner product: res = sqrt(alpha) | ||
| 119 | if indefinite inner product: res = sgn(alpha)*sqrt(abs(alpha)) | ||
| 120 | */ | ||
| 121 | 3118982 | static inline PetscErrorCode BV_SafeSqrt(BV bv,PetscScalar alpha,PetscReal *res) | |
| 122 | { | ||
| 123 | 3118982 | PetscReal absal,realp; | |
| 124 | 3118982 | const char *msg; | |
| 125 | |||
| 126 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
3118982 | PetscFunctionBegin; |
| 127 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
3118982 | absal = PetscAbsScalar(alpha); |
| 128 | 3118982 | realp = PetscRealPart(alpha); | |
| 129 |
6/8✓ Branch 0 taken 22 times.
✓ Branch 1 taken 32 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
|
3118982 | if (PetscUnlikely(absal<PETSC_MACHINE_EPSILON)) PetscCall(PetscInfo(bv,"Zero norm %g, either the vector is zero or a semi-inner product is being used\n",(double)absal)); |
| 130 | #if defined(PETSC_USE_COMPLEX) | ||
| 131 |
3/6✓ Branch 0 taken 11 times.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1384852 | PetscCheck(PetscAbsReal(PetscImaginaryPart(alpha))<bv->deftol || PetscAbsReal(PetscImaginaryPart(alpha))/absal<10*bv->deftol,PetscObjectComm((PetscObject)bv),PETSC_ERR_USER_INPUT,"The inner product is not well defined: nonzero imaginary part %g",(double)PetscImaginaryPart(alpha)); |
| 132 | #endif | ||
| 133 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 22 times.
|
3118982 | if (PetscUnlikely(bv->indef)) { |
| 134 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 32 times.
|
290218 | *res = (realp<0.0)? -PetscSqrtReal(-realp): PetscSqrtReal(realp); |
| 135 | } else { | ||
| 136 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 22 times.
|
2828764 | msg = bv->matrix? "The inner product is not well defined: indefinite matrix %g": "Invalid inner product: %g"; |
| 137 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2828764 | PetscCheck(realp>-bv->deftol,PetscObjectComm((PetscObject)bv),PETSC_ERR_USER_INPUT,msg,(double)realp); |
| 138 |
1/2✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
|
2828764 | *res = (realp<0.0)? 0.0: PetscSqrtReal(realp); |
| 139 | } | ||
| 140 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
605030 | PetscFunctionReturn(PETSC_SUCCESS); |
| 141 | } | ||
| 142 | |||
| 143 | /* | ||
| 144 | BV_IPMatMult - Multiply a vector x by the inner-product matrix, cache the | ||
| 145 | result in Bx. | ||
| 146 | */ | ||
| 147 | 870550 | static inline PetscErrorCode BV_IPMatMult(BV bv,Vec x) | |
| 148 | { | ||
| 149 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
870550 | PetscFunctionBegin; |
| 150 |
4/4✓ Branch 0 taken 74 times.
✓ Branch 1 taken 74 times.
✓ Branch 2 taken 74 times.
✓ Branch 3 taken 40 times.
|
870550 | if (((PetscObject)x)->id != bv->xid || ((PetscObject)x)->state != bv->xstate) { |
| 151 |
6/8✓ Branch 0 taken 54 times.
✓ Branch 1 taken 74 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 34 times.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
|
803833 | if (PetscUnlikely(!bv->Bx)) PetscCall(MatCreateVecs(bv->matrix,&bv->Bx,NULL)); |
| 152 |
4/6✓ Branch 0 taken 14 times.
✓ Branch 1 taken 46 times.
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
|
803833 | PetscCall(MatMult(bv->matrix,x,bv->Bx)); |
| 153 |
4/6✓ Branch 0 taken 14 times.
✓ Branch 1 taken 46 times.
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
|
803833 | PetscCall(PetscObjectGetId((PetscObject)x,&bv->xid)); |
| 154 |
4/6✓ Branch 0 taken 18 times.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
|
803833 | PetscCall(VecGetState(x,&bv->xstate)); |
| 155 | ✗ | } | |
| 156 |
6/12✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 14 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 14 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 14 times.
|
175317 | PetscFunctionReturn(PETSC_SUCCESS); |
| 157 | ✗ | } | |
| 158 | |||
| 159 | /* | ||
| 160 | BV_IPMatMultBV - Multiply BV by the inner-product matrix, cache the | ||
| 161 | result internally in bv->cached. | ||
| 162 | */ | ||
| 163 | 3579 | static inline PetscErrorCode BV_IPMatMultBV(BV bv) | |
| 164 | { | ||
| 165 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3579 | PetscFunctionBegin; |
| 166 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3579 | PetscCall(BVGetCachedBV(bv,&bv->cached)); |
| 167 |
3/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
3579 | if (((PetscObject)bv)->state != bv->bvstate || bv->l != bv->cached->l || bv->k != bv->cached->k) { |
| 168 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3579 | PetscCall(BVSetActiveColumns(bv->cached,bv->l,bv->k)); |
| 169 |
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.
|
3579 | if (bv->matrix) PetscCall(BVMatMult(bv,bv->matrix,bv->cached)); |
| 170 | ✗ | else PetscCall(BVCopy(bv,bv->cached)); | |
| 171 | 3579 | bv->bvstate = ((PetscObject)bv)->state; | |
| 172 | } | ||
| 173 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
605 | PetscFunctionReturn(PETSC_SUCCESS); |
| 174 | } | ||
| 175 | |||
| 176 | /* | ||
| 177 | BV_AllocateCoeffs - Allocate orthogonalization coefficients if not done already. | ||
| 178 | */ | ||
| 179 | 462730 | static inline PetscErrorCode BV_AllocateCoeffs(BV bv) | |
| 180 | { | ||
| 181 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
462730 | PetscFunctionBegin; |
| 182 |
6/8✓ Branch 0 taken 30 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 24 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
|
462730 | if (!bv->h) PetscCall(PetscMalloc2(bv->nc+bv->m,&bv->h,bv->nc+bv->m,&bv->c)); |
| 183 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
91126 | PetscFunctionReturn(PETSC_SUCCESS); |
| 184 | } | ||
| 185 | |||
| 186 | /* | ||
| 187 | BV_AllocateSignature - Allocate signature coefficients if not done already. | ||
| 188 | */ | ||
| 189 | 2567052 | static inline PetscErrorCode BV_AllocateSignature(BV bv) | |
| 190 | { | ||
| 191 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
2567052 | PetscFunctionBegin; |
| 192 |
4/4✓ Branch 0 taken 30 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 20 times.
|
2567052 | if (bv->indef && !bv->omega) { |
| 193 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 30 times.
|
850 | if (bv->cuda) { |
| 194 | #if defined(PETSC_HAVE_CUDA) | ||
| 195 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
18 | PetscCall(VecCreateSeqCUDA(PETSC_COMM_SELF,bv->nc+bv->m,&bv->omega)); |
| 196 | #else | ||
| 197 | ✗ | SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_PLIB,"Something wrong happened"); | |
| 198 | #endif | ||
| 199 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 30 times.
|
832 | } else if (bv->hip) { |
| 200 | #if defined(PETSC_HAVE_HIP) | ||
| 201 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
18 | PetscCall(VecCreateSeqHIP(PETSC_COMM_SELF,bv->nc+bv->m,&bv->omega)); |
| 202 | #else | ||
| 203 | ✗ | SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_PLIB,"Something wrong happened"); | |
| 204 | #endif | ||
| 205 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
814 | } else PetscCall(VecCreateSeq(PETSC_COMM_SELF,bv->nc+bv->m,&bv->omega)); |
| 206 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
850 | PetscCall(VecSet(bv->omega,1.0)); |
| 207 | } | ||
| 208 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
494518 | PetscFunctionReturn(PETSC_SUCCESS); |
| 209 | } | ||
| 210 | |||
| 211 | /* | ||
| 212 | BV_SetMatrixDiagonal - sets the inner product matrix for BV as a diagonal matrix | ||
| 213 | with the diagonal specified by vector vomega, using the same matrix type as matrix M | ||
| 214 | */ | ||
| 215 | 233 | static inline PetscErrorCode BV_SetMatrixDiagonal(BV bv,Vec vomega,Mat M) | |
| 216 | { | ||
| 217 | 233 | Mat Omega; | |
| 218 | 233 | MatType Mtype; | |
| 219 | |||
| 220 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
233 | PetscFunctionBegin; |
| 221 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(MatGetType(M,&Mtype)); |
| 222 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(MatCreate(PetscObjectComm((PetscObject)bv),&Omega)); |
| 223 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(MatSetSizes(Omega,bv->n,bv->n,bv->N,bv->N)); |
| 224 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(MatSetType(Omega,Mtype)); |
| 225 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(MatDiagonalSet(Omega,vomega,INSERT_VALUES)); |
| 226 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(BVSetMatrix(bv,Omega,PETSC_TRUE)); |
| 227 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
233 | PetscCall(MatDestroy(&Omega)); |
| 228 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
57 | PetscFunctionReturn(PETSC_SUCCESS); |
| 229 | } | ||
| 230 | |||
| 231 | /* | ||
| 232 | BVAvailableVec: First (0) or second (1) vector available for | ||
| 233 | getcolumn operation (or -1 if both vectors already fetched). | ||
| 234 | */ | ||
| 235 | #define BVAvailableVec (((bv->ci[0]==-bv->nc-1)? 0: (bv->ci[1]==-bv->nc-1)? 1: -1)) | ||
| 236 | |||
| 237 | /* | ||
| 238 | Macros to test valid BV arguments | ||
| 239 | */ | ||
| 240 | #if !defined(PETSC_USE_DEBUG) | ||
| 241 | |||
| 242 | #define BVCheckSizes(h,arg) do {(void)(h);} while (0) | ||
| 243 | #define BVCheckOp(h,arg,op) do {(void)(h);} while (0) | ||
| 244 | |||
| 245 | #else | ||
| 246 | |||
| 247 | #define BVCheckSizes(h,arg) \ | ||
| 248 | do { \ | ||
| 249 | PetscCheck((h)->m,PetscObjectComm((PetscObject)(h)),PETSC_ERR_ARG_WRONGSTATE,"BV sizes have not been defined: Parameter #%d",arg); \ | ||
| 250 | } while (0) | ||
| 251 | |||
| 252 | #define BVCheckOp(h,arg,op) \ | ||
| 253 | do { \ | ||
| 254 | PetscCheck((h)->ops->op,PetscObjectComm((PetscObject)(h)),PETSC_ERR_SUP,"Operation not implemented in this BV type: Parameter #%d",arg); \ | ||
| 255 | } while (0) | ||
| 256 | |||
| 257 | #endif | ||
| 258 | |||
| 259 | SLEPC_INTERN PetscErrorCode BVView_Vecs(BV,PetscViewer); | ||
| 260 | |||
| 261 | SLEPC_INTERN PetscErrorCode BVAllocateWork_Private(BV,PetscInt); | ||
| 262 | |||
| 263 | SLEPC_INTERN PetscErrorCode BVMult_BLAS_Private(BV,PetscInt,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscScalar,PetscScalar*,PetscInt); | ||
| 264 | SLEPC_INTERN PetscErrorCode BVMultVec_BLAS_Private(BV,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,const PetscScalar*,PetscScalar,PetscScalar*); | ||
| 265 | SLEPC_INTERN PetscErrorCode BVMultInPlace_BLAS_Private(BV,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscBool); | ||
| 266 | SLEPC_INTERN PetscErrorCode BVMultInPlace_Vecs_Private(BV,PetscInt,PetscInt,PetscInt,Vec*,const PetscScalar*,PetscBool); | ||
| 267 | SLEPC_INTERN PetscErrorCode BVAXPY_BLAS_Private(BV,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,PetscScalar,PetscScalar*,PetscInt); | ||
| 268 | SLEPC_INTERN PetscErrorCode BVDot_BLAS_Private(BV,PetscInt,PetscInt,PetscInt,const PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscScalar*,PetscInt,PetscBool); | ||
| 269 | SLEPC_INTERN PetscErrorCode BVDotVec_BLAS_Private(BV,PetscInt,PetscInt,const PetscScalar*,PetscInt,const PetscScalar*,PetscScalar*,PetscBool); | ||
| 270 | SLEPC_INTERN PetscErrorCode BVScale_BLAS_Private(BV,PetscInt,PetscScalar*,PetscScalar); | ||
| 271 | SLEPC_INTERN PetscErrorCode BVNorm_LAPACK_Private(BV,PetscInt,PetscInt,const PetscScalar*,PetscInt,NormType,PetscReal*,PetscBool); | ||
| 272 | SLEPC_INTERN PetscErrorCode BVNormalize_LAPACK_Private(BV,PetscInt,PetscInt,const PetscScalar*,PetscInt,PetscScalar*,PetscBool); | ||
| 273 | SLEPC_INTERN PetscErrorCode BVGetMat_Default(BV,Mat*); | ||
| 274 | SLEPC_INTERN PetscErrorCode BVRestoreMat_Default(BV,Mat*); | ||
| 275 | SLEPC_INTERN PetscErrorCode BVMatCholInv_LAPACK_Private(BV,Mat,Mat); | ||
| 276 | SLEPC_INTERN PetscErrorCode BVMatTriInv_LAPACK_Private(BV,Mat,Mat); | ||
| 277 | SLEPC_INTERN PetscErrorCode BVMatSVQB_LAPACK_Private(BV,Mat,Mat); | ||
| 278 | SLEPC_INTERN PetscErrorCode BVOrthogonalize_LAPACK_TSQR(BV,PetscInt,PetscInt,PetscScalar*,PetscInt,PetscScalar*,PetscInt); | ||
| 279 | SLEPC_INTERN PetscErrorCode BVOrthogonalize_LAPACK_TSQR_OnlyR(BV,PetscInt,PetscInt,PetscScalar*,PetscInt,PetscScalar*,PetscInt); | ||
| 280 | |||
| 281 | /* reduction operations used in BVOrthogonalize and BVNormalize */ | ||
| 282 | SLEPC_EXTERN MPI_Op MPIU_TSQR, MPIU_LAPY2; | ||
| 283 | SLEPC_EXTERN void MPIAPI SlepcGivensPacked(void*,void*,PetscMPIInt*,MPI_Datatype*); | ||
| 284 | SLEPC_EXTERN void MPIAPI SlepcPythag(void*,void*,PetscMPIInt*,MPI_Datatype*); | ||
| 285 | |||
| 286 | /* | ||
| 287 | BV_CleanCoefficients_Default - Sets to zero all entries of column j of the bv buffer | ||
| 288 | */ | ||
| 289 | 2516655 | static inline PetscErrorCode BV_CleanCoefficients_Default(BV bv,PetscInt j,PetscScalar *h) | |
| 290 | { | ||
| 291 | 2516655 | PetscScalar *hh=h,*a; | |
| 292 | 2516655 | PetscInt i; | |
| 293 | |||
| 294 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
2516655 | PetscFunctionBegin; |
| 295 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 20 times.
|
2516655 | if (!h) { |
| 296 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2057272 | PetscCall(VecGetArray(bv->buffer,&a)); |
| 297 | 2057272 | hh = a + j*(bv->nc+bv->m); | |
| 298 | } | ||
| 299 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 20 times.
|
33488079 | for (i=0;i<bv->nc+j;i++) hh[i] = 0.0; |
| 300 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 20 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.
|
2516655 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&a)); |
| 301 |
6/12✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
|
493888 | PetscFunctionReturn(PETSC_SUCCESS); |
| 302 | } | ||
| 303 | |||
| 304 | /* | ||
| 305 | BV_AddCoefficients_Default - Add the contents of the scratch (0-th column) of the bv buffer | ||
| 306 | into column j of the bv buffer | ||
| 307 | */ | ||
| 308 | 3905146 | static inline PetscErrorCode BV_AddCoefficients_Default(BV bv,PetscInt j,PetscScalar *h,PetscScalar *c) | |
| 309 | { | ||
| 310 | 3905146 | PetscScalar *hh=h,*cc=c; | |
| 311 | 3905146 | PetscInt i; | |
| 312 | |||
| 313 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
3905146 | PetscFunctionBegin; |
| 314 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 20 times.
|
3905146 | if (!h) { |
| 315 |
4/6✓ Branch 0 taken 4 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
|
3389854 | PetscCall(VecGetArray(bv->buffer,&cc)); |
| 316 | 3389854 | hh = cc + j*(bv->nc+bv->m); | |
| 317 | } | ||
| 318 |
2/2✓ Branch 0 taken 30 times.
✓ Branch 1 taken 30 times.
|
58842069 | for (i=0;i<bv->nc+j;i++) hh[i] += cc[i]; |
| 319 |
6/8✓ Branch 0 taken 20 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
|
3905146 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&cc)); |
| 320 |
3/6✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
3905146 | PetscCall(PetscLogFlops(1.0*(bv->nc+j))); |
| 321 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
3905146 | PetscFunctionReturn(PETSC_SUCCESS); |
| 322 | } | ||
| 323 | |||
| 324 | /* | ||
| 325 | BV_SetValue_Default - Sets value in row j (counted after the constraints) of column k | ||
| 326 | of the coefficients array | ||
| 327 | */ | ||
| 328 | 2914987 | static inline PetscErrorCode BV_SetValue_Default(BV bv,PetscInt j,PetscInt k,PetscScalar *h,PetscScalar value) | |
| 329 | { | ||
| 330 | 2914987 | PetscScalar *hh=h,*a; | |
| 331 | |||
| 332 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
2914987 | PetscFunctionBegin; |
| 333 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 30 times.
|
2914987 | if (!h) { |
| 334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2892967 | PetscCall(VecGetArray(bv->buffer,&a)); |
| 335 | 2892967 | hh = a + k*(bv->nc+bv->m); | |
| 336 | } | ||
| 337 | 2914987 | hh[bv->nc+j] = value; | |
| 338 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 30 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.
|
2914987 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&a)); |
| 339 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
574767 | PetscFunctionReturn(PETSC_SUCCESS); |
| 340 | } | ||
| 341 | |||
| 342 | /* | ||
| 343 | BV_SquareSum_Default - Returns the value h'*h, where h represents the contents of the | ||
| 344 | coefficients array (up to position j) | ||
| 345 | */ | ||
| 346 | 3196977 | static inline PetscErrorCode BV_SquareSum_Default(BV bv,PetscInt j,PetscScalar *h,PetscReal *sum) | |
| 347 | { | ||
| 348 | 3196977 | PetscScalar *hh=h; | |
| 349 | 3196977 | PetscInt i; | |
| 350 | |||
| 351 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3196977 | PetscFunctionBegin; |
| 352 | 3196977 | *sum = 0.0; | |
| 353 |
5/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
3196977 | if (!h) PetscCall(VecGetArray(bv->buffer,&hh)); |
| 354 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
43057525 | for (i=0;i<bv->nc+j;i++) *sum += PetscRealPart(hh[i]*PetscConj(hh[i])); |
| 355 |
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.
|
3196977 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&hh)); |
| 356 |
3/6✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3196977 | PetscCall(PetscLogFlops(2.0*(bv->nc+j))); |
| 357 |
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.
|
3196977 | PetscFunctionReturn(PETSC_SUCCESS); |
| 358 | } | ||
| 359 | |||
| 360 | /* | ||
| 361 | BV_ApplySignature_Default - Computes the pointwise product h*omega, where h represents | ||
| 362 | the contents of the coefficients array (up to position j) and omega is the signature; | ||
| 363 | if inverse=TRUE then the operation is h/omega | ||
| 364 | */ | ||
| 365 | 580628 | static inline PetscErrorCode BV_ApplySignature_Default(BV bv,PetscInt j,PetscScalar *h,PetscBool inverse) | |
| 366 | { | ||
| 367 | 580628 | PetscScalar *hh=h; | |
| 368 | 580628 | PetscInt i; | |
| 369 | 580628 | const PetscScalar *omega; | |
| 370 | |||
| 371 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
580628 | PetscFunctionBegin; |
| 372 |
8/14✓ Branch 0 taken 20 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
|
580628 | if (PetscUnlikely(!(bv->nc+j))) PetscFunctionReturn(PETSC_SUCCESS); |
| 373 |
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.
|
579240 | if (!h) PetscCall(VecGetArray(bv->buffer,&hh)); |
| 374 |
4/6✓ Branch 0 taken 4 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
|
579240 | PetscCall(VecGetArrayRead(bv->omega,&omega)); |
| 375 |
4/4✓ Branch 0 taken 20 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 20 times.
|
10474562 | if (inverse) for (i=0;i<bv->nc+j;i++) hh[i] /= PetscRealPart(omega[i]); |
| 376 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 20 times.
|
10184942 | else for (i=0;i<bv->nc+j;i++) hh[i] *= PetscRealPart(omega[i]); |
| 377 |
4/6✓ Branch 0 taken 4 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
|
579240 | PetscCall(VecRestoreArrayRead(bv->omega,&omega)); |
| 378 |
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.
|
579240 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&hh)); |
| 379 |
3/6✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
|
579240 | PetscCall(PetscLogFlops(1.0*(bv->nc+j))); |
| 380 |
6/12✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
|
579240 | PetscFunctionReturn(PETSC_SUCCESS); |
| 381 | } | ||
| 382 | |||
| 383 | /* | ||
| 384 | BV_SquareRoot_Default - Returns the square root of position j (counted after the constraints) | ||
| 385 | of the coefficients array | ||
| 386 | */ | ||
| 387 | 2825740 | static inline PetscErrorCode BV_SquareRoot_Default(BV bv,PetscInt j,PetscScalar *h,PetscReal *beta) | |
| 388 | { | ||
| 389 | 2825740 | PetscScalar *hh=h; | |
| 390 | |||
| 391 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2825740 | PetscFunctionBegin; |
| 392 |
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.
|
2825740 | if (!h) PetscCall(VecGetArray(bv->buffer,&hh)); |
| 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.
|
2825740 | PetscCall(BV_SafeSqrt(bv,hh[bv->nc+j],beta)); |
| 394 |
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.
|
2825740 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&hh)); |
| 395 |
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.
|
552245 | PetscFunctionReturn(PETSC_SUCCESS); |
| 396 | } | ||
| 397 | |||
| 398 | /* | ||
| 399 | BV_StoreCoefficients_Default - Copy the contents of the coefficients array to an array dest | ||
| 400 | provided by the caller (only values from l to j are copied) | ||
| 401 | */ | ||
| 402 | 796979 | static inline PetscErrorCode BV_StoreCoefficients_Default(BV bv,PetscInt j,PetscScalar *h,PetscScalar *dest) | |
| 403 | { | ||
| 404 | 796979 | PetscScalar *hh=h,*a; | |
| 405 | 796979 | PetscInt i; | |
| 406 | |||
| 407 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
796979 | PetscFunctionBegin; |
| 408 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
796979 | if (!h) { |
| 409 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
526732 | PetscCall(VecGetArray(bv->buffer,&a)); |
| 410 | 526732 | hh = a + j*(bv->nc+bv->m); | |
| 411 | } | ||
| 412 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
12316497 | for (i=bv->l;i<j;i++) dest[i-bv->l] = hh[bv->nc+i]; |
| 413 |
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.
|
796979 | if (!h) PetscCall(VecRestoreArray(bv->buffer,&a)); |
| 414 |
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.
|
158555 | PetscFunctionReturn(PETSC_SUCCESS); |
| 415 | } | ||
| 416 | |||
| 417 | /* | ||
| 418 | BV_GetEigenvector - retrieves k-th eigenvector from basis vectors V. | ||
| 419 | The argument eigi is the imaginary part of the corresponding eigenvalue. | ||
| 420 | */ | ||
| 421 | 107917 | static inline PetscErrorCode BV_GetEigenvector(BV V,PetscInt k,PetscScalar eigi,Vec Vr,Vec Vi) | |
| 422 | { | ||
| 423 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
107917 | PetscFunctionBegin; |
| 424 | #if defined(PETSC_USE_COMPLEX) | ||
| 425 | 51135 | (void)eigi; | |
| 426 |
6/8✓ Branch 0 taken 25 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 20 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
|
51135 | if (Vr) PetscCall(BVCopyVec(V,k,Vr)); |
| 427 |
6/8✓ Branch 0 taken 15 times.
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
|
51135 | if (Vi) PetscCall(VecSet(Vi,0.0)); |
| 428 | #else | ||
| 429 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 25 times.
|
56782 | if (eigi > 0.0) { /* first value of conjugate pair */ |
| 430 |
5/8✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
|
1205 | if (Vr) PetscCall(BVCopyVec(V,k,Vr)); |
| 431 |
5/8✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
|
1205 | if (Vi) PetscCall(BVCopyVec(V,k+1,Vi)); |
| 432 |
2/2✓ Branch 0 taken 15 times.
✓ Branch 1 taken 20 times.
|
55577 | } else if (eigi < 0.0) { /* second value of conjugate pair */ |
| 433 |
5/8✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
|
915 | if (Vr) PetscCall(BVCopyVec(V,k-1,Vr)); |
| 434 |
1/2✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
|
915 | if (Vi) { |
| 435 |
4/6✓ Branch 0 taken 3 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
915 | PetscCall(BVCopyVec(V,k,Vi)); |
| 436 |
4/6✓ Branch 0 taken 3 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
915 | PetscCall(VecScale(Vi,-1.0)); |
| 437 | } | ||
| 438 | } else { /* real eigenvalue */ | ||
| 439 |
6/8✓ Branch 0 taken 20 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
|
54662 | if (Vr) PetscCall(BVCopyVec(V,k,Vr)); |
| 440 |
6/8✓ Branch 0 taken 20 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
|
54662 | if (Vi) PetscCall(VecSet(Vi,0.0)); |
| 441 | } | ||
| 442 | #endif | ||
| 443 |
6/12✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
|
19712 | PetscFunctionReturn(PETSC_SUCCESS); |
| 444 | } | ||
| 445 | |||
| 446 | /* | ||
| 447 | BV_OrthogonalizeColumn_Safe - this is intended for cases where we know that | ||
| 448 | the resulting vector is going to be numerically zero, so normalization or | ||
| 449 | iterative refinement may cause problems in parallel (collective operation | ||
| 450 | not being called by all processes) | ||
| 451 | */ | ||
| 452 | 508 | static inline PetscErrorCode BV_OrthogonalizeColumn_Safe(BV bv,PetscInt j,PetscScalar *H,PetscReal *norm,PetscBool *lindep) | |
| 453 | { | ||
| 454 | 508 | BVOrthogRefineType orthog_ref; | |
| 455 | |||
| 456 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
508 | PetscFunctionBegin; |
| 457 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
508 | PetscCall(PetscInfo(bv,"Orthogonalizing column %" PetscInt_FMT " without refinement\n",j)); |
| 458 | 508 | orthog_ref = bv->orthog_ref; | |
| 459 | 508 | bv->orthog_ref = BV_ORTHOG_REFINE_NEVER; /* avoid refinement */ | |
| 460 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
508 | PetscCall(BVOrthogonalizeColumn(bv,j,H,NULL,NULL)); |
| 461 | 508 | bv->orthog_ref = orthog_ref; /* restore refinement setting */ | |
| 462 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
508 | if (norm) *norm = 0.0; |
| 463 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
508 | if (lindep) *lindep = PETSC_TRUE; |
| 464 |
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.
|
83 | PetscFunctionReturn(PETSC_SUCCESS); |
| 465 | } | ||
| 466 | |||
| 467 | /* | ||
| 468 | BV_SetDefaultLD - set the default value of the leading dimension, based on | ||
| 469 | the local size. | ||
| 470 | */ | ||
| 471 | 149204 | static inline PetscErrorCode BV_SetDefaultLD(BV bv,PetscInt nloc) | |
| 472 | { | ||
| 473 | 149204 | size_t bytes,align; | |
| 474 | |||
| 475 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
149204 | PetscFunctionBegin; |
| 476 |
2/2✓ Branch 0 taken 30 times.
✓ Branch 1 taken 30 times.
|
149204 | if (bv->ld) { /* set by user */ |
| 477 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
125958 | PetscCheck(bv->ld>=nloc,PetscObjectComm((PetscObject)bv),PETSC_ERR_USER_INPUT,"The leading dimension %" PetscInt_FMT " should be larger or equal to the local number of rows %" PetscInt_FMT,bv->ld,nloc); |
| 478 | } else { | ||
| 479 | 23246 | align = PetscMax(PETSC_MEMALIGN,16); /* assume that CUDA requires 16-byte alignment */ | |
| 480 | 23246 | bytes = (nloc*sizeof(PetscScalar) + align - 1) & ~(align - 1); | |
| 481 |
4/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
|
23246 | PetscCall(PetscIntCast(bytes/sizeof(PetscScalar),&bv->ld)); |
| 482 | } | ||
| 483 |
6/12✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
|
28912 | PetscFunctionReturn(PETSC_SUCCESS); |
| 484 | } | ||
| 485 | |||
| 486 | #if defined(PETSC_HAVE_CUDA) | ||
| 487 | /* | ||
| 488 | BV_MatDenseCUDAGetArrayRead - if Q is MATSEQDENSE it will allocate memory on the | ||
| 489 | GPU and copy the contents; otherwise, calls MatDenseCUDAGetArrayRead() | ||
| 490 | */ | ||
| 491 | 3801 | static inline PetscErrorCode BV_MatDenseCUDAGetArrayRead(BV bv,Mat Q,const PetscScalar **d_q) | |
| 492 | { | ||
| 493 | 3801 | const PetscScalar *q; | |
| 494 | 3801 | PetscInt ldq,mq; | |
| 495 | 3801 | PetscCuBLASInt ldq_=0; | |
| 496 | 3801 | PetscBool matiscuda; | |
| 497 | |||
| 498 | 3801 | PetscFunctionBegin; | |
| 499 | 3801 | (void)bv; // avoid unused parameter warning | |
| 500 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3801 | PetscCall(MatGetSize(Q,NULL,&mq)); |
| 501 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3801 | PetscCall(MatDenseGetLDA(Q,&ldq)); |
| 502 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3801 | PetscCall(PetscCuBLASIntCast(ldq,&ldq_)); |
| 503 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3801 | PetscCall(PetscObjectTypeCompare((PetscObject)Q,MATSEQDENSECUDA,&matiscuda)); |
| 504 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
|
3801 | if (matiscuda) PetscCall(MatDenseCUDAGetArrayRead(Q,d_q)); |
| 505 | else { | ||
| 506 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3785 | PetscCall(MatDenseGetArrayRead(Q,&q)); |
| 507 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3785 | PetscCallCUDA(cudaMalloc((void**)d_q,ldq*mq*sizeof(PetscScalar))); |
| 508 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3785 | PetscCallCUDA(cudaMemcpy((void*)*d_q,q,ldq*mq*sizeof(PetscScalar),cudaMemcpyHostToDevice)); |
| 509 | 3785 | PetscCall(PetscLogCpuToGpu(ldq*mq*sizeof(PetscScalar))); | |
| 510 | } | ||
| 511 | PetscFunctionReturn(PETSC_SUCCESS); | ||
| 512 | } | ||
| 513 | |||
| 514 | /* | ||
| 515 | BV_MatDenseCUDARestoreArrayRead - restores the pointer obtained with BV_MatDenseCUDAGetArrayRead(), | ||
| 516 | freeing the GPU memory in case of MATSEQDENSE | ||
| 517 | */ | ||
| 518 | 3801 | static inline PetscErrorCode BV_MatDenseCUDARestoreArrayRead(BV bv,Mat Q,const PetscScalar **d_q) | |
| 519 | { | ||
| 520 | 3801 | PetscBool matiscuda; | |
| 521 | |||
| 522 | 3801 | PetscFunctionBegin; | |
| 523 | 3801 | (void)bv; // avoid unused parameter warning | |
| 524 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3801 | PetscCall(PetscObjectTypeCompare((PetscObject)Q,MATSEQDENSECUDA,&matiscuda)); |
| 525 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
|
3801 | if (matiscuda) PetscCall(MatDenseCUDARestoreArrayRead(Q,d_q)); |
| 526 | else { | ||
| 527 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
3785 | PetscCall(MatDenseRestoreArrayRead(Q,NULL)); |
| 528 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3785 | PetscCallCUDA(cudaFree((void*)*d_q)); |
| 529 | 3785 | *d_q = NULL; | |
| 530 | } | ||
| 531 | PetscFunctionReturn(PETSC_SUCCESS); | ||
| 532 | } | ||
| 533 | |||
| 534 | SLEPC_INTERN PetscErrorCode BVMult_BLAS_CUDA(BV,PetscInt,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscScalar,PetscScalar*,PetscInt); | ||
| 535 | SLEPC_INTERN PetscErrorCode BVMultVec_BLAS_CUDA(BV,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,const PetscScalar*,PetscScalar,PetscScalar*); | ||
| 536 | SLEPC_INTERN PetscErrorCode BVMultInPlace_BLAS_CUDA(BV,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscBool); | ||
| 537 | SLEPC_INTERN PetscErrorCode BVAXPY_BLAS_CUDA(BV,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,PetscScalar,PetscScalar*,PetscInt); | ||
| 538 | SLEPC_INTERN PetscErrorCode BVDot_BLAS_CUDA(BV,PetscInt,PetscInt,PetscInt,const PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscScalar*,PetscInt,PetscBool); | ||
| 539 | SLEPC_INTERN PetscErrorCode BVDotVec_BLAS_CUDA(BV,PetscInt,PetscInt,const PetscScalar*,PetscInt,const PetscScalar*,PetscScalar*,PetscBool); | ||
| 540 | SLEPC_INTERN PetscErrorCode BVScale_BLAS_CUDA(BV,PetscInt,PetscScalar*,PetscScalar); | ||
| 541 | SLEPC_INTERN PetscErrorCode BVNorm_BLAS_CUDA(BV,PetscInt,const PetscScalar*,PetscReal*); | ||
| 542 | SLEPC_INTERN PetscErrorCode BVNormalize_BLAS_CUDA(BV,PetscInt,PetscInt,PetscScalar*,PetscInt,PetscScalar*); | ||
| 543 | |||
| 544 | SLEPC_INTERN PetscErrorCode BV_CleanCoefficients_CUDA(BV,PetscInt,PetscScalar*); | ||
| 545 | SLEPC_INTERN PetscErrorCode BV_AddCoefficients_CUDA(BV,PetscInt,PetscScalar*,PetscScalar*); | ||
| 546 | SLEPC_INTERN PetscErrorCode BV_SetValue_CUDA(BV,PetscInt,PetscInt,PetscScalar*,PetscScalar); | ||
| 547 | SLEPC_INTERN PetscErrorCode BV_SquareSum_CUDA(BV,PetscInt,PetscScalar*,PetscReal*); | ||
| 548 | SLEPC_INTERN PetscErrorCode BV_ApplySignature_CUDA(BV,PetscInt,PetscScalar*,PetscBool); | ||
| 549 | SLEPC_INTERN PetscErrorCode BV_SquareRoot_CUDA(BV,PetscInt,PetscScalar*,PetscReal*); | ||
| 550 | SLEPC_INTERN PetscErrorCode BV_StoreCoefficients_CUDA(BV,PetscInt,PetscScalar*,PetscScalar*); | ||
| 551 | #define BV_CleanCoefficients(a,b,c) ((a)->cuda?BV_CleanCoefficients_CUDA:BV_CleanCoefficients_Default)((a),(b),(c)) | ||
| 552 | #define BV_AddCoefficients(a,b,c,d) ((a)->cuda?BV_AddCoefficients_CUDA:BV_AddCoefficients_Default)((a),(b),(c),(d)) | ||
| 553 | #define BV_SetValue(a,b,c,d,e) ((a)->cuda?BV_SetValue_CUDA:BV_SetValue_Default)((a),(b),(c),(d),(e)) | ||
| 554 | #define BV_SquareSum(a,b,c,d) ((a)->cuda?BV_SquareSum_CUDA:BV_SquareSum_Default)((a),(b),(c),(d)) | ||
| 555 | #define BV_ApplySignature(a,b,c,d) ((a)->cuda?BV_ApplySignature_CUDA:BV_ApplySignature_Default)((a),(b),(c),(d)) | ||
| 556 | #define BV_SquareRoot(a,b,c,d) ((a)->cuda?BV_SquareRoot_CUDA:BV_SquareRoot_Default)((a),(b),(c),(d)) | ||
| 557 | #define BV_StoreCoefficients(a,b,c,d) ((a)->cuda?BV_StoreCoefficients_CUDA:BV_StoreCoefficients_Default)((a),(b),(c),(d)) | ||
| 558 | |||
| 559 | #elif defined(PETSC_HAVE_HIP) | ||
| 560 | #include <petscdevice_cupm.h> | ||
| 561 | /* | ||
| 562 | BV_MatDenseHIPGetArrayRead - if Q is MATSEQDENSE it will allocate memory on the | ||
| 563 | GPU and copy the contents; otherwise, calls MatDenseHIPGetArrayRead() | ||
| 564 | */ | ||
| 565 | 8711087579241381888 | static inline PetscErrorCode BV_MatDenseHIPGetArrayRead(BV bv,Mat Q,const PetscScalar **d_q) | |
| 566 | { | ||
| 567 | 8711087579241381888 | const PetscScalar *q; | |
| 568 | 8711087579241381888 | PetscInt ldq,mq; | |
| 569 | 8711087579241381888 | PetscCuBLASInt ldq_=0; | |
| 570 | 8711087579241381888 | PetscBool matiship; | |
| 571 | |||
| 572 | PetscFunctionBegin; | ||
| 573 | (void)bv; // avoid unused parameter warning | ||
| 574 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(MatGetSize(Q,NULL,&mq)); |
| 575 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(MatDenseGetLDA(Q,&ldq)); |
| 576 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(PetscHipBLASIntCast(ldq,&ldq_)); |
| 577 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(PetscObjectTypeCompare((PetscObject)Q,MATSEQDENSEHIP,&matiship)); |
| 578 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
8711087579241381888 | if (matiship) PetscCall(MatDenseHIPGetArrayRead(Q,d_q)); |
| 579 | else { | ||
| 580 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(MatDenseGetArrayRead(Q,&q)); |
| 581 |
2/8✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8711087579241381888 | PetscCallHIP(hipMalloc((void**)d_q,ldq*mq*sizeof(PetscScalar))); |
| 582 |
2/8✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8711087579241381888 | PetscCallHIP(hipMemcpy((void*)*d_q,q,ldq*mq*sizeof(PetscScalar),hipMemcpyHostToDevice)); |
| 583 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(PetscLogCpuToGpu(ldq*mq*sizeof(PetscScalar))); |
| 584 | } | ||
| 585 | 8711087579241381888 | PetscFunctionReturn(PETSC_SUCCESS); | |
| 586 | 8711087579241381888 | } | |
| 587 | |||
| 588 | /* | ||
| 589 | BV_MatDenseHIPRestoreArrayRead - restores the pointer obtained with BV_MatDenseHIPGetArrayRead(), | ||
| 590 | freeing the GPU memory in case of MATSEQDENSE | ||
| 591 | */ | ||
| 592 | 8711087579241381888 | static inline PetscErrorCode BV_MatDenseHIPRestoreArrayRead(BV bv,Mat Q,const PetscScalar **d_q) | |
| 593 | { | ||
| 594 | 8711087579241381888 | PetscBool matiship; | |
| 595 | |||
| 596 | PetscFunctionBegin; | ||
| 597 | (void)bv; // avoid unused parameter warning | ||
| 598 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(PetscObjectTypeCompare((PetscObject)Q,MATSEQDENSEHIP,&matiship)); |
| 599 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
8711087579241381888 | if (matiship) PetscCall(MatDenseHIPRestoreArrayRead(Q,d_q)); |
| 600 | else { | ||
| 601 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
8711087579241381888 | PetscCall(MatDenseRestoreArrayRead(Q,NULL)); |
| 602 |
2/8✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
8711087579241381888 | PetscCallHIP(hipFree((void*)*d_q)); |
| 603 | 8711087579241381888 | *d_q = NULL; | |
| 604 | } | ||
| 605 | 8711087579241381888 | PetscFunctionReturn(PETSC_SUCCESS); | |
| 606 | 8711087579241381888 | } | |
| 607 | |||
| 608 | SLEPC_INTERN PetscErrorCode BVMult_BLAS_HIP(BV,PetscInt,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscScalar,PetscScalar*,PetscInt); | ||
| 609 | SLEPC_INTERN PetscErrorCode BVMultVec_BLAS_HIP(BV,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,const PetscScalar*,PetscScalar,PetscScalar*); | ||
| 610 | SLEPC_INTERN PetscErrorCode BVMultInPlace_BLAS_HIP(BV,PetscInt,PetscInt,PetscInt,PetscInt,PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscBool); | ||
| 611 | SLEPC_INTERN PetscErrorCode BVAXPY_BLAS_HIP(BV,PetscInt,PetscInt,PetscScalar,const PetscScalar*,PetscInt,PetscScalar,PetscScalar*,PetscInt); | ||
| 612 | SLEPC_INTERN PetscErrorCode BVDot_BLAS_HIP(BV,PetscInt,PetscInt,PetscInt,const PetscScalar*,PetscInt,const PetscScalar*,PetscInt,PetscScalar*,PetscInt,PetscBool); | ||
| 613 | SLEPC_INTERN PetscErrorCode BVDotVec_BLAS_HIP(BV,PetscInt,PetscInt,const PetscScalar*,PetscInt,const PetscScalar*,PetscScalar*,PetscBool); | ||
| 614 | SLEPC_INTERN PetscErrorCode BVScale_BLAS_HIP(BV,PetscInt,PetscScalar*,PetscScalar); | ||
| 615 | SLEPC_INTERN PetscErrorCode BVNorm_BLAS_HIP(BV,PetscInt,const PetscScalar*,PetscReal*); | ||
| 616 | SLEPC_INTERN PetscErrorCode BVNormalize_BLAS_HIP(BV,PetscInt,PetscInt,PetscScalar*,PetscInt,PetscScalar*); | ||
| 617 | |||
| 618 | SLEPC_INTERN PetscErrorCode BV_CleanCoefficients_HIP(BV,PetscInt,PetscScalar*); | ||
| 619 | SLEPC_INTERN PetscErrorCode BV_AddCoefficients_HIP(BV,PetscInt,PetscScalar*,PetscScalar*); | ||
| 620 | SLEPC_INTERN PetscErrorCode BV_SetValue_HIP(BV,PetscInt,PetscInt,PetscScalar*,PetscScalar); | ||
| 621 | SLEPC_INTERN PetscErrorCode BV_SquareSum_HIP(BV,PetscInt,PetscScalar*,PetscReal*); | ||
| 622 | SLEPC_INTERN PetscErrorCode BV_ApplySignature_HIP(BV,PetscInt,PetscScalar*,PetscBool); | ||
| 623 | SLEPC_INTERN PetscErrorCode BV_SquareRoot_HIP(BV,PetscInt,PetscScalar*,PetscReal*); | ||
| 624 | SLEPC_INTERN PetscErrorCode BV_StoreCoefficients_HIP(BV,PetscInt,PetscScalar*,PetscScalar*); | ||
| 625 | #define BV_CleanCoefficients(a,b,c) ((a)->hip?BV_CleanCoefficients_HIP:BV_CleanCoefficients_Default)((a),(b),(c)) | ||
| 626 | #define BV_AddCoefficients(a,b,c,d) ((a)->hip?BV_AddCoefficients_HIP:BV_AddCoefficients_Default)((a),(b),(c),(d)) | ||
| 627 | #define BV_SetValue(a,b,c,d,e) ((a)->hip?BV_SetValue_HIP:BV_SetValue_Default)((a),(b),(c),(d),(e)) | ||
| 628 | #define BV_SquareSum(a,b,c,d) ((a)->hip?BV_SquareSum_HIP:BV_SquareSum_Default)((a),(b),(c),(d)) | ||
| 629 | #define BV_ApplySignature(a,b,c,d) ((a)->hip?BV_ApplySignature_HIP:BV_ApplySignature_Default)((a),(b),(c),(d)) | ||
| 630 | #define BV_SquareRoot(a,b,c,d) ((a)->hip?BV_SquareRoot_HIP:BV_SquareRoot_Default)((a),(b),(c),(d)) | ||
| 631 | #define BV_StoreCoefficients(a,b,c,d) ((a)->hip?BV_StoreCoefficients_HIP:BV_StoreCoefficients_Default)((a),(b),(c),(d)) | ||
| 632 | |||
| 633 | #else /* CPU */ | ||
| 634 | #define BV_CleanCoefficients(a,b,c) BV_CleanCoefficients_Default((a),(b),(c)) | ||
| 635 | #define BV_AddCoefficients(a,b,c,d) BV_AddCoefficients_Default((a),(b),(c),(d)) | ||
| 636 | #define BV_SetValue(a,b,c,d,e) BV_SetValue_Default((a),(b),(c),(d),(e)) | ||
| 637 | #define BV_SquareSum(a,b,c,d) BV_SquareSum_Default((a),(b),(c),(d)) | ||
| 638 | #define BV_ApplySignature(a,b,c,d) BV_ApplySignature_Default((a),(b),(c),(d)) | ||
| 639 | #define BV_SquareRoot(a,b,c,d) BV_SquareRoot_Default((a),(b),(c),(d)) | ||
| 640 | #define BV_StoreCoefficients(a,b,c,d) BV_StoreCoefficients_Default((a),(b),(c),(d)) | ||
| 641 | #endif /* PETSC_HAVE_CUDA */ | ||
| 642 |