Actual source code: ex76.c
petsc-3.13.4 2020-08-01
1: #include <petscksp.h>
3: static char help[] = "Solves a linear system using PCHPDDM.\n\n";
5: int main(int argc,char **args)
6: {
7: Vec x,b; /* computed solution and RHS */
8: Mat A,aux; /* linear system matrix */
9: KSP ksp; /* linear solver context */
10: PC pc;
11: IS is,sizes;
12: const PetscInt *idx;
13: PetscMPIInt rank,size;
14: const char *deft = MATAIJ;
15: PetscViewer viewer;
16: char dir[PETSC_MAX_PATH_LEN],name[PETSC_MAX_PATH_LEN],type[256];
17: PetscBool flg;
20: PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr;
21: MPI_Comm_size(PETSC_COMM_WORLD,&size);
22: if (size != 4) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER,"This example requires 4 processes");
23: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
24: MatCreate(PETSC_COMM_WORLD,&A);
25: MatCreate(PETSC_COMM_SELF,&aux);
26: ISCreate(PETSC_COMM_SELF,&is);
27: PetscStrcpy(dir,".");
28: PetscOptionsGetString(NULL,NULL,"-load_dir",dir,sizeof(dir),NULL);
29: /* loading matrices */
30: PetscSNPrintf(name,sizeof(name),"%s/sizes_%d_%d.dat",dir,rank,size);
31: PetscViewerBinaryOpen(PETSC_COMM_SELF,name,FILE_MODE_READ,&viewer);
32: ISCreate(PETSC_COMM_SELF,&sizes);
33: ISLoad(sizes,viewer);
34: ISGetIndices(sizes,&idx);
35: MatSetSizes(A,idx[0],idx[1],idx[2],idx[3]);
36: ISRestoreIndices(sizes,&idx);
37: ISDestroy(&sizes);
38: PetscViewerDestroy(&viewer);
39: MatSetUp(A);
40: PetscSNPrintf(name,sizeof(name),"%s/A.dat",dir);
41: PetscViewerBinaryOpen(PETSC_COMM_WORLD,name,FILE_MODE_READ,&viewer);
42: MatLoad(A,viewer);
43: PetscViewerDestroy(&viewer);
44: PetscSNPrintf(name,sizeof(name),"%s/is_%d_%d.dat",dir,rank,size);
45: PetscViewerBinaryOpen(PETSC_COMM_SELF,name,FILE_MODE_READ,&viewer);
46: ISLoad(is,viewer);
47: PetscViewerDestroy(&viewer);
48: PetscSNPrintf(name,sizeof(name),"%s/Neumann_%d_%d.dat",dir,rank,size);
49: PetscViewerBinaryOpen(PETSC_COMM_SELF,name,FILE_MODE_READ,&viewer);
50: MatSetBlockSizesFromMats(aux,A,A);
51: MatLoad(aux,viewer);
52: PetscViewerDestroy(&viewer);
53: MatSetOption(A,MAT_SYMMETRIC,PETSC_TRUE);
54: MatSetOption(aux,MAT_SYMMETRIC,PETSC_TRUE);
55: /* ready for testing */
56: PetscOptionsBegin(PETSC_COMM_WORLD,"","","");
57: PetscOptionsFList("-mat_type","Matrix type","MatSetType",MatList,deft,type,256,&flg);
58: PetscOptionsEnd();
59: if (flg) {
60: MatConvert(A,type,MAT_INPLACE_MATRIX,&A);
61: MatConvert(aux,type,MAT_INPLACE_MATRIX,&aux);
62: }
63: KSPCreate(PETSC_COMM_WORLD,&ksp);
64: KSPSetOperators(ksp,A,A);
65: KSPGetPC(ksp,&pc);
66: PCSetType(pc,PCHPDDM);
67: #if defined(PETSC_HAVE_HPDDM)
68: PCHPDDMSetAuxiliaryMat(pc,is,aux,NULL,NULL);
69: PCHPDDMHasNeumannMat(pc,PETSC_FALSE); /* PETSC_TRUE is fine as well, just testing */
70: #endif
71: ISDestroy(&is);
72: MatDestroy(&aux);
73: KSPSetFromOptions(ksp);
74: MatCreateVecs(A,&x,&b);
75: VecSet(b,1.0);
76: KSPSolve(ksp,b,x);
77: VecDestroy(&x);
78: VecDestroy(&b);
79: KSPDestroy(&ksp);
80: MatDestroy(&A);
81: PetscFinalize();
82: return ierr;
83: }
85: /*TEST
87: test:
88: requires: hpddm slepc datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
89: nsize: 4
90: args: -ksp_rtol 1e-3 -ksp_converged_reason -pc_type {{bjacobi hpddm}shared output} -pc_hpddm_coarse_sub_pc_type lu -sub_pc_type lu -options_left no -load_dir ${DATAFILESPATH}/matrices/hpddm/GENEO
92: test:
93: requires: hpddm slepc datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
94: suffix: geneo
95: nsize: 4
96: args: -ksp_converged_reason -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type cholesky -pc_hpddm_levels_1_eps_nev {{5 15}separate output} -pc_hpddm_levels_1_st_pc_type cholesky -pc_hpddm_coarse_p {{1 2}shared output} -pc_hpddm_coarse_pc_type redundant -mat_type {{aij baij sbaij}shared output} -load_dir ${DATAFILESPATH}/matrices/hpddm/GENEO
98: test:
99: requires: hpddm slepc datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
100: suffix: fgmres_geneo_20_p_2
101: nsize: 4
102: args: -ksp_converged_reason -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 20 -pc_hpddm_coarse_p 2 -pc_hpddm_coarse_pc_type redundant -ksp_type fgmres -pc_hpddm_coarse_mat_type {{baij sbaij}shared output} -load_dir ${DATAFILESPATH}/matrices/hpddm/GENEO
104: test:
105: requires: hpddm slepc datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
106: suffix: fgmres_geneo_20_p_2_geneo
107: output_file: output/ex76_fgmres_geneo_20_p_2.out
108: nsize: 4
109: args: -ksp_converged_reason -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type cholesky -pc_hpddm_levels_1_eps_nev 20 -pc_hpddm_levels_2_p 2 -pc_hpddm_levels_2_mat_type {{baij sbaij}shared output} -pc_hpddm_levels_2_eps_nev {{5 20}shared output} -pc_hpddm_levels_2_sub_pc_type cholesky -pc_hpddm_levels_2_ksp_type gmres -ksp_type fgmres -pc_hpddm_coarse_mat_type {{baij sbaij}shared output} -mat_type {{aij sbaij}shared output} -load_dir ${DATAFILESPATH}/matrices/hpddm/GENEO
111: TEST*/