Source code for simudo.io.csv
from __future__ import absolute_import, division, print_function
import os
import re
import shlex
from builtins import bytes, dict, int, range, str, super
from collections import defaultdict
from io import StringIO
import numpy as np
import pandas as pd
from cached_property import cached_property
from future.utils import PY2, PY3, native
from numpy import array as npa
import dolfin
from ..fem import DolfinFunctionLineCutRenderer, mesh_bbox, tuple_to_point
from .xdmf import PlotAddMixin, magnitude
[docs]class LineCutCsvPlot(PlotAddMixin):
    timestamp = 0.0
    _empty = True
    def __init__(self, filename, function_subspace_registry=None, resolution=5001):
        self.base_filename = filename
        self.function_subspace_registry = function_subspace_registry
        self.resolution = resolution
[docs]    def new(self, timestamp):
        self.close()
        self.timestamp = timestamp 
    @cached_property
    def _df(self):
        return pd.DataFrame()
    def _compute_coords(self, mesh=None):
        coords = getattr(self, '_coords', None)
        if coords is None:
            xl, yl = mesh_bbox(mesh)
            y0 = npa(yl).mean()
            t = np.linspace(0, 1, self.resolution)
            coords = (np.outer(1-t, npa((xl[0], y0))) +
                      np.outer(t,   npa((xl[1], y0))))
            self._coords = coords
        df = self._df
        df['coord_x'] = coords.view()[:,0]
        df['coord_y'] = coords.view()[:,1]
        return coords
    def _add_func(self, func):
        coords = self._compute_coords(func.function_space().mesh())
        renderer = DolfinFunctionLineCutRenderer(func, {})
        frame = renderer.get_frame(size=None, extent=None)
        frame.coordinates = coords
        vals = frame.extracted_V
        self._df[func.name()] = vals
        self._empty = False
[docs]    def close(self):
        if self._empty == True:
            return
        try:
            os.mkdir(os.path.dirname(self.base_filename))
        except OSError:
            pass
        self._df.to_csv(self.base_filename + '.{}'.format(self.timestamp),
                        index=False)
        del self._df
        self._empty = True 
    def __del__(self):
        self.close()