My eventual goal is to remove all "hidden" MatCreate()'s and instead have Mat's passed in as arguments. So MatLoad() would take a Mat as an argument, as would DAGetMatrix() One could then set as much or a as little as a Mat as they like before passing it in. They could set the type, they could set the sizes, they could set the prefix.
I think this is the direction you want? Will it satisfy all your needs? MatCreate(). MatSetOptionsPrefix() MatSetFromOptions() DAGetMatrix() Barry On Jul 21, 2009, at 5:54 PM, Jed Brown wrote: > If I get a matrix from a DM, I usually do something like > > PetscOptionsGetString(NULL,"-q1_mat_type",mtype,sizeof(mtype),NULL); > DMGetMatrix(dm,mtype,&Jp); > > so that the type can be changed on the command line (I frequently > switch > between preconditioners that can use BAIJ and those that cannot). > But, > MatSetFromOptions never gets called. If I add > > MatSetOptionsPrefix(Jp,"q1_"); > MatSetFromOptions(Jp); > > after the above, then preallocation will be blown if I change anything > on the command line. This includes setting block size for AIJ formats > (I think BAIJ should implement MatSetBlockSize and just confirm that > it > matches, but that's a separate issue) so MatSetValuesBlocked cannot > even assemble the correct matrix. > > To rectify this, I think that DMGetMatrix either must have enough > information to call MatSetFromOptions (like the prefix) or > preallocation > should be separated from setting the sizes (so the user can get the > matrix, call MatSetFromOptions, and then ask the DM to preallocate). > In the former case, we have functionality that is essentially > inaccessible from code (PetscOptionsSetValue is a workaround). The > latter significantly complicates matters. > > Note that since the user may get multiple matrices from a DM, to be > used > for different purposes, it's not okay to use the DM's prefix as the > Mat's prefix. > > Any preferences here? I'm happy with any solution in which the user > doesn't have to do an inordinate amount of work to make the following > work. > > -q1_mat_type baij > -q1_mat_type aij -mat_no_inode > -q1_mat_type crl > > > Jed >