! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SFCPHYSICS ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE sfcphysics(nx,ny,nz,nzsoil,nstyps, & 1,52 u,v,w,ptprt,pprt,qv,qr, & rhostr,ptbar,pbar,qvbar, & x,y,z, zp,zpsoil,j1,j2,j3,j3soil,j3inv,j3soilinv,prcrate, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth,qvsfc, & radsw,rnflx,radswnet,radlwin, & cdm,cdh,cdq,usflx,vsflx,ptsflx,qvsflx,pbldpth,tsdiffus, & tem1soil,tem2soil,tem3soil,tem4soil,tem1,tem2,tem3,tem4, & tem5,shflx,lhflx,gflx,ct,evaprg,evaprtr,evaprr,qvsat,qvsata, & f34,temxy1,temxy2,temxy3,temxy4,temxpy) ! !----------------------------------------------------------------------- ! ! 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 ! nzsoil Number of grid points in the soil ! ! 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 ! zpsoil 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) ! j3soil Coordinate transformation Jacobian, d(zpsoil)/d(z) ! j3inv Inverse of j3 ! j3soilinv Inverse of j3soil ! ! 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 ! radswnet Net solar radiation, SWin - SWout ! radlwin Incoming longwave radiation ! ! 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: ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! 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 INTEGER :: nzsoil ! The number grid points in the soil 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 :: zpsoil (nx,ny,nzsoil) ! The depth of the soil. 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 REAL :: j3soil (nx,ny,nzsoil) ! Coordinate transformation ! Jacobian d(zpsoil)/d(zsoil) REAL :: j3inv (nx,ny,nz) ! Inverse of j3 REAL :: j3soilinv (nx,ny,nzsoil) ! Inverse of j3soil 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 :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) 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 :: radswnet(nx,ny) ! Net solar radiation, SWin - SWout REAL :: radlwin(nx,ny) ! Incoming longwave radiation 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 REAL :: tem1 (nx,ny,nz) ! Temporary array REAL :: tem2 (nx,ny,nz) ! Temporary array REAL :: tem3 (nx,ny,nz) ! Temporary array REAL :: tem4 (nx,ny,nz) ! Temporary array REAL :: tem5 (nx,ny,nz) ! Temporary array REAL :: tsdiffus (nx,ny,nzsoil) ! Temporary array REAL :: tem1soil (nx,ny,nzsoil) ! Temporary array REAL :: tem2soil (nx,ny,nzsoil) ! Temporary array REAL :: tem3soil (nx,ny,nzsoil) ! Temporary array REAL :: tem4soil (nx,ny,nzsoil) ! Temporary array !----------------------------------------------------------------------- ! 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, k, is, nsmth REAL :: tema,temb REAL :: gumove,gvmove REAL :: nsfcstsave INTEGER :: lfn,tmstrln CHARACTER (LEN=256) :: soiloutfl,temchar CHARACTER (LEN=80 ) :: timsnd ! !----------------------------------------------------------------------- ! ! 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. ! !----------------------------------------------------------------------- ! usflx (:,:) = 0.0 vsflx (:,:) = 0.0 ptsflx(:,:) = 0.0 qvsflx(:,:) = 0.0 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 ! roufns(i,j) = 0.03 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) = tsoil(i,j,1,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 tsoil(:,:,:,0) = 0.0 qsoil(:,:,:,0) = 0.0 wetcanp(:,:,0) = 0.0 qvsfc(:,:,0) = 0.0 usflx (:,:) = 0.0 vsflx (:,:) = 0.0 ptsflx(:,:) = 0.0 qvsflx(:,:) = 0.0 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) = tsoil(i,j,1,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 tsoil, qvsfc, qsoil, ! and wetcanp. They will be used by the next step. !----------------------------------------------------------------------- CALL set_acct(soil_acct) IF (soilmodel_option == 1) THEN ! Force-restore scheme CALL soilebm(nx,ny,nz, & soiltyp(1,1,is),vegtyp,lai,veg, & tsoil(1,1,1,is),tsoil(1,1,2,is),qsoil(1,1,1,is), & qsoil(1,1,2,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) ELSE IF (soilmodel_option == 2) THEN ! Implicit scheme CALL ousoil(nx,ny,nz,nzsoil,zpsoil,j3soil,j3soilinv, & soiltyp(1,1,is),vegtyp,lai,veg, & tsoil(1,1,1,is),qsoil(1,1,1,is), & wetcanp(1,1,is),snowdpth,qvsfc(1,1,is), & wdspsfc,psfc,rhosfc,prcrate, & tair,qvair,cdm,cdh,cdq,radsw,rnflx, radswnet, radlwin, & shflx,lhflx,gflx,ct,evaprg,evaprtr,evaprr,qvsat,qvsata,f34, & tem1soil,tem2soil,tem3soil,tem4soil,tsdiffus,tem1(1,1,1), & tem2(1,1,2),tem2(1,1,3) ) END IF !----------------------------------------------------------------------- ! 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 k=1,nzsoil DO j=1,ny-1 DO i=1,nx-1 tsoil (i,j,k,0) = tsoil (i,j,k,0) & + tsoil (i,j,k,is)*stypfrct(i,j,is) qsoil (i,j,k,0) = qsoil (i,j,k,0) & + qsoil (i,j,k,is)*stypfrct(i,j,is) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 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) IF(mp_opt > 0 .AND. joindmp > 0) THEN CALL wrtjoinsoil( nx,ny,nzsoil,nstyps, soiloutfl(1:lfn),dx,dy,zpsoil, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & 1,1,1,1,1, & tsoil,qsoil,wetcanp,snowdpth,soiltyp) ELSE CALL wrtsoil( nx,ny,nzsoil,nstyps, soiloutfl(1:lfn),dx,dy,zpsoil, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & 1,1,1,1,1, & tsoil,qsoil,wetcanp,snowdpth,soiltyp) CALL soilcntl( nx,ny,nzsoil,zpsoil,soiloutfl,1,1,1,1,1, x,y) END IF END IF END IF ! !----------------------------------------------------------------------- ! ! Update the boundary zone fluxes. ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN CALL acct_interrupt(mp_acct) CALL mpsendrecv1dew(usflx,nx,ny,ebc,wbc,1,temxpy) CALL mpsendrecv1dns(usflx,nx,ny,nbc,sbc,1,temxpy) CALL mpsendrecv1dew(vsflx,nx,ny,ebc,wbc,2,temxpy) CALL mpsendrecv1dns(vsflx,nx,ny,nbc,sbc,2,temxpy) CALL mpsendrecv1dew(ptsflx,nx,ny,ebc,wbc,0,temxpy) CALL mpsendrecv1dns(ptsflx,nx,ny,nbc,sbc,0,temxpy) CALL mpsendrecv1dew(qvsflx,nx,ny,ebc,wbc,0,temxpy) CALL mpsendrecv1dns(qvsflx,nx,ny,nbc,sbc,0,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 mpsendrecv1dew(usflx,nx,ny,ebc,wbc,1,temxpy) CALL mpsendrecv1dns(usflx,nx,ny,nbc,sbc,1,temxpy) CALL mpsendrecv1dew(vsflx,nx,ny,ebc,wbc,2,temxpy) CALL mpsendrecv1dns(vsflx,nx,ny,nbc,sbc,2,temxpy) CALL mpsendrecv1dew(ptsflx,nx,ny,ebc,wbc,0,temxpy) CALL mpsendrecv1dns(ptsflx,nx,ny,nbc,sbc,0,temxpy) CALL mpsendrecv1dew(qvsflx,nx,ny,ebc,wbc,0,temxpy) CALL mpsendrecv1dns(qvsflx,nx,ny,nbc,sbc,0,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,nzsoil,x,y,zpsoil, & soiltyp(1,1,1),vegtyp,lai,roufns,veg,zp(1,1,2), & tsoil(1,1,1,0),qsoil(1,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, & tem1soil) 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,c_u) 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 (soilmodel_option == 1) THEN 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) ! ELSE IF (soilmodel_option == 2) THEN ! IF ( soiltyp(i,j) == 13 .AND. cdhwtropt == 1 ) THEN ! cdh(i,j) = cdhwtr ! ELSE ! cdh(i,j) = c_pt(i,j) ! cdq(i,j) = 0.7*cdh(i,j) ! END IF ! END IF 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 REAL, PARAMETER :: epsilon = 1.0E-6 ! !----------------------------------------------------------------------- ! ! 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) ! Original Zt formulation !--------------------------------------------------------------------- ! Test of new thermal roughness equation (Chen/Dudhia 2001) (JAB) !--------------------------------------------------------------------- ! The following was commented out temporarily because variable psim ! is used before it is initilized. It need to be taken care of later. ! ! dz0 = 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 ! c_u(i,j) =kv/(LOG(z1droup)-psim) ! ELSE ! 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 ! ! zt = (0.4*c_u(i,j)/0.000024) + 100.0 ! ! IF (abs(zt) > epsilon ) THEN ! zt = 1.0/zt ! ELSE IF (abs(zt) <= epsilon ) THEN ! zt = ztz0*roufns(i,j) ! END IF ! !---------------------------------------------------------------------- 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,c_u) ! !----------------------------------------------------------------------- ! ! 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) REAL :: c_u (nx,ny) ! Friction 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 :: 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 REAL, PARAMETER :: epsilon = 1.0E-6 ! !----------------------------------------------------------------------- ! ! 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) !--------------------------------------------------------------------- ! Test of new thermal roughness equation (Chen/Dudhia 2001) (JAB) !--------------------------------------------------------------------- zt = (0.4*c_u(i,j)/0.000024) + 100.0 IF (abs(zt) > epsilon ) THEN zt = 1.0/zt ELSE IF (abs(zt) <= epsilon ) THEN zt = ztz0*roufns(i,j) END IF !---------------------------------------------------------------------- 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)) !------------------------------------------------------------------- ! Soilmodel_option = 2 (Implicit) !-------------------------------------------------------------------- ! IF (soilmodel_option == 2) THEN ! ! IF (bulkri <= 0.0) THEN !--------------------------------------------------------------------- ! Unstable case !--------------------------------------------------------------------- ! ! stabp = 1.0 - ( (15.0 * bulkri) / & ! ( 1.0 + 7.5 * (10.0*kv*kv/(LOG(z1drou)*LOG(ztdrou))) * & ! sqrt(-bulkri * z1drou) ) ) ! ! ELSE !--------------------------------------------------------------------- ! Stable case !--------------------------------------------------------------------- ! ! stabp = EXP(-bulkri) ! ! END IF ! ! c_pt(i,j) = kv*kv*stabp / (LOG(z1drou)*LOG(ztdrou)) ! ! END IF !soilmodel_option = 2 !------------------------------------------------------------------- !------------------------------------------------------------------- ! Soilmodel_option = 1 (Force-Restore) !------------------------------------------------------------------ ! IF (soilmodel_option == 1) THEN 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 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 j=jbgn,jend DO i=ibgn,iend 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 j=1,ny-1 DO i=1,nx-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