Skip to content

Commit 27fe421

Browse files
committed
Split stdlib_stats_moment again to separate the masked procedures
- with default max rank and two ninja jobs ~7 GB peak memory usage
1 parent 02a0f01 commit 27fe421

File tree

4 files changed

+119
-103
lines changed

4 files changed

+119
-103
lines changed

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ set(fppFiles
1515
stdlib_stats_mean.fypp
1616
stdlib_stats_moment.fypp
1717
stdlib_stats_moment_all.fypp
18+
stdlib_stats_moment_mask.fypp
1819
stdlib_stats_moment_scalar.fypp
1920
stdlib_stats_var.fypp
2021
stdlib_quadrature.fypp

src/Makefile.manual

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ SRC = f18estop.f90 \
1616
stdlib_stats_mean.f90 \
1717
stdlib_stats_moment.f90 \
1818
stdlib_stats_moment_all.f90 \
19+
stdlib_stats_moment_mask.f90 \
1920
stdlib_stats_moment_scalar.f90 \
2021
stdlib_stats_var.f90
2122

@@ -82,5 +83,6 @@ stdlib_stats.f90: stdlib_stats.fypp
8283
stdlib_stats_mean.f90: stdlib_stats_mean.fypp
8384
stdlib_stats_moment.f90: stdlib_stats_moment.fypp
8485
stdlib_stats_moment_all.f90: stdlib_stats_moment_all.fypp
86+
stdlib_stats_moment_mask.f90: stdlib_stats_moment_mask.fypp
8587
stdlib_stats_moment_scalar.f90: stdlib_stats_moment_scalar.fypp
8688
stdlib_stats_var.f90: stdlib_stats_var.fypp

src/stdlib_stats_moment.fypp

Lines changed: 0 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -107,107 +107,4 @@ contains
107107
#:endfor
108108
#:endfor
109109

110-
111-
#:for k1, t1 in RC_KINDS_TYPES
112-
#:for rank in RANKS
113-
#:set RName = rname("moment_mask",rank, t1, k1)
114-
module function ${RName}$(x, order, dim, center, mask) result(res)
115-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
116-
integer, intent(in) :: order
117-
integer, intent(in) :: dim
118-
${t1}$, intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$
119-
logical, intent(in) :: mask${ranksuffix(rank)}$
120-
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
121-
122-
integer :: i
123-
real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$
124-
${t1}$, allocatable :: mean_${ranksuffix(rank-1)}$
125-
126-
n = real(count(mask, dim), ${k1}$)
127-
128-
res = 0
129-
select case(dim)
130-
#:for fi in range(1, rank+1)
131-
case(${fi}$)
132-
if (present(center)) then
133-
do i = 1, size(x, ${fi}$)
134-
res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ -&
135-
center)**order,&
136-
#:if t1[0] == 'r'
137-
0._${k1}$,&
138-
#:else
139-
cmplx(0,0,kind=${k1}$),&
140-
#:endif
141-
mask${select_subarray(rank, [(fi, 'i')])}$)
142-
end do
143-
else
144-
allocate(mean_, source = mean(x, ${fi}$, mask))
145-
do i = 1, size(x, ${fi}$)
146-
res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - mean_)**order,&
147-
#:if t1[0] == 'r'
148-
0._${k1}$,&
149-
#:else
150-
cmplx(0,0,kind=${k1}$),&
151-
#:endif
152-
mask${select_subarray(rank, [(fi, 'i')])}$)
153-
end do
154-
deallocate(mean_)
155-
end if
156-
#:endfor
157-
case default
158-
call error_stop("ERROR (moment): wrong dimension")
159-
end select
160-
res = res / n
161-
162-
end function ${RName}$
163-
#:endfor
164-
#:endfor
165-
166-
167-
#:for k1, t1 in INT_KINDS_TYPES
168-
#:for rank in RANKS
169-
#:set RName = rname("moment_mask",rank, t1, k1, 'dp')
170-
module function ${RName}$(x, order, dim, center, mask) result(res)
171-
${t1}$, intent(in) :: x${ranksuffix(rank)}$
172-
integer, intent(in) :: order
173-
integer, intent(in) :: dim
174-
real(dp), intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$
175-
logical, intent(in) :: mask${ranksuffix(rank)}$
176-
real(dp) :: res${reduced_shape('x', rank, 'dim')}$
177-
178-
integer :: i
179-
real(dp) :: n${reduced_shape('x', rank, 'dim')}$
180-
real(dp), allocatable :: mean_${ranksuffix(rank-1)}$
181-
182-
n = real(count(mask, dim), dp)
183-
184-
res = 0
185-
select case(dim)
186-
#:for fi in range(1, rank+1)
187-
case(${fi}$)
188-
if (present(center)) then
189-
do i = 1, size(x, ${fi}$)
190-
res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -&
191-
center)**order,&
192-
0._dp, mask${select_subarray(rank, [(fi, 'i')])}$)
193-
end do
194-
else
195-
allocate(mean_, source = mean(x, ${fi}$, mask))
196-
do i = 1, size(x, ${fi}$)
197-
res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean_)&
198-
**order,&
199-
0._dp, mask${select_subarray(rank, [(fi, 'i')])}$)
200-
end do
201-
deallocate(mean_)
202-
end if
203-
#:endfor
204-
case default
205-
call error_stop("ERROR (moment): wrong dimension")
206-
end select
207-
res = res / n
208-
209-
end function ${RName}$
210-
#:endfor
211-
#:endfor
212-
213110
end submodule

src/stdlib_stats_moment_mask.fypp

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#:include "common.fypp"
2+
#:set RANKS = range(1, MAXRANK + 1)
3+
#:set REDRANKS = range(2, MAXRANK + 1)
4+
#:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
5+
submodule (stdlib_stats) stdlib_stats_moment_mask
6+
7+
use, intrinsic:: ieee_arithmetic, only: ieee_value, ieee_quiet_nan
8+
use stdlib_error, only: error_stop
9+
use stdlib_optval, only: optval
10+
implicit none
11+
12+
contains
13+
14+
#:for k1, t1 in RC_KINDS_TYPES
15+
#:for rank in RANKS
16+
#:set RName = rname("moment_mask",rank, t1, k1)
17+
module function ${RName}$(x, order, dim, center, mask) result(res)
18+
${t1}$, intent(in) :: x${ranksuffix(rank)}$
19+
integer, intent(in) :: order
20+
integer, intent(in) :: dim
21+
${t1}$, intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$
22+
logical, intent(in) :: mask${ranksuffix(rank)}$
23+
${t1}$ :: res${reduced_shape('x', rank, 'dim')}$
24+
25+
integer :: i
26+
real(${k1}$) :: n${reduced_shape('x', rank, 'dim')}$
27+
${t1}$, allocatable :: mean_${ranksuffix(rank-1)}$
28+
29+
n = real(count(mask, dim), ${k1}$)
30+
31+
res = 0
32+
select case(dim)
33+
#:for fi in range(1, rank+1)
34+
case(${fi}$)
35+
if (present(center)) then
36+
do i = 1, size(x, ${fi}$)
37+
res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ -&
38+
center)**order,&
39+
#:if t1[0] == 'r'
40+
0._${k1}$,&
41+
#:else
42+
cmplx(0,0,kind=${k1}$),&
43+
#:endif
44+
mask${select_subarray(rank, [(fi, 'i')])}$)
45+
end do
46+
else
47+
allocate(mean_, source = mean(x, ${fi}$, mask))
48+
do i = 1, size(x, ${fi}$)
49+
res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - mean_)**order,&
50+
#:if t1[0] == 'r'
51+
0._${k1}$,&
52+
#:else
53+
cmplx(0,0,kind=${k1}$),&
54+
#:endif
55+
mask${select_subarray(rank, [(fi, 'i')])}$)
56+
end do
57+
deallocate(mean_)
58+
end if
59+
#:endfor
60+
case default
61+
call error_stop("ERROR (moment): wrong dimension")
62+
end select
63+
res = res / n
64+
65+
end function ${RName}$
66+
#:endfor
67+
#:endfor
68+
69+
70+
#:for k1, t1 in INT_KINDS_TYPES
71+
#:for rank in RANKS
72+
#:set RName = rname("moment_mask",rank, t1, k1, 'dp')
73+
module function ${RName}$(x, order, dim, center, mask) result(res)
74+
${t1}$, intent(in) :: x${ranksuffix(rank)}$
75+
integer, intent(in) :: order
76+
integer, intent(in) :: dim
77+
real(dp), intent(in), optional :: center${reduced_shape('x', rank, 'dim')}$
78+
logical, intent(in) :: mask${ranksuffix(rank)}$
79+
real(dp) :: res${reduced_shape('x', rank, 'dim')}$
80+
81+
integer :: i
82+
real(dp) :: n${reduced_shape('x', rank, 'dim')}$
83+
real(dp), allocatable :: mean_${ranksuffix(rank-1)}$
84+
85+
n = real(count(mask, dim), dp)
86+
87+
res = 0
88+
select case(dim)
89+
#:for fi in range(1, rank+1)
90+
case(${fi}$)
91+
if (present(center)) then
92+
do i = 1, size(x, ${fi}$)
93+
res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) -&
94+
center)**order,&
95+
0._dp, mask${select_subarray(rank, [(fi, 'i')])}$)
96+
end do
97+
else
98+
allocate(mean_, source = mean(x, ${fi}$, mask))
99+
do i = 1, size(x, ${fi}$)
100+
res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean_)&
101+
**order,&
102+
0._dp, mask${select_subarray(rank, [(fi, 'i')])}$)
103+
end do
104+
deallocate(mean_)
105+
end if
106+
#:endfor
107+
case default
108+
call error_stop("ERROR (moment): wrong dimension")
109+
end select
110+
res = res / n
111+
112+
end function ${RName}$
113+
#:endfor
114+
#:endfor
115+
116+
end submodule

0 commit comments

Comments
 (0)