I merged the fix for MatCreateVecs into next 

https://bitbucket.org/petsc/petsc/commits/248f4e93fc838f918a85fe2b6cf6cc3494943f33

If we agree on MatGetDefaultVecType, I will create a new branch for it 
Maybe we don’t need a new function, but just store the default vec type into 
Mat (defaulting to VECSTANDARD) and then have MPICUSP and others override the 
default when their are instantiated. What do you think?

Stefano

On Jun 25, 2015, at 8:10 PM, Stefano Zampini <[email protected]> wrote:

> 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
>>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to