-
Notifications
You must be signed in to change notification settings - Fork 11
/
Vector3DHemeLb.cc
62 lines (52 loc) · 1.62 KB
/
Vector3DHemeLb.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// This file is part of HemeLB and is Copyright (C)
// the HemeLB team and/or their institutions, as detailed in the
// file AUTHORS. This software is provided under the terms of the
// license in the file LICENSE.
#include "util/Vector3D.h"
#include "net/mpi.h"
#include "Exception.h"
namespace hemelb
{
namespace net
{
template<typename vectorType>
MPI_Datatype GenerateTypeForVector()
{
const int typeCount = 1;
int blocklengths[typeCount] = { 3 };
MPI_Datatype types[typeCount] = { net::MpiDataType<vectorType>() };
MPI_Aint displacements[typeCount] = { 0 };
MPI_Datatype ret;
HEMELB_MPI_CALL(MPI_Type_create_struct, (typeCount, blocklengths, displacements, types, &ret));
HEMELB_MPI_CALL(MPI_Type_commit, (&ret));
return ret;
}
template<>
MPI_Datatype MpiDataTypeTraits<hemelb::util::Vector3D<float> >::RegisterMpiDataType()
{
return GenerateTypeForVector<float>();
}
template<>
MPI_Datatype MpiDataTypeTraits<hemelb::util::Vector3D<site_t> >::RegisterMpiDataType()
{
return GenerateTypeForVector<site_t>();
}
template<>
MPI_Datatype MpiDataTypeTraits<hemelb::util::Vector3D<distribn_t> >::RegisterMpiDataType()
{
return GenerateTypeForVector<distribn_t>();
}
}
namespace util
{
namespace
{
void DefaultHandlerFunction(int direction)
{
// TODO need to find a way of handling this case better.
throw Exception() << "Failed while accessing a direction in Vector3D.";
}
}
Vector3DBase::HandlerFunction* Vector3DBase::handler = DefaultHandlerFunction;
}
}