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 | Common subroutines for several PEP solvers | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/ | ||
15 | #include <slepcblaslapack.h> | ||
16 | |||
17 | /* | ||
18 | Computes T_j=phy_idx(T) for a matrix T. | ||
19 | Tp (if j>0) and Tpp (if j>1) are the evaluation | ||
20 | of phy_(j-1) and phy(j-2)respectively. | ||
21 | */ | ||
22 | 569 | PetscErrorCode PEPEvaluateBasisMat(PEP pep,PetscInt k,PetscScalar *T,PetscInt ldt,PetscInt idx,PetscScalar *Tpp,PetscInt ldtpp,PetscScalar *Tp,PetscInt ldtp,PetscScalar *Tj,PetscInt ldtj) | |
23 | { | ||
24 | 569 | PetscInt i; | |
25 | 569 | PetscReal *ca,*cb,*cg; | |
26 | 569 | PetscScalar g,a; | |
27 | 569 | PetscBLASInt k_,ldt_,ldtj_,ldtp_; | |
28 | |||
29 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
569 | PetscFunctionBegin; |
30 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
569 | if (idx==0) { |
31 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
527 | for (i=0;i<k;i++) { |
32 |
4/6✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
344 | PetscCall(PetscArrayzero(Tj+i*ldtj,k)); |
33 | 344 | Tj[i+i*ldtj] = 1.0; | |
34 | } | ||
35 | } else { | ||
36 |
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.
|
386 | PetscCall(PetscBLASIntCast(ldt,&ldt_)); |
37 |
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.
|
386 | PetscCall(PetscBLASIntCast(ldtj,&ldtj_)); |
38 |
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.
|
386 | PetscCall(PetscBLASIntCast(ldtp,&ldtp_)); |
39 |
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.
|
386 | PetscCall(PetscBLASIntCast(k,&k_)); |
40 | 386 | ca = pep->pbc; cb = pep->pbc+pep->nmat; cg = pep->pbc+2*pep->nmat; | |
41 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1094 | for (i=0;i<k;i++) T[i*ldt+i] -= cb[idx-1]; |
42 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
386 | if (idx>1) { |
43 |
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.
|
567 | for (i=0;i<k;i++) PetscCall(PetscArraycpy(Tj+i*ldtj,Tpp+i*ldtpp,k)); |
44 | } | ||
45 | 386 | a = 1/ca[idx-1]; | |
46 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
386 | g = (idx==1)?0.0:-cg[idx-1]/ca[idx-1]; |
47 |
10/20✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
386 | PetscCallBLAS("BLASgemm",BLASgemm_("N","N",&k_,&k_,&k_,&a,T,&ldt_,Tp,&ldtp_,&g,Tj,&ldtj_)); |
48 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1094 | for (i=0;i<k;i++) T[i*ldt+i] += cb[idx-1]; |
49 | } | ||
50 |
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.
|
118 | PetscFunctionReturn(PETSC_SUCCESS); |
51 | } | ||
52 | |||
53 | /* | ||
54 | PEPEvaluateBasis - evaluate the polynomial basis on a given parameter sigma | ||
55 | */ | ||
56 | 51379 | PetscErrorCode PEPEvaluateBasis(PEP pep,PetscScalar sigma,PetscScalar isigma,PetscScalar *vals,PetscScalar *ivals) | |
57 | { | ||
58 | 51379 | PetscInt nmat=pep->nmat,k; | |
59 | 51379 | PetscReal *a=pep->pbc,*b=pep->pbc+nmat,*g=pep->pbc+2*nmat; | |
60 | |||
61 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
51379 | PetscFunctionBegin; |
62 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
210750 | if (ivals) for (k=0;k<nmat;k++) ivals[k] = 0.0; |
63 | 51379 | vals[0] = 1.0; | |
64 | 51379 | vals[1] = (sigma-b[0])/a[0]; | |
65 | #if !defined(PETSC_USE_COMPLEX) | ||
66 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
22129 | if (ivals) ivals[1] = isigma/a[0]; |
67 | #endif | ||
68 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
128688 | for (k=2;k<nmat;k++) { |
69 | 77309 | vals[k] = ((sigma-b[k-1])*vals[k-1]-g[k-1]*vals[k-2])/a[k-1]; | |
70 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
77309 | if (ivals) vals[k] -= isigma*ivals[k-1]/a[k-1]; |
71 | #if !defined(PETSC_USE_COMPLEX) | ||
72 | 28242 | if (ivals) ivals[k] = ((sigma-b[k-1])*ivals[k-1]+isigma*vals[k-1]-g[k-1]*ivals[k-2])/a[k-1]; | |
73 | #endif | ||
74 | } | ||
75 |
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.
|
51379 | PetscFunctionReturn(PETSC_SUCCESS); |
76 | } | ||
77 | |||
78 | /* | ||
79 | PEPEvaluateBasisDerivative - evaluate the derivative of the polynomial basis on a given parameter sigma | ||
80 | */ | ||
81 | 5351 | PetscErrorCode PEPEvaluateBasisDerivative(PEP pep,PetscScalar sigma,PetscScalar isigma,PetscScalar *vals,PetscScalar *ivals) | |
82 | { | ||
83 | 5351 | PetscInt nmat=pep->nmat,k; | |
84 | 5351 | PetscReal *a=pep->pbc,*b=pep->pbc+nmat,*g=pep->pbc+2*nmat; | |
85 | |||
86 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5351 | PetscFunctionBegin; |
87 |
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.
|
5351 | PetscCall(PEPEvaluateBasis(pep,sigma,isigma,vals,ivals)); |
88 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20143 | for (k=nmat-1;k>0;k--) { |
89 | 14792 | vals[k] = vals[k-1]; | |
90 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
14792 | if (ivals) ivals[k] = ivals[k-1]; |
91 | } | ||
92 | 5351 | vals[0] = 0.0; | |
93 | 5351 | vals[1] = vals[1]/a[0]; | |
94 | #if !defined(PETSC_USE_COMPLEX) | ||
95 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
1445 | if (ivals) ivals[1] = ivals[1]/a[0]; |
96 | #endif | ||
97 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
14792 | for (k=2;k<nmat;k++) { |
98 | 9441 | vals[k] += (sigma-b[k-1])*vals[k-1]-g[k-1]*vals[k-2]; | |
99 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
9441 | if (ivals) vals[k] -= isigma*ivals[k-1]; |
100 | 9441 | vals[k] /= a[k-1]; | |
101 | #if !defined(PETSC_USE_COMPLEX) | ||
102 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
1583 | if (ivals) { |
103 | 1583 | ivals[k] += (sigma-b[k-1])*ivals[k-1]+isigma*vals[k-1]-g[k-1]*ivals[k-2]; | |
104 | 1583 | ivals[k] /= a[k-1]; | |
105 | } | ||
106 | #endif | ||
107 | } | ||
108 |
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.
|
1099 | PetscFunctionReturn(PETSC_SUCCESS); |
109 | } | ||
110 |