[petsc-dev] MatCreateVecs interface

Barry Smith bsmith at mcs.anl.gov
Thu Jun 25 13:06:56 CDT 2015


> On Jun 25, 2015, at 12:32 PM, Stefano Zampini <stefano.zampini at gmail.com> 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 <bsmith at mcs.anl.gov> 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 <stefano.zampini at gmail.com> 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
>>> 
>> 
> 




More information about the petsc-dev mailing list