PETSc:使用 MatCreateSeqBAIJ 和 MatSetValuesBlocked 阻塞矩阵

计算科学 线性代数 矩阵 稀疏矩阵 宠物
2021-12-02 01:16:27

我对 PETSc 的MatSetValuesBlocked. 当我选择小块大小时,下面的代码适用于矩阵,但在对同一矩阵使用更大块大小时会出错。两个主要问题:

1)什么是正确的使用方法MatSetValuesBlocked

2)分别为行块和列块生成idxn和全局索引的正确方法是什么。idxm例如,对于 m=n=20 且块大小 = 2 的矩阵,idxn 和 idxm = {0,1,2,3,4,5,6,7,8,9} 是什么?

不确定其他功能是否有错误,但我想知道我做错了什么!

谢谢!

    MatCreateSeqBAIJ(PETSC_COMM_SELF,bs,m,n,nnz*2/m,0,&A);
    MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_FALSE);
    PetscInt idxm[(m/bs)] ; //row index of total number of blocks
    PetscInt idxn[(m/bs)] ; //column index of total number of blocks

    /*Values from the sparsematrix.mtx file */

    for (i=0; i<nnz; i++) 
    {
     fscanf(file,"%d %d %le\n",&row,&col,(double*)&val);
     values[i] =  val;
    }
    fclose(file);



/*Constructing idxm */ 

   for(m_index=0; m_index< (m/bs); m_index++) //Number of blocks rowwise
   {
        idxm[m_index] = m_index; // For the blocks in the first row

   } //idxm construction complete


 /*Constructing idxn*/



  for(b_index = 0; b_index < (n/bs) ; b_index ++) //Each column for each block
  {
    idxn[b_index] = b_index;

  } //idxn construction complete.

  /*Errors occur..*/
  MatSetValuesBlocked(A,m/bs,idxm,n/bs,idxn, values, INSERT_VALUES);

  MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
  MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

  PetscPrintf(PETSC_COMM_SELF,"Reading matrix completed....\n");

  PetscOptionsGetString(NULL,"-fout",fileout,PETSC_MAX_PATH_LEN,NULL);
  PetscViewerBinaryOpen(PETSC_COMM_WORLD,fileout,FILE_MODE_WRITE,&view);
  MatView(A,view);
  VecView(b,view);

  MatMult(A, b, res); //Actual multiplication

  PetscPrintf(PETSC_COMM_SELF,"Matmult completed...\n");
  PetscViewerDestroy(&view);
  ierr = VecDestroy(&b);CHKERRQ(ierr);
  ierr = MatDestroy(&A);CHKERRQ(ierr);
  ierr = VecDestroy(&res);CHKERRQ(ierr);
  ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
  ierr = PetscFinalize();
1个回答

MatSetValuesBlocked贡献逻辑密集块。鉴于上面显示的模式,您应该在每个块行调用一次。您目前正在调用它,就好像参数是 COO 格式一样。

另请注意,从文件中读取矩阵是一种工作流程选择,可确保您的软件永远不会可扩展。从长远来看,您应该选择一种方法来避免在矩阵组装期间使用文件系统。