Skip to content

Commit

Permalink
[test.vtk] adds checking of written vtk files
Browse files Browse the repository at this point in the history
via calling paraview's python bindings if available
this refs #284
  • Loading branch information
renefritze committed Jan 4, 2017
1 parent 9ac7487 commit 2bfaa80
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 10 deletions.
5 changes: 4 additions & 1 deletion src/pymor/tools/vtkio.py
Expand Up @@ -68,6 +68,7 @@ def _write_vtu_series(grid, coordinates, connectivity, data, filename_base, last
w.save()
group.addFile(filepath=fn, sim_time=i)
group.save()
return (fn_tpl.format(filename_base, i) for i in range(steps))

def write_vtk(grid, data, filename_base, codim=2, binary_vtk=True, last_step=None):
"""Output grid-associated data in (legacy) vtk format
Expand All @@ -86,6 +87,8 @@ def write_vtk(grid, data, filename_base, codim=2, binary_vtk=True, last_step=Non
last_step
if set must be <= len(data) to restrict output of timeseries
:return list of filenames written
"""
if not config.HAVE_PYVTK:
raise ImportError('could not import pyevtk')
Expand All @@ -96,6 +99,6 @@ def write_vtk(grid, data, filename_base, codim=2, binary_vtk=True, last_step=Non

subentities, coordinates, entity_map = flatten_grid(grid)
x, y, z = coordinates[:, 0].copy(), coordinates[:, 1].copy(), np.zeros(coordinates[:, 1].size)
_write_vtu_series(grid, coordinates=(x, y, z), connectivity=subentities, data=data.data,
return _write_vtu_series(grid, coordinates=(x, y, z), connectivity=subentities, data=data.data,
filename_base=filename_base, last_step=last_step, is_cell_data=(codim == 0))

8 changes: 8 additions & 0 deletions src/pymortests/fixtures/grid.py
Expand Up @@ -86,10 +86,18 @@ def subgrid_factory(grid_generator, neq, seed):
def grid(request):
return request.param()

@pytest.fixture(params=rect_grid_generators)
def rect_grid(request):
return request.param()

@pytest.fixture(params=(rect_grid_generators + tria_grid_generators))
def rect_or_tria_grid(request):
return request.param()

@pytest.fixture(params=tria_grid_generators)
def tria_grid(request):
return request.param()

@pytest.fixture(params=(rect_grid_generators + oned_grid_generators))
def grid_with_orthogonal_centers(request):
return request.param()
12 changes: 12 additions & 0 deletions src/pymortests/paraview_file_check.py
@@ -0,0 +1,12 @@
#!/usr/bin/env python2

if __name__ == '__main__':
import sys

try:
import paraview.simple as ps
except ImportError:
sys.exit(77)

reader = ps.OpenDataFile(sys.argv[1])
ps.Show()
32 changes: 23 additions & 9 deletions src/pymortests/tools.py
Expand Up @@ -8,8 +8,10 @@
import itertools
from tempfile import NamedTemporaryFile

import subprocess

from pymortests.base import TestInterface, runmodule
from pymortests.fixtures.grid import rect_or_tria_grid
from pymortests.fixtures.grid import rect_or_tria_grid, rect_grid, tria_grid
from pymortests.base import polynomials
from pymor.tools.deprecated import Deprecated
from pymor.tools.quadratures import GaussQuadratures
Expand Down Expand Up @@ -85,17 +87,29 @@ def test_props(self):
assert not float_cmp(-inf, inf, rtol, atol), msg


def _check_vtk_file(path):
try:
# this check will current fail if no python2 is available
# it needs to be a seperate process since there are no py3 bindings for paraview
out = subprocess.check_output(['./paraview_file_check.py', path], stderr=subprocess.STDOUT, universal_newlines=False)
except subprocess.CalledProcessError as cpe:
assert cpe.returncode == 77 #no paraview bindings, special hardcoded magic value :|
else:
# paraview bindings to not raise an Exception for unreadable files. (Or ANY unrecoverable error afaict)
assert 'Error' not in out

def test_vtkio(rect_or_tria_grid):
grid = rect_or_tria_grid
steps = 4
for dim in range(1, 2):
for codim, data in enumerate((NumpyVectorSpace.from_data(np.zeros((steps, grid.size(c)))) for c in range(grid.dim+1))):
with NamedTemporaryFile('wb') as out:
if codim == 1:
with pytest.raises(NotImplementedError):
write_vtk(grid, data, out.name, codim=codim)
else:
steps = 1
for codim, data in enumerate((NumpyVectorSpace.from_data(np.zeros((steps, grid.size(c)))) for c in range(grid.dim+1))):
with NamedTemporaryFile('wb', delete=False) as out:
if codim == 1:
with pytest.raises(NotImplementedError):
write_vtk(grid, data, out.name, codim=codim)
else:
files = write_vtk(grid, data, out.name, codim=codim)
for f in files:
_check_vtk_file(f)


class TestTiming(TestInterface):
Expand Down

0 comments on commit 2bfaa80

Please sign in to comment.