[petsc-dev] MatCreateVecs interface
Stefano Zampini
stefano.zampini at gmail.com
Fri Jun 26 11:29:08 CDT 2015
Ok. I’ll take care of that in a new branch
Stefano
On Jun 26, 2015, at 5:27 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>
>> On Jun 26, 2015, at 7:28 AM, Stefano Zampini <stefano.zampini at gmail.com> wrote:
>>
>> 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?
>
> Better to have a Set and Get because one must free the old string and PetscStrallocpy() the new string and if each mat type is doing this manually likely someone will forget the free or cut and paste wrong.
>
> Barry
>
>>
>> Stefano
>>
>> On Jun 25, 2015, at 8:10 PM, Stefano Zampini <stefano.zampini at gmail.com> 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 <bsmith at mcs.anl.gov> wrote:
>>>
>>>>
>>>>> 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