GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvbasic.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 846 912 92.8%
Functions: 54 58 93.1%
Branches: 2428 5793 41.9%

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