SUBROUTINE BackgroundCldgfs(mype,lon2,lat2,nsig,tbk,pbk,psbk,q,hbk) ! !$$$ subprogram documentation block ! . . . . ! subprogram: BackgroundCld Ingest gfs background fields for cloud analysis ! ! PRGMMR: Ming Hu ORG: GSD/AMB DATE: 2006-10-27 ! ! ABSTRACT: ! This subroutine reads in background hydrometeor fields for cloud analysis ! ! PROGRAM HISTORY LOG: ! 2009-01-02 Hu Add NCO document block ! 2010-04-26 Hu delete the module gridmod and guess_grids. ! transfer information subroutine dummy variables ! ! ! input argument list: ! mype - processor ID ! lon2 - no. of lons on subdomain (buffer points on ends) ! lat2 - no. of lats on subdomain (buffer points on ends) ! nsig - no. of vertical levels ! tbk - 3D background potential temperature (K) ! psbk - 2D background surface pressure (hPa) ! q - 3D moisture (water vapor mixing ratio kg/kg) ! pbk - 3D background pressure (hPa) ! ! output argument list: ! hbk - 3D height above the ground (not the sea level) !!!! z_lcl - lifting condensation level ! ! USAGE: ! INPUT FILES: ! ! OUTPUT FILES: ! ! REMARKS: ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE: Linux cluster (WJET) ! !$$$ ! !_____________________________________________________________________ ! use gsd_kinds, only: r_single,i_kind,r_kind use constants, only: rd_over_cp, h1000 use constants, only: rd, grav, half, rad2deg implicit none integer(i_kind),intent(in):: mype integer(i_kind),intent(in):: lon2 integer(i_kind),intent(in):: lat2 integer(i_kind),intent(in):: nsig ! background ! ! read in from WRF ! real(r_single),intent(inout) :: tbk(lon2,lat2,nsig) ! temperature real(r_single),intent(in) :: psbk(lon2,lat2) ! surface pressure real(r_single),intent(inout) :: q(lon2,lat2,nsig) ! moisture real(r_single),intent(in) :: pbk(lon2,lat2,nsig) ! pressure hPa ! ! derived fields ! real(r_single),intent(out) :: hbk(lon2,lat2,nsig)! height ! ! misc. ! INTEGER :: i,j,k REAL(r_single) :: rdog, h, dz REAL(r_single) :: height(nsig+1) ! !================================================================ ! do k=1,nsig do j=1,lat2 do i=1,lon2 q(i,j,k) = q(i,j,k)/(1.0_r_kind-q(i,j,k)) ! water vapor mixing ratio (kg/kg) enddo enddo enddo ! ! Compute geopotential height above the ground at midpoint of each layer ! rdog = rd/grav do j=1,lat2 do i=1,lon2 k = 1 h = rdog * tbk(i,j,k) dz = h * log(psbk(i,j)/pbk(i,j,k)) height(k) = dz do k=2,nsig h = rdog * half * (tbk(i,j,k-1)+tbk(i,j,k)) dz = h * log(pbk(i,j,k-1)/pbk(i,j,k)) height(k) = height(k-1) + dz end do do k=1,nsig hbk(i,j,k)=height(k) end do end do end do do k=1,nsig do j=1,lat2 do i=1,lon2 tbk(i,j,k)=tbk(i,j,k)*(h1000/pbk(i,j,k))**rd_over_cp enddo enddo enddo END SUBROUTINE BackgroundCldgfs SUBROUTINE BackgroundCld(mype,lon2,lat2,nsig,tbk,pbk,psbk,q,hbk, & zh,pt_ll,eta1_ll,aeta1_ll,eta2_ll,aeta2_ll,regional,wrf_mass_regional) ! !$$$ subprogram documentation block ! . . . . ! subprogram: BackgroundCld Ingest background fields for cloud analysis ! ! PRGMMR: Ming Hu ORG: GSD/AMB DATE: 2006-10-27 ! ! ABSTRACT: ! This subroutine reads in background hydrometeor fields for cloud analysis ! ! PROGRAM HISTORY LOG: ! 2009-01-02 Hu Add NCO document block ! 2010-04-26 Hu delete the module gridmod and guess_grids. ! transfer information subroutine dummy variables ! 2017-03-23 Hu - add code to use hybrid vertical coodinate in WRF MASS ! core ! ! ! input argument list: ! mype - processor ID ! lon2 - no. of lons on subdomain (buffer points on ends) ! lat2 - no. of lats on subdomain (buffer points on ends) ! nsig - no. of vertical levels ! tbk - 3D background potential temperature (K) ! psbk - 2D background surface pressure (hPa) ! q - 3D moisture (water vapor mixing ratio kg/kg) ! zh - terrain ! pt_ll - vertical coordinate ! eta1_ll - vertical coordinate ! aeta1_ll - vertical coordinate ! regional - if regional ! wrf_mass_regional - if mass core ! ! output argument list: ! pbk - 3D background pressure (hPa) ! hbk - 3D height above the ground (not the sea level) !!!! z_lcl - lifting condensation level ! ! USAGE: ! INPUT FILES: ! ! OUTPUT FILES: ! ! REMARKS: ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN 90 ! MACHINE: Linux cluster (WJET) ! !$$$ ! !_____________________________________________________________________ ! use gsd_kinds, only: r_single,i_kind,r_kind use constants, only: rd_over_cp, h1000 use constants, only: rd, grav, half, rad2deg implicit none integer(i_kind),intent(in):: mype integer(i_kind),intent(in):: lon2 integer(i_kind),intent(in):: lat2 integer(i_kind),intent(in):: nsig real(r_kind), intent(in) :: pt_ll real(r_kind), intent(in) :: eta1_ll(nsig+1) ! real(r_kind), intent(in) :: aeta1_ll(nsig) ! real(r_kind), intent(in) :: eta2_ll(nsig+1) ! real(r_kind), intent(in) :: aeta2_ll(nsig) ! logical, intent(in) :: regional ! .t. for regional background/analysis logical, intent(in) :: wrf_mass_regional ! ! background ! ! read in from WRF ! real(r_single),intent(inout) :: tbk(lon2,lat2,nsig) ! temperature real(r_single),intent(inout) :: psbk(lon2,lat2) ! surface pressure real(r_single),intent(in) :: zh(lon2,lat2) ! terrain elevation real(r_single),intent(inout) :: q(lon2,lat2,nsig) ! moisture ! ! derived fields ! real(r_single),intent(out) :: hbk(lon2,lat2,nsig)! height real(r_single),intent(out) :: pbk(lon2,lat2,nsig)! pressure hPa ! real(r_single),intent(out) :: z_lcl(lon2,lat2) ! lifting condensation level ! ! misc. ! INTEGER :: i,j,k REAL(r_single) :: rdog, h, dz REAL(r_single) :: height(nsig+1) real(r_single) :: q_integral(lon2,lat2),q_integralc4h(lon2,lat2) real(r_single) :: deltasigma, deltasigmac4h,psfc_this ! !================================================================ ! q_integral=1 q_integralc4h=0.0 do k=1,nsig deltasigma=eta1_ll(k)-eta1_ll(k+1) deltasigmac4h=eta2_ll(k)-eta2_ll(k+1) do j=1,lat2 do i=1,lon2 q(i,j,k) = q(i,j,k)/(1.0_r_kind-q(i,j,k)) ! water vapor mixing ratio (kg/kg) q_integral(i,j)=q_integral(i,j)+deltasigma*q(i,j,k) q_integralc4h(i,j)=q_integralc4h(i,j)+deltasigmac4h*q(i,j,k) enddo enddo enddo do j=1,lat2 do i=1,lon2 psfc_this=pt_ll+(psbk(i,j)-pt_ll)/q_integral(i,j) psbk(i,j)= psfc_this enddo enddo ! ! assign CAPE as 0, this part needs more work ! ! gsfc(:,:,3)=0.0 ! CAPE, we need but not included in wrf_inout ! 1: land use; 2: sfc soil T; 3: CAPE ! ! get land use and convert latitude and longitude back to degree ! xland=gsfc(:,:,1) ! soil_tbk=gsfc(:,:,2) ! ! get virtual potential temperature (thv) ! ! thv=0.0 ! do k=1,nsig ! do j=1,nlat ! do i=1,nlon ! rl=qr(i,j,k)+qs(i,j,k)+qg(i,j,k)+qc(i,j,k)+qi(i,j,k) ! thv(i,j,k)=tbk(i,j,k)*(1.0+0.61*q(i,j,k)-rl) ! ENDDO ! ENDDO ! ENDDO !! ! ! now get pressure (pbk) and height (hbk) at each grid point ! if(regional .and. wrf_mass_regional ) then do k=1,nsig do j=1,lat2 do i=1,lon2 pbk(i,j,k)=aeta1_ll(k)*(psbk(i,j)-pt_ll)+pt_ll + aeta2_ll(k) end do end do end do ! Compute geopotential height at midpoint of each layer rdog = rd/grav do j=1,lat2 do i=1,lon2 k = 1 h = rdog * tbk(i,j,k) dz = h * log(psbk(i,j)/pbk(i,j,k)) height(k) = zh(i,j) + dz do k=2,nsig h = rdog * half * (tbk(i,j,k-1)+tbk(i,j,k)) dz = h * log(pbk(i,j,k-1)/pbk(i,j,k)) height(k) = height(k-1) + dz end do do k=1,nsig hbk(i,j,k)=height(k) - zh(i,j) end do end do end do else write(6,*) ' Only wrf mass grid is done for cloud analysis ' write(6,*) ' You are choosing grid that is not recoginzed by cloud analysis' call stop2(114) endif do k=1,nsig do j=1,lat2 do i=1,lon2 tbk(i,j,k)=tbk(i,j,k)*(h1000/pbk(i,j,k))**rd_over_cp enddo enddo enddo END SUBROUTINE BackgroundCld