Actual source code: ex12.c

  1: /*$Id: ex12.c,v 1.29 2001/08/07 03:03:07 balay Exp $*/

  3: static char help[] = "Tests the use of MatZeroRows() for parallel matrices.n
  4: This example also tests the use of MatDuplicate() for both MPIAIJ and MPIBAIJ matrices";

 6:  #include petscmat.h

  8: EXTERN int TestMatZeroRows_Basic(Mat,IS,PetscScalar *);
  9: EXTERN int TestMatZeroRows_with_no_allocation(Mat,IS,PetscScalar *);

 11: int main(int argc,char **args)
 12: {
 13:   Mat         A;
 14:   int         i,j,m = 3,n,rank,size,I,J,ierr,Imax;
 15:   PetscScalar v,diag=-4.0;
 16:   IS          is;

 18:   PetscInitialize(&argc,&args,(char *)0,help);
 19:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 20:   MPI_Comm_size(PETSC_COMM_WORLD,&size);
 21:   n = 2*size;

 23:   /* create A Square matrix for the five point stencil,YET AGAIN*/
 24:   MatCreate(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n,&A);
 25:   MatSetFromOptions(A);
 26:   for (i=0; i<m; i++) {
 27:     for (j=2*rank; j<2*rank+2; j++) {
 28:       v = -1.0;  I = j + n*i;
 29:       if (i>0)   {J = I - n; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 30:       if (i<m-1) {J = I + n; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 31:       if (j>0)   {J = I - 1; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 32:       if (j<n-1) {J = I + 1; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 33:       v = 4.0; MatSetValues(A,1,&I,1,&I,&v,INSERT_VALUES);
 34:     }
 35:   }
 36:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 37:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

 39:   /* Create AN IS required by MatZeroRows() */
 40:   Imax = n*rank; if (Imax>= n*m -m - 1) Imax = m*n - m - 1;
 41:   ISCreateStride(PETSC_COMM_SELF,m,Imax,1,&is);

 43:   TestMatZeroRows_Basic(A,is,PETSC_NULL);
 44:   TestMatZeroRows_Basic(A,is,&diag);

 46:   TestMatZeroRows_with_no_allocation(A,is,PETSC_NULL);
 47:   TestMatZeroRows_with_no_allocation(A,is,&diag);

 49:   MatDestroy(A);

 51:   /* Now Create a rectangular matrix with five point stencil (app) 
 52:    n+size is used so that this dimension is always divisible by size.
 53:    This way, we can always use bs = size for any number of procs */
 54:   MatCreate(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,m*n,m*(n+size),&A);
 55:   MatSetFromOptions(A);
 56:   for (i=0; i<m; i++) {
 57:     for (j=2*rank; j<2*rank+2; j++) {
 58:       v = -1.0;  I = j + n*i;
 59:       if (i>0)   {J = I - n; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 60:       if (i<m-1) {J = I + n; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 61:       if (j>0)   {J = I - 1; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 62:       if (j<n+size-1) {J = I + 1; MatSetValues(A,1,&I,1,&J,&v,INSERT_VALUES);}
 63:       v = 4.0; MatSetValues(A,1,&I,1,&I,&v,INSERT_VALUES);
 64:     }
 65:   }
 66:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 67:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);

 69:   TestMatZeroRows_Basic(A,is,PETSC_NULL);
 70:   TestMatZeroRows_Basic(A,is,&diag);

 72:   MatDestroy(A);
 73:   ISDestroy(is);
 74:   PetscFinalize();
 75:   return 0;
 76: }

 78: int TestMatZeroRows_Basic(Mat A,IS is,PetscScalar *diag)
 79: {
 80:   Mat        B;
 81:   int        ierr;
 82:   PetscTruth keepzeroedrows;

 84:   /* Now copy A into B, and test it with MatZeroRows() */
 85:   MatDuplicate(A,MAT_COPY_VALUES,&B);

 87:   PetscOptionsHasName(PETSC_NULL,"-keep_zeroed_rows",&keepzeroedrows);
 88:   if (keepzeroedrows) {
 89:     MatSetOption(B,MAT_KEEP_ZEROED_ROWS);
 90:   }

 92:   MatZeroRows(B,is,diag);
 93:   MatView(B,PETSC_VIEWER_STDOUT_WORLD);
 94:   MatDestroy(B);
 95:   return 0;
 96: }

 98: int TestMatZeroRows_with_no_allocation(Mat A,IS is,PetscScalar *diag)
 99: {
100:   Mat         B;
101:   int         ierr;

103:   /* Now copy A into B, and test it with MatZeroRows() */
104:   MatDuplicate(A,MAT_COPY_VALUES,&B);
105:   /* Set this flag after assembly. This way, it affects only MatZeroRows() */
106:   MatSetOption(B,MAT_NEW_NONZERO_ALLOCATION_ERR);

108:   MatZeroRows(B,is,diag);
109:   MatView(B,PETSC_VIEWER_STDOUT_WORLD);
110:   MatDestroy(B);
111:   return 0;
112: }