[petsc-users] Trying to apply FieldSplitPC by reading bloc matrix
Gilles Steiner
gilles.steiner at epfl.ch
Fri Dec 19 08:14:10 CST 2014
Hello Petsc Users,
I have an issue trying to use FiledSplitPC in parallel.
My goal : I want to get a linear system from petsc binary files and
solve this in parallel with the FieldSplitPC.
The problem I want to solve is an FE approximation of the Stokes equations.
Skipping the details, my code looks like :
// Reading the four blocs UU, UP, PU and PP
for(int i=0; i < 4; ++i)
{
string name = matrix + to_string(i) + ".petscbin";
PetscViewer PETSC_matreader;
PetscViewerBinaryOpen(PETSC_COMM_WORLD, name.c_str(),
FILE_MODE_READ, &PETSC_matreader);
MatCreate(PETSC_COMM_WORLD,&PETSC_subA[i]);
MatLoad(PETSC_subA[i],PETSC_matreader);
PetscViewerDestroy(&PETSC_matreader);
}
// Reading the RHS vector and duplicating it to create the solution vector
PetscViewerBinaryOpen(PETSC_COMM_WORLD, rhs.c_str(), FILE_MODE_READ,
&PETSC_vecreader);
VecCreate(PETSC_COMM_WORLD,&PETSC_rhs);
VecLoad(PETSC_rhs,PETSC_vecreader);
PetscViewerDestroy(&PETSC_vecreader);
VecDuplicate(PETSC_rhs,&PETSC_sol);
// Create global matrixwith MatCreateNest
MatCreateNest(PETSC_COMM_WORLD, 2, NULL, 2, NULL, PETSC_subA, &PETSC_A);
MatNestGetISs(PETSC_A, PETSC_isg, NULL);
// Setting up the ksp and precond
KSPCreate(PETSC_COMM_WORLD,&PETSC_ksp);
KSPSetOperators(PETSC_ksp,PETSC_A,PETSC_A);
KSPSetFromOptions(PETSC_ksp);
KSPGetPC(PETSC_ksp, &PETSC_pc);
PCSetType(PETSC_pc, PCFIELDSPLIT);
PCFieldSplitSetIS(PETSC_pc, "0", PETSC_isg[0]);
PCFieldSplitSetIS(PETSC_pc, "1", PETSC_isg[1]);
PCSetFromOptions(PETSC_pc);
// Solving the system and writing back the solution in rhs file
KSPSolve(PETSC_ksp,PETSC_rhs,PETSC_sol);
PetscViewer PETSC_vecwriter;
PetscViewerBinaryOpen(PETSC_COMM_WORLD, rhs.c_str(), FILE_MODE_WRITE,
&PETSC_vecwriter);
VecView(PETSC_sol,PETSC_vecwriter);
PetscViewerDestroy(&PETSC_vecwriter);
When I run it with 1 proc, everything works fine and I get the correct
solution :
0 KSP preconditioned resid norm 1.271697253018e+03 true resid norm
2.400000000000e+01 ||r(i)||/||b|| 1.000000000000e+00
1 KSP preconditioned resid norm 5.009545069728e+01 true resid norm
9.166803391041e-02 ||r(i)||/||b|| 3.819501412934e-03
2 KSP preconditioned resid norm 6.460631387766e+00 true resid norm
4.995542253831e-02 ||r(i)||/||b|| 2.081475939096e-03
3 KSP preconditioned resid norm 1.155895209298e+00 true resid norm
1.515734830704e-02 ||r(i)||/||b|| 6.315561794600e-04
4 KSP preconditioned resid norm 7.407384739634e-02 true resid norm
9.992802256200e-03 ||r(i)||/||b|| 4.163667606750e-04
5 KSP preconditioned resid norm 1.574456882990e-02 true resid norm
9.994876664681e-03 ||r(i)||/||b|| 4.164531943617e-04
6 KSP preconditioned resid norm 2.383022349902e-03 true resid norm
9.990760645581e-03 ||r(i)||/||b|| 4.162816935659e-04
7 KSP preconditioned resid norm 6.175379834254e-04 true resid norm
9.990821066459e-03 ||r(i)||/||b|| 4.162842111025e-04
8 KSP preconditioned resid norm 6.867982689960e-05 true resid norm
9.990532094790e-03 ||r(i)||/||b|| 4.162721706163e-04
9 KSP preconditioned resid norm 1.041091257246e-05 true resid norm
9.990558069113e-03 ||r(i)||/||b|| 4.162732528797e-04
10 KSP preconditioned resid norm 1.447793722489e-06 true resid norm
9.990557786778e-03 ||r(i)||/||b|| 4.162732411158e-04
11 KSP preconditioned resid norm 2.139317335854e-07 true resid norm
9.990557262754e-03 ||r(i)||/||b|| 4.162732192814e-04
12 KSP preconditioned resid norm 4.383129810322e-08 true resid norm
9.990557306920e-03 ||r(i)||/||b|| 4.162732211217e-04
13 KSP preconditioned resid norm 3.351461304399e-09 true resid norm
9.990557311707e-03 ||r(i)||/||b|| 4.162732213211e-04
14 KSP preconditioned resid norm 5.169032607321e-10 true resid norm
9.990557312817e-03 ||r(i)||/||b|| 4.162732213674e-04
[14:49:10::INFO ] System Solved. Final tolerance reached is
5.16903e-10 in 14 iterations.
But if I do it with 2 procs, the resolution seems fine but the solution
is wrong :
0 KSP preconditioned resid norm 1.247694088756e+03 true resid norm
2.400000000000e+01 ||r(i)||/||b|| 1.000000000000e+00
1 KSP preconditioned resid norm 4.481954484303e+01 true resid norm
5.277507840772e-01 ||r(i)||/||b|| 2.198961600321e-02
2 KSP preconditioned resid norm 1.110647693456e+01 true resid norm
4.005558168981e-02 ||r(i)||/||b|| 1.668982570409e-03
3 KSP preconditioned resid norm 1.220368027409e+00 true resid norm
1.877650834971e-02 ||r(i)||/||b|| 7.823545145714e-04
4 KSP preconditioned resid norm 2.834261749922e-01 true resid norm
1.613967205264e-02 ||r(i)||/||b|| 6.724863355265e-04
5 KSP preconditioned resid norm 4.215090288154e-02 true resid norm
1.562561614611e-02 ||r(i)||/||b|| 6.510673394212e-04
6 KSP preconditioned resid norm 1.209476134754e-02 true resid norm
1.563808960492e-02 ||r(i)||/||b|| 6.515870668718e-04
7 KSP preconditioned resid norm 2.038835108629e-03 true resid norm
1.564163643064e-02 ||r(i)||/||b|| 6.517348512765e-04
8 KSP preconditioned resid norm 1.928844666836e-04 true resid norm
1.564072761376e-02 ||r(i)||/||b|| 6.516969839065e-04
9 KSP preconditioned resid norm 3.138911950605e-05 true resid norm
1.564047323377e-02 ||r(i)||/||b|| 6.516863847403e-04
10 KSP preconditioned resid norm 4.950062975470e-06 true resid norm
1.564048216528e-02 ||r(i)||/||b|| 6.516867568865e-04
11 KSP preconditioned resid norm 7.677242244159e-07 true resid norm
1.564049253364e-02 ||r(i)||/||b|| 6.516871889019e-04
12 KSP preconditioned resid norm 1.870521888617e-07 true resid norm
1.564049269566e-02 ||r(i)||/||b|| 6.516871956526e-04
13 KSP preconditioned resid norm 3.077235724319e-08 true resid norm
1.564049264800e-02 ||r(i)||/||b|| 6.516871936666e-04
14 KSP preconditioned resid norm 6.584409191524e-09 true resid norm
1.564049264183e-02 ||r(i)||/||b|| 6.516871934095e-04
15 KSP preconditioned resid norm 1.091619359913e-09 true resid norm
1.564049263170e-02 ||r(i)||/||b|| 6.516871929874e-04
[15:10:58::INFO ] System Solved. Final tolerance reached is
1.09162e-09 in 15 iterations.
Any idea of what is wrong with this ? Is it the code or the base concept ?
Thank you.
Gilles
More information about the petsc-users
mailing list