General matrix interative solver
Julian
julvar at tamu.edu
Thu Oct 12 19:16:24 CDT 2006
Ok, so this is what I am doing now... And I still get the same result. It goes very slowly till the 200th MAT_FLUSH_ASSEMBLY call and then just stays there... The output that I gave u earlier is the complete output its been giving for the following code:
Mat mat;
PetscInitialize(0,0,"petscOptions.txt",0);
int i;
int *nnz;
nnz=new int[L];
for(i=0;i<L;i++){
nnz[i]=row[i].getNum();
}
MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT, nnz, &mat);
delete [] nnz;
Maybe it is not giving the output you are requiring because the program never gets to the point where MAT_FINAL_ASSEMBLY is called.
Now, when I do a MAT_FINAL_ASSEMBLY call right after the preallocation, then I get a different output
Mat mat;
PetscInitialize(0,0,"petscOptions.txt",0);
int i;
int *nnz;
nnz=new int[L];
for(i=0;i<L;i++){
nnz[i]=row[i].getNum();
}
MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT, nnz, &mat);
MatAssemblyBegin(mat, MAT_FINAL_ASSEMBLY); // <-----------------
MatAssemblyEnd(mat, MAT_FINAL_ASSEMBLY); // <-----------------
delete [] nnz;
This is what I get :
[0] PetscInitializePETSc successfully started: number of processors = 1
[0] PetscGetHostNameRejecting domainname, likely is NIS ALPHA2.☺0☺
[0] PetscInitializeRunning on machine: ALPHA2
[0] PetscCommDuplicateDuplicating a communicator 1 1 max tags = 100000000
[0] MatAssemblyEnd_SeqSBAIJMatrix size: 14883 X 14883, block size 1; storage spa
ce: 1040055 unneeded, 0 used
[0] MatAssemblyEnd_SeqSBAIJNumber of mallocs during MatSetValues is 0
[0] MatAssemblyEnd_SeqSBAIJMost nonzeros blocks in any row is 0
In this case, the assembly goes very fast TILL the 200th MAT_FLUSH_ASSEMBLY call and THEN gets stuck!
> -----Original Message-----
> From: owner-petsc-users at mcs.anl.gov
> [mailto:owner-petsc-users at mcs.anl.gov] On Behalf Of Satish Balay
> Sent: Thursday, October 12, 2006 6:46 PM
> To: petsc-users at mcs.anl.gov
> Subject: RE: General matrix interative solver
>
> On Thu, 12 Oct 2006, Julian wrote:
>
> > I am now using MatCreateSeqSBAIJ() - I am assuming the second
> > parameter bs=1 in my case because I am using one processor. Is that
> > correct ?
>
> No - it refers to a blocksize. The matrix could have a block
> structure. In this case - the correct blocksize can be
> specified. The matrix operations will exploit this block
> structure for better performance.
>
> bs=1 is a fine [This is the equivalent of AIJ type in the
> block notation]
>
> > The method of creating a matrix I used was taken from Pavel Solin's
> > book 'Partial Differential Equations and the finite Element
> Method'.
> > Is there any particular reason why is should follow this
> > method:
> > mat = (double*)malloc(sizeof(Mat))
> > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT, nnz,
> > (Mat*)mat); In the examples that I have seen in the petsc website I
> > don't see this statement where memory is allocated.
>
> No - you should just use PETSc example codes a guidelines. i.e
>
> Mat mat;
> MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L, PETSC_DEFAULT,
> nnz, &mat);
>
> Mat is just a pointer - and all the memory allocation
> required is done inside XXXCreate() routines.
>
> > Anyway, I changed my code to the following:
> > PetscInitialize(0,0,"petscOptions.txt",0);
> >
> > int i;
> > int *nnz;
> > nnz=new int[L];
> > for(i=0;i<L;i++){
> > nnz[i]=row[i].getNum();
> > }
> >
> > Assert( mat = (double*)malloc(sizeof(Mat)) );
> > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L,
> PETSC_DEFAULT, nnz, (Mat*)mat);
> > delete [] nnz;
>
> > And I'm still getting stuck at the same place... There is a
> difference
> > though.. Now the assembly process is even slower than before (when
> > there was no preallocation) I noticed that it is getting
> stuck around
> > the 200th MAT_FLUSH_ASSEMBLY call.. I don't know if that is
> > significant.Is there some limit on how many times
> MAT_FLUSH_ASSEMBLY
> > can be called ?
>
> MAT_FLUSH_ASSEMBLY is cheap - in sequential mode - but
> expensive in parallel mode [becasue of parallel
> syncronization]. However ...
>
> > This is the petsc output I get:
> > [0] PetscInitializePETSc successfully started: number of
> processors =
> > 1 [0] PetscGetHostNameRejecting domainname, likely is NIS
> ALPHA2.ÿÿ0ÿÿ
> > [0] PetscInitializeRunning on machine: ALPHA2 [0]
> > PetscCommDuplicateDuplicating a communicator 1 1 max tags =
> 100000000
>
> The above log is incomplete. You should be looking for lines
> with the string 'malloc'
>
> Satish
>
> >
> > I also tried this :
> > mat = new Mat;
> > MatCreateSeqSBAIJ(PETSC_COMM_SELF, 1, L, L,
> PETSC_DEFAULT, nnz, mat);
> >
> > And got the same performance.
>
More information about the petsc-users
mailing list