|
2 | 2 | #:set R_KINDS_TYPES = list(zip(REAL_KINDS, REAL_TYPES, REAL_SUFFIX))
|
3 | 3 | #:set C_KINDS_TYPES = list(zip(CMPLX_KINDS, CMPLX_TYPES, CMPLX_SUFFIX))
|
4 | 4 | #:set RC_KINDS_TYPES = R_KINDS_TYPES + C_KINDS_TYPES
|
| 5 | +#:set RANKS = range(1, MAXRANK + 1) |
5 | 6 |
|
6 | 7 | #:def cnjg(type,expression)
|
7 | 8 | #:if 'complex' in type
|
@@ -66,6 +67,78 @@ pure module function fsum_1d_${rs}$_mask(a,mask) result(s)
|
66 | 67 | s = s + abatch(i)+abatch(chunk/2+i)
|
67 | 68 | end do
|
68 | 69 | end function
|
| 70 | + |
| 71 | +#:for rank in RANKS |
| 72 | +pure module function fsum_${rank}$d_${rs}$( x , mask ) result( s ) |
| 73 | + ${rt}$, intent(in) :: x${ranksuffix(rank)}$ |
| 74 | + logical, intent(in), optional :: mask${ranksuffix(rank)}$ |
| 75 | + ${rt}$ :: s |
| 76 | + if(.not.present(mask)) then |
| 77 | + s = sum_recast(x,size(x)) |
| 78 | + else |
| 79 | + s = sum_recast_mask(x,mask,size(x)) |
| 80 | + end if |
| 81 | +contains |
| 82 | + pure ${rt}$ function sum_recast(b,n) |
| 83 | + integer, intent(in) :: n |
| 84 | + ${rt}$, intent(in) :: b(n) |
| 85 | + sum_recast = fsum(b) |
| 86 | + end function |
| 87 | + pure ${rt}$ function sum_recast_mask(b,m,n) |
| 88 | + integer, intent(in) :: n |
| 89 | + ${rt}$, intent(in) :: b(n) |
| 90 | + logical, intent(in) :: m(n) |
| 91 | + sum_recast_mask = fsum(b,m) |
| 92 | + end function |
| 93 | +end function |
| 94 | + |
| 95 | +pure module function fsum_${rank}$d_dim_${rs}$( x , dim, mask ) result( s ) |
| 96 | + ${rt}$, intent(in) :: x${ranksuffix(rank)}$ |
| 97 | + integer, intent(in):: dim |
| 98 | + logical, intent(in), optional :: mask${ranksuffix(rank)}$ |
| 99 | + ${rt}$ :: s${reduced_shape('x', rank, 'dim')}$ |
| 100 | + integer :: j |
| 101 | + |
| 102 | + if(.not.present(mask)) then |
| 103 | + if(dim<${rank}$)then |
| 104 | + do j = 1, size(x,dim=${rank}$) |
| 105 | + #:if rank == 2 |
| 106 | + s${select_subarray(rank-1, [(rank-1, 'j')])}$ = fsum( x${select_subarray(rank, [(rank, 'j')])}$ ) |
| 107 | + #:else |
| 108 | + s${select_subarray(rank-1, [(rank-1, 'j')])}$ = fsum( x${select_subarray(rank, [(rank, 'j')])}$, dim=dim ) |
| 109 | + #:endif |
| 110 | + end do |
| 111 | + else |
| 112 | + do j = 1, size(x,dim=1) |
| 113 | + #:if rank == 2 |
| 114 | + s${select_subarray(rank-1, [(1, 'j')])}$ = fsum( x${select_subarray(rank, [(1, 'j')])}$ ) |
| 115 | + #:else |
| 116 | + s${select_subarray(rank-1, [(1, 'j')])}$ = fsum( x${select_subarray(rank, [(1, 'j')])}$, dim=${rank-1}$ ) |
| 117 | + #:endif |
| 118 | + end do |
| 119 | + end if |
| 120 | + else |
| 121 | + if(dim<${rank}$)then |
| 122 | + do j = 1, size(x,dim=${rank}$) |
| 123 | + #:if rank == 2 |
| 124 | + s${select_subarray(rank-1, [(rank-1, 'j')])}$ = fsum( x${select_subarray(rank, [(rank, 'j')])}$, mask=mask${select_subarray(rank, [(rank, 'j')])}$ ) |
| 125 | + #:else |
| 126 | + s${select_subarray(rank-1, [(rank-1, 'j')])}$ = fsum( x${select_subarray(rank, [(rank, 'j')])}$, dim=dim, mask=mask${select_subarray(rank, [(rank, 'j')])}$ ) |
| 127 | + #:endif |
| 128 | + end do |
| 129 | + else |
| 130 | + do j = 1, size(x,dim=1) |
| 131 | + #:if rank == 2 |
| 132 | + s${select_subarray(rank-1, [(1, 'j')])}$ = fsum( x${select_subarray(rank, [(1, 'j')])}$, mask=mask${select_subarray(rank, [(1, 'j')])}$ ) |
| 133 | + #:else |
| 134 | + s${select_subarray(rank-1, [(1, 'j')])}$ = fsum( x${select_subarray(rank, [(1, 'j')])}$, dim=${rank-1}$, mask=mask${select_subarray(rank, [(1, 'j')])}$ ) |
| 135 | + #:endif |
| 136 | + end do |
| 137 | + end if |
| 138 | + end if |
| 139 | + |
| 140 | +end function |
| 141 | +#:endfor |
69 | 142 | #:endfor
|
70 | 143 |
|
71 | 144 | #:for rk, rt, rs in RC_KINDS_TYPES
|
|
0 commit comments