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 | Inverse square root function x^(-1/2) | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/fnimpl.h> /*I "slepcfn.h" I*/ | ||
15 | #include <slepcblaslapack.h> | ||
16 | |||
17 | 492 | static PetscErrorCode FNEvaluateFunction_Invsqrt(FN fn,PetscScalar x,PetscScalar *y) | |
18 | { | ||
19 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
492 | PetscFunctionBegin; |
20 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
492 | PetscCheck(x!=0.0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Function not defined in the requested value"); |
21 | #if !defined(PETSC_USE_COMPLEX) | ||
22 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
246 | PetscCheck(x>0.0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Function not defined in the requested value"); |
23 | #endif | ||
24 | 492 | *y = 1.0/PetscSqrtScalar(x); | |
25 |
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.
|
492 | PetscFunctionReturn(PETSC_SUCCESS); |
26 | } | ||
27 | |||
28 | 92 | static PetscErrorCode FNEvaluateDerivative_Invsqrt(FN fn,PetscScalar x,PetscScalar *y) | |
29 | { | ||
30 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
92 | PetscFunctionBegin; |
31 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
92 | PetscCheck(x!=0.0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Derivative not defined in the requested value"); |
32 | #if !defined(PETSC_USE_COMPLEX) | ||
33 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
46 | PetscCheck(x>0.0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Derivative not defined in the requested value"); |
34 | #endif | ||
35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
92 | *y = -1.0/(2.0*PetscPowScalarReal(x,1.5)); |
36 |
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.
|
92 | PetscFunctionReturn(PETSC_SUCCESS); |
37 | } | ||
38 | |||
39 | 40 | static PetscErrorCode FNEvaluateFunctionMat_Invsqrt_Schur(FN fn,Mat A,Mat B) | |
40 | { | ||
41 | 40 | PetscBLASInt n=0,ld,*ipiv,info; | |
42 | 40 | PetscScalar *Ba,*Wa; | |
43 | 40 | PetscInt m; | |
44 | 40 | Mat W; | |
45 | |||
46 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
40 | PetscFunctionBegin; |
47 |
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(FN_AllocateWorkMat(fn,A,&W)); |
48 |
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.
|
40 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
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.
|
40 | PetscCall(MatDenseGetArray(B,&Ba)); |
50 |
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(MatDenseGetArray(W,&Wa)); |
51 | /* compute B = sqrtm(A) */ | ||
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.
|
40 | PetscCall(MatGetSize(A,&m,NULL)); |
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.
|
40 | PetscCall(PetscBLASIntCast(m,&n)); |
54 | 40 | ld = n; | |
55 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(FNSqrtmSchur(fn,n,Ba,n,PETSC_FALSE)); |
56 | /* compute B = A\B */ | ||
57 |
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(PetscMalloc1(ld,&ipiv)); |
58 |
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.
|
40 | PetscCallBLAS("LAPACKgesv",LAPACKgesv_(&n,&n,Wa,&ld,ipiv,Ba,&ld,&info)); |
59 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
40 | SlepcCheckLapackInfo("gesv",info); |
60 |
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.
|
40 | PetscCall(PetscLogFlops(2.0*n*n*n/3.0+2.0*n*n*n)); |
61 |
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.
|
40 | PetscCall(PetscFree(ipiv)); |
62 |
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(MatDenseRestoreArray(W,&Wa)); |
63 |
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(MatDenseRestoreArray(B,&Ba)); |
64 |
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(FN_FreeWorkMat(fn,&W)); |
65 |
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.
|
8 | PetscFunctionReturn(PETSC_SUCCESS); |
66 | } | ||
67 | |||
68 | 40 | static PetscErrorCode FNEvaluateFunctionMatVec_Invsqrt_Schur(FN fn,Mat A,Vec v) | |
69 | { | ||
70 | 40 | PetscBLASInt n=0,ld,*ipiv,info,one=1; | |
71 | 40 | PetscScalar *Ba,*Wa; | |
72 | 40 | PetscInt m; | |
73 | 40 | Mat B,W; | |
74 | |||
75 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
40 | PetscFunctionBegin; |
76 |
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(FN_AllocateWorkMat(fn,A,&B)); |
77 |
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(FN_AllocateWorkMat(fn,A,&W)); |
78 |
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(MatDenseGetArray(B,&Ba)); |
79 |
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(MatDenseGetArray(W,&Wa)); |
80 | /* compute B_1 = sqrtm(A)*e_1 */ | ||
81 |
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(MatGetSize(A,&m,NULL)); |
82 |
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(PetscBLASIntCast(m,&n)); |
83 | 40 | ld = n; | |
84 |
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(FNSqrtmSchur(fn,n,Ba,n,PETSC_TRUE)); |
85 | /* compute B_1 = A\B_1 */ | ||
86 |
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(PetscMalloc1(ld,&ipiv)); |
87 |
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.
|
40 | PetscCallBLAS("LAPACKgesv",LAPACKgesv_(&n,&one,Wa,&ld,ipiv,Ba,&ld,&info)); |
88 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
40 | SlepcCheckLapackInfo("gesv",info); |
89 |
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.
|
40 | PetscCall(PetscFree(ipiv)); |
90 |
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(MatDenseRestoreArray(W,&Wa)); |
91 |
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(MatDenseRestoreArray(B,&Ba)); |
92 |
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(MatGetColumnVector(B,v,0)); |
93 |
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(FN_FreeWorkMat(fn,&W)); |
94 |
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(FN_FreeWorkMat(fn,&B)); |
95 |
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.
|
8 | PetscFunctionReturn(PETSC_SUCCESS); |
96 | } | ||
97 | |||
98 | 120 | static PetscErrorCode FNEvaluateFunctionMat_Invsqrt_DBP(FN fn,Mat A,Mat B) | |
99 | { | ||
100 | 120 | PetscBLASInt n=0; | |
101 | 120 | PetscScalar *T; | |
102 | 120 | PetscInt m; | |
103 | |||
104 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
120 | PetscFunctionBegin; |
105 |
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.
|
120 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
106 |
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.
|
120 | PetscCall(MatDenseGetArray(B,&T)); |
107 |
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.
|
120 | PetscCall(MatGetSize(A,&m,NULL)); |
108 |
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.
|
120 | PetscCall(PetscBLASIntCast(m,&n)); |
109 |
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.
|
120 | PetscCall(FNSqrtmDenmanBeavers(fn,n,T,n,PETSC_TRUE)); |
110 |
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.
|
120 | PetscCall(MatDenseRestoreArray(B,&T)); |
111 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
112 | } | ||
113 | |||
114 | 120 | static PetscErrorCode FNEvaluateFunctionMat_Invsqrt_NS(FN fn,Mat A,Mat B) | |
115 | { | ||
116 | 120 | PetscBLASInt n=0; | |
117 | 120 | PetscScalar *T; | |
118 | 120 | PetscInt m; | |
119 | |||
120 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
120 | PetscFunctionBegin; |
121 |
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.
|
120 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
122 |
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.
|
120 | PetscCall(MatDenseGetArray(B,&T)); |
123 |
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.
|
120 | PetscCall(MatGetSize(A,&m,NULL)); |
124 |
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.
|
120 | PetscCall(PetscBLASIntCast(m,&n)); |
125 |
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.
|
120 | PetscCall(FNSqrtmNewtonSchulz(fn,n,T,n,PETSC_TRUE)); |
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.
|
120 | PetscCall(MatDenseRestoreArray(B,&T)); |
127 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
128 | } | ||
129 | |||
130 | 120 | static PetscErrorCode FNEvaluateFunctionMat_Invsqrt_Sadeghi(FN fn,Mat A,Mat B) | |
131 | { | ||
132 | 120 | PetscBLASInt n=0,ld,*ipiv,info; | |
133 | 120 | PetscScalar *Ba,*Wa; | |
134 | 120 | PetscInt m; | |
135 | 120 | Mat W; | |
136 | |||
137 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
120 | PetscFunctionBegin; |
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.
|
120 | PetscCall(FN_AllocateWorkMat(fn,A,&W)); |
139 |
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.
|
120 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
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.
|
120 | PetscCall(MatDenseGetArray(B,&Ba)); |
141 |
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.
|
120 | PetscCall(MatDenseGetArray(W,&Wa)); |
142 | /* compute B = sqrtm(A) */ | ||
143 |
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.
|
120 | PetscCall(MatGetSize(A,&m,NULL)); |
144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
120 | PetscCall(PetscBLASIntCast(m,&n)); |
145 | 120 | ld = n; | |
146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
120 | PetscCall(FNSqrtmSadeghi(fn,n,Ba,n)); |
147 | /* compute B = A\B */ | ||
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.
|
120 | PetscCall(PetscMalloc1(ld,&ipiv)); |
149 |
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.
|
120 | PetscCallBLAS("LAPACKgesv",LAPACKgesv_(&n,&n,Wa,&ld,ipiv,Ba,&ld,&info)); |
150 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
120 | SlepcCheckLapackInfo("gesv",info); |
151 |
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.
|
120 | PetscCall(PetscLogFlops(2.0*n*n*n/3.0+2.0*n*n*n)); |
152 |
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.
|
120 | PetscCall(PetscFree(ipiv)); |
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.
|
120 | PetscCall(MatDenseRestoreArray(W,&Wa)); |
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.
|
120 | PetscCall(MatDenseRestoreArray(B,&Ba)); |
155 |
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.
|
120 | PetscCall(FN_FreeWorkMat(fn,&W)); |
156 |
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.
|
24 | PetscFunctionReturn(PETSC_SUCCESS); |
157 | } | ||
158 | |||
159 | #if defined(PETSC_HAVE_CUDA) | ||
160 | 24 | PetscErrorCode FNEvaluateFunctionMat_Invsqrt_NS_CUDA(FN fn,Mat A,Mat B) | |
161 | { | ||
162 | 24 | PetscBLASInt n=0; | |
163 | 24 | PetscScalar *Ba; | |
164 | 24 | PetscInt m; | |
165 | |||
166 | 24 | PetscFunctionBegin; | |
167 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
24 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
168 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDAGetArray(B,&Ba)); |
169 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatGetSize(A,&m,NULL)); |
170 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(PetscBLASIntCast(m,&n)); |
171 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(FNSqrtmNewtonSchulz_CUDA(fn,n,Ba,n,PETSC_TRUE)); |
172 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDARestoreArray(B,&Ba)); |
173 | PetscFunctionReturn(PETSC_SUCCESS); | ||
174 | } | ||
175 | |||
176 | #if defined(PETSC_HAVE_MAGMA) | ||
177 | #include <slepcmagma.h> | ||
178 | |||
179 | 24 | PetscErrorCode FNEvaluateFunctionMat_Invsqrt_DBP_CUDAm(FN fn,Mat A,Mat B) | |
180 | { | ||
181 | 24 | PetscBLASInt n=0; | |
182 | 24 | PetscScalar *T; | |
183 | 24 | PetscInt m; | |
184 | |||
185 | 24 | PetscFunctionBegin; | |
186 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
24 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
187 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDAGetArray(B,&T)); |
188 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatGetSize(A,&m,NULL)); |
189 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(PetscBLASIntCast(m,&n)); |
190 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(FNSqrtmDenmanBeavers_CUDAm(fn,n,T,n,PETSC_TRUE)); |
191 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDARestoreArray(B,&T)); |
192 | PetscFunctionReturn(PETSC_SUCCESS); | ||
193 | } | ||
194 | |||
195 | 24 | PetscErrorCode FNEvaluateFunctionMat_Invsqrt_Sadeghi_CUDAm(FN fn,Mat A,Mat B) | |
196 | { | ||
197 | 24 | PetscBLASInt n=0,ld,*ipiv; | |
198 | 24 | PetscScalar *Ba,*Wa; | |
199 | 24 | PetscInt m; | |
200 | 24 | Mat W; | |
201 | |||
202 | 24 | PetscFunctionBegin; | |
203 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(FN_AllocateWorkMat(fn,A,&W)); |
204 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
24 | if (A!=B) PetscCall(MatCopy(A,B,SAME_NONZERO_PATTERN)); |
205 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDAGetArray(B,&Ba)); |
206 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDAGetArray(W,&Wa)); |
207 | /* compute B = sqrtm(A) */ | ||
208 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatGetSize(A,&m,NULL)); |
209 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(PetscBLASIntCast(m,&n)); |
210 | 24 | ld = n; | |
211 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(FNSqrtmSadeghi_CUDAm(fn,n,Ba,n)); |
212 | /* compute B = A\B */ | ||
213 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(SlepcMagmaInit()); |
214 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(PetscMalloc1(ld,&ipiv)); |
215 |
2/6✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
24 | PetscCallMAGMA(magma_xgesv_gpu,n,n,Wa,ld,ipiv,Ba,ld); |
216 | 24 | PetscCall(PetscLogFlops(2.0*n*n*n/3.0+2.0*n*n*n)); | |
217 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
|
24 | PetscCall(PetscFree(ipiv)); |
218 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDARestoreArray(W,&Wa)); |
219 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(MatDenseCUDARestoreArray(B,&Ba)); |
220 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
24 | PetscCall(FN_FreeWorkMat(fn,&W)); |
221 | PetscFunctionReturn(PETSC_SUCCESS); | ||
222 | } | ||
223 | #endif /* PETSC_HAVE_MAGMA */ | ||
224 | #endif /* PETSC_HAVE_CUDA */ | ||
225 | |||
226 | 92 | static PetscErrorCode FNView_Invsqrt(FN fn,PetscViewer viewer) | |
227 | { | ||
228 | 92 | PetscBool isascii; | |
229 | 92 | char str[50]; | |
230 | 92 | const char *methodname[] = { | |
231 | "Schur method for inv(A)*sqrtm(A)", | ||
232 | "Denman-Beavers (product form)", | ||
233 | "Newton-Schulz iteration", | ||
234 | "Sadeghi iteration" | ||
235 | }; | ||
236 | 92 | const int nmeth=PETSC_STATIC_ARRAY_LENGTH(methodname); | |
237 | |||
238 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
92 | PetscFunctionBegin; |
239 |
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.
|
92 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
240 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
92 | if (isascii) { |
241 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
92 | if (fn->beta==(PetscScalar)1.0) { |
242 | ✗ | if (fn->alpha==(PetscScalar)1.0) PetscCall(PetscViewerASCIIPrintf(viewer," inverse square root: x^(-1/2)\n")); | |
243 | else { | ||
244 | ✗ | PetscCall(SlepcSNPrintfScalar(str,sizeof(str),fn->alpha,PETSC_TRUE)); | |
245 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer," inverse square root: (%s*x)^(-1/2)\n",str)); | |
246 | } | ||
247 | } else { | ||
248 |
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.
|
92 | PetscCall(SlepcSNPrintfScalar(str,sizeof(str),fn->beta,PETSC_TRUE)); |
249 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
92 | if (fn->alpha==(PetscScalar)1.0) PetscCall(PetscViewerASCIIPrintf(viewer," inverse square root: %s*x^(-1/2)\n",str)); |
250 | else { | ||
251 |
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.
|
92 | PetscCall(PetscViewerASCIIPrintf(viewer," inverse square root: %s",str)); |
252 |
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.
|
92 | PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE)); |
253 |
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.
|
92 | PetscCall(SlepcSNPrintfScalar(str,sizeof(str),fn->alpha,PETSC_TRUE)); |
254 |
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.
|
92 | PetscCall(PetscViewerASCIIPrintf(viewer,"*(%s*x)^(-1/2)\n",str)); |
255 |
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.
|
92 | PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE)); |
256 | } | ||
257 | } | ||
258 |
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.
|
92 | if (fn->method<nmeth) PetscCall(PetscViewerASCIIPrintf(viewer," computing matrix functions with: %s\n",methodname[fn->method])); |
259 | } | ||
260 |
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); |
261 | } | ||
262 | |||
263 | 92 | SLEPC_EXTERN PetscErrorCode FNCreate_Invsqrt(FN fn) | |
264 | { | ||
265 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
92 | PetscFunctionBegin; |
266 | 92 | fn->ops->evaluatefunction = FNEvaluateFunction_Invsqrt; | |
267 | 92 | fn->ops->evaluatederivative = FNEvaluateDerivative_Invsqrt; | |
268 | 92 | fn->ops->evaluatefunctionmat[0] = FNEvaluateFunctionMat_Invsqrt_Schur; | |
269 | 92 | fn->ops->evaluatefunctionmat[1] = FNEvaluateFunctionMat_Invsqrt_DBP; | |
270 | 92 | fn->ops->evaluatefunctionmat[2] = FNEvaluateFunctionMat_Invsqrt_NS; | |
271 | 92 | fn->ops->evaluatefunctionmat[3] = FNEvaluateFunctionMat_Invsqrt_Sadeghi; | |
272 | #if defined(PETSC_HAVE_CUDA) | ||
273 | 28 | fn->ops->evaluatefunctionmatcuda[2] = FNEvaluateFunctionMat_Invsqrt_NS_CUDA; | |
274 | #if defined(PETSC_HAVE_MAGMA) | ||
275 | 28 | fn->ops->evaluatefunctionmatcuda[1] = FNEvaluateFunctionMat_Invsqrt_DBP_CUDAm; | |
276 | 28 | fn->ops->evaluatefunctionmatcuda[3] = FNEvaluateFunctionMat_Invsqrt_Sadeghi_CUDAm; | |
277 | #endif /* PETSC_HAVE_MAGMA */ | ||
278 | #endif /* PETSC_HAVE_CUDA */ | ||
279 | 92 | fn->ops->evaluatefunctionmatvec[0] = FNEvaluateFunctionMatVec_Invsqrt_Schur; | |
280 | 92 | fn->ops->view = FNView_Invsqrt; | |
281 |
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.
|
92 | PetscFunctionReturn(PETSC_SUCCESS); |
282 | } | ||
283 |