pygmsh icon indicating copy to clipboard operation
pygmsh copied to clipboard

Geometry() unusable outside `with` block

Open rmsc opened this issue 2 years ago • 1 comments

As far as I can tell, all tests and examples use the following structure:

with pygmsh.geo.Geometry() as geom:
    # Do stuff

In my case I want to store the geometry inside a class, like so:

class MyClass:
    def __init__(self):
        self.geom =  pygmsh.geo.Geometry()

Common sense says this should work just as fine, but it doesn't. I just get an error on each operation:

Error   : Gmsh has not been initialized

Looking at the source code, in src/pygmsh/common/geometry.py it is clear that some crucial gmsh operations are done in __enter__() and __exit__().

I could manually call gmsh.initialize() and such, but it seems awful for an abstraction API. I could also call __enter__() and __exit__() manually, but that's even uglier.

A good compromise might be to just move the enter/exit code to proper initialize() and finalize() methods, calling them from __enter()__ and __exit()__.

As an alternative, the enter/exit code could perhaps be moved to the constructor/destructor.

rmsc avatar May 09 '22 14:05 rmsc

I could also use this; it looks like the main concern is what assumptions gmsh makes internally. The API really seems like it wants you to work on only one model at a time and using a context manager helps to guarantee that. If multiple initialization / destruction is a concern, gmsh has a function is_initialized that could help avoid anything too awful from happening, but there might be other concerns as well.

I'd be happy to take a crack at this but it would be good to get some feedback from @nschloe first.

danshapero avatar Sep 08 '22 16:09 danshapero