Actual source code: ex9.c


  2: static char help[] = "Tests MPI parallel matrix creation. Test MatCreateRedundantMatrix() \n\n";

  4: #include <petscmat.h>

  6: int main(int argc,char **args)
  7: {
  8:   Mat            C,Credundant;
  9:   MatInfo        info;
 10:   PetscMPIInt    rank,size,subsize;
 11:   PetscInt       i,j,m = 3,n = 2,low,high,iglobal;
 12:   PetscInt       Ii,J,ldim,nsubcomms;
 13:   PetscBool      flg_info,flg_mat;
 14:   PetscScalar    v,one = 1.0;
 15:   Vec            x,y;
 16:   MPI_Comm       subcomm;

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

 24:   MatCreate(PETSC_COMM_WORLD,&C);
 25:   MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);
 26:   MatSetFromOptions(C);
 27:   MatSetUp(C);

 29:   /* Create the matrix for the five point stencil, YET AGAIN */
 30:   for (i=0; i<m; i++) {
 31:     for (j=2*rank; j<2*rank+2; j++) {
 32:       v = -1.0;  Ii = j + n*i;
 33:       if (i>0)   {J = Ii - n; MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);}
 34:       if (i<m-1) {J = Ii + n; MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);}
 35:       if (j>0)   {J = Ii - 1; MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);}
 36:       if (j<n-1) {J = Ii + 1; MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);}
 37:       v = 4.0; MatSetValues(C,1,&Ii,1,&Ii,&v,INSERT_VALUES);
 38:     }
 39:   }

 41:   /* Add extra elements (to illustrate variants of MatGetInfo) */
 42:   Ii   = n; J = n-2; v = 100.0;
 43:   MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);
 44:   Ii   = n-2; J = n; v = 100.0;
 45:   MatSetValues(C,1,&Ii,1,&J,&v,INSERT_VALUES);

 47:   MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
 48:   MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);

 50:   /* Form vectors */
 51:   MatCreateVecs(C,&x,&y);
 52:   VecGetLocalSize(x,&ldim);
 53:   VecGetOwnershipRange(x,&low,&high);
 54:   for (i=0; i<ldim; i++) {
 55:     iglobal = i + low;
 56:     v       = one*((PetscReal)i) + 100.0*rank;
 57:     VecSetValues(x,1,&iglobal,&v,INSERT_VALUES);
 58:   }
 59:   VecAssemblyBegin(x);
 60:   VecAssemblyEnd(x);

 62:   MatMult(C,x,y);

 64:   PetscOptionsHasName(NULL,NULL,"-view_info",&flg_info);
 65:   if (flg_info)  {
 66:     PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO);
 67:     MatView(C,PETSC_VIEWER_STDOUT_WORLD);

 69:     MatGetInfo(C,MAT_GLOBAL_SUM,&info);
 70:     PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"matrix information (global sums):\nnonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n",(PetscInt)info.nz_used,(PetscInt)info.nz_allocated);
 71:     MatGetInfo (C,MAT_GLOBAL_MAX,&info);
 72:     PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"matrix information (global max):\nnonzeros = %" PetscInt_FMT ", allocated nonzeros = %" PetscInt_FMT "\n",(PetscInt)info.nz_used,(PetscInt)info.nz_allocated);
 73:   }

 75:   PetscOptionsHasName(NULL,NULL,"-view_mat",&flg_mat);
 76:   if (flg_mat) {
 77:     MatView(C,PETSC_VIEWER_STDOUT_WORLD);
 78:   }

 80:   /* Test MatCreateRedundantMatrix() */
 81:   nsubcomms = size;
 82:   PetscOptionsGetInt(NULL,NULL,"-nsubcomms",&nsubcomms,NULL);
 83:   MatCreateRedundantMatrix(C,nsubcomms,MPI_COMM_NULL,MAT_INITIAL_MATRIX,&Credundant);
 84:   MatCreateRedundantMatrix(C,nsubcomms,MPI_COMM_NULL,MAT_REUSE_MATRIX,&Credundant);

 86:   PetscObjectGetComm((PetscObject)Credundant,&subcomm);
 87:   MPI_Comm_size(subcomm,&subsize);

 89:   if (subsize==2 && flg_mat) {
 90:     PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_(subcomm),"\n[%d] Credundant:\n",rank);
 91:     MatView(Credundant,PETSC_VIEWER_STDOUT_(subcomm));
 92:   }
 93:   MatDestroy(&Credundant);

 95:   /* Test MatCreateRedundantMatrix() with user-provided subcomm */
 96:   {
 97:     PetscSubcomm psubcomm;

 99:     PetscSubcommCreate(PETSC_COMM_WORLD,&psubcomm);
100:     PetscSubcommSetNumber(psubcomm,nsubcomms);
101:     PetscSubcommSetType(psubcomm,PETSC_SUBCOMM_CONTIGUOUS);
102:     /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
103:     PetscSubcommSetFromOptions(psubcomm);

105:     MatCreateRedundantMatrix(C,nsubcomms,PetscSubcommChild(psubcomm),MAT_INITIAL_MATRIX,&Credundant);
106:     MatCreateRedundantMatrix(C,nsubcomms,PetscSubcommChild(psubcomm),MAT_REUSE_MATRIX,&Credundant);

108:     PetscSubcommDestroy(&psubcomm);
109:     MatDestroy(&Credundant);
110:   }

112:   VecDestroy(&x);
113:   VecDestroy(&y);
114:   MatDestroy(&C);
115:   PetscFinalize();
116:   return 0;
117: }

119: /*TEST

121:    test:
122:       nsize: 3
123:       args: -view_info

125:    test:
126:       suffix: 2
127:       nsize: 3
128:       args: -nsubcomms 2 -view_mat -psubcomm_type interlaced

130:    test:
131:       suffix: 3
132:       nsize: 3
133:       args: -nsubcomms 2 -view_mat -psubcomm_type contiguous

135:    test:
136:       suffix: 3_baij
137:       nsize: 3
138:       args: -mat_type baij -nsubcomms 2 -view_mat

140:    test:
141:       suffix: 3_sbaij
142:       nsize: 3
143:       args: -mat_type sbaij -nsubcomms 2 -view_mat

145:    test:
146:       suffix: 3_dense
147:       nsize: 3
148:       args: -mat_type dense -nsubcomms 2 -view_mat

150:    test:
151:       suffix: 4_baij
152:       nsize: 3
153:       args: -mat_type baij -nsubcomms 2 -view_mat -psubcomm_type interlaced

155:    test:
156:       suffix: 4_sbaij
157:       nsize: 3
158:       args: -mat_type sbaij -nsubcomms 2 -view_mat -psubcomm_type interlaced

160:    test:
161:       suffix: 4_dense
162:       nsize: 3
163:       args: -mat_type dense -nsubcomms 2 -view_mat -psubcomm_type interlaced

165: TEST*/