| 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 | static char help[] = "Checking the definite property in quadratic symmetric eigenproblem.\n\n" | ||
| 12 | "The command line options are:\n" | ||
| 13 | " -n <n> ... dimension of the matrices.\n" | ||
| 14 | " -transform... whether to transform to a hyperbolic problem or not.\n" | ||
| 15 | " -nonhyperbolic... to test with a modified (definite) problem that is not hyperbolic.\n\n"; | ||
| 16 | |||
| 17 | #include <slepcpep.h> | ||
| 18 | |||
| 19 | /* | ||
| 20 | This example is based on spring.c, for fixed values mu=1,tau=10,kappa=5 | ||
| 21 | |||
| 22 | The transformations are based on the method proposed in [Niendorf and Voss, LAA 2010]. | ||
| 23 | */ | ||
| 24 | |||
| 25 | PetscErrorCode QEPDefiniteTransformGetMatrices(PEP,PetscBool,PetscReal,PetscReal,Mat[3]); | ||
| 26 | PetscErrorCode QEPDefiniteTransformMap(PetscBool,PetscReal,PetscReal,PetscInt,PetscScalar*,PetscBool); | ||
| 27 | PetscErrorCode QEPDefiniteCheckError(Mat*,PEP,PetscBool,PetscReal,PetscReal); | ||
| 28 | PetscErrorCode TransformMatricesMoebius(Mat[3],MatStructure,PetscReal,PetscReal,PetscReal,PetscReal,Mat[3]); | ||
| 29 | |||
| 30 | 20 | int main(int argc,char **argv) | |
| 31 | { | ||
| 32 | 20 | Mat M,C,K,*Op,A[3],At[3],B[3]; /* problem matrices */ | |
| 33 | 20 | PEP pep; /* polynomial eigenproblem solver context */ | |
| 34 | 20 | ST st; /* spectral transformation context */ | |
| 35 | 20 | KSP ksp; | |
| 36 | 20 | PC pc; | |
| 37 | 20 | PEPProblemType type; | |
| 38 | 20 | PetscBool terse,transform=PETSC_FALSE,nohyp=PETSC_FALSE; | |
| 39 | 20 | PetscInt n=100,Istart,Iend,i,def=0,hyp; | |
| 40 | 20 | PetscReal muu=1,tau=10,kappa=5,inta,intb; | |
| 41 | 20 | PetscReal alpha,beta,xi,mu,at[2]={0.0,0.0},c=.857,s; | |
| 42 | 20 | PetscScalar target,targett,ats[2]; | |
| 43 | |||
| 44 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBeginUser; |
| 45 |
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.
|
20 | PetscCall(SlepcInitialize(&argc,&argv,NULL,help)); |
| 46 | |||
| 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.
|
20 | PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); |
| 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.
|
20 | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nPEP example that checks definite property, n=%" PetscInt_FMT "\n\n",n)); |
| 49 | |||
| 50 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 51 | Compute the matrices that define the eigensystem, (k^2*M+k*C+K)x=0 | ||
| 52 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
| 53 | |||
| 54 | /* K is a tridiagonal */ | ||
| 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.
|
20 | PetscCall(MatCreate(PETSC_COMM_WORLD,&K)); |
| 56 |
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.
|
20 | PetscCall(MatSetSizes(K,PETSC_DECIDE,PETSC_DECIDE,n,n)); |
| 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.
|
20 | PetscCall(MatSetFromOptions(K)); |
| 58 | |||
| 59 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(MatGetOwnershipRange(K,&Istart,&Iend)); |
| 60 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2020 | for (i=Istart;i<Iend;i++) { |
| 61 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2000 | if (i>0) PetscCall(MatSetValue(K,i,i-1,-kappa,INSERT_VALUES)); |
| 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.
|
2000 | PetscCall(MatSetValue(K,i,i,kappa*3.0,INSERT_VALUES)); |
| 63 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2000 | if (i<n-1) PetscCall(MatSetValue(K,i,i+1,-kappa,INSERT_VALUES)); |
| 64 | } | ||
| 65 | |||
| 66 |
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.
|
20 | PetscCall(MatAssemblyBegin(K,MAT_FINAL_ASSEMBLY)); |
| 67 |
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.
|
20 | PetscCall(MatAssemblyEnd(K,MAT_FINAL_ASSEMBLY)); |
| 68 | |||
| 69 | /* C is a tridiagonal */ | ||
| 70 |
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.
|
20 | PetscCall(MatCreate(PETSC_COMM_WORLD,&C)); |
| 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.
|
20 | PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n)); |
| 72 |
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.
|
20 | PetscCall(MatSetFromOptions(C)); |
| 73 | |||
| 74 |
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.
|
20 | PetscCall(MatGetOwnershipRange(C,&Istart,&Iend)); |
| 75 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2020 | for (i=Istart;i<Iend;i++) { |
| 76 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2000 | if (i>0) PetscCall(MatSetValue(C,i,i-1,-tau,INSERT_VALUES)); |
| 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.
|
2000 | PetscCall(MatSetValue(C,i,i,tau*3.0,INSERT_VALUES)); |
| 78 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
2000 | if (i<n-1) PetscCall(MatSetValue(C,i,i+1,-tau,INSERT_VALUES)); |
| 79 | } | ||
| 80 | |||
| 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.
|
20 | PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); |
| 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.
|
20 | PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); |
| 83 | |||
| 84 | /* M is a diagonal matrix */ | ||
| 85 |
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.
|
20 | PetscCall(MatCreate(PETSC_COMM_WORLD,&M)); |
| 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.
|
20 | PetscCall(MatSetSizes(M,PETSC_DECIDE,PETSC_DECIDE,n,n)); |
| 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.
|
20 | PetscCall(MatSetFromOptions(M)); |
| 88 |
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.
|
20 | PetscCall(MatGetOwnershipRange(M,&Istart,&Iend)); |
| 89 |
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.
|
2020 | for (i=Istart;i<Iend;i++) PetscCall(MatSetValue(M,i,i,muu,INSERT_VALUES)); |
| 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.
|
20 | PetscCall(MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY)); |
| 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.
|
20 | PetscCall(MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY)); |
| 92 | |||
| 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.
|
20 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-nonhyperbolic",&nohyp,NULL)); |
| 94 | 20 | A[0] = K; A[1] = C; A[2] = M; | |
| 95 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | if (nohyp) { |
| 96 | 20 | s = c*.6; | |
| 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.
|
20 | PetscCall(TransformMatricesMoebius(A,UNKNOWN_NONZERO_PATTERN,c,s,-s,c,At)); |
| 98 |
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.
|
80 | for (i=0;i<3;i++) PetscCall(MatDestroy(&A[i])); |
| 99 | Op = At; | ||
| 100 | } else Op = A; | ||
| 101 | |||
| 102 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 103 | Create the eigensolver and solve the problem | ||
| 104 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
| 105 | |||
| 106 | /* | ||
| 107 | Create eigensolver context | ||
| 108 | */ | ||
| 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.
|
20 | PetscCall(PEPCreate(PETSC_COMM_WORLD,&pep)); |
| 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.
|
20 | PetscCall(PEPSetProblemType(pep,PEP_HERMITIAN)); |
| 111 |
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.
|
20 | PetscCall(PEPSetType(pep,PEPSTOAR)); |
| 112 | /* | ||
| 113 | Set operators and set problem type | ||
| 114 | */ | ||
| 115 |
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.
|
20 | PetscCall(PEPSetOperators(pep,3,Op)); |
| 116 | |||
| 117 | /* | ||
| 118 | Set shift-and-invert with Cholesky; select MUMPS if available | ||
| 119 | */ | ||
| 120 |
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.
|
20 | PetscCall(PEPGetST(pep,&st)); |
| 121 |
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.
|
20 | PetscCall(STGetKSP(st,&ksp)); |
| 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.
|
20 | PetscCall(KSPSetType(ksp,KSPPREONLY)); |
| 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.
|
20 | PetscCall(KSPGetPC(ksp,&pc)); |
| 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.
|
20 | PetscCall(PCSetType(pc,PCCHOLESKY)); |
| 125 | |||
| 126 | /* | ||
| 127 | Use MUMPS if available. | ||
| 128 | Note that in complex scalars we cannot use MUMPS for spectrum slicing, | ||
| 129 | because MatGetInertia() is not available in that case. | ||
| 130 | */ | ||
| 131 | #if defined(PETSC_HAVE_MUMPS) && !defined(PETSC_USE_COMPLEX) | ||
| 132 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
4 | PetscCall(PCFactorSetMatSolverType(pc,MATSOLVERMUMPS)); |
| 133 | /* | ||
| 134 | Add several MUMPS options (see ex43.c for a better way of setting them in program): | ||
| 135 | '-st_mat_mumps_icntl_13 1': turn off ScaLAPACK for matrix inertia | ||
| 136 | */ | ||
| 137 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
4 | PetscCall(PetscOptionsInsertString(NULL,"-st_mat_mumps_icntl_13 1 -st_mat_mumps_icntl_24 1 -st_mat_mumps_cntl_3 1e-12")); |
| 138 | #endif | ||
| 139 | |||
| 140 | /* | ||
| 141 | Set solver parameters at runtime | ||
| 142 | */ | ||
| 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.
|
20 | PetscCall(PEPSetFromOptions(pep)); |
| 144 | |||
| 145 |
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.
|
20 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-transform",&transform,NULL)); |
| 146 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20 | if (transform) { |
| 147 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 148 | Check if the problem is definite | ||
| 149 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
| 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.
|
10 | PetscCall(PEPCheckDefiniteQEP(pep,&xi,&mu,&def,&hyp)); |
| 151 |
1/3✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
10 | switch (def) { |
| 152 | 10 | case 1: | |
| 153 |
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.
|
10 | if (hyp==1) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Hyperbolic Problem xi=%g\n",(double)xi)); |
| 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.
|
10 | else PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Definite Problem xi=%g mu=%g\n",(double)xi,(double)mu)); |
| 155 | break; | ||
| 156 | ✗ | case -1: | |
| 157 | ✗ | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Not Definite Problem\n")); | |
| 158 | break; | ||
| 159 | ✗ | default: | |
| 160 | ✗ | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Cannot determine definiteness\n")); | |
| 161 | break; | ||
| 162 | } | ||
| 163 | |||
| 164 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 165 | Transform the QEP to have a definite inner product in the linearization | ||
| 166 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
| 167 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (def==1) { |
| 168 |
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.
|
10 | PetscCall(QEPDefiniteTransformGetMatrices(pep,hyp==1?PETSC_TRUE:PETSC_FALSE,xi,mu,B)); |
| 169 |
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.
|
10 | PetscCall(PEPSetOperators(pep,3,B)); |
| 170 |
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.
|
10 | PetscCall(PEPGetTarget(pep,&target)); |
| 171 | 10 | targett = target; | |
| 172 |
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.
|
10 | PetscCall(QEPDefiniteTransformMap(hyp==1?PETSC_TRUE:PETSC_FALSE,xi,mu,1,&targett,PETSC_FALSE)); |
| 173 |
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.
|
10 | PetscCall(PEPSetTarget(pep,targett)); |
| 174 |
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.
|
10 | PetscCall(PEPGetProblemType(pep,&type)); |
| 175 |
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.
|
10 | PetscCall(PEPSetProblemType(pep,PEP_HYPERBOLIC)); |
| 176 |
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.
|
10 | PetscCall(PEPSTOARGetLinearization(pep,&alpha,&beta)); |
| 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.
|
10 | PetscCall(PEPSTOARSetLinearization(pep,1.0,0.0)); |
| 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.
|
10 | PetscCall(PEPGetInterval(pep,&inta,&intb)); |
| 179 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (inta!=intb) { |
| 180 | ✗ | ats[0] = inta; ats[1] = intb; | |
| 181 | ✗ | PetscCall(QEPDefiniteTransformMap(hyp==1?PETSC_TRUE:PETSC_FALSE,xi,mu,2,ats,PETSC_FALSE)); | |
| 182 | ✗ | at[0] = PetscRealPart(ats[0]); at[1] = PetscRealPart(ats[1]); | |
| 183 | ✗ | if (at[0]<at[1]) PetscCall(PEPSetInterval(pep,at[0],at[1])); | |
| 184 | ✗ | else PetscCall(PEPSetInterval(pep,PETSC_MIN_REAL,at[1])); | |
| 185 | } | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 189 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 190 | Solve the eigensystem | ||
| 191 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
| 192 |
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.
|
20 | PetscCall(PEPSolve(pep)); |
| 193 | |||
| 194 | /* show detailed info unless -terse option is given by user */ | ||
| 195 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20 | if (def!=1) { |
| 196 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse)); |
| 197 |
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.
|
10 | if (terse) PetscCall(PEPErrorView(pep,PEP_ERROR_BACKWARD,NULL)); |
| 198 | else { | ||
| 199 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL)); |
| 200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PEPConvergedReasonView(pep,PETSC_VIEWER_STDOUT_WORLD)); |
| 201 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PEPErrorView(pep,PEP_ERROR_RELATIVE,PETSC_VIEWER_STDOUT_WORLD)); |
| 202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD)); |
| 203 | } | ||
| 204 | } else { | ||
| 205 | /* Map the solution */ | ||
| 206 |
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.
|
10 | PetscCall(PEPConvergedReasonView(pep,PETSC_VIEWER_STDOUT_WORLD)); |
| 207 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(QEPDefiniteCheckError(Op,pep,hyp==1?PETSC_TRUE:PETSC_FALSE,xi,mu)); |
| 208 |
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.
|
40 | for (i=0;i<3;i++) PetscCall(MatDestroy(B+i)); |
| 209 | } | ||
| 210 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
20 | if (at[0]>at[1]) { |
| 211 | ✗ | PetscCall(PEPSetInterval(pep,at[0],PETSC_MAX_REAL)); | |
| 212 | ✗ | PetscCall(PEPSolve(pep)); | |
| 213 | ✗ | PetscCall(PEPConvergedReasonView(pep,PETSC_VIEWER_STDOUT_WORLD)); | |
| 214 | /* Map the solution */ | ||
| 215 | ✗ | PetscCall(QEPDefiniteCheckError(Op,pep,hyp==1?PETSC_TRUE:PETSC_FALSE,xi,mu)); | |
| 216 | } | ||
| 217 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20 | if (def==1) { |
| 218 |
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.
|
10 | PetscCall(PEPSetTarget(pep,target)); |
| 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.
|
10 | PetscCall(PEPSetProblemType(pep,type)); |
| 220 |
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.
|
10 | PetscCall(PEPSTOARSetLinearization(pep,alpha,beta)); |
| 221 |
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.
|
10 | if (inta!=intb) PetscCall(PEPSetInterval(pep,inta,intb)); |
| 222 | } | ||
| 223 | |||
| 224 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
| 225 | Clean up | ||
| 226 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
| 227 |
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.
|
20 | PetscCall(PEPDestroy(&pep)); |
| 228 |
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.
|
80 | for (i=0;i<3;i++) PetscCall(MatDestroy(Op+i)); |
| 229 |
3/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
20 | PetscCall(SlepcFinalize()); |
| 230 | return 0; | ||
| 231 | } | ||
| 232 | |||
| 233 | /* ------------------------------------------------------------------- */ | ||
| 234 | /* | ||
| 235 | QEPDefiniteTransformMap_Initial - map a scalar value with a certain Moebius transform | ||
| 236 | |||
| 237 | a theta + b | ||
| 238 | lambda = -------------- | ||
| 239 | c theta + d | ||
| 240 | |||
| 241 | Input: | ||
| 242 | xi,mu: real values such that Q(xi)<0 and Q(mu)>0 | ||
| 243 | hyperbolic: if true the problem is assumed hyperbolic (mu is not used) | ||
| 244 | Input/Output: | ||
| 245 | val (array of length n) | ||
| 246 | if backtransform=true returns lambda from theta, else returns theta from lambda | ||
| 247 | */ | ||
| 248 | 110 | static PetscErrorCode QEPDefiniteTransformMap_Initial(PetscBool hyperbolic,PetscReal xi,PetscReal mu,PetscInt n,PetscScalar *val,PetscBool backtransform) | |
| 249 | { | ||
| 250 | 110 | PetscInt i; | |
| 251 | 110 | PetscReal a,b,c,d,s; | |
| 252 | |||
| 253 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
110 | PetscFunctionBegin; |
| 254 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
110 | if (hyperbolic) { a = 1.0; b = xi; c =0.0; d = 1.0; } |
| 255 | 110 | else { a = mu; b = mu*xi-1; c = 1.0; d = xi+mu; } | |
| 256 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
110 | if (!backtransform) { s = a; a = -d; d = -s; } |
| 257 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
220 | for (i=0;i<n;i++) { |
| 258 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
110 | if (PetscRealPart(val[i]) >= PETSC_MAX_REAL || PetscRealPart(val[i]) <= PETSC_MIN_REAL) val[i] = a/c; |
| 259 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
110 | else if (val[i] == -d/c) val[i] = PETSC_MAX_REAL; |
| 260 | 110 | else val[i] = (a*val[i]+b)/(c*val[i]+d); | |
| 261 | } | ||
| 262 |
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.
|
110 | PetscFunctionReturn(PETSC_SUCCESS); |
| 263 | } | ||
| 264 | |||
| 265 | /* ------------------------------------------------------------------- */ | ||
| 266 | /* | ||
| 267 | QEPDefiniteTransformMap - perform the mapping if the problem is hyperbolic, otherwise | ||
| 268 | modify the value of xi in advance | ||
| 269 | */ | ||
| 270 | 50 | PetscErrorCode QEPDefiniteTransformMap(PetscBool hyperbolic,PetscReal xi,PetscReal mu,PetscInt n,PetscScalar *val,PetscBool backtransform) | |
| 271 | { | ||
| 272 | 50 | PetscReal xit; | |
| 273 | 50 | PetscScalar alpha; | |
| 274 | |||
| 275 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
| 276 | 50 | xit = xi; | |
| 277 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
50 | if (!hyperbolic) { |
| 278 | 50 | alpha = xi; | |
| 279 |
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.
|
50 | PetscCall(QEPDefiniteTransformMap_Initial(PETSC_FALSE,0.0,mu,1,&alpha,PETSC_FALSE)); |
| 280 | 50 | xit = PetscRealPart(alpha); | |
| 281 | } | ||
| 282 |
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.
|
50 | PetscCall(QEPDefiniteTransformMap_Initial(hyperbolic,xit,mu,n,val,backtransform)); |
| 283 |
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.
|
10 | PetscFunctionReturn(PETSC_SUCCESS); |
| 284 | } | ||
| 285 | |||
| 286 | /* ------------------------------------------------------------------- */ | ||
| 287 | /* | ||
| 288 | TransformMatricesMoebius - transform the coefficient matrices of a QEP | ||
| 289 | |||
| 290 | Input: | ||
| 291 | A: coefficient matrices of the original QEP | ||
| 292 | a,b,c,d: parameters of the Moebius transform | ||
| 293 | str: structure flag for MatAXPY operations | ||
| 294 | Output: | ||
| 295 | B: transformed matrices | ||
| 296 | */ | ||
| 297 | 30 | PetscErrorCode TransformMatricesMoebius(Mat A[3],MatStructure str,PetscReal a,PetscReal b,PetscReal c,PetscReal d,Mat B[3]) | |
| 298 | { | ||
| 299 | 30 | PetscInt i,k; | |
| 300 | 30 | PetscReal cf[9]; | |
| 301 | |||
| 302 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 303 |
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.
|
120 | for (i=0;i<3;i++) PetscCall(MatDuplicate(A[2],MAT_COPY_VALUES,&B[i])); |
| 304 | /* Ct = b*b*A+b*d*B+d*d*C */ | ||
| 305 | 30 | cf[0] = d*d; cf[1] = b*d; cf[2] = b*b; | |
| 306 | /* Bt = 2*a*b*A+(b*c+a*d)*B+2*c*d*C*/ | ||
| 307 | 30 | cf[3] = 2*c*d; cf[4] = b*c+a*d; cf[5] = 2*a*b; | |
| 308 | /* At = a*a*A+a*c*B+c*c*C */ | ||
| 309 | 30 | cf[6] = c*c; cf[7] = a*c; cf[8] = a*a; | |
| 310 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
120 | for (k=0;k<3;k++) { |
| 311 |
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.
|
90 | PetscCall(MatScale(B[k],cf[k*3+2])); |
| 312 |
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.
|
270 | for (i=0;i<2;i++) PetscCall(MatAXPY(B[k],cf[3*k+i],A[i],str)); |
| 313 | } | ||
| 314 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 315 | } | ||
| 316 | |||
| 317 | /* ------------------------------------------------------------------- */ | ||
| 318 | /* | ||
| 319 | QEPDefiniteTransformGetMatrices - given a PEP of degree 2, transform the three | ||
| 320 | matrices with TransformMatricesMoebius | ||
| 321 | |||
| 322 | Input: | ||
| 323 | pep: polynomial eigenproblem to be transformed, with Q(.) being the quadratic polynomial | ||
| 324 | xi,mu: real values such that Q(xi)<0 and Q(mu)>0 | ||
| 325 | hyperbolic: if true the problem is assumed hyperbolic (mu is not used) | ||
| 326 | Output: | ||
| 327 | T: coefficient matrices of the transformed polynomial | ||
| 328 | */ | ||
| 329 | 10 | PetscErrorCode QEPDefiniteTransformGetMatrices(PEP pep,PetscBool hyperbolic,PetscReal xi,PetscReal mu,Mat T[3]) | |
| 330 | { | ||
| 331 | 10 | MatStructure str; | |
| 332 | 10 | ST st; | |
| 333 | 10 | PetscInt i; | |
| 334 | 10 | PetscReal a,b,c,d; | |
| 335 | 10 | PetscScalar xit; | |
| 336 | 10 | Mat A[3]; | |
| 337 | |||
| 338 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 339 |
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.
|
40 | for (i=2;i>=0;i--) PetscCall(PEPGetOperators(pep,i,&A[i])); |
| 340 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (hyperbolic) { a = 1.0; b = xi; c =0.0; d = 1.0; } |
| 341 | else { | ||
| 342 | 10 | xit = xi; | |
| 343 |
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.
|
10 | PetscCall(QEPDefiniteTransformMap_Initial(PETSC_FALSE,0.0,mu,1,&xit,PETSC_FALSE)); |
| 344 | 10 | a = mu; b = mu*PetscRealPart(xit)-1.0; c = 1.0; d = PetscRealPart(xit)+mu; | |
| 345 | } | ||
| 346 |
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.
|
10 | PetscCall(PEPGetST(pep,&st)); |
| 347 |
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.
|
10 | PetscCall(STGetMatStructure(st,&str)); |
| 348 |
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.
|
10 | PetscCall(TransformMatricesMoebius(A,str,a,b,c,d,T)); |
| 349 |
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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 350 | } | ||
| 351 | |||
| 352 | /* ------------------------------------------------------------------- */ | ||
| 353 | /* | ||
| 354 | Auxiliary function to compute the residual norm of an eigenpair of a QEP defined | ||
| 355 | by coefficient matrices A | ||
| 356 | */ | ||
| 357 | 40 | static PetscErrorCode PEPResidualNorm(Mat *A,PetscScalar kr,PetscScalar ki,Vec xr,Vec xi,Vec *z,PetscReal *norm) | |
| 358 | { | ||
| 359 | 40 | PetscInt i,nmat=3; | |
| 360 | 40 | PetscScalar vals[3]; | |
| 361 | 40 | Vec u,w; | |
| 362 | #if !defined(PETSC_USE_COMPLEX) | ||
| 363 | 15 | Vec ui,wi; | |
| 364 | 15 | PetscReal ni; | |
| 365 | 15 | PetscBool imag; | |
| 366 | 15 | PetscScalar ivals[3]; | |
| 367 | #endif | ||
| 368 | |||
| 369 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
40 | PetscFunctionBegin; |
| 370 | 40 | u = z[0]; w = z[1]; | |
| 371 |
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(VecSet(u,0.0)); |
| 372 | #if !defined(PETSC_USE_COMPLEX) | ||
| 373 | 15 | ui = z[2]; wi = z[3]; | |
| 374 | #endif | ||
| 375 | 40 | vals[0] = 1.0; | |
| 376 | 40 | vals[1] = kr; | |
| 377 | 40 | vals[2] = kr*kr-ki*ki; | |
| 378 | #if !defined(PETSC_USE_COMPLEX) | ||
| 379 | 15 | ivals[0] = 0.0; | |
| 380 | 15 | ivals[1] = ki; | |
| 381 | 15 | ivals[2] = 2.0*kr*ki; | |
| 382 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15 | if (ki == 0 || PetscAbsScalar(ki) < PetscAbsScalar(kr*PETSC_MACHINE_EPSILON)) |
| 383 | imag = PETSC_FALSE; | ||
| 384 | else { | ||
| 385 | ✗ | imag = PETSC_TRUE; | |
| 386 | ✗ | PetscCall(VecSet(ui,0.0)); | |
| 387 | } | ||
| 388 | #endif | ||
| 389 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
160 | for (i=0;i<nmat;i++) { |
| 390 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
120 | if (vals[i]!=0.0) { |
| 391 |
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(MatMult(A[i],xr,w)); |
| 392 |
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(VecAXPY(u,vals[i],w)); |
| 393 | } | ||
| 394 | #if !defined(PETSC_USE_COMPLEX) | ||
| 395 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
45 | if (imag) { |
| 396 | ✗ | if (ivals[i]!=0 || vals[i]!=0) { | |
| 397 | ✗ | PetscCall(MatMult(A[i],xi,wi)); | |
| 398 | ✗ | if (vals[i]==0) PetscCall(MatMult(A[i],xr,w)); | |
| 399 | } | ||
| 400 | ✗ | if (ivals[i]!=0) { | |
| 401 | ✗ | PetscCall(VecAXPY(u,-ivals[i],wi)); | |
| 402 | ✗ | PetscCall(VecAXPY(ui,ivals[i],w)); | |
| 403 | } | ||
| 404 |
0/8✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
45 | if (vals[i]!=0) PetscCall(VecAXPY(ui,vals[i],wi)); |
| 405 | } | ||
| 406 | #endif | ||
| 407 | } | ||
| 408 |
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(VecNorm(u,NORM_2,norm)); |
| 409 | #if !defined(PETSC_USE_COMPLEX) | ||
| 410 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
15 | if (imag) { |
| 411 | ✗ | PetscCall(VecNorm(ui,NORM_2,&ni)); | |
| 412 | ✗ | *norm = SlepcAbsEigenvalue(*norm,ni); | |
| 413 | } | ||
| 414 | #endif | ||
| 415 |
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); |
| 416 | } | ||
| 417 | |||
| 418 | /* ------------------------------------------------------------------- */ | ||
| 419 | /* | ||
| 420 | QEPDefiniteCheckError - check and print the residual norm of a transformed PEP | ||
| 421 | |||
| 422 | Input: | ||
| 423 | A: coefficient matrices of the original problem | ||
| 424 | pep: solver containing the computed solution of the transformed problem | ||
| 425 | xi,mu,hyperbolic: parameters used in transformation | ||
| 426 | */ | ||
| 427 | 10 | PetscErrorCode QEPDefiniteCheckError(Mat *A,PEP pep,PetscBool hyperbolic,PetscReal xi,PetscReal mu) | |
| 428 | { | ||
| 429 | 10 | PetscScalar er,ei; | |
| 430 | 10 | PetscReal re,im,error; | |
| 431 | 10 | Vec vr,vi,w[4]; | |
| 432 | 10 | PetscInt i,nconv; | |
| 433 | 10 | BV bv; | |
| 434 | 10 | char ex[30],sep[]=" ---------------------- --------------------\n"; | |
| 435 | |||
| 436 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 437 |
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.
|
10 | PetscCall(PetscSNPrintf(ex,sizeof(ex),"||P(k)x||/||kx||")); |
| 438 |
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.
|
10 | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"%s k %s\n%s",sep,ex,sep)); |
| 439 |
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.
|
10 | PetscCall(PEPGetConverged(pep,&nconv)); |
| 440 |
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.
|
10 | PetscCall(PEPGetBV(pep,&bv)); |
| 441 |
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.
|
10 | PetscCall(BVCreateVec(bv,w)); |
| 442 |
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.
|
10 | PetscCall(VecDuplicate(w[0],&vr)); |
| 443 |
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.
|
10 | PetscCall(VecDuplicate(w[0],&vi)); |
| 444 |
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.
|
40 | for (i=1;i<4;i++) PetscCall(VecDuplicate(w[0],w+i)); |
| 445 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50 | for (i=0;i<nconv;i++) { |
| 446 |
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(PEPGetEigenpair(pep,i,&er,&ei,vr,vi)); |
| 447 |
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(QEPDefiniteTransformMap(hyperbolic,xi,mu,1,&er,PETSC_TRUE)); |
| 448 |
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(PEPResidualNorm(A,er,0.0,vr,vi,w,&error)); |
| 449 | 40 | error /= SlepcAbsEigenvalue(er,0.0); | |
| 450 | #if defined(PETSC_USE_COMPLEX) | ||
| 451 | 25 | re = PetscRealPart(er); | |
| 452 | 25 | im = PetscImaginaryPart(ei); | |
| 453 | #else | ||
| 454 | 15 | re = er; | |
| 455 | 15 | im = ei; | |
| 456 | #endif | ||
| 457 |
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.
|
40 | if (im!=0.0) PetscCall(PetscPrintf(PETSC_COMM_WORLD," % 9f%+9fi %12g\n",(double)re,(double)im,(double)error)); |
| 458 |
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 | else PetscCall(PetscPrintf(PETSC_COMM_WORLD," % 12f %12g\n",(double)re,(double)error)); |
| 459 | } | ||
| 460 |
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.
|
10 | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"%s",sep)); |
| 461 |
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.
|
50 | for (i=0;i<4;i++) PetscCall(VecDestroy(w+i)); |
| 462 |
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.
|
10 | PetscCall(VecDestroy(&vi)); |
| 463 |
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.
|
10 | PetscCall(VecDestroy(&vr)); |
| 464 |
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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 465 | } | ||
| 466 | |||
| 467 | /*TEST | ||
| 468 | |||
| 469 | testset: | ||
| 470 | requires: !single | ||
| 471 | args: -pep_nev 3 -nonhyperbolic -pep_target 2 | ||
| 472 | output_file: output/ex40_1.out | ||
| 473 | filter: grep -v "Definite" | sed -e "s/iterations [0-9]\([0-9]*\)/iterations xx/g" | sed -e "s/[0-9]\.[0-9]*e[+-]\([0-9]*\)/removed/g" | ||
| 474 | test: | ||
| 475 | suffix: 1 | ||
| 476 | requires: !complex | ||
| 477 | test: | ||
| 478 | suffix: 1_complex | ||
| 479 | requires: complex !mumps | ||
| 480 | test: | ||
| 481 | suffix: 1_transform | ||
| 482 | requires: !complex | ||
| 483 | args: -transform | ||
| 484 | test: | ||
| 485 | suffix: 1_transform_complex | ||
| 486 | requires: complex !mumps | ||
| 487 | args: -transform | ||
| 488 | |||
| 489 | TEST*/ | ||
| 490 |