diff -r e4955d4ce21b src/mat/interface/matrix.c --- a/src/mat/interface/matrix.c Thu Jul 19 14:23:12 2012 -0500 +++ b/src/mat/interface/matrix.c Fri Jul 20 11:17:30 2012 +0200 @@ -2180,6 +2180,7 @@ PetscErrorCode MatMultHermitianTranspose(Mat mat,Vec x,Vec y) { PetscErrorCode ierr; + Vec w; PetscFunctionBegin; PetscValidHeaderSpecific(mat,MAT_CLASSID,1); @@ -2196,9 +2197,17 @@ #endif MatCheckPreallocated(mat,1); - if (!mat->ops->multhermitiantranspose) SETERRQ1(((PetscObject)mat)->comm,PETSC_ERR_SUP,"Mat type %s",((PetscObject)mat)->type_name); ierr = PetscLogEventBegin(MAT_MultHermitianTranspose,mat,x,y,0);CHKERRQ(ierr); - ierr = (*mat->ops->multhermitiantranspose)(mat,x,y);CHKERRQ(ierr); + if (mat->ops->multhermitiantranspose) { + ierr = (*mat->ops->multhermitiantranspose)(mat,x,y);CHKERRQ(ierr); + } else { + ierr = VecDuplicate(x,&w);CHKERRQ(ierr); + ierr = VecCopy(x,w);CHKERRQ(ierr); + ierr = VecConjugate(w);CHKERRQ(ierr); + ierr = MatMultTranspose(mat,w,y);CHKERRQ(ierr); + ierr = VecDestroy(&w);CHKERRQ(ierr); + ierr = VecConjugate(y);CHKERRQ(ierr); + } ierr = PetscLogEventEnd(MAT_MultHermitianTranspose,mat,x,y,0);CHKERRQ(ierr); ierr = PetscObjectStateIncrease((PetscObject)y);CHKERRQ(ierr); PetscFunctionReturn(0);