Actual source code: test5.c
slepc-3.22.1 2024-10-28
1: /*
2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: SLEPc - Scalable Library for Eigenvalue Problem Computations
4: Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
6: This file is part of SLEPc.
7: SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9: */
11: static char help[] = "Test EPS with different builds with a matrix loaded from a file.\n"
12: "This test is based on ex4.c in tutorials.\n"
13: "It loads test matrices available in PETSc's distribution.\n"
14: "Add -symm or -herm to select the symmetric/Hermitian matrix.\n\n";
16: #include <slepceps.h>
18: int main(int argc,char **argv)
19: {
20: Mat A; /* operator matrix */
21: EPS eps; /* eigenproblem solver context */
22: char filename[PETSC_MAX_PATH_LEN];
23: const char *prefix,*scalar,*ints,*floats;
24: PetscReal tol=PETSC_SMALL;
25: PetscViewer viewer;
26: PetscBool flg,symm;
28: PetscFunctionBeginUser;
29: PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
31: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32: Load the operator matrix that defines the eigensystem, Ax=kx
33: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
34: PetscCall(PetscOptionsHasName(NULL,NULL,"-symm",&symm));
35: PetscCall(PetscOptionsHasName(NULL,NULL,"-herm",&flg));
36: if (flg) symm=PETSC_TRUE;
37: #if defined(PETSC_USE_COMPLEX)
38: prefix = symm? "hpd": "nh";
39: scalar = "complex";
40: #else
41: prefix = symm? "spd": "ns";
42: scalar = "real";
43: #endif
44: #if defined(PETSC_USE_64BIT_INDICES)
45: ints = "int64";
46: #else
47: ints = "int32";
48: #endif
49: #if defined(PETSC_USE_REAL_DOUBLE)
50: floats = "float64";
51: #elif defined(PETSC_USE_REAL_SINGLE)
52: floats = "float32";
53: #endif
55: PetscCall(PetscSNPrintf(filename,sizeof(filename),"%s/share/petsc/datafiles/matrices/%s-%s-%s-%s",PETSC_DIR,prefix,scalar,ints,floats));
56: PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nReading matrix from binary file...\n\n"));
57: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer));
58: PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
59: PetscCall(MatSetFromOptions(A));
60: PetscCall(MatLoad(A,viewer));
61: PetscCall(PetscViewerDestroy(&viewer));
63: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
64: Create the eigensolver
65: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
66: PetscCall(EPSCreate(PETSC_COMM_WORLD,&eps));
67: PetscCall(EPSSetOperators(eps,A,NULL));
68: if (symm) PetscCall(EPSSetProblemType(eps,EPS_HEP));
69: else PetscCall(EPSSetProblemType(eps,EPS_NHEP));
70: PetscCall(EPSSetTolerances(eps,tol,PETSC_CURRENT));
71: PetscCall(EPSSetFromOptions(eps));
73: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
74: Solve the eigensystem and display solution
75: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
76: PetscCall(EPSSolve(eps));
77: PetscCall(EPSErrorView(eps,EPS_ERROR_RELATIVE,NULL));
78: PetscCall(EPSDestroy(&eps));
79: PetscCall(MatDestroy(&A));
80: PetscCall(SlepcFinalize());
81: return 0;
82: }
84: /*TEST
86: build:
87: requires: !__float128
89: testset:
90: args: -eps_nev 3
91: requires: !complex
92: filter: sed -e "s/92073/92072/" | sed -e "s/80649/80648/" | sed -e "s/80647/80648/" | sed -e "s/45755/45756/"
93: output_file: output/test5_1.out
94: test:
95: suffix: 1
96: args: -eps_type {{krylovschur subspace arnoldi gd}}
97: test:
98: suffix: 1_power
99: args: -eps_type power -st_type sinvert -eps_target 7
100: test:
101: suffix: 1_jd
102: args: -eps_type jd -eps_jd_minv 3 -eps_jd_plusk 1
103: test:
104: suffix: 1_gd
105: args: -eps_type gd -eps_gd_minv 3 -eps_gd_plusk 1
106: test:
107: suffix: 1_gd2
108: args: -eps_type gd -eps_gd_double_expansion
110: testset:
111: args: -eps_nev 3
112: requires: double complex
113: output_file: output/test5_1_complex.out
114: test:
115: suffix: 1_complex
116: args: -eps_type {{krylovschur subspace arnoldi gd}}
117: test:
118: suffix: 1_power_complex
119: args: -eps_type power -st_type sinvert -eps_target 7
120: test:
121: suffix: 1_jd_complex
122: args: -eps_type jd -eps_jd_minv 3 -eps_jd_plusk 1 -eps_max_it 2000
123: test:
124: suffix: 1_gd_complex
125: args: -eps_type gd -eps_gd_minv 3 -eps_gd_plusk 1
126: test:
127: suffix: 1_gd2_complex
128: args: -eps_type gd -eps_gd_double_expansion
130: testset:
131: args: -symm -eps_nev 4 -eps_smallest_real
132: requires: double !complex
133: output_file: output/test5_2.out
134: test:
135: suffix: 2_arpack
136: args: -eps_type arpack
137: requires: arpack
138: test:
139: suffix: 2_blopex
140: args: -eps_type blopex
141: requires: blopex
142: test:
143: suffix: 2_trlan
144: args: -eps_type trlan
145: requires: trlan
147: testset:
148: args: -symm -eps_nev 4 -eps_smallest_real
149: requires: double complex
150: output_file: output/test5_2_complex.out
151: test:
152: suffix: 2_blopex_complex
153: args: -eps_type blopex
154: requires: blopex
156: TEST*/