I attach it with this code: /* attach block size of columns */ if( pc_gamg->col_bs_id == -1 ) { ierr = PetscObjectComposedDataRegister( &pc_gamg->col_bs_id ); assert(pc_gamg->col_bs_id != -1 ); } ierr = PetscObjectComposedDataSetInt( (PetscObject)Prol, pc_gamg->col_bs_id, data_cols ); CHKERRQ(ierr);
which Hong can not see w/o my ID. so we need a mechanism for me to get this to PtAP. And MatGetSubMatrix has to inherit block size, which I assume is trial. Mark On Apr 24, 2012, at 11:14 PM, Barry Smith wrote: > > On Apr 24, 2012, at 8:14 PM, Mark F. Adams wrote: > >> >> On Apr 24, 2012, at 5:01 PM, Barry Smith wrote: >> >>> >>> On Apr 24, 2012, at 2:38 PM, Mark F. Adams wrote: >>> >>>> >>>> On Apr 24, 2012, at 3:28 PM, Hong Zhang wrote: >>>> >>>>> Mark : >>>>> Shall C=PtAP inherit the block size of A? >>>>> Currently, MatPtAP() is only implemented with aij bs=1. >>>> >>>> No, as I said, algebraically it should inherit the column block size of P, >>>> but that is not available. >>> >>> What is the column block size of P and how do you know what it is? >> >> I now attach it to the P matrix instead of adding it as a return parameter >> of the create P method. So I keep track of it in the code. Its size is the >> number of null space vectors. > > Ok if P knows its block size then the code that computes PtAP can set the > block size of the resulting matrix as it creates it using the information in > P. So is the issue on calling MatSetBlockSize() now resolved and everyone > happy? > > Barry > >> >> Mark >> >>> >>> Barry >>> >>>> >>>> Perhaps PtAP should take a parameter for the block size ... >>>> >>>> Mark >>>> >>>>> Hong >>>>> >>>>> On Apr 24, 2012, at 2:55 PM, Barry Smith wrote: >>>>> >>>>>> >>>>>> On Apr 24, 2012, at 1:39 PM, Mark F. Adams wrote: >>>>>> >>>>>>> Now I'm getting this error with code like this: >>>>>>> >>>>>>> ierr = MatGetSubMatrix( Cmat, new_eq_indices, new_eq_indices, >>>>>>> MAT_INITIAL_MATRIX, &mat ); >>>>>>> CHKERRQ(ierr); >>>>>>> ierr = MatSetBlockSize( mat, cbs ); CHKERRQ(ierr); >>>>>>> >>>>>>> and like this: >>>>>>> >>>>>>> ierr = MatPtAP( Amat_fine, Pold, MAT_INITIAL_MATRIX, 2.0, &Cmat ); >>>>>>> CHKERRQ(ierr); >>>>>>> ierr = MatSetBlockSize( Cmat, cbs ); CHKERRQ(ierr); >>>>>> >>>>>> Right you cannot do this. The matrix already exists so you cannot now >>>>>> set its size. >>>>>> >>>>>> Does Cmat have a block size of cbs >>>>>> >>>>>> What about Amat? By default these routines should create the new >>>>>> matrix with the correct blocksize. >>>>>> >>>>>> The harder part is if the blocksize of mat would be different than Cmat? >>>>>> >>>>> >>>>> It seems like MatGetSubMatrix should just inherit the block size but PtAP >>>>> is harder. The block size of the Cmat is the column block size of P. >>>>> But I can not set a column block size (!= row block size) so I don't set >>>>> block size on P at all. Here cbs is this column block size of P, or what >>>>> it should be. >>>>> >>>>> Mark >>>>> >>>>>> Barry >>>>>> >>>>>>> >>>>>>> Mark >>>>>>> >>>>>>> On Apr 23, 2012, at 9:09 PM, Barry Smith wrote: >>>>>>> >>>>>>>> >>>>>>>> Yes, look, for example how ex32 is handled at the bottom of the >>>>>>>> makefile. >>>>>>>> >>>>>>>> Thanks >>>>>>>> >>>>>>>> Barry >>>>>>>> >>>>>>>> On Apr 23, 2012, at 5:50 PM, Mark F. Adams wrote: >>>>>>>> >>>>>>>>> >>>>>>>>> On Apr 23, 2012, at 5:59 PM, Barry Smith wrote: >>>>>>>>> >>>>>>>>>> >>>>>>>>>> It was changed a while ago that MatSetBlockSize() couldn't be set >>>>>>>>>> after the matrix was full instantiated. I guess that example did not >>>>>>>>>> get fixed because it is not listed in the makefile to run in the >>>>>>>>>> makeall. >>>>>>>>> >>>>>>>>> May I add it? >>>>>>>>> >>>>>>>>>> >>>>>>>>>> I have fixed the example to call MatSetBlockSize() at a safe point. >>>>>>>>>> >>>>>>>>>> Barry >>>>>>>>>> >>>>>>>>>> On Apr 23, 2012, at 4:29 PM, Mark F. Adams wrote: >>>>>>>>>> >>>>>>>>>>> ex55.c in ksp is failing with: >>>>>>>>>>> >>>>>>>>>>> [0]PETSC ERROR: --------------------- Error Message >>>>>>>>>>> ------------------------------------ >>>>>>>>>>> [0]PETSC ERROR: Arguments are incompatible! >>>>>>>>>>> [0]PETSC ERROR: Cannot change block size 1 to 2! >>>>>>>>>>> [0]PETSC ERROR: >>>>>>>>>>> ------------------------------------------------------------------------ >>>>>>>>>>> >>>>>>>>>>> on this line 57 of ex55.c: >>>>>>>>>>> >>>>>>>>>>> ierr = MatSetBlockSize(Amat,2); CHKERRQ(ierr); >>>>>>>>>>> >>>>>>>>>>> Any idea what happened here? >>>>>>>>>>> >>>>>>>>>>> Mark >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>> >>> >>> >> > >