! ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GETGEMRUC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE getgemruc(nx_ext, ny_ext, nz_ext,dir_extd,extdname, & 1,10 extdinit,extdfcst,julfname,i4time, & iproj_ext,scale_ext, & trlon_ext,latnot_ext,x0_ext,y0_ext, & lat_ext,lon_ext, & p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, & qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, & istatus, tem1_ext) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Reads external file for processing by ext2arps, a program ! that converts external files to ARPS variables and format. ! ! This version of rdextfil reads RUC (MAPS) data in GEMPAK format ! ! The script Gemenviron must be run by the process running ! this program. It defines GEMPAK symbolic links. ! ! Because of the GEMPAK parameter include file, implicit none ! is not used in this program. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! April, 1995 ! ! MODIFICATIONS: ! Changed external pressure array to be 3-d.to be compatible ! with new ext2arps. 9 August 1995 Keith Brewster ! ! Added code to allow for read creating data forecast hours ! other than those stored in the file by linear time interpolation, ! when necessary. Added tem1_ext to the argument list. ! 20 March 1996 Keith Brewster ! !----------------------------------------------------------------------- ! ! INPUT: ! ! extdinit Initialized time in mm-dd-yyyy:hh:mm:ss format ! extdfcst Forecast hour in HHH:MM:SS format ! julfname File name in yyjjjhhmm format ! i4time Absolute time in seconds (from 1 Jan 1970) of desired data ! ! OUTPUT: ! ! iproj_ext Map projection number of external data ! scale_ext Scale factor of external data ! trlon_ext True longitude of external data (degrees E) ! latnot_ext(2) True latitude(s) of external data (degrees N) ! x0_ext x coordinate of origin of external data ! y0_ext y coordinate of origin of external data ! lat_ext latitude of external data points (degrees N) ! lon_ext longitude of external data points (degrees E) ! p_ext pressure (Pascal) ! hgt_ext height (m) ! t_ext temperature (K) ! qv_ext specific humidity (kg/kg) ! qc_ext Cloud water mixing ratio (kg/kg) ! qr_ext Rain water mixing ratio (kg/kg) ! qi_ext Ice mixing ratio (kg/kg) ! qs_ext Snow mixing ratio (kg/kg) ! qh_ext Hail mixing ratio (kg/kg) ! u_ext u wind component (m/s) ! v_ext v wind component (m/s) ! istatus status indicator ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! INCLUDE 'GEMINC:GEMPRM.PRM' INTEGER :: nx_ext, ny_ext, nz_ext ! CHARACTER (LEN=* ) :: dir_extd CHARACTER (LEN=* ) :: extdname CHARACTER (LEN=* ) :: extdinit CHARACTER (LEN=* ) :: extdfcst CHARACTER (LEN=* ) :: julfname INTEGER :: i4time ! !----------------------------------------------------------------------- ! ! External grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj_ext REAL :: scale_ext,trlon_ext REAL :: latnot_ext(2) REAL :: x0_ext,y0_ext REAL :: x_ext(nx_ext),y_ext(ny_ext) ! !------------------------------------------------------------------------ ! ! MAPS/RUC Grid definition parameters ! !------------------------------------------------------------------------ ! INTEGER :: iproj_ruc REAL :: latnot1_ruc,latnot2_ruc,trlon_ruc,scale_ruc PARAMETER (iproj_ruc =1, & ! Polar Stereographic latnot1_ruc=40., & latnot2_ruc=0., & trlon_ruc =-105., & scale_ruc =1.0) REAL :: dx_ruc,dy_ruc,swlat_ruc,swlon_ruc PARAMETER (dx_ruc = 60000., dy_ruc=60000., & swlat_ruc = 22.8373, & swlon_ruc = -120.491) INTEGER :: fhrinc PARAMETER (fhrinc=3) INTEGER :: nz_ext_mx PARAMETER(nz_ext_mx=41) ! !------------------------------------------------------------------------ ! ! MAPS/RUC variables ! !------------------------------------------------------------------------ ! INTEGER :: ipr_ext(nz_ext_mx) DATA ipr_ext / 1100,1075,1050,1025,1000,975,950,925, & 900, 875, 850, 825, 800,775,750,725, & 700, 675, 650, 625, 600,575,550,525, & 500, 475, 450, 425, 400,375,350,325, & 300, 275, 250, 225, 200,175,150,125, & 100/ ! !----------------------------------------------------------------------- ! ! Output external variable arrays ! !----------------------------------------------------------------------- ! REAL :: lat_ext(nx_ext,ny_ext) REAL :: lon_ext(nx_ext,ny_ext) REAL :: p_ext(nx_ext,ny_ext,nz_ext) REAL :: hgt_ext(nx_ext,ny_ext,nz_ext) REAL :: t_ext(nx_ext,ny_ext,nz_ext) REAL :: qv_ext(nx_ext,ny_ext,nz_ext) REAL :: u_ext(nx_ext,ny_ext,nz_ext) REAL :: v_ext(nx_ext,ny_ext,nz_ext) REAL :: qc_ext(nx_ext,ny_ext,nz_ext) ! Cloud H2O mixing ratio (kg/kg) REAL :: qr_ext(nx_ext,ny_ext,nz_ext) ! Rain H2O mixing ratio (kg/kg) REAL :: qi_ext(nx_ext,ny_ext,nz_ext) ! Ice H2O mixing ratio (kg/kg) REAL :: qs_ext(nx_ext,ny_ext,nz_ext) ! Snow H2O mixing ratio (kg/kg) REAL :: qh_ext(nx_ext,ny_ext,nz_ext) ! Hail H2O mixing ratio (kg/kg) REAL :: tem1_ext(nx_ext,ny_ext,nz_ext) INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Original grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj REAL :: scale,trlon,x0,y0 REAL :: latnot(2) ! !------------------------------------------------------------------------ ! ! GEMPAK variables ! !------------------------------------------------------------------------ ! INTEGER :: inocord,iprcord,ithcord,ihtcord PARAMETER (inocord =0, iprcord =1, & ithcord =2, ihtcord =3) ! REAL :: grid(llnanl) REAL :: rnav(llnnav) INTEGER :: nxgem,nygem,iret INTEGER :: level(2) INTEGER :: ighdr(llgdhd) CHARACTER (LEN=20) :: lastim,timep(2),timef(2) CHARACTER (LEN=72) :: gdcur CHARACTER (LEN=72) :: gdfile ! CHARACTER (LEN=12) :: rucvar ! !------------------------------------------------------------------------ ! ! Physcial parameters ! !------------------------------------------------------------------------ ! REAL :: rd,g PARAMETER (rd=287.053, g=9.81) ! REAL :: gamma,rddg,xconst PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate rddg = (rd/g), & xconst = (rd*gamma/g) ) ! !------------------------------------------------------------------------ ! ! Misc internal variables ! !------------------------------------------------------------------------ ! CHARACTER (LEN=8) :: gmpktm INTEGER :: i,j,k,klev,kstart,itime INTEGER :: fhr,fhpast,fhfutr INTEGER :: iflno,numgrd,maxgrd,len1,len2 REAL :: pratio,dln,tbar,const,qvsat,wgtp,wgtf INTEGER :: iyr,imo,iday,ihr,imin LOGICAL :: tmint,wrtflg,newfil INTEGER :: myr ! LOGICAL :: init_called REAL, ALLOCATABLE :: utmp(:,:), vtmp(:,:) ! !----------------------------------------------------------------------- ! ! Function f_qvsat and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsatl !fpp$ expand (f_qvsatl) !dir$ inline always f_qvsatl SAVE init_called DATA init_called /.false./ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ALLOCATE(utmp(nx_ext,ny_ext)) ALLOCATE(vtmp(nx_ext,ny_ext)) iproj_ext=iproj_ruc scale_ext=scale_ruc ! report lengths in m trlon_ext=trlon_ruc ! orientation of external data grids latnot_ext(1)=latnot1_ruc latnot_ext(2)=latnot2_ruc ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext p_ext(i,j,k)=100.*FLOAT(ipr_ext(k)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Get the lat,lon of the MAPS/RUC grid points ! !----------------------------------------------------------------------- ! CALL getmapr(iproj,scale,latnot,trlon,x0,y0) CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext) CALL lltoxy(1,1,swlat_ruc,swlon_ruc,x0_ext,y0_ext) ! DO i=1,nx_ext x_ext(i)=x0_ext+(i-1)*dx_ruc END DO DO j=1,ny_ext y_ext(j)=y0_ext+(j-1)*dy_ruc END DO CALL xytoll(nx_ext,ny_ext,x_ext,y_ext,lat_ext,lon_ext) ! PRINT *, ' maps point 34,17: ',lat_ext(34,17),lon_ext(34,17) PRINT *, ' maps point nx,ny: ',lat_ext(nx_ext,ny_ext), & lon_ext(nx_ext,ny_ext) ! !----------------------------------------------------------------------- ! ! Initialize GEMPAK sans TAE ! !----------------------------------------------------------------------- ! IF( .NOT.init_called) THEN CALL in_bdta(iret) init_called=.true. END IF ! !----------------------------------------------------------------------- ! ! Build RUC file name ! !----------------------------------------------------------------------- ! READ(extdinit,'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)') & iyr,imo,iday,ihr,imin myr=MOD(iyr,100) len1=LEN(dir_extd) len2=len1 CALL strlnth( dir_extd, len2 ) IF( dir_extd(len2:len2) /= '/' .AND. len2 < len1) THEN len2=len2+1 dir_extd(len2:len2)='/' END IF len1 = LEN( extdname ) CALL strlnth( extdname, len1 ) WRITE(gdfile,'(a,a,a,i4.4,i2.2,i2.2,i2.2)') & dir_extd(1:len2),extdname(1:len1),'.', & iyr,imo,iday,ihr ! !----------------------------------------------------------------------- ! ! Open the grid file ! !----------------------------------------------------------------------- ! PRINT *, ' Opening gdfile= ',gdfile CALL gr_open ( gdfile, wrtflg , gdcur, iflno, lastim, & grid, rnav, numgrd, maxgrd, newfil, iret) IF ( iret == 0 ) THEN PRINT *, ' gdcur = ',gdcur PRINT *, ' iflno = ',iflno PRINT *, ' lastim = ',lastim PRINT *, ' numgrd = ',numgrd PRINT *, ' maxgrd = ',maxgrd PRINT *, ' newfil = ',newfil PRINT *, ' iret = ',iret ELSE WRITE(6,'(a,a,/,a,i4)') ' Error opening file ',gdfile, & ' GEMPAK GR_OPEN return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Build the GEMPAK grid time string ! It has format yymodd/hhmnFHHH ! yy: year mo: month dd: GMT day ! hh: GMT hour mn: minute ! F: separation charcter ! HHH: forecast hour (000 = analysis) ! example time(1)='950126/1200F000' ! !----------------------------------------------------------------------- ! timep(1)=' ' timep(2)=' ' timef(1)=' ' timef(2)=' ' READ(extdfcst,'(i3)') fhr IF(MOD(fhr,fhrinc) /= 0) THEN tmint=.true. fhpast=(fhr/fhrinc)*fhrinc fhfutr=fhpast+fhrinc wgtp=FLOAT(fhfutr-fhr)/FLOAT(fhrinc) wgtf=1.-wgtp ELSE tmint=.false. fhpast=fhr fhfutr=fhr wgtp=1.0 wgtf=0.0 END IF WRITE(timep(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhpast WRITE(6,'(a,a)') ' Past GEMPAK time string ',timep(1) WRITE(timef(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhfutr WRITE(6,'(a,a)') ' Future GEMPAK time string ',timef(1) ! !----------------------------------------------------------------------- ! ! Data in the RUC files are only available from 100-1000 mb. ! Thus this process does not start at pr_ext vertical level one, ! which is at 1100 mb. Find 1000 mb in the ipr_ext vector. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext-1 IF(ipr_ext(klev) <= 1000) EXIT END DO kstart=klev PRINT *, ' kstart = ',kstart ! !----------------------------------------------------------------------- ! ! Go through each of the RUC variables collecting those ! interpolated to pressure surfaces at NMC from the ! original model coordinates (hybrid sigma-isentropic) ! !----------------------------------------------------------------------- ! DO klev=kstart,nz_ext PRINT *, ' Reading level ',ipr_ext(klev) level(1)=ipr_ext(klev) level(2)=-1 ! !----------------------------------------------------------------------- ! ! Heights ! !----------------------------------------------------------------------- ! rucvar='HGHT' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & hgt_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast hght(40,40) = ',hgt_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr hght(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=wgtp*hgt_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Temperatures ! !----------------------------------------------------------------------- ! rucvar='TMPK' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & t_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast t(40,40) = ',t_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr t(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=wgtp*t_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Relative humidity ! !----------------------------------------------------------------------- ! rucvar='RELH' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & qv_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast rh(40,40) = ',qv_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr rh(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext qv_ext(i,j,klev)=wgtp*qv_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! U - Grid relative velocities ! !----------------------------------------------------------------------- ! rucvar='UREL' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & u_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast u(40,40) = ',u_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr u(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext u_ext(i,j,klev)=wgtp*u_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! V - Grid relative velocities ! !----------------------------------------------------------------------- ! rucvar='VREL' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & v_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast v(40,40) = ',v_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr v(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext v_ext(i,j,klev)=wgtp*v_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF END DO ! !----------------------------------------------------------------------- ! ! Extrapolate data to fill in data below 1000 mb ! To begin, set all to be equal to values at lowest ! available MAPS/RUC level. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=hgt_ext(i,j,kstart) t_ext(i,j,klev) =t_ext(i,j,kstart) qv_ext(i,j,klev) =qv_ext(i,j,kstart) u_ext(i,j,klev) =u_ext(i,j,kstart) v_ext(i,j,klev) =v_ext(i,j,kstart) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Extrapolate temperature using standard atmospheric ! lapse rate. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=t_ext(i,j,kstart)* & ( p_ext(i,j,klev) / & p_ext(i,j,kstart) )**xconst END DO END DO PRINT *, ' pr,tks,text = ',ipr_ext(klev), & t_ext(60,36,kstart),t_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Change RUC Relative Humidity to Mixing Ratio for ARPS. ! RH is 0-100% so it is multipled by 0.01 ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qvsat = f_qvsatl( p_ext(i,j,klev), t_ext(i,j,klev) ) qv_ext(i,j,klev)=0.01*qv_ext(i,j,klev)*qvsat END DO END DO END DO PRINT *, ipr_ext(2),' mixing ratio ',qv_ext(60,36,2) PRINT *, ipr_ext(4),' mixing ratio ',qv_ext(60,36,4) PRINT *, ipr_ext(6),' mixing ratio ',qv_ext(60,36,6) PRINT *, ipr_ext(8),' mixing ratio ',qv_ext(60,36,8) ! !----------------------------------------------------------------------- ! ! Set height field ! by integrating T down from kstart level ! !----------------------------------------------------------------------- ! DO klev=kstart-1,1,-1 DO j=1,ny_ext DO i=1,nx_ext dln=ALOG(p_ext(i,j,klev)/p_ext(i,j,klev+1)) const=dln*rddg tbar=0.5*(t_ext(i,j,klev)+t_ext(i,j,klev+1)) hgt_ext(i,j,klev)=hgt_ext(i,j,klev+1)-const*tbar END DO END DO PRINT *, ' pr,hgt(ks),hgt = ',ipr_ext(klev), & hgt_ext(60,36,kstart),hgt_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Rotate winds to be relative to true north. ! The RUC data are sent as grid-relative. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext !2001-05-16 GMB: Having umap & uear (or vmap & vear) point to !the same array causes numerical errors when optimizing. CALL uvmptoe(nx_ext,ny_ext,u_ext(1,1,klev),v_ext(1,1,klev), & lon_ext,utmp,vtmp) u_ext(:,:,klev) = utmp(:,:) v_ext(:,:,klev) = vtmp(:,:) END DO ! !----------------------------------------------------------------------- ! ! Fill qc,qr,qi,qs,qh arrays with missing value. ! !----------------------------------------------------------------------- ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qc_ext(i,j,k)=-999. qr_ext(i,j,k)=-999. qi_ext(i,j,k)=-999. qs_ext(i,j,k)=-999. qh_ext(i,j,k)=-999. END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Reset map projection to previous values ! !----------------------------------------------------------------------- ! CALL setmapr(iproj,scale,latnot,trlon) CALL setorig(1,x0,y0) ! !----------------------------------------------------------------------- ! ! Set good status ! !----------------------------------------------------------------------- ! istatus=1 DEALLOCATE(utmp) DEALLOCATE(vtmp) RETURN END SUBROUTINE getgemruc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GETGEMRUC2 ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE getgemruc2(nx_ext, ny_ext, nz_ext,dir_extd,extdname, & 1,10 extdinit,extdfcst,julfname,i4time, & iproj_ext,scale_ext, & trlon_ext,latnot_ext,x0_ext,y0_ext, & lat_ext,lon_ext, & p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, & qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, & istatus, tem1_ext) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Reads external file for processing by ext2arps, a program ! that converts external files to ARPS variables and format. ! ! This version of rdextfil reads RUC (MAPS) data in GEMPAK format ! ! The script Gemenviron must be run by the process running ! this program. It defines GEMPAK symbolic links. ! ! Because of the GEMPAK parameter include file, implicit none ! is not used in this program. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! April, 1995 ! ! MODIFICATIONS: ! Changed external pressure array to be 3-d.to be compatible ! with new ext2arps. 9 August 1995 Keith Brewster ! ! Added code to allow for read creating data forecast hours ! other than those stored in the file by linear time interpolation, ! when necessary. Added tem1_ext to the argument list. ! 20 March 1996 Keith Brewster ! !----------------------------------------------------------------------- ! ! INPUT: ! ! extdinit Initialized time in mm-dd-yyyy:hh:mm:ss format ! extdfcst Forecast hour in HHH:MM:SS format ! julfname File name in yyjjjhhmm format ! i4time Absolute time in seconds (from 1 Jan 1970) of desired data ! ! OUTPUT: ! ! iproj_ext Map projection number of external data ! scale_ext Scale factor of external data ! trlon_ext True longitude of external data (degrees E) ! latnot_ext(2) True latitude(s) of external data (degrees N) ! x0_ext x coordinate of origin of external data ! y0_ext y coordinate of origin of external data ! lat_ext latitude of external data points (degrees N) ! lon_ext longitude of external data points (degrees E) ! p_ext pressure (Pascal) ! hgt_ext height (m) ! t_ext temperature (K) ! qv_ext specific humidity (kg/kg) ! qc_ext Cloud water mixing ratio (kg/kg) ! qr_ext Rain water mixing ratio (kg/kg) ! qi_ext Ice mixing ratio (kg/kg) ! qs_ext Snow mixing ratio (kg/kg) ! qh_ext Hail mixing ratio (kg/kg) ! u_ext u wind component (m/s) ! v_ext v wind component (m/s) ! istatus status indicator ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! INCLUDE 'GEMINC:GEMPRM.PRM' INTEGER :: nx_ext, ny_ext, nz_ext ! CHARACTER (LEN=* ) :: dir_extd CHARACTER (LEN=* ) :: extdname CHARACTER (LEN=* ) :: extdinit CHARACTER (LEN=* ) :: extdfcst CHARACTER (LEN=* ) :: julfname INTEGER :: i4time ! !----------------------------------------------------------------------- ! ! External grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj_ext REAL :: scale_ext,trlon_ext REAL :: latnot_ext(2) REAL :: x0_ext,y0_ext REAL :: x_ext(nx_ext),y_ext(ny_ext) ! !------------------------------------------------------------------------ ! ! MAPS/RUC Grid definition parameters ! !------------------------------------------------------------------------ ! INTEGER :: iproj_ruc REAL :: latnot1_ruc,latnot2_ruc,trlon_ruc,scale_ruc PARAMETER (iproj_ruc =2, & ! Lambert Conformal latnot1_ruc=25.0, & latnot2_ruc=25.0, & trlon_ruc =-95.0, & scale_ruc =1.0) REAL :: dx_ruc,dy_ruc,swlat_ruc,swlon_ruc PARAMETER (dx_ruc = 40.63525E3, dy_ruc=dx_ruc, & swlat_ruc = 16.2810, & swlon_ruc = -126.1378) INTEGER :: fhrinc PARAMETER (fhrinc=3) ! 1998/02/03 file contains hours 0-3,6,9,12. ! !------------------------------------------------------------------------ ! ! MAPS/RUC variables ! !------------------------------------------------------------------------ ! INTEGER :: nz_ext_mx PARAMETER(nz_ext_mx=41) INTEGER :: ipr_ext(nz_ext_mx) DATA ipr_ext / 1100,1075,1050,1025,1000,975,950,925, & 900, 875, 850, 825, 800,775,750,725, & 700, 675, 650, 625, 600,575,550,525, & 500, 475, 450, 425, 400,375,350,325, & 300, 275, 250, 225, 200,175,150,125, & 100/ ! !----------------------------------------------------------------------- ! ! Output external variable arrays ! !----------------------------------------------------------------------- ! REAL :: lat_ext(nx_ext,ny_ext) REAL :: lon_ext(nx_ext,ny_ext) REAL :: p_ext(nx_ext,ny_ext,nz_ext) REAL :: hgt_ext(nx_ext,ny_ext,nz_ext) REAL :: t_ext(nx_ext,ny_ext,nz_ext) REAL :: qv_ext(nx_ext,ny_ext,nz_ext) REAL :: u_ext(nx_ext,ny_ext,nz_ext) REAL :: v_ext(nx_ext,ny_ext,nz_ext) REAL :: qc_ext(nx_ext,ny_ext,nz_ext) ! Cloud H2O mixing ratio (kg/kg) REAL :: qr_ext(nx_ext,ny_ext,nz_ext) ! Rain H2O mixing ratio (kg/kg) REAL :: qi_ext(nx_ext,ny_ext,nz_ext) ! Ice H2O mixing ratio (kg/kg) REAL :: qs_ext(nx_ext,ny_ext,nz_ext) ! Snow H2O mixing ratio (kg/kg) REAL :: qh_ext(nx_ext,ny_ext,nz_ext) ! Hail H2O mixing ratio (kg/kg) REAL :: tem1_ext(nx_ext,ny_ext,nz_ext) INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Original grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj REAL :: scale,trlon,x0,y0 REAL :: latnot(2) ! !------------------------------------------------------------------------ ! ! GEMPAK variables ! !------------------------------------------------------------------------ ! INTEGER :: inocord,iprcord,ithcord,ihtcord PARAMETER (inocord =0, iprcord =1, & ithcord =2, ihtcord =3) ! REAL :: grid(llnanl) REAL :: rnav(llnnav) INTEGER :: nxgem,nygem,iret INTEGER :: level(2) INTEGER :: ighdr(llgdhd) CHARACTER (LEN=20) :: lastim,timep(2),timef(2) CHARACTER (LEN=72) :: gdcur CHARACTER (LEN=72) :: gdfile ! CHARACTER (LEN=12) :: rucvar ! !------------------------------------------------------------------------ ! ! Physcial parameters ! !------------------------------------------------------------------------ ! REAL :: rd,g PARAMETER (rd=287.053, g=9.81) ! REAL :: gamma,rddg,xconst PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate rddg = (rd/g), & xconst = (rd*gamma/g) ) ! !------------------------------------------------------------------------ ! ! Misc internal variables ! !------------------------------------------------------------------------ ! CHARACTER (LEN=8) :: gmpktm INTEGER :: i,j,k,klev,kstart,itime INTEGER :: fhr,fhpast,fhfutr INTEGER :: iflno,numgrd,maxgrd,len1,len2 REAL :: pratio,dln,tbar,const,qvsat,wgtp,wgtf INTEGER :: iyr,imo,iday,ihr,imin LOGICAL :: tmint,wrtflg,newfil INTEGER :: myr REAL, ALLOCATABLE :: utmp(:,:), vtmp(:,:) ! !----------------------------------------------------------------------- ! ! Function f_qvsatl and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsatl !fpp$ expand (f_qvsatl) !dir$ inline always f_qvsatl LOGICAL :: init_called SAVE init_called DATA init_called /.false./ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ALLOCATE(utmp(nx_ext,ny_ext)) ALLOCATE(vtmp(nx_ext,ny_ext)) iproj_ext=iproj_ruc scale_ext=scale_ruc ! report lengths in m trlon_ext=trlon_ruc ! orientation of external data grids latnot_ext(1)=latnot1_ruc latnot_ext(2)=latnot2_ruc ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext p_ext(i,j,k)=100.*FLOAT(ipr_ext(k)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Get the lat,lon of the MAPS/RUC grid points ! !----------------------------------------------------------------------- ! CALL getmapr(iproj,scale,latnot,trlon,x0,y0) CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext) CALL lltoxy(1,1,swlat_ruc,swlon_ruc,x0_ext,y0_ext) ! DO i=1,nx_ext x_ext(i)=x0_ext+(i-1)*dx_ruc END DO DO j=1,ny_ext y_ext(j)=y0_ext+(j-1)*dy_ruc END DO CALL xytoll(nx_ext,ny_ext,x_ext,y_ext,lat_ext,lon_ext) ! PRINT *, ' maps point 34,17: ',lat_ext(34,17),lon_ext(34,17) PRINT *, ' maps point nx,ny: ',lat_ext(nx_ext,ny_ext), & lon_ext(nx_ext,ny_ext) ! !----------------------------------------------------------------------- ! ! Initialize GEMPAK sans TAE ! !----------------------------------------------------------------------- ! IF( .NOT.init_called) THEN CALL in_bdta(iret) init_called=.true. END IF ! !----------------------------------------------------------------------- ! ! Build RUC file name ! !----------------------------------------------------------------------- ! READ(extdinit,'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)') & iyr,imo,iday,ihr,imin myr=MOD(iyr,100) len1=LEN(dir_extd) len2=len1 CALL strlnth( dir_extd, len2 ) IF( dir_extd(len2:len2) /= '/' .AND. len2 < len1) THEN len2=len2+1 dir_extd(len2:len2)='/' END IF len1 = LEN( extdname ) CALL strlnth( extdname, len1 ) WRITE(gdfile,'(a,a,a,i4.4,i2.2,i2.2,i2.2)') & dir_extd(1:len2),extdname(1:len1),'.', & iyr,imo,iday,ihr ! !----------------------------------------------------------------------- ! ! Open the grid file ! !----------------------------------------------------------------------- ! PRINT *, ' Opening gdfile= ',gdfile CALL gr_open ( gdfile, wrtflg , gdcur, iflno, lastim, & grid, rnav, numgrd, maxgrd, newfil, iret) IF ( iret == 0 ) THEN PRINT *, ' gdcur = ',gdcur PRINT *, ' iflno = ',iflno PRINT *, ' lastim = ',lastim PRINT *, ' numgrd = ',numgrd PRINT *, ' maxgrd = ',maxgrd PRINT *, ' newfil = ',newfil PRINT *, ' iret = ',iret ELSE WRITE(6,'(a,a,/,a,i4)') ' Error opening file ',gdfile, & ' GEMPAK GR_OPEN return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Build the GEMPAK grid time string ! It has format yymodd/hhmnFHHH ! yy: year mo: month dd: GMT day ! hh: GMT hour mn: minute ! F: separation charcter ! HHH: forecast hour (000 = analysis) ! example time(1)='950126/1200F000' ! !----------------------------------------------------------------------- ! timep(1)=' ' timep(2)=' ' timef(1)=' ' timef(2)=' ' READ(extdfcst,'(i3)') fhr IF(MOD(fhr,fhrinc) /= 0) THEN tmint=.true. fhpast=(fhr/fhrinc)*fhrinc fhfutr=fhpast+fhrinc wgtp=FLOAT(fhfutr-fhr)/FLOAT(fhrinc) wgtf=1.-wgtp ELSE tmint=.false. fhpast=fhr fhfutr=fhr wgtp=1.0 wgtf=0.0 END IF WRITE(timep(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhpast WRITE(6,'(a,a)') ' Past GEMPAK time string ',timep(1) WRITE(timef(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhfutr WRITE(6,'(a,a)') ' Future GEMPAK time string ',timef(1) ! !----------------------------------------------------------------------- ! ! Data in the RUC files are only available from 100-1000 mb. ! Thus this process does not start at pr_ext vertical level one, ! which is at 1100 mb. Find 1000 mb in the ipr_ext vector. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext-1 IF(ipr_ext(klev) <= 1000) EXIT END DO kstart=klev PRINT *, ' kstart = ',kstart ! !----------------------------------------------------------------------- ! ! Go through each of the RUC variables collecting those ! interpolated to pressure surfaces at NMC from the ! original model coordinates (hybrid sigma-isentropic) ! !----------------------------------------------------------------------- ! DO klev=kstart,nz_ext PRINT *, ' Reading level ',ipr_ext(klev) level(1)=ipr_ext(klev) level(2)=-1 ! !----------------------------------------------------------------------- ! ! Heights ! !----------------------------------------------------------------------- ! rucvar='HGHT' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & hgt_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast hght(40,40) = ',hgt_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr hght(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=wgtp*hgt_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Temperatures ! !----------------------------------------------------------------------- ! rucvar='TMPK' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & t_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast t(40,40) = ',t_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr t(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=wgtp*t_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Relative humidity ! !----------------------------------------------------------------------- ! rucvar='RELH' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & qv_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast rh(40,40) = ',qv_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr rh(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext qv_ext(i,j,klev)=wgtp*qv_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! U - Grid relative velocities ! !----------------------------------------------------------------------- ! rucvar='UREL' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & u_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast u(40,40) = ',u_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr u(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext u_ext(i,j,klev)=wgtp*u_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! V - Grid relative velocities ! !----------------------------------------------------------------------- ! rucvar='VREL' CALL gd_rdat ( iflno, timep, & level, iprcord, rucvar, & v_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast v(40,40) = ',v_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, rucvar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr v(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext v_ext(i,j,klev)=wgtp*v_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF END DO ! !----------------------------------------------------------------------- ! ! Extrapolate data to fill in data below 1000 mb ! To begin, set all to be equal to values at lowest ! available MAPS/RUC level. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=hgt_ext(i,j,kstart) t_ext(i,j,klev) =t_ext(i,j,kstart) qv_ext(i,j,klev) =qv_ext(i,j,kstart) u_ext(i,j,klev) =u_ext(i,j,kstart) v_ext(i,j,klev) =v_ext(i,j,kstart) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Extrapolate temperature using standard atmospheric ! lapse rate. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=t_ext(i,j,kstart)* & ( p_ext(i,j,klev) / & p_ext(i,j,kstart) )**xconst END DO END DO PRINT *, ' pr,tks,text = ',ipr_ext(klev), & t_ext(60,36,kstart),t_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Change RUC Relative Humidity to Mixing Ratio for ARPS ! RH is 0-100% so it is multipled by 0.01 ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qvsat = f_qvsatl( p_ext(i,j,klev), t_ext(i,j,klev) ) qv_ext(i,j,klev)=0.01*qv_ext(i,j,klev)*qvsat END DO END DO END DO PRINT *, ipr_ext(2),' mixing ratio ',qv_ext(60,36,2) PRINT *, ipr_ext(4),' mixing ratio ',qv_ext(60,36,4) PRINT *, ipr_ext(6),' mixing ratio ',qv_ext(60,36,6) PRINT *, ipr_ext(8),' mixing ratio ',qv_ext(60,36,8) ! !----------------------------------------------------------------------- ! ! Set height field ! by integrating T down from kstart level ! !----------------------------------------------------------------------- ! DO klev=kstart-1,1,-1 DO j=1,ny_ext DO i=1,nx_ext dln=ALOG(p_ext(i,j,klev)/p_ext(i,j,klev+1)) const=dln*rddg tbar=0.5*(t_ext(i,j,klev)+t_ext(i,j,klev+1)) hgt_ext(i,j,klev)=hgt_ext(i,j,klev+1)-const*tbar END DO END DO PRINT *, ' pr,hgt(ks),hgt = ',ipr_ext(klev), & hgt_ext(60,36,kstart),hgt_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Rotate winds to be relative to true north. ! The RUC data are sent as grid-relative. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext !2001-05-16 GMB: Having umap & uear (or vmap & vear) point to !the same array causes numerical errors when optimizing. CALL uvmptoe(nx_ext,ny_ext,u_ext(1,1,klev),v_ext(1,1,klev), & lon_ext,utmp,vtmp) u_ext(:,:,klev) = utmp(:,:) v_ext(:,:,klev) = vtmp(:,:) END DO ! !----------------------------------------------------------------------- ! ! Fill qc,qr,qi,qs,qh arrays with missing value. ! !----------------------------------------------------------------------- ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qc_ext(i,j,k)=-999. qr_ext(i,j,k)=-999. qi_ext(i,j,k)=-999. qs_ext(i,j,k)=-999. qh_ext(i,j,k)=-999. END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Reset map projection to previous values ! !----------------------------------------------------------------------- ! CALL setmapr(iproj,scale,latnot,trlon) CALL setorig(1,x0,y0) ! !----------------------------------------------------------------------- ! ! Set good status ! !----------------------------------------------------------------------- ! istatus=1 DEALLOCATE(utmp) DEALLOCATE(vtmp) RETURN END SUBROUTINE getgemruc2 ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GETGEMETA ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE getgemeta(nx_ext,ny_ext,nz_ext,dir_extd,extdname, & 1,9 extdinit,extdfcst,julfname,i4time, & iproj_ext,scale_ext, & trlon_ext,latnot_ext,x0_ext,y0_ext, & lat_ext,lon_ext, & p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, & qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, & istatus, tem1_ext) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Reads external file for processing by ext2arps, a program ! that converts external files to ARPS variables and format. ! ! This version of rdextfil reads NCEP Eta data in GEMPAK format ! ! The script Gemenviron must be run by the process running ! this program. It defines GEMPAK symbolic links. ! ! Because of the GEMPAK parameter include file, implicit none ! is not used in this program. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! Based on GETGEMRUC ! June, 1996 ! ! MODIFICATIONS: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! extdinit Initialized time in mm-dd-yyyy:hh:mm:ss format ! extdfcst Forecast hour in HHH:MM:SS format ! julfname File name in yyjjjhhmm format ! i4time Absolute time in seconds (from 1 Jan 1970) of desired data ! ! OUTPUT: ! ! iproj_ext Map projection number of external data ! scale_ext Scale factor of external data ! trlon_ext True longitude of external data (degrees E) ! latnot_ext(2) True latitude(s) of external data (degrees N) ! x0_ext x coordinate of origin of external data ! y0_ext y coordinate of origin of external data ! lat_ext latitude of external data points (degrees N) ! lon_ext longitude of external data points (degrees E) ! p_ext pressure (Pascal) ! hgt_ext height (m) ! t_ext temperature (K) ! qv_ext specific humidity (kg/kg) ! qc_ext Cloud water mixing ratio (kg/kg) ! qr_ext Rain water mixing ratio (kg/kg) ! qi_ext Ice mixing ratio (kg/kg) ! qs_ext Snow mixing ratio (kg/kg) ! qh_ext Hail mixing ratio (kg/kg) ! u_ext u wind component (m/s) ! v_ext v wind component (m/s) ! istatus status indicator ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! INCLUDE 'GEMINC:GEMPRM.PRM' INTEGER :: nx_ext, ny_ext, nz_ext ! CHARACTER (LEN=* ) :: dir_extd CHARACTER (LEN=* ) :: extdname CHARACTER (LEN=* ) :: extdinit CHARACTER (LEN=* ) :: extdfcst CHARACTER (LEN=* ) :: julfname INTEGER :: i4time ! !----------------------------------------------------------------------- ! ! External grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj_ext REAL :: scale_ext,trlon_ext REAL :: latnot_ext(2) REAL :: x0_ext,y0_ext REAL :: x_ext(nx_ext),y_ext(ny_ext) ! !------------------------------------------------------------------------ ! ! Eta Grid definition parameters ! !------------------------------------------------------------------------ ! INTEGER :: iproj_eta REAL :: latnot1_eta,latnot2_eta,trlon_eta,scale_eta PARAMETER (iproj_eta =1, & ! Polar Stereographic latnot1_eta=40., & latnot2_eta=0., & trlon_eta =-105., & scale_eta =1.0) REAL :: dx_eta,dy_eta,swlat_eta,swlon_eta PARAMETER (dx_eta = 80000., dy_eta=80000., & swlat_eta = 17.53, & swlon_eta = -129.30) INTEGER :: fhrinc PARAMETER (fhrinc=6) ! !------------------------------------------------------------------------ ! ! Eta variables ! !------------------------------------------------------------------------ ! INTEGER :: nz_ext_mx PARAMETER(nz_ext_mx=41) INTEGER :: ipr_ext(nz_ext_mx) DATA ipr_ext / 1000,975,950, & 900,875,850,825,800,775,750,725, & 700,675,650,625,600,575,550,525, & 500,475,450,425,400,375,350,325, & 300,275,250,225,200,175,150,125, & 100, 75, 50, 0, 0, 0/ ! !----------------------------------------------------------------------- ! ! Output external variable arrays ! !----------------------------------------------------------------------- ! REAL :: lat_ext(nx_ext,ny_ext) REAL :: lon_ext(nx_ext,ny_ext) REAL :: p_ext(nx_ext,ny_ext,nz_ext) REAL :: hgt_ext(nx_ext,ny_ext,nz_ext) REAL :: t_ext(nx_ext,ny_ext,nz_ext) REAL :: qv_ext(nx_ext,ny_ext,nz_ext) REAL :: u_ext(nx_ext,ny_ext,nz_ext) REAL :: v_ext(nx_ext,ny_ext,nz_ext) REAL :: qc_ext(nx_ext,ny_ext,nz_ext) ! Cloud H2O mixing ratio (kg/kg) REAL :: qr_ext(nx_ext,ny_ext,nz_ext) ! Rain H2O mixing ratio (kg/kg) REAL :: qi_ext(nx_ext,ny_ext,nz_ext) ! Ice H2O mixing ratio (kg/kg) REAL :: qs_ext(nx_ext,ny_ext,nz_ext) ! Snow H2O mixing ratio (kg/kg) REAL :: qh_ext(nx_ext,ny_ext,nz_ext) ! Hail H2O mixing ratio (kg/kg) REAL :: tem1_ext(nx_ext,ny_ext,nz_ext) INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Original grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj REAL :: scale,trlon,x0,y0 REAL :: latnot(2) ! !------------------------------------------------------------------------ ! ! GEMPAK variables ! !------------------------------------------------------------------------ ! INTEGER :: inocord,iprcord,ithcord,ihtcord PARAMETER (inocord =0, iprcord =1, & ithcord =2, ihtcord =3) ! REAL :: grid(llnanl) REAL :: rnav(llnnav) INTEGER :: nxgem,nygem,iret INTEGER :: level(2) INTEGER :: ighdr(llgdhd) CHARACTER (LEN=20) :: lastim,timep(2),timef(2) CHARACTER (LEN=72) :: gdcur CHARACTER (LEN=72) :: gdfile ! CHARACTER (LEN=12) :: etavar ! !------------------------------------------------------------------------ ! ! Physcial parameters ! !------------------------------------------------------------------------ ! REAL :: rd,g PARAMETER (rd=287.053, g=9.81) ! REAL :: gamma,rddg,xconst PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate rddg = (rd/g), & xconst = (rd*gamma/g) ) ! !------------------------------------------------------------------------ ! ! Misc internal variables ! !------------------------------------------------------------------------ ! CHARACTER (LEN=8) :: gmpktm INTEGER :: i,j,k,klev,kstart,itime INTEGER :: fhr,fhpast,fhfutr INTEGER :: iflno,numgrd,maxgrd,len1,len2 REAL :: pratio,dln,tbar,const,qvsat,wgtp,wgtf INTEGER :: iyr,imo,iday,ihr,imin LOGICAL :: tmint,wrtflg,newfil LOGICAL :: init_called REAL, ALLOCATABLE :: utmp(:,:), vtmp(:,:) ! !----------------------------------------------------------------------- ! ! Function f_qvsat and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsat !fpp$ expand (f_qvsat) !dir$ inline always f_qvsat SAVE init_called DATA init_called /.false./ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ALLOCATE(utmp(nx_ext,ny_ext)) ALLOCATE(vtmp(nx_ext,ny_ext)) iproj_ext=iproj_eta scale_ext=scale_eta ! report lengths in m trlon_ext=trlon_eta ! orientation of external data grids latnot_ext(1)=latnot1_eta latnot_ext(2)=latnot2_eta ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext p_ext(i,j,k)=100.*FLOAT(ipr_ext(k)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Get the lat,lon of the Eta grid points ! !----------------------------------------------------------------------- ! CALL getmapr(iproj,scale,latnot,trlon,x0,y0) CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext) CALL lltoxy(1,1,swlat_eta,swlon_eta,x0_ext,y0_ext) ! DO i=1,nx_ext x_ext(i)=x0_ext+(i-1)*dx_eta END DO DO j=1,ny_ext y_ext(j)=y0_ext+(j-1)*dy_eta END DO CALL xytoll(nx_ext,ny_ext,x_ext,y_ext,lat_ext,lon_ext) ! PRINT *, ' eta point 34,17: ',lat_ext(34,17),lon_ext(34,17) PRINT *, ' eta point nx,ny: ',lat_ext(nx_ext,ny_ext), & lon_ext(nx_ext,ny_ext) ! !----------------------------------------------------------------------- ! ! Initialize GEMPAK sans TAE ! !----------------------------------------------------------------------- ! IF( .NOT.init_called) THEN CALL in_bdta(iret) init_called=.true. END IF ! !----------------------------------------------------------------------- ! ! Build Eta file name ! !----------------------------------------------------------------------- ! READ(extdinit,'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)') & iyr,imo,iday,ihr,imin myr=MOD(iyr,100) len1=LEN(dir_extd) len2=len1 CALL strlnth( dir_extd, len2 ) IF( dir_extd(len2:len2) /= '/' .AND. len2 < len1) THEN len2=len2+1 dir_extd(len2:len2)='/' END IF len1 = LEN( extdname ) CALL strlnth( extdname, len1 ) WRITE(gdfile,'(a,a,a,i4.4,i2.2,i2.2,i2.2)') & dir_extd(1:len2),extdname(1:len1),'.', & iyr,imo,iday,ihr ! !----------------------------------------------------------------------- ! ! Open the grid file ! !----------------------------------------------------------------------- ! PRINT *, ' Opening gdfile= ',gdfile CALL gr_open ( gdfile, wrtflg , gdcur, iflno, lastim, & grid, rnav, numgrd, maxgrd, newfil, iret) IF ( iret == 0 ) THEN PRINT *, ' gdcur = ',gdcur PRINT *, ' iflno = ',iflno PRINT *, ' lastim = ',lastim PRINT *, ' numgrd = ',numgrd PRINT *, ' maxgrd = ',maxgrd PRINT *, ' newfil = ',newfil PRINT *, ' iret = ',iret ELSE WRITE(6,'(a,a,/,a,i4)') ' Error opening file ',gdfile, & ' GEMPAK GR_OPEN return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Build the GEMPAK grid time string ! It has format yymodd/hhmnFHHH ! yy: year mo: month dd: GMT day ! hh: GMT hour mn: minute ! F: separation charcter ! HHH: forecast hour (000 = analysis) ! example time(1)='950126/1200F000' ! !----------------------------------------------------------------------- ! timep(1)=' ' timep(2)=' ' timef(1)=' ' timef(2)=' ' READ(extdfcst,'(i3)') fhr IF(MOD(fhr,fhrinc) /= 0) THEN tmint=.true. fhpast=(fhr/fhrinc)*fhrinc fhfutr=fhpast+fhrinc wgtp=FLOAT(fhfutr-fhr)/FLOAT(fhrinc) wgtf=1.-wgtp ELSE tmint=.false. fhpast=fhr fhfutr=fhr wgtp=1.0 wgtf=0.0 END IF WRITE(timep(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhpast WRITE(6,'(a,a)') ' Past GEMPAK time string ',timep(1) WRITE(timef(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhfutr WRITE(6,'(a,a)') ' Future GEMPAK time string ',timef(1) ! !----------------------------------------------------------------------- ! ! Data in the RUC files are only available from 100-1000 mb. ! Thus this process does not start at pr_ext vertical level one, ! which is at 1100 mb. Find 1000 mb in the ipr_ext vector. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext-1 IF(ipr_ext(klev) <= 1000) EXIT END DO kstart=klev PRINT *, ' kstart = ',kstart ! !----------------------------------------------------------------------- ! ! Go through each of the RUC variables collecting those ! interpolated to pressure surfaces at NMC from the ! original model coordinates (hybrid sigma-isentropic) ! !----------------------------------------------------------------------- ! DO klev=kstart,nz_ext PRINT *, ' Reading level ',ipr_ext(klev) level(1)=ipr_ext(klev) level(2)=-1 ! !----------------------------------------------------------------------- ! ! Heights ! !----------------------------------------------------------------------- ! etavar='HGHT' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & hgt_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast hght(40,40) = ',hgt_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr hght(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=wgtp*hgt_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Temperatures ! !----------------------------------------------------------------------- ! etavar='TMPK' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & t_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast t(40,40) = ',t_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr t(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=wgtp*t_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Relative humidity ! !----------------------------------------------------------------------- ! etavar='SPFH' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & qv_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast qv(40,40) = ',qv_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr qv(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext qv_ext(i,j,klev)=wgtp*qv_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! U - Grid relative velocities ! !----------------------------------------------------------------------- ! etavar='UREL' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & u_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast u(40,40) = ',u_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr u(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext u_ext(i,j,klev)=wgtp*u_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! V - Grid relative velocities ! !----------------------------------------------------------------------- ! etavar='VREL' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & v_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast v(40,40) = ',v_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr v(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext v_ext(i,j,klev)=wgtp*v_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF END DO ! !----------------------------------------------------------------------- ! ! Extrapolate data to fill in data below 1000 mb ! To begin, set all to be equal to values at lowest ! available MAPS/RUC level. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=hgt_ext(i,j,kstart) t_ext(i,j,klev) =t_ext(i,j,kstart) qv_ext(i,j,klev) =qv_ext(i,j,kstart) u_ext(i,j,klev) =u_ext(i,j,kstart) v_ext(i,j,klev) =v_ext(i,j,kstart) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Extrapolate temperature using standard atmospheric ! lapse rate. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=t_ext(i,j,kstart)* & ( p_ext(i,j,klev) / & p_ext(i,j,kstart) )**xconst END DO END DO PRINT *, ' pr,tks,text = ',ipr_ext(klev), & t_ext(60,36,kstart),t_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Change RUC Relative Humidity to Mixing Ratio for ARPS ! RH is 0-100% so it is multipled by 0.01 ! !----------------------------------------------------------------------- ! ! DO 425 klev=1,nz_ext ! DO 425 j=1,ny_ext ! DO 425 i=1,nx_ext ! qvsat = f_qvsat( p_ext(i,j,klev), t_ext(i,j,klev) ) ! qv_ext(i,j,klev)=0.01*qv_ext(i,j,klev)*qvsat ! 425 CONTINUE ! print *, ipr_ext(2),' mixing ratio ',qv_ext(60,36,2) ! print *, ipr_ext(4),' mixing ratio ',qv_ext(60,36,4) ! print *, ipr_ext(6),' mixing ratio ',qv_ext(60,36,6) ! print *, ipr_ext(8),' mixing ratio ',qv_ext(60,36,8) ! !----------------------------------------------------------------------- ! ! Set height field ! by integrating T down from kstart level ! !----------------------------------------------------------------------- ! DO klev=kstart-1,1,-1 DO j=1,ny_ext DO i=1,nx_ext dln=ALOG(p_ext(i,j,klev)/p_ext(i,j,klev+1)) const=dln*rddg tbar=0.5*(t_ext(i,j,klev)+t_ext(i,j,klev+1)) hgt_ext(i,j,klev)=hgt_ext(i,j,klev+1)-const*tbar END DO END DO PRINT *, ' pr,hgt(ks),hgt = ',ipr_ext(klev), & hgt_ext(60,36,kstart),hgt_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Rotate winds to be relative to true north. ! The RUC data are sent as grid-relative. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext !2001-05-16 GMB: Having umap & uear (or vmap & vear) point to !the same array causes numerical errors when optimizing. CALL uvmptoe(nx_ext,ny_ext,u_ext(1,1,klev),v_ext(1,1,klev), & lon_ext,utmp,vtmp) u_ext(:,:,klev) = utmp(:,:) v_ext(:,:,klev) = vtmp(:,:) END DO ! !----------------------------------------------------------------------- ! ! Fill qc,qr,qi,qs,qh arrays with missing value. ! !----------------------------------------------------------------------- ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qc_ext(i,j,k)=-999. qr_ext(i,j,k)=-999. qi_ext(i,j,k)=-999. qs_ext(i,j,k)=-999. qh_ext(i,j,k)=-999. END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Reset map projection to previous values ! !----------------------------------------------------------------------- ! CALL setmapr(iproj,scale,latnot,trlon) CALL setorig(1,x0,y0) ! !----------------------------------------------------------------------- ! ! Set good status ! !----------------------------------------------------------------------- ! istatus=1 DEALLOCATE(utmp) DEALLOCATE(vtmp) RETURN END SUBROUTINE getgemeta ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GETGEMETA2 ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE getgemeta2(nx_ext,ny_ext,nz_ext,dir_extd,extdname, & 1,9 extdinit,extdfcst,julfname,i4time, & iproj_ext,scale_ext, & trlon_ext,latnot_ext,x0_ext,y0_ext, & lat_ext,lon_ext, & p_ext,hgt_ext,t_ext,qv_ext,u_ext,v_ext, & qc_ext,qr_ext,qi_ext,qs_ext,qh_ext, & istatus, tem1_ext) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Reads external file for processing by ext2arps, a program ! that converts external files to ARPS variables and format. ! ! This version of rdextfil reads NCEP Eta data in GEMPAK format ! ! The script Gemenviron must be run by the process running ! this program. It defines GEMPAK symbolic links. ! ! Because of the GEMPAK parameter include file, implicit none ! is not used in this program. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! Based on GETGEMRUC ! June, 1996 ! ! MODIFICATIONS: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! extdinit Initialized time in mm-dd-yyyy:hh:mm:ss format ! extdfcst Forecast hour in HHH:MM:SS format ! julfname File name in yyjjjhhmm format ! i4time Absolute time in seconds (from 1 Jan 1970) of desired data ! ! OUTPUT: ! ! iproj_ext Map projection number of external data ! scale_ext Scale factor of external data ! trlon_ext True longitude of external data (degrees E) ! latnot_ext(2) True latitude(s) of external data (degrees N) ! x0_ext x coordinate of origin of external data ! y0_ext y coordinate of origin of external data ! lat_ext latitude of external data points (degrees N) ! lon_ext longitude of external data points (degrees E) ! p_ext pressure (Pascal) ! hgt_ext height (m) ! t_ext temperature (K) ! qv_ext specific humidity (kg/kg) ! qc_ext Cloud water mixing ratio (kg/kg) ! qr_ext Rain water mixing ratio (kg/kg) ! qi_ext Ice mixing ratio (kg/kg) ! qs_ext Snow mixing ratio (kg/kg) ! qh_ext Hail mixing ratio (kg/kg) ! u_ext u wind component (m/s) ! v_ext v wind component (m/s) ! istatus status indicator ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! INCLUDE 'GEMINC:GEMPRM.PRM' INTEGER :: nx_ext, ny_ext, nz_ext ! CHARACTER (LEN=* ) :: dir_extd CHARACTER (LEN=* ) :: extdname CHARACTER (LEN=* ) :: extdinit CHARACTER (LEN=* ) :: extdfcst CHARACTER (LEN=* ) :: julfname INTEGER :: i4time ! !----------------------------------------------------------------------- ! ! External grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj_ext REAL :: scale_ext,trlon_ext REAL :: latnot_ext(2) REAL :: x0_ext,y0_ext REAL :: x_ext(nx_ext),y_ext(ny_ext) ! !------------------------------------------------------------------------ ! ! Eta Grid definition parameters ! !------------------------------------------------------------------------ ! INTEGER :: iproj_eta REAL :: latnot1_eta,latnot2_eta,trlon_eta,scale_eta PARAMETER (iproj_eta =1, & ! Polar Stereographic latnot1_eta=40.15, & latnot2_eta=0., & trlon_eta =-105., & scale_eta =1.0) REAL :: dx_eta,dy_eta,swlat_eta,swlon_eta PARAMETER (dx_eta = 80000., dy_eta=80000., & swlat_eta = -0.27, & swlon_eta = -139.48) INTEGER :: fhrinc PARAMETER (fhrinc=6) ! !------------------------------------------------------------------------ ! ! Eta variables ! !------------------------------------------------------------------------ ! INTEGER :: nz_ext_mx PARAMETER(nz_ext_mx=41) INTEGER :: ipr_ext(nz_ext_mx) DATA ipr_ext / 1000, 975, 950, 925, & 900, 875, 850, 825, 800,775,750,725, & 700, 675, 650, 625, 600,575,550,525, & 500, 475, 450, 425, 400,375,350,325, & 300, 275, 250, 225, 200,175,150,125, & 100, 75, 50, 0, 0/ ! !----------------------------------------------------------------------- ! ! Output external variable arrays ! !----------------------------------------------------------------------- ! REAL :: lat_ext(nx_ext,ny_ext) REAL :: lon_ext(nx_ext,ny_ext) REAL :: p_ext(nx_ext,ny_ext,nz_ext) REAL :: hgt_ext(nx_ext,ny_ext,nz_ext) REAL :: t_ext(nx_ext,ny_ext,nz_ext) REAL :: qv_ext(nx_ext,ny_ext,nz_ext) REAL :: u_ext(nx_ext,ny_ext,nz_ext) REAL :: v_ext(nx_ext,ny_ext,nz_ext) REAL :: qc_ext(nx_ext,ny_ext,nz_ext) ! Cloud H2O mixing ratio (kg/kg) REAL :: qr_ext(nx_ext,ny_ext,nz_ext) ! Rain H2O mixing ratio (kg/kg) REAL :: qi_ext(nx_ext,ny_ext,nz_ext) ! Ice H2O mixing ratio (kg/kg) REAL :: qs_ext(nx_ext,ny_ext,nz_ext) ! Snow H2O mixing ratio (kg/kg) REAL :: qh_ext(nx_ext,ny_ext,nz_ext) ! Hail H2O mixing ratio (kg/kg) REAL :: tem1_ext(nx_ext,ny_ext,nz_ext) INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Original grid variables ! !----------------------------------------------------------------------- ! INTEGER :: iproj REAL :: scale,trlon,x0,y0 REAL :: latnot(2) ! !------------------------------------------------------------------------ ! ! GEMPAK variables ! !------------------------------------------------------------------------ ! INTEGER :: inocord,iprcord,ithcord,ihtcord PARAMETER (inocord =0, iprcord =1, & ithcord =2, ihtcord =3) ! REAL :: grid(llnanl) REAL :: rnav(llnnav) INTEGER :: nxgem,nygem,iret INTEGER :: level(2) INTEGER :: ighdr(llgdhd) CHARACTER (LEN=20) :: lastim,timep(2),timef(2) CHARACTER (LEN=72) :: gdcur CHARACTER (LEN=72) :: gdfile ! CHARACTER (LEN=12) :: etavar ! !------------------------------------------------------------------------ ! ! Physcial parameters ! !------------------------------------------------------------------------ ! REAL :: rd,g PARAMETER (rd=287.053, g=9.81) ! REAL :: gamma,rddg,xconst PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate rddg = (rd/g), & xconst = (rd*gamma/g) ) ! !------------------------------------------------------------------------ ! ! Misc internal variables ! !------------------------------------------------------------------------ ! CHARACTER (LEN=8) :: gmpktm INTEGER :: i,j,k,klev,kstart,itime INTEGER :: fhr,fhpast,fhfutr INTEGER :: iflno,numgrd,maxgrd,len1,len2 REAL :: pratio,dln,tbar,const,qvsat,wgtp,wgtf INTEGER :: iyr,imo,iday,ihr,imin LOGICAL :: tmint,wrtflg,newfil LOGICAL :: init_called REAL, ALLOCATABLE :: utmp(:,:), vtmp(:,:) ! !----------------------------------------------------------------------- ! ! Function f_qvsat and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsat !fpp$ expand (f_qvsat) !dir$ inline always f_qvsat SAVE init_called DATA init_called /.false./ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ALLOCATE(utmp(nx_ext,ny_ext)) ALLOCATE(vtmp(nx_ext,ny_ext)) iproj_ext=iproj_eta scale_ext=scale_eta ! report lengths in m trlon_ext=trlon_eta ! orientation of external data grids latnot_ext(1)=latnot1_eta latnot_ext(2)=latnot2_eta ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext p_ext(i,j,k)=100.*FLOAT(ipr_ext(k)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Get the lat,lon of the Eta grid points ! !----------------------------------------------------------------------- ! CALL getmapr(iproj,scale,latnot,trlon,x0,y0) CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext) CALL lltoxy(1,1,swlat_eta,swlon_eta,x0_ext,y0_ext) ! DO i=1,nx_ext x_ext(i)=x0_ext+(i-1)*dx_eta END DO DO j=1,ny_ext y_ext(j)=y0_ext+(j-1)*dy_eta END DO CALL xytoll(nx_ext,ny_ext,x_ext,y_ext,lat_ext,lon_ext) ! PRINT *, ' eta point 34,17: ',lat_ext(34,17),lon_ext(34,17) PRINT *, ' eta point nx,ny: ',lat_ext(nx_ext,ny_ext), & lon_ext(nx_ext,ny_ext) PRINT *, ' above should be: ', 32.75, -14.60 ! !----------------------------------------------------------------------- ! ! Initialize GEMPAK sans TAE ! !----------------------------------------------------------------------- ! IF( .NOT.init_called) THEN CALL in_bdta(iret) init_called=.true. END IF ! !----------------------------------------------------------------------- ! ! Build Eta file name ! !----------------------------------------------------------------------- ! READ(extdinit,'(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2)') & iyr,imo,iday,ihr,imin myr=MOD(iyr,100) len1=LEN(dir_extd) len2=len1 CALL strlnth( dir_extd, len2 ) IF( dir_extd(len2:len2) /= '/' .AND. len2 < len1) THEN len2=len2+1 dir_extd(len2:len2)='/' END IF len1 = LEN( extdname ) CALL strlnth( extdname, len1 ) WRITE(gdfile,'(a,a,a,i4.4,i2.2,i2.2,i2.2)') & dir_extd(1:len2),extdname(1:len1),'.', & iyr,imo,iday,ihr ! !----------------------------------------------------------------------- ! ! Open the grid file ! !----------------------------------------------------------------------- ! PRINT *, ' Opening gdfile= ',gdfile CALL gr_open ( gdfile, wrtflg , gdcur, iflno, lastim, & grid, rnav, numgrd, maxgrd, newfil, iret) IF ( iret == 0 ) THEN PRINT *, ' gdcur = ',gdcur PRINT *, ' iflno = ',iflno PRINT *, ' lastim = ',lastim PRINT *, ' numgrd = ',numgrd PRINT *, ' maxgrd = ',maxgrd PRINT *, ' newfil = ',newfil PRINT *, ' iret = ',iret ELSE WRITE(6,'(a,a,/,a,i4)') ' Error opening file ',gdfile, & ' GEMPAK GR_OPEN return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Build the GEMPAK grid time string ! It has format yymodd/hhmnFHHH ! yy: year mo: month dd: GMT day ! hh: GMT hour mn: minute ! F: separation charcter ! HHH: forecast hour (000 = analysis) ! example time(1)='950126/1200F000' ! !----------------------------------------------------------------------- ! timep(1)=' ' timep(2)=' ' timef(1)=' ' timef(2)=' ' READ(extdfcst,'(i3)') fhr IF(MOD(fhr,fhrinc) /= 0) THEN tmint=.true. fhpast=(fhr/fhrinc)*fhrinc fhfutr=fhpast+fhrinc wgtp=FLOAT(fhfutr-fhr)/FLOAT(fhrinc) wgtf=1.-wgtp ELSE tmint=.false. fhpast=fhr fhfutr=fhr wgtp=1.0 wgtf=0.0 END IF WRITE(timep(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhpast WRITE(6,'(a,a)') ' Past GEMPAK time string ',timep(1) WRITE(timef(1),'(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3)') & myr,imo,iday,'/',ihr,imin,'F',fhfutr WRITE(6,'(a,a)') ' Future GEMPAK time string ',timef(1) ! !----------------------------------------------------------------------- ! ! Data in the RUC files are only available from 100-1000 mb. ! Thus this process does not start at pr_ext vertical level one, ! which is at 1100 mb. Find 1000 mb in the ipr_ext vector. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext-1 IF(ipr_ext(klev) <= 1000) EXIT END DO kstart=klev PRINT *, ' kstart = ',kstart ! !----------------------------------------------------------------------- ! ! Go through each of the RUC variables collecting those ! interpolated to pressure surfaces at NMC from the ! original model coordinates (hybrid sigma-isentropic) ! !----------------------------------------------------------------------- ! DO klev=kstart,nz_ext PRINT *, ' Reading level ',ipr_ext(klev) level(1)=ipr_ext(klev) level(2)=-1 ! !----------------------------------------------------------------------- ! ! Heights ! !----------------------------------------------------------------------- ! etavar='HGHT' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & hgt_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast hght(40,40) = ',hgt_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr hght(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=wgtp*hgt_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Temperatures ! !----------------------------------------------------------------------- ! etavar='TMPK' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & t_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast t(40,40) = ',t_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr t(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=wgtp*t_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! Relative humidity ! !----------------------------------------------------------------------- ! etavar='SPFH' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & qv_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast rh(40,40) = ',qv_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr rh(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext qv_ext(i,j,klev)=wgtp*qv_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! U - Grid relative velocities ! !----------------------------------------------------------------------- ! etavar='UREL' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & u_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast u(40,40) = ',u_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr u(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext u_ext(i,j,klev)=wgtp*u_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF ! !----------------------------------------------------------------------- ! ! V - Grid relative velocities ! !----------------------------------------------------------------------- ! etavar='VREL' CALL gd_rdat ( iflno, timep, & level, iprcord, etavar, & v_ext(1,1,klev), nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tpast v(40,40) = ',v_ext(40,40,klev) IF( nxgem /= nx_ext .OR. nygem /= ny_ext ) THEN WRITE(6,'(a,/,a,2i12,/,a,2i12)') & ' Error in grid dimensions.', & ' GEMPAK returned nx,ny:',nxgem,nygem, & ' Expected nx,ny:',nx_ext,ny_ext istatus=-31 RETURN END IF IF(tmint) THEN CALL gd_rdat ( iflno, timef, & level, iprcord, etavar, & tem1_ext, nxgem, nygem, ighdr, iret ) IF ( iret == 0 ) THEN PRINT *, ' tfutr v(40,40) = ',tem1_ext(40,40,1) DO j=1,ny_ext DO i=1,nx_ext v_ext(i,j,klev)=wgtp*v_ext(i,j,klev)+ & wgtf*tem1_ext(i,j,1) END DO END DO END IF END IF ELSE WRITE(6,'(a,a,/,a,i4)') ' Error reading file ',gdfile, & ' GEMPAK GD_RDAT return status: ',iret istatus=iret RETURN END IF END DO ! !----------------------------------------------------------------------- ! ! Extrapolate data to fill in data below 1000 mb ! To begin, set all to be equal to values at lowest ! available MAPS/RUC level. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext hgt_ext(i,j,klev)=hgt_ext(i,j,kstart) t_ext(i,j,klev) =t_ext(i,j,kstart) qv_ext(i,j,klev) =qv_ext(i,j,kstart) u_ext(i,j,klev) =u_ext(i,j,kstart) v_ext(i,j,klev) =v_ext(i,j,kstart) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Extrapolate temperature using standard atmospheric ! lapse rate. ! !----------------------------------------------------------------------- ! DO klev=1,kstart-1 DO j=1,ny_ext DO i=1,nx_ext t_ext(i,j,klev)=t_ext(i,j,kstart)* & ( p_ext(i,j,klev) / & p_ext(i,j,kstart) )**xconst END DO END DO PRINT *, ' pr,tks,text = ',ipr_ext(klev), & t_ext(60,36,kstart),t_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Change RUC Relative Humidity to Mixing Ratio for ARPS ! RH is 0-100% so it is multipled by 0.01 ! !----------------------------------------------------------------------- ! ! DO 425 klev=1,nz_ext ! DO 425 j=1,ny_ext ! DO 425 i=1,nx_ext ! qvsat = f_qvsat( p_ext(i,j,klev), t_ext(i,j,klev) ) ! qv_ext(i,j,klev)=0.01*qv_ext(i,j,klev)*qvsat ! 425 CONTINUE PRINT *, ipr_ext(2),' mixing ratio ',qv_ext(60,36,2) PRINT *, ipr_ext(4),' mixing ratio ',qv_ext(60,36,4) PRINT *, ipr_ext(6),' mixing ratio ',qv_ext(60,36,6) PRINT *, ipr_ext(8),' mixing ratio ',qv_ext(60,36,8) ! !----------------------------------------------------------------------- ! ! Set height field ! by integrating T down from kstart level ! !----------------------------------------------------------------------- ! DO klev=kstart-1,1,-1 DO j=1,ny_ext DO i=1,nx_ext dln=ALOG(p_ext(i,j,klev)/p_ext(i,j,klev+1)) const=dln*rddg tbar=0.5*(t_ext(i,j,klev)+t_ext(i,j,klev+1)) hgt_ext(i,j,klev)=hgt_ext(i,j,klev+1)-const*tbar END DO END DO PRINT *, ' pr,hgt(ks),hgt = ',ipr_ext(klev), & hgt_ext(60,36,kstart),hgt_ext(60,36,klev) END DO ! !----------------------------------------------------------------------- ! ! Rotate winds to be relative to true north. ! The RUC data are sent as grid-relative. ! !----------------------------------------------------------------------- ! DO klev=1,nz_ext !2001-05-16 GMB: Having umap & uear (or vmap & vear) point to !the same array causes numerical errors when optimizing. CALL uvmptoe(nx_ext,ny_ext,u_ext(1,1,klev),v_ext(1,1,klev), & lon_ext,utmp,vtmp) u_ext(:,:,klev) = utmp(:,:) v_ext(:,:,klev) = vtmp(:,:) END DO ! !----------------------------------------------------------------------- ! ! Fill qc,qr,qi,qs,qh arrays with missing value. ! !----------------------------------------------------------------------- ! DO k=1,nz_ext DO j=1,ny_ext DO i=1,nx_ext qc_ext(i,j,k)=-999. qr_ext(i,j,k)=-999. qi_ext(i,j,k)=-999. qs_ext(i,j,k)=-999. qh_ext(i,j,k)=-999. END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Reset map projection to previous values ! !----------------------------------------------------------------------- ! CALL setmapr(iproj,scale,latnot,trlon) CALL setorig(1,x0,y0) ! !----------------------------------------------------------------------- ! ! Set good status ! !----------------------------------------------------------------------- ! istatus=1 DEALLOCATE(utmp) DEALLOCATE(vtmp) RETURN END SUBROUTINE getgemeta2