! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BINREAD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE binread(nx,ny,nz,nzsoil,nstyps,grdbas,inch,time,x,y,z,zp, & 2,9 zpsoil,uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & ireturn) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in binary data set created by ARPS using history dump format ! No. 1. ! All data read in are located at the original staggered grid points ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 2/27/92. ! ! MODIFICATION HISTORY: ! ! 6/08/92 ! Added full documentation (K. Brewster) ! ! 7/14/92 (K. Brewster) ! Added runname, comment and version number reading ! ! 8/20/92 (M. Xue) ! Added data reading of computational z coordinate array z. ! ! 4/23/93 (M. Xue) ! New data format. ! ! 02/06/95 (Y. Liu) ! Added map projection parameters into the binary dumping ! ! 03/26/96 (G. Bassett) ! Backwards compatibility added for ARPS 3.2 and ARPS 4.0 binary ! history dump formats. ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 05/15/2002 (J. Brotzge) ! Added additional variables to allow for multiple soil schemes ! ! 1 June 2002 Eric Kemp ! Bug fixes for new soil variables. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil ! ! grdbas Data read flag. ! =1, only grid and base state arrays will be read ! =0, all arrays will be read based on data ! parameter setting. ! inch Channel number for binary reading. ! This channel must be opened for unformatted reading ! by the calling routine. ! ! OUTPUT: ! ! time Time in seconds of data read from "filename" ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp z coordinate of grid points in physical space (m) ! zpsoil z coordinate of grid points in the soil (m) ! ! uprt x component of perturbation velocity (m/s) ! vprt y component of perturbation velocity (m/s) ! wprt Vertical component of perturbation velocity in ! Cartesian coordinates (m/s). ! ptprt Perturbation potential temperature (K) ! pprt Perturbation pressure (Pascal) ! ! qvprt Perturbation water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state air density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! ireturn Return status indicator ! =0, successful read of all data ! =1, error reading data ! =2, end-of-file reached during read attempt ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the soil REAL :: x (nx) ! x-coord. of the physical and compu ! -tational grid. Defined at u-point(m). REAL :: y (ny) ! y-coord. of the physical and compu ! -tational grid. Defined at v-point(m). REAL :: z (nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered ! grid(m). REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid(m). REAL :: zpsoil(nx,ny,nzsoil) ! Physical height coordinate defined at ! w-point of the soil (m) INTEGER :: grdbas ! Data read flag. INTEGER :: inch ! Channel number for binary reading REAL :: time ! Time in seconds of data read ! from "filename" 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 mixing ! ratio (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio INTEGER :: nstyps ! Number of soil type INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type fraction INTEGER :: vegtyp(nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) INTEGER :: ireturn ! Return status indicator ! !----------------------------------------------------------------------- ! ! Parameters describing routine that wrote the gridded data ! !----------------------------------------------------------------------- ! ! 06/28/2002 Zuwen He ! ! fmtver??: to label each data a version. ! intver??: an integer to allow faster comparison than fmtver??, ! which are strings. ! ! Verion 5.00: significant change in soil variables since version 4.10. ! CHARACTER (LEN=40) :: fmtver320,fmtver400,fmtver410,fmtver500 INTEGER :: intver,intver320,intver400,intver410,intver500 PARAMETER (fmtver320='003.20 Binary Data',intver320=320) PARAMETER (fmtver400='004.00 Binary Data',intver400=400) PARAMETER (fmtver410='004.10 Binary Data',intver410=410) PARAMETER (fmtver500='005.00 Binary Data',intver500=500) CHARACTER (LEN=40) :: fmtverin ! CHARACTER (LEN=10) :: tmunit ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: lchanl PARAMETER (lchanl=6) ! Channel number for formatted printing. INTEGER :: i,j,k,is INTEGER :: nstyp1 CHARACTER (LEN=12) :: label INTEGER :: nxin,nyin,nzin,nzsoilin INTEGER :: bgrdin,bbasin,bvarin,bicein,btkein,btrbin INTEGER :: idummy REAL(4) :: rdummy REAL(4) :: umove4, vmove4 REAL(4) :: xgrdorg4, ygrdorg4 REAL(4) :: trulat14, trulat24, trulon4 REAL(4) :: sclfct4 REAL(4) :: tstop4, thisdmp4 REAL(4) :: latitud4, ctrlat4, ctrlon4 REAL(4), ALLOCATABLE :: invar1d(:) REAL(4), ALLOCATABLE :: invar2d(:,:) REAL(4), ALLOCATABLE :: invar3d(:,:,:) REAL(4), ALLOCATABLE :: invar3dsoil(:,:,:) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'indtflg.inc' INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'mp.inc' ! mpi parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ALLOCATE(invar1d(MAX(nx,ny,nz)), STAT = idummy) CALL check_alloc_status(idummy, "BINREAD:invar1d") ALLOCATE(invar2d(nx,ny), STAT = idummy) CALL check_alloc_status(idummy, "BINREAD:invar2d") ALLOCATE(invar3d(nx,ny,nz), STAT = idummy) CALL check_alloc_status(idummy, "BINREAD:invar3d") ALLOCATE(invar3dsoil(nx,ny,nzsoil), STAT = idummy) CALL check_alloc_status(idummy, "BINREAD:invar3dsoil") ! !----------------------------------------------------------------------- ! ! Read header info ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) fmtverin IF (fmtverin == fmtver320) THEN intver=intver320 ELSE IF (fmtverin == fmtver400) THEN intver=intver400 ELSE IF (fmtverin == fmtver410) THEN intver=intver410 ELSE IF (fmtverin == fmtver500) THEN intver=intver500 ELSE IF (myproc == 0) WRITE(6,'(/1x,a,a,a/)') & 'Incoming data format, fmtverin=',fmtverin, & ', not found. The Job stopped.' CALL arpsstop('arpstop called from binread. ',1) END IF IF (myproc == 0) WRITE(6,'(/1x,a,a/)') & 'Incoming data format, fmtverin=',fmtverin READ(inch,ERR=110,END=120) runname READ(inch,ERR=110,END=120) nocmnt IF( nocmnt > 0 ) THEN DO i=1,nocmnt READ(inch,ERR=110,END=120) cmnt(i) END DO END IF IF (myproc == 0) & WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') runname IF( nocmnt > 0 ) THEN IF(myproc == 0)THEN DO i=1,nocmnt WRITE(6,'(1x,a)') cmnt(i) END DO END IF END IF READ(inch,ERR=110,END=120) rdummy,tmunit time = rdummy ! !----------------------------------------------------------------------- ! ! Get dimensions of data in binary file and check against ! the dimensions passed to BINREAD ! !----------------------------------------------------------------------- ! IF (intver <= intver410) THEN READ(inch,ERR=110,END=120) nxin, nyin, nzin nzsoilin = 2 ! for version prior to 410, it is a two-layer soil model ELSE IF (intver >= intver500) THEN READ(inch,ERR=110,END=120) nxin, nyin, nzin,nzsoilin END IF ! ! Data validation: dimensions ! IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz) THEN IF(myproc == 0)THEN WRITE(6,'(1x,a)') & ' Dimensions in BINREAD inconsistent with data.' WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin WRITE(6,'(1x,a,3I15)') ' Expected: ', nx, ny, nz WRITE(6,'(1x,a)') ' Program aborted in BINREAD.' END IF CALL arpsstop('arpstop called from binread nx-ny-nz read ',1) END IF IF(nzsoilin /= nzsoil) THEN IF (intver <= intver410) THEN IF(myproc == 0) WRITE(6,'(1x,a,a/,2(1x,a/))') & ' The incoming data version is ', fmtverin, & ' In the input file, nzsoil must be set to 2. ', & ' Program aborted in BINREAD.' ELSE IF (intver >= intver500) THEN IF(myproc == 0)THEN WRITE(6,'(1x,a)') & ' Dimensions in BINREAD inconsistent with data.' WRITE(6,'(1x,a,I15)') ' Read were: ', nzsoilin WRITE(6,'(1x,a,I15)') ' Expected: ', nzsoil WRITE(6,'(1x,a)') ' Program aborted in BINREAD.' END IF END IF CALL arpsstop('arpstop called from binread nzsoil read ',1) END IF ! !----------------------------------------------------------------------- ! ! Read in flags for different data groups ! !----------------------------------------------------------------------- ! IF( grdbas == 1 ) THEN ! Read grid and base state arrays IF (myproc == 0) & WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)') & 'To read grid and base state data at time ', time, & ' secs = ',(time/60.),' mins.' READ(inch,ERR=110,END=120) & bgrdin,bbasin,bvarin,mstin,bicein, & btrbin,idummy,idummy,landin,totin, & btkein,idummy,idummy,mapproj,month, & day, year, hour, minute, second ELSE ! Normal data reading IF (myproc == 0) & WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)')'To read data for time:', & time,' secs = ',(time/60.),' mins.' READ(inch,ERR=110,END=120) & grdin,basin,varin,mstin,icein, & trbin, sfcin,rainin,landin,totin, & tkein,idummy,idummy,mapproj, month, & day, year, hour, minute, second END IF READ(inch,ERR=110,END=120) & umove4, vmove4, xgrdorg4,ygrdorg4,trulat14, & trulat24,trulon4, sclfct4, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & tstop4, thisdmp4,latitud4,ctrlat4, ctrlon4 umove = umove4 vmove = vmove4 xgrdorg = xgrdorg4 ygrdorg = ygrdorg4 trulat1 = trulat14 trulat2 = trulat24 trulon = trulon4 sclfct = sclfct4 tstop = tstop4 thisdmp = thisdmp4 latitud = latitud4 ctrlat = ctrlat4 ctrlon = ctrlon4 IF ( totin /= 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in additional parameters for ARPS history dump 4.0 or later ! version. ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) & nstyp1, prcin, radin, flxin,snowcin, & snowin,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy IF ( nstyp1 < 1 ) THEN nstyp1 = 1 END IF READ(inch,ERR=110,END=120) & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy END IF ! !----------------------------------------------------------------------- ! ! Read in x, y, z and zp arrays. ! !---------------------------------------------------------------------- ! IF( grdin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar1d(1:nx) x(:) = invar1d(1:nx) IF (myproc == 0) WRITE(lchanl,910) label,' x.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar1d(1:ny) y(:) = invar1d(1:ny) IF (myproc == 0) WRITE(lchanl,910) label,' y.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar1d(1:nz) z(:) = invar1d(1:nz) IF (myproc == 0) WRITE(lchanl,910) label,' z.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d zp(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' zp.' IF (intver <= intver410) THEN ! ! nzsoil must equal to 2, 06/28/2002, Zuwen ! assume zpsoil(,,2) is one meter below the surface. ! DO j=1,ny DO i=1,nx zpsoil(i,j,1)=zp(i,j,2) zpsoil(i,j,2)=zpsoil(i,j,1)-1. END DO END DO IF (myproc == 0) THEN WRITE(lchanl,910) ' Assign zpsoil. ' WRITE(lchanl,910) ' Assume zpsoil(,,1) is zp(,,2). ' WRITE(lchanl,910) ' Assume zpsoil(,,2) is zp(,,2)-1. ' END IF ELSE IF (intver >= intver500) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3dsoil zpsoil(:,:,:) = invar3dsoil(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' zpsoil.' END IF ! intver END IF ! grdin ! !----------------------------------------------------------------------- ! ! Read in base state fields ! !---------------------------------------------------------------------- ! IF( basin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d ubar(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' ubar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d vbar(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' vbar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d wbar(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wbar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d ptbar(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' ptbar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d pbar(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' pbar.' IF( mstin == 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d qvbar(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qvbar.' END IF IF (landin == 1) THEN IF (nstyp1 <= 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((soiltyp(i,j,1),i=1,nx),j=1,ny) IF (myproc == 0) WRITE(lchanl,910) label,' soiltyp.' ELSE DO is=1,nstyp1 IF (is <= nstyps) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((soiltyp(i,j,is),i=1,nx),j=1,ny) IF (myproc == 0) WRITE(lchanl,910) label,' soiltyp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d stypfrct(:,:,is) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' stypfrct.' ELSE READ(inch,ERR=110,END=120) label IF (myproc == 0) WRITE(lchanl,910) label,'skipping soiltyp' READ(inch,ERR=110,END=120) READ(inch,ERR=110,END=120) label IF (myproc == 0) & WRITE(lchanl,910) label,'skipping stypfrct.' READ(inch,ERR=110,END=120) ENDIF END DO END IF CALL fix_stypfrct_nstyp(nx,ny,nstyp1,nstyp,stypfrct) READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) vegtyp IF (myproc == 0) WRITE(lchanl,910) label,' vegtyp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d lai(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' lai.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d roufns(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' roufns.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d veg(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' veg.' END IF END IF IF( grdbas == 1 ) GO TO 930 IF( varin == 1 ) THEN IF ( totin == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in perturbations from history dump ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d uprt(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' uprt.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d vprt(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' vprt.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d wprt(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wprt.' ! !----------------------------------------------------------------------- ! ! Read in scalars ! !---------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d ptprt(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' ptprt.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d pprt(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' pprt.' ELSE ! !----------------------------------------------------------------------- ! ! Read in total values of variables from history dump ! !---------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d IF (myproc == 0) WRITE(lchanl,910) label,' u.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx uprt(i,j,k) = invar3d(i,j,k) - ubar(i,j,k) END DO END DO END DO READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d IF (myproc == 0) WRITE(lchanl,910) label,' v.' DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 vprt(i,j,k) = invar3d(i,j,k) - vbar(i,j,k) END DO END DO END DO READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d wprt(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' w.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d IF (myproc == 0) WRITE(lchanl,910) label,' pt.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptprt(i,j,k) = invar3d(i,j,k) - ptbar(i,j,k) END DO END DO END DO READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d IF (myproc == 0) WRITE(lchanl,910) label,' p.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,k) = invar3d(i,j,k) - pbar(i,j,k) END DO END DO END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Read in moisture variables ! !----------------------------------------------------------------------- ! IF( mstin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d IF ( totin == 0 ) THEN IF (myproc == 0) WRITE(lchanl,910) label,' qvprt.' qvprt(:,:,:) = invar3d(:,:,:) ELSE IF (myproc == 0) WRITE(lchanl,910) label,' qv.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qvprt(i,j,k) = invar3d(i,j,k) - qvbar(i,j,k) END DO END DO END DO END IF READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d qc(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d qr(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qr.' IF( rainin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d raing(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' raing.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d rainc(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' rainc.' END IF IF( prcin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d prcrate(:,:,1) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' prcrate1.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d prcrate(:,:,2) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' prcrate2.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d prcrate(:,:,3) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' prcrate3.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d prcrate(:,:,4) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' prcrate4.' END IF IF( icein == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d qi(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qi.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d qs(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qs.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d qh(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qh.' END IF END IF IF( tkein == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d tke(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tke.' END IF IF( trbin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d kmh(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' kmh.' IF ( intver >= intver410 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d kmv(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' kmv.' END IF ! intver END IF IF( sfcin == 1 ) THEN IF (nstyp1 <= 1) THEN IF (intver <= intver410) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d tsoil(:,:,1,0) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tsfc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d tsoil(:,:,2,0) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d qsoil(:,:,1,0) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wetsfc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d qsoil(:,:,2,0) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wetdp.' ELSE IF (intver >= intver500) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3dsoil tsoil(:,:,:,0) = invar3dsoil(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3dsoil qsoil(:,:,:,0) = invar3dsoil(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qsoil.' END IF ! intver READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d wetcanp(:,:,0) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wetcanp.' ELSE DO is=0,nstyp1 IF (is <= nstyps) THEN IF (intver <= intver410) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d tsoil(:,:,1,is) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tsfc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d tsoil(:,:,2,is) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d qsoil(:,:,1,is) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wetsfc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d tsoil(:,:,2,is) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wetdp.' ELSE IF (intver >= intver500) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3dsoil tsoil(:,:,:,is) = invar3dsoil(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3dsoil qsoil(:,:,:,is) = invar3dsoil(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qsoil.' END IF ! intver READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d wetcanp(:,:,is) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' wetcanp.' ELSE READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) IF (myproc == 0) & WRITE(lchanl,910) label,'skipping tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) IF (myproc == 0) & WRITE(lchanl,910) label,'skipping qsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) IF (myproc == 0) & WRITE(lchanl,910) label,'skipping wetcanp.' ENDIF END DO END IF CALL fix_soil_nstyp(nx,ny,nzsoil,nstyp1,nstyp,tsoil,qsoil,wetcanp) IF (snowcin == 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) IF (myproc == 0) WRITE(lchanl,910) label,' snowcvr -- discarding.' END IF IF (snowin == 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d snowdpth(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' snowdpth.' END IF END IF IF( radin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar3d radfrc(:,:,:) = invar3d(:,:,:) IF (myproc == 0) WRITE(lchanl,910) label,' radfrc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d radsw(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' radsw.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d rnflx(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' rnflx.' IF (intver <= intver410) THEN ! ! 06/28/2002 Zuwen He ! ! Do not know how to initialized radswnet, radlwin, yet, ! at this moment. ! radswnet = 0. radlwin = 0. ELSE IF (intver >= intver500) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d radswnet(:,:) = invar2d(:,:) WRITE(lchanl,910) label,' radswnet.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d radlwin(:,:) = invar2d(:,:) WRITE(lchanl,910) label,' radlwin.' END IF ! intver END IF IF( flxin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d usflx(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' usflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d vsflx(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' vsflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d ptsflx(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' ptsflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) invar2d qvsflx(:,:) = invar2d(:,:) IF (myproc == 0) WRITE(lchanl,910) label,' qvsflx.' END IF 910 FORMAT(1X,'Field ',a12,' was read into array',a) ! !----------------------------------------------------------------------- ! ! Friendly exit message ! !---------------------------------------------------------------------- ! 930 CONTINUE IF (myproc == 0) WRITE(6,'(/a,F8.1,a/)') & ' Data at time=', time/60,' (min) were successfully read.' DEALLOCATE(invar1d, STAT = idummy) DEALLOCATE(invar2d, STAT = idummy) DEALLOCATE(invar3d, STAT = idummy) DEALLOCATE(invar3dsoil, STAT = idummy) ireturn = 0 RETURN ! !----------------------------------------------------------------------- ! ! Error during read ! !---------------------------------------------------------------------- ! 110 CONTINUE WRITE(6,'(/a/)') ' Error reading data in BINREAD' ireturn=1 RETURN ! !----------------------------------------------------------------------- ! ! End-of-file during read ! !---------------------------------------------------------------------- ! 120 CONTINUE WRITE(6,'(/a/)') ' End of file reached in BINREAD' ireturn=2 RETURN END SUBROUTINE binread ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BINREADSPLIT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE binreadsplit(nx,ny,nz,nzsoil,nstyps,grdbas,inch,time,x,y,z, & 2,120 zp,zpsoil,uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & ireturn) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in binary data set created by ARPS using history dump format ! No. 1. ! All data read in are located at the original staggered grid points ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! 9/03/02. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil ! ! grdbas Data read flag. ! =1, only grid and base state arrays will be read ! =0, all arrays will be read based on data ! parameter setting. ! inch Channel number for binary reading. ! This channel must be opened for unformatted reading ! by the calling routine. ! ! OUTPUT: ! ! time Time in seconds of data read from "filename" ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp z coordinate of grid points in physical space (m) ! zpsoil z coordinate of grid points in the soil (m) ! ! uprt x component of perturbation velocity (m/s) ! vprt y component of perturbation velocity (m/s) ! wprt Vertical component of perturbation velocity in ! Cartesian coordinates (m/s). ! ptprt Perturbation potential temperature (K) ! pprt Perturbation pressure (Pascal) ! ! qvprt Perturbation water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state air density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! ireturn Return status indicator ! =0, successful read of all data ! =1, error reading data ! =2, end-of-file reached during read attempt ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the soil REAL :: x (nx) ! x-coord. of the physical and compu ! -tational grid. Defined at u-point(m). REAL :: y (ny) ! y-coord. of the physical and compu ! -tational grid. Defined at v-point(m). REAL :: z (nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered ! grid(m). REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid(m). REAL :: zpsoil(nx,ny,nzsoil) ! Physical height coordinate defined at ! w-point of the soil (m) INTEGER :: grdbas ! Data read flag. INTEGER :: inch ! Channel number for binary reading REAL :: time ! Time in seconds of data read ! from "filename" 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 mixing ! ratio (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio INTEGER :: nstyps ! Number of soil type INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type fraction INTEGER :: vegtyp(nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) INTEGER :: ireturn ! Return status indicator ! !----------------------------------------------------------------------- ! ! Parameters describing routine that wrote the gridded data ! !----------------------------------------------------------------------- ! ! fmtver??: to label each data a version. ! intver??: an integer to allow faster comparison than fmtver??, ! which are strings. ! ! Verion 5.00: significant change in soil variables since version 4.10. ! CHARACTER (LEN=40) :: fmtver320,fmtver400,fmtver410,fmtver500 INTEGER :: intver,intver320,intver400,intver410,intver500 PARAMETER (fmtver320='003.20 Binary Data',intver320=320) PARAMETER (fmtver400='004.00 Binary Data',intver400=400) PARAMETER (fmtver410='004.10 Binary Data',intver410=410) PARAMETER (fmtver500='005.00 Binary Data',intver500=500) CHARACTER (LEN=40) :: fmtverin ! CHARACTER (LEN=10) :: tmunit ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: lchanl PARAMETER (lchanl=6) ! Channel number for formatted printing. INTEGER :: i,j,k,is INTEGER :: nstyp1 CHARACTER (LEN=12) :: label INTEGER :: nxin,nyin,nzin,nzsoilin INTEGER :: bgrdin,bbasin,bvarin,bicein,btkein,btrbin INTEGER :: idummy REAL :: rdummy INTEGER :: nxlg, nylg, nzlg, nzsoillg, n3d INTEGER, ALLOCATABLE :: var3di(:,:,:) REAL, ALLOCATABLE :: var2d(:,:), var3d(:,:,:) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'indtflg.inc' INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'mp.inc' ! mpi parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! nxlg = (nx-3)*nproc_x+3 nylg = (ny-3)*nproc_y+3 nzlg = nz nzsoillg = nzsoil n3d = MAX(nz, nzsoil, nstyps+1, 4) ALLOCATE(var2d(nxlg,nylg)) ALLOCATE(var3d(nxlg,nylg,n3d)) ALLOCATE(var3di(nxlg,nylg,n3d)) IF (myproc == 0) THEN !----------------------------------------------------------------------- ! ! Read header info ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) fmtverin IF (fmtverin == fmtver320) THEN intver=intver320 ELSE IF (fmtverin == fmtver400) THEN intver=intver400 ELSE IF (fmtverin == fmtver410) THEN intver=intver410 ELSE IF (fmtverin == fmtver500) THEN intver=intver500 ELSE WRITE(6,'(/1x,a,a,a/)') & 'Incoming data format, fmtverin=',fmtverin, & ', not found. The Job stopped.' CALL arpsstop('arpstop called from BINREADSPLIT. ',1) END IF WRITE(6,'(/1x,a,a/)') & 'Incoming data format, fmtverin=',fmtverin READ(inch,ERR=110,END=120) runname READ(inch,ERR=110,END=120) nocmnt IF( nocmnt > 0 ) THEN DO i=1,nocmnt READ(inch,ERR=110,END=120) cmnt(i) END DO END IF WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') runname IF( nocmnt > 0 ) THEN DO i=1,nocmnt WRITE(6,'(1x,a)') cmnt(i) END DO END IF READ(inch,ERR=110,END=120) time,tmunit ! !----------------------------------------------------------------------- ! ! Get dimensions of data in binary file and check against ! the dimensions passed to BINREADSPLIT ! !----------------------------------------------------------------------- ! IF (intver <= intver410) THEN READ(inch,ERR=110,END=120) nxin, nyin, nzin nzsoilin = 2 ! for version prior to 410, it is a two-layer soil model ELSE IF (intver >= intver500) THEN READ(inch,ERR=110,END=120) nxin, nyin, nzin,nzsoilin END IF ! ! Data validation: dimensions ! IF( nxin /= nxlg .OR. nyin /= nylg .OR. nzin /= nzlg) THEN WRITE(6,'(1x,a)') & ' Dimensions in BINREADSPLIT inconsistent with data.' WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin WRITE(6,'(1x,a,3I15)') ' Expected: ', nx, ny, nz WRITE(6,'(1x,a)') ' Program aborted in BINREADSPLIT.' CALL arpsstop('arpstop called from BINREADSPLIT nx-ny-nz read ',1) END IF IF(nzsoilin /= nzsoillg) THEN IF (intver <= intver410) THEN WRITE(6,'(1x,a,a/,2(1x,a/))') & ' The incoming data version is ', fmtverin, & ' In the input file, nzsoil must be set to 2. ', & ' Program aborted in BINREADSPLIT.' ELSE IF (intver >= intver500) THEN WRITE(6,'(1x,a)') & ' Dimensions in BINREADSPLIT inconsistent with data.' WRITE(6,'(1x,a,I15)') ' Read were: ', nzsoilin WRITE(6,'(1x,a,I15)') ' Expected: ', nzsoillg WRITE(6,'(1x,a)') ' Program aborted in BINREADSPLIT.' END IF CALL arpsstop('arpstop called from BINREADSPLIT nzsoil read ',1) END IF nxin = (nxin-3)/nproc_x+3 nyin = (nyin-3)/nproc_y+3 END IF CALL mpupdatei(intver, 1) CALL mpupdatec(runname, 40) CALL mpupdater(time, 1) CALL mpupdatec(tmunit, 10) CALL mpupdatei(nxin, 1) CALL mpupdatei(nyin, 1) CALL mpupdatei(nzin, 1) CALL mpupdatei(nzsoilin, 1) ! !----------------------------------------------------------------------- ! ! Read in flags for different data groups ! !----------------------------------------------------------------------- ! IF (myproc == 0) THEN IF( grdbas == 1 ) THEN ! Read grid and base state arrays WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)') & 'To read grid and base state data at time ', time, & ' secs = ',(time/60.),' mins.' READ(inch,ERR=110,END=120) & bgrdin,bbasin,bvarin,mstin,bicein, & btrbin,idummy,idummy,landin,totin, & btkein,idummy,idummy,mapproj,month, & day, year, hour, minute, second ELSE ! Normal data reading WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)')'To read data for time:', & time,' secs = ',(time/60.),' mins.' READ(inch,ERR=110,END=120) & grdin,basin,varin,mstin,icein, & trbin, sfcin,rainin,landin,totin, & tkein,idummy,idummy,mapproj, month, & day, year, hour, minute, second END IF READ(inch,ERR=110,END=120) & umove,vmove,xgrdorg,ygrdorg,trulat1, & trulat2,trulon,sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & tstop,thisdmp,latitud,ctrlat,ctrlon IF ( totin /= 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in additional parameters for ARPS history dump 4.0 or later ! version. ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) & nstyp1, prcin, radin, flxin,snowcin, & snowin,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy IF ( nstyp1 < 1 ) THEN nstyp1 = 1 END IF READ(inch,ERR=110,END=120) & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy END IF END IF ! myproc == 0 CALL mpupdatei(mstin,1) CALL mpupdatei(landin,1) CALL mpupdatei(totin,1) CALL mpupdatei(mapproj,1) CALL mpupdatei(month,1) CALL mpupdatei(day,1) CALL mpupdatei(year,1) CALL mpupdatei(hour,1) CALL mpupdatei(minute,1) CALL mpupdatei(second,1) IF(grdbas == 1) THEN CALL mpupdatei(bgrdin,1) CALL mpupdatei(bbasin,1) CALL mpupdatei(bvarin,1) CALL mpupdatei(btrbin,1) CALL mpupdatei(btkein,1) ELSE CALL mpupdatei(grdin,1) CALL mpupdatei(basin,1) CALL mpupdatei(varin,1) CALL mpupdatei(trbin,1) CALL mpupdatei(tkein,1) CALL mpupdatei(icein,1) CALL mpupdatei(sfcin,1) CALL mpupdatei(rainin,1) END IF CALL mpupdater(umove,1) CALL mpupdater(vmove,1) CALL mpupdater(xgrdorg,1) CALL mpupdater(ygrdorg,1) CALL mpupdater(trulat1,1) CALL mpupdater(trulat2,1) CALL mpupdater(trulon,1) CALL mpupdater(sclfct,1) CALL mpupdater(tstop,1) CALL mpupdater(thisdmp,1) CALL mpupdater(latitud,1) CALL mpupdater(ctrlat,1) CALL mpupdater(ctrlon,1) IF(totin /= 0) THEN CALL mpupdatei(nstyp1,1) CALL mpupdatei(prcin,1) CALL mpupdatei(radin,1) CALL mpupdatei(flxin,1) CALL mpupdatei(snowcin,1) CALL mpupdatei(snowin,1) END IF ! !----------------------------------------------------------------------- ! ! Read in x, y, z and zp arrays. ! !---------------------------------------------------------------------- ! IF( grdin == 1 .OR. grdbas == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (var2d(i,1),i=1,nxlg) WRITE(lchanl,910) label,' x.' END IF CALL mpisplit1dx(var2d(:,1),nx,x) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (var2d(1,j),j=1,nylg) WRITE(lchanl,910) label,' y.' END IF CALL mpisplit1dy(var2d(1,:),ny,y) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) z WRITE(lchanl,910) label,' z.' END IF CALL mpupdater(z,nzlg) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' zp.' END IF CALL mpisplit3d(var3d,nx,ny,nz,zp) IF (intver <= intver410) THEN ! ! nzsoil must equal to 2, 06/28/2002, Zuwen ! assume zpsoil(,,2) is one meter below the surface. ! DO j=1,ny DO i=1,nx zpsoil(i,j,1)=zp(i,j,2) zpsoil(i,j,2)=zpsoil(i,j,1)-1. END DO END DO IF (myproc == 0) THEN WRITE(lchanl,'(1x,a)') ' Assign zpsoil. ' WRITE(lchanl,'(1x,a)') ' Assume zpsoil(,,1) is zp(:,:,2). ' WRITE(lchanl,'(1x,a)') ' Assume zpsoil(,,2) is zp(:,:,2)-1. ' END IF ELSE IF (intver >= intver500) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzsoillg) WRITE(lchanl,910) label,' zpsoil.' END IF CALL mpisplit3d(var3d,nx,ny,nzsoil,zpsoil) END IF ! intver END IF ! grdin ! !----------------------------------------------------------------------- ! ! Read in base state fields ! !---------------------------------------------------------------------- ! IF( basin == 1 .OR. grdbas == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' ubar.' END IF CALL mpisplit3d(var3d,nx,ny,nz,ubar) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' vbar.' END IF CALL mpisplit3d(var3d,nx,ny,nz,vbar) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' wbar.' END IF CALL mpisplit3d(var3d,nx,ny,nz,wbar) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' ptbar.' END IF CALL mpisplit3d(var3d,nx,ny,nz,ptbar) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' pbar.' END IF CALL mpisplit3d(var3d,nx,ny,nz,pbar) IF( mstin == 1) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qvbar.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qvbar) END IF IF (landin == 1) THEN IF (nstyp1 <= 1) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3di(i,j,1),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' soiltyp.' END IF CALL mpisplit3di(var3di,nx,ny,1,soiltyp(:,:,1)) ELSE IF(myproc == 0) THEN var3di(:,:,:) = 0 var3d(:,:,:) = 0.0 DO is=1,nstyp1 IF (is <= nstyps) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3di(i,j,is),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' soiltyp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3d(i,j,is),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' stypfrct.' ELSE READ(inch,ERR=110,END=120) label WRITE(lchanl,910) label,'skipping soiltyp' READ(inch,ERR=110,END=120) READ(inch,ERR=110,END=120) label WRITE(lchanl,910) label,'skipping stypfrct.' READ(inch,ERR=110,END=120) END IF END DO ENDIF CALL mpisplit3di(var3di,nx,ny,nstyps,soiltyp) CALL mpisplit3d(var3d,nx,ny,nstyps,stypfrct) END IF CALL fix_stypfrct_nstyp(nx,ny,nstyp1,nstyp,stypfrct) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3di(i,j,1),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' vegtyp.' END IF CALL mpisplit2di(var3di(:,:,1),nx,ny,vegtyp) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' lai.' END IF CALL mpisplit2d(var2d,nx,ny,lai) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' roufns.' END IF CALL mpisplit2d(var2d,nx,ny,roufns) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' veg.' END IF CALL mpisplit2d(var2d,nx,ny,veg) END IF END IF IF( grdbas == 1 ) GO TO 930 IF( varin == 1 ) THEN IF ( totin == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in perturbations from history dump ! !----------------------------------------------------------------------- ! IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' uprt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,uprt) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' vprt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,vprt) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' wprt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,wprt) ! !----------------------------------------------------------------------- ! ! Read in scalars ! !---------------------------------------------------------------------- ! IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' ptprt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,ptprt) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' pprt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,pprt) ELSE ! !----------------------------------------------------------------------- ! ! Read in total values of variables from history dump ! !---------------------------------------------------------------------- ! IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' u.' END IF CALL mpisplit3d(var3d,nx,ny,nz,uprt) DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx uprt(i,j,k) = uprt(i,j,k) - ubar(i,j,k) END DO END DO END DO IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' v.' END IF CALL mpisplit3d(var3d,nx,ny,nz,vprt) DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 vprt(i,j,k) = vprt(i,j,k) - vbar(i,j,k) END DO END DO END DO IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' w.' END IF CALL mpisplit3d(var3d,nx,ny,nz,wprt) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' pt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,ptprt) DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptprt(i,j,k) = ptprt(i,j,k) - ptbar(i,j,k) END DO END DO END DO IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' p.' END IF CALL mpisplit3d(var3d,nx,ny,nz,pprt) DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,k) = pprt(i,j,k) - pbar(i,j,k) END DO END DO END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Read in moisture variables ! !----------------------------------------------------------------------- ! IF( mstin == 1 ) THEN IF ( totin == 0 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qvprt.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qvprt) ELSE IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qv.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qvprt) DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qvprt(i,j,k) = qvprt(i,j,k) - qvbar(i,j,k) END DO END DO END DO END IF IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qc.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qc) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qr.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qr) IF( rainin == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' raing.' END IF CALL mpisplit2d(var2d,nx,ny,raing) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' rainc.' END IF CALL mpisplit2d(var2d,nx,ny,rainc) END IF IF( prcin == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3d(i,j,1),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' prcrate1.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3d(i,j,2),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' prcrate2.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3d(i,j,3),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' prcrate3.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((var3d(i,j,4),i=1,nxlg),j=1,nylg) WRITE(lchanl,910) label,' prcrate4.' END IF CALL mpisplit3d(var3d,nx,ny,4,prcrate) END IF IF( icein == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qi.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qi) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qs.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qs) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' qh.' END IF CALL mpisplit3d(var3d,nx,ny,nz,qh) END IF END IF IF( tkein == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' tke.' END IF CALL mpisplit3d(var3d,nx,ny,nz,tke) END IF IF( trbin == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' kmh.' END IF CALL mpisplit3d(var3d,nx,ny,nz,kmh) IF ( intver >= intver410 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' kmv.' END IF CALL mpisplit3d(var3d,nx,ny,nz,kmv) END IF ! intver END IF IF( sfcin == 1 ) THEN IF (nstyp1 <= 1) THEN IF (intver <= intver410) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' tsfc.' END IF CALL mpisplit2d(var2d,nx,ny,tsoil(:,:,1,0)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' tsoil.' END IF CALL mpisplit2d(var2d,nx,ny,tsoil(:,:,2,0)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' wetsfc.' END IF CALL mpisplit2d(var2d,nx,ny,qsoil(:,:,1,0)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' wetdp.' END IF CALL mpisplit2d(var2d,nx,ny,qsoil(:,:,2,0)) ELSE IF (intver >= intver500) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzsoillg) WRITE(lchanl,910) label,' tsoil.' END IF CALL mpisplit3d(var3d,nx,ny,nzsoil,tsoil(:,:,:,0)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzsoillg) WRITE(lchanl,910) label,' qsoil.' END IF CALL mpisplit3d(var3d,nx,ny,nzsoil,qsoil(:,:,:,0)) END IF ! intver IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' wetcanp.' END IF CALL mpisplit2d(var2d,nx,ny,wetcanp(:,:,0)) ELSE DO is=0,nstyp1 IF (is <= nstyps) THEN IF (intver <= intver410) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' tsfc.' END IF CALL mpisplit2d(var2d,nx,ny,tsoil(:,:,1,is)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' tsoil.' END IF CALL mpisplit2d(var2d,nx,ny,tsoil(:,:,2,is)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' wetsfc.' END IF CALL mpisplit2d(var2d,nx,ny,qsoil(:,:,1,is)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' wetdp.' END IF CALL mpisplit2d(var2d,nx,ny,qsoil(:,:,2,is)) ELSE IF (intver >= intver500) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzsoillg) WRITE(lchanl,910) label,' tsoil.' END IF CALL mpisplit3d(var3d,nx,ny,nzsoil,tsoil(:,:,:,is)) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzsoillg) WRITE(lchanl,910) label,' qsoil.' END IF CALL mpisplit3d(var3d,nx,ny,nzsoil,qsoil(:,:,:,is)) END IF ! intver IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' wetcanp.' END IF CALL mpisplit2d(var2d,nx,ny,wetcanp(:,:,is)) ELSE IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping qsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping wetcanp.' END IF ENDIF END DO END IF CALL fix_soil_nstyp(nx,ny,nzsoil,nstyp1,nstyp,tsoil,qsoil,wetcanp) IF (snowcin == 1) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,' snowcvr -- discarding.' END IF END IF IF (snowin == 1) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' snowdpth.' END IF CALL mpisplit2d(var2d,nx,ny,snowdpth) END IF END IF IF( radin == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((var3d(i,j,k),i=1,nxlg),j=1,nylg),k=1,nzlg) WRITE(lchanl,910) label,' radfrc.' END IF CALL mpisplit3d(var3d,nx,ny,nz,radfrc) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' radsw.' END IF CALL mpisplit2d(var2d,nx,ny,radsw) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' rnflx.' END IF CALL mpisplit2d(var2d,nx,ny,rnflx) IF (intver <= intver410) THEN ! ! Do not know how to initialized radswnet, radlwin, yet, ! at this moment. ! radswnet = 0. radlwin = 0. ELSE IF (intver >= intver500) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' radswnet.' END IF CALL mpisplit2d(var2d,nx,ny,radswnet) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' radlwin.' END IF CALL mpisplit2d(var2d,nx,ny,radlwin) END IF ! intver END IF IF( flxin == 1 ) THEN IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' usflx.' END IF CALL mpisplit2d(var2d,nx,ny,usflx) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' vsflx.' END IF CALL mpisplit2d(var2d,nx,ny,vsflx) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' ptsflx.' END IF CALL mpisplit2d(var2d,nx,ny,ptsflx) IF(myproc == 0) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) var2d WRITE(lchanl,910) label,' qvsflx.' END IF CALL mpisplit2d(var2d,nx,ny,qvsflx) END IF 910 FORMAT(1X,'Field ',a12,' was read into array',a) ! !----------------------------------------------------------------------- ! ! Friendly exit message ! !---------------------------------------------------------------------- ! 930 CONTINUE IF (myproc == 0) & WRITE(6,'(/a,F8.1,a/)') & ' Data at time=', time/60,' (min) were successfully read.' ireturn = 0 DEALLOCATE(var2d, var3d, var3di) RETURN ! !----------------------------------------------------------------------- ! ! Error during read ! !---------------------------------------------------------------------- ! 110 CONTINUE WRITE(6,'(/a/)') ' Error reading data in BINREADSPLIT' ireturn=1 RETURN ! !----------------------------------------------------------------------- ! ! End-of-file during read ! !---------------------------------------------------------------------- ! 120 CONTINUE WRITE(6,'(/a/)') ' End of file reached in BINREADSPLIT' ireturn=2 RETURN END SUBROUTINE binreadsplit ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BN2READ ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bn2read(nx,ny,nz,nzsoil,nstyps,grdbas,inch,time,x,y,z,zp, & 2,4 zpsoil,uprt, vprt, wprt, ptprt, pprt, & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & ireturn) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read in binary data set created by ARPS using history dump format ! No.2. ! All data read in are located at the original staggered grid points ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 2/27/92. ! ! MODIFICATION HISTORY: ! ! 6/08/92 Added full documentation (K. Brewster) ! ! 7/14/92 (K. Brewster) ! Added runname, comment and version number reading ! ! 8/20/92 (M. Xue) ! Added data reading of computational z coordinate array z. ! ! 4/23/93 (M. Xue) ! New data format. ! ! 02/06/95 (Y. Liu) ! Added map projection parameters into the second binary dumping ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 05/15/2002 (J. Brotzge) ! Added variables to allow for multiple soil schemes. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil ! ! grdbas Data read flag. ! =1, only grid and base state arrays will be read ! =0, all arrays will be read based on data ! parameter setting. ! inch Channel number for binary reading. ! This channel must be opened for unformatted reading ! by the calling routine. ! ! OUTPUT: ! ! time Time in seconds of data read from "filename" ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp z coordinate of grid points in physical space (m) ! zpsoil z coordinate of grid points in the soil (m) ! ! uprt x component of perturbation velocity (m/s) ! vprt y component of perturbation velocity (m/s) ! wprt Vertical component of perturbation velocity in ! Cartesian coordinates (m/s). ! ptprt Perturbation potential temperature (K) ! pprt Perturbation pressure (Pascal) ! ! qvprt Perturbation water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state air density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! ireturn Return status indicator ! =0 successful read of all data ! =1 error reading data ! =2 end-of-file reached during read attempt ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in 3 directions REAL :: x (nx) ! x-coord. of the physical and compu ! -tational grid. Defined at u-point(m). REAL :: y (ny) ! y-coord. of the physical and compu ! -tational grid. Defined at v-point(m). REAL :: z (nz) ! z-coord. of the computational grid. ! Defined at w-point on the staggered ! grid(m). REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at ! w-point of the staggered grid(m). REAL :: zpsoil(nx,ny,nzsoil) ! Physical height coordinate defined at ! w-point of the soil (m) INTEGER :: grdbas ! Data read flag. INTEGER :: inch ! Channel number for binary reading REAL :: time ! Time in seconds of data read ! from "filename" 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 mixing ! ratio (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: wbar (nx,ny,nz) ! Base state w-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor mixing ratio INTEGER :: nstyps ! Number of soil type INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type INTEGER :: vegtyp(nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) INTEGER :: ireturn ! Return status indicator ! !----------------------------------------------------------------------- ! ! Parameters describing routine that wrote the gridded data ! !----------------------------------------------------------------------- ! CHARACTER (LEN=40) :: fmtver0,fmtver1,fmtverin PARAMETER (fmtver0='004.10 2nd Binary Data') PARAMETER (fmtver1='004.10 2nd Binary Data') CHARACTER (LEN=10) :: tmunit ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: lchanl PARAMETER (lchanl=6) ! Channel number for formatted printing. INTEGER :: i,j,k,is INTEGER :: nstyp1 CHARACTER (LEN=12) :: label ! INTEGER :: nxin,nyin,nzin INTEGER :: nxin,nyin,nzin,nzsoilin INTEGER :: bgrdin,bbasin,bvarin,bicein,btkein,btrbin,idummy REAL :: rdummy ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'indtflg.inc' INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Read header info ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) fmtverin IF( fmtverin /= fmtver0 .AND. fmtverin /= fmtver1 ) THEN WRITE(6,'(/1x,a/1x,2a/1x,2a/1x,2a/1x,a)') & 'Data format incompatible with the data reader.', & 'Format of data is ',fmtverin,' Format of reader is ',fmtver1, & 'compitable to ',fmtver0, '. Job stopped.' CALL arpsstop('arpstop called from bn2read header read ',1) END IF READ(inch,ERR=110,END=120) runname READ(inch,ERR=110,END=120) nocmnt IF( nocmnt > 0 ) THEN DO i=1,nocmnt READ(inch,ERR=110,END=120) cmnt(i) END DO END IF WRITE(6,'(//'' THE NAME OF THIS RUN IS: '',A//)') runname IF( nocmnt > 0 ) THEN DO i=1,nocmnt WRITE(6,'(1x,a)') cmnt(i) END DO END IF READ(inch,ERR=110,END=120) time,tmunit ! !----------------------------------------------------------------------- ! ! Get dimensions of data in binary file and check against ! the dimensions passed to BN2READ ! !----------------------------------------------------------------------- ! ! READ(inch,ERR=110,END=120) nxin, nyin, nzin READ(inch,ERR=110,END=120) nxin, nyin, nzin, nzsoilin ! IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz ) THEN IF( nxin /= nx .OR. nyin /= ny .OR. nzin /= nz .OR. nzsoilin /= nzsoil) THEN WRITE(6,'(1x,a)') & ' Dimensions in BN2READ inconsistent with data.' ! WRITE(6,'(1x,a,3I15)') ' Read were: ', nxin, nyin, nzin WRITE(6,'(1x,a,4I15)') ' Read were: ', nxin, nyin, nzin, nzsoilin WRITE(6,'(1x,a)') & ' Program aborted in BN2READ.' ! CALL arpsstop('arpstop called from bn2read nx-ny-nz read',1) CALL arpsstop('arpstop called from bn2read nx-ny-nz-nzsoil read',1) END IF ! !----------------------------------------------------------------------- ! ! Read in flags for different data groups ! !----------------------------------------------------------------------- ! IF( grdbas == 1 ) THEN ! Read grid and base state arrays WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)') & 'To read grid and base state data at time ', time, & ' secs = ',(time/60.),' mins.' READ(inch,ERR=110,END=120) & bgrdin,bbasin,bvarin,mstin,bicein, & btrbin,idummy,idummy,landin,totin, & btkein,idummy,idummy,mapproj,month, & day,year,hour,minute,second ELSE ! Normal data reading WRITE(lchanl,'(1x,a,f8.1,a,f8.3,a/)')'To read data for time:', & time,' secs = ',(time/60.),' mins.' READ(inch,ERR=110,END=120) & grdin,basin,varin,mstin,icein, & trbin,sfcin,rainin,landin,totin, & tkein,idummy,idummy,mapproj,month, & day,year,hour,minute,second END IF READ(inch,ERR=110,END=120) & umove,vmove,xgrdorg,ygrdorg,trulat1, & trulat2,trulon,sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & tstop,thisdmp,latitud,ctrlat,ctrlon IF ( totin /= 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in additional parameters for ARPS history dump 4.1 or later ! version. ! !----------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) & nstyp1, prcin, radin, flxin,snowcin, & snowin,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy IF ( nstyp1 < 1 ) THEN nstyp1 = 1 END IF READ(inch,ERR=110,END=120) & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy END IF ! !----------------------------------------------------------------------- ! ! Read in x,y and z at grid cell centers (scalar points). ! !---------------------------------------------------------------------- ! IF( grdin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (x(i),i=1,nx) WRITE(lchanl,910) label,' x.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (y(j),j=1,ny) WRITE(lchanl,910) label,' y.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (z(k),k=1,nz) WRITE(lchanl,910) label,' z.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((zp(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' zp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((zpsoil(i,j,k),i=1,nx),j=1,ny),k=1,nzsoil) WRITE(lchanl,910) label,' zpsoil.' END IF ! grdin ! !----------------------------------------------------------------------- ! ! Read in base state fields ! !---------------------------------------------------------------------- ! IF( basin == 1 .OR. grdbas == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((ubar(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' ubar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((vbar(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' vbar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((wbar(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' wbar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((ptbar(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' ptbar.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((pbar(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' pbar.' IF( mstin == 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qvbar(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qvbar.' END IF IF(landin == 1) THEN IF( nstyp1 <= 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((soiltyp(i,j,1),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' soiltyp.' ELSE DO is=1,nstyp1 IF (is <= nstyps) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((soiltyp(i,j,is),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' soiltyp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((stypfrct(i,j,is),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' stypfrct.' ELSE READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping soiltyp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping stypfrct.' ENDIF END DO END IF CALL fix_stypfrct_nstyp(nx,ny,nstyp1,nstyp,stypfrct) READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((vegtyp (i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' vegtyp.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((lai (i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' lai.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((roufns (i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' roufns.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((veg (i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' veg.' END IF END IF IF( grdbas == 1 ) GO TO 930 IF( varin == 1 ) THEN IF ( totin == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Read in uprt, vprt, and wprt ! !---------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((uprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' uprt.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((vprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' vprt.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((wprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' wprt.' ! !----------------------------------------------------------------------- ! ! Read in scalars ! !---------------------------------------------------------------------- ! READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((ptprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' ptprt.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((pprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' pprt.' ELSE READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((uprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' u.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx uprt(i,j,k) = uprt(i,j,k) - ubar(i,j,k) END DO END DO END DO READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((vprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' v.' DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 vprt(i,j,k) = vprt(i,j,k) - vbar(i,j,k) END DO END DO END DO READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((wprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' w.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((ptprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' pt.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 ptprt(i,j,k) = ptprt(i,j,k) - ptbar(i,j,k) END DO END DO END DO READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((pprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' p.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 pprt(i,j,k) = pprt(i,j,k) - pbar(i,j,k) END DO END DO END DO END IF END IF ! !----------------------------------------------------------------------- ! ! Read in moisture variables ! !---------------------------------------------------------------------- ! IF( mstin == 1 ) THEN IF ( totin == 0 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qvprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qvprt.' ELSE READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qvprt(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qv.' DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 qvprt(i,j,k) = qvprt(i,j,k) - qvbar(i,j,k) END DO END DO END DO END IF READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qc(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qr(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qr.' IF( rainin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((raing(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' raing.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((rainc(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' rainc.' END IF IF( prcin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((prcrate(i,j,1),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' prcrate1.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((prcrate(i,j,2),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' prcrate2.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((prcrate(i,j,3),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' prcrate3.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & ((prcrate(i,j,4),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' prcrate4.' END IF IF( icein == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qi(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qi.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qs(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qs.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((qh(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' qh.' END IF END IF IF( tkein == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((tke(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' tke.' END IF IF( trbin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((kmh(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' kmh.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((kmv(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' kmv.' END IF IF( sfcin == 1 ) THEN IF (nstyp1 <= 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((tsoil(i,j,k,0),i=1,nx),j=1,ny),k=1,nzsoil) WRITE(lchanl,910) label,' tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) (((qsoil(i,j,k,0),i=1,nx),j=1,ny),k=1,nzsoil) WRITE(lchanl,910) label,' qsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((wetcanp(i,j,0),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' wetcanp.' ELSE DO is=0,nstyp1 IF (is <= nstyps) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120)(((tsoil(i,j,k,is),i=1,nx),j=1,ny), & k=1,nzsoil) WRITE(lchanl,910) label,' tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120)(((qsoil(i,j,k,is),i=1,nx),j=1,ny), & k=1,nzsoil) WRITE(lchanl,910) label,' qsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120)((wetcanp(i,j,is),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' wetcanp.' ELSE READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping tsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping qsoil.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,'skipping wetcanp.' ENDIF END DO END IF CALL fix_soil_nstyp(nx,ny,nzsoil,nstyp1,nstyp,tsoil,qsoil,wetcanp) IF(snowcin == 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) WRITE(lchanl,910) label,' snowcvr -- discarding.' END IF IF(snowin == 1) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120)((snowdpth(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' snowdpth.' END IF END IF IF( radin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) & (((radfrc(i,j,k),i=1,nx),j=1,ny),k=1,nz) WRITE(lchanl,910) label,' radfrc.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((radsw(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' radsw.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((rnflx(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' rnflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((radswnet(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' radswnet.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((radlwin(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' radlwin.' END IF IF( flxin == 1 ) THEN READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((usflx(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' usflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((vsflx(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' vsflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((ptsflx(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' ptsflx.' READ(inch,ERR=110,END=120) label READ(inch,ERR=110,END=120) ((qvsflx(i,j),i=1,nx),j=1,ny) WRITE(lchanl,910) label,' qvsflx.' END IF 910 FORMAT(1X,'Field ',a12,' was read into array',a) ! !----------------------------------------------------------------------- ! ! Friendly exit message ! !---------------------------------------------------------------------- ! 930 CONTINUE WRITE(6,'(/a,F8.1,a/)') & ' Data at time=', time/60,' (min) were successfully read.' ireturn = 0 RETURN ! !----------------------------------------------------------------------- ! ! Error during read ! !---------------------------------------------------------------------- ! 110 CONTINUE WRITE(6,'(/a/)') ' Error reading data in BN2READ' ireturn=1 RETURN ! !----------------------------------------------------------------------- ! ! End-of-file during read ! !---------------------------------------------------------------------- ! 120 CONTINUE WRITE(6,'(/a/)') ' End of file reached in BN2READ' ireturn=2 RETURN END SUBROUTINE bn2read ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BINDUMP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bindump(nx,ny,nz,nzsoil,nstyps, nchanl, grdbas, & 1,54 u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, & ubar,vbar,ptbar,pbar,rhobar,qvbar, & x,y,z,zp,zpsoil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write history data into channel nchanl as binary data. ! ! All data read in are located at the original staggered grid points. ! ! Note: coordinate fields are dumped as 3 dimensional fields which ! have been converted from meters to kilometers. This is for the ! convenience of the plotting applications. ! ! The last 4 characters of the 12 character label written out ! with each 1-,2-, or 3-d array is used by the splitdump and ! joinfiles subroutines used by the message passing version of the ! ARPS (and also by some auxiliary ARPS I/O routines) ! to determine the data type of the array. ! Key to the labels: ! ! 'nnnnnnn tdds' ! ! n - characters containing the name of the variable. ! t - type of variable: "r" for real and "i" for integer. ! dd - number of dimensions: "1d" "2d" or "3d". ! s - staggered dimension: "0" for centered, ! "1" for staggered in x, ! "2" for staggered in y, ! "3" for staggered in z. ! !----------------------------------------------------------------------- ! ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 3/10/92. ! ! MODIFICATION HISTORY: ! ! 6/06/92 (M. Xue) ! Added full documentation. ! ! 7/13/92 (K. Brewster) ! Added runname, comment and version number writing ! ! 8/23/92 (M. Xue) ! Modify to perform the dumping of both base and t-dependent arrays ! and added control on grid staggering. ! ! 4/4/93 (M. Xue) ! Modified, so that data on the original staggered grid are written ! out. Averaging to the volume center is no longer done. ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! ! 02/06/95 (Y. Liu) ! Added map projection parameters into the binary dumping ! ! 03/26/96 (G. Bassett) ! Labels were modified to include information about array type. ! This information is used by splitdump and joinfiles subroutines. ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 05/15/2002 (J. Brotzge) ! Added to allow for multiple soil schemes. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil ! ! nchanl FORTRAN I/O channel number for history data output. ! grdbas Flag indicating if this is a call for the data dump ! of grid and base state arrays only. If so, grdbas=1. ! ! u x component of velocity at a given time level (m/s) ! v y component of velocity at a given time level (m/s) ! w Vertical component of Cartesian velocity at a given ! time level (m/s) ! ptprt Perturbation potential temperature at a given time ! level (K) ! pprt Perturbation pressure at a given time level (Pascal) ! qv Water vapor specific humidity at a given time level (kg/kg) ! qc Cloud water mixing ratio at a given time level (kg/kg) ! qr Rainwater mixing ratio at a given time level (kg/kg) ! qi Cloud ice mixing ratio at a given time level (kg/kg) ! qs Snow mixing ratio at a given time level (kg/kg) ! qh Hail mixing ratio at a given time level (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ubar Base state zonal velocity component (m/s) ! vbar Base state meridional 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 specific humidity (kg/kg) ! ! 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 Vertical coordinate of grid points in physical space (m) ! zpsoil Vertical coordinate of grid points in the soil (m) ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2*s)) ! qvsflx Surface moisture flux (kg/(m**2*s)) ! ! OUTPUT: ! ! None. ! ! WORK ARRAY: ! ! tem1 Temporary work array. ! ! !----------------------------------------------------------------------- ! ! The following parameters are passed into this subroutine through ! a common block in globcst.inc, and they determine which ! variables are output. ! ! grdout =0 or 1. If grdout=0, grid variables are not dumped. ! basout =0 or 1. If basout=0, base state variables are not dumped. ! varout =0 or 1. If varout=0, model perturbation variables are not dumped. ! mstout =0 or 1. If mstout=0, water variables are not dumped. ! rainout=0 or 1. If rainout=0, rain variables are not dumped. ! prcout =0 or 1. If prcout=0, precipitation rates are not dumped. ! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped. ! tkeout =0 or 1. If tkeout=0, tke is not dumped. ! trbout =0 or 1. If trbout=0, turbulence parameter km is not dumped. ! sfcout =0 or 1. If sfcout=0, surface variables are not dumped. ! landout=0 or 1. If landout=0, surface propertty arrays are not dumped. ! radout =0 or 1. If radout =0, radiation arrays are not dumped. ! flxout =0 or 1. If flxout =0, surface flux arrays are not dumped. ! ! These following parameters are also passed in through common ! blocks in globcst.inc. ! ! runname,curtim,umove,vmove,xgrdorg,ygrdorg ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the soil INTEGER :: nchanl ! FORTRAN I/O channel number for output INTEGER :: grdbas ! If this is a grid/base state array dump REAL :: u (nx,ny,nz) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined at ! w-point of the soil INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type fractions INTEGER :: vegtyp (nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) REAL :: tem1 (nx,ny,nz) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Parameters describing this routine ! !----------------------------------------------------------------------- ! ! 06/28/2002 Zuwen He ! ! fmtver??: to label each data a version. ! intver??: an integer to allow faster comparison than fmtver??, ! which are strings. ! ! Verion 5.00: significant change in soil variables since version 4.10. ! CHARACTER (LEN=40) :: fmtver,fmtver410,fmtver500 INTEGER :: intver,intver410,intver500 PARAMETER (fmtver410='004.10 Binary Data',intver410=410) PARAMETER (fmtver500='005.00 Binary Data',intver500=500) CHARACTER (LEN=10) :: tmunit PARAMETER (tmunit='seconds ') ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,l,is INTEGER :: idummy REAL(4) :: rdummy REAL(4) :: umove4, vmove4, xgrdorg4, ygrdorg4 REAL(4) :: trulat14, trulat24, trulon4, sclfct4 REAL(4) :: tstop4, thisdmp4, latitud4 REAL(4) :: ctrlat4, ctrlon4 REAL(4), ALLOCATABLE :: out1d(:) REAL(4), ALLOCATABLE :: out2d(:,:) REAL(4), ALLOCATABLE :: out3d(:,:,:) REAL(4), ALLOCATABLE :: out3dsoil(:,:,:) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'mp.inc' ! mpi parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !--------------------------------------------------------------- ! ! Allocate 4 byte arrays ! !--------------------------------------------------------------- ALLOCATE(out1d(MAX(nx,ny,nz)), STAT = idummy) ALLOCATE(out2d(nx,ny), STAT = idummy) ALLOCATE(out3d(nx,ny,nz), STAT = idummy) ALLOCATE(out3dsoil(nx,ny,nzsoil), STAT = idummy) intver = intver500 ! for the time being, in the future, we will ! allow to dump data in the different version ! intver will be assigned from input file IF (intver == intver410) THEN fmtver=fmtver410 ELSE IF (intver == intver500) THEN fmtver=fmtver500 ELSE IF (myproc == 0) WRITE(6,'(/1x,a,i10,a/)') & 'Data format, intver=',intver,', not found. The Job stopped.' CALL arpsstop('arpstop called from bindump.',1) END IF IF (myproc == 0) WRITE(6,'(/1x,a,a,a/)') & 'Data dump format, fmtver=',fmtver,'. ' IF (myproc == 0) & WRITE(6,'(1x,a,f13.3/)') 'Writing history data at time=', curtim ! !----------------------------------------------------------------------- ! ! Write header info ! !----------------------------------------------------------------------- ! WRITE(nchanl) fmtver WRITE(nchanl) runname WRITE(nchanl) nocmnt IF( nocmnt > 0 ) THEN DO l=1,nocmnt WRITE(nchanl) cmnt(l) END DO END IF rdummy = curtim WRITE(nchanl) rdummy,tmunit IF (intver == intver410) THEN WRITE(nchanl) nx,ny,nz ELSE IF (intver == intver500) THEN WRITE(nchanl) nx,ny,nz,nzsoil END IF ! !----------------------------------------------------------------------- ! ! Write the flags for different data groups. ! !----------------------------------------------------------------------- ! idummy = 0 IF( grdbas == 1 ) THEN WRITE(nchanl) 1, 1, 0, mstout, 0, & 0, 0, 0, landout,totout, & 0, idummy, idummy, mapproj, month, & day, year, hour, minute, second ELSE WRITE(nchanl) grdout, basout, varout, mstout, iceout, & trbout, sfcout, rainout,landout,totout, & tkeout, idummy, idummy, mapproj, month, & day, year, hour, minute, second END IF rdummy = 0.0 umove4 = umove vmove4 = vmove xgrdorg4 = xgrdorg ygrdorg4 = ygrdorg trulat14 = trulat1 trulat24 = trulat2 trulon4 = trulon sclfct4 = sclfct tstop4 = tstop thisdmp4 = thisdmp latitud4 = latitud ctrlat4 = ctrlat ctrlon4 = ctrlon WRITE(nchanl) umove4, vmove4, xgrdorg4, ygrdorg4, trulat14, & trulat24, trulon4, sclfct4, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & tstop4, thisdmp4, latitud4, ctrlat4, ctrlon4 ! !----------------------------------------------------------------------- ! ! If totout=1, write additional parameters to history dump files. ! This is for ARPS version 4.1.2 or later. ! !----------------------------------------------------------------------- ! IF ( totout == 1 ) THEN WRITE(nchanl) nstyp, prcout, radout, flxout, 0, & ! 0 for snowcvr snowout,idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy WRITE(nchanl) rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy END IF ! !----------------------------------------------------------------------- ! ! If grdout=1 or grdbas=1, write out grid variables ! !----------------------------------------------------------------------- ! IF(grdout == 1 .OR. grdbas == 1 ) THEN out1d(1:nx) = x WRITE(nchanl) 'x coord r1d1' WRITE(nchanl) out1d(1:nx) out1d(1:ny) = y WRITE(nchanl) 'y coord r1d2' WRITE(nchanl) out1d(1:ny) out1d(1:nz) = z WRITE(nchanl) 'z coord r1d3' WRITE(nchanl) out1d(1:nz) CALL edgfill(zp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz) out3d(:,:,:) = zp(:,:,:) WRITE(nchanl) 'zp coor r3d0' WRITE(nchanl) out3d IF (intver == intver500) THEN CALL edgfill(zpsoil,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil) out3dsoil(:,:,:) = zpsoil(:,:,:) WRITE(nchanl) 'zpsoil rs3d0' WRITE(nchanl) out3dsoil END IF END IF ! grdout ! !----------------------------------------------------------------------- ! ! If basout=1, write out base state variables. ! !----------------------------------------------------------------------- ! IF(basout == 1 .OR. grdbas == 1 ) THEN CALL edgfill(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = ubar(:,:,:) WRITE(nchanl) 'ubar r3d1' WRITE(nchanl) out3d CALL edgfill(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1) WRITE(nchanl) 'vbar r3d2' out3d(:,:,:) = vbar(:,:,:) WRITE(nchanl) out3d DO k=1,nz DO j=1,ny DO i=1,nx out3d(i,j,k) = 0.0 END DO END DO END DO WRITE(nchanl) 'wbar r3d3' WRITE(nchanl) out3d CALL edgfill(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = ptbar(:,:,:) WRITE(nchanl) 'ptbar r3d0' WRITE(nchanl) out3d CALL edgfill(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = pbar(:,:,:) WRITE(nchanl) 'pbar r3d0' WRITE(nchanl) out3d IF(mstout == 1) THEN CALL edgfill(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qvbar(:,:,:) WRITE(nchanl) 'qvbar r3d0' WRITE(nchanl) out3d END IF IF(landout == 1) THEN IF( nstyp <= 1 ) THEN CALL iedgfill(soiltyp(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) WRITE(nchanl) 'soiltyp i2d0' WRITE(nchanl) ((soiltyp(i,j,1),i=1,nx),j=1,ny) ELSE DO is=1,nstyp CALL iedgfill(soiltyp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) WRITE(nchanl) 'soiltyp i2d0' WRITE(nchanl) ((soiltyp(i,j,is),i=1,nx),j=1,ny) CALL edgfill(stypfrct(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) out2d(:,:) = stypfrct(:,:,is) WRITE(nchanl) 'stypfrc r2d0' WRITE(nchanl) out2d END DO END IF CALL iedgfill(vegtyp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE(nchanl) 'vegtyp i2d0' WRITE(nchanl) vegtyp CALL edgfill(lai ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE(nchanl) 'lai r2d0' out2d(:,:) = lai(:,:) WRITE(nchanl) out2d CALL edgfill(roufns ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE(nchanl) 'roufns r2d0' out2d(:,:) = roufns(:,:) WRITE(nchanl) out2d CALL edgfill(veg ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE(nchanl) 'veg r2d0' out2d(:,:) = veg(:,:) WRITE(nchanl) out2d END IF END IF IF ( grdbas == 1 ) RETURN ! !----------------------------------------------------------------------- ! ! If varout = 1, Write out uprt, vprt, wprt, ptprt, pprt. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Write out u,v and w. ! !----------------------------------------------------------------------- ! IF(varout == 1) THEN IF ( totout == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Write out perturbations to history dump ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx tem1(i,j,k)=u(i,j,k)-ubar(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = tem1(:,:,:) WRITE(nchanl) 'uprt r3d1' WRITE(nchanl) out3d DO k=1,nz-1 DO i=1,nx-1 DO j=1,ny tem1(i,j,k)=v(i,j,k)-vbar(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1) out3d(:,:,:) = tem1(:,:,:) WRITE(nchanl) 'vprt r3d2' WRITE(nchanl) out3d CALL edgfill(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz) out3d(:,:,:) = w(:,:,:) WRITE(nchanl) 'wprt r3d3' WRITE(nchanl) out3d ! !----------------------------------------------------------------------- ! ! Write out scalars ! !----------------------------------------------------------------------- ! CALL edgfill(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = ptprt(:,:,:) WRITE(nchanl) 'ptprt r3d0' WRITE(nchanl) out3d CALL edgfill(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = pprt(:,:,:) WRITE(nchanl) 'pprt r3d0' WRITE(nchanl) out3d ELSE ! !----------------------------------------------------------------------- ! ! Write out total values to history dump ! !----------------------------------------------------------------------- ! CALL edgfill(u,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = u(:,:,:) WRITE(nchanl) 'u r3d1' WRITE(nchanl) out3d CALL edgfill(v,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1) out3d(:,:,:) = v(:,:,:) WRITE(nchanl) 'v r3d2' WRITE(nchanl) out3d CALL edgfill(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz) out3d(:,:,:) = w(:,:,:) WRITE(nchanl) 'w r3d3' WRITE(nchanl) out3d ! !----------------------------------------------------------------------- ! ! Write out scalars ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k) = ptbar(i,j,k) + ptprt(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = tem1(:,:,:) WRITE(nchanl) 'pt r3d0' WRITE(nchanl) out3d DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k) = pbar(i,j,k) + pprt(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = tem1(:,:,:) WRITE(nchanl) 'p r3d0' WRITE(nchanl) out3d END IF END IF ! varout ! !----------------------------------------------------------------------- ! ! If mstout = 1, write out moisture scalars. ! !----------------------------------------------------------------------- ! IF(mstout == 1) THEN IF( totout == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Write out perturbation to history dump ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=qv(i,j,k)-qvbar(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = tem1(:,:,:) WRITE(nchanl) 'qvprt r3d0' WRITE(nchanl) out3d ELSE ! !----------------------------------------------------------------------- ! ! Write out total values to history dump ! !----------------------------------------------------------------------- ! CALL edgfill(qv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qv(:,:,:) WRITE(nchanl) 'qv r3d0' WRITE(nchanl) out3d END IF CALL edgfill(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qc(:,:,:) WRITE(nchanl) 'qc r3d0' WRITE(nchanl) out3d CALL edgfill(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qr(:,:,:) WRITE(nchanl) 'qr r3d0' WRITE(nchanl) out3d IF(rainout == 1) THEN CALL edgfill(raing, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE(nchanl) 'raing r2d0' out2d(:,:) = raing(:,:) WRITE(nchanl) out2d CALL edgfill(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE(nchanl) 'rainc r2d0' out2d(:,:) = rainc(:,:) WRITE(nchanl) out2d END IF !rainout IF ( prcout == 1 ) THEN CALL edgfill(prcrate,1,nx,1,nx-1, 1,ny,1,ny-1, 1,4,1,4) out2d(:,:) = prcrate(:,:,1) WRITE(nchanl) 'prcrat1 r2d0' WRITE(nchanl) out2d out2d(:,:) = prcrate(:,:,2) WRITE(nchanl) 'prcrat2 r2d0' WRITE(nchanl) out2d out2d(:,:) = prcrate(:,:,3) WRITE(nchanl) 'prcrat3 r2d0' WRITE(nchanl) out2d out2d(:,:) = prcrate(:,:,4) WRITE(nchanl) 'prcrat4 r2d0' WRITE(nchanl) out2d END IF IF(iceout == 1) THEN CALL edgfill(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qi(:,:,:) WRITE(nchanl) 'qi r3d0' WRITE(nchanl) out3d CALL edgfill(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qs(:,:,:) WRITE(nchanl) 'qs r3d0' WRITE(nchanl) out3d CALL edgfill(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = qh(:,:,:) WRITE(nchanl) 'qh r3d0' WRITE(nchanl) out3d END IF !iceout END IF !mstout ! !----------------------------------------------------------------------- ! ! If tkeout = 1, write out tke. ! !----------------------------------------------------------------------- ! IF( tkeout == 1 ) THEN CALL edgfill(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = tke(:,:,:) WRITE(nchanl) 'tke r3d0' WRITE(nchanl) out3d END IF ! !----------------------------------------------------------------------- ! ! If trbout = 1, write out the turbulence parameter, km. ! !----------------------------------------------------------------------- ! IF( trbout == 1 ) THEN CALL edgfill(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = kmh(:,:,:) WRITE(nchanl) 'kmh r3d0' WRITE(nchanl) out3d CALL edgfill(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = kmv(:,:,:) WRITE(nchanl) 'kmv r3d0' WRITE(nchanl) out3d END IF ! trbout ! !----------------------------------------------------------------------- ! ! If sfcout = 1, write out the surface variables, ! tsoil, qsoil, and wetcanp. ! !----------------------------------------------------------------------- ! IF( sfcout == 1) THEN IF( nstyp <= 1 ) THEN CALL edgfill(tsoil(1,1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) CALL edgfill(qsoil(1,1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) IF (intver == intver410) THEN ! ! 06/28/2002 Zuwen He ! ! In version 410, tsoil is the average of tsoil from 2 to nzsoil in later ! version, and wetdp is similar. ! out3d(:,:,1)=0. DO k=2,nzsoil DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)+tsoil(i,j,k,0) END DO END DO END DO DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)/float(nzsoil-1) END DO END DO out2d(:,:) = tsoil(:,:,1,0) WRITE(nchanl) 'tsfc r2d0' WRITE(nchanl) out2d WRITE(nchanl) 'tsoil r2d0' WRITE(nchanl) ((out3d(i,j,1),i=1,nx),j=1,ny) out3d(:,:,1) = 0. DO k=2,nzsoil DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)+qsoil(i,j,k,0) END DO END DO END DO DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)/float(nzsoil-1) END DO END DO out2d(:,:) = qsoil(:,:,1,0) WRITE(nchanl) 'wetsfc r2d0' WRITE(nchanl) out2d WRITE(nchanl) 'wetdp r2d0' WRITE(nchanl) ((out3d(i,j,1),i=1,nx),j=1,ny) ELSE IF (intver == intver500) THEN out3dsoil(:,:,:) = tsoil(:,:,:,0) WRITE(nchanl) 'tsoil rs3d0' WRITE(nchanl) out3dsoil out3dsoil(:,:,:) = qsoil(:,:,:,0) WRITE(nchanl) 'qsoil rs3d0' WRITE(nchanl) out3dsoil END IF ! intver CALL edgfill(wetcanp(1,1,0),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) out2d(:,:) = wetcanp(:,:,0) WRITE(nchanl) 'wetcanp r2d0' WRITE(nchanl) out2d ELSE DO is=0,nstyp CALL edgfill(tsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) CALL edgfill(qsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) IF (intver == intver410) THEN ! ! 06/28/2002 Zuwen He ! ! In version 410, tsoil is the average of tsoil from 2 to nzsoil in later ! version, and wetdp is similar. ! out3d(:,:,1)=0. DO k=2,nzsoil DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)+tsoil(i,j,k,is) END DO END DO END DO DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)/float(nzsoil-1) END DO END DO out2d(:,:) = tsoil(:,:,1,is) WRITE(nchanl) 'tsfc r2d0' WRITE(nchanl) out2d WRITE(nchanl) 'tsoil r2d0' WRITE(nchanl) ((out3d(i,j,1),i=1,nx),j=1,ny) out3d(:,:,1)=0. DO k=2,nzsoil DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)+qsoil(i,j,k,is) END DO END DO END DO DO j=1,ny DO i=1,nx out3d(i,j,1)=out3d(i,j,1)/float(nzsoil-1) END DO END DO out2d(:,:) = qsoil(:,:,1,is) WRITE(nchanl) 'wetsfc r2d0' WRITE(nchanl) out2d WRITE(nchanl) 'wetdp r2d0' WRITE(nchanl) ((out3d(i,j,1),i=1,nx),j=1,ny) ELSE IF (intver == intver500) THEN out3dsoil(:,:,:) = tsoil(:,:,:,is) WRITE(nchanl) 'tsoil rs3d0' WRITE(nchanl) out3dsoil out3dsoil(:,:,:) = qsoil(:,:,:,is) WRITE(nchanl) 'qsoil rs3d0' WRITE(nchanl) out3dsoil END IF ! intver CALL edgfill(wetcanp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) out2d(:,:) = wetcanp(:,:,is) WRITE(nchanl) 'wetcanp r2d0' WRITE(nchanl) out2d END DO END IF IF (snowout == 1) THEN CALL edgfill(snowdpth,1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) out2d(:,:) = snowdpth(:,:) WRITE(nchanl) 'snowdpthr2d0' WRITE(nchanl) out2d END IF END IF ! !----------------------------------------------------------------------- ! ! If radout = 1, write out the radiation arrays ! !----------------------------------------------------------------------- ! IF( radout == 1 ) THEN CALL edgfill(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) out3d(:,:,:) = radfrc(:,:,:) WRITE(nchanl) 'radfrc r3d0' WRITE(nchanl) out3d CALL edgfill(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = radsw(:,:) WRITE(nchanl) 'radsw r2d0' WRITE(nchanl) out2d CALL edgfill(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = rnflx(:,:) WRITE(nchanl) 'rnflx r2d0' WRITE(nchanl) out2d IF (intver >= intver500) THEN CALL edgfill(radswnet,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = radswnet(:,:) WRITE(nchanl) 'radswnetr2d0' WRITE(nchanl) out2d CALL edgfill(radlwin,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = radlwin(:,:) WRITE(nchanl) 'radlwin r2d0' WRITE(nchanl) out2d END IF ! intver END IF ! radout ! !----------------------------------------------------------------------- ! ! If flxout = 1, write out the surface fluxes ! !----------------------------------------------------------------------- ! IF( flxout == 1 ) THEN CALL edgfill(usflx,1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = usflx(:,:) WRITE(nchanl) 'usflx r2d0' WRITE(nchanl) out2d CALL edgfill(vsflx,1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1) out2d(:,:) = vsflx(:,:) WRITE(nchanl) 'vsflx r2d0' WRITE(nchanl) out2d CALL edgfill(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = ptsflx(:,:) WRITE(nchanl) 'ptsflx r2d0' WRITE(nchanl) out2d CALL edgfill(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) out2d(:,:) = qvsflx(:,:) WRITE(nchanl) 'qvsflx r2d0' WRITE(nchanl) out2d END IF ! flxout !--------------------------------------------------------------- ! ! Deallocate 4 byte working arrays ! !--------------------------------------------------------------- DEALLOCATE(out1d) DEALLOCATE(out2d) DEALLOCATE(out3d) DEALLOCATE(out3dsoil) RETURN END SUBROUTINE bindump ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BINJOINDUMP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE binjoindump(nx,ny,nz,nzsoil,nstyps, nchanl, grdbas, & 1,114 u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, & ubar,vbar,ptbar,pbar,rhobar,qvbar, & x,y,z,zp,zpsoil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write history data into channel nchanl as binary data. ! ! All data read in are located at the original staggered grid points. ! ! Note: coordinate fields are dumped as 3 dimensional fields which ! have been converted from meters to kilometers. This is for the ! convenience of the plotting applications. ! ! The last 4 characters of the 12 character label written out ! with each 1-,2-, or 3-d array is used by the splitdump and ! joinfiles subroutines used by the message passing version of the ! ARPS (and also by some auxiliary ARPS I/O routines) ! to determine the data type of the array. ! Key to the labels: ! ! 'nnnnnnn tdds' ! ! n - characters containing the name of the variable. ! t - type of variable: "r" for real and "i" for integer. ! dd - number of dimensions: "1d" "2d" or "3d". ! s - staggered dimension: "0" for centered, ! "1" for staggered in x, ! "2" for staggered in y, ! "3" for staggered in z. ! !----------------------------------------------------------------------- ! ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! 8/16/02. ! Based on subroutine bindump. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil ! ! nchanl FORTRAN I/O channel number for history data output. ! grdbas Flag indicating if this is a call for the data dump ! of grid and base state arrays only. If so, grdbas=1. ! ! u x component of velocity at a given time level (m/s) ! v y component of velocity at a given time level (m/s) ! w Vertical component of Cartesian velocity at a given ! time level (m/s) ! ptprt Perturbation potential temperature at a given time ! level (K) ! pprt Perturbation pressure at a given time level (Pascal) ! qv Water vapor specific humidity at a given time level (kg/kg) ! qc Cloud water mixing ratio at a given time level (kg/kg) ! qr Rainwater mixing ratio at a given time level (kg/kg) ! qi Cloud ice mixing ratio at a given time level (kg/kg) ! qs Snow mixing ratio at a given time level (kg/kg) ! qh Hail mixing ratio at a given time level (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ubar Base state zonal velocity component (m/s) ! vbar Base state meridional 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 specific humidity (kg/kg) ! ! 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 Vertical coordinate of grid points in physical space (m) ! zpsoil Vertical coordinate of grid points in the soil (m) ! ! soiltyp Soil type ! stypfrct Soil type fraction ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2*s)) ! qvsflx Surface moisture flux (kg/(m**2*s)) ! ! OUTPUT: ! ! None. ! ! WORK ARRAY: ! ! tem1 Temporary work array. ! ! !----------------------------------------------------------------------- ! ! The following parameters are passed into this subroutine through ! a common block in globcst.inc, and they determine which ! variables are output. ! ! grdout =0 or 1. If grdout=0, grid variables are not dumped. ! basout =0 or 1. If basout=0, base state variables are not dumped. ! varout =0 or 1. If varout=0, model perturbation variables are not dumped. ! mstout =0 or 1. If mstout=0, water variables are not dumped. ! rainout=0 or 1. If rainout=0, rain variables are not dumped. ! prcout =0 or 1. If prcout=0, precipitation rates are not dumped. ! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped. ! tkeout =0 or 1. If tkeout=0, tke is not dumped. ! trbout =0 or 1. If trbout=0, turbulence parameter km is not dumped. ! sfcout =0 or 1. If sfcout=0, surface variables are not dumped. ! landout=0 or 1. If landout=0, surface propertty arrays are not dumped. ! radout =0 or 1. If radout =0, radiation arrays are not dumped. ! flxout =0 or 1. If flxout =0, surface flux arrays are not dumped. ! ! These following parameters are also passed in through common ! blocks in globcst.inc. ! ! runname,curtim,umove,vmove,xgrdorg,ygrdorg ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the soil INTEGER :: nchanl ! FORTRAN I/O channel number for output INTEGER :: grdbas ! If this is a grid/base state array dump REAL :: u (nx,ny,nz) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined at ! w-point of the soil INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type fractions INTEGER :: vegtyp (nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) REAL :: tem1 (nx,ny,nz) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Parameters describing this routine ! !----------------------------------------------------------------------- ! ! 06/28/2002 Zuwen He ! ! fmtver??: to label each data a version. ! intver??: an integer to allow faster comparison than fmtver??, ! which are strings. ! ! Verion 5.00: significant change in soil variables since version 4.10. ! CHARACTER (LEN=40) :: fmtver,fmtver410,fmtver500 INTEGER :: intver,intver410,intver500 PARAMETER (fmtver410='004.10 Binary Data',intver410=410) PARAMETER (fmtver500='005.00 Binary Data',intver500=500) CHARACTER(LEN=10), PARAMETER :: tmunit = 'seconds ' ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,l,is INTEGER :: idummy REAL :: rdummy INTEGER :: nxlg, nylg INTEGER :: n3d, istat REAL, ALLOCATABLE :: out1d(:) REAL, ALLOCATABLE :: out3d(:,:,:) INTEGER, ALLOCATABLE :: out3di(:,:,:) REAL, ALLOCATABLE :: outtsoil(:,:,:,:) REAL, ALLOCATABLE :: outqsoil(:,:,:,:) ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'mp.inc' ! mpi parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! nxlg = nproc_x*(nx-3)+3 nylg = nproc_y*(ny-3)+3 n3d = MAX(nz, nzsoil, nstyps+1, 4) ! 3rd dimenson for out3d intver = intver500 ! for the time being, in the future, we will ! allow to dump data in the different version ! intver will be assigned from input file IF (intver == intver410) THEN fmtver=fmtver410 ELSE IF (intver == intver500) THEN fmtver=fmtver500 ELSE IF (myproc == 0) WRITE(6,'(/1x,a,i10,a/)') & 'Data format, intver=',intver,', not found. The Job stopped.' CALL arpsstop('arpstop called from binjoindumpp.',1) END IF IF (myproc == 0) THEN WRITE(6,'(/1x,a,a,a/)') 'Data dump format, fmtver = ',fmtver,'. ' WRITE(6,'(1x,a,f13.3/)') 'Writing history data at time = ', curtim ! !----------------------------------------------------------------------- ! ! Write header info ! !----------------------------------------------------------------------- ! WRITE(nchanl) fmtver WRITE(nchanl) runname WRITE(nchanl) nocmnt IF( nocmnt > 0 ) THEN DO l=1,nocmnt WRITE(nchanl) cmnt(l) END DO END IF WRITE(nchanl) curtim,tmunit IF (intver == intver410) THEN WRITE(nchanl) nxlg,nylg,nz ELSE IF (intver == intver500) THEN WRITE(nchanl) nxlg,nylg,nz,nzsoil END IF ! !----------------------------------------------------------------------- ! ! Write the flags for different data groups. ! !----------------------------------------------------------------------- ! idummy = 0 IF( grdbas == 1 ) THEN WRITE(nchanl) 1, 1, 0, mstout, 0, & 0, 0, 0, landout,totout, & 0, idummy, idummy, mapproj, month, & day, year, hour, minute, second ELSE WRITE(nchanl) grdout, basout, varout, mstout, iceout, & trbout, sfcout, rainout,landout,totout, & tkeout, idummy, idummy, mapproj, month, & day, year, hour, minute, second END IF rdummy = 0.0 WRITE(nchanl) umove, vmove, xgrdorg, ygrdorg, trulat1, & trulat2, trulon, sclfct, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & tstop, thisdmp, latitud, ctrlat, ctrlon ! !----------------------------------------------------------------------- ! ! If totout=1, write additional parameters to history dump files. ! This is for ARPS version 4.1.2 or later. ! !----------------------------------------------------------------------- ! IF ( totout == 1 ) THEN WRITE(nchanl) nstyp, prcout, radout, flxout, 0, & ! 0 for snowcvr snowout, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy WRITE(nchanl) rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy END IF END IF ! myproc == 0 ALLOCATE (out1d( MAX(nxlg,nylg) ),stat=istat) CALL check_alloc_status(istat, "binjoindump:out1d") ALLOCATE (out3d( nxlg,nylg, n3d ),stat=istat) CALL check_alloc_status(istat, "binjoindump:out3d") ALLOCATE (out3di( nxlg,nylg, nstyps ),stat=istat) CALL check_alloc_status(istat, "binjoindump:out3di") ALLOCATE (outtsoil( nxlg,nylg, nzsoil, 0:nstyps ),stat=istat) CALL check_alloc_status(istat, "binjoindump:outtsoil") ALLOCATE (outqsoil( nxlg,nylg, nzsoil, 0:nstyps ),stat=istat) CALL check_alloc_status(istat, "binjoindump:outqsoil") !----------------------------------------------------------------------- ! ! If grdout=1 or grdbas=1, write out grid variables ! !----------------------------------------------------------------------- ! IF(grdout == 1 .OR. grdbas == 1 ) THEN CALL mpimerge1dx(x,nx,out1d) IF (myproc == 0) THEN WRITE(nchanl) 'x coord r1d1' WRITE(nchanl) out1d(1:nxlg) END IF CALL mpimerge1dy(y,ny,out1d) IF (myproc == 0) THEN WRITE(nchanl) 'y coord r1d2' WRITE(nchanl) out1d(1:nylg) END IF IF (myproc == 0) THEN WRITE(nchanl) 'z coord r1d3' WRITE(nchanl) z END IF CALL edgfill(zp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz) CALL mpimerge3d(zp,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'zp coor r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF IF (intver == intver500) THEN CALL edgfill(zpsoil,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil) CALL mpimerge3d(zpsoil,nx,ny,nzsoil,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'zpsoil rs3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nzsoil) END IF END IF END IF ! grdout ! !----------------------------------------------------------------------- ! ! If basout=1, write out base state variables. ! !----------------------------------------------------------------------- ! IF(basout == 1 .OR. grdbas == 1 ) THEN CALL edgfill(ubar,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(ubar,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'ubar r3d1' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(vbar,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1) CALL mpimerge3d(vbar,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'vbar r3d2' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF IF (myproc == 0) THEN out3d(:,:,:) = 0.0 WRITE(nchanl) 'wbar r3d3' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(ptbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(ptbar,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'ptbar r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(pbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(pbar,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'pbar r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF IF(mstout == 1) THEN CALL edgfill(qvbar,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qvbar,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qvbar r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF END IF IF(landout == 1) THEN IF( nstyp <= 1 ) THEN CALL iedgfill(soiltyp(1,1,1),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL mpimerge2di(soiltyp(:,:,1),nx,ny,out3di) IF (myproc == 0) THEN WRITE(nchanl) 'soiltyp i2d0' WRITE(nchanl) out3di(1:nxlg,1:nylg,1) END IF ELSE DO is=1,nstyp CALL iedgfill(soiltyp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL edgfill(stypfrct(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) END DO CALL mpimerge3di(soiltyp,nx,ny,nstyp,out3di) CALL mpimerge3d (stypfrct,nx,ny,nstyp,out3d) IF (myproc == 0) THEN DO is=1,nstyp WRITE(nchanl) 'soiltyp i2d0' WRITE(nchanl) ((out3di(i,j,is),i=1,nxlg),j=1,nylg) WRITE(nchanl) 'stypfrc r2d0' WRITE(nchanl) ((out3d(i,j,is),i=1,nxlg),j=1,nylg) END DO END IF END IF CALL iedgfill(vegtyp ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2di(vegtyp,nx,ny,out3di) IF (myproc == 0) THEN WRITE(nchanl) 'vegtyp i2d0' WRITE(nchanl) out3di(1:nxlg,1:nylg,1) END IF CALL edgfill(lai ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(lai,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'lai r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(roufns ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(roufns,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'roufns r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(veg ,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(veg,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'veg r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF END IF END IF IF ( grdbas == 1 ) RETURN ! !----------------------------------------------------------------------- ! ! If varout = 1, Write out uprt, vprt, wprt, ptprt, pprt. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Write out u,v and w. ! !----------------------------------------------------------------------- ! IF(varout == 1) THEN IF ( totout == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Write out perturbations to history dump ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx tem1(i,j,k) = u(i,j,k) - ubar(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(tem1,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'uprt r3d1' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF DO k=1,nz-1 DO j=1,ny DO i=1,nx-1 tem1(i,j,k) = v(i,j,k) - vbar(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1) CALL mpimerge3d(tem1,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'vprt r3d2' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz) CALL mpimerge3d(w,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'wprt r3d3' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF ! !----------------------------------------------------------------------- ! ! Write out scalars ! !----------------------------------------------------------------------- ! CALL edgfill(ptprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(ptprt,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'ptprt r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(pprt,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(pprt,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'pprt r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF ELSE ! !----------------------------------------------------------------------- ! ! Write out total values to history dump ! !----------------------------------------------------------------------- ! CALL edgfill(u,1,nx,1,nx, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(u,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'u r3d1' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(v,1,nx,1,nx-1, 1,ny,1,ny, 1,nz,1,nz-1) CALL mpimerge3d(v,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'v r3d2' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(w,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz) CALL mpimerge3d(w,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'w r3d3' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF ! !----------------------------------------------------------------------- ! ! Write out scalars ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k) = ptbar(i,j,k) + ptprt(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(tem1,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'pt r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k) = pbar(i,j,k) + pprt(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(tem1,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'p r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF END IF END IF ! varout ! !----------------------------------------------------------------------- ! ! If mstout = 1, write out moisture scalars. ! !----------------------------------------------------------------------- ! IF(mstout == 1) THEN IF( totout == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Write out perturbation to history dump ! !----------------------------------------------------------------------- ! DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=qv(i,j,k)-qvbar(i,j,k) END DO END DO END DO CALL edgfill(tem1,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(tem1,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qvprt r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF ELSE ! !----------------------------------------------------------------------- ! ! Write out total values to history dump ! !----------------------------------------------------------------------- ! CALL edgfill(qv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qv,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qv r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF END IF CALL edgfill(qc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qc,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qc r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(qr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qr,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qr r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF IF(rainout == 1) THEN CALL edgfill(raing, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(raing,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'raing r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(rainc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(rainc,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'rainc r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF END IF !rainout IF ( prcout == 1 ) THEN CALL edgfill(prcrate,1,nx,1,nx-1, 1,ny,1,ny-1, 1,4,1,4) CALL mpimerge3d(prcrate,nx,ny,4,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'prcrat1 r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) WRITE(nchanl) 'prcrat2 r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,2) WRITE(nchanl) 'prcrat3 r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,3) WRITE(nchanl) 'prcrat4 r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,4) END IF END IF IF(iceout == 1) THEN CALL edgfill(qi,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qi,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qi r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(qs,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qs,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qs r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(qh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(qh,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qh r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF END IF !iceout END IF !mstout ! !----------------------------------------------------------------------- ! ! If tkeout = 1, write out tke. ! !----------------------------------------------------------------------- ! IF( tkeout == 1 ) THEN CALL edgfill(tke,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(tke,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'tke r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF END IF ! !----------------------------------------------------------------------- ! ! If trbout = 1, write out the turbulence parameter, km. ! !----------------------------------------------------------------------- ! IF( trbout == 1 ) THEN CALL edgfill(kmh,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(kmh,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'kmh r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(kmv,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(kmv,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'kmv r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF END IF ! trbout ! !----------------------------------------------------------------------- ! ! If sfcout = 1, write out the surface variables, ! tsoil, qsoil, and wetcanp. ! !----------------------------------------------------------------------- ! IF( sfcout == 1) THEN IF( nstyp <= 1 ) THEN CALL edgfill(tsoil(1,1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) CALL edgfill(qsoil(1,1,1,0), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) CALL mpimerge3d(tsoil(:,:,:,0),nx,ny,nzsoil,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'tsoil rs3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nzsoil) END IF CALL mpimerge3d(qsoil(:,:,:,0),nx,ny,nzsoil,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qsoil rs3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nzsoil) END IF CALL edgfill(wetcanp(1,1,0),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) CALL mpimerge2d(wetcanp(:,:,0),nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'wetcanp r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF ELSE DO is=0,nstyp CALL edgfill(tsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) CALL edgfill(qsoil(1,1,1,is), 1,nx,1,nx-1, 1,ny,1,ny-1, & 1,nzsoil,1,nzsoil) CALL edgfill(wetcanp(1,1,is),1,nx,1,nx-1, 1,ny,1,ny-1, & 1,1,1,1) END DO CALL mpimerge4d(tsoil,nx,ny,nzsoil,nstyp+1,outtsoil) CALL mpimerge4d(qsoil,nx,ny,nzsoil,nstyp+1,outqsoil) CALL mpimerge3d(wetcanp,nx,ny,nstyp+1,out3d) IF (myproc == 0) THEN DO is=0,nstyp WRITE(nchanl) 'tsoil rs3d0' WRITE(nchanl) outtsoil(1:nxlg,1:nylg,1:nzsoil,is) WRITE(nchanl) 'qsoil rs3d0' WRITE(nchanl) outqsoil(1:nxlg,1:nylg,1:nzsoil,is) WRITE(nchanl) 'wetcanp r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,is+1) END DO END IF END IF IF (snowout == 1) THEN CALL edgfill(snowdpth,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(snowdpth,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'snowdpthr2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF END IF END IF ! !----------------------------------------------------------------------- ! ! If radout = 1, write out the radiation arrays ! !----------------------------------------------------------------------- ! IF( radout == 1 ) THEN CALL edgfill(radfrc,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nz,1,nz-1) CALL mpimerge3d(radfrc,nx,ny,nz,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'radfrc r3d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1:nz) END IF CALL edgfill(radsw,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(radsw,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'radsw r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(rnflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(rnflx,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'rnflx r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF IF (intver >= intver500) THEN CALL edgfill(radswnet,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(radswnet,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'radswnetr2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(radlwin,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(radlwin,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'radlwin r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF END IF ! intver END IF ! radout ! !----------------------------------------------------------------------- ! ! If flxout = 1, write out the surface fluxes ! !----------------------------------------------------------------------- ! IF( flxout == 1 ) THEN CALL edgfill(usflx,1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(usflx,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'usflx r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(vsflx,1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1) CALL mpimerge2d(vsflx,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'vsflx r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(ptsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(ptsflx,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'ptsflx r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF CALL edgfill(qvsflx,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) CALL mpimerge2d(qvsflx,nx,ny,out3d) IF (myproc == 0) THEN WRITE(nchanl) 'qvsflx r2d0' WRITE(nchanl) out3d(1:nxlg,1:nylg,1) END IF END IF ! flxout DEALLOCATE(out1d) DEALLOCATE(out3d, out3di) DEALLOCATE(outtsoil, outqsoil) RETURN END SUBROUTINE binjoindump ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BN2DUMP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE bn2dump(nx,ny,nz,nzsoil,nstyps, nchanl, grdbas, & 1 u,v,w,ptprt,pprt,qv,qc,qr,qi,qs,qh,tke,kmh,kmv, & ubar,vbar,ptbar,pbar,rhobar,qvbar, & x,y,z,zp,zpsoil, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsoil,qsoil,wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx,radswnet,radlwin, & usflx,vsflx,ptsflx,qvsflx, & tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write history data into channel nchanl as binary data. ! ! This routine can dump the data arrays in a model subdomain and ! at selected data points. ! ! All data read in are located at the original staggered grid points. ! ! Note: coordinate fields are dumped as 3 dimensional fields which ! have been converted from meters to kilometers. This is for the ! convenience of the plotting applications. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 3/10/92. ! ! MODIFICATION HISTORY: ! ! 4/4/93 (M. Xue) ! Modified, so that data on the original staggered grid are written ! out. Averaging to the volume center is no longer done. ! ! 9/1/94 (Y. Lu) ! Cleaned up documentation. ! ! 02/06/95 (Y. Liu) ! Added map projection parameters into the second binary dumping ! ! 12/09/1998 (Donghai Wang) ! Added the snow cover. ! ! 05/15/2002 (J. Brotzge) ! Added to allow for multiple soil schemes. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! nzsoil Number of grid points in the soil ! ! nchanl FORTRAN I/O channel number for history data output. ! grdbas Flag indicating if this is a call for the data dump ! of grid and base state arrays only. If so, grdbas=1. ! ! u x component of velocity at a given time level (m/s) ! v y component of velocity at a given time level (m/s) ! w Vertical component of Cartesian velocity at a given ! time level (m/s) ! ptprt Perturbation potential temperature at a given time ! level (K) ! pprt Perturbation pressure at a given time level (Pascal) ! qv Water vapor specific humidity at a given time level (kg/kg) ! qc Cloud water mixing ratio at a given time level (kg/kg) ! qr Rainwater mixing ratio at a given time level (kg/kg) ! qi Cloud ice mixing ratio at a given time level (kg/kg) ! qs Snow mixing ratio at a given time level (kg/kg) ! qh Hail mixing ratio at a given time level (kg/kg) ! tke Turbulent Kinetic Energy ((m/s)**2) ! ! kmh Horizontal turb. mixing coef. for momentum ( m**2/s ) ! kmv Vertical turb. mixing coef. for momentum ( m**2/s ) ! ! ubar Base state zonal velocity component (m/s) ! vbar Base state meridional 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 specific humidity (kg/kg) ! ! 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 Vertical coordinate of grid points in physical space (m) ! zpsoil Vertical coordinate of grid points in soil (m) ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! prcrate Precipitation rates ! ! radfrc Radiation forcing (K/s) ! radsw Solar radiation reaching the surface ! rnflx Net radiation flux absorbed by surface ! radswnet Net shortwave radiation ! radlwin Incoming longwave radiation ! ! usflx Surface flux of u-momentum (kg/(m*s**2)) ! vsflx Surface flux of v-momentum (kg/(m*s**2)) ! ptsflx Surface heat flux (K*kg/(m**2 * s )) ! qvsflx Surface moisture flux of (kg/(m**2 * s)) ! ! OUTPUT: ! ! None. ! ! WORK ARRAY: ! ! tem1 Temporary work array. ! ! !----------------------------------------------------------------------- ! ! The following parameters are passed into this subroutine through ! a common block in globcst.inc. These parameters determine which ! variables are output. ! ! grdout =0 or 1. If grdout=0, grid variables are not dumped. ! basout =0 or 1. If basout=0, base state variables are not dumped. ! varout =0 or 1. If varout=0, model perturbation variables are not dumped. ! mstout =0 or 1. If mstout=0, water variables are not dumped. ! rainout=0 or 1. If rainout=0, rain variables are not dumped. ! prcout =0 or 1. If prcout=0, precipitation rates are not dumped. ! iceout =0 or 1. If iceout=0, qi, qs and qh are not dumped. ! trbout =0 or 1. If trbout=0, turbulence parameter km is not dumped. ! tkeout =0 or 1. If tkeout=0, tke is not dumped. ! radout =0 or 1. If radout=0, radiation arrays are not dumped. ! flxout =0 or 1. If flxout=0, surface fluxes are not dumped. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! Number of grid points in 3 directions INTEGER :: nzsoil ! Number of grid points in the soil INTEGER :: nchanl ! FORTRAN I/O channel number for output INTEGER :: grdbas ! If this is a grid/base state array dump REAL :: u (nx,ny,nz) ! Total u-velocity (m/s) REAL :: v (nx,ny,nz) ! Total v-velocity (m/s) REAL :: w (nx,ny,nz) ! Total w-velocity (m/s) REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K) REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal) REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg) REAL :: qc (nx,ny,nz) ! Cloud water mixing ratio (kg/kg) REAL :: qr (nx,ny,nz) ! Rain water mixing ratio (kg/kg) REAL :: qi (nx,ny,nz) ! Cloud ice mixing ratio (kg/kg) REAL :: qs (nx,ny,nz) ! Snow mixing ratio (kg/kg) REAL :: qh (nx,ny,nz) ! Hail mixing ratio (kg/kg) REAL :: tke (nx,ny,nz) ! Turbulent Kinetic Energy ((m/s)**2) REAL :: kmh (nx,ny,nz) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: kmv (nx,ny,nz) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal) REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific humidity ! (kg/kg) REAL :: x (nx) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL :: y (ny) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL :: z (nz) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at ! w-point of the staggered grid. REAL :: zpsoil(nx,ny,nzsoil) ! The physical height coordinate defined at ! w-point of the soil INTEGER :: nstyps ! Number of soil types INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type REAL :: stypfrct(nx,ny,nstyps) ! Soil type INTEGER :: vegtyp(nx,ny) ! Vegetation type REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: tsoil (nx,ny,nzsoil,0:nstyps) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil,0:nstyps) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL :: raing(nx,ny) ! Grid supersaturation rain REAL :: rainc(nx,ny) ! Cumulus convective rain REAL :: prcrate(nx,ny,4) ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL :: radfrc(nx,ny,nz) ! Radiation forcing (K/s) REAL :: radsw (nx,ny) ! Solar radiation reaching the surface REAL :: rnflx (nx,ny) ! Net radiation flux absorbed by surface REAL :: radswnet(nx,ny) ! Net shortwave radiation REAL :: radlwin(nx,ny) ! Incoming longwave radiation REAL :: usflx (nx,ny) ! Surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! Surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx(nx,ny) ! Surface heat flux (K*kg/(m**2*s)) REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s)) REAL :: tem1 (nx,ny,nz) ! Temporary work array ! !----------------------------------------------------------------------- ! ! Parameters describing this routine ! !----------------------------------------------------------------------- ! CHARACTER (LEN=40) :: fmtver PARAMETER (fmtver='004.10 2nd Binary Data') CHARACTER (LEN=10) :: tmunit PARAMETER (tmunit='seconds ') ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,l,is, idummy REAL :: rdummy INTEGER :: nxout,nyout,nzout ! The size of array to be written out. INTEGER :: nzsoilout ! The size of array to be written out. INTEGER :: ist ,ind ,isk ,jst ,jnd ,jsk ,kst ,knd ,ksk INTEGER :: ist1,ind1,isk1,jst1,jnd1,jsk1,kst1,knd1,ksk1 INTEGER :: lst, lnd, lsk INTEGER :: setdomn,setskip SAVE setdomn, setskip SAVE ist,ind,isk,jst,jnd,jsk,kst,knd,ksk,lst,lnd,lsk DATA setdomn, setskip /0,0/ ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF( setdomn == 0) THEN ! If these parameters are nevers set ... ist = 1 jst = 1 kst = 1 lst = 1 ind = nx jnd = ny knd = nz lnd = nzsoil END IF IF( setskip == 0) THEN ! If these parameters are nevers set ... isk = 1 jsk = 1 ksk = 1 lsk = 1 END IF WRITE(6,'(1x,a,f13.3/)') 'Writing history data at time=', curtim ! !----------------------------------------------------------------------- ! ! Write header info ! !----------------------------------------------------------------------- ! WRITE(nchanl) fmtver WRITE(nchanl) runname WRITE(nchanl) nocmnt IF( nocmnt > 0 ) THEN DO l=1,nocmnt WRITE(nchanl) cmnt(l) END DO END IF WRITE(nchanl) curtim,tmunit nxout = ist+(ind-ist)/isk nyout = jst+(jnd-jst)/jsk nzout = kst+(knd-kst)/ksk nzsoilout = lst+(lnd-lst)/lsk WRITE(nchanl) nxout, nyout, nzout, nzsoilout PRINT*,'nxout= ',nxout,'nyout= ',nyout,'nzout= ',nzout, & 'nzsoilout= ',nzsoilout ! !----------------------------------------------------------------------- ! ! Write the flags for different data groups. ! !----------------------------------------------------------------------- ! idummy = 0 IF( grdbas == 1 ) THEN WRITE(nchanl) 1, 1, 0, mstout, 0, & 0, idummy, idummy, landout, totout, & idummy, idummy, idummy, mapproj, month, & day, year, hour, minute, second ELSE WRITE(nchanl) grdout, basout, varout, mstout, iceout, & trbout, sfcout, rainout,landout,totout, & tkeout, idummy, idummy, mapproj, month, & day, year, hour, minute, second END IF rdummy = 0.0 WRITE(nchanl) umove, vmove, xgrdorg, ygrdorg, trulat1, & trulat2, trulon, sclfct, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & tstop, thisdmp, latitud, ctrlat, ctrlon IF ( totout /= 0 ) THEN ! !----------------------------------------------------------------------- ! ! Add new parameters for new version of history data dump ! !----------------------------------------------------------------------- ! WRITE(nchanl) nstyp, prcout, radout, flxout, 0, & ! 0 for snowcvr snowout,idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy WRITE(nchanl) rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy END IF ! !----------------------------------------------------------------------- ! ! If grdout=1 or grdbas=1, write out grid variables ! !----------------------------------------------------------------------- ! IF(grdout == 1 .OR. grdbas == 1 ) THEN WRITE(nchanl) 'x coordinate' WRITE(nchanl) ( x(i), i=ist,ind,isk) WRITE(nchanl) 'y coordinate' WRITE(nchanl) ( y(j), j=jst,jnd,jsk) WRITE(nchanl) 'z coordinate' WRITE(nchanl) ( z(k), k=kst,knd,ksk) WRITE(nchanl) 'zp coord ' WRITE(nchanl) ((( zp(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'zpsoil coord ' WRITE(nchanl) (((zpsoil(i,j,l),i=ist,ind,isk),j=jst,jnd,jsk), & l=lst,lnd,lsk) END IF ! grdout ! !----------------------------------------------------------------------- ! ! If basout=1, write out base state variables. ! !----------------------------------------------------------------------- ! IF(basout == 1 .OR. grdbas == 1 ) THEN WRITE(nchanl) 'ubar ' WRITE(nchanl) ((( ubar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'vbar ' WRITE(nchanl) ((( vbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) DO k=kst,knd,ksk DO j=jst,jnd,jsk DO i=ist,ind,isk tem1(i,j,k) = 0.0 END DO END DO END DO WRITE(nchanl) 'wbar ' WRITE(nchanl) (((tem1(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'ptbar ' WRITE(nchanl) (((ptbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'pbar ' WRITE(nchanl) (((pbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) IF(mstout == 1) THEN WRITE(nchanl) 'qvbar ' WRITE(nchanl) (((qvbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) END IF IF(landout == 1) THEN IF( nstyp <= 1 ) THEN WRITE(nchanl) 'soiltyp ' WRITE(nchanl) ((soiltyp(i,j,1),i=ist,ind,isk), & j=jst,jnd,jsk) ELSE DO is=1,nstyp WRITE(nchanl) 'soiltyp ' WRITE(nchanl) ((soiltyp(i,j,is),i=ist,ind,isk), & j=jst,jnd,jsk) WRITE(nchanl) 'stypfrct ' WRITE(nchanl) ((stypfrct(i,j,is),i=ist,ind,isk), & j=jst,jnd,jsk) END DO END IF WRITE(nchanl) 'vegtyp ' WRITE(nchanl) ((vegtyp (i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'lai ' WRITE(nchanl) ((lai (i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'roufns ' WRITE(nchanl) ((roufns (i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'veg ' WRITE(nchanl) ((veg (i,j),i=ist,ind,isk),j=jst,jnd,jsk) END IF END IF IF ( grdbas == 1 ) RETURN ! !----------------------------------------------------------------------- ! ! If varout = 1, Write out uprt, vprt, wprt, ptprt, pprt. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Write out u, v and w ! !----------------------------------------------------------------------- ! IF(varout == 1) THEN IF ( totout == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Write out perturbatios to history dump ! !----------------------------------------------------------------------- ! WRITE(nchanl) 'uprt ' WRITE(nchanl) ((( u(i,j,k)-ubar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'vprt ' WRITE(nchanl) ((( v(i,j,k)-vbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'wprt ' WRITE(nchanl) ((( w(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) ! !----------------------------------------------------------------------- ! ! Write out scalars ! !----------------------------------------------------------------------- ! WRITE(nchanl) 'ptprt ' WRITE(nchanl) ((( ptprt(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'pprt ' WRITE(nchanl) ((( pprt(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) ELSE ! !----------------------------------------------------------------------- ! ! Write out total values to history dump ! !----------------------------------------------------------------------- ! WRITE(nchanl) 'u ' WRITE(nchanl) ((( u(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'v ' WRITE(nchanl) ((( v(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'w ' WRITE(nchanl) ((( w(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) ! !----------------------------------------------------------------------- ! ! Write out scalars ! !----------------------------------------------------------------------- ! WRITE(nchanl) 'pt ' WRITE(nchanl) ((( ptprt(i,j,k)+ptbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'p ' WRITE(nchanl) ((( pprt(i,j,k)+pbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) END IF END IF ! varout ! !----------------------------------------------------------------------- ! ! If mstout = 1, write out moisture scalars. ! !----------------------------------------------------------------------- ! IF(mstout == 1) THEN IF ( totout == 0 ) THEN ! !----------------------------------------------------------------------- ! ! Write out perturbations to history dump ! !----------------------------------------------------------------------- ! WRITE(nchanl) 'qvprt ' WRITE(nchanl) ((( qv(i,j,k)-qvbar(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) ELSE ! !----------------------------------------------------------------------- ! ! Write out total values to history dump ! !----------------------------------------------------------------------- ! WRITE(nchanl) 'qv ' WRITE(nchanl) ((( qv(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) END IF WRITE(nchanl) 'qc ' WRITE(nchanl) ((( qc(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'qr ' WRITE(nchanl) ((( qr(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) IF(rainout == 1) THEN WRITE(nchanl) 'raing ' WRITE(nchanl) ((raing(i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'rainc ' WRITE(nchanl) ((rainc(i,j),i=ist,ind,isk),j=jst,jnd,jsk) END IF !rainout IF ( prcout == 1 ) THEN WRITE(nchanl) 'prcrate1 ' WRITE(nchanl) ((prcrate(i,j,1),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'prcrate2 ' WRITE(nchanl) ((prcrate(i,j,2),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'prcrate3 ' WRITE(nchanl) ((prcrate(i,j,3),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'prcrate4 ' WRITE(nchanl) ((prcrate(i,j,4),i=ist,ind,isk),j=jst,jnd,jsk) END IF ! prcout IF(iceout == 1) THEN WRITE(nchanl) 'qi ' WRITE(nchanl) ((( qi(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'qs ' WRITE(nchanl) ((( qs(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'qh ' WRITE(nchanl) ((( qh(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) END IF !iceout END IF !mstout ! !----------------------------------------------------------------------- ! ! If tkeout = 1, write out turbulence parameter, km. ! !----------------------------------------------------------------------- ! IF( tkeout == 1 ) THEN WRITE(nchanl) 'tke ' WRITE(nchanl) ((( tke(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) END IF ! tkeout ! !----------------------------------------------------------------------- ! ! If trbout = 1, write out turbulence parameter, km. ! !----------------------------------------------------------------------- ! IF( trbout == 1 ) THEN WRITE(nchanl) 'kmh ' WRITE(nchanl) ((( kmh(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'kmv ' WRITE(nchanl) ((( kmv(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) END IF ! trbout ! !----------------------------------------------------------------------- ! ! If sfcout = 1, write out the surface variables, tsoil, ! qsoil, and wetcanp. ! !----------------------------------------------------------------------- ! IF( sfcout == 1) THEN IF( nstyp <= 1 ) THEN WRITE(nchanl) 'tsoil ' WRITE(nchanl) (((tsoil(i,j,l,0),i=ist,ind,isk),j=jst,jnd,jsk), & l=lst,lnd,lsk) WRITE(nchanl) 'qsoil ' WRITE(nchanl) (((qsoil(i,j,l,0),i=ist,ind,isk),j=jst,jnd,jsk), & l=lst,lnd,lsk) WRITE(nchanl) 'wetcanp ' WRITE(nchanl) ((wetcanp(i,j,0),i=ist,ind,isk),j=jst,jnd,jsk) ELSE DO is=0,nstyp WRITE(nchanl) 'tsoil ' WRITE(nchanl) (((tsoil(i,j,l,is),i=ist,ind,isk), & j=jst,jnd,jsk),l=lst,lnd,lsk) WRITE(nchanl) 'qsoil ' WRITE(nchanl) (((qsoil(i,j,l,is),i=ist,ind,isk), & j=jst,jnd,jsk),l=lst,lnd,lsk) WRITE(nchanl) 'wetcanp ' WRITE(nchanl) ((wetcanp(i,j,is),i=ist,ind,isk), & j=jst,jnd,jsk) END DO END IF IF(snowout == 1) THEN WRITE(nchanl) 'snowdpth ' WRITE(nchanl) ((snowdpth(i,j),i=ist,ind,isk), & j=jst,jnd,jsk) END IF END IF ! sfcout done ! !----------------------------------------------------------------------- ! ! If radout = 1, write out radiation arrays, radfrc, radsw and ! rnflx. ! !----------------------------------------------------------------------- ! IF( radout == 1 ) THEN WRITE(nchanl) 'radfrc ' WRITE(nchanl) ((( radfrc(i,j,k), & i=ist,ind,isk),j=jst,jnd,jsk),k=kst,knd,ksk) WRITE(nchanl) 'radsw ' WRITE(nchanl) (( radsw(i,j), & i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'rnflx' WRITE(nchanl) (( rnflx(i,j), & i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'radswnet ' WRITE(nchanl) (( radswnet(i,j), & i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'radlwin ' WRITE(nchanl) (( radlwin(i,j), & i=ist,ind,isk),j=jst,jnd,jsk) END IF ! radout ! !----------------------------------------------------------------------- ! ! If flxout = 1, write out surface fluxes ! !----------------------------------------------------------------------- ! IF( flxout == 1 ) THEN WRITE(nchanl) 'usflx ' WRITE(nchanl) (( usflx(i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'vsflx ' WRITE(nchanl) (( vsflx(i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'ptsflx ' WRITE(nchanl) (( ptsflx(i,j),i=ist,ind,isk),j=jst,jnd,jsk) WRITE(nchanl) 'qvsflx ' WRITE(nchanl) (( qvsflx(i,j),i=ist,ind,isk),j=jst,jnd,jsk) END IF ! flxout RETURN ENTRY bdmpdomn(ist1,ind1,jst1,jnd1,kst1,knd1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To set the start and end indicies of the model subdomain ! in which the data is dumped out. ! !----------------------------------------------------------------------- ! ist = ist1 jst = jst1 kst = kst1 ind = ind1 jnd = jnd1 knd = knd1 setdomn = 1 RETURN ENTRY bdmpskip(isk1, jsk1, ksk1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To set data skip parameters for data dump. ! !----------------------------------------------------------------------- ! isk = isk1 jsk = jsk1 ksk = ksk1 setskip = 1 RETURN END SUBROUTINE bn2dump