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;
}

Reply via email to