PROGRAM arpsensic,25 ! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSENSIC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Generate one perturbation initial condition files from two ! sets of ARPS output files and write it out for the use in ! ENSEMBLE forecast. ! The idea is based on the SLAF (Scaled Lagged Average Forecast). ! The procedure is as follows: ! 1, read file a; ! 2, read in file b; ! 3, find the difference bwtween a and b, store it in a. a=a-b ! 4, read in the base file c or use b as the control file (iread=0). ! 5, generate the perturbation c=c+a/n (b is used as c in code) ! 6, n is input as the variable iorder; it can be ... -2,-1,+1,+2 ... ! ! It shares with the model the include file dims.inc for ! definition of dimensions and domain size. a,b,c have the same ! dimensions and the same grid structure. ! ! Parameters grdout,varout,mstout,iceout and trbout should be input ! with the same values as in the data dump subroutines in the model. ! ! AUTHOR: Dingchen Hou ! History: Apr. 30, 1998: developed from the framework of ARPSDIFF. ! Sep. 15, 1999: modified to include soil variables in ! perturbation change input to namelist format. ! Feb-Apr, 2002: (F.KONG) Major modifications to: ! - accommodate BGM (Breeding Fast Growing Mode) IC ! generation, including the initial random perturbation ! procedure (with inibred = 1 and specified iseed). ! During the regular breeding cycles, certain scale ! factors are calculated to control the amplitude of ! the growing perturbations (with iensopt = 1). When ! generating BGM IC, the two 12h forecasts from the ! paired breeding members are specified as a and b, ! and the analysis data (c) must be read in (iread=1). ! ! When generating initial BGM IC, the only one data ! needed is the analysis (both a and b) ! ! - read in domain config directly from data ! !----------------------------------------------------------------------- ! ! 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) ! ! u x component of velocity (m/s) ! v y component of velocity (m/s) ! w vertical component of velocity in Cartesian ! coordinates (m/s). ! ! ptprt perturbation potential temperature (K) ! pprt perturbation pressure (Pascal) ! ! qv water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsfc Temperature at surface (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! ! CALCULATED DATA ARRAYS: ! ! uprt perturbation x component of velocity (m/s) ! vprt perturbation y component of velocity (m/s) ! wprt perturbation z component of velocity (m/s) ! ! WORK ARRAYS: ! ! tem1 Temporary work array. ! tem2 Temporary work array. ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'indtflg.inc' INTEGER :: nx,ny,nz INTEGER :: vnx,vny,vnz ! PARAMETER (vnx=nx,vny=ny,vnz=nz) ! !----------------------------------------------------------------------- ! ! Arrays to be read in: ! !----------------------------------------------------------------------- ! INTEGER :: nstyps ! Maximum number of soil types in each ! grid box ! PARAMETER (nstyps=4) REAL, ALLOCATABLE :: x (:) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL, ALLOCATABLE :: y (:) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL, ALLOCATABLE :: z (:) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL, ALLOCATABLE :: zp(:,:,:) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL, ALLOCATABLE :: j1(:,:,:) ! Coordinate transformation Jacobian defined ! as - d( zp )/d( x ) REAL, ALLOCATABLE :: j2(:,:,:) ! Coordinate transformation Jacobian defined ! as - d( zp )/d( y ) REAL, ALLOCATABLE :: j3(:,:,:) ! Coordinate transformation Jacobian defined ! as d( zp )/d( z ) REAL, ALLOCATABLE :: hterain(:,:) ! Terrain height. 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 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 INTEGER, ALLOCATABLE :: soiltyp (:,:,:)! Soil type REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Soil type INTEGER, ALLOCATABLE :: vegtyp (:,:) ! Vegetation type REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction REAL, ALLOCATABLE :: tsfc (:,:,:) ! Temperature at surface (K) REAL, ALLOCATABLE :: tsoil (:,:,:) ! Deep soil temperature (K) REAL, ALLOCATABLE :: wetsfc (:,:,:) ! Surface soil moisture REAL, ALLOCATABLE :: wetdp (:,:,:) ! Deep soil moisture REAL, ALLOCATABLE :: wetcanp(:,:,:) ! Canopy water amount REAL, ALLOCATABLE :: snowdpth(:,:) ! Snow depth (m) REAL, ALLOCATABLE :: raing (:,:) ! Cumulus convective rain REAL, ALLOCATABLE :: rainc (:,:) ! Cumulus convective rain ! !----------------------------------------------------------------------- ! ! Verification Arrays ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: vx (:) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL, ALLOCATABLE :: vy (:) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL, ALLOCATABLE :: vz (:) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL, ALLOCATABLE :: vzp (:,:,:) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL, ALLOCATABLE :: vuprt (:,:,:) ! Perturbation u-velocity (m/s) REAL, ALLOCATABLE :: vvprt (:,:,:) ! Perturbation v-velocity (m/s) REAL, ALLOCATABLE :: vwprt (:,:,:) ! Perturbation w-velocity (m/s) REAL, ALLOCATABLE :: vptprt (:,:,:) ! Perturbation potential temperature (K) REAL, ALLOCATABLE :: vpprt (:,:,:) ! Perturbation pressure (Pascal) REAL, ALLOCATABLE :: vqvprt (:,:,:) ! Perturbation water vapor specific humidity REAL, ALLOCATABLE :: vqc (:,:,:) ! Cloud water mixing ratio (kg/kg) REAL, ALLOCATABLE :: vqr (:,:,:) ! Rain water mixing ratio (kg/kg) REAL, ALLOCATABLE :: vqi (:,:,:) ! Cloud ice mixing ratio (kg/kg) REAL, ALLOCATABLE :: vqs (:,:,:) ! Snow mixing ratio (kg/kg) REAL, ALLOCATABLE :: vqh (:,:,:) ! Hail mixing ratio (kg/kg) REAL, ALLOCATABLE :: vtke (:,:,:) ! Turbulent Kinetic Energy ((m/s)**2) REAL, ALLOCATABLE :: vkmh (:,:,:) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL, ALLOCATABLE :: vkmv (:,:,:) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL, ALLOCATABLE :: vubar (:,:,:) ! Base state u-velocity (m/s) REAL, ALLOCATABLE :: vvbar (:,:,:) ! Base state v-velocity (m/s) REAL, ALLOCATABLE :: vwbar (:,:,:) ! Base state w-velocity (m/s) REAL, ALLOCATABLE :: vptbar (:,:,:) ! Base state potential temperature (K) REAL, ALLOCATABLE :: vpbar (:,:,:) ! Base state pressure (Pascal) REAL, ALLOCATABLE :: vrhobar(:,:,:) ! Base state air density (kg/m**3) REAL, ALLOCATABLE :: vqvbar (:,:,:) ! Base state water vapor specific humidity INTEGER, ALLOCATABLE :: vsoiltyp (:,:,:) ! Soil type REAL, ALLOCATABLE :: vstypfrct(:,:,:) ! Soil type INTEGER, ALLOCATABLE :: vvegtyp (:,:) ! Vegetation type REAL, ALLOCATABLE :: vlai (:,:) ! Leaf Area Index REAL, ALLOCATABLE :: vroufns (:,:) ! Surface roughness REAL, ALLOCATABLE :: vveg (:,:) ! Vegetation fraction REAL, ALLOCATABLE :: vtsfc (:,:,:) ! Temperature at surface (K) REAL, ALLOCATABLE :: vtsoil (:,:,:) ! Deep soil temperature (K) REAL, ALLOCATABLE :: vwetsfc (:,:,:) ! Surface soil moisture REAL, ALLOCATABLE :: vwetdp (:,:,:) ! Deep soil moisture REAL, ALLOCATABLE :: vwetcanp(:,:,:) ! Canopy water amount REAL, ALLOCATABLE :: vsnowdpth(:,:) ! Snow depth (m) REAL, ALLOCATABLE :: vraing(:,:) ! Grid supersaturation rain REAL, ALLOCATABLE :: vrainc(:,:) ! Cumulus convective rain ! !----------------------------------------------------------------------- ! ! Work Arrays ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: prcrate(:,:,:) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL, ALLOCATABLE :: radfrc(:,:,:) ! Radiation forcing (K/s) REAL, ALLOCATABLE :: radsw (:,:) ! Solar radiation reaching the surface REAL, ALLOCATABLE :: rnflx (:,:) ! Net radiation flux absorbed by surface REAL, ALLOCATABLE :: usflx (:,:) ! Surface flux of u-momentum (kg/(m*s**2)) REAL, ALLOCATABLE :: vsflx (:,:) ! Surface flux of v-momentum (kg/(m*s**2)) REAL, ALLOCATABLE :: ptsflx(:,:) ! Surface heat flux (K*kg/(m*s**2)) REAL, ALLOCATABLE :: qvsflx(:,:) ! Surface moisture flux (kg/(m**2*s)) REAL, ALLOCATABLE :: tem1(:,:,:) REAL, ALLOCATABLE :: tem2(:,:,:) REAL, ALLOCATABLE :: tem3(:,:,:) REAL, ALLOCATABLE :: vtem1(:,:,:) REAL, ALLOCATABLE :: vtem2(:,:,:) REAL, ALLOCATABLE :: vtem3(:,:,:) REAL, ALLOCATABLE :: xs(:) REAL, ALLOCATABLE :: ys(:) REAL, ALLOCATABLE :: zps(:,:,:) REAL, ALLOCATABLE :: x2d(:,:) REAL, ALLOCATABLE :: y2d(:,:) REAL, ALLOCATABLE :: lat(:,:),lon(:,:) REAL, ALLOCATABLE :: vxs(:) REAL, ALLOCATABLE :: vys(:) REAL, ALLOCATABLE :: vzps(:,:,:) REAL, ALLOCATABLE :: dxfld(:) REAL, ALLOCATABLE :: dyfld(:) REAL, ALLOCATABLE :: rdxfld(:) REAL, ALLOCATABLE :: rdyfld(:) INTEGER, ALLOCATABLE :: iloc(:,:),jloc(:,:) REAL, ALLOCATABLE :: zpver(:,:,:) ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! CHARACTER (LEN=80) :: fcrnam,runnmin CHARACTER (LEN=132) :: filename(3),grdbasfn(3) INTEGER :: lengbf(3),lenfil(3) INTEGER :: ifproj,ivproj REAL :: flatnot(2),vlatnot(2) REAL :: fscale,ftrulon,fdx,fdy,fx0,fy0 REAL :: fctrlat,fctrlon REAL :: vscale,vtrulon,vdx,vdy,vx0,vy0 REAL :: vctrlat,vctrlon REAL :: time,xctr,yctr INTEGER :: i,j,k INTEGER :: grdbas INTEGER :: iorder,hinfmt,iread,isread,iensopt,inibred,iseed INTEGER :: ireturn LOGICAL :: comcoord INTEGER :: nch INTEGER :: tsfcin,tsoilin,wsfcin,wdpin,wcanpin,snowdin ! INTEGER :: istatus REAL :: utot,utot2,usd,uscl REAL :: vtot,vtot2,vsd,vscl REAL :: wtot,wtot2,wsd REAL :: pttot,pttot2,ptsd,ptscl REAL :: qvtot,qvtot2,qvsd,qvscl REAL :: ptot,ptot2,psd,pscl REAL :: totalpoint NAMELIST /prtbpara/ iensopt,inibred,iseed,iorder,isread,soilinfl,iread NAMELIST /input_data/ hinfmt,grdbasfn,filename NAMELIST /outpt_data/ hdmpfmt,runnmin,grdout,basout,varout,mstout, & iceout,trbout,sfcout,rainout,snowout,filcmprs !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! WRITE(6,'(/6(/5x,a)/)') & '###############################################################', & '# #', & '# Welcome to ARPSENSIC, a program that reads in history files #', & '# generated by ARPS and produces perturbation grids variables #', & '# #', & '###############################################################' !------------------------------------------------------------------------ ! Read namelist !------------------------------------------------------------------------ READ(5,prtbpara,END=999) ! PRINT *,iensopt,inibred,iseed,iorder,isread,soilinfl,iread write(6,prtbpara) READ(5,input_data,END=999) ! PRINT *,hinfmt, grdbasfn, filename write(6,input_data) READ(5,outpt_data,END=999) ! PRINT *,hdmpfmt, runnmin, & ! grdout,basout,varout,mstout, & ! iceout,trbout,sfcout,rainout,snowout,filcmprs write(6,outpt_data) GO TO 1001 999 PRINT *, 'ERROR in reading from input file, Program Terminated' STOP 1001 CONTINUE ! WRITE(6,'(/a,i5/a,i5)') & ! ' The scaling factor is :',iorder, & ! ' and the soil field reading flag is :',isread, & ! ' The 3rd set data reading flag is: ',iread ! ! WRITE(6,'(a,i5)')' The data format flag value is: ',hinfmt !------------------------------------------------------------------------ ! ! Get the dimensions of the input data files ! !------------------------------------------------------------------------ lengbf(1) = len_trim(grdbasfn(1)) CALL get_dims_from_data(hinfmt,grdbasfn(1)(1:lengbf(1)), & nx,ny,nz,nstyps, ireturn) IF( ireturn /= 0 ) THEN PRINT*,'Problem occured when trying to get dimensions from data.' PRINT*,'Program stopped.' STOP END IF WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz print*,'nstyps =', nstyps vnx=nx vny=ny vnz=nz totalpoint = nx*ny*nz !----------------------------------------------------------------------- ! ! Allocate the variables and initialize the them to zero ! !----------------------------------------------------------------------- ALLOCATE( x=0 ALLOCATE( y=0 ALLOCATE( z=0 ALLOCATE(zp(nx,ny,nz),STAT=istatus) zp=0 ALLOCATE(j1(nx,ny,nz),STAT=istatus) j1=0 ALLOCATE(j2(nx,ny,nz),STAT=istatus) j2=0 ALLOCATE(j3(nx,ny,nz),STAT=istatus) j3=0 ALLOCATE(hterain(nx,ny),STAT=istatus) hterain=0 ALLOCATE(uprt(nx,ny,nz),STAT=istatus) uprt=0 ALLOCATE(vprt(nx,ny,nz),STAT=istatus) vprt=0 ALLOCATE(wprt(nx,ny,nz),STAT=istatus) wprt=0 ALLOCATE(ptprt(nx,ny,nz),STAT=istatus) ptprt=0 ALLOCATE(pprt(nx,ny,nz),STAT=istatus) pprt=0 ALLOCATE(qvprt(nx,ny,nz),STAT=istatus) qvprt=0 ALLOCATE(qc(nx,ny,nz),STAT=istatus) qc=0 ALLOCATE(qr(nx,ny,nz),STAT=istatus) qr=0 ALLOCATE(qi(nx,ny,nz),STAT=istatus) qi=0 ALLOCATE(qs(nx,ny,nz),STAT=istatus) qs=0 ALLOCATE(qh(nx,ny,nz),STAT=istatus) qh=0 ALLOCATE(tke(nx,ny,nz),STAT=istatus) tke=0 ALLOCATE(kmh(nx,ny,nz),STAT=istatus) kmh=0 ALLOCATE(kmv(nx,ny,nz),STAT=istatus) kmv=0 ALLOCATE(ubar(nx,ny,nz),STAT=istatus) ubar=0 ALLOCATE(vbar(nx,ny,nz),STAT=istatus) vbar=0 ALLOCATE(wbar(nx,ny,nz),STAT=istatus) wbar=0 ALLOCATE(ptbar(nx,ny,nz),STAT=istatus) ptbar=0 ALLOCATE(pbar(nx,ny,nz),STAT=istatus) pbar=0 ALLOCATE(rhobar(nx,ny,nz),STAT=istatus) rhobar=0 ALLOCATE(qvbar(nx,ny,nz),STAT=istatus) qvbar=0 ALLOCATE(soiltyp(nx,ny,nstyps),STAT=istatus) soiltyp=0 ALLOCATE(stypfrct(nx,ny,nstyps),STAT=istatus) stypfrct=0 ALLOCATE(vegtyp(nx,ny),STAT=istatus) vegtyp=0 ALLOCATE(lai(nx,ny),STAT=istatus) lai=0 ALLOCATE(roufns(nx,ny),STAT=istatus) roufns=0 ALLOCATE(veg(nx,ny),STAT=istatus) veg=0 ALLOCATE(tsfc(nx,ny,0:nstyps),STAT=istatus) tsfc=0 ALLOCATE(tsoil(nx,ny,0:nstyps),STAT=istatus) tsoil=0 ALLOCATE(wetsfc(nx,ny,0:nstyps),STAT=istatus) wetsfc=0 ALLOCATE(wetdp(nx,ny,0:nstyps),STAT=istatus) wetdp=0 ALLOCATE(wetcanp(nx,ny,0:nstyps),STAT=istatus) wetcanp=0 ALLOCATE(snowdpth(nx,ny),STAT=istatus) snowdpth=0 ALLOCATE(raing(nx,ny),STAT=istatus) raing=0 ALLOCATE(rainc(nx,ny),STAT=istatus) rainc=0 ALLOCATE(vx(vnx),STAT=istatus) vx=0 ALLOCATE(vy(vny),STAT=istatus) vy=0 ALLOCATE(vz(vnz),STAT=istatus) vz=0 ALLOCATE(vzp(vnx,vny,vnz),STAT=istatus) vzp=0 ALLOCATE(vuprt(vnx,vny,vnz),STAT=istatus) vuprt=0 ALLOCATE(vvprt(vnx,vny,vnz),STAT=istatus) vvprt=0 ALLOCATE(vwprt(vnx,vny,vnz),STAT=istatus) vwprt=0 ALLOCATE(vptprt(vnx,vny,vnz),STAT=istatus) vptprt=0 ALLOCATE(vpprt(vnx,vny,vnz),STAT=istatus) vpprt=0 ALLOCATE(vqvprt(vnx,vny,vnz),STAT=istatus) vqvprt=0 ALLOCATE(vqc(vnx,vny,vnz),STAT=istatus) vqc=0 ALLOCATE(vqr(vnx,vny,vnz),STAT=istatus) vqr=0 ALLOCATE(vqi(vnx,vny,vnz),STAT=istatus) vqi=0 ALLOCATE(vqs(vnx,vny,vnz),STAT=istatus) vqs=0 ALLOCATE(vqh(vnx,vny,vnz),STAT=istatus) vqh=0 ALLOCATE(vtke(nx,ny,nz),STAT=istatus) vtke=0 ALLOCATE(vkmh(nx,ny,nz),STAT=istatus) vkmh=0 ALLOCATE(vkmv(nx,ny,nz),STAT=istatus) vkmv=0 ALLOCATE(vubar(vnx,vny,vnz),STAT=istatus) vubar=0 ALLOCATE(vvbar(vnx,vny,vnz),STAT=istatus) vvbar=0 ALLOCATE(vwbar(vnx,vny,vnz),STAT=istatus) vwbar=0 ALLOCATE(vptbar(vnx,vny,vnz),STAT=istatus) vptbar=0 ALLOCATE(vpbar(vnx,vny,vnz),STAT=istatus) vpbar=0 ALLOCATE(vrhobar(vnx,vny,vnz),STAT=istatus) vrhobar=0 ALLOCATE(vqvbar(vnx,vny,vnz),STAT=istatus) vqvbar=0 ALLOCATE(vsoiltyp(vnx,vny,nstyps),STAT=istatus) vsoiltyp=0 ALLOCATE(vstypfrct(vnx,vny,nstyps),STAT=istatus) vstypfrct=0 ALLOCATE(vvegtyp(vnx,vny),STAT=istatus) vvegtyp=0 ALLOCATE(vlai(vnx,vny),STAT=istatus) vlai=0 ALLOCATE(vroufns(vnx,vny),STAT=istatus) vroufns=0 ALLOCATE(vveg(vnx,vny),STAT=istatus) vveg=0 ALLOCATE(vtsfc(vnx,vny,0:nstyps),STAT=istatus) vtsfc=0 ALLOCATE(vtsoil(vnx,vny,0:nstyps),STAT=istatus) vtsoil=0 ALLOCATE(vwetsfc(vnx,vny,0:nstyps),STAT=istatus) vwetsfc=0 ALLOCATE(vwetdp(vnx,vny,0:nstyps),STAT=istatus) vwetdp=0 ALLOCATE(vwetcanp(vnx,vny,0:nstyps),STAT=istatus) vwetcanp=0 ALLOCATE(vsnowdpth(nx,ny),STAT=istatus) vsnowdpth=0 ALLOCATE(vraing(vnx,vny),STAT=istatus) vraing=0 ALLOCATE(vrainc(vnx,vny),STAT=istatus) vrainc=0 ALLOCATE(prcrate(nx,ny,4),STAT=istatus) prcrate=0 ALLOCATE(radfrc(nx,ny,nz),STAT=istatus) radfrc=0 ALLOCATE(radsw(nx,ny),STAT=istatus) radsw=0 ALLOCATE(rnflx(nx,ny),STAT=istatus) rnflx=0 ALLOCATE(usflx(nx,ny),STAT=istatus) usflx=0 ALLOCATE(vsflx(nx,ny),STAT=istatus) vsflx=0 ALLOCATE(ptsflx(nx,ny),STAT=istatus) ptsflx=0 ALLOCATE(qvsflx(nx,ny),STAT=istatus) qvsflx=0 ALLOCATE(tem1(nx,ny,nz),STAT=istatus) tem1=0 ALLOCATE(tem2(nx,ny,nz),STAT=istatus) tem2=0 ALLOCATE(tem3(nx,ny,nz),STAT=istatus) tem3=0 ALLOCATE(vtem1(vnx,vny,vnz),STAT=istatus) vtem1=0 ALLOCATE(vtem2(vnx,vny,vnz),STAT=istatus) vtem2=0 ALLOCATE(vtem3(vnx,vny,vnz),STAT=istatus) vtem3=0 ALLOCATE(xs(nx),STAT=istatus) xs=0 ALLOCATE(ys(ny),STAT=istatus) ys=0 ALLOCATE(zps(nx,ny,nz),STAT=istatus) zps=0 ALLOCATE(x2d(nx,ny),STAT=istatus) x2d=0 ALLOCATE(y2d(nx,ny),STAT=istatus) y2d=0 ALLOCATE(lat(nx,ny),STAT=istatus) ALLOCATE(lon(nx,ny),STAT=istatus) lat=0 lon=0 ALLOCATE(vxs(nx),STAT=istatus) vxs=0 ALLOCATE(vys(ny),STAT=istatus) vys=0 ALLOCATE(vzps(vnx,vny,vnz),STAT=istatus) vzps=0 ALLOCATE(dxfld(vnx),STAT=istatus) dxfld=0 ALLOCATE(dyfld(vny),STAT=istatus) dyfld=0 ALLOCATE(rdxfld(vnx),STAT=istatus) rdxfld=0 ALLOCATE(rdyfld(vny),STAT=istatus) rdyfld=0 ALLOCATE(iloc(nx,ny),STAT=istatus) ALLOCATE(jloc(nx,ny),STAT=istatus) iloc=0 jloc=0 ALLOCATE(zpver(nx,ny,vnz),STAT=istatus) zpver=0 101 CONTINUE ! !----------------------------------------------------------------------- ! ! Get the name of the grid/base data set. ! !----------------------------------------------------------------------- ! DO i=1,3 WRITE(6,'(/a,i5,a)')' For data set ',i,':' lengbf(i) = len_trim(grdbasfn(i)) ! lengbf(i)=LEN(grdbasfn(i)) ! CALL strlnth( grdbasfn(i), lengbf(i)) WRITE(6,'(/a,a)')' The grid/base name is ', & grdbasfn(i)(1:lengbf(i)) lenfil(i) = len_trim(filename(i)) ! lenfil(i) = LEN(filename(i)) ! CALL strlnth( filename(i), lenfil(i)) WRITE(6,'(/a,/1x,a)')' The data set name is ', & filename(i)(1:lenfil(i)) END DO ! WRITE(6,'(/5x,a,a)') 'The output run name is: ', runnmin WRITE(6,'(a,i5)')' The output data format flag is: ',hdmpfmt !----------------------------------------------------------------------- ! ! Read all input data arrays (a - forecast data) ! !----------------------------------------------------------------------- ! CALL dtaread(nx,ny,nz,nstyps, & hinfmt,nch,grdbasfn(1)(1:lengbf(1)),lengbf(1), & filename(1)(1:lenfil(1)),lenfil(1),time, & x,y,z,zp, uprt ,vprt ,wprt ,ptprt, pprt , & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem1,tem2,tem3) IF (isread == 1) THEN CALL readsoil(nx,ny,nstyps,soilinfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & tsfcin,tsoilin,wsfcin,wdpin,wcanpin,snowdin, & tsfc, tsoil, wetsfc,wetdp,wetcanp,snowdpth) END IF ! !----------------------------------------------------------------------- ! ! ireturn = 0 for a successful read ! !----------------------------------------------------------------------- ! IF( ireturn /= 0 ) THEN ! failed read PRINT *,'Problem reading forecast data, forced to STOP' STOP END IF ! successful read IF (inibred == 1) THEN utot=0.0 vtot=0.0 wtot=0.0 pttot=0.0 qvtot=0.0 ptot=0.0 utot2=0.0 vtot2=0.0 wtot2=0.0 pttot2=0.0 qvtot2=0.0 ptot2=0.0 do k=1,nz do i=1,nx do j=1,ny utot=utot+uprt(i,j,k) vtot=vtot+vprt(i,j,k) wtot=wtot+wprt(i,j,k) pttot=pttot+ptprt(i,j,k) qvtot=qvtot+qvprt(i,j,k) ptot=ptot+pprt(i,j,k) utot2=utot2+uprt(i,j,k)*uprt(i,j,k) vtot2=vtot2+vprt(i,j,k)*vprt(i,j,k) wtot2=wtot2+wprt(i,j,k)*wprt(i,j,k) pttot2=pttot2+ptprt(i,j,k)*ptprt(i,j,k) qvtot2=qvtot2+qvprt(i,j,k)*qvprt(i,j,k) ptot2=ptot2+pprt(i,j,k)*pprt(i,j,k) enddo enddo enddo utot=utot/totalpoint vtot=utot/totalpoint wtot=wtot/totalpoint pttot=pttot/totalpoint qvtot=qvtot/totalpoint ptot=ptot/totalpoint usd=sqrt(utot2/totalpoint-utot*utot) vsd=sqrt(vtot2/totalpoint-vtot*vtot) wsd=sqrt(wtot2/totalpoint-wtot*wtot) ptsd=sqrt(pttot2/totalpoint-pttot*pttot) qvsd=sqrt(qvtot2/totalpoint-qvtot*qvtot) psd=sqrt(ptot2/totalpoint-ptot*ptot) print *,'totalpoint=',totalpoint print *,'usd=',usd,' utot=',utot,' utot2=',utot2/totalpoint print *,'vsd=',vsd,' vtot=',vtot,' vtot2=',vtot2/totalpoint print *,'wsd=',wsd,' wtot=',wtot,' wtot2=',wtot2/totalpoint print *,'ptsd=',ptsd,' pttot=',pttot,' pttot2=',pttot2/totalpoint print *,'qvsd=',qvsd,' qvtot=',qvtot,' qvtot2=',qvtot2/totalpoint print *,'psd=',psd,' ptot=',ptot,' ptot2=',ptot2/totalpoint END IF curtim=time fcrnam=runname ifproj=mapproj fscale=sclfct flatnot(1)=trulat1 flatnot(2)=trulat2 ftrulon=trulon fdx=x(3)-x(2) fdy=y(3)-y(2) fctrlat=ctrlat fctrlon=ctrlon CALL setmapr(ifproj,fscale,flatnot,ftrulon) CALL lltoxy(1,1,fctrlat,fctrlon,xctr,yctr) fx0=xctr-fdx*((nx-3)/2) fy0=yctr-fdy*((ny-3)/2) CALL setorig(1,fx0,fy0) ! !----------------------------------------------------------------------- ! ! Get verification data (b - analysis (or gridded obs.) data) ! !----------------------------------------------------------------------- ! ! Set the gridread parameter to 0 so that the verification ! grid/base file will be read. ! !----------------------------------------------------------------------- ! CALL setgbrd (0) ! !----------------------------------------------------------------------- ! ! Read in the verification data. ! !----------------------------------------------------------------------- ! CALL dtaread(vnx,vny,vnz,nstyps, & hinfmt,nch,grdbasfn(2)(1:lengbf(2)),lengbf(2), & filename(2)(1:lenfil(2)),lenfil(2),time, & vx,vy,vz,vzp, vuprt ,vvprt ,vwprt ,vptprt, vpprt , & vqvprt, vqc, vqr, vqi, vqs, vqh, vtke,vkmh,vkmv, & vubar, vvbar, vwbar, vptbar, vpbar, vrhobar, vqvbar, & vsoiltyp,vstypfrct,vvegtyp,vlai,vroufns,vveg, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp,vsnowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, vtem1,vtem2,vtem3) IF (isread == 1) THEN CALL readsoil(nx,ny,nstyps,soilinfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & tsfcin,tsoilin,wsfcin,wdpin,wcanpin,snowdin, & vtsfc, vtsoil, vwetsfc,vwetdp,vwetcanp,vsnowdpth) END IF IF( ireturn /= 0 ) THEN ! failed read PRINT *,'Problem reading verification data, forced to STOP' STOP END IF ! successful read ! IF (vnx /= nx.OR.vny /= ny.OR.vnz /= nz) THEN ! PRINT *,'nx,ny,nz,','=/=','vnx,vny,vnz' ! PRINT *,nx,ny,nz,'=/=',vnx,vny,vnz ! PRINT *, 'forced to stop' ! STOP ! END IF ! don't need ivproj=mapproj vscale=sclfct vlatnot(1)=trulat1 vlatnot(2)=trulat2 vtrulon=trulon vdx=vx(3)-vx(2) vdy=vy(3)-vy(2) vctrlat=ctrlat vctrlon=ctrlon CALL setmapr(ivproj,vscale,vlatnot,vtrulon) CALL lltoxy(1,1,vctrlat,vctrlon,xctr,yctr) vx0=xctr-vdx*((vnx-3)/2) vy0=yctr-vdy*((vny-3)/2) CALL setorig(1,vx0,vy0) IF (fx0 == vx0.AND.fy0 == vy0.AND. & flatnot(1) == vlatnot(1).AND.flatnot(2) == vlatnot(2).AND. & ftrulon == vtrulon.AND.ifproj == ivproj .AND. & fscale == vscale ) THEN PRINT *, 'Grids 1 and 2 shares a common coordinate system' ELSE PRINT *, 'Grids 1/2 are different, CHECK the PROFRAM or data' PRINT *, 'Forced to STOP' STOP END IF IF (inibred == 0) THEN ! !----------------------------------------------------------------------- ! ! Find difference = forecast - verification ! a=a-b (note the forth parameter is 0) ! To reduce memory requirements, the difference fields are ! written to the same arrays as the interpolated fields. ! !----------------------------------------------------------------------- ! CALL prtfield(nx,ny,nz,0, & uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & tsfc,tsoil,wetsfc,wetdp,wetcanp, & raing,rainc, & vuprt, vvprt, vwprt, vptprt, vpprt, & vqvprt, vqc, vqr, vqi, vqs, vqh, vtke,vkmh,vkmv, & vubar, vvbar, vwbar, vptbar, vpbar, vrhobar, vqvbar, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp, & vraing,vrainc, & uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv,tem1, & tsfc,tsoil,wetsfc,wetdp,wetcanp, & raing,rainc, & ireturn ) IF (iensopt == 1) THEN ! scaling the perturbation in breeding IC utot2=0.0 vtot2=0.0 pttot2=0.0 qvtot2=0.0 ptot2=0.0 do k=1,nz do i=1,nx do j=1,ny utot2=utot2+uprt(i,j,k)*uprt(i,j,k) vtot2=vtot2+vprt(i,j,k)*vprt(i,j,k) pttot2=pttot2+ptprt(i,j,k)*ptprt(i,j,k) qvtot2=qvtot2+qvprt(i,j,k)*qvprt(i,j,k) ptot2=ptot2+pprt(i,j,k)*pprt(i,j,k) enddo enddo enddo usd=sqrt(utot2/totalpoint) vsd=sqrt(vtot2/totalpoint) ptsd=sqrt(pttot2/totalpoint) qvsd=sqrt(qvtot2/totalpoint) psd=sqrt(ptot2/totalpoint) if(usd > 0.0) uscl = min(0.20*10.0/usd, 1.0) vscl = uscl if(ptsd > 0.0) ptscl = min(0.20*11.0/ptsd, 1.0) if(qvsd > 0.0) qvscl = min(0.20*2e-3/qvsd, 1.0) if(psd > 0.0) pscl = min(0.20*1000.0/psd, 1.0) print *,'totalpoint=',totalpoint print *,'usd=',usd,' uscl=',uscl print *,'vsd=',vsd,' vscl=',vscl print *,'ptsd=',ptsd,' ptscl=',ptscl print *,'qvsd=',qvsd,' qvscl=',qvscl print *,'psd=',psd,' pscl=',pscl uprt = uscl*uprt vprt = vscl*vprt wprt = 0.0 ptprt = ptscl*ptprt qvprt = qvscl*qvprt pprt = pscl*pprt END IF ELSE IF (inibred ==1) THEN ! generate random perturbations do k=1,nz-1 do i=1,nx do j=1,ny-1 iseed=mod(iseed*7141+54773,259200) uprt(i,j,k) = 2.*0.20*usd*(iseed/259199.-.5) enddo enddo enddo do k=1,nz-1 do i=1,nx-1 do j=1,ny iseed=mod(iseed*7141+54773,259200) vprt(i,j,k) = 2.*0.20*vsd*(iseed/259199.-.5) enddo enddo enddo do k=1,nz-1 do i=1,nx-1 do j=1,ny-1 iseed=mod(iseed*7141+54773,259200) ptprt(i,j,k) = 2.*0.20*ptsd*(iseed/259199.-.5) enddo enddo enddo do k=1,nz-1 do i=1,nx-1 do j=1,ny-1 iseed=mod(iseed*7141+54773,259200) qvprt(i,j,k) = 2.*0.20*qvsd*(iseed/259199.-.5) enddo enddo enddo do k=1,nz-1 do i=1,nx-1 do j=1,ny-1 iseed=mod(iseed*7141+54773,259200) pprt(i,j,k) = 2.*0.20*psd*(iseed/259199.-.5) enddo enddo enddo wprt=0.0 qc=0.0 qr=0.0 qi=0.0 qs=0.0 qh=0.0 tke=0.0 kmh=0.0 kmv=0.0 tsfc=0.0 tsoil=0.0 wetsfc=0.0 wetdp=0.0 wetcanp=0.0 raing=0.0 rainc=0.0 END IF ! !----------------------------------------------------------------------- ! ! Get the name of the CONTROL data set, field c or c=b (if iread=0) ! (note: It is needed only if control .ne. verification) ! !----------------------------------------------------------------------- ! IF (iread /= 0) THEN ! !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! CALL setgbrd (0) CALL dtaread(vnx,vny,vnz,nstyps, & hinfmt,nch,grdbasfn(3)(1:lengbf(3)),lengbf(3), & filename(3)(1:lenfil(3)),lenfil(3),time, & vx,vy,vz,vzp, vuprt ,vvprt ,vwprt ,vptprt, vpprt , & vqvprt, vqc, vqr, vqi, vqs, vqh, vtke,vkmh,vkmv, & vubar, vvbar, vwbar, vptbar, vpbar, vrhobar, vqvbar, & vsoiltyp,vstypfrct,vvegtyp,vlai,vroufns,vveg, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp, vsnowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, vtem1,vtem2,vtem3) IF (isread == 1) THEN CALL readsoil(nx,ny,nstyps,soilinfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & tsfcin,tsoilin,wsfcin,wdpin,wcanpin,snowdin, & vtsfc, vtsoil, vwetsfc,vwetdp,vwetcanp,vsnowdpth) END IF IF( ireturn /= 0 ) THEN ! failed read PRINT *,'Problem reading control data, forced to STOP' STOP END IF ! successful read ! IF (vnx /= nx.OR.vny /= ny.OR.vnz /= nz) THEN ! PRINT *,'nx,ny,nz','=/=','vnx,vny,vnz' ! PRINT *,nx,ny,nz,'=/=',vnx,vny,vnz ! PRINT *, 'forced to stop' ! STOP ! END IF ivproj=mapproj vscale=sclfct vlatnot(1)=trulat1 vlatnot(2)=trulat2 vtrulon=trulon vdx=vx(3)-vx(2) vdy=vy(3)-vy(2) vctrlat=ctrlat vctrlon=ctrlon CALL setmapr(ivproj,vscale,vlatnot,vtrulon) CALL lltoxy(1,1,vctrlat,vctrlon,xctr,yctr) vx0=xctr-vdx*((vnx-3)/2) vy0=yctr-vdy*((vny-3)/2) CALL setorig(1,vx0,vy0) ! IF (fx0 == vx0.AND.fy0 == vy0.AND. & flatnot(1) == vlatnot(1).AND.flatnot(2) == vlatnot(2).AND. & ftrulon == vtrulon.AND.ifproj == ivproj .AND. & fscale == vscale ) THEN PRINT *, 'Grids 2 and 3 shares a common coordinate system' ELSE PRINT *, 'Grids 2/3 are different, CHECK the PROFRAM or data' PRINT *, 'Forced to STOP' STOP END IF END IF !----------------------------------------------------------------------- ! ! Set output variables to forecast coordinates ! !----------------------------------------------------------------------- ! curtim=time mapproj=ivproj sclfct=vscale trulat1=vlatnot(1) trulat2=vlatnot(2) trulon=vtrulon ctrlat=vctrlat ctrlon=vctrlon ! !----------------------------------------------------------------------- ! ! Find ptb field = filed c + a/n (note iorder=/=0) ! (b=b+a/n in the code) ! To reduce memory requirements, the resulted fields are ! written to the same arrays as the control fields. ! !----------------------------------------------------------------------- ! IF (iorder /= 0) THEN CALL prtfield(nx,ny,nz,iorder, & vuprt, vvprt, vwprt, vptprt, vpprt, & vqvprt, vqc, vqr, vqi, vqs, vqh, vtke,vkmh,vkmv, & vubar, vvbar, vwbar, vptbar, vpbar, vrhobar, vqvbar, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp, & vraing,vrainc, & uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & tsfc,tsoil,wetsfc,wetdp,wetcanp, & raing,rainc, & vuprt, vvprt, vwprt, vptprt, vpprt, & vqvprt, vqc, vqr, vqi, vqs, vqh, vtke,vkmh,vkmv,vtem1, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp, & vraing,vrainc, & ireturn ) END IF !----------------------------------------------------------------------- ! Assign the average of soil variables to every soil type !----------------------------------------------------------------------- CALL dhslini(nx,ny,nstyps, & tsfc,tsoil,wetsfc,wetdp,wetcanp) ! !----------------------------------------------------------------------- ! ! Get output info ! !----------------------------------------------------------------------- ! runname=runnmin ! !----------------------------------------------------------------------- ! ! Find out the number of characters to be used to construct file ! names. ! !----------------------------------------------------------------------- ! CALL gtlfnkey( runname, lfnkey ) ! !----------------------------------------------------------------------- ! ! Find out the number of characters to be used to construct file ! names. ! !----------------------------------------------------------------------- ! CALL gtlfnkey( runname, lfnkey ) ! IF (hdmpfmt == 10.AND.grbpkbit == 0) THEN grbpkbit=16 END IF ! !----------------------------------------------------------------------- ! ! Set control parameters for ! grid, base state, moisture, and ice variable dumping. ! !----------------------------------------------------------------------- ! varout=1 totout = totin grdout = grdin basout = basin varout = varin mstout = mstin rainout = rainin prcout = prcin iceout = icein tkeout = tkein trbout = trbin sfcout = sfcin snowout = snowin landout = landin radout = radin flxout = flxin CALL gtbasfn(runname(1:lfnkey),'./',2,hdmpfmt,mgrid,nestgrd, & grdbasfn(1), lengbf(1)) WRITE(6,'(/1x,a,a)') & 'Output grid/base state file is ', grdbasfn(1)(1:lengbf(1)) nchdmp = 80 grdbas = 1 ! Dump out grd and base state arrays only DO k=1,nz DO j=1,ny DO i=1,nx vuprt(i,j,k)=vubar(i,j,k)+vuprt(i,j,k) vvprt(i,j,k)=vvbar(i,j,k)+vvprt(i,j,k) vwprt(i,j,k)=vwbar(i,j,k)+vwprt(i,j,k) vqvprt(i,j,k)=vqvbar(i,j,k)+vqvprt(i,j,k) END DO END DO END DO IF (iorder /= 0) THEN DO k=1,nz DO j=1,ny DO i=1,nx IF (k /= 1) THEN IF ((vpprt(i,j,k)+vpbar(i,j,k)) >= & (vpprt(i,j,k-1)+vpbar(i,j,k-1)) ) THEN vpprt(i,j,k)=vpprt(i,j,k-1)+vpbar(i,j,k-1)-vpbar(i,j,k) & -(vpbar(i,j,k-1)-vpbar(i,j,k))*0.001 END IF END IF IF (vqvprt(i,j,k) <= 1.0E-8) THEN vqvprt(i,j,k)=1.0E-8 END IF END DO END DO END DO END IF CALL dtadump(nx,ny,nz,nstyps, & hdmpfmt,nchdmp,grdbasfn (1)(1:lengbf(1)),grdbas,filcmprs, & vuprt,vvprt,vwprt,vptprt,vpprt, & vqvprt,vqc,vqr,vqi,vqs,vqh,vtke,vkmh,vkmv, & vubar,vvbar,vwbar,vptbar,vpbar,vrhobar,vqvbar, & vx,vy,vz,vzp,hterain,j1,j2,j3, & vsoiltyp,vstypfrct,vvegtyp,vlai,vroufns,vveg, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp,vsnowdpth, & vraing,vrainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & vtem1,vtem2,vtem3) ! !----------------------------------------------------------------------- ! ! Find a unique name hdmpfn(1:ldmpf) for history dump data set ! at time 'curtim'. ! !----------------------------------------------------------------------- ! CALL gtdmpfn(runname(1:lfnkey),'./',2, & curtim,hdmpfmt, & mgrid,nestgrd, hdmpfn, ldmpf) WRITE(6,'(/1x,a,f10.0,a,a)') & 'Output file at time ',curtim,' (s) is ', hdmpfn(1:ldmpf) grdbas = 0 ! Not just dump out grd and base state arrays only CALL dtadump(nx,ny,nz,nstyps, & hdmpfmt,nchdmp,hdmpfn(1:ldmpf),grdbas,filcmprs, & vuprt,vvprt,vwprt,vptprt,vpprt, & vqvprt,vqc,vqr,vqi,vqs,vqh,vtke,vkmh,vkmv, & vubar,vvbar,vwbar,vptbar,vpbar,vrhobar,vqvbar, & vx,vy,vz,vzp,hterain, j1,j2,j3, & vsoiltyp,vstypfrct,vvegtyp,vlai,vroufns,vveg, & vtsfc,vtsoil,vwetsfc,vwetdp,vwetcanp,vsnowdpth, & vraing,vrainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & vtem1,vtem2,vtem3) STOP END PROGRAM arpsensic ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE PRTFIELD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE prtfield(nx,ny,nz,nscale, & 2,21 uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & tsfc,tsoil,wetsfc,wetdp,wetcanp, & raing,rainc, & auprt, avprt, awprt, aptprt, apprt, & aqvprt, aqc, aqr, aqi, aqs, aqh, atke,akmh,akmv, & aubar, avbar, awbar, aptbar, apbar, arhobar, aqvbar, & atsfc,atsoil,awetsfc,awetdp,awetcanp, & araing,arainc, & duprt, dvprt, dwprt, dptprt, dpprt, & dqvprt, dqc, dqr, dqi, dqs, dqh, dtke,dkmh,dkmv,tem1, & dtsfc,dtsoil,dwetsfc,dwetdp,dwetcanp, & draing,drainc, & ireturn) ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! (1) nscale=0, Subtract the forecast fields from the verification ! fields (names beginning with "a") and output to the difference ! fields (names beginning with "d"). d=( )bar+( )-abar-a ! (2) nscale=/=0. Generate perturbation fields d=( )+a/nscale with ! the bar arraies being neglected. ! The input ( ( ) ) and output ( d ) ! fields may share the same storage location. For this subroutine ! it is assumed the forecast and corresponding verification ! data are at the same physical location, however, the physical ! location may differ between variables. That is uprt and auprt ! are at the same location, but that may differ from pprt and apprt. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster Ou School of Meteorology. April 1992 ! ! MODIFICATION HISTORY: ! 14 May 1992 (KB) changed from arps2.5 to arps3.0 ! 03 Aug 1992 (KB) updated to account for changes in arps3.0 ! ! 09/07/1995 (KB) ! Added differencing of surface (soil) fields. ! 15/05/1998 (DH) ! converted from the difference scheme to the current multi-purpose ! version used in ARPSENS group. ! 15/12/1998 (DH) ! Added the 3-Dimensionity of surface (soil) fields. ! !----------------------------------------------------------------------- ! ! INPUT : ! nx,ny,nz Array dimensions for forecast field. ! ! FORECAST FIELDS: ! ! uprt perturbation x component of velocity (m/s) ! vprt perturbation y component of velocity (m/s) ! wprt perturbation vertical component of 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 density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! kmh Horizontal turbulent mixing coefficient (m**2/s) ! kmv Vertical turbulent mixing coefficient (m**2/s) ! ! 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 ! ! INTERPOLATED VERIFICATION FIELDS: ! ! auprt perturbation x component of velocity (m/s) ! avprt perturbation y component of velocity (m/s) ! awprt perturbation vertical component of velocity in Cartesian ! coordinates (m/s). ! ! aptprt perturbation potential temperature (K) ! apprt perturbation pressure (Pascal) ! ! aqvprt perturbation water vapor mixing ratio (kg/kg) ! aqc Cloud water mixing ratio (kg/kg) ! aqr Rainwater mixing ratio (kg/kg) ! aqi Cloud ice mixing ratio (kg/kg) ! aqs Snow mixing ratio (kg/kg) ! aqh Hail mixing ratio (kg/kg) ! ! aubar Base state x velocity component (m/s) ! avbar Base state y velocity component (m/s) ! awbar Base state z velocity component (m/s) ! aptbar Base state potential temperature (K) ! apbar Base state pressure (Pascal) ! arhobar Base state density (kg/m**3) ! aqvbar Base state water vapor mixing ratio (kg/kg) ! ! atsfc Temperature at surface (K) ! atsoil Deep soil temperature (K) ! awetsfc Surface soil moisture ! awetdp Deep soil moisture ! awetcanp Canopy water amount ! ! araing Grid supersaturation rain ! arainc Cumulus convective rain ! ! OUTPUT : ! ! DIFFERENCE FIELDS (may share storage with forecast fields ! or interpolated fields in calling program): ! ! duprt perturbation x component of velocity (m/s) ! dvprt perturbation y component of velocity (m/s) ! dwprt perturbation vertical component of velocity in Cartesian ! coordinates (m/s). ! ! dptprt perturbation potential temperature (K) ! dpprt perturbation pressure (Pascal) ! ! dqvprt perturbation water vapor mixing ratio (kg/kg) ! dqc Cloud water mixing ratio (kg/kg) ! dqr Rainwater mixing ratio (kg/kg) ! dqi Cloud ice mixing ratio (kg/kg) ! dqs Snow mixing ratio (kg/kg) ! dqh Hail mixing ratio (kg/kg) ! ! dtsfc Temperature at surface (K) ! dtsoil Deep soil temperature (K) ! dwetsfc Surface soil moisture ! dwetdp Deep soil moisture ! dwetcanp Canopy water amount ! ! draing Grid supersaturation rain ! drainc Cumulus convective rain ! ! tem1 Work array ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! 3 dimensions of array INTEGER :: nscale ! !----------------------------------------------------------------------- ! ! Model Arrays ! !----------------------------------------------------------------------- ! 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 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 humidity REAL :: tsfc (nx,ny) ! Temperature at surface (K) REAL :: tsoil (nx,ny) ! Deep soil temperature (K) REAL :: wetsfc(nx,ny) ! Surface soil moisture REAL :: wetdp (nx,ny) ! Deep soil moisture REAL :: wetcanp(nx,ny) ! Canopy water amount REAL :: raing (nx,ny) ! Grid supersaturation rain REAL :: rainc (nx,ny) ! Cumulus convective rain ! !----------------------------------------------------------------------- ! ! Verification data interpolated to model grid ! !----------------------------------------------------------------------- ! REAL :: auprt (nx,ny,nz) ! Perturbation u-velocity (m/s) REAL :: avprt (nx,ny,nz) ! Perturbation v-velocity (m/s) REAL :: awprt (nx,ny,nz) ! Perturbation w-velocity (m/s) REAL :: aptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: apprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: aqvprt (nx,ny,nz) ! Perturbation water vapor specific humidity REAL :: aqc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: aqr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: aqi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: aqs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: aqh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: atke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: akmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: akmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: aubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: avbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: awbar (nx,ny,nz) ! Base state w-velocity (m/s) REAL :: aptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: arhobar(nx,ny,nz) ! Base state density (kg/m**3) REAL :: apbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: aqvbar (nx,ny,nz) ! Base state water vapor specific humidity REAL :: atsfc (nx,ny) ! Temperature at surface (K) REAL :: atsoil (nx,ny) ! Deep soil temperature (K) REAL :: awetsfc(nx,ny) ! Surface soil moisture REAL :: awetdp (nx,ny) ! Deep soil moisture REAL :: awetcanp(nx,ny) ! Canopy water amount REAL :: araing (nx,ny) ! Grid supersaturation rain REAL :: arainc (nx,ny) ! Cumulus convective rain ! !------------------------------------------------------------------------ ! ! Difference arrays ! !----------------------------------------------------------------------- ! REAL :: duprt (nx,ny,nz) ! perturbation x component of velocity (m/s) REAL :: dvprt (nx,ny,nz) ! perturbation y component of velocity (m/s) REAL :: dwprt (nx,ny,nz) ! perturbation vertical component of ! velocity in Cartesian coordinates (m/s) REAL :: dptprt (nx,ny,nz) ! perturbation potential temperature (K) REAL :: dpprt (nx,ny,nz) ! perturbation pressure (Pascal) REAL :: dqvprt (nx,ny,nz) ! perturbation water vapor mixing ratio (kg/kg) REAL :: dqc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: dqr (nx,ny,nz) ! Rainwater mixing ratio (kg/kg) REAL :: dqi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: dqs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: dqh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: dtke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: dkmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: dkmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: dtsfc (nx,ny) ! Temperature at surface (K) REAL :: dtsoil (nx,ny) ! Deep soil temperature (K) REAL :: dwetsfc(nx,ny) ! Surface soil moisture REAL :: dwetdp (nx,ny) ! Deep soil moisture REAL :: dwetcanp(nx,ny) ! Canopy water amount REAL :: draing (nx,ny) ! Grid supersaturation rain REAL :: drainc (nx,ny) ! Cumulus convective rain REAL :: tem1 (nx,ny,nz) ! A work array INTEGER :: ireturn, i,j,k ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: is,js,ks,ie,je,ke ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! is=1 js=1 ks=1 ie=nx-1 je=ny-1 ke=nz-1 !----------------------------------------------------------------------- ! ! Scalars ! !----------------------------------------------------------------------- DO k=1,nz DO j=1,ny DO i=1,nx tem1(i,j,k)=0.0 END DO END DO END DO PRINT *, ' ptprt: ' CALL subtrprt(nx,ny,nz, ptprt,ptbar,aptprt,aptbar,dptprt,nscale, & is,js,ks,ie,je,ke) PRINT *, ' pprt: ' CALL subtrprt(nx,ny,nz, pprt, pbar, apprt, apbar, dpprt,nscale, & is,js,ks,ie,je,ke) PRINT *, ' qvprt: ' CALL subtrprt(nx,ny,nz, qvprt,qvbar,aqvprt,aqvbar,dqvprt,nscale, & is,js,ks,ie,je,ke) PRINT *, ' qc: ' CALL subtrprt(nx,ny,nz, qc, tem1, aqc, tem1, dqc,nscale, & is,js,ks,ie,je,ke) PRINT *, ' qr: ' CALL subtrprt(nx,ny,nz, qr, tem1, aqr, tem1, dqr,nscale, & is,js,ks,ie,je,ke) PRINT *, ' qi: ' CALL subtrprt(nx,ny,nz, qi, tem1, aqi, tem1, dqi,nscale, & is,js,ks,ie,je,ke) PRINT *, ' qs: ' CALL subtrprt(nx,ny,nz, qs, tem1, aqs, tem1, dqs,nscale, & is,js,ks,ie,je,ke) PRINT *, ' qh: ' CALL subtrprt(nx,ny,nz, qh, tem1, aqh, tem1, dqh,nscale, & is,js,ks,ie,je,ke) PRINT *, ' tke: ' CALL subtrprt(nx,ny,nz, tke, tem1, atke, tem1, dtke,nscale, & is,js,ks,ie,je,ke) PRINT *, ' kmh: ' CALL subtrprt(nx,ny,nz, kmh, tem1, akmh, tem1, dkmh,nscale, & is,js,ks,ie,je,ke) PRINT *, ' kmv: ' CALL subtrprt(nx,ny,nz, kmv, tem1, akmv, tem1, dkmv,nscale, & is,js,ks,ie,je,ke) !----------------------------------------------------------------------- ! ! u wind components ! !----------------------------------------------------------------------- ie=nx PRINT *, ' uprt: ' CALL subtrprt(nx,ny,nz,uprt,ubar,auprt,aubar,duprt,nscale, & is,js,ks,ie,je,ke) !----------------------------------------------------------------------- ! ! v wind components ! !----------------------------------------------------------------------- ie=nx-1 je=ny PRINT *, ' vprt: ' CALL subtrprt(nx,ny,nz,vprt,vbar,avprt,avbar,dvprt,nscale, & is,js,ks,ie,je,ke) !----------------------------------------------------------------------- ! ! w wind components ! !----------------------------------------------------------------------- je=ny-1 ke=nz PRINT *, ' wprt: ' CALL subtrprt(nx,ny,nz,wprt,tem1,awprt,tem1,dwprt,nscale, & is,js,ks,ie,je,ke) !----------------------------------------------------------------------- ! ! 2-d surface (soil) variables ! !----------------------------------------------------------------------- ie=nx-1 je=ny-1 ks=1 ke=1 ! PRINT *, ' tsfc:' CALL subtrprt(nx,ny,1, tsfc,tem1, atsfc,tem1, dtsfc,nscale, & is,js,ks,ie,je,ke) PRINT *, ' tsoil:' CALL subtrprt(nx,ny,1, tsoil,tem1, atsoil,tem1, dtsoil,nscale, & is,js,ks,ie,je,ke) PRINT *, ' wetsfc:' CALL subtrprt(nx,ny,1, wetsfc,tem1, awetsfc,tem1, dwetsfc,nscale, & is,js,ks,ie,je,ke) PRINT *, ' wetdp:' CALL subtrprt(nx,ny,1, wetdp,tem1, awetdp,tem1, dwetdp,nscale, & is,js,ks,ie,je,ke) PRINT *, ' wetcanp:' CALL subtrprt(nx,ny,1,wetcanp,tem1,awetcanp,tem1,dwetcanp,nscale, & is,js,ks,ie,je,ke) PRINT *, ' raing:' CALL subtrprt(nx,ny,1, raing,tem1, araing,tem1, draing,nscale, & is,js,ks,ie,je,ke) PRINT *, ' rainc:' CALL subtrprt(nx,ny,1, rainc,tem1, arainc,tem1, drainc,nscale, & is,js,ks,ie,je,ke) ! RETURN END SUBROUTINE prtfield ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SUBTRPRT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE subtrprt(nx,ny,nz, a,abar,b,bbar,c,nscale, & 21 istr,jstr,kstr,iend,jend,kend) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Subtracts 2 three-dimensional arrays, represented by ! means plus perturbations. ! ! AUTHOR: Keith Brewster OU School of Meteorology. Feb 1992 ! ! MODIFICATION HISTORY: ! 11 Aug 1992 (KB) changed from arps2.5 to arps3.0 ! ! !----------------------------------------------------------------------- ! ! INPUT: ! a perturbation data array ! abar mean data array ! b perturbation data array to subtract from a ! bbar mean data array to subtract from a ! ! OUTPUT: ! c difference array a-b ! (may share storage in calling program with array a or b) ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! 3 dimensions of array INTEGER :: nscale REAL :: a (nx,ny,nz) ! data array REAL :: abar(nx,ny,nz) ! base state of data array a REAL :: b (nx,ny,nz) ! data array to subtract from a REAL :: bbar(nx,ny,nz) ! base state of data arrya b REAL :: c (nx,ny,nz) ! difference array a-b INTEGER :: istr,jstr,kstr INTEGER :: iend,jend,kend INTEGER :: i,j,k,imid,jmid,kmid ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! imid=nint(0.5*FLOAT(istr+iend)) jmid=nint(0.5*FLOAT(jstr+jend)) kmid=nint(0.5*FLOAT(kstr+kend)) IF (nz < 10) kmid=kstr PRINT *, 'imid,jmid,kmid: ',imid,jmid,kmid ! !----------------------------------------------------------------------- ! ! Tell us about a sample input point ! !----------------------------------------------------------------------- ! IF (nscale == 0) THEN PRINT *, ' sample, a= ',(a(imid,jmid,kmid)+abar(imid,jmid,kmid)), & ' b= ',(b(imid,jmid,kmid)+bbar(imid,jmid,kmid)) ELSE PRINT *, ' sample, a= ',(a(imid,jmid,kmid)+abar(imid,jmid,kmid)), & ' b= ',b(imid,jmid,kmid) END IF ! !----------------------------------------------------------------------- ! ! Subtraction ! !----------------------------------------------------------------------- ! DO k=kstr,kend DO j=jstr,jend DO i=istr,iend IF (nscale == 0) THEN c(i,j,k)=a(i,j,k)+abar(i,j,k)-(b(i,j,k)+bbar(i,j,k)) ELSE c(i,j,k)=a(i,j,k)+b(i,j,k)/FLOAT(nscale) END IF END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Tell us about a sample output point ! !----------------------------------------------------------------------- ! IF (nscale == 0) THEN PRINT *, ' c= ',c(imid,jmid,kmid) ELSE PRINT *, ' c= ',c(imid,jmid,kmid)+abar(imid,jmid,kmid) END IF RETURN END SUBROUTINE subtrprt SUBROUTINE dhslini(nx,ny,nstyps, & 1 tsfc,tsoil,wetsfc,wetdp,wetcanp) IMPLICIT NONE INTEGER :: nx,ny,nstyps INTEGER :: i,j,k REAL :: tsfc (nx,ny,0:nstyps) ! Temperature at surface (K) REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount DO k=1,nstyps DO j=1,ny DO i=1,nx tsfc(i,j,k)=tsfc(i,j,0) tsoil(i,j,k)=tsoil(i,j,0) wetsfc(i,j,k)=wetsfc(i,j,0) wetdp(i,j,k)=wetdp(i,j,0) wetcanp(i,j,k)=wetcanp(i,j,0) END DO END DO END DO RETURN END SUBROUTINE dhslini