PROGRAM arps2gem,65 ! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARSP2GEM ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Converts ARPS history files to a GEMPAK format file. ! ! Reads in a history file produced by ARPS in any ARPS format. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! February, 1995 ! ! MODIFICATION HISTORY: ! Added option for pressure-level output. ! March, 1995 KB ! ! Added sea-level pressure and w, combined rain and liquid water ! quantities. Added stability indices. April, 1995 KB ! ! Upgraded for new I/O routines including tke,kmh,kmv. ! May, 1996, KB ! ! 3/19/98: ! -Added option for specifying GEMPAK gdfile in namelist history_data ! (Jonathan Case) ! -Added igempr,igemz, and kintvl to namelist outopts, JC ! -Added arps2gem.inc file for specfying pressure level output ! -Fixed bugs in extrph subroutine, JC ! -modified extrapolation routines such that all scalars are set ! to zero for below ground values, except height and temp., JC ! -Added data packing in GRIB/GEMPAK format (reduces file size) ! -Added zps_km array for stability calculations (height must be in ! km for use in arps_be subroutine), fixed bug in arps_be call, JC ! -created separate arrays for grid and convective rains, JC ! -Added relative humidity, surface pressure gridded output, JC ! -Replaced UTM projection with MER projection, fixed bug in ! setting up polar stereographic projection on GEMPAK grid, JC ! -Kept qr, qc grids separate, Lumped QI,QS, and QH together ! into QICE grid, JC. ! ! !----------------------------------------------------------------------- ! ! DATA ARRAYS READ IN: ! ! 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 z coordinate of grid points in physical space (m) ! ! w vertical component of velocity in Cartesian ! coordinates (m/s). ! ! ptprt perturbation potential temperature (K) ! pprt perturbation pressure (Pascal) ! uprt perturbation x velocity component (m/s) ! vprt perturbation y velocity component (m/s) ! wprt perturbation z velocity component (m/s) ! ! qv water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsfc Temperature at surface (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! ! rain Total rain (raing + rainc) ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! ! implicit none is commented out except for test compilations ! due to the GEMPAK include file. UNIDATA has been harrased ! on that issue. ! !----------------------------------------------------------------------- ! ! implicit none INTEGER :: nx,ny,nz ! Grid dimensions. INTEGER :: nstyps ! Maximum number of soil types. INTEGER :: hinfmt,nhisfile_max,nhisfile,lengbf,nf,lenfil PARAMETER (nhisfile_max=200) CHARACTER (LEN=132) :: grdbasfn,hisfile(nhisfile_max) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'arps2gem.inc' INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'GEMINC:GEMPRM.PRM' ! !----------------------------------------------------------------------- ! ! Arrays to be read in: ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: x(:) ! The x-coord. of the physical and ! computational grid. ! Defined at u-point. REAL, ALLOCATABLE :: y(:) ! The y-coord. of the physical and ! computational grid. ! Defined at v-point. REAL, ALLOCATABLE :: z(:) ! The z-coord. of the computational ! grid. Defined at w-point. REAL, ALLOCATABLE :: zp(:,:,:) ! The height of the terrain. REAL, ALLOCATABLE :: uprt (:,:,:) ! Perturbation u-velocity (m/s) REAL, ALLOCATABLE :: vprt (:,:,:) ! Perturbation v-velocity (m/s) REAL, ALLOCATABLE :: wprt (:,:,:) ! Perturbation w-velocity (m/s) REAL, ALLOCATABLE :: ptprt (:,:,:) ! Perturbation potential temperature (K) REAL, ALLOCATABLE :: pprt (:,:,:) ! Perturbation pressure (Pascal) REAL, ALLOCATABLE :: qvprt (:,:,:) ! Perturbation water vapor specific ! humidity (kg/kg) REAL, ALLOCATABLE :: qc (:,:,:) ! Cloud water mixing ratio (kg/kg) REAL, ALLOCATABLE :: qr (:,:,:) ! Rain water mixing ratio (kg/kg) REAL, ALLOCATABLE :: qi (:,:,:) ! Cloud ice mixing ratio (kg/kg) REAL, ALLOCATABLE :: qs (:,:,:) ! Snow mixing ratio (kg/kg) REAL, ALLOCATABLE :: qh (:,:,:) ! Hail mixing ratio (kg/kg) REAL, ALLOCATABLE :: tke (:,:,:) ! Turbulent Kinetic Energy ((m/s)**2) REAL, ALLOCATABLE :: kmh (:,:,:) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL, ALLOCATABLE :: kmv (:,:,:) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL, ALLOCATABLE :: ubar (:,:,:) ! Base state u-velocity (m/s) REAL, ALLOCATABLE :: vbar (:,:,:) ! Base state v-velocity (m/s) REAL, ALLOCATABLE :: wbar (:,:,:) ! Base state w-velocity (m/s) REAL, ALLOCATABLE :: ptbar (:,:,:) ! Base state potential temperature (K) REAL, ALLOCATABLE :: pbar (:,:,:) ! Base state pressure (Pascal) REAL, ALLOCATABLE :: rhobar (:,:,:) ! Base state air density (kg/m**3) REAL, ALLOCATABLE :: qvbar (:,:,:) ! Base state water vapor specific ! humidity (kg/kg) REAL, ALLOCATABLE :: u (:,:,:) ! Total u-velocity (m/s) REAL, ALLOCATABLE :: v (:,:,:) ! Total v-velocity (m/s) REAL, ALLOCATABLE :: w (:,:,:) ! Total w-velocity (m/s) REAL, ALLOCATABLE :: qv (:,:,:) ! Water vapor specific humidity (kg/kg) INTEGER, ALLOCATABLE :: soiltyp (:,:,:) ! Soil type REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Soil type INTEGER, ALLOCATABLE :: vegtyp(:,:) ! Vegetation type REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction REAL, ALLOCATABLE :: tsfc (:,:,:) ! Temperature at surface (K) REAL, ALLOCATABLE :: tsoil (:,:,:) ! Deep soil temperature (K) REAL, ALLOCATABLE :: wetsfc (:,:,:) ! Surface soil moisture REAL, ALLOCATABLE :: wetdp (:,:,:) ! Deep soil moisture REAL, ALLOCATABLE :: wetcanp(:,:,:) ! Canopy water amount REAL, ALLOCATABLE :: snowdpth(:,:) ! Snow depth (m) REAL, ALLOCATABLE :: rain (:,:) ! Total rainfall REAL, ALLOCATABLE :: raing(:,:) ! Grid supersaturation rain REAL, ALLOCATABLE :: rainc(:,:) ! Cumulus convective rain REAL, ALLOCATABLE :: prcrate(:,:,:) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL, ALLOCATABLE :: radfrc(:,:,:) ! Radiation forcing (K/s) REAL, ALLOCATABLE :: radsw (:,:) ! Solar radiation reaching the surface REAL, ALLOCATABLE :: rnflx (:,:) ! Net radiation flux absorbed by surface REAL, ALLOCATABLE :: usflx (:,:) ! Surface flux of u-momentum (kg/(m*s**2)) REAL, ALLOCATABLE :: vsflx (:,:) ! Surface flux of v-momentum (kg/(m*s**2)) REAL, ALLOCATABLE :: ptsflx(:,:) ! Surface heat flux (K*kg/(m*s**2)) REAL, ALLOCATABLE :: qvsflx(:,:) ! Surface moisture flux (kg/(m**2*s)) ! ! new stuff ! REAL, ALLOCATABLE :: e_mb (:,:,:) ! vapor pressure in mb REAL, ALLOCATABLE :: mix (:,:,:) ! total mixing ratio (kg/kg) REAL, ALLOCATABLE :: esat_mb(:,:,:) ! saturation vapor pressure in mb REAL, ALLOCATABLE :: rh (:,:,:) ! Relative humidity in % REAL, ALLOCATABLE :: t_dew (:,:,:) ! dewpoint temp. in degrees K ! !----------------------------------------------------------------------- ! ! 2-D stability index arrays ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: lcl(:,:) ! lifting condensation level REAL, ALLOCATABLE :: lfc(:,:) ! level of free convection REAL, ALLOCATABLE :: el(:,:) ! equilibrium level REAL, ALLOCATABLE :: twdf(:,:) ! max. wet bulb pot. temp. difference REAL, ALLOCATABLE :: li(:,:) ! lifted index REAL, ALLOCATABLE :: pbe(:,:) ! CAPE REAL, ALLOCATABLE :: mbe(:,:) ! Moist CAPE REAL, ALLOCATABLE :: nbe(:,:) ! CIN REAL, ALLOCATABLE :: tcap(:,:) ! Cap Strength ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: tem1(:,:,:) REAL, ALLOCATABLE :: tem2(:,:,:) REAL, ALLOCATABLE :: tem3(:,:,:) REAL, ALLOCATABLE :: tem2d(:,:) REAL, ALLOCATABLE :: wrk1(:),wrk2(:),wrk3(:),wrk4(:),wrk5(:),wrk6(:) REAL, ALLOCATABLE :: wrk7(:),wrk8(:),wrk9(:),wrk10(:),wrk11(:),wrk12(:) REAL, ALLOCATABLE :: xs(:) REAL, ALLOCATABLE :: ys(:) REAL, ALLOCATABLE :: zps(:,:,:) ! ! height in km needed for arps_be ! REAL, ALLOCATABLE :: zps_km(:,:,:) ! !----------------------------------------------------------------------- ! ! Misc ARPS variables ! !----------------------------------------------------------------------- ! INTEGER :: nch REAL :: time REAL :: latnot(2) ! !----------------------------------------------------------------------- ! ! GEMPAK Output Levels...User Adjustable Parameters ! to be put into the arps2gem.inc file and a new namelist ! !----------------------------------------------------------------------- ! ! ! update for GRIB packing of GEMPAK data ! integer nbits, ipktyp DATA nbits /16/ DATA ipktyp /1/ !----------------------------------------------------------------------- ! ! GEMPAK variables ! !----------------------------------------------------------------------- ! CHARACTER (LEN=72) :: gdfile,gdarea REAL :: rnvblk (llnnav), anlblk (llnanl) INTEGER :: imxgrd PARAMETER (imxgrd=9999) INTEGER :: maxproj PARAMETER (maxproj=3) CHARACTER (LEN=3) :: cproj(0:maxproj) DATA cproj /'CED','STR','LCC','MER'/ CHARACTER (LEN=72) :: chproj REAL :: zres PARAMETER(zres=10.) INTEGER, ALLOCATABLE :: zgem(:) REAL :: deltan REAL :: deltax,deltay REAL :: latll,lonll,latur,lonur REAL :: angle1,angle2,angle3 LOGICAL :: angflg PARAMETER ( deltan= 1., & deltax= -9999., & deltay= -9999., & angflg=.true.) REAL :: gbnds(4) INTEGER :: ivsfc,ivprs,ivtheta,ivhgt PARAMETER (ivsfc=0,ivprs=1,ivtheta=2,ivhgt=3) INTEGER :: level(2) INTEGER :: ighdr(2) CHARACTER (LEN=20) :: gemtime(2) CHARACTER (LEN=12) :: parm ! !----------------------------------------------------------------------- ! ! Namelists ! !----------------------------------------------------------------------- ! INTEGER :: igempr,igemz,kintvl NAMELIST /output/ gdfile, mstout,iceout,sfcout,igempr, & igemz,kintvl ! !----------------------------------------------------------------------- ! ! Physical constants ! Normally these would be defined through include 'phycst.inc' ! but there are some conflicts with the GEMPAK include files. ! !----------------------------------------------------------------------- ! REAL :: rd ! Gas constant for dry air (m**2/(s**2*K)) PARAMETER( rd = 287.0 ) REAL :: cp ! Specific heat of dry air at constant pressure ! (m**2/(s**2*K)). PARAMETER( cp = 1004.0 ) REAL :: rddcp PARAMETER( rddcp = rd/cp ) REAL :: p0 ! Surface reference pressure, is 100000 Pascal. PARAMETER( p0 = 1.0E5 ) ! !----------------------------------------------------------------------- ! ! External functions ! !----------------------------------------------------------------------- ! REAL :: wmr2td,oe,dpt EXTERNAL wmr2td,oe,dpt ! !----------------------------------------------------------------------- ! ! Misc local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,iret,igdfil,kk,klev,nzgem,ireturn, lens,navsz,ianlsz INTEGER :: iyr,ifhr,ifmin,ifile,ihd REAL :: rlnpgem,denom,prmb,tdew REAL :: ctrx,ctry,swx,swy,zsum,zmin,zmax,rzgem REAL :: gamma,ex2,rln700,p00 REAL, ALLOCATABLE :: p_mb(:,:,:) LOGICAL :: wrtflg,rewrite,notopn ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Initialize GEMPAK sans TAE ! !----------------------------------------------------------------------- ! CALL in_bdta ( iret ) ! WRITE(6,'(6(/a))') & '###############################################################',& '# #',& '# Welcome to ARPS2GEM, a program that reads in history files #',& '# generated by ARPS and produces a GEMPAK format file. #',& '# #',& '###############################################################' 101 CONTINUE ! !----------------------------------------------------------------------- ! ! Get the names of the input data files. ! !----------------------------------------------------------------------- ! CALL get_input_file_names(hinfmt,grdbasfn,hisfile,nhisfile) lengbf = len_trim(grdbasfn) CALL get_dims_from_data(hinfmt,grdbasfn(1:lengbf), & nx,ny,nz,nstyps, ireturn) IF( ireturn /= 0 ) THEN PRINT*,'Problem occured when trying to get dimensions from data.' PRINT*,'Program stopped.' STOP END IF WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz READ(5,output,END=900) WRITE(6,'(a,i4)')'Option to store water data (1 or 0) :',mstout WRITE(6,'(a,i4)')'Option to store ice data (1 or 0) :',iceout WRITE(6,'(a,i4)')'Option to store sfc data (1 or 0) :',sfcout WRITE(6,'(a,i4)')'Option to write pressure data (1 or 0):',igempr WRITE(6,'(a,i4)')'Option to write height data (1 or 0) :',igemz WRITE(6,'(a,i4)')'Option to skip height levels (1 or 0) :',kintvl ALLOCATE(x (nx)) ALLOCATE(y (ny)) ALLOCATE(z (nz)) ALLOCATE(zp (nx,ny,nz)) ALLOCATE(uprt (nx,ny,nz)) ALLOCATE(vprt (nx,ny,nz)) ALLOCATE(wprt (nx,ny,nz)) ALLOCATE(ptprt (nx,ny,nz)) ALLOCATE(pprt (nx,ny,nz)) ALLOCATE(qvprt (nx,ny,nz)) ALLOCATE(qc (nx,ny,nz)) ALLOCATE(qr (nx,ny,nz)) ALLOCATE(qi (nx,ny,nz)) ALLOCATE(qs (nx,ny,nz)) ALLOCATE(qh (nx,ny,nz)) ALLOCATE(tke (nx,ny,nz)) ALLOCATE(kmh (nx,ny,nz)) ALLOCATE(kmv (nx,ny,nz)) ALLOCATE(ubar (nx,ny,nz)) ALLOCATE(vbar (nx,ny,nz)) ALLOCATE(wbar (nx,ny,nz)) ALLOCATE(ptbar (nx,ny,nz)) ALLOCATE(pbar (nx,ny,nz)) ALLOCATE(rhobar (nx,ny,nz)) ALLOCATE(qvbar (nx,ny,nz)) ALLOCATE(u (nx,ny,nz)) ALLOCATE(v (nx,ny,nz)) ALLOCATE(w (nx,ny,nz)) ALLOCATE(qv (nx,ny,nz)) ALLOCATE(soiltyp (nx,ny,nstyps)) ALLOCATE(stypfrct(nx,ny,nstyps)) ALLOCATE(vegtyp (nx,ny)) ALLOCATE(lai (nx,ny)) ALLOCATE(roufns (nx,ny)) ALLOCATE(veg (nx,ny)) ALLOCATE(tsfc (nx,ny,0:nstyps)) ALLOCATE(tsoil (nx,ny,0:nstyps)) ALLOCATE(wetsfc (nx,ny,0:nstyps)) ALLOCATE(wetdp (nx,ny,0:nstyps)) ALLOCATE(wetcanp(nx,ny,0:nstyps)) ALLOCATE(snowdpth(nx,ny)) ALLOCATE(rain (nx,ny)) ALLOCATE(raing(nx,ny)) ALLOCATE(rainc(nx,ny)) ALLOCATE(prcrate(nx,ny,4)) ALLOCATE(radfrc(nx,ny,nz)) ALLOCATE(radsw (nx,ny)) ALLOCATE(rnflx (nx,ny)) ALLOCATE(usflx (nx,ny)) ALLOCATE(vsflx (nx,ny)) ALLOCATE(ptsflx(nx,ny)) ALLOCATE(qvsflx(nx,ny)) ALLOCATE(e_mb (nx,ny,nz)) ALLOCATE(mix (nx,ny,nz)) ALLOCATE(esat_mb(nx,ny,nz)) ALLOCATE(rh (nx,ny,nz)) ALLOCATE(t_dew (nx,ny,nz)) ALLOCATE(lcl(nx,ny)) ALLOCATE(lfc(nx,ny)) ALLOCATE(el(nx,ny)) ALLOCATE(twdf(nx,ny)) ALLOCATE(li(nx,ny)) ALLOCATE(pbe(nx,ny)) ALLOCATE(mbe(nx,ny)) ALLOCATE(nbe(nx,ny)) ALLOCATE(tcap(nx,ny)) ALLOCATE(tem1(nx,ny,nz)) ALLOCATE(tem2(nx,ny,nz)) ALLOCATE(tem3(nx,ny,nz)) ALLOCATE(tem2d(nx,ny)) ALLOCATE(wrk1(nz),wrk2(nz),wrk3(nz),wrk4(nz),wrk5(nz),wrk6(nz)) ALLOCATE(wrk7(nz),wrk8(nz),wrk9(nz),wrk10(nz),wrk11(nz),wrk12(nz)) ALLOCATE(xs(nx)) ALLOCATE(ys(ny)) ALLOCATE(zps(nx,ny,nz)) ALLOCATE(zps_km(nx,ny,nz)) ALLOCATE(zgem(nz)) ALLOCATE(p_mb(nx,ny,nz)) x =0.0 y =0.0 z =0.0 zp =0.0 uprt =0.0 vprt =0.0 wprt =0.0 ptprt =0.0 pprt =0.0 qvprt =0.0 qc =0.0 qr =0.0 qi =0.0 qs =0.0 qh =0.0 tke =0.0 kmh =0.0 kmv =0.0 ubar =0.0 vbar =0.0 wbar =0.0 ptbar =0.0 pbar =0.0 rhobar =0.0 qvbar =0.0 u =0.0 v =0.0 w =0.0 qv =0.0 soiltyp =0.0 stypfrct=0.0 vegtyp =0.0 lai =0.0 roufns =0.0 veg =0.0 tsfc =0.0 tsoil =0.0 wetsfc =0.0 wetdp =0.0 wetcanp=0.0 snowdpth=0.0 rain =0.0 raing=0.0 rainc=0.0 prcrate=0.0 radfrc=0.0 radsw =0.0 rnflx =0.0 usflx =0.0 vsflx =0.0 ptsflx=0.0 qvsflx=0.0 e_mb =0.0 mix =0.0 esat_mb =0.0 rh =0.0 t_dew =0.0 lcl =0.0 lfc =0.0 el =0.0 twdf=0.0 li =0.0 pbe =0.0 mbe =0.0 nbe =0.0 tcap=0.0 tem1 =0.0 tem2 =0.0 tem3 =0.0 tem2d=0.0 wrk1 = 0.0 wrk2 = 0.0 wrk3 = 0.0 wrk4 = 0.0 wrk5 = 0.0 wrk6 = 0.0 wrk7 = 0.0 wrk8 = 0.0 wrk9 = 0.0 wrk10= 0.0 wrk11= 0.0 wrk12= 0.0 xs=0.0 ys=0.0 zps=0.0 zps_km=0.0 zgem = 0 p_mb =0.0 notopn=.true. DO ifile=1,nhisfile lenfil = LEN_trim(hisfile(ifile)) WRITE(6,'(/a,/1x,a)')' The data set name is ', & hisfile(ifile)(1:lenfil) !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! CALL dtaread(nx,ny,nz,nstyps,hinfmt,nch,grdbasfn(1:lengbf), & lengbf, & hisfile(ifile)(1:lenfil),lenfil,time, & x,y,z,zp, uprt ,vprt ,wprt ,ptprt, pprt , & qvprt, qc, qr, qi, qs, qh, tke, kmh, kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem1,tem2,tem3) ! !----------------------------------------------------------------------- ! ! ireturn = 0 for a successful read ! !----------------------------------------------------------------------- ! IF( ireturn == 0 ) THEN ! successful read ! curtim=time ! ! MODIFICATION ! DO i=1,nx DO j=1,ny rain(i,j)=raing(i,j)+rainc(i,j) END DO END DO ! ! MODIFICATION ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,k)=pprt(i,j,k)+pbar(i,j,k) ptprt(i,j,k)=ptprt(i,j,k)+ptbar(i,j,k) qvprt(i,j,k)=qvprt(i,j,k)+qvbar(i,j,k) tem1(i,j,k)=0.5*(uprt(i,j,k)+ubar(i,j,k)+ & uprt(i+1,j,k)+ubar(i+1,j,k)) tem2(i,j,k)=0.5*(vprt(i,j,k)+vbar(i,j,k)+ & vprt(i,j+1,k)+vbar(i,j+1,k)) tem3(i,j,k)=0.5*(wprt(i,j,k)+wbar(i,j,k)+ & wprt(i,j,k+1)+wbar(i,j,k+1)) qi(i,j,k)=qi(i,j,k)+qs(i,j,k)+qh(i,j,k) END DO END DO END DO ! ! Swap wind data back into wind arrays ! Change qv to mixing ratio ! ! MODIFICATION (LEAVE AS SPECIFIC HUMIDITY) DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 uprt(i,j,k)=tem1(i,j,k) vprt(i,j,k)=tem2(i,j,k) wprt(i,j,k)=tem3(i,j,k) END DO END DO END DO CALL edgfill(pprt,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(ptprt,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(qvprt,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(qr,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(qi,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(uprt,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(vprt,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(wprt,1,nx,1,nx-1,1,ny,1,ny-1, 1,nz,1,nz-1) CALL edgfill(tsfc,1,nx,1,nx-1,1,ny,1,ny-1, 1,1,1,1) CALL edgfill(tsoil,1,nx,1,nx-1,1,ny,1,ny-1, 1,1,1,1) CALL edgfill(wetsfc,1,nx,1,nx-1,1,ny,1,ny-1, 1,1,1,1) CALL edgfill(wetdp,1,nx,1,nx-1,1,ny,1,ny-1, 1,1,1,1) CALL edgfill(wetcanp,1,nx,1,nx-1,1,ny,1,ny-1, 1,1,1,1) ! !----------------------------------------------------------------------- ! ! Build the GEMPAK grid time string ! It has format yymodd/hhmnFHHH ! yy: year mo: month dd: GMT day ! hh: GMT hour mn: minute ! F: seperation charcter ! HHH: forecast hour (000 = analysis) ! example time(1)='950126/1200F000' ! !----------------------------------------------------------------------- ! gemtime(1)=' ' gemtime(2)=' ' iyr=MOD(year,100) ifhr=INT(curtim/3600.) ifmin=nint((curtim-(ifhr*3600.))/60.) IF(curtim == 0) THEN WRITE(gemtime(1), & '(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a4)') & iyr,month,day,'/',hour,minute,'F000' ELSE WRITE(gemtime(1), & '(i2.2,i2.2,i2.2,a1,i2.2,i2.2,a1,i3.3,i2.2)') & iyr,month,day,'/',hour,minute,'F',ifhr,ifmin END IF WRITE(6,'(a,a)') ' GEMPAK time string ',gemtime(1) ! !----------------------------------------------------------------------- ! ! Initialize header, grid area coordinates and analysis block ! !----------------------------------------------------------------------- ! IF(notopn) THEN ihd = 2 ighdr(1)=0 ighdr(2)=0 ! DO i=1,llnanl anlblk(i) = 0. END DO ! !----------------------------------------------------------------------- ! ! Establish coordinate for scalar fields. ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO xs(nx)=2.*xs(nx-1)-xs(nx-2) DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO ys(ny)=2.*ys(ny-1)-ys(ny-2) DO k=1,nz-1 DO j=1,ny DO i=1,nx zps(i,j,k)=0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Assign constant height surfaces for GEMPAK output. ! All output heights are rounded to nearest zres (normally 10 m). ! The first level is the minimum height of scalar level 2. ! The last level is the maximum height of scalar level nz-1. ! !----------------------------------------------------------------------- ! denom=FLOAT((nx-1)*(ny-1)) zmin=zps(1,1,2) zsum=0. DO j=1,ny-1 DO i=1,nx-1 zmin=AMIN1(zmin,zps(i,j,2)) zsum=zsum+zps(i,j,2) END DO END DO zgem(1)=nint(nint(zmin/zres)*zres) zsum=zsum/denom zgem(2)=nint(nint(zsum/zres)*zres) IF(zgem(2) > zgem(1)) THEN kk=2 ELSE kk=1 END IF DO klev=3,nz-2 kk=kk+1 zsum=0. DO j=1,ny-1 DO i=1,nx-1 zsum=zsum+zps(i,j,klev) END DO END DO zsum=zsum/denom zgem(kk)=nint(nint(zsum/zres)*zres) END DO kk=kk+1 zmax=zps(1,1,nz-1) zsum=0. DO j=1,ny-1 DO i=1,nx-1 zmax=AMAX1(zmax,zps(i,j,nz-1)) zsum=zsum+zps(i,j,nz-1) END DO END DO zsum=zsum/denom zgem(kk)=nint(nint(zsum/zres)*zres) kk=kk+1 zgem(kk)=nint(nint(zmax/zres)*zres) IF(zgem(kk) > zgem(kk-1)) THEN nzgem=kk ELSE nzgem=kk-1 END IF ! !----------------------------------------------------------------------- ! ! Build navigation block ! !----------------------------------------------------------------------- latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr( mapproj, 1.0 , latnot , trulon) CALL lltoxy( 1,1, ctrlat,ctrlon, ctrx, ctry ) dx=x(3)-x(2) dy=y(3)-y(2) swx = ctrx - (FLOAT(nx-3)/2.) * dx swy = ctry - (FLOAT(ny-3)/2.) * dy CALL setorig( 1, swx, swy) ! CALL xytoll(1,1,xs(1),ys(1),latll,lonll) CALL xytoll(1,1,xs(nx),ys(ny),latur,lonur) ! chproj=cproj(mapproj) angle2=trulon ! ! modify projection if polar stereographic ! IF (chproj == 'STR') THEN angle1=90.0 angle3=0.0 WRITE (*,*) '**********************************' WRITE (*,*) '**********************************' WRITE (*,*) ' ' WRITE (*,*) 'SETTING ANGLE1=90. FOR GEMPAK FILE' WRITE (*,*) 'SETTING ANGLE3=0.0 FOR GEMPAK FILE' WRITE (*,*) '(GEMPAK origin is at North Pole)' WRITE (*,*) ' ' WRITE (*,*) '**********************************' WRITE (*,*) '**********************************' ELSE angle1=trulat1 angle3=trulat2 WRITE (*,*) '**********************************' WRITE (*,*) '**********************************' WRITE (*,*) ' ' WRITE (*,*) ' SETTING ANGLE1=TRULAT1 ' WRITE (*,*) ' SETTING ANGLE3=TRULAT2 ' WRITE (*,*) ' ' WRITE (*,*) '**********************************' WRITE (*,*) '**********************************' END IF ! gbnds(1)=latll gbnds(2)=lonll gbnds(3)=latur gbnds(4)=lonur ! WRITE(gdarea,'(f8.4,a1,f9.4,a1,f8.4,a1,f9.4)') & latll,';',lonll,';',latur,';',lonur ! CALL gr_mnav ( chproj, nx, ny, latll, lonll, latur, lonur, & angle1, angle2, angle3, angflg, & rnvblk, iret ) IF( iret /= 0 ) GO TO 950 ! !----------------------------------------------------------------------- ! ! Build analysis block ! !----------------------------------------------------------------------- ! CALL gr_mban ( deltan, deltax, deltay, & gbnds, gbnds, gbnds, anlblk, iret ) IF( iret /= 0 ) GO TO 950 ! !----------------------------------------------------------------------- ! ! Open/Create the grid file ! !----------------------------------------------------------------------- ! CALL st_lstr ( gdfile, lens, iret ) WRITE (6, *) 'Opening GEMPAK file ',gdfile(1:lens) CALL gd_opnf ( gdfile, wrtflg, igdfil, navsz, rnvblk, & ianlsz, anlblk, ihd, imxgrd, iret ) IF ( iret /= 0 ) THEN WRITE (6, *) 'Error opening existing file',gdfile(1:lens) WRITE (6, *) 'Creating file ',gdfile(1:lens) CALL gd_cref ( gdfile, llnnav, rnvblk, llnanl, & anlblk, ihd, imxgrd, igdfil, iret ) IF( iret /= 0 ) GO TO 950 END IF ! !----------------------------------------------------------------------- ! ! Set write flag to true ! !----------------------------------------------------------------------- ! wrtflg=.true. CALL gd_swrt( igdfil, wrtflg, iret ) IF( iret /= 0 ) GO TO 950 notopn=.false. ! !----------------------------------------------------------------------- ! ! Output terrain data. ! !----------------------------------------------------------------------- ! level(1)=0 level(2)=-1 PRINT *, ' Writing terrain data.' parm='ESFC' CALL gd_wpgd( igdfil, zp(1,1,2), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) END IF ! notopn ! !----------------------------------------------------------------------- ! ! Put temperature into tem2 and -ln(p) into tem3 ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny DO i=1,nx tem2(i,j,k)=ptprt(i,j,k)* & (pprt(i,j,k)/p0)**rddcp tem3(i,j,k)=-ALOG(pprt(i,j,k)) END DO END DO END DO CALL edgfill(tem2,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) ! ! ------- modification ------------ ! DO i=1,nx DO j=1,ny DO k=1,nz p_mb(i,j,k)=0.01*pprt(i,j,k) mix(i,j,k)=1000.0*(qvprt(i,j,k)/(1.-qvprt(i,j,k))) e_mb(i,j,k)=qvprt(i,j,k)*p_mb(i,j,k)/(qvprt(i,j,k)+ & 287.0/461.0) esat_mb(i,j,k)=6.1078*EXP((2.500780E6/461.0)*((1.0/273.15)- & (1.0/tem2(i,j,k)))) t_dew(i,j,k)=wmr2td(p_mb(i,j,k),mix(i,j,k)) & + 273.15 rh(i,j,k)=100.0*(e_mb(i,j,k)/esat_mb(i,j,k)) IF (rh(i,j,k) < 0) THEN rh(i,j,k)=0.0 END IF END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate stability indices. ! Use level k=2 as the "surface". ! !----------------------------------------------------------------------- ! ! ! convert height (zps) to km units, since that it what ! it appears thermo3d.f uses in the arps_be routine. ! DO i=1,nx DO j=1,ny DO k=1,nz-1 zps_km(i,j,k)=zps(i,j,k)/1000.0 END DO END DO END DO WRITE(*,*) 'About to enter the dreaded arps_be' WRITE(*,*) 'subroutine.' WRITE(*,*) 'This will take a while.' WRITE(*,*) 'Please be patient' WRITE(*,*) ' ' WRITE(*,*) 'Processing.............' CALL arps_be(nx,ny,nz, & pprt,zps_km,tem2,qvprt, & lcl,lfc,el,twdf,li,pbe,mbe,nbe,tcap, & wrk1,wrk2,wrk3,wrk4,wrk5,wrk6, & wrk7,wrk8,wrk9,wrk10,wrk11,wrk12,tem2d) WRITE(*,*) ' ' WRITE(*,*) ' ' WRITE(*,*) ' ' WRITE(*,*) ' ' WRITE(*,*) 'Now done with stability calculations.' WRITE(*,*) ' ' CALL edgfill(lcl,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(lfc,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(el,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(twdf,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(li,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(pbe,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(mbe,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(nbe,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(tcap,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) PRINT *, ' Sample stability values: ' PRINT *, ' lcl,lfc : ',lcl(1,1),lfc(1,1) PRINT *, ' el, twdf: ',el(1,1),twdf(1,1) PRINT *, ' li, pbe : ',li(1,1),pbe(1,1) PRINT *, ' mbe, nbe: ',mbe(1,1),nbe(1,1) PRINT *, ' tcap : ',tcap(1,1) ! ! Store k=2 theta-e and dewpt in tem1, ! level 1 and 2 respectively. ! DO j=1,ny DO i=1,nx prmb=0.01*pprt(i,j,2) tdew=wmr2td(prmb,(1000.*qvprt(i,j,2))) tem1(i,j,1)=oe((tem2(i,j,2)-273.15),tdew,prmb) + 273.15 tem1(i,j,2)=tdew+273.15 tem1(i,j,3)=prmb tem1(i,j,4)=raing(i,j) tem1(i,j,5)=rainc(i,j) tem1(i,j,6)=rain(i,j) END DO END DO ! !----------------------------------------------------------------------- ! ! Output near-sfc data. ! Simularity theory or something could be applied here ! to make these data be valid at sfc instrument height, ! for now we output level 2. ! !----------------------------------------------------------------------- ! level(1)=0 level(2)=-1 PRINT *, ' Writing near-sfc pressure' parm='PRES' CALL gd_wpgd( igdfil, tem1(1,1,3), nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! ! MODIFICATION ! PRINT *,' Writing grid-scale rainfall' parm='RAIN_G' CALL gd_wpgd( igdfil, tem1(1,1,4), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *,' Writing convective rainfall' parm='RAIN_C' CALL gd_wpgd( igdfil, tem1(1,1,5), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *,' Writing total accumulated rainfall' parm='RAIN' CALL gd_wpgd( igdfil, tem1(1,1,6), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing near-sfc temperature' parm='TMPK' CALL gd_wpgd( igdfil, tem2(1,1,2), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing near-sfc dew point temperature' parm='DWPK' CALL gd_wpgd( igdfil, tem1(1,1,2), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *,'Writing near-sfc specific humidity' parm='QV' CALL gd_wpgd( igdfil, qvprt(1,1,2), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing near-sfc u velocity' parm='UREL' CALL gd_wpgd( igdfil, uprt(1,1,2), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing near-sfc v velocity' parm='VREL' CALL gd_wpgd( igdfil, vprt(1,1,2), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing near-sfc theta-e' parm='THTE' CALL gd_wpgd( igdfil, tem1(1,1,1), & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing near-sfc LI' parm='LIFT' CALL gd_wpgd( igdfil, li, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing near-sfc CAPE' parm='CAPE' CALL gd_wpgd( igdfil, pbe, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing near-sfc moist CAPE' parm='MPBE' CALL gd_wpgd( igdfil, mbe, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing near-sfc CIN' parm='SCIN' CALL gd_wpgd( igdfil, nbe, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing near-sfc LCL' parm='HLCL' CALL gd_wpgd( igdfil, lcl, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing near-sfc LFC' parm='HLFC' CALL gd_wpgd( igdfil, lfc, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing near-sfc EL' parm='HSEL' CALL gd_wpgd( igdfil, lcl, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing wet bulb temp diff' parm='TWDF' CALL gd_wpgd( igdfil, twdf, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! PRINT *, ' Writing Cap Strength' parm='TCAP' CALL gd_wpgd( igdfil, tcap, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! !----------------------------------------------------------------------- ! ! Output single-level data. ! !----------------------------------------------------------------------- ! IF (sfcout == 1) THEN PRINT *, ' Writing skin temperature data.' parm='SKTK' CALL gd_wpgd( igdfil, tsfc, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing soil temp data.' parm='SLTK' CALL gd_wpgd( igdfil, tsoil, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing soil wetness data.' parm='SLWT' CALL gd_wpgd( igdfil, wetsfc, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing deep soil wetness data.' parm='DPWT' CALL gd_wpgd( igdfil, wetdp, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) PRINT *, ' Writing canopy wetness data.' parm='CNWT' CALL gd_wpgd( igdfil, wetcanp, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) END IF ! !----------------------------------------------------------------------- ! ! Output constant pressure level data ! !----------------------------------------------------------------------- ! IF( igempr == 1 ) THEN rewrite=.false. ! !----------------------------------------------------------------------- ! ! Put temperature into tem2 and -ln(p) into tem3. ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny DO i=1,nx tem2(i,j,k)=ptprt(i,j,k)*(pprt(i,j,k)/p0)**rddcp tem3(i,j,k)=-ALOG(pprt(i,j,k)) END DO END DO END DO ! ! !----------------------------------------------------------------------- ! ! Calculate temperature (K) at ARPS grid points ! and 700mb pressure level ! !----------------------------------------------------------------------- ! rln700=-ALOG(70000.0) CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1,tem2,tem3,rln700,tem1) ! !----------------------------------------------------------------------- ! ! Calculate sea level pressure (mb) ! Reduction method: Benjamin and Miller: 1990, MWR, vol.118, No.10, ! Page: 2100-2101 ! !----------------------------------------------------------------------- ! gamma=.0065 ! std lapse rate per meter ex2=5.2558774 DO j=1,ny DO i=1,nx p00 = 0.01*(pprt(i,j,2)) tem1(i,j,1)=p00*(1.0+gamma*zps(i,j,2)/tem1(i,j,1))**ex2 END DO END DO level(1)=0 level(2)=-1 PRINT *, ' Writing MSL Pressure ' parm='PMSL' CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivsfc, parm, & rewrite, ipktyp, nbits, iret) ! !----------------------------------------------------------------------- ! ! Calculate stability variables. ! This is from the Oklahoma LAPS (O'LAPS) surface analysis ! software. ! !----------------------------------------------------------------------- ! DO klev=1,nprgem level(1)=iprgem(klev) level(2)=-1 rlnpgem=-ALOG(100.*FLOAT(iprgem(klev))) PRINT *, ' Writing GEMPAK data at pr= ',iprgem(klev) parm='HGHT' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & zps,tem3,rlnpgem,tem1) CALL extrph(nx,ny,nz,zps,tem2,pprt, & iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='TMPK' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & tem2,tem3,rlnpgem,tem1) CALL extrpt(nx,ny,nz,tem2,pprt,zps, & iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='DWPK' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & t_dew,tem3,rlnpgem,tem1) CALL extrpt(nx,ny,nz,t_dew,pprt,zps, & iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='QV' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qvprt,tem3,rlnpgem,tem1) CALL extrpq(nx,ny,nz,qvprt,pprt,iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='RELH' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & rh,tem3,rlnpgem,tem1) CALL extrpq(nx,ny,nz,rh,pprt,iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & uprt,tem3,rlnpgem,tem1(1,1,1)) CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & vprt,tem3,rlnpgem,tem1(1,1,2)) CALL extrpuv(nx,ny,nz,uprt,vprt,pprt,zps, & iprgem(klev),tem1(1,1,1),tem1(1,1,2)) parm='UREL' CALL gd_wpgd( igdfil, tem1(1,1,1), & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='VREL' CALL gd_wpgd( igdfil, tem1(1,1,2), & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & wprt,tem3,rlnpgem,tem1) CALL extrpq(nx,ny,nz,wprt,pprt,iprgem(klev),tem1) parm='WWND' CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) IF (mstout == 1) THEN parm='QCLD' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qc,tem3,rlnpgem,tem1) CALL extrpq(nx,ny,nz,qc,pprt,iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='QRAIN' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qr,tem3,rlnpgem,tem1) CALL extrpq(nx,ny,nz,qr,pprt,iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) IF (iceout == 1) THEN parm='QICE' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qi,tem3,rlnpgem,tem1) CALL extrpq(nx,ny,nz,qi,pprt,iprgem(klev),tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) END IF ! iceout END IF ! mstout END DO END IF ! igempr ! !----------------------------------------------------------------------- ! ! Output constant height level data ! !----------------------------------------------------------------------- ! IF( igemz == 1 ) THEN rewrite=.false. ! ! Put temperature into tem2 ! DO k=1,nz-1 DO j=1,ny DO i=1,nx tem2(i,j,k)=ptprt(i,j,k)* & (pprt(i,j,k)/p0)**rddcp END DO END DO END DO ! DO klev=2,nzgem,kintvl level(1)=zgem(klev) level(2)=-1 rzgem=FLOAT(zgem(klev)) PRINT *, ' Writing GEMPAK data at z= ',zgem(klev) parm='PRES' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & pprt,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='TMPK' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & tem2,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='DWPK' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & t_dew,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='QV' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qvprt,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='RELH' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & rh,tem3,rlnpgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) parm='UREL' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & uprt,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='VREL' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & vprt,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='WWND' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & wprt,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivprs, parm, & rewrite, ipktyp, nbits, iret) IF (mstout == 1) THEN parm='QCLD' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qc,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) parm='QRAIN' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qr,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) IF (iceout == 1) THEN parm='QICE' CALL v2dinta(nx,ny,nz,1,nx,1,ny,1,nz-1, & qi,zps,rzgem,tem1) CALL gd_wpgd( igdfil, tem1, & nx, ny, ighdr, & gemtime, level, ivhgt, parm, & rewrite, ipktyp, nbits, iret) END IF ! iceout END IF ! mstout END DO END IF ! Pressure level output END IF ! Good return from read END DO STOP 900 CONTINUE WRITE(6,'(a)') ' Error reading input data' 950 CONTINUE WRITE(6,'(a)') ' Error setting up GEMPAK file' STOP END PROGRAM arps2gem SUBROUTINE mvtmout(nx,ny,nxout,nyout,arrin,arrout) IMPLICIT NONE INTEGER :: nx,ny,nxout,nyout REAL :: arrin(nx,ny) REAL :: arrout(nxout,nyout) INTEGER :: i,j ! DO j=1,nyout DO i=1,nxout arrout(i,j)=arrin(i,j) END DO END DO RETURN END SUBROUTINE mvtmout ! SUBROUTINE extrph(nx,ny,nz,zps,t,pr,iprgem,hgtgem) 2 ! ! Extrapolate height by using a std atmos lapse rate ! below the last physical level. Above the domain, ! assume a constant temperature above 300 mb, otherwise ! use the std atmos lapse rate. ! IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: zps(nx,ny,nz) REAL :: t(nx,ny,nz) REAL :: pr(nx,ny,nz) INTEGER :: iprgem REAL :: hgtgem(nx,ny) ! INCLUDE 'phycst.inc' ! REAL :: gamma,rddg,const PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate rddg = (rd/g), & const = (rd*gamma/g) ) ! INTEGER :: i,j REAL :: prgem ! prgem=100.*FLOAT(iprgem) DO j=1,ny DO i=1,nx IF(prgem < pr(i,j,nz-1)) THEN IF(pr(i,j,nz-1) <= 30000.) THEN hgtgem(i,j)=zps(i,j,nz-1) + & rddg*t(i,j,nz-1)*ALOG(pr(i,j,nz-1)/prgem) ELSE hgtgem(i,j)=zps(i,j,nz-1) + (t(i,j,nz-1)/gamma)* & (1.-(prgem/pr(i,j,nz-1))**const) END IF ELSE IF(prgem >= pr(i,j,2)) THEN hgtgem(i,j)=zps(i,j,2) + (t(i,j,2)/gamma)* & (1.-(prgem/pr(i,j,2))**const) ! hgtgem(i,j)=0.0 END IF END DO END DO RETURN END SUBROUTINE extrph ! SUBROUTINE extrpt(nx,ny,nz,t,pr,zps,iprgem,tgem) 3 ! ! Extrapolate temperature by using a std atmos lapse rate ! below the last physical level. Above the domain, ! assume a constant temperature above 300 mb, otherwise ! use the std atmos lapse rate. ! INTEGER :: nx,ny,nz REAL :: t(nx,ny,nz) REAL :: pr(nx,ny,nz) REAL :: zps(nx,ny,nz) INTEGER :: iprgem REAL :: tgem(nx,ny) ! INCLUDE 'phycst.inc' ! REAL :: gamma,const PARAMETER ( gamma = 0.0065, & ! degrees/m lapse rate const = (rd*gamma/g) ) ! INTEGER :: i,j REAL :: prgem ! prgem=100.*FLOAT(iprgem) DO j=1,ny DO i=1,nx IF(prgem <= pr(i,j,nz-1)) THEN IF(pr(i,j,nz-1) <= 30000.) THEN tgem(i,j)=t(i,j,nz-1) ELSE tgem(i,j)=t(i,j,nz-1)* & ((prgem/pr(i,j,nz-1))**const) END IF ELSE IF(prgem >= pr(i,j,2)) THEN tgem(i,j)=t(i,j,2)* & ((prgem/pr(i,j,2))**const) ! ! missing data flag ! tgem(i,j)=-99.0 END IF END DO END DO RETURN END SUBROUTINE extrpt ! SUBROUTINE extrpq(nx,ny,nz,q,pr,iprgem,qgem) 8 ! ! assign 0.0 missing value for below ground data ! IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: q(nx,ny,nz) REAL :: pr(nx,ny,nz) INTEGER :: iprgem REAL :: qgem(nx,ny) ! INTEGER :: i,j REAL :: prgem ! prgem=100.*FLOAT(iprgem) DO j=1,ny DO i=1,nx IF(prgem <= pr(i,j,nz-1)) THEN qgem(i,j)=q(i,j,nz-1) ELSE IF(prgem >= pr(i,j,2)) THEN qgem(i,j)=0.0 END IF END DO END DO RETURN END SUBROUTINE extrpq SUBROUTINE extrpuv(nx,ny,nz,us,vs,pr,zps, & 2 iprgem,ugem,vgem) ! ! assign a "0" value for wind components for underground values. ! IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: us(nx,ny,nz) REAL :: vs(nx,ny,nz) REAL :: pr(nx,ny,nz) REAL :: zps(nx,ny,nz) INTEGER :: iprgem REAL :: ugem(nx,ny) REAL :: vgem(nx,ny) ! INTEGER :: i,j REAL :: prgem ! prgem=100.*FLOAT(iprgem) DO j=1,ny DO i=1,nx IF(prgem <= pr(i,j,nz-1)) THEN ugem(i,j)=us(i,j,nz-1) vgem(i,j)=vs(i,j,nz-1) ELSE IF(prgem >= pr(i,j,2)) THEN ! ugem(i,j)=us(i,j,2) ugem(i,j)=0.0 ! vgem(i,j)=vs(i,j,2) vgem(i,j)=0.0 END IF END DO END DO RETURN END SUBROUTINE extrpuv