! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE HIS2VER ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE HIS2VER(nx,ny,nz,nzsoil,x,y,z,zp,zpsoil,hterain, & 1,22 uprt,vprt,wprt,ptprt,pprt,qvprt, & qc,qr,qi,qs,qh,tke,kmh,kmv, & ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, & nstyps,soiltyp,stypfrct,vegtyp,lai,roufns, & veg,tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate,radfrc,radsw,rnflx, & radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & hinfmt,fgrdbasfn,hisfile,nhisfile, & sndopt,sndlist,sndrunname,snddomlist, & proopt,prolist,prorunname,prodomlist, & sfcopt,sfclist,sfcobsdir,sfcrunname,blackfile, & precveropt,preclist,precrunname,precdomlist, & mosopt,moslist,mosrunname,mosdomlist, & arpsnn_opt,nnrunname,wtsdir,nnoutputfn, & model_data,obsrv_data) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Performs extraction of sounding, profiler, and surface data ! (similar to what is done using ARPS with veridmp.f) using only ! the ARPS' history dump data. The structure of this program is ! similar to arpsextsnd.f. In order to avoid having to make ! alterations to the makefile, to compile this program: ! ! 1) Copy arpsextsnd.f to arpsextsnd.f.orig (or something ! similar) in the ARPS directory ! ! 2) Copy arpshis2ver.f to arpsextsnd.f in the ARPS directory ! ! 3) Copy vericst.inc to the ARPS include directory ! ! 4) Compile with: 'makearps arpsextsnd' ! ! 5) Move the executable 'arpsextsnd' to 'his2ver' ! ! The executable uses only a 4-line input file (arpshis2ver.input). ! ! NOTE: The surface data extraction portion of the program will ! only work if the necessary arrays are contained in the ! history dump data. For these arrays to be present the ! model run must have used surface physics, terrain, etc. ! and varout, rainout, sfcout, and landout must all be set ! to 1. ! !----------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! ! Original Coding: 09/22/97 ! ! MODIFICATION HISTORY: ! ! 09/29/97: Added adjustable size map projection arrays to the ! subroutine calls to snddump, prodump, and sfcdump ! as the SUN compilers will not allow adjustable length ! arrays to be declared within a subroutine. ! ! 06/29/98: E. Kemp, Project COMET-Tinker ! Modified for use in ARPS 4.3.5. Also added seperate ! *.prec* dumps (subroutine precdump) for STORMWAVE ! precipitation verification. ! ! 18 May 2000: E. Kemp ! Updated for ARPS 4.5.1. Added namelists for ! input file, modified code to process multiple ! history dumps, require user to name the .tbl ! files (instead of hardwired), added valid time ! and forecast information to output files, and ! added options to verify only types of data that the ! user is interested in. ! ! 14 June 2000: E. Kemp ! Added code to output MOS data. ! ! 23 Mar 2002: Nick Mirsky ! ! 1) Upgraded code to f90 ! ! 2) Added sounding data for mandatory pressure levels ! in SUBROUTINE SFCDUMP using simple linear ! interpolation scheme (as in SUBROUTINE PRODUMP) ! ! 3) After #1 and #2, copied code "arpshis2ver.f90" to ! "arpshis2ver_sort.f90". The new code sorts and ! appends data to individual station files ! ! 29 Mar 2002: Nick Mirsky ! ! 04/04/02: Jason Levit ! Changed original code into a subroutine, to be used by the ! arpsverif driver program. ! ! 1 June 2002 Eric Kemp ! Soil variable updates. ! ! 18 Nov 2002 Kevin W. Thomas ! As written, the code processes every station in the domain. For a CONUS ! run of 36 hours, the run time is close to two hours! This update allows ! a user list to indicate which stations to process. ! ! 8 August 2005 Kevin W. Thomas. ! Update the code to run MPI. ! !----------------------------------------------------------------------- ! ! DATA ARRAYS READ IN: ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp z coordinate of grid points in physical space (m) ! zpsoil z coordinate of soil model ! ! uprt Perturbation x component of velocity (m/s) ! vprt Perturbation y component of velocity (m/s) ! wprt Perturbation z component of velocity (m/s) ! ! ptprt Perturbation potential temperature (K) ! pprt Perturbation pressure (Pascal) ! ! 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 density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil soil temperature (K) ! qsoil Soil moisture ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation, SWin - SWout ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! CALCULATED DATA ARRAYS: ! ! su Sounding x component of velocity (m/s) ! sv Sounding y component of velocity (m/s) ! stheta Sounding potential temperature (K) ! spres Sounding pressure (mb) ! stemp Sounding temperature (C) ! sdewp Sounding dew-point (C) ! sdrct Sounding wind direction (degrees) ! ssped Sounding wind speed (m/s) ! shght Sounding height (m) ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! ! Temporary arrays are defined and used differently by each ! subroutine. ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'vericst.inc' INCLUDE 'mp.inc' ! !----------------------------------------------------------------------- ! ! Arrays to be read in: ! !----------------------------------------------------------------------- ! INTEGER :: nx, ny, nz, nzsoil REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate of soil model ! REAL :: hterain (nx,ny) ! Terrain height ! REAL :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s) REAL :: wprt (nx,ny,nz) ! Perturbation w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation water vapor specific ! humidity (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar (nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific INTEGER :: nstyps INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type 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 :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! 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) = cumulative precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s) INTEGER :: nhisfile REAL :: model_data(sfcmax,nhisfile,5) REAL :: obsrv_data(sfcmax,nhisfile,5) ! ! !----------------------------------------------------------------------- ! ! Map variables, declared here for use in subroutines... ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: xs(:) REAL, ALLOCATABLE :: ys(:) REAL, ALLOCATABLE :: xmap(:) REAL, ALLOCATABLE :: ymap(:) REAL, ALLOCATABLE :: latgr(:,:) REAL, ALLOCATABLE :: longr(:,:) ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: tem1(:,:,:) REAL, ALLOCATABLE :: tem2(:,:,:) REAL, ALLOCATABLE :: tem3(:,:,:) REAL, ALLOCATABLE :: tem4(:,:) ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !----------------------------------------------------------------------- ! INTEGER :: len1, istatus REAL :: time INTEGER :: i,j INTEGER :: ireturn,lengbf,lenfil,nchin,lengbf00Z,lengbf12Z INTEGER :: hinfmt INTEGER :: nhisfile_max PARAMETER (nhisfile_max=200) CHARACTER (LEN=256) :: filename CHARACTER (LEN=256) :: fgrdbasfn CHARACTER (LEN=256) :: grdbasfn CHARACTER (LEN=256) :: hisfile(nhisfile_max) ! CHARACTER (LEN=256) :: snddmpfn,prodmpfn,sfcdmpfn,precdmpfn, & mosdmpfn LOGICAL :: needsndstns,needprostns,needsfcstns,needprecstns, & needmosstns INTEGER :: nf CHARACTER (LEN=8) :: the_date CHARACTER (LEN=10) :: the_time CHARACTER (LEN=5) :: the_zone INTEGER :: the_values(8) INTEGER :: sndopt CHARACTER (LEN=256) :: sndlist CHARACTER (LEN=256) :: sndrunname CHARACTER (LEN=256) :: snddomlist INTEGER :: proopt CHARACTER (LEN=256) :: prolist CHARACTER (LEN=256) :: prorunname CHARACTER (LEN=256) :: prodomlist INTEGER :: sfcopt CHARACTER (LEN=256) :: sfclist CHARACTER (LEN=256) :: sfcobsdir CHARACTER (LEN=256) :: sfcrunname CHARACTER (LEN=256) :: blackfile INTEGER :: precveropt CHARACTER (LEN=256) :: preclist CHARACTER (LEN=256) :: precrunname CHARACTER (LEN=256) :: precdomlist INTEGER :: mosopt CHARACTER (LEN=256) :: moslist CHARACTER (LEN=256) :: mosrunname CHARACTER (LEN=256) :: mosdomlist INTEGER :: arpsnn_opt CHARACTER (LEN=256) :: nnrunname CHARACTER (LEN=256) :: wtsdir CHARACTER (LEN=256) :: nnoutputfn CHARACTER (LEN=256) :: hdfname INTEGER :: sd_id,istat ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! CALL DATE_AND_TIME(the_date,the_time,the_zone,the_values) ! DO nf=1,nhisfile ! lenfil =256 ! CALL slength( hisfile(nf), lenfil) ! WRITE(6,'(1x,a,a)') 'History file is ',hisfile(nf)(1:lenfil) ! END DO nstyp = nstyps ! ALLOCATE ! ALLOCATE(xs (nx),STAT=istatus) CALL check_alloc_status(istatus, "arps:xs") xs = 0.0 ALLOCATE(ys (ny),STAT=istatus) CALL check_alloc_status(istatus, "arps:ys") ys = 0.0 ALLOCATE(tem1 (nx,ny,nz),STAT=istatus) CALL check_alloc_status(istatus, "arps:tem1") tem1 = 0.0 ALLOCATE(tem2 (nx,ny,nz),STAT=istatus) CALL check_alloc_status(istatus, "arps:tem2") tem2 = 0.0 ALLOCATE(tem3 (nx,ny,nz),STAT=istatus) CALL check_alloc_status(istatus, "arps:tem3") tem3 = 0.0 ALLOCATE(tem4 (nx,ny),STAT=istatus) CALL check_alloc_status(istatus, "arps:tem4") tem4 = 0.0 ALLOCATE(xmap (nx),STAT=istatus) CALL check_alloc_status(istatus, "arps:xmap") xmap = 0.0 ALLOCATE(ymap (ny),STAT=istatus) CALL check_alloc_status(istatus, "arps:ymap") ymap = 0.0 ALLOCATE(latgr (nx,ny),STAT=istatus) CALL check_alloc_status(istatus, "arps:latgr") latgr = 0.0 ALLOCATE(longr (nx,ny),STAT=istatus) CALL check_alloc_status(istatus, "arps:longr") longr = 0.0 !----------------------------------------------------------------------- ! ! Get selections for verification. ! !----------------------------------------------------------------------- ! ! READ(5,sndverif,ERR=100) ! WRITE(6,*)'sndopt = ',sndopt ! IF (sndopt == 1) THEN ! lenfil =256 ! CALL slength( sndlist, lenfil) ! WRITE(6,'(1x,a,a)') 'Sounding list file was ',sndlist(1:lenfil) ! END IF ! ! READ(5,proverif,ERR=100) ! WRITE(6,*)'proopt = ',proopt ! IF (proopt == 1) THEN ! lenfil =256 ! CALL slength( prolist, lenfil) ! WRITE(6,'(1x,a,a)') 'Sounding list file was ',prolist(1:lenfil) ! END IF ! ! READ(5,sfcverif,ERR=100) ! WRITE(6,*)'sfcopt = ',sfcopt ! IF (sfcopt == 1) THEN ! lenfil =256 ! CALL slength( sfclist, lenfil) ! WRITE(6,'(1x,a,a)') 'Surface ob list file was ', & ! sfclist(1:lenfil) ! END IF ! ! READ(5,sfcobsverif,ERR=100) ! WRITE(6,*)'sfcveropt = ',sfcveropt ! IF (sfcveropt == 1) THEN ! lenfil =256 ! CALL slength( sfcobslist, lenfil) ! WRITE(6,'(1x,a,a)') 'Surface obs verif list file was ', & ! sfcobslist(1:lenfil) ! END IF ! ! READ(5,precverif,ERR=100) ! WRITE(6,*)'precopt = ',precopt ! IF (precopt == 1) THEN ! lenfil =256 ! CALL slength(preclist, lenfil) ! WRITE(6,'(1x,a,a)') 'Surface ob list file was ', & ! preclist(1:lenfil) ! END IF ! ! READ(5,mosverif,ERR=100) ! WRITE(6,*)'mosopt = ',mosopt ! IF (mosopt == 1) THEN ! lenfil =256 ! CALL slength(moslist, lenfil) ! WRITE(6,'(1x,a,a)') 'Surface ob list file was ', & ! moslist(1:lenfil) ! END IF ! ! !----------------------------------------------------------------------- ! ! Loop through all history dumps ! !----------------------------------------------------------------------- ! grdbasfn = fgrdbasfn lengbf=256 CALL slength(grdbasfn,lengbf) grdbasfn(1:lengbf)=grdbasfn(1:lengbf) IF ( mp_opt > 0 .AND. readsplit <= 0 ) THEN WRITE(grdbasfn(lengbf+1:lengbf+5),'(a,i2.2,i2.2)') '_', & loc_x,loc_y lengbf = lengbf + 5 END IF DO nf = 1, nhisfile ! !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! filename=hisfile(nf) lenfil =256 CALL slength( hisfile(nf), lenfil) IF ( mp_opt > 0 .AND. readsplit <= 0 ) THEN WRITE(filename(lenfil+1:lenfil+5),'(a,i2.2,i2.2)') '_', & loc_x,loc_y lenfil = lenfil + 5 END IF IF ( myproc == 0 ) & WRITE(6,'(1x,a,a)') 'History file is ',filename(1:lenfil) CALL dtaread(nx,ny,nz,nzsoil,nstyps, & hinfmt,nchin,grdbasfn(1:lengbf),lengbf, & filename(1:lenfil),lenfil,time, & x,y,z,zp,zpsoil,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, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem1,tem2,tem3) DO j=1,ny DO i=1,nx hterain(i,j)=zp(i,j,2) END DO END DO ! !----------------------------------------------------------------------- ! ! ireturn = 0 for a successful read ! !----------------------------------------------------------------------- ! IF( ireturn == 0 ) THEN ! successful read ! !----------------------------------------------------------------------- ! ! Extract the sounding data at selected locations. ! !----------------------------------------------------------------------- ! needsndstns=.false. IF (sndopt == 1) needsndstns=.true. IF (needsndstns) THEN len1 =256 CALL slength( sndrunname, len1) snddmpfn=sndrunname(1:len1)//'.snd'// & filename(lenfil-5:lenfil) CALL snddump(nx,ny,nz, & uprt,vprt, & ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsoil(1,1,1,0), & snddmpfn,needsndstns, & xs,ys,xmap,ymap, & latgr,longr,tem1,tem4, & sndlist,snddomlist,time) END IF ! !----------------------------------------------------------------------- ! ! Extract the profiler data corresponding to the profiler network. ! (wind data at the *standard* levels) ! !----------------------------------------------------------------------- ! needprostns=.false. IF (proopt == 1) needprostns=.true. IF (needprostns) THEN len1 =256 CALL slength( prorunname, len1) prodmpfn=prorunname(1:len1)//'.pro'// & filename(lenfil-5:lenfil) CALL prodump(nx,ny,nz, & uprt,vprt, & ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsoil(1,1,1,0), & prodmpfn,needprostns, & xs,ys,xmap,ymap, & latgr,longr,tem1,tem4, & prolist,prodomlist,time) END IF ! !----------------------------------------------------------------------- ! ! Extract the surface data corresponding to the observations. ! !----------------------------------------------------------------------- ! CALL sfcdump(nx,ny,nz, & uprt,vprt, & ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsoil(1,1,1,0), & sfcdmpfn,needsfcstns,nhisfile,nf,time, & raing,rainc, & xs,ys,xmap,ymap, & latgr,longr,tem1, & sfclist,sfcobsdir,blackfile, & arpsnn_opt,model_data,obsrv_data) ! !----------------------------------------------------------------------- ! ! Extract the precipitation data corresponding to the ! observations. ! !----------------------------------------------------------------------- ! needprecstns=.false. IF (precveropt == 1) needprecstns=.true. IF (needprecstns) THEN len1 =256 CALL slength( precrunname, len1) precdmpfn=precrunname(1:len1)//'.prec'// & filename(lenfil-5:lenfil) CALL precdump(nx,ny,nz, & uprt,vprt, & ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsoil(1,1,1,0), & precdmpfn,needprecstns, & raing,rainc, & xs,ys,xmap,ymap, & latgr,longr,tem1, & preclist,precdomlist,time) END IF ! !----------------------------------------------------------------------- ! ! Extract model data for MOS. ! !----------------------------------------------------------------------- ! needmosstns=.false. IF (mosopt == 1) needmosstns=.true. IF (needmosstns) THEN len1 =256 CALL slength( mosrunname, len1) mosdmpfn=mosrunname(1:len1)//'.mos'// & filename(lenfil-5:lenfil) CALL mosdump(nx,ny,nz,nzsoil,nstyps,x,y,z,zp,hterain, & uprt,ubar,vprt,vbar,wprt,wbar, & ptprt,ptbar,pprt,pbar,qvprt,qvbar, & qc,qr,qi,qs,qh,tke,kmh,kmv,rhobar, & zpsoil,tsoil,qsoil,wetcanp, & snowdpth,soiltyp,stypfrct,vegtyp, & lai,roufns,veg,raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx, & qvsflx,mosdmpfn,needmosstns, & xs,ys,xmap,ymap,latgr,longr,tem1,tem4, & moslist,mosdomlist,time) END IF ELSE WRITE(6,'(a)') ' Error reading data. HIS2VER ends' STOP END IF ! !----------------------------------------------------------------------- ! ! Go to next history dump ! !----------------------------------------------------------------------- ! END DO RETURN ! !----------------------------------------------------------------------- ! ! Process error from namelist read attempt. ! !----------------------------------------------------------------------- ! 100 CONTINUE WRITE(6,*)'ERROR READING NAMELIST!!!' STOP END SUBROUTINE his2ver ! !################################################################# !################################################################# !###### ###### !###### SUBROUTINE SNDDUMP ###### !###### ###### !###### Copyright (c) 1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! SUBROUTINE snddump(nx,ny,nz, & 1,12 uprt,vprt,ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsfc, & dumpfile,needsndstns, & xs,ys,xmap,ymap, & latgr,longr,tem1,tem4, & sndlist,snddomlist,time) ! !---------------------------------------------------------------------- ! ! PURPOSE: ! ! Coordinate the verification sounding dumps, which are converted ! to GEMPAK format using a post-processor. ! !---------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! ! MODIFICATION HISTORY: ! ! 09/15/97 Major code revamping. Changed variable names and put ! station information arrays into a common block in order ! to avoid having to reread information with each new ! data dump (adds vericst.inc to the verification ! software). ! ! 19 May 2000: Eric Kemp ! File name for list of stations in the domain ! is now passed to the subroutine, along with ! time from initialization. Also, valid ! time and forecast domain info are now included ! in all output files. ! ! 23 Mar 2002: Nick Mirsky ! Added sounding data for mandatory pressure levels ! using simple linear interpolation scheme ! as in SUBROUTINE PRODUMP ! !----------------------------------------------------------------------- ! ! Variables to be read in: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions ! INTEGER :: nzsoil ! Number of soil layers ! LOGICAL :: needsndstns ! Create a stn list of stns in grid ! REAL :: uprt (nx,ny,nz) ! Perturbation u velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation wv mixing ration (kg/kg) ! REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) ! REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. ! REAL :: hterain(nx,ny) ! Terrain height. ! REAL :: roufns (nx,ny) ! Surface roughness ! REAL :: tsfc(nx,ny) ! Ground sfc. temperature (K) REAL :: time ! ! !----------------------------------------------------------------------- ! ! Computed variables ! !----------------------------------------------------------------------- ! REAL :: xs(nx) ! x location of scalar points REAL :: ys(ny) ! y location of scalar points ! !----------------------------------------------------------------------- ! ! Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs INTEGER :: nzmax PARAMETER (nzmax=250) ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: stheta(nzmax) REAL :: sqv(nzmax) REAL :: spres(nzmax) REAL :: stemp(nzmax) REAL :: sdewp(nzmax) REAL :: sdrct(nzmax) REAL :: ssped(nzmax) REAL :: shght(nzmax) REAL :: srain ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) REAL :: tem4(nx,ny) ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !----------------------------------------------------------------------- ! INTEGER :: istnm ! Station number of the sounding location INTEGER :: iselev_act ! Actual station elevation in integer format INTEGER :: i,j,k ! Index variables INTEGER :: ii,ij ! More index variables INTEGER :: ireturn ! Flag for stations outside of the domain ! CHARACTER (LEN=256) :: dumpfile ! Sounding data history dump file name CHARACTER (LEN=256) :: sndlist ! File to read the sounding locations from CHARACTER (LEN=256) :: line ! Temp variable to read lines from files CHARACTER (LEN=256) :: snddomlist INTEGER :: LEN ! !----------------------------------------------------------------------- ! ! Map projection variables ! !----------------------------------------------------------------------- ! REAL :: xctr,yctr REAL :: xll,yll REAL :: latnot(2) REAL :: xmap(nx) REAL :: ymap(ny) REAL :: latgr(nx,ny) REAL :: longr(nx,ny) ! !----------------------------------------------------------------------- ! ! Variables used in interpolation for mandatory levels ! !----------------------------------------------------------------------- ! REAL :: topwt,botwt,mandu,mandv REAL :: mandlev REAL :: mandhght,mandtemp,manddewp,manddir,mandspd ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' INCLUDE 'exbc.inc' INCLUDE 'vericst.inc' INCLUDE 'grid.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (nz > nzmax) THEN PRINT *,'Reset nzmax to greater than:',nz STOP END IF ! !----------------------------------------------------------------------- ! ! Calculate scalar locations and set up the map projection and ! grid parameters ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO dx=x(2)-x(1) dy=y(2)-y(1) ! latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr(mapproj,sclfct,latnot,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr) xll=xctr-(0.5*(nx-3)*dx) yll=yctr-(0.5*(ny-3)*dy) DO i=1,nx-1 xmap(i)=xll+xs(i) END DO xmap(nx)=2.*xmap(nx-1)-xmap(nx-2) DO j=1,ny-1 ymap(j)=yll+ys(j) END DO ymap(ny)=2.*ymap(ny-1)-ymap(ny-2) CALL xytoll(nx,ny,xmap,ymap,latgr,longr) ! !----------------------------------------------------------------------- ! ! Find location in ARPS grid of all the stations in sndlist, then ! rewrite only the ones that are in the grid to common arrays ! so as to not make the program read all of the stations from ! the original sounding stn list and check their locations with each ! history dump. ! !----------------------------------------------------------------------- ! OPEN(UNIT=1,FILE=sndlist,STATUS='old') ! OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown') ! ! LEN =256 ! CALL slength( dumpfile, LEN) ! WRITE(6,*) "Opening ",dumpfile(1:LEN)," for sounding output" 105 FORMAT(a8,a16,a20) ! IF (needsndstns) THEN ! needsndstns = .false. sndstn=0 ! LEN =80 CALL slength(sndlist,LEN) WRITE(6,*) 'Reading sounding stations from file: ', & sndlist(1:LEN) ! OPEN(UNIT=3,FILE=snddomlist,STATUS='unknown') WRITE(3,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) LEN =80 CALL slength(runname,LEN) WRITE(3,'(a)') runname(1:LEN) WRITE(3,'(i1.1)') nocmnt DO i = 1,nocmnt LEN =80 CALL slength(cmnt(i),LEN) WRITE(3,'(a)') cmnt(i)(1:LEN) END DO ! 110 FORMAT(a80) ! READ(1,110,END=30) line ! read header lines and discard them.. READ(1,110,END=30) line READ(1,110,END=30) line ! DO i=1,sndmax ! 115 FORMAT(a3,2X,f5.2,2X,f7.2,1X,i4) ! READ(1,110,END=30) line ! sndstn=sndstn+1 ! READ(line,115) sndstid(sndstn),sndlat(sndstn),sndlon(sndstn), & iselev_act istnm=0 ! Assumes a station number is unavailable sndelev_act(sndstn)=FLOAT(iselev_act) ! CALL lltoxy(1,1,sndlat(sndstn),sndlon(sndstn), & sndxpt(sndstn),sndypt(sndstn)) ! sndxpt(sndstn)=sndxpt(sndstn)-xll sndypt(sndstn)=sndypt(sndstn)-yll ! CALL findlc2(nx,ny,xs,ys,sndxpt(sndstn),sndypt(sndstn), & sndipt(sndstn),sndjpt(sndstn),ireturn) ! IF (ireturn < 0) THEN ! stn is outside the grid sndstn=sndstn-1 ELSE ! stn is inside the grid WRITE(3,110) line ! write location data to a file END IF ! END DO ! END IF ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column ! for each station, derive the sounding variables, and write the ! extracted sounding to dumpfile... ! !----------------------------------------------------------------------- ! 30 CONTINUE ! WRITE(2,990) year,'-',month,'-',day,'.',hour,':',minute,':', & ! second,'+',INT(time) ! 990 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) ! LEN =80 ! CALL slength(runname,LEN) ! WRITE(2,'(a)') runname(1:LEN) ! WRITE(2,'(i1.1)') nocmnt ! DO i = 1,nocmnt ! LEN =80 ! CALL slength(cmnt(i),LEN) ! WRITE(2,'(a)') cmnt(i)(1:LEN) ! END DO ! DO i=1,sndstn ! do for each station 'i' ... ! dumpfile = './snd_dumps/' LEN =256 CALL slength( dumpfile, LEN) WRITE(dumpfile(LEN+1:LEN+7),'(a7)') sndstid(i)(1:3)//'_snd' OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown',POSITION='append') WRITE(2,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) 990 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) DO ii=1,nx DO ij=1,ny tem4(ii,ij)=0. END DO END DO ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column. ! !----------------------------------------------------------------------- ! CALL colintb(nx,ny,nz,nzmax, & xs,ys,zp,sndxpt(i),sndypt(i),sndipt(i),sndjpt(i), & uprt, vprt, ptprt, pprt, qvprt, & ubar, vbar, ptbar, pbar, qvbar, & tem4,tem4,srain, & su,sv,stheta,spres,shght,sqv, & tem1,nlevs) ! !----------------------------------------------------------------------- ! ! Convert sounding to desired units/quantities (winds: m/s theta: K ! temp/dewp: C press: mb qv: kg/kg) ! !----------------------------------------------------------------------- ! CALL cnvsnd(su,sv,stheta,spres,sqv,sndlon(i), & sdrct,ssped,stemp,sdewp,nlevs) ! !----------------------------------------------------------------------- ! ! Write out soundings for the current model time.. ! !----------------------------------------------------------------------- ! WRITE(2,120) sndstid(i),(nlevs-2) 120 FORMAT(a4,3X,i2) ! WRITE(2,125) 125 FORMAT(6X, & 'PRES HGHT TMPC DWPC DRCT SPED') ! !----------------------------------------------------------------------- ! ! Perform a simple linear interpolation to retrieve data at the ! mandatory levels. This replaces the 1-d Barnes' analysis. The ! replacement was made for computational speed considerations (gets ! rid of the exponentials) and because the possible errors intro- ! duced through linear interpolation are likely small compared to ! the error of observations in sounding data. ! !----------------------------------------------------------------------- ! DO k=2,(nlevs-1) ! mandlev=0.0 IF (spres(k) > 1000.0 .AND. spres(k+1) < 1000.0) THEN mandlev=1000.0 ELSE IF (spres(k) > 925.0 .AND. spres(k+1) < 925.0) THEN mandlev=925 ELSE IF (spres(k) > 850.0 .AND. spres(k+1) < 850.0) THEN mandlev=850.0 ELSE IF (spres(k) > 700.0 .AND. spres(k+1) < 700.0) THEN mandlev=700.0 ELSE IF (spres(k) > 500.0 .AND. spres(k+1) < 500.0) THEN mandlev=500.0 ELSE IF (spres(k) > 400.0 .AND. spres(k+1) < 400.0) THEN mandlev=400.0 ELSE IF (spres(k) > 300.0 .AND. spres(k+1) < 300.0) THEN mandlev=300.0 ELSE IF (spres(k) > 250.0 .AND. spres(k+1) < 250.0) THEN mandlev=250.0 ELSE IF (spres(k) > 200.0 .AND. spres(k+1) < 200.0) THEN mandlev=200.0 ELSE IF (spres(k) > 150.0 .AND. spres(k+1) < 150.0) THEN mandlev=150.0 ELSE IF (spres(k) > 100.0 .AND. spres(k+1) < 100.0) THEN mandlev=100.0 ELSE IF (spres(k) > 70.0 .AND. spres(k+1) < 70.0) THEN mandlev=70.0 ELSE IF (spres(k) > 50.0 .AND. spres(k+1) < 50.0) THEN mandlev=50.0 ELSE IF (spres(k) > 10.0 .AND. spres(k+1) < 10.0) THEN mandlev=10.0 END IF ! IF (mandlev/=0) THEN ! topwt = (mandlev-spres(k))/(spres(k+1)-spres(k)) botwt = 1.0 - topwt ! mandhght = botwt*shght(k) + topwt*shght(k+1) mandtemp = botwt*stemp(k) + topwt*stemp(k+1) manddewp = botwt*sdewp(k) + topwt*sdewp(k+1) mandu = botwt*su(k) + topwt*su(k+1) mandv = botwt*sv(k) + topwt*sv(k+1) ! CALL get_ddff(mandu,mandv,manddir,mandspd) ! WRITE(2,130) spres(k),shght(k),stemp(k),sdewp(k), & sdrct(k),ssped(k) 130 FORMAT(1X,6(f9.2)) WRITE(2,131) mandlev,mandhght,mandtemp,manddewp, & manddir,mandspd 131 FORMAT(1X,6(f9.2)) ! ELSE ! WRITE(2,132) spres(k),shght(k),stemp(k),sdewp(k), & sdrct(k),ssped(k) 132 FORMAT(1X,6(f9.2)) ! END IF ! END DO ! CLOSE(2) ! END DO ! Move on to the next station.. ! CLOSE(1) ! CLOSE(2) CLOSE(3) ! RETURN ! END SUBROUTINE snddump ! ! !################################################################# !################################################################# !###### ###### !###### SUBROUTINE PRODUMP ###### !###### ###### !###### Copyright (c) 1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! SUBROUTINE prodump(nx,ny,nz, & 1,12 uprt,vprt,ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsfc, & dumpfile,needprostns, & xs,ys,xmap,ymap, & latgr,longr,tem1,tem4, & proflist,profdomlist,time) ! !---------------------------------------------------------------------- ! ! PURPOSE: ! ! Coordinate the verification profiler dumps. ! !---------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! ! MODIFICATION HISTORY: ! ! 09/15/97 Major code revamping. Changed variable names and put ! station information arrays into a common block in order ! to avoid having to reread information with each new ! data dump (adds vericst.inc to the verification ! software). ! ! 09/15/97 Removed the Barnes' analysis of winds to the standard ! levels and replaced it with a much simpler (but also ! much quicker) linear interpolation. ! ! 09/15/97 Changed subroutine name from PROFDUMP to PRODUMP in ! order to bring the subroutine name into a consistent ! format (to go with SNDDUMP and SFCDUMP) ! ! 19 May 2000: Eric Kemp ! File name for list of stations in the domain ! is now passed to the subroutine, along with ! time from initialization. Also, valid ! time and forecast domain info are now included ! in all output files. ! !----------------------------------------------------------------------- ! ! Variables to be read in: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' INCLUDE 'exbc.inc' INCLUDE 'vericst.inc' INCLUDE 'grid.inc' ! ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions ! INTEGER :: nzsoil ! LOGICAL :: needprostns ! Need to look up profiler information? ! REAL :: uprt (nx,ny,nz) ! Perturbation u velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation wv mixing ration (kg/kg) ! REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) ! REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. ! REAL :: hterain(nx,ny) ! Terrain height. ! REAL :: roufns (nx,ny) ! Surface roughness ! REAL :: tsfc(nx,ny) ! Ground sfc. temperature (K) REAL :: time ! ! !----------------------------------------------------------------------- ! ! Computed variables ! !----------------------------------------------------------------------- ! REAL :: xs(nx) ! x location of scalar points REAL :: ys(ny) ! y location of scalar points ! !----------------------------------------------------------------------- ! ! Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs INTEGER :: nzmax PARAMETER (nzmax=250) ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: stheta(nzmax) REAL :: sqv(nzmax) REAL :: spres(nzmax) REAL :: stemp(nzmax) REAL :: sdewp(nzmax) REAL :: sdrct(nzmax) REAL :: ssped(nzmax) REAL :: shght(nzmax) REAL :: srain ! !----------------------------------------------------------------------- ! ! Inserted for prodump routine ! !----------------------------------------------------------------------- ! INTEGER :: stdlevs ! Number of standard levels PARAMETER (stdlevs=30) ! REAL :: deltaz ! Meters between standard levels PARAMETER (deltaz=500.) ! REAL :: stdlev(stdlevs) ! Chosen standard levels (meters AGL) REAL :: stddir(stdlevs) ! Wind direction at std levels REAL :: stdspd(stdlevs) ! Wind speed at std levels (m/s) REAL :: stdu(stdlevs) ! U-component at std levels (m/s) REAL :: stdv(stdlevs) ! V-component at std levels (m/s) ! !----------------------------------------------------------------------- ! ! Variables used in estimating winds at the standard levels ! model's winds ! !----------------------------------------------------------------------- ! REAL :: topwt,botwt ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) REAL :: tem4(nx,ny) ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !----------------------------------------------------------------------- ! INTEGER :: istnm ! Station number of the sounding location INTEGER :: iselev_act ! Actual station elevation in integer format INTEGER :: i,j ! Index variables INTEGER :: ii,ij ! More index variables INTEGER :: ireturn ! Return status for whether stn is in the grid INTEGER :: LEN ! CHARACTER (LEN=256) :: dumpfile ! Profiler data history dump file name CHARACTER (LEN=256) :: proflist ! File to read the profiler locations from CHARACTER (LEN=256) :: line ! Temporary variable to read lines from files CHARACTER (LEN=256) :: profdomlist ! REAL :: selev_mod ! Model estimate of station elevation ! !----------------------------------------------------------------------- ! ! Map projection variables ! !----------------------------------------------------------------------- ! REAL :: xctr,yctr REAL :: xll,yll REAL :: latnot(2) REAL :: xmap(nx) REAL :: ymap(ny) REAL :: latgr(nx,ny) REAL :: longr(nx,ny) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (nz > nzmax) THEN PRINT *,'Reset nzmax to greater than:',nz STOP END IF ! !----------------------------------------------------------------------- ! ! Calculate scalar locations and set up the map projection and ! grid parameters ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO dx=x(2)-x(1) dy=y(2)-y(1) ! latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr(mapproj,sclfct,latnot,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr) xll=xctr-(0.5*(nx-3)*dx) yll=yctr-(0.5*(ny-3)*dy) DO i=1,nx-1 xmap(i)=xll+xs(i) END DO xmap(nx)=2.*xmap(nx-1)-xmap(nx-2) DO j=1,ny-1 ymap(j)=yll+ys(j) END DO ymap(ny)=2.*ymap(ny-1)-ymap(ny-2) CALL xytoll(nx,ny,xmap,ymap,latgr,longr) ! !----------------------------------------------------------------------- ! ! Find location in ARPS grid of all the stations in proflist, then ! rewrite only the ones that are in the grid to common arrays ! so as to not make the program read all of the stations from ! the original profiler stn list and check their locations with each ! history dump. ! !----------------------------------------------------------------------- ! OPEN(UNIT=1,FILE=proflist,STATUS='old') ! OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown') ! ! LEN =256 ! CALL slength( dumpfile, LEN) ! WRITE(6,*) "Opening ",dumpfile(1:LEN)," for profiler output" 105 FORMAT(a8,a16,a20) ! IF (needprostns) THEN ! needprostns=.false. prostn=0 ! LEN =80 CALL slength(proflist,LEN) WRITE(6,*) 'Reading profiler stations from file: ', & proflist(1:LEN) ! ! open(unit=3,file='prostns.out',status='unknown') OPEN(UNIT=3,FILE=profdomlist,STATUS='unknown') WRITE(3,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) LEN =80 CALL slength(runname,LEN) WRITE(3,'(a)') runname(1:LEN) WRITE(3,'(i1.1)') nocmnt DO i = 1,nocmnt LEN =80 CALL slength(cmnt(i),LEN) WRITE(3,'(a)') cmnt(i)(1:LEN) END DO ! 110 FORMAT(a80) ! READ(1,110,END=30) line ! read header lines and discard them.. READ(1,110,END=30) line READ(1,110,END=30) line ! DO i=1,promax ! 115 FORMAT(a3,1X,f6.2,1X,f7.2,1X,i4) ! READ(1,110,END=30) line ! prostn=prostn+1 ! READ(line,115) prostid(prostn),prolat(prostn), & prolon(prostn),iselev_act istnm=0 proelev_act(prostn)=FLOAT(iselev_act) ! CALL lltoxy(1,1,prolat(prostn),prolon(prostn), & proxpt(prostn),proypt(prostn)) ! proxpt(prostn)=proxpt(prostn)-xll proypt(prostn)=proypt(prostn)-yll ! CALL findlc2(nx,ny,xs,ys,proxpt(prostn),proypt(prostn), & proipt(prostn),projpt(prostn),ireturn) ! IF (ireturn < 0) THEN ! stn is outside the grid prostn=prostn-1 ELSE ! stn is within the grid WRITE(3,110) line END IF ! END DO ! END IF ! 30 CONTINUE ! !----------------------------------------------------------------------- ! ! Use the sounding extraction subroutine and linear interpolation ! to extract winds at standard levels (standard levels used in ! comparing with observed data) ! !----------------------------------------------------------------------- ! ! WRITE(2,990) year,'-',month,'-',day,'.',hour,':',minute,':', & ! second,'+',INT(time) ! 990 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) ! ! LEN =80 ! CALL slength(runname,LEN) ! WRITE(2,'(a)') runname(1:LEN) ! WRITE(2,'(i1.1)') nocmnt ! DO i = 1,nocmnt ! LEN =80 ! CALL slength(cmnt(i),LEN) ! WRITE(2,'(a)') cmnt(i)(1:LEN) ! END DO DO i=1,prostn ! do for each station 'i' ! dumpfile = './pro_dumps/' LEN =256 CALL slength( dumpfile, LEN) WRITE(dumpfile(LEN+1:LEN+7),'(a4)') sndstid(i)//'_pro' OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown',POSITION='append') WRITE(2,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) 990 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) DO ii=1,nx DO ij=1,ny tem4(ii,ij)=0. END DO END DO ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column. ! !----------------------------------------------------------------------- ! CALL colintb(nx,ny,nz,nzmax, & xs,ys,zp,proxpt(i),proypt(i),proipt(i),projpt(i), & uprt, vprt, ptprt, pprt, qvprt, & ubar, vbar, ptbar, pbar, qvbar, & tem4,tem4,srain, & su,sv,stheta,spres,shght,sqv, & tem1,nlevs) ! !----------------------------------------------------------------------- ! ! Convert sounding to desired units/quantities (winds: m/s theta: K ! temp/dewp: C press: mb qv: kg/kg) ! !----------------------------------------------------------------------- ! CALL cnvsnd(su,sv,stheta,spres,sqv,prolon(i), & sdrct,ssped,stemp,sdewp,nlevs) ! !----------------------------------------------------------------------- ! ! Write header output for each station ! !----------------------------------------------------------------------- ! selev_mod=(shght(1)+shght(2))/2. ! WRITE(2,120) prostid(i),selev_mod,prolat(i),prolon(i),'Model' 120 FORMAT(2X,a3,3X,f5.0,3X,f5.2,3X,f7.2,3X,a8) ! DO ii=1,stdlevs ! set up heights of the std profiler data levels stdlev(ii) = ii*deltaz + selev_mod END DO ! !----------------------------------------------------------------------- ! ! Perform a simple linear interpolation to retrieve winds at the ! 'standard' levels. This replaces the 1-d Barnes' analysis. The ! replacement was made for computational speed considerations (gets ! rid of the exponentials) and because the possible errors intro- ! duced through linear interpolation are likely small compared to ! the error of observation in profiler data. ! !----------------------------------------------------------------------- ! DO ii=1,stdlevs,1 ! DO ij=1,nlevs ! IF (stdlev(ii) > shght(ij-1) .AND. stdlev(ii) <= shght(ij)) THEN ! topwt = (stdlev(ii)-shght(ij-1))/(shght(ij)-shght(ij-1)) botwt = 1.0 - topwt ! stdu(ii) = botwt*su(ij-1) + topwt*su(ij) stdv(ii) = botwt*sv(ij-1) + topwt*sv(ij) ! CALL get_ddff(stdu(ii),stdv(ii),stddir(ii),stdspd(ii)) ! END IF ! END DO ! END DO ! DO ii=1,stdlevs WRITE(2,125) (stdlev(ii)-selev_mod),stddir(ii), & stdspd(ii) 125 FORMAT(5X,f6.0,5X,f4.0,5X,f5.1) END DO ! CLOSE(2) ! END DO ! on to the next profiler station ... ! CLOSE(1) ! CLOSE(2) CLOSE(3) ! RETURN ! END SUBROUTINE prodump ! ! !################################################################# !################################################################# !###### ###### !###### SUBROUTINE GET_DDFF ###### !###### ###### !###### Copyright (c) 1995-1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! SUBROUTINE get_ddff(u,v,dd,ff) 4 ! !---------------------------------------------------------------------- ! ! PURPOSE: ! ! Convert u and v winds into direction and speed. ! !---------------------------------------------------------------------- ! IMPLICIT NONE ! REAL :: dd,ff,u,v,rad2d,spval,mis_val ! PARAMETER (rad2d=57.29577951, spval=9999., & mis_val=99999.0) ! IF(u < spval .AND. v < spval) THEN ff = SQRT((u*u + v*v)) IF(ff /= 0.) THEN dd = rad2d*ATAN2(u,v) dd = dd+180. IF (dd > 360.) dd=dd-360. ELSE dd=0. END IF ELSE dd = mis_val ff = mis_val END IF ! RETURN ! END SUBROUTINE get_ddff ! ! !################################################################# !################################################################# !###### ###### !###### SUBROUTINE SFCDUMP ###### !###### ###### !###### Copyright (c) 1995-1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! SUBROUTINE sfcdump(nx,ny,nz, & 1,26 uprt,vprt,ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsfc, & dumpfile,needsfcstns,nhisfile,nf,time, & raing,rainc, & xs,ys,xmap,ymap, & latgr,longr,tem1, & sfclist,sfcobsdir,blackfile, & arpsnn_opt,model_data,obsrv_data) ! !---------------------------------------------------------------------- ! ! PURPOSE: ! ! Coordinate the verification surface dumps, which are converted ! from files arranged by time to files arranged by station by a ! post processor. ! !---------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! ! MODIFICATION HISTORY: ! ! 09/15/97 Changed subroutine name from MESODUMP to SFCDUMP in ! order to bring the subroutine name into a consistent ! format (to go with SNDDUMP and PRODUMP). ! ! 09/16/97 Major code revamping. Changed variable names and put ! station information arrays into a common block in order ! to avoid having to reread information with each new ! data dump (adds vericst.inc to the verification ! software). ! ! 19 May 2000: Eric Kemp ! File name for list of stations in the domain ! is now passed to the subroutine, along with ! time from initialization. Also, valid ! time and forecast domain info are now included ! in all output files. ! ! 08 Apr 2002: Jason Levit ! Modifications to automatically find SAO files, ! plus some changes to the input and output ! for addition to the arpsverif package. ! !----------------------------------------------------------------------- ! ! Variables to be read in: ! !----------------------------------------------------------------------- ! IMPLICIT NONE !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' INCLUDE 'exbc.inc' INCLUDE 'vericst.inc' INCLUDE 'grid.inc' INCLUDE 'adas.inc' INCLUDE 'mp.inc' ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions ! INTEGER :: nzsoil ! LOGICAL :: needsfcstns ! Whether not need to create station file ! REAL :: uprt (nx,ny,nz) ! Perturbation u velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation wv mixing ration (kg/kg) ! REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) ! REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. ! REAL :: hterain(nx,ny) ! Terrain height. ! REAL :: roufns (nx,ny) ! Surface roughness ! REAL :: tsfc(nx,ny) ! Ground sfc. temperature (K) ! REAL :: raing(nx,ny) ! Grid supersaturation rain (mm) REAL :: rainc(nx,ny) ! Cumulus convective rain (mm) REAL :: time INTEGER :: arpsnn_opt ! !----------------------------------------------------------------------- ! ! Computed variables ! !----------------------------------------------------------------------- ! REAL :: xs(nx) ! x location of scalar points REAL :: ys(ny) ! y location of scalar points ! !----------------------------------------------------------------------- ! ! Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs INTEGER :: nzmax PARAMETER (nzmax=250) ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: stheta(nzmax) REAL :: sqv(nzmax) REAL :: spres(nzmax) REAL :: stemp(nzmax) REAL :: sdewp(nzmax) REAL :: sdrct(nzmax) REAL :: ssped(nzmax) REAL :: shght(nzmax) REAL :: srain ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !------------------------------------------------------------------------ ! INTEGER :: islat ! Integer latitude of the sfc station INTEGER :: islon ! Integer longitude of the sfc station INTEGER :: istnm ! Station number of the sfc station INTEGER :: iselev_act ! Actual station elevation in integer format INTEGER :: i,j,k ! Index variables INTEGER :: ireturn ! Return status for whether stn is in the grid INTEGER :: LEN ! CHARACTER (LEN=256) :: dumpfile ! Sounding data history dump file name CHARACTER (LEN=256) :: sfclist ! File to read the sfc station locations from CHARACTER (LEN=256) :: line ! Temporary variable to read lines from files CHARACTER (LEN=256) :: sfcdomlist CHARACTER (LEN=256) :: sfcobsdir REAL :: press,presl ! Pressures at sfc and level 2 REAL :: hts,htl ! Heights of sfc and level 2 REAL :: hto ! Observational height REAL :: temps,templ ! Temperatures at ground skin and level 2 REAL :: dewps,dewpl ! Dew points at sfc and level 2 REAL :: dirs,dirl ! Wind direction at sfc and level 2 REAL :: spds,spdl ! Wind speeds at sfc and level 2 REAL :: rough ! Sfc roughness length REAL :: zeta ! Monin-Obhuhov stability parameter REAL :: mixlength ! Mixing length (constant in sfc. layer) REAL :: fricvel ! Friction velocity REAL :: thetastar ! Monin-Obhukov parameter REAL :: lapse ! Low-level lapse rate ! INTEGER :: arps_drct ! Estimated sfc wind direction REAL :: arps_spd ! Estimated wind speed at 10 meters (m/s) REAL :: arps_temp ! Estimated temperature at 2 meters (C) REAL :: arps_dewp ! Estimated sfc dewpoint temperature (C) REAL :: arps_pres ! Estimated sfc pressure (mb) REAL :: arps_theta ! Estimated potential temp near 2 m (C) REAL :: arps_rain ! Estimated precipitation (mm) INTEGER :: nhisfile REAL :: model_data(sfcmax,nhisfile,5) ! Array of model obs REAL :: obsrv_data(sfcmax,nhisfile,5) ! Array of real obs !---------------------------------------------------------------------- ! ! Caren's NN variables ! !---------------------------------------------------------------------- REAL :: nn_input(2) ! input for Caren's NN REAL :: nn_output ! Caren's NN-corrected temp (C) CHARACTER (LEN=40) :: nn_loc LOGICAL :: is_there !----------------------------------------------------------------------- ! ! SAO obs. variables ! !----------------------------------------------------------------------- ! REAL :: ob_lat,ob_lon,ob_elev REAL :: ob_t,ob_td REAL :: ob_dd,ob_ff REAL :: ob_ddg,ob_ffg REAL :: ob_pstn,ob_pmsl,ob_alt REAL :: ob_ceil,ob_lowcld,ob_cover REAL :: ob_vis,ob_rad,badflag CHARACTER (LEN=8) :: obstype CHARACTER (LEN=8) :: ob_wx CHARACTER (LEN=24) :: atime CHARACTER (LEN=5) :: ob_stn CHARACTER (LEN=256) :: obs_file CHARACTER (LEN=256) :: obsinputfl CHARACTER (LEN=8) :: ob_type REAL :: the_year INTEGER :: ob_kloud,ob_idp3 INTEGER :: ob_time INTEGER :: valid_hour, valid_day, valid_month, valid_year INTEGER :: days_fwd INTEGER :: febr, next_day, month_day INTEGER :: the_int INTEGER :: ios,ii CHARACTER (LEN=4) :: year_ch CHARACTER (LEN=2) :: day_ch, hour_ch, month_ch, min_ch CHARACTER (LEN=100) :: the_line CHARACTER (LEN=100) :: the_char CHARACTER (LEN=14) :: arpsvarid CHARACTER (LEN=24) :: arpsname CHARACTER (LEN=13) :: obsvarid CHARACTER (LEN=25) :: obsname CHARACTER (LEN=256) :: hdfname CHARACTER (LEN=256) :: blackfile INTEGER :: sdirnam INTEGER :: lfnam INTEGER :: iyr,imon,idy,ihr,imin,isec,abstsec INTEGER :: filetime INTEGER :: sd_id INTEGER :: istat INTEGER :: nf REAL :: ddrot INTEGER :: n_meso_g, & n_meso_pos,n_sao_g,n_sao_pos_g,n_sao_b,n_sao_pos_b,n_obs_g, & n_obs_pos_g,n_obs_b,n_obs_pos_b INTEGER :: nxt,iob,ivar,istatus REAL :: latsta(mx_sng,ntime),lonsta(mx_sng,ntime) REAL :: elevsta(mx_sng,ntime) REAL :: store_hgt(mx_sng,5,ntime) REAL :: obsrd(mx_sng,nvar_sng,ntime) CHARACTER (LEN=5) :: stn(mx_sng,ntime) CHARACTER (LEN=8) :: wx(mx_sng,ntime) CHARACTER (LEN=1) :: store_emv(mx_sng,5,ntime) CHARACTER (LEN=4) :: store_amt(mx_sng,5,ntime) INTEGER :: kloud(mx_sng,ntime),idp3(mx_sng,ntime) CHARACTER (LEN=8) :: chsrc(mx_sng,ntime) INTEGER :: obstime(mx_sng,ntime) integer :: keep integer :: nsfc REAL,EXTERNAL :: stprtopmsl ! !----------------------------------------------------------------------- ! ! Map projection variables ! !----------------------------------------------------------------------- ! REAL :: xctr,yctr REAL :: xll,yll REAL :: latnot(2) REAL :: xmap(nx) REAL :: ymap(ny) REAL :: latgr(nx,ny) REAL :: longr(nx,ny) INTEGER :: nxlg, nylg ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (nz > nzmax) THEN PRINT *,'Reset nzmax to greater than:',nz STOP END IF ! !----------------------------------------------------------------------- ! ! Calculate scalar locations and set up the map projection and ! grid parameters ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO dx=x(2)-x(1) dy=y(2)-y(1) ! latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr(mapproj,sclfct,latnot,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr) ! xll=xctr-(0.5*(nx-3)*dx) ! yll=yctr-(0.5*(ny-3)*dy) nxlg = (nx-3)*nproc_x+3 nylg = (ny-3)*nproc_y+3 xll=xctr-(0.5*(nxlg-3)*dx) yll=yctr-(0.5*(nylg-3)*dy) DO i=1,nx-1 xmap(i)=xll+xs(i) END DO xmap(nx)=2.*xmap(nx-1)-xmap(nx-2) DO j=1,ny-1 ymap(j)=yll+ys(j) END DO ymap(ny)=2.*ymap(ny-1)-ymap(ny-2) CALL xytoll(nx,ny,xmap,ymap,latgr,longr) ! !----------------------------------------------------------------------- ! ! Find location in ARPS grid of all the stations in sfclist, then ! rewrite only the ones that are in the grid to common arrays ! so as to not make the program read all of the stations from ! the original surface stn list and check their locations with each ! history dump. ! !----------------------------------------------------------------------- ! IF (readstns .eqv. .false. ) THEN IF (myproc == 0) THEN OPEN(UNIT=1,FILE=sfclist,STATUS='old') LEN =80 CALL slength(sfclist,LEN) WRITE(6,*) 'Reading surface stations from file: ', & sfclist(1:LEN) READ(1,110,END=30) line ! read header lines and discard them.. 110 FORMAT(a80) 115 FORMAT(a3,3X,f5.2,2X,f7.2,1X,i4) DO sfcstn=1,sfcmax READ(1,110,END=30) line READ(line,115) sfcstid(sfcstn),sfclat(sfcstn),sfclon(sfcstn),iselev_act sfcelev_act(sfcstn)=iselev_act/1. END DO 30 CONTINUE CLOSE(1) nsfc = sfcstn - 1 END IF CALL mpupdatei(nsfc,1) CALL mpupdatec(sfcstid,4*nsfc) CALL mpupdater(sfclat,nsfc) CALL mpupdater(sfclon,nsfc) CALL mpupdater(sfcelev_act,nsfc) istnm=0 ! Assumes a station number is unavailable sfcstn = 0 sfcstn_master = 0 DO i=1,nsfc sfcstn=sfcstn+1 ! If we have a user list, use it! keep = 1 if ( nsfcuse .ne. 0 ) then keep = 0 DO k=1,nsfcuse if ( sfcstid(i) == sfcuse(k) ) keep = 1 end do endif if ( keep == 0 ) then sfcstn = sfcstn -1 cycle ! this is a silly statement. I prefer GOTOs! endif sfcstid(sfcstn) = sfcstid(i) sfclat(sfcstn) = sfclat(i) sfclon(sfcstn) = sfclon(i) sfcelev_act(sfcstn) = sfcelev_act(i) IF ( myproc == 0 .AND. keep == 1) THEN sfcstn_master = sfcstn_master + 1 ! WRITE(6,*) 'sfcstn_master now ',sfcstn_master sfcstid_master(sfcstn_master) = sfcstid(i) END IF CALL lltoxy(1,1,sfclat(sfcstn),sfclon(sfcstn), & sfcxpt(sfcstn),sfcypt(sfcstn)) sfcxpt(sfcstn)=sfcxpt(sfcstn)-xll sfcypt(sfcstn)=sfcypt(sfcstn)-yll CALL findlc2(nx,ny,xs,ys,sfcxpt(sfcstn),sfcypt(sfcstn), & sfcipt(sfcstn),sfcjpt(sfcstn),ireturn) IF (ireturn < 0) THEN ! stn is outside the grid sfcstn=sfcstn-1 ELSE ! stn is inside the grid ! Tell the user what we know IF (mp_opt == 0) THEN WRITE(6,*) 'Station ',sfcstid(sfcstn) ELSE WRITE(6,*) 'Station ',sfcstid(sfcstn),' handled by processor ',myproc ENDIF END IF END DO END IF ! !----------------------------------------------------------------------- ! ! Use Monin-Obhukov theory to estimate the surface layer profiles ! of wind and temperature in order to get estimates of the model's ! values that should correspond to those observations taken by the ! mesonet. If sufficient vertical resolution is available (i.e. ! model levels surround the observation heights), perform a simpler ! interpolation to get values of the variables. ! !----------------------------------------------------------------------- ! readstns=.true. DO i=1,sfcstn ! do for each station 'i' ... ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column. ! !----------------------------------------------------------------------- ! CALL colintb(nx,ny,nz,nzmax, & xs,ys,zp,sfcxpt(i),sfcypt(i),sfcipt(i),sfcjpt(i), & uprt, vprt, ptprt, pprt, qvprt, & ubar, vbar, ptbar, pbar, qvbar, & raing,rainc,srain, & su,sv,stheta,spres,shght,sqv, & tem1,nlevs) ! !----------------------------------------------------------------------- ! ! Convert sounding to desired units/quantities (winds: m/s theta: K ! !----------------------------------------------------------------------- ! CALL cnvsnd(su,sv,stheta,spres,sqv,sfclon(i), & sdrct,ssped,stemp,sdewp,nlevs) ! !----------------------------------------------------------------------- ! ! Solve for the temperature and wind at observation levels using ! Monin-Obukhov similarity theory. Recall that levels 1 & 2 ! mirror around the surface. ! !----------------------------------------------------------------------- ! press=EXP((LOG(spres(1))+LOG(spres(2)))/2.) presl=spres(2) hts=(shght(1)+shght(2))/2. htl=shght(2)-hts ! change heights to heights above the sfc hts=0.0 ! reset the height of the sfc to 0 temps=tsfc(sfcipt(i),sfcjpt(i))-273.16 templ=stemp(2) dewps=sdewp(2) ! assume sfc dewpoint = dewpoint(level 2) dewpl=sdewp(2) dirs=(sdrct(1)+sdrct(2))/2. dirl=sdrct(2) spds=0. ! no-slip condition spdl=ssped(2) ! !----------------------------------------------------------------------- ! ! Get the value of zeta (the M-O stability parameter: zeta=z/L) ! using the equations from Byun, 1990. ! !----------------------------------------------------------------------- ! rough=roufns(sfcipt(i),sfcjpt(i)) CALL mosolns(press,hts,temps,dewps,dirs,spds, & presl,htl,templ,dewpl,dirl,spdl,rough,zeta) ! !----------------------------------------------------------------------- ! ! Solve for the M-O mixing length which in M-O theory ! remains constant within the surface layer. Recall ! zeta=z/L where the z used is here set to be 1/2 of the ! height htl (i.e. where the finite difference between ! hts(=0.0) and htl should be most valid). L is equivalent ! to mixlength. ! !----------------------------------------------------------------------- ! mixlength=htl/(zeta*2.0) ! !---------------------------------------------------------------------- ! ! Solve for the friction velocity and theta* in Byun, 1990 ! !---------------------------------------------------------------------- ! CALL ustar_thstar(zeta,spdl,htl,rough,templ,temps, & presl,press,fricvel,thetastar) ! !---------------------------------------------------------------------- ! ! Interpolate the ARPS temps to 2 meters above the model ! terrain and the winds to 10 meters above the model terrain. ! Makes no correction (yet) for the differences between the ! model terrain height and the actual station elevation. If ! sufficient vertical resolution is present, perform a simpler ! linear interpolation to get temps and winds. Set the dewpoint ! at the observation level in the model to that at the surface, ! which is taken to be the average of that at levels 1 & 2. Set ! the wind direction at the observational level to that at the ! lowest model level. (Either of these could be changed to ! more accurate methods in the future.) ! !---------------------------------------------------------------------- ! lapse=-(templ-temps)/(htl-hts) CALL arps2obs(fricvel,thetastar,temps,press,presl,hts,htl, & mixlength,lapse,rough,arps_spd,arps_temp) IF (dewps > arps_temp) THEN arps_dewp=arps_temp ELSE arps_dewp=dewps END IF arps_drct=nint(sdrct(2)) arps_pres=press arps_rain=srain arps_theta=(arps_temp+273.16)*(1000./arps_pres)**0.286 - 273.16 IF ((htl-hts) < 2.) THEN hto=hts+2. DO j=1,nlevs IF (shght(j) < hto .AND. shght(j+1) >= hto) THEN arps_temp=(hto-shght(j))/(shght(j+1)-shght(j)) * & (stemp(j+1)-stemp(j)) + stemp(j) END IF END DO END IF IF ((htl-hts) < 10.) THEN hto=hts+10. DO j=1,nlevs IF (shght(j) < hto .AND. shght(j+1) >= hto) THEN arps_spd=(hto-shght(j))/(shght(j+1)-shght(j)) * & (ssped(j+1)-ssped(j)) + ssped(j) arps_drct=sdrct(j) END IF END DO END IF hts=(shght(1)+shght(2))/2. ! !--------------------------------------------------------------------- ! ! MAKE A CALL TO CAREN'S NN FOR TEMP. CORRECTION ! !--------------------------------------------------------------------- ! ! nn_input(1) = the forecast time in hours after init time ! IMPORTANT: NN_INPUT(1) is assuming that the model run is 12Z!!! ! nn_input(2) = the arps forecast temp. ! first check to see if NN exists for the station... IF (arpsnn_opt.eq.1) THEN nn_loc = '/home/nmirsky/arpsverif/src_h2v/wts_K' WRITE(nn_loc(38:40),'(a3)') sfcstid(i)(1:3) INQUIRE(FILE=nn_loc, EXIST=is_there) IF (is_there) THEN nn_input(1) = (INT(time)/3600.0) + 6.0 nn_input(2) = arps_temp CALL arps_nn('K'//sfcstid(i)(1:3),nn_input, nn_output) nn_output = (anint(nn_output*10.0))/10.0 ELSE nn_output = -999.0 END IF END IF !-------------------------------------------------------------------- ! ! Set up the default values if surf observatiopns are not used for ! verification. ! !-------------------------------------------------------------------- ob_t = -999.0 ob_td = -999.0 ob_dd = -99 ob_ff = -999.0 ob_ddg = -999.0 ob_ffg = -999.0 ob_pstn = -999.0 ob_pmsl = -999.0 ob_alt = -999.0 ob_kloud = -99 ob_ceil = -999.0 ob_lowcld = -999.0 ob_cover = -999.0 ob_vis = -999.0 ob_rad = -999.0 ob_idp3 = -999 ! ! Convert the calculated ARPS observation values and place into the ! model_data array. ! model_data(i,nf,1)=(arps_temp*(9./5.))+32.0 model_data(i,nf,2)=(arps_dewp*(9./5.))+32.0 model_data(i,nf,3)=arps_drct model_data(i,nf,4)=arps_spd model_data(i,nf,5)=stprtopmsl(arps_pres,(arps_temp+273.16), & sfcelev_act(i)) END DO IF (myproc == 0) THEN ! ! Read the surface observations and place into the obsrv_data array ! for future processing. ! The SAO data is read in using the read_surface_obs subroutine in ! ADAS, so the SAO data format needs to be in the standard LAPS ! format used by ADAS. ! CALL ctim2abss(year,month,day,hour,minute,second,abstsec) filetime=abstsec+int(time) CALL abss2ctim(filetime,iyr,imon,idy,ihr,imin,isec) WRITE (year_ch, 50) iyr WRITE (month_ch, 55) imon WRITE (day_ch, 55) idy WRITE (hour_ch, 55) ihr WRITE (min_ch, 55) imin 50 FORMAT (i4.4) 55 FORMAT (i2.2) WRITE(obs_file, 60) year_ch,month_ch,day_ch,hour_ch,min_ch 60 FORMAT("sao",a4,a2,a2,a2,a2,".lso") sdirnam=LEN_TRIM(sfcobsdir) lfnam=LEN_TRIM(obs_file) obsinputfl=sfcobsdir(1:sdirnam)//obs_file(1:lfnam) nxt=1 CALL read_surface_obs(obsinputfl,blackfile,mx_sng,nxt,atime,n_meso_g, & n_meso_pos,n_sao_g,n_sao_pos_g,n_sao_b,n_sao_pos_b,n_obs_g, & n_obs_pos_g,n_obs_b,n_obs_pos_b,stn(1,1),chsrc(1,1), & latsta(1,1),lonsta(1,1),elevsta(1,1),wx(1,1), & obsrd(1,1,1),obsrd(1,2,1),obsrd(1,3,1),obsrd(1,4,1), & obsrd(1,5,1),obsrd(1,6,1),obsrd(1,7,1),obsrd(1,8,1), & obsrd(1,9,1), kloud(1,1),obsrd(1,10,1),obsrd(1,11,1), & obsrd(1,12,1),obsrd(1,13,1),idp3(1,1),store_emv(1,1,1), & store_amt(1,1,1),store_hgt(1,1,1),obsrd(1,14,1), & obstime(1,1),istatus) END IF CALL mpupdatei(n_obs_b,1) CALL mpupdatec(stn(1,1),5*n_obs_b) CALL mpupdater(obsrd(1,1,1),n_obs_b) CALL mpupdater(obsrd(1,2,1),n_obs_b) CALL mpupdater(obsrd(1,3,1),n_obs_b) CALL mpupdater(obsrd(1,4,1),n_obs_b) CALL mpupdater(obsrd(1,8,1),n_obs_b) DO j=1,sfcstn DO k=1,n_obs_b IF (sfcstid(j) == stn(k,1)) THEN obsrv_data(j,nf,1)=obsrd(k,1,1) obsrv_data(j,nf,2)=obsrd(k,2,1) obsrv_data(j,nf,3)=obsrd(k,3,1) obsrv_data(j,nf,4)=obsrd(k,4,1) obsrv_data(j,nf,5)=obsrd(k,8,1) END IF END DO END DO RETURN ! END SUBROUTINE sfcdump ! ! !################################################################# !################################################################# !###### ###### !###### SUBROUTINE PRECDUMP ###### !###### ###### !###### Copyright (c) 1995-1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! SUBROUTINE precdump(nx,ny,nz, & 1,12 uprt,vprt,ptprt,pprt,qvprt, & ubar,vbar,ptbar, & pbar,rhobar,qvbar, & x,y,z,zp,hterain, & roufns,tsfc, & dumpfile,needsfcstns, & raing,rainc, & xs,ys,xmap,ymap, & latgr,longr,tem1, & sfclist,sfcdomlist,time) ! !---------------------------------------------------------------------- ! ! PURPOSE: ! ! Coordinate the verification precipitation dumps, which are ! used in program PRECANAL. ! !---------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! ! MODIFICATION HISTORY: ! ! 09/15/97 Changed subroutine name from MESODUMP to SFCDUMP in ! order to bring the subroutine name into a consistent ! format (to go with SNDDUMP and PRODUMP). ! ! 09/16/97 Major code revamping. Changed variable names and put ! station information arrays into a common block in order ! to avoid having to reread information with each new ! data dump (adds vericst.inc to the verification ! software). ! ! 06/30/98 Modified to dump only precip data and information ! on the history dump grid (lat/lon of corners, ! map projection, etc.) (Eric Kemp, Project COMET-Tinker) ! ! 19 May 2000: Eric Kemp ! File name for list of stations in the domain ! is now passed to the subroutine, along with ! time from initialization. Also, valid ! time and forecast domain info are now included ! in all output files. ! !----------------------------------------------------------------------- ! ! Variables to be read in: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions ! INTEGER :: nzsoil ! LOGICAL :: needsfcstns ! Whether not need to create station file ! REAL :: uprt (nx,ny,nz) ! Perturbation u velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation wv mixing ration (kg/kg) ! REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) ! REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. ! REAL :: hterain(nx,ny) ! Terrain height. ! REAL :: roufns (nx,ny) ! Surface roughness ! REAL :: tsfc(nx,ny) ! Ground sfc. temperature (K) ! REAL :: raing(nx,ny) ! Grid supersaturation rain (mm) REAL :: rainc(nx,ny) ! Cumulus convective rain (mm) REAL :: time ! !----------------------------------------------------------------------- ! ! Computed variables ! !----------------------------------------------------------------------- ! REAL :: xs(nx) ! x location of scalar points REAL :: ys(ny) ! y location of scalar points ! !----------------------------------------------------------------------- ! ! Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs INTEGER :: nzmax PARAMETER (nzmax=250) ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: stheta(nzmax) REAL :: sqv(nzmax) REAL :: spres(nzmax) REAL :: stemp(nzmax) REAL :: sdewp(nzmax) REAL :: sdrct(nzmax) REAL :: ssped(nzmax) REAL :: shght(nzmax) REAL :: srain ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !------------------------------------------------------------------------ ! INTEGER :: islat ! Integer latitude of the sfc station INTEGER :: islon ! Integer longitude of the sfc station INTEGER :: istnm ! Station number of the sfc station INTEGER :: iselev_act ! Actual station elevation in integer format INTEGER :: i,j ! Index variables INTEGER :: ireturn ! Return status for whether stn is in the grid INTEGER :: LEN ! CHARACTER (LEN=256) :: dumpfile ! Sounding data history dump file name CHARACTER (LEN=256) :: sfclist ! File to read the sfc station locations from CHARACTER (LEN=256) :: line ! Temporary variable to read lines from files CHARACTER (LEN=256) :: sfcdomlist ! REAL :: press,presl ! Pressures at sfc and level 2 REAL :: hts,htl ! Heights of sfc and level 2 REAL :: hto ! Observational height REAL :: temps,templ ! Temperatures at ground skin and level 2 REAL :: dewps,dewpl ! Dew points at sfc and level 2 REAL :: dirs,dirl ! Wind direction at sfc and level 2 REAL :: spds,spdl ! Wind speeds at sfc and level 2 REAL :: rough ! Sfc roughness length REAL :: zeta ! Monin-Obhuhov stability parameter REAL :: mixlength ! Mixing length (constant in sfc. layer) REAL :: fricvel ! Friction velocity REAL :: thetastar ! Monin-Obhukov parameter REAL :: lapse ! Low-level lapse rate ! INTEGER :: arps_drct ! Estimated sfc wind direction REAL :: arps_spd ! Estimated wind speed at 10 meters (m/s) REAL :: arps_temp ! Estimated temperature at 2 meters (C) REAL :: arps_dewp ! Estimated sfc dewpoint temperature (C) REAL :: arps_pres ! Estimated sfc pressure (mb) REAL :: arps_theta ! Estimated potential temp near 2 m (C) REAL :: arps_rain ! Estimated precipitation (mm) ! !----------------------------------------------------------------------- ! ! Map projection variables ! !----------------------------------------------------------------------- ! REAL :: xctr,yctr REAL :: xll,yll REAL :: latnot(2) REAL :: xmap(nx) REAL :: ymap(ny) REAL :: latgr(nx,ny) REAL :: longr(nx,ny) REAL :: rloc1(2),rloc2(2),rloc3(2),rloc4(2) REAL :: xc(nx,ny,nz),yc(nx,ny,nz) REAL :: swx,swy INTEGER :: k ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' INCLUDE 'exbc.inc' INCLUDE 'vericst.inc' INCLUDE 'grid.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (nz > nzmax) THEN PRINT *,'Reset nzmax to greater than:',nz STOP END IF ! !----------------------------------------------------------------------- ! ! Calculate scalar locations and set up the map projection and ! grid parameters ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO dx=x(2)-x(1) dy=y(2)-y(1) ! latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr(mapproj,sclfct,latnot,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr) xll=xctr-(0.5*(nx-3)*dx) yll=yctr-(0.5*(ny-3)*dy) DO i=1,nx-1 xmap(i)=xll+xs(i) END DO xmap(nx)=2.*xmap(nx-1)-xmap(nx-2) DO j=1,ny-1 ymap(j)=yll+ys(j) END DO ymap(ny)=2.*ymap(ny-1)-ymap(ny-2) CALL xytoll(nx,ny,xmap,ymap,latgr,longr) ! !----------------------------------------------------------------------- ! ! Find location in ARPS grid of all the stations in sfclist, then ! rewrite only the ones that are in the grid to common arrays ! so as to not make the program read all of the stations from ! the original surface stn list and check their locations with each ! history dump. ! !----------------------------------------------------------------------- ! OPEN(UNIT=1,FILE=sfclist,STATUS='old') ! OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown') ! ! LEN =256 ! CALL slength( dumpfile, LEN) ! WRITE(6,*) "Opening ",dumpfile(1:LEN)," for surface output" WRITE(2,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) 990 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) LEN =80 CALL slength(runname,LEN) WRITE(2,'(a)') runname(1:LEN) WRITE(2,'(i1.1)') nocmnt DO i = 1,nocmnt LEN =80 CALL slength(cmnt(i),LEN) WRITE(2,'(a)') cmnt(i)(1:LEN) END DO rloc1(1) = latgr(1,1) rloc1(2) = longr(1,1) rloc2(1) = latgr(nx-1,1) rloc2(2) = longr(nx-1,1) rloc3(1) = latgr(1,ny-1) rloc3(2) = longr(1,ny-1) rloc4(1) = latgr(nx-1,ny-1) rloc4(2) = longr(nx-1,ny-1) WRITE(2,*) ctrlat WRITE(2,*) ctrlon WRITE(2,*) rloc1(1) WRITE(2,*) rloc1(2) WRITE(2,*) rloc2(1) WRITE(2,*) rloc2(2) WRITE(2,*) rloc3(1) WRITE(2,*) rloc3(2) WRITE(2,*) rloc4(1) WRITE(2,*) rloc4(2) WRITE(2,*) trulat1 WRITE(2,*) trulat2 WRITE(2,*) trulon WRITE(2,*) sclfct WRITE(2,*) mapproj 105 FORMAT(a8,a16,a20) ! IF (needsfcstns) THEN ! needsfcstns = .false. sfcstn=0 sfcstn=0 ! LEN =80 CALL slength(sfclist,LEN) WRITE(6,*) 'Reading surface stations from file: ', & sfclist(1:LEN) ! OPEN(UNIT=3,FILE=sfcdomlist,STATUS='unknown') WRITE(3,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) LEN =80 CALL slength(runname,LEN) WRITE(3,'(a)') runname(1:LEN) WRITE(3,'(i1.1)') nocmnt DO i = 1,nocmnt LEN =80 CALL slength(cmnt(i),LEN) WRITE(3,'(a)') cmnt(i)(1:LEN) END DO ! 110 FORMAT(a80) ! READ(1,110,END=30) line ! read header lines and discard them.. READ(1,110,END=30) line READ(1,110,END=30) line READ(1,110,END=30) line ! DO i=1,sfcmax ! 115 FORMAT(a3,1X,f6.2,1X,f7.2,1X,i4) ! READ(1,110,END=30) line ! sfcstn=sfcstn+1 ! READ(line,115) precstid(sfcstn),islat,islon,iselev_act istnm=0 ! Assumes a station number is unavailable sfclat(sfcstn)=islat/100000. sfclon(sfcstn)=islon/100000. sfcelev_act(sfcstn)=iselev_act/1. ! CALL lltoxy(1,1,sfclat(sfcstn),sfclon(sfcstn), & sfcxpt(sfcstn),sfcypt(sfcstn)) ! sfcxpt(sfcstn)=sfcxpt(sfcstn)-xll sfcypt(sfcstn)=sfcypt(sfcstn)-yll ! CALL findlc2(nx,ny,xs,ys,sfcxpt(sfcstn),sfcypt(sfcstn), & sfcipt(sfcstn),sfcjpt(sfcstn),ireturn) ! IF (ireturn < 0) THEN ! stn is outside the grid sfcstn=sfcstn-1 ELSE ! stn is inside the grid WRITE(3,110) line ! write location data to a file END IF ! END DO ! END IF ! 30 CONTINUE ! DO i=1,sfcstn ! do for each station 'i' ... dumpfile = './prec_dumps/' LEN =256 CALL slength( dumpfile, LEN) WRITE(dumpfile(LEN+1:LEN+8),'(a8)') sfcstid(i)(1:3)//'_prec' OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown',POSITION='append') WRITE(2,991) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) 991 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column. ! !----------------------------------------------------------------------- ! CALL colintb(nx,ny,nz,nzmax, & xs,ys,zp,sfcxpt(i),sfcypt(i),sfcipt(i),sfcjpt(i), & uprt, vprt, ptprt, pprt, qvprt, & ubar, vbar, ptbar, pbar, qvbar, & raing,rainc,srain, & su,sv,stheta,spres,shght,sqv, & tem1,nlevs) ! arps_rain=srain 120 FORMAT('Stn:',a16,' rain:',f6.2) WRITE(2,120) precstid(i),arps_rain ! CLOSE(2) ! END DO ! CLOSE(1) ! CLOSE(2) CLOSE(3) ! RETURN ! END SUBROUTINE precdump ! ! !################################################################# !################################################################# !###### ###### !###### Function AINT2D ###### !###### ###### !###### Copyright (c) 1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! ! FUNCTION aint2dtmp(nx,ny,nz,a,im,jm,k,in,jn,w1,w2,w3,w4) ! IMPLICIT NONE ! REAL :: aint2dtmp INTEGER :: nx,ny,nz REAL :: a(nx,ny,nz) INTEGER :: im,jm,in,jn,k REAL :: w1,w2,w3,w4 ! aint2dtmp=w1*a(im,jm,k) + & w2*a(in,jm,k) + & w3*a(in,jn,k) + & w4*a(im,jn,k) ! RETURN ! END FUNCTION aint2dtmp ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE mosolns ###### !###### ###### !###### Copyright (c) 1995-1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE mosolns(press,hts,temps,dewps,dirs, & 1 spds,presl,htl,templ,dewpl,dirl,spdl,rough,zeta) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Uses the equations from Byun, 1990 (JAM) to solve for the value ! of the stability parameter 'zeta' in Monin-Obukhov theory. ! !----------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! September 1995. ! ! MODIFICATION HISTORY: ! ! November, 1995 (J. Mewes) ! Cleaned up and commented. ! ! 09/16/97 Changed some variable names and recommented the code. ! Removed function call to calculate theta (done explic- ! itly now). ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! REAL :: bh,bm ! Constants (beta-h, beta-m) PARAMETER (bh=6.35,bm=4.7) ! REAL :: pr ! Prandtl # for neutral stability PARAMETER (pr=0.74) ! REAL :: gm,gh ! Constants (gamma-m, gamma-h) PARAMETER (gh=9.0,gm=15.0) ! REAL :: fctr ! Conversion for using the Bulk Richardson # REAL :: deltau ! Difference in wind spd between sfc and level 2 REAL :: deltaz ! Difference in height between sfc and level 2 REAL :: deltatheta ! Difference in theta between sfc and level 2 REAL :: thetanot ! Average theta between sfc and level 2 REAL :: bulkrich ! Bulk Richardson #, from Byun 1990 REAL :: rough ! Roughness length at station REAL :: zeta ! M-O stability parameter ! REAL :: thetai,si,ti,qi,pi ! Terms used in calculating 'zeta' ! REAL :: templ,dewpl,htl,presl,dirl,spdl,thetal ! Values of the ARPS variables at stn at level 2 ! REAL :: temps,dewps,hts,press,dirs,spds,thetas ! Values of the ARPS variables at stn at the sfc ! REAL :: check ! Used to check for stability ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! thetal=(templ+273.16)*(1000./presl)**.286 thetas=(temps+273.16)*(1000./press)**.286 thetanot=(thetas+thetal)/2 deltatheta=thetal-thetas ! deltaz=htl-hts ! deltau=spdl ! Since speed at sfc = 0.0 ! !---------------------------------------------------------------------- ! ! Calculate the Richardson # between the sfc and level 2. ! ! Note: In the future may want to evaluate stability based on ! theta-e rather than theta. ! !---------------------------------------------------------------------- ! bulkrich = (9.81*(deltatheta*deltaz))/(thetanot*(deltau**2)) bulkrich = AMAX1(bulkrich,-10.0) ! limit for unstable case ! fctr=deltaz/(deltaz-rough)*LOG(deltaz/rough) ! ! IF (bulkrich > 0.) THEN ! !--------------------------------------------------------------------- ! ! A Richardson # > 0 indicates a stable atmosphere (i.e. ! it is positive because the potential temperature is ! greater at the higher level than at the lower level). ! !--------------------------------------------------------------------- ! zeta=(-(2.*bh*bulkrich-1.)-(1.+4.*(bh-bm)*bulkrich/pr)**0.5) / & (2.*bh*(bm*bulkrich-1.))*fctr ! ELSE ! si=bulkrich/pr qi=(1./(gm**2.0)+3.*(gh/gm)*(si**2.0))/9. pi=(-2./(gm**3.0)+9./gm*(-gh/gm+3.)*(si**2.0))/54. check=qi**3.0-pi**2.0 ! Delineates the two cases for unstable ! !-------------------------------------------------------------------- ! ! There are two cases for unstable (depending on how ! unstable the atmosphere is): ! !-------------------------------------------------------------------- ! IF (check >= 0.) THEN ! thetai=ACOS(pi/SQRT(qi**3.0)) zeta=(-2.*SQRT(qi)*COS(thetai/3.0)+1/(3.*gm))*fctr ! ELSE ! ti=(SQRT(-check)+ABS(pi))**(1./3.) zeta=(-(ti+qi/ti)+1./(3.*gm))*fctr ! END IF ! END IF ! RETURN ! END SUBROUTINE mosolns ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ustar_thstar ###### !###### ###### !###### Copyright (c) 1995-1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE ustar_thstar(zeta,spdl,z,zo,templ,temps,presl,press, & 1 fricvel,thetastar) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Uses the equations from Byun, 1990 (JAM) to solve for the value ! of the friction velocity (u*) and the scaling temperature (theta*) ! using the mixing length. ! !----------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! September 1995. ! ! MODIFICATION HISTORY: ! ! November, 1995 (J. Mewes) ! Cleaned up and commented. ! ! 09/16/97 Changed some variable names and recommented the code. ! Removed function call to calculate theta (done explic- ! itly now). Changed subroutine name. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! REAL :: bh,bm ! Constants (beta-h, beta-m) PARAMETER (bh=6.35,bm=4.7) ! REAL :: pr ! Prandtl # for neutral stability PARAMETER (pr=0.74) ! REAL :: gm,gh,k ! Constants (gamma-m, gamma-h) PARAMETER (gm=15.0,gh=9.0,k=0.375) ! REAL :: templ,temps ! Model temps at level 2 and sfc REAL :: presl,press ! Model pressure at level 2 and sfc REAL :: thetal,thetas ! Model theta at level 2 and sfc REAL :: spdl ! Model wind speed at level 2 REAL :: z ! Height above sfc of level 2 REAL :: zo ! Roughness length REAL :: fricvel ! Friction velocity (solving for this!) REAL :: thetastar ! Theta* (solving for this also!) REAL :: x,xo ! Calculation terms REAL :: y,yo ! Calculation terms REAL :: zeta,zetao ! Stability parameters ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! zetao=zeta*zo/z ! thetas=(temps+273.16)*(1000./press)**.286 thetal=(templ+273.16)*(1000./presl)**.286 ! IF (zeta > 0.) THEN ! zeta > 0 denotes stable conditions... ! fricvel=k*spdl/(LOG(z/zo)+bm*(zeta-zetao)) ! ELSE ! ...unstable conditions ! x=(1-gm*zeta)**(1./4.) xo=(1-gm*zo/z*zeta)**(1./4.) y=(1-gh*zeta)**(1./2.) yo=(1-gh*zo/z*zeta)**(1./2.) fricvel=k*spdl/(LOG(z/zo)-(2*LOG((1+x)/(1+xo))+ & LOG((1+x**2)/(1+xo**2))-2*ATAN(x)+2*ATAN(xo))) ! END IF ! IF (zeta > 0.) THEN ! again, stable conditions... ! thetastar=(k*(thetal-thetas)/pr)/(LOG(z/zo)+bh* & (zeta-zetao)) ! ELSE ! ...and unstable conditions. ! thetastar=(k*(thetal-thetas)/pr)/(LOG(z/zo)-2* & LOG((y+1)/(yo+1))) ! END IF ! RETURN ! END SUBROUTINE ustar_thstar ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE arps2obs ###### !###### ###### !###### Copyright (c) 1995-1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE arps2obs(fricvel,thetastar,temps,press,presl,hts,htl, & 1 mixlength,lapse,zo,arps_spd,arps_temp) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolates the ARPS data to the correct elevation above the ! model terrain so as to correspond with the observation heights ! above the surface. Does not take into account the differences ! between the model terrain and the actual elevations. Uses Monin- ! Obukhov theory. ! !----------------------------------------------------------------------- ! ! AUTHOR: John Mewes ! September 1995. ! ! MODIFICATION HISTORY: ! ! November, 1995 (J. Mewes) ! Cleaned up and commented. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! REAL :: bh,bm ! Constants (beta-h, beta-m) PARAMETER (bh=6.35,bm=4.7) ! REAL :: pr ! Prandtl # for neutral stability PARAMETER (pr=0.74) ! REAL :: gm,gh,k ! Constants (gamma-m, gamma-h) PARAMETER (gm=15.0,gh=9.0,k=0.375) ! REAL :: fricvel ! Friction velocity REAL :: thetastar ! Theta* REAL :: arps_spd ! Wind speed at 10 meters REAL :: arps_temp ! Temperature at 2 meters REAL :: temps ! Surface temperature REAL :: hts,htl ! Height of sfc and level 2 REAL :: press,presl ! Pressure at sfc and level 2 REAL :: thetas ! Surface potential temperature REAL :: dtheta ! Change in theta from zo to obs level REAL :: zo ! Roughness length REAL :: x,xo ! Calculation terms REAL :: y,yo ! Calculation terms REAL :: mixlength ! Mixing length REAL :: pres2m ! Pressure at 2 meters above the sfc. REAL :: lapse ! Average lapse rate -- sfc. to 50 meters REAL :: frac ! used in calculating press at 2 meters ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! thetas=(temps+273.16)*(1000./press)**.286 frac=2./(htl-hts) pres2m=press-EXP(frac*(LOG(press)-LOG(presl))) ! !---------------------------------------------------------------------- ! ! 'x' is used in velocity profile and 'y' in temperature profile. ! The 10 meter wind speed is calculated first, followed by the ! 2 meter temperature. ! !---------------------------------------------------------------------- ! IF (mixlength > 0.) THEN ! (stable conditions) arps_spd=fricvel/k*(LOG(10/zo)+bm*(10/mixlength-zo/mixlength)) ELSE ! (unstable conditions) x=(1-gm*10/mixlength)**(1./4.) xo=(1-gm*zo/mixlength)**(1./4.) arps_spd=fricvel/k*(LOG(10/zo)-(2*LOG((1+x)/(1+xo))+ & LOG((1+x**2)/(1+xo**2))-2*ATAN(x)+2*ATAN(xo))) END IF ! IF (mixlength > 0.) THEN dtheta=thetastar*pr/k*(LOG(2./zo)+bh* & (2./mixlength-zo/mixlength)) ELSE y=(1-gh*2./mixlength)**(1./2.) yo=(1-gh*zo/mixlength)**(1./2.) dtheta=thetastar*pr/k*(LOG(2./zo)-2* & LOG((y+1)/(yo+1))) END IF ! arps_temp=(thetas+dtheta)*(pres2m/1000.)**.286 - 273.16 ! RETURN ! END SUBROUTINE arps2obs ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE FINDLC2 ###### !###### ###### !###### Copyright (c) 1992-1994 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE findlc2(nx,ny,xs,ys,xpt,ypt,ipt,jpt,ireturn) 5 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Searches in x and y to find i,j location of xpt, ypt. ! ! X and Y do not have to be on a regular grid, however it is ! assumed that x and y are monotonically increasing as i and j ! indices increase. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! April 1992. ! ! MODIFICATION HISTORY: ! ! February, 1993 (K. Brewster) ! Additional documentation for ARPS 3.1 release ! ! October, 1994 (K. Brewster) ! Changed to reference scalar points. ! ! July, 1995 (K. Brewster) ! Changed to return error if extrapolation is required. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! xs x coordinate of scalar points in physical/comp. space (m) ! ys y coordinate of scalar points in physical/comp. space (m) ! ! xpt location to find in x coordinate (m) ! ypt location to find in y coordinate (m) ! ! OUTPUT: ! ! ipt i index to the west of desired location ! jpt j index to the south of desired location ! ireturn status indicator, 0 = good ! -1 = extrapolation in x ! -2 = extrapolation in y ! !----------------------------------------------------------------------- ! ! Arguments ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! Dimensions of ARPS grids REAL :: xs(nx) ! x coordinate of scalar grid points in ! physical/comp. space (m) REAL :: ys(ny) ! y coordinate of grid points in ! physical/comp. space (m) REAL :: xpt ! location to find in x coordinate REAL :: ypt ! location to find in y coordinate INTEGER :: ipt ! i index to the west of desired ! location INTEGER :: jpt ! j index to the south of desired ! location INTEGER :: ireturn ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ireturn=0 DO i=2,nx-2 IF(xpt < xs(i)) EXIT END DO 101 CONTINUE ipt=i-1 ! Use "nx-2" not "nx-1", as MPI will overlap, and we don't want that. ! The cost is the edges in non-mpi mode, however, that is still in the ! fake zone, so it might not be that useful. IF(xpt > xs(nx-2) .OR. xpt < xs(1)) ireturn=-1 DO j=2,ny-2 IF(ypt < ys(j)) EXIT END DO 201 CONTINUE jpt=j-1 IF(ypt > ys(ny-2) .OR. ypt < ys(1)) ireturn=-2 RETURN END SUBROUTINE findlc2 ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE COLINTB ###### !###### ###### !###### Copyright (c) 1992-1994 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE colintb(nx,ny,nz,nzmax, & 4 xs,ys,zp,xpt,ypt,ipt,jpt, & uprt, vprt, ptprt, pprt, qvprt, & ubar, vbar, ptbar, pbar, qvbar, & raing,rainc,srain, & su,sv,stheta,spres,shght,sqv, & tem1,nlevs) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolates ARPS history data in the horizontal to create ! a column of data located at point xpt, ypt. ! ! Bilinear interpolation is used. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! April 1992. ! ! MODIFICATION HISTORY: ! ! October, 1992 (K. Brewster) ! Conversion to ARPS 3.0. ! ! October, 1994 (K. Brewster) ! Conversion to ARPS 4.0. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx,ny,nz Dimensions of ARPS grids. ! ! nzmax Maximum number of vertical levels allowed ! ! xs x coordinate of scalar points in physical/comp. space (m) ! ys y coordinate of scalar points in physical/comp. space (m) ! zp z coordinate of scalar grid points in physical space (m) ! ! xpt x coordinate of desired sounding (m) ! ypt y coordinate of desired sounding (m) ! ! ipt i index of grid point just west of xpt,ypt ! jpt j index of grid point just south of xpt,ypt ! ! uprt x component of perturbation velocity (m/s) ! vprt y component of perturbation velocity (m/s) ! ! ptprt Perturbation potential temperature (K) ! pprt Perturbation pressure (Pascal) ! ! qvprt Perturbation water vapor mixing ratio (kg/kg) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! raing Supersaturation rainfall ! rainc Cumulus convective rainfall ! ! OUTPUT: ! ! su Interpolated u wind component. (m/s) ! sv Interpolated v wind component. (m/s) ! stheta Interpolated potential temperature (K). ! spres Interpolated pressure. (Pascals) ! shght Interpolated height (meters) ! sqv Interpolated water vapor mixing ratio (kg/kg). ! srain Interpolated accumulated rainfall (m) ! nlevs Number of above-ground sounding levels. ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! ! Arguments -- location data ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Dimensions of ARPS grids. INTEGER :: nzmax ! Maximum # of vertical levels allowed REAL :: xs(nx) ! x coordinate of grid points in ! physical/comp. space (m) REAL :: ys(ny) ! y coordinate of grid points in ! physical/comp. space (m) REAL :: zp(nx,ny,nz) ! z coordinate of grid points in ! physical space (m) REAL :: xpt ! location to find in x coordinate (m) REAL :: ypt ! location to find in y coordinate (m) INTEGER :: ipt ! i index to the west of desired ! location INTEGER :: jpt ! j index to the south of desired ! location ! !----------------------------------------------------------------------- ! ! Arguments -- model data ! !----------------------------------------------------------------------- ! REAL :: uprt (nx,ny,nz) ! Perturbation u-velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation water vapor specific ! humidity (kg/kg) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific ! humidity (kg/kg) REAL :: raing (nx,ny) ! Grid supersaturation rainfall REAL :: rainc (nx,ny) ! Cumulus convective rainfall ! !----------------------------------------------------------------------- ! ! Arguments -- Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: stheta(nzmax) REAL :: sqv(nzmax) REAL :: spres(nzmax) REAL :: shght(nzmax) REAL :: srain ! !----------------------------------------------------------------------- ! ! Temporary work arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Functions called ! !----------------------------------------------------------------------- ! REAL :: aint2dtmp ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,in,jn REAL :: delx,ddx,dely,ddy,w1,w2,w3,w4 ! REAL :: mindist,d1,d2,d3,d4 INTEGER :: numprec ! !----------------------------------------------------------------------- ! ! Find corner weights ! !----------------------------------------------------------------------- ! in=ipt+1 delx=xs(in)-xs(ipt) IF(ABS(delx) > 0.) THEN ddx=(xpt-xs(ipt))/delx ELSE ddx=0. END IF jn=jpt+1 dely=ys(jn)-ys(jpt) IF(ABS(dely) > 0.) THEN ddy=(ypt-ys(jpt))/dely ELSE ddy=0. END IF w1=(1.-ddx)*(1.-ddy) w2=ddx*(1.-ddy) w3=ddx*ddy w4=(1.-ddx)*ddy ! !----------------------------------------------------------------------- ! ! Interpolate all variables at all levels. ! !----------------------------------------------------------------------- ! nlevs=nz-1 DO k=1,nz shght(k)= & aint2dtmp(nx,ny,nz, zp,ipt,jpt,k,in,jn,w1,w2,w3,w4) stheta(k)= & aint2dtmp(nx,ny,nz, ptprt,ipt,jpt,k,in,jn,w1,w2,w3,w4) & +aint2dtmp(nx,ny,nz, ptbar,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqv(k)= & aint2dtmp(nx,ny,nz, qvprt,ipt,jpt,k,in,jn,w1,w2,w3,w4) & +aint2dtmp(nx,ny,nz, qvbar,ipt,jpt,k,in,jn,w1,w2,w3,w4) spres(k)= & aint2dtmp(nx,ny,nz, pprt,ipt,jpt,k,in,jn,w1,w2,w3,w4) & +aint2dtmp(nx,ny,nz, pbar,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! !----------------------------------------------------------------------- ! ! Interpolate accumulated rainfall ! !----------------------------------------------------------------------- ! ! DO i=1,nx DO j=1,ny tem1(i,j,1)=raing(i,j)+rainc(i,j) END DO END DO ! numprec=0 ! # of g.p.'s surrounding stn with precip forecast IF (tem1(ipt,jpt,1) > 0) THEN numprec=numprec+1 END IF IF (tem1(ipt+1,jpt,1) > 0) THEN numprec=numprec+1 END IF IF (tem1(ipt,jpt+1,1) > 0) THEN numprec=numprec+1 END IF IF (tem1(ipt+1,jpt+1,1) > 0) THEN numprec=numprec+1 END IF ! IF (numprec == 0) THEN ! no g.p.'s have precip forecast ! srain=0. GO TO 210 ! ELSE ! at least 1 g.p. has precip forecast ! srain=aint2dtmp(nx,ny,nz,tem1,ipt,jpt,1,in,jn,w1,w2,w3,w4) ! IF (numprec >= 3) THEN ! if at least 3 have precip, ! interpolation is finished GO TO 210 ! END IF ! END IF ! !---------------------------------------------------------------------- ! ! If less than 3 surrounding grid points have precip ! forecast, do further checking to see if the nearest ! grid point has precip forecast, and use that to determine ! whether the station's precip should be set to zero or ! not. ! !---------------------------------------------------------------------- ! ! SLOW! Rewrite!!! ! d1=((xpt-xs(ipt))**2+(ypt-ys(jpt))**2)**(1./2.) ! d2=((xpt-xs(ipt+1))**2+(ypt-ys(jpt))**2)**(1./2.) ! d3=((xpt-xs(ipt))**2+(ypt-ys(jpt+1))**2)**(1./2.) ! d4=((xpt-xs(ipt+1))**2+(ypt-ys(jpt+1))**2)**(1./2.) d1=sqrt( (xpt-xs(ipt)) * (xpt-xs(ipt)) + (ypt-ys(jpt)) * (ypt-ys(jpt))) d2=sqrt( (xpt-xs(ipt+1)) * (xpt-xs(ipt+1)) + (ypt-ys(jpt)) * (ypt-ys(jpt))) d3=sqrt( (xpt-xs(ipt)) * (xpt-xs(ipt)) + (ypt-ys(jpt+1)) * (ypt-ys(jpt+1))) d4=sqrt( (xpt-xs(ipt+1)) * (xpt-xs(ipt+1)) + (ypt-ys(jpt+1)) * (ypt-ys(jpt+1))) mindist=AMIN1(d1,d2) mindist=AMIN1(mindist,d3) mindist=AMIN1(mindist,d4) ! IF (mindist == d1) THEN IF (tem1(ipt,jpt,1) == 0) THEN srain=0. END IF ELSE IF (mindist == d2) THEN IF (tem1(ipt+1,jpt,1) == 0) THEN srain=0. END IF ELSE IF (mindist == d3) THEN IF (tem1(ipt,jpt+1,1) == 0) THEN srain=0. END IF ELSE IF (mindist == d4) THEN IF (tem1(ipt+1,jpt+1,1) == 0) THEN srain=0. END IF ELSE WRITE(6,*) "mindist-d's:",mindist,d1,d2,d3,d4 END IF ! ! !----------------------------------------------------------------------- ! ! Get height at scalar points, since zp was defined at w points. ! !----------------------------------------------------------------------- ! 210 CONTINUE DO k=1,nz-1 shght(k)=0.5*(shght(k+1)+shght(k)) END DO ! !----------------------------------------------------------------------- ! ! Form total u wind component at scalar points ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=0.5*(ubar(i,j,k)+ubar(i+1,j,k))+ & 0.5*(uprt(i,j,k)+uprt(i+1,j,k)) END DO END DO END DO DO k=1,nz-1 su(k)= & aint2dtmp(nx,ny,nz, tem1,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! !----------------------------------------------------------------------- ! ! Form total v wind component at scalar points ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=0.5*(vbar(i,j,k)+vbar(i,j+1,k)) + & 0.5*(vprt(i,j,k)+vprt(i,j+1,k)) END DO END DO END DO DO k=1,nz-1 sv(k)= & aint2dtmp(nx,ny,nz, tem1,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! RETURN END SUBROUTINE colintb ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CNVSND ###### !###### ###### !###### Copyright (c) 1992-1994 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE cnvsnd(su,sv,stheta,spres,sqv,slon, & 4,2 sdrct,ssped,stemp,sdewp,nlevs) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Converts units of data extracted from ARPS history data to ! those required of sounding data. Determines direction and ! speed from u and v wind components. ! ! Dew-point formula from Bolton, 1980, MWR pp 1046-1053. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! April 1992. ! ! MODIFICATION HISTORY: ! ! October, 1992 (K. Brewster) ! Conversion to ARPS 3.0. ! ! 10/28/1992 (K. Brewster) ! Special allowance for low qv-to-dew pt ! ! 09/12/1995 (K. Brewster) ! Changed the determination of direc and speed to account ! for map rotation factor. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! su Sounding u wind component. (m/s) ! sv Sounding v wind component. (m/s) ! stheta Sounding potential temperature (K). ! spres Sounding pressure. (Pascals) ! sqv Sounding water vapor mixing ratio (kg/kg). ! slon Station longitude (degrees E) ! nlevs Number of above-ground sounding levels. ! ! OUTPUT: ! ! spres Sounding pressure. (mb) ! sdrct Sounding wind direction (degrees from north) ! ssped Sounding wind speed (m/s) ! stemp Sounding temperature (degrees C) ! sdewp Sounding dew point temperature (degrees C) ! !----------------------------------------------------------------------- ! ! Variable declarations ! !----------------------------------------------------------------------- ! ! Input arguments ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nlevs ! Number of above-ground sounding levels REAL :: su (nlevs) ! Sounding u wind component (m/s) REAL :: sv (nlevs) ! Sounding v wind component (m/s) REAL :: stheta(nlevs) ! Sounding potential temperature (K) REAL :: spres (nlevs) ! Sounding pressure. (Pascals) REAL :: sqv (nlevs) ! Sounding water vapor mixing ! ratio (kg/kg) REAL :: slon ! !----------------------------------------------------------------------- ! ! Output arguments ! !----------------------------------------------------------------------- ! REAL :: sdrct(nlevs) ! Sounding wind direction ! (degrees from north) REAL :: ssped(nlevs) ! Sounding wind speed (m/s) REAL :: stemp(nlevs) ! Sounding temperature (degrees C) REAL :: sdewp(nlevs) ! Sounding dew point temperature ! (degrees C) ! !----------------------------------------------------------------------- ! ! Constants ! !----------------------------------------------------------------------- ! REAL :: rd2dg PARAMETER (rd2dg=(180./3.141592654)) ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: k REAL :: smix,e,bige,alge ! !----------------------------------------------------------------------- ! ! Convert u,v to direction and speed ! !----------------------------------------------------------------------- ! DO k=1,nlevs CALL uvrotdd(1,1,slon,su(k),sv(k),sdrct(k),ssped(k)) ! !----------------------------------------------------------------------- ! ! Convert pressure from Pascals to mb ! !----------------------------------------------------------------------- ! spres(k)=spres(k)*0.01 ! !----------------------------------------------------------------------- ! ! Convert theta to temperature in degrees C. ! !----------------------------------------------------------------------- ! stemp(k)=stheta(k)*((spres(k)/1000.)**rddcp) stemp(k)=stemp(k)-273.15 ! !----------------------------------------------------------------------- ! ! Convert QV to dew-point in degrees C. ! !----------------------------------------------------------------------- ! IF( sqv(k) > 1E-05) THEN smix=sqv(k) e=(spres(k)*smix)/(0.62197 + smix) bige=e/( 1.001 + ( (spres(k) - 100.) / 900) * 0.0034) alge = ALOG(bige/6.112) sdewp(k)= (alge * 243.5) / (17.67 - alge) ELSE sdewp(k)= stemp(k)-30. END IF END DO ! RETURN END SUBROUTINE cnvsnd ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SLENGTH ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE slength ( string, length ) 27 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Return the length of the non-blank part of a string. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! ! MODIFICATION HISTORY: ! ! 6/09/92 (K. Brewster) ! Added full documentation and streamlined logic ! !----------------------------------------------------------------------- ! ! INPUT: ! ! string character string to be sized ! ! INPUT/OUTPUT: ! ! length on input, full size of character string ! on output, true length of string as measured by the ! location of the last non-blank character ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: length CHARACTER (LEN=*) :: string ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! DO i = length,1,-1 IF(string(i:i) /= ' ') EXIT END DO 101 CONTINUE length = i RETURN END SUBROUTINE slength ! !################################################################# !################################################################# !###### ###### !###### SUBROUTINE MOSDUMP ###### !###### ###### !###### Copyright (c) 1996 ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################# !################################################################# ! SUBROUTINE mosdump(nx,ny,nz,nzsoil,nstyps,x,y,z,zp,hterain, & 1,13 uprt,ubar,vprt,vbar,wprt,wbar, & ptprt,ptbar,pprt,pbar,qvprt,qvbar, & qc,qr,qi,qs,qh,tke,kmh,kmv,rhobar, & zpsoil,tsoil,qsoil,wetcanp, & snowdpth,soiltyp,stypfrct,vegtyp, & lai,roufns,veg,raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx, & qvsflx,dumpfile,needmosstns, & xs,ys,xmap,ymap,latgr,longr,tem1,tem4, & moslist,mosdomlist,time) ! !---------------------------------------------------------------------- ! ! PURPOSE: ! ! Coordinate the verification MOS dumps. Based on subroutine ! snddump ! !---------------------------------------------------------------------- ! ! AUTHOR: Eric Kemp ! ! Modifications: ! ! 1 June 2002 Eric Kemp ! Soil variable updates. ! !----------------------------------------------------------------------- ! ! Variables to be read in: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of soil levels. INTEGER :: nstyps ! Number of soil type REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! Height of soil levels REAL :: hterain(nx,ny) ! Terrain height. REAL :: uprt (nx,ny,nz) ! Perturbation u velocity (m/s) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: wprt (nx,ny,nz) ! Perturbation w velocity (m/s) REAL :: wbar (nx,ny,nz) ! Base state z velocity component (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation wv mixing ration (kg/kg) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rainwater mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3)) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type 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 :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! 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) = cumulative precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) CHARACTER (LEN=256) :: dumpfile ! Sounding data history dump file name LOGICAL :: needmosstns ! Create a stn list of stns in grid CHARACTER (LEN=256) :: moslist ! File to read the sounding locations from CHARACTER (LEN=256) :: mosdomlist ! REAL :: time ! !----------------------------------------------------------------------- ! ! Computed variables ! !----------------------------------------------------------------------- ! REAL :: xs(nx) ! x location of scalar points REAL :: ys(ny) ! y location of scalar points ! !----------------------------------------------------------------------- ! ! Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs INTEGER :: nzmax PARAMETER (nzmax=250) ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: sw(nzmax) REAL :: spt(nzmax) REAL :: sp(nzmax) REAL :: sqv(nzmax) REAL :: sqc(nzmax) REAL :: sqr(nzmax) REAL :: sqi(nzmax) REAL :: sqs(nzmax) REAL :: sqh(nzmax) REAL :: stke(nzmax) REAL :: skmh(nzmax) REAL :: skmv(nzmax) REAL :: srhobar(nzmax) REAL :: stsfc(0:nstyps) REAL :: stsoil(0:nstyps) REAL :: swetsfc(0:nstyps) REAL :: swetdp(0:nstyps) REAL :: swetcanp(0:nstyps) REAL :: ssnowdpth INTEGER :: ssoiltyp(nstyps) REAL :: sstypfrct(nstyps) INTEGER :: svegtyp REAL :: slai REAL :: sroufns REAL :: sveg REAL :: sraing REAL :: srainc REAL :: sprcrate(4) REAL :: sradfrc(nzmax) REAL :: sradsw REAL :: srnflx REAL :: sradswnet REAL :: sradlwin REAL :: susflx REAL :: sptflx REAL :: svsflx REAL :: sptsflx REAL :: sqvsflx REAL :: shght(nzmax) REAL :: shterain REAL :: srain ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) REAL :: tem4(nx,ny) ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !----------------------------------------------------------------------- ! INTEGER :: istnm ! Station number of the sounding location INTEGER :: iselev_act ! Actual station elevation in integer format INTEGER :: i,j,k ! Index variables INTEGER :: ii,ij ! More index variables INTEGER :: ireturn ! Flag for stations outside of the domain ! CHARACTER (LEN=256) :: line ! Temp variable to read lines from files INTEGER :: LEN ! !----------------------------------------------------------------------- ! ! Map projection variables ! !----------------------------------------------------------------------- ! REAL :: xctr,yctr REAL :: xll,yll REAL :: latnot(2) REAL :: xmap(nx) REAL :: ymap(ny) REAL :: latgr(nx,ny) REAL :: longr(nx,ny) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'bndry.inc' INCLUDE 'exbc.inc' INCLUDE 'vericst.inc' INCLUDE 'grid.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (nz > nzmax) THEN PRINT *,'Reset nzmax to greater than:',nz STOP END IF ! !----------------------------------------------------------------------- ! ! Calculate scalar locations and set up the map projection and ! grid parameters ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO dx=x(2)-x(1) dy=y(2)-y(1) ! latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr(mapproj,sclfct,latnot,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,xctr,yctr) xll=xctr-(0.5*(nx-3)*dx) yll=yctr-(0.5*(ny-3)*dy) DO i=1,nx-1 xmap(i)=xll+xs(i) END DO xmap(nx)=2.*xmap(nx-1)-xmap(nx-2) DO j=1,ny-1 ymap(j)=yll+ys(j) END DO ymap(ny)=2.*ymap(ny-1)-ymap(ny-2) CALL xytoll(nx,ny,xmap,ymap,latgr,longr) ! !----------------------------------------------------------------------- ! ! Find location in ARPS grid of all the stations in sndlist, then ! rewrite only the ones that are in the grid to common arrays ! so as to not make the program read all of the stations from ! the original sounding stn list and check their locations with each ! history dump. ! !----------------------------------------------------------------------- ! OPEN(UNIT=1,FILE=moslist,STATUS='old') ! OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown') ! ! LEN =256 ! CALL slength( dumpfile, LEN) ! WRITE(6,*) "Opening ",dumpfile(1:LEN)," for MOS output" 105 FORMAT(a8,a16,a20) ! IF (needmosstns) THEN ! needmosstns = .false. mosstn=0 ! LEN =80 CALL slength(moslist,LEN) WRITE(6,*) 'Reading sounding stations from file: ', & moslist(1:LEN) ! OPEN(UNIT=3,FILE=mosdomlist,STATUS='unknown') WRITE(3,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) LEN =80 CALL slength(runname,LEN) WRITE(3,'(a)') runname(1:LEN) WRITE(3,'(i1.1)') nocmnt DO i = 1,nocmnt LEN =80 CALL slength(cmnt(i),LEN) WRITE(3,'(a)') cmnt(i)(1:LEN) END DO ! 110 FORMAT(a80) ! READ(1,110,END=30) line ! read header lines and discard them.. READ(1,110,END=30) line READ(1,110,END=30) line ! DO i=1,mosmax ! 115 FORMAT(a3,3X,f5.2,2X,f7.2,1X,i4) ! READ(1,110,END=30) line ! mosstn=mosstn+1 ! READ(line,115) mosstid(mosstn),moslat(mosstn),moslon(mosstn), & iselev_act istnm=0 ! Assumes a station number is unavailable moselev_act(mosstn)=FLOAT(iselev_act) ! CALL lltoxy(1,1,moslat(mosstn),moslon(mosstn), & mosxpt(mosstn),mosypt(mosstn)) ! mosxpt(mosstn)=mosxpt(mosstn)-xll mosypt(mosstn)=mosypt(mosstn)-yll ! CALL findlc2(nx,ny,xs,ys,mosxpt(mosstn),mosypt(mosstn), & mosipt(mosstn),mosjpt(mosstn),ireturn) ! IF (ireturn < 0) THEN ! stn is outside the grid mosstn=mosstn-1 ELSE ! stn is inside the grid WRITE(3,110) line ! write location data to a file END IF ! END DO ! END IF ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column ! for each station, derive the sounding variables, and write the ! extracted sounding to dumpfile... ! !----------------------------------------------------------------------- ! 30 CONTINUE ! DO i=1,mosstn ! do for each station 'i' ... ! dumpfile = './mos_dumps/' LEN =256 CALL slength( dumpfile, LEN) WRITE(dumpfile(LEN+1:LEN+7),'(a7)') mosstid(i)(1:3)//'_mos' OPEN(UNIT=2,FILE=dumpfile,STATUS='unknown',POSITION='append') WRITE(2,991) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) 991 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) DO ii=1,nx DO ij=1,ny tem4(ii,ij)=0. END DO END DO ! !----------------------------------------------------------------------- ! ! Interpolate (in the horizontal) for the whole vertical column. ! !----------------------------------------------------------------------- ! !TODO: Interpolate all tsoil and qsoil to station. CALL colintmos(nx,ny,nz,nzsoil,nstyps,nzmax, & xs,ys,zp,mosxpt(i),mosypt(i),mosipt(i),mosjpt(i), & uprt,ubar,vprt,vbar,wprt,wbar, & ptprt,ptbar,pprt,pbar,qvprt,qvbar, & qc,qr,qi,qs,qh,tke,kmh,kmv,rhobar, & zpsoil,tsoil,qsoil,wetcanp, & snowdpth,soiltyp,stypfrct,vegtyp, & lai,roufns,veg,raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx, & qvsflx,su,sv,sw,spt,sp,sqv,sqc,sqr, & sqi,sqs,sqh,stke,skmh,skmv,srhobar, & stsfc,stsoil,swetsfc,swetdp, & swetcanp,ssnowdpth,ssoiltyp,sstypfrct, & svegtyp,slai,sroufns,sveg,sraing,srainc, & sprcrate,sradfrc,sradsw,srnflx,sradswnet,sradlwin, & susflx,svsflx,sptsflx,sqvsflx,shght,shterain, & tem1,nlevs) ! !----------------------------------------------------------------------- ! ! Convert u and v from map coordinates to earth coordinates ! !----------------------------------------------------------------------- ! DO k = 1,nz-1 CALL uvmptoe(1,1,su(k),sv(k),moslon(i),su(k),sv(k)) END DO ! !----------------------------------------------------------------------- ! ! Write out soundings for the current model time.. ! !----------------------------------------------------------------------- ! WRITE(line,116) mosstid(i),moslat(i),moslon(i), & shterain, (nlevs-2), nstyps 116 FORMAT(a4,2X,f5.2,2X,f7.2,2X,f6.1,2X,i2,2X,i2) WRITE(2,110) line ! write location data to a file WRITE(2,990) year,'-',month,'-',day,'.',hour,':',minute,':', & second,'+',INT(time) 990 FORMAT(i4.4,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i2.2,a,i6.6) LEN =80 CALL slength(runname,LEN) WRITE(2,'(a)') runname(1:LEN) WRITE(2,'(i1.1)') nocmnt DO j = 1,nocmnt LEN =80 CALL slength(cmnt(j),LEN) WRITE(2,'(a)') cmnt(j)(1:LEN) END DO WRITE(2,125) 125 FORMAT(7X, & 'hght u v ', & 'w ') WRITE(2,126) 126 FORMAT(7X, & 'm m/s m/s ', & 'm/s ') DO k = 2,(nlevs-1) WRITE(2,230) shght(k),su(k),sv(k),sw(k) 230 FORMAT(1X,4(e16.10,1X)) END DO WRITE(2,127) 127 FORMAT(7X, & 'pt p qv ', & 'qc ') WRITE(2,128) 128 FORMAT(7X, & 'K Pa kg/kg ', & 'kg/kg ') DO k = 2,(nlevs-1) WRITE(2,230) spt(k),sp(k),sqv(k),sqc(k) END DO WRITE(2,129) 129 FORMAT(7X, & 'qr qi qs ', & 'qh ') WRITE(2,130) 130 FORMAT(7X, & 'kg/kg kg/kg kg/kg ', & 'kg/kg ') DO k = 2,(nlevs-1) WRITE(2,230) sqr(k),sqi(k),sqs(k),sqh(k) END DO WRITE(2,131) 131 FORMAT(7X, & 'tke kmh kmv ', & 'rhobar ') WRITE(2,132) 132 FORMAT(7X, & 'm^2/s^2 m^2/s m^2/s ', & 'kg/m^3 ') DO k = 2,(nlevs-1) WRITE(2,230) stke(k),skmh(k),skmv(k),srhobar(k) END DO WRITE(2,133) 133 FORMAT(7X, & 'radfrc ') WRITE(2,134) 134 FORMAT(7X, & 'K/s ') DO k = 2,(nlevs-1) WRITE(2,231) sradfrc(k) 231 FORMAT(1X,1(e16.10,1X)) END DO WRITE(2,135) 135 FORMAT(7X, & 'tsfc tsoil wetsfc ', & 'wetdp ') WRITE(2,136) 136 FORMAT(7X, & 'K K ', & ' ') DO k = 0,nstyps WRITE(2,240) stsfc(k),stsoil(k),swetsfc(k),swetdp(k) 240 FORMAT(1X,4(e16.10,1X)) END DO WRITE(2,137) 137 FORMAT(7X, & 'wetcanp ') WRITE(2,138) 138 FORMAT(7X, & ' ') DO k = 0,nstyps WRITE(2,241) swetcanp(k) 241 FORMAT(1X,1(e16.10,1X)) END DO WRITE(2,145) 145 FORMAT(7X, & 'ssoiltyp sstypfrct ') 146 FORMAT(7X, & ' ') WRITE(2,146) DO k = 1,nstyps WRITE(2,150) ssoiltyp(k),sstypfrct(k) 150 FORMAT(1X,i16,1X e16.10) END DO WRITE(2,155) 155 FORMAT(7X, & 'snowdpth vegtyp lai ', & 'roufns ') WRITE(2,156) 156 FORMAT(7X, & 'm ', & ' ') WRITE(2,260) ssnowdpth,svegtyp,slai,sroufns 260 FORMAT(1X,e16.10,1X,i16,1X,2(e16.10,1X)) WRITE(2,157) 157 FORMAT(7X, & 'veg raing rainc ', & 'radsw ') WRITE(2,158) 158 FORMAT(7X, & ' ', & ' ') WRITE(2,261) sveg,sraing,srainc,sradsw 261 FORMAT(1X,4(e16.10,1X)) ! WRITE(2,159) ! 159 FORMAT(7X, & ! 'rnflx usflx vsflx ', & ! 'ptsflx ') ! WRITE(2,160) ! 160 FORMAT(7X, & ! ' kg/m/s^2 kg/m/s^2 ', & ! 'K kg/m/s^2 ') ! WRITE(2,261) srnflx,susflx,svsflx,sptsflx WRITE(2,159) 159 FORMAT(7X, & 'rnflx radswnet radlwin ', & 'usflx ') WRITE(2,160) 160 FORMAT(7X, & ' ', & 'K kg/m/s^2 ') WRITE(2,261) srnflx,sradswnet,radlwin,susflx ! WRITE(2,161) ! 161 FORMAT(7X, & ! 'qvsflx ') ! WRITE(2,162) ! 162 FORMAT(7X, & ! 'kg/s/m^2 ') ! WRITE(2,262) sqvsflx ! 262 FORMAT(1X,1(e16.10,1X)) WRITE(2,161) 161 FORMAT(7X, & 'vsflx ptsflx qvsflx ') WRITE(2,162) 162 FORMAT(7X, & 'kg/s/m^2 K kg/m/s^2 kg/m/s^2 ') WRITE(2,262) svsflx,sptflx,sqvsflx 262 FORMAT(1X,3(e16.10,1X)) WRITE(2,165) 165 FORMAT(7X, & 'prcrate ') WRITE(2,166) 166 FORMAT(7X, & 'kg/m^2/s ') DO k = 1,4 WRITE(2,170) sprcrate(k) 170 FORMAT(1X,e16.10,i16,11(e16.10)) END DO CLOSE(2) END DO ! Move on to the next station.. ! CLOSE(1) ! CLOSE(2) CLOSE(3) ! RETURN ! END SUBROUTINE mosdump !################################################################## !################################################################## !###### ###### !###### SUBROUTINE COLINTMOS ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE colintmos(nx,ny,nz,nzsoil,nstyps,nzmax, & 1,8 xs,ys,zp,xpt,ypt,ipt,jpt, & uprt,ubar,vprt,vbar,wprt,wbar, & ptprt,ptbar,pprt,pbar,qvprt,qvbar, & qc,qr,qi,qs,qh,tke,kmh,kmv,rhobar, & zpsoil,tsoil,qsoil,wetcanp, & snowdpth,soiltyp,stypfrct,vegtyp, & lai,roufns,veg,raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx, & qvsflx,su,sv,sw,spt,sp,sqv,sqc,sqr, & sqi,sqs,sqh,stke,skmh,skmv,srhobar, & stsfc,stsoil,swetsfc,swetdp, & swetcanp,ssnowdpth,ssoiltyp,sstypfrct, & svegtyp,slai,sroufns,sveg,sraing,srainc, & sprcrate,sradfrc,sradsw,srnflx,sradswnet,sradlwin, & susflx,svsflx,sptsflx,sqvsflx,shght,shterain, & tem1,nlevs) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolates ARPS history data in the horizontal to create ! a column of data located at point xpt, ypt. ! ! Bilinear interpolation is used. ! ! Based on subroutine COLINTB ! !----------------------------------------------------------------------- ! ! AUTHOR: Eric Kemp ! May 2000 ! ! Modified 1 June 2002 Eric Kemp ! Updated soil variables. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx,ny,nz Dimensions of ARPS grids. ! ! nzmax Maximum number of vertical levels allowed ! ! xs x coordinate of scalar points in physical/comp. space (m) ! ys y coordinate of scalar points in physical/comp. space (m) ! zp z coordinate of scalar grid points in physical space (m) ! ! xpt x coordinate of desired sounding (m) ! ypt y coordinate of desired sounding (m) ! ! ipt i index of grid point just west of xpt,ypt ! jpt j index of grid point just south of xpt,ypt ! ! uprt x component of perturbation velocity (m/s) ! vprt y component of perturbation velocity (m/s) ! ! ptprt Perturbation potential temperature (K) ! pprt Perturbation pressure (Pascal) ! ! qvprt Perturbation water vapor mixing ratio (kg/kg) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! raing Supersaturation rainfall ! rainc Cumulus convective rainfall ! ! OUTPUT: ! ! su Interpolated u wind component. (m/s) ! sv Interpolated v wind component. (m/s) ! stheta Interpolated potential temperature (K). ! spres Interpolated pressure. (Pascals) ! shght Interpolated height (meters) ! sqv Interpolated water vapor mixing ratio (kg/kg). ! srain Interpolated accumulated rainfall (m) ! nlevs Number of scalar levels. ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! ! Arguments -- location data ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Dimensions of ARPS grids. INTEGER :: nzsoil ! Number of soil levels INTEGER :: nstyps INTEGER :: nzmax ! Maximum # of vertical levels allowed REAL :: xs(nx) ! x coordinate of grid points in ! physical/comp. space (m) REAL :: ys(ny) ! y coordinate of grid points in ! physical/comp. space (m) REAL :: zp(nx,ny,nz) ! z coordinate of grid points in ! physical space (m) REAL :: zpsoil(nx,ny,nzsoil) ! Soil level height (m) REAL :: xpt ! location to find in x coordinate (m) REAL :: ypt ! location to find in y coordinate (m) INTEGER :: ipt ! i index to the west of desired ! location INTEGER :: jpt ! j index to the south of desired ! location ! !----------------------------------------------------------------------- ! ! Arguments -- model data ! !----------------------------------------------------------------------- ! REAL :: uprt (nx,ny,nz) ! Perturbation u velocity (m/s) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vprt (nx,ny,nz) ! Perturbation v velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: wprt (nx,ny,nz) ! Perturbation w velocity (m/s) REAL :: wbar (nx,ny,nz) ! Base state z velocity component (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: qvprt (nx,ny,nz) ! Perturbation wv mixing ration (kg/kg) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rainwater mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type 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 :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! 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) = cumulative precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m*s**2)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) ! !----------------------------------------------------------------------- ! ! Arguments -- Extracted sounding variables ! !----------------------------------------------------------------------- ! INTEGER :: nlevs ! REAL :: su(nzmax) REAL :: sv(nzmax) REAL :: sw(nzmax) REAL :: spt(nzmax) REAL :: sp(nzmax) REAL :: sqv(nzmax) REAL :: sqc(nzmax) REAL :: sqr(nzmax) REAL :: sqi(nzmax) REAL :: sqs(nzmax) REAL :: sqh(nzmax) REAL :: stke(nzmax) REAL :: skmh(nzmax) REAL :: skmv(nzmax) REAL :: srhobar(nzmax) REAL :: stsfc(0:nstyps) REAL :: stsoil(0:nstyps) REAL :: swetsfc(0:nstyps) REAL :: swetdp(0:nstyps) REAL :: swetcanp(0:nstyps) REAL :: ssnowdpth INTEGER :: ssoiltyp(nstyps) REAL :: sstypfrct(nstyps) INTEGER :: svegtyp REAL :: slai REAL :: sroufns REAL :: sveg REAL :: sraing REAL :: srainc REAL :: sprcrate(4) REAL :: sradfrc(nzmax) REAL :: sradsw REAL :: srnflx REAL :: sradswnet REAL :: sradlwin REAL :: susflx REAL :: svsflx REAL :: sptsflx REAL :: sqvsflx REAL :: shght(nzmax) REAL :: shterain REAL :: srain REAL :: stmp REAL :: p(nx,ny,nz) REAL :: pt(nx,ny,nz) REAL :: qv(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Temporary work arrays ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Functions called ! !----------------------------------------------------------------------- ! REAL :: aint2dtmp ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,in,jn REAL :: delx,ddx,dely,ddy,w1,w2,w3,w4 ! REAL :: mindist,d1,d2,d3,d4 INTEGER :: numprec ! !----------------------------------------------------------------------- ! ! Find corner weights ! !----------------------------------------------------------------------- ! DO k = 1,nz DO j = 1,ny DO i = 1,nx p(i,j,k) = pbar(i,j,k) + pprt(i,j,k) qv(i,j,k) = qvbar(i,j,k) + qvprt(i,j,k) pt(i,j,k) = ptbar(i,j,k) + ptprt(i,j,k) END DO END DO END DO in=ipt+1 delx=xs(in)-xs(ipt) IF(ABS(delx) > 0.) THEN ddx=(xpt-xs(ipt))/delx ELSE ddx=0. END IF jn=jpt+1 dely=ys(jn)-ys(jpt) IF(ABS(dely) > 0.) THEN ddy=(ypt-ys(jpt))/dely ELSE ddy=0. END IF w1=(1.-ddx*(1.-ddy)) w3=ddx*ddy w4=(1.-ddx)*ddy ! !----------------------------------------------------------------------- ! ! Interpolate all variables at all levels. ! !----------------------------------------------------------------------- ! nlevs=nz-1 DO k=1,nz shght(k)= & aint2dtmp(nx,ny,nz, zp,ipt,jpt,k,in,jn,w1,w2,w3,w4) spt(k)= & aint2dtmp(nx,ny,nz, pt,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqv(k)= & aint2dtmp(nx,ny,nz, qv,ipt,jpt,k,in,jn,w1,w2,w3,w4) sp(k)= & aint2dtmp(nx,ny,nz, p,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqc(k)= & aint2dtmp(nx,ny,nz, qc,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqr(k)= & aint2dtmp(nx,ny,nz, qr,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqi(k)= & aint2dtmp(nx,ny,nz, qi,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqs(k)= & aint2dtmp(nx,ny,nz, qs,ipt,jpt,k,in,jn,w1,w2,w3,w4) sqh(k)= & aint2dtmp(nx,ny,nz, qh,ipt,jpt,k,in,jn,w1,w2,w3,w4) stke(k)= & aint2dtmp(nx,ny,nz,tke,ipt,jpt,k,in,jn,w1,w2,w3,w4) skmh(k)= & aint2dtmp(nx,ny,nz,kmh,ipt,jpt,k,in,jn,w1,w2,w3,w4) skmv(k)= & aint2dtmp(nx,ny,nz,kmv,ipt,jpt,k,in,jn,w1,w2,w3,w4) srhobar(k)= & aint2dtmp(nx,ny,nz,rhobar,ipt,jpt,k,in,jn,w1,w2,w3,w4) sradfrc(k)= & aint2dtmp(nx,ny,nz,radfrc,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! !----------------------------------------------------------------------- ! ! Bilinearly interpolate snowdpth and radsw, and use nearest ! neighbor values for other soil variables. ! !----------------------------------------------------------------------- ! CALL colintsoil2d(nx,ny,nz,tem1,snowdpth,ssnowdpth, & ipt,jpt,in,jn,w1,w2,w3,w4) CALL colintsoil2d(nx,ny,nz,tem1,radsw,sradsw, & ipt,jpt,in,jn,w1,w2,w3,w4) d1=((xpt-xs(ipt))**2+(ypt-ys(jpt))**2)**(1./2.) d2=((xpt-xs(ipt+1))**2+(ypt-ys(jpt))**2)**(1./2.) d3=((xpt-xs(ipt))**2+(ypt-ys(jpt+1))**2)**(1./2.) d4=((xpt-xs(ipt+1))**2+(ypt-ys(jpt+1))**2)**(1./2.) mindist=AMIN1(d1,d2) mindist=AMIN1(mindist,d3) mindist=AMIN1(mindist,d4) ! IF (mindist == d1) THEN DO k = 1,nstyps ssoiltyp(k) = soiltyp(ipt,jpt,k) sstypfrct(k) = stypfrct(ipt,jpt,k) END DO DO k = 0,nstyps stsfc(k) = tsoil(ipt,jpt,1,k) stsoil(k) = tsoil(ipt,jpt,nzsoil,k) swetsfc(k) = qsoil(ipt,jpt,1,k) swetdp(k) = qsoil(ipt,jpt,nzsoil,k) swetcanp(k) = wetcanp(ipt,jpt,k) END DO svegtyp = vegtyp(ipt,jpt) slai = lai(ipt,jpt) sroufns = roufns(ipt,jpt) sveg = veg(ipt,jpt) srnflx = rnflx(ipt,jpt) sradswnet = radswnet(ipt,jpt) sradlwin = radlwin(ipt,jpt) susflx = usflx(ipt,jpt) svsflx = vsflx(ipt,jpt) sptsflx = ptsflx(ipt,jpt) sqvsflx = qvsflx(ipt,jpt) ELSE IF (mindist == d2) THEN DO k = 1,nstyps ssoiltyp(k) = soiltyp(ipt+1,jpt,k) sstypfrct(k) = stypfrct(ipt+1,jpt,k) END DO DO k = 0,nstyps stsfc(k) = tsoil(ipt+1,jpt,1,k) stsoil(k) = tsoil(ipt+1,jpt,nzsoil,k) swetsfc(k) = qsoil(ipt+1,jpt,1,k) swetdp(k) = qsoil(ipt+1,jpt,nzsoil,k) swetcanp(k) = wetcanp(ipt+1,jpt,k) END DO svegtyp = vegtyp(ipt+1,jpt) slai = lai(ipt+1,jpt) sroufns = roufns(ipt+1,jpt) sveg = veg(ipt+1,jpt) srnflx = rnflx(ipt+1,jpt) sradswnet = radswnet(ipt+1,jpt) sradlwin = radlwin(ipt+1,jpt) susflx = usflx(ipt+1,jpt) svsflx = vsflx(ipt+1,jpt) sptsflx = ptsflx(ipt+1,jpt) sqvsflx = qvsflx(ipt+1,jpt) ELSE IF (mindist == d3) THEN DO k = 1,nstyps ssoiltyp(k) = soiltyp(ipt,jpt+1,k) sstypfrct(k) = stypfrct(ipt,jpt+1,k) END DO DO k = 0,nstyps stsfc(k) = tsoil(ipt,jpt+1,1,k) stsoil(k) = tsoil(ipt,jpt+1,nzsoil,k) swetsfc(k) = qsoil(ipt,jpt+1,1,k) swetdp(k) = qsoil(ipt,jpt+1,nzsoil,k) swetcanp(k) = wetcanp(ipt,jpt+1,k) END DO svegtyp = vegtyp(ipt,jpt+1) slai = lai(ipt,jpt+1) sroufns = roufns(ipt,jpt+1) sveg = veg(ipt,jpt+1) srnflx = rnflx(ipt,jpt+1) sradswnet = radswnet(ipt,jpt+1) sradlwin = radlwin(ipt,jpt+1) susflx = usflx(ipt,jpt+1) svsflx = vsflx(ipt,jpt+1) sptsflx = ptsflx(ipt,jpt+1) sqvsflx = qvsflx(ipt,jpt+1) ELSE IF (mindist == d4) THEN DO k = 1,nstyps ssoiltyp(k) = soiltyp(ipt+1,jpt+1,k) sstypfrct(k) = stypfrct(ipt+1,jpt+1,k) END DO DO k = 0,nstyps stsfc(k) = tsoil(ipt+1,jpt+1,1,k) stsoil(k) = tsoil(ipt+1,jpt+1,nzsoil,k) swetsfc(k) = qsoil(ipt+1,jpt+1,1,k) swetdp(k) = qsoil(ipt+1,jpt+1,nzsoil,k) swetcanp(k) = wetcanp(ipt+1,jpt+1,k) END DO svegtyp = vegtyp(ipt+1,jpt+1) slai = lai(ipt+1,jpt+1) sroufns = roufns(ipt+1,jpt+1) sveg = veg(ipt+1,jpt+1) srnflx = rnflx(ipt+1,jpt+1) sradswnet = radswnet(ipt+1,jpt+1) sradlwin = radlwin(ipt+1,jpt+1) susflx = usflx(ipt+1,jpt+1) svsflx = vsflx(ipt+1,jpt+1) sptsflx = ptsflx(ipt+1,jpt+1) sqvsflx = qvsflx(ipt+1,jpt+1) ELSE WRITE(6,*) "mindist-d's:",mindist,d1,d2,d3,d4 DO k = 1,nstyps ssoiltyp(k) = soiltyp(ipt,jpt,k) sstypfrct(k) = stypfrct(ipt,jpt,k) END DO DO k = 0,nstyps stsfc(k) = tsoil(ipt,jpt,1,k) stsoil(k) = tsoil(ipt,jpt,nzsoil,k) swetsfc(k) = qsoil(ipt,jpt,1,k) swetdp(k) = qsoil(ipt,jpt,nzsoil,k) swetcanp(k) = wetcanp(ipt,jpt,k) END DO svegtyp = vegtyp(ipt,jpt) slai = lai(ipt,jpt) sroufns = roufns(ipt,jpt) sveg = veg(ipt,jpt) srnflx = rnflx(ipt,jpt) sradswnet = radswnet(ipt,jpt) sradlwin = radlwin(ipt,jpt) susflx = usflx(ipt,jpt) svsflx = vsflx(ipt,jpt) sptsflx = ptsflx(ipt,jpt) sqvsflx = qvsflx(ipt,jpt) END IF ! !----------------------------------------------------------------------- ! ! Interpolate accumulated precip. and rainrates ! !----------------------------------------------------------------------- ! DO i=1,nx DO j=1,ny tem1(i,j,1)=raing(i,j) END DO END DO CALL colintprec(nx,ny,nz,tem1,sraing,ipt,jpt,in,jn, & xpt,ypt,xs,ys,w1,w2,w3,w4) DO i=1,nx DO j=1,ny tem1(i,j,1)=rainc(i,j) END DO END DO CALL colintprec(nx,ny,nz,tem1,srainc,ipt,jpt,in,jn, & xpt,ypt,xs,ys,w1,w2,w3,w4) srain = srainc+sraing DO i=1,nx DO j=1,ny tem1(i,j,1)=prcrate(i,j,1) END DO END DO CALL colintprec(nx,ny,nz,tem1,stmp,ipt,jpt,in,jn, & xpt,ypt,xs,ys,w1,w2,w3,w4) sprcrate(1) =stmp DO i=1,nx DO j=1,ny tem1(i,j,1)=prcrate(i,j,2) END DO END DO CALL colintprec(nx,ny,nz,tem1,stmp,ipt,jpt,in,jn, & xpt,ypt,xs,ys,w1,w2,w3,w4) sprcrate(2) =stmp DO i=1,nx DO j=1,ny tem1(i,j,1)=prcrate(i,j,3) END DO END DO CALL colintprec(nx,ny,nz,tem1,stmp,ipt,jpt,in,jn, & xpt,ypt,xs,ys,w1,w2,w3,w4) sprcrate(3) =stmp DO i=1,nx DO j=1,ny tem1(i,j,1)=prcrate(i,j,4) END DO END DO CALL colintprec(nx,ny,nz,tem1,stmp,ipt,jpt,in,jn, & xpt,ypt,xs,ys,w1,w2,w3,w4) sprcrate(4) =stmp ! ! !----------------------------------------------------------------------- ! ! Get height at scalar points, since zp was defined at w points. ! !----------------------------------------------------------------------- ! shterain = shght(2) DO k=1,nz-1 shght(k)=0.5*(shght(k+1)+shght(k)) END DO ! !----------------------------------------------------------------------- ! ! Form total u wind component at scalar points ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=0.5*(ubar(i,j,k)+ubar(i+1,j,k))+ & 0.5*(uprt(i,j,k)+uprt(i+1,j,k)) END DO END DO END DO DO k=1,nz-1 su(k)= & aint2dtmp(nx,ny,nz, tem1,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! !----------------------------------------------------------------------- ! ! Form total v wind component at scalar points ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=0.5*(vbar(i,j,k)+vbar(i,j+1,k)) + & 0.5*(vprt(i,j,k)+vprt(i,j+1,k)) END DO END DO END DO DO k=1,nz-1 sv(k)= & aint2dtmp(nx,ny,nz, tem1,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! !----------------------------------------------------------------------- ! ! Form total w wind component at scalar points ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=0.5*(wbar(i,j,k)+wbar(i,j,k+1)) + & 0.5*(wprt(i,j,k)+wprt(i,j,k+1)) END DO END DO END DO DO k=1,nz-1 sw(k)= & aint2dtmp(nx,ny,nz, tem1,ipt,jpt,k,in,jn,w1,w2,w3,w4) END DO ! RETURN END SUBROUTINE colintmos !################################################################## !################################################################## !###### ###### !###### SUBROUTINE COLINTSOILSD ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE colintsoilsd(nx,ny,nstyps,tem1,soilvar,ssoilvar, & ipt,jpt,in,jn,w1,w2,w3,w4) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolates "special dimension" soil data array in the ! horizontal to create a column of data. Must be called by ! subroutine COLINTMOS. ! ! Bilinear interpolation is used. ! ! Based on subroutine COLINTB ! !----------------------------------------------------------------------- ! ! AUTHOR: Eric Kemp ! May 2000 ! !----------------------------------------------------------------------- ! ! Arguments ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nx,ny,nstyps REAL :: tem1(nx,ny,nstyps) REAL :: soilvar(nx,ny,0:nstyps),ssoilvar(0:nstyps) INTEGER :: ipt ! i index to the west of desired ! location INTEGER :: jpt ! j index to the south of desired ! location INTEGER :: in,jn REAL :: w1,w2,w3,w4 !----------------------------------------------------------------------- ! ! Miscellaneous variables. ! !----------------------------------------------------------------------- INTEGER :: i,j,k !----------------------------------------------------------------------- ! ! Functions called ! !----------------------------------------------------------------------- REAL :: aint2dtmp ! function !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DO k=1,nstyps+1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)= soilvar(i,j,k-1) END DO END DO END DO DO k=1,nstyps+1 ssoilvar(k-1)= & aint2dtmp(nx,ny,(nstyps+1),tem1,ipt,jpt,k,in,jn,w1,w2, & w3,w4) END DO RETURN END SUBROUTINE colintsoilsd ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE COLINTSOIL2D ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE colintsoil2d(nx,ny,nz,tem1,soilvar,ssoilvar, & 2 ipt,jpt,in,jn,w1,w2,w3,w4) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolates two dimension soil data array in the ! horizontal to create a column of data. Must be called by ! subroutine COLINTMOS. ! ! Bilinear interpolation is used. ! ! Based on subroutine COLINTB. ! !----------------------------------------------------------------------- ! ! AUTHOR: Eric Kemp ! May 2000 ! !----------------------------------------------------------------------- ! ! Arguments ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: tem1(nx,ny,nz) REAL :: soilvar(nx,ny),ssoilvar INTEGER :: ipt ! i index to the west of desired ! location INTEGER :: jpt ! j index to the south of desired ! location INTEGER :: in,jn REAL :: w1,w2,w3,w4 !----------------------------------------------------------------------- ! ! Miscellaneous variables. ! !----------------------------------------------------------------------- INTEGER :: i,j,k !----------------------------------------------------------------------- ! ! Functions called ! !----------------------------------------------------------------------- REAL :: aint2dtmp ! function !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)= soilvar(i,j) END DO END DO END DO ssoilvar= & aint2dtmp(nx,ny,nz,tem1,ipt,jpt,1,in,jn,w1,w2, & w3,w4) RETURN END SUBROUTINE colintsoil2d !################################################################## !################################################################## !###### ###### !###### SUBROUTINE COLINTPREC ###### !###### ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma. All rights reserved. ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE colintprec(nx,ny,nz,tem1,sprec,ipt,jpt,in,jn, & 6 xpt,ypt,xs,ys,w1,w2,w3,w4) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolates two dimension soil precip. in the ! horizontal to create a column of data. Must be called by ! subroutine COLINTMOS. ! ! Bilinear interpolation is used. ! ! Based on subroutine COLINTB. ! !----------------------------------------------------------------------- ! ! AUTHOR: Eric Kemp ! May 2000 ! !----------------------------------------------------------------------- ! ! Arguments ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nx,ny,nz REAL :: tem1(nx,ny,nz), sprec INTEGER :: in,jn REAL :: w1,w2,w3,w4 INTEGER :: ipt,jpt REAL :: xs(nx),ys(nx) REAL :: xpt,ypt !----------------------------------------------------------------------- ! ! Misc. variables ! !----------------------------------------------------------------------- INTEGER :: i,j,k,numprec REAL :: mindist,d1,d2,d3,d4 !----------------------------------------------------------------------- ! ! Functions ! !----------------------------------------------------------------------- REAL :: aint2dtmp ! function !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ numprec=0 ! # of g.p.'s surrounding stn with precip forecast IF (tem1(ipt,jpt,1) > 0) THEN numprec=numprec+1 END IF IF (tem1(ipt+1,jpt,1) > 0) THEN numprec=numprec+1 END IF IF (tem1(ipt,jpt+1,1) > 0) THEN numprec=numprec+1 END IF IF (tem1(ipt+1,jpt+1,1) > 0) THEN numprec=numprec+1 END IF ! IF (numprec == 0) THEN ! no g.p.'s have precip forecast ! sprec=0. GO TO 210 ! ELSE ! at least 1 g.p. has precip forecast ! sprec=aint2dtmp(nx,ny,nz,tem1,ipt,jpt,1,in,jn,w1,w2,w3,w4) ! IF (numprec >= 3) THEN ! if at least 3 have precip, ! interpolation is finished GO TO 210 ! END IF ! END IF ! !---------------------------------------------------------------------- ! ! If less than 3 surrounding grid points have precip ! forecast, do further checking to see if the nearest ! grid point has precip forecast, and use that to determine ! whether the station's precip should be set to zero or ! not. ! !---------------------------------------------------------------------- ! d1=((xpt-xs(ipt))**2+(ypt-ys(jpt))**2)**(1./2.) d2=((xpt-xs(ipt+1))**2+(ypt-ys(jpt))**2)**(1./2.) d3=((xpt-xs(ipt))**2+(ypt-ys(jpt+1))**2)**(1./2.) d4=((xpt-xs(ipt+1))**2+(ypt-ys(jpt+1))**2)**(1./2.) mindist=AMIN1(d1,d2) mindist=AMIN1(mindist,d3) mindist=AMIN1(mindist,d4) ! IF (mindist == d1) THEN IF (tem1(ipt,jpt,1) == 0) THEN sprec=0. END IF ELSE IF (mindist == d2) THEN IF (tem1(ipt+1,jpt,1) == 0) THEN sprec=0. END IF ELSE IF (mindist == d3) THEN IF (tem1(ipt,jpt+1,1) == 0) THEN sprec=0. END IF ELSE IF (mindist == d4) THEN IF (tem1(ipt+1,jpt+1,1) == 0) THEN sprec=0. END IF ELSE WRITE(6,*) "mindist-d's:",mindist,d1,d2,d3,d4 END IF 210 CONTINUE RETURN END SUBROUTINE colintprec