dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #26460
Re: [Branch ~dolfin-core/dolfin/trunk] Rev 7506: MeshFunctions now support iterable protocol, fixing bug lp:973906
This commit resulted in a segmentation fault on the OS X buildbots.
Johan, could you take a look?
Johannes
On Thu, Mar 7, 2013 at 9:08 AM, <noreply@xxxxxxxxxxxxx> wrote:
> ------------------------------------------------------------
> revno: 7506
> fixes bug: https://launchpad.net/bugs/973906
> committer: Johan Hake <hake.dev@xxxxxxxxx>
> branch nick: work-trunk
> timestamp: Thu 2013-03-07 09:06:57 +0100
> message:
> MeshFunctions now support iterable protocol, fixing bug lp:973906
> modified:
> ChangeLog
> dolfin/swig/mesh/post.i
> test/unit/mesh/python/MeshFunction.py
>
>
> --
> lp:dolfin
> https://code.launchpad.net/~dolfin-core/dolfin/trunk
>
> Your team DOLFIN Core Team is subscribed to branch lp:dolfin.
> To unsubscribe from this branch go to https://code.launchpad.net/~dolfin-core/dolfin/trunk/+edit-subscription
>
> === modified file 'ChangeLog'
> --- ChangeLog 2013-02-28 14:52:56 +0000
> +++ ChangeLog 2013-03-07 08:06:57 +0000
> @@ -1,3 +1,4 @@
> + - MeshFunctions in python now support iterable protocol
> - Expose ufc::dofmap::tabulate_entity_dofs to GenericDofMap interface
> - Expose ufc::dofmap::num_entity_dofs to GenericDofMap interface
> - Allow setting of row dof coordinates in preconditioners (only works with PETSc backed for now)
>
> === modified file 'dolfin/swig/mesh/post.i'
> --- dolfin/swig/mesh/post.i 2013-01-12 00:38:15 +0000
> +++ dolfin/swig/mesh/post.i 2013-03-07 08:06:57 +0000
> @@ -117,11 +117,11 @@
> // Extend MeshFunction interface for get and set items
> %extend dolfin::MeshFunction<TYPE>
> {
> - TYPE __getitem__(std::size_t i) { return (*self)[i]; }
> - void __setitem__(std::size_t i, TYPE val) { (*self)[i] = val; }
> + TYPE _getitem(std::size_t i) { return (*self)[i]; }
> + void _setitem(std::size_t i, TYPE val) { (*self)[i] = val; }
>
> - TYPE __getitem__(dolfin::MeshEntity& e) { return (*self)[e]; }
> - void __setitem__(dolfin::MeshEntity& e, TYPE val) { (*self)[e] = val; }
> + TYPE _getitem(dolfin::MeshEntity& e) { return (*self)[e]; }
> + void _setitem(dolfin::MeshEntity& e, TYPE val) { (*self)[e] = val; }
>
> %pythoncode%{
> def array(self):
> @@ -132,6 +132,22 @@
> _attach_base_to_numpy_array(data, self)
> return data
>
> +def __getitem__(self, index):
> + try:
> + return self._getitem(index)
> + except:
> + index = index.index() if isinstance(index, Cell) else index
> + raise IndexError("Index %d out of bound" % index)
> +
> +def __setitem__(self, index, value):
> + try:
> + self._setitem(index, value)
> + except RuntimeError:
> + index = index.index() if isinstance(index, Cell) else index
> + raise IndexError("Index %d out of bound" % index)
> +
> +def __len__(self):
> + return self.size()
> %}
> }
>
>
> === modified file 'test/unit/mesh/python/MeshFunction.py'
> --- test/unit/mesh/python/MeshFunction.py 2013-01-07 22:07:49 +0000
> +++ test/unit/mesh/python/MeshFunction.py 2013-03-07 08:06:57 +0000
> @@ -42,11 +42,11 @@
> for tp in self.tps:
> for name in self.names:
> if name is "Vertex":
> - a = self.funcs[(tp, name)].size()
> + a = len(self.funcs[(tp, name)])
> b = self.mesh.num_vertices()
> self.assertEqual(a, b)
> else:
> - a = self.funcs[(tp, name)].size()
> + a = len(self.funcs[(tp, name)])
> b = getattr(self.mesh, "num_%ss"%name.lower())()
> self.assertEqual(a, b)
>
> @@ -65,6 +65,21 @@
> self.assertTrue(all(values[i]==self.funcs[(tp, name)][i]
> for i in xrange(len(values))))
>
> + def test_iterate(self):
> + for tp in self.tps:
> + for name in self.names:
> + for index, value in enumerate(self.funcs[(tp, name)]):
> + pass
> + self.assertEqual(index, len(self.funcs[(tp, name)])-1)
> + self.assertRaises(IndexError, self.funcs[(tp, name)].__getitem__, len(self.funcs[(tp, name)]))
> +
> + def test_setvalues(self):
> + for tp in self.tps:
> + if tp == 'bool':
> + continue
> + for name in self.names:
> + self.assertRaises(TypeError, self.funcs[(tp, name)].__setitem__, len(self.funcs[(tp, name)]), "jada")
> +
> class MeshFunctions(unittest.TestCase):
>
> def setUp(self):
>
>