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