#include /*I "petscmat.h" I*/ PetscErrorCode MatMult_Centering(Mat A,Vec xx,Vec yy) { PetscScalar *y; const PetscScalar *x; PetscScalar sum,mean; PetscInt i,m=A->rmap->n,size; PetscFunctionBegin; PetscCall(VecSum(xx,&sum)); PetscCall(VecGetSize(xx,&size)); mean = sum / (PetscScalar)size; PetscCall(VecGetArrayRead(xx,&x)); PetscCall(VecGetArray(yy,&y)); for (i=0; iops->mult = MatMult_Centering; (*C)->assembled = PETSC_TRUE; (*C)->preallocated = PETSC_TRUE; (*C)->symmetric = PETSC_BOOL3_TRUE; (*C)->symmetry_eternal = PETSC_TRUE; (*C)->structural_symmetry_eternal = PETSC_TRUE; PetscCall(MatSetUp(*C)); PetscFunctionReturn(0); }