| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
| 4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
| 5 | |||
| 6 | This file is part of SLEPc. | ||
| 7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
| 8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 9 | */ | ||
| 10 | /* | ||
| 11 | SLEPc eigensolver: "davidson" | ||
| 12 | |||
| 13 | Step: test for restarting, updateV, restartV | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include "davidson.h" | ||
| 17 | |||
| 18 | typedef struct { | ||
| 19 | PetscInt min_size_V; /* restart with this number of eigenvectors */ | ||
| 20 | PetscInt plusk; /* at restart, save plusk vectors from last iteration */ | ||
| 21 | PetscInt mpd; /* max size of the searching subspace */ | ||
| 22 | void *old_updateV_data; /* old updateV data */ | ||
| 23 | PetscErrorCode (*old_isRestarting)(dvdDashboard*,PetscBool*); /* old isRestarting */ | ||
| 24 | Mat oldU; /* previous projected right igenvectors */ | ||
| 25 | Mat oldV; /* previous projected left eigenvectors */ | ||
| 26 | PetscInt size_oldU; /* size of oldU */ | ||
| 27 | PetscBool allResiduals; /* if computing all the residuals */ | ||
| 28 | } dvdManagV_basic; | ||
| 29 | |||
| 30 | 980 | static PetscErrorCode dvd_updateV_start(dvdDashboard *d) | |
| 31 | { | ||
| 32 | 980 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 33 | 980 | PetscInt i; | |
| 34 | |||
| 35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
980 | PetscFunctionBegin; |
| 36 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19958 | for (i=0;i<d->eps->ncv;i++) d->eigi[i] = 0.0; |
| 37 | 980 | d->nR = d->real_nR; | |
| 38 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19958 | for (i=0;i<d->eps->ncv;i++) d->nR[i] = 1.0; |
| 39 | 980 | d->nX = d->real_nX; | |
| 40 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19958 | for (i=0;i<d->eps->ncv;i++) d->errest[i] = 1.0; |
| 41 | 980 | data->size_oldU = 0; | |
| 42 | 980 | d->nconv = 0; | |
| 43 | 980 | d->npreconv = 0; | |
| 44 | 980 | d->V_tra_s = d->V_tra_e = d->V_new_s = d->V_new_e = 0; | |
| 45 | 980 | d->size_D = 0; | |
| 46 |
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.
|
980 | PetscFunctionReturn(PETSC_SUCCESS); |
| 47 | } | ||
| 48 | |||
| 49 | 85413 | static PetscErrorCode dvd_isrestarting_fullV(dvdDashboard *d,PetscBool *r) | |
| 50 | { | ||
| 51 | 85413 | PetscInt l,k; | |
| 52 | 85413 | PetscBool restart; | |
| 53 | 85413 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 54 | |||
| 55 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
85413 | PetscFunctionBegin; |
| 56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
85413 | PetscCall(BVGetActiveColumns(d->eps->V,&l,&k)); |
| 57 | 85413 | restart = (k+2 > d->eps->ncv)? PETSC_TRUE: PETSC_FALSE; | |
| 58 | |||
| 59 | /* Check old isRestarting function */ | ||
| 60 |
3/10✓ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
85413 | if (PetscUnlikely(!restart && data->old_isRestarting)) PetscCall(data->old_isRestarting(d,&restart)); |
| 61 | 85413 | *r = restart; | |
| 62 |
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.
|
85413 | PetscFunctionReturn(PETSC_SUCCESS); |
| 63 | } | ||
| 64 | |||
| 65 | 980 | static PetscErrorCode dvd_managementV_basic_d(dvdDashboard *d) | |
| 66 | { | ||
| 67 | 980 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 68 | |||
| 69 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
980 | PetscFunctionBegin; |
| 70 | /* Restore changes in dvdDashboard */ | ||
| 71 | 980 | d->updateV_data = data->old_updateV_data; | |
| 72 | |||
| 73 | /* Free local data */ | ||
| 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.
|
980 | PetscCall(MatDestroy(&data->oldU)); |
| 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.
|
980 | PetscCall(MatDestroy(&data->oldV)); |
| 76 |
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.
|
980 | PetscCall(PetscFree(d->real_nR)); |
| 77 |
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.
|
980 | PetscCall(PetscFree(d->real_nX)); |
| 78 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
980 | PetscCall(PetscFree(data)); |
| 79 |
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.
|
192 | PetscFunctionReturn(PETSC_SUCCESS); |
| 80 | } | ||
| 81 | |||
| 82 | 3226 | static PetscErrorCode dvd_updateV_conv_gen(dvdDashboard *d) | |
| 83 | { | ||
| 84 | 3226 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 85 | 3226 | PetscInt npreconv,cMT,cMTX,lV,kV,nV; | |
| 86 | 3226 | Mat Z,Z0,Q,Q0; | |
| 87 | 3226 | PetscBool t; | |
| 88 | #if !defined(PETSC_USE_COMPLEX) | ||
| 89 | 1588 | PetscInt i; | |
| 90 | #endif | ||
| 91 | |||
| 92 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3226 | PetscFunctionBegin; |
| 93 | 3226 | npreconv = d->npreconv; | |
| 94 | /* Constrains the converged pairs to nev */ | ||
| 95 | #if !defined(PETSC_USE_COMPLEX) | ||
| 96 | /* Tries to maintain together conjugate eigenpairs */ | ||
| 97 |
5/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
3176 | for (i=0; (i + (d->eigi[i]!=0.0?1:0) < npreconv) && (d->nconv + i < d->nev); i+= (d->eigi[i]!=0.0?2:1)); |
| 98 | 1588 | npreconv = i; | |
| 99 | #else | ||
| 100 | 1638 | npreconv = PetscMax(PetscMin(d->nev-d->nconv,npreconv),0); | |
| 101 | #endif | ||
| 102 | /* For GHEP without B-ortho, converge all of the requested pairs at once */ | ||
| 103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3226 | PetscCall(PetscObjectTypeCompare((PetscObject)d->eps->ds,DSGHEP,&t)); |
| 104 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3226 | if (t && d->nconv+npreconv<d->nev) npreconv = 0; |
| 105 | /* Quick exit */ | ||
| 106 |
2/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
3226 | if (npreconv == 0) PetscFunctionReturn(PETSC_SUCCESS); |
| 107 | |||
| 108 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3226 | PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV)); |
| 109 | 3226 | nV = kV - lV; | |
| 110 | 3226 | cMT = nV - npreconv; | |
| 111 | /* Harmonics restarts with right eigenvectors, and other with the left ones. | ||
| 112 | If the problem is standard or hermitian, left and right vectors are the same */ | ||
| 113 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
3226 | if (!(d->W||DVD_IS(d->sEP,DVD_EP_STD)||DVD_IS(d->sEP,DVD_EP_HERMITIAN))) { |
| 114 | /* ps.Q <- [ps.Q(0:npreconv-1) ps.Z(npreconv:size_H-1)] */ | ||
| 115 | ✗ | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Q,&Q)); | |
| 116 | ✗ | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Z,&Z)); | |
| 117 | ✗ | PetscCall(MatDenseGetSubMatrix(Q,0,npreconv,nV,npreconv+cMT,&Q0)); | |
| 118 | ✗ | PetscCall(MatDenseGetSubMatrix(Z,0,npreconv,nV,npreconv+cMT,&Z0)); | |
| 119 | ✗ | PetscCall(MatCopy(Z0,Q0,SAME_NONZERO_PATTERN)); | |
| 120 | ✗ | PetscCall(MatDenseRestoreSubMatrix(Q,&Q0)); | |
| 121 | ✗ | PetscCall(MatDenseRestoreSubMatrix(Z,&Z0)); | |
| 122 | ✗ | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Q,&Q)); | |
| 123 | ✗ | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Z,&Z)); | |
| 124 | } | ||
| 125 |
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.
|
3226 | if (DVD_IS(d->sEP,DVD_EP_INDEFINITE)) PetscCall(DSPseudoOrthogonalize(d->eps->ds,DS_MAT_Q,nV,d->nBds,&cMTX,d->nBds)); |
| 126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3226 | else PetscCall(DSOrthogonalize(d->eps->ds,DS_MAT_Q,nV,&cMTX)); |
| 127 | 3226 | cMT = cMTX - npreconv; | |
| 128 | |||
| 129 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3226 | if (d->W) { |
| 130 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
528 | PetscCall(DSOrthogonalize(d->eps->ds,DS_MAT_Z,nV,&cMTX)); |
| 131 | 528 | cMT = PetscMin(cMT,cMTX - npreconv); | |
| 132 | } | ||
| 133 | |||
| 134 | /* Lock the converged pairs */ | ||
| 135 | 3226 | d->eigr+= npreconv; | |
| 136 | #if !defined(PETSC_USE_COMPLEX) | ||
| 137 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
1588 | if (d->eigi) d->eigi+= npreconv; |
| 138 | #endif | ||
| 139 | 3226 | d->nconv+= npreconv; | |
| 140 | 3226 | d->errest+= npreconv; | |
| 141 | /* Notify the changes in V and update the other subspaces */ | ||
| 142 | 3226 | d->V_tra_s = npreconv; d->V_tra_e = nV; | |
| 143 | 3226 | d->V_new_s = cMT; d->V_new_e = d->V_new_s; | |
| 144 | /* Remove oldU */ | ||
| 145 | 3226 | data->size_oldU = 0; | |
| 146 | |||
| 147 | 3226 | d->npreconv-= npreconv; | |
| 148 |
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.
|
3226 | PetscFunctionReturn(PETSC_SUCCESS); |
| 149 | } | ||
| 150 | |||
| 151 | 11844 | static PetscErrorCode dvd_updateV_restart_gen(dvdDashboard *d) | |
| 152 | { | ||
| 153 | 11844 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 154 | 11844 | PetscInt lV,kV,nV,size_plusk,size_X,cMTX,cMTY,max_restart_size; | |
| 155 | 11844 | Mat Q,Q0,Z,Z0,U,V; | |
| 156 | |||
| 157 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
11844 | PetscFunctionBegin; |
| 158 | /* Select size_X desired pairs from V */ | ||
| 159 | /* The restarted basis should: | ||
| 160 | - have at least one spot to add a new direction; | ||
| 161 | - keep converged vectors, npreconv; | ||
| 162 | - keep at least 1 oldU direction if possible. | ||
| 163 | */ | ||
| 164 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11844 | PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV)); |
| 165 | 11844 | nV = kV - lV; | |
| 166 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
11844 | max_restart_size = PetscMax(0,PetscMin(d->eps->mpd - 1,d->eps->ncv - lV - 2)); |
| 167 |
4/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
|
11844 | size_X = PetscMin(PetscMin(data->min_size_V+d->npreconv,max_restart_size - (max_restart_size - d->npreconv > 1 && data->plusk > 0 && data->size_oldU > 0 ? 1 : 0)), nV); |
| 168 | |||
| 169 | /* Add plusk eigenvectors from the previous iteration */ | ||
| 170 | 11844 | size_plusk = PetscMax(0,PetscMin(PetscMin(PetscMin(data->plusk,data->size_oldU),max_restart_size - size_X),nV - size_X)); | |
| 171 | |||
| 172 | 11844 | d->size_MT = nV; | |
| 173 | /* ps.Q <- orth([pX(0:size_X-1) [oldU(0:size_plusk-1); 0] ]) */ | ||
| 174 | /* Harmonics restarts with right eigenvectors, and other with the left ones. | ||
| 175 | If the problem is standard or hermitian, left and right vectors are the same */ | ||
| 176 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
11844 | if (!(d->W||DVD_IS(d->sEP,DVD_EP_STD)||DVD_IS(d->sEP,DVD_EP_HERMITIAN))) { |
| 177 | ✗ | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Q,&Q)); | |
| 178 | ✗ | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Z,&Z)); | |
| 179 | ✗ | PetscCall(MatDenseGetSubMatrix(Q,0,nV,0,size_X,&Q0)); | |
| 180 | ✗ | PetscCall(MatDenseGetSubMatrix(Z,0,nV,0,size_X,&Z0)); | |
| 181 | ✗ | PetscCall(MatCopy(Z0,Q0,SAME_NONZERO_PATTERN)); | |
| 182 | ✗ | PetscCall(MatDenseRestoreSubMatrix(Q,&Q0)); | |
| 183 | ✗ | PetscCall(MatDenseRestoreSubMatrix(Z,&Z0)); | |
| 184 | ✗ | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Q,&Q)); | |
| 185 | ✗ | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Z,&Z)); | |
| 186 | } | ||
| 187 |
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.
|
11844 | PetscCheck(size_plusk<=0 || !DVD_IS(d->sEP,DVD_EP_INDEFINITE),PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported plusk>0 in indefinite eigenvalue problems"); |
| 188 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
11761 | if (size_plusk > 0) { |
| 189 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Q,&Q)); |
| 190 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(MatDenseGetSubMatrix(Q,0,nV,size_X,size_X+size_plusk,&Q0)); |
| 191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(MatDenseGetSubMatrix(data->oldU,0,nV,0,size_plusk,&U)); |
| 192 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(MatCopy(U,Q0,SAME_NONZERO_PATTERN)); |
| 193 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(MatDenseRestoreSubMatrix(Q,&Q0)); |
| 194 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(MatDenseRestoreSubMatrix(data->oldU,&U)); |
| 195 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11679 | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Q,&Q)); |
| 196 | } | ||
| 197 |
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.
|
11844 | if (DVD_IS(d->sEP,DVD_EP_INDEFINITE)) PetscCall(DSPseudoOrthogonalize(d->eps->ds,DS_MAT_Q,size_X,d->nBds,&cMTX,d->nBds)); |
| 198 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11844 | else PetscCall(DSOrthogonalize(d->eps->ds,DS_MAT_Q,size_X+size_plusk,&cMTX)); |
| 199 | |||
| 200 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
11844 | if (d->W && size_plusk > 0) { |
| 201 | /* ps.Z <- orth([ps.Z(0:size_X-1) [oldV(0:size_plusk-1); 0] ]) */ | ||
| 202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Z,&Z)); |
| 203 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(MatDenseGetSubMatrix(Z,0,nV,size_X,size_X+size_plusk,&Z0)); |
| 204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(MatDenseGetSubMatrix(data->oldV,0,nV,0,size_plusk,&V)); |
| 205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(MatCopy(V,Z0,SAME_NONZERO_PATTERN)); |
| 206 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(MatDenseRestoreSubMatrix(Z,&Z0)); |
| 207 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(MatDenseRestoreSubMatrix(data->oldV,&V)); |
| 208 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Z,&Z)); |
| 209 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1309 | PetscCall(DSOrthogonalize(d->eps->ds,DS_MAT_Z,size_X+size_plusk,&cMTY)); |
| 210 | 1309 | cMTX = PetscMin(cMTX, cMTY); | |
| 211 | } | ||
| 212 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
11844 | PetscAssert(cMTX<=size_X+size_plusk,PETSC_COMM_SELF,PETSC_ERR_SUP,"Invalid number of columns to restart"); |
| 213 | |||
| 214 | /* Notify the changes in V and update the other subspaces */ | ||
| 215 | 11844 | d->V_tra_s = 0; d->V_tra_e = cMTX; | |
| 216 | 11844 | d->V_new_s = d->V_tra_e; d->V_new_e = d->V_new_s; | |
| 217 | |||
| 218 | /* Remove oldU */ | ||
| 219 | 11844 | data->size_oldU = 0; | |
| 220 | |||
| 221 | /* Remove npreconv */ | ||
| 222 | 11844 | d->npreconv = 0; | |
| 223 |
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.
|
11844 | PetscFunctionReturn(PETSC_SUCCESS); |
| 224 | } | ||
| 225 | |||
| 226 | 143912 | static PetscErrorCode dvd_updateV_testConv(dvdDashboard *d,PetscInt s,PetscInt pre,PetscInt e,PetscInt *nConv) | |
| 227 | { | ||
| 228 | 143912 | PetscInt i,j,b; | |
| 229 | 143912 | PetscReal norm; | |
| 230 | 143912 | PetscBool conv, c; | |
| 231 | 143912 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 232 | |||
| 233 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
143912 | PetscFunctionBegin; |
| 234 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
143912 | if (nConv) *nConv = s; |
| 235 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
242692 | for (i=s,conv=PETSC_TRUE;(conv || data->allResiduals) && (i < e);i+=b) { |
| 236 | #if !defined(PETSC_USE_COMPLEX) | ||
| 237 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
46151 | b = d->eigi[i]!=0.0?2:1; |
| 238 | #else | ||
| 239 | 52629 | b = 1; | |
| 240 | #endif | ||
| 241 |
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.
|
98780 | if (i+b-1 >= pre) PetscCall(d->calcpairs_residual(d,i,i+b)); |
| 242 | /* Test the Schur vector */ | ||
| 243 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
197570 | for (j=0,c=PETSC_TRUE;j<b && c;j++) { |
| 244 | 98790 | norm = d->nR[i+j]/d->nX[i+j]; | |
| 245 | 98790 | c = d->testConv(d,d->eigr[i+j],d->eigi[i+j],norm,&d->errest[i+j]); | |
| 246 | } | ||
| 247 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
98780 | if (conv && c) { |
| 248 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3252 | if (nConv) *nConv = i+b; |
| 249 | } else conv = PETSC_FALSE; | ||
| 250 | } | ||
| 251 | 143912 | pre = PetscMax(pre,i); | |
| 252 | |||
| 253 | #if !defined(PETSC_USE_COMPLEX) | ||
| 254 | /* Enforce converged conjugate complex eigenpairs */ | ||
| 255 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
66810 | if (nConv) { |
| 256 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
35787 | for (j=0;j<*nConv;j++) if (d->eigi[j] != 0.0) j++; |
| 257 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
34199 | if (j>*nConv) (*nConv)--; |
| 258 | } | ||
| 259 | #endif | ||
| 260 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
145433 | for (i=pre;i<e;i++) d->errest[i] = d->nR[i] = 1.0; |
| 261 |
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.
|
27912 | PetscFunctionReturn(PETSC_SUCCESS); |
| 262 | } | ||
| 263 | |||
| 264 | 73569 | static PetscErrorCode dvd_updateV_update_gen(dvdDashboard *d) | |
| 265 | { | ||
| 266 | 73569 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 267 | 73569 | PetscInt size_D,s,lV,kV,nV; | |
| 268 | 73569 | Mat Q,Q0,Z,Z0,U,V; | |
| 269 | |||
| 270 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
73569 | PetscFunctionBegin; |
| 271 | /* Select the desired pairs */ | ||
| 272 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
73569 | PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV)); |
| 273 | 73569 | nV = kV - lV; | |
| 274 | 73569 | size_D = PetscMin(PetscMin(PetscMin(d->bs,nV),d->eps->ncv-nV),nV); | |
| 275 |
2/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
73569 | if (size_D == 0) PetscFunctionReturn(PETSC_SUCCESS); |
| 276 | |||
| 277 | /* Fill V with D */ | ||
| 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.
|
73569 | PetscCall(d->improveX(d,d->npreconv,d->npreconv+size_D,&size_D)); |
| 279 | |||
| 280 | /* If D is empty, exit */ | ||
| 281 | 73569 | d->size_D = size_D; | |
| 282 |
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.
|
73569 | if (size_D == 0) PetscFunctionReturn(PETSC_SUCCESS); |
| 283 | |||
| 284 | /* Get the residual of all pairs */ | ||
| 285 | #if !defined(PETSC_USE_COMPLEX) | ||
| 286 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
32611 | s = (d->eigi[0]!=0.0)? 2: 1; |
| 287 | #else | ||
| 288 | 37732 | s = 1; | |
| 289 | #endif | ||
| 290 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
70343 | PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV)); |
| 291 | 70343 | nV = kV - lV; | |
| 292 |
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.
|
70343 | PetscCall(dvd_updateV_testConv(d,s,s,data->allResiduals?nV:size_D,NULL)); |
| 293 | |||
| 294 | /* Notify the changes in V */ | ||
| 295 | 70343 | d->V_tra_s = 0; d->V_tra_e = 0; | |
| 296 | 70343 | d->V_new_s = nV; d->V_new_e = nV+size_D; | |
| 297 | |||
| 298 | /* Save the projected eigenvectors */ | ||
| 299 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
70343 | if (data->plusk > 0) { |
| 300 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
69910 | PetscCall(MatZeroEntries(data->oldU)); |
| 301 | 69910 | data->size_oldU = nV; | |
| 302 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
69910 | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Q,&Q)); |
| 303 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
69910 | PetscCall(MatDenseGetSubMatrix(Q,0,nV,0,nV,&Q0)); |
| 304 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
69910 | PetscCall(MatDenseGetSubMatrix(data->oldU,0,nV,0,nV,&U)); |
| 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.
|
69910 | PetscCall(MatCopy(Q0,U,SAME_NONZERO_PATTERN)); |
| 306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
69910 | PetscCall(MatDenseRestoreSubMatrix(Q,&Q0)); |
| 307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
69910 | PetscCall(MatDenseRestoreSubMatrix(data->oldU,&U)); |
| 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.
|
69910 | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Q,&Q)); |
| 309 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
69910 | if (d->W) { |
| 310 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10228 | PetscCall(MatZeroEntries(data->oldV)); |
| 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.
|
10228 | PetscCall(DSGetMat(d->eps->ds,DS_MAT_Z,&Z)); |
| 312 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10228 | PetscCall(MatDenseGetSubMatrix(Z,0,nV,0,nV,&Z0)); |
| 313 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10228 | PetscCall(MatDenseGetSubMatrix(data->oldV,0,nV,0,nV,&V)); |
| 314 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10228 | PetscCall(MatCopy(Z0,V,SAME_NONZERO_PATTERN)); |
| 315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10228 | PetscCall(MatDenseRestoreSubMatrix(Z,&Z0)); |
| 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.
|
10228 | PetscCall(MatDenseRestoreSubMatrix(data->oldV,&V)); |
| 317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10228 | PetscCall(DSRestoreMat(d->eps->ds,DS_MAT_Z,&Z)); |
| 318 | } | ||
| 319 | } | ||
| 320 |
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.
|
13643 | PetscFunctionReturn(PETSC_SUCCESS); |
| 321 | } | ||
| 322 | |||
| 323 | 85413 | static PetscErrorCode dvd_updateV_extrapol(dvdDashboard *d) | |
| 324 | { | ||
| 325 | 85413 | dvdManagV_basic *data = (dvdManagV_basic*)d->updateV_data; | |
| 326 | 85413 | PetscInt i; | |
| 327 | 85413 | PetscBool restart,t; | |
| 328 | |||
| 329 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
85413 | PetscFunctionBegin; |
| 330 | /* TODO: restrict select pairs to each case */ | ||
| 331 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
85413 | PetscCall(d->calcpairs_selectPairs(d, data->min_size_V+d->npreconv)); |
| 332 | |||
| 333 | /* If the subspaces doesn't need restart, add new vector */ | ||
| 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.
|
85413 | PetscCall(d->isRestarting(d,&restart)); |
| 335 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
85413 | if (!restart) { |
| 336 | 73569 | d->size_D = 0; | |
| 337 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
73569 | PetscCall(dvd_updateV_update_gen(d)); |
| 338 | |||
| 339 | /* If no vector were converged, exit */ | ||
| 340 | /* For GHEP without B-ortho, converge all of the requested pairs at once */ | ||
| 341 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
73569 | PetscCall(PetscObjectTypeCompare((PetscObject)d->eps->ds,DSGHEP,&t)); |
| 342 |
11/18✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ 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 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.
|
73569 | if (d->nconv+d->npreconv < d->nev && (t || d->npreconv == 0)) PetscFunctionReturn(PETSC_SUCCESS); |
| 343 | } | ||
| 344 | |||
| 345 | /* If some eigenpairs were converged, lock them */ | ||
| 346 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15070 | if (d->npreconv > 0) { |
| 347 | 3226 | i = d->npreconv; | |
| 348 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3226 | PetscCall(dvd_updateV_conv_gen(d)); |
| 349 | |||
| 350 | /* If some eigenpair was locked, exit */ | ||
| 351 |
8/14✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
3226 | if (i > d->npreconv) PetscFunctionReturn(PETSC_SUCCESS); |
| 352 | } | ||
| 353 | |||
| 354 | /* Else, a restarting is performed */ | ||
| 355 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
11844 | PetscCall(dvd_updateV_restart_gen(d)); |
| 356 |
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.
|
2350 | PetscFunctionReturn(PETSC_SUCCESS); |
| 357 | } | ||
| 358 | |||
| 359 | 2940 | PetscErrorCode dvd_managementV_basic(dvdDashboard *d,dvdBlackboard *b,PetscInt bs,PetscInt mpd,PetscInt min_size_V,PetscInt plusk,PetscBool harm,PetscBool allResiduals) | |
| 360 | { | ||
| 361 | 2940 | dvdManagV_basic *data; | |
| 362 | #if !defined(PETSC_USE_COMPLEX) | ||
| 363 | 1455 | PetscBool her_probl,std_probl; | |
| 364 | #endif | ||
| 365 | |||
| 366 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2940 | PetscFunctionBegin; |
| 367 | /* Setting configuration constrains */ | ||
| 368 | #if !defined(PETSC_USE_COMPLEX) | ||
| 369 | /* if the last converged eigenvalue is complex its conjugate pair is also | ||
| 370 | converged */ | ||
| 371 | 1455 | her_probl = DVD_IS(d->sEP,DVD_EP_HERMITIAN)? PETSC_TRUE: PETSC_FALSE; | |
| 372 | 1455 | std_probl = DVD_IS(d->sEP,DVD_EP_STD)? PETSC_TRUE: PETSC_FALSE; | |
| 373 | 1455 | b->max_size_X = PetscMax(b->max_size_X,bs+((her_probl && std_probl)?0:1)); | |
| 374 | #else | ||
| 375 | 1485 | b->max_size_X = PetscMax(b->max_size_X,bs); | |
| 376 | #endif | ||
| 377 | |||
| 378 | 2940 | b->max_size_V = PetscMax(b->max_size_V,mpd); | |
| 379 | 2940 | min_size_V = PetscMin(min_size_V,mpd-bs); | |
| 380 | 2940 | b->size_V = PetscMax(b->size_V,b->max_size_V+b->max_size_P+b->max_nev); | |
| 381 | 2940 | b->max_size_oldX = plusk; | |
| 382 | |||
| 383 | /* Setup the step */ | ||
| 384 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2940 | if (b->state >= DVD_STATE_CONF) { |
| 385 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
980 | PetscCall(PetscNew(&data)); |
| 386 | 980 | data->mpd = b->max_size_V; | |
| 387 | 980 | data->min_size_V = min_size_V; | |
| 388 | 980 | d->bs = bs; | |
| 389 | 980 | data->plusk = plusk; | |
| 390 | 980 | data->allResiduals = allResiduals; | |
| 391 | |||
| 392 | 980 | d->eigr = d->eps->eigr; | |
| 393 | 980 | d->eigi = d->eps->eigi; | |
| 394 | 980 | d->errest = d->eps->errest; | |
| 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.
|
980 | PetscCall(PetscMalloc1(d->eps->ncv,&d->real_nR)); |
| 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.
|
980 | PetscCall(PetscMalloc1(d->eps->ncv,&d->real_nX)); |
| 397 |
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.
|
980 | if (plusk > 0) PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,d->eps->ncv,d->eps->ncv,NULL,&data->oldU)); |
| 398 | 20 | else data->oldU = NULL; | |
| 399 |
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.
|
980 | if (harm && plusk>0) PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,d->eps->ncv,d->eps->ncv,NULL,&data->oldV)); |
| 400 | 782 | else data->oldV = NULL; | |
| 401 | |||
| 402 | 980 | data->old_updateV_data = d->updateV_data; | |
| 403 | 980 | d->updateV_data = data; | |
| 404 | 980 | data->old_isRestarting = d->isRestarting; | |
| 405 | 980 | d->isRestarting = dvd_isrestarting_fullV; | |
| 406 | 980 | d->updateV = dvd_updateV_extrapol; | |
| 407 | 980 | d->preTestConv = dvd_updateV_testConv; | |
| 408 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
980 | PetscCall(EPSDavidsonFLAdd(&d->startList,dvd_updateV_start)); |
| 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.
|
980 | PetscCall(EPSDavidsonFLAdd(&d->destroyList,dvd_managementV_basic_d)); |
| 410 | } | ||
| 411 |
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.
|
576 | PetscFunctionReturn(PETSC_SUCCESS); |
| 412 | } | ||
| 413 |