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[] = "Simple nonlinear eigenproblem using the NLEIGS solver.\n\n" | ||
12 | "The command line options are:\n" | ||
13 | " -n <n>, where <n> = matrix dimension.\n" | ||
14 | " -split <0/1>, to select the split form in the problem definition (enabled by default)\n"; | ||
15 | |||
16 | /* | ||
17 | Solve T(lambda)x=0 using NLEIGS solver | ||
18 | with T(lambda) = -D+sqrt(lambda)*I | ||
19 | where D is the Laplacian operator in 1 dimension | ||
20 | and with the interpolation interval [.01,16] | ||
21 | */ | ||
22 | |||
23 | #include <slepcnep.h> | ||
24 | |||
25 | /* | ||
26 | User-defined routines | ||
27 | */ | ||
28 | PetscErrorCode FormFunction(NEP,PetscScalar,Mat,Mat,void*); | ||
29 | PetscErrorCode FormJacobian(NEP,PetscScalar,Mat,void*); | ||
30 | PetscErrorCode ComputeSingularities(NEP,PetscInt*,PetscScalar*,void*); | ||
31 | |||
32 | 129 | int main(int argc,char **argv) | |
33 | { | ||
34 | 129 | NEP nep; /* nonlinear eigensolver context */ | |
35 | 129 | Mat F,J,A[2]; | |
36 | 129 | NEPType type; | |
37 | 129 | PetscInt n=100,nev,Istart,Iend,i; | |
38 | 129 | PetscBool terse,split=PETSC_TRUE; | |
39 | 129 | RG rg; | |
40 | 129 | FN f[2]; | |
41 | 129 | PetscScalar coeffs; | |
42 | |||
43 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
129 | PetscFunctionBeginUser; |
44 |
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.
|
129 | PetscCall(SlepcInitialize(&argc,&argv,NULL,help)); |
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.
|
129 | PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); |
46 |
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.
|
129 | PetscCall(PetscOptionsGetBool(NULL,NULL,"-split",&split,NULL)); |
47 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
198 | PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nSquare root eigenproblem, n=%" PetscInt_FMT "%s\n\n",n,split?" (in split form)":"")); |
48 | |||
49 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
50 | Create nonlinear eigensolver context | ||
51 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
52 | |||
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.
|
129 | PetscCall(NEPCreate(PETSC_COMM_WORLD,&nep)); |
54 | |||
55 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
56 | Select the NLEIGS solver and set required options for it | ||
57 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
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.
|
129 | PetscCall(NEPSetType(nep,NEPNLEIGS)); |
60 |
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.
|
129 | PetscCall(NEPNLEIGSSetSingularitiesFunction(nep,ComputeSingularities,NULL)); |
61 |
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.
|
129 | PetscCall(NEPGetRG(nep,&rg)); |
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.
|
129 | PetscCall(RGSetType(rg,RGINTERVAL)); |
63 | #if defined(PETSC_USE_COMPLEX) | ||
64 |
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.
|
100 | PetscCall(RGIntervalSetEndpoints(rg,0.01,16.0,-0.001,0.001)); |
65 | #else | ||
66 |
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.
|
29 | PetscCall(RGIntervalSetEndpoints(rg,0.01,16.0,0,0)); |
67 | #endif | ||
68 |
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.
|
129 | PetscCall(NEPSetTarget(nep,1.1)); |
69 | |||
70 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
71 | Define the nonlinear problem | ||
72 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
73 | |||
74 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
129 | if (split) { |
75 | /* | ||
76 | Create matrices for the split form | ||
77 | */ | ||
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.
|
60 | PetscCall(MatCreate(PETSC_COMM_WORLD,&A[0])); |
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.
|
60 | PetscCall(MatSetSizes(A[0],PETSC_DECIDE,PETSC_DECIDE,n,n)); |
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.
|
60 | PetscCall(MatSetFromOptions(A[0])); |
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.
|
60 | PetscCall(MatGetOwnershipRange(A[0],&Istart,&Iend)); |
82 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3760 | for (i=Istart;i<Iend;i++) { |
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.
|
3700 | if (i>0) PetscCall(MatSetValue(A[0],i,i-1,1.0,INSERT_VALUES)); |
84 |
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.
|
3700 | if (i<n-1) PetscCall(MatSetValue(A[0],i,i+1,1.0,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.
|
3700 | PetscCall(MatSetValue(A[0],i,i,-2.0,INSERT_VALUES)); |
86 | } | ||
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.
|
60 | PetscCall(MatAssemblyBegin(A[0],MAT_FINAL_ASSEMBLY)); |
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.
|
60 | PetscCall(MatAssemblyEnd(A[0],MAT_FINAL_ASSEMBLY)); |
89 | |||
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.
|
60 | PetscCall(MatCreateConstantDiagonal(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,n,n,1.0,&A[1])); |
91 | |||
92 | /* | ||
93 | Define functions for the split form | ||
94 | */ | ||
95 |
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.
|
60 | PetscCall(FNCreate(PETSC_COMM_WORLD,&f[0])); |
96 |
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.
|
60 | PetscCall(FNSetType(f[0],FNRATIONAL)); |
97 | 60 | coeffs = 1.0; | |
98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
60 | PetscCall(FNRationalSetNumerator(f[0],1,&coeffs)); |
99 |
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.
|
60 | PetscCall(FNCreate(PETSC_COMM_WORLD,&f[1])); |
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.
|
60 | PetscCall(FNSetType(f[1],FNSQRT)); |
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.
|
60 | PetscCall(NEPSetSplitOperator(nep,2,A,f,SUBSET_NONZERO_PATTERN)); |
102 | |||
103 | } else { | ||
104 | /* | ||
105 | Callback form: create matrix and set Function evaluation routine | ||
106 | */ | ||
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.
|
69 | PetscCall(MatCreate(PETSC_COMM_WORLD,&F)); |
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.
|
69 | PetscCall(MatSetSizes(F,PETSC_DECIDE,PETSC_DECIDE,n,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.
|
69 | PetscCall(MatSetFromOptions(F)); |
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.
|
69 | PetscCall(MatSeqAIJSetPreallocation(F,3,NULL)); |
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.
|
69 | PetscCall(MatMPIAIJSetPreallocation(F,3,NULL,1,NULL)); |
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.
|
69 | PetscCall(NEPSetFunction(nep,F,F,FormFunction,NULL)); |
113 | |||
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.
|
69 | PetscCall(MatCreate(PETSC_COMM_WORLD,&J)); |
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.
|
69 | PetscCall(MatSetSizes(J,PETSC_DECIDE,PETSC_DECIDE,n,n)); |
116 |
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.
|
69 | PetscCall(MatSetFromOptions(J)); |
117 |
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.
|
69 | PetscCall(MatSeqAIJSetPreallocation(J,1,NULL)); |
118 |
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.
|
69 | PetscCall(MatMPIAIJSetPreallocation(J,1,NULL,1,NULL)); |
119 |
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.
|
69 | PetscCall(NEPSetJacobian(nep,J,FormJacobian,NULL)); |
120 | } | ||
121 | |||
122 | /* | ||
123 | Set solver parameters at runtime | ||
124 | */ | ||
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.
|
129 | PetscCall(NEPSetFromOptions(nep)); |
126 | |||
127 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
128 | Solve the eigensystem | ||
129 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
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.
|
129 | PetscCall(NEPSolve(nep)); |
131 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
129 | PetscCall(NEPGetType(nep,&type)); |
132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
129 | PetscCall(PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n",type)); |
133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
129 | PetscCall(NEPGetDimensions(nep,&nev,NULL,NULL)); |
134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
129 | PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %" PetscInt_FMT "\n",nev)); |
135 | |||
136 | /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
137 | Display solution and clean up | ||
138 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ | ||
139 | |||
140 | /* show detailed info unless -terse option is given by user */ | ||
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.
|
129 | PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse)); |
142 |
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.
|
129 | if (terse) PetscCall(NEPErrorView(nep,NEP_ERROR_BACKWARD,NULL)); |
143 | else { | ||
144 | ✗ | PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL)); | |
145 | ✗ | PetscCall(NEPConvergedReasonView(nep,PETSC_VIEWER_STDOUT_WORLD)); | |
146 | ✗ | PetscCall(NEPErrorView(nep,NEP_ERROR_BACKWARD,PETSC_VIEWER_STDOUT_WORLD)); | |
147 | ✗ | PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD)); | |
148 | } | ||
149 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
129 | PetscCall(NEPDestroy(&nep)); |
150 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
129 | if (split) { |
151 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
60 | PetscCall(MatDestroy(&A[0])); |
152 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
60 | PetscCall(MatDestroy(&A[1])); |
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.
|
60 | PetscCall(FNDestroy(&f[0])); |
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.
|
60 | PetscCall(FNDestroy(&f[1])); |
155 | } else { | ||
156 |
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.
|
69 | PetscCall(MatDestroy(&F)); |
157 |
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.
|
69 | PetscCall(MatDestroy(&J)); |
158 | } | ||
159 |
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.
|
129 | PetscCall(SlepcFinalize()); |
160 | return 0; | ||
161 | } | ||
162 | |||
163 | /* ------------------------------------------------------------------- */ | ||
164 | /* | ||
165 | FormFunction - Computes Function matrix T(lambda) | ||
166 | */ | ||
167 | 3209 | PetscErrorCode FormFunction(NEP nep,PetscScalar lambda,Mat fun,Mat B,void *ctx) | |
168 | { | ||
169 | 3209 | PetscInt i,n,col[3],Istart,Iend; | |
170 | 3209 | PetscBool FirstBlock=PETSC_FALSE,LastBlock=PETSC_FALSE; | |
171 | 3209 | PetscScalar value[3],t; | |
172 | |||
173 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3209 | PetscFunctionBeginUser; |
174 | /* | ||
175 | Compute Function entries and insert into matrix | ||
176 | */ | ||
177 | 3209 | t = PetscSqrtScalar(lambda); | |
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.
|
3209 | PetscCall(MatGetSize(fun,&n,NULL)); |
179 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3209 | PetscCall(MatGetOwnershipRange(fun,&Istart,&Iend)); |
180 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
3209 | if (Istart==0) FirstBlock=PETSC_TRUE; |
181 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
3209 | if (Iend==n) LastBlock=PETSC_TRUE; |
182 | 3209 | value[0]=1.0; value[1]=t-2.0; value[2]=1.0; | |
183 |
6/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
265261 | for (i=(FirstBlock? Istart+1: Istart); i<(LastBlock? Iend-1: Iend); i++) { |
184 | 262052 | col[0]=i-1; col[1]=i; col[2]=i+1; | |
185 |
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.
|
262052 | PetscCall(MatSetValues(fun,1,&i,3,col,value,INSERT_VALUES)); |
186 | } | ||
187 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
3209 | if (LastBlock) { |
188 | 2674 | i=n-1; col[0]=n-2; col[1]=n-1; | |
189 |
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.
|
2674 | PetscCall(MatSetValues(fun,1,&i,2,col,value,INSERT_VALUES)); |
190 | } | ||
191 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
|
3209 | if (FirstBlock) { |
192 | 2674 | i=0; col[0]=0; col[1]=1; value[0]=t-2.0; value[1]=1.0; | |
193 |
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.
|
2674 | PetscCall(MatSetValues(fun,1,&i,2,col,value,INSERT_VALUES)); |
194 | } | ||
195 | |||
196 | /* | ||
197 | Assemble matrix | ||
198 | */ | ||
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.
|
3209 | PetscCall(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY)); |
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.
|
3209 | PetscCall(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY)); |
201 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
3209 | if (fun != B) { |
202 | ✗ | PetscCall(MatAssemblyBegin(fun,MAT_FINAL_ASSEMBLY)); | |
203 | ✗ | PetscCall(MatAssemblyEnd(fun,MAT_FINAL_ASSEMBLY)); | |
204 | } | ||
205 |
5/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 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
619 | PetscFunctionReturn(PETSC_SUCCESS); |
206 | } | ||
207 | |||
208 | /* ------------------------------------------------------------------- */ | ||
209 | /* | ||
210 | FormJacobian - Computes Jacobian matrix T'(lambda) | ||
211 | */ | ||
212 | 960 | PetscErrorCode FormJacobian(NEP nep,PetscScalar lambda,Mat jac,void *ctx) | |
213 | { | ||
214 | 960 | Vec d; | |
215 | |||
216 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
960 | PetscFunctionBeginUser; |
217 |
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.
|
960 | PetscCall(MatCreateVecs(jac,&d,NULL)); |
218 |
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.
|
960 | PetscCall(VecSet(d,0.5/PetscSqrtScalar(lambda))); |
219 |
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.
|
960 | PetscCall(MatDiagonalSet(jac,d,INSERT_VALUES)); |
220 |
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.
|
960 | PetscCall(VecDestroy(&d)); |
221 |
5/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
192 | PetscFunctionReturn(PETSC_SUCCESS); |
222 | } | ||
223 | |||
224 | /* ------------------------------------------------------------------- */ | ||
225 | /* | ||
226 | ComputeSingularities - Computes maxnp points (at most) in the complex plane where | ||
227 | the function T(.) is not analytic. | ||
228 | |||
229 | In this case, we discretize the singularity region (-inf,0)~(-1e+6,-1e-5) | ||
230 | */ | ||
231 | 58 | PetscErrorCode ComputeSingularities(NEP nep,PetscInt *maxnp,PetscScalar *xi,void *pt) | |
232 | { | ||
233 | 58 | PetscReal h; | |
234 | 58 | PetscInt i; | |
235 | |||
236 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
58 | PetscFunctionBeginUser; |
237 | 58 | h = 11.0/(*maxnp-1); | |
238 | 58 | xi[0] = -1e-5; xi[*maxnp-1] = -1e+6; | |
239 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
579942 | for (i=1;i<*maxnp-1;i++) xi[i] = -PetscPowReal(10,-5+h*i); |
240 |
5/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 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
58 | PetscFunctionReturn(PETSC_SUCCESS); |
241 | } | ||
242 | |||
243 | /*TEST | ||
244 | |||
245 | testset: | ||
246 | args: -nep_nev 3 -terse | ||
247 | output_file: output/ex27_1.out | ||
248 | requires: !single | ||
249 | filter: sed -e "s/[+-]0\.0*i//g" | ||
250 | test: | ||
251 | suffix: 1 | ||
252 | args: -nep_nleigs_interpolation_degree 90 | ||
253 | test: | ||
254 | suffix: 3 | ||
255 | args: -nep_tol 1e-8 -nep_nleigs_rk_shifts 1.06,1.1,1.12,1.15 -nep_conv_norm -nep_nleigs_interpolation_degree 20 | ||
256 | test: | ||
257 | suffix: 5_cuda | ||
258 | args: -mat_type aijcusparse | ||
259 | requires: cuda | ||
260 | test: | ||
261 | suffix: 5_hip | ||
262 | args: -mat_type aijhipsparse | ||
263 | requires: hip | ||
264 | |||
265 | testset: | ||
266 | args: -split 0 -nep_nev 3 -terse | ||
267 | output_file: output/ex27_2.out | ||
268 | filter: sed -e "s/[+-]0\.0*i//g" | ||
269 | test: | ||
270 | suffix: 2 | ||
271 | args: -nep_nleigs_interpolation_degree 90 | ||
272 | requires: !single | ||
273 | test: | ||
274 | suffix: 4 | ||
275 | args: -nep_nleigs_rk_shifts 1.06,1.1,1.12,1.15 -nep_nleigs_interpolation_degree 20 | ||
276 | requires: double | ||
277 | test: | ||
278 | suffix: 6_cuda | ||
279 | args: -mat_type aijcusparse | ||
280 | requires: cuda !single | ||
281 | test: | ||
282 | suffix: 6_hip | ||
283 | args: -mat_type aijhipsparse | ||
284 | requires: hip !single | ||
285 | |||
286 | testset: | ||
287 | args: -split 0 -nep_type ciss -nep_ciss_extraction {{ritz hankel caa}} -rg_type ellipse -rg_ellipse_center 8 -rg_ellipse_radius .7 -nep_ciss_moments 4 -rg_ellipse_vscale 0.1 -terse | ||
288 | requires: complex !single | ||
289 | output_file: output/ex27_7.out | ||
290 | timeoutfactor: 2 | ||
291 | test: | ||
292 | suffix: 7 | ||
293 | test: | ||
294 | suffix: 7_par | ||
295 | nsize: 2 | ||
296 | args: -nep_ciss_partitions 2 | ||
297 | |||
298 | testset: | ||
299 | args: -nep_type ciss -rg_type ellipse -rg_ellipse_center 8 -rg_ellipse_radius .7 -rg_ellipse_vscale 0.1 -terse | ||
300 | requires: complex | ||
301 | filter: sed -e "s/ (in split form)//" | sed -e "s/56925/56924/" | sed -e "s/60753/60754/" | sed -e "s/92630/92629/" | sed -e "s/24705/24706/" | ||
302 | output_file: output/ex27_7.out | ||
303 | timeoutfactor: 2 | ||
304 | test: | ||
305 | suffix: 8 | ||
306 | test: | ||
307 | suffix: 8_parallel | ||
308 | nsize: 4 | ||
309 | args: -nep_ciss_partitions 4 -ds_parallel distributed | ||
310 | test: | ||
311 | suffix: 8_hpddm | ||
312 | args: -nep_ciss_ksp_type hpddm | ||
313 | requires: hpddm | ||
314 | |||
315 | test: | ||
316 | suffix: 9 | ||
317 | args: -nep_nev 4 -n 20 -terse | ||
318 | requires: !single | ||
319 | filter: sed -e "s/[+-]0\.0*i//g" | ||
320 | |||
321 | TEST*/ | ||
322 |