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

Reply via email to