PROGRAM arpsenscv,110 ! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSENSCV ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! PURPOSE: ! Read in a series of ARPS history files, generate 2-D pruducts data ! for display. The output may be in the same grid as the input ! data, or can be different from it. ! The output data is on a qni x qnj grid with its southwest corner ! at qswcorn(lat degree),qswcorw(lon degree) specified in enscv.inc, ! where qnecorn and qnecorw are also set. However, the mapproj, ! trulon, trulat(1),trulat(2) parameters should be specified in this ! program. Please check the NEWMAP subroutine. ! ! Author : Dingchen Hou ! History: Apr. 30 1998, developmed from the framework of ARPSPLT. ! Sep. 15, 1999, modified to include perturbations in soil ! variables. ! Feb 2002 (F. KONG), modified to read nx,ny,nz directly from ! input file; add 'iaccu' into output_data namelist; & fix bugs !----------------------------------------------------------------------- ! ! 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 (km) ! zp z-coordinate of grid points in computational space (m) ! ! uprt x-component of perturbation velocity (m/s) ! vprt y-component of perturbation velocity (m/s) ! wprt vertical component of perturbation velocity in Cartesian ! coordinates (m/s). ! ! ptprt perturbation potential temperature (K) ! pprt perturbation pressure (Pascal) ! ! qvprt perturbation 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) ! tke Turbulent Kinetic Energy ((m/s)**2) ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! 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 air density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsfc soil skin temperature (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! raing Grid supersaturation rain ! rainc Cumulus convective rain(mm) ! raing Total rain (rainc+raing)(mm) ! ! psl Sea level pressure (mb) ! ! CALCULATED DATA ARRAYS: ! ! u x-component of velocity (m/s) ! v y-component of velocity (m/s) ! w z-component of velocity (m/s) ! pt potential temperature (K) ! qv water vapor mixing ratio (kg/kg) ! td dew-point temperature (C) ! cape1 CAPE (J/kg) ! cin1 CIN (J/kg) ! thet theta_E (K) ! heli helicity (m2/s2) ! srlfl storm-relative low-level flow (0-2km AGL) ! srmfl storm-relative mid-level flow (2-9km AGL) ! shr37 7km - 3km wind shear ! ustrm Estimated storm motion (Bob Johns) ! vstrm Estimated storm motion (Bob Johns) ! capst CAPE strength ! blcon boundary layer convergence ! ct convective temperature ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! tem2 Temporary work array. ! tem3 Temporary work array. ! tem4 Temporary work array. ! tem5 Temporary work array. ! tem6 Temporary work array. ! tem7 Temporary work array. ! tem8 Temporary work array. ! tem9 Temporary work array. ! ! (These arrays are defined and used locally (i.e. inside this ! subroutine), they may also be passed into routines called by ! this one. Exiting the call to this subroutine, these temporary ! work arrays may be used for other purposes, and therefore their ! contents may be overwritten. Please examine the usage of work ! arrays before you make any change to the code.) ! !----------------------------------------------------------------------- ! ! Arrays for plots on constant pressure levels ! !----------------------------------------------------------------------- ! ! hgt z-coor of scalar point in physical space (10m) ! t700 Temperature (K) on 700mb pressure grids ! zps3d negative log pressure(Pascal) at ARPS grid points ! algpzc -log(pressure) at scalar grid points ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE !----------------------------------------------------------------------- ! Include files: !----------------------------------------------------------------------- INCLUDE 'indtflg.inc' INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'phycst.inc' INCLUDE 'enscv.inc' ! !----------------------------------------------------------------------- ! ! Some universal constants ! !----------------------------------------------------------------------- ! REAL*4 kappa,gamma,ex1,ex2,t00,p00,mbtopa PARAMETER (kappa=287.053/cp, & gamma=6.5, & ! 6.5 K/km ex1=0.1903643, & ! R*gamma/g ex2=5.2558774, & ! g/R/gamma mbtopa=100.) !----------------------------------------------------------------------- ! ! Define the dimensions nx, ny, nz ! !----------------------------------------------------------------------- INTEGER :: nx, ny, nz !----------------------------------------------------------------------- ! ! 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 on the staggered grid. REAL, ALLOCATABLE :: zp (:,:,:) ! The physical height coordinate defined at ! w-point of the staggered grid. 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 :: ptprt (:,:,:) ! Perturbation potential temperature ! from that of base state atmosphere (K) REAL, ALLOCATABLE :: pprt (:,:,:) ! Perturbation pressure from that ! of base state atmosphere (Pascal) REAL, ALLOCATABLE :: qv (:,:,:) ! 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 density rhobar REAL, ALLOCATABLE :: qvbar (:,:,:) ! Base state water vapor specific humidity ! (kg/kg) INTEGER :: nstyps ! Number of soil type ! PARAMETER ( nstyps = 4 ) INTEGER, ALLOCATABLE :: soiltyp(:,:,:) ! Soil type REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Soil type fraction INTEGER, ALLOCATABLE :: vegtyp (:,:) ! Vegetation type REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction REAL, ALLOCATABLE :: tsfc (:,:,:) ! Soil Skin Temperature (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 :: raing(:,:) ! Grid supersaturation rain REAL, ALLOCATABLE :: rainc(:,:) ! Cumulus convective rain REAL, ALLOCATABLE :: raint(:,:) ! Total rain (rainc+raing) 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)) ! !----------------------------------------------------------------------- ! ! Arrays derived from the read-in arrays ! !----------------------------------------------------------------------- ! 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 :: pt (:,:,:) ! Total poten REAL, ALLOCATABLE :: qvprt (:,:,:) REAL, ALLOCATABLE :: xc (:,:,:) ! x-coor of sacalar point (km) REAL, ALLOCATABLE :: yc (:,:,:) ! y-coor of sacalar point (km) REAL, ALLOCATABLE :: zc (:,:,:) ! z-coor of sacalar point in computational ! space (km) REAL, ALLOCATABLE :: zpc (:,:,:) ! z-coor of sacalar point in physical ! space (km) REAL, ALLOCATABLE :: hterain(:,:) ! The height of the terrain. !----------------------------------------------------------------------- ! ! Arrays for plots on constant pressure levels ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: hgt (:,:,:) ! z-coor of sacalar point in physical ! space (10m) REAL, ALLOCATABLE :: t700 (:,:) ! Temperature (K) on 700mb pressure grids REAL, ALLOCATABLE :: qs700 (:,:) ! Temperature (K) on 700mb pressure grids REAL, ALLOCATABLE :: algpzc(:,:,:) ! -log(pressure) at scalar grid points !----------------------------------------------------------------------- ! ! Array for CAPE , CIN ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: wrk1(:),wrk2(:),wrk3(:),wrk4(:),wrk5(:),wrk6(:) REAL, ALLOCATABLE :: wrk7(:),wrk8(:),wrk9(:),wrk10(:),wrk11(:),wrk12(:) REAL, ALLOCATABLE :: lcl(:,:) ! The lifting condensation level REAL, ALLOCATABLE :: lfc(:,:) ! Level of free convection REAL, ALLOCATABLE :: el(:,:) ! Equilibrium level REAL, ALLOCATABLE :: twdf(:,:) ! Max wet-bulb potential temperature difference REAL, ALLOCATABLE :: mbe(:,:) ! Moist Convective Potential Energy ! (MCAPE, includes water loading) REAL, ALLOCATABLE :: li1(:,:) ! Lifted Index (K) REAL, ALLOCATABLE :: cape1(:,:) ! CAPE (J/kg) REAL, ALLOCATABLE :: cin1(:,:) ! CIN (J/kg) REAL, ALLOCATABLE :: thet(:,:) ! theta_E (K) REAL, ALLOCATABLE :: heli(:,:) ! helicity REAL, ALLOCATABLE :: brn1(:,:) ! Bulk Richardson Number (Weisman and Klemp) REAL, ALLOCATABLE :: brnu(:,:) ! Shear parameter of BRN, "U" REAL, ALLOCATABLE :: srlfl(:,:) ! storm-relative low-level flow (0-2km AGL) REAL, ALLOCATABLE :: srmfl(:,:) ! storm-relative mid-level flow (2-9km AGL) REAL, ALLOCATABLE :: shr37(:,:) ! 7km - 3km wind shear REAL, ALLOCATABLE :: ustrm(:,:) ! Estimated storm motion (Bob Johns) REAL, ALLOCATABLE :: vstrm(:,:) ! Estimated storm motion (Bob Johns) REAL, ALLOCATABLE :: capst(:,:) ! cap strength REAL, ALLOCATABLE :: blcon(:,:) ! boundary llayer convergence REAL, ALLOCATABLE :: ct(:,:) ! convective temperature REAL :: oe ! function for caculate theta_e REAL :: alttostpr REAL, ALLOCATABLE :: sinlat(:,:) ! Sin of latitude at each grid point SAVE sinlat REAL :: lat1,lon1,lat2,lon2 REAL :: pw1d,totw REAL :: pi ! !----------------------------------------------------------------------- ! OUTPUT arrays !----------------------------------------------------------------------- INTEGER :: fileun REAL :: resltn INTEGER :: houroday, minohour, dayoweek, dateomon, month1, year1 REAL, ALLOCATABLE :: mslp(:,:) REAL, ALLOCATABLE :: hgt250(:,:), vort250(:,:), uwind250(:,:), vwind250(:,:) REAL, ALLOCATABLE :: hgt500(:,:), vort500(:,:), uwind500(:,:), vwind500(:,:) REAL, ALLOCATABLE :: hgt850(:,:), vort850(:,:), uwind850(:,:), vwind850(:,:) REAL, ALLOCATABLE :: temp850(:,:) REAL, ALLOCATABLE :: thck(:,:), rh700(:,:), omega700(:,:),temp2m(:,:), dewp2m(:,:) REAL, ALLOCATABLE :: accppt(:,:), convppt(:,:) REAL, ALLOCATABLE :: tpptold(:,:), cpptold(:,:) REAL, ALLOCATABLE :: sreh(:,:),li(:,:),cape(:,:),brn(:,:),cin(:,:),llmc(:,:),pw(:,:) REAL, ALLOCATABLE :: cmpref(:,:) INTEGER :: ni,nj REAL, ALLOCATABLE :: f2(:,:),x2(:,:),y2(:,:) REAL, ALLOCATABLE :: x1(:,:),y1(:,:) ! !----------------------------------------------------------------------- ! Output Grid !----------------------------------------------------------------------- ! INTEGER :: max2d_out2 ! PARAMETER (MAX2D_OUT2=max((nx-3)*(ny-3),MAX2D_OUT)) PARAMETER (max2d_out2=max2d_out) REAL :: mslpn(max2d_out2) REAL :: hgt250n(max2d_out2), vort250n(max2d_out2), & uwind250n(max2d_out2), vwind250n(max2d_out2) REAL :: hgt500n(max2d_out2), vort500n(max2d_out2), & uwind500n(max2d_out2), vwind500n(max2d_out2) REAL :: hgt850n(max2d_out2), vort850n(max2d_out2), & uwind850n(max2d_out2), vwind850n(max2d_out2) REAL :: temp850n(max2d_out2) REAL :: thckn(max2d_out2), rh700n(max2d_out2), omega700n(max2d_out2), & temp2mn(max2d_out2), dewp2mn(max2d_out2) REAL :: accpptn(max2d_out2), convpptn(max2d_out2) REAL :: srehn(max2d_out2), lin(max2d_out2), capen(max2d_out2), & brnn(max2d_out2), & cinn(max2d_out2), llmcn(max2d_out2), pwn(max2d_out2) REAL :: cmprefn(max2d_out2) REAL :: xn(max2d_out2),yn(max2d_out2) REAL :: x1n(max2d_out2),y1n(max2d_out2) REAL :: latn(max2d_out2),lonn(max2d_out2) ! !----------------------------------------------------------------------- ! ! Temporary work arrays for general use ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: tem1(:,:,:) REAL, ALLOCATABLE :: tem2(:,:,:) REAL, ALLOCATABLE :: tem3(:,:,:) REAL, ALLOCATABLE :: tem4(:,:,:) REAL, ALLOCATABLE :: tem5(:,:,:) REAL, ALLOCATABLE :: tem6(:,:,:) INTEGER, ALLOCATABLE :: item(:,:) REAL, ALLOCATABLE :: var2(:,:) REAL, ALLOCATABLE :: pt2m(:,:),qv2m(:,:) REAL, ALLOCATABLE :: vtwo1(:,:),vtwo2(:,:),vtwo3(:,:) REAL, ALLOCATABLE :: vtwo4(:,:),vtwo5(:,:),vtwo6(:,:) REAL, ALLOCATABLE :: qvsfc (:,:,:) ! Soil Skin effective qv REAL, ALLOCATABLE :: psf(:,:),psl(:,:) INTEGER :: ijq INTEGER, ALLOCATABLE :: item1(:,:),item2(:,:),item3(:,:),item4(:,:), & item5(:,:),item6(:,:),item7(:,:) REAL, ALLOCATABLE :: rtem1(:,:),rtem2(:,:),rtem3(:,:),rtem4(:,:), & rtem5(:,:),rtem6(:,:),rtem7(:,:) ! !----------------------------------------------------------------------- ! ! Work arrays to be used in interpolation subroutines ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: b1(:,:) REAL, ALLOCATABLE :: t1(:,:),t2(:,:),t3(:,:),t4(:,:) ! !----------------------------------------------------------------------- ! ! Common blocks for plotting control parameters ! !----------------------------------------------------------------------- REAL :: z01 ! altitude (meters) of a horizontal ! slice so specified COMMON /sliceh/z01 !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- REAL :: swx,ctrx,swy,ctry,tem REAL :: ctrx1, ctry1 REAL :: iorig REAL :: rho ! INTEGER,ALLOCATABLE :: slice(:,:) REAL,ALLOCATABLE :: xi1(:), yi1(:),xi2(:),yi2(:),zi1(:),ppil(:) CHARACTER (LEN=80) :: label CHARACTER (LEN=80) :: filename CHARACTER (LEN=80) :: grdbasfn CHARACTER (LEN=80) :: hisfile(25) CHARACTER (LEN=80) :: outfile(25) INTEGER :: hinfmt,nchin INTEGER :: nslice(7), indxslic INTEGER :: ireturn INTEGER :: mode,lengbf,lenfil INTEGER :: i,j,k,ibgn,iend,jbgn,jend,kbgn,kend,ist,jst,kst,iob INTEGER :: ibgn1, iend1 INTEGER :: nxpic,nypic,islice,jslice,kslice,layout REAL :: ctime,angl,aspect ! real xr,yr,zr,x1,x2,y1,y2,z1,z2,xlimit,ylimit REAL :: zmax,zmin REAL :: factor,pmb,drot INTEGER :: imax,jmax,kmax,imin,jmin,kmin REAL :: wmin, wmax, xorold, yorold, tk, tdk, psta REAL :: xbgn,xend,ybgn,yend,zbgn,zend LOGICAL :: fexist INTEGER :: onvf INTEGER :: nf INTEGER :: lenstag, linstit, lmodel ! !----------------------------------------------------------------------- INTEGER :: intrpl ! flag indicating whether to interpolate output REAL :: truelat(2) REAL :: trltnew(2),trlnnew,dxnew INTEGER :: mptjnew INTEGER :: nhisfile INTEGER :: iout(25),icape,iplot,iterr,iaccu NAMELIST /history_data/ hinfmt, nhisfile, grdbasfn,hisfile NAMELIST /output_data/ outfile,iout,icape,iplot,iterr,iaccu NAMELIST /output_grid/ mptjnew,trltnew,trlnnew,dxnew, & qni,qnj,qswcorn,qswcorw,qnecorn,qnecorw,intrpl, & enstag,instit,model INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Function f_qvsat and inline directives for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsat !fpp$ expand (f_qvsat) !dir$ inline always f_qvsat ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WRITE(6,'(/ 16(/5x,a)//)') & '###############################################################', & '###############################################################', & '#### ####', & '#### Welcome to ARPSENSCV ####', & '#### ####', & '#### A graphic analysis program for model ARPS 4.5 ####', & '#### ####', & '#### Program version 4.5 ####', & '#### ####', & '#### The graphic plotting is based ####', & '#### on graphic package ZXPLOT ####', & '#### by Ming Xue CAPS/OU ####', & '#### ####', & '###############################################################', & '###############################################################' !----------------------------------------------------------------------- ! ! Read grid/base name, then get the dimensions ! !----------------------------------------------------------------------- READ(5,history_data,END=100) WRITE(6,'(/a/)')'Namelist block history_data sucessfully read in.' IF ( hinfmt == 9 ) GO TO 10 lengbf = len_trim(grdbasfn) WRITE(6,'(a,a/)')' The grid/base name is ', grdbasfn(1:lengbf) DO nf=1,nhisfile lenfil = len_trim(hisfile(nf)) WRITE(6,'(1x,a,a)') 'Input values for hisfile: ',trim(hisfile(nf)) END DO GO TO 10 100 WRITE(6,'(a)') & 'Error reading NAMELIST block history_data. STOP' STOP 10 CONTINUE ! CALL get_dims_from_data(hinfmt,trim(grdbasfn), & 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 ni=nx-1 ! F. KONG add to fix a bug for zero ni,nj nj=ny-1 WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz print*,'nstyps =', nstyps !----------------------------------------------------------------------- ! ! Allocate nx, ny, nz dependent arrays and initiliaze to zero ! !----------------------------------------------------------------------- ALLOCATE( x=0 ALLOCATE( y=0 ALLOCATE( z=0 ALLOCATE(zp(nx,ny,nz),STAT=istatus) zp=0 ALLOCATE( u=0 ALLOCATE( v=0 ALLOCATE( w=0 ALLOCATE(ptprt(nx,ny,nz),STAT=istatus) ptprt=0 ALLOCATE(pprt(nx,ny,nz),STAT=istatus) pprt=0 ALLOCATE(qv(nx,ny,nz),STAT=istatus) qv=0 ALLOCATE(qc(nx,ny,nz),STAT=istatus) qc=0 ALLOCATE(qr(nx,ny,nz),STAT=istatus) qr=0 ALLOCATE(qi(nx,ny,nz),STAT=istatus) qi=0 ALLOCATE(qs(nx,ny,nz),STAT=istatus) qs=0 ALLOCATE(qh(nx,ny,nz),STAT=istatus) qh=0 ALLOCATE(tke(nx,ny,nz),STAT=istatus) tke=0 ALLOCATE(kmh(nx,ny,nz),STAT=istatus) kmh=0 ALLOCATE(kmv(nx,ny,nz),STAT=istatus) kmv=0 ALLOCATE(ubar(nx,ny,nz),STAT=istatus) ubar=0 ALLOCATE(vbar(nx,ny,nz),STAT=istatus) vbar=0 ALLOCATE(wbar(nx,ny,nz),STAT=istatus) wbar=0 ALLOCATE(ptbar(nx,ny,nz),STAT=istatus) ptbar=0 ALLOCATE(pbar(nx,ny,nz),STAT=istatus) pbar=0 ALLOCATE(rhobar(nx,ny,nz),STAT=istatus) rhobar=0 ALLOCATE(qvbar(nx,ny,nz),STAT=istatus) qvbar=0 ALLOCATE(soiltyp(nx,ny,nstyps),STAT=istatus) soiltyp=0 ALLOCATE(stypfrct(nx,ny,nstyps),STAT=istatus) stypfrct=0 ALLOCATE(vegtyp(nx,ny),STAT=istatus) vegtyp=0 ALLOCATE(lai(nx,ny),STAT=istatus) lai=0 ALLOCATE(roufns(nx,ny),STAT=istatus) roufns=0 ALLOCATE(veg(nx,ny),STAT=istatus) veg=0 ALLOCATE(tsfc(nx,ny,0:nstyps),STAT=istatus) tsfc=0 ALLOCATE(tsoil(nx,ny,0:nstyps),STAT=istatus) tsoil=0 ALLOCATE(wetsfc(nx,ny,0:nstyps),STAT=istatus) wetsfc=0 ALLOCATE(wetdp(nx,ny,0:nstyps),STAT=istatus) wetdp=0 ALLOCATE(wetcanp(nx,ny,0:nstyps),STAT=istatus) wetcanp=0 ALLOCATE(snowdpth(nx,ny),STAT=istatus) snowdpth=0 ALLOCATE(raing(nx,ny),STAT=istatus) raing=0 ALLOCATE(rainc(nx,ny),STAT=istatus) rainc=0 ALLOCATE(raint(nx,ny),STAT=istatus) raint=0 ALLOCATE(prcrate(nx,ny,4),STAT=istatus) prcrate=0 ALLOCATE(radfrc(nx,ny,nz),STAT=istatus) radfrc=0 ALLOCATE(radsw(nx,ny),STAT=istatus) radsw=0 ALLOCATE(rnflx(nx,ny),STAT=istatus) rnflx=0 ALLOCATE(usflx(nx,ny),STAT=istatus) usflx=0 ALLOCATE(vsflx(nx,ny),STAT=istatus) vsflx=0 ALLOCATE(ptsflx(nx,ny),STAT=istatus) ptsflx=0 ALLOCATE(qvsflx(nx,ny),STAT=istatus) qvsflx=0 ALLOCATE(uprt(nx,ny,nz),STAT=istatus) uprt=0 ALLOCATE(vprt(nx,ny,nz),STAT=istatus) vprt=0 ALLOCATE(wprt(nx,ny,nz),STAT=istatus) wprt=0 ALLOCATE(pt(nx,ny,nz),STAT=istatus) pt=0 ALLOCATE(qvprt(nx,ny,nz),STAT=istatus) qvprt=0 ALLOCATE(xc(nx,ny,nz),STAT=istatus) xc=0 ALLOCATE(yc(nx,ny,nz),STAT=istatus) yc=0 ALLOCATE(zc(nx,ny,nz),STAT=istatus) zc=0 ALLOCATE(zpc(nx,ny,nz),STAT=istatus) zpc=0 ALLOCATE(hterain(nx,ny),STAT=istatus) hterain=0 ALLOCATE(hgt(nx,ny,nz),STAT=istatus) hgt=0 ALLOCATE(t700(nx,ny),STAT=istatus) t700=0 ALLOCATE(qs700(nx,ny),STAT=istatus) qs700=0 ALLOCATE(algpzc(nx,ny,nz),STAT=istatus) algpzc=0 ALLOCATE(wrk1(nz),STAT=istatus) wrk1=0 ALLOCATE(wrk2(nz),STAT=istatus) wrk2=0 ALLOCATE(wrk3(nz),STAT=istatus) wrk3=0 ALLOCATE(wrk4(nz),STAT=istatus) wrk4=0 ALLOCATE(wrk5(nz),STAT=istatus) wrk5=0 ALLOCATE(wrk6(nz),STAT=istatus) wrk6=0 ALLOCATE(wrk7(nz),STAT=istatus) wrk7=0 ALLOCATE(wrk8(nz),STAT=istatus) wrk8=0 ALLOCATE(wrk9(nz),STAT=istatus) wrk9=0 ALLOCATE(wrk10(nz),STAT=istatus) wrk10=0 ALLOCATE(wrk11(nz),STAT=istatus) wrk11=0 ALLOCATE(wrk12(nz),STAT=istatus) wrk12=0 ALLOCATE(lcl(nx,ny),STAT=istatus) lcl=0 ALLOCATE(lfc(nx,ny),STAT=istatus) lfc=0 ALLOCATE(el(nx,ny),STAT=istatus) el=0 ALLOCATE(twdf(nx,ny),STAT=istatus) twdf=0 ALLOCATE(mbe(nx,ny),STAT=istatus) mbe=0 ALLOCATE(li1(nx,ny),STAT=istatus) li1=0 ALLOCATE(cape1(nx,ny),STAT=istatus) cape1=0 ALLOCATE(cin1(nx,ny),STAT=istatus) cin1=0 ALLOCATE(thet(nx,ny),STAT=istatus) thet=0 ALLOCATE(heli(nx,ny),STAT=istatus) heli=0 ALLOCATE(brn1(nx,ny),STAT=istatus) brn1=0 ALLOCATE(brnu(nx,ny),STAT=istatus) brnu=0 ALLOCATE(srlfl(nx,ny),STAT=istatus) srlfl=0 ALLOCATE(srmfl(nx,ny),STAT=istatus) srmfl=0 ALLOCATE(shr37(nx,ny),STAT=istatus) shr37=0 ALLOCATE(ustrm(nx,ny),STAT=istatus) ustrm=0 ALLOCATE(vstrm(nx,ny),STAT=istatus) vstrm=0 ALLOCATE(capst(nx,ny),STAT=istatus) capst=0 ALLOCATE(blcon(nx,ny),STAT=istatus) blcon=0 ALLOCATE(ct(nx,ny),STAT=istatus) ct=0 ALLOCATE(sinlat(nx,ny),STAT=istatus) sinlat=0 ALLOCATE(mslp(nx-1,ny-1),STAT=istatus) mslp=0 ALLOCATE(hgt250(nx-1,ny-1),STAT=istatus) hgt250=0 ALLOCATE(vort250(nx-1,ny-1),STAT=istatus) vort250=0 ALLOCATE(uwind250(nx-1,ny-1),STAT=istatus) uwind250=0 ALLOCATE(vwind250(nx-1,ny-1),STAT=istatus) vwind250=0 ALLOCATE(hgt500(nx-1,ny-1),STAT=istatus) hgt500=0 ALLOCATE(vort500(nx-1,ny-1),STAT=istatus) vort500=0 ALLOCATE(uwind500(nx-1,ny-1),STAT=istatus) uwind500=0 ALLOCATE(vwind500(nx-1,ny-1),STAT=istatus) vwind500=0 ALLOCATE(hgt850(nx-1,ny-1),STAT=istatus) hgt850=0 ALLOCATE(vort850(nx-1,ny-1),STAT=istatus) vort850=0 ALLOCATE(uwind850(nx-1,ny-1),STAT=istatus) uwind850=0 ALLOCATE(vwind850(nx-1,ny-1),STAT=istatus) vwind850=0 ALLOCATE(temp850(nx-1,ny-1),STAT=istatus) temp850=0 ALLOCATE(thck(nx-1,ny-1),STAT=istatus) thck=0 ALLOCATE(rh700(nx-1,ny-1),STAT=istatus) rh700=0 ALLOCATE(omega700(nx-1,ny-1),STAT=istatus) omega700=0 ALLOCATE(temp2m(nx-1,ny-1),STAT=istatus) temp2m=0 ALLOCATE(dewp2m(nx-1,ny-1),STAT=istatus) dewp2m=0 ALLOCATE(accppt(nx-1,ny-1),STAT=istatus) accppt=0 ALLOCATE(convppt(nx-1,ny-1),STAT=istatus) convppt=0 ALLOCATE(tpptold(nx-1,ny-1),STAT=istatus) tpptold=0 ALLOCATE(cpptold(nx-1,ny-1),STAT=istatus) cpptold=0 ALLOCATE(sreh(nx-1,ny-1),STAT=istatus) sreh=0 ALLOCATE(li(nx-1,ny-1),STAT=istatus) li=0 ALLOCATE(cape(nx-1,ny-1),STAT=istatus) cape=0 ALLOCATE(brn(nx-1,ny-1),STAT=istatus) brn=0 ALLOCATE(cin(nx-1,ny-1),STAT=istatus) cin=0 ALLOCATE(llmc(nx-1,ny-1),STAT=istatus) llmc=0 ALLOCATE(pw(nx-1,ny-1),STAT=istatus) pw=0 ALLOCATE(cmpref(nx-1,ny-1),STAT=istatus) cmpref=0 ALLOCATE(f2(nx-1,ny-1),STAT=istatus) f2=0 ALLOCATE(x2(nx-1,ny-1),STAT=istatus) x2=0 ALLOCATE(y2(nx-1,ny-1),STAT=istatus) y2=0 ALLOCATE(x1(nx-1,ny-1),STAT=istatus) x1=0 ALLOCATE(y1(nx-1,ny-1),STAT=istatus) y1=0 ALLOCATE(tem1(nx,ny,nz),STAT=istatus) tem1=0 ALLOCATE(tem2(nx,ny,nz),STAT=istatus) tem2=0 ALLOCATE(tem3(nx,ny,nz),STAT=istatus) tem3=0 ALLOCATE(tem4(nx,ny,nz),STAT=istatus) tem4=0 ALLOCATE(tem5(nx,ny,nz),STAT=istatus) tem5=0 ALLOCATE(tem6(nx,ny,nz),STAT=istatus) tem6=0 ALLOCATE(item(nx,ny),STAT=istatus) ALLOCATE(var2(nx,ny),STAT=istatus) var2=0 ALLOCATE(pt2m(nx,ny),STAT=istatus) pt2m=0 ALLOCATE(qv2m(nx,ny),STAT=istatus) qv2m=0 ALLOCATE(vtwo1(nx,ny),STAT=istatus) vtwo1=0 ALLOCATE(vtwo2(nx,ny),STAT=istatus) vtwo2=0 ALLOCATE(vtwo3(nx,ny),STAT=istatus) vtwo3=0 ALLOCATE(vtwo4(nx,ny),STAT=istatus) vtwo4=0 ALLOCATE(vtwo5(nx,ny),STAT=istatus) vtwo5=0 ALLOCATE(vtwo6(nx,ny),STAT=istatus) vtwo6=0 ALLOCATE(qvsfc(nx,ny,0:nstyps),STAT=istatus) qvsfc=0 ALLOCATE(psf(nx,ny),STAT=istatus) psf=0 ALLOCATE(psl(nx,ny),STAT=istatus) psl=0 ALLOCATE(item1(nx,ny),STAT=istatus) item1=0 ALLOCATE(item2(nx,ny),STAT=istatus) item2=0 ALLOCATE(item3(nx,ny),STAT=istatus) item3=0 ALLOCATE(item4(nx,ny),STAT=istatus) item4=0 ALLOCATE(item5(nx,ny),STAT=istatus) item5=0 ALLOCATE(item6(nx,ny),STAT=istatus) item6=0 ALLOCATE(item7(nx,ny),STAT=istatus) item7=0 ALLOCATE(rtem1(nx,ny),STAT=istatus) rtem1=0 ALLOCATE(rtem2(nx,ny),STAT=istatus) rtem2=0 ALLOCATE(rtem3(nx,ny),STAT=istatus) rtem3=0 ALLOCATE(rtem4(nx,ny),STAT=istatus) rtem4=0 ALLOCATE(rtem5(nx,ny),STAT=istatus) rtem5=0 ALLOCATE(rtem6(nx,ny),STAT=istatus) rtem6=0 ALLOCATE(rtem7(nx,ny),STAT=istatus) rtem7=0 ALLOCATE(b1(nx,ny),STAT=istatus) b1=0 ALLOCATE(t1(nx,ny),STAT=istatus) t1=0 ALLOCATE(t2(nx,ny),STAT=istatus) t2=0 ALLOCATE(t3(nx,ny),STAT=istatus) t3=0 ALLOCATE(t4(nx,ny),STAT=istatus) t4=0 ALLOCATE(slice(nx+ny+nz,3),STAT=istatus) ALLOCATE(xi1(nx+ny),STAT=istatus) ALLOCATE(yi1(nx+ny),STAT=istatus) ALLOCATE(xi2(nx+ny),STAT=istatus) ALLOCATE(yi2(nx+ny),STAT=istatus) ALLOCATE(zi1(nz),STAT=istatus) ALLOCATE(ppil(nz),STAT=istatus) !----------------------------------------------------------------------- ! ! default output grid values (SAMEX settings): ! !----------------------------------------------------------------------- ! intrpl = 1 enstag = 'ARPSENS' instit = 'CAPS_OU' model = 'ARPS5.0.0' qswcorn = 27.0844 qswcorw = -110.068 qnecorn = 45.1552 qnecorw = -68.10911 qni = 117 qnj = 81 mptjnew=2 trltnew(1)=39.0 trltnew(2)=39.0 trlnnew=-100.0 dxnew=30.0 ! Read remaining namelist READ(5,output_data,END=200) WRITE(6,'(/a/)')'Namelist block output_data sucessfully read in.' GO TO 20 200 WRITE(6,'(a)') & 'Error reading NAMELIST block output_data. ', & 'Default values used.' 20 CONTINUE DO nf=1,nhisfile WRITE(6,'(1x,a,a)') 'Input values for outfile: ',trim(outfile(nf)) END DO READ(5,output_grid,END=250) WRITE(6,'(/a/)')'Namelist block output_grid sucessfully read in.' GO TO 30 250 WRITE(6,'(a)') & 'Error reading NAMELIST block output_grid. ', & 'Default values used.' 30 CONTINUE lenstag = len_trim(enstag) linstit = len_trim(instit) lmodel = len_trim(model) WRITE (6,*) 'Descriptor enstag: ', enstag(1:lenstag) WRITE (6,*) 'Descriptor instit: ', instit(1:linstit) WRITE (6,*) 'Descriptor model: ', model(1:lmodel) WRITE(6,'(1x,a,3I5)') & 'Grid variables intrpl,qni,qnj:', intrpl,qni,qnj WRITE(6,'(1x,a,4F11.5)') & 'Grid variables qswcorn, qswcorw, qnecorn, qnecorw:', & qswcorn, qswcorw, qnecorn, qnecorw WRITE(6,'(1x,a,I5,4F10.3)') & 'Grid variables mptjnew,trltnew,trlnnew,dxnew:', & mptjnew,trltnew,trlnnew,dxnew IF (intrpl == 1 .AND. qni*qnj > max2d_out2) THEN WRITE (6,'(a)') & 'Error: qni*nqj > MAX2D_OUT (in enscv.inc). Stopping.' STOP END IF IF (intrpl == 0 .AND. (nx-3)*(ny-3) > max2d_out2) THEN WRITE (6,'(a)') & 'Error: (nx-3)*(ny-3) > MAX2D_OUT (in enscv.inc). Stopping.' STOP END IF IF (intrpl == 0 .AND. (qni /= (nx-3).OR.qnj /= (ny-3) ) ) THEN WRITE (6,'(a,a)') & ' WARNING: qni =/= nx-3 and/or qnj=/=ny-3. ', & 'correction is made TO make qni=nx-3 AND qnj=ny-3 ' qni=nx-3 qnj=ny-3 END IF IF (iplot >= 1.OR.iterr > 0) CALL xdevic DO nf=1, nhisfile filename=hisfile(nf) lenfil = len_trim(filename) WRITE(6,'(a,a/)') & ' The file name of data set is ', filename(1:lenfil) 15 CONTINUE ! also continue to read another time recode ! from GrADS file !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! CALL dtaread(nx,ny,nz, nstyps, & hinfmt, nchin,grdbasfn(1:lengbf),lengbf, & filename(1:lenfil),lenfil,ctime, & 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) year1=year month1=month dateomon=day houroday=hour minohour=ctime PRINT *,year1,month1,dateomon,houroday,ctime ! !----------------------------------------------------------------------- ! ! ireturn = 0 for a successful read ! For hinfmt=9, i.e. the GraDs format data, ireturn is used as a ! flag indicating if there is any data at more time level to be read. ! !----------------------------------------------------------------------- ! IF( ireturn /= 0 .AND. hinfmt /= 9 ) GO TO 7000 !unsuccessful read ! !----------------------------------------------------------------------- ! ! write(6,'(/5x,a,i4)') ! : 'mapproj in the data was ',mapproj ! write(6,'(/5x,a,f10.3,a)') ! : 'trulat1 in the data was ',trulat1,' degree North' ! write(6,'(/5x,a,f10.3,a)') ! : 'trulat2 in the data was ',trulat2,' degree North' ! write(6,'(/5x,a,f10.3,a)') ! : 'trulon in the data was ',trulon,' degree East' ! write(6,'(/5x,a,e15.8)') ! : 'sclfct in the data was ',sclfct ! !----------------------------------------------------------------------- ! Convert the rainfal arries and store the old ones. DO j=1,ny-1 DO i=1,nx-1 raint(i,j)=raing(i,j)+rainc(i,j) ! IF (nf == 1) THEN ! don't know what's the purpose (F.KONG) ! raint(i,j)=0.0E0 ! rainc(i,j)=0.0E0 ! END IF END DO END DO ! print *,raint(35,35),rainc(35,35),'rain' CALL ary2dcv(nx,ny,raint,ni,nj,accppt) CALL ary2dcv(nx,ny,rainc,ni,nj,convppt) ! print *,accppt(35,35),convppt(35,35),'rain' IF (iaccu == 1) THEN ! convert accppt from 0h-now accul. rain to (Tnf-1->Tnf) accul. rain ! (by subtracting tpptold) and store the original value in tpptold IF (nf == 1) THEN ! to clear the 1st time level values CALL ary2dcv(nx,ny,raint,ni,nj,tpptold) CALL ary2dcv(nx,ny,rainc,ni,nj,cpptold) END IF CALL pptsto(ni,nj,accppt,tpptold) CALL pptsto(ni,nj,convppt,cpptold) ! print *,accppt(35,35),convppt(35,35),'rain' END IF IF (iout(nf) /= 1) CYCLE ! ! !----------------------------------------------------------------------- ! ! Set coordinates at the grid volume center ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny DO i=1,nx-1 xc(i,j,k) = (x(i)+x(i+1))*0.5 /1000.0 END DO END DO END DO DO k=1,nz DO j=1,ny-1 DO i=1,nx yc(i,j,k) = (y(j)+y(j+1))*0.5 /1000.0 END DO END DO END DO DO k=1,nz-1 DO j=1,ny DO i=1,nx zc(i,j,k) = (z(k)+z(k+1))*0.5 /1000.0 zpc(i,j,k)= (zp(i,j,k)+zp(i,j,k+1))*0.5 /1000.0 hgt(i,j,k)=1000.0*zpc(i,j,k) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 x2(i,j) = (x(i)+x(i+1))*0.5 y2(i,j) = (y(j)+y(j+1))*0.5 x1(i,j)=x2(i,j)/1000.0 y1(i,j)=y2(i,j)/1000.0 END DO END DO !----------------------------------------------------------------------- ! Find the lat/log of the points in the output grid, LatN, LonN ! if interpolation is necessary. Set the flag for INTERPOLATION ! Note that in NEWMAP, setmaps and setorig are used. IF (intrpl == 1) THEN CALL newmap(qni,qnj,latn,lonn,dxnew, & qswcorn,qswcorw,trltnew,trlnnew,mptjnew) intrpl=1 END IF !----------------------------------------------------------------------- ! Set the map parameters and put the origin the same as used in defining ! xc and yc, x and y etc. The origin is actually point (2,2) dx = xc(3,2,2)-xc(2,2,2) dy = yc(2,3,2)-yc(2,2,2) truelat(1) = trulat1 truelat(2) = trulat2 CALL setmapr( mapproj, 1.0 , truelat , trulon) ! set up parameters for map projection CALL lltoxy( 1,1, ctrlat,ctrlon, ctrx, ctry ) ! print *,ctrlat,ctrlon,ctrx,ctry ! print *,dx,dy,nx,ny,xc(1,2,2),xc(2,2,2),yc(2,1,2),yc(2,2,2) swx = ctrx- (nx-3)*dx*0.5*1000.0 swy = ctry- (ny-3)*dy*0.5*1000.0 ! print *, swx,swy,'swx,swy of the original data's physical domain' CALL setorig( 1, swx, swy) !----------------------------------------------------------------------- ! Calculate the Coriolis para. f=2wsin(lat) at the data's scalar points pi=ATAN(1.0)*4.0 DO j=1,ny-1 DO i=1,nx-1 CALL xytoll( 1,1, x2(i,j),y2(i,j),lat1,lon1) f2(i,j)=SIN(lat1*pi/180.0)*2*omega END DO END DO PRINT *,f2(1,1),f2(nx-1,ny-1), 'f values at data map corners' !----------------------------------------------------------------------- ! Find the SW and NE corners of the outputgrid if they are not set ! (and intrpl=0) ! The second most SW or NE scalar point are chosen as these points ! and so qni=nx-3 and qnj=nx-3 should be satisfied ! *** for direct assignment instead of interpolation,set the new - grid ! corners and the flag for NO INTERPOLATION.also calculate latN,lonN IF (intrpl == 0) THEN CALL xytoll(1,1,x2(2,2),y2(2,2),qswcorn,qswcorw) CALL xytoll(1,1,x2(nx-2,ny-2),y2(nx-2,ny-2),qnecorn,qnecorw) intrpl=0 dxnew=dx trltnew(1)=truelat(1) trltnew(2)=truelat(2) trlnnew=trulon DO j=1,qnj DO i=1,qni CALL xytoll(1,1,x2(i+1,j+1),y2(i+1,j+1),lat1,lon1) ijq = i + qni*(j-1) latn(ijq)=lat1 lonn(ijq)=lon1 END DO END DO END IF ! !----------------------------------------------------------------------- ! Find the lat/lon of the SW and NE corners of the data grid ! and print out for comparison with the output grid's corners CALL xytoll( 1,1, x2(1,1),y2(1,1),lat1,lon1) CALL xytoll( 1,1, x2(nx-1,ny-1),y2(nx-1,ny-1),lat2,lon2) PRINT *,lat1,lon1,lat2,lon2,' Data Map corners' PRINT *,qswcorn,qswcorw,qnecorn,qnecorw,'Output Map corners' ! !----------------------------------------------------------------------- ! Calculate the following ! 1. the x,y coordinates of the points in the output grid relatvie to ! its SW corner,unit being km, used for plotting and CLLMC,x1N + y1N. ! 2. the x,y coordinates of the points in the output grid in the old ! grid,unit being m, used for interpolation,xN + yN. comparable to ! x2,y2. DO j=1,qnj DO i=1,qni ijq = i + qni*(j-1) x1n(ijq)=(i-1)*dxnew y1n(ijq)=(j-1)*dxnew CALL lltoxy( 1,1, latn(ijq),lonn(ijq), xn(ijq), yn(ijq) ) IF (i == 1.AND.j == 1.OR.i == qni.AND.j == qnj) THEN PRINT *,'SW/NE of output grid, lat,lon,x and y in input grid' PRINT *,i,j,latn(ijq),lonn(ijq),xn(ijq),yn(ijq) END IF END DO END DO !---------------------------------------------------------------------- ! DO j=1,nj DO i=1,ni sreh(i,j)=0.0 li(i,j)=0.0 cape(i,j)=0.0 brn(i,j)=0.0 cin(i,j)=0.0 llmc(i,j)=0.0 pw(i,j)=0.0 END DO END DO ! combine prt and bar DO k=1,nz DO j=1,ny DO i=1,nx u(i,j,k)=uprt(i,j,k)+ubar(i,j,k) v(i,j,k)=vprt(i,j,k)+vbar(i,j,k) w(i,j,k)=wprt(i,j,k)+wbar(i,j,k) qv(i,j,k)=MAX(0.0,qvprt(i,j,k)+qvbar(i,j,k)) pt(i,j,k)=ptprt(i,j,k)+ptbar(i,j,k) tem1(i,j,k)=pprt(i,j,k)+pbar(i,j,k) tem2(i,j,k)=0.0 tem3(i,j,k)=0.0 tem4(i,j,k)=0.0 END DO END DO END DO ! convert u,v,w to scalar points. DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem2(i,j,k)=0.5*(u(i,j,k)+u(i+1,j,k)) tem3(i,j,k)=0.5*(v(i,j,k)+v(i,j+1,k)) tem4(i,j,k)=0.5*(w(i,j,k)+w(i,j,k+1)) END DO END DO END DO u=0 v=0 w=0 DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 u(i,j,k)=tem2(i,j,k) v(i,j,k)=tem3(i,j,k) w(i,j,k)=tem4(i,j,k) END DO END DO END DO ! !---------------------------------------------------------------------- ! ! Calculate temperature (K) at ARPS grid points ! Calculate dew-point temperature td using enhanced Teten's formula. ! !----------------------------------------------------------------------- ! CALL temper(nx,ny,nz,pt, pprt ,pbar,tem2) CALL getdew(nx,ny,nz, 1,nx-1,1,ny-1,1,nz-1, tem1, tem2, qv,tem3) CALL getqvs(nx,ny,nz, 1,nx-1,1,ny-1,1,nz-1, tem1,tem2,tem4) ice=1 CALL reflec(nx,ny,nz,rhobar,qr,qs,qh,tem5) ! !----------------------------------------------------------------------- ! ! Set negative logrithm pressure (Pascal) coordinates ! for scalar and w grid points ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 algpzc(i,j,k) = -ALOG(tem1(i,j,k)) END DO END DO END DO !----------------------------------------------------------------------- ! calculate surface pressure (-log(ps)=psf),pmsl=psl,and moist. con. llmc CALL psfsl(nx,ny,tem2(1,1,2),qv(1,1,2),tem1(1,1,2), & hgt(1,1,2),zp(1,1,2),psf,psl) CALL cllmc(nx,ny,nz,u,v,qv,psf,zp,rhobar,algpzc,llmc, & x2,y2, vtwo1,vtwo2) CALL edgfill(llmc,1,nx-1,2,nx-2,1,ny-1,2,ny-2, & 1,1,1,1) ! calculate precipitable water and composite reflectivity DO j=1,ny-1 DO i=1,nx-1 cmpref(i,j)=0.0 pw1d=0.0 DO k=2,nz-1 ! totw=qv(i,j,k)+qc(i,j,k)+qr(i,j,k) ! : +qi(i,j,k)+qs(i,j,k)+qh(i,j,k) totw=qv(i,j,k) rho=tem1(i,j,k)/(rd*tem2(i,j,k)*(1.0+0.61*qv(i,j,k))) pw1d=pw1d+totw*(zp(i,j,k+1)-zp(i,j,k))*rho cmpref(i,j)=MAX(cmpref(i,j),tem5(i,j,k)) END DO pw(i,j)=pw1d*1000.0 END DO END DO ! calculate pt2m and qv2m by calling PTQV2M CALL ptqv2m(nx,ny,nz, nstyps,zp, & u ,v ,w ,ptprt, pprt, qvprt, & ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,wetsfc,wetcanp, & pt2m,qv2m, vtwo1,vtwo2, & qvsfc,vtwo3, & vtwo4,vtwo5,vtwo6) !----------------------------------------------------------------------- ! Generate other 2-D data sets. z01=-ALOG(25000.0) ! CALL secthrza(nx,ny,nz,hgt,algpzc,var2) CALL pintp(nx,ny,nz,hgt,algpzc,var2,3,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,hgt250) ! CALL secthrza(nx,ny,nz,u,algpzc,var2) CALL pintp(nx,ny,nz,u,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,uwind250) ! CALL secthrza(nx,ny,nz,v,algpzc,var2) CALL pintp(nx,ny,nz,v,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,vwind250) CALL vrtcalc(uwind250,vwind250,ni,nj,vort250,f2,x2,y2) z01=-ALOG(50000.0) ! CALL secthrza(nx,ny,nz,hgt,algpzc,var2) CALL pintp(nx,ny,nz,hgt,algpzc,var2,3,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,hgt500) ! CALL secthrz (nx,ny,nz,u,algpzc,var2) CALL pintp(nx,ny,nz,u,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,uwind500) ! CALL secthrza(nx,ny,nz,v,algpzc,var2) CALL pintp(nx,ny,nz,v,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,vwind500) CALL vrtcalc(uwind500,vwind500,ni,nj,vort500,f2,x2,y2) z01=-ALOG(85000.0) ! CALL secthrza(nx,ny,nz,hgt,algpzc,var2) CALL pintp(nx,ny,nz,hgt,algpzc,var2,3,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,hgt850) ! CALL secthrza(nx,ny,nz,u,algpzc,var2) CALL pintp(nx,ny,nz,u,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,uwind850) ! CALL secthrza(nx,ny,nz,v,algpzc,var2) CALL pintp(nx,ny,nz,v,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,vwind850) CALL vrtcalc(uwind850,vwind850,ni,nj,vort850,f2,x2,y2) ! CALL secthrza(nx,ny,nz,tem2,algpzc,var2) CALL pintp(nx,ny,nz,tem2,algpzc,var2,2,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,temp850) z01=-ALOG(100000.0) ! CALL secthrza(nx,ny,nz,hgt,algpzc,var2) CALL pintp(nx,ny,nz,hgt,algpzc,var2,3,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,thck) z01=-ALOG(70000.0) ! CALL secthrza(nx,ny,nz,tem2,algpzc,t700) CALL pintp(nx,ny,nz,tem2,algpzc,t700,2,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) ! CALL secthrza(nx,ny,nz,tem4,algpzc,qs700) CALL pintp(nx,ny,nz,tem4,algpzc,qs700,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) ! CALL secthrza(nx,ny,nz,qv,algpzc,var2) CALL pintp(nx,ny,nz,qv,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,rh700) ! CALL secthrza(nx,ny,nz,w,algpzc,var2) CALL pintp(nx,ny,nz,w,algpzc,var2,1,z01, & tem2,qv,hgt(1,1,2),zp(1,1,2),psf) CALL ary2dcv(nx,ny,var2,ni,nj,omega700) DO j=1,ny-1 DO i=1,nx-1 mslp(i,j) = psl(i,j) thck(i,j) = hgt500(i,j)-thck(i,j) rh700(i,j)= rh700(i,j)/qs700(i,j)*100.0 temp850(i,j)=temp850(i,j)-273.15 omega700(i,j)=omega700(i,j)*(-700000.0*g/287.053)/t700(i,j) END DO END DO IF (minohour < 1800) THEN ! temp2m, dewp2m scheme 1, direct interpolation from grid values z01=2.0 CALL secthrza(nx,ny,nz,tem3,zc,var2) CALL ary2dcv(nx,ny,var2,ni,nj,dewp2m) z01=2.0 CALL secthrza(nx,ny,nz,tem2,zc,var2) CALL ary2dcv(nx,ny,var2,ni,nj,temp2m) ELSE !temp2m dewp2m scheme 2,boundary layer physics (PTQV2M's results are used) z01=2.0 CALL secthrza(nx,ny,nz,tem1,zc,vtwo1) !vtwo1, pressure DO j=1,ny-1 DO i=1,nx-1 vtwo2(i,j)=pt2m(i,j)*(vtwo1(i,j)/100000.0)**rddcp END DO END DO CALL ary2dcv(nx,ny,vtwo2,ni,nj,temp2m) CALL getdew(nx,ny,1,1,nx-1,1,ny-1,1,1, vtwo1, vtwo2, qv2m,vtwo3) !vtwo3,dew point temperature CALL ary2dcv(nx,ny,vtwo3,ni,nj,dewp2m) !*** for the initial time,dewp at the level k=2 is used as dewp2m ! CALL ARY2DCV(nx,ny,tem3(1,1,2),ni,nj,dewp2m) END IF ! unit conversion DO j=1,ny-1 DO i=1,nx-1 temp2m(i,j)=temp2m(i,j)-273.15 dewp2m(i,j)=dewp2m(i,j)-273.15 IF (dewp2m(i,j) > temp2m(i,j)) dewp2m(i,j)=temp2m(i,j) END DO END DO !---------------------------------------------------------------------- ! ! Calculate sea level pressure (mb) ! Reduction method: Benjamin and Miller: 1990, MWR, vol.118, No.10, ! Page: 2100-2101 ! !----------------------------------------------------------------------- ! ! do 700 j=1,ny-1 ! do 700 i=1,nx-1 ! p00 = 0.01*(pbar(i,j,2)+pprt(i,j,2)) ! if(p00.le.700.0) then ! t00=tem2(i,j,2) ! else ! t00 = t700(i,j)*(p00/700.0)**ex1 ! end if ! mslp(i,j) = p00*(1.0+gamma*zpc(i,j,2)/t00)**ex2 ! mslp(i,j) = psl(i,j)*0.01 ! thck(i,j) = hgt500(i,j)-8.0*(mslp(i,j)-1000.0) ! thck(i,j) = hgt500(i,j)-thck(i,j) 700 CONTINUE !----------------------------------------------------------------------- ! ! Calculate CAPE and CIN ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem4(i,j,k)=qv(i,j,k)/(1.-qv(i,j,k)) END DO END DO END DO CALL edgfill(u,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(v,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(tem4,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(tem1,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(tem2,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) CALL edgfill(tem3,1,nx,1,nx-1,1,ny,1,ny-1, & 1,nz,1,nz-1) IF (icape == 2) THEN PRINT *, ' calling cape_ncep' CALL cape_ncep(nx,ny,nz, & tem2,qv,tem1,cape1,cin1,li1, & tem3,tem4,tem5,tem6, & vtwo1,vtwo2,vtwo3,vtwo4,vtwo5,item, & item1,item2,item3,item4,item5,item6,item7, & ! work arrays rtem1,rtem2,rtem3,rtem4,rtem5,rtem6,rtem7) ! work arrays PRINT *, ' back from cape_ncep' ELSE IF (icape == 1) THEN PRINT *, ' calling arps_be' CALL arps_be(nx,ny,nz, & tem1,zpc,tem2,tem4, & lcl,lfc,el,twdf,li1,cape1,mbe,cin1,capst, & wrk1,wrk2,wrk3,wrk4,wrk5,wrk6, & wrk7,wrk8,wrk9,wrk10,wrk11,wrk12,t1) PRINT *, ' back from arps_be' ELSE PRINT *,'icape option is incorrect, chose 1 or 2' STOP END IF CALL ary2dcv(nx,ny,cape1,ni,nj,cape) CALL ary2dcv(nx,ny,cin1,ni,nj,cin) CALL ary2dcv(nx,ny,li1,ni,nj,li) ! !----------------------------------------------------------------------- ! ! Calculate helicity and other shear-related paramaters ! !----------------------------------------------------------------------- ! PRINT *, ' calling calcshr' CALL xytomf(nx,ny,x,y,b1) CALL calcshr(nx,ny,nz,x,y,zp,b1, & tem1,tem2,u,v,cape1, & shr37,ustrm,vstrm,srlfl,srmfl,heli,brn1,brnu,blcon, & t1,t2,t3,t4,tem4) PRINT *, ' back from calcshr' CALL ary2dcv(nx,ny,heli,ni,nj,sreh) CALL ary2dcv(nx,ny,brn1,ni,nj,brn) !----------------------------------------------------------------------- ! Interpolate the 2_d variables !----------------------------------------------------------------------- IF (iterr == 1) THEN DO i=1,nx-1 DO j=1,ny-1 cmpref(i,j)=zp(i,j,2) END DO END DO END IF CALL d2intrpa(x2,y2,nx-1,ny-1, & xn,yn,qni,qnj,intrpl, & mslp,mslpn, & hgt250,hgt250n, & vort250,vort250n, & uwind250,uwind250n, & vwind250,vwind250n, & hgt500,hgt500n, & vort500,vort500n, & uwind500,uwind500n, & vwind500,vwind500n, & hgt850,hgt850n, & vort850,vort850n, & uwind850,uwind850n, & vwind850,vwind850n, & temp850,temp850n, & thck,thckn, & rh700,rh700n, & omega700,omega700n, & temp2m,temp2mn, & dewp2m,dewp2mn, & accppt,accpptn, & convppt,convpptn, & sreh,srehn, & li,lin, & cape,capen, & brn,brnn, & cin,cinn, & llmc,llmcn, & pw,pwn, & cmpref,cmprefn) !----------------------------------------------------------------------- ! Find the information about the time and date of the datafile ! and add the lead time (minohour) to it, find the day of week ! read (filename(1:26),'(2x,I4,I2,I2,I2,8x,I6)') ! : year1, month1,dateomon,houroday,minohour ! print *, filename(1:26),'DATE VARIABLES' PRINT *, year1,month1,dateomon,houroday,minohour CALL calender(year1,month1,dateomon,houroday,minohour,dayoweek) ! print *, year1, month1,dateomon,houroday,minohour,dayoweek ! print *, 'year1, month1,dateomon,houroday,minohour,dayoweek' ! Write out the output 2-D fields WRITE (0,*) 'About to call EnsWrtAll' filename=outfile(nf) lenfil = len_trim(filename) WRITE(6,'(a,a/)') & ' The file name of output set is ', filename(1:lenfil) CALL enswrtall (filename(1:lenfil), 2, dxnew, & houroday,minohour,dayoweek,dateomon,month1,year1, & mslpn, hgt250n, vort250n, uwind250n, vwind250n, & hgt500n, vort500n, uwind500n, vwind500n, & hgt850n, vort850n, uwind850n, vwind850n, & temp850n, thckn, rh700n, omega700n, & temp2mn, dewp2mn, accpptn, convpptn, & srehn, lin, capen, brnn, cinn, llmcn,pwn,cmprefn) !----------------------------------------------------------------------- ! Plotting of the relavent parameters if iplot=1 ! Plotting of the terrain contour if iterr=1 IF (iterr == 1) THEN CALL a2plt(cmprefn,x1n,y1n,qni,qnj,dxnew,100.0,'HTER') ELSE IF (iplot == 1) THEN CALL a2plt(accpptn,x1n,y1n,qni,qnj,dxnew,1.0,'TPPT') CALL a2plt(convpptn,x1n,y1n,qni,qnj,dxnew,1.0,'CPPT') ELSE IF (iplot == 2) THEN CALL a2plt(mslpn,x1n,y1n,qni,qnj,dxnew,200.0,'MSLP') CALL a2plt(hgt250n,x1n,y1n,qni,qnj,dxnew,50.0,'H250') CALL a2plt(hgt500n,x1n,y1n,qni,qnj,dxnew,20.0,'H500') CALL a2plt(hgt850n,x1n,y1n,qni,qnj,dxnew,20.0,'H850') CALL a2plt(vort250n,x1n,y1n,qni,qnj,dxnew,0.00002,'V250') CALL a2plt(vort500n,x1n,y1n,qni,qnj,dxnew,0.00002,'V500') CALL a2plt(vort850n,x1n,y1n,qni,qnj,dxnew,0.00002,'V850') CALL a2plt(temp850n,x1n,y1n,qni,qnj,dxnew,2.0,'T850') CALL a2plt(thckn,x1n,y1n,qni,qnj,dxnew,20.0,'THCK') CALL a2plt(rh700n,x1n,y1n,qni,qnj,dxnew,10.0,'RH70') CALL a2plt(omega700n,x1n,y1n,qni,qnj,dxnew,2.0,'OM70') CALL a2plt(temp2mn,x1n,y1n,qni,qnj,dxnew,2.0,'TC2M') CALL a2plt(dewp2mn,x1n,y1n,qni,qnj,dxnew,2.0,'TD2M') CALL a2plt(accpptn,x1n,y1n,qni,qnj,dxnew,2.0,'TPPT') CALL a2plt(convpptn,x1n,y1n,qni,qnj,dxnew,2.0,'CPPT') CALL a2plt(srehn,x1n,y1n,qni,qnj,dxnew,50.0,'SREH') CALL a2plt(lin,x1n,y1n,qni,qnj,dxnew,2.0,'LIDX') CALL a2plt(capen,x1n,y1n,qni,qnj,dxnew,500.0,'CAPE') CALL a2plt(brnn,x1n,y1n,qni,qnj,dxnew,10.0,'BRN ') CALL a2plt(cinn,x1n,y1n,qni,qnj,dxnew,50.0,'CIN ') CALL a2plt(llmcn,x1n,y1n,qni,qnj,dxnew,0.0001,'LLMC') CALL a2plt(pwn,x1n,y1n,qni,qnj,dxnew,2000.0,' PW ') CALL a2plt(cmprefn,x1n,y1n,qni,qnj,dxnew,2000.0,'CPRF') END IF 7000 CONTINUE END DO WRITE(6,'(a)') 'Program completed.' IF (iplot >= 1) CALL xgrend STOP END PROGRAM arpsenscv SUBROUTINE a2plt(a,x,y,nx,ny,dx,zinc,title) 26 IMPLICIT NONE INTEGER :: nx,ny,ncl,mode INTEGER :: i,j REAL :: a(nx,ny),x(nx,ny),y(nx,ny),dx INTEGER :: iw(212,152) REAL :: cl(100),zmax,zmin,zinc CHARACTER (LEN=4) :: title CALL xpspac(0.1,0.9,0.05,0.15+80.0/116.0*0.8) ! call XMAP(0.0,2400.0,0.0,2080.0) ! call XMAP(0.0,3480.0,0.0,2400.0) CALL xmap(0.0,(nx-1)*dx,0.0,(ny-1)*dx) CALL xaxsca(0.0,(nx-1)*dx,dx,0.0,(ny-1)*dx,dx) ! call XAXSCA(0.0,3480.0,30.0,0.0,2400.0,30.0) ! call XAXSCA(0.0,2400.0,32.0,0.0,2080.0,32.0) CALL xbordr ncl=100 zmax=-1.0E-10 zmin=+1.0E+10 DO j=2,ny-1 DO i=2,nx-1 IF (a(i,j) > zmax) zmax=a(i,j) IF (a(i,j) < zmin) zmin=a(i,j) END DO END DO IF (ABS(zmax-zmin) < 1.0E-8) GO TO 200 cl(1)=INT(zmin/zinc)*zinc cl(2)=cl(1)+zinc mode=1 CALL xconta( zmax=cl(ncl) zmin=cl(1) zinc=cl(MIN(2,ncl))-cl(1) 200 CONTINUE PRINT *,zmax,zmin,zinc CALL xclimt(zmax,zmin,zinc,0.0) CALL xchsiz(80.00) CALL xcharc(1500.,-100.,title) CALL xframe RETURN END SUBROUTINE a2plt !ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc C SUBROUTINE pptsto(ni,nj,a,b) 2 INTEGER :: ni,nj,i,j REAL :: a(ni,nj),b(ni,nj),c DO j=1,nj DO i=1,ni c=a(i,j)-b(i,j) b(i,j)=a(i,j) a(i,j)=c END DO END DO RETURN END SUBROUTINE pptsto ! SUBROUTINE ary2dcv(nx,ny,a,ni,nj,b) 26 IMPLICIT NONE INTEGER :: nx,ny,ni,nj REAL :: a(nx,ny),b(ni,nj) INTEGER :: i,j ! print *,a(35,35),a(78,68) DO j=1,nj DO i=1,ni b(i,j)=a(i,j) END DO END DO RETURN END SUBROUTINE ary2dcv SUBROUTINE vrtcalc(u,v,ni,nj,b,f,x,y) 3,1 IMPLICIT NONE INTEGER :: ni,nj REAL :: u(ni,nj),v(ni,nj),b(ni,nj),f(ni,nj),x(ni,nj),y(ni,nj) INTEGER :: i,j DO j=1,nj DO i=1,ni b(i,j)=0.0 END DO END DO DO j=2,nj-1 DO i=2,ni-1 b(i,j)=(v(i+1,j)-v(i-1,j))/(x(i+1,j)-x(i-1,j)) & -(u(i,j+1)-u(i,j-1))/(y(i,j+1)-y(i,j-1)) & +f(i,j) END DO END DO CALL edgfill(b,1,ni,2,ni-1,1,nj,2,nj-1,1,1,1,1) RETURN END SUBROUTINE vrtcalc SUBROUTINE enswrthd (filenm, fileun, & 1,3 enstag, instit, model, resltn, resun, & houroday, minohour, dayoweek, dateomon, & month, year) ! !======================================================================- ! &&&& G E N E R A L I N F O R M A T I O N &&&& !======================================================================- ! ! PURPOSE: This output subroutine produces the header for SAMEX ASCII ! fields for conversion to images. ! ! AUTHOR: Henry Neeman, Univ. of Oklahoma, Project SAMEX ! (hneeman@tornado.caps.ou.edu) ! ! HISTORY: ! 1998/03/18 First written [HJN] ! ! INPUT ARGUMENTS: ! filenm: string for filename to output data to ! fileun: integer for Fortran file unit ! enstag: tag for ensemble (e.g., 'SAMEX') ! instit: string for name of institution ! (e.g., 'CAPS', 'NCEP', 'NCAR', 'AFWA', 'NSSL') ! model: string for name of model ! (e.g., 'ARPS4.3.3', 'MM5V2') ! Note: the model name should not contain any blanks or tabs. ! resltn: real for resolution (e.g., 30 for 30 km resolution) ! resun: string for name of resolution units (e.g., 'km') ! houroday: integer for hour of the day (e.g., 20) ! minohour: integer for minute of the hour (e.g., 30) ! dayoweek: integer for day the week ! 1=Sun, 2=Mon, 3=Tue, 4=Wed, 5=Thu, 6=Fri, 7=Sat ! dateomon: integer for date of the month ! month: integer for month (1=Jan, 2=Feb, etc.) ! year: integer for year (e.g., 1998) ! ! OUTPUT: ! ASCII file header for 2D data field ! ! I/O: ! Output data to a Fortran unformatted ASCII file. ! ! SPECIAL REQUIREMENTS: ! <none> ! ! OTHER INFORMATION: ! <none> ! !======================================================================- ! %%%% D E C L A R A T I O N S %%%% !======================================================================- ! IMPLICIT NONE ! - - - - - - - - - Include files - - - - - - - - - - - - - - - - - - - ! ! - - - - - - - - - Constant declarations - - - - - - - - - - - - - - - ! ! - - - - - - - - - Argument declarations - - - - - - - - - - - - - - - CHARACTER (LEN=*) :: filenm INTEGER :: fileun CHARACTER (LEN=*) :: enstag, instit, model REAL :: resltn CHARACTER (LEN=*) :: resun INTEGER :: houroday, minohour, dayoweek, dateomon, month, year INTEGER :: lenstag, linstit, lmodel ! - - - - - - - - - Global/External declarations - - - - - - - - - - - ! ! - - - - - - - - - Local declarations - - - - - - - - - - - - - - - - INTEGER :: iost ! - - - - - - - - - Data statements - - - - - - - - - - - - - - - - - - ! ! - - - - - - - - - Statement functions - - - - - - - - - - - - - - - - ! !======================================================================- ! @@@@ E X E C U T A B L E C O D E @@@@ !======================================================================- ! 100 FORMAT (a) 110 FORMAT (a, ' ', a, ' ', a, ' ', g10.3, ' ', a) 120 FORMAT (i2, i3, i2, i3, i3, i5) lenstag = 0 CALL strlnth( enstag, lenstag) linstit = 0 CALL strlnth( instit, linstit) lmodel = 0 CALL strlnth( model, lmodel) OPEN (UNIT=fileun,IOSTAT=iost,ERR=150,FILE=filenm) WRITE (fileun,*) enstag(1:lenstag) WRITE (fileun,*) instit(1:linstit), ' ', model(1:lmodel), & ' ', resltn, ' ', resun WRITE (fileun,*) houroday, ' ', minohour, ' ', dayoweek, ' ', & dateomon, ' ', month, ' ', year RETURN 150 WRITE (0,160) filenm RETURN 160 FORMAT ('Error: cannot open file ', a, & ' for writing ensemble header!') END SUBROUTINE enswrthd ! ! ! ######################################## ! ######################################## ! ######################################## ! ######## ######## ! ######## ENSEMBLE ######## ! ######## ######## ! ######################################## ! ######################################## ! ######################################## ! ! SUBROUTINE enswrtq (filenm, fileun, & 29 qtag, qunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, qfield, & islast) ! !======================================================================- ! &&&& G E N E R A L I N F O R M A T I O N &&&& !======================================================================- ! ! PURPOSE: This output subroutine produces each SAMEX ASCII quantity ! field for conversion to images. ! ! AUTHOR: Henry Neeman, Univ. of Oklahoma, Project SAMEX ! (hneeman@tornado.caps.ou.edu) ! ! HISTORY: ! 1998/03/18 First written [HJN] ! ! INPUT ARGUMENTS: ! filenm: string for filename to output data to ! fileun: integer for Fortran file unit ! qtag: string for quantity tag (e.g., 'MSLP') ! qunits: string for quantity units (e.g., 'km') ! qswcorn: real for quantity southwest corner north coordinate ! qswcore: real for quantity southwest corner west coordinate ! qnecorn: real for quantity northeast corner north coordinate ! qnecore: real for quantity northeast corner west coordinate ! qstag: string for quantity staggering (for now, CENTER) ! qni: integer for quantity number of cells along the major axis ! qnj: integer for quantity number of cells along the minor axis ! qfield: real array for the quantity field data ! islast: logical for the quantity being the last in the file ! ! OUTPUT: ! ASCII file for 2D data field ! ! I/O: ! Output data to a Fortran unformatted ASCII file. ! ! SPECIAL REQUIREMENTS: ! <none> ! ! OTHER INFORMATION: ! <none> ! !======================================================================- ! %%%% D E C L A R A T I O N S %%%% !======================================================================- ! IMPLICIT NONE ! - - - - - - - - - Include files - - - - - - - - - - - - - - - - - - - ! ! - - - - - - - - - Constant declarations - - - - - - - - - - - - - - - ! ! - - - - - - - - - Argument declarations - - - - - - - - - - - - - - - CHARACTER (LEN=*) :: filenm INTEGER :: fileun CHARACTER (LEN=*) :: qtag, qunits REAL :: qswcorn, qswcorw, qnecorn, qnecorw CHARACTER (LEN=*) :: qstag INTEGER :: qni, qnj REAL :: qfield(qni,qnj) LOGICAL :: islast ! - - - - - - - - - Global/External declarations - - - - - - - - - - - ! ! - - - - - - - - - Local declarations - - - - - - - - - - - - - - - - INTEGER :: iost INTEGER :: i, j ! - - - - - - - - - Data statements - - - - - - - - - - - - - - - - - - ! - - - - - - - - - Statement functions - - - - - - - - - - - - - - - - !======================================================================- ! @@@@ E X E C U T A B L E C O D E @@@@ !======================================================================- ! 200 FORMAT (a, ' ', a) 210 FORMAT (g10.5, ' N ', g10.5, ' W ', g10.5, ' N ', g10.5, ' W ') 220 FORMAT (a) 230 FORMAT (i5, ' ', i5) 240 FORMAT (e16.8, e16.8, e16.8, e16.8, e16.8) WRITE (fileun,*) qtag, ' ', qunits WRITE (fileun,*) qswcorn, ' N ', qswcorw, ' W ', & qnecorn, ' N ', qnecorw, ' W' WRITE (fileun,*) qstag WRITE (fileun,*) qni, ' ', qnj DO j = 1, qnj WRITE (fileun,240) (qfield(i,j),i=1,qni) END DO IF (islast) THEN CLOSE (UNIT=fileun,IOSTAT=iost,ERR=250,STATUS='KEEP') ELSE WRITE (fileun,*) ' ' END IF RETURN 250 WRITE (0,260) filenm RETURN 260 FORMAT ('Error: cannot close file ', a, & ' after writing ensemble data!') END SUBROUTINE enswrtq ! ! ! ######################################## ! ######################################## ! ######################################## ! ######## ######## ! ######## ENSEMBLE ######## ! ######## ######## ! ######################################## ! ######################################## ! ######################################## ! ! SUBROUTINE enswrtall (filenm, fileun, resltn, & 1,30 houroday, minohour, dayoweek, dateomon, & month, year, & mslp, hgt250, vort250, uwind250, vwind250, & hgt500, vort500, uwind500, vwind500, & hgt850, vort850, uwind850, vwind850, & temp850, thck, rh700, omega700, & temp2m, dewp2m, accppt, convppt, & sreh, li, cape, brn, cin, llmc,pw,cmpref) ! !======================================================================- ! &&&& G E N E R A L I N F O R M A T I O N &&&& !======================================================================- ! ! PURPOSE: This output subroutine produces the header for SAMEX ASCII ! fields for conversion to images. ! ! AUTHOR: Henry Neeman, Univ. of Oklahoma, Project SAMEX ! (hneeman@tornado.caps.ou.edu) ! ! HISTORY: ! 1998/03/18 First written [HJN] ! ! INPUT ARGUMENTS: ! filenm: string for filename to output data to ! fileun: integer for Fortran file unit ! Note: the model name should not contain any blanks or tabs. ! resltn: real for resolution (e.g., 30 for 30 km resolution) ! houroday: integer for hour of the day (e.g., 20) ! minohour: integer for minute of the hour (e.g., 30) ! dayoweek: integer for day the week ! 1=Sun, 2=Mon, 3=Tue, 4=Wed, 5=Thu, 6=Fri, 7=Sat ! dateomon: integer for date of the month ! month: integer for month (1=Jan, 2=Feb, etc.) ! year: integer for year (e.g., 1998) ! mslp: real array for mean sea level pressure in pascals ! hgt250: real array for 250 mb height in m ! vort250: real array for 250 mb absolute vorticity in 1/s ! uwing250: real array for 250 mb u wind velocity in m/s ! vwing250: real array for 250 mb v wind velocity in m/s ! hgt500: real array for 500 mb height in m ! vort500: real array for 500 mb absolute vorticity in 1/s ! uwing500: real array for 500 mb u wind velocity in m/s ! vwing500: real array for 500 mb v wind velocity in m/s ! hgt850: real array for 850 mb height in m ! vort850: real array for 850 mb absolute vorticity in 1/s ! uwing850: real array for 850 mb u wind velocity in m/s ! vwing850: real array for 850 mb v wind velocity in m/s ! temp850: real array for 850 mb temperature in degrees C ! thck: real array for 1000-500 mb thickness in m ! rh700: real array for 700 mb relative humidity in % ! omega700: real array for 700 mb omega vertical velocity in -microb/s ! temp2m: real array for 2 m temperature in degrees C ! dewp2m: real array for 2 m dewpoint in degrees C ! accppt: real array for accumulated precipitation in mm ! convppt: real array for convective precipitation in mm ! sreh: real array for storm-relative environmental helicity ! in m/s^2 ! li: real array for lifted index in degrees C ! cape: real array for convective available potential energy in J/kg ! brn: real array for bulk Richardson number (unitless) ! cin: real array for convective inhibition in J/kg ! llmc: real array for low-level moisture convergence in g/kg/s ! pw: real array for precipitable water in g/m^2 ! ! OUTPUT: ! ASCII file header for 2D data field ! ! I/O: ! Output data to a Fortran unformatted ASCII file. ! ! SPECIAL REQUIREMENTS: ! <none> ! ! OTHER INFORMATION: ! <none> ! !======================================================================- ! %%%% D E C L A R A T I O N S %%%% !======================================================================- ! IMPLICIT NONE ! - - - - - - - - - Include files - - - - - - - - - - - - - - - - - - - INCLUDE 'enscv.inc' ! - - - - - - - - - Constant declarations - - - - - - - - - - - - - - - ! ! - - - - - - - - - Argument declarations - - - - - - - - - - - - - - - CHARACTER (LEN=*) :: filenm INTEGER :: fileun REAL :: resltn INTEGER :: houroday, minohour, dayoweek, dateomon, month, year REAL :: mslp(qni,qnj) REAL :: hgt250(qni,qnj), vort250(qni,qnj), & uwind250(qni,qnj), vwind250(qni,qnj) REAL :: hgt500(qni,qnj), vort500(qni,qnj), & uwind500(qni,qnj), vwind500(qni,qnj) REAL :: hgt850(qni,qnj), vort850(qni,qnj), & uwind850(qni,qnj), vwind850(qni,qnj) REAL :: temp850(qni,qnj) REAL :: thck(qni,qnj), rh700(qni,qnj), omega700(qni,qnj), & temp2m(qni,qnj), dewp2m(qni,qnj) REAL :: accppt(qni,qnj), convppt(qni,qnj) REAL :: sreh(qni,qnj), li(qni,qnj), cape(qni,qnj), brn(qni,qnj), & cin(qni,qnj), llmc(qni,qnj), pw(qni,qnj) REAL :: cmpref(qni,qnj) ! - - - - - - - - - Global/External declarations - - - - - - - - - - - ! ! - - - - - - - - - Local declarations - - - - - - - - - - - - - - - - ! ! - - - - - - - - - Data statements - - - - - - - - - - - - - - - - - - ! ! - - - - - - - - - Statement functions - - - - - - - - - - - - - - - - ! !======================================================================- ! @@@@ E X E C U T A B L E C O D E @@@@ !======================================================================- ! PRINT *, 'starting (inside) EnsWrt' CALL enswrthd (filenm, fileun, & enstag, instit, model, resltn, resun, & houroday, minohour, dayoweek, dateomon, & month, year) CALL enswrtq (filenm, fileun, & mslptag, mslpunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, mslp, & .false.) CALL enswrtq (filenm, fileun, & hgt250tag, hgt250units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, hgt250, & .false.) CALL enswrtq (filenm, fileun, & vort250tag, vort250units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, vort250, & .false.) CALL enswrtq (filenm, fileun, & uwind250tag, uwind250units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, uwind250, & .false.) CALL enswrtq (filenm, fileun, & vwind250tag, vwind250units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, vwind250, & .false.) CALL enswrtq (filenm, fileun, & hgt500tag, hgt500units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, hgt500, & .false.) CALL enswrtq (filenm, fileun, & vort500tag, vort500units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, vort500, & .false.) CALL enswrtq (filenm, fileun, & uwind500tag, uwind500units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, uwind500, & .false.) CALL enswrtq (filenm, fileun, & vwind500tag, vwind500units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, vwind500, & .false.) CALL enswrtq (filenm, fileun, & hgt850tag, hgt850units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, hgt850, & .false.) CALL enswrtq (filenm, fileun, & vort850tag, vort850units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, vort850, & .false.) CALL enswrtq (filenm, fileun, & uwind850tag, uwind850units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, uwind850, & .false.) CALL enswrtq (filenm, fileun, & vwind850tag, vwind850units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, vwind850, & .false.) CALL enswrtq (filenm, fileun, & temp850tag, temp850units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, temp850, & .false.) CALL enswrtq (filenm, fileun, & thcktag, thckunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, thck, & .false.) CALL enswrtq (filenm, fileun, & rh700tag, rh700units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, rh700, & .false.) CALL enswrtq (filenm, fileun, & omega700tag, omega700units, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, omega700, & .false.) CALL enswrtq (filenm, fileun, & temp2mtag, temp2munits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, temp2m, & .false.) CALL enswrtq (filenm, fileun, & dewp2mtag, dewp2munits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, dewp2m, & .false.) CALL enswrtq (filenm, fileun, & accppttag, accpptunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, accppt, & .false.) CALL enswrtq (filenm, fileun, & convppttag, convpptunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, convppt, & .false.) CALL enswrtq (filenm, fileun, & srehtag, srehunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, sreh, & .false.) CALL enswrtq (filenm, fileun, & litag, liunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, li, & .false.) CALL enswrtq (filenm, fileun, & capetag, capeunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, cape, & .false.) CALL enswrtq (filenm, fileun, & brntag, brnunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, brn, & .false.) CALL enswrtq (filenm, fileun, & cintag, cinunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, cin, & .false.) CALL enswrtq (filenm, fileun, & llmctag, llmcunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, llmc, & .false.) CALL enswrtq (filenm, fileun, & pwtag, pwunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, pw, & .false.) CALL enswrtq (filenm, fileun, & crftag, crfunits, & qswcorn, qswcorw, qnecorn, qnecorw, & qstag, & qni, qnj, cmpref, & .true.) RETURN END SUBROUTINE enswrtall ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SECTHRZA ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE secthrza(nx,ny,nz,s,z,ss1) 3 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolate 3-D data to a given horizontal level. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue & Hao Jin ! 12/18/92. ! ! MODIFICATION HISTORY: ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! s 3-dimensional array of data to contour ! s1 2-dimensional array of data to contour ! ! 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 physical space (m) ! ! z01 value of x for first i grid point to plot ! ! OUTPUT: ! ss1 interpolated 3-D data to a given horizontal level ! !----------------------------------------------------------------------- ! ! Parameters of output ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions REAL :: s(nx,ny,nz) ! 3-dimensional array of data to contour REAL :: z(nx,ny,nz) ! z coordinate of grid points ! in physical space (m) REAL :: ss1(nx,ny) ! interpolated 3-D data to a ! given horizontal level ! !----------------------------------------------------------------------- ! ! Common blocks for plotting control parameters ! !----------------------------------------------------------------------- ! REAL :: z01 ! the given height of the slice COMMON /sliceh/z01 !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! !----------------------------------------------------------------------- ! ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Find index for interpolation ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 IF(z01 <= z(i,j,1)) GO TO 11 IF(z01 >= z(i,j,nz-1)) GO TO 12 DO k=2,nz-2 IF(z01 >= z(i,j,k).AND.z01 < z(i,j,k+1)) GO TO 15 END DO 11 k=1 GO TO 15 12 k=nz-1 GO TO 15 15 ss1(i,j)=s(i,j,k)+(s(i,j,k+1)-s(i,j,k))* & (z01-z(i,j,k))/(z(i,j,k+1)-z(i,j,k)) !----------------------------------------------------------------------- ! ! If the data point is below the ground level, set the ! data value to the missing value. ! !----------------------------------------------------------------------- ! IF( z01.lt. z(i,j,2) ) ss1(i,j) = -9999.0 END DO END DO RETURN END SUBROUTINE secthrza SUBROUTINE ptqv2m(nx,ny,nz, nstyps,zp, & 1,5 u ,v ,w ,ptprt, pprt, qvprt, & ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,wetsfc,wetcanp, & tem1,tem2, tem3,tem4, & qvsfc,ptsfc, & vke2,ptke2,qvke2) IMPLICIT NONE INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! input INTEGER :: nx,ny,nz,nstyps REAL :: zp(nx,ny,nz) REAL :: u(nx,ny,nz),v(nx,ny,nz),w(nx,ny,nz) REAL :: ptprt(nx,ny,nz),pprt(nx,ny,nz),qvprt(nx,ny,nz) REAL :: ptbar(nx,ny,nz),pbar(nx,ny,nz),qvbar(nx,ny,nz) REAL :: rhobar(nx,ny,nz) INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type fraction INTEGER :: vegtyp (nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsfc (nx,ny,0:nstyps) ! Soil Skin Temperature (K) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount ! output REAL :: tem1(nx,ny),tem2(nx,ny) ! temperary arrays REAL :: tem3(nx,ny),tem4(nx,ny) REAL :: ptsfc(nx,ny), qvsfc(nx,ny,0:nstyps) REAL :: vke2(nx,ny),ptke2(nx,ny),qvke2(nx,ny) ! temperary variables INTEGER :: i,j,k,is REAL :: z1,z1drou,z1droup REAL :: usuf,vsuf,wsuf,tsuf REAL :: psfc,qvsatts, rhgs, pterm, pi PARAMETER (pi=3.141592654) REAL :: gumove,gvmove DATA gumove /0.0/ DATA gvmove /0.0/ ! field moisture capacity REAL :: wfc(13) DATA wfc / .135, .150, .195, .255, .240, .255, & .322, .325, .310, .370, .367, 1.0E-25, 1.00/ REAL :: f_qvsat !fpp$ expand (f_qvsat) !dir$ inline always f_qvsat PRINT *, 'starting PTQV2M' IF (nstyp <= 1) THEN ! for nstyp=1, the DTAREAD subroutine returns tsfc etc. with (i,j,0) ! filled with data and (i,j,1) not assigned. This loop fills this Gap. DO j = 1, ny DO i = 1, nx tsfc(i,j,1)=tsfc(i,j,0) wetsfc(i,j,1)=wetsfc(i,j,0) wetcanp(i,j,1)=wetcanp(i,j,0) stypfrct(i,j,1)=1.0 END DO END DO END IF DO j = 1, ny DO i = 1, nx qvsfc(i,j,0) = 0.0 tem1(i,j)=0.0 tem2(i,j)=0.0 tem3(i,j)=0.0 tem4(i,j)=0.0 END DO END DO ! deduce qvsfc(effctive qv at surface) ,adapted from INISFC PRINT *,'NSTYPS/NSTYP',nstyps,nstyp DO is=1,nstyp DO j = 1, ny-1 DO i = 1, nx-1 psfc = .5 * ( pbar(i,j,1) + pprt(i,j,1) & + pbar(i,j,2) + pprt(i,j,2) ) qvsatts = f_qvsat( psfc, tsfc(i,j,is) ) IF ( soiltyp(i,j,is) == 12 .OR. soiltyp(i,j,is) == 13) THEN ! Ice and water rhgs = 1.0 ELSE pterm = .5 + SIGN( .5, wetsfc(i,j,is) - wfc(soiltyp(i,j,is)) ) rhgs = pterm + (1.-pterm) & * 0.5 * ( 1. - COS( wetsfc(i,j,is) * pi & / wfc(soiltyp(i,j,is)) ) ) END IF qvsfc(i,j,is) = rhgs * qvsatts END DO END DO END DO DO is=1,nstyp DO j = 1, ny-1 DO i = 1, nx-1 qvsfc(i,j,0) = qvsfc(i,j,0) + qvsfc(i,j,is)*stypfrct(i,j,is) END DO END DO END DO ! calculate wind speed,pt and qv at k=2, pt at surface DO j = 1, ny-1 DO i = 1, nx-1 usuf=gumove+0.5*(u(i,j,2)+u(i+1,j,2)) vsuf=gvmove+0.5*(v(i,j,2)+v(i,j+1,2)) wsuf= 0.5*(w(i,j,2)+w(i,j,3)) vke2(i,j)=MAX( SQRT(usuf*usuf+vsuf*vsuf+wsuf*wsuf),vsfcmin) ptke2(i,j)=ptprt(i,j,2)+ptbar(i,j,2) qvke2(i,j)=qvprt(i,j,2)+qvbar(i,j,2) psfc=0.5*(pprt(i,j,1)+pbar(i,j,1) & +pprt(i,j,2)+pbar(i,j,2)) ptsfc(i,j)=tsfc(i,j,0)*(100000.0/psfc)**rddcp END DO END DO ! calculate C_u and C_pt for nuetral condition stored in tem1 and ! tem2, respectively DO j = 1, ny-1 DO i = 1, nx-1 z1=0.5*(zp(i,j,3)-zp(i,j,2)) z1=MIN(z1,z1limit) z1drou=z1/roufns(i,j) z1droup=(z1+roufns(i,j))/roufns(i,j) IF (z1droup < 0.0) THEN PRINT *,i,j,z1droup,z1,roufns(i,j) STOP END IF tem1(i,j)=kv/LOG(z1droup) tem2(i,j)=tem1(i,j)/prantl0l IF (soiltyp(i,j,1) == 13.AND.stypfrct(i,j,1) >= 0.5) THEN tem1(i,j)=SQRT((0.4+0.079*vke2(i,j))*1.e-3) tem2(i,j)=1.14E-3/tem1(i,j) END IF END DO END DO ! calculate C_pt according to land/water and stability CALL cptca(nx,ny,nz,nx-1,ny-1,zp,roufns,vke2(1,1), & ptsfc(1,1),ptke2(1,1),tem2(1,1),tem3(1,1),1) CALL cptcwtra(nx,ny,nz,nx-1,ny-1,zp,soiltyp,vke2(1,1), & ptsfc(1,1),ptke2(1,1),tem2(1,1),tem3(1,1),1) CALL cptca(nx,ny,nz,nx-1,ny-1,zp,roufns,vke2(1,1), & ptsfc(1,1),ptke2(1,1),tem2(1,1),tem4(1,1),2) CALL cptcwtra(nx,ny,nz,nx-1,ny-1,zp,soiltyp,vke2(1,1), & ptsfc(1,1),ptke2(1,1),tem2(1,1),tem4(1,1),2) DO j = 1, ny-1 DO i = 1, nx-1 tem1(i,j)=ptsfc(i,j)+tem3(i,j)/tem4(i,j)*(ptke2(i,j)-ptsfc(i,j)) tem2(i,j)=qvsfc(i,j,0)+tem3(i,j)/tem4(i,j) & *(qvke2(i,j)-qvsfc(i,j,0)) ! tem2(i,j)=qvke2(i,j) END DO END DO PRINT *, 'finishing PTQV2M' RETURN END SUBROUTINE ptqv2m ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CPTC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cptca(nx,ny,nz,iend,jend,zp,roufns,wspd,ptsfc,pt1, & 2 c_ptneu,c_pt,i1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute c_pt (a nondimensional temperature scale) ! ! The quantity c_pt is used by the subroutine SFCFLX to obtain ! surface fluxes for both the unstable and stable cases. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong, X. Song and N. Lin ! 9/10/1993 ! ! For the unstable case (Bulk Richardson number bulkri < 0 ), the ! formulation is based on the paper "On the Analytical Solutions of ! Flux-Profile relationships for the Atmospheric Surface Layer" by ! D.W. Byun in J. of Applied Meteorlogy, July 1990, pp. 652-657. ! ! For stable case, the formulation is based on the paper "A Short ! History of the Operational PBL - Parameterization at ECMWF" by ! J.F.Louis, M. Tiedtke and J.F. Geleyn in "Workshop on Planetary ! Boundary Layer Parameterization", a publication by European Centre ! for Medium Range Weather Forecasts, 25-27 Nov. 1981. ! ! MODIFICATION HISTORY: ! ! 9/04/1994 (K. Brewster, V. Wong and X. Song) ! Facelift. ! 2/27/95 (V. Wong and X. Song) ! ! 02/07/96 (V.Wong and X.Song) ! Set an upper limiter, z1limit, for depth of the surface layer z1. ! ! 05/01/97 (V. Wong and X. Tan) ! Changed the computation of temperature scale ! ! 05/29/97 (V. Wong and X. Tan) ! Modified the formulation considering the height of the surface ! layer z1 may equal zero. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! iend i-index where evaluation ends. ! jend j-index where evaluation ends. ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! roufns Surface roughness ! ! ptsfc Potential temperature at the ground level (K) ! pt1 Potential temperature at the 1st scalar point above ! ground level, (K) ! ! c_ptneu Temperature scale (K) at neutral state, defined by ! surface heat flux / friction velocity ! ! OUTPUT: ! ! c_pt Temperature scale (K), defined by ! surface heat flux / friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: iend ! i-index where evaluation ends INTEGER :: jend ! j-index where evaluation ends REAL :: zp (nx,ny,nz) ! The physical height coordinate ! defined at w-point of staggered grid. REAL :: roufns(nx,ny) ! Surface roughness length REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: ptsfc(nx,ny) ! Potential temperature at the ! ground level (K) REAL :: pt1 (nx,ny) ! Potential temperature at the ! 1st scalar ! point above ground level, (K) REAL :: c_ptneu(nx,ny) ! Normalized temperature scale (K) ! at neutral state REAL :: c_pt (nx,ny) ! Temperature scale (K) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: z1 ! The height of 1st scalar point above ! ground level (m) REAL :: dz0 ! z1-roufns, where roufns is defined as ! surface roughness length REAL :: bulkri ! Bulk Richardson number REAL :: stabp ! Monin-Obukhov STABility Parameter ! (zeta) REAL :: y1,y0,psih ! Intermediate parameters needed REAL :: z1drou,qb3pb2 REAL :: c7,c8 REAL :: sb,qb,pb,thetab,tb ! During computations REAL :: a,b,c,d REAL :: tempan,sqrtqb REAL :: zt ! Thermal roughness length REAL :: dzt,ztdrou REAL :: z1droup,ztdroup REAL :: dz00 INTEGER :: i1 ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Following Byun (1990). ! !----------------------------------------------------------------------- ! PRINT *,'starting PTCP' DO j=1,jend DO i=1,iend dz00 = 0.5*(zp(i,j,3)-zp(i,j,2)) dz00 = MIN(dz00,z1limit) dz00 = dz00 - roufns(i,j) bulkri = (g/ptsfc(i,j))*(pt1(i,j)-ptsfc(i,j))*dz00/ & (wspd(i,j)*wspd(i,j)) IF (i1 == 1) THEN z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) ELSE z1=2.0 END IF z1 = MIN(z1,z1limit) zt = ztz0*roufns(i,j) dzt = z1-zt ztdrou = z1/zt ztdroup = (z1+zt)/zt dz0 = z1-roufns(i,j) z1drou = z1/roufns(i,j) z1droup = (z1+roufns(i,j))/roufns(i,j) IF (bulkri <= 0.0) THEN ! !----------------------------------------------------------------------- ! ! Unstable case: See equations (28)-(34) in Byun (1990). ! !----------------------------------------------------------------------- ! bulkri = MAX (bulkri,-10.0) sb =bulkri/prantl0l qb=oned9*(c1l+c2l*sb*sb) pb=oned54*(c3l+c4l*sb*sb) qb3pb2=qb**3-pb*pb c7 = (z1*dzt*LOG(z1droup)*LOG(z1droup))/(dz0*dz0*LOG(ztdroup)) IF( qb3pb2 >= 0.0 ) THEN sqrtqb = SQRT(qb) tempan = MAX( -1.0, MIN( 1.0, pb/(sqrtqb**3) ) ) thetab=ACOS(tempan) stabp =c7*(-2.0*SQRT(qb)*COS(thetab/3.0)+c5l) ELSE tb =(SQRT(-qb3pb2)+ABS(pb))**oned3 stabp =c7*(-(tb+qb/tb)+c5l) END IF ! !----------------------------------------------------------------------- ! ! According to equation (15) in Byun (1990). ! !----------------------------------------------------------------------- ! c8=gammaml*stabp y1=SQRT(1.0 - c8) y0=SQRT(1.0 - c8/ztdrou) psih=2.0*LOG((y1+1.0)/(y0+1.0)) ! !----------------------------------------------------------------------- ! ! Compute c_pt via equation (11) in Byun (1981). ! !----------------------------------------------------------------------- ! c_pt(i,j)=kv / (prantl0l*(LOG(ztdroup)-psih)) ELSE ! !----------------------------------------------------------------------- ! ! Stable case: See Louis et al (1981). ! !----------------------------------------------------------------------- ! a=kv/LOG(ztdroup) b=5.0 d=5.0 c=SQRT(1.0+d*bulkri) c_pt(i,j) = SQRT(1.0+2.0*b*bulkri/c) c_pt(i,j) = a*c_pt(i,j)/(prantl0l*(1.0+3.0*b*bulkri*c)) END IF END DO END DO RETURN END SUBROUTINE cptca ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CPTCWTR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cptcwtra(nx,ny,nz,iend,jend,zp,soiltyp,wspd, & 2 ptsfc,pt1,c_ptwtrneu,c_ptwtr,i1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Compute c_ptwtr (the product of ustar and ptstar) at sea case. ! Note: a temperature scale defined as surface heat flux divided ! by the friction velocity. ! ! The quantity c_ptwtr is used by the subroutine SFCFLX to obtain ! surface fluxes for both the unstable and stable cases. ! !----------------------------------------------------------------------- ! ! AUTHORS: V. Wong and X. Song ! 8/04/1994 ! ! MODIFICATION HISTORY: ! ! 2/27/95 (V.W. and X.S.) ! ! 1/12/96 (V.W. and X.S.) ! Changed the calculation related to zo over the sea. ! Added kvwtr to denote the Von Karman constant over the sea; ! Set a lower limiter for zo, zolimit, and an upper limiter for z1, z1limit. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! iend i-index where evaluation ends. ! jend j-index where evaluation ends. ! ! zp The physical height coordinate defined at w-point of ! staggered grid. ! wspd Surface wind speed (m/s), defined as ! sqrt(usuf*usuf + vsuf*vsuf + wsuf*wsuf) ! ptsfc Potential temperature at the ground level (K) ! pt1 Potential temperature at the 1st scalar point above ! ground level, (K) ! ! ! OUTPUT: ! ! c_ptwtr The product of ustar and ptstar. ptstar is temperature ! scale (K), defined by surface heat flux / friction velocity ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number grid points in 3 directions INTEGER :: iend ! i-index where evaluation ends INTEGER :: jend ! j-index where evaluation ends REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of staggered grid. INTEGER :: soiltyp(nx,ny) ! Soil type at each point. REAL :: wspd (nx,ny) ! Surface wind speed (m/s) REAL :: ptsfc(nx,ny) ! Potential temperature at the ground level ! (K) REAL :: pt1 (nx,ny) ! Potential temperature at the 1st scalar ! point above ground level, (K) REAL :: c_ptwtrneu(nx,ny) ! Product of ustar and ptstar REAL :: c_ptwtr(nx,ny) ! Product of ustar and ptstar ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j REAL :: z1 ! The height of 1st scalar point above ! ground level (m) REAL :: zo ! Defined as surface momentum roughness ! length REAL :: zt ! Defined as surface heat transfer ! roughness length REAL :: dzo ! z1-zo REAL :: dzt ! z1-zt REAL :: z1dzo ! z1/zo REAL :: z1dzt ! z1/zt REAL :: xcdn ! Cdn (sea) REAL :: xcdh ! Hot-wired value of Cdh (sea) REAL :: bulkri ! Bulk Richardson number REAL :: stabp ! Monin-Obukhov STABility Parameter ! (zeta) REAL :: y1,y0,psih ! Intermediate parameters needed REAL :: qb3pb2 REAL :: c7,c8 REAL :: sb,qb,pb,thetab,tb ! during computations REAL :: a,b,c,d REAL :: tempan,sqrtqb REAL :: z10,zo0,zt0,dzo0,dzt0 REAL :: i1 ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'sfcphycst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! PRINT *,'starting PTCPWTR' xcdh = 1.1E-3 DO j=1,jend DO i=1,iend IF ( soiltyp(i,j) == 13) THEN ! IF (soiltyp(i,j,1).eq.13.and.stypfrct(i,j,1).ge.0.5) THEN ! calculate bulk Ri with the lowest level above the ground xcdn = (0.4+0.07*wspd(i,j)) * 1.e-3 z10 = 0.5*(zp(i,j,3)-zp(i,j,2)) z10 = MIN(z10,z1limit) ! ! calculate zo and zt ! zo0 =0.032*xcdn*wspd(i,j)*wspd(i,j)/9.8 zo0 = MAX(zo0,zolimit) zt0 = z10 * EXP( -kv*SQRT(xcdn)/(prantl0w*xcdh) ) dzo0 = z10-zo0 dzt0 = z10-zt0 bulkri =(g/ptsfc(i,j))*(pt1(i,j)-ptsfc(i,j))*dzo0*dzo0/ & (dzt0*wspd(i,j)*wspd(i,j)) ! fined Ri bulk calcuation xcdn = (0.4+0.07*wspd(i,j)) * 1.e-3 IF (i1 == 1) THEN z1 = 0.5*(zp(i,j,3)-zp(i,j,2)) ELSE z1=2.0 END IF z1 = MIN(z1,z1limit) ! ! calculate zo and zt ! zo =0.032*xcdn*wspd(i,j)*wspd(i,j)/9.8 zo = MAX(zo,zolimit) zt = z1 * EXP( -kv*SQRT(xcdn)/(prantl0w*xcdh) ) dzo = z1-zo z1dzo = z1/zo dzt = z1-zt z1dzt = z1/zt IF (bulkri <= 0.0) THEN ! !----------------------------------------------------------------------- ! ! Unstable case: A modified formulation, which is similar to ! equations (28)-(34) in Byun (1990). ! !----------------------------------------------------------------------- ! bulkri = MAX (bulkri,-10.0) sb =bulkri/prantl0w qb=oned9*(c1w+c2w*sb*sb) pb=oned54*(c3w+c4w*sb*sb) qb3pb2=qb**3-pb*pb c7 = (z1*dzt/(dzo*dzo))*(ALOG(z1dzo)*ALOG(z1dzo)/ALOG(z1dzt)) IF( qb3pb2 >= 0.0 ) THEN sqrtqb = SQRT(qb) tempan = MAX( -1.0, MIN( 1.0, pb/(sqrtqb**3) ) ) thetab=ACOS(tempan) stabp =c7*(-2.0*SQRT(qb)*COS(thetab/3.0)+c5w) ELSE tb =(SQRT(-qb3pb2)+ABS(pb))**oned3 stabp =c7*(-(tb+qb/tb)+c5w) END IF ! !----------------------------------------------------------------------- ! ! According to a modified equation, which is similar to equation (14) ! in Byun (1990). ! !----------------------------------------------------------------------- ! c8=gammamw*stabp y1=SQRT(1.0 - c8) y0=SQRT(1.0 - c8/z1dzt) psih=2.0*ALOG((y1+1.0)/(y0+1.0)) ! !----------------------------------------------------------------------- ! ! Compute ptstar via equation (11) in Byun (1981). ! !----------------------------------------------------------------------- ! c_ptwtr(i,j)=kv / (prantl0w*(ALOG(z1dzt)-psih)) ELSE ! !----------------------------------------------------------------------- ! ! Stable case: With the modified formulation in Louis et al (1981). ! !----------------------------------------------------------------------- ! a=kv*kv/(prantl0w*LOG(z1dzo)*LOG(z1dzt)) b=5.0 d=5.0 c=SQRT(1.0+d*bulkri) c_ptwtr(i,j) = SQRT(1.0+2.0*b*bulkri/c) c_ptwtr(i,j) = a*c_ptwtr(i,j)/(prantl0l*(1.0+3.0*b*bulkri*c)) END IF END IF END DO END DO RETURN END SUBROUTINE cptcwtra SUBROUTINE psfsl(nx,ny,t2,qv2,p2,z2,z1,psf,psl) 1 IMPLICIT NONE INTEGER :: nx,ny REAL :: t2(nx,ny),qv2(nx,ny),p2(nx,ny) REAL :: z2(nx,ny),z1(nx,ny) REAL :: psf(nx,ny),psl(nx,ny) !output REAL :: gammam,rd,rv,tsh,zsh,rog,fvirt REAL :: tvsf,tvsl,tv2 INTEGER :: i,j gammam=-6.5E-3 rd=2.8705E2 rv=4.615E2 rog=rd/9.8 fvirt=rv/rd-1.0 zsh=75.0 tsh=290.66 DO j=1,ny-1 DO i=1,nx-1 tv2=t2(i,j)*(1.+fvirt*qv2(i,j)) tvsf=tv2-gammam*(z2(i,j)-z1(i,j)) psf(i,j)=p2(i,j)*EXP(2.*(z2(i,j)-z1(i,j))/(rog*(tvsf+tv2))) IF (z1(i,j) > zsh) THEN tvsl=tvsf-gammam*z1(i,j) IF (tvsl > tsh) THEN IF (tvsf > tsh) THEN tvsl=tsh-0.005*(tvsf-tsh)**2 ELSE tvsl=tsh END IF END IF ELSE tvsl=tvsf END IF psl(i,j)=psf(i,j)*EXP(2.0*z1(i,j)/(rog*(tvsf+tvsl))) psf(i,j)=-ALOG(psf(i,j)) END DO END DO RETURN END SUBROUTINE psfsl ! SUBROUTINE pintp(nx,ny,nz,s3d,nlgp3d,s2d,INDEX,nlgp01, & 15 t3d,qv3d,z2,zsf,nlgpsf) IMPLICIT NONE INTEGER :: nx,ny,nz INTEGER :: i,j,k REAL :: s3d(nx,ny,nz),nlgp3d(nx,ny,nz),s2d(nx,ny) INTEGER :: INDEX REAL :: nlgp01 REAL :: t3d(nx,ny,nz),qv3d(nx,ny,nz) REAL :: z2(nx,ny),zsf(nx,ny) REAL :: nlgpsf(nx,ny) REAL :: gammam,rd,rv,tsh,zsh,rog,fvirt,gammas REAL :: tvsf,tvsl,tv2 REAL :: tvkm,part gammam=-6.5E-3 rd=2.8705E2 rv=4.615E2 rog=rd/9.8 fvirt=rv/rd-1.0 zsh=75.0 tsh=290.66 ! print *,'starting PINTP' DO j=1,ny-1 DO i=1,nx-1 IF(nlgp01 <= nlgp3d(i,j,2)) GO TO 11 IF(nlgp01 >= nlgp3d(i,j,nz-1)) GO TO 12 DO k=2,nz-2 IF(nlgp01 >= nlgp3d(i,j,k).AND.nlgp01 < nlgp3d(i,j,k+1)) GO TO 15 END DO 11 k=2 GO TO 15 12 k=nz-2 GO TO 15 15 s2d(i,j)=s3d(i,j,k)+(s3d(i,j,k+1)-s3d(i,j,k))* & (nlgp01-nlgp3d(i,j,k))/(nlgp3d(i,j,k+1)-nlgp3d(i,j,k)) ! if (i.eq.1.and.j.eq.1) then ! print *,i,j,k,nlgp01 ! print *,s2d(i,j),s3d(i,j,k),s3d(i,j,k+1),s3d(i,j,k), ! : nlgp01,nlgp3d(i,j,k),nlgp3d(i,j,k+1),nlgp3d(i,j,k) ! stop ! endif IF (nlgp01 <= nlgpsf(i,j)) THEN IF (INDEX == 1.OR.INDEX == 2) THEN s2d(i,j)=s3d(i,j,2) ELSE IF (INDEX == 3) THEN tvsf=t3d(i,j,2)*(1.+fvirt*qv3d(i,j,2))-gammam*(z2(i,j)-zsf(i,j)) IF (zsf(i,j) > zsh) THEN tvsl=tvsf-gammam*zsf(i,j) IF (tvsl > tsh) THEN IF (tvsf > tsh) THEN tvsl=tsh-0.005*(tvsf-tsh)**2 ELSE tvsl=tsh END IF END IF gammas=(tvsf-tvsl)/zsf(i,j) ELSE gammas=0.0 END IF part=rog*(nlgp01-nlgpsf(i,j)) s2d(i,j)=zsf(i,j)+tvsf*part/(1-0.5*gammas*part) END IF ELSE IF (nlgp01 > nlgpsf(i,j).AND.nlgp01 <= nlgp3d(i,j,2)) THEN IF (INDEX == 1) THEN s2d(i,j)=s3d(i,j,2) ELSE IF (INDEX == 2) THEN s2d(i,j)=s2d(i,j) ELSE IF (INDEX == 3) THEN s2d(i,j)=s3d(i,j,2)+(zsf(i,j)-s3d(i,j,2))* & (nlgp01-nlgp3d(i,j,2))/(nlgpsf(i,j)-nlgp3d(i,j,2)) END IF ELSE IF (nlgp01 > nlgp3d(i,j,nz-1)) THEN IF (INDEX == 1) THEN s2d(i,j)=s3d(i,j,nz-1) ELSE IF (INDEX == 2) THEN s2d(i,j)=s3d(i,j,nz-1) ELSE IF (INDEX == 3) THEN tvkm=t3d(i,j,nz-1)*(1.0+fvirt*qv3d(i,j,nz-1)) s2d(i,j)=s3d(i,j,nz-1)+tvkm*rog*(nlgp01-nlgp3d(i,j,nz-1)) END IF END IF END DO END DO RETURN END SUBROUTINE pintp SUBROUTINE cllmc(nx,ny,nz,u,v,qv,algpsf,zp,rhobar,algpzs,llmc, & 1 x,y, tem1,tem2) IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: u(nx,ny,nz),v(nx,ny,nz),qv(nx,ny,nz) REAL :: algpzs(nx,ny,nz),zp(nx,ny,nz),rhobar(nx,ny,nz) REAL :: algpsf(nx,ny) REAL :: llmc(nx-1,ny-1) REAL :: tem1(nx,ny),tem2(nx,ny) REAL :: x(nx,ny),y(nx,ny) REAL :: ubar,vbar,qbar,mbar,dz REAL :: algpst,pst,psf INTEGER :: i,j,k,kt PRINT *,'starting CLLMC' DO j=1,ny-1 DO i=1,nx-1 llmc(i,j)=0 END DO END DO DO j=1,ny-1 DO i=1,nx-1 psf=EXP(-algpsf(i,j)) pst=psf-5000.0 algpst=-ALOG(pst) ubar=0.0 vbar=0.0 qbar=0.0 mbar=0.0 DO k=2,nz-1 IF (algpst < algpzs(i,j,k+1)) THEN kt=k GO TO 300 END IF END DO PRINT *,'error, check CLLMC' STOP 300 DO k=2,kt dz=zp(i,j,k+1)-zp(i,j,k) IF (k == kt) THEN dz=dz*(algpst-0.5*(algpzs(i,j,k)+algpzs(i,j,k-1))) & /(0.5*(algpzs(i,j,k+1)-algpzs(i,j,k-1))) END IF ubar=ubar+u(i,j,k)*rhobar(i,j,k)*dz vbar=vbar+v(i,j,k)*rhobar(i,j,k)*dz qbar=qbar+qv(i,j,k)*rhobar(i,j,k)*dz mbar=mbar+rhobar(i,j,k)*dz END DO ubar=ubar/mbar vbar=vbar/mbar qbar=qbar/mbar tem1(i,j)=ubar*qbar tem2(i,j)=vbar*qbar END DO END DO DO j=2,ny-2 DO i=2,nx-2 llmc(i,j)=-1000.0*((tem1(i+1,j)-tem1(i-1,j))/(x(i+1,j)-x(i-1,j)) & +(tem2(i,j+1)-tem2(i,j-1))/(y(i,j+1)-y(i,j-1))) END DO END DO PRINT *,'finishing CLLMC' RETURN END SUBROUTINE cllmc SUBROUTINE cape_ncep(nx,ny,nz,tk1,qv1,p1,cape,cins,li, & 1,1 tk,qv,p,pint,plcl,peql,p1d,t1d,qv1d,lmh, & item1,item2,item3,item4,item5,item6,item7, & ! work arrays rtem1,rtem2,rtem3,rtem4,rtem5,rtem6,rtem7) ! work arrays ! IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: tk1(nx,ny,nz),qv1(nx,ny,nz),p1(nx,ny,nz) REAL :: cape(nx,ny),cins(nx,ny),li(nx,ny) REAL :: tk(nx,ny,nz),qv(nx,ny,nz),p(nx,ny,nz),pint(nx,ny,nz) REAL :: plcl(nx,ny),peql(nx,ny) REAL :: p1d(nx,ny),t1d(nx,ny),qv1d(nx,ny) INTEGER :: lmh(nx,ny) INTEGER :: i,j,l,lk,lmhij,itype INTEGER :: item1(nx,ny),item2(nx,ny),item3(nx,ny),item4(nx,ny), & item5(nx,ny),item6(nx,ny),item7(nx,ny) REAL :: rtem1(nx,ny),rtem2(nx,ny),rtem3(nx,ny),rtem4(nx,ny), & rtem5(nx,ny),rtem6(nx,ny),rtem7(nx,ny) !---------------------------------------------------------------------- !*********************************************************************** !--------------PREPARATIONS--------------------------------------------- DO j=1,ny DO i=1,nx lmh(i,j)=nz-2 lmhij=nz-2 pint(i,j,1)=2500. DO l=1,lmhij lk=lmhij-l+2 p(i,j,l)=p1(i,j,lk) tk(i,j,l)=tk1(i,j,lk) qv(i,j,l)=qv1(i,j,lk) pint(i,j,l+1)=(p1(i,j,lk)+p1(i,j,lk-1))*0.5 END DO END DO END DO ! itype=1 CALL calcape(itype,p1d,t1d,qv1d, & tk,qv,p,pint,lmh,nx,ny,nz-2,nz-1, & cape,cins,li,plcl,peql, & item1,item2,item3,item4,item5,item6,item7, & ! work arrays rtem1,rtem2,rtem3,rtem4,rtem5,rtem6,rtem7) ! work arrays ! ! WRITE(6,*) ' CAPE= ',CAPE(I,J) ! WRITE(6,*) ' CIN= ',CINS(I,J) ! WRITE(6,*) ' LCL= ',PLCL(I,J) ! WRITE(6,*) ' EQ LVL= ',PEQL(I,J) RETURN END SUBROUTINE cape_ncep SUBROUTINE calcape(itype,p1d,t1d,q1d, & 1,4 t,q,p,pint,lmh,im,jm,lm,lp1, & cape,cins,li,plcl,peql, & ieql,iptb,ithtb,ilres,jlres,ihres,jhres, & ! work arrays lcl,tpar,pp,qq,psp,thesp,ape) ! work arrays !$$$ SUBPROGRAM DOCUMENTATION BLOCK ! . . . ! SUBPROGRAM: CALCAPE COMPUTES CAPE AND CINS ! PRGRMMR: TREADON ORG: W/NMC2 DATE: 93-02-10 ! ! ABSTRACT: ! ! THIS ROUTINE COMPUTES CAPE AND CINS GIVEN TEMPERATURE, ! PRESSURE, AND SPECIFIC HUMIDTY. IN "STORM AND CLOUD ! DYNAMICS" (1989, ACADEMIC PRESS) COTTON AND ANTHES DEFINE ! CAPE (EQUATION 9.16, P501) AS ! ! EL ! CAPE = SUM G * LN(THETAP/THETAA) DZ ! LCL ! ! WHERE, ! EL = EQUILIBRIUM LEVEL, ! LCL = LIFTING CONDENSTATION LEVEL, ! G = GRAVITATIONAL ACCELERATION, ! THETAP = LIFTED PARCEL POTENTIAL TEMPERATURE, ! THETAA = AMBIENT POTENTIAL TEMPERATURE. ! ! NOTE THAT THE INTEGRAND LN(THETAP/THETAA) APPROXIMATELY ! EQUALS (THETAP-THETAA)/THETAA. THIS RATIO IS OFTEN USED ! IN THE DEFINITION OF CAPE/CINS. ! ! TWO TYPES OF CAPE/CINS CAN BE COMPUTED BY THIS ROUTINE. THE ! SUMMATION PROCESS IS THE SAME FOR BOTH CASES. WHAT DIFFERS ! IS THE DEFINITION OF THE PARCEL TO LIFT. FOR ITYPE=1 THE ! PARCEL WITH THE WARMEST THETA-E IN A DPBND PASCAL LAYER ABOVE ! THE MODEL SURFACE IS LIFTED. THE ARRAYS P1D, T1D, AND Q1D ! ARE NOT USED. FOR ITYPE=2 THE ARRAYS P1D, T1D, AND Q1D ! DEFINE THE PARCEL TO LIFT IN EACH COLUMN. BOTH TYPES OF ! CAPE/CINS MAY BE COMPUTED IN A SINGLE EXECUTION OF THE POST ! PROCESSOR. ! ! THIS ALGORITHM PROCEEDS AS FOLLOWS. ! FOR EACH COLUMN, ! (1) INITIALIZE RUNNING CAPE AND CINS SUM TO 0.0 ! (2) COMPUTE TEMPERATURE AND PRESSURE AT THE LCL USING ! LOOK UP TABLE (PTBL). USE EITHER PARCEL THAT GIVES ! MAX THETAE IN LOWEST DPBND ABOVE GROUND (ITYPE=1) ! OR GIVEN PARCEL FROM T1D,Q1D,...(ITYPE=2). ! (3) COMPUTE THE TEMP OF A PARCEL LIFTED FROM THE LCL. ! WE KNOW THAT THE PARCEL'S ! EQUIVALENT POTENTIAL TEMPERATURE (THESP) REMAINS ! CONSTANT THROUGH THIS PROCESS. WE CAN ! COMPUTE TPAR USING THIS KNOWLEDGE USING LOOK ! UP TABLE (SUBROUTINE TTBLEX). ! (4) FIND THE EQUILIBRIUM LEVEL. THIS IS DEFINED AS THE ! HIGHEST POSITIVELY BUOYANT LAYER. ! (IF THERE IS NO POSITIVELY BUOYANT LAYER, CAPE/CINS ! WILL BE ZERO) ! (5) COMPUTE CAPE/CINS. ! (A) COMPUTE THETAP. WE KNOW TPAR AND P. ! (B) COMPUTE THETAA. WE KNOW T AND P. ! (6) ADD G*(THETAP-THETAA)*DZ TO THE RUNNING CAPE OR CINS SUM. ! (A) IF THETAP > THETAA, ADD TO THE CAPE SUM. ! (B) IF THETAP < THETAA, ADD TO THE CINS SUM. ! (7) ARE WE AT EQUILIBRIUM LEVEL? ! (A) IF YES, STOP THE SUMMATION. ! (B) IF NO, CONTIUNUE THE SUMMATION. ! (8) ENFORCE LIMITS ON CAPE AND CINS (I.E. NO NEGATIVE CAPE) ! ! PROGRAM HISTORY LOG: ! 93-02-10 RUSS TREADON ! 93-06-19 RUSS TREADON - GENERALIZED ROUTINE TO ALLOW FOR ! TYPE 2 CAPE/CINS CALCULATIONS. ! 94-09-23 MIKE BALDWIN - MODIFIED TO USE LOOK UP TABLES ! INSTEAD OF COMPLICATED EQUATIONS. ! 94-10-13 MIKE BALDWIN - MODIFIED TO CONTINUE CAPE/CINS CALC ! UP TO AT HIGHEST BUOYANT LAYER. ! 98-03-25 MIKE BALDWIN - STAND ALONE VERSION FOR SAMEX ! ! USAGE: CALL CALCAPE(ITYPE,P1D,T1D,Q1D, ! & T,Q,P,PINT,LMH,IM,JM,LM, ! & CAPE,CINS) ! INPUT ARGUMENT LIST: ! ITYPE,P1D,T1D,Q1D,T,Q,P,PINT,LMH,IM,JM,LM ! ! CONTROL VARIABLES: ! ITYPE - INTEGER FLAG SPECIFYING HOW PARCEL TO LIFT IS ! IDENTIFIED. SEE COMMENTS ABOVE. ! IM - 1ST HORIZONTAL DIMENSION OF ARRAY ! JM - 2ND HORIZONTAL DIMENSION OF ARRAY ! LM - VERTICAL DIMENSION OF ARRAY ! LMH - ARRAY THAT CONTAINS THE NUMBER OF ABOVE GROUND LEVELS ! AT EACH GRID POINT DIMENSIONED (IM,JM) ! ! 3-D ARRAYS OF ATMOSPHERIC CONDITIONS: ! MID-LAYER VARIABLES: ! T - TEMP (K) DIMENSIONED TO (IM,JM,LM) ! Q - SPEC HUM (kg/kg) DIMENSIONED TO (IM,JM,LM) ! P - PRESSURE (Pa) DIMENSIONED TO (IM,JM,LM) ! ! LAYER-INTERFACE VARIABLES: ! PINT - PRESSURE (Pa) DIMENSIONED TO (IM,JM,LM+1) ! ! 2-D ARRAYS IF SENDING IN A SPECIFIC PARCEL TO LIFT (ITYPE=2): ! P1D(IM,JM) - ARRAY OF PRESSURE (Pa) OF PARCELS TO LIFT. ! T1D(IM,JM) - ARRAY OF TEMPERATURE (K) OF PARCELS TO LIFT. ! Q1D(IM,JM) - ARRAY OF SPECIFIC HUMIDITY (kg/kg) OF PARCELS TO LIFT. ! ! OUTPUT ARGUMENT LIST: ! CAPE(IM,JM) - CONVECTIVE AVAILABLE POTENTIAL ENERGY (J/KG) ! CINS(IM,JM) - CONVECTIVE INHIBITION (J/KG) ! PLCL(IM,JM) - PRESSURE OF LCL (Pa) ! PEQL(IM,JM) - PRESSURE OF EQ LEVEL (Pa) ! ! OUTPUT FILES: ! STDOUT - RUN TIME STANDARD OUT. ! ! SUBPROGRAMS CALLED: ! UTILITIES: ! TTBLEQ - LOOKUP TABLE ROUTINE TO GET T FROM THETAE AND P ! TTBLE1 - LOOKUP TABLE ROUTINE TO GET T FROM THETAE AND P ! TTBLEX - LOOKUP TABLE ROUTINE TO GET T FROM THETAE AND P ! ! ! ATTRIBUTES: ! LANGUAGE: FORTRAN ! MACHINE : CRAY Y-MP !$$$ ! ! ! ! INCLUDE/SET PARAMETERS. CONSTANTS ARE FROM BOLTON (MWR, 1980). !---------------------------------------------------------------------- ! PARAMETER (IM=IMM,JM=JMM,LM=LMM,LP1=LM+1) PARAMETER & (h10e5=100000.e0 & , epsq=2.e-12 & , g=9.8E0,cp=1004.6E0,capa=0.28589641E0,rog=287.04/g) !---------------------------------------------------------------------- PARAMETER & (itb=076,jtb=134,itbq=152,jtbq=440) PARAMETER (dpbnd=70.e2, & elivw=2.72E6,elocp=elivw/cp) ! ! DECLARE VARIABLES. ! INTEGER :: ieql(im,jm) INTEGER :: lcl(im,jm) ! REAL :: p1d(im,jm),t1d(im,jm),q1d(im,jm) REAL :: cape(im,jm),cins(im,jm),li(im,jm) REAL :: plcl(im,jm),peql(im,jm) REAL :: tpar(im,jm,lm) DIMENSION & p (im,jm,lm),pint (im,jm,lm+1) & ,t(im,jm,lm),q(im,jm,lm) & ,lmh (im,jm) DIMENSION & qs0 (jtb),sqs (jtb),the0 (itb),sthe (itb) & , the0q(itbq),stheq(itbq) & ,ptbl (itb,jtb),ttbl (jtb,itb),ttblq(jtbq,itbq) ! DIMENSION & iptb (im,jm),ithtb (im,jm) & ,pp (im,jm) & ,qq (im,jm) & ,psp (im,jm),thesp (im,jm) & ,ilres (im*jm),jlres (im*jm),ihres (im*jm),jhres (im*jm) & ,ape (im,jm,lm) ! ! DATA itabl/0/,thl/210./,plq/70000./,ptt/2500./ ! SAVE ptbl,ttbl,rdq,rdth,rdp,rdthe,pl,thl,qs0,sqs,sthe,the0, & ttblq,rdpq,rdtheq,plq,stheq,the0q !----------------------------------------------------------------------- ! ! SET UP LOOKUP TABLE ! IF (itabl == 0) THEN CALL table1(ptbl,ttbl,ptt, & rdq,rdth,rdp,rdthe,pl,thl,qs0,sqs,sthe,the0) CALL tableq(ttblq,rdpq,rdtheq,plq,thl,stheq,the0q) itabl=1 END IF imjm=im*jm !----------------------------------------------------------------------- ! ! !************************************************************** ! START CALCAPE HERE. ! ! ! COMPUTE CAPE/CINS ! ! WHICH IS: THE SUM FROM THE LCL TO THE EQ LEVEL OF ! G * (LN(THETAP) - LN(THETAA)) * DZ ! ! (POSITIVE AREA FOR CAPE, NEGATIVE FOR CINS) ! ! WHERE: ! THETAP IS THE PARCEL THETA ! THETAA IS THE AMBIENT THETA ! DZ IS THE THICKNESS OF THE LAYER ! ! USING LCL AS LEVEL DIRECTLY BELOW SATURATION POINT ! AND EQ LEVEL IS THE HIGHEST POSITIVELY BUOYANT LEVEL. ! ! IEQL = EQ LEVEL ! ! INITIALIZE CAPE AND CINS ARRAYS ! DO j = 1,jm DO i = 1,im cape(i,j) = 0.0 cins(i,j) = 0.0 thesp(i,j)= 0.0 ieql(i,j) = lm+1 END DO END DO DO l=1,lm DO j = 1,jm DO i = 1,im tpar(i,j,l)= 0.0 IF (l <= lmh(i,j)) THEN apests=p(i,j,l) ape(i,j,l)=(h10e5/apests)**capa IF( END IF END DO END DO END DO ! ! NOTE THAT FOR TYPE 1 CAPE/CINS ARRAYS P1D, T1D, Q1D ! ARE DUMMY ARRAYS. ! !-------FOR ITYPE=1----------------------------------------------------- !---------FIND MAXIMUM THETA E LAYER IN LOWEST DPBND ABOVE GROUND------- !-------FOR ITYPE=2----------------------------------------------------- !---------FIND THETA E LAYER OF GIVEN T1D, Q1D, P1D--------------------- !--------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES------------------- DO kb=1,lm IF (itype == 1.OR.kb == 1) THEN DO j=1,jm DO i=1,im lmhk =lmh(i,j) psfck =p(i,j,lmhk) pkl = p(i,j,kb) IF (itype == 2.OR.(pkl >= psfck-dpbnd.AND.pkl <= psfck)) THEN IF (itype == 1) THEN tbtk =t(i,j,kb) qbtk =q(i,j,kb) apebtk =ape(i,j,kb) !DHOU added the following statement to calculate the temperature of ! the parcil if it diabatically goes to 500hpa. This is stored in li. li(i,j)=tbtk*(50000.0/p(i,j,kb))**capa ELSE pkl =p1d(i,j) tbtk =t1d(i,j) qbtk =q1d(i,j) apebtk =(h10e5/pkl)**capa END IF !--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX-------------- tthbtk =tbtk*apebtk tthk =(tthbtk-thl)*rdth qq (i,j)=tthk-AINT(tthk) ittbk =INT(tthk)+1 !--------------KEEPING INDICES WITHIN THE TABLE------------------------- IF(ittbk < 1) THEN ittbk =1 qq (i,j)=0.0 END IF IF(ittbk >= jtb) THEN ittbk =jtb-1 qq (i,j)=0.0 END IF !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY--------------- bqs00k=qs0(ittbk) sqs00k=sqs(ittbk) bqs10k=qs0(ittbk+1) sqs10k=sqs(ittbk+1) !--------------SCALING SPEC. HUMIDITY & TABLE INDEX--------------------- bqk =(bqs10k-bqs00k)*qq(i,j)+bqs00k sqk =(sqs10k-sqs00k)*qq(i,j)+sqs00k tqk =(qbtk-bqk)/sqk*rdq pp (i,j)=tqk-AINT(tqk) iq =INT(tqk)+1 !--------------KEEPING INDICES WITHIN THE TABLE------------------------- IF(iq < 1) THEN iq =1 pp (i,j)=0.0 END IF IF(iq >= itb) THEN iq =itb-1 pp (i,j)=0.0 END IF !--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.------- it=ittbk p00k=ptbl(iq ,it ) p10k=ptbl(iq+1,it ) p01k=ptbl(iq ,it+1) p11k=ptbl(iq+1,it+1) !--------------SATURATION POINT VARIABLES AT THE BOTTOM----------------- tpspk=p00k+(p10k-p00k)*pp(i,j)+(p01k-p00k)*qq(i,j) & +(p00k-p10k-p01k+p11k)*pp(i,j)*qq(i,j) apespk=(h10e5/tpspk)**capa tthesk=tthbtk*EXP(elocp*qbtk*apespk/tthbtk) !--------------CHECK FOR MAXIMUM THETA E-------------------------------- IF(tthesk > thesp(i,j)) THEN psp (i,j)=tpspk thesp(i,j)=tthesk END IF END IF END DO END DO END IF END DO !-----CHOOSE LAYER DIRECTLY BELOW PSP AS LCL AND------------------------ !-----ENSURE THAT THE LCL IS ABOVE GROUND.------------------------------ !-------(IN SOME RARE CASES FOR ITYPE=2, IT IS NOT)--------------------- DO l=1,lm DO j=1,jm DO i=1,im IF (l < lmh(i,j)) THEN pkl = p(i,j,l) IF (pkl < psp(i,j)) THEN lcl(i,j)=l+1 plcl(i,j)=p(i,j,l+1) END IF END IF END DO END DO END DO !----------------------------------------------------------------------- !---------FIND TEMP OF PARCEL LIFTED ALONG MOIST ADIABAT (TPAR)--------- !----------------------------------------------------------------------- DO ivi=1,lm l=lp1-ivi !--------------SCALING PRESSURE & TT TABLE INDEX------------------------ knuml=0 knumh=0 DO j=1,jm DO i=1,im pkl = p(i,j,l) IF(l <= lcl(i,j)) THEN IF(pkl < plq)THEN knuml=knuml+1 ilres(knuml)=i jlres(knuml)=j ELSE knumh=knumh+1 ihres(knumh)=i jhres(knumh)=j END IF END IF END DO END DO !*** !*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE<PLQ !** IF(knuml > 0)THEN CALL ttblex(tpar(1,1,l),ttbl,im,jm,imjm,itb,jtb & , knuml,ilres,jlres & , p(1,1,l),pl,qq,pp,rdp,the0,sthe & , rdthe,thesp,iptb,ithtb) END IF !*** !*** COMPUTE PARCEL TEMPERATURE ALONG MOIST ADIABAT FOR PRESSURE>PLQ !** IF(knumh > 0)THEN CALL ttblex(tpar(1,1,l),ttblq,im,jm,imjm,itbq,jtbq & , knumh,ihres,jhres & , p(1,1,l),plq,qq,pp,rdpq,the0q,stheq & , rdtheq,thesp,iptb,ithtb) END IF !------------SEARCH FOR EQ LEVEL---------------------------------------- DO n=1,knumh i=ihres(n) j=jhres(n) IF(tpar(i,j,l) > t(i,j,l)) THEN ieql(i,j)=l peql(i,j)=p(i,j,l) END IF END DO DO n=1,knuml i=ilres(n) j=jlres(n) IF(tpar(i,j,l) > t(i,j,l)) THEN ieql(i,j)=l peql(i,j)=p(i,j,l) END IF END DO !----------------------------------------------------------------------- END DO !----------------------------------------------------------------------- ! DHOU added this section to calculate LI (Lifted Index=T500-Tp500) DO j=1,jm DO i=1,im DO k=1,lm IF (p(i,j,k+1) >= 50000.0.AND.p(i,j,k) < 50000.0) THEN t500=t(i,j,k+1)-(ALOG( *(t(i,j,k+1)-t(i,j,k))/(ALOG( IF (psp(i,j) < 50000.0) THEN tp500=li(i,j) ELSE tp500=tpar(i,j,k+1)-(ALOG( *(tpar(i,j,k+1)-tpar(i,j,k))/(ALOG( END IF li(i,j)=t500-tp500 CYCLE END IF END DO END DO END DO !------------COMPUTE CAPE AND CINS-------------------------------------- DO j=1,jm DO i=1,im lclk=lcl(i,j) ieqk=ieql(i,j) DO l=ieqk,lclk presk=p(i,j,l) dp=pint(i,j,l+1)-pint(i,j,l) dzkl=t(i,j,l)*(q(i,j,l)*0.608+1.0)*rog*dp/presk thetap=tpar(i,j,l)*(h10e5/presk)**capa thetaa=t(i,j,l)*(h10e5/presk)**capa IF (thetap < thetaa) & cins(i,j)=cins(i,j)+g*(ALOG(thetap)-ALOG(thetaa))*dzkl IF (thetap > thetaa) & cape(i,j)=cape(i,j)+g*(ALOG(thetap)-ALOG(thetaa))*dzkl END DO END DO END DO ! ! ENFORCE LOWER LIMIT OF 0.0 ON CAPE AND UPPER ! LIMIT OF 0.0 ON CINS. ! DO j = 1,jm DO i = 1,im cape(i,j) = AMAX1(0.0,cape(i,j)) cins(i,j) = AMIN1(cins(i,j),0.0) END DO END DO ! ! END OF ROUTINE. ! RETURN END SUBROUTINE calcape SUBROUTINE table1(ptbl,ttbl,pt & 1,2 , rdq,rdth,rdp,rdthe,pl,thl,qs0,sqs,sthe,the0) ! ****************************************************************** ! * * ! * GENERATE VALUES FOR LOOK-UP TABLES USED IN CONVECTION * ! * * ! ****************************************************************** PARAMETER & (itb=076,jtb=134) PARAMETER & (thh=365.,ph=105000. & , pq0=379.90516,a1=610.78,a2=17.2693882,a3=273.16,a4=35.86 & , r=287.04,cp=1004.6,eliwv=2.683E6,eps=1.e-9) DIMENSION & ptbl (itb,jtb),ttbl (jtb,itb),qsold (jtb),pold (jtb) & , qs0 (jtb),sqs (jtb),qsnew (jtb) & , y2p (jtb),app (jtb),aqp (jtb),pnew (jtb) & , told (jtb),theold(jtb),the0 (itb),sthe (itb) & , y2t (jtb),thenew(jtb),apt (jtb),aqt (jtb),tnew (jtb) !--------------COARSE LOOK-UP TABLE FOR SATURATION POINT---------------- kthm=jtb kpm=itb kthm1=kthm-1 kpm1=kpm-1 ! pl=pt ! dth=(thh-thl)/REAL(kthm-1) dp =(ph -pl )/REAL(kpm -1) ! rdth=1./dth rdp=1./dp rdq=kpm-1 ! th=thl-dth !----------------------------------------------------------------------- DO kth=1,kthm th=th+dth p=pl-dp DO kp=1,kpm p=p+dp ape=(100000./p)**(r/cp) qsold(kp)=pq0/p*EXP(a2*(th-a3*ape)/(th-a4*ape)) pold(kp)=p END DO ! qs0k=qsold(1) sqsk=qsold(kpm)-qsold(1) qsold(1 )=0. qsold(kpm)=1. ! DO kp=2,kpm1 qsold(kp)=(qsold(kp)-qs0k)/sqsk ! IF((qsold(kp)-qsold(kp-1)) < eps) qsold(kp)=qsold(kp-1)+eps ! END DO ! qs0(kth)=qs0k sqs(kth)=sqsk !----------------------------------------------------------------------- qsnew(1 )=0. qsnew(kpm)=1. dqs=1./REAL(kpm-1) ! DO kp=2,kpm1 qsnew(kp)=qsnew(kp-1)+dqs END DO ! y2p(1 )=0. y2p(kpm )=0. ! CALL spline(jtb,kpm,qsold,pold,y2p,kpm,qsnew,pnew,app,aqp) ! DO kp=1,kpm ptbl(kp,kth)=pnew(kp) END DO !----------------------------------------------------------------------- END DO !--------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE---------- p=pl-dp DO kp=1,kpm p=p+dp th=thl-dth DO kth=1,kthm th=th+dth ape=(100000./p)**(r/cp) qs=pq0/p*EXP(a2*(th-a3*ape)/(th-a4*ape)) told(kth)=th/ape theold(kth)=th*EXP(eliwv*qs/(cp*told(kth))) END DO ! the0k=theold(1) sthek=theold(kthm)-theold(1) theold(1 )=0. theold(kthm)=1. ! DO kth=2,kthm1 theold(kth)=(theold(kth)-the0k)/sthek ! IF((theold(kth)-theold(kth-1)) < eps) theold(kth)=theold(kth-1) + eps ! END DO ! the0(kp)=the0k sthe(kp)=sthek !----------------------------------------------------------------------- thenew(1 )=0. thenew(kthm)=1. dthe=1./REAL(kthm-1) rdthe=1./dthe ! DO kth=2,kthm1 thenew(kth)=thenew(kth-1)+dthe END DO ! y2t(1 )=0. y2t(kthm)=0. ! CALL spline(jtb,kthm,theold,told,y2t,kthm,thenew,tnew,apt,aqt) ! DO kth=1,kthm ttbl(kth,kp)=tnew(kth) END DO !----------------------------------------------------------------------- END DO ! RETURN END SUBROUTINE table1 !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& SUBROUTINE tableq(ttblq & 1,1 , rdp,rdthe,pl,thl,sthe,the0) ! ****************************************************************** ! * * ! * GENERATE VALUES FOR FINER LOOK-UP TABLES USED * ! * IN CONVECTION * ! * * ! ****************************************************************** PARAMETER & (itb=152,jtb=440) PARAMETER & (thh=325.,ph=105000. & , pq0=379.90516,a1=610.78,a2=17.2693882,a3=273.16,a4=35.86 & , r=287.04,cp=1004.6,eliwv=2.683E6,eps=1.e-9) DIMENSION & ttblq (jtb,itb) & , told (jtb),theold(jtb),the0 (itb),sthe (itb) & , y2t (jtb),thenew(jtb),apt (jtb),aqt (jtb),tnew (jtb) !--------------COARSE LOOK-UP TABLE FOR SATURATION POINT---------------- kthm=jtb kpm=itb kthm1=kthm-1 kpm1=kpm-1 ! dth=(thh-thl)/REAL(kthm-1) dp =(ph -pl )/REAL(kpm -1) ! rdp=1./dp th=thl-dth !--------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE---------- p=pl-dp DO kp=1,kpm p=p+dp th=thl-dth DO kth=1,kthm th=th+dth ape=(100000./p)**(r/cp) qs=pq0/p*EXP(a2*(th-a3*ape)/(th-a4*ape)) told(kth)=th/ape theold(kth)=th*EXP(eliwv*qs/(cp*told(kth))) END DO ! the0k=theold(1) sthek=theold(kthm)-theold(1) theold(1 )=0. theold(kthm)=1. ! DO kth=2,kthm1 theold(kth)=(theold(kth)-the0k)/sthek ! IF((theold(kth)-theold(kth-1)) < eps) theold(kth)=theold(kth-1) + eps ! END DO ! the0(kp)=the0k sthe(kp)=sthek !----------------------------------------------------------------------- thenew(1 )=0. thenew(kthm)=1. dthe=1./REAL(kthm-1) rdthe=1./dthe ! DO kth=2,kthm1 thenew(kth)=thenew(kth-1)+dthe END DO ! y2t(1 )=0. y2t(kthm)=0. ! CALL spline(jtb,kthm,theold,told,y2t,kthm,thenew,tnew,apt,aqt) ! DO kth=1,kthm ttblq(kth,kp)=tnew(kth) END DO !----------------------------------------------------------------------- END DO ! RETURN END SUBROUTINE tableq SUBROUTINE ttblex(tref,ttbl,im,jm,imxjm,itb,jtb & 4 , knum,iarr,jarr & , pijl,pl,qq,pp,rdp,the0 & , sthe,rdthe,thesp,iptb,ithtb) ! ****************************************************************** ! * * ! * EXTRACT TEMPERATURE OF THE MOIST ADIABAT FROM * ! * THE APPROPRIATE TTBL * ! * * ! ****************************************************************** !---------------------------------------------------------------------- ! PARAMETER(IM=1,JM=1,LM=50,IMXJM=IM*JM) DIMENSION & tref(im,jm),ttbl(jtb,itb),iarr(imxjm),jarr(imxjm) & ,pijl(im,jm),qq(im,jm),pp(im,jm),the0(itb) & ,sthe(itb),thesp(im,jm),iptb(im,jm),ithtb(im,jm) !----------------------------------------------------------------------- DO kk=1,knum !--------------SCALING PRESSURE & TT TABLE INDEX------------------------ i=iarr(kk) j=jarr(kk) pk=pijl(i,j) tpk=(pk-pl)*rdp qq(i,j)=tpk-AINT(tpk) iptb(i,j)=INT(tpk)+1 !--------------KEEPING INDICES WITHIN THE TABLE------------------------- IF(iptb(i,j) < 1)THEN iptb(i,j)=1 qq(i,j)=0. END IF IF(iptb(i,j) >= itb)THEN iptb(i,j)=itb-1 qq(i,j)=0. END IF !--------------BASE AND SCALING FACTOR FOR THE-------------------------- iptbk=iptb(i,j) bthe00k=the0(iptbk) sthe00k=sthe(iptbk) bthe10k=the0(iptbk+1) sthe10k=sthe(iptbk+1) !--------------SCALING THE & TT TABLE INDEX----------------------------- bthk=(bthe10k-bthe00k)*qq(i,j)+bthe00k sthk=(sthe10k-sthe00k)*qq(i,j)+sthe00k tthk=(thesp(i,j)-bthk)/sthk*rdthe pp(i,j)=tthk-AINT(tthk) ithtb(i,j)=INT(tthk)+1 !--------------KEEPING INDICES WITHIN THE TABLE------------------------- IF(ithtb(i,j) < 1)THEN ithtb(i,j)=1 pp(i,j)=0. END IF IF(ithtb(i,j) >= jtb)THEN ithtb(i,j)=jtb-1 pp(i,j)=0. END IF !--------------TEMPERATURE AT FOUR SURROUNDING TT TABLE PTS.------------ ith=ithtb(i,j) ip=iptb(i,j) t00k=ttbl(ith ,ip ) t10k=ttbl(ith+1,ip ) t01k=ttbl(ith ,ip+1) t11k=ttbl(ith+1,ip+1) !--------------PARCEL TEMPERATURE------------------------------------- tref(i,j)=(t00k+(t10k-t00k)*pp(i,j)+(t01k-t00k)*qq(i,j) & +(t00k-t10k-t01k+t11k)*pp(i,j)*qq(i,j)) END DO ! RETURN END SUBROUTINE ttblex !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& SUBROUTINE spline(jtb,nold,xold,yold,y2,nnew,xnew,ynew,p,q) 6 ! ****************************************************************** ! * * ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE * ! * PROGRAMED FOR A SMALL SCALAR MACHINE. * ! * * ! * PROGRAMER Z. JANJIC, YUGOSLAV FED. HYDROMET. INST., BEOGRAD * ! * * ! * * ! * * ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. * ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. * ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. * ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL * ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE * ! * SPECIFIED. * ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. * ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) * ! * AND LE XOLD(NOLD). * ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. * ! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. * ! * * ! ****************************************************************** DIMENSION & xold(jtb),yold(jtb),y2(jtb),p(jtb),q(jtb) & ,xnew(jtb),ynew(jtb) !----------------------------------------------------------------------- noldm1=nold-1 ! dxl=xold(2)-xold(1) dxr=xold(3)-xold(2) dydxl=(yold(2)-yold(1))/dxl dydxr=(yold(3)-yold(2))/dxr rtdxc=.5/(dxl+dxr) ! p(1)= rtdxc*(6.*(dydxr-dydxl)-dxl*y2(1)) q(1)=-rtdxc*dxr ! IF(nold == 3) GO TO 700 !----------------------------------------------------------------------- k=3 ! 100 dxl=dxr dydxl=dydxr dxr=xold(k+1)-xold(k) dydxr=(yold(k+1)-yold(k))/dxr dxc=dxl+dxr den=1./(dxl*q(k-2)+dxc+dxc) ! p(k-1)= den*(6.*(dydxr-dydxl)-dxl*p(k-2)) q(k-1)=-den*dxr ! k=k+1 IF(k < nold) GO TO 100 !----------------------------------------------------------------------- 700 k=noldm1 ! 200 y2(k)=p(k-1)+q(k-1)*y2(k+1) ! k=k-1 IF(k > 1) GO TO 200 !----------------------------------------------------------------------- k1=1 ! 300 xk=xnew(k1) ! DO k2=2,nold IF(xold(k2) <= xk) CYCLE kold=k2-1 GO TO 450 END DO ynew(k1)=yold(nold) GO TO 600 ! 450 IF(k1 == 1) GO TO 500 IF(k == kold) GO TO 550 ! 500 k=kold ! y2k=y2(k) y2kp1=y2(k+1) dx=xold(k+1)-xold(k) rdx=1./dx ! !VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV ! WRITE(6,5000) K,Y2K,Y2KP1,DX,RDX,YOLD(K),YOLD(K+1) !5000 FORMAT(' K=',I4,' Y2K=',E12.4,' Y2KP1=',E12.4,' DX=',E12.4,' RDX=' ! 2,E12.4,' YOK=',E12.4,' YOP1=',E12.4) !AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ak=.1666667*rdx*(y2kp1-y2k) bk=.5*y2k ck=rdx*(yold(k+1)-yold(k))-.1666667*dx*(y2kp1+y2k+y2k) ! 550 x=xk-xold(k) xsq=x*x ! ynew(k1)=ak*xsq*x+bk*xsq+ck*x+yold(k) ! 600 CONTINUE k1=k1+1 IF(k1 <= nnew) GO TO 300 !----------------------------------------------------------------------- RETURN END SUBROUTINE spline SUBROUTINE newmap(nqi,nqj,latn,lonn,dx, & 1,4 qswcorn,qswcorw,trulat,trulon,mapproj) IMPLICIT NONE INTEGER :: nqi,nqj,i,j REAL :: latn(nqi,nqj),lonn(nqi,nqj) REAL :: qswcorn,qswcorw,dx REAL :: trulat(2),trulon INTEGER :: mapproj ! REAL :: x,y,x1,y1 REAL :: lat,lon ! CALL setmapr(mapproj,1.0,trulat,trulon) lat=qswcorn lon=qswcorw CALL lltoxy(1,1,lat,lon,x,y) CALL setorig(1,x,y) DO j=1,nqj DO i=1,nqi x1=(i-1)*dx*1000.0 y1=(j-1)*dx*1000.0 CALL xytoll(1,1,x1,y1,lat,lon) latn(i,j)=lat lonn(i,j)=lon END DO END DO RETURN END SUBROUTINE newmap SUBROUTINE d2intrpa(xold,yold,nxold,nyold, & 1 xnew,ynew,nxnew,nynew,intrpl, & aold1,anew1, & aold2,anew2, & aold3,anew3, & aold4,anew4, & aold5,anew5, & aold6,anew6, & aold7,anew7, & aold8,anew8, & aold9,anew9, & aold10,anew10, & aold11,anew11, & aold12,anew12, & aold13,anew13, & aold14,anew14, & aold15,anew15, & aold16,anew16, & aold17,anew17, & aold18,anew18, & aold19,anew19, & aold20,anew20, & aold21,anew21, & aold22,anew22, & aold23,anew23, & aold24,anew24, & aold25,anew25, & aold26,anew26, & aold27,anew27, & aold28,anew28, & aold29,anew29) IMPLICIT NONE INTEGER :: nxold,nyold, nxnew,nynew,intrpl REAL :: xold(nxold,nyold),xnew(nxnew,nynew) REAL :: yold(nxold,nyold),ynew(nxnew,nynew) REAL :: aold1(nxold,nyold),anew1(nxnew,nynew) REAL :: aold2(nxold,nyold),anew2(nxnew,nynew) REAL :: aold3(nxold,nyold),anew3(nxnew,nynew) REAL :: aold4(nxold,nyold),anew4(nxnew,nynew) REAL :: aold5(nxold,nyold),anew5(nxnew,nynew) REAL :: aold6(nxold,nyold),anew6(nxnew,nynew) REAL :: aold7(nxold,nyold),anew7(nxnew,nynew) REAL :: aold8(nxold,nyold),anew8(nxnew,nynew) REAL :: aold9(nxold,nyold),anew9(nxnew,nynew) REAL :: aold10(nxold,nyold),anew10(nxnew,nynew) REAL :: aold11(nxold,nyold),anew11(nxnew,nynew) REAL :: aold12(nxold,nyold),anew12(nxnew,nynew) REAL :: aold13(nxold,nyold),anew13(nxnew,nynew) REAL :: aold14(nxold,nyold),anew14(nxnew,nynew) REAL :: aold15(nxold,nyold),anew15(nxnew,nynew) REAL :: aold16(nxold,nyold),anew16(nxnew,nynew) REAL :: aold17(nxold,nyold),anew17(nxnew,nynew) REAL :: aold18(nxold,nyold),anew18(nxnew,nynew) REAL :: aold19(nxold,nyold),anew19(nxnew,nynew) REAL :: aold20(nxold,nyold),anew20(nxnew,nynew) REAL :: aold21(nxold,nyold),anew21(nxnew,nynew) REAL :: aold22(nxold,nyold),anew22(nxnew,nynew) REAL :: aold23(nxold,nyold),anew23(nxnew,nynew) REAL :: aold24(nxold,nyold),anew24(nxnew,nynew) REAL :: aold25(nxold,nyold),anew25(nxnew,nynew) REAL :: aold26(nxold,nyold),anew26(nxnew,nynew) REAL :: aold27(nxold,nyold),anew27(nxnew,nynew) REAL :: aold28(nxold,nyold),anew28(nxnew,nynew) REAL :: aold29(nxold,nyold),anew29(nxnew,nynew) INTEGER :: i,j,i1,i2,j1,j2 INTEGER :: io,jo REAL :: xs,ys,s1,s2,s3,s4,sgrid PRINT *,'starting D2INTRPA' PRINT *,nxold,nyold PRINT *,nxnew,nynew PRINT *,xold(1,1),yold(1,1),xnew(1,1),ynew(1,1) PRINT *,xold(1,nyold),yold(1,nyold),xnew(1,nynew),ynew(1,nynew) PRINT *,xold(nxold,nyold),yold(nxold,nyold), & xnew(nxnew,nynew),ynew(nxnew,nynew) PRINT *,xold(nxold,1),yold(nxold,1),xnew(nxnew,1),ynew(nxnew,1) DO j=1,nynew DO i=1,nxnew ! Direct assignment in the case of intrpl=0 (No intepolation) IF (intrpl == 0) THEN io=i+1 jo=j+1 anew1(i,j)=aold1(io,jo) anew2(i,j)=aold2(io,jo) anew3(i,j)=aold3(io,jo) anew4(i,j)=aold4(io,jo) anew5(i,j)=aold5(io,jo) anew6(i,j)=aold6(io,jo) anew7(i,j)=aold7(io,jo) anew8(i,j)=aold8(io,jo) anew9(i,j)=aold9(io,jo) anew10(i,j)=aold10(io,jo) anew11(i,j)=aold11(io,jo) anew12(i,j)=aold12(io,jo) anew13(i,j)=aold13(io,jo) anew14(i,j)=aold14(io,jo) anew15(i,j)=aold15(io,jo) anew16(i,j)=aold16(io,jo) anew17(i,j)=aold17(io,jo) anew18(i,j)=aold18(io,jo) anew19(i,j)=aold19(io,jo) anew20(i,j)=aold20(io,jo) anew21(i,j)=aold21(io,jo) anew22(i,j)=aold22(io,jo) anew23(i,j)=aold23(io,jo) anew24(i,j)=aold24(io,jo) anew25(i,j)=aold25(io,jo) anew26(i,j)=aold26(io,jo) anew27(i,j)=aold27(io,jo) anew28(i,j)=aold28(io,jo) anew29(i,j)=aold29(io,jo) CYCLE END IF ! Interpolation, first finding the old points surroding the new point xs=xnew(i,j) ys=ynew(i,j) IF (xs < xold(1,1)) THEN i1=1 i2=2 ELSE IF (xs >= xold(nxold,1)) THEN i1=nxold-1 i2=nxold ELSE DO io=1,nxold-1 IF (xs >= xold(io,1).AND.xs < xold(io+1,1)) THEN i1=io i2=io+1 EXIT END IF END DO 205 CONTINUE END IF IF (ys < yold(1,1)) THEN j1=1 j2=2 ELSE IF (ys >= yold(1,nyold)) THEN j1=nyold-1 j2=nyold ELSE DO jo=1,nyold-1 IF (ys >= yold(1,jo).AND.ys < yold(1,jo+1)) THEN j1=jo j2=jo+1 EXIT END IF END DO 305 CONTINUE END IF DO jo=1,nyold DO io=1,nxold ! dirtect assignment for a new point, very close to an old point. IF (ABS(xs-xold(io,jo)) < 1.0E2.AND. ABS(ys-yold(io,jo)) < 1.0E2) THEN anew1(i,j)=aold1(io,jo) anew2(i,j)=aold2(io,jo) anew3(i,j)=aold3(io,jo) anew4(i,j)=aold4(io,jo) anew5(i,j)=aold5(io,jo) anew6(i,j)=aold6(io,jo) anew7(i,j)=aold7(io,jo) anew8(i,j)=aold8(io,jo) anew9(i,j)=aold9(io,jo) anew10(i,j)=aold10(io,jo) anew11(i,j)=aold11(io,jo) anew12(i,j)=aold12(io,jo) anew13(i,j)=aold13(io,jo) anew14(i,j)=aold14(io,jo) anew15(i,j)=aold15(io,jo) anew16(i,j)=aold16(io,jo) anew17(i,j)=aold17(io,jo) anew18(i,j)=aold18(io,jo) anew19(i,j)=aold19(io,jo) anew20(i,j)=aold20(io,jo) anew21(i,j)=aold21(io,jo) anew22(i,j)=aold22(io,jo) anew23(i,j)=aold23(io,jo) anew24(i,j)=aold24(io,jo) anew25(i,j)=aold25(io,jo) anew26(i,j)=aold26(io,jo) anew27(i,j)=aold27(io,jo) anew28(i,j)=aold28(io,jo) anew29(i,j)=aold29(io,jo) GO TO 405 END IF END DO END DO ! interpolation s1=SQRT((xs-xold(i1,j1))**2+(ys-yold(i1,j1))**2) s2=SQRT((xs-xold(i2,j1))**2+(ys-yold(i2,j1))**2) s3=SQRT((xs-xold(i2,j2))**2+(ys-yold(i2,j2))**2) s4=SQRT((xs-xold(i1,j2))**2+(ys-yold(i1,j2))**2) s1=1.0/s1 s2=1.0/s2 s3=1.0/s3 s4=1.0/s4 sgrid=1.0/(s1+s2+s3+s4) anew1(i,j)=(aold1(i1,j1)*s1+aold1(i2,j1)*s2 & +aold1(i2,j2)*s3+aold1(i1,j2)*s4)*sgrid anew2(i,j)=(aold2(i1,j1)*s1+aold2(i2,j1)*s2 & +aold2(i2,j2)*s3+aold2(i1,j2)*s4)*sgrid anew3(i,j)=(aold3(i1,j1)*s1+aold3(i2,j1)*s2 & +aold3(i2,j2)*s3+aold3(i1,j2)*s4)*sgrid anew4(i,j)=(aold4(i1,j1)*s1+aold4(i2,j1)*s2 & +aold4(i2,j2)*s3+aold4(i1,j2)*s4)*sgrid anew5(i,j)=(aold5(i1,j1)*s1+aold5(i2,j1)*s2 & +aold5(i2,j2)*s3+aold5(i1,j2)*s4)*sgrid anew6(i,j)=(aold6(i1,j1)*s1+aold6(i2,j1)*s2 & +aold6(i2,j2)*s3+aold6(i1,j2)*s4)*sgrid anew7(i,j)=(aold7(i1,j1)*s1+aold7(i2,j1)*s2 & +aold7(i2,j2)*s3+aold7(i1,j2)*s4)*sgrid anew8(i,j)=(aold8(i1,j1)*s1+aold8(i2,j1)*s2 & +aold8(i2,j2)*s3+aold8(i1,j2)*s4)*sgrid anew9(i,j)=(aold9(i1,j1)*s1+aold9(i2,j1)*s2 & +aold9(i2,j2)*s3+aold9(i1,j2)*s4)*sgrid anew10(i,j)=(aold10(i1,j1)*s1+aold10(i2,j1)*s2 & +aold10(i2,j2)*s3+aold10(i1,j2)*s4)*sgrid anew11(i,j)=(aold11(i1,j1)*s1+aold11(i2,j1)*s2 & +aold11(i2,j2)*s3+aold11(i1,j2)*s4)*sgrid anew12(i,j)=(aold12(i1,j1)*s1+aold12(i2,j1)*s2 & +aold12(i2,j2)*s3+aold12(i1,j2)*s4)*sgrid anew13(i,j)=(aold13(i1,j1)*s1+aold13(i2,j1)*s2 & +aold13(i2,j2)*s3+aold13(i1,j2)*s4)*sgrid anew14(i,j)=(aold14(i1,j1)*s1+aold14(i2,j1)*s2 & +aold14(i2,j2)*s3+aold14(i1,j2)*s4)*sgrid anew15(i,j)=(aold15(i1,j1)*s1+aold15(i2,j1)*s2 & +aold15(i2,j2)*s3+aold15(i1,j2)*s4)*sgrid anew16(i,j)=(aold16(i1,j1)*s1+aold16(i2,j1)*s2 & +aold16(i2,j2)*s3+aold16(i1,j2)*s4)*sgrid anew17(i,j)=(aold17(i1,j1)*s1+aold17(i2,j1)*s2 & +aold17(i2,j2)*s3+aold17(i1,j2)*s4)*sgrid anew18(i,j)=(aold18(i1,j1)*s1+aold18(i2,j1)*s2 & +aold18(i2,j2)*s3+aold18(i1,j2)*s4)*sgrid anew19(i,j)=(aold19(i1,j1)*s1+aold19(i2,j1)*s2 & +aold19(i2,j2)*s3+aold19(i1,j2)*s4)*sgrid anew20(i,j)=(aold20(i1,j1)*s1+aold20(i2,j1)*s2 & +aold20(i2,j2)*s3+aold20(i1,j2)*s4)*sgrid anew21(i,j)=(aold21(i1,j1)*s1+aold21(i2,j1)*s2 & +aold21(i2,j2)*s3+aold21(i1,j2)*s4)*sgrid anew22(i,j)=(aold22(i1,j1)*s1+aold22(i2,j1)*s2 & +aold22(i2,j2)*s3+aold22(i1,j2)*s4)*sgrid anew23(i,j)=(aold23(i1,j1)*s1+aold23(i2,j1)*s2 & +aold23(i2,j2)*s3+aold23(i1,j2)*s4)*sgrid anew24(i,j)=(aold24(i1,j1)*s1+aold24(i2,j1)*s2 & +aold24(i2,j2)*s3+aold24(i1,j2)*s4)*sgrid anew25(i,j)=(aold25(i1,j1)*s1+aold25(i2,j1)*s2 & +aold25(i2,j2)*s3+aold25(i1,j2)*s4)*sgrid anew26(i,j)=(aold26(i1,j1)*s1+aold26(i2,j1)*s2 & +aold26(i2,j2)*s3+aold26(i1,j2)*s4)*sgrid anew27(i,j)=(aold27(i1,j1)*s1+aold27(i2,j1)*s2 & +aold27(i2,j2)*s3+aold27(i1,j2)*s4)*sgrid anew28(i,j)=(aold28(i1,j1)*s1+aold28(i2,j1)*s2 & +aold28(i2,j2)*s3+aold28(i1,j2)*s4)*sgrid anew29(i,j)=(aold29(i1,j1)*s1+aold29(i2,j1)*s2 & +aold29(i2,j2)*s3+aold29(i1,j2)*s4)*sgrid ! if (i.eq.1.and.j.eq.1.or.i.eq.nxnew.and.j.eq.nynew) then ! print *,i1,j1,i2,j2 ! print *,anew1(i,j),aold1(i1,j1),aold1(i2,j1), ! : aold1(i2,j2),aold1(i1,j2) ! print *,anew2(i,j),aold2(i1,j1),aold2(i2,j1), ! : aold2(i2,j2),aold2(i1,j2) ! endif 405 CONTINUE END DO END DO PRINT *,'finishing D2INTRPA' RETURN END SUBROUTINE d2intrpa ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE FILZERO ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE filzero( a, n) 4 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Fill vector a with zeros. ! !----------------------------------------------------------------------- ! ! AUTHOR: St. Paul, Dead Sea Scrolls ! ! MODIFICATIONS: ! 6/09/92 Added full documentation (K. Brewster) ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: n REAL :: a(n) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO i=1,n a(i)=0.0 END DO RETURN END SUBROUTINE filzero ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE IFILZERO ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE ifilzero( ia, n ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Fill vector a with zeros. ! !----------------------------------------------------------------------- ! ! AUTHOR: St. Paul, Dead Sea Scrolls ! ! MODIFICATIONS: ! 6/09/92 Added full documentation (K. Brewster) ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: n INTEGER :: ia(n) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO i=1,n ia(i)=0 END DO RETURN END SUBROUTINE ifilzero ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE TEMPER ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE temper ( nx,ny,nz,theta, ppert, pbar, t ) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Using a version of Poisson's formula, calculate temperature. ! !----------------------------------------------------------------------- ! ! AUTHOR: Joe Bradley ! 12/05/91 ! ! MODIFICATIONS: ! Modified by Ming Xue so that arrays are only defined at ! one time level. ! 6/09/92 Added full documentation and phycst include file for ! rddcp=Rd/Cp (K. Brewster) ! !----------------------------------------------------------------------- ! ! INPUT: ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! theta Potential temperature (degrees Kelvin) ! ppert Perturbation pressure (Pascals) ! pbar Base state pressure (Pascals) ! ! OUTPUT: ! ! t Temperature (degrees Kelvin) ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx,ny,nz ! REAL :: theta(nx,ny,nz) ! potential temperature (degrees Kelvin) REAL :: ppert(nx,ny,nz) ! perturbation pressure (Pascals) REAL :: pbar (nx,ny,nz) ! base state pressure (Pascals) ! REAL :: t (nx,ny,nz) ! temperature (degrees Kelvin) ! !----------------------------------------------------------------------- ! ! Include file ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Calculate the temperature using Poisson's formula. ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 t(i,j,k) = theta(i,j,k) * & (((ppert(i,j,k) + pbar(i,j,k)) / p0) ** rddcp) END DO END DO END DO RETURN END SUBROUTINE temper SUBROUTINE calender(year,mon,day,hour,ds,wkd) 1 ! find the calender date for forecast initiated at hourZ,dayth of mon, Year ! with a lead time of ds seconds. the day of week is also found. ! effective only for date later than 1st Jan 1998, not exceeding 28 Feb. 2100 IMPLICIT NONE INTEGER :: year,mon,day,hour,MIN,sec,ds,wkd INTEGER :: mon1,dday INTEGER :: y0,wkd0 !on Jan. 1st,the year of y0,the weekday index is wkd0 INTEGER :: i,dindex y0=1998 wkd0=5 ! cross minute hour and day sec=0 MIN=0 sec=sec+ds MIN=MIN+(sec-MOD(sec,60))/60 sec=MOD(sec,60) hour=hour+(MIN-MOD(MIN,60))/60 MIN=MOD(MIN,60) dday=day+(hour-MOD(hour,24))/24 hour=MOD(hour,24) ds=MIN ! cross the month IF ( (mon == 1.OR.mon == 3.OR.mon == 5.OR.mon == 7 & .OR.mon == 8.OR.mon == 10.OR.mon == 12).AND.dday > 31) THEN dday=dday-31 mon1=mon+1 ELSE IF ( (mon == 4.OR.mon == 6.OR.mon == 9.OR.mon == 11) & .AND.dday > 30) THEN dday=dday-30 mon1=mon+1 ELSE IF (mon == 2) THEN IF (MOD(year,4) == 0.AND.dday > 29) THEN dday=dday-29 mon1=mon+1 ELSE IF (MOD(year,4) /= 0.AND.dday > 28) THEN dday=dday-28 mon1=mon+1 ELSE mon1=mon END IF ELSE mon1=mon END IF day=dday mon=mon1 !* cross the year IF (mon > 12) THEN mon=mon-12 year=year+1 END IF !* day of week dindex=-1 DO i=y0,year-1 dindex=dindex+365 IF (MOD(i,4) == 0) dindex=dindex+1 END DO DO i=1,mon-1 IF (i == 1.OR.i == 3.OR.i == 5.OR.i == 7 & .OR.i == 8.OR.i == 10.OR.i == 12) THEN dindex=dindex+31 ELSE IF (i == 4.OR.i == 6.OR.i == 9.OR.i == 11) THEN dindex=dindex+30 ELSE IF (i == 2.AND.MOD(year,4) == 0) THEN dindex=dindex+29 ELSE IF (i == 2.AND.MOD(year,4) /= 0) THEN dindex=dindex+28 END IF END DO dindex=dindex+day wkd=wkd0+dindex PRINT *,wkd wkd=MOD(wkd,7) IF (wkd == 0) THEN wkd=7 END IF RETURN END SUBROUTINE calender