1program TestBPWriteReadHeatMap6D
2  use mpi
3  use adios2
4
5  implicit none
6
7  integer(kind=8) :: sum_i1, sum_i2
8  type(adios2_adios) :: adios
9  type(adios2_io) :: ioPut, ioGet
10  type(adios2_engine) :: bpWriter, bpReader
11  type(adios2_variable), dimension(6) :: var_temperatures, var_temperaturesIn
12
13  integer(kind=1), dimension(:, :, :, :, :, :), allocatable :: temperatures_i1, &
14                                                               sel_temperatures_i1
15
16  integer(kind=2), dimension(:, :, :, :, :, :), allocatable :: temperatures_i2, &
17                                                               sel_temperatures_i2
18
19  integer(kind=4), dimension(:, :, :, :, :, :), allocatable :: temperatures_i4, &
20                                                               sel_temperatures_i4
21
22  integer(kind=8), dimension(:, :, :, :, :, :), allocatable :: temperatures_i8, &
23                                                               sel_temperatures_i8
24
25  real(kind=4), dimension(:, :, :, :, :, :), allocatable :: temperatures_r4, &
26                                                            sel_temperatures_r4
27
28  real(kind=8), dimension(:, :, :, :, :, :), allocatable :: temperatures_r8, &
29                                                            sel_temperatures_r8
30
31  integer(kind=8), dimension(6) :: ishape, istart, icount
32  integer(kind=8), dimension(6) :: sel_start, sel_count
33  integer :: ierr, irank, isize
34  integer :: in1, in2, in3, in4, in5, in6
35  integer :: i1, i2, i3, i4, i5, i6
36
37  call MPI_INIT(ierr)
38  call MPI_COMM_RANK(MPI_COMM_WORLD, irank, ierr)
39  call MPI_COMM_SIZE(MPI_COMM_WORLD, isize, ierr)
40
41  in1 = 10
42  in2 = 10
43  in3 = 10
44  in4 = 10
45  in5 = 10
46  in6 = 10
47
48  icount = (/in1, in2, in3, in4, in5, in6/)
49  istart = (/0, 0, 0, 0, 0, in6*irank/)
50  ishape = (/in1, in2, in3, in4, in5, in6*isize/)
51
52  allocate (temperatures_i1(in1, in2, in3, in4, in5, in6))
53  allocate (temperatures_i2(in1, in2, in3, in4, in5, in6))
54  allocate (temperatures_i4(in1, in2, in3, in4, in5, in6))
55  allocate (temperatures_i8(in1, in2, in3, in4, in5, in6))
56  allocate (temperatures_r4(in1, in2, in3, in4, in5, in6))
57  allocate (temperatures_r8(in1, in2, in3, in4, in5, in6))
58
59  temperatures_i1 = 1
60  temperatures_i2 = 1
61  temperatures_i4 = 1
62  temperatures_i8 = 1_8
63  temperatures_r4 = 1.0
64  temperatures_r8 = 1.0_8
65
66  ! Start adios2 Writer
67  call adios2_init(adios, MPI_COMM_WORLD, adios2_debug_mode_on, ierr)
68  call adios2_declare_io(ioPut, adios, 'HeatMapWrite', ierr)
69
70  call adios2_define_variable(var_temperatures(1), ioPut, &
71                              'temperatures_i1', adios2_type_integer1, &
72                              6, ishape, istart, icount, &
73                              adios2_constant_dims, ierr)
74
75  call adios2_define_variable(var_temperatures(2), ioPut, &
76                              'temperatures_i2', adios2_type_integer2, &
77                              6, ishape, istart, icount, &
78                              adios2_constant_dims, ierr)
79
80  call adios2_define_variable(var_temperatures(3), ioPut, &
81                              'temperatures_i4', adios2_type_integer4, &
82                              6, ishape, istart, icount, &
83                              adios2_constant_dims, ierr)
84
85  call adios2_define_variable(var_temperatures(4), ioPut, &
86                              'temperatures_i8', adios2_type_integer8, &
87                              6, ishape, istart, icount, &
88                              adios2_constant_dims, ierr)
89
90  call adios2_define_variable(var_temperatures(5), ioPut, &
91                              'temperatures_r4', adios2_type_real, &
92                              6, ishape, istart, icount, &
93                              adios2_constant_dims, ierr)
94
95  call adios2_define_variable(var_temperatures(6), ioPut, &
96                              'temperatures_r8', adios2_type_dp, &
97                              6, ishape, istart, icount, &
98                              adios2_constant_dims, ierr)
99
100  call adios2_open(bpWriter, ioPut, 'HeatMap6D_f.bp', adios2_mode_write, &
101                   ierr)
102
103  call adios2_put(bpWriter, var_temperatures(1), temperatures_i1, ierr)
104  call adios2_put(bpWriter, var_temperatures(2), temperatures_i2, ierr)
105  call adios2_put(bpWriter, var_temperatures(3), temperatures_i4, ierr)
106  call adios2_put(bpWriter, var_temperatures(4), temperatures_i8, ierr)
107  call adios2_put(bpWriter, var_temperatures(5), temperatures_r4, ierr)
108  call adios2_put(bpWriter, var_temperatures(6), temperatures_r8, ierr)
109
110  call adios2_close(bpWriter, ierr)
111
112  if (allocated(temperatures_i1)) deallocate (temperatures_i1)
113  if (allocated(temperatures_i2)) deallocate (temperatures_i2)
114  if (allocated(temperatures_i4)) deallocate (temperatures_i4)
115  if (allocated(temperatures_i8)) deallocate (temperatures_i8)
116  if (allocated(temperatures_r4)) deallocate (temperatures_r4)
117  if (allocated(temperatures_r8)) deallocate (temperatures_r8)
118
119  ! Start adios2 Reader in rank 0
120  if (irank == 0) then
121
122    call adios2_declare_io(ioGet, adios, 'HeatMapRead', ierr)
123
124    call adios2_open(bpReader, ioGet, 'HeatMap6D_f.bp', &
125                     adios2_mode_read, MPI_COMM_SELF, ierr)
126
127    call adios2_inquire_variable(var_temperaturesIn(1), ioGet, &
128                                 'temperatures_i1', ierr)
129    call adios2_inquire_variable(var_temperaturesIn(2), ioGet, &
130                                 'temperatures_i2', ierr)
131    call adios2_inquire_variable(var_temperaturesIn(3), ioGet, &
132                                 'temperatures_i4', ierr)
133    call adios2_inquire_variable(var_temperaturesIn(4), ioGet, &
134                                 'temperatures_i8', ierr)
135    call adios2_inquire_variable(var_temperaturesIn(5), ioGet, &
136                                 'temperatures_r4', ierr)
137    call adios2_inquire_variable(var_temperaturesIn(6), ioGet, &
138                                 'temperatures_r8', ierr)
139
140    sel_start = (/0, 0, 0, 0, 0, 0/)
141    sel_count = (/ishape(1), ishape(2), ishape(3), ishape(4), ishape(5), &
142                  ishape(6)/)
143
144    allocate (sel_temperatures_i1(ishape(1), ishape(2), ishape(3), ishape(4), &
145                                  ishape(5), ishape(6)))
146    allocate (sel_temperatures_i2(ishape(1), ishape(2), ishape(3), ishape(4), &
147                                  ishape(5), ishape(6)))
148    allocate (sel_temperatures_i4(ishape(1), ishape(2), ishape(3), ishape(4), &
149                                  ishape(5), ishape(6)))
150    allocate (sel_temperatures_i8(ishape(1), ishape(2), ishape(3), ishape(4), &
151                                  ishape(5), ishape(6)))
152    allocate (sel_temperatures_r4(ishape(1), ishape(2), ishape(3), ishape(4), &
153                                  ishape(5), ishape(6)))
154    allocate (sel_temperatures_r8(ishape(1), ishape(2), ishape(3), ishape(4), &
155                                  ishape(5), ishape(6)))
156
157    sel_temperatures_i1 = 0
158    sel_temperatures_i2 = 0
159    sel_temperatures_i4 = 0
160    sel_temperatures_i8 = 0_8
161    sel_temperatures_r4 = 0.0_4
162    sel_temperatures_r8 = 0.0_8
163
164    call adios2_set_selection(var_temperaturesIn(1), 6, sel_start, sel_count, &
165                              ierr)
166    call adios2_set_selection(var_temperaturesIn(2), 6, sel_start, sel_count, &
167                              ierr)
168    call adios2_set_selection(var_temperaturesIn(3), 6, sel_start, sel_count, &
169                              ierr)
170    call adios2_set_selection(var_temperaturesIn(4), 6, sel_start, sel_count, &
171                              ierr)
172    call adios2_set_selection(var_temperaturesIn(5), 6, sel_start, sel_count, &
173                              ierr)
174    call adios2_set_selection(var_temperaturesIn(6), 6, sel_start, sel_count, &
175                              ierr)
176
177    call adios2_get(bpReader, var_temperaturesIn(1), sel_temperatures_i1, ierr)
178    call adios2_get(bpReader, var_temperaturesIn(2), sel_temperatures_i2, ierr)
179    call adios2_get(bpReader, var_temperaturesIn(3), sel_temperatures_i4, ierr)
180    call adios2_get(bpReader, var_temperaturesIn(4), sel_temperatures_i8, ierr)
181    call adios2_get(bpReader, var_temperaturesIn(5), sel_temperatures_r4, ierr)
182    call adios2_get(bpReader, var_temperaturesIn(6), sel_temperatures_r8, ierr)
183
184
185    call adios2_close(bpReader, ierr)
186
187    sum_i1 = 0
188    sum_i2 = 0
189
190    do i6 = 1, sel_count(6)
191      do i5 = 1, sel_count(5)
192        do i4 = 1, sel_count(4)
193          do i3 = 1, sel_count(3)
194            do i2 = 1, sel_count(2)
195              do i1 = 1, sel_count(1)
196                sum_i1 = sum_i1 + sel_temperatures_i1(i1, i2, i3, i4, i5, i6)
197                sum_i2 = sum_i2 + sel_temperatures_i2(i1, i2, i3, i4, i5, i6)
198              end do
199            end do
200          end do
201        end do
202      end do
203    end do
204
205    if (sum_i1 /= 1000000*isize) stop 'Test failed integer*1'
206    if (sum_i2 /= 1000000*isize) stop 'Test failed integer*2'
207    if (sum(sel_temperatures_i4) /= 1000000*isize) stop 'Test failed integer*4'
208    if (sum(sel_temperatures_i8) /= 1000000*isize) stop 'Test failed integer*8'
209    if (sum(sel_temperatures_r4) /= 1000000*isize) stop 'Test failed real*4'
210    if (sum(sel_temperatures_r8) /= 1000000*isize) stop 'Test failed real*8'
211
212    if (allocated(sel_temperatures_i1)) deallocate (sel_temperatures_i1)
213    if (allocated(sel_temperatures_i2)) deallocate (sel_temperatures_i2)
214    if (allocated(sel_temperatures_i4)) deallocate (sel_temperatures_i4)
215    if (allocated(sel_temperatures_i8)) deallocate (sel_temperatures_i8)
216    if (allocated(sel_temperatures_r4)) deallocate (sel_temperatures_r4)
217    if (allocated(sel_temperatures_r8)) deallocate (sel_temperatures_r8)
218
219  end if
220
221  call adios2_finalize(adios, ierr)
222  call MPI_Finalize(ierr)
223
224end program TestBPWriteReadHeatMap6D
225