3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
29
30#ifdef DISTRIBUTE
32#endif
35
36 implicit none
37
38
39
40 integer :: ng, tile
41 integer :: IminS, ImaxS, JminS, JmaxS
42 integer :: Nlevels, Ntiles
43
44 real(r8) :: Avalue, bytefac, megabytefac, size1d, size2d
45 real(r8) :: sumAsize, sumBsize, sumDsize
46 real(r8) :: totalAsize, totalBsize, totalDsize
47
48 real(r8), parameter :: spv = 0.0_r8
49
50#ifdef DISTRIBUTE
51 real(r8), allocatable :: Bwrk(:), Dwrk(:)
52
53#endif
54 real(r8), allocatable :: Asize(:,:)
55 real(r8), allocatable :: Bsize(:,:)
56 real(r8), allocatable :: Dsize(:,:)
57 real(r8), allocatable :: IOsize(:,:)
58
59
60
61
62
63
64
66
67
68
69
71 IF (.not.allocated(asize)) THEN
72 allocate ( asize(0:ntiles,
ngrids) )
73 asize=spv
74 END IF
75 IF (.not.allocated(bsize)) THEN
76 allocate ( bsize(0:ntiles,
ngrids) )
77 bsize=spv
78 END IF
79 IF (.not.allocated(dsize)) THEN
80 allocate ( dsize(0:ntiles,
ngrids) )
81 dsize=spv
82 END IF
83 IF (.not.allocated(iosize)) THEN
84 allocate ( iosize(0:ntiles,
ngrids) )
85 iosize=spv
86 END IF
87#ifdef DISTRIBUTE
88 IF (.not.allocated(bwrk)) THEN
89 allocate ( bwrk(ntiles+1) )
90 END IF
91 IF (.not.allocated(dwrk)) THEN
92 allocate ( dwrk(ntiles+1) )
93 END IF
94#endif
95
96
97
98
99
100
101
102 bytefac=real(kind(bytefac),r8)
103 megabytefac=bytefac*1.0e-6_r8
104
105
106
107
108
121
122
123
124
125
128#ifdef NESTING
129 imins=
bounds(ng)%Istr(tile)-4
130 imaxs=
bounds(ng)%Iend(tile)+3
131 jmins=
bounds(ng)%Jstr(tile)-4
132 jmaxs=
bounds(ng)%Jend(tile)+3
133#else
134 imins=
bounds(ng)%Istr(tile)-3
135 imaxs=
bounds(ng)%Iend(tile)+3
136 jmins=
bounds(ng)%Jstr(tile)-3
137 jmaxs=
bounds(ng)%Jend(tile)+3
138#endif
139 size1d=real((imaxs-imins+1),r8)
140 size2d=real((imaxs-imins+1)*(jmaxs-jmins+1),r8)
141#ifdef SOLVE3D
142 asize(tile,ng)=megabytefac* &
143 & (4.0_r8*size1d*real(
n(ng)+1,r8)+ &
144 & 7.0_r8*size2d+ &
145 & 5.0_r8*size2d*real(
n(ng),r8)+ &
146 & 1.0_r8*size2d*real(
n(ng)*
nt(ng),r8))
147# if !(defined PARALLEL_IO && defined DISTRIBUTE)
148# ifdef INLINE_2DIO
149 nlevels=1
150# else
152# endif
153 iosize(tile,ng)=megabytefac*2.0_r8* &
154 & real(2+(
lm(ng)+2)*(
mm(ng)+2)*(nlevels),r8)
155# else
156 iosize(tile,ng)=megabytefac* &
157 & real(2+(
lm(ng)+2)*(
mm(ng)+2)*(
n(ng)+1),r8)
158# endif
159#else
160 asize(tile,ng)=megabytefac* &
161 & (38.0_r8*size2d)
162 iosize(tile,ng)=megabytefac* &
163 & real(2+(
lm(ng)+2)*(
mm(ng)+2),r8)
164#endif
165 END DO
166 END DO
167
168
169
170
171#ifdef DISTRIBUTE
172 bwrk=spv
173 dwrk=spv
181 bwrk=spv
182 dwrk=spv
183 END DO
184#else
187 dsize(0,ng)=megabytefac*
dmem(ng)
188 END DO
189#endif
190
191
192
194 WRITE (
stdout,
"(/,80('>'))")
195 totalasize=0.0_r8
196 totalbsize=0.0_r8
197 totaldsize=0.0_r8
199 sumasize=0.0_r8
200 sumbsize=0.0_r8
201 sumdsize=0.0_r8
202#ifdef SOLVE3D
205#else
208#endif
210 avalue=max(asize(tile,ng), bsize(tile,ng), iosize(tile,ng))
211 sumasize=sumasize+avalue
212 sumbsize=sumbsize+bsize(tile,ng)
213 sumdsize=sumdsize+dsize(tile,ng)
214 WRITE (
stdout,20) tile, dsize(tile,ng), avalue, &
215#ifdef DISTRIBUTE
216 & dsize(tile,ng)+avalue, bsize(tile,ng)
217#else
218 & dsize(tile,ng)+avalue
219#endif
220 END DO
221 totalasize=totalasize+sumasize
222 totalbsize=totalbsize+sumbsize
223 totaldsize=totaldsize+sumdsize
225 WRITE (
stdout,30)
' SUM', sumdsize, sumasize, &
226#ifdef DISTRIBUTE
227 & sumasize+sumdsize, sumbsize
228#else
229 & sumasize+sumdsize
230#endif
231 ELSE
232 WRITE (
stdout,30)
'TOTAL', sumdsize, sumasize, &
233#ifdef DISTRIBUTE
234 & sumasize+sumdsize, sumbsize
235#else
236 & sumasize+sumdsize
237#endif
238 END IF
239 END DO
241 WRITE (
stdout,30)
'TOTAL', totaldsize, totalasize, &
242#ifdef DISTRIBUTE
243 & totalasize+totaldsize, totalbsize
244#else
245 & totalasize+totaldsize
246#endif
247 END IF
248 WRITE (
stdout,
"(/,80('<'))")
249 END IF
250
251
252
253 IF (allocated(asize)) deallocate ( asize )
254 IF (allocated(bsize)) deallocate ( bsize )
255 IF (allocated(dsize)) deallocate ( dsize )
256 IF (allocated(iosize)) deallocate ( iosize )
257
258
259
260#ifdef SOLVE3D
261 10 FORMAT (/,' Dynamic and Automatic memory (MB) usage for Grid ', &
262 & i2.2,':',2x,i0,'x',i0,'x',i0,2x,'tiling: ',i0,'x',i0, &
263 & /,/,5x,'tile',10x,'Dynamic',8x,'Automatic', &
264 & 12x,'USAGE', &
265# ifdef DISTRIBUTE
266 & 6x,'MPI-Buffers', &
267# endif
268 & /)
269#else
270 10 FORMAT (/,' Dynamic and Automatic memory (MB) usage for Grid ', &
271 & i2.2,':',2x,i0,'x',i0,2x,'tiling: ',i0,'x',i0, &
272 & /,/,5x,'tile',10x,'Dynamic',8x,'Automatic', &
273 & 12x,'USAGE', &
274# ifdef DISTRIBUTE
275 & 6x,'MPI-Buffers', &
276# endif
277 & /)
278#endif
279 20 FORMAT (4x,i5,4(4x,f13.2))
280 30 FORMAT (/,4x,a,4(4x,f13.2))
281
282 RETURN
integer, dimension(:), allocatable n
type(t_bounds), dimension(:), allocatable bounds
real(r8), dimension(:), allocatable dmem
integer, dimension(:), allocatable lm
real(r8), dimension(:), allocatable bmemmax
integer, dimension(:), allocatable ntilei
integer, dimension(:), allocatable nt
integer, dimension(:), allocatable mm
integer, dimension(:), allocatable ntilej