! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SFCPHYSICS ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE sfcphysics(nx,ny,nz,nstyps, & 1,66 u,v,w,ptprt,pprt,qv,qr, & rhostr,ptbar,pbar,qvbar, & x,y,z, zp, j1,j2,j3,j3inv, prcrate, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,qvsfc, & radsw,rnflx, & cdm,cdh,cdq,usflx,vsflx,ptsflx,qvsflx,pbldpth) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the surface momentum, heat and surface moisture fluxes. ! These fluxes will be passed into turbulent mixing subroutines. ! The drag coefficients are returned in cdm, cdh and cdq. ! ! The soil-vegetation model is also called to update its state ! variables. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/07/1992. ! ! MODIFICATION HISTORY: ! ! 5/06/92 (M. Xue) ! Added full documentation. ! ! 6/4/92 (M. Xue and H. Jin) ! Further facelift. ! ! 9/14/1992 (M. Xue) ! Different drag coefficients defined for momentum, temperature and ! moisture. Definition of ptsfc0 and qvsfc0 changed. qvbar added to ! the argument list. ! ! 9/28/1992 (M. Xue) ! Sign correction in all the flux formulations. ! ! 8/28/1993 (M. Xue and Hao jin) ! Modified the flux formulations considering the terrain effect. ! ! 01/24/94 (Y. Liu and V. Wong) ! Added the surface energy and moisture budget model to predict the ! ground temperature and moistures. ! ! 9/04/1994 (K. Brewster, V. Wong and X. Song) ! Facelift. ! ! 11/01/1994 (Y. Liu) ! Subroutine name of soil model were changed from SFCEBM to SOILEBM ! and the arguments passed were changed to 2-D arrays instead of 3-D ! temporary arrays. ! ! 12/07/1994 (Y. Liu) ! Cleaned up internal documentation and an empty DO loop of labeled ! 360 in subroutine SFCFLXSD. ! ! 01/28/1995 (V. Wong and X. Song) ! Add the option of stability and roughness dependent surface layer ! parameterization for both land and sea surfaces. ! ! 02/07/1995 (Y. Liu) ! Fixed a bug in the calculation of surface precipitation, ! tem1(i,j,4). ! ! 02/27/95 (V. Wong, Y. Liu and X. Song) ! Delete subroutines of calculating C_u and C_pt at the neutral state ! Make predicting procedure more consistent. Add a limiting parameter ! "blimit" to prevent the drag coefficients from becoming too small ! in the stable region. ! ! 03/02/1995 (Y. Liu) ! Added the minimum surface total wind speed to guarantee the basic ! heat and moisture fluxes. ! ! 02/07/96 (V.Wong and X.Song) ! Changed the calculation of roughness zo over the sea according to ! Clarke(1970). The new formulation is insensitive to the value of ! the depth. of the first model layer above the ground. ! Added kvwtr to denote the Von Karman constant over the sea. ! Set a lower limiter, zolimit, for zo, and an upper limiter, z1limit, ! for depth of the surface layer z1. ! ! 12/08/98 (Donghai Wang and Vince Wang) ! Added the snow cover. ! ! 2/25/1999 (M. Xue) ! Reorganized this subroutine from original SFCFLX. ! Calculations of drag coefficients and fluxes are grouped into ! into new subroutines DRAGCOEF and SFCFLX, respectively. ! Named local arrays are defined for many 2D variables for better ! readability. ! ! 2000/02/29 (Gene Bassett, Yang Kun, Vince Wong) ! Corrected typo: "c8=gammahl*stabp" from equation (15) in Byun (1990). ! ! 2001/12/05 (Yunheng Wang) ! Merged M. Xue's version to the official release. ! ! 2001/12/10 (Ming Xue) ! Streamlined the usage of work arrays. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! u x component of velocity at a given time level (m/s) ! v y component of velocity at a given time level (m/s) ! w z component of velocity at a given time level (m/s) ! ! ptprt Perturbation potential temperature at a given time ! level (K) ! pprt Perturbation pressure (Pascal) ! qv Water vapor specific humidity at a given time level ! (kg/kg) ! qr Rain water mixing ratio at a given time level (kg/kg) ! pbldpth Planetary boundary layer depth (m) at a given time level ! rhostr Base state density rhobar times j3 (kg/m**3) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! qvbar Base state water vapor specific humidity (kg/kg) ! ! x The x-coord. of the physical and computational grid. ! Defined at u-point. ! y The y-coord. of the physical and computational grid. ! Defined at v-point. ! zp The physical height coordinate defined at w-point ! ! j1 Coordinate transformation Jacobian -d(zp)/d(x) ! j2 Coordinate transformation Jacobian -d(zp)/d(y) ! j3 Coordinate transformation Jacobian, d(zp)/d(z) ! j3inv Inverse of j3 ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by the surface ! ! OUTPUT: ! ! cdm Drag coefficient for momentum defined as scalar point ! cdh Drag coefficient for heat ! cdq Drag coefficient for moisture ! usflx Surface flux of u-momentum ! vsflx Surface flux of v-momentum ! ptsflx Surface flux of heat (K*kg/(m**2*s)) ! qvsflx Surface flux of moisture (K*kg/(m**2*s)) ! pbldpth Planetary boundary layer depth (m) ! ! INPUT & OUTPUT: ! ! tsfc Skin temperature at the ground or ocean surface (K) ! tsoil Deep soil temperature (K) (in 1 m deep layer) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy moisture ! snowdpth Snow depth (m) ! qvsfc Effective specific humidity at sfc. ! ! WORK ARRAY: ! ! ptsfc Potential temperature at the ground level (K) ! psfc Surface pressure (Pascal) ! wdspsfc Wind speed at the surface ! rhosfc Base-state air density at the surface ! pt1 Potential temperature at the first model level AGL ! tair Temperature of surface air ! qvair Specific humidity of surface air ! ! tem1 3-dimensional array (nz >= 4) to store: ! tem2 3-dimensional array (nz >= 4) to store: ! tem3 3-dimensional array (nz >= 4) to store: ! tem4 3-dimensional array (nz >= 4) to store: ! tem5 3-dimensional array (nz >= 4) to store: ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INCLUDE 'timelvls.inc' REAL :: u (nx,ny,nz) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: rhostr (nx,ny,nz) ! Base state density rhobar times j3. REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific ! humidity (kg/kg) REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. ! Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. ! Defined at v-point. REAL :: z (nz) ! The z-coord. of the physical and ! computational grid. Defined at w-point. REAL :: zp (nx,ny,nz) ! The height of the terrain. REAL :: j1 (nx,ny,nz) ! Coordinate transformation ! Jacobian -d(zp)/d(x) REAL :: j2 (nx,ny,nz) ! Coordinate transformation ! Jacobian -d(zp)/d(y) REAL :: j3 (nx,ny,nz) ! Coordinate transformation ! Jacobian d(zp)/d(z) REAL :: j3inv (nx,ny,nz) ! Inverse of j3 REAL :: prcrate(nx,ny) ! precipitation rate (kg/(m**2*s)) INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type at each point REAL :: stypfrct(nx,ny,nstyps)! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsfc (nx,ny,0:nstyps) ! Skin temperature at the ground ! or ocean surface (K) ! (in 1 cm top layer) REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K) ! (in 1 m deep layer) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: qvsfc (nx,ny,0:nstyps) ! Effective S.H. at sfc. ! at the ground level (K) REAL :: snowdpth(nx,ny) ! Snow depth REAL :: radsw (nx,ny) ! Solar radiation flux reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: cdm (nx,ny) ! Drag coefficient for momentum ! defined as scalar point REAL :: cdh (nx,ny) ! Drag coefficient for heat REAL :: cdq (nx,ny) ! Drag coefficient for moisture REAL :: usflx (nx,ny) ! surface flux of u-momentum ! (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! surface flux of v-momentum ! (kg/(m*s**2)) REAL :: ptsflx (nx,ny) ! surface flux of heat (K*kg/(m**2*s)) REAL :: qvsflx (nx,ny) ! surface flux of moisture (kg/(m**2*s)) REAL :: pbldpth(nx,ny,nt) ! Planetary boundary layer depth (m) REAL :: ptsfc (nx,ny) ! Potential temperature at the ground level (K) REAL :: psfc (nx,ny) ! Surface pressure (Pascal) REAL :: wdspsfc(nx,ny) ! Wind speed at the surface REAL :: rhosfc (nx,ny) ! Base-state air density at the surface REAL :: pt1 (nx,ny) ! Potential temperature at 1st model level AGL REAL :: tair (nx,ny) ! Temperature of surface air REAL :: qvair (nx,ny) ! Specific humidity of surface air !----------------------------------------------------------------------- ! Local work arrays: !----------------------------------------------------------------------- REAL :: shflx (nx,ny) ! Sensible heat flux REAL :: lhflx (nx,ny) ! Latent heat flux REAL :: gflx (nx,ny) ! Diffusive heat flux from ground surface to deep soil REAL :: ct (nx,ny) ! Thermal capacity REAL :: evaprg (nx,ny) ! Evaporation from groud surface REAL :: evaprtr(nx,ny) ! Transpiration of the remaining part (1-delta) of leaves REAL :: evaprr (nx,ny) ! Direct evaporation from the fraction delta REAL :: qvsat (nx,ny) ! Surface specific humidity at saturation REAL :: qvsata (nx,ny) ! qvsat(tair) (kg/kg) REAL :: f34 (nx,ny) ! f34 and surface resistance REAL :: temxy1 (nx,ny) ! Temporary array REAL :: temxy2 (nx,ny) ! Temporary array REAL :: temxy3 (nx,ny) ! Temporary array REAL :: temxy4 (nx,ny) ! Temporary array REAL :: temxpy (nx+ny) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j,is, nsmth REAL :: tema,temb REAL :: gumove,gvmove REAL :: nsfcstsave INTEGER :: lfn,tmstrln CHARACTER (LEN=80) :: soiloutfl,temchar,timsnd INTEGER :: mptag1,mptag2,mptag3,mptag4 REAL :: tem ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'sfcphycst.inc' INCLUDE 'mp.inc' ! Message passing parameters. INCLUDE 'bndry.inc' INCLUDE 'grid.inc' ! Grid & map parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF ( sfcphy == 0 ) THEN ! !----------------------------------------------------------------------- ! ! If sfcphy = 0, usflx, vsflx, ptsflx and qvsflx are set to zero and ! will not be used in the mixing subroutines. ! For safety, we set them to zero. ! !----------------------------------------------------------------------- ! DO j=1,ny DO i=1,nx usflx (i,j) = 0.0 vsflx (i,j) = 0.0 ptsflx(i,j) = 0.0 qvsflx(i,j) = 0.0 END DO END DO RETURN END IF ! !----------------------------------------------------------------------- ! ! Prepare surface arrays to be used later. ! !----------------------------------------------------------------------- ! IF ( grdtrns == 0 ) THEN gumove = 0.0 gvmove = 0.0 ELSE gumove = umove gvmove = vmove END IF CALL set_acct(sfcphy_acct) DO j=1,ny-1 DO i=1,nx-1 tema = 0.25*(u(i+1,j,1)+u(i,j,1)+u(i+1,j,2)+u(i,j,2))+gumove temb = 0.25*(v(i,j+1,1)+v(i,j,1)+v(i,j+1,2)+v(i,j,2))+gvmove wdspsfc(i,j)=MAX(vsfcmin, & SQRT(tema*tema+temb*temb+w(i,j,2)*w(i,j,2))) psfc (i,j) = 0.5 * ( pprt(i,j,1) + pbar(i,j,1) & + pprt(i,j,2) + pbar(i,j,2) ) rhosfc(i,j) = 0.5 * ( rhostr(i,j,1)*j3inv(i,j,1) & + rhostr(i,j,2)*j3inv(i,j,2) ) pt1(i,j)=ptbar(i,j,2)+ptprt(i,j,2) ptsfc (i,j) = tsfc(i,j,0)*(p0/psfc(i,j))**rddcp END DO END DO IF ( sfcphy == 1 ) THEN ! !----------------------------------------------------------------------- ! ! Compute the surface fluxes by calling SFCFLX given drag coefficients ! ground surface potential temperature and equivalent specific humidity. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 IF ( soiltyp(i,j,1) == 13 .AND.landwtr == 1) THEN cdm(i,j) = cdmwtr cdh(i,j) = cdhwtr cdq(i,j) = cdqwtr ELSE cdm(i,j) = cdmlnd cdh(i,j) = cdhlnd cdq(i,j) = cdqlnd END IF END DO END DO CALL sfcflx(nx,ny,nz,u,v,w,ptprt,pprt,qv,ptbar,pbar,qvbar, & wdspsfc,rhosfc,ptsfc,qvsfc(1,1,0), cdm,cdh,cdq, & usflx,vsflx,ptsflx,qvsflx) ELSE IF ( sfcphy == 2 ) THEN ! !----------------------------------------------------------------------- ! ! Calculate stability-dependent drag coefficients by calling DRAGCOEF. ! Then calculate the fluxes. ! !----------------------------------------------------------------------- ! CALL dragcoef(nx,ny,nz, & zp, ptsfc,qvsfc,soiltyp,roufns,wdspsfc,pt1, & cdm,cdh,cdq) CALL sfcflx(nx,ny,nz,u,v,w,ptprt,pprt,qv,ptbar,pbar,qvbar, & wdspsfc,rhosfc,ptsfc,qvsfc(1,1,0), cdm,cdh,cdq, & usflx,vsflx,ptsflx,qvsflx) ELSE IF ( sfcphy == 3 .OR. sfcphy == 4 ) THEN ! !----------------------------------------------------------------------- ! ! Before calling SFCEBM, we need to prepare some data for the ! surface model first. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 tair(i,j) = 0.5 * ( (ptbar(i,j,1)+ptprt(i,j,1)) & + (ptbar(i,j,2)+ptprt(i,j,2)) ) & * (psfc(i,j)/p0)**rddcp ! Temperature qvair(i,j) = 0.5 * ( qv(i,j,1) + qv(i,j,2) ) END DO END DO DO i=1,nx DO j=1,ny tsfc (i,j,0) = 0.0 tsoil (i,j,0) = 0.0 wetsfc (i,j,0) = 0.0 wetdp (i,j,0) = 0.0 wetcanp(i,j,0) = 0.0 qvsfc (i,j,0) = 0.0 END DO END DO DO j=1,ny DO i=1,nx usflx (i,j) = 0.0 vsflx (i,j) = 0.0 ptsflx(i,j) = 0.0 qvsflx(i,j) = 0.0 END DO END DO IF ( soilinitopt == 1 .AND. nstep == 1 ) THEN nsfcstsave = nsfcst nsfcst = nint(soiltintv/dtsfc) END IF DO is=nstyp,1,-1 ! !----------------------------------------------------------------------- ! ! Specified drag coefficients cdm, cdh and cdq. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 ptsfc (i,j) = tsfc(i,j,is)*(p0/psfc(i,j))**rddcp END DO END DO IF ( sfcphy == 3 ) THEN DO j=1,ny-1 DO i=1,nx-1 IF ( soiltyp(i,j,is) == 13 .AND.landwtr == 1) THEN cdm(i,j) = cdmwtr cdh(i,j) = cdhwtr cdq(i,j) = cdqwtr ELSE cdm(i,j) = cdmlnd cdh(i,j) = cdhlnd cdq(i,j) = cdqlnd END IF END DO END DO END IF IF ( sfcphy == 4 ) THEN ! !----------------------------------------------------------------------- ! ! Calculate drag coefficients and surface fluxes for each subtypes ! within a grid cell. The final fluxes are weighted averaged of all ! types. Drag coefficients are type dependent and are therefore ! recalculated for each type. ! !----------------------------------------------------------------------- ! CALL dragcoef(nx,ny,nz,zp, & ptsfc,qvsfc(1,1,is),soiltyp(1,1,is),roufns,wdspsfc,pt1, & cdm,cdh,cdq) END IF ! !----------------------------------------------------------------------- ! ! usflx, vsflx, ptsflx and qvsflx are stored in temxy1, temxy2, temxy3 ! and temxy4, respectively. ! !----------------------------------------------------------------------- CALL sfcflx(nx,ny,nz,u,v,w,ptprt,pprt,qv,ptbar,pbar,qvbar, & wdspsfc,rhosfc,ptsfc,qvsfc(1,1,is), cdm,cdh,cdq, & temxy1,temxy2,temxy3,temxy4) DO i=2,nx-1 DO j=1,ny-1 usflx(i,j) = usflx(i,j) + temxy1(i,j)*stypfrct(i,j,is) END DO END DO DO i=1,nx-1 DO j=2,ny-1 vsflx(i,j) = vsflx(i,j) + temxy2(i,j)*stypfrct(i,j,is) END DO END DO DO i=1,nx-1 DO j=1,ny-1 ptsflx(i,j) = ptsflx(i,j) + temxy3(i,j)*stypfrct(i,j,is) qvsflx(i,j) = qvsflx(i,j) + temxy4(i,j)*stypfrct(i,j,is) END DO END DO !----------------------------------------------------------------------- ! Integrate soil model (soilebm) to update tsfc, qvsfc, tsoil, ! wetsfc, wetdp, and wetcanp. They will be used by the next step. !----------------------------------------------------------------------- CALL set_acct(soil_acct) CALL soilebm(nx,ny,nz, & soiltyp(1,1,is),vegtyp,lai,veg, & tsfc(1,1,is),tsoil(1,1,is),wetsfc(1,1,is), & wetdp(1,1,is),wetcanp(1,1,is),snowdpth,qvsfc(1,1,is), & wdspsfc,psfc,rhosfc,prcrate, & tair,qvair,cdh,cdq,radsw,rnflx, & shflx,lhflx,gflx,ct,evaprg,evaprtr,evaprr,qvsat,qvsata,f34) !----------------------------------------------------------------------- ! If we want to use the sensible and latent heat fluxes calculated ! inside the soil model (soilebm) in the atmospheric model, doing the ! folloing do loop. Otherwise, the flux calculated in sfcflx will be ! used, which is based on qvsfc one time step earlier. Otherwise, ! they should be the same. !----------------------------------------------------------------------- ! ! DO i=1,nx-1 ! DO j=1,ny-1 ! ptsflx(i,j) = ptsflx(i,j) + shflx(i,j)*stypfrct(i,j,is) ! qvsflx(i,j) = qvsflx(i,j) + lhflx(i,j)*stypfrct(i,j,is) ! END DO ! END DO DO i=1,nx-1 DO j=1,ny-1 tsfc (i,j,0) = tsfc (i,j,0) & + tsfc (i,j,is)*stypfrct(i,j,is) tsoil (i,j,0) = tsoil (i,j,0) & + tsoil (i,j,is)*stypfrct(i,j,is) wetsfc (i,j,0) = wetsfc (i,j,0) & + wetsfc (i,j,is)*stypfrct(i,j,is) wetdp (i,j,0) = wetdp (i,j,0) & + wetdp (i,j,is)*stypfrct(i,j,is) wetcanp(i,j,0) = wetcanp(i,j,0) & + wetcanp(i,j,is)*stypfrct(i,j,is) qvsfc (i,j,0) = qvsfc (i,j,0) & + qvsfc (i,j,is)*stypfrct(i,j,is) END DO END DO END DO ! loop over is !----------------------------------------------------------------------- ! If we want to use the sensible and latent heat fluxes calculated ! inside the soil model (soilebm) in the atmospheric model, doing the ! folloing do loop. Otherwise, the flux calculated in sfcflx will be ! used, which is based on qvsfc one time step earlier. Otherwise, ! they should be the same. ! ! Convert sensible and latent heat fluxes stored currently in ! ptsflx and qvsflx into pt and qv fluxes required by atmospheric model. !----------------------------------------------------------------------- ! ! tem = 1.0/lathv ! DO i=1,nx-1 ! DO j=1,ny-1 ! ptsflx(i,j)=ptsflx(i,j)*(p0/(pbar(i,j,1)+ptbar(i,j,2) & ! +pprt(i,j,1)+pprt(i,j,2))*0.5)**rddcp ! qvsflx(i,j)=qvsflx(i,j)*tem ! ENDDO ! ENDDO IF ( soilinitopt == 1 .AND. nstep == 1 ) THEN nsfcst = nsfcstsave CALL cvttsnd( curtim, timsnd, tmstrln ) soiloutfl = runname(1:lfnkey)//'.new_soilvar.' & //timsnd(1:tmstrln) lfn = lfnkey + 13 + tmstrln IF( dirname /= ' ' ) THEN temchar = soiloutfl soiloutfl = dirname(1:ldirnam)//'/'//temchar lfn = lfn + ldirnam + 1 END IF CALL fnversn(soiloutfl, lfn) PRINT *, 'Write soil initial data to ',soiloutfl(1:lfn) CALL wrtsoil( nx,ny,nstyps, soiloutfl(1:lfn),dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & 1,1,1,1,1,1, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,soiltyp) CALL soilcntl( nx,ny, soiloutfl, 1,1,1,1,1,1, x,y) END IF END IF ! !----------------------------------------------------------------------- ! ! Update the boundary zone fluxes. ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsend1dew(usflx,nx,ny,ebc,wbc,1,mptag1,temxpy) CALL mpsend1dew(vsflx,nx,ny,ebc,wbc,2,mptag2,temxpy) CALL mpsend1dew(ptsflx,nx,ny,ebc,wbc,0,mptag3,temxpy) CALL mpsend1dew(qvsflx,nx,ny,ebc,wbc,0,mptag4,temxpy) CALL mprecv1dew(usflx,nx,ny,ebc,wbc,1,mptag1,temxpy) CALL mprecv1dew(vsflx,nx,ny,ebc,wbc,2,mptag2,temxpy) CALL mprecv1dew(ptsflx,nx,ny,ebc,wbc,0,mptag3,temxpy) CALL mprecv1dew(qvsflx,nx,ny,ebc,wbc,0,mptag4,temxpy) CALL mpsend1dns(usflx,nx,ny,nbc,sbc,1,mptag1,temxpy) CALL mpsend1dns(vsflx,nx,ny,nbc,sbc,2,mptag2,temxpy) CALL mpsend1dns(ptsflx,nx,ny,nbc,sbc,0,mptag3,temxpy) CALL mpsend1dns(qvsflx,nx,ny,nbc,sbc,0,mptag4,temxpy) CALL mprecv1dns(usflx,nx,ny,nbc,sbc,1,mptag1,temxpy) CALL mprecv1dns(vsflx,nx,ny,nbc,sbc,2,mptag2,temxpy) CALL mprecv1dns(ptsflx,nx,ny,nbc,sbc,0,mptag3,temxpy) CALL mprecv1dns(qvsflx,nx,ny,nbc,sbc,0,mptag4,temxpy) END IF CALL acct_interrupt(bc_acct) CALL bcu2d(nx,ny, usflx, ebc,wbc,nbc,sbc) CALL bcv2d(nx,ny, vsflx, ebc,wbc,nbc,sbc) CALL bcs2d(nx,ny, ptsflx, ebc,wbc,nbc,sbc) CALL bcs2d(nx,ny, qvsflx, ebc,wbc,nbc,sbc) CALL acct_stop_inter ! !----------------------------------------------------------------------- ! ! Smooth fluxes to remove any 2-dx waves caused by discontinuities ! in the soil conditions. ! !----------------------------------------------------------------------- ! IF ( smthflx == 1 ) THEN DO nsmth=1,numsmth CALL smooth9p_nobc( usflx, nx,ny,1,nx, 1,ny-1,temxy1 ) CALL smooth9p_nobc( vsflx, nx,ny,1,nx-1,1,ny, temxy1 ) CALL smooth9p_nobc( ptsflx,nx,ny,1,nx-1,1,ny-1,temxy1 ) CALL smooth9p_nobc( qvsflx,nx,ny,1,nx-1,1,ny-1,temxy1 ) IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsend1dew(usflx,nx,ny,ebc,wbc,1,mptag1,temxpy) CALL mpsend1dew(vsflx,nx,ny,ebc,wbc,2,mptag2,temxpy) CALL mpsend1dew(ptsflx,nx,ny,ebc,wbc,0,mptag3,temxpy) CALL mpsend1dew(qvsflx,nx,ny,ebc,wbc,0,mptag4,temxpy) CALL mprecv1dew(usflx,nx,ny,ebc,wbc,1,mptag1,temxpy) CALL mprecv1dew(vsflx,nx,ny,ebc,wbc,2,mptag2,temxpy) CALL mprecv1dew(ptsflx,nx,ny,ebc,wbc,0,mptag3,temxpy) CALL mprecv1dew(qvsflx,nx,ny,ebc,wbc,0,mptag4,temxpy) CALL mpsend1dns(usflx,nx,ny,nbc,sbc,1,mptag1,temxpy) CALL mpsend1dns(vsflx,nx,ny,nbc,sbc,2,mptag2,temxpy) CALL mpsend1dns(ptsflx,nx,ny,nbc,sbc,0,mptag3,temxpy) CALL mpsend1dns(qvsflx,nx,ny,nbc,sbc,0,mptag4,temxpy) CALL mprecv1dns(usflx,nx,ny,nbc,sbc,1,mptag1,temxpy) CALL mprecv1dns(vsflx,nx,ny,nbc,sbc,2,mptag2,temxpy) CALL mprecv1dns(ptsflx,nx,ny,nbc,sbc,0,mptag3,temxpy) CALL mprecv1dns(qvsflx,nx,ny,nbc,sbc,0,mptag4,temxpy) END IF CALL acct_interrupt(bc_acct) CALL bcu2d(nx,ny, usflx, ebc,wbc,nbc,sbc) CALL bcv2d(nx,ny, vsflx, ebc,wbc,nbc,sbc) CALL bcs2d(nx,ny, ptsflx, ebc,wbc,nbc,sbc) CALL bcs2d(nx,ny, qvsflx, ebc,wbc,nbc,sbc) CALL acct_stop_inter END DO END IF ! !----------------------------------------------------------------------- ! ! Write all surface related fields for diagnostic purpose. ! !----------------------------------------------------------------------- ! IF ( sfcdiag == 1 ) THEN CALL set_acct(output_acct) CALL soildiag(nx,ny,nz,x,y,z, & soiltyp(1,1,1),vegtyp,lai,roufns,veg,zp(1,1,2), & tsfc(1,1,0),tsoil(1,1,0),wetsfc(1,1,0), & wetdp(1,1,0),wetcanp(1,1,0),qvsfc(1,1,0), & usflx,vsflx,ptsflx,qvsflx, & wdspsfc,psfc,rhosfc,prcrate, & tair,qvair,cdh,cdq,cdm, & radsw,rnflx, & shflx,lhflx,gflx,ct,evaprg,evaprtr,evaprr,qvsat,qvsata,f34) END IF ! !----------------------------------------------------------------------- ! Call the subroutine to determine height of PBL top !----------------------------------------------------------------------- ! IF (pbldopt > 0) THEN CALL set_acct(sfcphy_acct) CALL pbldepth(nx,ny,nz, u,v,w,ptprt,qv,ptbar, zp,j3, ptsflx, & pbldpth) END IF RETURN END SUBROUTINE sfcphysics ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SFCFLX ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE sfcflx(nx,ny,nz, & 3 u,v,w,ptprt,pprt,qv,ptbar,pbar,qvbar, & wdspsfc,rhosfc,ptsfc,qvsfc, cdm,cdh,cdq, & usflx,vsflx,ptsflx,qvsflx) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the surface momentum, heat and surface moisture fluxes. ! These fluxes will be passed into turbulent mixing subroutines. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/07/1992. ! ! MODIFICATION HISTORY: ! ! 2/24/1999 (M. Xue) ! Simplified codes that calculate the sfc fluxes. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! u x component of velocity at a given time level (m/s) ! v y component of velocity at a given time level (m/s) ! w z component of velocity at a given time level (m/s) ! ! ptprt Perturbation potential temperature at a given time ! level (K) ! pprt Perturbation pressure (Pascal) ! qv Water vapor specific humidity at a given time level ! (kg/kg) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! qvbar Base state specific humidity (kg/kg) ! ! wdspsfc Wind speed at the surface ! rhosfc Base-state air density at the surface ! ptsfc Potential temperature at the ground level (K) ! qvsfc Effective specific humidity at sfc. ! cdm Drag coefficient for momentum defined as scalar point ! cdh Drag coefficient for heat ! cdq Drag coefficient for moisture ! ! OUTPUT: ! ! usflx Surface flux of u-momentum ! vsflx Surface flux of v-momentum ! ptsflx Surface flux of heat (K*kg/(m**2*s)) ! qvsflx Surface flux of moisture (K*kg/(m**2*s)) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions REAL :: u (nx,ny,nz) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: qvbar (nx,ny,nz) ! Base state specific humidity (kg/kg) REAL :: ptsfc (nx,ny) ! Potential temperature at the ground level (K) REAL :: rhosfc (nx,ny) ! Surface air density (kg/m**3) REAL :: wdspsfc(nx,ny) ! Wind speed at the surface REAL :: qvsfc (nx,ny) ! Effective specific humidity at surface REAL :: cdm (nx,ny) ! Drag coefficient for surface momentum flux REAL :: cdh (nx,ny) ! Drag coefficient for surface heat flux REAL :: cdq (nx,ny) ! Drag coefficient for surface moisture flux REAL :: usflx (nx,ny) ! surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx (nx,ny) ! surface flux of heat (K*kg/(m**2*s)) REAL :: qvsflx (nx,ny) ! surface flux of moisture (kg/(m**2*s)) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j REAL :: usuf, vsuf,qvsfc0 REAL :: tema REAL :: gumove,gvmove ! !----------------------------------------------------------------------- ! ! Include files: ! ! Include file globcst.inc passes cdmlnd,cdmwtr, cdhlnd,cdmwtr, ! cdqlnd,cdmwtr and UMOVE and VMOVE into this subroutine. ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF ( grdtrns == 0 ) THEN gumove = 0.0 gvmove = 0.0 ELSE gumove = umove gvmove = vmove END IF ! !----------------------------------------------------------------------- ! ! Compute the surface flux of u-momentum, i.e. the surface ! drag in x-direction, according to a simple drag law: ! ! usflx = rhobar *bar( (w'u') ) = rhobar *Cdm*V*u ! ! where Cdm is the drag coefficient, V the wind speed at the first ! scalar level above ground, and u the x-component of wind at the ! same level. ! ! usflx is defined one-half dz below the u-point, i.e. at ground level. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=2,nx-1 usuf = 0.5*(u(i,j,2)+u(i,j,1))+gumove usflx(i,j)=0.125*(cdm(i,j)+cdm(i-1,j))* & (rhosfc(i,j)+rhosfc(i-1,j))* & (wdspsfc(i,j)+wdspsfc(i-1,j))* & sign(1.0, usuf)*MAX(abs(usuf),vsfcmin) END DO END DO ! !----------------------------------------------------------------------- ! ! Compute the surface flux of v-momentum, i.e. the surface ! drag in y-direction, according to a simple drag law: ! ! vsflx = - rhobar *bar( (w'v') ) = rhobar *Cdm*V*v ! ! where Cdm is the drag coefficient, V the wind speed at the first ! scalar level above ground, and v the y-component of wind at the ! same level. ! ! vsflx is defined one-half dz below the v-point, i.e. at ground level. ! !----------------------------------------------------------------------- ! DO j=2,ny-1 DO i=1,nx-1 vsuf = gvmove + 0.5*(v(i,j,2)+v(i,j,1)) vsflx(i,j)=0.125*(cdm(i,j)+cdm(i,j-1))* & (rhosfc(i,j)+rhosfc(i,j-1))* & (wdspsfc(i,j)+wdspsfc(i,j-1))* & sign(1.0,vsuf)*MAX(abs(vsuf),vsfcmin) END DO END DO ! !----------------------------------------------------------------------- ! ! Compute the surface heat flux according to a simple drag law: ! ! ptsflx = - rhobar *bar( (w' pt') ) = rhobar *Cdh*V*(pt-ptsfc0) ! ! where Cdh is the drag coefficient, V the wind speed and pt the ! potential temperatureat at the first scalar level above ground. ! ! ptsfc0 is defined as the potential temperature at ground leval. ! ptsfc0 = ptbar at surface ! ! ptsflx is defined one-half dz below the scalar point, i.e. at ! ground level. ! ! Similarly, the vertical moisture flux at the surface is defined as ! ! qvsflx = - rhobar *bar( (w' qv') ) = rhobar *Cdq*V*(qv-qvsfc0) ! ! where qv is the specific humidity at the first model scalar level. ! qvsfc0 is defined as the mixing ratio at the ground and taken as ! the base state moisture, qvsfc0 = qvbar, at ground level. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 IF ( sfcphy == 1 .OR. sfcphy == 3 ) THEN qvsfc0=0.5*(qvbar(i,j,1)+qvbar(i,j,2)) ELSE qvsfc0=qvsfc(i,j) END IF tema = rhosfc(i,j)*MAX(wdspsfc(i,j),vsfcmin) ptsflx(i,j)=cdh(i,j)*tema*(ptprt(i,j,2)+ptbar(i,j,2)-ptsfc(i,j)) qvsflx(i,j)=cdq(i,j)*tema*(qv(i,j,2)-qvsfc0) END DO END DO RETURN END SUBROUTINE sfcflx ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE DRAGCOEF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE dragcoef(nx,ny,nz, & 2,6 zp, ptsfc,qvsfc,soiltyp,roufns,wdspsfc,pt1, & cdm,cdh,cdq) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the surface momentum, heat and surface moisture fluxes ! using a stability dependent formulation. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/07/1992. ! ! MODIFICATION HISTORY: ! ! 5/06/92 (M. Xue) ! Added full documentation. ! ! 6/4/92 (M. Xue and H. Jin) ! Further facelift. ! ! 9/14/1992 (M. Xue) ! Different drag coefficients defined for momentum, temperature and ! moisture. Definition of ptsfc and qvsfc changed. qvbar added to ! the argument list. ! ! 9/28/1992 (M. Xue) ! Sign correction in all the flux formulations. ! ! 8/28/1993 (M. Xue and Hao jin) ! Modified the flux formulations considering the terrain effect. ! ! 9/10/1993 (V. Wong, X. Song and N. Lin) ! Stability dependent formulation used for usflx, vsflx, and ptsflx. ! The different flux formulations come from subroutines USTARC and ! PTSTARC. ! ! 9/04/1994 (K. Brewster, V. Wong and X. Song) ! Facelift. ! ! 12/7/1994 (Y. Liu) ! Cleaned up an empty DO loop with a label 360. ! ! 01/28/1995 (V. Wong and X. Song) ! Add the option of stability and roughness dependent surface layer ! parameterization for both land and sea surfaces. ! ! 03/02/1995 (Y. Liu) ! Added the minimum surface total wind speed to guarantee the basic ! heat and moisture fluxes. ! ! 02/07/96 (V.Wong and X.Song) ! Changed the calculation of roughness zo over the sea according to ! Clarke(1970). The new formulation is insensitive to the value of ! the depth. of the first model layer above the ground. ! Added kvwtr to denote the Von Karman constant over the sea. ! Set a lower limiter, zolimit, for zo, and an upper limiter, z1limit, ! for depth of the surface layer z1. ! ! 03/17/1997 (Yuhe Liu, Vince Wong and Jing Tian) ! Added an option for constant cdh (cdq) over water. ! ! 05/29/97 (V. Wong and X. Tan) ! Modified the formulation considering the height of the surface ! layer z1 may equal zero. ! ! 02/25/1999 (M. Xue) ! Isolated from original SFCFLXSD routine. The above listing is for ! SFCFLXSD. ! ! 01/09/2002 (Y. Wang) ! Changed the DO loop lower bound from i=2, j=2 to i=1, j=1 in ! the calculation of drag coefficient for momentum. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! ! ptsfc Potential temperature at the ground level (K) ! qvsfc Effective specific humidity at sfc ! soiltyp Soil type at each point ! roufns Surface roughness ! ! wdspsfc Surface wind speed (at first level about ground) (m/s) ! pt1 Potential temperature at the first model level AGL ! ! OUTPUT: ! ! cdm Drag coefficient for surface momentum flux (nondimensional) ! cdh Drag coefficient for surface heat flux (nondimensional) ! cdq Drag coefficient for surface moisture flux (nondimensional) ! ! Local work arrays: ! ! c_u Cu ! c_pt Cpt ! c_uneu Cu for neutral stratification ! c_ptneu Cpt for neutral stratification ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of staggered grid. REAL :: ptsfc (nx,ny) ! Potential temperature at the ground level (K) REAL :: qvsfc (nx,ny) ! Effective surface specific humidity INTEGER :: soiltyp(nx,ny) ! Soil type at each point REAL :: roufns(nx,ny) ! Surface roughness length REAL :: wdspsfc(nx,ny) ! Wind speed at the surface REAL :: pt1 (nx,ny) ! Potential temperature at the first model level AGL REAL :: cdm (nx,ny) ! Drag coefficient for surface momentum flux REAL :: cdh (nx,ny) ! Drag coefficient for surface heat flux REAL :: cdq (nx,ny) ! Drag coefficient for surface moisture flux REAL :: c_u (nx,ny) ! Cu REAL :: c_pt (nx,ny) ! Cpt REAL :: c_uneu(nx,ny) ! Cu for neutral stratification REAL :: c_ptneu(nx,ny) ! Cpt for neutral stratification ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: check REAL :: z1,z1drou,z1droup ! !----------------------------------------------------------------------- ! ! Include files: ! ! Include file globcst.inc passes cdq (moisture transfer coeffcient) ! and UMOVE and VMOVE into this subroutine. ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO j=1,ny-1 DO i=1,nx-1 ! ! Calculate C_u and C_pt at the neutral state ! z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) z1 = MIN(z1,z1limit) z1drou = z1/roufns(i,j) z1droup = (z1+roufns(i,j))/roufns(i,j) c_uneu (i,j) = kv/LOG(z1droup) c_ptneu(i,j) = c_uneu(i,j) /prantl0l END DO END DO ! !----------------------------------------------------------------------- ! ! A general procedure for computing the drag coefficients: ! ! 1. Obtain the following quantities: ! a. The first scalar level above ground level (z1) ! b. Potential temperature at the height of surface roughness ! (roufns) - given. ! c. Potential temperature (pt1) at the first scalar level above ! ground. ! d. C_u and C_pt at neutral state in the land case from ! c_uneu =kv/log10(z1/roughness) ! c_ptneu=c_uneu/prandtl_number ! In the water case, call subroutines CUNEUWTR and CPTNEUWTR. ! ! 2. Given the information from (1), compute the Bulk Richardson ! number, defined as ! ! BulkRi = (g/ptsfc) * ( (pt1-ptsfc)*(z1-roufns) / V**2 ) ! where V is the wind speed at the surface. ! ! 3. After calculation of the BulkRi, then: ! a. Given the BulkRi and the information in (1), compute C_u at ! both land and water cases (see subroutines CUC and CUCWTR). ! ! b. From C_u and C_pt, compute draf coefficients cdh and cdq. ! !----------------------------------------------------------------------- ! ! Calculate drag coefficient (defined at scalar point) for momentum ! fluxes. ! !----------------------------------------------------------------------- ! CALL cuc(nx,ny,nz,1,nx-1,1,ny-1,zp, & roufns,wdspsfc,ptsfc,pt1,c_uneu, c_u) IF (wtrexist == 1) THEN CALL cuneuwtr(nx,ny,nz,1,nx-1,1,ny-1,soiltyp,wdspsfc, & c_uneu) CALL cucwtr (nx,ny,nz,1,nx-1,1,ny-1,zp,soiltyp,wdspsfc, & ptsfc,pt1,c_uneu, c_u) END IF DO j=1,ny-1 DO i=1,nx-1 check=ptsfc(i,j)-pt1(i,j) ! ! Put lower and upper limits on C_u ! IF(check >= 0.0) THEN ! Unstable case c_u(i,j)=MIN( c_u(i,j), 2.0*c_uneu(i,j)) ELSE ! Stable case c_u(i,j)=MAX( c_u(i,j), blimit*c_uneu(i,j)) END IF ! !----------------------------------------------------------------------- ! ! c_dm=c_U**2 ! ! Change Von Karman constant from 0.4 to 0.35 and since the drag ! coefficient Cdm is proportional to the square of the constant, ! the final usflx should be multiplied by (0.35/0.40)**2 = 0.765625 ! !----------------------------------------------------------------------- ! cdm(i,j) = 0.765625 * c_u(i,j) * c_u(i,j) END DO END DO ! !----------------------------------------------------------------------- ! ! From C_u and C_pt, compute C_dh = C_u * C_pt and pt flux, ! !----------------------------------------------------------------------- ! CALL cptc(nx,ny,nz,1,nx-1,1,ny-1,zp,roufns,wdspsfc, & ptsfc,pt1,c_ptneu,c_pt) IF ( wtrexist == 1 .AND. cdhwtropt == 0 ) THEN CALL cptneuwtr(nx,ny,nz,1,nx-1,1,ny-1,soiltyp,wdspsfc,c_uneu, & c_ptneu) CALL cptcwtr(nx,ny,nz,1,nx-1,1,ny-1,zp,soiltyp,wdspsfc, & ptsfc,pt1,c_ptneu, c_pt) END IF DO j=1,ny-1 DO i=1,nx-1 check=ptsfc(i,j)-pt1(i,j) ! ! Impose lower and upper limits on C_u and C_pt. ! IF ( soiltyp(i,j) == 13 .AND. cdhwtropt == 1 ) THEN cdh(i,j) = cdhwtr ELSE IF(check >= 0) THEN c_pt(i,j) = MIN(c_pt(i,j),3.3333*c_ptneu(i,j) ) ELSE c_pt(i,j) = MAX(c_pt(i,j),blimit*c_ptneu(i,j) ) END IF cdh(i,j) = c_u(i,j)*c_pt(i,j) END IF ! !----------------------------------------------------------------------- ! ! Change Von Karman constant from 0.4 to 0.35 and since the drag ! coefficient Cdh is proportional to the square of the constant, ! the final Cdh should be multiplied by (0.35/0.40)**2 = 0.765625 ! !----------------------------------------------------------------------- ! cdh(i,j) = 0.765625*cdh(i,j) cdq(i,j) = 0.7*cdh(i,j) END DO END DO RETURN END SUBROUTINE dragcoef ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CUC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cuc(nx,ny,nz,ibgn,iend,jbgn,jend,zp,roufns,wspd,ptsfc, & 1 pt1, c_uneu,c_u) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute C_u (friction velocity / wind speed). The quantity C_U is used by ! the subroutine SFCFLX to obtain surface fluxes for both unstable ! and stable cases. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong, X. Song and N. Lin ! 9/10/1993 ! ! For the unstable case (Bulk Richardson number bulkri < 0 ), the ! formulation is based on the paper "On the Analytical Solutions of ! Flux-Profile relationships for the Atmospheric Surface Layer" by ! D.W. Byun in J. of Applied Meteorlogy, July 1990, pp. 652-657. ! ! For the stable case, the formulation is based on the ! paper "A Short History of the Operational PBL - Parameterization ! at ECMWF" by J.F.Louis, M. Tiedtke and J.F. Geleyn in " Workshop ! on Planetary Boundary Layer Parameterization", a publication ! by the European Centre for Medium Range Weather Forecasts, ! 25-27 Nov. 1981. ! ! MODIFICATION HISTORY: ! ! 9/04/1994 (K. Brewster, V. Wong and X. Song) ! Facelift. ! ! 2/27/95 (V. Wong and X. Song) ! ! 02/07/96 (V.Wong and X.Song) ! Set an upper limiter, z1limit, for depth of the surface layer z1. ! ! 05/01/97 (V. Wong and X. Tan) ! Changed the computation of stabp, use the formulation similar to ! one used by Bynn(1990), the momentum and thermal roughness ! lengths are different. ! ! 05/29/97 (V. Wong and X. Tan) ! Modified the formulation considering the height of the surface ! layer z1 may equal zero. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn i-index where evaluation begins. ! iend i-index where evaluation ends. ! jbgn j-index where evaluation begins. ! jend j-index where evaluation ends. ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! roufns Surface roughness ! ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! ptsfc Potential temperature at the ground level (K) ! pt1 Potential temperature at the 1st scalar point above ! ground level, (K) ! ! c_uneu Friction velocity at neutral state ! ! OUTPUT: ! ! ustar Friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: ibgn ! i-index where evaluation begins. INTEGER :: iend ! i-index where evaluation ends. INTEGER :: jbgn ! j-index where evaluation begins. INTEGER :: jend ! j-index where evaluation ends. REAL :: zp (nx,ny,nz) ! The physical height coordinate ! defined at w-point of staggered grid. REAL :: roufns(nx,ny) ! Surface roughness length REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: ptsfc(nx,ny) ! Potential temperature at the ground ! level (K) REAL :: pt1 (nx,ny) ! Potential temperature at the ! 1st scalar ! point above ground level, (K) REAL :: c_uneu(nx,ny) ! Frictional velocity (m/s) at neutral REAL :: c_u(nx,ny) ! Frictional velocity (m/s) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: z1 ! The height of 1st scalar point above ! ground level (m) REAL :: dz0 ! z1-roufns, where roufns is defined as ! surface roughness length REAL :: bulkri ! Bulk Richardson number REAL :: stabp ! Monin-Obukhov STABility Parameter ! (zeta) REAL :: x1,x0,psim ! Intermediate parameters needed REAL :: z1drou,qb3pb2 REAL :: c7,c8 REAL :: sb,qb,pb,thetab,tb ! During computations REAL :: a,b,c,d REAL :: tempan,sqrtqb REAL :: zt ! Thermal roughness length REAL :: dzt REAL :: ztdrou REAL :: z1droup, ztdroup ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Following Byun (1990). ! !----------------------------------------------------------------------- ! DO j=jbgn,jend DO i=ibgn,iend z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) z1 = MIN(z1,z1limit) zt = ztz0*roufns(i,j) dzt = z1-zt ztdrou = z1/zt ztdroup = (z1+zt)/zt dz0 = z1-roufns(i,j) z1drou = z1/roufns(i,j) z1droup = (z1+roufns(i,j))/roufns(i,j) bulkri = (g/ptsfc(i,j))*(pt1(i,j)-ptsfc(i,j))*dz0/ & (wspd(i,j)*wspd(i,j)) IF (bulkri <= 0.0) THEN ! !----------------------------------------------------------------------- ! ! Unstable case: See equations (28)-(34) in Byun (1990). ! !----------------------------------------------------------------------- ! bulkri = MAX (bulkri,-10.0) sb =bulkri/prantl0l qb=oned9*(c1l+c2l*sb*sb) pb=oned54*(c3l+c4l*sb*sb) qb3pb2=qb**3-pb*pb c7 = (z1*dzt*LOG(z1droup)*LOG(z1droup))/(dz0*dz0*LOG(ztdroup)) IF( qb3pb2 >= 0.0 ) THEN sqrtqb = SQRT(qb) tempan = MAX( -1.0, MIN( 1.0, pb/(sqrtqb**3) ) ) thetab=ACOS(tempan) stabp =c7*(-2.0*sqrtqb*COS(thetab/3.0)+c5l) ELSE tb =(SQRT(-qb3pb2)+ABS(pb))**oned3 stabp =c7*(-(tb+qb/tb)+c5l) END IF ! !----------------------------------------------------------------------- ! ! According to equation (14) in Byun (1990). ! !----------------------------------------------------------------------- ! c8=gammaml*stabp x1=(1. - c8)**0.25 x0=(1. - c8/z1drou)**0.25 psim=2.0*LOG((1.0+x1)/(1.0+x0))+LOG((1.+x1*x1)/(1.+x0*x0))- & 2.0*ATAN(x1)+2.0*ATAN(x0) ! !----------------------------------------------------------------------- ! ! Compute C_u via equation (10) in Byun (1981). ! !----------------------------------------------------------------------- ! c_u(i,j) =kv/(LOG(z1droup)-psim) ELSE ! !----------------------------------------------------------------------- ! ! Stable case: ! !----------------------------------------------------------------------- ! a=kv/LOG(z1droup) b=5.0 d=5.0 c=SQRT(1.0+d*bulkri) c_u(i,j) = a/SQRT(1.0+2.0*b*bulkri/c) END IF END DO END DO RETURN END SUBROUTINE cuc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CPTC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cptc(nx,ny,nz,ibgn,iend,jbgn,jend, & 1 zp,roufns,wspd,ptsfc,pt1, c_ptneu,c_pt) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute c_pt (a nondimensional temperature scale) ! ! The quantity c_pt is used by the subroutine SFCFLX to obtain ! surface fluxes for both the unstable and stable cases. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong, X. Song and N. Lin ! 9/10/1993 ! ! For the unstable case (Bulk Richardson number bulkri < 0 ), the ! formulation is based on the paper "On the Analytical Solutions of ! Flux-Profile relationships for the Atmospheric Surface Layer" by ! D.W. Byun in J. of Applied Meteorlogy, July 1990, pp. 652-657. ! ! For stable case, the formulation is based on the paper "A Short ! History of the Operational PBL - Parameterization at ECMWF" by ! J.F.Louis, M. Tiedtke and J.F. Geleyn in "Workshop on Planetary ! Boundary Layer Parameterization", a publication by European Centre ! for Medium Range Weather Forecasts, 25-27 Nov. 1981. ! ! MODIFICATION HISTORY: ! ! 9/04/1994 (K. Brewster, V. Wong and X. Song) ! Facelift. ! ! 2/27/95 (V. Wong and X. Song) ! ! 02/07/96 (V.Wong and X.Song) ! Set an upper limiter, z1limit, for depth of the surface layer z1. ! ! 05/01/97 (V. Wong and X. Tan) ! Changed the computation of temperature scale ! ! 05/29/97 (V. Wong and X. Tan) ! Modified the formulation considering the height of the surface ! layer z1 may equal zero. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn i-index where evaluation begins. ! iend i-index where evaluation ends. ! jbgn j-index where evaluation begins. ! jend j-index where evaluation ends. ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! roufns Surface roughness ! ! ptsfc Potential temperature at the ground level (K) ! pt1 Potential temperature at the 1st scalar point above ! ground level, (K) ! ! c_ptneu Temperature scale (K) at neutral state, defined by ! surface heat flux / friction velocity ! ! OUTPUT: ! ! c_pt Temperature scale (K), defined by ! surface heat flux / friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: ibgn ! i-index where evaluation begins INTEGER :: iend ! i-index where evaluation ends INTEGER :: jbgn ! j-index where evaluation begins INTEGER :: jend ! j-index where evaluation ends REAL :: zp (nx,ny,nz) ! The physical height coordinate ! defined at w-point of staggered grid. REAL :: roufns(nx,ny) ! Surface roughness length REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: ptsfc(nx,ny) ! Potential temperature at the ! ground level (K) REAL :: pt1 (nx,ny) ! Potential temperature at the ! 1st scalar ! point above ground level, (K) REAL :: c_ptneu(nx,ny) ! Normalized temperature scale (K) ! at neutral state REAL :: c_pt (nx,ny) ! Temperature scale (K) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: z1 ! The height of 1st scalar point above ! ground level (m) REAL :: dz0 ! z1-roufns, where roufns is defined as ! surface roughness length REAL :: bulkri ! Bulk Richardson number REAL :: stabp ! Monin-Obukhov STABility Parameter ! (zeta) REAL :: y1,y0,psih ! Intermediate parameters needed REAL :: z1drou,qb3pb2 REAL :: c7,c8 REAL :: sb,qb,pb,thetab,tb ! During computations REAL :: a,b,c,d REAL :: tempan,sqrtqb REAL :: zt ! Thermal roughness length REAL :: dzt,ztdrou REAL :: z1droup,ztdroup ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Following Byun (1990). ! !----------------------------------------------------------------------- ! DO j=jbgn,jend DO i=ibgn,iend z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) z1 = MIN(z1,z1limit) zt = ztz0*roufns(i,j) dzt = z1-zt ztdrou = z1/zt ztdroup = (z1+zt)/zt dz0 = z1-roufns(i,j) z1drou = z1/roufns(i,j) z1droup = (z1+roufns(i,j))/roufns(i,j) bulkri = (g/ptsfc(i,j))*(pt1(i,j)-ptsfc(i,j))*dz0/ & (wspd(i,j)*wspd(i,j)) IF (bulkri <= 0.0) THEN ! !----------------------------------------------------------------------- ! ! Unstable case: See equations (28)-(34) in Byun (1990). ! !----------------------------------------------------------------------- ! bulkri = MAX (bulkri,-10.0) sb =bulkri/prantl0l qb=oned9*(c1l+c2l*sb*sb) pb=oned54*(c3l+c4l*sb*sb) qb3pb2=qb**3-pb*pb c7 = (z1*dzt*LOG(z1droup)*LOG(z1droup))/(dz0*dz0*LOG(ztdroup)) IF( qb3pb2 >= 0.0 ) THEN sqrtqb = SQRT(qb) tempan = MAX( -1.0, MIN( 1.0, pb/(sqrtqb**3) ) ) thetab=ACOS(tempan) stabp =c7*(-2.0*SQRT(qb)*COS(thetab/3.0)+c5l) ELSE tb =(SQRT(-qb3pb2)+ABS(pb))**oned3 stabp =c7*(-(tb+qb/tb)+c5l) END IF ! !----------------------------------------------------------------------- ! ! According to equation (15) in Byun (1990). ! !----------------------------------------------------------------------- ! c8=gammahl*stabp y1=SQRT(1.0 - c8) y0=SQRT(1.0 - c8/ztdrou) psih=2.0*LOG((y1+1.0)/(y0+1.0)) ! !----------------------------------------------------------------------- ! ! Compute c_pt via equation (11) in Byun (1981). ! !----------------------------------------------------------------------- ! c_pt(i,j)=kv / (prantl0l*(LOG(ztdroup)-psih)) ELSE ! !----------------------------------------------------------------------- ! ! Stable case: See Louis et al (1981). ! !----------------------------------------------------------------------- ! a=kv/LOG(ztdroup) b=5.0 d=5.0 c=SQRT(1.0+d*bulkri) c_pt(i,j) = SQRT(1.0+2.0*b*bulkri/c) c_pt(i,j) = a*c_pt(i,j)/(prantl0l*(1.0+3.0*b*bulkri*c)) END IF END DO END DO RETURN END SUBROUTINE cptc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CUCWTR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cucwtr(nx,ny,nz,ibgn,iend,jbgn,jend,zp,soiltyp, & 1 wspd,ptsfc,pt1,c_uwtrneu,c_uwtr) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute C_u (friction velocity / wind speed) at sea case. The quantity ! C_uwtr is used by the subroutine SFCFLX to obtain surface fluxes for both ! unstable and stable cases. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong and X. Song ! 8/04/1994 ! ! MODIFICATION HISTORY: ! ! 2/27/95 (V.W. and X.S.) ! ! 1/12/96 (V.W. and X.S.) ! Changed the calculation related to zo. ! Added kvwtr to denote the Von Karman constant over the sea; ! Set a lower limiter for zo, zolimit, and an upper limiter for z1, z1limit. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn i-index where evaluation begins. ! iend i-index where evaluation ends. ! jbgn j-index where evaluation begins. ! jend j-index where evaluation ends. ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! ptsfc Potential temperature at the ground level (K) ! pt1 Potential temperature at the 1st scalar point above ! ground level, (K) ! ! OUTPUT: ! ! c_uwtr Friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: ibgn ! i-index where evaluation begins. INTEGER :: iend ! i-index where evaluation ends. INTEGER :: jbgn ! j-index where evaluation begins. INTEGER :: jend ! j-index where evaluation ends. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of staggered grid. INTEGER :: soiltyp(nx,ny) ! Soil type at each point. REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: ptsfc(nx,ny) ! Potential temperature at the ground level ! (K) REAL :: pt1 (nx,ny) ! Potential temperature at the 1st scalar ! point above ground level, (K) REAL :: c_uwtrneu(nx,ny) ! Frictional velocity (m/s) REAL :: c_uwtr(nx,ny) ! Frictional velocity (m/s) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: z1 ! The height of 1st scalar point above ! ground level (m) REAL :: zo ! Defined as surface momentum roughness ! length REAL :: zt ! Defined as surface heat transfer ! roughness length REAL :: dzo ! z1-zo REAL :: dzt ! z1-zt REAL :: z1dzo ! z1/zo REAL :: z1dzt ! z1/zt REAL :: xcdn ! Cdn (sea) REAL :: xcdh ! Hot-wired value of Cdh (sea) REAL :: bulkri ! Bulk Richardson number REAL :: stabp ! Monin-Obukhov STABility Parameter ! (zeta) REAL :: x1,psim ! Intermediate parameters needed REAL :: qb3pb2 REAL :: c7,c8 REAL :: sb,qb,pb,thetab,tb ! during computations REAL :: a,b,c,d REAL :: tempan,sqrtqb ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! xcdh = 1.1E-3 DO j=jbgn,jend DO i=ibgn,iend IF (soiltyp (i,j) == 13) THEN xcdn = (0.4+0.079*wspd(i,j)) * 1.e-3 z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) z1 = MIN(z1,z1limit) ! ! calculate zo and zt ! zo =0.032*xcdn*wspd(i,j)*wspd(i,j)/9.8 zo = MAX(zo,zolimit) zt = z1 * EXP( -kvwtr*SQRT(xcdn)/(prantl0w*xcdh) ) dzo = z1-zo z1dzo = z1/zo dzt = z1-zt z1dzt = z1/zt bulkri = (g/ptsfc(i,j))*(pt1(i,j)-ptsfc(i,j))*dzo*dzo/ & (dzt*wspd(i,j)*wspd(i,j)) IF (bulkri <= 0.0) THEN ! !----------------------------------------------------------------------- ! ! Unstable case: A modified formulation, which is similar to ! equations (28)-(34) in Byun (1990). ! !----------------------------------------------------------------------- ! bulkri = MAX (bulkri,-10.0) sb =bulkri/prantl0w qb=oned9*(c1w+c2w*sb*sb) pb=oned54*(c3w+c4w*sb*sb) qb3pb2=qb**3-pb*pb c7 = (z1*dzt/(dzo*dzo))*(ALOG(z1dzo)*ALOG(z1dzo)/ALOG(z1dzt)) IF( qb3pb2 >= 0.0 ) THEN sqrtqb = SQRT(qb) tempan = MAX( -1.0, MIN( 1.0, pb/(sqrtqb**3) ) ) thetab=ACOS(tempan) stabp =c7*(-2.0*SQRT(qb)*COS(thetab/3.0)+c5w) ELSE tb =(SQRT(-qb3pb2)+ABS(pb))**oned3 stabp =c7*(-(tb+qb/tb)+c5w) END IF ! !----------------------------------------------------------------------- ! ! According to a modified equation, which is similar to equation (14) ! in Byun (1990). ! !----------------------------------------------------------------------- ! c8=gammamw*stabp x1=(1. - c8)**0.25 psim=2.0*ALOG(0.5*(1.0+x1))+ALOG(0.5*(1.+x1*x1))- & 2.0*ATAN(x1)+ASIN(1.) ! !----------------------------------------------------------------------- ! ! Compute c_uwtr via equation (10) in Byun (1981). ! !----------------------------------------------------------------------- ! c_uwtr(i,j) =kv/(LOG(z1dzo)-psim) ELSE ! !----------------------------------------------------------------------- ! ! Stable case: See Louis et al (1981). ! !----------------------------------------------------------------------- ! a=kv/LOG(z1dzo) b=5.0 d=5.0 c=SQRT(1.0+d*bulkri) c_uwtr(i,j) = a/SQRT(1.0+2.0*b*bulkri/c) END IF END IF END DO END DO RETURN END SUBROUTINE cucwtr ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CPTCWTR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cptcwtr(nx,ny,nz,ibgn,iend,jbgn,jend,zp,soiltyp,wspd, & 1 ptsfc,pt1,c_ptwtrneu,c_ptwtr) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute c_ptwtr (the product of ustar and ptstar) at sea case. ! Note: a temperature scale defined as surface heat flux divided ! by the friction velocity. ! ! The quantity c_ptwtr is used by the subroutine SFCFLX to obtain ! surface fluxes for both the unstable and stable cases. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong and X. Song ! 8/04/1994 ! ! MODIFICATION HISTORY: ! ! 2/27/95 (V.W. and X.S.) ! ! 1/12/96 (V.W. and X.S.) ! Changed the calculation related to zo over the sea. ! Added kvwtr to denote the Von Karman constant over the sea; ! Set a lower limiter for zo, zolimit, and an upper limiter for z1, z1limit. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! iend i-index where evaluation ends. ! jend j-index where evaluation ends. ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! ptsfc Potential temperature at the ground level (K) ! pt1 Potential temperature at the 1st scalar point above ! ground level, (K) ! ! ! OUTPUT: ! ! c_ptwtr The product of ustar and ptstar. ptstar is temperature ! scale (K), defined by surface heat flux / friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: ibgn ! i-index where evaluation begins. INTEGER :: iend ! i-index where evaluation ends. INTEGER :: jbgn ! j-index where evaluation begins. INTEGER :: jend ! j-index where evaluation ends. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of staggered grid. INTEGER :: soiltyp(nx,ny) ! Soil type at each point. REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: ptsfc(nx,ny) ! Potential temperature at the ground level ! (K) REAL :: pt1 (nx,ny) ! Potential temperature at the 1st scalar ! point above ground level, (K) REAL :: c_ptwtrneu(nx,ny) ! Product of ustar and ptstar REAL :: c_ptwtr(nx,ny) ! Product of ustar and ptstar ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: z1 ! The height of 1st scalar point above ! ground level (m) REAL :: zo ! Defined as surface momentum roughness ! length REAL :: zt ! Defined as surface heat transfer ! roughness length REAL :: dzo ! z1-zo REAL :: dzt ! z1-zt REAL :: z1dzo ! z1/zo REAL :: z1dzt ! z1/zt REAL :: xcdn ! Cdn (sea) REAL :: xcdh ! Hot-wired value of Cdh (sea) REAL :: bulkri ! Bulk Richardson number REAL :: stabp ! Monin-Obukhov STABility Parameter ! (zeta) REAL :: y1,y0,psih ! Intermediate parameters needed REAL :: qb3pb2 REAL :: c7,c8 REAL :: sb,qb,pb,thetab,tb ! during computations REAL :: a,b,c,d REAL :: tempan,sqrtqb ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! xcdh = 1.1E-3 DO j=jbgn,jend DO i=ibgn,iend IF ( soiltyp(i,j) == 13) THEN xcdn = (0.4+0.07*wspd(i,j)) * 1.e-3 z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) z1 = MIN(z1,z1limit) ! ! calculate zo and zt ! zo =0.032*xcdn*wspd(i,j)*wspd(i,j)/9.8 zo = MAX(zo,zolimit) zt = z1 * EXP( -kv*SQRT(xcdn)/(prantl0w*xcdh) ) dzo = z1-zo z1dzo = z1/zo dzt = z1-zt z1dzt = z1/zt bulkri = (g/ptsfc(i,j))*(pt1(i,j)-ptsfc(i,j))*dzo*dzo/ & (dzt*wspd(i,j)*wspd(i,j)) IF (bulkri <= 0.0) THEN ! !----------------------------------------------------------------------- ! ! Unstable case: A modified formulation, which is similar to ! equations (28)-(34) in Byun (1990). ! !----------------------------------------------------------------------- ! bulkri = MAX (bulkri,-10.0) sb =bulkri/prantl0w qb=oned9*(c1w+c2w*sb*sb) pb=oned54*(c3w+c4w*sb*sb) qb3pb2=qb**3-pb*pb c7 = (z1*dzt/(dzo*dzo))*(ALOG(z1dzo)*ALOG(z1dzo)/ALOG(z1dzt)) IF( qb3pb2 >= 0.0 ) THEN sqrtqb = SQRT(qb) tempan = MAX( -1.0, MIN( 1.0, pb/(sqrtqb**3) ) ) thetab=ACOS(tempan) stabp =c7*(-2.0*SQRT(qb)*COS(thetab/3.0)+c5w) ELSE tb =(SQRT(-qb3pb2)+ABS(pb))**oned3 stabp =c7*(-(tb+qb/tb)+c5w) END IF ! !----------------------------------------------------------------------- ! ! According to a modified equation, which is similar to equation (14) ! in Byun (1990). ! !----------------------------------------------------------------------- ! c8=gammamw*stabp y1=SQRT(1.0 - c8) y0=SQRT(1.0 - c8/z1dzt) psih=2.0*ALOG((y1+1.0)/(y0+1.0)) ! !----------------------------------------------------------------------- ! ! Compute ptstar via equation (11) in Byun (1981). ! !----------------------------------------------------------------------- ! c_ptwtr(i,j)=kv / (prantl0w*(ALOG(z1dzt)-psih)) ELSE ! !----------------------------------------------------------------------- ! ! Stable case: With the modified formulation in Louis et al (1981). ! !----------------------------------------------------------------------- ! a=kv*kv/(prantl0w*LOG(z1dzo)*LOG(z1dzt)) b=5.0 d=5.0 c=SQRT(1.0+d*bulkri) c_ptwtr(i,j) = SQRT(1.0+2.0*b*bulkri/c) c_ptwtr(i,j) = a*c_ptwtr(i,j)/(prantl0l*(1.0+3.0*b*bulkri*c)) END IF END IF END DO END DO RETURN END SUBROUTINE cptcwtr ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CUNEUWTR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cuneuwtr(nx,ny,nz,ibgn,iend,jbgn,jend,soiltyp, & 1 wspd, c_uneu) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute c_uneu (friction velocity) at the neutral state. The quantity ! c_uneu is used by the subroutine SFCFLX to obtain surface fluxes. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong and X. Song ! 8/04/1994 ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn i-index where evaluation begins. ! iend i-index where evaluation ends. ! jbgn j-index where evaluation begins. ! jend j-index where evaluation ends. ! ! soiltyp Soil type at each point ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! ! ! OUTPUT: ! ! c_uneu Friction velocity at sea case. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: ibgn ! i-index where evaluation begins. INTEGER :: iend ! i-index where evaluation ends. INTEGER :: jbgn ! j-index where evaluation begins. INTEGER :: jend ! j-index where evaluation ends. INTEGER :: soiltyp(nx,ny) ! Soil type at each point. REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: c_uneu (nx,ny) ! Frictional velocity (m/s) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! DO j=jbgn,jend DO i=ibgn,iend IF (soiltyp(i,j) == 13) THEN c_uneu(i,j) = SQRT ((0.4+0.079*wspd(i,j)) * 1.e-3) END IF END DO END DO RETURN END SUBROUTINE cuneuwtr ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CPTNEUWTR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cptneuwtr(nx,ny,nz,ibgn,iend,jbgn,jend, & 1 soiltyp,wspd,c_uneu,c_ptwtrneu) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong and X. Song ! 8/04/1994 ! ! MODIFICATION: ! ! 03/17/1997 (Yuhe Liu and Vince Wong) ! Fixed a bug. Variable c_ptwtrneu was calculated in its inverse. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ibgn i-index where evaluation begins ! iend i-index where evaluation ends ! jbgn j-index where evaluation begins ! jend j-index where evaluation ends ! ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! ! OUTPUT: ! ! c_ptwtrneu Temperature scale (K), defined by ! surface heat flux / friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: ibgn ! i-index where evaluation begins. INTEGER :: iend ! i-index where evaluation ends. INTEGER :: jbgn ! j-index where evaluation begins. INTEGER :: jend ! j-index where evaluation ends. INTEGER :: soiltyp (nx,ny) REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: c_uneu (nx,ny) ! REAL :: c_ptwtrneu(nx,ny) ! Temperature scale (K) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: xcdh ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! xcdh = 1.14E-3 DO i=ibgn,iend DO j=jbgn,jend IF (soiltyp(i,j) == 13) THEN c_ptwtrneu(i,j) = xcdh/c_uneu(i,j) END IF END DO END DO RETURN END SUBROUTINE cptneuwtr ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE PBLDEPTH ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE pbldepth(nx,ny,nz, u,v,w,ptprt,qv,ptbar,zp,j3, ptsflx, & 1,2 pbldpth) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calcualte time-dependent PBL depth. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong and X. Song ! 8/27/1994 ! ! Reference for option pbldopt=3 (not included yet): ! ! 1)" Simple Model of the Daytime Boundary Layer Height" by S-E. ! Gryning and E. Batchvarova in 9th Symposium on Turbulence and ! Diffusion, 379-382 (1990). ! 2) "A Rate Equation for the Nocturnal Boundary-Layer Height" by ! F.T.M. Nieuwatadt and H. Tennekes in J. of Atmospheric Sciences ! July 1981, pp. 1418-1428. ! ! MODIFICATIONS: ! ! 3/6/1996 (M. Xue, V. Wong and Y. Liu) ! Added option 2 for diagnostic calculatin of PBL depth. ! ! 06/06/96 (Ming Xue and Jinxing Zong) ! PBL depth is now determined to be at the level where environmental ! virtual potential temperate equals that at the first grid level. ! Subroutine PBLDEPTH in sfcphy3d.f was modified. ! ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! ! u Total u-velocity (m/s) ! v Total v-velocity (m/s) ! w Total w-velocity (m/s) ! ptprt Perturbation potential temperature (K) ! qv Specific humidity (kg/kg) ! ! ptbar Base state potential temperature (K) ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! j3 Coordinate transformation Jacobian d(zp)/d(z) ! ! OUTPUT: ! ! pbldpth Planetary boundary layer depth (m) ! ! TEMPORARY: ! ! ptv0 Work array for virtual pot. temp. at k=2 for scalar ! ptv Work array for virtual pot. temp. ! parea Work array for positive area ! narea Work array for negative area ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: nt ! Number of time levels PARAMETER( nt=3 ) REAL :: u (nx,ny,nz) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: qv (nx,ny,nz) ! Specific humidity (kg/kg) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of staggered grid. REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian d(zp)/d(z) REAL :: ptsflx (nx,ny) ! Surface heat flux (K*kg/(s*m**2)) REAL :: pbldpth(nx,ny,nt) ! Planetary boundary layer depth (m) REAL :: ptv0 (nx,ny) ! Temporary work array REAL :: ptv (nx,ny) ! Temporary work array REAL :: parea (nx,ny) ! Temporary work array REAL :: narea (nx,ny) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j, k REAL :: zptk0,ptvk0,zptk1,ptvk1,eps, amax,amin INTEGER :: pbldepth_set ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! IF ( pbldopt == 1 ) THEN DO i=1,nx-1 DO j=1,ny-1 pbldpth(i,j,2)=pbldpth0 END DO END DO ELSE IF ( pbldopt == 2 ) THEN ! !----------------------------------------------------------------------- ! ! Diagnose the PBL depth based on the virtual potential temperature ! profile. The PBL top is assumed to be at the level where the ! environmental virtual potential temperature exceeds that at the ! surface (first level above ground). If the atmosphere is stable ! right above ground, the PBL depth is set to the thickness of the ! layer below the first scalar point above ground. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 ptv0(i,j)=(ptbar(i,j,2)+ptprt(i,j,2))*(1.+0.608*qv(i,j,2)) parea(i,j) = 0.0 narea(i,j) = 0.0 pbldpth(i,j,2)=0.0 ! Set the initial depth to zero. ! pbldpth also acts as a flag. END DO END DO eps = 1.0E-6 ! DO k=3,nz-1 DO j=1,ny-1 DO i=1,nx-1 IF( ABS(pbldpth(i,j,2)) < eps ) THEN ! Check if pbldpth has been set. ptvk1=(ptbar(i,j,k ) + ptprt(i,j,k )) & * (1. + 0.608*qv(i,j,k )) ptvk0=(ptbar(i,j,k-1) + ptprt(i,j,k-1)) & * (1. + 0.608*qv(i,j,k-1)) zptk0 = 0.5*(zp(i,j,k)+zp(i,j,k-1)) zptk1 = 0.5*(zp(i,j,k+1)+zp(i,j,k)) IF( ptvk1 > ptv0(i,j) ) THEN pbldpth(i,j,2) = zptk0 + (zptk1-zptk0)* & (ptv0(i,j)-ptvk0)/(ptvk1-ptvk0) - zp(i,j,2) END IF END IF END DO END DO END DO !----------------------------------------------------------------------- ! ! When no stable layer is found above, the PBL top is at the model top. ! The minimum PBL top height is at the first scalar point above ground. ! !----------------------------------------------------------------------- pbldepth_set = 1 DO j=1,ny-1 DO i=1,nx-1 IF(pbldpth(i,j,2) == 0.0) THEN pbldpth(i,j,2)=zp(i,j,nz-1)-zp(i,j,2) WRITE(6,'(/1x,a,a,2i4, 2(/1x,a,a))') & 'Warning: The PBL is found to extend ', & 'the entire model domain at i,j=',i,j, & 'The atmosphere is either neutral or ', & 'unstable throughout the domain depth.', & 'In this case, PBL parameterization, if used, will operate', & ' on the entire domain depth.' pbldepth_set = 0 END IF pbldpth(i,j,2) = & MAX(pbldpth(i,j,2), 0.5*(zp(i,j,3)-zp(i,j,2))) END DO END DO IF(pbldepth_set == 0)THEN CALL a3dmax0(ptv0,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))')'Max sfc virtual temperature =',amax END IF ELSE IF ( pbldopt == 3 ) THEN WRITE(6,'(/5x,a,i3,a,2(/5x,a))') & 'PBL depth calculation option=',pbldopt,' not avaiable.', & 'please reset parameter pbldopt in input file. ', & 'Program stopped in PBLDEPTH.' CALL arpsstop('arpsstop called from PBLDEPTH pbldopt incorrect ',1) END IF RETURN END SUBROUTINE pbldepth