[petsc-dev] MatSetFromOptions() after DMGetMatrix()

Barry Smith bsmith at mcs.anl.gov
Sat Apr 30 22:07:55 CDT 2011


   Jed,

      You pose several issues here.

1) By default SBAIJ matrices generate an error if you set a value in the lower triangular portion.

      I think this is the wrong default. I've changed it to ignore lower triangular values unless you explicitly set the option.

2) MatSetType(A,MATSBAIJ); and friends deletes the matrix and creates a new one if the matrix is MATSEQSBAIJ or MATMPISBAIJ. 

      This is silly. Given our model of setting types however there is no trivial way to fix this. We could try to handle setting a heirarchy of types properly (how to know if something is a subclass? etc?) or do something just for Mat to handle the 
      rank = 1 and rank > 1 cases. I'm inclined to add a special Mat register for example MatRegisterBaseName("SBAIJ","SeqSBAIJ","MPISBAIJ"); and have MatSetType() first check if the type is in the BaseName list and if so grab the correct 
      classname based on rank, then it will realize the matrix is not having a type change and will not destroy it. Note that this means routines like MatCreateSBAIJ() will disappear.

3) The general wordyness of setting up the matrix fill from the DM.

     My planned model for the future was to change DMGetMatrix() to DMFillMatrix() and have code something like

     MatCreate(comm,&Ap);
     MatSetOptionsPrefix(Ap,"Ap_");
     MatSetFromOptions(Ap);
     MatSetOption(Ap,MAT_SYMMETRIC,PETSC_TRUE);
     DMFillMatrix(fsu,Ap);
   
     If is actually not any shorter but I think it is a better model. 

  If no one objects I will implement 2).  

  3) I think needs more discussion before implementation. 


   Barry



On Apr 30, 2011, at 6:22 PM, Jed Brown wrote:

> I was tired of writing MatSetOption(Ap,MAT_NEW_NONZERO_ALLOCATION_ERR,PETSC_TRUE) into my code to find preallocation issues, so I added -mat_new_nonzero_allocation_err to MatSetFromOptions(). Now I actually call that function. In particular, I do things like
> 
> PetscOptionsList("-Ap_mat_type","Matrix type for velocity operator","",MatList,mattype_Ap,mattype_Ap,sizeof(mattype_Ap),NULL);
> ...
> DMGetMatrix(fsu,mattype_Ap,&Ap);
> MatSetOptionsPrefix(Ap,"Ap_");
> MatSetOption(Ap,MAT_SYMMETRIC,PETSC_TRUE);
> MatSetFromOptions(Ap);
> // Check type and set MAT_IGNORE_LOWER_TRIANGULAR if necessary
> 
> 
> Three problems:
> 
> 1. This is too damn much work.
> 
> 2. Checking the type is an ugly hack. Should MAT_IGNORE_LOWER_TRIANGULAR be default, or should nonsymmetric matrices ignore it, or should there be a new option with those semantics?
> 
> 3. It's wrong to use "-Ap_mat_type sbaij" because the actual type becomes seqsbaij, and then preallocation is thrown away [*] when MatSetFromOptions finds "sbaij", calls MatSetType which compares it to "seqsbaij", and resets the type. This means that I have to use a different prefix to choose which type to pass to DMGetMatrix() than the prefix I subsequently set on the matrix.
> 
> 
> Any ideas how to make this work in a sane way?
> 
> [*] I was getting a seg-fault, but I set mat->preallocated to false in MatSetType. It doesn't crash any more, but preallocation is still thrown away.




More information about the petsc-dev mailing list