! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSSOIL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! PROGRAM arpssoil,87 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Process soil temperature and other soil obs and create ! soil input file for ARPS. ! ! !----------------------------------------------------------------------- ! ! AUTHORS: Min Zou and Keith Brewster ! May, 1994 ! ! MODIFICATION HISTORY: ! Oct, 1994 (KB) ! Changed input times to be more flexible. ! ! Nov 14, 1994 (KB) ! Write data in format expected for ARPS subroutine INITSFC ! !----------------------------------------------------------------------- ! ! Sizing parameters ! Note in the following, nvar_max is the max of ! nvar_ob and nvar_anx, and is used for the size of the ! Barnes work arrays. ! ntime is the number of time levels of obs read-in. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx, ny, nz ! dimensions at x, y, z diretions. INTEGER :: ntime,nvar_ob,nvar_anx,nvar_max,nvar_out PARAMETER (ntime=1, & nvar_ob=3, nvar_anx=3, nvar_max=3, nvar_out=3) INTEGER :: mxstn,nsrc_sfc PARAMETER (mxstn=500,nsrc_sfc=4) ! !----------------------------------------------------------------------- ! ! Barnes analysis parameters ! !----------------------------------------------------------------------- ! INTEGER :: npass REAL :: defrange,wlim INTEGER :: iqspr REAL :: sprdist,derrtol PARAMETER (npass = 3, & wlim = 1.e-06, & ! minimum weight -- establishes max radius iqspr= 7, & ! Use qobs of pstn to combine x,y,elev sprdist = 15., & ! km -- closer pairs are made into superob derrtol = 20.) ! km INTEGER :: klim(npass) DATA klim /1,2,2/ REAL :: kappa(npass) DATA kappa /3.,1.,1./ INTEGER :: irngsel(nvar_max) DATA irngsel /1,1,1/ ! !----------------------------------------------------------------------- ! ! Barnes scratch space ! !----------------------------------------------------------------------- ! INTEGER :: maxrng PARAMETER(maxrng=1) INTEGER :: knt(nvar_max) REAL :: rngwgt(maxrng) REAL :: wgtsum(nvar_max),zsum(nvar_max) ! REAL, ALLOCATABLE :: xgrid(:),ygrid(:) ! !----------------------------------------------------------------------- ! ! Barnes scale range ! !----------------------------------------------------------------------- ! REAL :: rngobs(mxstn) REAL, ALLOCATABLE :: range(:,:) ! !----------------------------------------------------------------------- ! ! Primary analysis variables ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: anx(:,:,:) ! REAL, ALLOCATABLE :: tsfc(:,:) REAL, ALLOCATABLE :: tsoil(:,:) ! !----------------------------------------------------------------------- ! ! Primary observation variables ! !----------------------------------------------------------------------- ! INTEGER :: isrc(mxstn) REAL :: obs(mxstn,nvar_anx) REAL :: odiff(mxstn,nvar_anx) REAL :: obanx(mxstn,nvar_anx) CHARACTER (LEN=6) :: var_ob(nvar_ob) DATA var_ob / 'tsod05','tsod30','solrad'/ CHARACTER (LEN=6) :: var_anx(nvar_anx) DATA var_anx/ 'tsod05','tsod30','solrad'/ ! !----------------------------------------------------------------------- ! ! Quality Control Parameters and Variables ! !----------------------------------------------------------------------- ! REAL :: rmiss PARAMETER (rmiss=-99.) ! real qclim(nsrc_sfc,nvar_ob) INTEGER :: rely(mxstn,nvar_ob,ntime) ! real qobsrd(mxstn,nvar_ob) REAL :: qobs(mxstn,nvar_anx) ! !----------------------------------------------------------------------- ! ! Climin is the minimum possible value of each observed variable. ! Climax is the maximum possible value of each observed variable. ! !----------------------------------------------------------------------- ! REAL :: climin(nvar_ob),climax(nvar_ob) DATA climin / -50.,-50.,0./ DATA climax / 50., 50.,1500./ ! !----------------------------------------------------------------------- ! ! Source-dependent parameters ! Qobs is the expected square error it is used for ! setting the QC threshold (qclim) and for relative ! weighting of observations. ! Zero is not a valid qobs. ! !----------------------------------------------------------------------- ! REAL :: qcmult PARAMETER(qcmult=3.0) ! mult sqrt(qobs) by 3.0 to get qclim CHARACTER (LEN=8) :: name_src(nsrc_sfc) REAL :: qsrc(nsrc_sfc,nvar_ob) DATA name_src /'MESO','MOBLS','MOBLM','SA'/ DATA qsrc / 2., 2., 2., 2., & 2., 2., 2., 2., & 100., 100., 100., 100./ ! !----------------------------------------------------------------------- ! ! Read_obs parameter ! !----------------------------------------------------------------------- ! INTEGER :: k_sta CHARACTER (LEN=4) :: xtnam(mxstn) REAL :: xtlat(mxstn),xtlon(mxstn),xtelev(mxstn),xts(mxstn,nvar_anx) REAL :: xtx(mxstn),xty(mxstn) CHARACTER (LEN=9) :: c9time CHARACTER (LEN=15) :: gradsctl CHARACTER (LEN=15) :: gradsfile CHARACTER (LEN=3) :: monnam(12) DATA monnam/'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', & 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/ ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,initsec,myr,istat,istatus,ierr INTEGER :: tsfcout,tsoilout,wsfcout,wdpout,wcanpout,idummy REAL :: lllat,lllon,lrlat,lrlon,urlat,urlon,ullat,ullon,rdummy REAL :: latnot(2) REAL :: x0,y0 ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Call initpara to read in ARPS parameters of namelists ! !----------------------------------------------------------------------- ! CALL initpara(nx,ny,nz,nstyps) ! CALL ctim2abss(year,month,day,hour,minute,second,initsec) !----------------------------------------------------------------------- ! ! Allocate the nx, ny, nz dependent arrays and initialize to zero ! !----------------------------------------------------------------------- ALLOCATE( xgrid(nx), STAT=istatus) CALL check_alloc_status(istatus, "arpssoil:xgrid") xgrid=0 ALLOCATE( ygrid(ny), STAT=istatus) CALL check_alloc_status(istatus, "arpssoil:ygrid") ygrid=0 ALLOCATE( range(nx,ny), STAT=istatus) CALL check_alloc_status(istatus, "arpssoil:range") range=0 ALLOCATE( anx(nx,ny,nvar_anx), STAT=istatus) CALL check_alloc_status(istatus, "arpssoil:anx") anx=0 ALLOCATE( tsfc(nx,ny), STAT=istatus) CALL check_alloc_status(istatus, "arpssoil:tsfc") tsfc=0 ALLOCATE( tsoil(nx,ny), STAT=istatus) CALL check_alloc_status(istatus, "arpssoil:tsoil") tsoil=0 tsfc=anx(:,:,1) tsoil=anx(:,:,2) ! !----------------------------------------------------------------------- ! ! Some initializations ! !----------------------------------------------------------------------- latnot(1)=trulat1 latnot(2)=trulat2 CALL setmapr(mapproj,sclfct,latnot,trulon) ! CALL lltoxy(1,1,ctrlat,ctrlon,x0,y0) DO i=1,nx xgrid(i)=(FLOAT(i)-(FLOAT(nx-3)/2.)-1.5)*dx + x0 END DO DO j=1,ny ygrid(j)=(FLOAT(j)-(FLOAT(ny-3)/2.)-1.5)*dy + y0 END DO ! CALL xytoll(1,1, xgrid(1), ygrid(1),lllat,lllon) CALL xytoll(1,1,xgrid(nx), ygrid(1),lrlat,lrlon) CALL xytoll(1,1,xgrid(nx),ygrid(ny),urlat,urlon) CALL xytoll(1,1, xgrid(1),ygrid(ny),ullat,ullon) PRINT *, ' lower left lat,lon = ',lllat,lllon PRINT *, ' lower right lat,lon = ',lrlat,lrlon PRINT *, ' upper right lat,lon = ',urlat,urlon PRINT *, ' upper left lat,lon = ',ullat,ullon ! defrange=6400.e06 ! meters**2 DO j=1,ny DO i=1,nx range(i,j)=defrange END DO END DO ! !----------------------------------------------------------------------- ! ! Use initime in the ARPS input file as the time. ! !----------------------------------------------------------------------- ! CALL julday( year, month, day, jday) myr=MOD(year,100) WRITE(c9time,'(i2.2,i3.3,i2.2,i2.2)') & myr,jday,hour,minute ! !----------------------------------------------------------------------- ! ! Read in observations. match with station list ! !----------------------------------------------------------------------- ! CALL read_obs(c9time, & xtnam,xtlat,xtlon,xtelev,xts,k_sta) ! CALL lltoxy(k_sta,1,xtlat,xtlon,xtx,xty) ! DO j= 1,nvar_ob DO i= 1,k_sta isrc(i) =1 obs(i,j) =xts(i,j) qobs(i,j) =qsrc(isrc(i),j) rely(i,j,1) =10 END DO END DO CALL barnes_cntrl(nx,ny,mxstn,2,maxrng, & k_sta,xgrid,ygrid, & obs,odiff,obanx,xtx,xty,isrc,qobs,rely, & var_anx,npass,kappa,irngsel,range,rngobs, & wlim,klim,knt,rngwgt,wgtsum,zsum,istat, & anx,istatus) ! !----------------------------------------------------------------------- ! ! Calculate again for solar radiation defrange=1600. ! !----------------------------------------------------------------------- ! defrange=1600.e06 ! meters**2 DO j=1,ny DO i=1,nx range(i,j)=defrange END DO END DO CALL barnes_cntrl(nx,ny,mxstn,1,maxrng, & k_sta,xgrid,ygrid, & obs(1,3),odiff(1,3),obanx(1,3),xtx,xty, & isrc,qobs(1,3),rely(1,3,1), & var_anx(3),npass,kappa,irngsel(3),range,rngobs, & wlim,klim,knt(3),rngwgt,wgtsum(3),zsum(3),istat, & anx(1,1,3),istatus) ! !----------------------------------------------------------------------- ! ! Make adjustments to output data. ! 1) Convert to Kelvin ! 2) Set wetness values to constants from the input file. ! !----------------------------------------------------------------------- ! DO j=1,ny DO i=1,nx tsfc(i,j)=tsfc(i,j)+273.15 tsoil(i,j)=tsoil(i,j)+273.15 END DO END DO ! !----------------------------------------------------------------------- ! ! Open a file. ! Write the var_anx array to the file which was ! specified as soilinfl in the ARPS input file. ! !----------------------------------------------------------------------- ! idummy=0 rdummy=0. ! tsfcout=1 tsoilout=1 wsfcout=0 wdpout=0 wcanpout=0 ! CALL getunit( sfcunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(soilinfl, '-F f77 -N ieee', ierr) OPEN(UNIT=sfcunit,FILE=soilinfl,FORM='unformatted', & STATUS='unknown',IOSTAT=istat) WRITE (sfcunit) nx,ny WRITE (sfcunit) tsfcout,tsoilout,wsfcout,wdpout,wcanpout, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy WRITE (sfcunit) dx,dy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy WRITE (sfcunit) tsfc WRITE (sfcunit) tsoil CLOSE (sfcunit) ! !----------------------------------------------------------------------- ! ! Grads output ! !----------------------------------------------------------------------- ! gradsfile=c9time(1:9)//'.grads' gradsctl=c9time(1:9)//'.ctl' OPEN(11,FILE=gradsfile,FORM='unformatted') DO k = 1,nvar_ob WRITE(11) ((anx(i,j,k),i=1,nx),j=1,ny) END DO CLOSE(11) OPEN(11,FILE=gradsctl,STATUS='unknown') WRITE(11,'(a,a)') 'TITLE OLAPS soil temperatures and ', & 'surface solar radiation flux' WRITE(11,'(a,a)') 'DSET ',gradsfile WRITE(11,'(a)') 'UNDEF -999.0' WRITE(11,'(a)') 'OPTIONS sequential' WRITE(11,'(a,i4,a,2e16.8)') & 'XDEF ',nx,' LINEAR ',-0.5*dx/1000.,dx/1000. WRITE(11,'(a,i4,a,2e16.8)') & 'YDEF ',ny,' LINEAR ',-0.5*dy/1000.,dy/1000. WRITE(11,'(a)') 'ZDEF 1 LINEAR 0 1' WRITE(11,'(a,i2.2,a,i2.2,a,i2.2,a3,i4.4,1x,a)') & 'TDEF 1 LINEAR ',hour,':',minute,'Z', & day,monnam(month),year,'1HR' WRITE(11,'(a)') 'VARS 3' WRITE(11,'(a)') 'ts05 0 99 Soil temperature (K) in 5 cm' WRITE(11,'(a)') 'ts30 0 99 Soil temperature (K) in 30 cm' WRITE(11,'(a)') 'srad 0 99 Incoming solar radiation' WRITE(11,'(a)') 'ENDVARS' CLOSE(11) END PROGRAM arpssoil