I am fine with you giving this a try. I fear it mostly just moves the complications from one (several :-)) places to a different place but.
Barry > On Dec 1, 2018, at 2:47 PM, Hapla Vaclav <vaclav.ha...@erdw.ethz.ch> wrote: > > Yes, that means that a significant part of MatShell logic would become > default implementations. But I would now do that only with MatDiagonalScale > as a proof-of-concept - then we can progressively do the same with the > others. At some point it could happen even with axpy - I think it would be > cool although more a complex task as you say. > > Vaclav > >> 1. 12. 2018 v 21:31, Smith, Barry F. <bsm...@mcs.anl.gov>: >> >> >> So basically hoist most of the data structure >> >> typedef struct { >> struct _MatShellOps ops[1]; >> >> PetscScalar vscale,vshift; >> Vec dshift; >> Vec left,right; >> Vec left_work,right_work; >> Vec left_add_work,right_add_work; >> Mat axpy; >> PetscScalar axpy_vscale; >> PetscBool managescalingshifts; /* The user will manage >> the scaling and shifts for the MATSHELL, not the default */ >> void *ctx; >> } Mat_Shell; >> >> into Mat? MatShell handles the axpy (which is nasty), would you handle >> that as well, if not then you still have code duplication between the >> MatShell implementations and the Mat___Basic implementations. If it wasn't >> for the axpy I would say it is worth trying but including correctly the axpy >> (I am not sure if it is always handled correctly for MatShell) requires >> complex code. >> >> >> Barry >> >> >>> On Dec 1, 2018, at 1:49 PM, Hapla Vaclav <vaclav.ha...@erdw.ethz.ch> wrote: >>> >>> MatDiagonalScale_Shell, MatDiagonalScale_Normal, >>> MatDiagonalScaleHermitian_Normal and perhaps some others are essentially >>> the same. >>> >>> What about converting them into one MatDiagonalScale_Basic which would be >>> the default implementation if no type-specific implementation is provided? >>> >>> I'm asking because I wanted to add the same to MATTRANSPOSE. But with my >>> proposal, this redundancy would be removed and additionally >>> MatDiagonalScale() would work for any current or future MatType while it >>> doesn't prevent providing an optimised version for explicit matrix types. >>> >>> Note the same could be done for MatScale, MatShift, MatDiagonalSet and >>> maybe some others. >>> >>> I also think such approach would promote using such high-level API >>> functions in higher PETSc layers and user codes because one wouldn't have >>> to be afraid those methods might not be implemented in input matrices. >>> >>> Thanks for opinions >>> >>> Vaclav >> >