! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ASSIMPTPR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE assimptpr(nx,ny,nz,x,y,z,zp, & 1,16 u,v,w,ptprt,pprt,qv, & qc,qr,qi,qs,qh, & tke,kmh,kmv, & ubar,vbar,ptbar,pbar,qvbar,rhostr, & uforce,vforce,wforce,j1,j2,j3) ! !-------------------------------------------------------------------------- ! ! PURPOSE: ! ! This subroutine is the driver for retrieval and adjustment ! (e.g., through blending of retreived fields) of the pressure ! and temperature fields. ! ! If any changes to temperature or pressure are generated ! they are applied to the input fields ptprt and pprt before ! returning. ! ! Note: Any statistics or processing involving both the original ! and adjusted mass fields must be done before exiting this subroutine. ! !--------------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! 2/25/93. ! ! MODIFICATION HISTORY: ! 04/15/93 (Keith Brewster) ! Modified for new subroutine RETRPTPR and to use common block ! recvry (assim.inc). ! ! 02/08/96 (Scott Ellis and Steven Lazarus) ! Modified to dump out retrieved pressure and temperature following ! the thermodynamic recovery. (Call to DTADUMP) ! ! 03/22/96 (Limin Zhao) ! Modified to incoporate it into the revised FDDA sysytem. ! ! 03/22/96 (Limin Zhao) ! Added the subroutines for reading radar data, for blending ! retrieval with model background. ! ! 05/06/96 (Limin Zhao) ! Added modified Keith's output code to convert the retrieved , ! wind field, thermodynamic and moisture fields into ! "pseudo-soundings" for use in ADAS. ! ! 08/22/96 (Limin Zhao) ! Added swatch 'itfil' to turn on/off hole-filler after retrieval T. ! ! 08/23/96 (Limin Zhao) ! Added working array 'work*' to temporally fix the problem in ! calling 'assimout'. These arrays are only used in this subroutine, ! and will need be changed according to 'dims.inc'. ! ! 09/24/96 (Limin Zhao) ! Fixed a bug in 'assimout'. The retrieval temperature and pressure ! should be dumped out, and also should be qvprt not qv. ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! 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 z-direction (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) ! ! u x component of velocity (m/s) ! v y component of velocity (m/s) ! w z component of velocity (m/s) ! ! ptprt Model's perturbation potential temperature (K) ! pprt Model's perturbation pressure (Pascal) ! qv Model's water vapor specific humidity (kg/kg) ! qc Model's cloud water mixing ratio (kg/kg) ! qr Model's 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) ! ! kmh Horizontal turb. mixing coef. for momentum. ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum. ( m**2/s ) ! ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! qvbar Base state water vapor specific humidity (kg/kg) ! rhostr Base state air density (kg/m**3) times j3 ! ! uforce Acoustically inactive forcing terms in the u-momentum ! equation (kg/(m*s)**2). uforce = -uadv + umix + ucorio ! vforce Acoustically inactive forcing terms in the v-momentum ! equation (kg/(m*s)**2). vforce = -vadv + vmix + vcorio ! wforce Acoustically inactive forcing terms in the w-momentum ! equation, except for buoyancy (kg/(m*s)**2). ! wforce = -wadv + wmix + wcorio ! ! j1 Coordinate transformation Jacobian -d(zp)/dx ! j2 Coordinate transformation Jacobian -d(zp)/dy ! j3 Coordinate transformation Jacobian d(zp)/dz ! OUTPUT: ! ! ptprt Adjusted perturbation potential temperature (K) ! pprt Adjusted perturbation pressure (Pascal) ! ! 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. ! ! (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 ! Force explicit declarations INTEGER :: nx, ny, nz ! Number of grid points in the x,y,z-direction INTEGER :: nt ! Number of time levels of time-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 :: nstyps REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-poi:. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-poi:. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-poi: on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-poi: of the staggered grid. REAL :: u(nx,ny,nz,nt) ! x compone: of velocity (m/s) REAL :: v(nx,ny,nz,nt) ! y compone: of velocity (m/s) REAL :: w(nx,ny,nz,nt) ! z compone: of velocity (m/s) REAL :: ptprt (nx,ny,nz,nt) ! Perturbation pote:ial 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) ! 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 :: tke (nx,ny,nz,nt) ! Turbule: Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizo:al turb. mixing coef. for ! mome:um. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! mome:um. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state pote:ial temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal). REAL :: qvbar (nx,ny,nz) ! Base state specific humidity (kg/kg). REAL :: rhostr(nx,ny,nz) ! Base state air density (kg/m**3) times j3 REAL :: uforce(nx,ny,nz) ! Acoustically inactive forcing terms ! in u-mome:um equation (kg/(m*s)**2) ! uforce= -uadv + umix + ucorio REAL :: vforce(nx,ny,nz) ! Acoustically inactive forcing terms ! in v-mome:um equation (kg/(m*s)**2) ! vforce= -vadv + vmix + vcorio REAL :: wforce(nx,ny,nz) ! Acoustically inactive forcing terms ! in w-mome:um equation (kg/(m*s)**2) ! wforce= -wadv + wmix REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/d(x) REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian -d(zp)/d(y) REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian d(zp)/d(z) REAL, ALLOCATABLE :: tem1 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem2 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem3 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem4 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem5 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem6 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem7 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem8 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem9 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem10 (:,:,:) ! Temporary work array. REAL, ALLOCATABLE :: tem11 (:,:,:) ! Temporary work array. ! work arrays used by assimout: REAL, ALLOCATABLE :: work1(:,:,:) REAL, ALLOCATABLE :: work2(:,:,:) REAL, ALLOCATABLE :: work3(:,:,:) REAL, ALLOCATABLE :: work4(:,:,:) REAL, ALLOCATABLE :: work5(:,:,:) REAL, ALLOCATABLE :: work6(:,:,:) REAL, ALLOCATABLE :: work7(:,:,:) REAL, ALLOCATABLE :: work8(:,:,:) REAL, ALLOCATABLE :: work9(:,:,:) REAL, ALLOCATABLE :: work10(:,:,:) REAL, ALLOCATABLE :: work11(:,:,:) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,tlevel INTEGER :: rebc,rwbc,rnbc,rsbc,rtbc,rbbc REAL :: dtbig1,dtsml1 INTEGER :: kdim PARAMETER (kdim=100) INTEGER :: knt(kdim) REAL :: vmin(kdim),vmax(kdim) REAL :: avg(kdim),rms(kdim),stdv(kdim) INTEGER :: knttot REAL :: mintot,maxtot REAL :: avgtot,rmstot,stdvtot REAL :: ptol INTEGER :: grdbas REAL :: assimtim(100) ! Time of (all) input data files INTEGER :: icount INTEGER :: istat INTEGER :: isrc INTEGER :: lenstr INTEGER :: tim INTEGER :: nchout INTEGER :: lendtf,ireturn REAL :: xor ! Coordinate (xor,yor,zor) of the model grid REAL :: yor ! origin relative to the radar. REAL :: zor ! CHARACTER (LEN=128) :: retfname INTEGER :: itfil REAL :: pres,temp,qvsat INTEGER :: count, istatus ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! Global constants that control model INCLUDE 'bndry.inc' INCLUDE 'assim.inc' INCLUDE 'phycst.inc' INCLUDE 'grid.inc' ! !----------------------------------------------------------------------- ! ! Routines called: ! !----------------------------------------------------------------------- ! EXTERNAL retrptpr EXTERNAL pois3d EXTERNAL radptpr ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! If recovopt equals 0, do not perform a retrieval. ! !----------------------------------------------------------------------- ! IF ( recovopt == 0 ) RETURN ! !----------------------------------------------------------------------- ! ! Allocate the variables and initialize the them to zero ! !----------------------------------------------------------------------- ALLOCATE( tem1 (nx,ny,nz), STAT=istatus) tem1 = 0 ALLOCATE( tem2 (nx,ny,nz), STAT=istatus) tem2 = 0 ALLOCATE( tem3 (nx,ny,nz), STAT=istatus) tem3 = 0 ALLOCATE( tem4 (nx,ny,nz), STAT=istatus) tem4 = 0 ALLOCATE( tem5 (nx,ny,nz), STAT=istatus) tem5 = 0 ALLOCATE( tem6 (nx,ny,nz), STAT=istatus) tem6 = 0 ALLOCATE( tem7 (nx,ny,nz), STAT=istatus) tem7 = 0 ALLOCATE( tem8 (nx,ny,nz), STAT=istatus) tem8 = 0 ALLOCATE( tem9 (nx,ny,nz), STAT=istatus) tem9 = 0 ALLOCATE( tem10 (nx,ny,nz), STAT=istatus) tem10 = 0 ALLOCATE( tem11 (nx,ny,nz), STAT=istatus) tem11 = 0 ALLOCATE( work1 (nx,ny,nz), STAT=istatus) work1 = 0 ALLOCATE( work2 (nx,ny,nz), STAT=istatus) work2 = 0 ALLOCATE( work3 (nx,ny,nz), STAT=istatus) work3 = 0 ALLOCATE( work4 (nx,ny,nz), STAT=istatus) work4 = 0 ALLOCATE( work5 (nx,ny,nz), STAT=istatus) work5 = 0 ALLOCATE( work6 (nx,ny,nz), STAT=istatus) work6 = 0 ALLOCATE( work7 (nx,ny,nz), STAT=istatus) work7 = 0 ALLOCATE( work8 (nx,ny,nz), STAT=istatus) work8 = 0 ALLOCATE( work9 (nx,ny,nz), STAT=istatus) work9 = 0 ALLOCATE( work10(nx,ny,nz), STAT=istatus) work10 = 0 ALLOCATE( work11(nx,ny,nz), STAT=istatus) work11 = 0 ! !----------------------------------------------------------------------- ! ! Has switch been set for thermodynamic retrieval? ! !----------------------------------------------------------------------- ! IF (irecov == 1) THEN ! !---------------------------------------------------------------------------- ! ! Fudge-up a first guess. This is just to compare stats ! with the final product. ! !---------------------------------------------------------------------------- ! !---------------------------------------------------------------------------- ! ! For real data runs, read the raw data as flags to do hole-filling. ! !---------------------------------------------------------------------------- ! isrc=3 !NOTE: temporary fix for 3 files case. ii=3 lendtf=LEN_trim(assimdat(ii-1)) ! ! ! write(6,'(/a,a)')'The file name is ',assimdat(i)(1:lendtf) WRITE(6,*) 'lendtf=',lendtf WRITE(6,*) 'The filename assimdat(',ii-1,')=', & assimdat(ii-1)(1:lendtf) CALL radptpr(assimdat(ii-1),lendtf,isrc, & assimtim(ii-1),ireturn, & nx,ny,nz,dx,dy,dz,xor,yor,zor,tem10,tem9) ! !-------------------------------------------------------------------------- ! ! Recover potential temperature perturbation (tem1) and ! perturbation pressure (tem2) from the observed winds and ! the model forcing. ! !----------------------------------------------------------------------- ! PRINT *, ' Calling retrptpr' CALL retrptpr(nx,ny,nz,x,y,z,zp, & u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh, & ubar,vbar,ptbar,pbar,rhostr,qvbar, & uforce,vforce,wforce,j1,j2,j3, & tem1,tem2,tem3,tem4,tem5,tem6,tem7, & tem8,tem9,tem10,tem11) PRINT *, ' Back from retrptpr' ! !----------------------------------------------------------------------- ! ! Dump out the recovered temperature (tem1), pressure (tem2), ! the velocity, and moisture fields at tpresent to file hdmpfn. ! !----------------------------------------------------------------------- ! tim = tpresent lenstr = LEN(assimnm) CALL strlnth( assimnm, lenstr ) CALL gtdmpfn(assimnm(1:lenstr),dirnam,ldirnm,curtim, & hdmpfmt,mgrid,nestgrd, hdmpfn, ldmpf) WRITE(6,'(1x,a,a)') & 'Retrieved data dump in file ',hdmpfn(1:ldmpf) CALL dtadump(nx,ny,nz,nstyps, & hdmpfmt,nchout,hdmpfn(1:ldmpf),grdbas,filcmprs, & u(1,1,1,tim),v(1,1,1,tim),w(1,1,1,tim),tem1, & tem2,qv(1,1,1,tim),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), & tke,kmh,kmv, & ubar,vbar,tem8,ptbar,pbar,tem9,qvbar, & x,y,z,zp,zp(1,1,2),j1,j2,j3, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11,tem11, & tem5,tem6,tem7) ! !---------------------------------------------------------------------------- ! ! For real data runs, or OSSE runs with simulated filled regions, ! you might like to fill-in the retrieved temperature (tem1) at ! non-data points. Here the raw data is read as flags(tem8). ! !---------------------------------------------------------------------------- !ccxxx isrc=3 !NOTE: temporary fix for 3 files case. ii=3 lendtf=LEN(assimdat(ii-1)) CALL strlnth( assimdat(ii-1), lendtf) ! ! ! write(6,'(/a,a)')'The file name is ',assimdat(i)(1:lendtf) WRITE(6,*) 'lendtf=',lendtf WRITE(6,*) 'The filename assimdat(',ii-1,')=', & assimdat(ii-1)(1:lendtf) CALL radptpr(assimdat(ii-1),lendtf,isrc, & assimtim(ii-1),ireturn, & nx,ny,nz,dx,dy,dz,xor,yor,zor,tem8,tem9) ! !----------------------------------------------------------------------- ! ! assume qv=qvs in rainwater regions with updraft ( > 0.1 m/s). ! In downdraft area, model background mean is used. ! ! Calculate the saturation water vapor specific humidity, ! qvs, from pressure and potential temperature using Teten's formula. ! ! ! Added 01-2-99 by SSW for AMS99 testing ! !----------------------------------------------------------------------- ! ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 pres = pbar(i,j,k)+tem2(i,j,k) temp = (ptbar(i,j,k)+tem1(i,j,k))*((pres/p0)**rddcp) qvsat=(380. / pres) * & !Teten's formula EXP( 17.27 * (temp-273.15)/(temp-35.86) ) ! !SSW/05-22-99 Only saturate updrafts within rainwater region IF(qr(i,j,k,tim) > 0.0001 .AND.w(i,j,k,tim) >= 1.0) THEN !cc IF(qr(i,j,k,tim).gt.0.00002 ) THEN !cc IF(qr(i,j,k,tim).gt.0.00002 !cc : .and.w(i,j,k,tim).ge.0.1) THEN qv(i,j,k,tim) = qvsat work5(i,j,k) = qvsat ELSE work5(i,j,k) = -999. END IF END DO END DO END DO ! ! ! ! !----------------------------------------------------------------------- ! ! Dump out the recovered temperature (tem1), pressure (tem2), wind ! and moisture fields into columns, which will be read and used in ! ARPS DAS. You do not need this if you will not do re-analysis. ! !----------------------------------------------------------------------- ! !ccxxx hardwired working arrays. You need change them !ccxxx using your (nx,ny,nz) !!! !ccxxx DO k=1,nz DO j=1,ny DO i=1,nx work1(i,j,k) = u(i,j,k,tim) work2(i,j,k) = v(i,j,k,tim) work3(i,j,k) = tem1(i,j,k) work4(i,j,k) = tem2(i,j,k) !cc work5(i,j,k) = qv(i,j,k,tim) - qvbar(i,j,k) ! pert qv is dumped work5(i,j,k) = work5(i,j,k) - qvbar(i,j,k) ! pert qv is dumped work6(i,j,k) = qr(i,j,k,tim) work7(i,j,k) = ubar(i,j,k) work8(i,j,k) = vbar(i,j,k) work9(i,j,k) = ptbar(i,j,k) work10(i,j,k) = pbar(i,j,k) work11(i,j,k) = qvbar(i,j,k) END DO END DO END DO ! ! WRITE (*,*) "XXX BASSIM nx,ny,nz",nx,ny,nz CALL assimout(nx,ny,nz,retfname, & x,y,z,zp, & work1,work2,work3,work4,work5,work6, & work7,work8,work9,work10,work11, & tem3,tem5,tem6,tem7,tem8) ! tem8 serves as flag ! !----------------------------------------------------------------------- ! !ccxxx hole-filling the retrieval temperature and pressure !ccxxx at data void area !ccxxx itfil=0 IF(itfil == 0) GO TO 6789 tim = tpresent ptol = 0.001 icount = 0 DO i= 1,nx-1 DO j= 1,ny-1 DO k= 1,nz-1 tem3(i,j,k) = 0.0 tem6(i,j,k) = 0.0 tem7(i,j,k) = 0.0 IF(tem8(i,j,k) == spval) THEN ! Fill P and T outside of rain regions tem4(i,j,k) = spval tem1(i,j,k) = 0.0 tem2(i,j,k) = 0.0 icount = icount + 1 END IF END DO END DO END DO ! print *,'On call to POIS3D, there are ',icount,' filled T values' CALL pois3d(nx,ny,nz,dx,dy,dz,ptol,2.0,tem3,tem4,tem1,tem6,tem7) CALL pois3d(nx,ny,nz,dx,dy,dz,ptol,2.0,tem3,tem4,tem2,tem6,tem7) 6789 CONTINUE ! !ccxxx You need this if you will turn off the blending, but you need !ccxxx turn it off if you will need blending !ccxxx ! DO k=1,nz DO j=1,ny DO i=1,nx tem3(i,j,k) = tem1(i,j,k) tem4(i,j,k) = tem2(i,j,k) END DO END DO END DO ! !---------------------------------------------------------------------------- ! ! Blend retrieved temperatures with the original forecast. ! In general blending will depend on the time of the model relative ! to the data window. ! Blended temperature and pressure go into tem3 and tem4 respectively. ! !---------------------------------------------------------------------------- !ccxxx !ccxxx CALL assimblnd(nx,ny,nz, !ccxxx : ptprt(1,1,1,tpresent),tem1,tem8, !ccxxx : tem5,tem6,tem7,tem3) !ccxxx CALL assimblnd(nx,ny,nz, !ccxxx : pprt(1,1,1,tpresent),tem2,tem8, !ccxxx : tem5,tem6,tem7,tem4) ! ! print *, ' Back from dablend' ! !---------------------------------------------------------------------------- ! ! Determine boundary points. As a temporary short-cut we ! specify zero-gradient bc's in the event that radiation (outflow) ! bc's have been requested. In this case the temporary arrays passed ! into the bc routines are dummy addresses and are not used. ! ! Note: Otherwise, the time tendency are requested. ! !---------------------------------------------------------------------------- ! dtbig1=dtbig dtsml1=dtsml IF(ebc == 4) THEN rebc=3 ELSE rebc=ebc END IF IF(wbc == 4) THEN rwbc=3 ELSE rwbc=wbc END IF IF(nbc == 4) THEN rnbc=3 ELSE rnbc=nbc END IF IF(sbc == 4) THEN rsbc=3 ELSE rsbc=sbc END IF IF(tbc == 4) THEN rtbc=3 ELSE rtbc=tbc END IF IF(bbc == 4) THEN rbbc=3 ELSE rbbc=bbc END IF ! !---------------------------------------------------------------------------- ! ! Zero normal gradient condition are used here. ! tem5,tem6,tem7,tem8 not be used. ! !---------------------------------------------------------------------------- ! CALL bcsclr(nx,ny,nz, dtbig1, tem3, tem3, tem3, & tem5, tem6, tem7, tem8, & rebc,rwbc,rnbc,rsbc,rtbc,rbbc) CALL bcp (nx,ny,nz, dtsml1, tem4, & tem5, tem6, tem7, tem8, & rebc,rwbc,rnbc,rsbc,rtbc,rbbc) PRINT *, ' Back from bc routines' ! !---------------------------------------------------------------------------- ! ! Set pprt and ptprt at times past and future equal to their respective ! distributions at the present time. ! !---------------------------------------------------------------------------- ! DO tlevel = 1, nt DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptprt(i,j,k,tlevel) = tem3(i,j,k) pprt(i,j,k,tlevel) = tem4(i,j,k) END DO END DO END DO END DO ! ! !------------------------------------------------------------------------- ! ! Dump out the recovered temperature (tem1), pressure (tem2), ! the velocity, and moisture fields at tpresent to file hdmpfn. ! !----------------------------------------------------------------------- ! tim = tpresent lenstr = LEN(assimnm) CALL strlnth( assimnm, lenstr ) CALL gtdmpfn(assimnm(1:lenstr),dirnam,ldirnm,curtim, & hdmpfmt,mgrid,nestgrd, hdmpfn, ldmpf) WRITE(6,'(1x,a,a)') & 'Retrieved data dump in file ',hdmpfn(1:ldmpf) CALL dtadump(nx,ny,nz,nstyps, & hdmpfmt,nchout,hdmpfn(1:ldmpf),grdbas,filcmprs, & u(1,1,1,tim),v(1,1,1,tim),w(1,1,1,tim),ptprt(1,1,1,tim), & pprt(1,1,1,tim),qv(1,1,1,tim),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), & tke,kmh,kmv, & ubar,vbar,tem8,ptbar,pbar,tem9,qvbar, & x,y,z,zp,zp(1,1,2),j1,j2,j3, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11, & tem11,tem11,tem11,tem11, & tem5,tem6,tem7) ! ! ! write(6,*)'normally stop after assimptpr' ! STOP ! !SSW 5-18-99 comment out to run arps forward after assimilation WRITE(6,*) 'normally stop after assimptpr' STOP ! ! END IF !----------------------------------------------------------------------- ! ! deallocate the variables and return ! !----------------------------------------------------------------------- DEALLOCATE( tem1 , STAT=istatus) DEALLOCATE( tem2 , STAT=istatus) DEALLOCATE( tem3 , STAT=istatus) DEALLOCATE( tem4 , STAT=istatus) DEALLOCATE( tem5 , STAT=istatus) DEALLOCATE( tem6 , STAT=istatus) DEALLOCATE( tem7 , STAT=istatus) DEALLOCATE( tem8 , STAT=istatus) DEALLOCATE( tem9 , STAT=istatus) DEALLOCATE( tem10, STAT=istatus) DEALLOCATE( tem11, STAT=istatus) DEALLOCATE( work1 , STAT=istatus) DEALLOCATE( work2 , STAT=istatus) DEALLOCATE( work3 , STAT=istatus) DEALLOCATE( work4 , STAT=istatus) DEALLOCATE( work5 , STAT=istatus) DEALLOCATE( work6 , STAT=istatus) DEALLOCATE( work7 , STAT=istatus) DEALLOCATE( work8 , STAT=istatus) DEALLOCATE( work9 , STAT=istatus) DEALLOCATE( work10, STAT=istatus) DEALLOCATE( work11, STAT=istatus) RETURN END SUBROUTINE assimptpr ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RADPTPR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE radptpr(filnam,lendtf, & 2,3 isrc,tim,ireturn, & nx,ny,nz,dx,dy,dz, & xor,yor,zor, & tem1,tem2) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write history data into channel nchanl as unformatted binary data. ! ! All output data are located at the grid cell centers. ! !----------------------------------------------------------------------- ! ! AUTHOR: Steven Lazarus ! 8/10/95. ! ! MODIFICATION HISTORY: ! ! 22/02/96 (Limin Zhao) ! Added ubar and vbar for mean velocity. Changes are also made to ! incorporate the retrieval data. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! filnam Name of the input file ! 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 ! ! dx x grid spacing ! dy y grid spacing ! dz z grid spacing ! ! xor the location of radar station in x-direction ! yor the location of radar station in y-direction ! zor the location of radar station in z-direction ! ! tim time of retrieval data ! isrc Location of calling routine ! ! OUTPUT: ! ! tem1 Observed radial velocity ! tem6 Retrieved u-component ! tem7 Retrieved v-component ! tem8 Retrieved w-component ! tem5 Observed reflectivity ! ubar Retrieved mean velocity of u-component ! vbar Retrieved mean velocity of v-component ! ! WORK ARRAYS: ! ! tem2 Temporary work array. ! tem3 Temporary work array. ! tem4 Temporary work array. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of model grid points in 3 directions INTEGER :: nxr,nyr,nzr ! Number of real data in 3 directions INTEGER :: lendtf,i,j,k,ireturn CHARACTER (LEN=128) :: filnam CHARACTER (LEN=10) :: radarsp INTEGER :: iyrrr,imorr,idarr,iharr,imarr,isarr REAL :: dxr,dyr,dzr REAL :: dx,dy,dz REAL :: xor, yor, zor REAL :: bad REAL :: tim REAL :: umean, vmean REAL :: tem1 (nx,ny,nz) ! Temporary work array REAL :: tem2 (nx,ny,nz) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! REAL :: tref INTEGER :: l INTEGER :: nchanl ! FORTRAN I/O channel number for output INTEGER :: istat INTEGER :: ierr INTEGER :: isrc LOGICAL :: fexist ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'assim.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Assign a proper filename, and check to see if the file exist. ! ! Note: Cray routines are used to force binary data file to be ! in the IEEE format or compatable with IBM. ! !----------------------------------------------------------------------- ! CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(filnam(1:lendtf), '-F f77 -N ieee', ierr) CALL getunit(nchanl) WRITE(6,*) 'nchanl,filnam(1:lendtf): ',nchanl,filnam(1:lendtf) OPEN(UNIT=nchanl,FILE=filnam(1:lendtf), & STATUS='unknown', FORM='unformatted',IOSTAT= istat ) IF( istat /= 0 ) GO TO 998 100 CONTINUE ! !----------------------------------------------------------------------- ! ! Read data in. ! !----------------------------------------------------------------------- ! ! READ(nchanl,ERR=110,END=120) radarsp,iyrrr,imorr,idarr, & iharr,imarr,isarr READ(nchanl,ERR=110,END=120) tim WRITE(6,'(3x,a,f10.2,a)') 'Data read at ',tim,'seconds' IF(isrc == 1.OR.isrc == 2) THEN CALL retunit( nchanl ) CLOSE(nchanl) ireturn=0 RETURN END IF READ(nchanl,ERR=110,END=120) xor, yor, zor READ(nchanl,ERR=110,END=120) nxr,nyr,nzr,dxr,dyr,dzr ! !----------------------------------------------------------------------- ! ! Check to make sure the dimensions of the input data match that of ! the current model stream. ! !----------------------------------------------------------------------- ! IF((nx /= nxr).OR.(ny /= nyr).OR.(nz /= nzr)) THEN WRITE(6,'(a,/a,i5,a,i5,a,i5,/a,i5,a,i5,a,i5)') & ' Array dimension(s) of the input file inconsistent with ', & ' model definitions, dimensions in input data were nx=',nxr, & ', ny=',nyr,', nz=',nzr,' the model definitions were nx=', & nx,' ny= ', ny, ' nz= ',nz WRITE(6,'(a)') ' Job stopped in subroutine RADPTPR.' STOP END IF IF(ABS(dx-dxr) > 0.1 .OR. ABS(dy-dyr) > 0.1 .OR. ABS(dz-dzr) > 0.1) THEN WRITE(6,'(a,/a,f10.2,a,f10.2,a,f10.2,/a,f10.2,a,f10.2,a,f10.2)') & 'Grid interval in the input data inconsisent with', & 'model definitions. In the input data dx=',dxr, & ', dy=',dyr,', dz=',dzr,' the model definitions were dx=', & dx,' dy= ', dy, ' dz= ',dz WRITE(6,'(a)') ' Job stopped in subroutine RADPTPR.' STOP END IF ! !----------------------------------------------------------------------- ! ! Continue reading ! !----------------------------------------------------------------------- ! READ(nchanl,ERR=110,END=120) tem2 ! input Vr READ(nchanl,ERR=110,END=120) tem2 ! input retrieved u component READ(nchanl,ERR=110,END=120) tem2 ! input retrieved v component ! read(nchanl,err=110,end=120) tem1 ! input retrieved w component ! ! read(nchanl,err=110,end=120) tem2 ! input Zr READ(nchanl,ERR=110,END=120) tem2 ! input retrieved w component READ(nchanl,ERR=110,END=120) tem1 ! input Zr CALL retunit(nchanl) CLOSE(nchanl) WRITE (*,*) "XXX RADPTPR have in nx,ny,nz,dx,dy,dz", & nx,ny,nz,dx,dy,dz WRITE (*,*) "XXX RADPTPR read in nx,ny,nz,dx,dy,dz,xor,yor,zor", & nxr,nyr,nzr,dxr,dyr,dzr ! !----------------------------------------------------------------------- ! ! Friendly exit message ! !---------------------------------------------------------------------- ! 930 CONTINUE WRITE(6,'(/a/)') 'Reading was successfully in RADPTPR' ireturn = 0 RETURN ! !----------------------------------------------------------------------- ! ! Error during read ! !---------------------------------------------------------------------- ! 110 CONTINUE WRITE(6,'(/a/)') ' Error reading data in RADPTPR' ireturn=1 RETURN ! !----------------------------------------------------------------------- ! ! End-of-file during read ! !---------------------------------------------------------------------- ! 120 CONTINUE WRITE(6,'(/a/)') ' End of file reached in RADREAD' ireturn=2 998 CONTINUE WRITE(6,'(/1x,a,/1x,a/)') & 'File '//filnam(1:lendtf) & //' not found.', & 'Program returned from RADAREAD.' ireturn=1 RETURN END SUBROUTINE radptpr ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE DABLEND ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE dablend(nx,ny,nz,varorg,varnew,varbln,tem1) ! !-------------------------------------------------------------------------- ! ! PURPOSE: ! ! A weighted average of the array varorg (.e.g., the orginal ! model forecast) and the array varnew (e.g., the data or retreived ! data field) is computed and output in array varbln. ! ! A future modification of this routine may allow for the ! relative weights to vary in space. ! !-------------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: varorg(nx,ny,nz) REAL :: varnew(nx,ny,nz) REAL :: varbln(nx,ny,nz) REAL :: tem1 (nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Include file 'assim.inc' for ARPS ! ! This file contains the control parameters ! used by the data assimilation routines. ! ! These parameters are allocated in named common blocks ! therefore accessible to subroutines that include this file. ! !----------------------------------------------------------------------- ! ! Copyright (c) 1993 ! Center for Analysis and Prediction of Storms !###### University of Oklahoma ###### ! !----------------------------------------------------------------------- ! ! AUTH0R: Keith Brewster ! 02/15/1993 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! darunnm: a character string matching the "runname" used in ! the creation of the files to be read in as data. ! !----------------------------------------------------------------------- ! CHARACTER (LEN=128 ) :: darunnm ! Name of run that produced data file ! REAL :: datime ! INTEGER :: datafmt ! Parameter specifying format of ingested data ! = 1, unformatted binary data; ! = 2, formatted ascii data; ! = 3, NCSA HDF format data; ! = 4, Compressed binary data; CHARACTER (LEN=12) :: dtagbfn ! Ingest data grid/base file name. CHARACTER (LEN=12) :: datafnm ! Ingest data file name. INTEGER :: ldtagbf ! Length of the history data dump file name INTEGER :: ldtafnm ! Length of the history data dump file name COMMON /dtaingst/ darunnm, datime, datafmt, & dtagbfn, ldtagbf, datafnm, ldtafnm REAL :: dastart ! start time (sec) of data assim REAL :: daend ! end time (sec) of data assim INTEGER :: dtimwgt ! type of time weighting ramp ! = 1, weight new =1 (complete replacement). ! = 2, linear weight, new=0 at dastart, 1 at daend ! = 3, linear weight, new=1 at dastart, 0 at daend ! COMMON /dtassim/ dastart,daend,dtimwgt ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! Global constants that control model ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! REAL :: dtwindw,wgtnew,wgtorg INTEGER :: i,j,k ! !----------------------------------------------------------------------- ! ! For current version, the fields are totally replaced by new fields. ! !----------------------------------------------------------------------- ! dtwindw=(daend-dastart) IF(dtwindw == 0. .OR. dtimwgt == 1) THEN wgtnew=1. ELSE IF(dtimwgt == 2) THEN wgtnew=(curtim-dastart)/dtwindw ELSE IF(dtimwgt == 3) THEN wgtnew=(daend-curtim)/dtwindw END IF wgtorg=1.-wgtnew DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 varbln(i,j,k) = wgtorg*varorg(i,j,k) + wgtnew*varnew(i,j,k) END DO END DO END DO RETURN END SUBROUTINE dablend !