Now that I look at DMShellSetLocalToGlobal, I see that it sets the begin/end functions. But these are already set.
It looks like DMShell's SetType must set something for dm->ops->getlocaltoglobalmapping for DMShell to be usable to get a matrix from a Composite DM. On Wed, Aug 6, 2014 at 2:34 PM, Mark Adams <[email protected]> wrote: > It looks like DMShellCreate does not set dm->ops->getlocaltoglobalmapping, > which is needed for DMCreateMatrix with a composite DM. I do set a > global and local vector and a matrix. It looks like I could call > DMShellSetLocalToGlobal. > Should I be doing this? Seems low level and the kind of thing this using > the DM was supposed to avoid > > This seems like it is simply a copy of a local vector to to local part of > a global vector. > > Mark > > > > On Wed, Aug 6, 2014 at 12:23 PM, Mark Adams <[email protected]> wrote: > >> adding a subject ... >> >> >> On Wed, Aug 6, 2014 at 12:00 PM, Mark Adams <[email protected]> wrote: >> >>> I am moving my code to have the DM create the matrix and am hitting this >>> error in DMGetLocalToGlobalMapping: >>> >>> if (!dm->ops->getlocaltoglobalmapping) >>> SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"DM can not create >>> LocalToGlobalMapping"); >>> >>> This happens when I create the matrix like this: >>> >>> call DMCompositeCreate(comm,solver%da,ierr) >>> call DMSetOptionsPrefix(solver%da,'fsa_',ierr) >>> call DMCompositeAddDM(solver%da,solver%daphi,ierr) >>> call DMCompositeAddDM(solver%da,solver%dalam,ierr) >>> call DMSetFromOptions(solver%da,ierr) >>> call DMCreateMatrix(solver%da,solver%KKTmat,ierr) >>> >>> I am using DMShell and create them like so: >>> >>> ! phi DM >>> call VecCreate(comm,x1Vec,ierr) >>> call VecSetSizes(x1Vec,N1loc,N1Glob,ierr) >>> call VecSetFromOptions(x1Vec,ierr) >>> >>> call DMShellCreate(comm,solver%daphi,ierr) >>> call DMShellSetGlobalVector(solver%daphi,x1Vec,ierr) >>> call DMShellSetMatrix(solver%daphi,solver%A0Mat,ierr) >>> call VecDestroy(x1Vec,ierr) >>> call DMSetOptionsPrefix(solver%daphi,'phi_',ierr) >>> call DMSetFromOptions(solver%daphi,ierr) >>> >>> call VecCreate(PETSC_COMM_SELF,x1Vecloc,ierr) >>> call VecSetSizes(x1Vecloc,N1loc,N1loc,ierr) >>> call VecSetFromOptions(x1Vecloc,ierr) >>> call DMShellSetLocalVector(solver%daphi,x1Vecloc,ierr) >>> call VecDestroy(x1Vecloc,ierr) >>> >>> All the examples that I see use DMDAs. I am able to create a global >>> vector with this DM. >>> >>> Any ideas? >>> >> >> >
