[petsc-users] Setting up MPIBAIJ for MatMult

Steena M stm8086 at yahoo.com
Wed Nov 12 13:32:10 CST 2014


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






More information about the petsc-users mailing list