int main(int argc,char **args) { Mat A; PetscErrorCode ierr; PetscReal *norms; char file[PETSC_MAX_PATH_LEN]; PetscBool flg; PetscViewer fd; PetscInt n; PetscMPIInt rank; PetscInitialize(&argc,&args,(char *)0,help); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); ierr = PetscOptionsGetString(PETSC_NULL,"-f",file,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER,"Must indicate binary file with the -f option"); ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd);CHKERRQ(ierr); ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatLoad(A,fd);CHKERRQ(ierr); ierr = PetscViewerDestroy(&fd);CHKERRQ(ierr); ierr = MatGetSize(A,PETSC_NULL,&n);CHKERRQ(ierr); ierr = PetscMalloc(n*sizeof(PetscReal),&norms);CHKERRQ(ierr); ierr = MatGetColumnNorms(A,NORM_2,norms);CHKERRQ(ierr); if (!rank) { ierr = PetscRealView(n,norms,PETSC_VIEWER_STDOUT_SELF);CHKERRQ(ierr); } ierr = PetscFree(norms);CHKERRQ(ierr); ierr = MatDestroy(&A);CHKERRQ(ierr); ierr = PetscFinalize(); return 0; }
static PetscErrorCode getSumSquares(Mat matrix, double *diag) { PetscErrorCode ierr; int i, j; double *sumr, *sumc; PetscInt n, mLocal, nLocal, low, high; PetscReal *aux; PetscFunctionBegin; ierr = MatGetSize(matrix, NULL, &n); CHKERRQ(ierr); ierr = MatGetLocalSize(matrix, &mLocal, &nLocal); CHKERRQ(ierr); sumr = diag; sumc = &diag[mLocal]; ierr = PetscMalloc1(n, &aux); CHKERRQ(ierr); ierr = MatGetColumnNorms(matrix, NORM_2, aux); CHKERRQ(ierr); ierr = MatGetOwnershipRangeColumn(matrix, &low, &high);CHKERRQ(ierr); for (i=low; i<high; i++) { sumc[i-low] = aux[i]*aux[i]; } ierr = PetscFree(aux); CHKERRQ(ierr); ierr = MatGetOwnershipRange(matrix, &low, &high); CHKERRQ(ierr); for (i=low; i<high; i++) { PetscInt ncols; const PetscInt *cols; const PetscScalar *vals; sumr[i-low] = 0.0; ierr = MatGetRow(matrix, i, &ncols, &cols, &vals); CHKERRQ(ierr); for (j = 0; j < ncols; j++) { sumr[i-low] += PetscRealPart(vals[j]*PetscConj(vals[j])); } ierr = MatRestoreRow(matrix, i, &ncols, &cols, &vals); CHKERRQ(ierr); } PetscFunctionReturn(0); }