version 3.11-dev
writer.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
13#ifndef DUMUX_IO_PARTICLES_WRITER_HH
14#define DUMUX_IO_PARTICLES_WRITER_HH
15
16#include <concepts>
17#include <memory>
18#include <fstream>
19#include <iomanip>
20#include <vector>
21#include <ranges>
22#include <type_traits>
23
25
26#ifdef DUMUX_HAVE_GRIDFORMAT
27#include <gridformat/gridformat.hpp>
28
29namespace Dumux::IO::Particles {
30
36template <class ParticleCloud>
37class Writer
38{
39 using Particle = typename std::remove_cvref_t<ParticleCloud>::Particle;
40public:
41 template <class Format>
42 Writer(Format fmt, std::shared_ptr<ParticleCloud> cloud, const std::string& name)
43 : cloud_(std::move(cloud))
44 , name_(name)
45 , writer_(std::move(fmt), *cloud_, name)
46 {}
47
48 Writer(std::shared_ptr<ParticleCloud> cloud, const std::string& name)
49 : Writer(
50 IO::Format::pvd_with(IO::Format::vtp.with({.encoder = IO::Encoding::raw})
51 ), std::move(cloud), name)
52 {}
53
54 template<std::floating_point T>
55 std::string write(T time)
56 { return writer_.write(time); }
57
58 template<Detail::Container C, GridFormat::Concepts::Scalar T>
59 void addParticleData(
60 const C& data, const std::string& name,
61 const GridFormat::Precision<T>& prec
62 ){
63 writer_.set_point_field(name, [&] (const auto& p) -> std::ranges::range_value_t<C> {
64 return data[p.id()];
65 }, prec);
66 }
67
68 template<Detail::Container C>
69 void addParticleData(
70 const C& data, const std::string& name
71 ){
72 this->addParticleData(
73 data, name,
74 GridFormat::Precision<GridFormat::MDRangeScalar<C>>{}
75 );
76 }
77
78 template<std::invocable<const Particle&> F>
79 void addParticleData(
80 F&& f, const std::string& name,
81 const GridFormat::Precision<std::invoke_result_t<F, Particle>> prec = {}
82 ){
83 writer_.set_point_field(name, std::forward<F>(f), prec);
84 }
85
86 void addParticleIDs()
87 {
88 writer_.set_point_field("id", [&] (const auto& p) -> std::size_t {
89 return p.id();
90 }, GridFormat::Precision<std::size_t>{});
91 }
92
93private:
94 std::shared_ptr<ParticleCloud> cloud_;
95 const std::string name_;
96 GridFormat::Writer<std::remove_cvref_t<ParticleCloud>> writer_;
97};
98
99} // end namespace Dumux::IO::Particles
100
101#endif // DUMUX_HAVE_GRIDFORMAT
102
103#endif
Generic writer for a variety of grid file formats.