Skip to content

Commit 01e897c

Browse files
committed
variance_dev:suggestions by @aradi
1 parent 2a0182a commit 01e897c

File tree

2 files changed

+27
-31
lines changed

2 files changed

+27
-31
lines changed

src/common.fypp

+19-23
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ ${prefix + joinstr.join([line.strip() for line in txt.split("\n")]) + suffix}$
9797
#:endif
9898
#:enddef
9999

100+
100101
#! Generates a routine name from a generic name, rank, type and kind
101102
#!
102103
#! Args:
@@ -113,33 +114,28 @@ ${prefix + joinstr.join([line.strip() for line in txt.split("\n")]) + suffix}$
113114
$:"{0}_{1}_{2}{3}_{2}{3}".format(gname, rank, type[0], kind) if suffix == '' else "{0}_{1}_{2}{3}_{4}".format(gname, rank, type[0], kind, suffix)
114115
#:enddef
115116

116-
#! Generates Fortran expressions.
117+
118+
#! Generates an array rank suffix for subarrays reducing the dimension
117119
#!
118120
#! Args:
119-
#! varname (str): Name of the variable to be used as origin
120-
#! varname1 (str): Name of the variable to be used instead of varname
121-
#! origrank (int): Rank of the original variable
122-
#! dim (int): Index of the used expression varname1
121+
#! rank (int): Rank of the original variable
122+
#! selectors (array): Dimension and name of the variable(s)
123123
#!
124124
#! Returns:
125-
#! Shape expression enclosed in braces, except for the index dim.
126-
#!
127-
#! E.g., (:, :, :, i, :, :)
128-
#!
129-
130-
#:def rankindice(varname, varname1, origrank, dim)
131-
#:assert origrank > 0
132-
#:if origrank > 0
133-
#:call join_lines(joinstr=", ", prefix="(", suffix=")")
134-
#:for i in range(1, origrank+1)
135-
#:if i == dim
136-
${varname1}$
137-
#:else
138-
${varname}$
139-
#:endif
140-
#:endfor
141-
#:endcall
142-
#:endif
125+
#! Array rank suffix string enclosed in braces
126+
#!
127+
#! E.g.,
128+
#! select_subarray(5 , [(4, 'i'), (5, 'j')])}$
129+
#! -> (:, :, :, i, j)
130+
#!
131+
#:def select_subarray(rank, selectors)
132+
#:assert rank > 0
133+
#:set seldict = dict(selectors)
134+
#:call join_lines(joinstr=", ", prefix="(", suffix=")")
135+
#:for i in range(1, rank + 1)
136+
$:seldict.get(i, ":")
137+
#:endfor
138+
#:endcall
143139
#:enddef
144140

145141
#:endmute

src/stdlib_experimental_stats_var.fypp

+8-8
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ contains
9191
mean = sum(x, dim) / n
9292
do i = 1, size(x, dim)
9393
#:if t1[0] == 'r'
94-
res = res + (x${rankindice(':', 'i', rank, fi )}$ - mean)**2
94+
res = res + (x${select_subarray(rank, [(fi, 'i')])}$ - mean)**2
9595
#:else
96-
res = res + abs(x${rankindice(':', 'i', rank, fi )}$ - mean)**2
96+
res = res + abs(x${select_subarray(rank, [(fi, 'i')])}$ - mean)**2
9797
#:endif
9898
end do
9999
#:endfor
@@ -132,7 +132,7 @@ contains
132132
n = real(size(x, dim), dp)
133133
mean = sum(real(x, dp), dim) / n
134134
do i = 1, size(x, dim)
135-
res = res + (real(x${rankindice(':', 'i', rank, fi )}$, dp) - mean)**2
135+
res = res + (real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean)**2
136136
end do
137137
#:endfor
138138
case default
@@ -211,12 +211,12 @@ contains
211211
mean = sum(x, dim, mask) / n
212212
do i = 1, size(x, dim)
213213
#:if t1[0] == 'r'
214-
res = res + merge( (x${rankindice(':', 'i', rank, fi )}$ - mean)**2,&
214+
res = res + merge( (x${select_subarray(rank, [(fi, 'i')])}$ - mean)**2,&
215215
#:else
216-
res = res + merge( abs(x${rankindice(':', 'i', rank, fi )}$ - mean)**2,&
216+
res = res + merge( abs(x${select_subarray(rank, [(fi, 'i')])}$ - mean)**2,&
217217
#:endif
218218
0._${k1}$,&
219-
mask${rankindice(':', 'i', rank, fi)}$)
219+
mask${select_subarray(rank, [(fi, 'i')])}$)
220220
end do
221221
#:endfor
222222
case default
@@ -249,8 +249,8 @@ contains
249249
n = real(count(mask, dim), dp)
250250
mean = sum(real(x, dp), dim, mask) / n
251251
do i = 1, size(x, dim)
252-
res = res + merge((real(x${rankindice(':', 'i', rank, fi )}$, dp) - mean)**2,&
253-
0._dp, mask${rankindice(':', 'i', rank, fi)}$)
252+
res = res + merge((real(x${select_subarray(rank, [(fi, 'i')])}$, dp) - mean)**2,&
253+
0._dp, mask${select_subarray(rank, [(fi, 'i')])}$)
254254
end do
255255
#:endfor
256256
case default

0 commit comments

Comments
 (0)