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; PetscInt i,j,m = 3,n; PetscMPIInt size; PetscBool mat_nonsymmetric = PETSC_FALSE,flg; MatInfo info; PetscCall(PetscInitialize(&argc,&args,(char*)0,help)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); n = 2*size; /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */ PetscCall(PetscOptionsGetBool(NULL,NULL,"-mat_nonsym",&mat_nonsymmetric,NULL)); PetscCall(MatCreate(PETSC_COMM_WORLD,&C)); PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); PetscCall(MatSetFromOptions(C)); PetscCall(MatSeqAIJSetPreallocation(C,5,NULL)); PetscCall(MatMPIAIJSetPreallocation(C,5,NULL,5,NULL)); PetscCall(MatGetOwnershipRange(C,&Istart,&Iend)); for (Ii=Istart; Ii0) {J = Ii - n; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} if (i0) {J = Ii - 1; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} if (j1) {J = Ii-n-1; PetscCall(MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES));} } } else { PetscCall(MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE)); PetscCall(MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE)); } PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY)); PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY)); PetscCall(PetscObjectSetName((PetscObject)C,"C")); PetscCall(MatViewFromOptions(C,NULL,"-view")); /* C1 = 2.0*C1 + C, C1 is anti-diagonal and has different non-zeros than C */ PetscCall(MatCreate(PETSC_COMM_WORLD,&C1)); PetscCall(MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n)); PetscCall(MatSetFromOptions(C1)); PetscCall(MatSeqAIJSetPreallocation(C1,1,NULL)); PetscCall(MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL)); for (Ii=Istart; Ii