← Back to team overview

yade-dev team mailing list archive

Re: Python inheritance



For your information, I also faced at some point segfaults with boost::python stuff during O.run() and not O.step() : https://www.mail-archive.com/yade-dev@xxxxxxxxxxxxxxxxxxx/msg13223.html

(I never really solved / understood it.. If you know e.g. boost mutex more than me -- that won't be difficult -- maybe you will !)


Chargé de Recherche / Research Associate
3275 route Cezanne – CS 40061 13182 Aix-en-Provence Cedex 5 FRANCE
+33 (0)4 42 66 99 21

On 07/10/2019 16:46, William Chèvremont wrote:

Dear Yade dev,

I'm facing an issue implementing a new interaction law into Yade.

To be quick, I would like to provide normal force norm from python and integrate this value into the lubrication law.

The current state of my work is on branch 'potential' on gitlab. What's new in this branch:

- pkg/dem/LubricationWithPotential.{cpp, hpp} : Lubrication law with arbitraty contact law + potential solver, and some potential coded in c++. This part work perfectly.

- py/wrapper/yadeWrapper.cpp: I've written a wrapping class and boost.python exposing expressions. I want to inherit this class in python in order to provide the value to the solver above.

It works perfectly if I call O.step();. Problems are coming as soon as I launch O.run(), I got a segfault signal when the c++ code call the python overrided function.

What's wrong???

Summary of the code:


    def contactForce(self, u):
#        print("pyContactForce!");
        return 0;
    def potentialForce(self, u):
#        print("pyPotentialForce!");
        return 1;
    def hasContact(sefl, u):
        return False;


class pyGenericPotential : public GenericPotential, public py::wrapper<GenericPotential> {

    Real potential(Real const& u, LubricationPhys const&) const {
        return contactForce(u) + potentialForce(u);

    void applyPotential(Real const& u, LubricationPhys& phys, Vector3r const&n) {
        phys.normalContactForce = contactForce(u)*n;
        phys.normalPotentialForce = potentialForce(u)*n;
        phys.contact = hasContact(u);

    virtual Real contactForce(Real const& u) const {
        return get_override("contactForce")(u);

    virtual Real potentialForce(Real const& u) const {
        return get_override("potentialForce")(u);

    virtual bool hasContact(Real const& u) const {
        return get_override("hasContact")(u);

    py::class_<pyGenericPotential, boost::noncopyable>("GenericPotential")
.def("contactForce",py::pure_virtual(&pyGenericPotential::contactForce),"This function should return contact force norm.") .def("potentialForce",py::pure_virtual(&pyGenericPotential::potentialForce),"This function should return potential force norm.") .def("hasContact",py::pure_virtual(&pyGenericPotential::hasContact),"This function should return true if there are contact.");


William Chèvremont

Doctorant, PhD student
04 56 52 01 86

Laboratoire de Rhéologie et Procédés
Bureau Bureau B-365
363 Rue de la chimie - bâtiment B
Domaine Universitaire - BP 53 - 38041 Grenoble cedex 9
www.univ-grenoble-alpes.fr <http://www.univ-grenoble-alpes.fr/>

Mailing list: https://launchpad.net/~yade-dev
Post to     : yade-dev@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp