36 procedure irobust_sort_by_abs, drobust_sort_by_abs
69 subroutine dsort1(size, array)
70 use,
intrinsic :: iso_fortran_env
72 integer,
intent(in) :: size
73 real(real64),
intent(inout) :: array(*)
76 subroutine dsort2(size, array, indices)
77 use,
intrinsic :: iso_fortran_env
79 integer,
intent(in) :: size
80 real(real64),
intent(inout) :: array(*)
81 integer,
intent(out) :: indices(*)
84 subroutine isort1(size, array)
86 integer,
intent(in) :: size
87 integer,
intent(inout) :: array(*)
90 subroutine isort2(size, array, indices)
92 integer,
intent(in) :: size
93 integer,
intent(inout) :: array(*)
94 integer,
intent(out) :: indices(*)
97 subroutine lsort1(size, array)
98 use,
intrinsic :: iso_fortran_env
100 integer,
intent(in) :: size
101 integer(int64),
intent(inout) :: array(*)
104 subroutine lsort2(size, array, indices)
105 use,
intrinsic :: iso_fortran_env
107 integer,
intent(in) :: size
108 integer(int64),
intent(inout) :: array(*)
109 integer,
intent(out) :: indices(*)
116 subroutine dsort(a, ind)
117 real(real64),
intent(inout) :: a(:)
118 integer,
optional,
intent(out) :: ind(:)
122 if (
size(a) > 0)
then
124 if (.not.
present(ind))
then
127 call dsort2(
size(a), a, ind)
138 subroutine isort(a, ind)
139 integer,
intent(inout) :: a(:)
140 integer,
optional,
intent(out) :: ind(:)
144 if (
size(a) > 0)
then
146 if (.not.
present(ind))
then
149 call isort2(
size(a), a, ind)
159 subroutine lsort(a, ind)
160 integer(int64),
intent(inout) :: a(:)
161 integer,
optional,
intent(out) :: ind(:)
165 if (
size(a) > 0)
then
167 if (.not.
present(ind))
then
170 call lsort2(
size(a), a, ind)
180 pure logical function iless_idx(i, j, off, kabs, ksgn)
result(less)
181 integer,
intent(in) :: i, j
182 integer,
intent(in) :: off(:, :)
183 real(int64),
intent(in) :: kabs(:)
184 integer,
intent(in) :: ksgn(:)
189 less = kabs(i) < kabs(j)
193 if (ksgn(i) /= ksgn(j))
then
194 less = ksgn(i) < ksgn(j)
200 if (off(d,i) /= off(d,j))
then
201 less = off(d,i) < off(d,j)
210 pure logical function dless_idx(i, j, off, kabs, ksgn)
result(less)
211 integer,
intent(in) :: i, j
212 real(int64),
intent(in) :: off(:, :)
213 real(int64),
intent(in) :: kabs(:)
214 integer,
intent(in) :: ksgn(:)
219 less = kabs(i) < kabs(j)
223 if (ksgn(i) /= ksgn(j))
then
224 less = ksgn(i) < ksgn(j)
231 less = off(d,i) < off(d,j)
239 logical pure function are_different(x, y)
240 real(real64),
intent(in) :: x,y
241 are_different = abs(x - y) > abs(y) * 1.0e-14_real64 + 1.0e-14_real64
246 integer,
intent(inout) :: perm(:), tmp(:)
247 integer,
intent(in) :: l, r
248 integer,
intent(in) :: off(:, :)
249 real(real64),
intent(in) :: kabs(:)
250 integer,
intent(in) :: ksgn(:)
252 integer :: m, i, j, k
260 i = l; j = m+1; k = l
261 do while (i <= m .and. j <= r)
262 if (
iless_idx(perm(i), perm(j), off, kabs, ksgn))
then
263 tmp(k) = perm(i); i = i+1
265 tmp(k) = perm(j); j = j+1
269 do while (i <= m); tmp(k) = perm(i); i=i+1; k=k+1;
end do
270 do while (j <= r); tmp(k) = perm(j); j=j+1; k=k+1;
end do
277 integer,
intent(inout) :: perm(:), tmp(:)
278 integer,
intent(in) :: l, r
279 real(real64),
intent(in) :: off(:, :)
280 real(real64),
intent(in) :: kabs(:)
281 integer,
intent(in) :: ksgn(:)
283 integer :: m, i, j, k
291 i = l; j = m+1; k = l
292 do while (i <= m .and. j <= r)
293 if (
dless_idx(perm(i), perm(j), off, kabs, ksgn))
then
294 tmp(k) = perm(i); i = i+1
296 tmp(k) = perm(j); j = j+1
300 do while (i <= m); tmp(k) = perm(i); i=i+1; k=k+1;
end do
301 do while (j <= r); tmp(k) = perm(j); j=j+1; k=k+1;
end do
313 real(real64),
intent(in) :: v(:)
314 integer,
intent(in) :: off(:, :)
315 integer,
intent(out) :: perm(size(v))
316 logical,
intent(in),
optional :: negative_first
320 integer,
allocatable :: tmp(:)
321 real(real64),
allocatable :: kabs(:)
322 integer,
allocatable :: ksgn(:)
327 assert(
size(off, dim=2) == n)
329 neg_first = optional_default(negative_first, .
true.)
331 allocate(tmp(n), kabs(n), ksgn(n))
338 ksgn(i) = merge(0, 1, v(i) < 0.0_real64)
340 ksgn(i) = merge(0, 1, v(i) >= 0.0_real64)
346 deallocate(tmp, kabs, ksgn)
351 real(real64),
intent(in) :: v(:)
352 real(real64),
intent(in) :: off(:, :)
353 integer,
intent(out) :: perm(size(v))
354 logical,
intent(in),
optional :: negative_first
358 integer,
allocatable :: tmp(:)
359 real(real64),
allocatable :: kabs(:)
360 integer,
allocatable :: ksgn(:)
365 assert(
size(off, dim=2) == n)
367 neg_first = optional_default(negative_first, .
true.)
369 allocate(tmp(n), kabs(n), ksgn(n))
376 ksgn(i) = merge(0, 1, v(i) < 0.0_real64)
378 ksgn(i) = merge(0, 1, v(i) >= 0.0_real64)
384 deallocate(tmp, kabs, ksgn)
390#include "complex.F90"
391#include "sort_inc.F90"
395#include "sort_inc.F90"
398#include "integer.F90"
399#include "sort_inc.F90"
This is the common interface to a sorting routine. It performs the shell algorithm,...
This module is intended to contain "only mathematical" functions and procedures.
subroutine ishellsort2(a, x)
subroutine drobust_sort_by_abs(v, off, perm, negative_first)
recursive subroutine dmergesort_perm(perm, tmp, l, r, off, kabs, ksgn)
Perform the permutations for the sorting.
subroutine dshellsort1(a, x)
subroutine zshellsort2(a, x)
subroutine isort(a, ind)
Shell sort for integer arrays.
subroutine irobust_sort_by_abs(v, off, perm, negative_first)
Robbust sorting of floating point numbers by absolute values.
subroutine ishellsort1(a, x)
subroutine dshellsort2(a, x)
logical pure function are_different(x, y)
pure logical function dless_idx(i, j, off, kabs, ksgn)
Sorting criterium for the robust sorting below.
subroutine lsort(a, ind)
Shell sort for integer(int64) arrays.
subroutine zshellsort1(a, x)
recursive subroutine imergesort_perm(perm, tmp, l, r, off, kabs, ksgn)
Perform the permutations for the sorting.
pure logical function iless_idx(i, j, off, kabs, ksgn)
Sorting criterium for the robust sorting below.