CTBTO FLEXPART WO4 (2015-10-15)
 All Classes Files Functions Variables
fluxoutput.f90
Go to the documentation of this file.
1 !**********************************************************************
2 ! Copyright 1998,1999,2000,2001,2002,2005,2007,2008,2009,2010 *
3 ! Andreas Stohl, Petra Seibert, A. Frank, Gerhard Wotawa, *
4 ! Caroline Forster, Sabine Eckhardt, John Burkhart, Harald Sodemann *
5 ! *
6 ! This file is part of FLEXPART. *
7 ! *
8 ! FLEXPART is free software: you can redistribute it and/or modify *
9 ! it under the terms of the GNU General Public License as published by*
10 ! the Free Software Foundation, either version 3 of the License, or *
11 ! (at your option) any later version. *
12 ! *
13 ! FLEXPART is distributed in the hope that it will be useful, *
14 ! but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 ! GNU General Public License for more details. *
17 ! *
18 ! You should have received a copy of the GNU General Public License *
19 ! along with FLEXPART. If not, see <http://www.gnu.org/licenses/>. *
20 !**********************************************************************
21 
22 subroutine fluxoutput(itime)
23  ! i
24  !*****************************************************************************
25  ! *
26  ! Output of the gridded fluxes. *
27  ! Eastward, westward, northward, southward, upward and downward gross *
28  ! fluxes are written to output file in either sparse matrix or grid dump *
29  ! format, whichever is more efficient. *
30  ! *
31  ! Author: A. Stohl *
32  ! *
33  ! 04 April 2000 *
34  ! *
35  !*****************************************************************************
36  ! *
37  ! Variables: *
38  ! ncellse number of cells with non-zero values for eastward fluxes *
39  ! sparsee .true. if in sparse matrix format, else .false. *
40  ! *
41  !*****************************************************************************
42 
43  use flux_mod
44  use outg_mod
45  use par_mod
46  use com_mod
47 
48  implicit none
49 
50  real(kind=dp) :: jul
51  integer :: itime,ix,jy,kz,k,nage,jjjjmmdd,ihmmss,kp,i
52  integer :: ncellse(maxspec,maxageclass),ncellsw(maxspec,maxageclass)
53  integer :: ncellss(maxspec,maxageclass),ncellsn(maxspec,maxageclass)
54  integer :: ncellsu(maxspec,maxageclass),ncellsd(maxspec,maxageclass)
55  logical :: sparsee(maxspec,maxageclass),sparsew(maxspec,maxageclass)
56  logical :: sparses(maxspec,maxageclass),sparsen(maxspec,maxageclass)
57  logical :: sparseu(maxspec,maxageclass),sparsed(maxspec,maxageclass)
58  character :: adate*8,atime*6
59 
60 
61  ! Determine current calendar date, needed for the file name
62  !**********************************************************
63 
64  jul=bdate+real(itime,kind=dp)/86400._dp
65  call caldate(jul,jjjjmmdd,ihmmss)
66  write(adate,'(i8.8)') jjjjmmdd
67  write(atime,'(i6.6)') ihmmss
68 
69 
70  open(unitflux,file=path(2)(1:length(2))//'grid_flux_'//adate// &
71  atime,form='unformatted')
72 
73  !**************************************************************
74  ! Check, whether output of full grid or sparse matrix format is
75  ! more efficient in terms of storage space. This is checked for
76  ! every species and for every age class
77  !**************************************************************
78 
79  do k=1,nspec
80  do nage=1,nageclass
81  ncellse(k,nage)=0
82  ncellsw(k,nage)=0
83  ncellsn(k,nage)=0
84  ncellss(k,nage)=0
85  ncellsu(k,nage)=0
86  ncellsd(k,nage)=0
87  end do
88  end do
89 
90  do k=1,nspec
91  do kp=1,maxpointspec_act
92  do nage=1,nageclass
93  do jy=0,numygrid-1
94  do ix=0,numxgrid-1
95  do kz=1,numzgrid
96  if (flux(2,ix,jy,kz,k,kp,nage).gt.0) ncellse(k,nage)= &
97  ncellse(k,nage)+1
98  if (flux(1,ix,jy,kz,k,kp,nage).gt.0) ncellsw(k,nage)= &
99  ncellsw(k,nage)+1
100  if (flux(4,ix,jy,kz,k,kp,nage).gt.0) ncellsn(k,nage)= &
101  ncellsn(k,nage)+1
102  if (flux(3,ix,jy,kz,k,kp,nage).gt.0) ncellss(k,nage)= &
103  ncellss(k,nage)+1
104  if (flux(5,ix,jy,kz,k,kp,nage).gt.0) ncellsu(k,nage)= &
105  ncellsu(k,nage)+1
106  if (flux(6,ix,jy,kz,k,kp,nage).gt.0) ncellsd(k,nage)= &
107  ncellsd(k,nage)+1
108  end do
109  end do
110  end do
111  end do
112  end do
113  end do
114 
115  ! Output in sparse matrix format more efficient, if less than
116  ! 2/5 of all cells contains concentrations>0
117  !************************************************************
118 
119  do k=1,nspec
120  do nage=1,nageclass
121  if (4*ncellse(k,nage).lt.numxgrid*numygrid*numzgrid) then
122  sparsee(k,nage)=.true.
123  else
124  sparsee(k,nage)=.false.
125  endif
126  if (4*ncellsw(k,nage).lt.numxgrid*numygrid*numzgrid) then
127  sparsew(k,nage)=.true.
128  else
129  sparsew(k,nage)=.false.
130  endif
131  if (4*ncellsn(k,nage).lt.numxgrid*numygrid*numzgrid) then
132  sparsen(k,nage)=.true.
133  else
134  sparsen(k,nage)=.false.
135  endif
136  if (4*ncellss(k,nage).lt.numxgrid*numygrid*numzgrid) then
137  sparses(k,nage)=.true.
138  else
139  sparses(k,nage)=.false.
140  endif
141  if (4*ncellsu(k,nage).lt.numxgrid*numygrid*numzgrid) then
142  sparseu(k,nage)=.true.
143  else
144  sparseu(k,nage)=.false.
145  endif
146  if (4*ncellsd(k,nage).lt.numxgrid*numygrid*numzgrid) then
147  sparsed(k,nage)=.true.
148  else
149  sparsed(k,nage)=.false.
150  endif
151  end do
152  end do
153 
154 
155 
156  ! Flux output: divide by area and time to get flux in ng/m2/s
157  !************************************************************
158 
159  write(unitflux) itime
160  do k=1,nspec
161  do kp=1,maxpointspec_act
162  do nage=1,nageclass
163 
164  if (sparsee(k,nage)) then
165  write(unitflux) 1
166  do kz=1,numzgrid
167  do jy=0,numygrid-1
168  do ix=0,numxgrid-1
169  if (flux(2,ix,jy,kz,k,kp,nage).gt.0.) write(unitflux) &
170  ix+jy*numxgrid+kz*numxgrid*numygrid,1.e12* &
171  flux(2,ix,jy,kz,k,kp,nage)/areaeast(ix,jy,kz)/outstep
172  end do
173  end do
174  end do
175  write(unitflux) -999,999.
176  else
177  write(unitflux) 2
178  do kz=1,numzgrid
179  do ix=0,numxgrid-1
180  write(unitflux) (1.e12*flux(2,ix,jy,kz,k,kp,nage)/ &
181  areaeast(ix,jy,kz)/outstep,jy=0,numygrid-1)
182  end do
183  end do
184  endif
185 
186  if (sparsew(k,nage)) then
187  write(unitflux) 1
188  do kz=1,numzgrid
189  do jy=0,numygrid-1
190  do ix=0,numxgrid-1
191  if (flux(1,ix,jy,kz,k,kp,nage).gt.0.) write(unitflux) &
192  ix+jy*numxgrid+kz*numxgrid*numygrid,1.e12* &
193  flux(1,ix,jy,kz,k,kp,nage)/areaeast(ix,jy,kz)/outstep
194  end do
195  end do
196  end do
197  write(unitflux) -999,999.
198  else
199  write(unitflux) 2
200  do kz=1,numzgrid
201  do ix=0,numxgrid-1
202  write(unitflux) (1.e12*flux(1,ix,jy,kz,k,kp,nage)/ &
203  areaeast(ix,jy,kz)/outstep,jy=0,numygrid-1)
204  end do
205  end do
206  endif
207 
208  if (sparses(k,nage)) then
209  write(unitflux) 1
210  do kz=1,numzgrid
211  do jy=0,numygrid-1
212  do ix=0,numxgrid-1
213  if (flux(3,ix,jy,kz,k,kp,nage).gt.0.) write(unitflux) &
214  ix+jy*numxgrid+kz*numxgrid*numygrid,1.e12* &
215  flux(3,ix,jy,kz,k,kp,nage)/areanorth(ix,jy,kz)/outstep
216  end do
217  end do
218  end do
219  write(unitflux) -999,999.
220  else
221  write(unitflux) 2
222  do kz=1,numzgrid
223  do ix=0,numxgrid-1
224  write(unitflux) (1.e12*flux(3,ix,jy,kz,k,kp,nage)/ &
225  areanorth(ix,jy,kz)/outstep,jy=0,numygrid-1)
226  end do
227  end do
228  endif
229 
230  if (sparsen(k,nage)) then
231  write(unitflux) 1
232  do kz=1,numzgrid
233  do jy=0,numygrid-1
234  do ix=0,numxgrid-1 ! north
235  if (flux(4,ix,jy,kz,k,kp,nage).gt.0.) write(unitflux) &
236  ix+jy*numxgrid+kz*numxgrid*numygrid,1.e12* &
237  flux(4,ix,jy,kz,k,kp,nage)/areanorth(ix,jy,kz)/outstep
238  end do
239  end do
240  end do
241  write(unitflux) -999,999.
242  else
243  write(unitflux) 2
244  do kz=1,numzgrid
245  do ix=0,numxgrid-1
246  write(unitflux) (1.e12*flux(4,ix,jy,kz,k,kp,nage)/ &
247  areanorth(ix,jy,kz)/outstep,jy=0,numygrid-1)
248  end do
249  end do
250  endif
251 
252  if (sparseu(k,nage)) then
253  write(unitflux) 1
254  do kz=1,numzgrid
255  do jy=0,numygrid-1
256  do ix=0,numxgrid-1
257  if (flux(5,ix,jy,kz,k,kp,nage).gt.0.) write(unitflux) &
258  ix+jy*numxgrid+kz*numxgrid*numygrid,1.e12* &
259  flux(5,ix,jy,kz,k,kp,nage)/area(ix,jy)/outstep
260  end do
261  end do
262  end do
263  write(unitflux) -999,999.
264  else
265  write(unitflux) 2
266  do kz=1,numzgrid
267  do ix=0,numxgrid-1
268  write(unitflux) (1.e12*flux(5,ix,jy,kz,k,kp,nage)/ &
269  area(ix,jy)/outstep,jy=0,numygrid-1)
270  end do
271  end do
272  endif
273 
274  if (sparsed(k,nage)) then
275  write(unitflux) 1
276  do kz=1,numzgrid
277  do jy=0,numygrid-1
278  do ix=0,numxgrid-1
279  if (flux(6,ix,jy,kz,k,kp,nage).gt.0.) write(unitflux) &
280  ix+jy*numxgrid+kz*numxgrid*numygrid,1.e12* &
281  flux(6,ix,jy,kz,k,kp,nage)/area(ix,jy)/outstep
282  end do
283  end do
284  end do
285  write(unitflux) -999,999.
286  else
287  write(unitflux) 2
288  do kz=1,numzgrid
289  do ix=0,numxgrid-1
290  write(unitflux) (1.e12*flux(6,ix,jy,kz,k,kp,nage)/ &
291  area(ix,jy)/outstep,jy=0,numygrid-1)
292  end do
293  end do
294  endif
295 
296  end do
297  end do
298  end do
299 
300 
301  close(unitflux)
302 
303 
304  ! Reinitialization of grid
305  !*************************
306 
307  do k=1,nspec
308  do kp=1,maxpointspec_act
309  do jy=0,numygrid-1
310  do ix=0,numxgrid-1
311  do kz=1,numzgrid
312  do nage=1,nageclass
313  do i=1,6
314  flux(i,ix,jy,kz,k,kp,nage)=0.
315  end do
316  end do
317  end do
318  end do
319  end do
320  end do
321  end do
322 
323 
324 end subroutine fluxoutput
subroutine caldate(juldate, yyyymmdd, hhmiss)
Definition: caldate.f90:22
subroutine fluxoutput(itime)
Definition: fluxoutput.f90:22