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[] = "Compute rightmost eigenvalues with Lyapunov inverse iteration.\n\n" | ||
12 | "Loads matrix from a file or builds the same problem as ex36.c (with fixed parameters).\n\n" | ||
13 | "The command line options are:\n" | ||
14 | " -file <filename>, where <filename> = matrix file in PETSc binary form.\n" | ||
15 | " -shift <sigma>, shift to make the matrix stable.\n" | ||
16 | " -n <n>, block dimension of the 2x2 block matrix (if matrix is generated).\n\n"; | ||
17 | |||
18 | #include <slepceps.h> | ||
19 | |||
20 | 50 | int main(int argc,char **argv) | |
21 | { | ||
22 | 50 | Mat A; /* operator matrix */ | |
23 | 50 | EPS eps; /* eigenproblem solver context */ | |
24 | 50 | EPSType type; | |
25 | 50 | PetscScalar alpha,beta,tau1,tau2,delta1,delta2,L,h,sigma=0.0; | |
26 | 50 | PetscInt n=30,i,Istart,Iend,nev; | |
27 | 50 | char filename[PETSC_MAX_PATH_LEN]; | |
28 | 50 | PetscViewer viewer; | |
29 | 50 | PetscBool flg,terse; | |
30 | |||
31 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBeginUser; |
32 |
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(SlepcInitialize(&argc,&argv,NULL,help)); |
33 | |||
34 |
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(PetscOptionsGetString(NULL,NULL,"-file",filename,sizeof(filename),&flg)); |
35 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
|
50 | if (flg) { |
36 | |||
37 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
38 | Load the matrix from file | ||
39 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
40 |
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.
|
10 | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nEigenproblem stored in file.\n\n")); |
41 | #if defined(PETSC_USE_COMPLEX) | ||
42 | ✗ | PetscCall(PetscPrintf(PETSC_COMM_WORLD," Reading COMPLEX matrix from a binary file...\n")); | |
43 | #else | ||
44 |
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.
|
10 | PetscCall(PetscPrintf(PETSC_COMM_WORLD," Reading REAL matrix from a binary file...\n")); |
45 | #endif | ||
46 |
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.
|
10 | PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer)); |
47 |
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.
|
10 | PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); |
48 |
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.
|
10 | PetscCall(MatSetFromOptions(A)); |
49 |
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.
|
10 | PetscCall(MatLoad(A,viewer)); |
50 |
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.
|
10 | PetscCall(PetscViewerDestroy(&viewer)); |
51 | |||
52 | } else { | ||
53 | |||
54 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
55 | Generate Brusselator matrix | ||
56 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
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(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); |
58 |
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(PetscPrintf(PETSC_COMM_WORLD,"\nBrusselator wave model, n=%" PetscInt_FMT "\n\n",n)); |
59 | |||
60 | 40 | alpha = 2.0; | |
61 | 40 | beta = 5.45; | |
62 | 40 | delta1 = 0.008; | |
63 | 40 | delta2 = 0.004; | |
64 | 40 | L = 0.51302; | |
65 | |||
66 | 40 | h = 1.0 / (PetscReal)(n+1); | |
67 | 40 | tau1 = delta1 / ((h*L)*(h*L)); | |
68 | 40 | tau2 = delta2 / ((h*L)*(h*L)); | |
69 | |||
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.
|
40 | PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); |
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.
|
40 | PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,2*n,2*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.
|
40 | PetscCall(MatSetFromOptions(A)); |
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.
|
40 | PetscCall(MatGetOwnershipRange(A,&Istart,&Iend)); |
75 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2440 | for (i=Istart;i<Iend;i++) { |
76 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2400 | if (i<n) { /* upper blocks */ |
77 |
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.
|
1200 | if (i>0) PetscCall(MatSetValue(A,i,i-1,tau1,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.
|
1200 | if (i<n-1) PetscCall(MatSetValue(A,i,i+1,tau1,INSERT_VALUES)); |
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.
|
1200 | PetscCall(MatSetValue(A,i,i,-2.0*tau1+beta-1.0,INSERT_VALUES)); |
80 |
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.
|
1200 | PetscCall(MatSetValue(A,i,i+n,alpha*alpha,INSERT_VALUES)); |
81 | } else { /* lower blocks */ | ||
82 |
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.
|
1200 | if (i>n) PetscCall(MatSetValue(A,i,i-1,tau2,INSERT_VALUES)); |
83 |
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.
|
1200 | if (i<2*n-1) PetscCall(MatSetValue(A,i,i+1,tau2,INSERT_VALUES)); |
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.
|
1200 | PetscCall(MatSetValue(A,i,i,-2.0*tau2-alpha*alpha,INSERT_VALUES)); |
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.
|
2400 | PetscCall(MatSetValue(A,i,i-n,-beta,INSERT_VALUES)); |
86 | } | ||
87 | } | ||
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.
|
40 | PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); |
89 |
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(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); |
90 | } | ||
91 | |||
92 | /* Shift the matrix to make it stable, A-sigma*I */ | ||
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.
|
50 | PetscCall(PetscOptionsGetScalar(NULL,NULL,"-shift",&sigma,NULL)); |
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.
|
50 | PetscCall(MatShift(A,-sigma)); |
95 | |||
96 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
97 | Create the eigensolver and set various options | ||
98 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
99 | |||
100 |
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(EPSCreate(PETSC_COMM_WORLD,&eps)); |
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.
|
50 | PetscCall(EPSSetOperators(eps,A,NULL)); |
102 |
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(EPSSetProblemType(eps,EPS_NHEP)); |
103 |
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(EPSSetWhichEigenpairs(eps,EPS_LARGEST_REAL)); |
104 |
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(EPSSetFromOptions(eps)); |
105 | |||
106 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
107 | Solve the eigensystem | ||
108 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
109 | |||
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.
|
50 | PetscCall(EPSSolve(eps)); |
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.
|
50 | PetscCall(EPSGetType(eps,&type)); |
112 |
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(PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type)); |
113 |
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(EPSGetDimensions(eps,&nev,NULL,NULL)); |
114 |
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(PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %" PetscInt_FMT "\n",nev)); |
115 | |||
116 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
117 | Display solution and clean up | ||
118 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
119 | |||
120 | /* show detailed info unless -terse option is given by user */ | ||
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.
|
50 | PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse)); |
122 |
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.
|
50 | if (terse) PetscCall(EPSErrorView(eps,EPS_ERROR_RELATIVE,NULL)); |
123 | else { | ||
124 | ✗ | PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL)); | |
125 | ✗ | PetscCall(EPSConvergedReasonView(eps,PETSC_VIEWER_STDOUT_WORLD)); | |
126 | ✗ | PetscCall(EPSErrorView(eps,EPS_ERROR_RELATIVE,PETSC_VIEWER_STDOUT_WORLD)); | |
127 | ✗ | PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD)); | |
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.
|
50 | PetscCall(EPSDestroy(&eps)); |
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.
|
50 | PetscCall(MatDestroy(&A)); |
131 |
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.
|
50 | PetscCall(SlepcFinalize()); |
132 | return 0; | ||
133 | } | ||
134 | |||
135 | /*TEST | ||
136 | |||
137 | testset: | ||
138 | args: -eps_nev 6 -shift 0.1 -eps_type {{krylovschur lyapii}} -eps_tol 1e-7 -terse | ||
139 | requires: double | ||
140 | filter: grep -v method | sed -e "s/-0.09981-2.13938i, -0.09981+2.13938i/-0.09981+2.13938i, -0.09981-2.13938i/" | sed -e "s/-0.77192-2.52712i, -0.77192+2.52712i/-0.77192+2.52712i, -0.77192-2.52712i/" | sed -e "s/-1.88445-3.02666i, -1.88445+3.02666i/-1.88445+3.02666i, -1.88445-3.02666i/" | ||
141 | output_file: output/ex44_1.out | ||
142 | test: | ||
143 | suffix: 1 | ||
144 | test: | ||
145 | suffix: 2 | ||
146 | args: -eps_lyapii_ranks 8,20 -options_left no | ||
147 | |||
148 | test: | ||
149 | suffix: 3 | ||
150 | args: -file ${SLEPC_DIR}/share/slepc/datafiles/matrices/rdb200.petsc -shift 35 -eps_type {{krylovschur lyapii}} -terse | ||
151 | requires: double !complex !defined(PETSC_USE_64BIT_INDICES) | ||
152 | filter: grep -v method | ||
153 | |||
154 | TEST*/ | ||
155 |