source: flexpart.git/src/partoutput_average.f90 @ 3481cc1

10.4.1_peseiGFS_025bugfixes+enhancementsdevrelease-10release-10.4.1scaling-bug
Last change on this file since 3481cc1 was 3481cc1, checked in by Ignacio Pisso <ip@…>, 4 years ago

move license from headers to a different file

  • Property mode set to 100644
File size: 6.7 KB
Line 
1subroutine partoutput_average(itime)
2  !                             i
3  !*****************************************************************************
4  !                                                                            *
5  !     Dump all particle positions                                            *
6  !                                                                            *
7  !     Author: A. Stohl                                                       *
8  !                                                                            *
9  !     12 March 1999                                                          *
10  !                                                                            *
11  !*****************************************************************************
12  !                                                                            *
13  ! Variables:                                                                 *
14  !                                                                            *
15  !*****************************************************************************
16
17  use par_mod
18  use com_mod
19
20  implicit none
21
22  real(kind=dp) :: jul
23  integer :: itime,i,j,jjjjmmdd,ihmmss
24  integer :: ix,jy,ixp,jyp,indexh,m,il,ind,indz,indzp
25  real :: xlon,ylat
26  real :: dt1,dt2,dtt,ddx,ddy,rddx,rddy,p1,p2,p3,p4,dz1,dz2,dz
27  real :: topo,hm(2),hmixi,pv1(2),pvprof(2),pvi,qv1(2),qvprof(2),qvi
28  real :: tt1(2),ttprof(2),tti,rho1(2),rhoprof(2),rhoi
29  real :: tr(2),tri,zlim
30  character :: adate*8,atime*6
31
32  integer(kind=2) :: ishort_xlon(maxpart),ishort_ylat(maxpart),ishort_z(maxpart)
33  integer(kind=2) :: ishort_topo(maxpart),ishort_tro(maxpart),ishort_hmix(maxpart)
34  integer(kind=2) :: ishort_pv(maxpart),ishort_rho(maxpart),ishort_qv(maxpart)
35  integer(kind=2) :: ishort_tt(maxpart),ishort_uu(maxpart),ishort_vv(maxpart)
36  integer(kind=2) :: ishort_energy(maxpart)
37
38
39  ! Determine current calendar date, needed for the file name
40  !**********************************************************
41
42  jul=bdate+real(itime,kind=dp)/86400._dp
43  call caldate(jul,jjjjmmdd,ihmmss)
44  write(adate,'(i8.8)') jjjjmmdd
45  write(atime,'(i6.6)') ihmmss
46
47
48  ! Some variables needed for temporal interpolation
49  !*************************************************
50
51  dt1=real(itime-memtime(1))
52  dt2=real(memtime(2)-itime)
53  dtt=1./(dt1+dt2)
54
55  ! Open output file and write the output
56  !**************************************
57
58    open(unitpartout_average,file=path(2)(1:length(2))//'partposit_average_'//adate// &
59         atime,form='unformatted',access='direct',status='replace',recl=24)
60
61
62  ! Write current time to file
63  !***************************
64
65!  write(unitpartout_average) itime,numpart
66  do i=1,numpart
67
68  ! Take only valid particles
69  !**************************
70
71    if (itra1(i).eq.itime) then
72      part_av_topo(i)=part_av_topo(i)/float(npart_av(i))
73      part_av_z(i)=part_av_z(i)/float(npart_av(i))
74      part_av_pv(i)=part_av_pv(i)/float(npart_av(i))
75      part_av_qv(i)=part_av_qv(i)/float(npart_av(i))
76      part_av_tt(i)=part_av_tt(i)/float(npart_av(i))
77      part_av_uu(i)=part_av_uu(i)/float(npart_av(i))
78      part_av_vv(i)=part_av_vv(i)/float(npart_av(i))
79      part_av_rho(i)=part_av_rho(i)/float(npart_av(i))
80      part_av_tro(i)=part_av_tro(i)/float(npart_av(i))
81      part_av_hmix(i)=part_av_hmix(i)/float(npart_av(i))
82      part_av_energy(i)=part_av_energy(i)/float(npart_av(i))
83
84      part_av_cartx(i)=part_av_cartx(i)/float(npart_av(i))
85      part_av_carty(i)=part_av_carty(i)/float(npart_av(i))
86      part_av_cartz(i)=part_av_cartz(i)/float(npart_av(i))
87
88! Project Cartesian coordinates back onto Earth's surface
89! #######################################################
90      xlon=atan2(part_av_cartx(i),-1.*part_av_carty(i))
91      ylat=atan2(part_av_cartz(i),sqrt(part_av_cartx(i)*part_av_cartx(i)+ &
92           part_av_carty(i)*part_av_carty(i)))
93      xlon=xlon/pi180
94      ylat=ylat/pi180
95
96
97  ! Convert all data to integer*2 variables (from -32768 to 32767) for compressed output
98  !*************************************************************************************
99
100      if (xlon.gt.180.) xlon=xlon-360.
101      if (xlon.lt.-180.) xlon=xlon+360.
102      ishort_xlon(i)=nint(xlon*180.)
103      ishort_ylat(i)=nint(ylat*360.)
104
105      zlim=(part_av_z(i)*2.-32000.)
106      zlim=min(zlim,32766.)
107      zlim=max(zlim,-32766.)
108      ishort_z(i)=nint(zlim)
109
110      zlim=(part_av_topo(i)*2.-32000.)
111      zlim=min(zlim,32766.)
112      zlim=max(zlim,-32766.)
113      ishort_topo(i)=nint(zlim)
114
115      zlim=(part_av_tro(i)*2.-32000.)
116      zlim=min(zlim,32766.)
117      zlim=max(zlim,-32766.)
118      ishort_tro(i)=nint(zlim)
119
120      zlim=(part_av_hmix(i)*2.-32000.)
121      zlim=min(zlim,32766.)
122      zlim=max(zlim,-32766.)
123      ishort_hmix(i)=nint(zlim)
124
125      zlim=(part_av_rho(i)*20000.-32000.)
126      zlim=min(zlim,32766.)
127      zlim=max(zlim,-32766.)
128      ishort_rho(i)=nint(zlim)
129
130      zlim=(part_av_qv(i)*1000000.-32000.)
131      zlim=min(zlim,32766.)
132      zlim=max(zlim,-32766.)
133      ishort_qv(i)=nint(zlim)
134
135      zlim=(part_av_pv(i)*100.)
136      zlim=min(zlim,32766.)
137      zlim=max(zlim,-32766.)
138      ishort_pv(i)=nint(zlim)
139
140      zlim=((part_av_tt(i)-273.15))*300.
141      zlim=min(zlim,32766.)
142      zlim=max(zlim,-32766.)
143      ishort_tt(i)=nint(zlim)
144
145      zlim=(part_av_uu(i)*200.)
146      zlim=min(zlim,32766.)
147      zlim=max(zlim,-32766.)
148      ishort_uu(i)=nint(zlim)
149
150      zlim=(part_av_vv(i)*200.)
151      zlim=min(zlim,32766.)
152      zlim=max(zlim,-32766.)
153      ishort_vv(i)=nint(zlim)
154
155      zlim=(part_av_energy(i)-300000.)/30.
156      zlim=min(zlim,32766.)
157      zlim=max(zlim,-32766.)
158      ishort_energy(i)=nint(zlim)
159
160  ! Turn on for readable test output
161  !*********************************
162
163!        write(119,*) itime,i,xlon,ylat,part_av_z(i),part_av_topo(i),part_av_tro(i), &
164!        part_av_hmix(i),part_av_rho(i),part_av_qv(i),part_av_pv(i),part_av_tt(i), &
165!        ishort_uu(i),ishort_vv(i)
166    endif
167
168! Re-initialize averages, and set number of steps to zero
169    npart_av(i)=0
170    part_av_topo(i)=0.
171    part_av_z(i)=0.
172    part_av_cartx(i)=0.
173    part_av_carty(i)=0.
174    part_av_cartz(i)=0.
175    part_av_pv(i)=0.
176    part_av_qv(i)=0.
177    part_av_tt(i)=0.
178    part_av_uu(i)=0.
179    part_av_vv(i)=0.
180    part_av_rho(i)=0.
181    part_av_tro(i)=0.
182    part_av_hmix(i)=0.
183    part_av_energy(i)=0.
184   
185  end do
186
187  ! Write the output
188  !*****************
189  do i=1,numpart
190    if (itra1(i).eq.itime) then
191      write(unitpartout_average,rec=i) ishort_xlon(i),ishort_ylat(i),ishort_z(i), &
192           ishort_topo(i),ishort_tro(i),ishort_hmix(i),ishort_rho(i),ishort_qv(i),ishort_pv(i), &
193           ishort_tt(i),ishort_uu(i),ishort_vv(i)  ! ,ishort_energy(i)
194    endif
195  enddo
196
197
198  close(unitpartout_average)
199
200end subroutine partoutput_average
Note: See TracBrowser for help on using the repository browser.
hosted by ZAMG