Thanks Matt,
I tried your suggestions to implement DMPlexCreateFromDAG in petsc4py:
1. In petsc4py/src/PETSc/petscdmplex.pxi I uncommented:
int
DMMPlexCreateFromDAG(PetscDM,PetscInt,const_PetscInt[],const_PetscInt[],
const_PetscInt[],const_PetscInt[],const_PetscScalar[])
2. In petsc4py/src/PETSc/DMPlex.pyx I added:
def createFromDAG(self, depth, numPoints, coneSize, cones, coneOrientations,
vertexCoords): cdef PetscInt cdepth = asInt(depth) cdef const
PetscInt *cnumPoints = NULL cdef const PetscInt *cconeSize = NULL
cdef const PetscInt *ccones = NULL cdef const PetscInt
*cconeOrientations = NULL cdef const PetscScalar *cvertexCoords = NULL
cnumPoints = <const PetscInt *> PyArray_DATA(numPoints)
cconeSize = <const PetscInt *> PyArray_DATA(coneSize) ccones =
<const PetscInt *> PyArray_DATA(cones) cconeOrientations = <const
PetscInt *> PyArray_DATA(coneOrientations) cvertexCoords = <const
PetscScalar *> PyArray_DATA(vertexCoords) CHKERR(
DMPlexCreateFromDAG(self.dm, cdepth, cnumPoints, cconeSize, ccones,
cconeOrientations, cvertexCoords) ) return self
I am testing this function using this snippet (following
https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/DMPLEX/DMPlexCreateFromDAG.html
<https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/DMPLEX/DMPlexCreateFromDAG.html>):
import petsc4py
import numpy as np
import sys
petsc4py.init(sys.argv)
from petsc4py import PETSc
dm=PETSc.DMPlex().create()
dm.setType(PETSc.DM.Type.PLEX)
numPoints=np.array([4,2])
coneSize=np.array([3,3,0,0,0,0])
cones=np.array([2,3,4, 3,5,4])
coneOrientations=np.array([0,0,0, 0,0,0])
vertexCoords=np.array([-1,0, 0,-1, 0,1, 1,0])
depth=1
dm.createFromDAG(depth,numPoints,coneSize,cones,coneOrientations,vertexCoords)
It fails with output:
Traceback (most recent call last):
File "test.py", line 16, in <module>
dm.createFromDAG(depth,numPoints,coneSize,cones,coneOrientations,vertexCoords)
File "PETSc/DMPlex.pyx", line 64, in petsc4py.PETSc.DMPlex.createFromDAG
petsc4py.PETSc.Error: error code 63
[0] DMPlexCreateFromDAG() line 1669 in
/build/petsc-vurd6G/petsc-3.7.7+dfsg1/src/dm/impls/plex/plexcreate.c
[0] DMPlexSetCone() line 1066 in
/build/petsc-vurd6G/petsc-3.7.7+dfsg1/src/dm/impls/plex/plex.c
[0] Argument out of range
[0] Cone point 4 is not in the valid range [0, 4)
Someone can spot the problem in my python wrapping attempts?
I assume my test.py snippet should be fine. At least, the equivalent C-snippet
runs without problems:
#include <petscdmplex.h>
int main(int argc,char **argv){
PetscInitialize(&argc, &argv, NULL, NULL);
DM dm;
int dim=2;
DMPlexCreate(PETSC_COMM_WORLD,&dm);
DMSetType(dm, DMPLEX);
DMSetDimension(dm,dim);
int depth=1;
int numPoints[]={4,2};
int coneSize[]={3,3,0,0,0,0};
int cones[]={2, 3, 4, 3, 5, 4};
int coneOrientations[]={0,0,0, 0,0,0};
double vertexCoords[]={-1,0, 0,-1, 0,1, 1,0};
DMPlexCreateFromDAG(dm, depth, numPoints, coneSize, cones,
coneOrientations,vertexCoords);
PetscFinalize();
}
regards
Chris
Mar 8, 2019, 6:38 PM by [email protected]:
> On Fri, Mar 8, 2019 at 11:02 AM Chris Finn via petsc-users <>
> [email protected] <mailto:[email protected]>> > wrote:
>
>> Dear petsc4py experts,
>> I'd like to ask why several PETSc functions are not wrapped in petsc4py. I'd
>> need to use DMPlexCreateFromDAG from python. Could you explain with this
>> function as an example why there is no python wrapper available? Do I have
>> to expect severe difficulties when I try this myself - impossible data
>> structures, memory management or something else?
>>
>
> Lisandro is the expert, but I will try answering. The main problem is just
> time. There is no documentation for contributing, but what I do
> is copy a function that is pretty much like the one I want. So I think
> DMPlexCreateFromCellList() is wrapped, and it looks almost the same.
>
> Thanks,
>
> Matt
>
>
>> Then, if it was just lack of time that prevented these functions from being
>> available in petsc4py but if it could be done easily:
>> Is the wrapping process of petsc4py documented somewhere? Or do I have to
>> browse the sources to get an understanding? Do you use swig, clif,
>> boost.python or something else?
>>
>> Is it possible to write another (small) python extension for the missing
>> functions independent from petsc4py that allows me to pass PETSc structures
>> back and forth between the two? Or is it necessary to have /one/ complete
>> wrapper, because interoperability is not possible otherwise?
>>
>> regards
>> Chris
>>
>> --
>> Securely sent with Tutanota. Get your own encrypted, ad-free mailbox:
>> https://tutanota.com <https://tutanota.com>
>>
>
>
> --
> What most experimenters take for granted before they begin their experiments
> is infinitely more interesting than any results to which their experiments
> lead.
> -- Norbert Wiener
>
> https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
>