! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE MICROPH ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE microph(nx,ny,nz, dtbig1, & 1,4 ptprt,pprt,qv,qc,qr,qi,qs,qh,raing,prcrate, & rhostr,pbar,ptbar,ppi,j3,j3inv, & rhobar,p,lathvt,tem1,tem2,tem3) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate and apply the microphysical contributions to the water ! and temperature fields. The current version implements the Kessler ! warm rain microphysics parameterization scheme. Ice processes are ! not included in this version. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/1991. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/28/92 (K. Brewster) ! Further facelift. ! ! 11/08/98 (K. Brewster) ! Added calculation of total p and pi for use in revap and satadj ! !----------------------------------------------------------------------- ! ! 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 ! ! dtbig1 Big time step size (s) ! ptprt Perturbation potential temperature at all time levels (K) ! pprt Perturbation pressure at all time levels (Pascal) ! qv Water vapor specific humidity at all time levels (kg/kg) ! qc Cloud water mixing ratio at all time levels (kg/kg) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! qi Cloud ice mixing ratio at all time levels (kg/kg) ! qs Snow mixing ratio at all time levels (kg/kg) ! qh Hail mixing ratio at all time levels (kg/kg) ! raing Accumulated grid-scale rainfall (mm) ! ! rhostr Base state air density times j3 (kg/m**3) ! pbar Base state pressure (Pascal) ! ptbar Base state potential temperature (K) ! ppi Exner function at tfuture ! j3 Coordinate transformation Jacobian d(zp)/dz ! ! OUTPUT: ! ! ptprt Perturbation potential temperature at time tfuture (K) ! pprt Perturbation pressure at time tfuture (Pascal) ! qv Water vapor specific humidity at time tfuture (kg/kg) ! qc Cloud water mixing ratio at time tfuture (kg/kg) ! qr Rainwater mixing ratio at time tfuture (kg/kg) ! qi Cloud ice mixing ratio at time tfuture (kg/kg) ! qs Snow mixing ratio at time tfuture (kg/kg) ! qh Hail mixing ratio at time tfuture (kg/kg) ! raing Accumulated grid-scale rainfall (mm) ! prcrate Precipitation rate (kg/(m**2*s)) ! ! WORK ARRAYS: ! ! rhobar Base state air density (kg/m**3) ! lathvt Temperature-dependent latent heat of evaporation ! p Total pressure at tfuture ! tem1 Temporary work array. ! tem2 Temporary work array. ! tem3 Temporary work array. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INCLUDE 'timelvls.inc' ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions ! REAL :: dtbig1 ! Big time step size (s) REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz,nt) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz,nt) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz,nt) ! Rainwater mixing ratio (kg/kg) REAL :: qi (nx,ny,nz,nt) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz,nt) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz,nt) ! Hail mixing ratio (kg/kg) REAL :: raing (nx,ny) ! Accumulated grid-scale rainfall (mm) REAL :: prcrate(nx,ny) ! Precipitation rate (kg/(m**2*s)) REAL :: rhostr(nx,ny,nz) ! Base state air density times j3 (kg/m**3) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal). REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian defined as ! d( zp )/d( z ). REAL :: ppi (nx,ny,nz) ! Exner function at tfuture REAL :: j3inv (nx,ny,nz) ! Coordinate transformation Jacobian defined as ! d( zp )/d( z ). ! !----------------------------------------------------------------------- ! ! Temporary arrays ! !----------------------------------------------------------------------- ! REAL :: p (nx,ny,nz) ! Total pressure at tfuture (Pa) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: lathvt(nx,ny,nz) ! Temperature dependent latent heat ! of evaporation. Local array REAL :: tem1(nx,ny,nz) ! Temporary work array REAL :: tem2(nx,ny,nz) ! Temporary work array REAL :: tem3(nx,ny,nz) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! ! INTEGER :: i,j,k,INDEX REAL :: tk ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Since rhobar is used most often in the microphysics parameterizations, ! we calculate and save rhobar for later use. ! !----------------------------------------------------------------------- ! DO k = 1,nz-1 DO j = 1,ny-1 DO i = 1,nx-1 rhobar(i,j,k) = rhostr(i,j,k)*j3inv(i,j,k) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! To remove negative mixing ratios, which result from computational ! inaccuracies in the advection process, we set all negative mixing ! ratios to zero. This is an artificial adjustment and, as a result, ! total water will not be conserved. The adjustment can be averted ! by enhancing the numerical accuracy of subsequent model versions. ! !----------------------------------------------------------------------- ! DO k = 1,nz DO j = 1,ny DO i = 1,nx qv(i,j,k,tfuture) = MAX(0.0,qv(i,j,k,tfuture)) qc(i,j,k,tfuture) = MAX(0.0,qc(i,j,k,tfuture)) qr(i,j,k,tfuture) = MAX(0.0,qr(i,j,k,tfuture)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Use the look up table to calculate the temperature dependent ! latent heat of evaporation lathvt. ! Also calculate Exner function. ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 p(i,j,k) = pprt(i,j,k,tfuture)+pbar(i,j,k) tk = (ptprt(i,j,k,tfuture)+ptbar(i,j,k)) * ppi(i,j,k) INDEX = MAX( MIN(151, nint(tk-172.15)), 1) lathvt(i,j,k) = latheatv(INDEX) END DO END DO END DO IF( mphyopt /= 0 .OR. cnvctopt == 2) THEN ! ! !----------------------------------------------------------------------- ! ! Calculate the autoconversion of cloud water to rainwater ! and the accretion (collection) of cloud droplets by rain drops. ! !----------------------------------------------------------------------- ! CALL autocac(nx,ny,nz, dtbig1, qc,qr) ! ! !----------------------------------------------------------------------- ! ! Rainwater evaporates when the air is subsaturated. Under these ! conditions, water vapor specific humidity increases at the expense ! of rainwater and the air is subsequently cooled due to evaporation. ! ! The evaporation rate is subject to certain specified limits. ! Rainwater, water vapor and temperature fields are then adjusted. ! !----------------------------------------------------------------------- ! CALL revap(nx,ny,nz, dtbig1,ptprt,qv,qr, & rhobar,ptbar,p,ppi,lathvt, tem1,tem2) ! !----------------------------------------------------------------------- ! ! RAINWATER SEDIMENTATION ! ! Calculate the rain fallout rate and apply it to the rain ! water field. ! ! Since the rainwater fallout is an advective process, ! negative values of rainwater can be generated by the finite ! difference scheme. If this occurs, we set the negative water ! content to zero. ! !----------------------------------------------------------------------- ! !call test_check_in("Bqrfall") CALL qrfall (nx,ny,nz,dtbig1, & qr,rhobar,j3,j3inv,raing,prcrate, & tem1,tem2,tem3) !call test_check_in("Aqrfall") ! DO k = 1,nz DO j = 1,ny DO i = 1,nx qr(i,j,k,tfuture) = MAX(0.0,qr(i,j,k,tfuture)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! SATURATION ADJUSTMENT ! (CONDENSATION AND EVAPORATION BETWEEN QV AND QC) ! ! Under the conditions of supersaturation, condensation occurs ! which converts water vapor to cloud water. ! . ! ! If the air is subsaturated, cloud water evaporates and becomes ! water vapor until either the air is saturated or the cloud water ! has completely evaporated. ! ! During these processes, the air temperature changes. ! ! Adjust the potential temperature, water vapor and cloud water ! accordingly. ! !----------------------------------------------------------------------- ! ! END IF CALL satadj(nx,ny,nz, ptprt,qv,qc,ptbar, & p,ppi,lathvt, tem1,tem2,tem3) DO k = 1,nz DO j = 1,ny DO i = 1,nx qv(i,j,k,tfuture) = MAX(0.0,qv(i,j,k,tfuture)) qc(i,j,k,tfuture) = MAX(0.0,qc(i,j,k,tfuture)) qr(i,j,k,tfuture) = MAX(0.0,qr(i,j,k,tfuture)) END DO END DO END DO ! RETURN END SUBROUTINE microph ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE AUTOCAC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE autocac(nx,ny,nz, dtbig1, qc,qr) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the autoconversion of cloud water to rainwater and the ! accretion (collection) of cloud droplets by rain drops. ! First calculate the conversion and accretion rates, then impose ! limits on the amount of conversion and accretion. Adjust the ! cloud and rainwater fields accordingly. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/1991. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/28/92 (K. Brewster) ! Further facelift. ! ! 6/10/94 (M Xue & A. Sathye) ! Power calculation for the accretion rate is replaced by a ! lookup table function. ! ! 07/10/97 (Fanyou Kong - CMRP) ! Include MPDCD advection option (sadvopt = 5) ! ! 11/18/98 (Keith Brewster) ! Changed pibar to ppi (full pi). ! !----------------------------------------------------------------------- ! ! 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 ! ! qc Cloud water mixing ratio at all time levels (kg/kg) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! ! OUTPUT: ! ! qc Cloud water mixing ratio at time tfuture (kg/kg) ! qr Rainwater mixing ratio at time tfuture (kg/kg) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nt ! The no. of t-levels of t-dependent arrays. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present time. INTEGER :: tfuture ! Index of time level for the future time. PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3) ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions REAL :: dtbig1 ! Big time step size (s) REAL :: qc (nx,ny,nz,nt) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz,nt) ! Rainwater mixing ratio (kg/kg) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! ! INTEGER :: i,j,k,lvlq REAL :: deltat,qcplus,qrplus,ar,arcrdt,cr REAL :: temp, f1, f2, rstep INTEGER :: INDEX ! ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! lvlq = tfuture ! !----------------------------------------------------------------------- ! ! When water and temperture fields are advected using leapfrog scheme: ! (if using forward scheme, deltat = dtbig1.) ! !----------------------------------------------------------------------- ! !C IF( sadvopt.ge.1.and.sadvopt.le.3.or.sadvopt.eq.5) THEN ! Leapfrog scheme IF( sadvopt /= 4) THEN ! Leapfrog scheme deltat = 2*dtbig1 ELSE ! Forward scheme deltat = dtbig1 END IF ! !----------------------------------------------------------------------- ! ! Autoconversion rate of cloud water to rainwater: ! ! AR = autort * (QC - autotr) ! ! autort : Autoconversion rate parameter (defined in globcst.inc) ! autotr: Threshold value for the autoconversion process to begin. ! ! ! Accretion (collection) rate of cloud water by rainwater ! ! CR = accrrt * QC * (QR ** 0.875) ! ! accrrt: Accretion rate multiplier (defined in globcst.inc) ! !----------------------------------------------------------------------- rstep = 1.0/50.0E-6 DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ! !----------------------------------------------------------------------- ! ! Take only the positive values of qc and qr. ! !----------------------------------------------------------------------- ! qcplus = MAX(0.0, qc(i,j,k,lvlq) ) qrplus = MAX(0.0, qr(i,j,k,lvlq) ) ! !----------------------------------------------------------------------- ! ! The autoconversion rate: ! !----------------------------------------------------------------------- ! ar = autort *( qcplus - autotr) ! !----------------------------------------------------------------------- ! ! Autoconversion only occurs when qc > autotr ! i.e., AR calculated above should be >0.0 ! !----------------------------------------------------------------------- ! ar = MAX(0.0, ar) arcrdt = MIN( ar*deltat, qcplus ) qc(i,j,k,lvlq) = qc(i,j,k,lvlq) - arcrdt qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + arcrdt qcplus = MAX(0.0, qc(i,j,k,lvlq) ) qrplus = MAX(0.0, qr(i,j,k,lvlq) ) ! !----------------------------------------------------------------------- ! ! Accretion rate: ! ! CR = accrrt * QC * (QR ** 0.875) ! ! Here a linear interpolation from a lookup table data is used to ! evaluate power function qr ** 0.875 ! for which it is assumed that 0.0=< qr =< 0.05. ! !----------------------------------------------------------------------- ! temp = MIN(0.05, qrplus)*rstep INDEX = INT(temp) f1 = pwr875(INDEX) f2 = pwr875(INDEX + 1) cr = accrrt * qcplus * (f1 + ((f2 - f1) * (temp - INDEX) )) ! !----------------------------------------------------------------------- ! ! Calculate the total conversion from cloud water to rainwater due ! to autoconversion and accretion. This should not exceed the ! amount of cloud water present: ! !----------------------------------------------------------------------- ! ! arcrdt = min( (ar + cr)*deltat, qcplus ) arcrdt = MIN( cr*deltat, qcplus ) ! !----------------------------------------------------------------------- ! ! Update qc and qr to account for loss in cloud water ! and gain in rainwater. ! !----------------------------------------------------------------------- qc(i,j,k,lvlq) = qc(i,j,k,lvlq) - arcrdt qr(i,j,k,lvlq) = qr(i,j,k,lvlq) + arcrdt END DO END DO END DO RETURN END SUBROUTINE autocac ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE REVAP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE revap(nx,ny,nz, dtbig1,ptprt,qv,qr, & 1,1 rhobar,ptbar,p,ppi, lathvt, qvs, tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the rainwater evaporation rate. Apply these changes ! to QR and QV and then adjust the potential temperature PTPRT ! due to the evaporative cooling. ! ! Rainwater evaporates when the air is subsaturated. Under these ! conditions, water vapor specific humidity increases at the expense ! of rainwater and the air is subsequently cooled due to evaporation. ! ! The evaporation rate is subject to certain specified limits. ! Rainwater, water vapor and temperature fields are then adjusted. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 2/29/1992. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/28/92 (K. Brewster) ! Further facelift. ! ! 6/10/94 (M Xue & A. Sathye) ! Power calculations are replaced by lookup table functions. ! ! 11/08/98 (K. Brewster) ! Changed calculation of qvs to be based on total pi and p, not pbar ! ! !----------------------------------------------------------------------- ! ! 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 ! ! ptprt Perturbation potential temperature at all time levels (K) ! qv Water vapor specific humidity at all time levels (kg/kg) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! ! ptbar Base state potential temperature (K) ! p Total pressure at tfuture ! ppi Exner function of pressure ! lathvt Temperature-dependent latent heat of evaporation ! ! OUTPUT: ! ! ptprt Perturbation potential temperature at time tfuture (K) ! qv Water vapor specific humidity at time tfuture (kg/kg) ! qr Rainwater mixing ratio at time tfuture (kg/kg) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nt ! The no. of t-levels of t-dependent arrays. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present time. INTEGER :: tfuture ! Index of time level for the future time. PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3) ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions REAL :: dtbig1 ! Big time step size (s) REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K) REAL :: qv (nx,ny,nz,nt) ! Water vapor specific humidity (kg/kg) REAL :: qr (nx,ny,nz,nt) ! Rainwater mixing ratio (kg/kg) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) ! REAL :: p (nx,ny,nz) ! Total pressure at tfuture. REAL :: ppi (nx,ny,nz) ! Exner function of pressure. REAL :: lathvt(nx,ny,nz) ! Temperature dependent latent heat !----------------------------------------------------------------------- ! ! Temporary arrays ! !----------------------------------------------------------------------- ! REAL :: qvs (nx,ny,nz) ! Saturation specific humidity ! with respect to liquid water. REAL :: tem1 (nx,ny,nz) ! Temperature (K) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,lvlq,lvlt REAL :: deltat,qrplus,qvplus,c,er,erdt REAL :: interp, temp, f1, f2, rstep INTEGER :: INDEX ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! lvlq = tfuture lvlt = tfuture ! !----------------------------------------------------------------------- ! ! The time increment when water and temperature fields are advected ! using the leapfrog scheme (if using forward scheme, deltat = ! dtbig1). ! !----------------------------------------------------------------------- ! !C IF( sadvopt.ge.1.and.sadvopt.le.3) THEN ! Leapfrog scheme IF( sadvopt /= 4) THEN ! Leapfrog scheme deltat = 2*dtbig1 ELSE ! Forward scheme deltat = dtbig1 END IF ! !----------------------------------------------------------------------- ! ! Calculate qvs, the saturation specific humidity, using ! enhanced Teten's formula ! !----------------------------------------------------------------------- DO k = 1,nz-1 DO j = 1,ny-1 DO i = 1,nx-1 tem1(i,j,k) = (ptprt(i,j,k,lvlt)+ptbar(i,j,k)) * ppi(i,j,k) END DO END DO END DO CALL getqvs(nx,ny,nz, 1,nx-1,1,ny-1,1,nz-1, p,tem1, qvs) ! write (*,*) "ZUWEN subsatopt/rhsat", subsatopt, rhsat IF (subsatopt /= 0) THEN DO k = 1,nz-1 DO j = 1,ny-1 DO i = 1,nx-1 qvs(i,j,k) = rhsat*qvs(i,j,k) ! adjust qvs for sub-saturation END DO END DO END DO END IF ! !----------------------------------------------------------------------- ! ! Calculate the amount of rainwater evaporation and adjust ! the rainwater, water vapor and temperature fields. ! !----------------------------------------------------------------------- ! rstep = 1.0/50.0E-6 DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qrplus = MAX(0.0, qr(i,j,k,lvlq) ) qvplus = MAX(0.0, qv(i,j,k,lvlq) ) ! !----------------------------------------------------------------------- ! ! The formula for the calculation of the coefficient for the ! rainwater evaporation rate ! ! c = 1.6 + 30.3922 * ( rhobar(i,j,k)*qrplus )**0.2046. ! ! Here a linear interpolation from a lookup table data is used to ! evaluate power function (rhobar*qr) ** 0.2046 ! for which it is assumed that 0.0=< rhobar*qr =< 0.05. ! !----------------------------------------------------------------------- ! temp = MIN (0.05, qrplus * rhobar(i,j,k)) * rstep INDEX = INT(temp) f1 = pwr2046(INDEX) f2 = pwr2046(INDEX + 1) interp= f1 + ((f2 - f1) * (temp - INDEX) ) c = 1.6 + 30.3922 * interp ! !----------------------------------------------------------------------- ! ! The formula for calculation of the rainwater evaporation rate ! ! (rhobar(i,j,k)*qrplus)**0.525 ! ! Here a linear interpolation from a lookup table data is used to ! evaluate power function (rhobar*qr) ** 0.525 ! for which it is assumed that 0.0=< rhobar*qr =< 0.05. ! !----------------------------------------------------------------------- ! f1 = pwr525(INDEX) f2 = pwr525(INDEX + 1) interp= f1 + ((f2 - f1) * (temp - INDEX) ) er = c * (1.0- qvplus/qvs(i,j,k) )* & interp/( (2.03E4 + 9.584E6/(p(i,j,k)*qvs(i,j,k))) & *rhobar(i,j,k) ) ! !----------------------------------------------------------------------- ! ! The amount of rain evaporation is limited by the available ! rainwater: ! !----------------------------------------------------------------------- ! erdt = er * deltat erdt = MIN( qrplus, MAX(0.0, erdt) ) ! !----------------------------------------------------------------------- ! ! Adjust qr, qv and ptprt accordingly. ! !----------------------------------------------------------------------- ! qr(i,j,k,lvlq) = qr(i,j,k,lvlq) - erdt qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + erdt ptprt(i,j,k,lvlt) = ptprt(i,j,k,lvlt) & - lathvt(i,j,k)*erdt/( ppi(i,j,k)*cp ) END DO END DO END DO RETURN END SUBROUTINE revap ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE QRFALL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE qrfall(nx,ny,nz,dtbig1, & 1,1 qr,rhobar,j3,j3inv,raing, prcrate, & draing,vtr,tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the fall-out rate of rainwater and apply this effect to ! the rainwater field, qr. Since the leapfrog-centered scheme is ! used, the rainwater flux divergence (i.e., the advection by the ! terminal fallout speed of rain) is calculated at time ""tpresent". ! This subroutine is called by the warm rain package. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/1991. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/28/92 (K. Brewster) ! Further facelift. ! ! 6/10/94 (M Xue & A. Sathye) ! Power calculations are replaced by lookup table functions. ! ! 5/8/1995 (M. Xue) ! Time-splitting upstream advection used for rainwater sedimentation ! ! 10/20/1996 (M. Xue) ! Created a general routine for hydrometeor sedimentation called ! QFALLOUT, which is now also called by ice microphysics routine. ! Precipitation rate array prcrate is now correctly calculated ! for split-step integration. ! !----------------------------------------------------------------------- ! ! 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 ! ! dtbig1 Big time step size (s) ! qr Rainwater mixing ratio at all time levels (kg/kg) ! ! rhobar Base state air density (kg/m**3) ! j3 Coordinate transformation Jacobian d(zp)/dz ! raing Accumulated grid-scale rainfall (mm) ! ! OUTPUT: ! ! qr Rainwater mixing ratio at time tfuture (kg/kg) ! raing Accumulated grid-scale rainfall (mm) ! prcrate Precipitation rate ! ! WORK ARRAYS: ! ! draing Gridscale rainfall (mm) ! vtr terminal velocity ! tem1 Work array ! ! (These arrays are defined and used locally (i.e. inside this ! subroutine), they may also be passed into routines called by ! this one. Exiting the call to this subroutine, these temporary ! work arrays may be used for other purposes and therefore their ! contents may be overwritten. Please examine the usage of work ! arrays before you alter the code.) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nt ! The no. of t-levels of t-dependent arrays. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present time. INTEGER :: tfuture ! Index of time level for the future time. PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3) ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions REAL :: dtbig1 ! Big time step size (s) REAL :: qr (nx,ny,nz,nt) ! Rainwater mixing ratio (kg/kg) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as d( zp )/d( z ). REAL :: j3inv (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as d( zp )/d( z ). REAL :: raing (nx,ny) ! Accumulated grid-scale rainfall (mm) REAL :: prcrate(nx,ny) ! Precipitation rate (kg/(m**2*s)) ! !----------------------------------------------------------------------- ! ! Temporary arrays ! !----------------------------------------------------------------------- ! REAL :: draing(nx,ny) ! Gridscale rainfall (mm) REAL :: vtr (nx,ny,nz) ! terminal velocify REAL :: tem1 (nx,ny,nz) ! work array ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,lvlq REAL :: temp, interp, f1, f2, rstep INTEGER :: INDEX REAL :: denwater,tem ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! lvlq = tfuture ! !----------------------------------------------------------------------- ! ! The formula for terminal fallout speed of rainwater: ! ! Vtr = 36.34 * ((0.001 * rhobar * qr) ** 0.1364) * (rho0 /rhobar)**0.5 ! Vtr is positive downwards. ! ! A linear interpolation from a lookup table data is used to ! evaluate power function (0.001 * rhobar * qr) ** 0.1364 ! for which it is assumed that 0.0=< rhobar * qr =< 0.05. ! ! !----------------------------------------------------------------------- ! rstep = 1.0/50.0E-9 DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 temp = MIN (0.00005, MAX(0.0,0.001 * rhobar(i,j,k) & * qr(i,j,k,lvlq-1)))*rstep INDEX = INT(temp) f1 = pwr1364(INDEX) f2 = pwr1364(INDEX+1) interp= f1 + ((f2 - f1) * (temp - INDEX) ) vtr(i,j,k) = 36.34 * interp * SQRT(rho0/rhobar(i,j,k)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate the rainwater fallout term and the precipitation rate. ! !----------------------------------------------------------------------- ! !call test_check_in("Bqrfallout") CALL qfallout(nx,ny,nz,dtbig1,qr,rhobar,j3,j3inv,draing,vtr, & tem1) !call test_check_in("Aqrfallout") denwater = 1000.0 ! Density of liquid water (kg/m**3) tem = denwater/(1000.0*dtbig) DO j=1,ny-1 DO i=1,nx-1 raing(i,j)=raing(i,j)+draing(i,j) prcrate(i,j) = draing(i,j)*tem END DO END DO RETURN END SUBROUTINE qrfall ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE QFALLOUT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE qfallout(nx,ny,nz,dtbig1,q,rhobar,j3,j3inv,draing,vtr, & 6,3 rhovq) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the fall-out of hydrometeor given it's fallout velocity. ! Upstream advection with split time steps is used here. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 10/10/1991. ! ! MODIFICATION HISTORY: ! ! 5/8/1995 (M. Xue) ! Time-splitting upstream advection used for rainwater sedimentation ! ! 12/6/1996 (Yuhe Liu) ! Moved the initialization of draing to the beginning of executable ! statements. This solved the problem that the returned draing ! became undefined when no rain sedimentation needed. ! !----------------------------------------------------------------------- ! ! 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 ! ! dtbig1 Big time step size (s) ! q Hydrometeor mixing ratio at all time levels (kg/kg) ! ! rhobar Base state air density (kg/m**3) ! j3 Coordinate transformation Jacobian d(zp)/dz ! vtr terminal velocity (m/s) ! ! OUTPUT: ! ! q Rainwater mixing ratio at time tfuture (kg/kg) ! draing Grid-scale rainfall (mm) ! ! WORK ARRAYS: ! ! rhovq rhobar*terminal velocity*q ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nt ! The no. of t-levels of t-dependent arrays. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present time. INTEGER :: tfuture ! Index of time level for the future time. PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3) ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions REAL :: dtbig1 ! Big time step size (s) REAL :: q (nx,ny,nz,nt) ! Rainwater mixing ratio (kg/kg) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as d( zp )/d( z ). REAL :: j3inv (nx,ny,nz) ! Coordinate transformation Jacobian ! defined as d( zp )/d( z ). REAL :: draing (nx,ny) ! Grid-scale rainfall (mm) REAL :: vtr (nx,ny,nz) ! terminal velocify ! !----------------------------------------------------------------------- ! ! Temporary arrays ! !----------------------------------------------------------------------- ! REAL :: rhovq (nx,ny,nz) ! rhobar*terminal velocity*q ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,nrnstp,irnstp REAL :: denwater,tem, vtrdzmax,dtrnf,dtrnf0 REAL :: deltat REAL :: temmin ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'phycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! CALL acct_interrupt(qfall_acct) DO j=1,ny-1 DO i=1,nx-1 draing(i,j)=0.0 END DO END DO vtrdzmax = 0.0 DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 vtrdzmax=MAX(vtrdzmax,vtr(i,j,k)*(j3inv(i,j,k)*dzinv)) END DO END DO END DO !wdt 2001-04-17 gmb: slows execution down significantly: ! ! for bit-for-bit MP accuracy: !wdt - don't use! temmin = 0 CALL mpmax0(vtrdzmax,temmin) IF( vtrdzmax == 0.0 ) RETURN ! vtr=0, no rain sedimentation. IF( sadvopt /= 4) THEN ! Leapfrog scheme deltat = 2*dtbig1 ELSE ! Forward scheme deltat = dtbig1 END IF dtrnf = MIN(deltat, 0.5/MAX(1.0E-20,vtrdzmax)) ! 0.5 is the max Courant number dtrnf0 = dtrnf nrnstp = nint ( deltat/dtrnf ) IF(nrnstp == 0) nrnstp=1 dtrnf = deltat/nrnstp IF (dtrnf > dtrnf0) THEN nrnstp = nrnstp + 1 dtrnf = deltat/nrnstp END IF DO irnstp = 1, nrnstp ! !----------------------------------------------------------------------- ! ! The density weighted rainwater fallout flux: ! rhovq = rhobar * vtr * q ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 rhovq(i,j,k) = rhobar(i,j,k)*vtr(i,j,k)*q(i,j,k,tfuture) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Upstream-foreward advection for the rainwater sedimentation ! !----------------------------------------------------------------------- ! DO k=2,nz-2 DO j=1,ny-1 DO i=1,nx-1 q(i,j,k,tfuture) = q(i,j,k,tfuture)+ dtrnf * & ((rhovq(i,j,k+1)-rhovq(i,j,k))/(dz*rhobar(i,j,k)*j3(i,j,k))) END DO END DO END DO !call test_dump2(q(1,1,1,tfuture),"XXXqfallout_q",nx,ny,nz,1,nx-1,2,ny-2,2,nz-2) !call test_dump2(rhovq,"XXXqfallout_rhovq",nx,ny,nz,1,nx-1,2,ny-2,2,nz-1) !call test_check_in("qfallout1") !----------------------------------------------------------------------- ! ! Accumulated precipitation. The depth of water ! accumulated per timestep is given by: ! ! depth (m) = terminal velocity * q * dt * (rhobar/denwater) ! ! This equation is derived by temporally integrating the vertical ! flux of rain through the lowest model level. The total is given ! for the entire computational domain. ! !----------------------------------------------------------------------- denwater = 1000.0 ! Density of liquid water. tem = dtbig1/deltat *dtrnf/denwater *1000.0 ! dtbig1/deltat=0.5 for leapfrog scheme DO j=1,ny-1 DO i=1,nx-1 draing(i,j)=draing(i,j)+rhovq(i,j,2) * tem END DO END DO END DO CALL acct_stop_inter RETURN END SUBROUTINE qfallout ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SATADJ ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE satadj(nx,ny,nz, ptprt,qv,qc,ptbar, & 1,2 p, ppi, lathvt, t,qvs, tem1 ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Perform the saturation adjustment (condensation and evaporation ! between qv and qc). Under the conditions of supersaturation ! (qv > qvs) water vapor, qv, is condensed into cloud water, qc. ! When the air is subsaturated, (qv <= qvs) cloud water is then ! evaporated. Adjustments are then made to the potential ! temperature, water vapor and cloud water fields. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 2/29/1992. ! ! MODIFICATION HISTORY: ! ! 5/02/92 (M. Xue) ! Added full documentation. ! ! 5/28/92 (K. Brewster) ! Further facelift. ! ! 11/05/98 (K. Brewster) ! Added "time constant" to dqv calculation. ! ! 11/08/98 (K. Brewster) ! Changed calculation of qvs to be based on total pi and p, not pbar ! !----------------------------------------------------------------------- ! ! 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 ! ! ptprt Perturbation potential temperature at all time levels(K) ! pprt Perturbation pressure at all time levels (Pascal) ! qv Water vapor specific humidity at all time levels (kg/kg) ! qc Cloud water mixing ratio at all time levels (kg/kg) ! ! ptbar Base state potential temperature (K) ! ! OUTPUT: ! ! ptprt Perturbation potential temperature at time tfuture (K) ! qv Water vapor specific humidity at time tfuture (kg/kg) ! qc Cloud water mixing ratio at time tfuture (kg/kg) ! ! WORK ARRAYS: ! ! qvs Saturation specific humidity (kg/kg) ! t Temperature (K) ! ! (These arrays are defined and used locally (i.e. inside this ! subroutine), they may also be passed into routines called by ! this one. Exiting the call to this subroutine, these temporary ! work arrays may be used for other purposes and therefore their ! contents may be overwritten. Please examine the usage of work ! arrays before you alter the code.) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nt ! The no. of t-levels of t-dependent arrays. INTEGER :: tpast ! Index of time level for the past time. INTEGER :: tpresent ! Index of time level for the present time. INTEGER :: tfuture ! Index of time level for the future time. PARAMETER (nt=3, tpast=1, tpresent=2, tfuture=3) ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions REAL :: ptprt (nx,ny,nz,nt) ! Perturbation potential temperature (K) REAL :: qv (nx,ny,nz,nt) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz,nt) ! Cloud water mixing ratio (kg/kg) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: lathvt(nx,ny,nz) ! Temperature dependent latent heat of ! vaporization (kg/(m*s**2). ! !----------------------------------------------------------------------- ! ! Temporary arrays ! !----------------------------------------------------------------------- ! REAL :: p (nx,ny,nz) ! Total pressure at tfuture (Pa) REAL :: ppi (nx,ny,nz) ! Exner function REAL :: t (nx,ny,nz) ! Temperature (K) REAL :: qvs (nx,ny,nz) ! Saturation specific humidity (kg/kg) REAL :: tem1 (nx,ny,nz) ! Temporary arrays ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,lvlq,lvlt REAL :: dqv,qvplus,qcplus REAL :: dqvcst PARAMETER (dqvcst=1.0) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Function f_desdt and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_desdt !fpp$ expand (f_desdt) !dir$ inline always f_desdt !*$* inline routine (f_desdt) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! lvlq = tfuture lvlt = tfuture ! !----------------------------------------------------------------------- ! ! Calculate the temperature. ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 t(i,j,k) = (ptprt(i,j,k,lvlt)+ptbar(i,j,k)) * ppi(i,j,k) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate the saturation specific humidity. ! !----------------------------------------------------------------------- ! CALL getqvs(nx,ny,nz, 1,nx-1,1,ny-1,1,nz-1, p, t, qvs) ! write (*,*) "ZUWEN subsatopt/rhsat", subsatopt, rhsat IF (subsatopt /= 0) THEN DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qvs(i,j,k) = rhsat*qvs(i,j,k) ! adjust qvs for sub-saturation END DO END DO END DO END IF DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k) = f_desdt( t(i,j,k) ) ! d(es)/dt/es tem1(i,j,k) = (rddrv+(1.-rddrv)*qvs(i,j,k))/rddrv * tem1(i,j,k) ! d(qvs)/dt/qvs END DO END DO END DO DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ! !----------------------------------------------------------------------- ! ! Calculate the amount of evaporation (when subsaturated, dqv>0) ! or condensation (when supersaturated, dqv<0). ! !----------------------------------------------------------------------- ! qvplus = MAX(0.0,qv(i,j,k,lvlq)) qcplus = MAX(0.0,qc(i,j,k,lvlq)) dqv = (qvs(i,j,k)-qvplus) & / (1.0+tem1(i,j,k)*qvs(i,j,k)*lathvt(i,j,k)/cp) ! !----------------------------------------------------------------------- ! ! If evaporation occurs (dqv>0), the amount should not exceed ! the available cloud water. ! ! Make evaporation and condensation happen gradually. ! !----------------------------------------------------------------------- ! dqv = dqvcst*MIN( dqv, qcplus ) ! !----------------------------------------------------------------------- ! ! Adjust qv, qc and ptprt accordingly. ! !----------------------------------------------------------------------- ! qv(i,j,k,lvlq) = qv(i,j,k,lvlq) + dqv qc(i,j,k,lvlq) = qc(i,j,k,lvlq) - dqv ptprt(i,j,k,lvlt) = ptprt(i,j,k,lvlt) - & dqv*lathvt(i,j,k)/(ppi(i,j,k)*cp) END DO END DO END DO RETURN END SUBROUTINE satadj