Changeset db712a8 in flexpart.git for src/verttransform_nests.f90
- Timestamp:
- Mar 3, 2016, 12:34:56 PM (8 years ago)
- Branches:
- master, 10.4.1_pesei, GFS_025, bugfixes+enhancements, dev, release-10, release-10.4.1, scaling-bug, univie
- Children:
- 38b7917
- Parents:
- b0434e1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/verttransform_nests.f90
rb0434e1 rdb712a8 21 21 22 22 subroutine verttransform_nests(n,uuhn,vvhn,wwhn,pvhn) 23 ! i i i i i 24 !***************************************************************************** 25 ! * 26 ! This subroutine transforms temperature, dew point temperature and * 27 ! wind components from eta to meter coordinates. * 28 ! The vertical wind component is transformed from Pa/s to m/s using * 29 ! the conversion factor pinmconv. * 30 ! In addition, this routine calculates vertical density gradients * 31 ! needed for the parameterization of the turbulent velocities. * 32 ! It is similar to verttransform, but makes the transformations for * 33 ! the nested grids. * 34 ! * 35 ! Author: A. Stohl, G. Wotawa * 36 ! * 37 ! 12 August 1996 * 38 ! Update: 16 January 1998 * 39 ! * 40 ! Major update: 17 February 1999 * 41 ! by G. Wotawa * 42 ! * 43 ! - Vertical levels for u, v and w are put together * 44 ! - Slope correction for vertical velocity: Modification of calculation * 45 ! procedure * 46 ! * 47 !***************************************************************************** 48 ! Changes, Bernd C. Krueger, Feb. 2001: (marked "C-cv") 49 ! Variables tthn and qvhn (on eta coordinates) from common block 50 !***************************************************************************** 51 ! Sabine Eckhardt, March 2007 52 ! add the variable cloud for use with scavenging - descr. in com_mod 53 !***************************************************************************** 54 ! * 55 ! Variables: * 56 ! nxn,nyn,nuvz,nwz field dimensions in x,y and z direction * 57 ! uun wind components in x-direction [m/s] * 58 ! vvn wind components in y-direction [m/s] * 59 ! wwn wind components in z-direction [deltaeta/s]* 60 ! ttn temperature [K] * 61 ! pvn potential vorticity (pvu) * 62 ! psn surface pressure [Pa] * 63 ! * 64 !***************************************************************************** 23 ! i i i i i 24 !***************************************************************************** 25 ! * 26 ! This subroutine transforms temperature, dew point temperature and * 27 ! wind components from eta to meter coordinates. * 28 ! The vertical wind component is transformed from Pa/s to m/s using * 29 ! the conversion factor pinmconv. * 30 ! In addition, this routine calculates vertical density gradients * 31 ! needed for the parameterization of the turbulent velocities. * 32 ! It is similar to verttransform, but makes the transformations for * 33 ! the nested grids. * 34 ! * 35 ! Author: A. Stohl, G. Wotawa * 36 ! * 37 ! 12 August 1996 * 38 ! Update: 16 January 1998 * 39 ! * 40 ! Major update: 17 February 1999 * 41 ! by G. Wotawa * 42 ! * 43 ! - Vertical levels for u, v and w are put together * 44 ! - Slope correction for vertical velocity: Modification of calculation * 45 ! procedure * 46 ! * 47 !***************************************************************************** 48 ! Changes, Bernd C. Krueger, Feb. 2001: (marked "C-cv") 49 ! Variables tthn and qvhn (on eta coordinates) from common block 50 !***************************************************************************** 51 ! Sabine Eckhardt, March 2007 52 ! add the variable cloud for use with scavenging - descr. in com_mod 53 !***************************************************************************** 54 ! ESO, 2016 55 ! -note that divide-by-zero occurs when nxmaxn,nymaxn etc. are larger than 56 ! the actual field dimensions 57 !***************************************************************************** 58 ! * 59 ! Variables: * 60 ! nxn,nyn,nuvz,nwz field dimensions in x,y and z direction * 61 ! uun wind components in x-direction [m/s] * 62 ! vvn wind components in y-direction [m/s] * 63 ! wwn wind components in z-direction [deltaeta/s]* 64 ! ttn temperature [K] * 65 ! pvn potential vorticity (pvu) * 66 ! psn surface pressure [Pa] * 67 ! * 68 !***************************************************************************** 65 69 66 70 use par_mod … … 69 73 implicit none 70 74 71 integer :: ix,jy,kz,iz,n,l,kmin,kl,klp,ix1,jy1,ixp,jyp 72 integer :: rain_cloud_above,kz_inv 73 real :: f_qvsat,pressure,rh,lsp,convp 74 real :: wzlev(nwzmax),rhoh(nuvzmax),pinmconv(nzmax) 75 real :: uvwzlev(0:nxmaxn-1,0:nymaxn-1,nzmax) 76 real :: ew,pint,tv,tvold,pold,dz1,dz2,dz,ui,vi,cosf 75 real,intent(in),dimension(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests) :: uuhn,vvhn,pvhn 76 real,intent(in),dimension(0:nxmaxn-1,0:nymaxn-1,nwzmax,maxnests) :: wwhn 77 78 real,dimension(0:nxmaxn-1,0:nymaxn-1,nuvzmax) :: rhohn,uvzlev,wzlev 79 real,dimension(0:nxmaxn-1,0:nymaxn-1,nzmax) :: pinmconv 80 real,dimension(0:nxmaxn-1,0:nymaxn-1) :: tvold,pold,pint,tv 81 real,dimension(0:nymaxn-1) :: cosf 82 83 integer,dimension(0:nxmaxn-1,0:nymaxn-1) :: rain_cloud_above, idx 84 85 integer :: ix,jy,kz,iz,n,l,kmin,kl,klp,ix1,jy1,ixp,jyp,kz_inv 86 real :: f_qvsat,pressure,rh,lsp,convp,cloudh_min,prec 87 88 real :: ew,dz1,dz2,dz 77 89 real :: dzdx,dzdy 78 90 real :: dzdx1,dzdx2,dzdy1,dzdy2 79 real :: uuhn(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests)80 real :: vvhn(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests)81 real :: pvhn(0:nxmaxn-1,0:nymaxn-1,nuvzmax,maxnests)82 real :: wwhn(0:nxmaxn-1,0:nymaxn-1,nwzmax,maxnests)83 91 real,parameter :: const=r_air/ga 84 85 86 ! Loop over all nests 87 !******************** 92 real :: tot_cloud_h 93 integer :: nxm1, nym1 94 95 ! real,parameter :: precmin = 0.002 ! minimum prec in mm/h for cloud diagnostics 96 97 ! Loop over all nests 98 !******************** 88 99 89 100 do l=1,numbnests 90 91 ! Loop over the whole grid 92 !************************* 93 94 do jy=0,nyn(l)-1 95 do ix=0,nxn(l)-1 96 97 tvold=tt2n(ix,jy,1,n,l)*(1.+0.378*ew(td2n(ix,jy,1,n,l))/ & 98 psn(ix,jy,1,n,l)) 99 pold=psn(ix,jy,1,n,l) 100 uvwzlev(ix,jy,1)=0. 101 wzlev(1)=0. 102 rhoh(1)=pold/(r_air*tvold) 103 104 105 ! Compute heights of eta levels 106 !****************************** 107 108 do kz=2,nuvz 109 pint=akz(kz)+bkz(kz)*psn(ix,jy,1,n,l) 110 tv=tthn(ix,jy,kz,n,l)*(1.+0.608*qvhn(ix,jy,kz,n,l)) 111 rhoh(kz)=pint/(r_air*tv) 112 113 if (abs(tv-tvold).gt.0.2) then 114 uvwzlev(ix,jy,kz)=uvwzlev(ix,jy,kz-1)+const*log(pold/pint)* & 115 (tv-tvold)/log(tv/tvold) 116 else 117 uvwzlev(ix,jy,kz)=uvwzlev(ix,jy,kz-1)+const*log(pold/pint)*tv 118 endif 119 120 tvold=tv 121 pold=pint 101 nxm1=nxn(l)-1 102 nym1=nyn(l)-1 103 104 ! Loop over the whole grid 105 !************************* 106 107 do jy=0,nyn(l)-1 108 do ix=0,nxn(l)-1 109 tvold(ix,jy)=tt2n(ix,jy,1,n,l)*(1.+0.378*ew*(td2n(ix,jy,1,n,l))/ & 110 psn(ix,jy,1,n,l)) 122 111 end do 123 124 125 do kz=2,nwz-1 126 wzlev(kz)=(uvwzlev(ix,jy,kz+1)+uvwzlev(ix,jy,kz))/2. 127 end do 128 wzlev(nwz)=wzlev(nwz-1)+uvwzlev(ix,jy,nuvz)-uvwzlev(ix,jy,nuvz-1) 129 130 ! pinmconv=(h2-h1)/(p2-p1) 131 132 pinmconv(1)=(uvwzlev(ix,jy,2)-uvwzlev(ix,jy,1))/ & 133 ((aknew(2)+bknew(2)*psn(ix,jy,1,n,l))- & 134 (aknew(1)+bknew(1)*psn(ix,jy,1,n,l))) 135 do kz=2,nz-1 136 pinmconv(kz)=(uvwzlev(ix,jy,kz+1)-uvwzlev(ix,jy,kz-1))/ & 137 ((aknew(kz+1)+bknew(kz+1)*psn(ix,jy,1,n,l))- & 138 (aknew(kz-1)+bknew(kz-1)*psn(ix,jy,1,n,l))) 139 end do 140 pinmconv(nz)=(uvwzlev(ix,jy,nz)-uvwzlev(ix,jy,nz-1))/ & 141 ((aknew(nz)+bknew(nz)*psn(ix,jy,1,n,l))- & 142 (aknew(nz-1)+bknew(nz-1)*psn(ix,jy,1,n,l))) 143 144 145 ! Levels, where u,v,t and q are given 146 !************************************ 147 148 uun(ix,jy,1,n,l)=uuhn(ix,jy,1,l) 149 vvn(ix,jy,1,n,l)=vvhn(ix,jy,1,l) 150 ttn(ix,jy,1,n,l)=tthn(ix,jy,1,n,l) 151 qvn(ix,jy,1,n,l)=qvhn(ix,jy,1,n,l) 152 pvn(ix,jy,1,n,l)=pvhn(ix,jy,1,l) 153 rhon(ix,jy,1,n,l)=rhoh(1) 154 uun(ix,jy,nz,n,l)=uuhn(ix,jy,nuvz,l) 155 vvn(ix,jy,nz,n,l)=vvhn(ix,jy,nuvz,l) 156 ttn(ix,jy,nz,n,l)=tthn(ix,jy,nuvz,n,l) 157 qvn(ix,jy,nz,n,l)=qvhn(ix,jy,nuvz,n,l) 158 pvn(ix,jy,nz,n,l)=pvhn(ix,jy,nuvz,l) 159 rhon(ix,jy,nz,n,l)=rhoh(nuvz) 160 kmin=2 161 do iz=2,nz-1 162 do kz=kmin,nuvz 163 if(height(iz).gt.uvwzlev(ix,jy,nuvz)) then 112 end do 113 114 pold(0:nxm1,0:nym1)=psn(0:nxm1,0:nym1,1,n,l) 115 uvzlev(0:nxm1,0:nym1,1)=0. 116 wzlev(0:nxm1,0:nym1,1)=0. 117 rhohn(0:nxm1,0:nym1,1)=pold(0:nxm1,0:nym1)/(r_air*tvold(0:nxm1,0:nym1)) 118 119 ! Compute heights of eta levels 120 !****************************** 121 122 do kz=2,nuvz 123 pint(0:nxm1,0:nym1)=akz(kz)+bkz(kz)*psn(0:nxm1,0:nym1,1,n,l) 124 tv(0:nxm1,0:nym1)=tthn(0:nxm1,0:nym1,kz,n,l)*(1.+0.608*qvhn(0:nxm1,0:nym1,kz,n,l)) 125 rhohn(0:nxm1,0:nym1,kz)=pint(0:nxm1,0:nym1)/(r_air*tv(0:nxm1,0:nym1)) 126 127 where (abs(tv(0:nxm1,0:nym1)-tvold(0:nxm1,0:nym1)).gt.0.2) 128 uvzlev(0:nxm1,0:nym1,kz)=uvzlev(0:nxm1,0:nym1,kz-1)+const*& 129 &log(pold(0:nxm1,0:nym1)/pint(0:nxm1,0:nym1))* & 130 (tv(0:nxm1,0:nym1)-tvold(0:nxm1,0:nym1))/& 131 &log(tv(0:nxm1,0:nym1)/tvold(0:nxm1,0:nym1)) 132 elsewhere 133 uvzlev(0:nxm1,0:nym1,kz)=uvzlev(0:nxm1,0:nym1,kz-1)+const*& 134 &log(pold(0:nxm1,0:nym1)/pint(0:nxm1,0:nym1))*tv(0:nxm1,0:nym1) 135 endwhere 136 137 tvold(0:nxm1,0:nym1)=tv(0:nxm1,0:nym1) 138 pold(0:nxm1,0:nym1)=pint(0:nxm1,0:nym1) 139 140 end do 141 142 do kz=2,nwz-1 143 wzlev(0:nxm1,0:nym1,kz)=(uvzlev(0:nxm1,0:nym1,kz+1)+uvzlev(0:nxm1,0:nym1,kz))/2. 144 end do 145 wzlev(0:nxm1,0:nym1,nwz)=wzlev(0:nxm1,0:nym1,nwz-1)+ & 146 uvzlev(0:nxm1,0:nym1,nuvz)-uvzlev(0:nxm1,0:nym1,nuvz-1) 147 148 149 pinmconv(0:nxm1,0:nym1,1)=(uvzlev(0:nxm1,0:nym1,2))/ & 150 ((aknew(2)+bknew(2)*psn(0:nxm1,0:nym1,1,n,l))- & 151 (aknew(1)+bknew(1)*psn(0:nxm1,0:nym1,1,n,l))) 152 do kz=2,nz-1 153 pinmconv(0:nxm1,0:nym1,kz)=(uvzlev(0:nxm1,0:nym1,kz+1)-uvzlev(0:nxm1,0:nym1,kz-1))/ & 154 ((aknew(kz+1)+bknew(kz+1)*psn(0:nxm1,0:nym1,1,n,l))- & 155 (aknew(kz-1)+bknew(kz-1)*psn(0:nxm1,0:nym1,1,n,l))) 156 end do 157 pinmconv(0:nxm1,0:nym1,nz)=(uvzlev(0:nxm1,0:nym1,nz)-uvzlev(0:nxm1,0:nym1,nz-1))/ & 158 ((aknew(nz)+bknew(nz)*psn(0:nxm1,0:nym1,1,n,l))- & 159 (aknew(nz-1)+bknew(nz-1)*psn(0:nxm1,0:nym1,1,n,l))) 160 161 ! Levels, where u,v,t and q are given 162 !************************************ 163 164 uun(0:nxm1,0:nym1,1,n,l)=uuhn(0:nxm1,0:nym1,1,l) 165 vvn(0:nxm1,0:nym1,1,n,l)=vvhn(0:nxm1,0:nym1,1,l) 166 ttn(0:nxm1,0:nym1,1,n,l)=tthn(0:nxm1,0:nym1,1,n,l) 167 qvn(0:nxm1,0:nym1,1,n,l)=qvhn(0:nxm1,0:nym1,1,n,l) 168 if (readclouds_nest(l)) then 169 clwcn(0:nxm1,0:nym1,1,n,l)=clwchn(0:nxm1,0:nym1,1,n,l) 170 if (.not.sumclouds_nest(l)) ciwcn(0:nxm1,0:nym1,1,n,l)=ciwchn(0:nxm1,0:nym1,1,n,l) 171 end if 172 pvn(0:nxm1,0:nym1,1,n,l)=pvhn(0:nxm1,0:nym1,1,l) 173 rhon(0:nxm1,0:nym1,1,n,l)=rhohn(0:nxm1,0:nym1,1) 174 175 uun(0:nxm1,0:nym1,nz,n,l)=uuhn(0:nxm1,0:nym1,nuvz,l) 176 vvn(0:nxm1,0:nym1,nz,n,l)=vvhn(0:nxm1,0:nym1,nuvz,l) 177 ttn(0:nxm1,0:nym1,nz,n,l)=tthn(0:nxm1,0:nym1,nuvz,n,l) 178 qvn(0:nxm1,0:nym1,nz,n,l)=qvhn(0:nxm1,0:nym1,nuvz,n,l) 179 if (readclouds_nest(l)) then 180 clwcn(0:nxm1,0:nym1,nz,n,l)=clwchn(0:nxm1,0:nym1,nuvz,n,l) 181 if (.not.sumclouds_nest(l)) ciwcn(0:nxm1,0:nym1,nz,n,l)=ciwchn(0:nxm1,0:nym1,nuvz,n,l) 182 end if 183 pvn(0:nxm1,0:nym1,nz,n,l)=pvhn(0:nxm1,0:nym1,nuvz,l) 184 rhon(0:nxm1,0:nym1,nz,n,l)=rhohn(0:nxm1,0:nym1,nuvz) 185 186 187 kmin=2 188 idx=kmin 189 do iz=2,nz-1 190 do jy=0,nyn(l)-1 191 do ix=0,nxn(l)-1 192 if(height(iz).gt.uvzlev(ix,jy,nuvz)) then 164 193 uun(ix,jy,iz,n,l)=uun(ix,jy,nz,n,l) 165 194 vvn(ix,jy,iz,n,l)=vvn(ix,jy,nz,n,l) 166 195 ttn(ix,jy,iz,n,l)=ttn(ix,jy,nz,n,l) 167 196 qvn(ix,jy,iz,n,l)=qvn(ix,jy,nz,n,l) 197 !hg adding the cloud water 198 if (readclouds_nest(l)) then 199 clwcn(ix,jy,iz,n,l)=clwcn(ix,jy,nz,n,l) 200 if (.not.sumclouds_nest(l)) ciwcn(ix,jy,iz,n,l)=ciwcn(ix,jy,nz,n,l) 201 end if 202 !hg 168 203 pvn(ix,jy,iz,n,l)=pvn(ix,jy,nz,n,l) 169 204 rhon(ix,jy,iz,n,l)=rhon(ix,jy,nz,n,l) 170 goto 30 205 else 206 innuvz: do kz=idx(ix,jy),nuvz 207 if (idx(ix,jy) .le. kz .and. (height(iz).gt.uvzlev(ix,jy,kz-1)).and. & 208 (height(iz).le.uvzlev(ix,jy,kz))) then 209 idx(ix,jy)=kz 210 exit innuvz 211 endif 212 enddo innuvz 171 213 endif 172 if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. & 173 (height(iz).le.uvwzlev(ix,jy,kz))) then 174 dz1=height(iz)-uvwzlev(ix,jy,kz-1) 175 dz2=uvwzlev(ix,jy,kz)-height(iz) 176 dz=dz1+dz2 177 uun(ix,jy,iz,n,l)=(uuhn(ix,jy,kz-1,l)*dz2+ & 178 uuhn(ix,jy,kz,l)*dz1)/dz 179 vvn(ix,jy,iz,n,l)=(vvhn(ix,jy,kz-1,l)*dz2+ & 180 vvhn(ix,jy,kz,l)*dz1)/dz 181 ttn(ix,jy,iz,n,l)=(tthn(ix,jy,kz-1,n,l)*dz2+ & 182 tthn(ix,jy,kz,n,l)*dz1)/dz 183 qvn(ix,jy,iz,n,l)=(qvhn(ix,jy,kz-1,n,l)*dz2+ & 184 qvhn(ix,jy,kz,n,l)*dz1)/dz 185 pvn(ix,jy,iz,n,l)=(pvhn(ix,jy,kz-1,l)*dz2+ & 186 pvhn(ix,jy,kz,l)*dz1)/dz 187 rhon(ix,jy,iz,n,l)=(rhoh(kz-1)*dz2+rhoh(kz)*dz1)/dz 188 kmin=kz 189 goto 30 214 enddo 215 enddo 216 do jy=0,nyn(l)-1 217 do ix=0,nxn(l)-1 218 if(height(iz).le.uvzlev(ix,jy,nuvz)) then 219 kz=idx(ix,jy) 220 dz1=height(iz)-uvzlev(ix,jy,kz-1) 221 dz2=uvzlev(ix,jy,kz)-height(iz) 222 dz=dz1+dz2 223 uun(ix,jy,iz,n,l)=(uuhn(ix,jy,kz-1,l)*dz2+uuhn(ix,jy,kz,l)*dz1)/dz 224 vvn(ix,jy,iz,n,l)=(vvhn(ix,jy,kz-1,l)*dz2+vvhn(ix,jy,kz,l)*dz1)/dz 225 ttn(ix,jy,iz,n,l)=(tthn(ix,jy,kz-1,n,l)*dz2 & 226 +tthn(ix,jy,kz,n,l)*dz1)/dz 227 qvn(ix,jy,iz,n,l)=(qvhn(ix,jy,kz-1,n,l)*dz2 & 228 +qvhn(ix,jy,kz,n,l)*dz1)/dz 229 !hg adding the cloud water 230 if (readclouds_nest(l)) then 231 clwcn(ix,jy,iz,n,l)=(clwchn(ix,jy,kz-1,n,l)*dz2+clwchn(ix,jy,kz,n,l)*dz1)/dz 232 if (.not.sumclouds_nest(l)) & 233 &ciwcn(ix,jy,iz,n,l)=(ciwchn(ix,jy,kz-1,n,l)*dz2+ciwchn(ix,jy,kz,n,l)*dz1)/dz 234 end if 235 !hg 236 pvn(ix,jy,iz,n,l)=(pvhn(ix,jy,kz-1,l)*dz2+pvhn(ix,jy,kz,l)*dz1)/dz 237 rhon(ix,jy,iz,n,l)=(rhohn(ix,jy,kz-1)*dz2+rhohn(ix,jy,kz)*dz1)/dz 190 238 endif 239 enddo 240 enddo 241 enddo 242 243 244 245 ! do kz=kmin,nuvz 246 ! if(height(iz).gt.uvwzlev(ix,jy,nuvz)) then 247 ! uun(ix,jy,iz,n,l)=uun(ix,jy,nz,n,l) 248 ! vvn(ix,jy,iz,n,l)=vvn(ix,jy,nz,n,l) 249 ! ttn(ix,jy,iz,n,l)=ttn(ix,jy,nz,n,l) 250 ! qvn(ix,jy,iz,n,l)=qvn(ix,jy,nz,n,l) 251 ! pvn(ix,jy,iz,n,l)=pvn(ix,jy,nz,n,l) 252 ! rhon(ix,jy,iz,n,l)=rhon(ix,jy,nz,n,l) 253 ! goto 30 254 ! endif 255 ! if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. & 256 ! (height(iz).le.uvwzlev(ix,jy,kz))) then 257 ! dz1=height(iz)-uvwzlev(ix,jy,kz-1) 258 ! dz2=uvwzlev(ix,jy,kz)-height(iz) 259 ! dz=dz1+dz2 260 ! uun(ix,jy,iz,n,l)=(uuhn(ix,jy,kz-1,l)*dz2+ & 261 ! uuhn(ix,jy,kz,l)*dz1)/dz 262 ! vvn(ix,jy,iz,n,l)=(vvhn(ix,jy,kz-1,l)*dz2+ & 263 ! vvhn(ix,jy,kz,l)*dz1)/dz 264 ! ttn(ix,jy,iz,n,l)=(tthn(ix,jy,kz-1,n,l)*dz2+ & 265 ! tthn(ix,jy,kz,n,l)*dz1)/dz 266 ! qvn(ix,jy,iz,n,l)=(qvhn(ix,jy,kz-1,n,l)*dz2+ & 267 ! qvhn(ix,jy,kz,n,l)*dz1)/dz 268 ! pvn(ix,jy,iz,n,l)=(pvhn(ix,jy,kz-1,l)*dz2+ & 269 ! pvhn(ix,jy,kz,l)*dz1)/dz 270 ! rhon(ix,jy,iz,n,l)=(rhohn(kz-1)*dz2+rhohn(kz)*dz1)/dz 271 ! kmin=kz 272 ! goto 30 273 ! endif 274 ! end do 275 ! 30 continue 276 ! end do 277 278 279 ! Levels, where w is given 280 !************************* 281 282 wwn(0:nxm1,0:nym1,1,n,l)=wwhn(0:nxm1,0:nym1,1,l)*pinmconv(0:nxm1,0:nym1,1) 283 wwn(0:nxm1,0:nym1,nz,n,l)=wwhn(0:nxm1,0:nym1,nwz,l)*pinmconv(0:nxm1,0:nym1,nz) 284 kmin=2 285 idx=kmin 286 do iz=2,nz 287 do jy=0,nym1 288 do ix=0,nxm1 289 inn: do kz=idx(ix,jy),nwz 290 if(idx(ix,jy) .le. kz .and. height(iz).gt.wzlev(ix,jy,kz-1).and. & 291 height(iz).le.wzlev(ix,jy,kz)) then 292 idx(ix,jy)=kz 293 exit inn 294 endif 295 enddo inn 296 enddo 297 enddo 298 do jy=0,nym1 299 do ix=0,nxm1 300 kz=idx(ix,jy) 301 dz1=height(iz)-wzlev(ix,jy,kz-1) 302 dz2=wzlev(ix,jy,kz)-height(iz) 303 dz=dz1+dz2 304 wwn(ix,jy,iz,n,l)=(wwhn(ix,jy,kz-1,l)*pinmconv(ix,jy,kz-1)*dz2 & 305 +wwhn(ix,jy,kz,l)*pinmconv(ix,jy,kz)*dz1)/dz 306 enddo 307 enddo 308 enddo 309 310 ! wwn(ix,jy,1,n,l)=wwhn(ix,jy,1,l)*pinmconv(1) 311 ! wwn(ix,jy,nz,n,l)=wwhn(ix,jy,nwz,l)*pinmconv(nz) 312 ! kmin=2 313 ! do iz=2,nz 314 ! do kz=kmin,nwz 315 ! if ((height(iz).gt.wzlev(kz-1)).and. & 316 ! (height(iz).le.wzlev(kz))) then 317 ! dz1=height(iz)-wzlev(kz-1) 318 ! dz2=wzlev(kz)-height(iz) 319 ! dz=dz1+dz2 320 ! wwn(ix,jy,iz,n,l)=(wwhn(ix,jy,kz-1,l)*pinmconv(kz-1)*dz2 & 321 ! +wwhn(ix,jy,kz,l)*pinmconv(kz)*dz1)/dz 322 ! kmin=kz 323 ! goto 40 324 ! endif 325 ! end do 326 ! 40 continue 327 ! end do 328 329 ! Compute density gradients at intermediate levels 330 !************************************************* 331 332 drhodzn(0:nxm1,0:nym1,1,n,l)=(rhon(0:nxm1,0:nym1,2,n,l)-rhon(0:nxm1,0:nym1,1,n,l))/ & 333 (height(2)-height(1)) 334 do kz=2,nz-1 335 drhodzn(0:nxm1,0:nym1,kz,n,l)=(rhon(0:nxm1,0:nym1,kz+1,n,l)-rhon(0:nxm1,0:nym1,kz-1,n,l))/ & 336 (height(kz+1)-height(kz-1)) 337 end do 338 drhodzn(0:nxm1,0:nym1,nz,n,l)=drhodzn(0:nxm1,0:nym1,nz-1,n,l) 339 340 341 ! drhodzn(ix,jy,1,n,l)=(rhon(ix,jy,2,n,l)-rhon(ix,jy,1,n,l))/ & 342 ! (height(2)-height(1)) 343 ! do kz=2,nz-1 344 ! drhodzn(ix,jy,kz,n,l)=(rhon(ix,jy,kz+1,n,l)- & 345 ! rhon(ix,jy,kz-1,n,l))/(height(kz+1)-height(kz-1)) 346 ! end do 347 ! drhodzn(ix,jy,nz,n,l)=drhodzn(ix,jy,nz-1,n,l) 348 349 350 351 ! end do 352 ! end do 353 354 355 !**************************************************************** 356 ! Compute slope of eta levels in windward direction and resulting 357 ! vertical wind correction 358 !**************************************************************** 359 360 do jy=1,nyn(l)-2 361 ! cosf=cos((real(jy)*dyn(l)+ylat0n(l))*pi180) 362 cosf(jy)=1./cos((real(jy)*dyn(l)+ylat0n(l))*pi180) 363 end do 364 365 kmin=2 366 idx=kmin 367 do iz=2,nz-1 368 do jy=1,nyn(l)-2 369 do ix=1,nxn(l)-2 370 371 inneta: do kz=idx(ix,jy),nz 372 if (idx(ix,jy) .le. kz .and. (height(iz).gt.uvzlev(ix,jy,kz-1)).and. & 373 (height(iz).le.uvzlev(ix,jy,kz))) then 374 idx(ix,jy)=kz 375 exit inneta 376 endif 377 enddo inneta 378 enddo 379 enddo 380 381 do jy=1,nyn(l)-2 382 do ix=1,nxn(l)-2 383 kz=idx(ix,jy) 384 dz1=height(iz)-uvzlev(ix,jy,kz-1) 385 dz2=uvzlev(ix,jy,kz)-height(iz) 386 dz=dz1+dz2 387 ix1=ix-1 388 jy1=jy-1 389 ixp=ix+1 390 jyp=jy+1 391 392 dzdx1=(uvzlev(ixp,jy,kz-1)-uvzlev(ix1,jy,kz-1))/2. 393 dzdx2=(uvzlev(ixp,jy,kz)-uvzlev(ix1,jy,kz))/2. 394 dzdx=(dzdx1*dz2+dzdx2*dz1)/dz 395 396 dzdy1=(uvzlev(ix,jyp,kz-1)-uvzlev(ix,jy1,kz-1))/2. 397 dzdy2=(uvzlev(ix,jyp,kz)-uvzlev(ix,jy1,kz))/2. 398 dzdy=(dzdy1*dz2+dzdy2*dz1)/dz 399 400 wwn(ix,jy,iz,n,l)=wwn(ix,jy,iz,n,l)+(dzdx*uun(ix,jy,iz,n,l)*dxconst*xresoln(l)*cosf(jy)+& 401 &dzdy*vvn(ix,jy,iz,n,l)*dyconst*yresoln(l)) 402 191 403 end do 192 30 continue 404 193 405 end do 194 195 196 ! Levels, where w is given 197 !************************* 198 199 wwn(ix,jy,1,n,l)=wwhn(ix,jy,1,l)*pinmconv(1) 200 wwn(ix,jy,nz,n,l)=wwhn(ix,jy,nwz,l)*pinmconv(nz) 201 kmin=2 202 do iz=2,nz 203 do kz=kmin,nwz 204 if ((height(iz).gt.wzlev(kz-1)).and. & 205 (height(iz).le.wzlev(kz))) then 206 dz1=height(iz)-wzlev(kz-1) 207 dz2=wzlev(kz)-height(iz) 208 dz=dz1+dz2 209 wwn(ix,jy,iz,n,l)=(wwhn(ix,jy,kz-1,l)*pinmconv(kz-1)*dz2 & 210 +wwhn(ix,jy,kz,l)*pinmconv(kz)*dz1)/dz 211 kmin=kz 212 goto 40 213 endif 406 end do 407 408 409 ! do jy=1,nyn(l)-2 410 ! do ix=1,nxn(l)-2 411 ! kmin=2 412 ! do iz=2,nz-1 413 414 ! ui=uun(ix,jy,iz,n,l)*dxconst*xresoln(l)/cosf(jy) 415 ! vi=vvn(ix,jy,iz,n,l)*dyconst*yresoln(l) 416 417 ! do kz=kmin,nz 418 ! if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. & 419 ! (height(iz).le.uvwzlev(ix,jy,kz))) then 420 ! dz1=height(iz)-uvwzlev(ix,jy,kz-1) 421 ! dz2=uvwzlev(ix,jy,kz)-height(iz) 422 ! dz=dz1+dz2 423 ! kl=kz-1 424 ! klp=kz 425 ! kmin=kz 426 ! goto 47 427 ! endif 428 ! end do 429 430 ! 47 ix1=ix-1 431 ! jy1=jy-1 432 ! ixp=ix+1 433 ! jyp=jy+1 434 435 ! dzdx1=(uvwzlev(ixp,jy,kl)-uvwzlev(ix1,jy,kl))/2. 436 ! dzdx2=(uvwzlev(ixp,jy,klp)-uvwzlev(ix1,jy,klp))/2. 437 ! dzdx=(dzdx1*dz2+dzdx2*dz1)/dz 438 439 ! dzdy1=(uvwzlev(ix,jyp,kl)-uvwzlev(ix,jy1,kl))/2. 440 ! dzdy2=(uvwzlev(ix,jyp,klp)-uvwzlev(ix,jy1,klp))/2. 441 ! dzdy=(dzdy1*dz2+dzdy2*dz1)/dz 442 443 ! wwn(ix,jy,iz,n,l)=wwn(ix,jy,iz,n,l)+(dzdx*ui+dzdy*vi) 444 445 ! end do 446 447 ! end do 448 ! end do 449 450 451 !write (*,*) 'initializing nested cloudsn, n:',n 452 ! create a cloud and rainout/washout field, cloudsn occur where rh>80% 453 454 455 !*********************************************************************************** 456 if (readclouds_nest(l)) then !HG METHOD 457 ! The method is loops all grids vertically and constructs the 3D matrix for clouds 458 ! Cloud top and cloud bottom gid cells are assigned as well as the total column 459 ! cloud water. For precipitating grids, the type and whether it is in or below 460 ! cloud scavenging are assigned with numbers 2-5 (following the old metod). 461 ! Distinction is done for lsp and convp though they are treated the same in regards 462 ! to scavenging. Also clouds that are not precipitating are defined which may be 463 ! to include future cloud processing by non-precipitating-clouds. 464 !*********************************************************************************** 465 write(*,*) 'Nested ECMWF fields: using cloud water' 466 clwn(0:nxm1,0:nym1,:,n,l)=0.0 467 ! icloud_stats(0:nxm1,0:nym1,:,n)=0.0 468 clw4n(0:nxm1,0:nym1,n,l)=0.0 469 cloudsn(0:nxm1,0:nym1,:,n,l)=0 470 ! If water/ice are read separately into clwc and ciwc, store sum in clwcn 471 if (.not.sumclouds_nest(l)) then 472 clwcn(0:nxm1,0:nym1,:,n,l) = clwcn(0:nxm1,0:nym1,:,n,l) + ciwcn(0:nxm1,0:nym1,:,n,l) 473 end if 474 do jy=0,nym1 475 do ix=0,nxm1 476 lsp=lsprecn(ix,jy,1,n,l) 477 convp=convprecn(ix,jy,1,n,l) 478 prec=lsp+convp 479 tot_cloud_h=0 480 ! Find clouds in the vertical 481 do kz=1, nz-1 !go from top to bottom 482 if (clwcn(ix,jy,kz,n,l).gt.0) then 483 ! assuming rho is in kg/m3 and hz in m gives: kg/kg * kg/m3 *m3/kg /m = m2/m3 484 clwn(ix,jy,kz,n,l)=(clwcn(ix,jy,kz,n,l)*rhon(ix,jy,kz,n,l))*(height(kz+1)-height(kz)) 485 tot_cloud_h=tot_cloud_h+(height(kz+1)-height(kz)) 486 clw4n(ix,jy,n,l) = clw4n(ix,jy,n,l)+clwn(ix,jy,kz,n,l) 487 ! icloud_stats(ix,jy,4,n)= icloud_stats(ix,jy,4,n)+clw(ix,jy,kz,n) ! Column cloud water [m3/m3] 488 ! icloud_stats(ix,jy,3,n)= min(height(kz+1),height(kz)) ! Cloud BOT height stats [m] 489 cloudh_min=min(height(kz+1),height(kz)) 490 !ZHG 2015 extra for testing 491 ! clh(ix,jy,kz,n)=height(kz+1)-height(kz) 492 ! icloud_stats(ix,jy,1,n)=icloud_stats(ix,jy,1,n)+(height(kz+1)-height(kz)) ! Cloud total vertical extent [m] 493 ! icloud_stats(ix,jy,2,n)= max(icloud_stats(ix,jy,2,n),height(kz)) ! Cloud TOP height [m] 494 !ZHG 495 endif 496 end do 497 498 ! If Precipitation. Define removal type in the vertical 499 if ((lsp.gt.0.01).or.(convp.gt.0.01)) then ! cloud and precipitation 500 501 do kz=nz,1,-1 !go Bottom up! 502 if (clwn(ix,jy,kz,n,l).gt.0.0) then ! is in cloud 503 cloudshn(ix,jy,n,l)=cloudshn(ix,jy,n,l)+height(kz)-height(kz-1) 504 cloudsn(ix,jy,kz,n,l)=1 ! is a cloud 505 if (lsp.ge.convp) then 506 cloudsn(ix,jy,kz,n,l)=3 ! lsp in-cloud 507 else 508 cloudsn(ix,jy,kz,n,l)=2 ! convp in-cloud 509 endif ! convective or large scale 510 else if((clwn(ix,jy,kz,n,l).le.0.0) .and. (cloudh_min.ge.height(kz))) then ! is below cloud 511 if (lsp.ge.convp) then 512 cloudsn(ix,jy,kz,n,l)=5 ! lsp dominated washout 513 else 514 cloudsn(ix,jy,kz,n,l)=4 ! convp dominated washout 515 endif ! convective or large scale 516 endif 517 518 if (height(kz).ge. 19000) then ! set a max height for removal 519 cloudsn(ix,jy,kz,n,l)=0 520 endif !clw>0 521 end do !nz 522 endif ! precipitation 214 523 end do 215 40 continue216 524 end do 217 218 ! Compute density gradients at intermediate levels 219 !************************************************* 220 221 drhodzn(ix,jy,1,n,l)=(rhon(ix,jy,2,n,l)-rhon(ix,jy,1,n,l))/ & 222 (height(2)-height(1)) 223 do kz=2,nz-1 224 drhodzn(ix,jy,kz,n,l)=(rhon(ix,jy,kz+1,n,l)- & 225 rhon(ix,jy,kz-1,n,l))/(height(kz+1)-height(kz-1)) 525 !******************************************************************** 526 else ! old method: 527 !******************************************************************** 528 write(*,*) 'Nested fields: using cloud water from Parameterization' 529 do jy=0,nyn(l)-1 530 do ix=0,nxn(l)-1 531 rain_cloud_above(ix,jy)=0 532 lsp=lsprecn(ix,jy,1,n,l) 533 convp=convprecn(ix,jy,1,n,l) 534 cloudshn(ix,jy,n,l)=0 535 do kz_inv=1,nz-1 536 kz=nz-kz_inv+1 537 pressure=rhon(ix,jy,kz,n,l)*r_air*ttn(ix,jy,kz,n,l) 538 rh=qvn(ix,jy,kz,n,l)/f_qvsat(pressure,ttn(ix,jy,kz,n,l)) 539 cloudsn(ix,jy,kz,n,l)=0 540 if (rh.gt.0.8) then ! in cloud 541 if ((lsp.gt.0.01).or.(convp.gt.0.01)) then 542 rain_cloud_above(ix,jy)=1 543 cloudshn(ix,jy,n,l)=cloudshn(ix,jy,n,l)+ & 544 height(kz)-height(kz-1) 545 if (lsp.ge.convp) then 546 cloudsn(ix,jy,kz,n,l)=3 ! lsp dominated rainout 547 else 548 cloudsn(ix,jy,kz,n,l)=2 ! convp dominated rainout 549 endif 550 else ! no precipitation 551 cloudsn(ix,jy,kz,n,l)=1 ! cloud 552 endif 553 else ! no cloud 554 if (rain_cloud_above(ix,jy).eq.1) then ! scavenging 555 if (lsp.ge.convp) then 556 cloudsn(ix,jy,kz,n,l)=5 ! lsp dominated washout 557 else 558 cloudsn(ix,jy,kz,n,l)=4 ! convp dominated washout 559 endif 560 endif 561 endif 562 end do 563 end do 226 564 end do 227 drhodzn(ix,jy,nz,n,l)=drhodzn(ix,jy,nz-1,n,l) 228 229 end do 230 end do 231 232 233 !**************************************************************** 234 ! Compute slope of eta levels in windward direction and resulting 235 ! vertical wind correction 236 !**************************************************************** 237 238 do jy=1,nyn(l)-2 239 cosf=cos((real(jy)*dyn(l)+ylat0n(l))*pi180) 240 do ix=1,nxn(l)-2 241 242 kmin=2 243 do iz=2,nz-1 244 245 ui=uun(ix,jy,iz,n,l)*dxconst*xresoln(l)/cosf 246 vi=vvn(ix,jy,iz,n,l)*dyconst*yresoln(l) 247 248 do kz=kmin,nz 249 if ((height(iz).gt.uvwzlev(ix,jy,kz-1)).and. & 250 (height(iz).le.uvwzlev(ix,jy,kz))) then 251 dz1=height(iz)-uvwzlev(ix,jy,kz-1) 252 dz2=uvwzlev(ix,jy,kz)-height(iz) 253 dz=dz1+dz2 254 kl=kz-1 255 klp=kz 256 kmin=kz 257 goto 47 258 endif 259 end do 260 261 47 ix1=ix-1 262 jy1=jy-1 263 ixp=ix+1 264 jyp=jy+1 265 266 dzdx1=(uvwzlev(ixp,jy,kl)-uvwzlev(ix1,jy,kl))/2. 267 dzdx2=(uvwzlev(ixp,jy,klp)-uvwzlev(ix1,jy,klp))/2. 268 dzdx=(dzdx1*dz2+dzdx2*dz1)/dz 269 270 dzdy1=(uvwzlev(ix,jyp,kl)-uvwzlev(ix,jy1,kl))/2. 271 dzdy2=(uvwzlev(ix,jyp,klp)-uvwzlev(ix,jy1,klp))/2. 272 dzdy=(dzdy1*dz2+dzdy2*dz1)/dz 273 274 wwn(ix,jy,iz,n,l)=wwn(ix,jy,iz,n,l)+(dzdx*ui+dzdy*vi) 275 276 end do 277 278 end do 279 end do 280 281 282 !write (*,*) 'initializing nested cloudsn, n:',n 283 ! create a cloud and rainout/washout field, cloudsn occur where rh>80% 284 write(*,*) 'Nested fields: using cloud water from Parameterization' 285 do jy=0,nyn(l)-1 286 do ix=0,nxn(l)-1 287 rain_cloud_above=0 288 lsp=lsprecn(ix,jy,1,n,l) 289 convp=convprecn(ix,jy,1,n,l) 290 cloudsnh(ix,jy,n,l)=0 291 do kz_inv=1,nz-1 292 kz=nz-kz_inv+1 293 pressure=rhon(ix,jy,kz,n,l)*r_air*ttn(ix,jy,kz,n,l) 294 rh=qvn(ix,jy,kz,n,l)/f_qvsat(pressure,ttn(ix,jy,kz,n,l)) 295 cloudsn(ix,jy,kz,n,l)=0 296 if (rh.gt.0.8) then ! in cloud 297 if ((lsp.gt.0.01).or.(convp.gt.0.01)) then 298 rain_cloud_above=1 299 cloudsnh(ix,jy,n,l)=cloudsnh(ix,jy,n,l)+ & 300 height(kz)-height(kz-1) 301 if (lsp.ge.convp) then 302 cloudsn(ix,jy,kz,n,l)=3 ! lsp dominated rainout 303 else 304 cloudsn(ix,jy,kz,n,l)=2 ! convp dominated rainout 305 endif 306 else ! no precipitation 307 cloudsn(ix,jy,kz,n,l)=1 ! cloud 308 endif 309 else ! no cloud 310 if (rain_cloud_above.eq.1) then ! scavenging 311 if (lsp.ge.convp) then 312 cloudsn(ix,jy,kz,n,l)=5 ! lsp dominated washout 313 else 314 cloudsn(ix,jy,kz,n,l)=4 ! convp dominated washout 315 endif 316 endif 317 endif 318 end do 319 end do 320 end do 321 322 end do 565 end if 566 567 end do ! end loop over nests 323 568 324 569 end subroutine verttransform_nests
Note: See TracChangeset
for help on using the changeset viewer.