/
hpc_petsc_bench.c
170 lines (129 loc) · 4.83 KB
/
hpc_petsc_bench.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "hpc_petsc_bench.h"
static const char help[] = "Solve Ax=b using GMRES, options array_in_received_buffer\n\
\t-mfile matrix_file (matrix file in PETSc bin format, this is mandatory)\n\
\t-bfile right_and_side_file (also in PETSc bin format)\n\
\t-xfile initial_solution_file (in PETSc bin format)\n";
int main(int argc, char **argv){
PetscErrorCode ierr;
Vec x,b;
Mat A;
KSP ksp;
ierr=PetscInitialize(&argc,&argv,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"]> Initializing PETSc/SLEPc\n");
/*Load data*/
ierr=loadInputs(&A,&b,&x);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"]> Data loaded\n");
/*Create the KSP context and setup*/
ierr = KSPCreate(PETSC_COMM_WORLD,&ksp);CHKERRQ(ierr);
ierr = KSPSetType(ksp,KSPFGMRES);CHKERRQ(ierr);
ierr = KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
ierr = KSPSetFromOptions(ksp);CHKERRQ(ierr);
ierr = KSPSetUp(ksp);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"]> Krylov Solver settings done\n");
/*Solve the system*/
PetscPrintf(PETSC_COMM_WORLD,"]> Krylov Solver Launching solving process\n");
ierr = KSPSolve(ksp, b, x); CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"]> Krylov Solver System solved\n");
/*Clean*/
ierr = KSPDestroy(&ksp);CHKERRQ(ierr);
ierr = VecDestroy(&b);CHKERRQ(ierr);
ierr = VecDestroy(&x);CHKERRQ(ierr);
ierr = MatDestroy(&A);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"]> Cleaned structures, finalizing\n");
/*Finalize PETSc*/
PetscFinalize();
return 0;
}
PetscErrorCode loadInputs(Mat * A, Vec * b, Vec * x){
PetscErrorCode ierr;
PetscInt sizex,sizey;
char bfile[]="-bfile";
char xfile[]="-xfile";
//load data files
ierr=loadMatrix(A);CHKERRQ(ierr);
ierr=loadVector(bfile,b);CHKERRQ(ierr);
if(*b==NULL) {
PetscPrintf(PETSC_COMM_WORLD,"]> Creating vector b\n");
ierr=MatGetSize(*A,&sizex,&sizey);CHKERRQ(ierr);
ierr=generateVectorRandom(sizex,b);CHKERRQ(ierr);
}
ierr=loadVector(xfile,x);CHKERRQ(ierr);
if(*x==NULL) {
PetscPrintf(PETSC_COMM_WORLD,"]> Creating vector x\n");
ierr=MatGetSize(*A,&sizex,&sizey);CHKERRQ(ierr);
ierr=generateVectorRandom(sizex,x);CHKERRQ(ierr);
}
return 0;
}
PetscErrorCode loadMatrix(Mat * A){
char file[PETSC_MAX_PATH_LEN];
char err[PETSC_MAX_PATH_LEN];
PetscErrorCode ierr;
PetscBool flag;
PetscViewer fd;
PetscInt sizex,sizey;
/*check args, if no matrix then no work... matrix file is mandatory*/
ierr=PetscOptionsGetString(PETSC_NULL,"-mfile",file,PETSC_MAX_PATH_LEN-1,&flag);CHKERRQ(ierr);
if (!flag) {
sprintf(err,"Error : mfile is not properly set -> %s\n",file);
SETERRQ(PETSC_COMM_WORLD,(PetscErrorCode)83,err);
}
/* read matrix file */
PetscPrintf(PETSC_COMM_WORLD,"Loading Matrix : %s\n",file);
ierr=MatCreate(PETSC_COMM_WORLD,A);CHKERRQ(ierr);
ierr=MatSetType(*A,MATAIJ);CHKERRQ(ierr);
ierr=PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd);CHKERRQ(ierr);
ierr=MatLoad(*A,fd);CHKERRQ(ierr);
ierr=PetscViewerDestroy(&fd);CHKERRQ(ierr);
ierr=MatGetSize(*A,&sizex,&sizey);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"Loaded Matrix of size : %d %d\n",sizex,sizey);
return 0;
}
PetscErrorCode loadVector(char * type_v,Vec * b){
char file[PETSC_MAX_PATH_LEN];
char err[PETSC_MAX_PATH_LEN];
PetscErrorCode ierr;
PetscBool flag;
PetscViewer fd;
PetscInt size;
// check if there is a vec file, vector is not mandatory
ierr=PetscOptionsGetString(PETSC_NULL,type_v,file,PETSC_MAX_PATH_LEN-1,&flag);CHKERRQ(ierr);
if (!flag) {
PetscPrintf(PETSC_COMM_WORLD,"Error : %s is not properly set\n",type_v);
*b = NULL;
}else{
PetscPrintf(PETSC_COMM_WORLD,"Loading Vector : %s\n",file);
ierr=PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd);CHKERRQ(ierr);
ierr=VecLoad(*b,fd);CHKERRQ(ierr);
ierr=PetscViewerDestroy(&fd);CHKERRQ(ierr);
ierr=VecGetSize(*b,&size);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"Loaded Vector of size : %d\n",size);
}
return 0;
}
PetscErrorCode generateVectorRandom(int size, Vec * v){
PetscErrorCode ierr;
ierr=PetscPrintf(PETSC_COMM_WORLD,"Generating Vector \n");CHKERRQ(ierr);
ierr=generateVector(size,v);CHKERRQ(ierr);
ierr=VecSetRandom(*v,PETSC_NULL);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"Generated Random Vector of size : %d\n",size);
return 0;
}
PetscErrorCode generateVectorNorm(int size, Vec * v){
PetscScalar scal;
PetscErrorCode ierr;
ierr=PetscPrintf(PETSC_COMM_WORLD,"Generating Vector \n");CHKERRQ(ierr);
ierr=generateVector(size,v);CHKERRQ(ierr);
scal=1.0/size;
ierr=VecSet(*v,scal);CHKERRQ(ierr);
PetscPrintf(PETSC_COMM_WORLD,"Generated Norm Vector of size : %d\n",size);
return 0;
}
PetscErrorCode generateVector(int size, Vec * v){
PetscErrorCode ierr;
ierr=VecCreate(PETSC_COMM_WORLD,v);CHKERRQ(ierr);
ierr=VecSetSizes(*v,PETSC_DECIDE,size);CHKERRQ(ierr);
ierr=VecSetFromOptions(*v);CHKERRQ(ierr);
/*initiate the vector to its norm*/
return 0;
}