Yes. With this approach, only MatNest will need a specialized getvecs operation and we can get rid of the others.
On Jun 25, 2015, at 7:06 PM, Barry Smith <[email protected]> wrote: > >> On Jun 25, 2015, at 12:32 PM, Stefano Zampini <[email protected]> >> wrote: >> >> pushed a fix >> https://bitbucket.org/petsc/petsc/commits/ae287a2e7a141494f7c41f9dd537addb63b556e3 >> >> However, it appears that the functions below for CUSP, CUSPARSE and VIENNACL >> are mere copies of the interface. >> What about defining the type of the Vec in the interface and get rid of >> these? > > What do you mean by "the type of Vec in the interface"? Do you mean have > a method such as > > MatGetDefaultVecType(mat,const VecType *vtype); > > that defines the default vector type compatible with the matrix? So we could > have > > #undef __FUNCT__ > #define __FUNCT__ "MatCreateVecs_Default" > PetscErrorCode MatCreateVecs_Default(Mat mat,Vec *right,Vec *left) > { > PetscErrorCode ierr; > PetscInt rbs,cbs; > const VecType vtype; > > PetscFunctionBegin; > ierr = MatGetDefaultVecType(mat,&vtype);CHKERRQ(ierr); > ierr = MatGetBlockSizes(mat,&rbs,&cbs);CHKERRQ(ierr); > if (right) { > ierr = VecCreate(PetscObjectComm((PetscObject)mat),right);CHKERRQ(ierr); > ierr = VecSetSizes(*right,mat->cmap->n,PETSC_DETERMINE);CHKERRQ(ierr); > ierr = VecSetBlockSize(*right,cbs);CHKERRQ(ierr); > ierr = VecSetType(*right,vtype);CHKERRQ(ierr); > ierr = VecSetLayout(*right,mat->cmap);CHKERRQ(ierr); > } > if (left) { > ierr = VecCreate(PetscObjectComm((PetscObject)mat),left);CHKERRQ(ierr); > ierr = VecSetSizes(*left,mat->rmap->n,PETSC_DETERMINE);CHKERRQ(ierr); > ierr = VecSetBlockSize(*left,rbs);CHKERRQ(ierr); > ierr = VecSetType(*left,vtype);CHKERRQ(ierr); > ierr = VecSetLayout(*left,mat->rmap);CHKERRQ(ierr); > } > PetscFunctionReturn(0); > } > > or something else? > > Barry > > >> >> src/mat/impls/aij/mpi/mpicusp/mpiaijcusp.cu: A->ops->getvecs = >> MatCreateVecs_MPIAIJCUSP; >> src/mat/impls/aij/mpi/mpicusparse/mpiaijcusparse.cu: A->ops->getvecs >> = MatCreateVecs_MPIAIJCUSPARSE; >> src/mat/impls/aij/mpi/mpiviennacl/mpiaijviennacl.cxx: A->ops->getvecs >> = MatCreateVecs_MPIAIJViennaCL; >> src/mat/impls/aij/seq/seqcusp/aijcusp.cu: B->ops->getvecs = >> MatCreateVecs_SeqAIJCUSP; >> src/mat/impls/aij/seq/seqcusparse/aijcusparse.cu: B->ops->getvecs >> = MatCreateVecs_SeqAIJCUSPARSE; >> src/mat/impls/aij/seq/seqviennacl/aijviennacl.cxx: B->ops->getvecs = >> MatCreateVecs_SeqAIJViennaCL; >> >> Stefano >> >> >> On Jun 25, 2015, at 4:34 PM, Barry Smith <[email protected]> wrote: >> >>> >>> I think you are right, go ahead and make a pull request or send a patch >>> >>> Barry >>> >>>> On Jun 25, 2015, at 9:43 AM, Stefano Zampini <[email protected]> >>>> wrote: >>>> >>>> Why the current interface in MatCreateVecs requires that a matrix has been >>>> already either allocated or setup ? >>>> Shouldn’t be enough to check if the layout has been already setup? >>>> >>>> Stefano >>>> >>> >> >
