Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | |||
11 | #include <slepc/private/slepccontour.h> | ||
12 | #include <slepcblaslapack.h> | ||
13 | |||
14 | /* | ||
15 | SlepcContourDataCreate - Create a contour data structure. | ||
16 | |||
17 | Input Parameters: | ||
18 | n - the number of integration points | ||
19 | npart - number of partitions for the subcommunicator | ||
20 | parent - parent object | ||
21 | */ | ||
22 | 557 | PetscErrorCode SlepcContourDataCreate(PetscInt n,PetscInt npart,PetscObject parent,SlepcContourData *contour) | |
23 | { | ||
24 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
557 | PetscFunctionBegin; |
25 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
557 | PetscCall(PetscNew(contour)); |
26 | 557 | (*contour)->parent = parent; | |
27 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
557 | PetscCall(PetscSubcommCreate(PetscObjectComm(parent),&(*contour)->subcomm)); |
28 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
557 | PetscCall(PetscSubcommSetNumber((*contour)->subcomm,npart)); |
29 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
557 | PetscCall(PetscSubcommSetType((*contour)->subcomm,PETSC_SUBCOMM_INTERLACED)); |
30 | 557 | (*contour)->npoints = n / npart; | |
31 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
557 | if (n%npart > (*contour)->subcomm->color) (*contour)->npoints++; |
32 |
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.
|
116 | PetscFunctionReturn(PETSC_SUCCESS); |
33 | } | ||
34 | |||
35 | /* | ||
36 | SlepcContourDataReset - Resets the KSP objects in a contour data structure, | ||
37 | and destroys any objects whose size depends on the problem size. | ||
38 | */ | ||
39 | 419 | PetscErrorCode SlepcContourDataReset(SlepcContourData contour) | |
40 | { | ||
41 | 419 | PetscInt i; | |
42 | |||
43 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
419 | PetscFunctionBegin; |
44 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
419 | if (contour->ksp) { |
45 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
9627 | for (i=0;i<contour->npoints;i++) PetscCall(KSPReset(contour->ksp[i])); |
46 | } | ||
47 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
419 | if (contour->pA) { |
48 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(MatDestroyMatrices(contour->nmat,&contour->pA)); |
49 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(MatDestroyMatrices(contour->nmat,&contour->pP)); |
50 | 174 | contour->nmat = 0; | |
51 | } | ||
52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
419 | PetscCall(VecScatterDestroy(&contour->scatterin)); |
53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
419 | PetscCall(VecDestroy(&contour->xsub)); |
54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
419 | PetscCall(VecDestroy(&contour->xdup)); |
55 |
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.
|
88 | PetscFunctionReturn(PETSC_SUCCESS); |
56 | } | ||
57 | |||
58 | /* | ||
59 | SlepcContourDataDestroy - Destroys the contour data structure. | ||
60 | */ | ||
61 | 818 | PetscErrorCode SlepcContourDataDestroy(SlepcContourData *contour) | |
62 | { | ||
63 | 818 | PetscInt i; | |
64 | |||
65 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
818 | PetscFunctionBegin; |
66 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
818 | if (!(*contour)) PetscFunctionReturn(PETSC_SUCCESS); |
67 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
557 | if ((*contour)->ksp) { |
68 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
13461 | for (i=0;i<(*contour)->npoints;i++) PetscCall(KSPDestroy(&(*contour)->ksp[i])); |
69 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
557 | PetscCall(PetscFree((*contour)->ksp)); |
70 | } | ||
71 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
557 | PetscCall(PetscSubcommDestroy(&(*contour)->subcomm)); |
72 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
557 | PetscCall(PetscFree((*contour))); |
73 | 557 | *contour = NULL; | |
74 |
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.
|
557 | PetscFunctionReturn(PETSC_SUCCESS); |
75 | } | ||
76 | |||
77 | /* | ||
78 | SlepcContourRedundantMat - Creates redundant copies of the passed matrices in the subcomm. | ||
79 | |||
80 | Input Parameters: | ||
81 | nmat - the number of matrices | ||
82 | A - array of matrices | ||
83 | P - array of matrices (preconditioner) | ||
84 | */ | ||
85 | 537 | PetscErrorCode SlepcContourRedundantMat(SlepcContourData contour,PetscInt nmat,Mat *A,Mat *P) | |
86 | { | ||
87 | 537 | PetscInt i; | |
88 | 537 | MPI_Comm child; | |
89 | |||
90 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
537 | PetscFunctionBegin; |
91 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
537 | if (contour->pA) { |
92 | ✗ | PetscCall(MatDestroyMatrices(contour->nmat,&contour->pA)); | |
93 | ✗ | PetscCall(MatDestroyMatrices(contour->nmat,&contour->pP)); | |
94 | ✗ | contour->nmat = 0; | |
95 | } | ||
96 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
537 | if (contour->subcomm && contour->subcomm->n != 1) { |
97 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(PetscSubcommGetChild(contour->subcomm,&child)); |
98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(PetscCalloc1(nmat,&contour->pA)); |
99 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
548 | for (i=0;i<nmat;i++) PetscCall(MatCreateRedundantMatrix(A[i],contour->subcomm->n,child,MAT_INITIAL_MATRIX,&contour->pA[i])); |
100 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
174 | if (P) { |
101 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(PetscCalloc1(nmat,&contour->pP)); |
102 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
140 | for (i=0;i<nmat;i++) PetscCall(MatCreateRedundantMatrix(P[i],contour->subcomm->n,child,MAT_INITIAL_MATRIX,&contour->pP[i])); |
103 | } | ||
104 | 174 | contour->nmat = nmat; | |
105 | } | ||
106 |
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.
|
112 | PetscFunctionReturn(PETSC_SUCCESS); |
107 | } | ||
108 | |||
109 | /* | ||
110 | SlepcContourScatterCreate - Creates a scatter context to communicate between a | ||
111 | regular vector and a vector xdup that can hold one duplicate per each subcommunicator | ||
112 | on the contiguous parent communicator. Also creates auxiliary vectors xdup and xsub | ||
113 | (the latter with the same layout as the redundant matrices in the subcommunicator). | ||
114 | |||
115 | Input Parameters: | ||
116 | v - the regular vector from which dimensions are taken | ||
117 | */ | ||
118 | 174 | PetscErrorCode SlepcContourScatterCreate(SlepcContourData contour,Vec v) | |
119 | { | ||
120 | 174 | IS is1,is2; | |
121 | 174 | PetscInt i,j,k,m,mstart,mend,mlocal; | |
122 | 174 | PetscInt *idx1,*idx2,mloc_sub; | |
123 | 174 | MPI_Comm contpar,parent; | |
124 | |||
125 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
174 | PetscFunctionBegin; |
126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecDestroy(&contour->xsub)); |
127 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(MatCreateVecsEmpty(contour->pA[0],&contour->xsub,NULL)); |
128 | |||
129 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecDestroy(&contour->xdup)); |
130 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(MatGetLocalSize(contour->pA[0],&mloc_sub,NULL)); |
131 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(PetscSubcommGetContiguousParent(contour->subcomm,&contpar)); |
132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecCreate(contpar,&contour->xdup)); |
133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecSetSizes(contour->xdup,mloc_sub,PETSC_DECIDE)); |
134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecSetType(contour->xdup,((PetscObject)v)->type_name)); |
135 | |||
136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecScatterDestroy(&contour->scatterin)); |
137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecGetSize(v,&m)); |
138 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecGetOwnershipRange(v,&mstart,&mend)); |
139 | 174 | mlocal = mend - mstart; | |
140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(PetscMalloc2(contour->subcomm->n*mlocal,&idx1,contour->subcomm->n*mlocal,&idx2)); |
141 | j = 0; | ||
142 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
562 | for (k=0;k<contour->subcomm->n;k++) { |
143 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
47708 | for (i=mstart;i<mend;i++) { |
144 | 47320 | idx1[j] = i; | |
145 | 47320 | idx2[j++] = i + m*k; | |
146 | } | ||
147 | } | ||
148 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(PetscSubcommGetParent(contour->subcomm,&parent)); |
149 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(ISCreateGeneral(parent,contour->subcomm->n*mlocal,idx1,PETSC_COPY_VALUES,&is1)); |
150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(ISCreateGeneral(parent,contour->subcomm->n*mlocal,idx2,PETSC_COPY_VALUES,&is2)); |
151 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(VecScatterCreate(v,is1,contour->xdup,is2,&contour->scatterin)); |
152 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(ISDestroy(&is1)); |
153 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(ISDestroy(&is2)); |
154 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
174 | PetscCall(PetscFree2(idx1,idx2)); |
155 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
156 | } | ||
157 | |||
158 | /* | ||
159 | SlepcCISS_isGhost - Determine if any of the computed eigenpairs are spurious. | ||
160 | |||
161 | Input Parameters: | ||
162 | X - the matrix of eigenvectors (MATSEQDENSE) | ||
163 | n - the number of columns to consider | ||
164 | sigma - the singular values | ||
165 | thresh - threshold to decide whether a value is spurious | ||
166 | |||
167 | Output Parameter: | ||
168 | fl - array of n booleans | ||
169 | */ | ||
170 | 548 | PetscErrorCode SlepcCISS_isGhost(Mat X,PetscInt n,PetscReal *sigma,PetscReal thresh,PetscBool *fl) | |
171 | { | ||
172 | 548 | const PetscScalar *pX; | |
173 | 548 | PetscInt i,j,m,ld; | |
174 | 548 | PetscReal *tau,s1,s2,tau_max=0.0; | |
175 | |||
176 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
548 | PetscFunctionBegin; |
177 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
548 | PetscCall(MatGetSize(X,&m,NULL)); |
178 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
548 | PetscCall(MatDenseGetLDA(X,&ld)); |
179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
548 | PetscCall(PetscMalloc1(n,&tau)); |
180 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
548 | PetscCall(MatDenseGetArrayRead(X,&pX)); |
181 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15893 | for (j=0;j<n;j++) { |
182 | s1 = 0.0; | ||
183 | s2 = 0.0; | ||
184 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
859546 | for (i=0;i<m;i++) { |
185 | 844201 | s1 += PetscAbsScalar(PetscPowScalarInt(pX[i+j*ld],2)); | |
186 | 1688402 | s2 += PetscPowRealInt(PetscAbsScalar(pX[i+j*ld]),2)/sigma[i]; | |
187 | } | ||
188 | 15345 | tau[j] = s1/s2; | |
189 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
17536 | tau_max = PetscMax(tau_max,tau[j]); |
190 | } | ||
191 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
548 | PetscCall(MatDenseRestoreArrayRead(X,&pX)); |
192 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
15893 | for (j=0;j<n;j++) fl[j] = (tau[j]>=thresh*tau_max)? PETSC_TRUE: PETSC_FALSE; |
193 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
548 | PetscCall(PetscFree(tau)); |
194 |
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.
|
114 | PetscFunctionReturn(PETSC_SUCCESS); |
195 | } | ||
196 | |||
197 | /* | ||
198 | SlepcCISS_BH_SVD - Compute SVD of block Hankel matrix and its rank. | ||
199 | |||
200 | Input Parameters: | ||
201 | H - block Hankel matrix obtained via CISS_BlockHankel() | ||
202 | ml - dimension of rows and columns, equal to M*L | ||
203 | delta - the tolerance used to determine the rank | ||
204 | |||
205 | Output Parameters: | ||
206 | sigma - computed singular values | ||
207 | rank - the rank of H | ||
208 | */ | ||
209 | 160 | PetscErrorCode SlepcCISS_BH_SVD(PetscScalar *H,PetscInt ml,PetscReal delta,PetscReal *sigma,PetscInt *rank) | |
210 | { | ||
211 | 160 | PetscInt i; | |
212 | 160 | PetscBLASInt m,n,lda,ldu,ldvt,lwork,info; | |
213 | 160 | PetscScalar *work; | |
214 | #if defined(PETSC_USE_COMPLEX) | ||
215 | 128 | PetscReal *rwork; | |
216 | #endif | ||
217 | |||
218 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
160 | PetscFunctionBegin; |
219 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
160 | PetscCall(PetscMalloc1(5*ml,&work)); |
220 | #if defined(PETSC_USE_COMPLEX) | ||
221 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
128 | PetscCall(PetscMalloc1(5*ml,&rwork)); |
222 | #endif | ||
223 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
160 | PetscCall(PetscBLASIntCast(ml,&m)); |
224 | 160 | n = m; lda = m; ldu = m; ldvt = m; lwork = 5*m; | |
225 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
160 | PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF)); |
226 | #if defined(PETSC_USE_COMPLEX) | ||
227 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
128 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","N",&m,&n,H,&lda,sigma,NULL,&ldu,NULL,&ldvt,work,&lwork,rwork,&info)); |
228 | #else | ||
229 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
32 | PetscCallBLAS("LAPACKgesvd",LAPACKgesvd_("N","N",&m,&n,H,&lda,sigma,NULL,&ldu,NULL,&ldvt,work,&lwork,&info)); |
230 | #endif | ||
231 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
160 | SlepcCheckLapackInfo("gesvd",info); |
232 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
160 | PetscCall(PetscFPTrapPop()); |
233 | 160 | (*rank) = 0; | |
234 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
9856 | for (i=0;i<ml;i++) { |
235 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
19000 | if (sigma[i]/PetscMax(sigma[0],1.0)>delta) (*rank)++; |
236 | } | ||
237 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
160 | PetscCall(PetscFree(work)); |
238 | #if defined(PETSC_USE_COMPLEX) | ||
239 |
5/8✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
128 | PetscCall(PetscFree(rwork)); |
240 | #endif | ||
241 |
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.
|
32 | PetscFunctionReturn(PETSC_SUCCESS); |
242 | } | ||
243 |