GCC Code Coverage Report


Directory: ./
File: src/eps/impls/davidson/dvdinitv.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 62 65 95.4%
Functions: 5 5 100.0%
Branches: 139 238 58.4%

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: initialize subspace V
14 */
15
16 #include "davidson.h"
17
18 typedef struct {
19 PetscInt k; /* desired initial subspace size */
20 PetscInt user; /* number of user initial vectors */
21 void *old_initV_data; /* old initV data */
22 } dvdInitV;
23
24 880 static PetscErrorCode dvd_initV_classic_0(dvdDashboard *d)
25 {
26 880 dvdInitV *data = (dvdInitV*)d->initV_data;
27 880 PetscInt i,user = PetscMin(data->user,d->eps->mpd), l,k;
28
29
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
880 PetscFunctionBegin;
30
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
880 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
31 /* User vectors are added at the beginning, so no active column should be in V */
32
3/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
880 PetscAssert(data->user==0 || l==0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
33 /* Generate a set of random initial vectors and orthonormalize them */
34
10/12
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
5966 for (i=l+user;i<l+data->k && i<d->eps->ncv && i-l<d->eps->mpd;i++) PetscCall(BVSetRandomColumn(d->eps->V,i));
35 880 d->V_tra_s = 0; d->V_tra_e = 0;
36 880 d->V_new_s = 0; d->V_new_e = i-l;
37
38 /* After that the user vectors will be destroyed */
39 880 data->user = 0;
40
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.
880 PetscFunctionReturn(PETSC_SUCCESS);
41 }
42
43 100 static PetscErrorCode dvd_initV_krylov_0(dvdDashboard *d)
44 {
45 100 dvdInitV *data = (dvdInitV*)d->initV_data;
46 100 PetscInt i,user = PetscMin(data->user,d->eps->mpd),l,k;
47 100 Vec av,v1,v2;
48
49
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
100 PetscFunctionBegin;
50
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
100 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
51 /* User vectors are added at the beginning, so no active column should be in V */
52
3/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
100 PetscAssert(data->user==0 || l==0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
53
54 /* If needed, generate a random vector for starting the arnoldi method */
55
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
100 if (user == 0) {
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.
90 PetscCall(BVSetRandomColumn(d->eps->V,l));
57 user = 1;
58 }
59
60 /* Perform k steps of Arnoldi with the operator K^{-1}*(t[1]*A-t[2]*B) */
61
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
100 PetscCall(dvd_orthV(d->eps->V,l,l+user));
62
4/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 not taken.
600 for (i=l+user;i<l+data->k && i<d->eps->ncv && i-l<d->eps->mpd;i++) {
63 /* aux <- theta[1]A*in - theta[0]*B*in */
64
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(BVGetColumn(d->eps->V,i,&v1));
65
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(BVGetColumn(d->eps->V,i-user,&v2));
66
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(BVGetColumn(d->auxBV,0,&av));
67
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
500 if (d->B) {
68 PetscCall(MatMult(d->A,v2,v1));
69 PetscCall(MatMult(d->B,v2,av));
70 PetscCall(VecAXPBY(av,d->target[1],-d->target[0],v1));
71 } else {
72
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(MatMult(d->A,v2,av));
73
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(VecAXPBY(av,-d->target[0],d->target[1],v2));
74 }
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.
500 PetscCall(d->improvex_precond(d,0,av,v1));
76
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(BVRestoreColumn(d->eps->V,i,&v1));
77
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(BVRestoreColumn(d->eps->V,i-user,&v2));
78
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(BVRestoreColumn(d->auxBV,0,&av));
79
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
500 PetscCall(dvd_orthV(d->eps->V,i,i+1));
80 }
81
82 100 d->V_tra_s = 0; d->V_tra_e = 0;
83 100 d->V_new_s = 0; d->V_new_e = i-l;
84
85 /* After that the user vectors will be destroyed */
86 100 data->user = 0;
87
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.
100 PetscFunctionReturn(PETSC_SUCCESS);
88 }
89
90 980 static PetscErrorCode dvd_initV_d(dvdDashboard *d)
91 {
92 980 dvdInitV *data = (dvdInitV*)d->initV_data;
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
980 PetscFunctionBegin;
95 /* Restore changes in dvdDashboard */
96 980 d->initV_data = data->old_initV_data;
97
98 /* Free local data */
99
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));
100
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);
101 }
102
103 2940 PetscErrorCode dvd_initV(dvdDashboard *d, dvdBlackboard *b, PetscInt k,PetscInt user, PetscBool krylov)
104 {
105 2940 dvdInitV *data;
106
107
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2940 PetscFunctionBegin;
108 /* Setting configuration constrains */
109 2940 b->max_size_V = PetscMax(b->max_size_V, k);
110
111 /* Setup the step */
112
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2940 if (b->state >= DVD_STATE_CONF) {
113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscNew(&data));
114 980 data->k = k;
115 980 data->user = user;
116 980 data->old_initV_data = d->initV_data;
117 980 d->initV_data = data;
118
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (krylov) d->initV = dvd_initV_krylov_0;
119 880 else d->initV = dvd_initV_classic_0;
120
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(EPSDavidsonFLAdd(&d->destroyList,dvd_initV_d));
121 }
122
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);
123 }
124
125 82802 PetscErrorCode dvd_orthV(BV V,PetscInt V_new_s,PetscInt V_new_e)
126 {
127 82802 PetscInt i;
128
129
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
82802 PetscFunctionBegin;
130
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
202293 for (i=V_new_s;i<V_new_e;i++) PetscCall(BVOrthonormalizeColumn(V,i,PETSC_TRUE,NULL,NULL));
131
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.
16169 PetscFunctionReturn(PETSC_SUCCESS);
132 }
133