Convergence of iterative schemes depends on problem sizes and problem 
properties. You need to debug your code/algorithm to determine what is going 
on. Some advice NEVER NEVER NEVER run in parallel until you are getting correct 
behavior and solutions on one process consistently. Increase the problem size 
slightly from 5 until you start seeing bad behavior; don't just jump from 5 to 
5000. 

  Barry



> On Aug 19, 2015, at 10:51 AM, Hongliang Lu <[email protected]> wrote:
> 
> Dear all,
> I am trying to implement a BFS algorithm using Petsc, and I have tested my 
> code on a graph of 5 nodes, but when I tested on a larger graph, which size 
> is 5000 nodes, the program went wrong, and ca not finished, could some on 
> help me out? thank you very much!!!!!
> I tried to run the following code in a cluster with 10 nodes.
> 
> int main(int argc,char **args)
> {
>         Vec         curNodes,tmp;
>         Mat         oriGraph;
>       PetscInt rows, cols;
>       PetscScalar one=1;
>       PetscScalar nodeVecSum=1;
>         char 
> filein[PETSC_MAX_PATH_LEN],fileout[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN];
>         PetscViewer fd;
>         PetscInitialize(&argc,&args,(char *)0,help);
> 
>         
> PetscOptionsGetString(PETSC_NULL,"-fin",filein,PETSC_MAX_PATH_LEN-1,PETSC_NULL);
>         PetscViewerBinaryOpen(PETSC_COMM_WORLD,filein,FILE_MODE_READ,&fd);
>         MatCreate(PETSC_COMM_WORLD,&oriGraph);
> 
>         MatLoad(oriGraph,fd);
>       MatGetSize(oriGraph,&rows,&cols);
>       MatSetOption(oriGraph,MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE);
>       MatSetUp(oriGraph);
>       VecCreate(PETSC_COMM_WORLD,&curNodes);
>       
>       VecSetSizes(curNodes,PETSC_DECIDE,rows);
>       VecSetFromOptions(curNodes);
>       VecCreate(PETSC_COMM_WORLD,&tmp);
>       VecSetSizes(tmp,PETSC_DECIDE,rows);
>       VecSetFromOptions(tmp);
>       VecZeroEntries(tmp);
>       srand(time(0));
>       PetscInt node=rand()%rows;
>       PetscPrintf(PETSC_COMM_SELF,"The node ID is: %d \n",node);
>       VecSetValues(curNodes,1,&node,&one,INSERT_VALUES);
>       VecAssemblyBegin(curNodes);
>       VecAssemblyEnd(curNodes);       
> 
>         PetscViewerDestroy(&fd);
> 
>       const PetscInt    *colsv;
>         const PetscScalar *valsv;
>         PetscInt ncols,i,zero=0;
>       PetscInt iter=0;
> 
>       nodeVecSum=1;
>       for(;iter<10;iter++)
>       {       
>               VecAssemblyBegin(curNodes);
>               VecAssemblyEnd(curNodes);
>               MatMult(oriGraph,curNodes,tmp);
>               VecAssemblyBegin(tmp);
>               VecAssemblyEnd(tmp);
>               VecSum(tmp,&nodeVecSum);
>               PetscPrintf(PETSC_COMM_SELF,"There are neighbors: %d 
> \n",(int)nodeVecSum);
>               VecSum(curNodes,&nodeVecSum);
>               if(nodeVecSum<1)
>                       break;
> 
>               PetscScalar y;
>               PetscInt indices;
>               PetscInt n,m,rstart,rend;
>               IS isrow;
>               Mat curMat;
>               MatGetLocalSize(oriGraph,&n,&m);
>               MatGetOwnershipRange(oriGraph,&rstart,&rend);
>               ISCreateStride(PETSC_COMM_SELF,n,rstart,1,&isrow);
>               MatGetSubMatrix(oriGraph,isrow,NULL,MAT_INITIAL_MATRIX,&curMat);
>               
>               MatGetSize(curMat,&n,&m);
>               for(i=rstart;i<rend;i++)
>               {
>                       indices=i;
>                       VecGetValues(curNodes,1,&indices,&y);
>                       if(y>0){
>                               
> MatGetRow(oriGraph,indices,&ncols,&colsv,&valsv);
>                               PetscScalar *v,zero=0;
>                               PetscMalloc1(cols,&v);
>                               for(int j=0;j<ncols;j++){
>                                               v[j]=zero;
>                               }
>                               
> MatSetValues(oriGraph,1,&indices,ncols,colsv,v,INSERT_VALUES);
>                               PetscFree(v);
>                               
>                       }
> 
>               }
>               MatAssemblyBegin(oriGraph,MAT_FINAL_ASSEMBLY);
>                 MatAssemblyEnd(oriGraph,MAT_FINAL_ASSEMBLY);
>               ISDestroy(&isrow);
>               
>               MatDestroy(&curMat);
>               
>               VecCopy(tmp,curNodes);
>               VecAssemblyBegin(curNodes);
>               VecAssemblyEnd(curNodes);
>               
>       }
>       PetscPrintf(PETSC_COMM_SELF,"Finished in iterations of: %d\n",iter);
>         MatDestroy(&oriGraph);
>         VecDestroy(&curNodes);
>       VecDestroy(&tmp);
>         PetscFinalize();
>         return 0;
> }
> The Petsc version I have installed is 3.6.1. 
> 
> 

Reply via email to