SCALE-RM
scale_sort.F90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
10 #include "scalelib.h"
11 module scale_sort
12  !-----------------------------------------------------------------------------
13  !
14  !++ used modules
15  !
16  use scale_precision
17  use scale_io
18  !-----------------------------------------------------------------------------
19  implicit none
20  private
21  !-----------------------------------------------------------------------------
22  !
23  !++ Public procedure
24  !
25  public :: sort_exec
26 
27  interface sort_exec
28  module procedure sort_exec_without_idx
29  module procedure sort_exec_with_idxs
30  module procedure sort_exec_with_idx
31  end interface sort_exec
32 
33  !-----------------------------------------------------------------------------
34  !
35  !++ Public parameters & variables
36  !
37  !-----------------------------------------------------------------------------
38  !
39  !++ Private procedure
40  !
41  !-----------------------------------------------------------------------------
42  !
43  !++ Private parameters & variables
44  !
45  !-----------------------------------------------------------------------------
46 contains
47  !-----------------------------------------------------------------------------
49 !OCL SERIAL
50  subroutine sort_exec_with_idxs( &
51  npoints, &
52  val, &
53  idx_i, idx_j, &
54  reverse )
55  implicit none
56  integer, intent(in) :: npoints ! number of interpolation points
57  real(RP), intent(inout) :: val (npoints) ! value to sort
58  integer, intent(inout) :: idx_i(npoints) ! i-index
59  integer, intent(inout) :: idx_j(npoints) ! j-index
60 
61  logical, intent(in), optional :: reverse
62 
63  real(RP) :: sig
64  integer :: itmp
65  integer :: jtmp
66  real(RP) :: vtmp
67 
68  integer :: n1, n2
69  !---------------------------------------------------------------------------
70 
71  sig = 1.0_rp
72  if ( present(reverse) ) then
73  if ( reverse ) sig = -1.0_rp
74  end if
75 
76  do n1 = 1, npoints-1
77  do n2 = n1+1, npoints
78  if ( val(n1) * sig > val(n2) * sig ) then
79  itmp = idx_i(n1)
80  jtmp = idx_j(n1)
81  vtmp = val(n1)
82 
83  idx_i(n1) = idx_i(n2)
84  idx_j(n1) = idx_j(n2)
85  val(n1) = val(n2)
86 
87  idx_i(n2) = itmp
88  idx_j(n2) = jtmp
89  val(n2) = vtmp
90  endif
91  enddo
92  enddo
93 
94  return
95  end subroutine sort_exec_with_idxs
96 
97 !OCL SERIAL
98  subroutine sort_exec_with_idx( &
99  npoints, &
100  val, index, &
101  reverse )
102  implicit none
103  integer, intent(in) :: npoints ! number of interpolation points
104  real(RP), intent(inout) :: val (npoints) ! value to sort
105  integer, intent(inout) :: index(npoints) ! index
106 
107  logical, intent(in), optional :: reverse
108 
109  real(RP) :: sig
110  integer :: itmp
111  real(RP) :: vtmp
112 
113  integer :: n1, n2
114  !---------------------------------------------------------------------------
115 
116  sig = 1.0_rp
117  if ( present(reverse) ) then
118  if ( reverse ) sig = -1.0_rp
119  end if
120 
121  do n1 = 1, npoints-1
122  do n2 = n1+1, npoints
123  if ( val(n1) * sig > val(n2) * sig ) then
124  itmp = index(n1)
125  vtmp = val(n1)
126 
127  index(n1) = index(n2)
128  val(n1) = val(n2)
129 
130  index(n2) = itmp
131  val(n2) = vtmp
132  endif
133  enddo
134  enddo
135 
136  return
137  end subroutine sort_exec_with_idx
138 
139 !OCL SERIAL
140  subroutine sort_exec_without_idx( &
141  npoints, &
142  val, &
143  reverse )
144  implicit none
145  integer, intent(in) :: npoints ! number of interpolation points
146  real(RP), intent(inout) :: val (npoints) ! value to sort
147 
148  logical, intent(in), optional :: reverse
149 
150  real(RP) :: sig
151  real(RP) :: vtmp
152 
153  integer :: n1, n2
154  !---------------------------------------------------------------------------
155 
156  sig = 1.0_rp
157  if ( present(reverse) ) then
158  if ( reverse ) sig = -1.0_rp
159  end if
160 
161  do n1 = 1, npoints-1
162  do n2 = n1+1, npoints
163  if ( val(n1) * sig > val(n2) * sig ) then
164  vtmp = val(n1)
165 
166  val(n1) = val(n2)
167 
168  val(n2) = vtmp
169  endif
170  enddo
171  enddo
172 
173  return
174  end subroutine sort_exec_without_idx
175 
176 end module scale_sort
scale_precision
module PRECISION
Definition: scale_precision.F90:14
scale_sort
module SORT
Definition: scale_sort.F90:11
scale_io
module STDIO
Definition: scale_io.F90:10