! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ADASREAD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE adasread(nx,ny,nz,x,y,z,zp, & 1,7 isrc,ireturn,adastim, & ubar,vbar,pbar,ptbar,rhostr,qvbar, & u,v,w,pprt,ptprt,qv,qc,qr,qi,qs,qh,j1,j2,j3, & tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8, & tem9,rhobar) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Coordinates the ingestion of ADAS background data files. ! !----------------------------------------------------------------------- ! ! AUTHOR: Limin Zhao ! ! 2/21/1996 ! ! MODIFICATION HISTORY: ! ! 2/17/97 (L. Zhao) ! Modified the code to ingest the ARPS4.2.4 history format. ! !----------------------------------------------------------------------- ! ! 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 ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp Vertical coordinate of grid points in physical space (m) ! ! OUTPUT: ! ! ireturn Flag, indicating read status of input file ! = 0 Successful read ! = 1 Unsuccessful read ! ! adastim Times of all input files ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! pbar Base state pressure (Pascal) ! ptbar Base state potential temperature (K) ! rhostr Base state density (kg/m**3) times j3 ! qvbar Base state water vapor specific humidity (kg/kg) ! rhobar Base state density (kg/m**3) ! ! 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 Vertical component of Cartesian velocity at a given ! time level (m/s) ! pprt Perturbation pressure at times tpast and tpresent (Pascal) ! ptprt Perturbation potential temperature at times tpast and ! tpresent (K) ! ! qv Water vapor specific humidity (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rain water mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! tem2 Temporary work array. ! tem3 Temporary work array. ! tem4 Temporary work array. ! tem5 Temporary work array. ! tem6 Temporary work array. ! tem7 Temporary work array. ! tem8 Temporary work array. ! tem9 Temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nt ! Number of time levels of time-dependent arrays. INTEGER :: tim ! Index of time level. 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 :: 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 computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. INTEGER :: isrc ! Flag indicating source of calling routine INTEGER :: nstyps REAL :: adastim ! Time of data input files REAL :: ubar (nx,ny,nz) ! Base state x-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state y-velocity (m/s) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: rhostr(nx,ny,nz) ! Base state air density (kg/m**3) times j3 REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity (kg/kg) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: u (nx,ny,nz,nt) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz,nt) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz,nt) ! Total w-velocity (m/s) REAL :: pprt (nx,ny,nz,nt) ! Perturbation pressure (Pascal) 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 :: qr (nx,ny,nz,nt) ! Rain water 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 kte (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) ! real kmh (nx,ny,nz) !Horizontal turb. mixing coef.for momentum ( m**2/s ) ! real kmv (nx,ny,nz) !Vertical turb. mixing coef. for momentum ( m**2/s ) REAL :: j1(nx,ny,nz) REAL :: j2(nx,ny,nz) REAL :: j3(nx,ny,nz) REAL :: tem1 (nx,ny,nz) ! Temporary work array REAL :: tem2 (nx,ny,nz) ! Temporary work array REAL :: tem3 (nx,ny,nz) ! Temporary work array REAL :: tem4 (nx,ny,nz) ! Temporary work array REAL :: tem5 (nx,ny,nz) ! Temporary work array REAL :: tem6 (nx,ny,nz) ! Temporary work array REAL :: tem7 (nx,ny,nz) ! Temporary work array REAL :: tem8 (nx,ny,nz) ! Temporary work array REAL :: tem9 (nx,ny,nz) ! Temporary work array INTEGER :: ireturn ! !----------------------------------------------------------------------- ! ! Routines called: ! !----------------------------------------------------------------------- ! EXTERNAL dtahead EXTERNAL dtaread ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: is ! Counter, used for reading input data SAVE is DATA is/1/ INTEGER :: i,j,k,n ! Loop index INTEGER :: nchanl ! FORTRAN I/O channel number for history data output. INTEGER :: lengbf,lendtf,lbasdmpf INTEGER :: itimesv REAL :: storstop ! Temporarily stores the model stop time CHARACTER (LEN=128 ) :: saverunm ! Temporarily stores the name of this run CHARACTER (LEN=128 ) :: filein ! Input file name for recovery ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'assim.inc' INCLUDE 'globcst.inc' INCLUDE 'adas.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! If isrc=1, then read the times (adastim) from ADAS data file ! headers. This is done in order to determine if the background data ! is available. ! !----------------------------------------------------------------------- ! WRITE(6,*)'code in adasread' tim = tpresent IF (isrc == 1) THEN lendtf=LEN(adasdat(is)) CALL strlnth( adasdat(is), lendtf) WRITE(6,'(/a,a)')'The file name is ',adasdat(is)(1:lendtf) saverunm = runname CALL dtahead(nx,ny,nz, & inifmt,inigbf,lengbf,adasdat(is), & lendtf,adastim,x,y,z,zp,tem4,tem5,tem6, & ptprt(1,1,1,tim),pprt(1,1,1,tim),tem7, & qc(1,1,1,tim),qr(1,1,1,tim),qi(1,1,1,tim), & qs(1,1,1,tim),qh(1,1,1,tim),tem9, & ubar,vbar,tem8,ptbar,pbar,rhobar,qvbar, & ireturn,tem1,tem2,tem3) runname = saverunm IF(ireturn /= 0) RETURN ! !----------------------------------------------------------------------- ! ! Read in a single data file. ! !----------------------------------------------------------------------- ! ELSE IF(isrc == 3) THEN lengbf=LEN(inigbf) CALL strlnth( inigbf, lengbf) WRITE(6,'(/a,a)') & 'The grid/base state file name is ',inigbf(1:lengbf) lendtf=LEN(adasdat(is)) CALL strlnth( adasdat(is), lendtf) WRITE(6,'(/a,a)')'The file name is ',adasdat(is)(1:lendtf) saverunm = runname WRITE(6,*)'ADAS background field',adasdat(is) ! !----------------------------------------------------------------------- ! ! Set the tem8 array to zero. This is done to avoid overwriting ! wbar on calls to dtaread. ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny DO i=1,nx tem8(i,j,k) = 0.0 END DO END DO END DO storstop = tstop ! Temporary. For ingestion of model data ! generated prior to 4.0 CALL ctim2abss( year, month, day, hour, minute, second, itimesv ) CALL dtaread(nx,ny,nz,nstyps, & inifmt,nchanl,inigbf,lengbf,adasdat(is), & lendtf,adastim,x,y,z,zp,tem4,tem5,tem6, & ptprt(1,1,1,tim),pprt(1,1,1,tim),tem7, & qc(1,1,1,tim),qr(1,1,1,tim),qi(1,1,1,tim), & qs(1,1,1,tim),qh(1,1,1,tim),tem9,tem9,tem9, & ubar,vbar,tem8,ptbar,pbar,rhobar,qvbar, & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & tem9(1,1,1),tem9(1,1,1),tem9(1,1,1),tem9(1,1,1), & ireturn,tem1,tem2,tem3) CALL abss2ctim( itimesv, year, month, day, hour, minute, second ) tstop = storstop runname = saverunm IF(ireturn /= 0) RETURN ! !----------------------------------------------------------------------- ! ! The arrays tem2,tem3 and tem4 contain uprt, vprt, wprt ! respectively. The total fields are stored in u and v. ! !----------------------------------------------------------------------- ! DO i = 1,nx DO j = 1,ny-1 DO k = 1,nz-1 tem2(i,j,k) = tem4(i,j,k) + ubar(i,j,k) u(i,j,k,tim) = tem2(i,j,k) END DO END DO END DO DO i = 1,nx-1 DO j = 1,ny DO k = 1,nz-1 tem3(i,j,k) = tem5(i,j,k)+ vbar(i,j,k) v(i,j,k,tim) = tem3(i,j,k) END DO END DO END DO DO i = 1,nx-1 DO j = 1,ny-1 DO k = 1,nz tem4(i,j,k) = tem6(i,j,k) w(i,j,k,tim) = tem4(i,j,k) END DO END DO END DO DO i = 1,nx-1 DO j = 1,ny-1 DO k = 1,nz-1 rhostr(i,j,k) = rhobar(i,j,k)*j3(i,j,k) qv(i,j,k,tim) = qvbar(i,j,k) + tem7(i,j,k) END DO END DO END DO END IF RETURN END SUBROUTINE adasread