Zoltan2
Loading...
Searching...
No Matches
Zoltan2_InputTraits.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Zoltan2: A package of combinatorial algorithms for scientific computing
4//
5// Copyright 2012 NTESS and the Zoltan2 contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
14#ifndef ZOLTAN2_INPUTTRAITS_HPP
15#define ZOLTAN2_INPUTTRAITS_HPP
16
17#include <Zoltan2_Standards.hpp>
18
19#include <Tpetra_CrsMatrix.hpp>
20#include <Tpetra_RowMatrix.hpp>
21#include <Tpetra_CrsGraph.hpp>
22#include <Tpetra_RowGraph.hpp>
23
24#include <Xpetra_CrsMatrix.hpp>
25#include <Xpetra_RowMatrix.hpp>
26#include <Xpetra_TpetraRowMatrix.hpp>
27#include <Xpetra_CrsGraph.hpp>
28
29#ifdef _WIN32
30#include <basetsd.h>
31#endif
32
33namespace Zoltan2{
34
35// Default local ordinal
36typedef ::Tpetra::Details::DefaultTypes::local_ordinal_type default_lno_t;
37
38// Default global ordinal
39typedef ::Tpetra::Details::DefaultTypes::global_ordinal_type default_gno_t;
40
41// Default offset type
42typedef size_t default_offset_t;
43
44// Default scalar type (for weights, coordinates)
45typedef ::Tpetra::Details::DefaultTypes::scalar_type default_scalar_t;
46
47// Until Kokkos node types are supported, use default
48typedef ::Tpetra::Details::DefaultTypes::node_type default_node_t;
49
50// Default part number type.
51typedef int default_part_t; // Restrictions in MPI interface will make it
52 // somewhat difficult to change default_part_t to
53 // long long, since we use part_t for ranks
54 // and we sometimes broadcast arrays whose
55 // size has type part_t.
56 // part_t must be a signed data type.
57
99template <typename scalar=default_scalar_t,
100 typename lno=default_lno_t,
101 typename gno=default_gno_t,
102 typename node=default_node_t>
104};
105
136template <typename User>
138
142
147
152
156
160
165
168 static inline std::string name() {return "InputAdapter";}
169};
170
171#ifndef DOXYGEN_SHOULD_SKIP_THIS
172
173#ifdef _WIN32
174 typedef SSIZE_T ssize_t;
175#endif
176
177// This combination of macros is used to define a single line
178// Z2_STATIC_ASSERT_TYPES for each InputTraits with custom template types
179#define Z2_ISSAME(s,type) (std::is_same< s, type >::value)
180
181#define Z2_STYPES(s) ( Z2_ISSAME(s,float) || \
182 Z2_ISSAME(s,double) || Z2_ISSAME(s,int) || Z2_ISSAME(s,long) || \
183 Z2_ISSAME(s,long long) || Z2_ISSAME(s, int64_t) || Z2_ISSAME(s, int32_t) || \
184 Z2_ISSAME(s,std::complex<double>) || Z2_ISSAME(s,std::complex<float>) )
185
186#define Z2_LTYPES(l) ( Z2_ISSAME(l,int) || \
187 Z2_ISSAME(l,long) || Z2_ISSAME(l,long long) || Z2_ISSAME(l,ssize_t) )
188
189#define Z2_GTYPES(g) ( Z2_ISSAME(g,int) || Z2_ISSAME(g,long) || \
190 Z2_ISSAME(g,long long) || Z2_ISSAME(g,ssize_t) || \
191 Z2_ISSAME(g,unsigned int) || Z2_ISSAME(g,unsigned long) || \
192 Z2_ISSAME(g,unsigned long long) || Z2_ISSAME(g,size_t) )
193
194#define Z2_SERROR "Invalid scalar type. It must be float, double, int, long, long long, int32_t, or int64_t."
195
196#define Z2_LERROR "Invalid local ordinal type. It must be int, long, " \
197 "long long, or ssize_t."
198
199#define Z2_GERROR "Invalid global ordinal type. It must be int, long, " \
200 "long long, ssize_t, unsigned int, unsigned long long, size_t."
201
202#ifdef Z2_INVERT_STATIC_ASSERT_FOR_UNIT_TESTING
203 #define Z2_STATIC_ASSERT_TYPES static_assert( ( !Z2_STYPES(scalar_t) || \
204 !Z2_LTYPES(lno_t) || !Z2_GTYPES(gno_t) ), \
205 "Inverted unit test for InputTraits was supposed to fail but did not." );
206#else
207 #define Z2_STATIC_ASSERT_TYPES static_assert( Z2_STYPES(scalar_t), \
208 Z2_SERROR ); static_assert( Z2_LTYPES(lno_t), Z2_LERROR ); \
209 static_assert( Z2_GTYPES(gno_t), Z2_GERROR );
210#endif
211
212template <typename Scalar,
213 typename LocalOrdinal,
214 typename GlobalOrdinal,
215 typename Node>
216struct InputTraits<BasicUserTypes<Scalar, LocalOrdinal, GlobalOrdinal, Node> >
217{
218 typedef Scalar scalar_t;
219 typedef LocalOrdinal lno_t;
220 typedef GlobalOrdinal gno_t;
221 typedef LocalOrdinal offset_t;
223 typedef Node node_t;
224 static inline std::string name() {return "BasicUserTypes";}
225
226 Z2_STATIC_ASSERT_TYPES // validate the types
227};
228
229template <typename Scalar,
230 typename LocalOrdinal,
231 typename GlobalOrdinal,
232 typename Node>
233struct InputTraits<Xpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
234{
235 typedef Scalar scalar_t;
236 typedef typename Xpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
237 typedef LocalOrdinal lno_t;
238 typedef GlobalOrdinal gno_t;
239 typedef size_t offset_t;
241 typedef Node node_t;
242 static inline std::string name() {return "Xpetra::CrsMatrix";}
243
244 Z2_STATIC_ASSERT_TYPES // validate the types
245};
246
247template <typename Scalar,
248 typename LocalOrdinal,
249 typename GlobalOrdinal,
250 typename Node>
251struct InputTraits<Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
252{
253 typedef Scalar scalar_t;
254 typedef typename Tpetra::CrsMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
255 typedef LocalOrdinal lno_t;
256 typedef GlobalOrdinal gno_t;
257 typedef size_t offset_t;
259 typedef Node node_t;
260 static inline std::string name() {return "Tpetra::CrsMatrix";}
261
262 Z2_STATIC_ASSERT_TYPES // validate the types
263};
264
265template <typename Scalar,
266 typename LocalOrdinal,
267 typename GlobalOrdinal,
268 typename Node>
269struct InputTraits<Xpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
270{
271 typedef Scalar scalar_t;
272 typedef typename Xpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
273 typedef LocalOrdinal lno_t;
274 typedef GlobalOrdinal gno_t;
275 typedef size_t offset_t;
277 typedef Node node_t;
278 static inline std::string name() {return "Xpetra::RowMatrix";}
279
280 Z2_STATIC_ASSERT_TYPES // validate the types
281};
282
283template <typename Scalar,
284 typename LocalOrdinal,
285 typename GlobalOrdinal,
286 typename Node>
287struct InputTraits<Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
288{
289 typedef Scalar scalar_t;
290 typedef typename Tpetra::RowMatrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
291 typedef LocalOrdinal lno_t;
292 typedef GlobalOrdinal gno_t;
293 typedef size_t offset_t;
295 typedef Node node_t;
296 static inline std::string name() {return "Tpetra::RowMatrix";}
297
298 Z2_STATIC_ASSERT_TYPES // validate the types
299};
300
301template <typename LocalOrdinal,
302 typename GlobalOrdinal,
303 typename Node>
304struct InputTraits<Tpetra::RowGraph<LocalOrdinal,GlobalOrdinal,Node> >
305{
307 typedef default_scalar_t impl_scalar_t;
308 typedef LocalOrdinal lno_t;
309 typedef GlobalOrdinal gno_t;
310 typedef size_t offset_t;
312 typedef Node node_t;
313 static inline std::string name() {return "Tpetra::RowGraph";}
314};
315
316template <typename LocalOrdinal,
317 typename GlobalOrdinal,
318 typename Node>
319struct InputTraits<Xpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> >
320{
322 typedef default_scalar_t impl_scalar_t;
323 typedef LocalOrdinal lno_t;
324 typedef GlobalOrdinal gno_t;
325 typedef size_t offset_t;
327 typedef Node node_t;
328 static inline std::string name() {return "Xpetra::CrsGraph";}
329
330 Z2_STATIC_ASSERT_TYPES // validate the types
331};
332
333template <typename LocalOrdinal,
334 typename GlobalOrdinal,
335 typename Node>
336struct InputTraits<Tpetra::CrsGraph<LocalOrdinal,GlobalOrdinal,Node> >
337{
339 typedef default_scalar_t impl_scalar_t;
340 typedef LocalOrdinal lno_t;
341 typedef GlobalOrdinal gno_t;
342 typedef size_t offset_t;
344 typedef Node node_t;
345 static inline std::string name() {return "Tpetra::CrsGraph";}
346
347 Z2_STATIC_ASSERT_TYPES // validate the types
348};
349
350template <typename Scalar,
351 typename LocalOrdinal,
352 typename GlobalOrdinal,
353 typename Node>
354struct InputTraits<Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
355{
356 typedef Scalar scalar_t;
357 typedef typename Xpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
358 typedef LocalOrdinal lno_t;
359 typedef GlobalOrdinal gno_t;
360 typedef size_t offset_t;
362 typedef Node node_t;
363 static inline std::string name() {return "Xpetra::Vector";}
364
365 Z2_STATIC_ASSERT_TYPES // validate the types
366};
367
371template <typename Scalar,
372 typename LocalOrdinal,
373 typename GlobalOrdinal,
374 typename Node>
375struct InputTraits<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
376{
377 typedef Scalar scalar_t;
378 typedef typename Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
379 typedef LocalOrdinal lno_t;
380 typedef GlobalOrdinal gno_t;
381 typedef size_t offset_t;
383 typedef Node node_t;
384 static inline std::string name() {return "Tpetra::Vector";}
385
386 Z2_STATIC_ASSERT_TYPES // validate the types
387};
388
389template <typename Scalar,
390 typename LocalOrdinal,
391 typename GlobalOrdinal,
392 typename Node>
393struct InputTraits<Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
394{
395 typedef Scalar scalar_t;
396 typedef typename Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
397 typedef LocalOrdinal lno_t;
398 typedef GlobalOrdinal gno_t;
399 typedef size_t offset_t;
401 typedef Node node_t;
402 static inline std::string name() {return "Xpetra::MultiVector";}
403
404 Z2_STATIC_ASSERT_TYPES // validate the types
405};
406
407template <typename Scalar,
408 typename LocalOrdinal,
409 typename GlobalOrdinal,
410 typename Node>
411struct InputTraits<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
412{
413 typedef Scalar scalar_t;
414 typedef typename Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type impl_scalar_t;
415 typedef LocalOrdinal lno_t;
416 typedef GlobalOrdinal gno_t;
417 typedef size_t offset_t;
419 typedef Node node_t;
420 static inline std::string name() {return "Tpetra::MultiVector";}
421
422 Z2_STATIC_ASSERT_TYPES // validate the types
423};
424
425#endif // DOXYGEN_SHOULD_SKIP_THIS
426
427
428} // namespace Zoltan2
429#endif // ZOLTAN2_INPUTTRAITS_HPP
Gathering definitions used in software development.
A simple class that can be the User template argument for an InputAdapter.
Vector::node_type Node
Definition coloring1.cpp:46
Tpetra::Vector< z2TestScalar, z2TestLO, z2TestGO > Vector
Definition coloring1.cpp:45
Created by mbenlioglu on Aug 31, 2020.
::Tpetra::Details::DefaultTypes::node_type default_node_t
::Tpetra::Details::DefaultTypes::local_ordinal_type default_lno_t
size_t default_offset_t
::Tpetra::Details::DefaultTypes::global_ordinal_type default_gno_t
::Tpetra::Details::DefaultTypes::scalar_type default_scalar_t
The traits required of User input classes or structures.
default_offset_t offset_t
The data type to represent offsets.
default_gno_t gno_t
The ordinal type (e.g., int, long, int64_t) that can represent global counts and identifiers.
default_node_t node_t
The Kokkos node type. This is only meaningful for users of Tpetra objects.
default_lno_t lno_t
The ordinal type (e.g., int, long, int64_t) that represents local counts and local indices.
default_part_t part_t
The data type to represent part numbers.
static std::string name()
The name of the user's input object.
default_scalar_t scalar_t
The data type for weights and coordinates.