On Apr 25, 2012, at 3:48 PM, Barry Smith wrote: > > On Apr 25, 2012, at 2:44 PM, Mark F. Adams wrote: > >> >> On Apr 25, 2012, at 12:22 PM, Hong Zhang wrote: >> >>> Mark, >>> >>> 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. >>> >>> Sorry, I do not understand what do you mean here. >>> Do you want add above into the implementation of PtAP or petsc? >> >> This is an architectural/API decision. I will do what you and Barry want. >> You could add a parameter to PtAP, or add a field to Mat (column block >> size), or whatever. > > Mark, > > I'm leaning towards setting a column block size, MatSetColumnBlockSize(). > But what exactly is a "column block size"? Is it really a column blocksize > in the sense that nbs columns next to each other always have the exact same > nonzero pattern: for example > > xx 00 xx 00 > yy 00 yy 00 > zz 00 zz 00
No. The blocks are dense for smoothed aggregation but for geometric MG and classical AMG the blocks are scaled identity. > > or is it a more vague thing that defined by "well if you compute Pt A P the > result has a blocksize of nbs". In that case we would provide a > MatSetVirtualColumnBlockSize() > All I really need is for the coarse grid matrix to have the block size, because that is used to create a graph (for "vertices" not equations). The method that constructs the prolongator knows the block size, so I attach it to P. I could actually attach the block size to the coarse matrix in the way that I do with P, or pass it around as a parameter internally, I suppose. Mark > Thanks > > Barry > >> >> Mark >> >>> Hong >>> >>> 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 >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>> >>>> >>>> >>> >>> >> > >