#ifndef SRC_HDF5_SURFACE_WRITER_HH #define SRC_HDF5_SURFACE_WRITER_HH #include <dune/fufem/boundarypatch.hh> #include "restrict.hh" #include <dune/fufem/hdf5/file.hh> #include <dune/fufem/hdf5/sequenceio.hh> #include <dune/fufem/hdf5/singletonwriter.hh> template <class ProgramState, class GridView> class SurfaceWriter { using Vector = typename ProgramState::Vector; using Patch = BoundaryPatch<GridView>; public: SurfaceWriter(HDF5::Grouplike &file, Vector const &vertexCoordinates, Patch const &surface, size_t const id) : id_(id), group_(file, "surface"+std::to_string(id_)), surface_(surface), surfaceDisplacementWriter_(group_, "displacement", surface.numVertices(), Vector::block_type::dimension), surfaceVelocityWriter_(group_, "velocity", surface.numVertices(), Vector::block_type::dimension) { auto const surfaceCoordinates = restrictToSurface(vertexCoordinates, surface); HDF5::SingletonWriter<2> surfaceCoordinateWriter(group_, "coordinates", surfaceCoordinates.size(), Vector::block_type::dimension); setEntry(surfaceCoordinateWriter, surfaceCoordinates); } void write(ProgramState const &programState) { auto const surfaceDisplacements = restrictToSurface(programState.u[id_], surface_); addEntry(surfaceDisplacementWriter_, programState.timeStep, surfaceDisplacements); auto const surfaceVelocities = restrictToSurface(programState.v[id_], surface_); addEntry(surfaceVelocityWriter_, programState.timeStep, surfaceVelocities); } private: size_t const id_; HDF5::Group group_; Patch const &surface_; HDF5::SequenceIO<2> surfaceDisplacementWriter_; HDF5::SequenceIO<2> surfaceVelocityWriter_; }; #endif