GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvbasic.c
Date: 2026-06-15 03:58:11
Exec Total Coverage
Lines: 848 909 93.3%
Functions: 54 58 93.1%
Branches: 2427 5781 42.0%

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 Basic BV routines
12 */
13
14 #include <slepc/private/bvimpl.h> /*I "slepcbv.h" I*/
15
16 PetscBool BVRegisterAllCalled = PETSC_FALSE;
17 PetscFunctionList BVList = NULL;
18
19 /*@
20 BVSetType - Selects the type for the `BV` object.
21
22 Logically Collective
23
24 Input Parameters:
25 + bv - the basis vectors context
26 - type - a known type
27
28 Options Database Key:
29 . -bv_type type - sets `BV` type
30
31 Level: intermediate
32
33 .seealso: [](sec:bv), `BVGetType()`
34 @*/
35 154028 PetscErrorCode BVSetType(BV bv,BVType type)
36 {
37 154028 PetscErrorCode (*r)(BV);
38 154028 PetscBool match;
39
40
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
154028 PetscFunctionBegin;
41
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
154028 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
42
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
154028 PetscAssertPointer(type,2);
43
44
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.
154028 PetscCall(PetscObjectTypeCompare((PetscObject)bv,type,&match));
45
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.
154028 if (match) PetscFunctionReturn(PETSC_SUCCESS);
46
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.
153998 PetscCall(PetscStrcmp(type,BVTENSOR,&match));
47
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
153998 PetscCheck(!match,PetscObjectComm((PetscObject)bv),PETSC_ERR_ORDER,"Use BVCreateTensor() to create a BV of type tensor");
48
49
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.
153998 PetscCall(PetscFunctionListFind(BVList,type,&r));
50
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
153998 PetscCheck(r,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested BV type %s",type);
51
52
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.
153998 PetscTryTypeMethod(bv,destroy);
53
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
153998 PetscCall(PetscMemzero(bv->ops,sizeof(struct _BVOps)));
54
55
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.
153998 PetscCall(PetscObjectChangeTypeName((PetscObject)bv,type));
56
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
153998 if (bv->n < 0 && bv->N < 0) {
57 17639 bv->ops->create = r;
58 } else {
59
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.
136359 PetscCall(PetscLogEventBegin(BV_Create,bv,0,0,0));
60
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.
136359 PetscCall((*r)(bv));
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.
136359 PetscCall(PetscLogEventEnd(BV_Create,bv,0,0,0));
62 }
63
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.
29622 PetscFunctionReturn(PETSC_SUCCESS);
64 }
65
66 /*@
67 BVGetType - Gets the `BV` type name (as a string) from the `BV` context.
68
69 Not Collective
70
71 Input Parameter:
72 . bv - the basis vectors context
73
74 Output Parameter:
75 . type - name of the type of basis vectors
76
77 Note:
78 `type` should not be retained for later use as it will be an invalid pointer
79 if the `BVType` of `bv` is changed.
80
81 Level: intermediate
82
83 .seealso: [](sec:bv), `BVSetType()`, `PetscObjectTypeCompare()`, `PetscObjectTypeCompareAny()`
84 @*/
85 1616 PetscErrorCode BVGetType(BV bv,BVType *type)
86 {
87
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1616 PetscFunctionBegin;
88
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1616 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
89
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1616 PetscAssertPointer(type,2);
90 1616 *type = ((PetscObject)bv)->type_name;
91
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.
1616 PetscFunctionReturn(PETSC_SUCCESS);
92 }
93
94 /*@
95 BVSetSizes - Sets the local and global sizes, and the number of columns.
96
97 Collective
98
99 Input Parameters:
100 + bv - the basis vectors
101 . n - the local size (or `PETSC_DECIDE` to have it set)
102 . N - the global size (or `PETSC_DECIDE`)
103 - m - the number of columns
104
105 Notes:
106 `n` and `N` cannot be both `PETSC_DECIDE`.
107 If one process calls this with `N` equal to `PETSC_DECIDE` then all processes must,
108 otherwise the program will hang.
109
110 Level: beginner
111
112 .seealso: [](sec:bv), `BVSetSizesFromVec()`, `BVGetSizes()`, `BVResize()`
113 @*/
114 5021 PetscErrorCode BVSetSizes(BV bv,PetscInt n,PetscInt N,PetscInt m)
115 {
116 5021 PetscInt ma;
117 5021 PetscMPIInt size;
118
119
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5021 PetscFunctionBegin;
120
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5021 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
121
29/64
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 62 not taken.
✗ Branch 63 not taken.
5021 if (N >= 0) PetscValidLogicalCollectiveInt(bv,N,3);
122
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
5021 PetscValidLogicalCollectiveInt(bv,m,4);
123
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5021 PetscCheck(N<0 || n<=N,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Local size %" PetscInt_FMT " cannot be larger than global size %" PetscInt_FMT,n,N);
124
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5021 PetscCheck(m>0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Number of columns %" PetscInt_FMT " must be positive",m);
125
2/10
✓ 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 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
5021 PetscCheck((bv->n<0 && bv->N<0) || (bv->n==n && bv->N==N),PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Cannot change/reset vector sizes to %" PetscInt_FMT " local %" PetscInt_FMT " global after previously setting them to %" PetscInt_FMT " local %" PetscInt_FMT " global",n,N,bv->n,bv->N);
126
1/6
✗ 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.
5021 PetscCheck(bv->m<=0 || bv->m==m,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Cannot change the number of columns to %" PetscInt_FMT " after previously setting it to %" PetscInt_FMT "; use BVResize()",m,bv->m);
127
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5021 PetscCheck(!bv->map,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Vector layout was already defined by a previous call to BVSetSizes/FromVec");
128 5021 bv->n = n;
129 5021 bv->N = N;
130 5021 bv->m = m;
131 5021 bv->k = m;
132 /* create layout and get actual dimensions */
133
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.
5021 PetscCall(PetscLayoutCreate(PetscObjectComm((PetscObject)bv),&bv->map));
134
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.
5021 PetscCall(PetscLayoutSetSize(bv->map,bv->N));
135
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5021 PetscCall(PetscLayoutSetLocalSize(bv->map,bv->n));
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5021 PetscCall(PetscLayoutSetUp(bv->map));
137
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.
5021 PetscCall(PetscLayoutGetSize(bv->map,&bv->N));
138
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.
5021 PetscCall(PetscLayoutGetLocalSize(bv->map,&bv->n));
139
14/28
✓ 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 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
5021 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)bv),&size));
140
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
5901 PetscCall(BVSetVecType(bv,(size==1)?VECSEQ:VECMPI));
141
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5021 if (bv->matrix) { /* check compatible dimensions of user-provided matrix */
142 PetscCall(MatGetLocalSize(bv->matrix,&ma,NULL));
143 PetscCheck(bv->n==ma,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Local dimension %" PetscInt_FMT " does not match that of matrix given at BVSetMatrix %" PetscInt_FMT,bv->n,ma);
144 }
145
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5021 if (bv->ops->create) {
146
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.
1248 PetscCall(PetscLogEventBegin(BV_Create,bv,0,0,0));
147
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.
1248 PetscUseTypeMethod(bv,create);
148
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.
1248 PetscCall(PetscLogEventEnd(BV_Create,bv,0,0,0));
149 1248 bv->ops->create = NULL;
150 1248 bv->defersfo = PETSC_FALSE;
151 }
152
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.
927 PetscFunctionReturn(PETSC_SUCCESS);
153 }
154
155 /*@
156 BVSetSizesFromVec - Sets the local and global sizes, and the number of columns.
157 Local and global sizes are specified indirectly by passing a template vector.
158
159 Collective
160
161 Input Parameters:
162 + bv - the basis vectors
163 . t - the template vector
164 - m - the number of columns
165
166 Notes:
167 Apart from the local and global sizes, the template vector `t` is also used
168 to get the vector type, which will be set as the `BV` vector type with
169 `BVSetVecType()`. This is relevant in cases where computation must be done
170 on the GPU.
171
172 If `t` is a nested vector (type `VECNEST`), then the vector type will be
173 obtained from the first subvector. The rationale is that `BV` will operate
174 internally with regular vectors, even though the user problem is defined via
175 nested matrices and vectors.
176
177 Level: beginner
178
179 .seealso: [](sec:bv), `BVSetSizes()`, `BVGetSizes()`, `BVResize()`, `BVSetVecType()`
180 @*/
181 21796 PetscErrorCode BVSetSizesFromVec(BV bv,Vec t,PetscInt m)
182 {
183 21796 PetscInt ma;
184 21796 PetscLayout map;
185 21796 VecType vtype;
186 21796 PetscBool nest;
187 21796 Vec v;
188
189
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
21796 PetscFunctionBegin;
190
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
21796 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
191
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
21796 PetscValidHeaderSpecific(t,VEC_CLASSID,2);
192
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
21796 PetscCheckSameComm(bv,1,t,2);
193
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
21796 PetscValidLogicalCollectiveInt(bv,m,3);
194
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
21796 PetscCheck(m>0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Number of columns %" PetscInt_FMT " must be positive",m);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
21796 PetscCheck(!bv->map,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Vector layout was already defined by a previous call to BVSetSizes/FromVec");
196
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.
21796 PetscCall(PetscObjectTypeCompare((PetscObject)t,VECNEST,&nest));
197
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21796 if (nest) {
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.
315 PetscCall(VecNestGetSubVec(t,0,&v));
199
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.
315 PetscCall(VecGetType(v,&vtype));
200
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.
21481 } else PetscCall(VecGetType(t,&vtype));
201
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.
21796 PetscCall(BVSetVecType(bv,vtype));
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.
21796 PetscCall(VecGetLayout(t,&map));
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.
21796 PetscCall(PetscLayoutReference(map,&bv->map));
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.
21796 PetscCall(VecGetSize(t,&bv->N));
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.
21796 PetscCall(VecGetLocalSize(t,&bv->n));
206
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21796 if (bv->matrix) { /* check compatible dimensions of user-provided matrix */
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.
77 PetscCall(MatGetLocalSize(bv->matrix,&ma,NULL));
208
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
77 PetscCheck(bv->n==ma,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Local dimension %" PetscInt_FMT " does not match that of matrix given at BVSetMatrix %" PetscInt_FMT,bv->n,ma);
209 }
210 21796 bv->m = m;
211 21796 bv->k = m;
212
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21796 if (bv->ops->create) {
213
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.
16226 PetscUseTypeMethod(bv,create);
214 16226 bv->ops->create = NULL;
215 16226 bv->defersfo = PETSC_FALSE;
216 }
217
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
4130 PetscFunctionReturn(PETSC_SUCCESS);
218 }
219
220 /*@
221 BVGetSizes - Returns the local and global sizes, and the number of columns.
222
223 Not Collective
224
225 Input Parameter:
226 . bv - the basis vectors
227
228 Output Parameters:
229 + n - the local size
230 . N - the global size
231 - m - the number of columns
232
233 Note:
234 Normal usage requires that `bv` has already been given its sizes, otherwise
235 the call fails. However, this function can also be used to determine if
236 a `BV` object has been initialized completely (sizes and type). For this,
237 call with `n=NULL` and `N=NULL`, then a return value of `m=0` indicates that
238 the `BV` object is not ready for use yet.
239
240 Level: beginner
241
242 .seealso: [](sec:bv), `BVSetSizes()`, `BVSetSizesFromVec()`
243 @*/
244 79259 PetscErrorCode BVGetSizes(BV bv,PetscInt *n,PetscInt *N,PetscInt *m)
245 {
246
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
79259 PetscFunctionBegin;
247
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
79259 if (!bv) {
248
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
930 if (m && !n && !N) *m = 0;
249
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.
930 PetscFunctionReturn(PETSC_SUCCESS);
250 }
251
2/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
78329 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
252
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.
78329 if (n || N) BVCheckSizes(bv,1);
253
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 9 times.
72043 if (n) *n = bv->n;
254
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
78329 if (N) *N = bv->N;
255
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
78329 if (m) *m = bv->m;
256
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.
78329 if (m && !n && !N && !((PetscObject)bv)->type_name) *m = 0;
257
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.
15355 PetscFunctionReturn(PETSC_SUCCESS);
258 }
259
260 /*@
261 BVSetNumConstraints - Set the number of constraints.
262
263 Logically Collective
264
265 Input Parameters:
266 + V - basis vectors
267 - nc - number of constraints
268
269 Notes:
270 This function sets the number of constraints to `nc` and marks all remaining
271 columns as regular. Normal usage would be to call `BVInsertConstraints()` instead.
272
273 If `nc` is smaller than the previously set value, then some of the constraints
274 are discarded. In particular, using `nc=0` removes all constraints preserving
275 the content of regular columns.
276
277 Level: developer
278
279 .seealso: [](sec:bv), `BVInsertConstraints()`
280 @*/
281 673 PetscErrorCode BVSetNumConstraints(BV V,PetscInt nc)
282 {
283 673 PetscInt total,diff,i;
284 673 Vec x,y;
285
286
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
673 PetscFunctionBegin;
287
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
673 PetscValidHeaderSpecific(V,BV_CLASSID,1);
288
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
673 PetscValidLogicalCollectiveInt(V,nc,2);
289
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
673 PetscCheck(nc>=0,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_OUTOFRANGE,"Number of constraints (given %" PetscInt_FMT ") cannot be negative",nc);
290
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
673 PetscValidType(V,1);
291
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
673 BVCheckSizes(V,1);
292
2/6
✓ 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.
673 PetscCheck(V->ci[0]==-V->nc-1 && V->ci[1]==-V->nc-1,PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Cannot call BVSetNumConstraints after BVGetColumn");
293
294 673 diff = nc-V->nc;
295
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.
673 if (!diff) PetscFunctionReturn(PETSC_SUCCESS);
296 279 total = V->nc+V->m;
297
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
279 PetscCheck(total-nc>0,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_OUTOFRANGE,"Not enough columns for the given nc value");
298
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
279 if (diff<0) { /* lessen constraints, shift contents of BV */
299
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2901 for (i=0;i<V->m;i++) {
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.
2748 PetscCall(BVGetColumn(V,i,&x));
301
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.
2748 PetscCall(BVGetColumn(V,i+diff,&y));
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.
2748 PetscCall(VecCopy(x,y));
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.
2748 PetscCall(BVRestoreColumn(V,i,&x));
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.
2748 PetscCall(BVRestoreColumn(V,i+diff,&y));
305 }
306 }
307 279 V->nc = nc;
308 279 V->ci[0] = -V->nc-1;
309 279 V->ci[1] = -V->nc-1;
310 279 V->m = total-nc;
311 279 V->l = PetscMin(V->l,V->m);
312 279 V->k = PetscMin(V->k,V->m);
313
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
279 PetscCall(PetscObjectStateIncrease((PetscObject)V));
314
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.
279 PetscFunctionReturn(PETSC_SUCCESS);
315 }
316
317 /*@
318 BVGetNumConstraints - Returns the number of constraints.
319
320 Not Collective
321
322 Input Parameter:
323 . bv - the basis vectors
324
325 Output Parameter:
326 . nc - the number of constraints
327
328 Level: advanced
329
330 .seealso: [](sec:bv), `BVGetSizes()`, `BVInsertConstraints()`
331 @*/
332 505 PetscErrorCode BVGetNumConstraints(BV bv,PetscInt *nc)
333 {
334
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
505 PetscFunctionBegin;
335
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
505 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
336
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
505 PetscAssertPointer(nc,2);
337 505 *nc = bv->nc;
338
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.
505 PetscFunctionReturn(PETSC_SUCCESS);
339 }
340
341 /*@
342 BVResize - Change the number of columns.
343
344 Collective
345
346 Input Parameters:
347 + bv - the basis vectors
348 . m - the new number of columns
349 - copy - a flag indicating whether current values should be kept
350
351 Note:
352 Internal storage is reallocated. If the `copy` flag is set to true, then
353 the contents are copied to the leading part of the new space.
354
355 Level: advanced
356
357 .seealso: [](sec:bv), `BVSetSizes()`, `BVSetSizesFromVec()`
358 @*/
359 5903 PetscErrorCode BVResize(BV bv,PetscInt m,PetscBool copy)
360 {
361 5903 PetscScalar *array;
362 5903 const PetscScalar *omega;
363 5903 Vec v;
364
365
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5903 PetscFunctionBegin;
366
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5903 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
367
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
5903 PetscValidLogicalCollectiveInt(bv,m,2);
368
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
5903 PetscValidLogicalCollectiveBool(bv,copy,3);
369
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5903 PetscValidType(bv,1);
370
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5903 PetscCheck(m>0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Number of columns %" PetscInt_FMT " must be positive",m);
371
1/6
✗ 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.
5903 PetscCheck(!bv->nc || bv->issplit,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Cannot resize a BV with constraints");
372
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.
5903 if (bv->m == m) PetscFunctionReturn(PETSC_SUCCESS);
373
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1962 BVCheckOp(bv,1,resize);
374
375
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.
1962 PetscCall(PetscLogEventBegin(BV_Create,bv,0,0,0));
376
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.
1962 PetscUseTypeMethod(bv,resize,m,copy);
377
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.
1962 PetscCall(VecDestroy(&bv->buffer));
378
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.
1962 PetscCall(BVDestroy(&bv->cached));
379
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.
1962 PetscCall(PetscFree2(bv->h,bv->c));
380
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 times.
1962 if (bv->omega) {
381
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (bv->cuda) {
382 #if defined(PETSC_HAVE_CUDA)
383 PetscCall(VecCreateSeqCUDA(PETSC_COMM_SELF,m,&v));
384 #else
385 SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_PLIB,"Something wrong happened");
386 #endif
387
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 } else if (bv->hip) {
388 #if defined(PETSC_HAVE_HIP)
389 PetscCall(VecCreateSeqHIP(PETSC_COMM_SELF,m,&v));
390 #else
391 SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_PLIB,"Something wrong happened");
392 #endif
393
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 } else PetscCall(VecCreateSeq(PETSC_COMM_SELF,m,&v));
394
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (copy) {
395
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(VecGetArray(v,&array));
396
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(VecGetArrayRead(bv->omega,&omega));
397
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscArraycpy(array,omega,PetscMin(m,bv->m)));
398
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(VecRestoreArrayRead(bv->omega,&omega));
399
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(VecRestoreArray(v,&array));
400 } else PetscCall(VecSet(v,1.0));
401
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(VecDestroy(&bv->omega));
402 8 bv->omega = v;
403 }
404 1962 bv->m = m;
405 1962 bv->k = PetscMin(bv->k,m);
406 1962 bv->l = PetscMin(bv->l,m);
407
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1962 PetscCall(PetscLogEventEnd(BV_Create,bv,0,0,0));
408
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
1962 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
409
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.
1962 PetscFunctionReturn(PETSC_SUCCESS);
410 }
411
412 /*@
413 BVSetActiveColumns - Specify the columns that will be involved in operations.
414
415 Logically Collective
416
417 Input Parameters:
418 + bv - the basis vectors context
419 . l - number of leading columns
420 - k - number of active columns
421
422 Notes:
423 In operations such as `BVMult()` or `BVDot()`, only the first `k` columns are
424 considered. This is useful when the `BV` is filled from left to right, so
425 the last `m-k` columns do not have relevant information.
426
427 Also in operations such as `BVMult()` or `BVDot()`, the first `l` columns are
428 normally not included in the computation. See the manual page of each
429 operation.
430
431 In orthogonalization operations, the first `l` columns are treated
432 differently, they participate in the orthogonalization but the computed
433 coefficients are not stored.
434
435 Use `PETSC_CURRENT` to leave any of the values unchanged. Use `PETSC_DETERMINE`
436 to set `l` to the minimum value (`0`) and `k` to the maximum (`m`).
437
438 Level: intermediate
439
440 .seealso: [](sec:bv), `BVGetActiveColumns()`, `BVSetSizes()`
441 @*/
442 5601613 PetscErrorCode BVSetActiveColumns(BV bv,PetscInt l,PetscInt k)
443 {
444
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5601613 PetscFunctionBegin;
445
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5601613 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
446
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
5601613 PetscValidLogicalCollectiveInt(bv,l,2);
447
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
5601613 PetscValidLogicalCollectiveInt(bv,k,3);
448
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5601613 BVCheckSizes(bv,1);
449
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5601613 if (PetscUnlikely(k == PETSC_DETERMINE)) {
450 bv->k = bv->m;
451
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
5601613 } else if (k != PETSC_CURRENT) {
452
2/6
✓ 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.
5601613 PetscCheck(k>=0 && k<=bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of k (%" PetscInt_FMT "). Must be between 0 and m (%" PetscInt_FMT ")",k,bv->m);
453 5601613 bv->k = k;
454 }
455
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5601613 if (PetscUnlikely(l == PETSC_DETERMINE)) {
456 bv->l = 0;
457
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
5601613 } else if (l != PETSC_CURRENT) {
458
2/6
✓ 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.
5601613 PetscCheck(l>=0 && l<=bv->k,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of l (%" PetscInt_FMT "). Must be between 0 and k (%" PetscInt_FMT ")",l,bv->k);
459 5601613 bv->l = l;
460 }
461
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.
1107455 PetscFunctionReturn(PETSC_SUCCESS);
462 }
463
464 /*@
465 BVGetActiveColumns - Returns the current active dimensions.
466
467 Not Collective
468
469 Input Parameter:
470 . bv - the basis vectors context
471
472 Output Parameters:
473 + l - number of leading columns
474 - k - number of active columns
475
476 Level: intermediate
477
478 .seealso: [](sec:bv), `BVSetActiveColumns()`
479 @*/
480 1379770 PetscErrorCode BVGetActiveColumns(BV bv,PetscInt *l,PetscInt *k)
481 {
482
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1379770 PetscFunctionBegin;
483
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1379770 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
484
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1379770 if (l) *l = bv->l;
485
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1379770 if (k) *k = bv->k;
486
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.
1379770 PetscFunctionReturn(PETSC_SUCCESS);
487 }
488
489 /*@
490 BVSetMatrix - Specifies the inner product to be used in orthogonalization.
491
492 Collective
493
494 Input Parameters:
495 + bv - the basis vectors context
496 . B - a Hermitian matrix (may be `NULL`)
497 - indef - a flag indicating if the matrix is indefinite
498
499 Notes:
500 This is used to specify a non-standard inner product, whose matrix
501 representation is given by `B`. Then, all inner products required during
502 orthogonalization are computed as $(x,y)_B=y^*Bx$ rather than the
503 standard form $(x,y)=y^*x$.
504
505 Matrix `B` must be real symmetric (or complex Hermitian). A genuine inner
506 product requires that `B` is also positive (semi-)definite. However, we
507 also allow for an indefinite `B` (setting `indef=PETSC_TRUE`), in which
508 case the orthogonalization uses an indefinite inner product.
509
510 This affects operations `BVDot()`, `BVNorm()`, `BVOrthogonalize()`, and variants.
511
512 Setting `B=NULL` has the same effect as if the identity matrix was passed.
513
514 Level: advanced
515
516 .seealso: [](sec:bv), `BVGetMatrix()`, `BVDot()`, `BVNorm()`, `BVOrthogonalize()`, `BVSetDefiniteTolerance()`
517 @*/
518 56757 PetscErrorCode BVSetMatrix(BV bv,Mat B,PetscBool indef)
519 {
520 56757 PetscInt m,n;
521
522
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56757 PetscFunctionBegin;
523
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
56757 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
524
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
56757 PetscValidLogicalCollectiveBool(bv,indef,3);
525
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
56757 if (B!=bv->matrix || (B && ((PetscObject)B)->id!=((PetscObject)bv->matrix)->id) || indef!=bv->indef) {
526
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25465 if (B) {
527
2/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
13463 PetscValidHeaderSpecific(B,MAT_CLASSID,2);
528
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.
13463 PetscCall(MatGetLocalSize(B,&m,&n));
529
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13463 PetscCheck(m==n,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_SIZ,"Matrix must be square");
530
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.
13463 PetscCheck(!bv->m || bv->n==n,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_INCOMP,"Mismatching local dimension BV %" PetscInt_FMT ", Mat %" PetscInt_FMT,bv->n,n);
531 }
532
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.
25465 PetscCall(PetscObjectReference((PetscObject)B));
533
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.
25465 PetscCall(MatDestroy(&bv->matrix));
534 25465 bv->matrix = B;
535 25465 bv->indef = indef;
536
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
25465 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
537
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
25465 if (bv->Bx) PetscCall(PetscObjectStateIncrease((PetscObject)bv->Bx));
538
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
25465 if (bv->cached) PetscCall(PetscObjectStateIncrease((PetscObject)bv->cached));
539 }
540
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.
10937 PetscFunctionReturn(PETSC_SUCCESS);
541 }
542
543 /*@
544 BVGetMatrix - Retrieves the matrix representation of the inner product.
545
546 Not Collective
547
548 Input Parameter:
549 . bv - the basis vectors context
550
551 Output Parameters:
552 + B - the matrix of the inner product (may be `NULL`)
553 - indef - the flag indicating if the matrix is indefinite
554
555 Level: advanced
556
557 .seealso: [](sec:bv), `BVSetMatrix()`
558 @*/
559 19779 PetscErrorCode BVGetMatrix(BV bv,Mat *B,PetscBool *indef)
560 {
561
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
19779 PetscFunctionBegin;
562
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
19779 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
563
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
19779 if (B) *B = bv->matrix;
564
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19779 if (indef) *indef = bv->indef;
565
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.
19779 PetscFunctionReturn(PETSC_SUCCESS);
566 }
567
568 /*@
569 BVApplyMatrix - Multiplies a vector by the matrix representation of the
570 inner product.
571
572 Neighbor-wise Collective
573
574 Input Parameters:
575 + bv - the basis vectors context
576 - x - the vector
577
578 Output Parameter:
579 . y - the result
580
581 Note:
582 If no matrix was specified this function copies the vector.
583
584 Level: advanced
585
586 .seealso: [](sec:bv), `BVSetMatrix()`, `BVApplyMatrixBV()`
587 @*/
588 2965 PetscErrorCode BVApplyMatrix(BV bv,Vec x,Vec y)
589 {
590
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2965 PetscFunctionBegin;
591
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2965 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
592
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2965 PetscValidHeaderSpecific(x,VEC_CLASSID,2);
593
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2965 PetscValidHeaderSpecific(y,VEC_CLASSID,3);
594
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2965 if (bv->matrix) {
595
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.
2965 PetscCall(BV_IPMatMult(bv,x));
596
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.
2965 PetscCall(VecCopy(bv->Bx,y));
597 } else PetscCall(VecCopy(x,y));
598
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.
1129 PetscFunctionReturn(PETSC_SUCCESS);
599 }
600
601 /*@
602 BVApplyMatrixBV - Multiplies the `BV` vectors by the matrix representation
603 of the inner product.
604
605 Neighbor-wise Collective
606
607 Input Parameter:
608 . X - the basis vectors context
609
610 Output Parameter:
611 . Y - the basis vectors to store the result (optional)
612
613 Note:
614 This function computes $Y = B X$, where $B$ is the matrix given with
615 `BVSetMatrix()`. This operation is computed as in `BVMatMult()`.
616 If no matrix was specified, then it just copies $Y = X$.
617
618 If no `Y` is given, the result is stored internally in the cached `BV`.
619
620 Level: developer
621
622 .seealso: [](sec:bv), `BVSetMatrix()`, `BVApplyMatrix()`, `BVMatMult()`, `BVGetCachedBV()`
623 @*/
624 96 PetscErrorCode BVApplyMatrixBV(BV X,BV Y)
625 {
626
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
96 PetscFunctionBegin;
627
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
96 PetscValidHeaderSpecific(X,BV_CLASSID,1);
628
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
96 if (Y) {
629
2/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
96 PetscValidHeaderSpecific(Y,BV_CLASSID,2);
630
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.
96 if (X->matrix) PetscCall(BVMatMult(X,X->matrix,Y));
631 else PetscCall(BVCopy(X,Y));
632 } else PetscCall(BV_IPMatMultBV(X));
633
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
16 PetscFunctionReturn(PETSC_SUCCESS);
634 }
635
636 /*@
637 BVSetSignature - Sets the signature matrix to be used in orthogonalization.
638
639 Logically Collective
640
641 Input Parameters:
642 + bv - the basis vectors context
643 - omega - a vector representing the diagonal of the signature matrix
644
645 Note:
646 The signature matrix $\Omega = V^*B V$ is relevant only for an indefinite $B$.
647
648 Level: developer
649
650 .seealso: [](sec:bv), `BVSetMatrix()`, `BVGetSignature()`
651 @*/
652 12760 PetscErrorCode BVSetSignature(BV bv,Vec omega)
653 {
654 12760 PetscInt i,n;
655 12760 const PetscScalar *pomega;
656 12760 PetscScalar *intern;
657
658
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12760 PetscFunctionBegin;
659
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
12760 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
660
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12760 BVCheckSizes(bv,1);
661
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
12760 PetscValidHeaderSpecific(omega,VEC_CLASSID,2);
662
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12760 PetscValidType(omega,2);
663
664
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.
12760 PetscCall(VecGetSize(omega,&n));
665
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12760 PetscCheck(n==bv->k,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_SIZ,"Vec argument has %" PetscInt_FMT " elements, should be %" PetscInt_FMT,n,bv->k);
666
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.
12760 PetscCall(BV_AllocateSignature(bv));
667
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
12760 if (bv->indef) {
668
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12742 PetscCall(VecGetArrayRead(omega,&pomega));
669
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12742 PetscCall(VecGetArray(bv->omega,&intern));
670
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
274676 for (i=0;i<n;i++) intern[bv->nc+i] = pomega[i];
671
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12742 PetscCall(VecRestoreArray(bv->omega,&intern));
672
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12742 PetscCall(VecRestoreArrayRead(omega,&pomega));
673
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18 } else PetscCall(PetscInfo(bv,"Ignoring signature because BV is not indefinite\n"));
674
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
12760 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
675
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.
12760 PetscFunctionReturn(PETSC_SUCCESS);
676 }
677
678 /*@
679 BVGetSignature - Retrieves the signature matrix from last orthogonalization.
680
681 Not Collective
682
683 Input Parameter:
684 . bv - the basis vectors context
685
686 Output Parameter:
687 . omega - a vector representing the diagonal of the signature matrix
688
689 Note:
690 The signature matrix $\Omega = V^*B V$ is relevant only for an indefinite $B$.
691
692 Level: developer
693
694 .seealso: [](sec:bv), `BVSetMatrix()`, `BVSetSignature()`
695 @*/
696 870 PetscErrorCode BVGetSignature(BV bv,Vec omega)
697 {
698 870 PetscInt i,n;
699 870 PetscScalar *pomega;
700 870 const PetscScalar *intern;
701
702
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
870 PetscFunctionBegin;
703
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
870 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
704
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
870 BVCheckSizes(bv,1);
705
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
870 PetscValidHeaderSpecific(omega,VEC_CLASSID,2);
706
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
870 PetscValidType(omega,2);
707
708
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
870 PetscCall(VecGetSize(omega,&n));
709
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
870 PetscCheck(n==bv->k,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_SIZ,"Vec argument has %" PetscInt_FMT " elements, should be %" PetscInt_FMT,n,bv->k);
710
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
870 if (bv->indef && bv->omega) {
711
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
870 PetscCall(VecGetArray(omega,&pomega));
712
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.
870 PetscCall(VecGetArrayRead(bv->omega,&intern));
713
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9516 for (i=0;i<n;i++) pomega[i] = intern[bv->nc+i];
714
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.
870 PetscCall(VecRestoreArrayRead(bv->omega,&intern));
715
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.
870 PetscCall(VecRestoreArray(omega,&pomega));
716 } else PetscCall(VecSet(omega,1.0));
717
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.
170 PetscFunctionReturn(PETSC_SUCCESS);
718 }
719
720 /*@
721 BVSetBufferVec - Attach a vector object to be used as buffer space for
722 several operations.
723
724 Collective
725
726 Input Parameters:
727 + bv - the basis vectors context)
728 - buffer - the vector
729
730 Notes:
731 Use `BVGetBufferVec()` to retrieve the vector (for example, to free it
732 at the end of the computations).
733
734 The vector must be sequential of length $(n_c+m)m$, where $m$ is the number
735 of columns of `bv` and $n_c$ is the number of constraints.
736
737 Level: developer
738
739 .seealso: [](sec:bv), `BVGetBufferVec()`, `BVSetSizes()`, `BVGetNumConstraints()`
740 @*/
741 PetscErrorCode BVSetBufferVec(BV bv,Vec buffer)
742 {
743 PetscInt ld,n;
744 PetscMPIInt size;
745
746 PetscFunctionBegin;
747 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
748 PetscValidHeaderSpecific(buffer,VEC_CLASSID,2);
749 BVCheckSizes(bv,1);
750 PetscCall(VecGetSize(buffer,&n));
751 ld = bv->m+bv->nc;
752 PetscCheck(n==ld*bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_SIZ,"Buffer size must be %" PetscInt_FMT,ld*bv->m);
753 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)buffer),&size));
754 PetscCheck(size==1,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Buffer must be a sequential vector");
755
756 PetscCall(PetscObjectReference((PetscObject)buffer));
757 PetscCall(VecDestroy(&bv->buffer));
758 bv->buffer = buffer;
759 PetscFunctionReturn(PETSC_SUCCESS);
760 }
761
762 /*@
763 BVGetBufferVec - Obtain the buffer vector associated with the `BV` object.
764
765 Collective
766
767 Input Parameter:
768 . bv - the basis vectors context
769
770 Output Parameter:
771 . buffer - vector
772
773 Notes:
774 The vector is created if not available previously. It is a sequential vector
775 of length $(n_c+m) m$, where $m$ is the number of columns of `bv` and $n_c$ is the number
776 of constraints.
777
778 Developer Notes:
779 The buffer vector is viewed as a column-major matrix with leading dimension equal
780 to $n_c+m$, and $m$ columns at most. In the most common usage, it has the structure
781 $$
782 \left[\begin{array}{c|c}
783 s & \begin{array}{c} C \\\hline H \end{array}
784 \end{array}\right]
785 $$
786 where $H$ is an upper Hessenberg matrix of order $m (m-1)$, $C$ contains coefficients
787 related to orthogonalization against constraints (first $n_c$ rows), and $s$ is the
788 first column that contains scratch values computed during Gram-Schmidt
789 orthogonalization. In particular, `BVDotColumn()` and `BVMultColumn()` use $s$ to
790 store the coefficients.
791
792 Level: developer
793
794 .seealso: [](sec:bv), `BVSetBufferVec()`, `BVSetSizes()`, `BVGetNumConstraints()`, `BVDotColumn()`, `BVMultColumn()`
795 @*/
796 69154 PetscErrorCode BVGetBufferVec(BV bv,Vec *buffer)
797 {
798 69154 PetscInt ld;
799
800
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
69154 PetscFunctionBegin;
801
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
69154 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
802
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
69154 PetscAssertPointer(buffer,2);
803
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
69154 BVCheckSizes(bv,1);
804
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
69154 if (!bv->buffer) {
805 19133 ld = bv->m+bv->nc;
806
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.
19133 PetscCall(VecCreate(PETSC_COMM_SELF,&bv->buffer));
807
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.
19133 PetscCall(VecSetSizes(bv->buffer,PETSC_DECIDE,ld*bv->m));
808
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.
19133 PetscCall(VecSetType(bv->buffer,bv->vtype));
809 }
810 69154 *buffer = bv->buffer;
811
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.
69154 PetscFunctionReturn(PETSC_SUCCESS);
812 }
813
814 /*@
815 BVSetRandomContext - Sets the `PetscRandom` object associated with the `BV`,
816 to be used in operations that need random numbers.
817
818 Collective
819
820 Input Parameters:
821 + bv - the basis vectors context
822 - rand - the random number generator context
823
824 Level: advanced
825
826 .seealso: [](sec:bv), `BVGetRandomContext()`, `BVSetRandom()`, `BVSetRandomNormal()`, `BVSetRandomColumn()`, `BVSetRandomCond()`, `PetscRandomCreate()`
827 @*/
828 PetscErrorCode BVSetRandomContext(BV bv,PetscRandom rand)
829 {
830 PetscFunctionBegin;
831 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
832 PetscValidHeaderSpecific(rand,PETSC_RANDOM_CLASSID,2);
833 PetscCheckSameComm(bv,1,rand,2);
834 PetscCall(PetscObjectReference((PetscObject)rand));
835 PetscCall(PetscRandomDestroy(&bv->rand));
836 bv->rand = rand;
837 PetscFunctionReturn(PETSC_SUCCESS);
838 }
839
840 /*@
841 BVGetRandomContext - Gets the `PetscRandom` object associated with the `BV`.
842
843 Collective
844
845 Input Parameter:
846 . bv - the basis vectors context
847
848 Output Parameter:
849 . rand - the random number generator context
850
851 Level: advanced
852
853 .seealso: [](sec:bv), `BVSetRandomContext()`, `BVSetRandom()`, `BVSetRandomNormal()`, `BVSetRandomColumn()`, `BVSetRandomCond()`
854 @*/
855 33704 PetscErrorCode BVGetRandomContext(BV bv,PetscRandom* rand)
856 {
857
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
33704 PetscFunctionBegin;
858
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
33704 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
859
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
33704 PetscAssertPointer(rand,2);
860
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
33704 if (!bv->rand) {
861
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.
10375 PetscCall(PetscRandomCreate(PetscObjectComm((PetscObject)bv),&bv->rand));
862
3/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
10375 if (bv->cuda) PetscCall(PetscRandomSetType(bv->rand,PETSCCURAND));
863
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.
10375 if (bv->sfocalled) PetscCall(PetscRandomSetFromOptions(bv->rand));
864
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
10375 if (bv->rrandom) {
865
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
80 PetscCall(PetscRandomSetSeed(bv->rand,0x12345678));
866
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
80 PetscCall(PetscRandomSeed(bv->rand));
867 }
868 }
869 33704 *rand = bv->rand;
870
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.
33704 PetscFunctionReturn(PETSC_SUCCESS);
871 }
872
873 /*@
874 BVSetFromOptions - Sets `BV` options from the options database.
875
876 Collective
877
878 Input Parameter:
879 . bv - the basis vectors context
880
881 Note:
882 To see all options, run your program with the `-help` option.
883
884 Level: beginner
885
886 .seealso: [](sec:bv), `BVSetOptionsPrefix()`
887 @*/
888 21851 PetscErrorCode BVSetFromOptions(BV bv)
889 {
890 21851 char type[256];
891 21851 PetscBool flg1,flg2,flg3,flg4;
892 21851 PetscReal r;
893 21851 BVOrthogType otype;
894 21851 BVOrthogRefineType orefine;
895 21851 BVOrthogBlockType oblock;
896
897
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
21851 PetscFunctionBegin;
898
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
21851 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
899
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.
21851 PetscCall(BVRegisterAll());
900
8/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
65553 PetscObjectOptionsBegin((PetscObject)bv);
901
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
22121 PetscCall(PetscOptionsFList("-bv_type","Basis Vectors type","BVSetType",BVList,(char*)(((PetscObject)bv)->type_name?((PetscObject)bv)->type_name:BVMAT),type,sizeof(type),&flg1));
902
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.
21851 if (flg1) PetscCall(BVSetType(bv,type));
903
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.
16431 else if (!((PetscObject)bv)->type_name) PetscCall(BVSetType(bv,BVMAT));
904
905 21851 otype = bv->orthog_type;
906
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.
21851 PetscCall(PetscOptionsEnum("-bv_orthog_type","Orthogonalization method","BVSetOrthogonalization",BVOrthogTypes,(PetscEnum)otype,(PetscEnum*)&otype,&flg1));
907 21851 orefine = bv->orthog_ref;
908
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.
21851 PetscCall(PetscOptionsEnum("-bv_orthog_refine","Iterative refinement mode during orthogonalization","BVSetOrthogonalization",BVOrthogRefineTypes,(PetscEnum)orefine,(PetscEnum*)&orefine,&flg2));
909 21851 r = bv->orthog_eta;
910
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.
21851 PetscCall(PetscOptionsReal("-bv_orthog_eta","Parameter of iterative refinement during orthogonalization","BVSetOrthogonalization",r,&r,&flg3));
911 21851 oblock = bv->orthog_block;
912
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.
21851 PetscCall(PetscOptionsEnum("-bv_orthog_block","Block orthogonalization method","BVSetOrthogonalization",BVOrthogBlockTypes,(PetscEnum)oblock,(PetscEnum*)&oblock,&flg4));
913
11/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
21851 if (flg1 || flg2 || flg3 || flg4) PetscCall(BVSetOrthogonalization(bv,otype,orefine,r,oblock));
914
915
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.
21851 PetscCall(PetscOptionsEnum("-bv_matmult","Method for BVMatMult","BVSetMatMultMethod",BVMatMultTypes,(PetscEnum)bv->vmm,(PetscEnum*)&bv->vmm,NULL));
916
917
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.
21851 PetscCall(PetscOptionsReal("-bv_definite_tol","Tolerance for checking a definite inner product","BVSetDefiniteTolerance",r,&r,&flg1));
918
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.
21851 if (flg1) PetscCall(BVSetDefiniteTolerance(bv,r));
919
920 /* undocumented option to generate random vectors that are independent of the number of processes */
921
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.
21851 PetscCall(PetscOptionsGetBool(NULL,NULL,"-bv_reproducible_random",&bv->rrandom,NULL));
922
923
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21851 if (bv->ops->create) bv->defersfo = PETSC_TRUE; /* defer call to setfromoptions */
924
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.
7128 else PetscTryTypeMethod(bv,setfromoptions,PetscOptionsObject);
925
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.
21851 PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)bv,PetscOptionsObject));
926
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.
21851 PetscOptionsEnd();
927 21851 bv->sfocalled = PETSC_TRUE;
928
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.
21851 PetscFunctionReturn(PETSC_SUCCESS);
929 }
930
931 /*@
932 BVSetOrthogonalization - Specifies the method used for the orthogonalization of
933 vectors (classical or modified Gram-Schmidt with or without refinement), and
934 for the block-orthogonalization (simultaneous orthogonalization of a set of
935 vectors).
936
937 Logically Collective
938
939 Input Parameters:
940 + bv - the basis vectors context
941 . type - the method of vector orthogonalization
942 . refine - type of refinement
943 . eta - parameter for selective refinement
944 - block - the method of block orthogonalization
945
946 Options Database Keys:
947 + -bv_orthog_type (cgs|mgs) - the vector orthogonalization
948 . -bv_orthog_refine (never|ifneeded|always) - the refinement type, default is `ifneeded`
949 . -bv_orthog_eta eta - the value of `eta`
950 - -bv_orthog_block (gs|chol|tsqr|tsqrchol|svqb) - the block-orthogonalization method
951
952 Notes:
953 The default settings work well for most problems.
954
955 The parameter `eta` should be a real value between 0 and 1, that is used only when
956 the refinement type is `ifneeded`. Use `PETSC_DETERMINE` to set a reasonable
957 default value. Use `PETSC_CURRENT` to leave the current value unchanged.
958
959 When using several processes, `BV_ORTHOG_MGS` is likely to result in bad scalability.
960
961 If the method set for block orthogonalization is `BV_ORTHOG_BLOCK_GS`, then the computation
962 is done column by column with the vector orthogonalization.
963
964 Level: advanced
965
966 .seealso: [](sec:bv), `BVOrthogonalizeColumn()`, `BVGetOrthogonalization()`, `BVOrthogType`, `BVOrthogRefineType`, `BVOrthogBlockType`
967 @*/
968 4789 PetscErrorCode BVSetOrthogonalization(BV bv,BVOrthogType type,BVOrthogRefineType refine,PetscReal eta,BVOrthogBlockType block)
969 {
970
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4789 PetscFunctionBegin;
971
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
4789 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
972
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
4789 PetscValidLogicalCollectiveEnum(bv,type,2);
973
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
4789 PetscValidLogicalCollectiveEnum(bv,refine,3);
974
29/66
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
4789 PetscValidLogicalCollectiveReal(bv,eta,4);
975
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
4789 PetscValidLogicalCollectiveEnum(bv,block,5);
976
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
4789 switch (type) {
977 4789 case BV_ORTHOG_CGS:
978 case BV_ORTHOG_MGS:
979 4789 bv->orthog_type = type;
980 4789 break;
981 default:
982 SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Unknown orthogonalization type");
983 }
984
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
4789 switch (refine) {
985 4789 case BV_ORTHOG_REFINE_NEVER:
986 case BV_ORTHOG_REFINE_IFNEEDED:
987 case BV_ORTHOG_REFINE_ALWAYS:
988 4789 bv->orthog_ref = refine;
989 4789 break;
990 default:
991 SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Unknown refinement type");
992 }
993
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
4789 if (eta == (PetscReal)PETSC_DETERMINE) {
994 bv->orthog_eta = 0.7071;
995
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4789 } else if (eta != (PetscReal)PETSC_CURRENT) {
996
2/6
✓ 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.
4661 PetscCheck(eta>0.0 && eta<=1.0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Invalid eta value");
997 4661 bv->orthog_eta = eta;
998 }
999
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
4789 switch (block) {
1000 4789 case BV_ORTHOG_BLOCK_GS:
1001 case BV_ORTHOG_BLOCK_CHOL:
1002 case BV_ORTHOG_BLOCK_TSQR:
1003 case BV_ORTHOG_BLOCK_TSQRCHOL:
1004 case BV_ORTHOG_BLOCK_SVQB:
1005 4789 bv->orthog_block = block;
1006 4789 break;
1007 default:
1008 SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Unknown block orthogonalization type");
1009 }
1010
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.
4789 PetscFunctionReturn(PETSC_SUCCESS);
1011 }
1012
1013 /*@
1014 BVGetOrthogonalization - Gets the orthogonalization settings from the `BV` object.
1015
1016 Not Collective
1017
1018 Input Parameter:
1019 . bv - basis vectors context
1020
1021 Output Parameters:
1022 + type - the method of vector orthogonalization
1023 . refine - type of refinement
1024 . eta - parameter for selective refinement
1025 - block - the method of block orthogonalization
1026
1027 Level: advanced
1028
1029 .seealso: [](sec:bv), `BVOrthogonalizeColumn()`, `BVSetOrthogonalization()`, `BVOrthogType`, `BVOrthogRefineType`, `BVOrthogBlockType`
1030 @*/
1031 4530 PetscErrorCode BVGetOrthogonalization(BV bv,BVOrthogType *type,BVOrthogRefineType *refine,PetscReal *eta,BVOrthogBlockType *block)
1032 {
1033
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4530 PetscFunctionBegin;
1034
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
4530 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1035
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4530 if (type) *type = bv->orthog_type;
1036
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4530 if (refine) *refine = bv->orthog_ref;
1037
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4530 if (eta) *eta = bv->orthog_eta;
1038
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4530 if (block) *block = bv->orthog_block;
1039
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.
4530 PetscFunctionReturn(PETSC_SUCCESS);
1040 }
1041
1042 /*@
1043 BVSetMatMultMethod - Specifies the method used for the `BVMatMult()` operation.
1044
1045 Logically Collective
1046
1047 Input Parameters:
1048 + bv - the basis vectors context
1049 - method - the method for the `BVMatMult()` operation
1050
1051 Options Database Key:
1052 . -bv_matmult (vecs|mat) - choose the method
1053
1054 Note:
1055 The default is `BV_MATMULT_MAT` except in the case of `BVVECS`.
1056
1057 Level: advanced
1058
1059 .seealso: [](sec:bv), `BVMatMult()`, `BVGetMatMultMethod()`, `BVMatMultType`
1060 @*/
1061 688 PetscErrorCode BVSetMatMultMethod(BV bv,BVMatMultType method)
1062 {
1063
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
688 PetscFunctionBegin;
1064
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
688 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1065
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
688 PetscValidLogicalCollectiveEnum(bv,method,2);
1066
1/3
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
688 switch (method) {
1067 688 case BV_MATMULT_VECS:
1068 case BV_MATMULT_MAT:
1069 688 bv->vmm = method;
1070 688 break;
1071 case BV_MATMULT_MAT_SAVE:
1072 PetscCall(PetscInfo(bv,"BV_MATMULT_MAT_SAVE is deprecated, using BV_MATMULT_MAT\n"));
1073 bv->vmm = BV_MATMULT_MAT;
1074 break;
1075 default:
1076 SETERRQ(PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Unknown matmult method");
1077 }
1078
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.
128 PetscFunctionReturn(PETSC_SUCCESS);
1079 }
1080
1081 /*@
1082 BVGetMatMultMethod - Gets the method used for the `BVMatMult()` operation.
1083
1084 Not Collective
1085
1086 Input Parameter:
1087 . bv - basis vectors context
1088
1089 Output Parameter:
1090 . method - the method for the `BVMatMult()` operation
1091
1092 Level: advanced
1093
1094 .seealso: [](sec:bv), `BVMatMult()`, `BVSetMatMultMethod()`, `BVMatMultType`
1095 @*/
1096 344 PetscErrorCode BVGetMatMultMethod(BV bv,BVMatMultType *method)
1097 {
1098
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
344 PetscFunctionBegin;
1099
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
344 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1100
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
344 PetscAssertPointer(method,2);
1101 344 *method = bv->vmm;
1102
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.
344 PetscFunctionReturn(PETSC_SUCCESS);
1103 }
1104
1105 /*@
1106 BVGetColumn - Returns a `Vec` object that contains the entries of the
1107 requested column of the basis vectors object.
1108
1109 Logically Collective
1110
1111 Input Parameters:
1112 + bv - the basis vectors context
1113 - j - the index of the requested column
1114
1115 Output Parameter:
1116 . v - vector containing the jth column
1117
1118 Notes:
1119 The returned `Vec` must be seen as a reference (not a copy) of the `BV`
1120 column, that is, modifying the `Vec` will change the `BV` entries as well.
1121
1122 The returned `Vec` must not be destroyed. `BVRestoreColumn()` must be
1123 called when it is no longer needed. At most, two columns can be fetched,
1124 that is, this function can only be called twice before the corresponding
1125 `BVRestoreColumn()` is invoked.
1126
1127 A negative index `j` selects the `i`-th constraint, where `i=-j`. Constraints
1128 should not be modified.
1129
1130 Level: beginner
1131
1132 .seealso: [](sec:bv), `BVRestoreColumn()`, `BVInsertConstraints()`
1133 @*/
1134 14092793 PetscErrorCode BVGetColumn(BV bv,PetscInt j,Vec *v)
1135 {
1136 14092793 PetscInt l;
1137
1138
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
14092793 PetscFunctionBegin;
1139
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
14092793 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1140
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 PetscValidType(bv,1);
1141
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 BVCheckSizes(bv,1);
1142
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 BVCheckOp(bv,1,getcolumn);
1143
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
14092793 PetscValidLogicalCollectiveInt(bv,j,2);
1144
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.
14092793 PetscCheck(j>=0 || -j<=bv->nc,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"You requested constraint %" PetscInt_FMT " but only %" PetscInt_FMT " are available",-j,bv->nc);
1145
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 PetscCheck(j<bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"You requested column %" PetscInt_FMT " but only %" PetscInt_FMT " are available",j,bv->m);
1146
2/6
✓ 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.
14092793 PetscCheck(j!=bv->ci[0] && j!=bv->ci[1],PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Column %" PetscInt_FMT " already fetched in a previous call to BVGetColumn",j);
1147
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
14092793 l = BVAvailableVec;
1148
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 PetscCheck(l!=-1,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Too many requested columns; you must call BVRestoreColumn for one of the previously fetched columns");
1149
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.
14092793 PetscUseTypeMethod(bv,getcolumn,j,v);
1150 14092793 bv->ci[l] = j;
1151
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.
14092793 PetscCall(VecGetState(bv->cv[l],&bv->st[l]));
1152
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.
14092793 PetscCall(PetscObjectGetId((PetscObject)bv->cv[l],&bv->id[l]));
1153 14092793 *v = bv->cv[l];
1154
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.
14092793 PetscFunctionReturn(PETSC_SUCCESS);
1155 }
1156
1157 /*@
1158 BVRestoreColumn - Restore a column obtained with `BVGetColumn()`.
1159
1160 Logically Collective
1161
1162 Input Parameters:
1163 + bv - the basis vectors context
1164 . j - the index of the column
1165 - v - vector obtained with `BVGetColumn()`
1166
1167 Note:
1168 The arguments must match the corresponding call to `BVGetColumn()`.
1169
1170 Level: beginner
1171
1172 .seealso: [](sec:bv), `BVGetColumn()`
1173 @*/
1174 14092793 PetscErrorCode BVRestoreColumn(BV bv,PetscInt j,Vec *v)
1175 {
1176 14092793 PetscObjectId id;
1177 14092793 PetscObjectState st;
1178 14092793 PetscInt l;
1179
1180
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
14092793 PetscFunctionBegin;
1181
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
14092793 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1182
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 PetscValidType(bv,1);
1183
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 BVCheckSizes(bv,1);
1184
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
14092793 PetscValidLogicalCollectiveInt(bv,j,2);
1185
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
14092793 PetscAssertPointer(v,3);
1186
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
14092793 PetscValidHeaderSpecific(*v,VEC_CLASSID,3);
1187
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.
14092793 PetscCheck(j>=0 || -j<=bv->nc,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"You requested constraint %" PetscInt_FMT " but only %" PetscInt_FMT " are available",-j,bv->nc);
1188
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 PetscCheck(j<bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"You requested column %" PetscInt_FMT " but only %" PetscInt_FMT " are available",j,bv->m);
1189
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.
14092793 PetscCheck(j==bv->ci[0] || j==bv->ci[1],PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Column %" PetscInt_FMT " has not been fetched with a call to BVGetColumn",j);
1190 14092793 l = (j==bv->ci[0])? 0: 1;
1191
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.
14092793 PetscCall(PetscObjectGetId((PetscObject)*v,&id));
1192
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14092793 PetscCheck(id==bv->id[l],PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Argument 3 is not the same Vec that was obtained with BVGetColumn");
1193
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.
14092793 PetscCall(VecGetState(*v,&st));
1194
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
14092793 if (st!=bv->st[l]) PetscCall(PetscObjectStateIncrease((PetscObject)bv));
1195
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.
14092793 PetscUseTypeMethod(bv,restorecolumn,j,v);
1196 14092793 bv->ci[l] = -bv->nc-1;
1197 14092793 bv->st[l] = -1;
1198 14092793 bv->id[l] = 0;
1199 14092793 *v = NULL;
1200
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.
14092793 PetscFunctionReturn(PETSC_SUCCESS);
1201 }
1202
1203 /*@C
1204 BVGetArray - Returns a pointer to a contiguous array that contains this
1205 process' portion of the `BV` data.
1206
1207 Logically Collective
1208
1209 Input Parameter:
1210 . bv - the basis vectors context
1211
1212 Output Parameter:
1213 . a - location to put pointer to the array
1214
1215 Notes:
1216 `BVRestoreArray()` must be called when access to the array is no longer needed.
1217 This operation may imply a data copy, for `BV` types that do not store
1218 data contiguously in memory.
1219
1220 The pointer will normally point to the first entry of the first column,
1221 but if the `BV` has constraints then these go before the regular columns.
1222
1223 Note that for manipulating the pointer to the `BV` array, one must take into
1224 account the leading dimension, which might be different from the local
1225 number of rows, see `BVGetLeadingDimension()`.
1226
1227 Use `BVGetArrayRead()` for read-only access.
1228
1229 Level: advanced
1230
1231 .seealso: [](sec:bv), `BVRestoreArray()`, `BVInsertConstraints()`, `BVGetLeadingDimension()`, `BVGetArrayRead()`, `BVType`
1232 @*/
1233 263322 PetscErrorCode BVGetArray(BV bv,PetscScalar **a)
1234 {
1235
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
263322 PetscFunctionBegin;
1236
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
263322 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1237
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
263322 PetscValidType(bv,1);
1238
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
263322 BVCheckSizes(bv,1);
1239
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
263322 BVCheckOp(bv,1,getarray);
1240
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 10 times.
263322 PetscUseTypeMethod(bv,getarray,a);
1241
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.
52802 PetscFunctionReturn(PETSC_SUCCESS);
1242 }
1243
1244 /*@C
1245 BVRestoreArray - Restore the `BV` object after `BVGetArray()` has been called.
1246
1247 Logically Collective
1248
1249 Input Parameters:
1250 + bv - the basis vectors context
1251 - a - location of pointer to array obtained from `BVGetArray()`
1252
1253 Note:
1254 This operation may imply a data copy, for `BV` types that do not store
1255 data contiguously in memory.
1256
1257 Level: advanced
1258
1259 .seealso: [](sec:bv), `BVGetArray()`
1260 @*/
1261 263322 PetscErrorCode BVRestoreArray(BV bv,PetscScalar **a)
1262 {
1263
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
263322 PetscFunctionBegin;
1264
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
263322 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1265
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
263322 PetscValidType(bv,1);
1266
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
263322 BVCheckSizes(bv,1);
1267
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.
263322 PetscTryTypeMethod(bv,restorearray,a);
1268
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
263322 if (a) *a = NULL;
1269
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
263322 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
1270
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.
263322 PetscFunctionReturn(PETSC_SUCCESS);
1271 }
1272
1273 /*@C
1274 BVGetArrayRead - Returns a read-only pointer to a contiguous array that
1275 contains this processor's portion of the `BV` data.
1276
1277 Not Collective
1278
1279 Input Parameter:
1280 . bv - the basis vectors context
1281
1282 Output Parameter:
1283 . a - location to put pointer to the array
1284
1285 Notes:
1286 `BVRestoreArrayRead()` must be called when access to the array is no
1287 longer needed. This operation may imply a data copy, for `BV` types that
1288 do not store data contiguously in memory.
1289
1290 The pointer will normally point to the first entry of the first column,
1291 but if the `BV` has constraints then these go before the regular columns.
1292
1293 Level: advanced
1294
1295 .seealso: [](sec:bv), `BVRestoreArrayRead()`, `BVInsertConstraints()`, `BVGetLeadingDimension()`, `BVGetArray()`, `BVType`
1296 @*/
1297 2022 PetscErrorCode BVGetArrayRead(BV bv,const PetscScalar **a)
1298 {
1299
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2022 PetscFunctionBegin;
1300
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2022 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1301
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2022 PetscValidType(bv,1);
1302
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2022 BVCheckSizes(bv,1);
1303
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2022 BVCheckOp(bv,1,getarrayread);
1304
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 10 times.
2022 PetscUseTypeMethod(bv,getarrayread,a);
1305
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.
386 PetscFunctionReturn(PETSC_SUCCESS);
1306 }
1307
1308 /*@C
1309 BVRestoreArrayRead - Restore the `BV` object after `BVGetArrayRead()` has
1310 been called.
1311
1312 Not Collective
1313
1314 Input Parameters:
1315 + bv - the basis vectors context
1316 - a - location of pointer to array obtained from `BVGetArrayRead()`
1317
1318 Level: advanced
1319
1320 .seealso: [](sec:bv), `BVGetArrayRead()`
1321 @*/
1322 2022 PetscErrorCode BVRestoreArrayRead(BV bv,const PetscScalar **a)
1323 {
1324
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2022 PetscFunctionBegin;
1325
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2022 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1326
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2022 PetscValidType(bv,1);
1327
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2022 BVCheckSizes(bv,1);
1328
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.
2022 PetscTryTypeMethod(bv,restorearrayread,a);
1329
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2022 if (a) *a = NULL;
1330
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.
386 PetscFunctionReturn(PETSC_SUCCESS);
1331 }
1332
1333 /*@
1334 BVCreateVec - Creates a new `Vec` object with the same type and dimensions
1335 as the columns of the basis vectors object.
1336
1337 Collective
1338
1339 Input Parameter:
1340 . bv - the basis vectors context
1341
1342 Output Parameter:
1343 . v - the new vector
1344
1345 Note:
1346 The user is responsible for destroying the returned vector.
1347
1348 Level: beginner
1349
1350 .seealso: [](sec:bv), `BVCreateMat()`, `BVCreateVecEmpty()`
1351 @*/
1352 13624 PetscErrorCode BVCreateVec(BV bv,Vec *v)
1353 {
1354
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13624 PetscFunctionBegin;
1355
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
13624 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1356
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13624 BVCheckSizes(bv,1);
1357
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13624 PetscAssertPointer(v,2);
1358
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.
13624 PetscCall(VecCreate(PetscObjectComm((PetscObject)bv),v));
1359
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.
13624 PetscCall(VecSetLayout(*v,bv->map));
1360
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.
13624 PetscCall(VecSetType(*v,bv->vtype));
1361
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.
13624 PetscCall(VecSetUp(*v));
1362
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.
2694 PetscFunctionReturn(PETSC_SUCCESS);
1363 }
1364
1365 /*@
1366 BVCreateVecEmpty - Creates a new `Vec` object with the same type and dimensions
1367 as the columns of the basis vectors object, but without internal array.
1368
1369 Collective
1370
1371 Input Parameter:
1372 . bv - the basis vectors context
1373
1374 Output Parameter:
1375 . v - the new vector
1376
1377 Note:
1378 This works as `BVCreateVec()`, but the new vector does not have the array allocated,
1379 so the intended usage is with `VecPlaceArray()`.
1380
1381 Level: developer
1382
1383 .seealso: [](sec:bv), `BVCreateVec()`
1384 @*/
1385 294514 PetscErrorCode BVCreateVecEmpty(BV bv,Vec *v)
1386 {
1387 294514 PetscBool standard,cuda,hip,mpi;
1388 294514 PetscInt N,nloc,bs;
1389
1390
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
294514 PetscFunctionBegin;
1391
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
294514 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1392
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
294514 BVCheckSizes(bv,1);
1393
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
294514 PetscAssertPointer(v,2);
1394
1395
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.
294514 PetscCall(PetscStrcmpAny(bv->vtype,&standard,VECSEQ,VECMPI,""));
1396
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.
294514 PetscCall(PetscStrcmpAny(bv->vtype,&cuda,VECSEQCUDA,VECMPICUDA,""));
1397
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.
294514 PetscCall(PetscStrcmpAny(bv->vtype,&hip,VECSEQHIP,VECMPIHIP,""));
1398
5/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
294514 if (standard || cuda || hip) {
1399
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.
294514 PetscCall(PetscStrcmpAny(bv->vtype,&mpi,VECMPI,VECMPICUDA,VECMPIHIP,""));
1400
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.
294514 PetscCall(PetscLayoutGetLocalSize(bv->map,&nloc));
1401
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.
294514 PetscCall(PetscLayoutGetSize(bv->map,&N));
1402
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.
294514 PetscCall(PetscLayoutGetBlockSize(bv->map,&bs));
1403
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
294514 if (cuda) {
1404 #if defined(PETSC_HAVE_CUDA)
1405
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
6088 if (mpi) PetscCall(VecCreateMPICUDAWithArray(PetscObjectComm((PetscObject)bv),bs,nloc,N,NULL,v));
1406
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
4168 else PetscCall(VecCreateSeqCUDAWithArray(PetscObjectComm((PetscObject)bv),bs,N,NULL,v));
1407 #endif
1408
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
288426 } else if (hip) {
1409 #if defined(PETSC_HAVE_HIP)
1410
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
6082 if (mpi) PetscCall(VecCreateMPIHIPWithArray(PetscObjectComm((PetscObject)bv),bs,nloc,N,NULL,v));
1411
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
4162 else PetscCall(VecCreateSeqHIPWithArray(PetscObjectComm((PetscObject)bv),bs,N,NULL,v));
1412 #endif
1413 } else {
1414
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.
282344 if (mpi) PetscCall(VecCreateMPIWithArray(PetscObjectComm((PetscObject)bv),bs,nloc,N,NULL,v));
1415
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.
233758 else PetscCall(VecCreateSeqWithArray(PetscObjectComm((PetscObject)bv),bs,N,NULL,v));
1416 }
1417 } else PetscCall(BVCreateVec(bv,v)); /* standard duplicate, with internal array */
1418
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.
56608 PetscFunctionReturn(PETSC_SUCCESS);
1419 }
1420
1421 /*@
1422 BVSetVecType - Set the vector type to be used when creating vectors via `BVCreateVec()`.
1423
1424 Collective
1425
1426 Input Parameters:
1427 + bv - the basis vectors context
1428 - vtype - the vector type
1429
1430 Level: advanced
1431
1432 Note:
1433 This is not needed if the `BV` object is set up with `BVSetSizesFromVec()`, but may be
1434 required in the case of `BVSetSizes()` if one wants to work with non-standard vectors.
1435
1436 .seealso: [](sec:bv), `BVCreateVec()`, `BVGetVecType()`, `BVSetSizesFromVec()`, `BVSetSizes()`
1437 @*/
1438 160437 PetscErrorCode BVSetVecType(BV bv,VecType vtype)
1439 {
1440 160437 PetscBool std;
1441 160437 PetscMPIInt size;
1442
1443
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
160437 PetscFunctionBegin;
1444
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
160437 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1445
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.
160437 PetscCall(PetscFree(bv->vtype));
1446
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.
160437 PetscCall(PetscStrcmp(vtype,VECSTANDARD,&std));
1447
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
160437 if (std) {
1448
14/28
✓ 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 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
1150 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)bv),&size));
1449
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1230 PetscCall(PetscStrallocpy((size==1)?VECSEQ:VECMPI,(char**)&bv->vtype));
1450
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.
159287 } else PetscCall(PetscStrallocpy(vtype,(char**)&bv->vtype));
1451
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.
30836 PetscFunctionReturn(PETSC_SUCCESS);
1452 }
1453
1454 /*@
1455 BVGetVecType - Get the vector type to be used when creating vectors via `BVCreateVec()`.
1456
1457 Not Collective
1458
1459 Input Parameter:
1460 . bv - the basis vectors context
1461
1462 Output Parameter:
1463 . vtype - the vector type
1464
1465 Level: advanced
1466
1467 .seealso: [](sec:bv), `BVSetVecType()`, `BVCreateVec()`
1468 @*/
1469 3017 PetscErrorCode BVGetVecType(BV bv,VecType *vtype)
1470 {
1471
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3017 PetscFunctionBegin;
1472
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
3017 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1473
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
3017 PetscAssertPointer(vtype,2);
1474 3017 *vtype = bv->vtype;
1475
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.
3017 PetscFunctionReturn(PETSC_SUCCESS);
1476 }
1477
1478 /*@
1479 BVCreateMat - Creates a new `Mat` object of dense type and copies the contents
1480 of the `BV` object.
1481
1482 Collective
1483
1484 Input Parameter:
1485 . bv - the basis vectors context
1486
1487 Output Parameter:
1488 . A - the new matrix
1489
1490 Notes:
1491 The user is responsible for destroying the returned matrix.
1492
1493 The matrix contains all columns of the `BV`, not just the active columns.
1494
1495 Level: intermediate
1496
1497 .seealso: [](sec:bv), `BVCreateFromMat()`, `BVCreateVec()`, `BVGetMat()`
1498 @*/
1499 589 PetscErrorCode BVCreateMat(BV bv,Mat *A)
1500 {
1501 589 PetscInt ksave,lsave;
1502 589 Mat B;
1503
1504
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
589 PetscFunctionBegin;
1505
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
589 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1506
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
589 BVCheckSizes(bv,1);
1507
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
589 PetscAssertPointer(A,2);
1508
1509
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.
589 PetscCall(MatCreateDenseFromVecType(PetscObjectComm((PetscObject)bv),bv->vtype,bv->n,PETSC_DECIDE,bv->N,bv->m,bv->ld,NULL,A));
1510 589 lsave = bv->l;
1511 589 ksave = bv->k;
1512 589 bv->l = 0;
1513 589 bv->k = bv->m;
1514
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.
589 PetscCall(BVGetMat(bv,&B));
1515
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.
589 PetscCall(MatCopy(B,*A,SAME_NONZERO_PATTERN));
1516
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.
589 PetscCall(BVRestoreMat(bv,&B));
1517 589 bv->l = lsave;
1518 589 bv->k = ksave;
1519
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.
589 PetscFunctionReturn(PETSC_SUCCESS);
1520 }
1521
1522 259485 PetscErrorCode BVGetMat_Default(BV bv,Mat *A)
1523 {
1524 259485 PetscScalar *vv,*aa;
1525 259485 PetscBool create=PETSC_FALSE;
1526 259485 PetscInt m,cols;
1527
1528
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
259485 PetscFunctionBegin;
1529 259485 m = bv->k-bv->l;
1530
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
259485 if (!bv->Aget) create=PETSC_TRUE;
1531 else {
1532
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.
221804 PetscCall(MatDenseGetArray(bv->Aget,&aa));
1533
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
221804 PetscCheck(!aa,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"BVGetMat already called on this BV");
1534
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.
221804 PetscCall(MatGetSize(bv->Aget,NULL,&cols));
1535
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
221804 if (cols!=m) {
1536
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.
7333 PetscCall(MatDestroy(&bv->Aget));
1537 create=PETSC_TRUE;
1538 }
1539 }
1540
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.
259485 PetscCall(BVGetArray(bv,&vv));
1541
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
259485 if (create) {
1542
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.
45014 PetscCall(MatCreateDenseFromVecType(PetscObjectComm((PetscObject)bv),bv->vtype,bv->n,PETSC_DECIDE,bv->N,m,bv->ld,vv,&bv->Aget)); /* pass a pointer to avoid allocation of storage */
1543
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.
45014 PetscCall(MatDenseReplaceArray(bv->Aget,NULL)); /* replace with a null pointer, the value after BVRestoreMat */
1544 }
1545
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.
259485 PetscCall(MatDensePlaceArray(bv->Aget,vv+(bv->nc+bv->l)*bv->ld)); /* set the actual pointer */
1546 259485 *A = bv->Aget;
1547
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.
259485 PetscFunctionReturn(PETSC_SUCCESS);
1548 }
1549
1550 /*@
1551 BVGetMat - Returns a `Mat` object of dense type that shares the memory of
1552 the `BV` object.
1553
1554 Collective
1555
1556 Input Parameter:
1557 . bv - the basis vectors context
1558
1559 Output Parameter:
1560 . A - the matrix
1561
1562 Notes:
1563 The returned matrix contains only the active columns. If the content of
1564 the `Mat` is modified, these changes are also done in the `BV` object. The
1565 user must call `BVRestoreMat()` when no longer needed.
1566
1567 This operation implies a call to `BVGetArray()`, which may result in data
1568 copies.
1569
1570 Level: advanced
1571
1572 .seealso: [](sec:bv), `BVRestoreMat()`, `BVCreateMat()`, `BVGetArray()`
1573 @*/
1574 264896 PetscErrorCode BVGetMat(BV bv,Mat *A)
1575 {
1576 264896 char name[64];
1577
1578
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
264896 PetscFunctionBegin;
1579
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
264896 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1580
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264896 BVCheckSizes(bv,1);
1581
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
264896 PetscAssertPointer(A,2);
1582
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.
264896 PetscUseTypeMethod(bv,getmat,A);
1583
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
264896 if (((PetscObject)bv)->name) { /* set A's name based on BV name */
1584
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.
4586 PetscCall(PetscStrncpy(name,"Mat_",sizeof(name)));
1585
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.
4586 PetscCall(PetscStrlcat(name,((PetscObject)bv)->name,sizeof(name)));
1586
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.
4586 PetscCall(PetscObjectSetName((PetscObject)*A,name));
1587 }
1588
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.
52086 PetscFunctionReturn(PETSC_SUCCESS);
1589 }
1590
1591 259485 PetscErrorCode BVRestoreMat_Default(BV bv,Mat *A)
1592 {
1593 259485 PetscScalar *vv,*aa;
1594
1595
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
259485 PetscFunctionBegin;
1596
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.
259485 PetscCall(MatDenseGetArray(bv->Aget,&aa));
1597 259485 vv = aa-(bv->nc+bv->l)*bv->ld;
1598
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.
259485 PetscCall(MatDenseResetArray(bv->Aget));
1599
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.
259485 PetscCall(BVRestoreArray(bv,&vv));
1600 259485 *A = NULL;
1601
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.
259485 PetscFunctionReturn(PETSC_SUCCESS);
1602 }
1603
1604 /*@
1605 BVRestoreMat - Restores the Mat obtained with `BVGetMat()`.
1606
1607 Logically Collective
1608
1609 Input Parameters:
1610 + bv - the basis vectors context
1611 - A - the fetched matrix
1612
1613 Note:
1614 A call to this function must match a previous call of `BVGetMat()`.
1615 The effect is that the contents of the `Mat` are copied back to the
1616 `BV` internal data structures.
1617
1618 Level: advanced
1619
1620 .seealso: [](sec:bv), `BVGetMat()`, `BVRestoreArray()`
1621 @*/
1622 264896 PetscErrorCode BVRestoreMat(BV bv,Mat *A)
1623 {
1624
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
264896 PetscFunctionBegin;
1625
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
264896 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1626
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264896 BVCheckSizes(bv,1);
1627
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
264896 PetscAssertPointer(A,2);
1628
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264896 PetscCheck(bv->Aget,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"BVRestoreMat must match a previous call to BVGetMat");
1629
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
264896 PetscCheck(bv->Aget==*A,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Mat argument is not the same as the one obtained with BVGetMat");
1630
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.
264896 PetscUseTypeMethod(bv,restoremat,A);
1631
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.
52086 PetscFunctionReturn(PETSC_SUCCESS);
1632 }
1633
1634 /*
1635 Copy all user-provided attributes of V to another BV object W
1636 */
1637 126597 static inline PetscErrorCode BVDuplicate_Private(BV V,BV W)
1638 {
1639
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
126597 PetscFunctionBegin;
1640
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.
126597 PetscCall(PetscLayoutReference(V->map,&W->map));
1641
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.
126597 PetscCall(BVSetVecType(W,V->vtype));
1642 126597 W->ld = V->ld;
1643
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.
126597 PetscCall(BVSetType(W,((PetscObject)V)->type_name));
1644 126597 W->orthog_type = V->orthog_type;
1645 126597 W->orthog_ref = V->orthog_ref;
1646 126597 W->orthog_eta = V->orthog_eta;
1647 126597 W->orthog_block = V->orthog_block;
1648
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.
126597 PetscCall(PetscObjectReference((PetscObject)V->matrix));
1649 126597 W->matrix = V->matrix;
1650 126597 W->indef = V->indef;
1651 126597 W->vmm = V->vmm;
1652 126597 W->rrandom = V->rrandom;
1653 126597 W->deftol = V->deftol;
1654
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.
126597 PetscCall(PetscObjectReference((PetscObject)V->rand));
1655 126597 W->rand = V->rand;
1656 126597 W->sfocalled = V->sfocalled;
1657
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.
126597 PetscTryTypeMethod(V,duplicate,W);
1658
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
126597 PetscCall(PetscObjectStateIncrease((PetscObject)W));
1659
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.
126597 PetscFunctionReturn(PETSC_SUCCESS);
1660 }
1661
1662 /*@
1663 BVDuplicate - Creates a new basis vectors object of the same type and
1664 dimensions as an existing one.
1665
1666 Collective
1667
1668 Input Parameter:
1669 . V - basis vectors context
1670
1671 Output Parameter:
1672 . W - location to put the new `BV`
1673
1674 Notes:
1675 The new `BV` has the same type and dimensions as `V`. Also, the inner
1676 product matrix and orthogonalization options are copied.
1677
1678 `BVDuplicate()` DOES NOT COPY the entries, but rather allocates storage
1679 for the new basis vectors. Use `BVCopy()` to copy the content.
1680
1681 Level: intermediate
1682
1683 .seealso: [](sec:bv), `BVDuplicateResize()`, `BVCreate()`, `BVSetSizesFromVec()`, `BVCopy()`
1684 @*/
1685 29313 PetscErrorCode BVDuplicate(BV V,BV *W)
1686 {
1687
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
29313 PetscFunctionBegin;
1688
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
29313 PetscValidHeaderSpecific(V,BV_CLASSID,1);
1689
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
29313 PetscValidType(V,1);
1690
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
29313 BVCheckSizes(V,1);
1691
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
29313 PetscAssertPointer(W,2);
1692
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.
29313 PetscCall(BVCreate(PetscObjectComm((PetscObject)V),W));
1693 29313 (*W)->N = V->N;
1694 29313 (*W)->n = V->n;
1695 29313 (*W)->m = V->m;
1696 29313 (*W)->k = V->m;
1697
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.
29313 PetscCall(BVDuplicate_Private(V,*W));
1698
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.
5711 PetscFunctionReturn(PETSC_SUCCESS);
1699 }
1700
1701 /*@
1702 BVDuplicateResize - Creates a new basis vectors object of the same type and
1703 dimensions as an existing one, but with possibly different number of columns.
1704
1705 Collective
1706
1707 Input Parameters:
1708 + V - basis vectors context
1709 - m - the new number of columns
1710
1711 Output Parameter:
1712 . W - location to put the new BV
1713
1714 Note:
1715 This is equivalent to a call to `BVDuplicate()` followed by `BVResize()`. The
1716 contents of `V` are not copied to `W`.
1717
1718 Level: intermediate
1719
1720 .seealso: [](sec:bv), `BVDuplicate()`, `BVResize()`
1721 @*/
1722 92315 PetscErrorCode BVDuplicateResize(BV V,PetscInt m,BV *W)
1723 {
1724
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
92315 PetscFunctionBegin;
1725
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
92315 PetscValidHeaderSpecific(V,BV_CLASSID,1);
1726
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
92315 PetscValidType(V,1);
1727
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
92315 BVCheckSizes(V,1);
1728
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
92315 PetscValidLogicalCollectiveInt(V,m,2);
1729
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
92315 PetscAssertPointer(W,3);
1730
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.
92315 PetscCall(BVCreate(PetscObjectComm((PetscObject)V),W));
1731 92315 (*W)->N = V->N;
1732 92315 (*W)->n = V->n;
1733 92315 (*W)->m = m;
1734 92315 (*W)->k = m;
1735
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.
92315 PetscCall(BVDuplicate_Private(V,*W));
1736
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.
17954 PetscFunctionReturn(PETSC_SUCCESS);
1737 }
1738
1739 /*@
1740 BVGetCachedBV - Returns a `BV` object stored internally that holds the
1741 result of $BX$ after a call to `BVApplyMatrixBV()`.
1742
1743 Collective
1744
1745 Input Parameter:
1746 . bv - the basis vectors context
1747
1748 Output Parameter:
1749 . cached - the cached `BV`
1750
1751 Note:
1752 The cached `BV` is created if not available previously.
1753
1754 Level: developer
1755
1756 .seealso: [](sec:bv), `BVApplyMatrixBV()`
1757 @*/
1758 22009 PetscErrorCode BVGetCachedBV(BV bv,BV *cached)
1759 {
1760
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
22009 PetscFunctionBegin;
1761
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
22009 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1762
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
22009 PetscAssertPointer(cached,2);
1763
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
22009 BVCheckSizes(bv,1);
1764
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
22009 if (!bv->cached) {
1765
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.
1171 PetscCall(BVCreate(PetscObjectComm((PetscObject)bv),&bv->cached));
1766 1171 bv->cached->N = bv->N;
1767 1171 bv->cached->n = bv->n;
1768 1171 bv->cached->m = bv->m;
1769 1171 bv->cached->k = bv->m;
1770
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.
1171 PetscCall(BVDuplicate_Private(bv,bv->cached));
1771 }
1772 22009 *cached = bv->cached;
1773
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.
22009 PetscFunctionReturn(PETSC_SUCCESS);
1774 }
1775
1776 /*@
1777 BVCopy - Copies a basis vector object into another one, $W \leftarrow V$.
1778
1779 Logically Collective
1780
1781 Input Parameter:
1782 . V - basis vectors context
1783
1784 Output Parameter:
1785 . W - the copy
1786
1787 Note:
1788 Both `V` and `W` must be distributed in the same manner; local copies are
1789 done. Only active columns (excluding the leading ones) are copied.
1790 In the destination `W`, columns are overwritten starting from the leading ones.
1791 Constraints are not copied.
1792
1793 Level: beginner
1794
1795 .seealso: [](sec:bv), `BVCopyVec()`, `BVCopyColumn()`, `BVDuplicate()`, `BVSetActiveColumns()`
1796 @*/
1797 137790 PetscErrorCode BVCopy(BV V,BV W)
1798 {
1799 137790 PetscScalar *womega;
1800 137790 const PetscScalar *vomega;
1801
1802
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
137790 PetscFunctionBegin;
1803
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
137790 PetscValidHeaderSpecific(V,BV_CLASSID,1);
1804
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 PetscValidType(V,1);
1805
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 BVCheckSizes(V,1);
1806
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 BVCheckOp(V,1,copy);
1807
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
137790 PetscValidHeaderSpecific(W,BV_CLASSID,2);
1808
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 PetscValidType(W,2);
1809
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 BVCheckSizes(W,2);
1810
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
137790 PetscCheckSameTypeAndComm(V,1,W,2);
1811
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 PetscCheck(V->n==W->n,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_INCOMP,"Mismatching local dimension V %" PetscInt_FMT ", W %" PetscInt_FMT,V->n,W->n);
1812
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
137790 PetscCheck(V->k-V->l<=W->m-W->l,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_SIZ,"W has %" PetscInt_FMT " non-leading columns, not enough to store %" PetscInt_FMT " columns",W->m-W->l,V->k-V->l);
1813
3/16
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 2 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
137790 if (V==W || !V->n) PetscFunctionReturn(PETSC_SUCCESS);
1814
1815
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.
137790 PetscCall(PetscLogEventBegin(BV_Copy,V,W,0,0));
1816
5/8
✓ 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.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
137790 if (V->indef && V->matrix && V->indef==W->indef && V->matrix==W->matrix) {
1817 /* copy signature */
1818
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.
96 PetscCall(BV_AllocateSignature(W));
1819
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.
96 PetscCall(VecGetArrayRead(V->omega,&vomega));
1820
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.
96 PetscCall(VecGetArray(W->omega,&womega));
1821
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.
96 PetscCall(PetscArraycpy(womega+W->nc+W->l,vomega+V->nc+V->l,V->k-V->l));
1822
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.
96 PetscCall(VecRestoreArray(W->omega,&womega));
1823
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.
96 PetscCall(VecRestoreArrayRead(V->omega,&vomega));
1824 }
1825
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.
137790 PetscUseTypeMethod(V,copy,W);
1826
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.
137790 PetscCall(PetscLogEventEnd(BV_Copy,V,W,0,0));
1827
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
137790 PetscCall(PetscObjectStateIncrease((PetscObject)W));
1828
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.
137790 PetscFunctionReturn(PETSC_SUCCESS);
1829 }
1830
1831 /*@
1832 BVCopyVec - Copies one of the columns of a basis vectors object into a `Vec`.
1833
1834 Logically Collective
1835
1836 Input Parameters:
1837 + V - basis vectors context
1838 - j - the index of the column to be copied
1839
1840 Output Parameter:
1841 . w - the copied column
1842
1843 Note:
1844 Both `V` and `w` must be distributed in the same manner; local copies are done.
1845
1846 Level: beginner
1847
1848 .seealso: [](sec:bv), `BVCopy()`, `BVCopyColumn()`, `BVInsertVec()`
1849 @*/
1850 372768 PetscErrorCode BVCopyVec(BV V,PetscInt j,Vec w)
1851 {
1852 372768 PetscInt n,N;
1853 372768 Vec z;
1854
1855
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
372768 PetscFunctionBegin;
1856
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
372768 PetscValidHeaderSpecific(V,BV_CLASSID,1);
1857
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
372768 PetscValidType(V,1);
1858
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
372768 BVCheckSizes(V,1);
1859
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
372768 PetscValidLogicalCollectiveInt(V,j,2);
1860
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
372768 PetscValidHeaderSpecific(w,VEC_CLASSID,3);
1861
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
372768 PetscCheckSameComm(V,1,w,3);
1862
1863
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.
372768 PetscCall(VecGetSize(w,&N));
1864
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.
372768 PetscCall(VecGetLocalSize(w,&n));
1865
2/6
✓ 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.
372768 PetscCheck(N==V->N && n==V->n,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_INCOMP,"Vec sizes (global %" PetscInt_FMT ", local %" PetscInt_FMT ") do not match BV sizes (global %" PetscInt_FMT ", local %" PetscInt_FMT ")",N,n,V->N,V->n);
1866
1867
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.
372768 PetscCall(PetscLogEventBegin(BV_Copy,V,w,0,0));
1868
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.
372768 PetscCall(BVGetColumn(V,j,&z));
1869
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.
372768 PetscCall(VecCopy(z,w));
1870
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.
372768 PetscCall(BVRestoreColumn(V,j,&z));
1871
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.
372768 PetscCall(PetscLogEventEnd(BV_Copy,V,w,0,0));
1872
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.
72131 PetscFunctionReturn(PETSC_SUCCESS);
1873 }
1874
1875 /*@
1876 BVCopyColumn - Copies the values from one of the columns to another one.
1877
1878 Logically Collective
1879
1880 Input Parameters:
1881 + V - basis vectors context
1882 . j - the index of the source column
1883 - i - the index of the destination column
1884
1885 Level: beginner
1886
1887 .seealso: [](sec:bv), `BVCopy()`, `BVCopyVec()`
1888 @*/
1889 105539 PetscErrorCode BVCopyColumn(BV V,PetscInt j,PetscInt i)
1890 {
1891 105539 PetscScalar *omega;
1892
1893
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
105539 PetscFunctionBegin;
1894
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
105539 PetscValidHeaderSpecific(V,BV_CLASSID,1);
1895
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
105539 PetscValidType(V,1);
1896
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
105539 BVCheckSizes(V,1);
1897
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
105539 PetscValidLogicalCollectiveInt(V,j,2);
1898
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
105539 PetscValidLogicalCollectiveInt(V,i,3);
1899
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.
105539 if (j==i) PetscFunctionReturn(PETSC_SUCCESS);
1900
1901
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.
104924 PetscCall(PetscLogEventBegin(BV_Copy,V,0,0,0));
1902
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
104924 if (V->omega) {
1903
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.
10209 PetscCall(VecGetArray(V->omega,&omega));
1904 10209 omega[i] = omega[j];
1905
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.
10209 PetscCall(VecRestoreArray(V->omega,&omega));
1906 }
1907
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.
104924 PetscUseTypeMethod(V,copycolumn,j,i);
1908
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.
104924 PetscCall(PetscLogEventEnd(BV_Copy,V,0,0,0));
1909
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
104924 PetscCall(PetscObjectStateIncrease((PetscObject)V));
1910
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.
104924 PetscFunctionReturn(PETSC_SUCCESS);
1911 }
1912
1913 4156 static PetscErrorCode BVGetSplit_Private(BV bv,PetscBool left,BV *split)
1914 {
1915 4156 PetscInt ncols;
1916
1917
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4156 PetscFunctionBegin;
1918
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4156 ncols = left? bv->nc+bv->l: bv->m-bv->l;
1919
9/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
4156 if (*split && (ncols!=(*split)->m || bv->N!=(*split)->N)) PetscCall(BVDestroy(split));
1920
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4156 if (!*split) {
1921
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.
3798 PetscCall(BVCreate(PetscObjectComm((PetscObject)bv),split));
1922
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3798 (*split)->issplit = left? 1: 2;
1923 3798 (*split)->splitparent = bv;
1924 3798 (*split)->N = bv->N;
1925 3798 (*split)->n = bv->n;
1926 3798 (*split)->m = bv->m;
1927 3798 (*split)->k = bv->m;
1928
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.
3798 PetscCall(BVDuplicate_Private(bv,*split));
1929 }
1930 4156 (*split)->l = 0;
1931
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4156 (*split)->k = left? bv->l: bv->k-bv->l;
1932
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4156 (*split)->nc = left? bv->nc: 0;
1933 4156 (*split)->m = ncols-(*split)->nc;
1934
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4156 if ((*split)->nc) {
1935 288 (*split)->ci[0] = -(*split)->nc-1;
1936 288 (*split)->ci[1] = -(*split)->nc-1;
1937 }
1938
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.
4156 if (left) PetscCall(PetscObjectStateGet((PetscObject)*split,&bv->lstate));
1939
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.
2078 else PetscCall(PetscObjectStateGet((PetscObject)*split,&bv->rstate));
1940
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.
716 PetscFunctionReturn(PETSC_SUCCESS);
1941 }
1942
1943 /*@
1944 BVGetSplit - Splits the `BV` object into two `BV` objects that share the
1945 internal data, one of them containing the leading columns and the other
1946 one containing the remaining columns.
1947
1948 Collective
1949
1950 Input Parameter:
1951 . bv - the basis vectors context
1952
1953 Output Parameters:
1954 + L - left `BV` containing leading columns (can be `NULL`)
1955 - R - right `BV` containing remaining columns (can be `NULL`)
1956
1957 Notes:
1958 The columns are split in two sets. The leading columns (including the
1959 constraints) are assigned to the left `BV` and the remaining columns
1960 are assigned to the right `BV`. The number of leading columns, as
1961 specified with `BVSetActiveColumns()`, must be between `1` and `m-1` (to
1962 guarantee that both `L` and `R` have at least one column).
1963
1964 The returned `BV`s must be seen as references (not copies) of the input
1965 `BV`, that is, modifying them will change the entries of `bv` as well.
1966 The returned `BV`s must not be destroyed. `BVRestoreSplit()` must be called
1967 when they are no longer needed.
1968
1969 Pass `NULL` for any of the output `BV`s that is not needed.
1970
1971 Level: advanced
1972
1973 .seealso: [](sec:bv), `BVRestoreSplit()`, `BVSetActiveColumns()`, `BVSetNumConstraints()`, `BVGetSplitRows()`
1974 @*/
1975 2078 PetscErrorCode BVGetSplit(BV bv,BV *L,BV *R)
1976 {
1977
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2078 PetscFunctionBegin;
1978
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2078 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
1979
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 PetscValidType(bv,1);
1980
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 BVCheckSizes(bv,1);
1981
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 PetscCheck(bv->l,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Must indicate the number of leading columns with BVSetActiveColumns()");
1982
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 PetscCheck(bv->lsplit>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Cannot call BVGetSplit() after BVGetSplitRows()");
1983
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 PetscCheck(!bv->lsplit,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Cannot get the split BV's twice before restoring them with BVRestoreSplit()");
1984 2078 bv->lsplit = bv->nc+bv->l;
1985
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.
2078 PetscCall(BVGetSplit_Private(bv,PETSC_TRUE,&bv->L));
1986
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.
2078 PetscCall(BVGetSplit_Private(bv,PETSC_FALSE,&bv->R));
1987
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2078 if (L) *L = bv->L;
1988
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2078 if (R) *R = bv->R;
1989
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.
358 PetscFunctionReturn(PETSC_SUCCESS);
1990 }
1991
1992 /*@
1993 BVRestoreSplit - Restore the BV objects obtained with `BVGetSplit()`.
1994
1995 Logically Collective
1996
1997 Input Parameters:
1998 + bv - the basis vectors context
1999 . L - left BV obtained with BVGetSplit()
2000 - R - right BV obtained with BVGetSplit()
2001
2002 Note:
2003 The arguments must match the corresponding call to `BVGetSplit()`.
2004
2005 Level: advanced
2006
2007 .seealso: [](sec:bv), `BVGetSplit()`
2008 @*/
2009 2078 PetscErrorCode BVRestoreSplit(BV bv,BV *L,BV *R)
2010 {
2011
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2078 PetscFunctionBegin;
2012
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2078 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2013
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 PetscValidType(bv,1);
2014
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 BVCheckSizes(bv,1);
2015
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2078 PetscCheck(bv->lsplit>0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Must call BVGetSplit first");
2016
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.
2078 PetscCheck(!L || *L==bv->L,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Argument 2 is not the same BV that was obtained with BVGetSplit");
2017
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.
2078 PetscCheck(!R || *R==bv->R,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Argument 3 is not the same BV that was obtained with BVGetSplit");
2018
4/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2078 PetscCheck(!L || ((*L)->ci[0]<=(*L)->nc-1 && (*L)->ci[1]<=(*L)->nc-1),PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Argument 2 has unrestored columns, use BVRestoreColumn()");
2019
4/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2078 PetscCheck(!R || ((*R)->ci[0]<=(*R)->nc-1 && (*R)->ci[1]<=(*R)->nc-1),PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Argument 3 has unrestored columns, use BVRestoreColumn()");
2020
2021
3/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2078 PetscTryTypeMethod(bv,restoresplit,L,R);
2022 2078 bv->lsplit = 0;
2023
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2078 if (L) *L = NULL;
2024
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2078 if (R) *R = NULL;
2025
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.
358 PetscFunctionReturn(PETSC_SUCCESS);
2026 }
2027
2028 /*
2029 Copy all user-provided attributes of V to another BV object W with different layout
2030 */
2031 2232 static inline PetscErrorCode BVDuplicateNewLayout_Private(BV V,BV W)
2032 {
2033
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2232 PetscFunctionBegin;
2034
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.
2232 PetscCall(PetscLayoutCreateFromSizes(PetscObjectComm((PetscObject)V),W->n,W->N,1,&W->map));
2035
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.
2232 PetscCall(BVSetVecType(W,V->vtype));
2036 2232 W->ld = V->ld;
2037
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.
2232 PetscCall(BVSetType(W,((PetscObject)V)->type_name));
2038 2232 W->orthog_type = V->orthog_type;
2039 2232 W->orthog_ref = V->orthog_ref;
2040 2232 W->orthog_eta = V->orthog_eta;
2041 2232 W->orthog_block = V->orthog_block;
2042 2232 W->vmm = V->vmm;
2043 2232 W->rrandom = V->rrandom;
2044 2232 W->deftol = V->deftol;
2045
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.
2232 PetscCall(PetscObjectReference((PetscObject)V->rand));
2046 2232 W->rand = V->rand;
2047 2232 W->sfocalled = V->sfocalled;
2048
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.
2232 PetscTryTypeMethod(V,duplicate,W);
2049
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2232 PetscCall(PetscObjectStateIncrease((PetscObject)W));
2050
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.
2232 PetscFunctionReturn(PETSC_SUCCESS);
2051 }
2052
2053 5104 static PetscErrorCode BVGetSplitRows_Private(BV bv,PetscBool top,IS is,BV *split)
2054 {
2055 5104 PetscInt rstart,rend,lstart;
2056 5104 PetscInt N,n;
2057 5104 PetscBool contig;
2058
2059
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5104 PetscFunctionBegin;
2060
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.
5104 PetscCall(PetscLayoutGetRange(bv->map,&rstart,&rend));
2061
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.
5104 PetscCall(ISContiguousLocal(is,rstart,rend,&lstart,&contig));
2062
1/6
✗ 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.
5104 PetscCheck(contig,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"%s index set is not contiguous",(top==PETSC_TRUE)?"Upper":"Lower");
2063
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.
5104 if (top) PetscCheck(lstart==0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONG,"Upper index set should start at first local row");
2064 2552 else bv->lsplit = -lstart;
2065
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.
5104 PetscCall(ISGetSize(is,&N));
2066
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.
5104 PetscCall(ISGetLocalSize(is,&n));
2067
9/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
5104 if (*split && (bv->m!=(*split)->m || N!=(*split)->N)) PetscCall(BVDestroy(split));
2068
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5104 if (!*split) {
2069
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.
2232 PetscCall(BVCreate(PetscObjectComm((PetscObject)bv),split));
2070
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2232 (*split)->issplit = top? -1: -2;
2071 2232 (*split)->splitparent = bv;
2072 2232 (*split)->N = N;
2073 2232 (*split)->n = n;
2074 2232 (*split)->m = bv->m;
2075
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.
2232 PetscCall(BVDuplicateNewLayout_Private(bv,*split));
2076 }
2077 5104 (*split)->k = bv->k;
2078 5104 (*split)->l = bv->l;
2079 5104 (*split)->nc = bv->nc;
2080
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5104 if ((*split)->nc) {
2081 168 (*split)->ci[0] = -(*split)->nc-1;
2082 168 (*split)->ci[1] = -(*split)->nc-1;
2083 }
2084
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.
5104 if (top) PetscCall(PetscObjectStateGet((PetscObject)*split,&bv->rstate));
2085
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.
2552 else PetscCall(PetscObjectStateGet((PetscObject)*split,&bv->lstate));
2086
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.
872 PetscFunctionReturn(PETSC_SUCCESS);
2087 }
2088
2089 /*@
2090 BVGetSplitRows - Splits the `BV` object into two `BV` objects that share the
2091 internal data, using a disjoint horizontal splitting.
2092
2093 Collective
2094
2095 Input Parameters:
2096 + bv - the basis vectors context
2097 . isup - the index set that defines the upper part of the horizontal splitting
2098 - islo - the index set that defines the lower part of the horizontal splitting
2099
2100 Output Parameters:
2101 + U - the resulting `BV` containing the upper rows
2102 - L - the resulting `BV` containing the lower rows
2103
2104 Notes:
2105 The index sets must be such that every MPI process can extract the selected
2106 rows from its local part of the input `BV`, and this part must be contiguous.
2107 With one process, `isup` will list contiguous indices starting from 0, and `islo`
2108 will contain the remaining indices, hence we refer to upper and lower part.
2109 However, with several processes the indices will be interleaved because
2110 `isup` will refer to the upper part of the local array.
2111
2112 The intended use of this function is with matrices of `MATNEST` type, where
2113 `MatNestGetISs()` will return the appropriate index sets.
2114
2115 The returned `BV`s must be seen as references (not copies) of the input
2116 `BV`, that is, modifying them will change the entries of `bv` as well.
2117 The returned `BV`s must not be destroyed. `BVRestoreSplitRows()` must be called
2118 when they are no longer needed.
2119
2120 Pass `NULL` for any of the output `BV`s that is not needed.
2121
2122 Level: advanced
2123
2124 .seealso: [](sec:bv), `BVRestoreSplitRows()`, `BVGetSplit()`
2125 @*/
2126 2552 PetscErrorCode BVGetSplitRows(BV bv,IS isup,IS islo,BV *U,BV *L)
2127 {
2128
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2552 PetscFunctionBegin;
2129
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2552 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2130
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 PetscValidType(bv,1);
2131
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 BVCheckSizes(bv,1);
2132
4/18
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2552 if (U) PetscValidHeaderSpecific(isup,IS_CLASSID,2);
2133
4/18
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2552 if (L) PetscValidHeaderSpecific(islo,IS_CLASSID,3);
2134
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 PetscCheck(bv->lsplit<=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Cannot call BVGetSplitRows() after BVGetSplit()");
2135
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 PetscCheck(!bv->lsplit,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Cannot get the split BV's twice before restoring them with BVRestoreSplitRows()");
2136
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2552 if (U) {
2137
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.
2552 PetscCall(BVGetSplitRows_Private(bv,PETSC_TRUE,isup,&bv->R));
2138 2552 *U = bv->R;
2139 }
2140
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2552 if (L) {
2141
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.
2552 PetscCall(BVGetSplitRows_Private(bv,PETSC_FALSE,islo,&bv->L));
2142 2552 *L = bv->L;
2143 }
2144
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.
436 PetscFunctionReturn(PETSC_SUCCESS);
2145 }
2146
2147 /*@
2148 BVRestoreSplitRows - Restore the BV objects obtained with `BVGetSplitRows()`.
2149
2150 Logically Collective
2151
2152 Input Parameters:
2153 + bv - the basis vectors context
2154 . isup - the index set that defines the upper part of the horizontal splitting
2155 . islo - the index set that defines the lower part of the horizontal splitting
2156 . U - the `BV` containing the upper rows
2157 - L - the `BV` containing the lower rows
2158
2159 Note:
2160 The arguments must match the corresponding call to `BVGetSplitRows()`.
2161
2162 Level: advanced
2163
2164 .seealso: [](sec:bv), `BVGetSplitRows()`
2165 @*/
2166 2552 PetscErrorCode BVRestoreSplitRows(BV bv,IS isup,IS islo,BV *U,BV *L)
2167 {
2168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2552 PetscFunctionBegin;
2169
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2552 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2170
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 PetscValidType(bv,1);
2171
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 BVCheckSizes(bv,1);
2172
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2552 PetscCheck(bv->lsplit<0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"Must call BVGetSplitRows first");
2173
3/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2552 PetscCheck(!U || ((*U)->ci[0]<=(*U)->nc-1 && (*U)->ci[1]<=(*U)->nc-1),PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"The upper BV has unrestored columns, use BVRestoreColumn()");
2174
3/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2552 PetscCheck(!L || ((*L)->ci[0]<=(*L)->nc-1 && (*L)->ci[1]<=(*L)->nc-1),PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_WRONGSTATE,"The lower BV has unrestored columns, use BVRestoreColumn()");
2175
3/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2552 PetscTryTypeMethod(bv,restoresplitrows,isup,islo,U,L);
2176 2552 bv->lsplit = 0;
2177
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.
2552 PetscFunctionReturn(PETSC_SUCCESS);
2178 }
2179
2180 /*@
2181 BVSetDefiniteTolerance - Set the tolerance to be used when checking a
2182 definite inner product.
2183
2184 Logically Collective
2185
2186 Input Parameters:
2187 + bv - basis vectors
2188 - deftol - the tolerance
2189
2190 Options Database Key:
2191 . -bv_definite_tol deftol - the tolerance
2192
2193 Notes:
2194 When using a non-standard inner product, see `BVSetMatrix()`, the solver needs
2195 to compute $\sqrt{z^*B z}$ for various vectors $z$. If the inner product has not
2196 been declared indefinite, the value $z^*B z$ must be positive, but due to
2197 rounding error a tiny value may become negative. A tolerance is used to
2198 detect this situation. Likewise, in complex arithmetic $z^*B z$ should be
2199 real, and we use the same tolerance to check whether a nonzero imaginary part
2200 can be considered negligible.
2201
2202 This function sets this tolerance, which defaults to `10*PETSC_MACHINE_EPSILON`.
2203 The default value should be good for most applications.
2204
2205 Level: advanced
2206
2207 .seealso: [](sec:bv), `BVSetMatrix()`
2208 @*/
2209 54 PetscErrorCode BVSetDefiniteTolerance(BV bv,PetscReal deftol)
2210 {
2211
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54 PetscFunctionBegin;
2212
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
54 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2213
29/66
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
54 PetscValidLogicalCollectiveReal(bv,deftol,2);
2214
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
54 if (deftol == (PetscReal)PETSC_DEFAULT || deftol == (PetscReal)PETSC_DECIDE) bv->deftol = 10*PETSC_MACHINE_EPSILON;
2215 else {
2216
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54 PetscCheck(deftol>0.0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of deftol. Must be > 0");
2217 54 bv->deftol = deftol;
2218 }
2219
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.
14 PetscFunctionReturn(PETSC_SUCCESS);
2220 }
2221
2222 /*@
2223 BVGetDefiniteTolerance - Returns the tolerance for checking a definite
2224 inner product.
2225
2226 Not Collective
2227
2228 Input Parameter:
2229 . bv - the basis vectors
2230
2231 Output Parameter:
2232 . deftol - the tolerance
2233
2234 Level: advanced
2235
2236 .seealso: [](sec:bv), `BVSetDefiniteTolerance()`
2237 @*/
2238 PetscErrorCode BVGetDefiniteTolerance(BV bv,PetscReal *deftol)
2239 {
2240 PetscFunctionBegin;
2241 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2242 PetscAssertPointer(deftol,2);
2243 *deftol = bv->deftol;
2244 PetscFunctionReturn(PETSC_SUCCESS);
2245 }
2246
2247 /*@
2248 BVSetLeadingDimension - Set the leading dimension to be used for storing the `BV` data.
2249
2250 Not Collective
2251
2252 Input Parameters:
2253 + bv - basis vectors
2254 - ld - the leading dimension
2255
2256 Notes:
2257 This parameter is relevant for `BVMAT`, though it might be employed in other types
2258 as well.
2259
2260 When the internal data of the `BV` is stored as a dense matrix, the leading dimension
2261 has the same meaning as in `MatDenseSetLDA()`, i.e., the distance in number of
2262 elements from one entry of the matrix to the one in the next column at the same
2263 row. The leading dimension refers to the local array, and hence can be different
2264 in different processes.
2265
2266 The user does not need to change this parameter. The default value is equal to the
2267 number of local rows, but this value may be increased a little to guarantee alignment
2268 (especially in the case of GPU storage).
2269
2270 Level: advanced
2271
2272 .seealso: [](sec:bv), `BVGetLeadingDimension()`
2273 @*/
2274 PetscErrorCode BVSetLeadingDimension(BV bv,PetscInt ld)
2275 {
2276 PetscFunctionBegin;
2277 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2278 PetscValidLogicalCollectiveInt(bv,ld,2);
2279 PetscCheck((bv->n<0 && bv->N<0) || !bv->ops->create,PetscObjectComm((PetscObject)bv),PETSC_ERR_ORDER,"Must call BVSetLeadingDimension() before setting the BV type and sizes");
2280 if (ld == PETSC_DEFAULT || ld == PETSC_DECIDE) bv->ld = 0;
2281 else {
2282 PetscCheck(ld>0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of ld. Must be > 0");
2283 bv->ld = ld;
2284 }
2285 PetscFunctionReturn(PETSC_SUCCESS);
2286 }
2287
2288 /*@
2289 BVGetLeadingDimension - Returns the leading dimension of the `BV`.
2290
2291 Not Collective
2292
2293 Input Parameter:
2294 . bv - the basis vectors
2295
2296 Output Parameter:
2297 . ld - the leading dimension
2298
2299 Level: advanced
2300
2301 Notes:
2302 The returned value may be different in different processes.
2303
2304 The leading dimension must be used when accessing the internal array via
2305 `BVGetArray()` or `BVGetArrayRead()`.
2306
2307 .seealso: [](sec:bv), `BVSetLeadingDimension()`, `BVGetArray()`, `BVGetArrayRead()`
2308 @*/
2309 2188 PetscErrorCode BVGetLeadingDimension(BV bv,PetscInt *ld)
2310 {
2311
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2188 PetscFunctionBegin;
2312
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2188 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
2313
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2188 PetscAssertPointer(ld,2);
2314 2188 *ld = bv->ld;
2315
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.
2188 PetscFunctionReturn(PETSC_SUCCESS);
2316 }
2317