NimbleSM
NimbleSM is a solid mechanics simulation code for dynamic systems
Loading...
Searching...
No Matches
nimble.mpi.serialization.h
Go to the documentation of this file.
1/*
2//@HEADER
3// ************************************************************************
4//
5// NimbleSM
6// Copyright 2018
7// National Technology & Engineering Solutions of Sandia, LLC (NTESS)
8//
9// Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government
10// retains certain rights in this software.
11//
12// Redistribution and use in source and binary forms, with or without
13// modification, are permitted provided that the following conditions are
14// met:
15//
16// 1. Redistributions of source code must retain the above copyright
17// notice, this list of conditions and the following disclaimer.
18//
19// 2. Redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution.
22//
23// 3. Neither the name of the Corporation nor the names of the
24// contributors may be used to endorse or promote products derived from
25// this software without specific prior written permission.
26//
27// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY EXPRESS OR IMPLIED
28// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
29// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
30// NO EVENT SHALL NTESS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
32// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact David Littlewood (djlittl@sandia.gov)
39//
40// ************************************************************************
41//@HEADER
42*/
43
44#include <algorithm>
45#include <array>
46#include <cstring>
47#include <exception>
48#include <memory>
49#include <string>
50#include <tuple>
51#include <type_traits>
52#include <vector>
53#pragma once
54
55namespace nimble {
56namespace serialization {
57template <class T>
58struct meta
59{
60 static constexpr bool mem = std::is_pod<T>::value;
61 // static constexpr int _size = mem ? sizeof(T) : 0;
62};
63template <class T>
64struct meta<T*>
65{
66 static constexpr bool mem = meta<T>::mem;
67 // static constexpr size_t _size = meta<T>::_size;
68};
69template <class T, size_t arr_size>
70struct meta<std::array<T, arr_size>>
71{
72 static constexpr bool mem = meta<T>::mem;
73 // static constexpr size_t _size = mem ? meta<T>::_size * arr_size : 0;
74};
75template <class A, class B>
76struct meta<std::pair<A, B>>
77{
78 static constexpr bool mem = meta<A>::mem && meta<B>::mem;
79 // static constexpr size_t _size = mem ? meta<A>::_size + meta<B>::_size : 0;
80};
81template <class T, bool constantsize, bool... constant_size>
82struct serial;
83template <class T>
85template <class T>
86struct serial<T, false>
87{
88 // No size function declared
89 // Not even the gods can help you now
90};
91template <class T>
92struct serial<T, true>
93{
94 constexpr static size_t
95 size(const T& obj)
96 {
97 return sizeof(T);
98 }
99 static void
100 pack(const T& src, char*& dest)
101 {
102 std::memcpy(dest, &src, sizeof(T));
103 dest += sizeof(T);
104 }
105 static void
106 unpack(T& dest, char*& src)
107 {
108 std::memcpy(&dest, src, sizeof(T));
109 src += sizeof(T);
110 }
111};
112template <class T>
113struct serial<T*, false>
114{
115 static size_t
116 size(const T* obj)
117 {
118 return serial_t<T>::size(*obj);
119 }
120 static void
121 pack(const T* src, char*& dest)
122 {
123 serial_t<T>::pack(*src, dest);
124 }
125 static void
126 unpack(T* dest, char*& src)
127 {
128 serial_t<T>::unpack(*dest, src);
129 }
130};
131template <class T>
132struct serial<T*, true>
133{
134 static size_t
135 size(const T* obj)
136 {
137 return serial_t<T>::size(*obj);
138 }
139 static void
140 pack(const T* src, char*& dest)
141 {
142 serial_t<T>::pack(*src, dest);
143 }
144 static void
145 unpack(T* dest, char*& src)
146 {
147 serial_t<T>::unpack(*dest, src);
148 }
149};
150template <class A, class B>
151struct serial<std::pair<A, B>, false>
152{
153 static size_t
154 size(const std::pair<A, B>& obj)
155 {
156 return serial_t<A>::size(obj.first) + serial_t<B>::size(obj.second);
157 }
158 static void
159 pack(const std::pair<A, B>& src, char*& dest)
160 {
161 serial_t<A>::pack(src.first, dest);
162 serial_t<B>::pack(src.second, dest);
163 }
164 static void
165 unpack(std::pair<A, B>& dest, char*& src)
166 {
167 serial_t<A>::unpack(dest.first, src);
168 serial_t<B>::unpack(dest.second, src);
169 }
170};
171template <class A, class B>
172struct serial<std::pair<A, B>, true>
173{
174 constexpr static size_t
175 size(const std::pair<A, B>& obj)
176 {
177 return serial_t<A>::size(obj.first) + serial_t<B>::size(obj.second);
178 }
179 static void
180 pack(const std::pair<A, B>& obj, char*& dest)
181 {
182 serial_t<A>::pack(obj.first, dest);
183 serial_t<B>::pack(obj.second, dest);
184 }
185 static void
186 unpack(std::pair<A, B>& dest, char*& src)
187 {
188 serial_t<A>::unpack(dest.first, src);
189 serial_t<B>::unpack(dest.second, src);
190 }
191};
192template <class T>
193struct serial<std::vector<T>, false, false>
194{
195 static size_t
196 size(const std::vector<T>& vect)
197 {
198 size_t total_size = 0;
199 for (auto& elem : vect) total_size += serial<T, false>::size(elem);
200 return total_size + sizeof(size_t);
201 }
202 static void
203 pack(const std::vector<T>& vect, char*& dest)
204 {
205 serial_t<size_t>::pack(vect.size(), dest);
206 for (auto& elem : vect) serial_t<T>::pack(elem, dest);
207 }
208 static void
209 unpack(std::vector<T>& dest, char*& src)
210 {
211 size_t size;
213 dest.resize(size);
214 for (T& elem : dest) serial<T, false>::unpack(elem, src);
215 }
216};
217template <class T>
218struct serial<std::vector<T>, false, true>
219{
220 static size_t
221 size(const std::vector<T>& vect)
222 {
223 return serial_t<T>::size(vect[0]) * vect.size() + sizeof(size_t);
224 }
225 static void
226 pack(const std::vector<T>& src, char*& dest)
227 {
228 serial_t<size_t>::pack(src.size(), dest);
229 for (auto& elem : src) serial_t<T>::pack(elem, dest);
230 }
231 static void
232 unpack(std::vector<T>& dest, char*& src)
233 {
234 size_t size;
236 dest.resize(size);
237 for (T& elem : dest) serial_t<T>::unpack(elem, src);
238 }
239};
240template <class T>
241struct serial<std::vector<T>, false>
242{
243 static size_t
244 size(const std::vector<T>& obj)
245 {
246 return serial<std::vector<T>, false, meta<T>::mem>::size(obj);
247 }
248 static void
249 pack(const std::vector<T>& src, char*& dest)
250 {
251 serial<std::vector<T>, false, meta<T>::mem>::pack(src, dest);
252 }
253 static void
254 unpack(std::vector<T>& dest, char*& src)
255 {
257 }
258};
259template <class T, size_t arr_size>
260struct serial<std::array<T*, arr_size>, true>
261{
262 constexpr static size_t
263 size(const std::array<T*, arr_size>& arr)
264 {
265 return sizeof(T) * arr_size;
266 }
267 static void
268 pack(const std::array<T*, arr_size>& src, char*& dest)
269 {
270 for (auto* elem : src) serial<T, true>::pack(*elem, dest);
271 }
272 static void
273 unpack(std::array<T*, arr_size>& dest, char*& src)
274 {
275 for (auto* elem : dest) serial<T, true>::unpack(*elem, src);
276 }
277};
278template <class T, size_t arr_size>
279struct serial<std::array<T, arr_size>, false>
280{
281 static size_t
282 size(const std::array<T, arr_size>& arr)
283 {
284 size_t total_size = 0;
285 for (auto& elem : arr) total_size += serial<T, false>::size(elem);
286 return total_size;
287 }
288 static void
289 pack(const std::array<T, arr_size>& src, char*& dest)
290 {
291 for (auto& elem : src) serial<T, false>::pack(elem, dest);
292 }
293 static void
294 unpack(std::array<T, arr_size>& dest, char*& src)
295 {
296 for (T& elem : dest) serial<T, false>::unpack(elem, src);
297 }
298};
299template <class T, class dataT>
300size_t
301pack(const T& object, std::vector<dataT>& vect)
302{
303 static_assert(std::is_pod<dataT>::value, "vector must be of POD type");
304 size_t size = serial_t<T>::size(object);
305 vect.resize(size / sizeof(dataT) + 1);
306 char* dataptr = (char*)&vect[0];
307 serial_t<T>::pack(object, dataptr);
308 return size;
309}
310
311template <class T, class dataT>
312size_t
313pack_avoid_resize(const T& object, std::vector<dataT>& vect)
314{
315 static_assert(std::is_pod<dataT>::value, "vector must be of POD type");
316 size_t size = serial_t<T>::size(object);
317 if (size > vect.size()) vect.resize(size / sizeof(dataT) + 1);
318 char* dataptr = (char*)&vect[0];
319 serial_t<T>::pack(object, dataptr);
320 return size;
321}
322
323template <class T, class dataT>
324void
325unpack(T& object, const std::vector<dataT>& vect)
326{
327 static_assert(std::is_pod<dataT>::value, "vector must be of POD type");
328 char* dataptr = (char*)&vect[0];
329 serial_t<T>::unpack(object, dataptr);
330}
331} // namespace serialization
332} // namespace nimble
Definition nimble.mpi.serialization.h:56
size_t pack_avoid_resize(const T &object, std::vector< dataT > &vect)
Definition nimble.mpi.serialization.h:313
serial< typename std::remove_cv< T >::type, meta< T >::mem > serial_t
Definition nimble.mpi.serialization.h:84
size_t pack(const T &object, std::vector< dataT > &vect)
Definition nimble.mpi.serialization.h:301
void unpack(T &object, const std::vector< dataT > &vect)
Definition nimble.mpi.serialization.h:325
Definition kokkos_contact_manager.h:49
static constexpr bool mem
Definition nimble.mpi.serialization.h:66
static constexpr bool mem
Definition nimble.mpi.serialization.h:72
static constexpr bool mem
Definition nimble.mpi.serialization.h:78
Definition nimble.mpi.serialization.h:59
static constexpr bool mem
Definition nimble.mpi.serialization.h:60
static constexpr size_t size(const T &obj)
Definition nimble.mpi.serialization.h:95
static void unpack(T &dest, char *&src)
Definition nimble.mpi.serialization.h:106
static void pack(const T &src, char *&dest)
Definition nimble.mpi.serialization.h:100
static size_t size(const T *obj)
Definition nimble.mpi.serialization.h:116
static void pack(const T *src, char *&dest)
Definition nimble.mpi.serialization.h:121
static void unpack(T *dest, char *&src)
Definition nimble.mpi.serialization.h:126
static size_t size(const T *obj)
Definition nimble.mpi.serialization.h:135
static void unpack(T *dest, char *&src)
Definition nimble.mpi.serialization.h:145
static void pack(const T *src, char *&dest)
Definition nimble.mpi.serialization.h:140
static void pack(const std::array< T, arr_size > &src, char *&dest)
Definition nimble.mpi.serialization.h:289
static size_t size(const std::array< T, arr_size > &arr)
Definition nimble.mpi.serialization.h:282
static void unpack(std::array< T, arr_size > &dest, char *&src)
Definition nimble.mpi.serialization.h:294
static constexpr size_t size(const std::array< T *, arr_size > &arr)
Definition nimble.mpi.serialization.h:263
static void unpack(std::array< T *, arr_size > &dest, char *&src)
Definition nimble.mpi.serialization.h:273
static void pack(const std::array< T *, arr_size > &src, char *&dest)
Definition nimble.mpi.serialization.h:268
static void unpack(std::pair< A, B > &dest, char *&src)
Definition nimble.mpi.serialization.h:165
static size_t size(const std::pair< A, B > &obj)
Definition nimble.mpi.serialization.h:154
static void pack(const std::pair< A, B > &src, char *&dest)
Definition nimble.mpi.serialization.h:159
static void unpack(std::pair< A, B > &dest, char *&src)
Definition nimble.mpi.serialization.h:186
static void pack(const std::pair< A, B > &obj, char *&dest)
Definition nimble.mpi.serialization.h:180
static constexpr size_t size(const std::pair< A, B > &obj)
Definition nimble.mpi.serialization.h:175
static void unpack(std::vector< T > &dest, char *&src)
Definition nimble.mpi.serialization.h:209
static void pack(const std::vector< T > &vect, char *&dest)
Definition nimble.mpi.serialization.h:203
static size_t size(const std::vector< T > &vect)
Definition nimble.mpi.serialization.h:196
static void unpack(std::vector< T > &dest, char *&src)
Definition nimble.mpi.serialization.h:232
static void pack(const std::vector< T > &src, char *&dest)
Definition nimble.mpi.serialization.h:226
static size_t size(const std::vector< T > &vect)
Definition nimble.mpi.serialization.h:221
static void unpack(std::vector< T > &dest, char *&src)
Definition nimble.mpi.serialization.h:254
static void pack(const std::vector< T > &src, char *&dest)
Definition nimble.mpi.serialization.h:249
static size_t size(const std::vector< T > &obj)
Definition nimble.mpi.serialization.h:244
Definition nimble.mpi.serialization.h:82