preCICE v3.2.0
Loading...
Searching...
No Matches
SerializedStamples.cpp
Go to the documentation of this file.
4
6
8{
10
11 result._timeSteps = data.timeStepsStorage().nTimes(); // @todo use all available time steps for subcycling
12 result.allocate(data);
13 result.serializeValues(data);
14 if (data.hasGradient()) {
15 result.serializeGradients(data);
16 }
17 return result;
18}
19
21{
22 SerializedStamples result;
23
24 result._timeSteps = nTimeStamps;
25
26 result.allocate(data);
27
28 return result;
29}
30
32{
33 PRECICE_ASSERT(_timeSteps == static_cast<int>(timeStamps.size()));
34
35 deserialize(timeStamps, data);
36}
37
39{
40 _values = Eigen::VectorXd(_timeSteps * data.getSize());
41
42 if (data.hasGradient()) {
43 _gradients = Eigen::VectorXd(_timeSteps * data.getSize() * data.meshDimensions() * data.getDimensions());
44 }
45}
46
48{
49 const int nValues = data.getSize();
50 int timeId = 0;
51 for (const auto &stample : data.stamples()) {
52 const Eigen::VectorXd &slice = stample.sample.values;
53 for (int valueId = 0; valueId < nValues; valueId++) {
54 _values(valueId * _timeSteps + timeId) = slice(valueId);
55 }
56 timeId++;
57 }
58}
59
61{
62 int timeId = 0;
63 for (const auto &stample : data.stamples()) {
64 const Eigen::VectorXd &slice = Eigen::VectorXd::Map(stample.sample.gradients.data(), data.gradientsRows() * data.gradientsCols());
65 for (int valueId = 0; valueId < slice.size(); valueId++) {
66 _gradients(valueId * _timeSteps + timeId) = slice(valueId);
67 }
68 timeId++;
69 }
70}
71
73{
74 PRECICE_ASSERT(static_cast<int>(timeStamps.size()) * data.getSize() == _values.size(), timeStamps.size() * data.getSize(), _values.size());
75
76 data.timeStepsStorage().clear(); // @todo needs optimization. Don't need to communicate and serialize / deserialize data at beginning of window, because it is already there.
77
78 const auto dataDims = data.getDimensions();
79
80 for (int timeId = 0; timeId < static_cast<int>(timeStamps.size()); timeId++) {
81 const double time = timeStamps[timeId];
82
83 Eigen::VectorXd slice(data.getSize());
84 for (int valueId = 0; valueId < slice.size(); valueId++) {
85 slice(valueId) = _values(valueId * timeStamps.size() + timeId);
86 }
87
88 if (!data.hasGradient()) {
89 data.setSampleAtTime(time, time::Sample{dataDims, std::move(slice)});
90 continue;
91 }
92
93 Eigen::MatrixXd gradientSlice(data.gradientsRows(), data.gradientsCols());
94 auto gradientView = Eigen::VectorXd::Map(gradientSlice.data(), gradientSlice.rows() * gradientSlice.cols());
95 for (int gradientId = 0; gradientId < gradientView.size(); gradientId++) {
96 gradientView(gradientId) = _gradients(gradientId * timeStamps.size() + timeId);
97 }
98 data.setSampleAtTime(time, time::Sample{dataDims, std::move(slice), std::move(gradientSlice)});
99 }
100}
101
102const Eigen::VectorXd &SerializedStamples::values() const
103{
104 return _values;
105}
106
108{
109 return _values;
110}
111
112const Eigen::VectorXd &SerializedStamples::gradients() const
113{
114 return _gradients;
115}
116
118{
119 return _gradients;
120}
121
123{
124 return _timeSteps;
125}
126
127} // namespace precice::com::serialize
#define PRECICE_ASSERT(...)
Definition assertion.hpp:85
Eigen::VectorXd _gradients
Buffer for serialized gradients of stamples.
static SerializedStamples serialize(const cplscheme::CouplingData &data)
Serializes a given CouplingData into SerializedStamples.
int _timeSteps
number of timesteps stored in SerializedStamples
void allocate(const cplscheme::CouplingData &data)
void deserializeInto(precice::span< const double > timeStamps, cplscheme::CouplingData &data)
Deserialize data from this SerializedStamples into provided CouplingData.
void deserialize(precice::span< const double > timeStamps, cplscheme::CouplingData &data) const
Deserialize _values and (if required by data) _gradients into timeStepsStorage of data....
static SerializedStamples empty(int nTimeSteps, const cplscheme::CouplingData &data)
Create SerializedStamples with allocated buffers according to size of CouplingData.
const Eigen::VectorXd & gradients() const
const reference to serialized gradients. Used for sending serialized gradients.
void serializeValues(const cplscheme::CouplingData &data)
Serialize values from timeStepsStorage of data into _values.
Eigen::VectorXd _values
Buffer for serialized values of stamples.
void serializeGradients(const cplscheme::CouplingData &data)
Serialize gradients from timeStepsStorage of data into _gradients.
int nTimeSteps() const
Returns number of timeSteps.
const Eigen::VectorXd & values() const
const reference to serialized values. Used for sending serialized values.
A C++ 11 implementation of the non-owning C++20 std::span type.
Definition span.hpp:284
constexpr size_type size() const noexcept
Definition span.hpp:469
contains serialization logic
contains the time interpolation logic.
Definition Sample.hpp:8