Hi Jed,
I have a specific question regarding the attached my initialization function.
Previously I used KSPSetType(ksp,KSPFGMRES) solver, and I would like to see if
there is some improvement using the other choices like KSPBCGS. It seems
hoverer, the PC //PCSetType(pc,PCBJACOBI) does not work with me. And
I am not quite sure why.
By the way, can you please give some suggestions on my code? I am not quite
sure if I am doing the things rightly.
Many thanks,
Paul
void petsc_init(void) {
vector<Cell>::iterator cit;
vector<int>::iterator it;
//Create nonlinear solver context
KSPCreate(PETSC_COMM_WORLD,&ksp);
VecCreateMPI(PETSC_COMM_WORLD,grid[gid].cellCount*nVars,grid[gid].globalCellCount*nVars,&RHS);
VecSetFromOptions(RHS);
VecDuplicate(RHS,&deltaX);
VecSet(RHS,0.);
VecSet(deltaX,0.);
vector<int> diagonal_nonzeros, off_diagonal_nonzeros;
int nextCellCount;
// Calculate space necessary for matrix memory allocation
for (cit=grid[gid].cell.begin();cit!=grid[gid].cell.end();cit++) {
nextCellCount=0;
for (it=(*cit).faces.begin();it!=(*cit).faces.end();it++) {
if (grid[gid].face[*it].bc==INTERNAL_FACE) {
nextCellCount++;
}
}
for (int i=0;i<nVars;++i) {
diagonal_nonzeros.push_back( (nextCellCount+1)*nVars);
off_diagonal_nonzeros.push_back(
((*cit).ghosts.size())*nVars);
}
}
MatCreateMPIAIJ(
PETSC_COMM_WORLD,
grid[gid].cellCount*nVars,
grid[gid].cellCount*nVars,
grid[gid].globalCellCount*nVars,
grid[gid].globalCellCount*nVars,
0,&diagonal_nonzeros[0],
0,&off_diagonal_nonzeros[0],
&impOP);
KSPSetOperators(ksp,impOP,impOP,SAME_NONZERO_PATTERN);
KSPSetTolerances(ksp,rtol,abstol,1.e15,maxits);
KSPSetType(ksp, KSPBCGS);
//PCSetType(pc,PCBJACOBI);
KSPGMRESSetRestart(ksp,30);
KSPSetFromOptions(ksp);
return;
}