Yet Another eXchange Tool  DO_NOT_EDIT_HERE
test_redist_collection_static_f.f90
1 
13 
14 !
15 ! Keywords:
16 ! Maintainer: Jörg Behrens <behrens@dkrz.de>
17 ! Moritz Hanke <hanke@dkrz.de>
18 ! Thomas Jahns <jahns@dkrz.de>
19 ! URL: https://doc.redmine.dkrz.de/yaxt/html/
20 !
21 ! Redistribution and use in source and binary forms, with or without
22 ! modification, are permitted provided that the following conditions are
23 ! met:
24 !
25 ! Redistributions of source code must retain the above copyright notice,
26 ! this list of conditions and the following disclaimer.
27 !
28 ! Redistributions in binary form must reproduce the above copyright
29 ! notice, this list of conditions and the following disclaimer in the
30 ! documentation and/or other materials provided with the distribution.
31 !
32 ! Neither the name of the DKRZ GmbH nor the names of its contributors
33 ! may be used to endorse or promote products derived from this software
34 ! without specific prior written permission.
35 !
36 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
37 ! IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
38 ! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
39 ! PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
40 ! OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
41 ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
42 ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
43 ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
44 ! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
45 ! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
46 ! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47 !
48 PROGRAM test_redist_collection_static
49  USE mpi
50  USE ftest_common, ONLY: init_mpi, finish_mpi, test_abort
51  USE test_idxlist_utils, ONLY: test_err_count
52  USE yaxt, ONLY: xt_initialize, xt_finalize, &
53  xt_xmap, xt_xmap_delete, &
56  USE test_redist_common, ONLY: build_odd_selection_xmap, check_redist
57  IMPLICIT NONE
58  CALL init_mpi
59  CALL xt_initialize(mpi_comm_world)
60 
61  CALL simple_test
62  CALL test_repeated_redist
63 
64  IF (test_err_count() /= 0) &
65  CALL test_abort("non-zero error count!", &
66  __file__, &
67  __line__)
68  CALL xt_finalize
69  CALL finish_mpi
70 CONTAINS
71  SUBROUTINE simple_test
72  ! general test with one redist
73  ! set up data
74  TYPE(xt_xmap) :: xmap
75  TYPE(xt_redist) :: redist, redist_coll
76  INTEGER, PARAMETER :: src_slice_len = 5, dst_slice_len = 3
77  DOUBLE PRECISION, PARAMETER :: &
78  src_data(src_slice_len) = (/ 1.0d0, 2.0d0, 3.0d0, 4.0d0, 5.0d0 /), &
79  ref_dst_data(dst_slice_len) = (/ 1.0d0, 3.0d0, 5.0d0 /)
80  DOUBLE PRECISION :: dst_data(dst_slice_len)
81  INTEGER(mpi_address_kind), PARAMETER :: &
82  src_displacements(1) = 0_mpi_address_kind, &
83  dst_displacements(1) = 0_mpi_address_kind
84 
85  xmap = build_odd_selection_xmap(src_slice_len)
86 
87  redist = xt_redist_p2p_new(xmap, mpi_double_precision)
88 
89  CALL xt_xmap_delete(xmap)
90 
91  ! generate redist_collection
92  redist_coll = xt_redist_collection_static_new((/ redist /), 1, &
93  src_displacements, dst_displacements, mpi_comm_world)
94 
95  CALL xt_redist_delete(redist)
96 
97  ! test exchange
98  CALL check_redist(redist_coll, src_data, dst_data, ref_dst_data)
99 
100  ! clean up
101  CALL xt_redist_delete(redist_coll)
102  END SUBROUTINE simple_test
103 
104  SUBROUTINE test_repeated_redist_ds1(redist_coll)
105  TYPE(xt_redist), INTENT(in) :: redist_coll
106  INTEGER :: i, j
107  DOUBLE PRECISION, PARAMETER :: src_data(5, 3) &
108  = reshape((/ (dble(i), i = 1, 15)/), (/ 5, 3 /)), &
109  ref_dst_data(3, 3) &
110  = reshape((/ ((dble(i + j), i = 1,5,2), j = 0,10,5) /), (/ 3, 3 /))
111  DOUBLE PRECISION :: dst_data(3, 3)
112 
113  CALL check_redist(redist_coll, src_data, dst_data, ref_dst_data)
114  END SUBROUTINE test_repeated_redist_ds1
115 
116  SUBROUTINE test_repeated_redist_ds2(redist_coll)
117  TYPE(xt_redist), INTENT(in) :: redist_coll
118  INTEGER :: i, j
119  DOUBLE PRECISION, PARAMETER :: src_data(5, 3) = reshape((/&
120  (dble(i), i = 20, 34)/), (/ 5, 3 /)), &
121  ref_dst_data(3, 3) &
122  = reshape((/ ((dble(i + j), i = 1,5,2), j = 19,33,5) /), (/ 3, 3 /))
123  DOUBLE PRECISION, SAVE :: dst_data(3, 3)
124 
125  CALL check_redist(redist_coll, src_data, dst_data, ref_dst_data)
126  END SUBROUTINE test_repeated_redist_ds2
127 
128  SUBROUTINE test_repeated_redist
129  ! test with one redist used three times (with two different input data
130  ! displacements -> test of cache) (with default cache size)
131  ! set up data
132  INTEGER, PARAMETER :: num_slice = 3
133  INTEGER, PARAMETER :: src_slice_len = 5
134  TYPE(xt_xmap) :: xmap
135  TYPE(xt_redist) :: redist, redists(num_slice), redist_coll
136  INTEGER(mpi_address_kind) :: src_displacements(num_slice), &
137  dst_displacements(num_slice), src_base, dst_base, temp
138  DOUBLE PRECISION, TARGET :: src_template(5, 3), dst_template(3, 3)
139  INTEGER :: i, ierror
140 
141  xmap = build_odd_selection_xmap(src_slice_len)
142 
143  redist = xt_redist_p2p_new(xmap, mpi_double_precision)
144 
145  CALL xt_xmap_delete(xmap)
146 
147  ! generate redist_collection
148  redists = redist
149  src_displacements(1) = 0_mpi_address_kind
150  dst_displacements(1) = 0_mpi_address_kind
151  CALL mpi_get_address(src_template(1, 1), src_base, ierror)
152  CALL mpi_get_address(dst_template(1, 1), dst_base, ierror)
153  DO i = 2, num_slice
154  CALL mpi_get_address(src_template(1, i), temp, ierror)
155  src_displacements(i) = temp - src_base
156  CALL mpi_get_address(dst_template(1, i), temp, ierror)
157  dst_displacements(i) = temp - dst_base
158  END DO
159 
160  redist_coll = xt_redist_collection_static_new(redists, num_slice, &
161  src_displacements, dst_displacements, mpi_comm_world)
162  CALL xt_redist_delete(redist)
163 
164  ! test exchange
165  CALL test_repeated_redist_ds1(redist_coll)
166  ! test exchange with changed displacements
167  CALL test_repeated_redist_ds2(redist_coll)
168  ! test exchange with original displacements
169  CALL test_repeated_redist_ds1(redist_coll)
170  ! clean up
171  CALL xt_redist_delete(redist_coll)
172  END SUBROUTINE test_repeated_redist
173 
174 END PROGRAM test_redist_collection_static
175 !
176 ! Local Variables:
177 ! f90-continuation-indent: 5
178 ! coding: utf-8
179 ! indent-tabs-mode: nil
180 ! show-trailing-whitespace: t
181 ! require-trailing-newline: t
182 ! End:
183 !