On Tue, 30 May 2017 13:32:18 -0500, Barry Smith wrote:
Yeah, you have a valid point we really need a MatCreateDense() and a
MatCreateDenseWithArray() like we have for vectors.

    If we simply had a null array to indicate don't allocate space
then uses would ALWAYS need to allocate the space themselves and pass
it in which is annoying because most of the time users want PETSc to
allocate the array.

   In your case can't you create the matrix with the "first" array
from the other code and then after that use MatDensePlaceArray()? Then
MatCreateDense() would not allocate any unneeded space.

I indeed can.

   Barry


On May 30, 2017, at 3:46 AM, Pierre Jolivet <[email protected]> wrote:

Thank you very much. One last thing: with VecCreateMPIWithArray, if I pass a NULL pointer for the array of values, then nothing is done and I need to use VecPlaceArray/VecResetArray. With MatCreateDense, if I pass a NULL pointer for the array of values, then PETSc allocates the memory. Why is there such a difference? Is there a way to create a dense matrix with no storage attached to it (that will of course be then set via MatDensePlaceArray/MatDenseResetArray)?

Thanks,
Pierre

On Mon, 29 May 2017 19:45:27 -0500, Barry Smith wrote:
I have added MatDensePlaceArray() and MatDenseResetArray() in

https://bitbucket.org/petsc/petsc/branch/barry/feature-matdenseplacearray

  Barry

On May 29, 2017, at 3:46 PM, Pierre Jolivet <[email protected]> wrote:


On 29 May 2017, at 22:20, Jed Brown <[email protected]> wrote:

That makes perfect sense (assuming I'm not wrong about the
MatAssemblyBegin/MatAssemblyEnd). MatSetUpMultiply_MPIDense would still
be called at each iteration but I doubt this is too costly.

It creates a VecScatter so it isn't nothing (in terms of parallel
semantics), but I'd like to see profiling data before chasing this
around.

Sure, I'll use that and will look out for any occurrence of "MatDensePlaceArray" (or stuff like that) in the logs, in case it is implemented.
Thanks!


Reply via email to