Date: 2013-07-02T14:44:19+00:00

Actual source code: ex134.c
petsc-3.4.2 2013-07-02

      1: static const char help[] = "Test parallel assembly of SBAIJ matrices\n\n";

      3: #include <petscmat.h>

      7: PetscErrorCode Assemble(MPI_Comm comm,PetscInt bs,MatType mtype)
      8: {
      9:   const PetscInt    rc[]   = {0,1,2,3};
     10:   const PetscScalar vals[] = {1, 2, 3, 4, 5, 6, 7, 8,
     11:                               9,10,11,12,13,14,15,16,
     12:                               17,18,19,20,21,22,23,24,
     13:                               25,26,27,28,29,30,31,32,
     14:                               33,34,35,36,37,38,39,40,
     15:                               41,42,43,44,45,46,47,48,
     16:                               49,50,51,52,53,54,55,56,
     17:                               57,58,49,60,61,62,63,64};
     18:   Mat               A;
     19:   PetscViewer       viewer;
     20:   PetscErrorCode    ierr;

     23:   MatCreate(comm,&A);
     24:   MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,4*bs,4*bs);
     25:   MatSetType(A,mtype);
     26:   MatMPIBAIJSetPreallocation(A,bs,2,NULL,2,NULL);
     27:   MatMPISBAIJSetPreallocation(A,bs,2,NULL,2,NULL);
     28:   MatSetOption(A,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE);
     29:   /* All processes contribute a global matrix */
     30:   MatSetValuesBlocked(A,4,rc,4,rc,vals,ADD_VALUES);
     31:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
     32:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
     33:   PetscPrintf(comm,"Matrix %s(%D)\n",mtype,bs);
     34:   PetscViewerASCIIGetStdout(comm,&viewer);
     35:   PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO_DETAIL);
     36:   MatView(A,viewer);
     37:   PetscViewerPopFormat(viewer);
     38:   MatView(A,viewer);
     39:   MatDestroy(&A);
     40:   return(0);
     41: }

     45: int main(int argc,char *argv[])
     46: {
     48:   MPI_Comm       comm;
     49:   PetscMPIInt    size;

     51:   PetscInitialize(&argc,&argv,NULL,help);
     52:   comm = PETSC_COMM_WORLD;
     53:   MPI_Comm_size(comm,&size);
     54:   if (size != 2) SETERRQ(comm,PETSC_ERR_USER,"This example must be run with exactly two processes");
     55:   Assemble(comm,2,MATMPIBAIJ);
     56:   Assemble(comm,2,MATMPISBAIJ);
     57:   Assemble(comm,1,MATMPIBAIJ);
     58:   Assemble(comm,1,MATMPISBAIJ);
     59:   PetscFinalize();
     60:   return 0;
     61: }