Yep! Looks good. One other thing is that you can pre/postface all PETSc calls with ierr = ... CHKERRQ(ierr); and it will properly trace other problems if they arise.
- Peter On Thu, Jun 26, 2014 at 8:56 PM, Arthur Kurlej <[email protected]> wrote: > Hello, > > I'm sorry, but this is a bit new for me, and I'm still not quite sure I > follow. > > Are you recommending that opposed to doing this: > if(procs!=1){ > for(i=0;i<procs;i++){ > if(rank==i){ > VecGetLocalSize(*x,&length); > VecGetOwnershipRange(*x,&div,NULL); > ISCreateStride(PETSC_COMM_WORLD,length,div+begin,1,&iscol); > ISCreateStride(PETSC_COMM_WORLD,length,div+begin,1,&isrow); > ierr = MatGetSubMatrix(*A,isrow,iscol,MAT_INITIAL_MATRIX,AA); > CHKERRQ(ierr); > } > } > } > else{ > ISCreateStride(PETSC_COMM_SELF,final_size,begin,1,&iscol); > ISCreateStride(PETSC_COMM_SELF,final_size,begin,1,&isrow); > ierr = MatGetSubMatrix(*A,isrow,iscol,MAT_INITIAL_MATRIX,AA); > CHKERRQ(ierr); > } > > > The proper implementation would instead just be the following: > VecGetLocalSize(*x,&length); > VecGetOwnershipRange(*x,&div,NULL); > ISCreateStride(PETSC_COMM_WORLD,length,div+begin,1,&iscol); > ISCreateStride(PETSC_COMM_WORLD,length,div+begin,1,&isrow); > ierr = MatGetSubMatrix(*A,isrow,iscol,MAT_INITIAL_MATRIX,AA); > CHKERRQ(ierr); > ? > > > > > > On Thu, Jun 26, 2014 at 5:32 PM, Peter Brune <[email protected]> wrote: > >> MatGetSubMatrix() is collective on Mat and ISCreateXXX is collective on >> the provided comm, so the logic you have built to call it on one proc at a >> time is unnecessary at best and most likely incorrect and likely to produce >> strange results. You can forgo the if statement and loop over processors, >> create the ISes on the same comm as x, and then call MatGetSubMatrix() once. >> >> - Peter >> >> >> On Thu, Jun 26, 2014 at 4:26 PM, Arthur Kurlej <[email protected]> wrote: >> >>> I cannot send the original code, but I reproduced the problem in another >>> code. I have attached a makefile the code, and the data for the x vector >>> and A matrix. >>> >>> I think the problem may be with my ShortenMatrix function, but it's not >>> clear to me what exactly is going wrong and how to fix it. So I would >>> appreciate some assistance there. >>> >>> >>> Thanks, >>> Arthur >>> >>> >>> >>> On Wed, Jun 25, 2014 at 6:24 PM, Barry Smith <[email protected]> wrote: >>> >>>> >>>> Can you send the code that reproduces this behavior? >>>> >>>> Barry >>>> >>>> On Jun 25, 2014, at 4:37 PM, Arthur Kurlej <[email protected]> wrote: >>>> >>>> > Hi Barry, >>>> > >>>> > So for the matrix C that I am currently testing (size 162x162), the >>>> condition number is roughly 10^4. >>>> > >>>> > For reference, I'm porting MATLAB code into PETSc, and for one >>>> processor, the PETSc b vector is roughly equivalent to the MATLAB b vector. >>>> So I know that for one processor, my program is performing as expected. >>>> > >>>> > I've included examples below of values for b (also of size 162), >>>> ranging from indices 131 to 141. >>>> > >>>> > #processors=1: >>>> > 0 >>>> > 1.315217173959314e-20 >>>> > 1.315217173959314e-20 >>>> > 4.843201487740107e-17 >>>> > 4.843201487740107e-17 >>>> > 8.166104700666665e-14 >>>> > 8.166104700666665e-14 >>>> > 6.303834267553249e-11 >>>> > 6.303834267553249e-11 >>>> > 2.227932688485483e-08 >>>> > 2.227932688485483e-08 >>>> > >>>> > # processors=2: >>>> > 5.480410831461926e-22 >>>> > 2.892553944350444e-22 >>>> > 2.892553944350444e-22 >>>> > 7.524038923310717e-24 >>>> > 7.524038923214420e-24 >>>> > -3.340766769043093e-26 >>>> > -7.558372155761972e-27 >>>> > 5.551561288838557e-25 >>>> > 5.550551546879874e-25 >>>> > -1.579397982093437e-22 >>>> > 2.655766754178065e-22 >>>> > >>>> > # processors = 4: >>>> > 5.480410831461926e-22 >>>> > 2.892553944351728e-22 >>>> > 2.892553944351728e-22 >>>> > 7.524092205125593e-24 >>>> > 7.524092205125593e-24 >>>> > -2.584939414228212e-26 >>>> > -2.584939414228212e-26 >>>> > 0 >>>> > 0 >>>> > -1.245940797657998e-23 >>>> > -1.245940797657998e-23 >>>> > >>>> > # processors = 8: >>>> > 5.480410831461926e-22 >>>> > 2.892553944023035e-22 >>>> > 2.892553944023035e-22 >>>> > 7.524065744581494e-24 >>>> > 7.524065744581494e-24 >>>> > -2.250265175188197e-26 >>>> > -2.250265175188197e-26 >>>> > -6.543127892265160e-26 >>>> > 1.544288143499193e-317 >>>> > 8.788794008375919e-25 >>>> > 8.788794008375919e-25 >>>> > >>>> > >>>> > Thanks, >>>> > Arthur >>>> > >>>> > >>>> > >>>> > On Wed, Jun 25, 2014 at 4:06 PM, Barry Smith <[email protected]> >>>> wrote: >>>> > >>>> > How different are the values in b? Can you send back a few >>>> examples of the different b’s? Any idea of the condition number of C? >>>> > >>>> > Barry >>>> > >>>> > On Jun 25, 2014, at 3:10 PM, Arthur Kurlej <[email protected]> wrote: >>>> > >>>> > > Hi all, >>>> > > >>>> > > While running my code, I have found that MatMult() returns >>>> different values depending on the number of processors I use (and there is >>>> quite the variance in the values). >>>> > > >>>> > > The setup of my code is as follows (I can go into more >>>> depth/background if needed): >>>> > > -Generate parallel AIJ matrix of size NxN, denoted as A >>>> > > -Retrieve parallel AIJ submatrix from the last N-1 rows&columns >>>> from A, denoted as C >>>> > > -Generate vector of length N-1, denoted as x >>>> > > -Find C*x=b >>>> > > >>>> > > I have already checked that A, C, and x are all equivalent when ran >>>> for any number of processors, it is only the values of vector b that >>>> varies. >>>> > > >>>> > > Does anyone have an idea about what's going on? >>>> > > >>>> > > >>>> > > Thanks, >>>> > > Arthur >>>> > > >>>> > >>>> > >>>> >>>> >>> >> >
