i've been preallocating the full matrix
const PetscScalar zerotol = 1.e-6;
PetscInt M,N,m,n;
ierr = MatGetSize(MatDense,&M,&N);CHKERRQ(ierr);
ierr = MatGetLocalSize(MatDense,&m,&n);CHKERRQ(ierr);
ierr = MatCreateMPIAIJ(PETSC_COMM_WORLD,m,n,M,N,n,PETSC_NULL,
N-n,PETSC_NULL,&SparseMat);CHKERRQ(ierr);
and when I convert I try to get only the non-zero entries
const PetscScalar *vwork;
const PetscInt *cwork;
PetscInt Istart,Iend, nz;
ierr=PetscPrintf(PETSC_COMM_WORLD,
" Converting...\n");CHKERRQ(ierr);
ierr = MatGetOwnershipRange(MatDense,&Istart,&Iend);CHKERRQ(ierr);
for (PetscInt Ii=Istart; Ii<Iend; Ii++) {
ierr = MatGetRow(MatDense,Ii,&nz,&cwork,&vwork);CHKERRQ(ierr);
for (PetscInt Jj=0; Jj<nz; Jj++) {
//ierr =
MatSetValues(SparseMat,1,&Ii,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr);
if( std::abs(vwork[Jj]) > zerotol ) {
MatSetValue(SparseMat ,Ii,cwork[Jj],vwork[Jj],INSERT_VALUES);
}
}
ierr = MatRestoreRow(MatDense,Ii,&nz,&cwork,&vwork);CHKERRQ(ierr);
}
ierr=PetscPrintf(PETSC_COMM_WORLD,
" Assembling...\n");CHKERRQ(ierr);
ierr = MatAssemblyBegin(SparseMat ,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
ierr = MatAssemblyEnd( SparseMat ,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
I haven't gotten a chance to look further into it, but I'm not sure if the
if( std::abs(vwork[Jj]) > zerotol ) {
MatSetValue(SparseMat ,Ii,cwork[Jj],vwork[Jj],INSERT_VALUES);
}
helps performance w/ future calls to matmatmult_mpiaij_mpiaij as
I would suspect...
df
On Sun, 5 Apr 2009, Yujie wrote:
>
> Dear David:
>
> Thank you very much for your help. I tried to do this. However, there is not
> MatConvert_MPIDense() to convert dense
> matrix to aij format. Maybe, the possible method is to create new aij matrix
> and copy the data into new matrix.
> Thanks.
>
> Regards,
>
> Yujie
>
>
> On Sun, Apr 5, 2009 at 1:48 PM, David Fuentes <fuentesdt at gmail.com> wrote:
> Hi Yujie,
>
>
> as a work around have you tried converting your dense
> matrices to aij format and using MatMatMult_MPIAIJ_MPIAIJ()??
>
>
>
>
> df
>
>
>
>
>
>
>
> On Fri, 3 Apr 2009, Yujie wrote:
>
>
> Dear Barry:
>
> I am trying to debug the codes you have written with ex123.c.
> After commenting the error
> output
> (SETERRQ(PETSC_ERR_LIB,"Due to aparent bugs in PLAPACK,this is
> not currently supported");)
> in
> MatMatMultSymbolic_MPIDense_MPIDense().?
>
> The errors I got is "Caught signal number 11 SEGV: Segmentation
> Violation". It takes place
> in
> ?"PLA_Obj_set_to_zero(lu->A);" in?
>
> MatMPIDenseCopyToPlapack().?
>
> To my understanding, if you want to set "lu->A" to zero, you
> first assign memory to "lu->A".
> However, I can't find
> which function you do this in? Could you give me some advice?
> thanks a lot.
>
> Regards,
>
> Yujie
>
>
> On Thu, Apr 2, 2009 at 8:02 PM, Barry Smith <bsmith at
> mcs.anl.gov> wrote:
>
> ? ? ?On Apr 2, 2009, at 9:19 PM, Yujie wrote:
>
> ? ? ? ? ? ?Hi, PETSc Developers
>
> ? ? ? ? ? ?I am wondering whether MatMatMult_MPIDense_MPIDense()
> works currently based on
> PLAPACK?
> ? ? ? ? ? ?Thanks a lot.
>
>
> ?No, if you run it you will see it print an error message.
>
> ?I tried to debug PLAPACK to determine the problem but it was
> awfully complicated and had to
> give up.
> Certainly someone else
> could try to debug PLAPACK to determine the problem. PLAPACK is
> not supported so
> unfortunately there is no one
> to complain to about it and you'd have to fix it yourself.
>
> ?Barry
>
>
>
> ? ? ?Regards,
>
> ? ? ?Yujie
>
>
>
>
>
>
>