On Tue, Nov 12, 2013 at 4:30 PM, James Snyder <[email protected]> wrote:
> Hi -
>
> I've been working with some meshes that I would like to cache. To prevent
> having to run Gmsh each time using the same mesh, I've tried using the
> read/write methods associated provided by tools.dump (I also tried raw
> cPickle-ing and using shelf) but I seem to be losing the physical and
> geometrical definitions created by makeMapVariables. Is there something
> I've missed or should I file a ticket on matforge? It also looks like we
> toss the mshFile so I don't believe I can just call
> gmshMesh.py:makeMapVariables again later.
>
You havn't missed anything. After pickling the Gmsh mesh, it is really
just a standard mesh without any of the Gmsh attributes.
> Also would you be interested in caching mesh output for a given geometry
> description?
That would be good for sure.
> One could just hash incoming geometry descriptions and if
> meshing is successful save a temporary file object named using the digest.
> I suppose this could be done in gmshMesh.py:openMSHFile?
It makes sense.
Below is a brutal hack to add physicalCells to make them pickle only
"physicalCells". There is undoubtedly a better way, but it is all I
could think of in a short time. It's a quick and dirty fix. It might
get you started on a better solution.
import fipy as fp
import numpy as np
from fipy.meshes.representations.meshRepresentation import _MeshRepresentation
cellSize = 0.05
radius = 1.
class MyRepr(_MeshRepresentation):
def getstate(self):
state = super(MyRepr, self).getstate()
state['physicalCells'] = {k: np.array(v) for k, v in
self.mesh.physicalCells.iteritems()}
return state
@staticmethod
def setstate(mesh, state):
physicalCells = state['physicalCells']
del state['physicalCells']
_MeshRepresentation.setstate(mesh, state)
mesh.physicalCells = physicalCells
old = fp.Gmsh2D('''
cellSize = %(cellSize)g;
radius = %(radius)g;
Point(1) = {0, 0, 0, cellSize};
Point(2) = {-radius, 0, 0, cellSize};
Point(3) = {0, radius, 0, cellSize};
Point(4) = {radius, 0, 0, cellSize};
Point(5) = {0, -radius, 0, cellSize};
Circle(6) = {2, 1, 3};
Circle(7) = {3, 1, 4};
Circle(8) = {4, 1, 5};
Circle(9) = {5, 1, 2};
Line Loop(10) = {6, 7, 8, 9};
Plane Surface(11) = {10};
Physical Surface("Circle") = {11};
''' % locals())
old.representation = MyRepr(mesh=old)
f, tempfile = fp.dump.write(old)
new = fp.dump.read(tempfile, f)
print old.physicalCells
print new.physicalCellsimport fipy as fp
import numpy as np
from fipy.meshes.representations.meshRepresentation import _MeshRepresentation
cellSize = 0.05
radius = 1.
class MyRepr(_MeshRepresentation):
def getstate(self):
state = super(MyRepr, self).getstate()
state['physicalCells'] = {k: np.array(v) for k, v in
self.mesh.physicalCells.iteritems()}
return state
@staticmethod
def setstate(mesh, state):
physicalCells = state['physicalCells']
del state['physicalCells']
_MeshRepresentation.setstate(mesh, state)
mesh.physicalCells = physicalCells
old = fp.Gmsh2D('''
cellSize = %(cellSize)g;
radius = %(radius)g;
Point(1) = {0, 0, 0, cellSize};
Point(2) = {-radius, 0, 0, cellSize};
Point(3) = {0, radius, 0, cellSize};
Point(4) = {radius, 0, 0, cellSize};
Point(5) = {0, -radius, 0, cellSize};
Circle(6) = {2, 1, 3};
Circle(7) = {3, 1, 4};
Circle(8) = {4, 1, 5};
Circle(9) = {5, 1, 2};
Line Loop(10) = {6, 7, 8, 9};
Plane Surface(11) = {10};
Physical Surface("Circle") = {11};
''' % locals())
old.representation = MyRepr(mesh=old)
f, tempfile = fp.dump.write(old)
new = fp.dump.read(tempfile, f)
print old.physicalCells
print new.physicalCells
--
Daniel Wheeler
_______________________________________________
fipy mailing list
[email protected]
http://www.ctcms.nist.gov/fipy
[ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]