-
Notifications
You must be signed in to change notification settings - Fork 1
/
gb_array_datatype.F90
185 lines (160 loc) · 7.35 KB
/
gb_array_datatype.F90
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
module gb_array_datatype
use iso_fortran_env
use mpi_f08
use gb_element_datatype
implicit none
#ifdef ENABLE_SELECT_RANK
interface get_array_datatype
module procedure get_array_datatype_all
end interface
contains
function get_array_datatype_all(buffer) result(datatype)
class(*), dimension(..), intent(in) :: buffer
type(MPI_Datatype) :: datatype
select rank (buffer)
rank(0)
datatype = get_element_datatype(buffer)
rank(1)
datatype = get_element_datatype(buffer(1))
rank(2)
datatype = get_element_datatype(buffer(1,1))
rank(3)
datatype = get_element_datatype(buffer(1,1,1))
rank(4)
datatype = get_element_datatype(buffer(1,1,1,1))
rank(5)
datatype = get_element_datatype(buffer(1,1,1,1,1))
rank(6)
datatype = get_element_datatype(buffer(1,1,1,1,1,1))
rank(7)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1))
rank(8)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1))
rank(9)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1))
rank(10)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1))
rank(11)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1))
rank(12)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1))
rank(13)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1,1))
rank(14)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1,1,1))
rank(15)
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
end select
end function
#else
interface get_array_datatype
module procedure get_array_datatype_d0
module procedure get_array_datatype_d1
module procedure get_array_datatype_d2
module procedure get_array_datatype_d3
module procedure get_array_datatype_d4
module procedure get_array_datatype_d5
module procedure get_array_datatype_d6
module procedure get_array_datatype_d7
#ifdef ENABLE_8D_ARRAYS
module procedure get_array_datatype_d8
module procedure get_array_datatype_d9
module procedure get_array_datatype_d10
module procedure get_array_datatype_d11
module procedure get_array_datatype_d12
module procedure get_array_datatype_d13
module procedure get_array_datatype_d14
#ifdef ENABLE_15D_ARRAYS
module procedure get_array_datatype_d15
#endif
#endif
end interface
contains
function get_array_datatype_d0(buffer) result(datatype)
class(*), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer)
end function
function get_array_datatype_d1(buffer) result(datatype)
class(*), dimension(:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1))
end function
function get_array_datatype_d2(buffer) result(datatype)
class(*), dimension(:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1))
end function
function get_array_datatype_d3(buffer) result(datatype)
class(*), dimension(:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1))
end function
function get_array_datatype_d4(buffer) result(datatype)
class(*), dimension(:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1))
end function
function get_array_datatype_d5(buffer) result(datatype)
class(*), dimension(:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1))
end function
function get_array_datatype_d6(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1))
end function
function get_array_datatype_d7(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1))
end function
#if ENABLE_8D_ARRAYS
function get_array_datatype_d8(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1))
end function
function get_array_datatype_d9(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1))
end function
function get_array_datatype_d10(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1))
end function
function get_array_datatype_d11(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1))
end function
function get_array_datatype_d12(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1))
end function
function get_array_datatype_d13(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1,1))
end function
function get_array_datatype_d14(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:,:,:,:,:,:), intent(in) :: buffer
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1,1,1))
end function
#if ENABLE_15D_ARRAYS
! GCC 11 does not like this (sometimes)
function get_array_datatype_d15(buffer) result(datatype)
class(*), dimension(:,:,:,:,:,:,:,:,:,:,:,:,:,:,:), intent(in) :: buffer
! 1 2 3 4 5 6 7 8 9 A B C D E F
type(MPI_Datatype) :: datatype
datatype = get_element_datatype(buffer(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
end function
#endif ! ENABLE_15D_ARRAYS
#endif ! ENABLE_8D_ARRAYS
#endif ! ENABLE_SELECT_RANK
end module gb_array_datatype