static char help[] = "Test MatAXPY()\n\n"; #include int main(int argc,char **args) { Mat C,C1,C2,CU; PetscScalar v; PetscInt Ii,J,Istart,Iend; PetscErrorCode ierr; PetscInt i,j,m = 3,n; PetscMPIInt size; PetscBool mat_nonsymmetric = PETSC_FALSE,flg; MatInfo info; ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); n = 2*size; /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */ CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-mat_nonsym",&mat_nonsymmetric,NULL)); CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C)); CHKERRQ(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); CHKERRQ(MatSetFromOptions(C)); CHKERRQ(MatSeqAIJSetPreallocation(C,5,NULL)); CHKERRQ(MatMPIAIJSetPreallocation(C,5,NULL,5,NULL)); CHKERRQ(MatGetOwnershipRange(C,&Istart,&Iend)); for (Ii=Istart; Ii0) {J = Ii - n; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} if (i0) {J = Ii - 1; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} if (j1) {J = Ii-n-1; CHKERRQ(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} } } else { CHKERRQ(MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE)); CHKERRQ(MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE)); } CHKERRQ(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); CHKERRQ(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); CHKERRQ(PetscObjectSetName((PetscObject)C,"C")); CHKERRQ(MatViewFromOptions(C,NULL,"-view")); /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */ CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C1)); CHKERRQ(MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); CHKERRQ(MatSetFromOptions(C1)); CHKERRQ(MatSeqAIJSetPreallocation(C1,1,NULL)); CHKERRQ(MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL)); for (Ii=Istart; Ii