PROGRAM arpssoil,87 ! ! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSSOIL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Program to use history data dump and surface property data to ! create the soil variables ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 05/04/1995 ! ! MODIFICATION HISTORY: ! 11/10/1995 Keith Brewster ! Updated for arps4.1.0 I/O routines ! ! 03/08/1996 Keith Brewster ! Updated for change in parameter list for mksoilvar. ! ! March, 1997 John Mewes ! Added API processing ! ! 04/07/97 Keith Brewster ! Updated for changes to arps4.2.4 ! Restructured API calculations for ARPS-coding compliance. ! ! 04/12/97 Keith Brewster ! Added API calculation using NCEP near real-time precip data. ! Renamed arpsh2s package to version 2.0. ! ! 04/22/97 Keith Brewster ! Added history dump option for more efficient viewing of results. ! New history dump variables in input file. ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 1999/07/16 (Gene Bassett) ! Added option to set water temperature over a lat/lon box. Added ! terrain parameters to input file so an input history file is not ! required. Added fnldate for api soil moisture generation. ! ! 2000/01/03 (Gene Bassett) ! Renamed mstinit to soilinit2 and added capability to update soil ! data over water and snow cover with data in a soil data file. ! ! 2001/05/24 (Gene Bassett) ! Added soil and surface input format variables soilfmt & sfcfmt. ! !----------------------------------------------------------------------- ! ! 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) ! ! uprt x component of perturbation velocity (m/s) ! vprt y component of perturbation velocity (m/s) ! wprt vertical component of perturbation velocity in Cartesian ! coordinates (m/s). ! ! ptprt perturbation potential temperature (K) ! pprt perturbation pressure (Pascal) ! ! qvprt perturbation water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state air density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsfc Temperature at surface (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! raing Grid supersaturation rain ! rainc Cumulus convective rain(mm) ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! ! 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)) ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! tem2 Temporary work array. ! tem3 Work array for Savi3D dump ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'indtflg.inc' ! !----------------------------------------------------------------------- ! ! Arrays to be read in: ! !----------------------------------------------------------------------- ! INTEGER :: nx,ny,nz INTEGER :: nstyps,nstyp1 INTEGER :: mxdays,mxstns ! API limits REAL, ALLOCATABLE :: x (:) ! The x-coord. of the physical and ! computational grid. ! Defined at u-point. REAL, ALLOCATABLE :: y (:) ! The y-coord. of the physical and ! computational grid. ! Defined at v-point. REAL, ALLOCATABLE :: z (:) ! The z-coord. of the computational ! grid. Defined at w-point. REAL, ALLOCATABLE :: zp (:,:,:) ! Physical height of grid at w-points. REAL, ALLOCATABLE :: zsc (:,:,:) ! Physical height of grid at scalar-points. REAL, ALLOCATABLE :: hterain(:,:) ! Terrain height. REAL, ALLOCATABLE :: j1 (:,:,:) ! Coordinate transformation ! Jacobian -d(zp)/d(x) REAL, ALLOCATABLE :: j2 (:,:,:) ! Coordinate transformation ! Jacobian -d(zp)/d(y) REAL, ALLOCATABLE :: j3 (:,:,:) ! Coordinate transformation ! Jacobian d(zp)/d(z) REAL, ALLOCATABLE :: uprt (:,:,:) ! Perturbation u-velocity (m/s) REAL, ALLOCATABLE :: vprt (:,:,:) ! Perturbation v-velocity (m/s) REAL, ALLOCATABLE :: wprt (:,:,:) ! Perturbation w-velocity (m/s) REAL, ALLOCATABLE :: ptprt (:,:,:) ! Perturbation potential temperature (K) REAL, ALLOCATABLE :: pprt (:,:,:) ! Perturbation pressure (Pascal) REAL, ALLOCATABLE :: qvprt (:,:,:) ! Perturbation water vapor specific ! humidity (kg/kg) REAL, ALLOCATABLE :: qc (:,:,:) ! Cloud water mixing ratio (kg/kg) REAL, ALLOCATABLE :: qr (:,:,:) ! Rain water mixing ratio (kg/kg) REAL, ALLOCATABLE :: qi (:,:,:) ! Cloud ice mixing ratio (kg/kg) REAL, ALLOCATABLE :: qs (:,:,:) ! Snow mixing ratio (kg/kg) REAL, ALLOCATABLE :: qh (:,:,:) ! Hail mixing ratio (kg/kg) REAL, ALLOCATABLE :: tke (:,:,:) ! Turbulent Kinetic Energy ((m/s)**2) REAL, ALLOCATABLE :: kmh (:,:,:) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL, ALLOCATABLE :: kmv (:,:,:) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL, ALLOCATABLE :: ubar (:,:,:) ! Base state u-velocity (m/s) REAL, ALLOCATABLE :: vbar (:,:,:) ! Base state v-velocity (m/s) REAL, ALLOCATABLE :: wbar (:,:,:) ! Base state w-velocity (m/s) REAL, ALLOCATABLE :: ptbar (:,:,:) ! Base state potential temperature (K) REAL, ALLOCATABLE :: pbar (:,:,:) ! Base state pressure (Pascal) REAL, ALLOCATABLE :: rhobar (:,:,:) ! Base state air density (kg/m**3) REAL, ALLOCATABLE :: qvbar (:,:,:) ! Base state water vapor specific ! humidity (kg/kg) INTEGER, ALLOCATABLE :: soiltyp (:,:,:) ! Soil type REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Soil type fraction INTEGER, ALLOCATABLE :: vegtyp (:,:) ! Vegetation type (currently only 1 ! vegetation type is used in the arps) REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction REAL, ALLOCATABLE :: tsfc (:,:,:) ! Temperature at surface (K) REAL, ALLOCATABLE :: tsoil (:,:,:) ! Deep soil temperature (K) REAL, ALLOCATABLE :: wetsfc (:,:,:) ! Surface soil moisture REAL, ALLOCATABLE :: wetdp (:,:,:) ! Deep soil moisture REAL, ALLOCATABLE :: wetcanp(:,:,:) ! Canopy water amount REAL, ALLOCATABLE :: snowdpth(:,:) ! Snow depth (:) REAL, ALLOCATABLE :: raing(:,:) ! Grid supersaturation rain REAL, ALLOCATABLE :: rainc(:,:) ! Cumulus convective rain REAL, ALLOCATABLE :: prcrate(:,:,:) ! precipitation rate (kg/(m**2*s)) ! prcrate(:,:,1) = total precip. rate ! prcrate(:,:,2) = grid scale precip. rate ! prcrate(:,:,3) = cumulus precip. rate ! prcrate(:,:,4) = microphysics precip. rate REAL, ALLOCATABLE :: radfrc(:,:,:) ! Radiation forcing (K/s) REAL, ALLOCATABLE :: radsw (:,:) ! Solar radiation reaching the surface REAL, ALLOCATABLE :: rnflx (:,:) ! Net radiation flux absorbed by surface REAL, ALLOCATABLE :: usflx (:,:) ! Surface flux of u-momentum (kg/(m*s**2)) REAL, ALLOCATABLE :: vsflx (:,:) ! Surface flux of v-momentum (kg/(m*s**2)) REAL, ALLOCATABLE :: ptsflx(:,:) ! Surface heat flux (K*kg/(m*s**2)) REAL, ALLOCATABLE :: qvsflx(:,:) ! Surface moisture flux (kg/(m**2*s)) ! !----------------------------------------------------------------------- ! ! API generation arrays: ! !----------------------------------------------------------------------- ! CHARACTER(LEN=7), ALLOCATABLE :: staid(:) CHARACTER(LEN=80), ALLOCATABLE :: precfile(:) INTEGER, ALLOCATABLE :: iptstn(:) INTEGER, ALLOCATABLE :: jptstn(:) INTEGER, ALLOCATABLE :: iptapi0(:) INTEGER, ALLOCATABLE :: jptapi0(:) REAL, ALLOCATABLE :: api0(:) REAL, ALLOCATABLE :: obsprec(:,:) REAL, ALLOCATABLE :: difprec(:,:) REAL, ALLOCATABLE :: totpreca(:) REAL, ALLOCATABLE :: xs(:) REAL, ALLOCATABLE :: ys(:) REAL, ALLOCATABLE :: prec(:,:) ! !----------------------------------------------------------------------- ! ! Temporary working arrays: ! !----------------------------------------------------------------------- ! INTEGER, ALLOCATABLE :: itema(:,:) REAL, ALLOCATABLE :: initapi(:,:,:) REAL, ALLOCATABLE :: api1(:,:,:) REAL, ALLOCATABLE :: api2(:,:,:) REAL, ALLOCATABLE :: kk2dep(:,:) REAL, ALLOCATABLE :: tem1(:,:,:) REAL, ALLOCATABLE :: tem2(:,:,:) REAL, ALLOCATABLE :: tem3(:,:,:) ! !----------------------------------------------------------------------- ! ! API parameters ! !----------------------------------------------------------------------- ! CHARACTER (LEN=80) :: grdbasfn CHARACTER (LEN=80) :: hisfile CHARACTER (LEN=80) :: soiloutfl CHARACTER (LEN=80) :: apifile CHARACTER (LEN=80) :: apiinit CHARACTER (LEN=80) :: prcpdir CHARACTER (LEN=80) :: prcplst CHARACTER (LEN=10) :: inidate CHARACTER (LEN=10) :: fnldate INTEGER :: hinfmt,soilinit2,prdata REAL :: respapi,k1,k2,range,gamma(2),respprec CHARACTER (LEN=80) :: runnamesv INTEGER :: nbwater,nbw_max PARAMETER (nbw_max=128) REAL :: tbwater(nbw_max),blat1(nbw_max),blat2(nbw_max) REAL :: blon1(nbw_max),blon2(nbw_max) COMMON /bwcomi/ nbwater COMMON /bwcomr/ tbwater,blat1,blat2,blon1,blon2 REAL :: twater COMMON /realcom/ twater INTEGER :: tsfcout, tsoilout, wsfcout, wdpout, wcanpout,snowdout COMMON /intgcom/tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout NAMELIST /arpssoilvars/ hinfmt, grdbasfn, hisfile, & soilinit2,prdata,apiinit,apifile,prcpdir,prcplst, & sfcdat,styp,wetcanp0,snowdpth0,twater,tsprt,t2prt, & wgrat,w2rat,sfcdtfl,soilinfl,soiloutfl, & tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout, & inidate,fnldate,respapi,k1,k2,range, & respprec,gamma,soildmp,nx,ny,mxdays,mxstns,nstyp, & soilfmt,sfcfmt NAMELIST /box_water/ nbwater,tbwater,blat1,blat2,blon1,blon2 NAMELIST /history_dump/ hdmpopt,hdmpfmt,grbpkbit,thisdmp, & tstrtdmp,numhdmp,hdmptim,hdfcompr NAMELIST /output/ runname,dirname,tfmtprt,exbcdmp,extdadmp, & grdout,basout,varout,mstout,rainout,iceout, & tkeout, trbout,sfcout,landout,totout,trstout,tmaxmin, & tenergy,imgopt, timgdmp,pltopt,tplots,filcmprs NAMELIST /grid_info/ dx,dy,dz,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct COMMON /apicom1/ apiinit,apifile,prcpdir,prcplst,inidate,fnldate COMMON /apicom2/ soilinit2,prdata COMMON /apicom3/ respapi,k1,k2,range,respprec,gamma ! !----------------------------------------------------------------------- ! ! Misc. internal variables ! !----------------------------------------------------------------------- ! CHARACTER (LEN=80) :: basdmpfn INTEGER :: nchin INTEGER :: grdbas INTEGER :: i,j,k INTEGER :: length,lengbfn,lbasdmpf,lengfn,lenout INTEGER :: ireturn LOGICAL :: iexist INTEGER :: is , nxy, nxyz REAL :: amax, amin ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! mgrid = 1 nestgrd = 0 ! hinfmt=1 grdbasfn='may07.bingrdbas' hisfile='may07.bin000000' soilinit2=2 soilfmt=0 prdata=2 apiinit='initapi.lst' apifile='precfile.lst' prcpdir='/vortex/precip/' prcplst='/vortex/precip/splains.stns' sfcdat=3 sfcfmt=0 styp=3 wetcanp0=0. snowdpth0=0 twater=21. tsprt=1. t2prt=0. wgrat=0.5 w2rat=0.5 nstyp = 1 sfcdtfl='arpssfc.dat' soilinfl='arpssoil.dat' soiloutfl='arpssoil.dat' soildmp = 1 tsfcout=1 tsoilout=1 wsfcout=1 wdpout=1 wcanpout=1 snowdout=1 inidate='1977-05-20' fnldate='1977-05-20' respapi=1.0 k1=0.75 k2=0.995 range=250.0 respprec=0.1 gamma(1)=1.00 gamma(2)=1.00 nbwater = 0 hdmpopt = 1 hdmpfmt = 10 grbpkbit = 16 hdfcompr = 0 thisdmp = 3600.0 tstrtdmp = 0.0 numhdmp = 1 DO i=1,numhdmp hdmptim(i) = 0. END DO runname = 'X' dirname = ' ' exbcdmp = 0 extdadmp = 0 grdout = 0 basout = 0 varout = 1 mstout = 0 rainout = 0 prcout = 0 iceout = 0 totout = 1 tkeout = 0 trbout = 0 sfcout = 1 landout = 1 radout = 0 flxout = 0 trstout = 3600.0 ! !----------------------------------------------------------------------- ! ! Set the control parameters for input: ! !----------------------------------------------------------------------- ! WRITE (6,'(/a/)') & ' Input control parameters read in are:' READ(5,arpssoilvars, END=998) ! WRITE (6, '(/1x,a)') '&arpssoilvars' WRITE (6, '(3x,a,i4,a)') 'hinfmt = ', hinfmt, ',' lengbfn = LEN( grdbasfn ) CALL strlnth( grdbasfn, lengbfn ) WRITE (6, '(3x,a,a,a)') & 'grdbasfn = ''', grdbasfn(1:lengbfn), ''',' lengfn = LEN( hisfile ) CALL strlnth( hisfile, lengfn ) WRITE (6, '(3x,a,a,a)') & 'hisfile = ''', hisfile(1:lengfn), ''',' WRITE (6, '(3x,a,i4,a)') 'soilinit2 = ', soilinit2, ',' WRITE (6, '(3x,a,i4,a)') 'soilfmt = ', soilfmt, ',' WRITE (6, '(3x,a,i4,a)') 'prdata = ', prdata , ',' length = LEN( apiinit ) CALL strlnth( apiinit,length ) WRITE (6, '(3x,a,a,a)') 'apiinit = ', apiinit(1:length), & ',' length = LEN( apifile) CALL strlnth( apifile,length ) WRITE (6, '(3x,a,a,a)') 'apifile = ', apifile(1:length), & ',' length = LEN( prcpdir ) CALL strlnth( prcpdir,length ) WRITE (6, '(3x,a,a,a)') 'prcpdir = ', prcpdir(1:length), & ',' WRITE (6, '(3x,a,i4,a)') 'sfcdat = ', sfcdat, ',' WRITE (6, '(3x,a,i4,a)') 'sfcfmt = ', sfcfmt, ',' WRITE (6, '(3x,a,i4,a)') 'styp = ', styp, ',' WRITE (6, '(3x,a,e15.5,a)') 'wetcanp0 = ', wetcanp0, ',' WRITE (6, '(3x,a,e15.5,a)') 'snowdpth0 = ', snowdpth0,',' WRITE (6, '(3x,a,e15.5,a)') 'twater = ', twater, ',' WRITE (6, '(3x,a,e15.5,a)') 'tsprt = ', tsprt, ',' WRITE (6, '(3x,a,e15.5,a)') 't2prt = ', t2prt, ',' WRITE (6, '(3x,a,e15.5,a)') 'wgrat = ', wgrat, ',' WRITE (6, '(3x,a,e15.5,a)') 'w2rat = ', w2rat, ',' nstyp = MAX(1,nstyp) nstyps = nstyp WRITE (6, '(3x,a,i4,a)') 'nstyp = ', nstyp, ',' length = LEN( sfcdtfl ) CALL strlnth( sfcdtfl,length ) WRITE (6, '(3x,a,a,a)') & 'sfcdtfl = ''', sfcdtfl(1:length), ''',' lenout = LEN( soilinfl ) CALL strlnth( soilinfl,length ) WRITE (6, '(3x,a,a,a)') & 'soilinfl = ''', soilinfl(1:length), ''',' lenout = LEN( soiloutfl ) CALL strlnth( soiloutfl,lenout ) WRITE (6, '(3x,a,a,a)') & 'soiloutfl = ''', soiloutfl(1:lenout), ''',' WRITE (6, '(3x,a,i4,a)') 'soildmp = ', soildmp, ',' WRITE (6, '(3x,a,i4,a)') 'tsfcout = ', tsfcout, ',' WRITE (6, '(3x,a,i4,a)') 'tsoilout = ', tsoilout, ',' WRITE (6, '(3x,a,i4,a)') 'wsfcout = ', wsfcout, ',' WRITE (6, '(3x,a,i4,a)') 'wdpout = ', wdpout, ',' WRITE (6, '(3x,a,i4,a)') 'wcanpout = ', wcanpout, ',' WRITE (6, '(3x,a,a,a)') 'inidate = ', inidate, ',' WRITE (6, '(3x,a,a,a)') 'fnldate = ', fnldate, ',' WRITE (6, '(3x,a,f5.3,a)') 'respapi = ', respapi, ',' WRITE (6, '(3x,a,f5.3,a)') 'k1 = ', k1, ',' WRITE (6, '(3x,a,f5.3,a)') 'k2 = ', k2, ',' WRITE (6, '(3x,a,f7.2,a)') 'range (km)= ', range, ',' WRITE (6, '(3x,a,f5.3,a)') 'respprec = ', respprec, ',' WRITE (6, '(3x,a,f5.3,a)') 'gamma(1) = ', gamma(1), ',' WRITE (6, '(3x,a,f5.3,a)') 'gamma(2) = ', gamma(2), ',' WRITE (6, '(1x,a)') '&END' READ (5,box_water, END=998) ! WRITE (6, '(/1x,a)') '&box_water' WRITE (6, '(3x,a,i4,a)') 'nbwater = ', nbwater, ',' IF (nbwater > nbw_max) THEN WRITE (*,*) "ERROR in arpsh2s: nbwater > nbw_max." WRITE (*,*) " nbwater =",nbwater," nbw_max =",nbw_max STOP END IF DO i = 1, nbwater WRITE (6, '(3x,a,i3,a,f7.3,a)') & 'tbwater(',i,') = ', tbwater(i), ',' WRITE (6, '(3x,a,i3,a,f8.3,a)') & 'blat1(',i,') = ', blat1(i), ',' WRITE (6, '(3x,a,i3,a,f8.3,a)') & 'blat2(',i,') = ', blat2(i), ',' WRITE (6, '(3x,a,i3,a,f8.3,a)') & 'blon1(',i,') = ', blon1(i), ',' WRITE (6, '(3x,a,i3,a,f8.3,a)') & 'blon2(',i,') = ', blon2(i), ',' END DO WRITE (6, '(1x,a)') '&END' READ (5,history_dump,END=998) IF( hdmpfmt < 0 .OR. hdmpfmt > 10) THEN WRITE(6,'(/5x,a,/5x,a/)') & 'Invalid input values for history dump format option,', & 'Job stopped in ARPSH2S.' STOP END IF ! WRITE(6,'(5x,a,i6)') & 'Number of bits in packing GRIB dump data was ',grbpkbit ! WRITE(6,'(5x,a,i6)') & 'HDF4 compression option was ',hdfcompr ! !----------------------------------------------------------------------- ! ! Input model output parameters: ! ! First, give the name of the directory into which output files ! will be written: ! !----------------------------------------------------------------------- ! READ(5,output, END=998) ldirnam = 80 CALL strlnth( dirname, ldirnam) IF( ldirnam == 0 ) THEN dirname = '.' ldirnam=1 END IF IF( dirname(1:ldirnam) /= ' ') THEN READ(5,grid_info, END=998) ! !----------------------------------------------------------------------- ! ! Check if the specified output directory exists, if not, ! create it. ! !----------------------------------------------------------------------- ! INQUIRE(FILE=dirname(1:ldirnam),EXIST=iexist) IF( .NOT.iexist ) THEN WRITE(6,'(/5x,a,2(/5x,a))') & 'Specified output directory '//dirname(1:ldirnam)// & ' not found.', & 'It was created by the program.' CALL unixcmd( 'mkdir -p '//dirname(1:ldirnam) ) END IF WRITE(6,'(/5x,a)') & 'Output files will be in directory '//dirname(1:ldirnam)//'.' ELSE WRITE(6,'(/5x,a)') & 'Output files will be in the current work directory.' END IF ! !----------------------------------------------------------------------- ! ! Set the control parameters for the output of selected fields. ! !----------------------------------------------------------------------- ! WRITE(6,'(/5x,a,i4/)') & 'The input grid coordinate dump option was ', grdout WRITE(6,'(/5x,a,i4/)') & 'The input base state array dump option was ', basout WRITE(6,'(/5x,a,i4/)') & 'The input mass-velocity array dump option was ', varout WRITE(6,'(/5x,a,i4/)') & 'The input non-ice water array dump option was ',mstout WRITE(6,'(/5x,a,i4/)') & 'The input rain array dump option was ', rainout rainout = rainout * mstout WRITE(6,'(/5x,a,i4/)') & 'The input precipitation rates array dump option was ',prcout prcout = prcout * mstout WRITE(6,'(/5x,a,i4/)') & 'The input ice array dump option was ', iceout WRITE(6,'(/5x,a,i4/)') & 'The input TKE dump option was ', tkeout WRITE(6,'(/5x,a,i4/)') & 'The input eddy mixing coeff dump option was ', trbout WRITE(6,'(/5x,a,i4/)') & 'The input surface variable dump option was ', sfcout WRITE(6,'(/5x,a,i4/)') & 'The input surface property array dump option was ', landout ! !----------------------------------------------------------------------- ! ! Allocate arrays. ! !----------------------------------------------------------------------- ! IF (hinfmt == 0) THEN nz = nstyps+1 ELSE CALL get_dims_from_data(hinfmt,trim(grdbasfn), & nx,ny,nz,nstyp1, ireturn) ENDIF ALLOCATE( ALLOCATE( ALLOCATE( ALLOCATE(zp(nx,ny,nz)) ALLOCATE(zsc(nx,ny,nz)) ALLOCATE(hterain(nx,ny)) ALLOCATE(j1(nx,ny,nz)) ALLOCATE(j2(nx,ny,nz)) ALLOCATE(j3(nx,ny,nz)) ALLOCATE(uprt(nx,ny,nz)) ALLOCATE(vprt(nx,ny,nz)) ALLOCATE(wprt(nx,ny,nz)) ALLOCATE(ptprt(nx,ny,nz)) ALLOCATE(pprt(nx,ny,nz)) ALLOCATE(qvprt(nx,ny,nz)) ALLOCATE(qc(nx,ny,nz)) ALLOCATE(qr(nx,ny,nz)) ALLOCATE(qi(nx,ny,nz)) ALLOCATE(qs(nx,ny,nz)) ALLOCATE(qh(nx,ny,nz)) ALLOCATE(tke(nx,ny,nz)) ALLOCATE(kmh(nx,ny,nz)) ALLOCATE(kmv(nx,ny,nz)) ALLOCATE(ubar(nx,ny,nz)) ALLOCATE(vbar(nx,ny,nz)) ALLOCATE(wbar(nx,ny,nz)) ALLOCATE(ptbar(nx,ny,nz)) ALLOCATE(pbar(nx,ny,nz)) ALLOCATE(rhobar(nx,ny,nz)) ALLOCATE(qvbar(nx,ny,nz)) ALLOCATE(soiltyp(nx,ny,nstyps)) ALLOCATE(stypfrct(nx,ny,nstyps)) ALLOCATE(vegtyp(nx,ny)) ALLOCATE(lai(nx,ny)) ALLOCATE(roufns(nx,ny)) ALLOCATE(veg(nx,ny)) ALLOCATE(tsfc(nx,ny,0:nstyps)) ALLOCATE(tsoil(nx,ny,0:nstyps)) ALLOCATE(wetsfc(nx,ny,0:nstyps)) ALLOCATE(wetdp(nx,ny,0:nstyps)) ALLOCATE(wetcanp(nx,ny,0:nstyps)) ALLOCATE(snowdpth(nx,ny)) ALLOCATE(raing(nx,ny)) ALLOCATE(rainc(nx,ny)) ALLOCATE(prcrate(nx,ny,4)) ALLOCATE(radfrc(nx,ny,nz)) ALLOCATE(radsw(nx,ny)) ALLOCATE(rnflx(nx,ny)) ALLOCATE(usflx(nx,ny)) ALLOCATE(vsflx(nx,ny)) ALLOCATE(ptsflx(nx,ny)) ALLOCATE(qvsflx(nx,ny)) ALLOCATE(staid(mxstns)) ALLOCATE(precfile(mxstns)) ALLOCATE(iptstn(mxstns)) ALLOCATE(jptstn(mxstns)) ALLOCATE(iptapi0(mxstns)) ALLOCATE(jptapi0(mxstns)) ALLOCATE(api0(mxstns)) ALLOCATE(obsprec(mxdays,mxstns)) ALLOCATE(difprec(mxdays,mxstns)) ALLOCATE(totpreca(mxstns)) ALLOCATE(xs(nx)) ALLOCATE(ys(ny)) ALLOCATE(prec(nx,ny)) ALLOCATE(itema(nx,ny)) ALLOCATE(initapi(nx,ny,nstyps)) ALLOCATE(api1(nx,ny,nstyps)) ALLOCATE(api2(nx,ny,nstyps)) ALLOCATE(kk2dep(nx,ny)) ALLOCATE(tem1(nx,ny,nz)) ALLOCATE(tem2(nx,ny,nz)) ALLOCATE(tem3(nx,ny,nz)) ! !----------------------------------------------------------------------- ! ! Fill all arrays with zero, which is the default value of the ! data arrays. ! !----------------------------------------------------------------------- ! nxy = nx*ny nxyz= nx*ny*nz CALL flzero(x ,nx) CALL flzero(y ,ny) CALL flzero(z ,nz) CALL flzero(zp ,nxyz) CALL flzero(hterain,nxy) CALL flzero(uprt ,nxyz) CALL flzero(vprt ,nxyz) CALL flzero(wprt ,nxyz) CALL flzero(ptprt,nxyz) CALL flzero(pprt ,nxyz) CALL flzero(qvprt,nxyz) CALL flzero(qc ,nxyz) CALL flzero(qr ,nxyz) CALL flzero(qi ,nxyz) CALL flzero(qs ,nxyz) CALL flzero(qh ,nxyz) CALL flzero(ubar ,nxyz) CALL flzero(vbar ,nxyz) CALL flzero(wbar ,nxyz) CALL flzero(ptbar,nxyz) CALL flzero(pbar ,nxyz) CALL flzero(rhobar,nxyz) CALL flzero(qvbar,nxyz) CALL flzero(tke ,nxyz) CALL flzero(kmh ,nxyz) CALL flzero(kmv ,nxyz) CALL flzero(tem1 ,nxyz) CALL flzero(tem2 ,nxyz) CALL flzero(tsfc ,nxy*(1+nstyps)) CALL flzero(tsoil ,nxy*(1+nstyps)) CALL flzero(wetsfc ,nxy*(1+nstyps)) CALL flzero(wetdp ,nxy*(1+nstyps)) CALL flzero(wetcanp,nxy*(1+nstyps)) IF ( hinfmt > 0 ) THEN ! !----------------------------------------------------------------------- ! ! Get the name of the input data set. ! !----------------------------------------------------------------------- ! ldirnam=LEN(dirname) CALL strlnth( dirname , ldirnam) ! !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! CALL gtlfnkey( runname, lfnkey ) IF ( lfnkey > 0 ) THEN runnamesv(1:80) = runname(1:80) END IF CALL dtaread(nx,ny,nz,nstyps, & hinfmt, nchin,grdbasfn(1:lengbfn),lengbfn, & hisfile(1:lengfn),lengfn,curtim, & x,y,z,zp, uprt ,vprt ,wprt ,ptprt, pprt , & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem1,tem2, tem3) IF ( lfnkey > 0 ) THEN runname(1:80) = runnamesv(1:80) END IF CALL gtlfnkey( runname, lfnkey ) length = lfnkey + 9 IF( ireturn /= 0 .AND. hinfmt /= 9 ) GO TO 997 ! Read was unsuccessful END IF ! !----------------------------------------------------------------------- ! ! Set up coordinates for mksoilvar. ! !----------------------------------------------------------------------- ! IF ( hinfmt > 0 ) THEN dx=x(2)-x(1) dy=y(2)-y(1) DO j=1,ny-1 DO i=1,nx-1 hterain(i,j)=zp(i,j,2) END DO END DO ELSE ! !----------------------------------------------------------------------- ! ! Set terrain and grid info necessary for api. ! !----------------------------------------------------------------------- ! DO i=1,nx x(i) = dx * (i-2) END DO DO j=1,ny y(j) = dy * (j-2) END DO ! Create fake z,zp,zsc to keep program from bombing. DO k=1,nz z(k) = dz * (k-2) DO j=1,ny DO i=1,nx zp(i,j,k) = z(k) END DO END DO END DO END IF DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 zsc(i,j,k)=0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO END DO END DO DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO xs(nx)=xs(nx-1)+dx DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO ys(ny)=ys(ny-1)+dy DO is = 0,nstyp WRITE(6,'(/a,i4/)') ' In ARPSH2S, for istype =', is CALL a3dmax0(tsfc(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1 ,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'tsfcmin = ', amin,', tsfcmax =',amax CALL a3dmax0(tsoil(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1 ,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'tsoilmin= ', amin,', tsoilmax =',amax CALL a3dmax0(wetsfc(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1 ,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wetsmin = ', amin,', wetsmax =',amax CALL a3dmax0(wetdp(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1 ,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wetdmin = ', amin,', wetdmax =',amax CALL a3dmax0(wetcanp(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1 ,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wetcmin = ', amin,', wetcmax =',amax END DO IF(nstyp == 1) THEN DO j=1,ny-1 DO i=1,nx-1 tsfc (i,j,1) = tsfc (i,j,0) tsoil (i,j,1) = tsoil (i,j,0) wetsfc (i,j,1) = wetsfc (i,j,0) wetdp (i,j,1) = wetdp (i,j,0) wetcanp(i,j,1) = wetcanp(i,j,0) END DO END DO END IF CALL mksoilvar(nx,ny,nz,nstyps, & mxdays,mxstns, & xs,ys, & hterain,zsc, & ptbar,ptprt, & pbar,pprt, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & soiltyp,stypfrct, & precfile,staid,iptstn,jptstn,iptapi0,jptapi0, & api0,obsprec,difprec,totpreca,prec, & itema,initapi,api1,api2,kk2dep, & tem1,tem2,tem3) DO j=1,ny-1 DO i=1,nx-1 tsfc (i,j,0) = 0.0 tsoil (i,j,0) = 0.0 wetsfc (i,j,0) = 0.0 wetdp (i,j,0) = 0.0 wetcanp(i,j,0) = 0.0 END DO END DO ! PRINT*,' nstyp = ', nstyp DO is = 1,nstyp DO j=1,ny-1 DO i=1,nx-1 tsfc (i,j,0) = tsfc (i,j,0) & + tsfc (i,j,is) * stypfrct(i,j,is) tsoil (i,j,0) = tsoil (i,j,0) & + tsoil (i,j,is) * stypfrct(i,j,is) wetsfc (i,j,0) = wetsfc (i,j,0) & + wetsfc (i,j,is) * stypfrct(i,j,is) wetdp (i,j,0) = wetdp (i,j,0) & + wetdp (i,j,is) * stypfrct(i,j,is) wetcanp(i,j,0) = wetcanp(i,j,0) & + wetcanp(i,j,is) * stypfrct(i,j,is) END DO END DO END DO DO is = 0,nstyp WRITE(6,'(/a,i4/)') ' In ARPSH2S, for istype =', is CALL a3dmax0(tsfc(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'tsfcmin = ', amin,', tsfcmax =',amax CALL a3dmax0(tsoil(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'tsoilmin= ', amin,', tsoilmax =',amax CALL a3dmax0(wetsfc(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wetsmin = ', amin,', wetsmax =',amax CALL a3dmax0(wetdp(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wetdmin = ', amin,', wetdmax =',amax CALL a3dmax0(wetcanp(1,1,is), & 1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wetcmin = ', amin,', wetcmax =',amax END DO ! !----------------------------------------------------------------------- ! ! Write the soil data. ! !----------------------------------------------------------------------- ! IF (soildmp > 0) CALL wrtsoil(nx,ny,nstyps, soiloutfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,soiltyp) ! !----------------------------------------------------------------------- ! ! Create a GrADS control file for soil data display ! !----------------------------------------------------------------------- ! IF (soildmp == 1) CALL soilcntl(nx,ny, soiloutfl, & tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout, & x,y) ! !----------------------------------------------------------------------- ! ! Data dump of the model grid and base state arrays: ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny DO i=1,nx qvprt(i,j,k)=qvbar(i,j,k)+qvprt(i,j,k) uprt(i,j,k)=ubar(i,j,k)+uprt(i,j,k) vprt(i,j,k)=vbar(i,j,k)+vprt(i,j,k) wprt(i,j,k)=wbar(i,j,k)+wprt(i,j,k) END DO END DO END DO ! IF(hdmpopt /= 0) THEN IF( hdmpfmt == 5 ) GO TO 700 IF( hdmpfmt == 9 ) GO TO 700 ! !----------------------------------------------------------------------- ! ! Data dump of the model time dependent arrays at initial time: ! !----------------------------------------------------------------------- ! CALL gtbasfn(runname(1:lfnkey),dirname,ldirnam,hdmpfmt, & mgrid,nestgrd,basdmpfn,lbasdmpf) WRITE(6,'(1x,a,a)') & 'Data dump of grid and base state arrays into file ', & basdmpfn(1:lbasdmpf) grdbas = 1 ! Dump out grid and base state arrays only CALL dtadump(nx,ny,nz,nstyps, & hdmpfmt,nchdmp,basdmpfn(1:lbasdmpf), & grdbas,filcmprs, & uprt,vprt,wprt,ptprt,pprt,qvprt, & qc,qr,qi,qs, & qh,tke,kmh,kmv, & ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, & x,y,z,zp,hterain, j1,j2,j3, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & tem1,tem2,tem3) ! !----------------------------------------------------------------------- ! ! Data dump of the model time dependent arrays ! Find a unique name hdmpfn(1:ldmpf) for history dump data set ! !----------------------------------------------------------------------- ! 700 CONTINUE ! CALL gtdmpfn(runname(1:lfnkey),dirname, & ldirnam,curtim,hdmpfmt, & mgrid,nestgrd, hdmpfn, ldmpf) WRITE(6,'(1x,a,a)') 'History data dump in file ',hdmpfn(1:ldmpf) grdbas = 0 ! No base state or grid array is dumped. CALL dtadump(nx,ny,nz,nstyps, & hdmpfmt,nchdmp,hdmpfn(1:ldmpf), & grdbas,filcmprs, & uprt,vprt,wprt,ptprt,pprt,qvprt, & qc,qr,qi,qs, & qh,tke,kmh,kmv, & ubar,vbar,wbar,ptbar,pbar,rhobar,qvbar, & x,y,z,zp,hterain, j1,j2,j3, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & tem1,tem2,tem3) END IF STOP 997 CONTINUE WRITE(6,'(1x,a,i2,/1x,a)') & 'Data read was unsuccessful. ireturn =', ireturn, & 'Job stopped.' STOP 998 WRITE(6,'(a)') & 'Error reading NAMELIST file. Program ARPSH2S stopped.' STOP 801 FORMAT(a) END PROGRAM arpssoil