GCC Code Coverage Report


Directory: ./
File: src/sys/vec/veccomp0.h
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 169 194 87.1%
Functions: 5 10 50.0%
Branches: 360 771 46.7%

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 #include <petsc/private/vecimpl.h>
12
13 #if defined(__WITH_MPI__)
14 #define __SUF__(A) A##_MPI
15 #else
16 #define __SUF__(A) A##_Seq
17 #endif
18 #define __QUOTEME_(x) #x
19 #define __QUOTEME(x) __QUOTEME_(x)
20 #define __SUF_C__(A) __QUOTEME(__SUF__(A))
21
22 1072234 static PetscErrorCode __SUF__(VecDot_Comp)(Vec a,Vec b,PetscScalar *z)
23 {
24 1072234 PetscScalar sum = 0.0,work;
25 1072234 PetscInt i;
26 1072234 Vec_Comp *as = (Vec_Comp*)a->data,*bs = (Vec_Comp*)b->data;
27
28
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1072234 PetscFunctionBegin;
29
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1072234 SlepcValidVecComp(a,1);
30
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1072234 SlepcValidVecComp(b,2);
31
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1072234 if (as->x[0]->ops->dot_local) {
32
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2147208 for (i=0;i<as->n->n;i++) {
33
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1074974 PetscUseTypeMethod(as->x[i],dot_local,bs->x[i],&work);
34 1074974 sum += work;
35 }
36 #if defined(__WITH_MPI__)
37 1072234 work = sum;
38
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
1072234 PetscCallMPI(MPIU_Allreduce(&work,&sum,1,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)a)));
39 #endif
40 } else {
41 for (i=0;i<as->n->n;i++) {
42 PetscCall(VecDot(as->x[i],bs->x[i],&work));
43 sum += work;
44 }
45 }
46 1072234 *z = sum;
47
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.
1072234 PetscFunctionReturn(PETSC_SUCCESS);
48 }
49
50 793750 static PetscErrorCode __SUF__(VecMDot_Comp)(Vec a,PetscInt n,const Vec b[],PetscScalar *z)
51 {
52 793750 PetscScalar *work,*work0,*r;
53 793750 Vec_Comp *as = (Vec_Comp*)a->data;
54 793750 Vec *bx;
55 793750 PetscInt i,j;
56
57
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
793750 PetscFunctionBegin;
58
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
793750 SlepcValidVecComp(a,1);
59
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
1144546 SlepcValidVecsComp(b,n,3);
60
61
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
793750 if (as->n->n == 0) {
62 *z = 0;
63 PetscFunctionReturn(PETSC_SUCCESS);
64 }
65
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.
793750 PetscCall(PetscMalloc2(n,&work0,n,&bx));
67
68 #if defined(__WITH_MPI__)
69
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
793750 if (as->x[0]->ops->mdot_local) {
70 793750 r = work0;
71 793750 work = z;
72 } else
73 #endif
74 {
75 r = z;
76 work = work0;
77 }
78
79 /* z[i] <- a.x' * b[i].x */
80
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2751788 for (i=0;i<n;i++) r[i] = 0.0;
81
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1589258 for (j=0;j<as->n->n;j++) {
82
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2757062 for (i=0;i<n;i++) bx[i] = ((Vec_Comp*)b[i]->data)->x[j];
83
6/12
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
795508 if (as->x[0]->ops->mdot_local) PetscUseTypeMethod(as->x[j],mdot_local,n,bx,work);
84 else PetscCall(VecMDot(as->x[j],n,bx,work));
85
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2757062 for (i=0;i<n;i++) r[i] += work[i];
86 }
87
88 /* If def(__WITH_MPI__) and exists mdot_local */
89 #if defined(__WITH_MPI__)
90
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
793750 if (as->x[0]->ops->mdot_local) {
91 /* z[i] <- Allreduce(work[i]) */
92
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
793750 PetscCallMPI(MPIU_Allreduce(r,z,n,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)a)));
93 }
94 #endif
95
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
793750 PetscCall(PetscFree2(work0,bx));
97
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.
137934 PetscFunctionReturn(PETSC_SUCCESS);
98 }
99
100 60 static PetscErrorCode __SUF__(VecTDot_Comp)(Vec a,Vec b,PetscScalar *z)
101 {
102 60 PetscScalar sum = 0.0,work;
103 60 PetscInt i;
104 60 Vec_Comp *as = (Vec_Comp*)a->data,*bs = (Vec_Comp*)b->data;
105
106
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
107
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
60 SlepcValidVecComp(a,1);
108
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
60 SlepcValidVecComp(b,2);
109
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
60 if (as->x[0]->ops->tdot_local) {
110
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
180 for (i=0;i<as->n->n;i++) {
111
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
120 PetscUseTypeMethod(as->x[i],tdot_local,bs->x[i],&work);
112 120 sum += work;
113 }
114 #if defined(__WITH_MPI__)
115 60 work = sum;
116
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
60 PetscCallMPI(MPIU_Allreduce(&work,&sum,1,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)a)));
117 #endif
118 } else {
119 for (i=0;i<as->n->n;i++) {
120 PetscCall(VecTDot(as->x[i],bs->x[i],&work));
121 sum += work;
122 }
123 }
124 60 *z = sum;
125
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.
60 PetscFunctionReturn(PETSC_SUCCESS);
126 }
127
128 60 static PetscErrorCode __SUF__(VecMTDot_Comp)(Vec a,PetscInt n,const Vec b[],PetscScalar *z)
129 {
130 60 PetscScalar *work,*work0,*r;
131 60 Vec_Comp *as = (Vec_Comp*)a->data;
132 60 Vec *bx;
133 60 PetscInt i,j;
134
135
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
136
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
60 SlepcValidVecComp(a,1);
137
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
84 SlepcValidVecsComp(b,n,3);
138
139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
60 if (as->n->n == 0) {
140 *z = 0;
141 PetscFunctionReturn(PETSC_SUCCESS);
142 }
143
144
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(PetscMalloc2(n,&work0,n,&bx));
145
146 #if defined(__WITH_MPI__)
147
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
60 if (as->x[0]->ops->mtdot_local) {
148 60 r = work0;
149 60 work = z;
150 } else
151 #endif
152 {
153 r = z;
154 work = work0;
155 }
156
157 /* z[i] <- a.x' * b[i].x */
158
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
180 for (i=0;i<n;i++) r[i] = 0.0;
159
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
180 for (j=0;j<as->n->n;j++) {
160
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
360 for (i=0;i<n;i++) bx[i] = ((Vec_Comp*)b[i]->data)->x[j];
161
6/12
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
120 if (as->x[0]->ops->mtdot_local) PetscUseTypeMethod(as->x[j],mtdot_local,n,bx,work);
162 else PetscCall(VecMTDot(as->x[j],n,bx,work));
163
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
360 for (i=0;i<n;i++) r[i] += work[i];
164 }
165
166 /* If def(__WITH_MPI__) and exists mtdot_local */
167 #if defined(__WITH_MPI__)
168
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
60 if (as->x[0]->ops->mtdot_local) {
169 /* z[i] <- Allreduce(work[i]) */
170
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
60 PetscCallMPI(MPIU_Allreduce(r,z,n,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)a)));
171 }
172 #endif
173
174
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(PetscFree2(work0,bx));
175
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.
12 PetscFunctionReturn(PETSC_SUCCESS);
176 }
177
178 838460 static PetscErrorCode __SUF__(VecNorm_Comp)(Vec a,NormType t,PetscReal *norm)
179 {
180 838460 PetscReal work[3],s=0.0;
181 838460 Vec_Comp *as = (Vec_Comp*)a->data;
182 838460 PetscInt i;
183
184
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
838460 PetscFunctionBegin;
185
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
838460 SlepcValidVecComp(a,1);
186 /* Initialize norm */
187
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
838460 switch (t) {
188 240 case NORM_1:
189 case NORM_INFINITY:
190 240 *norm = 0.0;
191 240 break;
192 838160 case NORM_2:
193 case NORM_FROBENIUS:
194 838160 *norm = 1.0;
195 838160 s = 0.0;
196 838160 break;
197 60 case NORM_1_AND_2:
198 60 norm[0] = 0.0;
199 60 norm[1] = 1.0;
200 60 s = 0.0;
201 60 break;
202 }
203
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1679572 for (i=0;i<as->n->n;i++) {
204
6/12
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
841112 if (as->x[0]->ops->norm_local) PetscUseTypeMethod(as->x[i],norm_local,t,work);
205 else PetscCall(VecNorm(as->x[i],t,work));
206 /* norm+= work */
207
4/5
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
841112 switch (t) {
208 120 case NORM_1:
209 120 *norm += *work;
210 120 break;
211 840512 case NORM_2:
212 case NORM_FROBENIUS:
213 840512 AddNorm2(norm,&s,*work);
214 840512 break;
215 120 case NORM_1_AND_2:
216 120 norm[0] += work[0];
217 120 AddNorm2(&norm[1],&s,work[1]);
218 120 break;
219 360 case NORM_INFINITY:
220
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
360 *norm = PetscMax(*norm,*work);
221 360 break;
222 }
223 188946 }
224
225 /* If def(__WITH_MPI__) and exists norm_local */
226 #if defined(__WITH_MPI__)
227
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
838460 if (as->x[0]->ops->norm_local) {
228 838460 PetscReal work0[3];
229 /* norm <- Allreduce(work) */
230
4/5
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
838460 switch (t) {
231 60 case NORM_1:
232 60 work[0] = *norm;
233
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
60 PetscCallMPI(MPIU_Allreduce(work,norm,1,MPIU_REAL,MPIU_SUM,PetscObjectComm((PetscObject)a)));
234 break;
235 838160 case NORM_2:
236 case NORM_FROBENIUS:
237 838160 work[0] = *norm;
238 838160 work[1] = s;
239
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
838160 PetscCallMPI(MPIU_Allreduce(work,work0,1,MPIU_NORM2,MPIU_NORM2_SUM,PetscObjectComm((PetscObject)a)));
240 838160 *norm = GetNorm2(work0[0],work0[1]);
241 838160 break;
242 60 case NORM_1_AND_2:
243 60 work[0] = norm[0];
244 60 work[1] = norm[1];
245 60 work[2] = s;
246
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
60 PetscCallMPI(MPIU_Allreduce(work,work0,1,MPIU_NORM1_AND_2,MPIU_NORM2_SUM,PetscObjectComm((PetscObject)a)));
247 60 norm[0] = work0[0];
248 60 norm[1] = GetNorm2(work0[1],work0[2]);
249 60 break;
250 180 case NORM_INFINITY:
251 180 work[0] = *norm;
252
28/58
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
180 PetscCallMPI(MPIU_Allreduce(work,norm,1,MPIU_REAL,MPIU_MAX,PetscObjectComm((PetscObject)a)));
253 break;
254 }
255 188898 }
256 #else
257 /* Norm correction */
258 switch (t) {
259 case NORM_1:
260 case NORM_INFINITY:
261 break;
262 case NORM_2:
263 case NORM_FROBENIUS:
264 *norm = GetNorm2(*norm,s);
265 break;
266 case NORM_1_AND_2:
267 norm[1] = GetNorm2(norm[1],s);
268 break;
269 }
270 #endif
271
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.
146818 PetscFunctionReturn(PETSC_SUCCESS);
272 }
273
274 8010 PetscErrorCode __SUF__(VecDotNorm2_Comp)(Vec v,Vec w,PetscScalar *dp,PetscScalar *nm)
275 {
276 8010 PetscScalar dp0=0.0,nm0=0.0,dp1=0.0,nm1=0.0;
277 8010 const PetscScalar *vx,*wx;
278 8010 Vec_Comp *vs = (Vec_Comp*)v->data,*ws = (Vec_Comp*)w->data;
279 8010 PetscInt i,n;
280 8010 PetscBool t0,t1;
281 #if defined(__WITH_MPI__)
282 3990 PetscScalar work[4];
283 #endif
284
285 8010 PetscFunctionBegin;
286 /* Compute recursively the local part */
287 8010 PetscCall(PetscObjectTypeCompare((PetscObject)v,VECCOMP,&t0));
288 8010 PetscCall(PetscObjectTypeCompare((PetscObject)w,VECCOMP,&t1));
289 8010 if (t0 && t1) {
290 723 SlepcValidVecComp(v,1);
291 723 SlepcValidVecComp(w,2);
292 8010 for (i=0;i<vs->n->n;i++) {
293 4020 PetscCall(VecDotNorm2_Comp_Seq(vs->x[i],ws->x[i],&dp1,&nm1));
294 4020 dp0 += dp1;
295 4020 nm0 += nm1;
296 }
297 4020 } else if (!t0 && !t1) {
298 4020 PetscCall(VecGetLocalSize(v,&n));
299 4020 PetscCall(VecGetArrayRead(v,&vx));
300 4020 PetscCall(VecGetArrayRead(w,&wx));
301 439780 for (i=0;i<n;i++) {
302 435760 dp0 += vx[i]*PetscConj(wx[i]);
303 435760 nm0 += wx[i]*PetscConj(wx[i]);
304 }
305 4020 PetscCall(VecRestoreArrayRead(v,&vx));
306 4020 PetscCall(VecRestoreArrayRead(w,&wx));
307 } else SETERRQ(PetscObjectComm((PetscObject)v),PETSC_ERR_ARG_INCOMP,"Incompatible vector types");
308
309 #if defined(__WITH_MPI__)
310 /* [dp, nm] <- Allreduce([dp0, nm0]) */
311 3990 work[0] = dp0;
312 3990 work[1] = nm0;
313 3990 PetscCallMPI(MPIU_Allreduce(work,&work[2],2,MPIU_SCALAR,MPIU_SUM,PetscObjectComm((PetscObject)v)));
314 3990 *dp = work[2];
315 3990 *nm = work[3];
316 #else
317 4020 *dp = dp0;
318 4020 *nm = nm0;
319 #endif
320 8010 PetscFunctionReturn(PETSC_SUCCESS);
321 }
322
323 #undef __SUF__
324 #undef __QUOTEME
325 #undef __SUF_C__
326