From 406336b857c3ba37957fb7f501ea099b65848ca9 Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Sun, 22 Mar 2020 19:37:21 +0100 Subject: [PATCH 1/8] Squashed commit of the following: commit 155ddc2090f4dd80fdd76d3bd8caee49faad0636 Author: Vandenplas, Jeremie Date: Sun Mar 22 19:12:07 2020 +0100 rawmoment: update spec commit a365ea03d750ffeb9047ce316281649dfa83e858 Author: Vandenplas, Jeremie Date: Sun Mar 22 18:56:46 2020 +0100 rawmoment: small change in spec commit d955c0ca69bcfde84867c570340c851194670396 Author: Vandenplas, Jeremie Date: Sun Mar 22 18:03:49 2020 +0100 rawmoment: correction commit 0480bc1b86f112b91fd56201980c6edae7b33522 Author: Vandenplas, Jeremie Date: Sun Mar 22 17:57:24 2020 +0100 rawmoment: small correction commit fcc6a43a5aaa3bed5d231b0d6c5399ae50b49830 Author: Vandenplas, Jeremie Date: Sun Mar 22 17:52:30 2020 +0100 rawmoment: cleaning commit c63ea07c085e9e06fcade4c4dfc3153ee9a65581 Author: Vandenplas, Jeremie Date: Sun Mar 22 15:48:40 2020 +0100 rawmoment: progress in test files commit ef6deec42e8756e5fae5581c81173105420e6172 Author: Vandenplas, Jeremie Date: Sun Mar 22 15:42:46 2020 +0100 rawmoment: progress commit a31654ce62cd3c8a66c4ec17204182a6ff2767ba Author: Vandenplas, Jeremie Date: Sun Mar 22 14:03:50 2020 +0100 rawmoment: start tests raw moment commit 78d7fb9542613a4ce0377e559da03a0ab9d0f55f Author: Vandenplas, Jeremie Date: Sun Mar 22 13:37:02 2020 +0100 rawmoment: addition of test commit 0e9318726445682efcda9b9b4f9750d0aff5d75c Author: Vandenplas, Jeremie Date: Sun Mar 22 11:55:31 2020 +0100 rawmoment: start to add center in test --- src/stdlib_experimental_stats.fypp | 24 +- src/stdlib_experimental_stats.md | 45 +- src/stdlib_experimental_stats_moment.fypp | 155 ++-- src/tests/stats/CMakeLists.txt | 1 + src/tests/stats/test_moment.f90 | 916 ++++++++++++---------- src/tests/stats/test_rawmoment.f90 | 381 +++++++++ 6 files changed, 1032 insertions(+), 490 deletions(-) create mode 100644 src/tests/stats/test_rawmoment.f90 diff --git a/src/stdlib_experimental_stats.fypp b/src/stdlib_experimental_stats.fypp index d4b971ae1..e2892fd4b 100644 --- a/src/stdlib_experimental_stats.fypp +++ b/src/stdlib_experimental_stats.fypp @@ -213,9 +213,10 @@ module stdlib_experimental_stats #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_all",rank, t1, k1) - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + ${t1}$, intent(in), optional :: center logical, intent(in), optional :: mask ${t1}$ :: res end function ${RName}$ @@ -225,9 +226,10 @@ module stdlib_experimental_stats #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_all",rank, t1, k1, 'dp') - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + real(dp), intent(in), optional :: center logical, intent(in), optional :: mask real(dp) :: res end function ${RName}$ @@ -237,10 +239,11 @@ module stdlib_experimental_stats #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1) - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + ${t1}$, intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in), optional :: mask ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ end function ${RName}$ @@ -250,10 +253,11 @@ module stdlib_experimental_stats #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1, 'dp') - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + real(dp),intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in), optional :: mask real(dp) :: res${reduced_shape('x', rank, 'dim')}$ end function ${RName}$ @@ -263,9 +267,10 @@ module stdlib_experimental_stats #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask_all",rank, t1, k1) - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + ${t1}$, intent(in), optional :: center logical, intent(in) :: mask${ranksuffix(rank)}$ ${t1}$ :: res end function ${RName}$ @@ -275,9 +280,10 @@ module stdlib_experimental_stats #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask_all",rank, t1, k1, 'dp') - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + real(dp),intent(in), optional :: center logical, intent(in) :: mask${ranksuffix(rank)}$ real(dp) :: res end function ${RName}$ @@ -287,10 +293,11 @@ module stdlib_experimental_stats #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1) - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + ${t1}$, intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in) :: mask${ranksuffix(rank)}$ ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ end function ${RName}$ @@ -300,10 +307,11 @@ module stdlib_experimental_stats #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1, 'dp') - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + real(dp), intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in) :: mask${ranksuffix(rank)}$ real(dp) :: res${reduced_shape('x', rank, 'dim')}$ end function ${RName}$ diff --git a/src/stdlib_experimental_stats.md b/src/stdlib_experimental_stats.md index 95891dc04..368bdba89 100644 --- a/src/stdlib_experimental_stats.md +++ b/src/stdlib_experimental_stats.md @@ -1,7 +1,7 @@ # Descriptive statistics * [`mean` - mean of array elements](#mean---mean-of-array-elements) -* [`moment` - central moment of array elements](#moment---central-moment-of-array-elements) +* [`moment` - raw and central moments of array elements](#moment---raw-and-central-moments-of-array-elements) * [`var` - variance of array elements](#var---variance-of-array-elements) ## `mean` - mean of array elements @@ -48,25 +48,34 @@ program demo_mean end program demo_mean ``` -## `moment` - central moment of array elements +## `moment` - raw and central moments of array elements ### Description -Returns the _k_-th order central moment of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. +Returns the _k_-th order raw moment of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. -The _k_-th order central moment is defined as : +If an array `center` is provided, the function returns the _k_-th order central moment of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. + + +The _k_-th order raw moment is defined as : ``` - moment(array) = 1/n sum_i (array(i) - mean(array))^k + moment(array) = 1/n sum_i (array(i))^k ``` where n is the number of elements. +The _k_-th order central moment is defined as : + +``` + moment(array) = 1/n sum_i (array(i) - center)^k +``` + ### Syntax -`result = moment(array, order [, mask])` +`result = moment(array, order [, center [, mask]])` -`result = moment(array, order, dim [, mask])` +`result = moment(array, order, dim [, center [, mask]])` ### Arguments @@ -76,6 +85,8 @@ where n is the number of elements. `dim`: Shall be a scalar of type `integer` with a value in the range from 1 to n, where n is the rank of `array`. +`center` (optional): Shall be a scalar of the same type of `array` if `array` is `real` or `complex`, or of type `real(dp)` if `array` is of type `integer`. If `dim` is provided, `center` shall be an array (with a shape similar to that of `array` with dimension `dim` dropped) of the same type of `array` if `array` is `real` or `complex`, or of type `real(dp)` if `array` is of type `integer`. + `mask` (optional): Shall be of type `logical` and either by a scalar or an array of the same shape as `array`. ### Return value @@ -83,22 +94,26 @@ where n is the number of elements. If `array` is of type `real` or `complex`, the result is of the same type as `array`. If `array` is of type `integer`, the result is of type `real(dp)`. -If `dim` is absent, a scalar with the _k_-th central moment of all elements in `array` is returned. Otherwise, an array of rank n-1, where n equals the rank of `array`, and a shape similar to that of `array` with dimension `dim` dropped is returned. +If `dim` is absent, a scalar with the _k_-th raw (or central if `center` is provided) moment of all elements in `array` is returned. Otherwise, an array of rank n-1, where n equals the rank of `array`, and a shape similar to that of `array` with dimension `dim` dropped is returned. -If `mask` is specified, the result is the _k_-th central moment of all elements of `array` corresponding to `true` elements of `mask`. If every element of `mask` is `false`, the result is IEEE `NaN`. +If `mask` is specified, the result is the _k_-th raw (or central if `center` is provided) moment of all elements of `array` corresponding to `true` elements of `mask`. If every element of `mask` is `false`, the result is IEEE `NaN`. ### Example ```fortran program demo_moment - use stdlib_experimental_stats, only: moment + use stdlib_experimental_stats, only: mean, moment implicit none real :: x(1:6) = [ 1., 2., 3., 4., 5., 6. ] - print *, moment(x, 2) !returns 2.9167 - print *, moment( reshape(x, [ 2, 3 ] ), 2) !returns 2.9167 - print *, moment( reshape(x, [ 2, 3 ] ), 2, 1) !returns [0.25, 0.25, 0.25] - print *, moment( reshape(x, [ 2, 3 ] ), 2, 1,& - reshape(x, [ 2, 3 ] ) > 3.) !returns [NaN, 0., 0.25] + real :: y(1:2, 1:3) = reshape([ 1., 2., 3., 4., 5., 6. ], [ 2, 3]) + print *, moment(x, 2, center = mean(x)) !returns 2.9167 + print *, moment( y, 2,& + center = mean(y)) !returns 2.9167 + print *, moment( y, 2, 1,& + center = mean(y, 1)) !returns [0.25, 0.25, 0.25] + print *, moment( y, 2, 1,& + center = mean(y, 1, y > 3.),& + mask = (y > 3.)) !returns [NaN, 0., 0.25] end program demo_moment ``` diff --git a/src/stdlib_experimental_stats_moment.fypp b/src/stdlib_experimental_stats_moment.fypp index 3a6d85dee..4672696d3 100644 --- a/src/stdlib_experimental_stats_moment.fypp +++ b/src/stdlib_experimental_stats_moment.fypp @@ -13,14 +13,14 @@ contains #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_all",rank, t1, k1) - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + ${t1}$, intent(in), optional :: center logical, intent(in), optional :: mask ${t1}$ :: res real(${k1}$) :: n - ${t1}$ :: mean if (.not.optval(mask, .true.)) then res = ieee_value(1._${k1}$, ieee_quiet_nan) @@ -28,9 +28,12 @@ contains end if n = size(x, kind = int64) - mean = sum(x) / n - res = sum((x - mean)**order) / n + if (present(center)) then + res = sum((x - center)**order) / n + else + res = sum((x)**order) / n + end if end function ${RName}$ #:endfor @@ -40,13 +43,14 @@ contains #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_all",rank, t1, k1, 'dp') - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + real(dp), intent(in), optional :: center logical, intent(in), optional :: mask real(dp) :: res - real(dp) :: n, mean + real(dp) :: n if (.not.optval(mask, .true.)) then res = ieee_value(1._dp, ieee_quiet_nan) @@ -54,9 +58,12 @@ contains end if n = size(x, kind = int64) - mean = sum(real(x, dp)) / n - res = sum((real(x, dp) - mean)**order) / n + if (present(center)) then + res = sum((real(x, dp) - center)**order) / n + else + res = sum((real(x, dp))**order) / n + end if end function ${RName}$ #:endfor @@ -66,16 +73,16 @@ contains #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1) - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + ${t1}$, intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in), optional :: mask ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ integer :: i real(${k1}$) :: n - ${t1}$ :: mean${reduced_shape('x', rank, 'dim')}$ if (.not.optval(mask, .true.)) then res = ieee_value(1._${k1}$, ieee_quiet_nan) @@ -83,19 +90,25 @@ contains end if n = size(x, dim) - mean = sum(x, dim) / n res = 0 select case(dim) #:for fi in range(1, rank+1) case(${fi}$) - do i = 1, size(x, dim) - res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - mean)**order - end do + if (present(center)) then + do i = 1, size(x, ${fi}$) + res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - center)**order + end do + else + do i = 1, size(x, ${fi}$) + res = res + (x${select_subarray(rank, [(fi, 'i')])}$)**order + end do + end if #:endfor case default call error_stop("ERROR (moment): wrong dimension") end select + res = res / n end function ${RName}$ @@ -106,16 +119,16 @@ contains #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1, 'dp') - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + real(dp),intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in), optional :: mask real(dp) :: res${reduced_shape('x', rank, 'dim')}$ integer :: i real(dp) :: n - real(dp) :: mean${reduced_shape('x', rank, 'dim')}$ if (.not.optval(mask, .true.)) then res = ieee_value(1._dp, ieee_quiet_nan) @@ -123,19 +136,25 @@ contains end if n = size(x, dim) - mean = sum(real(x, dp), dim) / n res = 0 select case(dim) #:for fi in range(1, rank+1) case(${fi}$) - do i = 1, size(x, dim) - res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean)**order - end do + if (present(center)) then + do i = 1, size(x, ${fi}$) + res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - center)**order + end do + else + do i = 1, size(x, ${fi}$) + res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp))**order + end do + end if #:endfor case default call error_stop("ERROR (moment): wrong dimension") end select + res = res / n end function ${RName}$ @@ -146,19 +165,22 @@ contains #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask_all",rank, t1, k1) - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + ${t1}$, intent(in), optional :: center logical, intent(in) :: mask${ranksuffix(rank)}$ ${t1}$ :: res real(${k1}$) :: n - ${t1}$ :: mean n = count(mask, kind = int64) - mean = sum(x, mask) / n - res = sum((x - mean)**order, mask) / n + if (present(center)) then + res = sum((x - center)**order, mask) / n + else + res = sum((x)**order, mask) / n + end if end function ${RName}$ #:endfor @@ -168,18 +190,22 @@ contains #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask_all",rank, t1, k1, 'dp') - module function ${RName}$(x, order, mask) result(res) + module function ${RName}$(x, order, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order + real(dp),intent(in), optional :: center logical, intent(in) :: mask${ranksuffix(rank)}$ real(dp) :: res - real(dp) :: n, mean + real(dp) :: n n = count(mask, kind = int64) - mean = sum(real(x, dp), mask) / n - res = sum((real(x, dp) - mean)**order, mask) / n + if (present(center)) then + res = sum((real(x, dp) - center)**order, mask) / n + else + res = sum((real(x, dp))**order, mask) / n + end if end function ${RName}$ #:endfor @@ -189,37 +215,49 @@ contains #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1) - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + ${t1}$, intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in) :: mask${ranksuffix(rank)}$ ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ integer :: i real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$ - ${t1}$ :: mean${reduced_shape('x', rank, 'dim')}$ n = count(mask, dim) - mean = sum(x, dim, mask) / n res = 0 select case(dim) #:for fi in range(1, rank+1) case(${fi}$) - do i = 1, size(x, dim) - res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - mean)**order,& - #:if t1[0] == 'r' - 0._${k1}$,& - #:else - cmplx(0,0,kind=${k1}$),& - #:endif - mask${select_subarray(rank, [(fi, 'i')])}$) - end do + if (present(center)) then + do i = 1, size(x, ${fi}$) + res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - center)**order,& + #:if t1[0] == 'r' + 0._${k1}$,& + #:else + cmplx(0,0,kind=${k1}$),& + #:endif + mask${select_subarray(rank, [(fi, 'i')])}$) + end do + else + do i = 1, size(x, ${fi}$) + res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$)**order,& + #:if t1[0] == 'r' + 0._${k1}$,& + #:else + cmplx(0,0,kind=${k1}$),& + #:endif + mask${select_subarray(rank, [(fi, 'i')])}$) + end do + end if #:endfor case default call error_stop("ERROR (moment): wrong dimension") end select + res = res / n end function ${RName}$ @@ -230,32 +268,39 @@ contains #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1, 'dp') - module function ${RName}$(x, order, dim, mask) result(res) + module function ${RName}$(x, order, dim, center, mask) result(res) ${t1}$, intent(in) :: x${ranksuffix(rank)}$ integer, intent(in) :: order integer, intent(in) :: dim + real(dp), intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$ logical, intent(in) :: mask${ranksuffix(rank)}$ real(dp) :: res${reduced_shape('x', rank, 'dim')}$ integer :: i real(dp) :: n${reduced_shape('x', rank, 'dim')}$ - real(dp) :: mean${reduced_shape('x', rank, 'dim')}$ n = count(mask, dim) - mean = sum(real(x, dp), dim, mask) / n - res = 0 - select case(dim) - #:for fi in range(1, rank+1) - case(${fi}$) - do i = 1, size(x, dim) - res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean)**order,& - 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) - end do - #:endfor - case default - call error_stop("ERROR (moment): wrong dimension") - end select + res = 0 + select case(dim) + #:for fi in range(1, rank+1) + case(${fi}$) + if (present(center)) then + do i = 1, size(x, ${fi}$) + res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - center)**order,& + 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) + end do + else + do i = 1, size(x, ${fi}$) + res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp))**order,& + 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) + end do + end if + #:endfor + case default + call error_stop("ERROR (moment): wrong dimension") + end select + res = res / n end function ${RName}$ diff --git a/src/tests/stats/CMakeLists.txt b/src/tests/stats/CMakeLists.txt index aa0a9e1ba..b79e39bf6 100644 --- a/src/tests/stats/CMakeLists.txt +++ b/src/tests/stats/CMakeLists.txt @@ -1,5 +1,6 @@ ADDTEST(mean) ADDTEST(moment) +ADDTEST(rawmoment) ADDTEST(var) ADDTEST(varn) diff --git a/src/tests/stats/test_moment.f90 b/src/tests/stats/test_moment.f90 index 6e7457994..ef4fdefd6 100644 --- a/src/tests/stats/test_moment.f90 +++ b/src/tests/stats/test_moment.f90 @@ -1,7 +1,7 @@ program test_moment use stdlib_experimental_error, only: assert use stdlib_experimental_kinds, only: sp, dp, int32, int64 - use stdlib_experimental_stats, only: moment + use stdlib_experimental_stats, only: mean, moment use,intrinsic :: ieee_arithmetic, only : ieee_is_nan implicit none @@ -45,32 +45,42 @@ subroutine test_sp(x1, x2) !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order)) < sptol) - call assert( abs(moment(x1, order, dim=1)) < sptol) + call assert( abs(moment(x1, order, center=mean(x1))) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1))) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) + call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& + mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& + mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5)) < sptol) - call assert( abs(moment(x1, order, 1, x1 < 5)) < sptol) + call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& + mask = (x1 < 5))) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& + mask = (x1 < 5))) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order)) < sptol) - call assert( all( abs( moment(x2, order, 1)) < sptol)) - call assert( all( abs( moment(x2, order, 2)) < sptol)) + call assert( abs(moment(x2, order, center = mean(x2))) < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1))) < sptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2))) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& + mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)) < sptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11)) < sptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11)) < sptol)) + call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), mask = (x2 < 11)))& + < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, x2 < 11),& + mask = (x2 < 11))) < sptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2, x2 < 11),& + mask = (x2 < 11))) < sptol)) !3dim allocate(x3(size(x2,1),size(x2,2),3)) @@ -79,73 +89,92 @@ subroutine test_sp(x1, x2) x3(:,:,3)=x2*4; print*,' test_sp_3dim', order - call assert( abs(moment(x3, order)) < sptol) - call assert( all( abs( moment(x3, order, 1)) < sptol)) - call assert( all( abs( moment(x3, order, 2)) < sptol)) - call assert( all( abs( moment(x3, order, 3)) < sptol)) + call assert( abs(moment(x3, order, center = mean(x3))) < sptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1))) < sptol)) + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2))) < sptol)) + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3))) < sptol)) print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) + call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& + mask = .false.)))) print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) ) < sptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45)) < sptol )) + call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& + mask = (x3 < 11)) ) < sptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& + mask = (x3 < 45))) < sptol )) + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& + mask = (x3 < 45))) < sptol )) + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& + mask = (x3 < 45))) < sptol )) order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - 2._sp) < sptol) - call assert( abs(moment(x1, order, dim=1) - 2._sp) < sptol) + call assert( abs(moment(x1, order, center = mean(x1)) - 2._sp) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1)) - 2._sp) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) + call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& + mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& + mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5) - 1.25_sp) < sptol) - call assert( abs(moment(x1, order, 1, x1 < 5) - 1.25_sp) < sptol) + call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& + mask = (x1 < 5)) - 1.25_sp) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& + mask = (x1 < 5)) - 1.25_sp) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - 107.25_sp/9.) < sptol) - call assert( all( abs( moment(x2, order, 1) - [5._sp, 5._sp, 1.25_sp]) < sptol)) - call assert( all( abs( moment(x2, order, 2) - [19.0, 43. / 3., 31. / 3. , 7.0]*2./3.) < sptol)) + call assert( abs(moment(x2, order, center = mean(x2)) - 107.25_sp/9.) < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1)) -& + [5._sp, 5._sp, 1.25_sp]) < sptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2)) -& + [19.0, 43. / 3., 31. / 3. , 7.0]*2./3.) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& + mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)- 2.75_sp*3.) < sptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11) -& - [5._sp, 5._sp, 0.25_sp]) < sptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11) -& + call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), mask = (x2 < 11))-& + 2.75_sp*3.) < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, x2 < 11),& + mask = (x2 < 11)) - [5._sp, 5._sp, 0.25_sp]) < sptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2, x2 < 11),& + mask = (x2 < 11)) -& [19._sp*2./3., 43._sp/9.*2., 0.25_sp , 0.25_sp]) < sptol)) !3dim print*,' test_sp_3dim', order - call assert( abs(moment(x3, order) - 153.4_sp*35./36.) < sptol) - call assert( all( abs( moment(x3, order, 1) -& + call assert( abs(moment(x3, order, center = mean(x3)) - 153.4_sp*35./36.) < sptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1)) -& reshape([20._sp / 3., 20._sp / 3., 5._sp / 3.,& 4* 20._sp / 3., 4* 20._sp / 3., 4* 5._sp / 3.,& 16* 20._sp / 3., 16* 20._sp / 3., 16* 5._sp / 3.],& [size(x3,2), size(x3,3)])*3._sp/4.)& < sptol)) - call assert( all( abs( moment(x3, order, 2) -& + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2)) -& reshape([19._sp, 43._sp / 3., 31._sp / 3. , 7.0_sp,& 4* 19.0_sp, 4* 43._sp / 3., 4* 31._sp / 3. , 4* 7.0_sp,& 16* 19.0_sp, 16* 43._sp / 3., 16* 31._sp / 3. , 16* 7.0_sp],& [size(x3,1), size(x3,3)] )*2._sp/3.)& < sptol)) - call assert( all( abs( moment(x3, order, 3) -& + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3)) -& reshape([ 7._sp/3., 21._sp, 175._sp/3.,& 343._sp/3., 28._sp/3., 112._sp/3.,& 84._sp, 448._sp/3., 189._sp,& @@ -154,24 +183,32 @@ subroutine test_sp(x1, x2) < sptol)) print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) + call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& + mask = .false.)))) print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) - 7.7370242214532876_dp ) < sptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45) -& + call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& + mask = (x3 < 11)) - 7.7370242214532876_dp ) < sptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& + mask = (x3 < 45)) -& reshape([5._sp, 5._sp, 1.25_sp, 20._sp, 20._sp, 5._sp,& 80._sp, 80._sp, 32._sp/3.],& [size(x3, 2), size(x3, 3)])) < sptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45) -& + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& + mask = (x3 < 45)) -& reshape([ 38._sp/3., 86._sp/9., 62._sp/9., 14._sp/3., 152._sp/3.,& 344._sp/9., 248._sp/9., 168._sp/9., 1824._sp/9.,& 1376._sp/9., 992._sp/9., 4._sp& ],& [size(x3, 1), size(x3, 3)])) < sptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45) -& + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& + mask = (x3 < 45)) -& reshape([14._sp/9., 14._sp, 350._sp/9., 686._sp/9., 56._sp/9.,& 224._sp/9., 56._sp, 896._sp/9., 126._sp, 1400._sp/9.,& 1694._sp/9., 36._sp& @@ -187,143 +224,143 @@ subroutine test_dp(x1, x2) real(dp), allocatable :: x3(:, :, :) order = 1 - - !1dim - print*,' test_dp_1dim', order - call assert( abs(moment(x1, order)) < dptol) - call assert( abs(moment(x1, order, dim=1)) < dptol) - - print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) - - print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5)) < dptol) - call assert( abs(moment(x1, order, 1, x1 < 5)) < dptol) - - !2dim - print*,' test_dp_2dim', order - call assert( abs(moment(x2, order)) < dptol) - call assert( all( abs( moment(x2, order, 1)) < dptol)) - call assert( all( abs( moment(x2, order, 2)) < dptol)) - - print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) - - print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)) < dptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11)) < dptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11)) < dptol)) - - !3dim - allocate(x3(size(x2,1),size(x2,2),3)) - x3(:,:,1)=x2; - x3(:,:,2)=x2*2; - x3(:,:,3)=x2*4; - - print*,' test_dp_3dim', order - call assert( abs(moment(x3, order)) < dptol) - call assert( all( abs( moment(x3, order, 1)) < dptol)) - call assert( all( abs( moment(x3, order, 2)) < dptol)) - call assert( all( abs( moment(x3, order, 3)) < dptol)) - - print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) - - print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) ) < dptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45)) < dptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45)) < dptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45)) < dptol )) - - - order = 2 - - !1dim - print*,' test_dp_1dim', order - call assert( abs(moment(x1, order) - 2._dp) < dptol) - call assert( abs(moment(x1, order, dim=1) - 2._dp) < dptol) - - print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) - - print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5) - 1.25_dp) < dptol) - call assert( abs(moment(x1, order, 1, x1 < 5) - 1.25_dp) < dptol) - - !2dim - print*,' test_dp_2dim', order - call assert( abs(moment(x2, order) - 107.25_dp/9.) < dptol) - call assert( all( abs( moment(x2, order, 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2) -& - [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) - - print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) - - print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)- 2.75_dp*3.) < dptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11) -& - [5._dp, 5._dp, 0.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11) -& - [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) - - !3dim - print*,' test_dp_3dim', order - call assert( abs(moment(x3, order) - 153.4_dp*35./36.) < dptol) - call assert( all( abs( moment(x3, order, 1) -& - reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& - 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& - 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& - [size(x3,2), size(x3,3)])*3._dp/4.)& - < dptol)) - call assert( all( abs( moment(x3, order, 2) -& - reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& - 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& - 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& - [size(x3,1), size(x3,3)] )*2._dp/3.)& - < dptol)) - call assert( all( abs( moment(x3, order, 3) -& - reshape([ 7._dp/3., 21._dp, 175._dp/3.,& - 343._dp/3., 28._dp/3., 112._dp/3.,& - 84._dp, 448._dp/3., 189._dp,& - 700._dp/3., 847._dp/3., 336._dp],& - [size(x3,1), size(x3,2)] )*2./3.)& - < dptol)) - - print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) - - print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) - 7.7370242214532876_dp ) < dptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45) -& - reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& - 80._dp, 80._dp, 32._dp/3.],& - [size(x3, 2), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45) -& - reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& - 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& - 1376._dp/9., 992._dp/9., 4._dp& - ],& - [size(x3, 1), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45) -& - reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& - 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& - 1694._dp/9., 36._dp& - ], [size(x3,1), size(x3,2)] ))& - < dptol )) - +! +! !1dim +! print*,' test_dp_1dim', order +! call assert( abs(moment(x1, order, center = mean(x1, < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1)) < dptol) +! +! print*,' test_dp_1dim_mask', order +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) +! +! print*,' test_dp_1dim_mask_array', order +! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5)) < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5)) < dptol) +! +! !2dim +! print*,' test_dp_2dim', order +! call assert( abs(moment(x2, order, center = mean(x2, < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1)) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2)) < dptol)) +! +! print*,' test_dp_2dim_mask', order +! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) +! +! print*,' test_dp_2dim_mask_array', order +! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)) < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11)) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11)) < dptol)) +! +! !3dim +! allocate(x3(size(x2,1),size(x2,2),3)) +! x3(:,:,1)=x2; +! x3(:,:,2)=x2*2; +! x3(:,:,3)=x2*4; +! +! print*,' test_dp_3dim', order +! call assert( abs(moment(x3, order, center = mean(x3, < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1)) < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2)) < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3)) < dptol)) +! +! print*,' test_dp_3dim_mask', order +! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) +! +! print*,' test_dp_3dim_mask_array', order +! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) ) < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45)) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45)) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45)) < dptol )) +! +! +! order = 2 +! +! !1dim +! print*,' test_dp_1dim', order +! call assert( abs(moment(x1, order, center = mean(x1, - 2._dp) < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1) - 2._dp) < dptol) +! +! print*,' test_dp_1dim_mask', order +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) +! +! print*,' test_dp_1dim_mask_array', order +! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5) - 1.25_dp) < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5) - 1.25_dp) < dptol) +! +! !2dim +! print*,' test_dp_2dim', order +! call assert( abs(moment(x2, order, center = mean(x2, - 107.25_dp/9.) < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2) -& +! [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) +! +! print*,' test_dp_2dim_mask', order +! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) +! +! print*,' test_dp_2dim_mask_array', order +! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)- 2.75_dp*3.) < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11) -& +! [5._dp, 5._dp, 0.25_dp]) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11) -& +! [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) +! +! !3dim +! print*,' test_dp_3dim', order +! call assert( abs(moment(x3, order, center = mean(x3, - 153.4_dp*35./36.) < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1) -& +! reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& +! 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& +! 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& +! [size(x3,2), size(x3,3)])*3._dp/4.)& +! < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2) -& +! reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& +! 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& +! 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& +! [size(x3,1), size(x3,3)] )*2._dp/3.)& +! < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3) -& +! reshape([ 7._dp/3., 21._dp, 175._dp/3.,& +! 343._dp/3., 28._dp/3., 112._dp/3.,& +! 84._dp, 448._dp/3., 189._dp,& +! 700._dp/3., 847._dp/3., 336._dp],& +! [size(x3,1), size(x3,2)] )*2./3.)& +! < dptol)) +! +! print*,' test_dp_3dim_mask', order +! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) +! +! print*,' test_dp_3dim_mask_array', order +! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) - 7.7370242214532876_dp ) < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45) -& +! reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& +! 80._dp, 80._dp, 32._dp/3.],& +! [size(x3, 2), size(x3, 3)])) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45) -& +! reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& +! 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& +! 1376._dp/9., 992._dp/9., 4._dp& +! ],& +! [size(x3, 1), size(x3, 3)])) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45) -& +! reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& +! 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& +! 1694._dp/9., 36._dp& +! ], [size(x3,1), size(x3,2)] ))& +! < dptol )) +! end subroutine subroutine test_int32(x1, x2) @@ -336,32 +373,42 @@ subroutine test_int32(x1, x2) !1dim print*,' test_dp_1dim', order - call assert( abs(moment(x1, order)) < dptol) - call assert( abs(moment(x1, order, dim=1)) < dptol) + call assert( abs(moment(x1, order, center = mean(x1))) < dptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1))) < dptol) print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) + call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& + mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& + mask = .false.))) print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5)) < dptol) - call assert( abs(moment(x1, order, 1, x1 < 5)) < dptol) + call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& + mask = (x1 < 5))) < dptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& + mask = (x1 < 5))) < dptol) !2dim print*,' test_dp_2dim', order - call assert( abs(moment(x2, order)) < dptol) - call assert( all( abs( moment(x2, order, 1)) < dptol)) - call assert( all( abs( moment(x2, order, 2)) < dptol)) + call assert( abs(moment(x2, order, center = mean(x2))) < dptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1))) < dptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2))) < dptol)) print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& + mask = .false.)))) print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)) < dptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11)) < dptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11)) < dptol)) + call assert( abs(moment(x2, order, center = mean(x2, x2 < 11),& + mask = (x2 < 11))) < dptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, x2 < 11),& + mask = (x2 < 11))) < dptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2, x2 < 11),& + mask = (x2 < 11))) < dptol)) !3dim allocate(x3(size(x2,1),size(x2,2),3)) @@ -370,74 +417,93 @@ subroutine test_int32(x1, x2) x3(:,:,3)=x2*4; print*,' test_dp_3dim', order - call assert( abs(moment(x3, order)) < dptol) - call assert( all( abs( moment(x3, order, 1)) < dptol)) - call assert( all( abs( moment(x3, order, 2)) < dptol)) - call assert( all( abs( moment(x3, order, 3)) < dptol)) + call assert( abs(moment(x3, order, center = mean(x3))) < dptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1))) < dptol)) + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2))) < dptol)) + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3))) < dptol)) print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) + call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& + mask = .false.)))) print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) ) < dptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45)) < dptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45)) < dptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45)) < dptol )) + call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& + mask = (x3 < 11) )) < dptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& + mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& + mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& + mask = (x3 < 45))) < dptol )) order = 2 !1dim print*,' test_dp_1dim', order - call assert( abs(moment(x1, order) - 2._dp) < dptol) - call assert( abs(moment(x1, order, dim=1) - 2._dp) < dptol) + call assert( abs(moment(x1, order, center = mean(x1)) - 2._dp) < dptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1)) - 2._dp) < dptol) print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) + call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& + mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& + mask = .false.))) print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5) - 1.25_dp) < dptol) - call assert( abs(moment(x1, order, 1, x1 < 5) - 1.25_dp) < dptol) + call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& + mask = (x1 < 5)) - 1.25_dp) < dptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& + mask = (x1 < 5)) - 1.25_dp) < dptol) !2dim print*,' test_dp_2dim', order - call assert( abs(moment(x2, order) - 107.25_dp/9.) < dptol) - call assert( all( abs( moment(x2, order, 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2) -& + call assert( abs(moment(x2, order, center = mean(x2)) - 107.25_dp/9.) < dptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1)) -& + [5._dp, 5._dp, 1.25_dp]) < dptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2)) -& [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& + mask = .false.)))) print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)- 2.75_dp*3.) < dptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11) -& + call assert( abs(moment(x2, order, center = mean(x2, x2 < 11),& + mask = (x2 < 11))- 2.75_dp*3.) < dptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1,& + mask = (x2 < 11)), mask = (x2 < 11)) -& [5._dp, 5._dp, 0.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11) -& + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2,& + mask = (x2 < 11)), mask = (x2 < 11)) -& [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) !3dim print*,' test_dp_3dim', order - call assert( abs(moment(x3, order) - 153.4_dp*35./36.) < dptol) - call assert( all( abs( moment(x3, order, 1) -& + call assert( abs(moment(x3, order, center = mean(x3)) - 153.4_dp*35./36.) < dptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1)) -& reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& [size(x3,2), size(x3,3)])*3._dp/4.)& < dptol)) - call assert( all( abs( moment(x3, order, 2) -& + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2)) -& reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& [size(x3,1), size(x3,3)] )*2._dp/3.)& < dptol)) - call assert( all( abs( moment(x3, order, 3) -& + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3)) -& reshape([ 7._dp/3., 21._dp, 175._dp/3.,& 343._dp/3., 28._dp/3., 112._dp/3.,& 84._dp, 448._dp/3., 189._dp,& @@ -446,24 +512,32 @@ subroutine test_int32(x1, x2) < dptol)) print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) + call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& + mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& + mask = .false.)))) print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) - 7.7370242214532876_dp ) < dptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45) -& + call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& + mask = (x3 < 11)) - 7.7370242214532876_dp ) < dptol) + call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& + mask = (x3 < 45)) -& reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& 80._dp, 80._dp, 32._dp/3.],& [size(x3, 2), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45) -& + call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& + mask = (x3 < 45)) -& reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& 1376._dp/9., 992._dp/9., 4._dp& ],& [size(x3, 1), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45) -& + call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& + mask = (x3 < 45)) -& reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& 1694._dp/9., 36._dp& @@ -480,142 +554,142 @@ subroutine test_int64(x1, x2) order = 1 - !1dim - print*,' test_dp_1dim', order - call assert( abs(moment(x1, order)) < dptol) - call assert( abs(moment(x1, order, dim=1)) < dptol) - - print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) - - print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5)) < dptol) - call assert( abs(moment(x1, order, 1, x1 < 5)) < dptol) - - !2dim - print*,' test_dp_2dim', order - call assert( abs(moment(x2, order)) < dptol) - call assert( all( abs( moment(x2, order, 1)) < dptol)) - call assert( all( abs( moment(x2, order, 2)) < dptol)) - - print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) - - print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)) < dptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11)) < dptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11)) < dptol)) - - !3dim - allocate(x3(size(x2,1),size(x2,2),3)) - x3(:,:,1)=x2; - x3(:,:,2)=x2*2; - x3(:,:,3)=x2*4; - - print*,' test_dp_3dim', order - call assert( abs(moment(x3, order)) < dptol) - call assert( all( abs( moment(x3, order, 1)) < dptol)) - call assert( all( abs( moment(x3, order, 2)) < dptol)) - call assert( all( abs( moment(x3, order, 3)) < dptol)) - - print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) - - print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) ) < dptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45)) < dptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45)) < dptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45)) < dptol )) - - - order = 2 - - !1dim - print*,' test_dp_1dim', order - call assert( abs(moment(x1, order) - 2._dp) < dptol) - call assert( abs(moment(x1, order, dim=1) - 2._dp) < dptol) - - print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, .false.))) - - print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, x1 < 5) - 1.25_dp) < dptol) - call assert( abs(moment(x1, order, 1, x1 < 5) - 1.25_dp) < dptol) - - !2dim - print*,' test_dp_2dim', order - call assert( abs(moment(x2, order) - 107.25_dp/9.) < dptol) - call assert( all( abs( moment(x2, order, 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2) -& - [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) - - print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, .false.)))) - - print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, x2 < 11)- 2.75_dp*3.) < dptol) - call assert( all( abs( moment(x2, order, 1, x2 < 11) -& - [5._dp, 5._dp, 0.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2, x2 < 11) -& - [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) - - !3dim - print*,' test_dp_3dim', order - call assert( abs(moment(x3, order) - 153.4_dp*35./36.) < dptol) - call assert( all( abs( moment(x3, order, 1) -& - reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& - 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& - 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& - [size(x3,2), size(x3,3)])*3._dp/4.)& - < dptol)) - call assert( all( abs( moment(x3, order, 2) -& - reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& - 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& - 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& - [size(x3,1), size(x3,3)] )*2._dp/3.)& - < dptol)) - call assert( all( abs( moment(x3, order, 3) -& - reshape([ 7._dp/3., 21._dp, 175._dp/3.,& - 343._dp/3., 28._dp/3., 112._dp/3.,& - 84._dp, 448._dp/3., 189._dp,& - 700._dp/3., 847._dp/3., 336._dp],& - [size(x3,1), size(x3,2)] )*2./3.)& - < dptol)) - - print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, .false.)))) - - print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, x3 < 11) - 7.7370242214532876_dp ) < dptol) - call assert( all( abs( moment(x3, order, 1, x3 < 45) -& - reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& - 80._dp, 80._dp, 32._dp/3.],& - [size(x3, 2), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 2, x3 < 45) -& - reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& - 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& - 1376._dp/9., 992._dp/9., 4._dp& - ],& - [size(x3, 1), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 3, x3 < 45) -& - reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& - 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& - 1694._dp/9., 36._dp& - ], [size(x3,1), size(x3,2)] ))& - < dptol )) - +! !1dim +! print*,' test_dp_1dim', order +! call assert( abs(moment(x1, order, center = mean(x1, < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1)) < dptol) +! +! print*,' test_dp_1dim_mask', order +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) +! +! print*,' test_dp_1dim_mask_array', order +! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5)) < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5)) < dptol) +! +! !2dim +! print*,' test_dp_2dim', order +! call assert( abs(moment(x2, order, center = mean(x2, < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1)) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2)) < dptol)) +! +! print*,' test_dp_2dim_mask', order +! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) +! +! print*,' test_dp_2dim_mask_array', order +! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)) < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11)) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11)) < dptol)) +! +! !3dim +! allocate(x3(size(x2,1),size(x2,2),3)) +! x3(:,:,1)=x2; +! x3(:,:,2)=x2*2; +! x3(:,:,3)=x2*4; +! +! print*,' test_dp_3dim', order +! call assert( abs(moment(x3, order, center = mean(x3, < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1)) < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2)) < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3)) < dptol)) +! +! print*,' test_dp_3dim_mask', order +! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) +! +! print*,' test_dp_3dim_mask_array', order +! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) ) < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45)) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45)) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45)) < dptol )) +! +! +! order = 2 +! +! !1dim +! print*,' test_dp_1dim', order +! call assert( abs(moment(x1, order, center = mean(x1, - 2._dp) < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1) - 2._dp) < dptol) +! +! print*,' test_dp_1dim_mask', order +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) +! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) +! +! print*,' test_dp_1dim_mask_array', order +! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5) - 1.25_dp) < dptol) +! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5) - 1.25_dp) < dptol) +! +! !2dim +! print*,' test_dp_2dim', order +! call assert( abs(moment(x2, order, center = mean(x2, - 107.25_dp/9.) < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2) -& +! [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) +! +! print*,' test_dp_2dim_mask', order +! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) +! +! print*,' test_dp_2dim_mask_array', order +! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)- 2.75_dp*3.) < dptol) +! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11) -& +! [5._dp, 5._dp, 0.25_dp]) < dptol)) +! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11) -& +! [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) +! +! !3dim +! print*,' test_dp_3dim', order +! call assert( abs(moment(x3, order, center = mean(x3, - 153.4_dp*35./36.) < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1) -& +! reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& +! 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& +! 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& +! [size(x3,2), size(x3,3)])*3._dp/4.)& +! < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2) -& +! reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& +! 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& +! 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& +! [size(x3,1), size(x3,3)] )*2._dp/3.)& +! < dptol)) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3) -& +! reshape([ 7._dp/3., 21._dp, 175._dp/3.,& +! 343._dp/3., 28._dp/3., 112._dp/3.,& +! 84._dp, 448._dp/3., 189._dp,& +! 700._dp/3., 847._dp/3., 336._dp],& +! [size(x3,1), size(x3,2)] )*2./3.)& +! < dptol)) +! +! print*,' test_dp_3dim_mask', order +! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) +! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) +! +! print*,' test_dp_3dim_mask_array', order +! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) - 7.7370242214532876_dp ) < dptol) +! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45) -& +! reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& +! 80._dp, 80._dp, 32._dp/3.],& +! [size(x3, 2), size(x3, 3)])) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45) -& +! reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& +! 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& +! 1376._dp/9., 992._dp/9., 4._dp& +! ],& +! [size(x3, 1), size(x3, 3)])) < dptol )) +! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45) -& +! reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& +! 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& +! 1694._dp/9., 36._dp& +! ], [size(x3,1), size(x3,2)] ))& +! < dptol )) +! end subroutine subroutine test_csp(x1, x2) @@ -628,60 +702,73 @@ subroutine test_csp(x1, x2) !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order)) < sptol) - call assert( abs(moment(x1, order, dim=1)) < sptol) + call assert( abs(moment(x1, order, center = mean(x1))) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1))) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(abs(moment(x1, order, .false.)))) - call assert( ieee_is_nan(abs(moment(x1, order, 1, .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, center = mean(x1, .false.),& + mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, 1, center = mean(x1, 1, .false.),& + mask = .false.)))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, aimag(x1) == 0)) < sptol) - call assert( abs(moment(x1, order, 1, aimag(x1) == 0)) < sptol) + call assert( abs(moment(x1, order, center = mean(x1, aimag(x1) == 0),& + mask = (aimag(x1) == 0))) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1, aimag(x1) == 0),& + mask = (aimag(x1) == 0))) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order)) < sptol) - call assert( all( abs( moment(x2, order, 1)) < sptol)) - call assert( all( abs( moment(x2, order, 2)) < sptol)) + call assert( abs(moment(x2, order, center = mean(x2))) < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1))) < sptol)) + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2))) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(abs(moment(x2, order, .false.)))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 1, .false.))))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 2, .false.))))) + call assert( ieee_is_nan(abs(moment(x2, order, center = mean(x2, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 1, center = mean(x2, 1, .false.), mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 2, center = mean(x2, 2, .false.), mask = .false.))))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, aimag(x2) == 0)) < sptol) - call assert( all( abs( moment(x2, order, 1, aimag(x2) == 0)) < sptol)) - call assert( any(ieee_is_nan( abs( moment(x2, order, 2, aimag(x2) == 0))))) + call assert( abs(moment(x2, order, center = mean(x2, aimag(x2) == 0),& + mask = (aimag(x2) == 0))) < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, aimag(x2) == 0), mask = (aimag(x2) == 0))) < sptol)) + call assert( any(ieee_is_nan( abs( moment(x2, order, 2,& + center = mean(x2, 2, aimag(x2) == 0),& + mask = (aimag(x2) == 0)))))) order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - (-6.459422410E-02,-0.556084037)) < sptol) - call assert( abs(moment(x1, order, dim=1) -& + call assert( abs(moment(x1, order, center = mean(x1)) - (-6.459422410E-02,-0.556084037)) < sptol) + call assert( abs(moment(x1, order, 1, center = mean(x1, 1)) -& (-6.459422410E-02,-0.556084037)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(abs(moment(x1, order, .false.)))) - call assert( ieee_is_nan(abs(moment(x1, order, 1, .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, center = mean(x1, .false.),& + mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, 1, center = mean(x1, 1, .false.),& + mask = .false.)))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, aimag(x1) == 0) -& + call assert( abs(moment(x1, order, center = mean(x1, aimag(x1) == 0),& + mask = (aimag(x1) == 0)) -& (8.969944715E-02,0.00000000)) < sptol) - call assert( abs(moment(x1, order, 1, aimag(x1) == 0) -& + call assert( abs(moment(x1, order, 1, center = mean(x1, 1, aimag(x1) == 0),& + mask = (aimag(x1) == 0)) -& (8.969944715E-02,0.00000000)) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - (-0.163121477,-1.86906016)) < sptol) - call assert( all( abs( moment(x2, order, 1) -& + call assert( abs(moment(x2, order, center = mean(x2)) -& + (-0.163121477,-1.86906016)) < sptol) + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1)) -& [(-6.459422410E-02,-0.556084037),& (-0.581347823,-5.00475645),& (-0.145336956,-1.25118911)]& ) < sptol)) - call assert( all( abs( moment(x2, order, 2) -& + call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2)) -& [(0.240498722,0.00000000),& (-1.49895227,0.00000000),& (1.15390968,0.00000000),& @@ -690,14 +777,19 @@ subroutine test_csp(x1, x2) ) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(abs(moment(x2, order, .false.)))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 1, .false.))))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 2, .false.))))) + call assert( ieee_is_nan(abs(moment(x2, order, center = mean(x2, .false.),& + mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 1,& + center = mean(x2, 1, .false.), mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 2,& + center = mean(x2, 2, .false.), mask = .false.))))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, aimag(x2) == 0)-& + call assert( abs(moment(x2, order, center = mean(x2, aimag(x2) == 0),& + mask = (aimag(x2) == 0))-& (1.08109438,0.00000000)) < sptol) - call assert( all( abs( moment(x2, order, 1, aimag(x2)==0) -& + call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, aimag(x2)==0),& + mask = (aimag(x2)==0)) -& [(8.969944715E-02,0.00000000),& (0.807295084,0.00000000),& (0.201823771,0.00000000)]& diff --git a/src/tests/stats/test_rawmoment.f90 b/src/tests/stats/test_rawmoment.f90 new file mode 100644 index 000000000..2dc2b86f5 --- /dev/null +++ b/src/tests/stats/test_rawmoment.f90 @@ -0,0 +1,381 @@ +program test_rawmoment + use stdlib_experimental_error, only: assert + use stdlib_experimental_kinds, only: sp, dp, int32, int64 + use stdlib_experimental_stats, only: mean, moment + use,intrinsic :: ieee_arithmetic, only : ieee_is_nan + implicit none + + + real(sp), parameter :: sptol = 1000 * epsilon(1._sp) + real(dp), parameter :: dptol = 1000 * epsilon(1._dp) + + real(dp) :: d1(5) = [1.0_dp, 2.0_dp, 3.0_dp, 4.0_dp, 5.0_dp] + real(dp) :: d(4, 3) = reshape([1._dp, 3._dp, 5._dp, 7._dp,& + 2._dp, 4._dp, 6._dp, 8._dp,& + 9._dp, 10._dp, 11._dp, 12._dp], [4, 3]) + + + complex(sp) :: cs1(5) = [ cmplx(0.57706_sp, 0.00000_sp),& + cmplx(0.00000_sp, 1.44065_sp),& + cmplx(1.26401_sp, 0.00000_sp),& + cmplx(0.00000_sp, 0.88833_sp),& + cmplx(1.14352_sp, 0.00000_sp)] + complex(sp) :: cs(5,3) + + + call test_sp(real(d1,sp), real(d,sp)) + call test_int32(int(d1, int32), int(d, int32)) + + cs(:,1) = cs1 + cs(:,2) = cs1*3_sp + cs(:,3) = cs1*1.5_sp + call test_csp(cs1, cs) + + +contains + subroutine test_sp(x1, x2) + real(sp), intent(in) :: x1(:), x2(:, :) + + integer :: order + real(sp), allocatable :: x3(:, :, :) + + order = 1 + + !1dim + print*,' test_sp_1dim', order + call assert( abs(moment(x1, order) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, 1) - mean(x1)) < sptol) + + print*,' test_sp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + + print*,' test_sp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + mean(x1, mask = (x1 < 5)) ) < sptol) + call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + mean(x1, dim = 1, mask = (x1 < 5))) < sptol) + + !2dim + print*,' test_sp_2dim', order + call assert( abs(moment(x2, order) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1) - mean(x2, dim = 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2) - mean(x2, dim = 2)) < sptol)) + + print*,' test_sp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + + print*,' test_sp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11)) - mean(x2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& + mean(x2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& + mean(x2, 2, x2 < 11)) < sptol)) + + !3dim + allocate(x3(size(x2,1),size(x2,2),3)) + x3(:,:,1)=x2; + x3(:,:,2)=x2*2; + x3(:,:,3)=x2*4; + + print*,' test_sp_3dim', order + call assert( abs(moment(x3, order) - mean(x3)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1) - mean(x3, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2) - mean(x3, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3) - mean(x3, 3)) < sptol)) + + print*,' test_sp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) + + print*,' test_sp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) - mean(x3, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& + mean(x3, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& + mean(x3, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& + mean(x3, 3, x3 < 45)) < sptol )) + + + order = 2 + + !1dim + print*,' test_sp_1dim', order + call assert( abs(moment(x1, order) - mean(x1**2)) < sptol) + call assert( abs(moment(x1, order, 1) - mean(x1**2, 1)) < sptol) + + print*,' test_sp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + + print*,' test_sp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + mean(x1**2, x1 < 5)) < sptol) + call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + mean(x1**2, 1, x1 < 5)) < sptol) + + !2dim + print*,' test_sp_2dim', order + call assert( abs(moment(x2, order) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1) - mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2) - mean(x2**2, 2)) < sptol)) + + print*,' test_sp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + + print*,' test_sp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11)) -& + mean(x2**2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& + mean(x2**2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& + mean(x2**2, 2, x2 < 11)) < sptol)) + + !3dim + print*,' test_sp_3dim', order + call assert( abs(moment(x3, order) - mean(x3**2)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1) -& + mean(x3**2, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2) -& + mean(x3**2, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3) -& + mean(x3**2, 3)) < sptol)) + + print*,' test_sp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) + + print*,' test_sp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + mean(x3**2, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& + mean(x3**2, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& + mean(x3**2, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& + mean(x3**2, 3, x3 < 45)) < sptol )) + + end subroutine + + subroutine test_int32(x1, x2) + integer(int32), intent(in) :: x1(:), x2(:, :) + + integer :: order + integer(int32), allocatable :: x3(:, :, :) + + order = 1 + + !1dim + print*,' test_sp_1dim', order + call assert( abs(moment(x1, order) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, 1) - mean(x1)) < sptol) + + print*,' test_sp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + + print*,' test_sp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + mean(x1, mask = (x1 < 5)) ) < sptol) + call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + mean(x1, dim = 1, mask = (x1 < 5))) < sptol) + + !2dim + print*,' test_sp_2dim', order + call assert( abs(moment(x2, order) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1) - mean(x2, dim = 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2) - mean(x2, dim = 2)) < sptol)) + + print*,' test_sp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + + print*,' test_sp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11)) - mean(x2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& + mean(x2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& + mean(x2, 2, x2 < 11)) < sptol)) + + !3dim + allocate(x3(size(x2,1),size(x2,2),3)) + x3(:,:,1)=x2; + x3(:,:,2)=x2*2; + x3(:,:,3)=x2*4; + + print*,' test_sp_3dim', order + call assert( abs(moment(x3, order) - mean(x3)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1) - mean(x3, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2) - mean(x3, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3) - mean(x3, 3)) < sptol)) + + print*,' test_sp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) + + print*,' test_sp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) - mean(x3, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& + mean(x3, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& + mean(x3, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& + mean(x3, 3, x3 < 45)) < sptol )) + + + order = 2 + + !1dim + print*,' test_sp_1dim', order + call assert( abs(moment(x1, order) - mean(x1**2)) < sptol) + call assert( abs(moment(x1, order, 1) - mean(x1**2, 1)) < sptol) + + print*,' test_sp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + + print*,' test_sp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + mean(x1**2, x1 < 5)) < sptol) + call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + mean(x1**2, 1, x1 < 5)) < sptol) + + !2dim + print*,' test_sp_2dim', order + call assert( abs(moment(x2, order) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1) - mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2) - mean(x2**2, 2)) < sptol)) + + print*,' test_sp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + + print*,' test_sp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11)) -& + mean(x2**2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& + mean(x2**2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& + mean(x2**2, 2, x2 < 11)) < sptol)) + + !3dim + print*,' test_sp_3dim', order + call assert( abs(moment(x3, order) - mean(x3**2)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1) -& + mean(x3**2, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2) -& + mean(x3**2, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3) -& + mean(x3**2, 3)) < sptol)) + + print*,' test_sp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) + + print*,' test_sp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + mean(x3**2, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& + mean(x3**2, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& + mean(x3**2, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& + mean(x3**2, 3, x3 < 45)) < sptol )) + + end subroutine + + subroutine test_csp(x1, x2) + complex(sp), intent(in) :: x1(:), x2(:, :) + + integer :: order + complex(sp), allocatable :: x3(:, :, :) + + order = 1 + + !1dim + print*,' test_sp_1dim', order + call assert( abs(moment(x1, order) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, 1) - mean(x1, 1)) < sptol) + + print*,' test_sp_1dim_mask', order + call assert( ieee_is_nan(abs(moment(x1, order, mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, dim = 1, mask = .false.)))) + + print*,' test_sp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (aimag(x1) == 0)) -& + mean(x1, aimag(x1) == 0)) < sptol) + call assert( abs(moment(x1, order, dim = 1, mask = (aimag(x1) == 0)) -& + mean(x1, 1, aimag(x1) == 0)) < sptol) + + !2dim + print*,' test_sp_2dim', order + call assert( abs(moment(x2, order) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1) - mean(x2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2) - mean(x2, 2)) < sptol)) + + print*,' test_sp_2dim_mask', order + call assert( ieee_is_nan(abs(moment(x2, order, mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, mask = .false.))))) + + print*,' test_sp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (aimag(x2) == 0)) -& + mean(x2, aimag(x2) == 0)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, mask = (aimag(x2) == 0)) -& + mean(x2, 1, aimag(x2) == 0)) < sptol)) + call assert( any(ieee_is_nan( abs( moment(x2, order,& + dim = 2, mask = (aimag(x2) == 0)) -& + mean(x2, 2, aimag(x2) == 0))))) + + order = 2 + + !1dim + print*,' test_sp_1dim', order + call assert( abs(moment(x1, order) - mean(x1**2)) < sptol) + call assert( abs(moment(x1, order, 1) -& + mean(x1**2, 1)) < sptol) + + print*,' test_sp_1dim_mask', order + call assert( ieee_is_nan(abs(moment(x1, order, mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, dim = 1, mask = .false.)))) + + print*,' test_sp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (aimag(x1) == 0)) -& + mean(x1**2, aimag(x1) == 0)) < sptol) + call assert( abs(moment(x1, order, dim = 1, mask = (aimag(x1) == 0)) -& + mean(x1**2, 1, aimag(x1) == 0)) < sptol) + + !2dim + print*,' test_sp_2dim', order + call assert( abs(moment(x2, order) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1) - mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2) - mean(x2**2, 2)) < sptol)) + + print*,' test_sp_2dim_mask', order + call assert( ieee_is_nan(abs(moment(x2, order, mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, mask = .false.))))) + + print*,' test_sp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (aimag(x2) == 0)) -& + mean(x2**2, aimag(x2) == 0)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, mask = (aimag(x2)==0)) -& + mean(x2**2, 1, aimag(x2)==0)) < sptol)) + + end subroutine +end program From cb69df86e3f23aaf47470f62e3287f474abb7b99 Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Sun, 22 Mar 2020 19:50:01 +0100 Subject: [PATCH 2/8] raw_moment_dev: style correction --- src/stdlib_experimental_stats_moment.fypp | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/stdlib_experimental_stats_moment.fypp b/src/stdlib_experimental_stats_moment.fypp index 4672696d3..f875e4ed3 100644 --- a/src/stdlib_experimental_stats_moment.fypp +++ b/src/stdlib_experimental_stats_moment.fypp @@ -108,7 +108,6 @@ contains case default call error_stop("ERROR (moment): wrong dimension") end select - res = res / n end function ${RName}$ @@ -143,7 +142,8 @@ contains case(${fi}$) if (present(center)) then do i = 1, size(x, ${fi}$) - res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - center)**order + res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -& + center)**order end do else do i = 1, size(x, ${fi}$) @@ -154,7 +154,6 @@ contains case default call error_stop("ERROR (moment): wrong dimension") end select - res = res / n end function ${RName}$ @@ -234,7 +233,8 @@ contains case(${fi}$) if (present(center)) then do i = 1, size(x, ${fi}$) - res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - center)**order,& + res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ -& + center)**order,& #:if t1[0] == 'r' 0._${k1}$,& #:else @@ -257,7 +257,6 @@ contains case default call error_stop("ERROR (moment): wrong dimension") end select - res = res / n end function ${RName}$ @@ -281,26 +280,27 @@ contains n = count(mask, dim) - res = 0 - select case(dim) - #:for fi in range(1, rank+1) - case(${fi}$) - if (present(center)) then - do i = 1, size(x, ${fi}$) - res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - center)**order,& - 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) - end do - else - do i = 1, size(x, ${fi}$) - res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp))**order,& - 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) - end do - end if - #:endfor - case default - call error_stop("ERROR (moment): wrong dimension") - end select - + res = 0 + select case(dim) + #:for fi in range(1, rank+1) + case(${fi}$) + if (present(center)) then + do i = 1, size(x, ${fi}$) + res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -& + center)**order,& + 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) + end do + else + do i = 1, size(x, ${fi}$) + res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp))& + **order,& + 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) + end do + end if + #:endfor + case default + call error_stop("ERROR (moment): wrong dimension") + end select res = res / n end function ${RName}$ From cd2c16ced409ff65ddbdcb134a7b608282c9b16f Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Wed, 25 Mar 2020 10:58:24 +0100 Subject: [PATCH 3/8] mv_to_central_moment: changed default to central moment --- src/stdlib_experimental_stats_moment.fypp | 28 +- src/tests/stats/test_moment.f90 | 920 ++++++++++------------ src/tests/stats/test_rawmoment.f90 | 448 +++++++---- 3 files changed, 720 insertions(+), 676 deletions(-) diff --git a/src/stdlib_experimental_stats_moment.fypp b/src/stdlib_experimental_stats_moment.fypp index f875e4ed3..b6264cd44 100644 --- a/src/stdlib_experimental_stats_moment.fypp +++ b/src/stdlib_experimental_stats_moment.fypp @@ -32,7 +32,7 @@ contains if (present(center)) then res = sum((x - center)**order) / n else - res = sum((x)**order) / n + res = sum((x - mean(x))**order) / n end if end function ${RName}$ @@ -62,7 +62,7 @@ contains if (present(center)) then res = sum((real(x, dp) - center)**order) / n else - res = sum((real(x, dp))**order) / n + res = sum((real(x, dp) - mean(x))**order) / n end if end function ${RName}$ @@ -83,6 +83,7 @@ contains integer :: i real(${k1}$) :: n + ${t1}$, allocatable :: mean_${ranksuffix(rank-1)}$ if (.not.optval(mask, .true.)) then res = ieee_value(1._${k1}$, ieee_quiet_nan) @@ -100,9 +101,11 @@ contains res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - center)**order end do else + allocate(mean_, source = mean(x, ${fi}$)) do i = 1, size(x, ${fi}$) - res = res + (x${select_subarray(rank, [(fi, 'i')])}$)**order + res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - mean_)**order end do + deallocate(mean_) end if #:endfor case default @@ -128,6 +131,7 @@ contains integer :: i real(dp) :: n + real(dp), allocatable :: mean_${ranksuffix(rank-1)}$ if (.not.optval(mask, .true.)) then res = ieee_value(1._dp, ieee_quiet_nan) @@ -146,9 +150,11 @@ contains center)**order end do else + allocate(mean_, source = mean(x, ${fi}$)) do i = 1, size(x, ${fi}$) - res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp))**order + res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean_)**order end do + deallocate(mean_) end if #:endfor case default @@ -178,7 +184,7 @@ contains if (present(center)) then res = sum((x - center)**order, mask) / n else - res = sum((x)**order, mask) / n + res = sum((x - mean(x, mask))**order, mask) / n end if end function ${RName}$ @@ -203,7 +209,7 @@ contains if (present(center)) then res = sum((real(x, dp) - center)**order, mask) / n else - res = sum((real(x, dp))**order, mask) / n + res = sum((real(x, dp) - mean(x,mask))**order, mask) / n end if end function ${RName}$ @@ -224,6 +230,7 @@ contains integer :: i real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$ + ${t1}$, allocatable :: mean_${ranksuffix(rank-1)}$ n = count(mask, dim) @@ -243,8 +250,9 @@ contains mask${select_subarray(rank, [(fi, 'i')])}$) end do else + allocate(mean_, source = mean(x, ${fi}$, mask)) do i = 1, size(x, ${fi}$) - res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$)**order,& + res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - mean_)**order,& #:if t1[0] == 'r' 0._${k1}$,& #:else @@ -252,6 +260,7 @@ contains #:endif mask${select_subarray(rank, [(fi, 'i')])}$) end do + deallocate(mean_) end if #:endfor case default @@ -277,6 +286,7 @@ contains integer :: i real(dp) :: n${reduced_shape('x', rank, 'dim')}$ + real(dp), allocatable :: mean_${ranksuffix(rank-1)}$ n = count(mask, dim) @@ -291,11 +301,13 @@ contains 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) end do else + allocate(mean_, source = mean(x, ${fi}$, mask)) do i = 1, size(x, ${fi}$) - res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp))& + res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean_)& **order,& 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) end do + deallocate(mean_) end if #:endfor case default diff --git a/src/tests/stats/test_moment.f90 b/src/tests/stats/test_moment.f90 index ef4fdefd6..9faab8523 100644 --- a/src/tests/stats/test_moment.f90 +++ b/src/tests/stats/test_moment.f90 @@ -1,7 +1,7 @@ program test_moment use stdlib_experimental_error, only: assert use stdlib_experimental_kinds, only: sp, dp, int32, int64 - use stdlib_experimental_stats, only: mean, moment + use stdlib_experimental_stats, only: moment use,intrinsic :: ieee_arithmetic, only : ieee_is_nan implicit none @@ -45,42 +45,32 @@ subroutine test_sp(x1, x2) !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order, center=mean(x1))) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1))) < sptol) + call assert( abs(moment(x1, order)) < sptol) + call assert( abs(moment(x1, order, dim=1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& - mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& - mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& - mask = (x1 < 5))) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& - mask = (x1 < 5))) < sptol) + call assert( abs(moment(x1, order, mask = (x1 < 5))) < sptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5))) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order, center = mean(x2))) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1))) < sptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2))) < sptol)) + call assert( abs(moment(x2, order)) < sptol) + call assert( all( abs( moment(x2, order, 1)) < sptol)) + call assert( all( abs( moment(x2, order, 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), mask = (x2 < 11)))& - < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, x2 < 11),& - mask = (x2 < 11))) < sptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2, x2 < 11),& - mask = (x2 < 11))) < sptol)) + call assert( abs(moment(x2, order, mask = (x2 < 11))) < sptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11))) < sptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11))) < sptol)) !3dim allocate(x3(size(x2,1),size(x2,2),3)) @@ -89,92 +79,74 @@ subroutine test_sp(x1, x2) x3(:,:,3)=x2*4; print*,' test_sp_3dim', order - call assert( abs(moment(x3, order, center = mean(x3))) < sptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1))) < sptol)) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2))) < sptol)) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3))) < sptol)) + call assert( abs(moment(x3, order)) < sptol) + call assert( all( abs( moment(x3, order, 1)) < sptol)) + call assert( all( abs( moment(x3, order, 2)) < sptol)) + call assert( all( abs( moment(x3, order, 3)) < sptol)) print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& - mask = (x3 < 11)) ) < sptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& - mask = (x3 < 45))) < sptol )) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& - mask = (x3 < 45))) < sptol )) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& - mask = (x3 < 45))) < sptol )) + call assert( abs(moment(x3, order, mask = (x3 < 11)) ) < sptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45))) < sptol )) + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45))) < sptol )) + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45))) < sptol )) order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order, center = mean(x1)) - 2._sp) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1)) - 2._sp) < sptol) + call assert( abs(moment(x1, order) - 2._sp) < sptol) + call assert( abs(moment(x1, order, dim=1) - 2._sp) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& - mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& - mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& - mask = (x1 < 5)) - 1.25_sp) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& - mask = (x1 < 5)) - 1.25_sp) < sptol) + call assert( abs(moment(x1, order, mask = (x1 < 5)) - 1.25_sp) < sptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5)) - 1.25_sp) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order, center = mean(x2)) - 107.25_sp/9.) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1)) -& - [5._sp, 5._sp, 1.25_sp]) < sptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2)) -& - [19.0, 43. / 3., 31. / 3. , 7.0]*2./3.) < sptol)) + call assert( abs(moment(x2, order) - 107.25_sp/9.) < sptol) + call assert( all( abs( moment(x2, order, 1) - [5._sp, 5._sp, 1.25_sp]) < sptol)) + call assert( all( abs( moment(x2, order, 2) -& + [19.0, 43. / 3., 31. / 3. , 7.0]*2./3.) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), mask = (x2 < 11))-& - 2.75_sp*3.) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, x2 < 11),& - mask = (x2 < 11)) - [5._sp, 5._sp, 0.25_sp]) < sptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2, x2 < 11),& - mask = (x2 < 11)) -& + call assert( abs(moment(x2, order, mask = (x2 < 11))- 2.75_sp*3.) < sptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11)) -& + [5._sp, 5._sp, 0.25_sp]) < sptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11)) -& [19._sp*2./3., 43._sp/9.*2., 0.25_sp , 0.25_sp]) < sptol)) !3dim print*,' test_sp_3dim', order - call assert( abs(moment(x3, order, center = mean(x3)) - 153.4_sp*35./36.) < sptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1)) -& + call assert( abs(moment(x3, order) - 153.4_sp*35./36.) < sptol) + call assert( all( abs( moment(x3, order, 1) -& reshape([20._sp / 3., 20._sp / 3., 5._sp / 3.,& 4* 20._sp / 3., 4* 20._sp / 3., 4* 5._sp / 3.,& 16* 20._sp / 3., 16* 20._sp / 3., 16* 5._sp / 3.],& [size(x3,2), size(x3,3)])*3._sp/4.)& < sptol)) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2)) -& + call assert( all( abs( moment(x3, order, 2) -& reshape([19._sp, 43._sp / 3., 31._sp / 3. , 7.0_sp,& 4* 19.0_sp, 4* 43._sp / 3., 4* 31._sp / 3. , 4* 7.0_sp,& 16* 19.0_sp, 16* 43._sp / 3., 16* 31._sp / 3. , 16* 7.0_sp],& [size(x3,1), size(x3,3)] )*2._sp/3.)& < sptol)) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3)) -& + call assert( all( abs( moment(x3, order, 3) -& reshape([ 7._sp/3., 21._sp, 175._sp/3.,& 343._sp/3., 28._sp/3., 112._sp/3.,& 84._sp, 448._sp/3., 189._sp,& @@ -183,32 +155,25 @@ subroutine test_sp(x1, x2) < sptol)) print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& - mask = (x3 < 11)) - 7.7370242214532876_dp ) < sptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& - mask = (x3 < 45)) -& + call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + 7.7370242214532876_dp ) < sptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45)) -& reshape([5._sp, 5._sp, 1.25_sp, 20._sp, 20._sp, 5._sp,& 80._sp, 80._sp, 32._sp/3.],& [size(x3, 2), size(x3, 3)])) < sptol )) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& - mask = (x3 < 45)) -& + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45)) -& reshape([ 38._sp/3., 86._sp/9., 62._sp/9., 14._sp/3., 152._sp/3.,& 344._sp/9., 248._sp/9., 168._sp/9., 1824._sp/9.,& 1376._sp/9., 992._sp/9., 4._sp& ],& [size(x3, 1), size(x3, 3)])) < sptol )) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& - mask = (x3 < 45)) -& + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45)) -& reshape([14._sp/9., 14._sp, 350._sp/9., 686._sp/9., 56._sp/9.,& 224._sp/9., 56._sp, 896._sp/9., 126._sp, 1400._sp/9.,& 1694._sp/9., 36._sp& @@ -224,143 +189,144 @@ subroutine test_dp(x1, x2) real(dp), allocatable :: x3(:, :, :) order = 1 -! -! !1dim -! print*,' test_dp_1dim', order -! call assert( abs(moment(x1, order, center = mean(x1, < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1)) < dptol) -! -! print*,' test_dp_1dim_mask', order -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) -! -! print*,' test_dp_1dim_mask_array', order -! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5)) < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5)) < dptol) -! -! !2dim -! print*,' test_dp_2dim', order -! call assert( abs(moment(x2, order, center = mean(x2, < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1)) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2)) < dptol)) -! -! print*,' test_dp_2dim_mask', order -! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) -! -! print*,' test_dp_2dim_mask_array', order -! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)) < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11)) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11)) < dptol)) -! -! !3dim -! allocate(x3(size(x2,1),size(x2,2),3)) -! x3(:,:,1)=x2; -! x3(:,:,2)=x2*2; -! x3(:,:,3)=x2*4; -! -! print*,' test_dp_3dim', order -! call assert( abs(moment(x3, order, center = mean(x3, < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1)) < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2)) < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3)) < dptol)) -! -! print*,' test_dp_3dim_mask', order -! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) -! -! print*,' test_dp_3dim_mask_array', order -! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) ) < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45)) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45)) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45)) < dptol )) -! -! -! order = 2 -! -! !1dim -! print*,' test_dp_1dim', order -! call assert( abs(moment(x1, order, center = mean(x1, - 2._dp) < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1) - 2._dp) < dptol) -! -! print*,' test_dp_1dim_mask', order -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) -! -! print*,' test_dp_1dim_mask_array', order -! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5) - 1.25_dp) < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5) - 1.25_dp) < dptol) -! -! !2dim -! print*,' test_dp_2dim', order -! call assert( abs(moment(x2, order, center = mean(x2, - 107.25_dp/9.) < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2) -& -! [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) -! -! print*,' test_dp_2dim_mask', order -! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) -! -! print*,' test_dp_2dim_mask_array', order -! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)- 2.75_dp*3.) < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11) -& -! [5._dp, 5._dp, 0.25_dp]) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11) -& -! [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) -! -! !3dim -! print*,' test_dp_3dim', order -! call assert( abs(moment(x3, order, center = mean(x3, - 153.4_dp*35./36.) < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1) -& -! reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& -! 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& -! 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& -! [size(x3,2), size(x3,3)])*3._dp/4.)& -! < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2) -& -! reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& -! 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& -! 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& -! [size(x3,1), size(x3,3)] )*2._dp/3.)& -! < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3) -& -! reshape([ 7._dp/3., 21._dp, 175._dp/3.,& -! 343._dp/3., 28._dp/3., 112._dp/3.,& -! 84._dp, 448._dp/3., 189._dp,& -! 700._dp/3., 847._dp/3., 336._dp],& -! [size(x3,1), size(x3,2)] )*2./3.)& -! < dptol)) -! -! print*,' test_dp_3dim_mask', order -! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) -! -! print*,' test_dp_3dim_mask_array', order -! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) - 7.7370242214532876_dp ) < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45) -& -! reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& -! 80._dp, 80._dp, 32._dp/3.],& -! [size(x3, 2), size(x3, 3)])) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45) -& -! reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& -! 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& -! 1376._dp/9., 992._dp/9., 4._dp& -! ],& -! [size(x3, 1), size(x3, 3)])) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45) -& -! reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& -! 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& -! 1694._dp/9., 36._dp& -! ], [size(x3,1), size(x3,2)] ))& -! < dptol )) -! + + !1dim + print*,' test_dp_1dim', order + call assert( abs(moment(x1, order)) < dptol) + call assert( abs(moment(x1, order, dim=1)) < dptol) + + print*,' test_dp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) + + print*,' test_dp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5))) < dptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5))) < dptol) + + !2dim + print*,' test_dp_2dim', order + call assert( abs(moment(x2, order)) < dptol) + call assert( all( abs( moment(x2, order, 1)) < dptol)) + call assert( all( abs( moment(x2, order, 2)) < dptol)) + + print*,' test_dp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) + + print*,' test_dp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11))) < dptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11))) < dptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11))) < dptol)) + + !3dim + allocate(x3(size(x2,1),size(x2,2),3)) + x3(:,:,1)=x2; + x3(:,:,2)=x2*2; + x3(:,:,3)=x2*4; + + print*,' test_dp_3dim', order + call assert( abs(moment(x3, order)) < dptol) + call assert( all( abs( moment(x3, order, 1)) < dptol)) + call assert( all( abs( moment(x3, order, 2)) < dptol)) + call assert( all( abs( moment(x3, order, 3)) < dptol)) + + print*,' test_dp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) + + print*,' test_dp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) ) < dptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45))) < dptol )) + + + order = 2 + + !1dim + print*,' test_dp_1dim', order + call assert( abs(moment(x1, order) - 2._dp) < dptol) + call assert( abs(moment(x1, order, dim=1) - 2._dp) < dptol) + + print*,' test_dp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) + + print*,' test_dp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5)) - 1.25_dp) < dptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5)) - 1.25_dp) < dptol) + + !2dim + print*,' test_dp_2dim', order + call assert( abs(moment(x2, order) - 107.25_dp/9.) < dptol) + call assert( all( abs( moment(x2, order, 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) + call assert( all( abs( moment(x2, order, 2) -& + [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) + + print*,' test_dp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) + + print*,' test_dp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11))- 2.75_dp*3.) < dptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11)) -& + [5._dp, 5._dp, 0.25_dp]) < dptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11)) -& + [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) + + !3dim + print*,' test_dp_3dim', order + call assert( abs(moment(x3, order) - 153.4_dp*35./36.) < dptol) + call assert( all( abs( moment(x3, order, 1) -& + reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& + 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& + 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& + [size(x3,2), size(x3,3)])*3._dp/4.)& + < dptol)) + call assert( all( abs( moment(x3, order, 2) -& + reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& + 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& + 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& + [size(x3,1), size(x3,3)] )*2._dp/3.)& + < dptol)) + call assert( all( abs( moment(x3, order, 3) -& + reshape([ 7._dp/3., 21._dp, 175._dp/3.,& + 343._dp/3., 28._dp/3., 112._dp/3.,& + 84._dp, 448._dp/3., 189._dp,& + 700._dp/3., 847._dp/3., 336._dp],& + [size(x3,1), size(x3,2)] )*2./3.)& + < dptol)) + + print*,' test_dp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) + + print*,' test_dp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + 7.7370242214532876_dp ) < dptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45)) -& + reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& + 80._dp, 80._dp, 32._dp/3.],& + [size(x3, 2), size(x3, 3)])) < dptol )) + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45)) -& + reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& + 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& + 1376._dp/9., 992._dp/9., 4._dp& + ],& + [size(x3, 1), size(x3, 3)])) < dptol )) + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45)) -& + reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& + 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& + 1694._dp/9., 36._dp& + ], [size(x3,1), size(x3,2)] ))& + < dptol )) + end subroutine subroutine test_int32(x1, x2) @@ -373,42 +339,32 @@ subroutine test_int32(x1, x2) !1dim print*,' test_dp_1dim', order - call assert( abs(moment(x1, order, center = mean(x1))) < dptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1))) < dptol) + call assert( abs(moment(x1, order)) < dptol) + call assert( abs(moment(x1, order, dim=1)) < dptol) print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& - mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& - mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& - mask = (x1 < 5))) < dptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& - mask = (x1 < 5))) < dptol) + call assert( abs(moment(x1, order, mask = (x1 < 5))) < dptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5))) < dptol) !2dim print*,' test_dp_2dim', order - call assert( abs(moment(x2, order, center = mean(x2))) < dptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1))) < dptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2))) < dptol)) + call assert( abs(moment(x2, order)) < dptol) + call assert( all( abs( moment(x2, order, 1)) < dptol)) + call assert( all( abs( moment(x2, order, 2)) < dptol)) print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, center = mean(x2, x2 < 11),& - mask = (x2 < 11))) < dptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, x2 < 11),& - mask = (x2 < 11))) < dptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2, x2 < 11),& - mask = (x2 < 11))) < dptol)) + call assert( abs(moment(x2, order, mask = (x2 < 11))) < dptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11))) < dptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11))) < dptol)) !3dim allocate(x3(size(x2,1),size(x2,2),3)) @@ -417,93 +373,74 @@ subroutine test_int32(x1, x2) x3(:,:,3)=x2*4; print*,' test_dp_3dim', order - call assert( abs(moment(x3, order, center = mean(x3))) < dptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1))) < dptol)) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2))) < dptol)) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3))) < dptol)) + call assert( abs(moment(x3, order)) < dptol) + call assert( all( abs( moment(x3, order, 1)) < dptol)) + call assert( all( abs( moment(x3, order, 2)) < dptol)) + call assert( all( abs( moment(x3, order, 3)) < dptol)) print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& - mask = (x3 < 11) )) < dptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& - mask = (x3 < 45))) < dptol )) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& - mask = (x3 < 45))) < dptol )) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& - mask = (x3 < 45))) < dptol )) + call assert( abs(moment(x3, order, mask = (x3 < 11)) ) < dptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45))) < dptol )) order = 2 !1dim print*,' test_dp_1dim', order - call assert( abs(moment(x1, order, center = mean(x1)) - 2._dp) < dptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1)) - 2._dp) < dptol) + call assert( abs(moment(x1, order) - 2._dp) < dptol) + call assert( abs(moment(x1, order, dim=1) - 2._dp) < dptol) print*,' test_dp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.),& - mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, 1, center = mean(x1, 1, .false.),& - mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) print*,' test_dp_1dim_mask_array', order - call assert( abs(moment(x1, order, center = mean(x1, x1 < 5),& - mask = (x1 < 5)) - 1.25_dp) < dptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1, x1 < 5),& - mask = (x1 < 5)) - 1.25_dp) < dptol) + call assert( abs(moment(x1, order, mask = (x1 < 5)) - 1.25_dp) < dptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5)) - 1.25_dp) < dptol) !2dim print*,' test_dp_2dim', order - call assert( abs(moment(x2, order, center = mean(x2)) - 107.25_dp/9.) < dptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1)) -& - [5._dp, 5._dp, 1.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2)) -& + call assert( abs(moment(x2, order) - 107.25_dp/9.) < dptol) + call assert( all( abs( moment(x2, order, 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) + call assert( all( abs( moment(x2, order, 2) -& [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) print*,' test_dp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, 1, center = mean(x2, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, 2, center = mean(x2, 2, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) print*,' test_dp_2dim_mask_array', order - call assert( abs(moment(x2, order, center = mean(x2, x2 < 11),& - mask = (x2 < 11))- 2.75_dp*3.) < dptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1,& - mask = (x2 < 11)), mask = (x2 < 11)) -& + call assert( abs(moment(x2, order, mask = (x2 < 11))- 2.75_dp*3.) < dptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11)) -& [5._dp, 5._dp, 0.25_dp]) < dptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2,& - mask = (x2 < 11)), mask = (x2 < 11)) -& + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11)) -& [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) !3dim print*,' test_dp_3dim', order - call assert( abs(moment(x3, order, center = mean(x3)) - 153.4_dp*35./36.) < dptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1)) -& + call assert( abs(moment(x3, order) - 153.4_dp*35./36.) < dptol) + call assert( all( abs( moment(x3, order, 1) -& reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& [size(x3,2), size(x3,3)])*3._dp/4.)& < dptol)) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2)) -& + call assert( all( abs( moment(x3, order, 2) -& reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& [size(x3,1), size(x3,3)] )*2._dp/3.)& < dptol)) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3)) -& + call assert( all( abs( moment(x3, order, 3) -& reshape([ 7._dp/3., 21._dp, 175._dp/3.,& 343._dp/3., 28._dp/3., 112._dp/3.,& 84._dp, 448._dp/3., 189._dp,& @@ -512,32 +449,25 @@ subroutine test_int32(x1, x2) < dptol)) print*,' test_dp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.),& - mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, 1, center = mean(x3, 1, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 2, center = mean(x3, 2, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, 3, center = mean(x3, 3, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) print*,' test_dp_3dim_mask_array', order - call assert( abs(moment(x3, order, center = mean(x3, x3 < 11),& - mask = (x3 < 11)) - 7.7370242214532876_dp ) < dptol) - call assert( all( abs( moment(x3, order, 1, center = mean(x3, 1, x3 < 45),& - mask = (x3 < 45)) -& + call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + 7.7370242214532876_dp ) < dptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45)) -& reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& 80._dp, 80._dp, 32._dp/3.],& [size(x3, 2), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 2, center = mean(x3, 2, x3 < 45),& - mask = (x3 < 45)) -& + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45)) -& reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& 1376._dp/9., 992._dp/9., 4._dp& ],& [size(x3, 1), size(x3, 3)])) < dptol )) - call assert( all( abs( moment(x3, order, 3, center = mean(x3, 3, x3 < 45),& - mask = (x3 < 45)) -& + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45)) -& reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& 1694._dp/9., 36._dp& @@ -554,142 +484,143 @@ subroutine test_int64(x1, x2) order = 1 -! !1dim -! print*,' test_dp_1dim', order -! call assert( abs(moment(x1, order, center = mean(x1, < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1)) < dptol) -! -! print*,' test_dp_1dim_mask', order -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) -! -! print*,' test_dp_1dim_mask_array', order -! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5)) < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5)) < dptol) -! -! !2dim -! print*,' test_dp_2dim', order -! call assert( abs(moment(x2, order, center = mean(x2, < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1)) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2)) < dptol)) -! -! print*,' test_dp_2dim_mask', order -! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) -! -! print*,' test_dp_2dim_mask_array', order -! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)) < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11)) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11)) < dptol)) -! -! !3dim -! allocate(x3(size(x2,1),size(x2,2),3)) -! x3(:,:,1)=x2; -! x3(:,:,2)=x2*2; -! x3(:,:,3)=x2*4; -! -! print*,' test_dp_3dim', order -! call assert( abs(moment(x3, order, center = mean(x3, < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1)) < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2)) < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3)) < dptol)) -! -! print*,' test_dp_3dim_mask', order -! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) -! -! print*,' test_dp_3dim_mask_array', order -! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) ) < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45)) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45)) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45)) < dptol )) -! -! -! order = 2 -! -! !1dim -! print*,' test_dp_1dim', order -! call assert( abs(moment(x1, order, center = mean(x1, - 2._dp) < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, dim=1), dim=1) - 2._dp) < dptol) -! -! print*,' test_dp_1dim_mask', order -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, .false.), .false.))) -! call assert( ieee_is_nan(moment(x1, order, center = mean(x1, 1, .false.), 1, .false.))) -! -! print*,' test_dp_1dim_mask_array', order -! call assert( abs(moment(x1, order, center = mean(x1, x1 < 5), x1 < 5) - 1.25_dp) < dptol) -! call assert( abs(moment(x1, order, center = mean(x1, 1, x1 < 5), 1, x1 < 5) - 1.25_dp) < dptol) -! -! !2dim -! print*,' test_dp_2dim', order -! call assert( abs(moment(x2, order, center = mean(x2, - 107.25_dp/9.) < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1), 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2), 2) -& -! [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) -! -! print*,' test_dp_2dim_mask', order -! call assert( ieee_is_nan(moment(x2, order, center = mean(x2, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x2, order, center = mean(x2, 2, .false.), 2, .false.)))) -! -! print*,' test_dp_2dim_mask_array', order -! call assert( abs(moment(x2, order, center = mean(x2, x2 < 11), x2 < 11)- 2.75_dp*3.) < dptol) -! call assert( all( abs( moment(x2, order, center = mean(x2, 1, x2 < 11), 1, x2 < 11) -& -! [5._dp, 5._dp, 0.25_dp]) < dptol)) -! call assert( all( abs( moment(x2, order, center = mean(x2, 2, x2 < 11), 2, x2 < 11) -& -! [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) -! -! !3dim -! print*,' test_dp_3dim', order -! call assert( abs(moment(x3, order, center = mean(x3, - 153.4_dp*35./36.) < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1), 1) -& -! reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& -! 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& -! 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& -! [size(x3,2), size(x3,3)])*3._dp/4.)& -! < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2), 2) -& -! reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& -! 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& -! 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& -! [size(x3,1), size(x3,3)] )*2._dp/3.)& -! < dptol)) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3), 3) -& -! reshape([ 7._dp/3., 21._dp, 175._dp/3.,& -! 343._dp/3., 28._dp/3., 112._dp/3.,& -! 84._dp, 448._dp/3., 189._dp,& -! 700._dp/3., 847._dp/3., 336._dp],& -! [size(x3,1), size(x3,2)] )*2./3.)& -! < dptol)) -! -! print*,' test_dp_3dim_mask', order -! call assert( ieee_is_nan(moment(x3, order, center = mean(x3, .false.), .false.))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 1, .false.), 1, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 2, .false.), 2, .false.)))) -! call assert( any(ieee_is_nan(moment(x3, order, center = mean(x3, 3, .false.), 3, .false.)))) -! -! print*,' test_dp_3dim_mask_array', order -! call assert( abs(moment(x3, order, center = mean(x3, x3 < 11), x3 < 11) - 7.7370242214532876_dp ) < dptol) -! call assert( all( abs( moment(x3, order, center = mean(x3, 1, x3 < 45), 1, x3 < 45) -& -! reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& -! 80._dp, 80._dp, 32._dp/3.],& -! [size(x3, 2), size(x3, 3)])) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 2, x3 < 45), 2, x3 < 45) -& -! reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& -! 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& -! 1376._dp/9., 992._dp/9., 4._dp& -! ],& -! [size(x3, 1), size(x3, 3)])) < dptol )) -! call assert( all( abs( moment(x3, order, center = mean(x3, 3, x3 < 45), 3, x3 < 45) -& -! reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& -! 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& -! 1694._dp/9., 36._dp& -! ], [size(x3,1), size(x3,2)] ))& -! < dptol )) -! + !1dim + print*,' test_dp_1dim', order + call assert( abs(moment(x1, order)) < dptol) + call assert( abs(moment(x1, order, dim=1)) < dptol) + + print*,' test_dp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) + + print*,' test_dp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5))) < dptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5))) < dptol) + + !2dim + print*,' test_dp_2dim', order + call assert( abs(moment(x2, order)) < dptol) + call assert( all( abs( moment(x2, order, 1)) < dptol)) + call assert( all( abs( moment(x2, order, 2)) < dptol)) + + print*,' test_dp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) + + print*,' test_dp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11))) < dptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11))) < dptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11))) < dptol)) + + !3dim + allocate(x3(size(x2,1),size(x2,2),3)) + x3(:,:,1)=x2; + x3(:,:,2)=x2*2; + x3(:,:,3)=x2*4; + + print*,' test_dp_3dim', order + call assert( abs(moment(x3, order)) < dptol) + call assert( all( abs( moment(x3, order, 1)) < dptol)) + call assert( all( abs( moment(x3, order, 2)) < dptol)) + call assert( all( abs( moment(x3, order, 3)) < dptol)) + + print*,' test_dp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) + + print*,' test_dp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) ) < dptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45))) < dptol )) + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45))) < dptol )) + + + order = 2 + + !1dim + print*,' test_dp_1dim', order + call assert( abs(moment(x1, order) - 2._dp) < dptol) + call assert( abs(moment(x1, order, dim=1) - 2._dp) < dptol) + + print*,' test_dp_1dim_mask', order + call assert( ieee_is_nan(moment(x1, order, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, 1, mask = .false.))) + + print*,' test_dp_1dim_mask_array', order + call assert( abs(moment(x1, order, mask = (x1 < 5)) - 1.25_dp) < dptol) + call assert( abs(moment(x1, order, 1, mask = (x1 < 5)) - 1.25_dp) < dptol) + + !2dim + print*,' test_dp_2dim', order + call assert( abs(moment(x2, order) - 107.25_dp/9.) < dptol) + call assert( all( abs( moment(x2, order, 1) - [5._dp, 5._dp, 1.25_dp]) < dptol)) + call assert( all( abs( moment(x2, order, 2) -& + [19._dp, 43._dp / 3., 31._dp / 3. , 7._dp]*2._dp/3.) < dptol)) + + print*,' test_dp_2dim_mask', order + call assert( ieee_is_nan(moment(x2, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, 2, mask = .false.)))) + + print*,' test_dp_2dim_mask_array', order + call assert( abs(moment(x2, order, mask = (x2 < 11))- 2.75_dp*3.) < dptol) + call assert( all( abs( moment(x2, order, 1, mask = (x2 < 11)) -& + [5._dp, 5._dp, 0.25_dp]) < dptol)) + call assert( all( abs( moment(x2, order, 2, mask = (x2 < 11)) -& + [19._dp*2./3., 43._dp/9.*2., 0.25_dp , 0.25_dp]) < dptol)) + + !3dim + print*,' test_dp_3dim', order + call assert( abs(moment(x3, order) - 153.4_dp*35./36.) < dptol) + call assert( all( abs( moment(x3, order, 1) -& + reshape([20._dp / 3., 20._dp / 3., 5._dp / 3.,& + 4* 20._dp / 3., 4* 20._dp / 3., 4* 5._dp / 3.,& + 16* 20._dp / 3., 16* 20._dp / 3., 16* 5._dp / 3.],& + [size(x3,2), size(x3,3)])*3._dp/4.)& + < dptol)) + call assert( all( abs( moment(x3, order, 2) -& + reshape([19._dp, 43._dp / 3., 31._dp / 3. , 7.0_dp,& + 4* 19.0_dp, 4* 43._dp / 3., 4* 31._dp / 3. , 4* 7.0_dp,& + 16* 19.0_dp, 16* 43._dp / 3., 16* 31._dp / 3. , 16* 7.0_dp],& + [size(x3,1), size(x3,3)] )*2._dp/3.)& + < dptol)) + call assert( all( abs( moment(x3, order, 3) -& + reshape([ 7._dp/3., 21._dp, 175._dp/3.,& + 343._dp/3., 28._dp/3., 112._dp/3.,& + 84._dp, 448._dp/3., 189._dp,& + 700._dp/3., 847._dp/3., 336._dp],& + [size(x3,1), size(x3,2)] )*2./3.)& + < dptol)) + + print*,' test_dp_3dim_mask', order + call assert( ieee_is_nan(moment(x3, order, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, 1, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 2, mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, 3, mask = .false.)))) + + print*,' test_dp_3dim_mask_array', order + call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + 7.7370242214532876_dp ) < dptol) + call assert( all( abs( moment(x3, order, 1, mask = (x3 < 45)) -& + reshape([5._dp, 5._dp, 1.25_dp, 20._dp, 20._dp, 5._dp,& + 80._dp, 80._dp, 32._dp/3.],& + [size(x3, 2), size(x3, 3)])) < dptol )) + call assert( all( abs( moment(x3, order, 2, mask = (x3 < 45)) -& + reshape([ 38._dp/3., 86._dp/9., 62._dp/9., 14._dp/3., 152._dp/3.,& + 344._dp/9., 248._dp/9., 168._dp/9., 1824._dp/9.,& + 1376._dp/9., 992._dp/9., 4._dp& + ],& + [size(x3, 1), size(x3, 3)])) < dptol )) + call assert( all( abs( moment(x3, order, 3, mask = (x3 < 45)) -& + reshape([14._dp/9., 14._dp, 350._dp/9., 686._dp/9., 56._dp/9.,& + 224._dp/9., 56._dp, 896._dp/9., 126._dp, 1400._dp/9.,& + 1694._dp/9., 36._dp& + ], [size(x3,1), size(x3,2)] ))& + < dptol )) + end subroutine subroutine test_csp(x1, x2) @@ -702,73 +633,61 @@ subroutine test_csp(x1, x2) !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order, center = mean(x1))) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1))) < sptol) + call assert( abs(moment(x1, order)) < sptol) + call assert( abs(moment(x1, order, dim=1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(abs(moment(x1, order, center = mean(x1, .false.),& - mask = .false.)))) - call assert( ieee_is_nan(abs(moment(x1, order, 1, center = mean(x1, 1, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, 1, mask = .false.)))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, center = mean(x1, aimag(x1) == 0),& - mask = (aimag(x1) == 0))) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1, aimag(x1) == 0),& - mask = (aimag(x1) == 0))) < sptol) + call assert( abs(moment(x1, order, mask = (aimag(x1) == 0))) < sptol) + call assert( abs(moment(x1, order, 1, mask = (aimag(x1) == 0))) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order, center = mean(x2))) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1))) < sptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2))) < sptol)) + call assert( abs(moment(x2, order)) < sptol) + call assert( all( abs( moment(x2, order, 1)) < sptol)) + call assert( all( abs( moment(x2, order, 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(abs(moment(x2, order, center = mean(x2, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 1, center = mean(x2, 1, .false.), mask = .false.))))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 2, center = mean(x2, 2, .false.), mask = .false.))))) + call assert( ieee_is_nan(abs(moment(x2, order, mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 1, mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 2, mask = .false.))))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, center = mean(x2, aimag(x2) == 0),& - mask = (aimag(x2) == 0))) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, aimag(x2) == 0), mask = (aimag(x2) == 0))) < sptol)) + call assert( abs(moment(x2, order, mask = (aimag(x2) == 0))) < sptol) + call assert( all( abs( moment(x2, order, 1, mask = (aimag(x2) == 0))) < sptol)) call assert( any(ieee_is_nan( abs( moment(x2, order, 2,& - center = mean(x2, 2, aimag(x2) == 0),& - mask = (aimag(x2) == 0)))))) + mask = (aimag(x2) == 0)))))) order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order, center = mean(x1)) - (-6.459422410E-02,-0.556084037)) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1)) -& + call assert( abs(moment(x1, order) - (-6.459422410E-02,-0.556084037)) < sptol) + call assert( abs(moment(x1, order, dim=1) -& (-6.459422410E-02,-0.556084037)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(abs(moment(x1, order, center = mean(x1, .false.),& - mask = .false.)))) - call assert( ieee_is_nan(abs(moment(x1, order, 1, center = mean(x1, 1, .false.),& - mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, 1, mask = .false.)))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, center = mean(x1, aimag(x1) == 0),& - mask = (aimag(x1) == 0)) -& + call assert( abs(moment(x1, order, mask = (aimag(x1) == 0)) -& (8.969944715E-02,0.00000000)) < sptol) - call assert( abs(moment(x1, order, 1, center = mean(x1, 1, aimag(x1) == 0),& - mask = (aimag(x1) == 0)) -& + call assert( abs(moment(x1, order, 1, mask = (aimag(x1) == 0)) -& (8.969944715E-02,0.00000000)) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order, center = mean(x2)) -& - (-0.163121477,-1.86906016)) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1)) -& + call assert( abs(moment(x2, order) - (-0.163121477,-1.86906016)) < sptol) + call assert( all( abs( moment(x2, order, 1) -& [(-6.459422410E-02,-0.556084037),& (-0.581347823,-5.00475645),& (-0.145336956,-1.25118911)]& ) < sptol)) - call assert( all( abs( moment(x2, order, 2, center = mean(x2, 2)) -& + call assert( all( abs( moment(x2, order, 2) -& [(0.240498722,0.00000000),& (-1.49895227,0.00000000),& (1.15390968,0.00000000),& @@ -777,19 +696,14 @@ subroutine test_csp(x1, x2) ) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(abs(moment(x2, order, center = mean(x2, .false.),& - mask = .false.)))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 1,& - center = mean(x2, 1, .false.), mask = .false.))))) - call assert( any(ieee_is_nan(abs(moment(x2, order, 2,& - center = mean(x2, 2, .false.), mask = .false.))))) + call assert( ieee_is_nan(abs(moment(x2, order, mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 1, mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, 2, mask = .false.))))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, center = mean(x2, aimag(x2) == 0),& - mask = (aimag(x2) == 0))-& + call assert( abs(moment(x2, order, mask = (aimag(x2) == 0))-& (1.08109438,0.00000000)) < sptol) - call assert( all( abs( moment(x2, order, 1, center = mean(x2, 1, aimag(x2)==0),& - mask = (aimag(x2)==0)) -& + call assert( all( abs( moment(x2, order, 1, mask = (aimag(x2)==0)) -& [(8.969944715E-02,0.00000000),& (0.807295084,0.00000000),& (0.201823771,0.00000000)]& diff --git a/src/tests/stats/test_rawmoment.f90 b/src/tests/stats/test_rawmoment.f90 index 2dc2b86f5..73d0317d6 100644 --- a/src/tests/stats/test_rawmoment.f90 +++ b/src/tests/stats/test_rawmoment.f90 @@ -38,40 +38,60 @@ subroutine test_sp(x1, x2) integer :: order real(sp), allocatable :: x3(:, :, :) + real(sp), allocatable :: zero2_1(:), zero2_2(:) + real(sp), allocatable :: zero3_1(:,:), zero3_2(:,:), zero3_3(:,:) + + allocate(zero2_1(size(x2, 2)), zero2_2(size(x2, 1))) + zero2_1 = 0 + zero2_2 = 0 + + allocate(zero3_1(size(x3, 2), size(x3, 3))& + ,zero3_2(size(x3, 1), size(x3, 3))& + ,zero3_3(size(x3, 1), size(x3, 2))) + zero3_1 = 0 + zero3_2 = 0 + zero3_3 = 0 order = 1 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - mean(x1)) < sptol) - call assert( abs(moment(x1, order, 1) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, center = 0.) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, 1, center = 0.) - mean(x1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, center = 0., mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, center = 0., mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, center = 0., mask = (x1 < 5)) -& mean(x1, mask = (x1 < 5)) ) < sptol) - call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, dim = 1, center = 0., mask = (x1 < 5)) -& mean(x1, dim = 1, mask = (x1 < 5))) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - mean(x2)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1) - mean(x2, dim = 1)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2) - mean(x2, dim = 2)) < sptol)) + call assert( abs(moment(x2, order, center = 0.) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& + mean(x2, dim = 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& + mean(x2, dim = 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = 0., mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, center = zero2_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, center = zero2_2,& + mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, mask = (x2 < 11)) - mean(x2, x2 < 11)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& + call assert( abs(moment(x2, order, center = 0., mask = (x2 < 11)) -& + mean(x2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (x2 < 11)) -& mean(x2, 1, x2 < 11)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2,& + mask = (x2 < 11)) -& mean(x2, 2, x2 < 11)) < sptol)) !3dim @@ -79,90 +99,112 @@ subroutine test_sp(x1, x2) x3(:,:,1)=x2; x3(:,:,2)=x2*2; x3(:,:,3)=x2*4; - + print*,' test_sp_3dim', order - call assert( abs(moment(x3, order) - mean(x3)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1) - mean(x3, 1)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 2) - mean(x3, 2)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 3) - mean(x3, 3)) < sptol)) - + call assert( abs(moment(x3, order, center = 0.) - mean(x3)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& + mean(x3, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& + mean(x3, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3) -& + mean(x3, 3)) < sptol)) + print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) - + call assert( ieee_is_nan(moment(x3, order, center = 0., mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, center = zero3_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, center = zero3_2,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, center = zero3_3,& + mask = .false.)))) + print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, mask = (x3 < 11)) - mean(x3, x3 < 11)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& + call assert( abs(moment(x3, order, center = 0., mask = (x3 < 11)) -& + mean(x3, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& + mask = (x3 < 45)) -& mean(x3, 1, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2,& + mask = (x3 < 45)) -& mean(x3, 2, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3,& + mask = (x3 < 45)) -& mean(x3, 3, x3 < 45)) < sptol )) - + order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - mean(x1**2)) < sptol) - call assert( abs(moment(x1, order, 1) - mean(x1**2, 1)) < sptol) + call assert( abs(moment(x1, order, center = 0.) - mean(x1**2)) < sptol) + call assert( abs(moment(x1, order, 1, center = 0.) - mean(x1**2, 1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, center = 0., mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, center = 0., mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, center = 0., mask = (x1 < 5)) -& mean(x1**2, x1 < 5)) < sptol) - call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, dim = 1, center = 0., mask = (x1 < 5)) -& mean(x1**2, 1, x1 < 5)) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - mean(x2**2)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1) - mean(x2**2, 1)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2) - mean(x2**2, 2)) < sptol)) + call assert( abs(moment(x2, order, center = 0.) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& + mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) - & + mean(x2**2, 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = 0., mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, center = zero2_1, & + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, center = zero2_2, & + mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, mask = (x2 < 11)) -& + call assert( abs(moment(x2, order, center = 0., mask = (x2 < 11)) -& mean(x2**2, x2 < 11)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& - mean(x2**2, 1, x2 < 11)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& - mean(x2**2, 2, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (x2 < 11)) -& + mean(x2**2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2,& + mask = (x2 < 11)) -& + mean(x2**2, 2, x2 < 11)) < sptol)) !3dim print*,' test_sp_3dim', order - call assert( abs(moment(x3, order) - mean(x3**2)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1) -& + call assert( abs(moment(x3, order, center = 0.) - mean(x3**2)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3**2, 1)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 2) -& + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& mean(x3**2, 2)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 3) -& + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3) -& mean(x3**2, 3)) < sptol)) - + print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) - + call assert( ieee_is_nan(moment(x3, order, center = 0., mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, center = zero3_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, center = zero3_2,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, center = zero3_3,& + mask = .false.)))) + print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + call assert( abs(moment(x3, order, center = 0., mask = (x3 < 11)) -& mean(x3**2, x3 < 11)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& - mean(x3**2, 1, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& - mean(x3**2, 2, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& - mean(x3**2, 3, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& + mask = (x3 < 45)) -& + mean(x3**2, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2,& + mask = (x3 < 45)) -& + mean(x3**2, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3,& + mask = (x3 < 45)) -& + mean(x3**2, 3, x3 < 45)) < sptol )) end subroutine @@ -171,131 +213,176 @@ subroutine test_int32(x1, x2) integer :: order integer(int32), allocatable :: x3(:, :, :) + real(dp), allocatable :: zero2_1(:), zero2_2(:) + real(dp), allocatable :: zero3_1(:,:), zero3_2(:,:), zero3_3(:,:) + + allocate(zero2_1(size(x2, 2)), zero2_2(size(x2, 1))) + zero2_1 = 0 + zero2_2 = 0 + + allocate(zero3_1(size(x3, 2), size(x3, 3))& + ,zero3_2(size(x3, 1), size(x3, 3))& + ,zero3_3(size(x3, 1), size(x3, 2))) + zero3_1 = 0 + zero3_2 = 0 + zero3_3 = 0 + order = 1 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - mean(x1)) < sptol) - call assert( abs(moment(x1, order, 1) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, center = 0._dp) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, 1, center = 0._dp) - mean(x1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, center = 0._dp, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, center = 0._dp,& + mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, center = 0._dp, mask = (x1 < 5)) -& mean(x1, mask = (x1 < 5)) ) < sptol) - call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, dim = 1, center = 0._dp, mask = (x1 < 5)) -& mean(x1, dim = 1, mask = (x1 < 5))) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - mean(x2)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1) - mean(x2, dim = 1)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2) - mean(x2, dim = 2)) < sptol)) + call assert( abs(moment(x2, order, center = 0._dp) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& + mean(x2, dim = 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& + mean(x2, dim = 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = 0._dp, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, center = zero2_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, center = zero2_2,& + mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, mask = (x2 < 11)) - mean(x2, x2 < 11)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& - mean(x2, 1, x2 < 11)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& - mean(x2, 2, x2 < 11)) < sptol)) + call assert( abs(moment(x2, order, center = 0._dp, mask = (x2 < 11)) -& + mean(x2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (x2 < 11)) -& + mean(x2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2,& + mask = (x2 < 11)) -& + mean(x2, 2, x2 < 11)) < sptol)) !3dim allocate(x3(size(x2,1),size(x2,2),3)) x3(:,:,1)=x2; x3(:,:,2)=x2*2; x3(:,:,3)=x2*4; - + print*,' test_sp_3dim', order - call assert( abs(moment(x3, order) - mean(x3)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1) - mean(x3, 1)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 2) - mean(x3, 2)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 3) - mean(x3, 3)) < sptol)) - + call assert( abs(moment(x3, order, center = 0._dp) - mean(x3)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& + mean(x3, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& + mean(x3, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3) -& + mean(x3, 3)) < sptol)) + print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) - + call assert( ieee_is_nan(moment(x3, order, center = 0._dp, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, center = zero3_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, center = zero3_2,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, center = zero3_3,& + mask = .false.)))) + print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, mask = (x3 < 11)) - mean(x3, x3 < 11)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& - mean(x3, 1, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& - mean(x3, 2, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& - mean(x3, 3, x3 < 45)) < sptol )) - + call assert( abs(moment(x3, order, center = 0._dp, mask = (x3 < 11)) -& + mean(x3, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& + mask = (x3 < 45)) -& + mean(x3, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2,& + mask = (x3 < 45)) -& + mean(x3, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3,& + mask = (x3 < 45)) -& + mean(x3, 3, x3 < 45)) < sptol )) + order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - mean(x1**2)) < sptol) - call assert( abs(moment(x1, order, 1) - mean(x1**2, 1)) < sptol) + call assert( abs(moment(x1, order, center = 0._dp) - mean(x1**2)) < sptol) + call assert( abs(moment(x1, order, 1, center = 0._dp) - mean(x1**2, 1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(moment(x1, order, mask = .false.))) - call assert( ieee_is_nan(moment(x1, order, dim = 1, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, center = 0._dp, mask = .false.))) + call assert( ieee_is_nan(moment(x1, order, dim = 1, center = 0._dp,& + mask = .false.))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, center = 0._dp, mask = (x1 < 5)) -& mean(x1**2, x1 < 5)) < sptol) - call assert( abs(moment(x1, order, dim = 1, mask = (x1 < 5)) -& + call assert( abs(moment(x1, order, dim = 1, center = 0._dp, mask = (x1 < 5)) -& mean(x1**2, 1, x1 < 5)) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - mean(x2**2)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1) - mean(x2**2, 1)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2) - mean(x2**2, 2)) < sptol)) + call assert( abs(moment(x2, order, center = 0._dp) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& + mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& + mean(x2**2, 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(moment(x2, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x2, order, dim = 2, mask = .false.)))) + call assert( ieee_is_nan(moment(x2, order, center = 0._dp, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, center = zero2_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, center = zero2_2,& + mask = .false.)))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, mask = (x2 < 11)) -& + call assert( abs(moment(x2, order, center = 0._dp, mask = (x2 < 11)) -& mean(x2**2, x2 < 11)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1, mask = (x2 < 11)) -& - mean(x2**2, 1, x2 < 11)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2, mask = (x2 < 11)) -& - mean(x2**2, 2, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (x2 < 11)) -& + mean(x2**2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2,& + mask = (x2 < 11)) -& + mean(x2**2, 2, x2 < 11)) < sptol)) !3dim print*,' test_sp_3dim', order - call assert( abs(moment(x3, order) - mean(x3**2)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1) -& + call assert( abs(moment(x3, order, center = 0._dp) - mean(x3**2)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3**2, 1)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 2) -& + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& mean(x3**2, 2)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 3) -& + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3) -& mean(x3**2, 3)) < sptol)) - + print*,' test_sp_3dim_mask', order - call assert( ieee_is_nan(moment(x3, order, mask = .false.))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 1, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 2, mask = .false.)))) - call assert( any(ieee_is_nan(moment(x3, order, dim = 3, mask = .false.)))) - + call assert( ieee_is_nan(moment(x3, order, center = 0._dp, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, center = zero3_1,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, center = zero3_2,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, center = zero3_3,& + mask = .false.)))) + print*,' test_sp_3dim_mask_array', order - call assert( abs(moment(x3, order, mask = (x3 < 11)) -& + call assert( abs(moment(x3, order, center = 0._dp, mask = (x3 < 11)) -& mean(x3**2, x3 < 11)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1, mask = (x3 < 45)) -& - mean(x3**2, 1, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 2, mask = (x3 < 45)) -& - mean(x3**2, 2, x3 < 45)) < sptol )) - call assert( all( abs( moment(x3, order, dim = 3, mask = (x3 < 45)) -& - mean(x3**2, 3, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& + mask = (x3 < 45)) -& + mean(x3**2, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2,& + mask = (x3 < 45)) -& + mean(x3**2, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = zero3_3,& + mask = (x3 < 45)) -& + mean(x3**2, 3, x3 < 45)) < sptol )) end subroutine @@ -304,77 +391,108 @@ subroutine test_csp(x1, x2) integer :: order complex(sp), allocatable :: x3(:, :, :) + complex(sp), allocatable :: zero2_1(:), zero2_2(:) + complex(sp), allocatable :: zero3_1(:,:), zero3_2(:,:), zero3_3(:,:) + + allocate(zero2_1(size(x2, 2)), zero2_2(size(x2, 1))) + zero2_1 = (0., 0.) + zero2_2 = (0., 0.) + + allocate(zero3_1(size(x3, 2), size(x3, 3))& + ,zero3_2(size(x3, 1), size(x3, 3))& + ,zero3_3(size(x3, 1), size(x3, 2))) + zero3_1 = (0., 0.) + zero3_2 = (0., 0.) + zero3_3 = (0., 0.) order = 1 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - mean(x1)) < sptol) - call assert( abs(moment(x1, order, 1) - mean(x1, 1)) < sptol) + call assert( abs(moment(x1, order, center = (0., 0.)) - mean(x1)) < sptol) + call assert( abs(moment(x1, order, 1, center = (0., 0.)) - mean(x1, 1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(abs(moment(x1, order, mask = .false.)))) - call assert( ieee_is_nan(abs(moment(x1, order, dim = 1, mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, center = (0., 0.),& + mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, dim = 1, center = (0., 0.),& + mask = .false.)))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, mask = (aimag(x1) == 0)) -& + call assert( abs(moment(x1, order, center = (0., 0.), mask = (aimag(x1) == 0)) -& mean(x1, aimag(x1) == 0)) < sptol) - call assert( abs(moment(x1, order, dim = 1, mask = (aimag(x1) == 0)) -& + call assert( abs(moment(x1, order, dim = 1, center = (0., 0.),& + mask = (aimag(x1) == 0)) -& mean(x1, 1, aimag(x1) == 0)) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - mean(x2)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1) - mean(x2, 1)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2) - mean(x2, 2)) < sptol)) + call assert( abs(moment(x2, order, center = (0., 0.)) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& + mean(x2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& + mean(x2, 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(abs(moment(x2, order, mask = .false.)))) - call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, mask = .false.))))) - call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, mask = .false.))))) + call assert( ieee_is_nan(abs(moment(x2, order, center = (0., 0.),& + mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, center = zero2_1,& + mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, center = zero2_2,& + mask = .false.))))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, mask = (aimag(x2) == 0)) -& + call assert( abs(moment(x2, order, center = (0., 0.), mask = (aimag(x2) == 0)) -& mean(x2, aimag(x2) == 0)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1, mask = (aimag(x2) == 0)) -& - mean(x2, 1, aimag(x2) == 0)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (aimag(x2) == 0)) -& + mean(x2, 1, aimag(x2) == 0)) < sptol)) call assert( any(ieee_is_nan( abs( moment(x2, order,& - dim = 2, mask = (aimag(x2) == 0)) -& + dim = 2, center = zero2_2, mask = (aimag(x2) == 0)) -& mean(x2, 2, aimag(x2) == 0))))) order = 2 !1dim print*,' test_sp_1dim', order - call assert( abs(moment(x1, order) - mean(x1**2)) < sptol) - call assert( abs(moment(x1, order, 1) -& + call assert( abs(moment(x1, order, center = (0., 0.)) - mean(x1**2)) < sptol) + call assert( abs(moment(x1, order, 1, center = (0., 0.)) -& mean(x1**2, 1)) < sptol) print*,' test_sp_1dim_mask', order - call assert( ieee_is_nan(abs(moment(x1, order, mask = .false.)))) - call assert( ieee_is_nan(abs(moment(x1, order, dim = 1, mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, center = (0., 0.),& + mask = .false.)))) + call assert( ieee_is_nan(abs(moment(x1, order, dim = 1, center = (0., 0.),& + mask = .false.)))) print*,' test_sp_1dim_mask_array', order - call assert( abs(moment(x1, order, mask = (aimag(x1) == 0)) -& + call assert( abs(moment(x1, order, center = (0., 0.), mask = (aimag(x1) == 0)) -& mean(x1**2, aimag(x1) == 0)) < sptol) - call assert( abs(moment(x1, order, dim = 1, mask = (aimag(x1) == 0)) -& + call assert( abs(moment(x1, order, dim = 1, center = (0., 0.),& + mask = (aimag(x1) == 0)) -& mean(x1**2, 1, aimag(x1) == 0)) < sptol) !2dim print*,' test_sp_2dim', order - call assert( abs(moment(x2, order) - mean(x2**2)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1) - mean(x2**2, 1)) < sptol)) - call assert( all( abs( moment(x2, order, dim = 2) - mean(x2**2, 2)) < sptol)) + call assert( abs(moment(x2, order, center = (0., 0.)) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& + mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& + mean(x2**2, 2)) < sptol)) print*,' test_sp_2dim_mask', order - call assert( ieee_is_nan(abs(moment(x2, order, mask = .false.)))) - call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, mask = .false.))))) - call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, mask = .false.))))) + call assert( ieee_is_nan(abs(moment(x2, order, center = (0., 0.),& + mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, center = zero2_1,& + mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, center = zero2_2,& + mask = .false.))))) print*,' test_sp_2dim_mask_array', order - call assert( abs(moment(x2, order, mask = (aimag(x2) == 0)) -& + call assert( abs(moment(x2, order, center = (0., 0.), mask = (aimag(x2) == 0)) -& mean(x2**2, aimag(x2) == 0)) < sptol) - call assert( all( abs( moment(x2, order, dim = 1, mask = (aimag(x2)==0)) -& + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (aimag(x2)==0)) -& mean(x2**2, 1, aimag(x2)==0)) < sptol)) end subroutine From c37124a0d066d04ff1a73d36e3e96f0c3d2dac9f Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Wed, 25 Mar 2020 12:08:13 +0100 Subject: [PATCH 4/8] mv_to_central_moment: addition of a function with scalar center --- src/stdlib_experimental_stats.fypp | 57 ++++++++ src/stdlib_experimental_stats_moment.fypp | 157 ++++++++++++++++++++++ src/tests/stats/test_rawmoment.f90 | 143 ++++++++++++++++++-- 3 files changed, 349 insertions(+), 8 deletions(-) diff --git a/src/stdlib_experimental_stats.fypp b/src/stdlib_experimental_stats.fypp index e2892fd4b..4f3d7e6bb 100644 --- a/src/stdlib_experimental_stats.fypp +++ b/src/stdlib_experimental_stats.fypp @@ -1,5 +1,6 @@ #:include "common.fypp" #:set RANKS = range(1, MAXRANK + 1) +#:set REDRANKS = range(2, MAXRANK + 1) #:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES module stdlib_experimental_stats use stdlib_experimental_kinds, only: sp, dp, qp, & @@ -236,6 +237,20 @@ module stdlib_experimental_stats #:endfor #:endfor + #:for k1, t1 in RC_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_scalar",rank, t1, k1) + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + ${t1}$, intent(in) :: center + logical, intent(in), optional :: mask + ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ + end function ${RName}$ + #:endfor + #:endfor + #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1) @@ -250,6 +265,20 @@ module stdlib_experimental_stats #:endfor #:endfor + #:for k1, t1 in INT_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_scalar",rank, t1, k1, 'dp') + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + real(dp),intent(in) :: center + logical, intent(in), optional :: mask + real(dp) :: res${reduced_shape('x', rank, 'dim')}$ + end function ${RName}$ + #:endfor + #:endfor + #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1, 'dp') @@ -290,6 +319,20 @@ module stdlib_experimental_stats #:endfor #:endfor + #:for k1, t1 in RC_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_mask_scalar",rank, t1, k1) + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + ${t1}$, intent(in) :: center + logical, intent(in) :: mask${ranksuffix(rank)}$ + ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ + end function ${RName}$ + #:endfor + #:endfor + #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1) @@ -304,6 +347,20 @@ module stdlib_experimental_stats #:endfor #:endfor + #:for k1, t1 in INT_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_mask_scalar",rank, t1, k1, 'dp') + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + real(dp), intent(in) :: center + logical, intent(in) :: mask${ranksuffix(rank)}$ + real(dp) :: res${reduced_shape('x', rank, 'dim')}$ + end function ${RName}$ + #:endfor + #:endfor + #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1, 'dp') diff --git a/src/stdlib_experimental_stats_moment.fypp b/src/stdlib_experimental_stats_moment.fypp index b6264cd44..aa2f9fbe2 100644 --- a/src/stdlib_experimental_stats_moment.fypp +++ b/src/stdlib_experimental_stats_moment.fypp @@ -1,5 +1,6 @@ #:include "common.fypp" #:set RANKS = range(1, MAXRANK + 1) +#:set REDRANKS = range(2, MAXRANK + 1) #:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES submodule (stdlib_experimental_stats) stdlib_experimental_stats_moment @@ -70,6 +71,45 @@ contains #:endfor + #:for k1, t1 in RC_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_scalar",rank, t1, k1) + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + ${t1}$, intent(in) :: center + logical, intent(in), optional :: mask + ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ + + integer :: i + real(${k1}$) :: n + + if (.not.optval(mask, .true.)) then + res = ieee_value(1._${k1}$, ieee_quiet_nan) + return + end if + + n = size(x, dim) + + res = 0 + select case(dim) + #:for fi in range(1, rank+1) + case(${fi}$) + do i = 1, size(x, ${fi}$) + res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - center)**order + end do + #:endfor + case default + call error_stop("ERROR (moment): wrong dimension") + end select + res = res / n + + end function ${RName}$ + #:endfor + #:endfor + + #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1) @@ -118,6 +158,46 @@ contains #:endfor + #:for k1, t1 in INT_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_scalar",rank, t1, k1, 'dp') + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + real(dp),intent(in) :: center + logical, intent(in), optional :: mask + real(dp) :: res${reduced_shape('x', rank, 'dim')}$ + + integer :: i + real(dp) :: n + + if (.not.optval(mask, .true.)) then + res = ieee_value(1._dp, ieee_quiet_nan) + return + end if + + n = size(x, dim) + + res = 0 + select case(dim) + #:for fi in range(1, rank+1) + case(${fi}$) + do i = 1, size(x, ${fi}$) + res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -& + center)**order + end do + #:endfor + case default + call error_stop("ERROR (moment): wrong dimension") + end select + res = res / n + + end function ${RName}$ + #:endfor + #:endfor + + #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment",rank, t1, k1, 'dp') @@ -217,6 +297,47 @@ contains #:endfor + #:for k1, t1 in RC_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_mask_scalar",rank, t1, k1) + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + ${t1}$, intent(in) :: center + logical, intent(in) :: mask${ranksuffix(rank)}$ + ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ + + integer :: i + real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$ + + n = count(mask, dim) + + res = 0 + select case(dim) + #:for fi in range(1, rank+1) + case(${fi}$) + do i = 1, size(x, ${fi}$) + res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ -& + center)**order,& + #:if t1[0] == 'r' + 0._${k1}$,& + #:else + cmplx(0,0,kind=${k1}$),& + #:endif + mask${select_subarray(rank, [(fi, 'i')])}$) + end do + #:endfor + case default + call error_stop("ERROR (moment): wrong dimension") + end select + res = res / n + + end function ${RName}$ + #:endfor + #:endfor + + #:for k1, t1 in RC_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1) @@ -273,6 +394,42 @@ contains #:endfor + #:for k1, t1 in INT_KINDS_TYPES + #:for rank in REDRANKS + #:set RName = rname("moment_mask_scalar",rank, t1, k1, 'dp') + module function ${RName}$(x, order, dim, center, mask) result(res) + ${t1}$, intent(in) :: x${ranksuffix(rank)}$ + integer, intent(in) :: order + integer, intent(in) :: dim + real(dp), intent(in) :: center + logical, intent(in) :: mask${ranksuffix(rank)}$ + real(dp) :: res${reduced_shape('x', rank, 'dim')}$ + + integer :: i + real(dp) :: n${reduced_shape('x', rank, 'dim')}$ + + n = count(mask, dim) + + res = 0 + select case(dim) + #:for fi in range(1, rank+1) + case(${fi}$) + do i = 1, size(x, ${fi}$) + res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -& + center)**order,& + 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) + end do + #:endfor + case default + call error_stop("ERROR (moment): wrong dimension") + end select + res = res / n + + end function ${RName}$ + #:endfor + #:endfor + + #:for k1, t1 in INT_KINDS_TYPES #:for rank in RANKS #:set RName = rname("moment_mask",rank, t1, k1, 'dp') diff --git a/src/tests/stats/test_rawmoment.f90 b/src/tests/stats/test_rawmoment.f90 index 73d0317d6..645319fc8 100644 --- a/src/tests/stats/test_rawmoment.f90 +++ b/src/tests/stats/test_rawmoment.f90 @@ -72,6 +72,10 @@ subroutine test_sp(x1, x2) !2dim print*,' test_sp_2dim', order call assert( abs(moment(x2, order, center = 0.) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0.) -& + mean(x2, dim = 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0.) -& + mean(x2, dim = 2)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& mean(x2, dim = 1)) < sptol)) call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& @@ -87,6 +91,12 @@ subroutine test_sp(x1, x2) print*,' test_sp_2dim_mask_array', order call assert( abs(moment(x2, order, center = 0., mask = (x2 < 11)) -& mean(x2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0.,& + mask = (x2 < 11)) -& + mean(x2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0.,& + mask = (x2 < 11)) -& + mean(x2, 2, x2 < 11)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& mask = (x2 < 11)) -& mean(x2, 1, x2 < 11)) < sptol)) @@ -102,6 +112,12 @@ subroutine test_sp(x1, x2) print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0.) - mean(x3)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0.) -& + mean(x3, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2, center = 0.) -& + mean(x3, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3, center = 0.) -& + mean(x3, 3)) < sptol)) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3, 1)) < sptol)) call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& @@ -121,6 +137,15 @@ subroutine test_sp(x1, x2) print*,' test_sp_3dim_mask_array', order call assert( abs(moment(x3, order, center = 0., mask = (x3 < 11)) -& mean(x3, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0.,& + mask = (x3 < 45)) -& + mean(x3, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = 0.,& + mask = (x3 < 45)) -& + mean(x3, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = 0.,& + mask = (x3 < 45)) -& + mean(x3, 3, x3 < 45)) < sptol )) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& mask = (x3 < 45)) -& mean(x3, 1, x3 < 45)) < sptol )) @@ -152,6 +177,10 @@ subroutine test_sp(x1, x2) !2dim print*,' test_sp_2dim', order call assert( abs(moment(x2, order, center = 0.) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0.) -& + mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0.) - & + mean(x2**2, 2)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& mean(x2**2, 1)) < sptol)) call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) - & @@ -167,6 +196,12 @@ subroutine test_sp(x1, x2) print*,' test_sp_2dim_mask_array', order call assert( abs(moment(x2, order, center = 0., mask = (x2 < 11)) -& mean(x2**2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0.,& + mask = (x2 < 11)) -& + mean(x2**2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0.,& + mask = (x2 < 11)) -& + mean(x2**2, 2, x2 < 11)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& mask = (x2 < 11)) -& mean(x2**2, 1, x2 < 11)) < sptol)) @@ -177,6 +212,12 @@ subroutine test_sp(x1, x2) !3dim print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0.) - mean(x3**2)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0.) -& + mean(x3**2, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2, center = 0.) -& + mean(x3**2, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3, center = 0.) -& + mean(x3**2, 3)) < sptol)) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3**2, 1)) < sptol)) call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& @@ -196,6 +237,15 @@ subroutine test_sp(x1, x2) print*,' test_sp_3dim_mask_array', order call assert( abs(moment(x3, order, center = 0., mask = (x3 < 11)) -& mean(x3**2, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0.,& + mask = (x3 < 45)) -& + mean(x3**2, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = 0.,& + mask = (x3 < 45)) -& + mean(x3**2, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = 0.,& + mask = (x3 < 45)) -& + mean(x3**2, 3, x3 < 45)) < sptol )) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& mask = (x3 < 45)) -& mean(x3**2, 1, x3 < 45)) < sptol )) @@ -249,6 +299,10 @@ subroutine test_int32(x1, x2) !2dim print*,' test_sp_2dim', order call assert( abs(moment(x2, order, center = 0._dp) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0._dp) -& + mean(x2, dim = 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0._dp) -& + mean(x2, dim = 2)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& mean(x2, dim = 1)) < sptol)) call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& @@ -264,6 +318,12 @@ subroutine test_int32(x1, x2) print*,' test_sp_2dim_mask_array', order call assert( abs(moment(x2, order, center = 0._dp, mask = (x2 < 11)) -& mean(x2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0._dp,& + mask = (x2 < 11)) -& + mean(x2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0._dp,& + mask = (x2 < 11)) -& + mean(x2, 2, x2 < 11)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& mask = (x2 < 11)) -& mean(x2, 1, x2 < 11)) < sptol)) @@ -279,6 +339,12 @@ subroutine test_int32(x1, x2) print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0._dp) - mean(x3)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0._dp) -& + mean(x3, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2, center = 0._dp) -& + mean(x3, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3, center = 0._dp) -& + mean(x3, 3)) < sptol)) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3, 1)) < sptol)) call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& @@ -298,6 +364,15 @@ subroutine test_int32(x1, x2) print*,' test_sp_3dim_mask_array', order call assert( abs(moment(x3, order, center = 0._dp, mask = (x3 < 11)) -& mean(x3, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0._dp,& + mask = (x3 < 45)) -& + mean(x3, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = 0._dp,& + mask = (x3 < 45)) -& + mean(x3, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = 0._dp,& + mask = (x3 < 45)) -& + mean(x3, 3, x3 < 45)) < sptol )) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& mask = (x3 < 45)) -& mean(x3, 1, x3 < 45)) < sptol )) @@ -330,6 +405,10 @@ subroutine test_int32(x1, x2) !2dim print*,' test_sp_2dim', order call assert( abs(moment(x2, order, center = 0._dp) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0._dp) -& + mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0._dp) -& + mean(x2**2, 2)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& mean(x2**2, 1)) < sptol)) call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& @@ -337,6 +416,10 @@ subroutine test_int32(x1, x2) print*,' test_sp_2dim_mask', order call assert( ieee_is_nan(moment(x2, order, center = 0._dp, mask = .false.))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 1, center = 0._dp,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x2, order, dim = 2, center = 0._dp,& + mask = .false.)))) call assert( any(ieee_is_nan(moment(x2, order, dim = 1, center = zero2_1,& mask = .false.)))) call assert( any(ieee_is_nan(moment(x2, order, dim = 2, center = zero2_2,& @@ -345,6 +428,12 @@ subroutine test_int32(x1, x2) print*,' test_sp_2dim_mask_array', order call assert( abs(moment(x2, order, center = 0._dp, mask = (x2 < 11)) -& mean(x2**2, x2 < 11)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = 0._dp,& + mask = (x2 < 11)) -& + mean(x2**2, 1, x2 < 11)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = 0._dp,& + mask = (x2 < 11)) -& + mean(x2**2, 2, x2 < 11)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& mask = (x2 < 11)) -& mean(x2**2, 1, x2 < 11)) < sptol)) @@ -355,6 +444,12 @@ subroutine test_int32(x1, x2) !3dim print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0._dp) - mean(x3**2)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0._dp) -& + mean(x3**2, 1)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 2, center = 0._dp) -& + mean(x3**2, 2)) < sptol)) + call assert( all( abs( moment(x3, order, dim = 3, center = 0._dp) -& + mean(x3**2, 3)) < sptol)) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3**2, 1)) < sptol)) call assert( all( abs( moment(x3, order, dim = 2, center = zero3_2) -& @@ -364,6 +459,12 @@ subroutine test_int32(x1, x2) print*,' test_sp_3dim_mask', order call assert( ieee_is_nan(moment(x3, order, center = 0._dp, mask = .false.))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 1, center = 0._dp,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 2, center = 0._dp,& + mask = .false.)))) + call assert( any(ieee_is_nan(moment(x3, order, dim = 3, center = 0._dp,& + mask = .false.)))) call assert( any(ieee_is_nan(moment(x3, order, dim = 1, center = zero3_1,& mask = .false.)))) call assert( any(ieee_is_nan(moment(x3, order, dim = 2, center = zero3_2,& @@ -374,6 +475,15 @@ subroutine test_int32(x1, x2) print*,' test_sp_3dim_mask_array', order call assert( abs(moment(x3, order, center = 0._dp, mask = (x3 < 11)) -& mean(x3**2, x3 < 11)) < sptol) + call assert( all( abs( moment(x3, order, dim = 1, center = 0._dp,& + mask = (x3 < 45)) -& + mean(x3**2, 1, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 2, center = 0._dp,& + mask = (x3 < 45)) -& + mean(x3**2, 2, x3 < 45)) < sptol )) + call assert( all( abs( moment(x3, order, dim = 3, center = 0._dp,& + mask = (x3 < 45)) -& + mean(x3**2, 3, x3 < 45)) < sptol )) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1,& mask = (x3 < 45)) -& mean(x3**2, 1, x3 < 45)) < sptol )) @@ -392,19 +502,11 @@ subroutine test_csp(x1, x2) integer :: order complex(sp), allocatable :: x3(:, :, :) complex(sp), allocatable :: zero2_1(:), zero2_2(:) - complex(sp), allocatable :: zero3_1(:,:), zero3_2(:,:), zero3_3(:,:) allocate(zero2_1(size(x2, 2)), zero2_2(size(x2, 1))) zero2_1 = (0., 0.) zero2_2 = (0., 0.) - allocate(zero3_1(size(x3, 2), size(x3, 3))& - ,zero3_2(size(x3, 1), size(x3, 3))& - ,zero3_3(size(x3, 1), size(x3, 2))) - zero3_1 = (0., 0.) - zero3_2 = (0., 0.) - zero3_3 = (0., 0.) - order = 1 !1dim @@ -428,6 +530,10 @@ subroutine test_csp(x1, x2) !2dim print*,' test_sp_2dim', order call assert( abs(moment(x2, order, center = (0., 0.)) - mean(x2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = (0., 0.)) -& + mean(x2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = (0., 0.)) -& + mean(x2, 2)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& mean(x2, 1)) < sptol)) call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& @@ -436,6 +542,10 @@ subroutine test_csp(x1, x2) print*,' test_sp_2dim_mask', order call assert( ieee_is_nan(abs(moment(x2, order, center = (0., 0.),& mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, center = (0., 0.),& + mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, center = (0., 0.),& + mask = .false.))))) call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, center = zero2_1,& mask = .false.))))) call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, center = zero2_2,& @@ -444,6 +554,12 @@ subroutine test_csp(x1, x2) print*,' test_sp_2dim_mask_array', order call assert( abs(moment(x2, order, center = (0., 0.), mask = (aimag(x2) == 0)) -& mean(x2, aimag(x2) == 0)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = (0., 0.),& + mask = (aimag(x2) == 0)) -& + mean(x2, 1, aimag(x2) == 0)) < sptol)) + call assert( any(ieee_is_nan( abs( moment(x2, order,& + dim = 2, center = (0., 0.), mask = (aimag(x2) == 0)) -& + mean(x2, 2, aimag(x2) == 0))))) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& mask = (aimag(x2) == 0)) -& mean(x2, 1, aimag(x2) == 0)) < sptol)) @@ -475,6 +591,10 @@ subroutine test_csp(x1, x2) !2dim print*,' test_sp_2dim', order call assert( abs(moment(x2, order, center = (0., 0.)) - mean(x2**2)) < sptol) + call assert( all( abs( moment(x2, order, dim = 1, center = (0., 0.)) -& + mean(x2**2, 1)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 2, center = (0., 0.)) -& + mean(x2**2, 2)) < sptol)) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1) -& mean(x2**2, 1)) < sptol)) call assert( all( abs( moment(x2, order, dim = 2, center = zero2_2) -& @@ -483,6 +603,10 @@ subroutine test_csp(x1, x2) print*,' test_sp_2dim_mask', order call assert( ieee_is_nan(abs(moment(x2, order, center = (0., 0.),& mask = .false.)))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, center = (0., 0.),& + mask = .false.))))) + call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, center = (0., 0.),& + mask = .false.))))) call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 1, center = zero2_1,& mask = .false.))))) call assert( any(ieee_is_nan(abs(moment(x2, order, dim = 2, center = zero2_2,& @@ -494,6 +618,9 @@ subroutine test_csp(x1, x2) call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& mask = (aimag(x2)==0)) -& mean(x2**2, 1, aimag(x2)==0)) < sptol)) + call assert( all( abs( moment(x2, order, dim = 1, center = zero2_1,& + mask = (aimag(x2)==0)) -& + mean(x2**2, 1, aimag(x2)==0)) < sptol)) end subroutine end program From 95a77713cb109c1fcdc40874f8b4b6abbede28b4 Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Wed, 25 Mar 2020 13:05:43 +0100 Subject: [PATCH 5/8] mv_to_central_moment: simplification --- src/stdlib_experimental_stats_moment.fypp | 98 +++++------------------ 1 file changed, 20 insertions(+), 78 deletions(-) diff --git a/src/stdlib_experimental_stats_moment.fypp b/src/stdlib_experimental_stats_moment.fypp index aa2f9fbe2..1f8afb497 100644 --- a/src/stdlib_experimental_stats_moment.fypp +++ b/src/stdlib_experimental_stats_moment.fypp @@ -82,28 +82,16 @@ contains logical, intent(in), optional :: mask ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ - integer :: i - real(${k1}$) :: n - if (.not.optval(mask, .true.)) then res = ieee_value(1._${k1}$, ieee_quiet_nan) return end if - n = size(x, dim) - - res = 0 - select case(dim) - #:for fi in range(1, rank+1) - case(${fi}$) - do i = 1, size(x, ${fi}$) - res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - center)**order - end do - #:endfor - case default - call error_stop("ERROR (moment): wrong dimension") - end select - res = res / n + if (dim >= 1 .and. dim <= ${rank}$) then + res = sum((x - center)**order, dim) / size(x, dim) + else + call error_stop("ERROR (moment): wrong dimension") + end if end function ${RName}$ #:endfor @@ -169,29 +157,16 @@ contains logical, intent(in), optional :: mask real(dp) :: res${reduced_shape('x', rank, 'dim')}$ - integer :: i - real(dp) :: n - if (.not.optval(mask, .true.)) then res = ieee_value(1._dp, ieee_quiet_nan) return end if - n = size(x, dim) - - res = 0 - select case(dim) - #:for fi in range(1, rank+1) - case(${fi}$) - do i = 1, size(x, ${fi}$) - res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -& - center)**order - end do - #:endfor - case default - call error_stop("ERROR (moment): wrong dimension") - end select - res = res / n + if (dim >= 1 .and. dim <= ${rank}$) then + res = sum( (real(x, dp) - center)**order, dim) / size(x, dim) + else + call error_stop("ERROR (moment): wrong dimension") + end if end function ${RName}$ #:endfor @@ -308,30 +283,11 @@ contains logical, intent(in) :: mask${ranksuffix(rank)}$ ${t1}$ :: res${reduced_shape('x', rank, 'dim')}$ - integer :: i - real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$ - - n = count(mask, dim) - - res = 0 - select case(dim) - #:for fi in range(1, rank+1) - case(${fi}$) - do i = 1, size(x, ${fi}$) - res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ -& - center)**order,& - #:if t1[0] == 'r' - 0._${k1}$,& - #:else - cmplx(0,0,kind=${k1}$),& - #:endif - mask${select_subarray(rank, [(fi, 'i')])}$) - end do - #:endfor - case default - call error_stop("ERROR (moment): wrong dimension") - end select - res = res / n + if (dim >= 1 .and. dim <= ${rank}$) then + res = sum((x - center)**order, dim, mask) / count(mask, dim) + else + call error_stop("ERROR (moment): wrong dimension") + end if end function ${RName}$ #:endfor @@ -405,25 +361,11 @@ contains logical, intent(in) :: mask${ranksuffix(rank)}$ real(dp) :: res${reduced_shape('x', rank, 'dim')}$ - integer :: i - real(dp) :: n${reduced_shape('x', rank, 'dim')}$ - - n = count(mask, dim) - - res = 0 - select case(dim) - #:for fi in range(1, rank+1) - case(${fi}$) - do i = 1, size(x, ${fi}$) - res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -& - center)**order,& - 0._dp, mask${select_subarray(rank, [(fi, 'i')])}$) - end do - #:endfor - case default - call error_stop("ERROR (moment): wrong dimension") - end select - res = res / n + if (dim >= 1 .and. dim <= ${rank}$) then + res = sum(( real(x, dp) - center)**order, dim, mask) / count(mask, dim) + else + call error_stop("ERROR (moment): wrong dimension") + end if end function ${RName}$ #:endfor From aafbcc6430e4a1a6014bb9e7f9b3f42f3b9a9b84 Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Wed, 25 Mar 2020 13:09:38 +0100 Subject: [PATCH 6/8] mv_to_central_moment: modif spec --- src/stdlib_experimental_stats.md | 34 +++++++++++++++----------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/stdlib_experimental_stats.md b/src/stdlib_experimental_stats.md index 368bdba89..c041087a1 100644 --- a/src/stdlib_experimental_stats.md +++ b/src/stdlib_experimental_stats.md @@ -1,7 +1,7 @@ # Descriptive statistics * [`mean` - mean of array elements](#mean---mean-of-array-elements) -* [`moment` - raw and central moments of array elements](#moment---raw-and-central-moments-of-array-elements) +* [`moment` - central moments of array elements](#moment---central-moments-of-array-elements) * [`var` - variance of array elements](#var---variance-of-array-elements) ## `mean` - mean of array elements @@ -48,24 +48,24 @@ program demo_mean end program demo_mean ``` -## `moment` - raw and central moments of array elements +## `moment` - central moments of array elements ### Description -Returns the _k_-th order raw moment of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. +Returns the _k_-th order central moment of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. -If an array `center` is provided, the function returns the _k_-th order central moment of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. +If a scalar or an array `center` is provided, the function returns the _k_-th order moment about 'center', of all the elements of `array`, or of the elements of `array` along dimension `dim` if provided, and if the corresponding element in `mask` is `true`. -The _k_-th order raw moment is defined as : +The _k_-th order central moment is defined as : ``` - moment(array) = 1/n sum_i (array(i))^k + moment(array) = 1/n sum_i (array(i) - mean(array))^k ``` where n is the number of elements. -The _k_-th order central moment is defined as : +The _k_-th order moment about `center` is defined as : ``` moment(array) = 1/n sum_i (array(i) - center)^k @@ -85,7 +85,7 @@ The _k_-th order central moment is defined as : `dim`: Shall be a scalar of type `integer` with a value in the range from 1 to n, where n is the rank of `array`. -`center` (optional): Shall be a scalar of the same type of `array` if `array` is `real` or `complex`, or of type `real(dp)` if `array` is of type `integer`. If `dim` is provided, `center` shall be an array (with a shape similar to that of `array` with dimension `dim` dropped) of the same type of `array` if `array` is `real` or `complex`, or of type `real(dp)` if `array` is of type `integer`. +`center` (optional): Shall be a scalar of the same type of `result` if `dim` is not provided. If `dim` is provided, `center` shall be a scalar or an array (with a shape similar to that of `array` with dimension `dim` dropped) of the same type of `result`. `mask` (optional): Shall be of type `logical` and either by a scalar or an array of the same shape as `array`. @@ -94,9 +94,9 @@ The _k_-th order central moment is defined as : If `array` is of type `real` or `complex`, the result is of the same type as `array`. If `array` is of type `integer`, the result is of type `real(dp)`. -If `dim` is absent, a scalar with the _k_-th raw (or central if `center` is provided) moment of all elements in `array` is returned. Otherwise, an array of rank n-1, where n equals the rank of `array`, and a shape similar to that of `array` with dimension `dim` dropped is returned. +If `dim` is absent, a scalar with the _k_-th (central) moment of all elements in `array` is returned. Otherwise, an array of rank n-1, where n equals the rank of `array`, and a shape similar to that of `array` with dimension `dim` dropped is returned. -If `mask` is specified, the result is the _k_-th raw (or central if `center` is provided) moment of all elements of `array` corresponding to `true` elements of `mask`. If every element of `mask` is `false`, the result is IEEE `NaN`. +If `mask` is specified, the result is the _k_-th (central) moment of all elements of `array` corresponding to `true` elements of `mask`. If every element of `mask` is `false`, the result is IEEE `NaN`. ### Example @@ -106,14 +106,12 @@ program demo_moment implicit none real :: x(1:6) = [ 1., 2., 3., 4., 5., 6. ] real :: y(1:2, 1:3) = reshape([ 1., 2., 3., 4., 5., 6. ], [ 2, 3]) - print *, moment(x, 2, center = mean(x)) !returns 2.9167 - print *, moment( y, 2,& - center = mean(y)) !returns 2.9167 - print *, moment( y, 2, 1,& - center = mean(y, 1)) !returns [0.25, 0.25, 0.25] - print *, moment( y, 2, 1,& - center = mean(y, 1, y > 3.),& - mask = (y > 3.)) !returns [NaN, 0., 0.25] + print *, moment(x, 2) !returns 2.9167 + print *, moment( y, 2) !returns 2.9167 + print *, moment( y, 2, 1) !returns [0.25, 0.25, 0.25] + print *, moment( y, 2, 1, mask = (y > 3.)) !returns [NaN, 0., 0.25] + print *, moment(x, 2, center = 0.) !returns 15.1667 + print *, moment( y, 1, 1, center = 0.) !returns [1.5, 3.5, 5.5] end program demo_moment ``` From 212130414fb8b93c63f4bf9b9dbeb1df90bcf5d3 Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Wed, 25 Mar 2020 13:33:55 +0100 Subject: [PATCH 7/8] correction --- src/tests/stats/test_rawmoment.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/stats/test_rawmoment.f90 b/src/tests/stats/test_rawmoment.f90 index 645319fc8..429719a4c 100644 --- a/src/tests/stats/test_rawmoment.f90 +++ b/src/tests/stats/test_rawmoment.f90 @@ -112,11 +112,11 @@ subroutine test_sp(x1, x2) print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0.) - mean(x3)) < sptol) - call assert( all( abs( moment(x3, order, dim = 1, center = 0.) -& + call assert( all( abs( moment(x3, order, dim = 1, center = 0._sp) -& mean(x3, 1)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 2, center = 0.) -& + call assert( all( abs( moment(x3, order, dim = 2, center = 0._sp) -& mean(x3, 2)) < sptol)) - call assert( all( abs( moment(x3, order, dim = 3, center = 0.) -& + call assert( all( abs( moment(x3, order, dim = 3, center = 0._sp) -& mean(x3, 3)) < sptol)) call assert( all( abs( moment(x3, order, dim = 1, center = zero3_1) -& mean(x3, 1)) < sptol)) From 6f45a7c4b62139d00d2a0d7234ade80e00f6beda Mon Sep 17 00:00:00 2001 From: "Vandenplas, Jeremie" Date: Wed, 25 Mar 2020 15:47:44 +0100 Subject: [PATCH 8/8] raw_moment_dev: correction of test_rawmoment --- src/tests/stats/test_moment.f90 | 1 - src/tests/stats/test_rawmoment.f90 | 30 ++++++++++++++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/tests/stats/test_moment.f90 b/src/tests/stats/test_moment.f90 index 9faab8523..7decdf3e0 100644 --- a/src/tests/stats/test_moment.f90 +++ b/src/tests/stats/test_moment.f90 @@ -627,7 +627,6 @@ subroutine test_csp(x1, x2) complex(sp), intent(in) :: x1(:), x2(:, :) integer :: order - complex(sp), allocatable :: x3(:, :, :) order = 1 diff --git a/src/tests/stats/test_rawmoment.f90 b/src/tests/stats/test_rawmoment.f90 index 429719a4c..25cde46b9 100644 --- a/src/tests/stats/test_rawmoment.f90 +++ b/src/tests/stats/test_rawmoment.f90 @@ -45,13 +45,6 @@ subroutine test_sp(x1, x2) zero2_1 = 0 zero2_2 = 0 - allocate(zero3_1(size(x3, 2), size(x3, 3))& - ,zero3_2(size(x3, 1), size(x3, 3))& - ,zero3_3(size(x3, 1), size(x3, 2))) - zero3_1 = 0 - zero3_2 = 0 - zero3_3 = 0 - order = 1 !1dim @@ -110,6 +103,13 @@ subroutine test_sp(x1, x2) x3(:,:,2)=x2*2; x3(:,:,3)=x2*4; + allocate(zero3_1(size(x3, 2), size(x3, 3))& + ,zero3_2(size(x3, 1), size(x3, 3))& + ,zero3_3(size(x3, 1), size(x3, 2))) + zero3_1 = 0 + zero3_2 = 0 + zero3_3 = 0 + print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0.) - mean(x3)) < sptol) call assert( all( abs( moment(x3, order, dim = 1, center = 0._sp) -& @@ -270,14 +270,6 @@ subroutine test_int32(x1, x2) zero2_1 = 0 zero2_2 = 0 - allocate(zero3_1(size(x3, 2), size(x3, 3))& - ,zero3_2(size(x3, 1), size(x3, 3))& - ,zero3_3(size(x3, 1), size(x3, 2))) - zero3_1 = 0 - zero3_2 = 0 - zero3_3 = 0 - - order = 1 !1dim @@ -337,6 +329,13 @@ subroutine test_int32(x1, x2) x3(:,:,2)=x2*2; x3(:,:,3)=x2*4; + allocate(zero3_1(size(x3, 2), size(x3, 3))& + ,zero3_2(size(x3, 1), size(x3, 3))& + ,zero3_3(size(x3, 1), size(x3, 2))) + zero3_1 = 0 + zero3_2 = 0 + zero3_3 = 0 + print*,' test_sp_3dim', order call assert( abs(moment(x3, order, center = 0._dp) - mean(x3)) < sptol) call assert( all( abs( moment(x3, order, dim = 1, center = 0._dp) -& @@ -500,7 +499,6 @@ subroutine test_csp(x1, x2) complex(sp), intent(in) :: x1(:), x2(:, :) integer :: order - complex(sp), allocatable :: x3(:, :, :) complex(sp), allocatable :: zero2_1(:), zero2_2(:) allocate(zero2_1(size(x2, 2)), zero2_2(size(x2, 1)))