Actual source code: ex14.c
slepc-main 2024-11-15
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[] = "Solves a singular value problem with the matrix loaded from a file.\n"
12: "This example works for both real and complex numbers.\n\n"
13: "The command line options are:\n"
14: " -file <filename>, where <filename> = matrix file in PETSc binary form.\n\n";
16: #include <slepcsvd.h>
18: int main(int argc,char **argv)
19: {
20: Mat A; /* operator matrix */
21: SVD svd; /* singular value problem solver context */
22: SVDType type;
23: PetscReal tol;
24: PetscInt nsv,maxit,its;
25: char filename[PETSC_MAX_PATH_LEN];
26: PetscViewer viewer;
27: PetscBool flg,terse;
29: PetscFunctionBeginUser;
30: PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
32: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
33: Load the operator matrix that defines the singular value problem
34: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
36: PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nSingular value problem stored in file.\n\n"));
37: PetscCall(PetscOptionsGetString(NULL,NULL,"-file",filename,sizeof(filename),&flg));
38: PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Must indicate a file name with the -file option");
40: #if defined(PETSC_USE_COMPLEX)
41: PetscCall(PetscPrintf(PETSC_COMM_WORLD," Reading COMPLEX matrix from a binary file...\n"));
42: #else
43: PetscCall(PetscPrintf(PETSC_COMM_WORLD," Reading REAL matrix from a binary file...\n"));
44: #endif
45: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,filename,FILE_MODE_READ,&viewer));
46: PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
47: PetscCall(MatSetFromOptions(A));
48: PetscCall(MatLoad(A,viewer));
49: PetscCall(PetscViewerDestroy(&viewer));
51: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52: Create the singular value solver and set various options
53: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
55: /*
56: Create singular value solver context
57: */
58: PetscCall(SVDCreate(PETSC_COMM_WORLD,&svd));
60: /*
61: Set operator
62: */
63: PetscCall(SVDSetOperators(svd,A,NULL));
65: /*
66: Set solver parameters at runtime
67: */
68: PetscCall(SVDSetFromOptions(svd));
70: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
71: Solve the singular value system
72: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
74: PetscCall(SVDSolve(svd));
75: PetscCall(SVDGetIterationNumber(svd,&its));
76: PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of iterations of the method: %" PetscInt_FMT "\n",its));
78: /*
79: Optional: Get some information from the solver and display it
80: */
81: PetscCall(SVDGetType(svd,&type));
82: PetscCall(PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type));
83: PetscCall(SVDGetDimensions(svd,&nsv,NULL,NULL));
84: PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of requested singular values: %" PetscInt_FMT "\n",nsv));
85: PetscCall(SVDGetTolerances(svd,&tol,&maxit));
86: PetscCall(PetscPrintf(PETSC_COMM_WORLD," Stopping condition: tol=%.4g, maxit=%" PetscInt_FMT "\n",(double)tol,maxit));
88: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
89: Display solution and clean up
90: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
92: /* show detailed info unless -terse option is given by user */
93: PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
94: if (terse) PetscCall(SVDErrorView(svd,SVD_ERROR_RELATIVE,NULL));
95: else {
96: PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
97: PetscCall(SVDConvergedReasonView(svd,PETSC_VIEWER_STDOUT_WORLD));
98: PetscCall(SVDErrorView(svd,SVD_ERROR_RELATIVE,PETSC_VIEWER_STDOUT_WORLD));
99: PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
100: }
101: PetscCall(SVDDestroy(&svd));
102: PetscCall(MatDestroy(&A));
103: PetscCall(SlepcFinalize());
104: return 0;
105: }
106: /*TEST
108: testset:
109: requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
110: args: -file ${SLEPC_DIR}/share/slepc/datafiles/matrices/rdb200.petsc -terse
111: test:
112: suffix: 1
113: args: -svd_nsv 4 -svd_standard -svd_ncv 12 -svd_type {{trlanczos lanczos randomized cross}}
114: filter: grep -v method
115: test:
116: suffix: 1_scalapack
117: nsize: {{1 2 3}}
118: args: -svd_nsv 4 -svd_type scalapack
119: requires: scalapack
120: test:
121: suffix: 1_elemental
122: nsize: {{1 2 3}}
123: args: -svd_nsv 4 -svd_type elemental
124: output_file: output/ex14_1_scalapack.out
125: filter: sed -e "s/elemental/scalapack/"
126: requires: elemental
127: test:
128: suffix: 1_ksvd
129: nsize: 6
130: args: -svd_nsv 4 -svd_type ksvd -svd_ksvd_eigen_method {{mrrr elpa}} -svd_ksvd_polar_method {{qdwh zolopd}}
131: output_file: output/ex14_1_scalapack.out
132: filter: sed -e "s/ksvd/scalapack/"
133: requires: elpa polar ksvd
134: test:
135: suffix: 2
136: args: -svd_nsv 2 -svd_type cyclic -svd_cyclic_explicitmatrix -svd_cyclic_st_type sinvert -svd_cyclic_eps_target 12.5 -svd_cyclic_st_ksp_type preonly -svd_cyclic_st_pc_type lu -svd_view
137: filter: grep -v tolerance
138: test:
139: suffix: 2_cross
140: args: -svd_nsv 2 -svd_type cross -svd_cross_explicitmatrix -svd_cross_st_type sinvert -svd_cross_eps_target 100.0
141: filter: grep -v tolerance
143: testset:
144: requires: double complex datafilespath !defined(PETSC_USE_64BIT_INDICES)
145: args: -file ${DATAFILESPATH}/matrices/complex/qc324.petsc -terse
146: test:
147: suffix: 1_complex
148: args: -svd_nsv 4
149: test:
150: suffix: 1_complex_scalapack
151: nsize: {{1 2 3}}
152: args: -svd_nsv 4 -svd_type scalapack
153: requires: scalapack
154: test:
155: suffix: 1_complex_elemental
156: nsize: {{1 2 3}}
157: args: -svd_nsv 4 -svd_type elemental
158: requires: elemental
159: test:
160: suffix: 2_complex
161: args: -svd_nsv 2 -svd_type cyclic -svd_cyclic_explicitmatrix -svd_cyclic_st_type sinvert -svd_cyclic_eps_target 12.0 -svd_cyclic_st_ksp_type preonly -svd_cyclic_st_pc_type lu -svd_view
162: filter: grep -v tolerance
164: testset:
165: args: -svd_nsv 5 -svd_type randomized -svd_max_it 1 -svd_conv_maxit
166: test:
167: suffix: 3
168: args: -file ${SLEPC_DIR}/share/slepc/datafiles/matrices/rdb200.petsc
169: requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
170: test:
171: suffix: 3_complex
172: args: -file ${DATAFILESPATH}/matrices/complex/qc324.petsc
173: requires: double complex datafilespath !defined(PETSC_USE_64BIT_INDICES)
174: filter: sed -e 's/[0-9][0-9]$//'
176: TEST*/