1) remove all the "preload" stuff

  2) MatLoad doesn't require or use the Mat preallocation stuff so remove all 
of that

   3) MatLoad determines the global matrix size from the binary file so do not 
set that before calling MatLoad

   4) All processes in the comm (in your case MPI_COMM_WORLD) need to call 
MatLoad

   5) You can call MatSetBlockSize() to set the block size before MatLoad()

   6) You do not need to call MatAssemblyBegin/End after a MatLoad() it would 
do nothing

> On Nov 12, 2014, at 1:32 PM, Steena M <[email protected]> wrote:
> 
> I am trying to read in a sparse matrix file in binary format (.dat file) to 
> set it up as MPIBAIJ for MPIMatMult. I don't think I'm doing the file reading 
> or the matrix and vector setup correctly. Should the file loading, matrix 
> setup, and loading be done only on rank 0 together with the vector setup?  
> After looking through several examples, this is the structure of my code 
> right now:
> 
> Vec            x,y;  
> Mat            A;  
> PetscViewer     fd;
> int rank, global_row_size, global_col_size,bs;
> PetscBool       PetscPreLoad = PETSC_FALSE;
> char           filein[PETSC_MAX_PATH_LEN]  /*binary .dat matrix file */
> PetscScalar one = 1.0;
> 
> 
>  /* Reading relevant block size from ENV */
>  char* bs_env;
>  bs_env = getenv ("BLOCK_SIZE_ENV");
>  bs = (PetscInt)atoi(bs_env);
> 
> /*Reading in matrix row/cols size from ENV. Matrices are always square: 
> global_col_size=global_row_size*/
> 
>  char* m_env;
>  m_env = getenv ("MATRIX_ROWS_ENV");
>  global_row_size = (PetscInt)atoi(m_env);
>  global_col_size = global _row_size;
> 
>  PetscInitialize(&argc,&args,(char *)0,help);
>  ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
> 
> /*Matrix reading, setup, assembly*/
> 
>  if (flg) PetscPreLoad = PETSC_TRUE;
>  PetscPreLoadBegin(PetscPreLoad,"Load");
>  ierr = 
> PetscViewerBinaryOpen(PETSC_COMM_WORLD,filein[PetscPreLoadIt],FILE_MODE_READ,&fd);CHKERRQ(ierr);
> 
> 
>  ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
>  ierr = 
> MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,global_row_size,global_col_size);CHKERRQ(ierr);
>  ierr = MatSetFromOptions(A);CHKERRQ(ierr);
>  ierr = MatSetType(A, MATMPIBAIJ);
>  ierr = 
> MatMPIBAIJSetPreallocation(A,bs,5,PETSC_NULL,5,PETSC_NULL);CHKERRQ(ierr);
>  ierr = MatSeqBAIJSetPreallocation(A,bs,5,PETSC_NULL);CHKERRQ(ierr);
> 
>  ierr = PetscLogStageRegister("Assembly", &stage);CHKERRQ(ierr);
>  ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
> 
> 
>  if (rank==0)
>  {
>  ierr = MatLoad(A,fd);CHKERRQ(ierr); 
> 
>  }
> 
> ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
> ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
> ierr = PetscLogStagePop();CHKERRQ(ierr);
> ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr);
> 
> /*Trying two types of vector assembly*/
> 
> /* Vector setup Attempt 1*/
> 
> ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
>  ierr = VecSetSizes(x,PETSC_DECIDE,global_row_size);CHKERRQ(ierr);
>  ierr = VecSetFromOptions(x);CHKERRQ(ierr);
>  ierr = VecDuplicate(x,&y);CHKERRQ(ierr);
>  ierr = VecSetFromOptions(y);CHKERRQ(ierr);
>  ierr = VecSet(x,one);CHKERRQ(ierr);
> ierr = VecSet(y,one); CHKERRQ(ierr);
> 
> /*Vector setup Attempt 2*/
> 
> ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr);
> ierr = VecGetSize(x,&global_row_size);CHKERRQ(ierr);
> 
> if (rank==0)
>  {
> 
>  for (i = 0;  i<global_row_size; i++)
>  {
>  ierr = VecSetValues(x,1,&i,one,INSERT_VALUES); 
>  CHKERRQ(ierr);
>  }
> 
>  }
>  ierr = VecDuplicate(x,&y);CHKERRQ(ierr);
>  ierr = VecSetFromOptions(y);CHKERRQ(ierr);
> 
>  ierr = VecAssemblyBegin(x); CHKERRQ(ierr);
>  ierr = VecAssemblyEnd(x); CHKERRQ(ierr);
> 
> 
> 
> /* SpMV*/
> ierr = MatMult(A,x,y);CHKERRQ(ierr);
> 
>  ierr = VecDestroy(&x);CHKERRQ(ierr); 
>  ierr = VecDestroy(&y);CHKERRQ(ierr);
>  ierr = MatDestroy(&A);CHKERRQ(ierr);
> 
> 
> 
> 

Reply via email to