! !################################################################## !###### ###### !###### SUBROUTINE WRTSOIL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE wrtsoil( nx,ny, nstyps, soiloutfl, dx,dy, & 7,24 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,soiltyp ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write the soil model variables into file soiloutfl. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 04/20/1995 ! ! MODIFICATION HISTORY: ! ! 08/07/1995 (M. Xue) ! Added file name to the argument list. ! ! 2000/03/29 (Gene Bassett) ! Removed the globcst.inc include. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/03/29 (Gene Bassett) ! Added HDF4 format. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/10/27 (Gene Bassett) ! Added soiltyp to soil file to track consistency of soil data. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of model grid points in the x-dir. (east/west) ! ny Number of model grid points in the y-dir. (north/south) ! ! soiloutfl Name of the soil model data output file ! ! tsfcout Flag for output of Temperature at ground surface ! tsoilout Flag for output of Deep soil temperature ! wsfcout Flag for output of Surface soil moisture ! wdpout Flag for output of Deep soil moisture ! wcanpout Flag for output of Canopy water amount ! ! tsfc Temperature at ground surface (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! snowdpth Snow depth (m) ! soiltyp Soil type in model domain ! ! OUTPUT: ! ! ! Output written to the surface data file, soilinfl: ! ! nx Number of model grid points in the x-direction ! ny Number of model grid points in the y-direction ! ! mapproj Type of map projection used to setup the analysis grid. ! trulat1 1st real true latitude of map projection. ! trulat2 2nd real true latitude of map projection. ! trulon Real true longitude of map projection. ! sclfct Map scale factor. At latitude = trulat1 and trulat2 ! ! dx Model grid spacing in the x-direction east-west (meters) ! dy Model grid spacing in the y-direction east-west (meters) ! ctrlat Lat. at the origin of the model grid (deg. N) ! ctrlon Lon. at the origin of the model grid (deg. E) ! ! tsfcout Flag for output of Temperature at ground surface ! tsoilout Flag for output of Deep soil temperature ! wsfcout Flag for output of Surface soil moisture ! wdpout Flag for output of Deep soil moisture ! wcanpout Flag for output of Canopy water amount ! ! tsfc Temperature at ground surface (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! snowdpth Snow depth (m) ! soiltyp Soil type in model domain ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx ! Number of grid points in the x-direction INTEGER :: ny ! Number of grid points in the y-direction INTEGER :: nstyps ! Number of soil types at each grid point CHARACTER (LEN=*) :: soiloutfl ! Name of the output file REAL :: dx REAL :: dy INTEGER :: mapproj ! Map projection REAL :: trulat1 ! 1st real true latitude of map projection REAL :: trulat2 ! 2nd real true latitude of map projection REAL :: trulon ! Real true longitude of map projection REAL :: sclfct ! Map scale factor REAL :: ctrlat ! Center latitude of the model domain (deg. N) REAL :: ctrlon ! Center longitude of the model domain (deg. E) INTEGER :: tsfcout ! Flag for output of tsfc INTEGER :: tsoilout ! Flag for output of tsoil INTEGER :: wsfcout ! Flag for output of wetsfc INTEGER :: wdpout ! Flag for output of wetdp INTEGER :: wcanpout ! Flag for output of wetcanp INTEGER :: stypout ! Flag for output of soiltyp (set to 1 if any of ! the above flags are set) INTEGER :: snowdout ! Flag for output of snowdpth REAL :: tsfc (nx,ny,0:nstyps) ! Temperature at ground surface (K) REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount REAL :: snowdpth(nx,ny) ! Snow depth (m) INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type in model domain ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,is !wdt remove: ! INTEGER :: lenfl INTEGER :: flunit INTEGER :: idummy REAL :: rdummy INTEGER :: ierr !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER :: stat, sd_id ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! idummy = 0 rdummy = 0.0 IF (soildmp == 0) RETURN WRITE (6,'(a,a)') 'WRTSOIL: Opening file ',trim(soiloutfl) IF ( tsfcout+tsoilout+wsfcout+wdpout+wcanpout /= 0 ) THEN stypout = 1 ELSE stypout = 0 END IF !----------------------------------------------------------------------- ! ! Write out in Fortran unformatted. ! !----------------------------------------------------------------------- IF (soildmp == 1) THEN CALL getunit( flunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(soiloutfl, '-F f77 -N ieee', ierr) OPEN (UNIT=flunit, FILE=trim(soiloutfl), & STATUS='unknown', FORM='unformatted', ACCESS='sequential') WRITE (flunit) nx, ny WRITE (flunit) mapproj, tsfcout, tsoilout, wsfcout, wdpout, & wcanpout, 0, snowdout, stypout, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, nstyp WRITE (flunit) dx, dy, ctrlat, ctrlon, trulat1, & trulat2, trulon, sclfct, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy IF ( tsfcout /= 0 ) THEN IF ( nstyp <= 1 ) THEN WRITE (flunit) ((tsfc(i,j,0),i=1,nx),j=1,ny) ELSE !--------------------- A bug fixed by Yunheng ------------ ! DO is=0,nstyp ! WRITE (flunit) ((tsfc(i,j,is),i=1,nx),j=1,ny) ! END DO !--------------------------------------------------------- WRITE (flunit) tsfc END IF END IF IF ( tsoilout /= 0 ) THEN IF ( nstyp <= 1 ) THEN WRITE (flunit) ((tsoil(i,j,0),i=1,nx),j=1,ny) ELSE !--------------------- A bug fixed by Yunheng ------------ ! DO is=0,nstyp ! WRITE (flunit) ((tsoil(i,j,is),i=1,nx),j=1,ny) ! END DO !--------------------------------------------------------- WRITE (flunit) tsoil END IF END IF IF ( wsfcout /= 0 ) THEN IF ( nstyp <= 1 ) THEN WRITE (flunit) ((wetsfc(i,j,0),i=1,nx),j=1,ny) ELSE !--------------------- A bug fixed by Yunheng ------------ ! DO is=0,nstyp ! WRITE (flunit) ((wetsfc(i,j,is),i=1,nx),j=1,ny) ! END DO !--------------------------------------------------------- WRITE (flunit) wetsfc END IF END IF IF ( wdpout /= 0 ) THEN IF ( nstyp <= 1 ) THEN WRITE (flunit) ((wetdp(i,j,0),i=1,nx),j=1,ny) ELSE !--------------------- A bug fixed by Yunheng ------------ ! DO is=0,nstyp ! WRITE (flunit) ((wetdp(i,j,is),i=1,nx),j=1,ny) ! END DO !--------------------------------------------------------- WRITE (flunit) wetdp END IF END IF IF ( wcanpout /= 0 ) THEN IF ( nstyp <= 1 ) THEN WRITE (flunit) ((wetcanp(i,j,0),i=1,nx),j=1,ny) ELSE !--------------------- A bug fixed by Yunheng ------------ ! DO is=0,nstyp ! WRITE (flunit) ((wetcanp(i,j,is),i=1,nx),j=1,ny) ! END DO !--------------------------------------------------------- WRITE (flunit) wetcanp END IF END IF IF ( snowdout /= 0 ) THEN WRITE (flunit) ((snowdpth(i,j),i=1,nx),j=1,ny) END IF IF ( stypout /= 0 ) THEN WRITE (flunit) soiltyp ENDIF CLOSE ( flunit ) CALL retunit ( flunit ) ELSE IF (soildmp == 2) THEN !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block !----------------------------------------------------------------------- ! ! Write out in HDF4. ! !----------------------------------------------------------------------- CALL hdfopen(trim(soiloutfl), 2, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "WRTSOIL: ERROR creating HDF4 file: ", & trim(soiloutfl) RETURN END IF CALL hdfwrti(sd_id, 'nstyp', nstyp, stat) CALL hdfwrti(sd_id, 'nx', nx, stat) CALL hdfwrti(sd_id, 'ny', ny, stat) CALL hdfwrtr(sd_id, 'dx', dx, stat) CALL hdfwrtr(sd_id, 'dy', dy, stat) CALL hdfwrti(sd_id, 'mapproj', mapproj, stat) CALL hdfwrtr(sd_id, 'trulat1', trulat1, stat) CALL hdfwrtr(sd_id, 'trulat2', trulat2, stat) CALL hdfwrtr(sd_id, 'trulon', trulon, stat) CALL hdfwrtr(sd_id, 'sclfct', sclfct, stat) CALL hdfwrtr(sd_id, 'ctrlat', ctrlat, stat) CALL hdfwrtr(sd_id, 'ctrlon', ctrlon, stat) IF ( nstyp == 0 ) nstyp = 1 IF ( tsfcout /= 0 ) THEN CALL hdfwrt3d(tsfc,nx,ny,nstyp+1,sd_id,0,0, & 'tsfc','Surface ground temperature','K', & itmp,atmp1,atmp2) END IF IF ( tsoilout /= 0 ) THEN CALL hdfwrt3d(tsoil,nx,ny,nstyp+1,sd_id,0,0, & 'tsoil','Deep soil temperature','K', & itmp,atmp1,atmp2) END IF IF ( wsfcout /= 0 ) THEN CALL hdfwrt3d(wetsfc,nx,ny,nstyp+1,sd_id,0,0, & 'wetsfc','Surface soil moisture','fraction', & itmp,atmp1,atmp2) END IF IF ( wdpout /= 0 ) THEN CALL hdfwrt3d(wetdp,nx,ny,nstyp+1,sd_id,0,0, & 'wetdp','Deep soil moisture','fraction', & itmp,atmp1,atmp2) END IF IF ( wcanpout /= 0 ) THEN CALL hdfwrt3d(wetcanp,nx,ny,nstyp+1,sd_id,0,0, & 'wetcanp','Canopy water amount','fraction', & itmp,atmp1,atmp2) END IF IF ( snowdout /= 0 ) THEN CALL hdfwrt2d(snowdpth,nx,ny,sd_id,0,0, & 'snowdpth','Snow depth','m',itmp) END IF IF ( stypout /= 0 ) THEN CALL hdfwrt3di(soiltyp,nx,ny,nstyp,sd_id,0,0, & 'soiltyp','Soil type','index') ENDIF ! 200 CONTINUE CALL hdfclose(sd_id,stat) IF (stat /= 0) THEN WRITE (6,*) "WRTSOIL: ERROR on closing file ",trim(soiloutfl), & " (status",stat,")" END IF !wdt end block ! alternate dump format ... END IF RETURN END SUBROUTINE wrtsoil ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READSOIL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE readsoil( nx,ny,nstyps,soilfile,dx,dy, & 6,30 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & tsfcin,tsoilin,wsfcin,wdpin,wcanpin,snowdin, & tsfc,tsoil,wetsfc,wetdp,wetcanp,snowdpth,soiltyp ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read the soil variables from file soilfile. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 04/20/95 ! ! MODIFICATION HISTORY: ! ! 2000/03/29 (Gene Bassett) ! Removed the globcst.inc include. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/03/29 (Gene Bassett) ! Added HDF4 format. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/10/27 (Gene Bassett) ! Added soiltyp to soil file to track consistency of soil data. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of model grid points in the x-dir. (east/west) ! ny Number of model grid points in the y-dir. (north/south) ! ! mapproj Type of map projection used to setup the analysis grid. ! trulat1 1st real true latitude of map projection. ! trulat2 2nd real true latitude of map projection. ! trulon Real true longitude of map projection. ! sclfct Map scale factor. At latitude = trulat1 and trulat2 ! ! dx Model grid spacing in the x-direction east-west (meters) ! dy Model grid spacing in the y-direction east-west (meters) ! ctrlat Lat. at the origin of the model grid (deg. N) ! ctrlon Lon. at the origin of the model grid (deg. E) ! ! OUTPUT: ! ! tsfc Temperature at ground surface (K) ! tsoil Deep soil temperature (K) ! wetsfc Surface soil moisture ! wetdp Deep soil moisture ! wetcanp Canopy water amount ! snowdpth Snow depth (m) ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx ! Number of grid points in the x-direction INTEGER :: ny ! Number of grid points in the y-direction INTEGER :: nstyps ! Number of soil types for each grid point CHARACTER (LEN=*) :: soilfile ! Name of the soil file REAL :: dx REAL :: dy INTEGER :: mapproj ! Map projection REAL :: trulat1 ! 1st real true latitude of map projection REAL :: trulat2 ! 2nd real true latitude of map projection REAL :: trulon ! Real true longitude of map projection REAL :: sclfct ! Map scale factor REAL :: ctrlat ! Center latitude of the model domain (deg. N) REAL :: ctrlon ! Center longitude of the model domain (deg. E) INTEGER :: tsfcin INTEGER :: tsoilin INTEGER :: wsfcin INTEGER :: wdpin INTEGER :: wcanpin INTEGER :: snowdin INTEGER :: snowcin INTEGER :: stypin REAL :: tsfc (nx,ny,0:nstyps) ! Temperature at ground surface (K) REAL :: tsoil (nx,ny,0:nstyps) ! Deep soil temperature (K) REAL :: wetsfc (nx,ny,0:nstyps) ! Surface soil moisture REAL :: wetdp (nx,ny,0:nstyps) ! Deep soil moisture REAL :: wetcanp(nx,ny,0:nstyps) ! Canopy water amount INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type in model domain REAL :: snowdpth(nx,ny) ! Snow depth (m) REAL, ALLOCATABLE :: tsfc_in (:,:,:) ! Temperature at ground surface (K) REAL, ALLOCATABLE :: tsoil_in (:,:,:) ! Deep soil temperature (K) REAL, ALLOCATABLE :: wetsfc_in (:,:,:) ! Surface soil moisture REAL, ALLOCATABLE :: wetdp_in (:,:,:) ! Deep soil moisture REAL, ALLOCATABLE :: wetcanp_in(:,:,:) ! Canopy water amount INTEGER, ALLOCATABLE :: soiltyp_in (:,:,:) ! Soil type in model domain ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: nxin,nyin REAL :: dxin,dyin INTEGER :: mprojin INTEGER :: nstyp1,nstypin REAL :: trlat1in, trlat2in, trlonin, sclfctin REAL :: ctrlonin, ctrlatin INTEGER :: flunit INTEGER :: idummy REAL :: rdummy INTEGER :: i,j,is INTEGER :: istat, ierr INTEGER :: ireturn INTEGER :: itmp1,itmp2 REAL :: rtmp1,rtmp2,rtmp3,rtmp4,rtmp5,rtmp6,rtmp7 CHARACTER (LEN=128) :: savename !Message passing code. !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER :: stat, sd_id ! !----------------------------------------------------------------------- ! ! Include file: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Open the surface data file. Read the parameters first, check if ! the data are consistant with the model. If everything is OK, then ! read the surface data, soiltyp, vegtyp, lai, and roufns. ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN savename(1:128) = soilfile(1:128) WRITE(soilfile, '(a,a,2i2.2)') trim(savename),'_',loc_x,loc_y END IF WRITE (6,*) "READSOIL: reading in external supplied soil data ", & "from file ",trim(soilfile) !----------------------------------------------------------------------- ! ! Read in header information. ! !----------------------------------------------------------------------- IF (soilfmt == 0) THEN !----------------------------------------------------------------------- ! ! Fortran unformatted dump. ! !----------------------------------------------------------------------- CALL getunit( flunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(soilfile, '-F f77 -N ieee', ierr) OPEN (UNIT=flunit,FILE=trim(soilfile),FORM='unformatted', & STATUS='old',IOSTAT=istat) IF( istat /= 0 ) THEN WRITE(6,'(/1x,a,i2,/1x,a/)') & 'Error occured when opening the surface data file ' & //soilfile//' using FORTRAN unit ',flunit, & ' Program stopped in READSOIL.' CALL arpsstop("arpsstop called from READSOIL while opening file",1) END IF WRITE(6,'(/1x,a,/1x,a,i2/)') & 'This run will start from an external supplied soil ', & 'data file '//soilfile//' using FORTRAN unit ',flunit READ (flunit,ERR=998) nxin,nyin READ (flunit,ERR=998) mprojin,tsfcin, tsoilin,wsfcin,wdpin, & wcanpin,snowcin,snowdin,stypin,idummy, & idummy, idummy, idummy, idummy,idummy, & idummy, idummy, idummy, idummy,nstyp1 READ (flunit,ERR=998) dxin,dyin, ctrlatin,ctrlonin,trlat1in, & trlat2in,trlonin,sclfctin,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy ELSE !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block !----------------------------------------------------------------------- ! ! HDF4 format. ! !----------------------------------------------------------------------- CALL hdfopen(trim(soilfile), 1, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "READSOIL: ERROR opening ", & trim(soilfile)," for reading." GO TO 998 END IF CALL hdfrdi(sd_id,"nstyp",nstyp1,istat) CALL hdfrdi(sd_id,"nx",nxin,istat) CALL hdfrdi(sd_id,"ny",nyin,istat) CALL hdfrdr(sd_id,"dx",dxin,istat) CALL hdfrdr(sd_id,"dy",dyin,istat) CALL hdfrdi(sd_id,"mapproj",mprojin,istat) CALL hdfrdr(sd_id,"trulat1",trlat1in,istat) CALL hdfrdr(sd_id,"trulat2",trlat2in,istat) CALL hdfrdr(sd_id,"trulon",trlonin,istat) CALL hdfrdr(sd_id,"sclfct",sclfctin,istat) CALL hdfrdr(sd_id,"ctrlat",ctrlatin,istat) CALL hdfrdr(sd_id,"ctrlon",ctrlonin,istat) !wdt end block ! alternate dump format ... END IF nstyp1 = MAX( nstyp1, 1 ) ALLOCATE (tsfc_in(nx,ny,0:nstyp1),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READSOIL: ERROR allocating tsfc_in, returning" RETURN END IF ALLOCATE (tsoil_in(nx,ny,0:nstyp1),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READSOIL: ERROR allocating tsoil_in, returning" RETURN END IF ALLOCATE (wetsfc_in(nx,ny,0:nstyp1),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READSOIL: ERROR allocating wetsfc_in, returning" RETURN END IF ALLOCATE (wetdp_in(nx,ny,0:nstyp1),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READSOIL: ERROR allocating wetdp_in, returning" RETURN END IF ALLOCATE (wetcanp_in(nx,ny,0:nstyp1),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READSOIL: ERROR allocating wetcanp_in, returning" RETURN END IF ALLOCATE (soiltyp_in(nx,ny,nstyp1),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READSOIL: ERROR allocating soiltyp_in, returning" RETURN END IF !----------------------------------------------------------------------- ! ! Check the data file for consistent grid parameters. ! !----------------------------------------------------------------------- CALL checkgrid2d(nx,ny,nxin,nyin, & dx,dy,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct, & dxin,dyin,ctrlatin,ctrlonin, & mprojin,trlat1in,trlat2in,trlonin,sclfctin,ireturn) IF (ireturn /= 0) THEN WRITE (6,*) "READSOIL: ERROR, grid parameter mismatch" CALL arpsstop("arpsstop called from READSOIL parameter mismatch",1) END IF WRITE (6,'(a,a//a,i1/6(a,e15.8/))') & ' The map projection and griding information for the ', & ' surface data: ', & ' Projection: ', mprojin, & ' The 1st real true latitude: ', trlat1in, & ' The 2nd real true latitude: ', trlat2in, & ' The real true longitude: ', trlonin, & ' Map scale factor: ', sclfctin, & ' Latitude at the origin: ', ctrlatin, & ' Longitude at the origin: ', ctrlonin ! !----------------------------------------------------------------------- ! ! Read in the soil data from the soil data file. ! !----------------------------------------------------------------------- ! IF (soilfmt == 0) THEN ! Fortran unformatted WRITE (6, '(a/a,i2/a,i2/a,i2/a,i2/a,i2/a,i2/a,i2)') & ' Surface data flags for: ', & ' tsfcin --', tsfcin, & ' tsoilin --', tsoilin, & ' wsfcin --', wsfcin, & ' wdpin --', wdpin, & ' wcanpin --', wcanpin, & ' snowdin --', snowdin, & ' stypin --', stypin IF ( tsfcin /= 0 ) THEN WRITE(6,'(a)') 'Read in the surface skin temperature data' !--------------------- A bug fixed by Yunheng ------------ IF ( nstyp <= 1 ) THEN READ (flunit,ERR=998) ((tsfc_in(i,j,0),i=1,nx),j=1,ny) ELSE READ (flunit,ERR=998) tsfc_in END IF !--------------------------------------------------------- ELSE WRITE(6,'(a)') & 'Variable tsfc is not in the data set.' END IF IF ( tsoilin /= 0 ) THEN WRITE(6,'(a)') 'Read in the deep soil temperature data' IF ( nstyp1 == 1 ) THEN READ (flunit,ERR=998) ((tsoil_in(i,j,0),i=1,nx),j=1,ny) ELSE READ (flunit,ERR=998) tsoil_in END IF ELSE WRITE(6,'(a)') & 'Variable tsoil is not in the data set.' END IF IF ( wsfcin /= 0 ) THEN WRITE(6,'(a)') 'Read in the skin soil moisture data' IF ( nstyp1 == 1 ) THEN READ (flunit,ERR=998) ((wetsfc_in(i,j,0),i=1,nx),j=1,ny) ELSE READ (flunit,ERR=998) wetsfc_in END IF ELSE WRITE(6,'(a)') & 'Variable wetsfc is not in the data set.' END IF IF ( wdpin /= 0 ) THEN WRITE(6,'(a)') 'Read in the deep soil moisture data' IF ( nstyp1 == 1 ) THEN READ (flunit,ERR=998) ((wetdp_in(i,j,0),i=1,nx),j=1,ny) ELSE READ (flunit,ERR=998) wetdp_in END IF ELSE WRITE(6,'(a)') & 'Variable wetdp is not in the data set.' END IF IF ( wcanpin /= 0 ) THEN WRITE (6, '(a)') 'Read in the canopy water amount data' IF ( nstyp1 == 1 ) THEN READ (flunit,ERR=998) ((wetcanp_in(i,j,0),i=1,nx),j=1,ny) ELSE READ (flunit,ERR=998) wetcanp_in END IF ELSE WRITE (6, '(a)') & 'Variable wetcanp is not in the data set.' END IF IF ( snowcin /= 0 ) THEN WRITE (6, '(a)') 'File contains snowcvr -- discarding' READ (flunit,ERR=998) END IF IF ( snowdin /= 0 ) THEN WRITE (6, '(a)') 'Read in the snow depth data' READ (flunit,ERR=998) ((snowdpth(i,j),i=1,nx),j=1,ny) ELSE WRITE (6, '(a)') & 'Variable snowdpth is not in the data set.' END IF IF ( stypin /= 0 ) THEN WRITE (6, '(a)') 'Read soil type of soil data' READ (flunit,ERR=998) soiltyp_in END IF CLOSE ( flunit ) CALL retunit ( flunit ) ELSE !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block CALL hdfrd3d(sd_id,"tsfc",nx,ny,nstyp1+1,tsfc_in,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the surface skin temperature data' tsfcin = 1 ELSE WRITE(6,'(a)') 'Variable tsfc is not in the data set.' tsfcin = 0 END IF CALL hdfrd3d(sd_id,"tsoil",nx,ny,nstyp1+1,tsoil_in,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the deep soil temperature data' tsoilin = 1 ELSE WRITE(6,'(a)') 'Variable tsoil is not in the data set.' tsoilin = 0 END IF CALL hdfrd3d(sd_id,"wetsfc",nx,ny,nstyp1+1,wetsfc_in,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the skin soil moisture data' wsfcin = 1 ELSE WRITE(6,'(a)') 'Variable wetsfc is not in the data set.' wsfcin = 0 END IF CALL hdfrd3d(sd_id,"wetdp",nx,ny,nstyp1+1,wetdp_in,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the deep soil moisture data' wdpin = 1 ELSE WRITE(6,'(a)') 'Variable wetdp is not in the data set.' wdpin = 0 END IF CALL hdfrd3d(sd_id,"wetcanp",nx,ny,nstyp1+1,wetcanp_in,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in the canopy water amount data' wcanpin = 1 ELSE WRITE (6, '(a)') 'Variable wetcanp is not in the data set.' wcanpin = 0 END IF CALL hdfrd2d(sd_id,"snowdpth",nx,ny,snowdpth,stat,itmp) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in the snow depth data' snowdin = 1 ELSE WRITE (6, '(a)') 'Variable snowdpth is not in the data set.' snowdin = 0 END IF CALL hdfrd3di(sd_id,"soiltyp",nx,ny,nstyp1,soiltyp_in,stat) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read soil type of soil data' stypin = 1 ELSE WRITE (6, '(a)') 'Soil type of soil data is not in the data set.' stypin = 0 END IF CALL hdfclose(sd_id, stat) !wdt end block ! alternate dump format ... END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block: ! nstypin = MIN(nstyp1, nstyps) ! ! IF (tsfcin == 1) tsfc(:,:,0:nstypin) = tsfc_in(:,:,0:nstypin) ! IF (tsoilin == 1) tsoil(:,:,0:nstypin) = tsoil_in(:,:,0:nstypin) ! IF (wsfcin == 1) wetsfc(:,:,0:nstypin) = wetsfc_in(:,:,0:nstypin) ! IF (wdpin == 1) wetdp(:,:,0:nstypin) = wetdp_in(:,:,0:nstypin) ! IF (wcanpin == 1) wetcanp(:,:,0:nstypin) = wetcanp_in(:,:,0:nstypin) ! ! CALL fix_soil_nstyp(nx,ny,nstyp1,nstyp,tsfc,tsoil, & ! wetsfc,wetdp,wetcanp) IF (stypin == 0) THEN WRITE (6,*) "READSOIL: WARNING, no check made for consistency ", & "between soil types in surface and soil data sets." nstypin = MIN(nstyp1, nstyps) IF (tsfcin == 1) tsfc(:,:,0:nstypin) = tsfc_in(:,:,0:nstypin) IF (tsoilin == 1) tsoil(:,:,0:nstypin) = tsoil_in(:,:,0:nstypin) IF (wsfcin == 1) wetsfc(:,:,0:nstypin) = wetsfc_in(:,:,0:nstypin) IF (wdpin == 1) wetdp(:,:,0:nstypin) = wetdp_in(:,:,0:nstypin) IF (wcanpin == 1) wetcanp(:,:,0:nstypin) = wetcanp_in(:,:,0:nstypin) CALL fix_soil_nstyp(nx,ny,nstyp1,nstyp,tsfc,tsoil, & wetsfc,wetdp,wetcanp) ELSE IF (nstyp1 == 1) THEN tsfc_in (:,:,1) = tsfc_in (:,:,0) tsoil_in (:,:,1) = tsoil_in (:,:,0) wetsfc_in (:,:,1) = wetsfc_in (:,:,0) wetdp_in (:,:,1) = wetdp_in (:,:,0) wetcanp_in(:,:,1) = wetcanp_in(:,:,0) ENDIF CALL remap_soil_vars(nx,ny,nstyp1,nstyp, & tsfc_in,tsoil_in,wetsfc_in,wetdp_in,wetcanp_in,soiltyp_in, & tsfcin,tsoilin,wsfcin,wdpin,wcanpin, & tsfc,tsoil,wetsfc,wetdp,wetcanp,soiltyp) ENDIF !wdt end block IF (mp_opt > 0) soilfile(1:128) = savename(1:128) DEALLOCATE (tsfc_in,stat=istat) DEALLOCATE (tsoil_in,stat=istat) DEALLOCATE (wetsfc_in,stat=istat) DEALLOCATE (wetdp_in,stat=istat) DEALLOCATE (wetcanp_in,stat=istat) DEALLOCATE (soiltyp_in,stat=istat) ! Correct only for flint, otherwise flint will never end ! RETURN GO TO 999 998 WRITE (6,'(/a,i2/a)') & ' Read error in surface data file ' & //soilfile//' with the I/O unit ',flunit, & 'The model will STOP in subroutine READSOIL.' CALL arpsstop("arpsstop called from READSOIL reading surface data",1) 999 CONTINUE RETURN END SUBROUTINE readsoil ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE WRTSFCDT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE wrtsfcdt( nx,ny,nstyps, sfcoutfl, dx,dy, & 4,24 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & stypout,vtypout,laiout,rfnsout,vegout,ndviout, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write a surface property data . ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 2/20/94 ! ! MODIFICATION HISTORY: ! ! 2000/03/29 (Gene Bassett) ! Removed the globcst.inc include. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/03/29 (Gene Bassett) ! Added HDF4 format. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of model grid points in the x-dir. (east/west) ! ny Number of model grid points in the y-dir. (north/south) ! sfcoutfl Name of the output surface property data file ! ! soiltyp Soil type in model domain ! vegtyp Vegetation type in model domain ! lai Leaf Area Index in model domain ! roufns Surface roughness ! veg Vegetation fraction ! ndvi NDVI ! ! OUTPUT: ! ! Output written to the surface data file, sfcdtfl: ! ! nx Number of model grid points in the x-direction ! ny Number of model grid points in the y-direction ! ! mapproj Type of map projection used to setup the analysis grid. ! trulat1 1st real true latitude of map projection. ! trulat2 2nd real true latitude of map projection. ! trulon Real true longitude of map projection. ! sclfct Map scale factor. At latitude = trulat1 and trulat2 ! ! dx Model grid spacing in the x-direction east-west (meters) ! dy Model grid spacing in the y-direction east-west (meters) ! ctrlat Lat. at the origin of the model grid (deg. N) ! ctrlon Lon. at the origin of the model grid (deg. E) ! ! stypout Flag for output of soil type ! vtypout Flag for output of vegetation type ! laiout Flag for output of Leaf Area Index ! rfnsout Flag for output of surface roughness ! vegout Flag for output of vegetation fraction ! ndviout Flag for output of NDVI ! ! soiltyp Soil type in model domain ! stypfrct Fraction of each soil type in each grid box ! vegtyp Vegetation type in model domain ! lai Leaf Area Index in model domain ! roufns Surface roughness ! veg Vegetation fraction ! ndvi NDVI ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: nx ! Number of grid points in the x-direction INTEGER :: ny ! Number of grid points in the y-direction INTEGER :: nstyps ! Max number of soil types in a grid box CHARACTER (LEN=* ) :: sfcoutfl ! Surface property data file name REAL :: dx REAL :: dy INTEGER :: mapproj ! Map projection REAL :: trulat1 ! 1st real true latitude of map projection REAL :: trulat2 ! 2nd real true latitude of map projection REAL :: trulon ! Real true longitude of map projection REAL :: sclfct ! Map scale factor REAL :: ctrlat ! Center latitude of the model domain (deg. N) REAL :: ctrlon ! Center longitude of the model domain (deg. E) INTEGER :: stypout ! Flag for output of soiltyp INTEGER :: vtypout ! Flag for output of vegtyp INTEGER :: laiout ! Flag for output of lai INTEGER :: rfnsout ! Flag for output of roufns INTEGER :: vegout ! Flag for output of veg INTEGER :: ndviout ! Flag for output of ndvi INTEGER :: soiltyp (nx,ny,nstyps) ! Soil type in model domain REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type in model domain REAL :: lai (nx,ny) ! Leaf Area Index in model domain REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: ndvi (nx,ny) ! NDVI ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! !wdt remove: ! INTEGER :: lenfl INTEGER :: flunit INTEGER :: idummy REAL :: rdummy INTEGER :: ierr INTEGER :: i,j,is !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER :: stat, sd_id ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! idummy = 0 rdummy = 0.0 IF (sfcdmp == 0) RETURN WRITE (6,'(a,a)') 'WRTSFCDT: Opening file ',trim(sfcoutfl) !----------------------------------------------------------------------- ! ! Write out in Fortran unformatted. ! !----------------------------------------------------------------------- IF (sfcdmp == 1) THEN CALL getunit( flunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(sfcoutfl, '-F f77 -N ieee', ierr) OPEN (UNIT = flunit, FILE = trim(sfcoutfl), & STATUS = 'unknown', & FORM = 'unformatted', ACCESS = 'sequential') WRITE (flunit) nx, ny WRITE (flunit) mapproj, stypout, vtypout, laiout, rfnsout, & vegout, ndviout, nstyp, idummy, idummy, & idummy, idummy, idummy, idummy, idummy, & idummy, idummy, idummy, idummy, idummy WRITE (flunit) dx, dy, ctrlat, ctrlon, trulat1, & trulat2, trulon, sclfct, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy, & rdummy, rdummy, rdummy, rdummy, rdummy IF ( stypout /= 0 ) THEN IF ( nstyp <= 1 ) THEN WRITE (flunit) ((soiltyp(i,j,1),i=1,nx),j=1,ny) ELSE DO is=1,nstyp WRITE (flunit) ((soiltyp (i,j,is),i=1,nx),j=1,ny) WRITE (flunit) ((stypfrct(i,j,is),i=1,nx),j=1,ny) END DO END IF END IF IF ( vtypout /= 0 ) WRITE (flunit) vegtyp IF ( laiout /= 0 ) WRITE (flunit) lai IF ( rfnsout /= 0 ) WRITE (flunit) roufns IF ( vegout /= 0 ) WRITE (flunit) veg IF ( ndviout /= 0 ) WRITE (flunit) ndvi CLOSE ( flunit ) CALL retunit ( flunit ) ELSE IF (sfcdmp == 2) THEN !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block !----------------------------------------------------------------------- ! ! Write out in HDF4. ! !----------------------------------------------------------------------- CALL hdfopen(trim(sfcoutfl), 2, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "WRTSFCDT: ERROR creating HDF4 file: ", & trim(sfcoutfl) RETURN END IF ! Make sure nstyp & stypfrct are valid for one soil type IF (nstyp == 0) nstyp = 1 IF (nstyp == 1) stypfrct = 1 CALL hdfwrti(sd_id, 'nstyp', nstyp, stat) CALL hdfwrti(sd_id, 'nx', nx, stat) CALL hdfwrti(sd_id, 'ny', ny, stat) CALL hdfwrtr(sd_id, 'dx', dx, stat) CALL hdfwrtr(sd_id, 'dy', dy, stat) CALL hdfwrti(sd_id, 'mapproj', mapproj, stat) CALL hdfwrtr(sd_id, 'trulat1', trulat1, stat) CALL hdfwrtr(sd_id, 'trulat2', trulat2, stat) CALL hdfwrtr(sd_id, 'trulon', trulon, stat) CALL hdfwrtr(sd_id, 'sclfct', sclfct, stat) CALL hdfwrtr(sd_id, 'ctrlat', ctrlat, stat) CALL hdfwrtr(sd_id, 'ctrlon', ctrlon, stat) IF ( stypout /= 0 ) THEN CALL hdfwrt3di(soiltyp,nx,ny,nstyp,sd_id,0,0, & 'soiltyp','Soil type','index') CALL hdfwrt3d(stypfrct,nx,ny,nstyp,sd_id,0,0, & 'stypfrct','Soil type fractional coverage','fraction', & itmp,atmp1,atmp2) END IF IF ( vtypout /= 0 ) CALL hdfwrt2di(vegtyp,nx,ny,sd_id,0,0, & 'vegtyp','Vegetation type','index') IF ( laiout /= 0 ) CALL hdfwrt2d(lai,nx,ny,sd_id,0,0, & 'lai','Leaf Area Index','index',itmp) IF ( rfnsout /= 0 ) CALL hdfwrt2d(roufns,nx,ny,sd_id,0,0, & 'roufns','Surface roughness','0-1',itmp) IF ( vegout /= 0 ) CALL hdfwrt2d(veg,nx,ny,sd_id,0,0, & 'veg','Vegetation fraction','fraction',itmp) !wdt update IF ( ndviout /= 0 ) CALL hdfwrt2d(ndvi,nx,ny,sd_id,0,0, & 'ndvi','Normalized differential vegetation index','index',itmp) CALL hdfclose(sd_id,stat) IF (stat /= 0) THEN WRITE (6,*) "WRTSFCDT: ERROR on closing file ",trim(sfcoutfl), & " (status",stat,")" END IF !wdt end block ! alternate dump format ... END IF RETURN END SUBROUTINE wrtsfcdt ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READSFCDT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE readsfcdt( nx,ny,nstyps,sfcfile,dx,dy, & 3,29 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read the surface data sets from file sfcfile. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 5/3/94 ! ! MODIFICATION HISTORY: ! ! 02/07/1995 (Yuhe Liu) ! Added a new 2-D array, veg(nx,ny), to the soil and vegetation data ! set file. ! ! 2000/03/29 (Gene Bassett) ! Removed the globcst.inc include. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/03/29 (Gene Bassett) ! Added HDF4 format. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of model grid points in the x-dir. (east/west) ! ny Number of model grid points in the y-dir. (north/south) ! ! mapproj Type of map projection used to setup the analysis grid. ! trulat1 1st real true latitude of map projection. ! trulat2 2nd real true latitude of map projection. ! trulon Real true longitude of map projection. ! sclfct Map scale factor. At latitude = trulat1 and trulat2 ! ! dx Model grid spacing in the x-direction east-west (meters) ! dy Model grid spacing in the y-direction east-west (meters) ! ctrlat Lat. at the origin of the model grid (deg. N) ! ctrlon Lon. at the origin of the model grid (deg. E) ! ! OUTPUT: ! ! soiltyp Soil type in model domain ! vegtyp Vegetation type in model domain ! lai Leaf Area Index in model domain ! roufns Surface roughness ! veg Vegetation fraction ! ndvi NDVI ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx ! Number of grid points in the x-direction INTEGER :: ny ! Number of grid points in the y-direction INTEGER :: nstyps ! Max number of soil types in a grid box CHARACTER (LEN=*) :: sfcfile ! Name of the surface data file REAL :: dx REAL :: dy INTEGER :: mapproj ! Map projection REAL :: trulat1 ! 1st real true latitude of map projection REAL :: trulat2 ! 2nd real true latitude of map projection REAL :: trulon ! Real true longitude of map projection REAL :: sclfct ! Map scale factor REAL :: ctrlat ! Center latitude of the model domain (deg. N) REAL :: ctrlon ! Center longitude of the model domain (deg. E) INTEGER :: soiltyp(nx,ny,nstyps) ! Soil type in model domain REAL :: stypfrct(nx,ny,nstyps) ! Fraction of soil types INTEGER :: vegtyp (nx,ny) ! Vegetation type in model domain REAL :: lai (nx,ny) ! Leaf Area Index in model domain REAL :: roufns (nx,ny) ! NDVI in model domain REAL :: veg (nx,ny) ! Vegetation fraction REAL :: ndvi (nx,ny) ! NDVI ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: nxin,nyin REAL :: dxin,dyin INTEGER :: mprojin INTEGER :: nstyp1, nstypin REAL :: trlat1in, trlat2in, trlonin, sclfctin REAL :: ctrlonin, ctrlatin INTEGER :: stypin,vtypin,laiin,roufin,vegin,ndviin INTEGER :: idummy REAL :: rdummy INTEGER :: istat, ierr,i,j,is INTEGER :: ireturn INTEGER :: itmp1,itmp2 REAL :: rtmp1,rtmp2,rtmp3,rtmp4,rtmp5,rtmp6,rtmp7 CHARACTER (LEN=128) :: savename !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER :: stat, sd_id ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Open the surface data file. Read the parameters first, check if ! the data are consistant with the model. If everything is OK, then ! read the surface data, soiltyp, vegtyp, lai, roufns, veg, and ! ndvi. ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN savename(1:128) = sfcfile(1:128) WRITE(sfcfile, '(a,a,2i2.2)') trim(savename),'_',loc_x,loc_y END IF WRITE (6,*) "READSFCDT: reading in external supplied surface", & "data from file ",trim(sfcfile) !----------------------------------------------------------------------- ! ! Read in header information. ! !----------------------------------------------------------------------- IF (sfcfmt == 0) THEN !----------------------------------------------------------------------- ! ! Fortran unformatted dump. ! !----------------------------------------------------------------------- CALL getunit( sfcunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(sfcfile, '-F f77 -N ieee', ierr) OPEN(UNIT=sfcunit,FILE=trim(sfcfile),FORM='unformatted', & STATUS='old',IOSTAT=istat) IF( istat /= 0 ) THEN WRITE(6,'(/1x,a,i2,/1x,a/)') & 'Error occured when opening the surface data file ' & //sfcfile//' using FORTRAN unit ',sfcunit, & ' Program stopped in READSFCDT.' CALL arpsstop("arpsstop called from READSFCDT opening file",1) END IF WRITE(6,'(/1x,a,/1x,a,i2/)') & 'This run will start from an external supplied surface ', & 'data file '//sfcfile//' using FORTRAN unit ',sfcunit READ (sfcunit,ERR=998) nxin,nyin READ (sfcunit,ERR=998) mprojin,stypin,vtypin,laiin,roufin, & vegin, ndviin,nstyp1,idummy,idummy, & idummy, idummy,idummy,idummy,idummy, & idummy, idummy,idummy,idummy,idummy READ (sfcunit,ERR=998) dxin,dyin, ctrlatin,ctrlonin,trlat1in, & trlat2in,trlonin,sclfctin,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy ELSE !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block !----------------------------------------------------------------------- ! ! HDF4 format. ! !----------------------------------------------------------------------- CALL hdfopen(trim(sfcfile), 1, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "READSFCDT: ERROR opening ", & trim(sfcfile)," for reading." GO TO 998 END IF CALL hdfrdi(sd_id,"nstyp",nstyp1,istat) CALL hdfrdi(sd_id,"nx",nxin,istat) CALL hdfrdi(sd_id,"ny",nyin,istat) CALL hdfrdr(sd_id,"dx",dxin,istat) CALL hdfrdr(sd_id,"dy",dyin,istat) CALL hdfrdi(sd_id,"mapproj",mprojin,istat) CALL hdfrdr(sd_id,"trulat1",trlat1in,istat) CALL hdfrdr(sd_id,"trulat2",trlat2in,istat) CALL hdfrdr(sd_id,"trulon",trlonin,istat) CALL hdfrdr(sd_id,"sclfct",sclfctin,istat) CALL hdfrdr(sd_id,"ctrlat",ctrlatin,istat) CALL hdfrdr(sd_id,"ctrlon",ctrlonin,istat) !wdt end block ! alternate dump format ... END IF nstyp1 = MAX( nstyp1, 1 ) !----------------------------------------------------------------------- ! ! Check the data file for consistent grid parameters. ! !----------------------------------------------------------------------- CALL checkgrid2d(nx,ny,nxin,nyin, & dx,dy,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct, & dxin,dyin,ctrlatin,ctrlonin, & mprojin,trlat1in,trlat2in,trlonin,sclfctin,ireturn) IF (ireturn /= 0) THEN WRITE (6,*) "READSFCDT: ERROR, grid parameter mismatch" CALL arpsstop("arpsstop called from READSFCDT grid param. mismatch",1) END IF WRITE (6,'(a,a//a,i1/6(a,e15.8/))') & ' The map projection and griding information for the ', & ' surface data: ', & ' Projection: ', mprojin, & ' The 1st real true latitude: ', trlat1in, & ' The 2nd real true latitude: ', trlat2in, & ' The real true longitude: ', trlonin, & ' Map scale factor: ', sclfctin, & ' Latitude at the origin: ', ctrlatin, & ' Longitude at the origin: ', ctrlonin !----------------------------------------------------------------------- ! ! Read in the surface data from the surface data file. ! !----------------------------------------------------------------------- IF (sfcfmt == 0) THEN ! Fortran unformatted WRITE (6, '(a/a,i2/a,i2/a,i2/a,i2/a,i2/a,i2)') & ' Surface data flags for: ', & ' soiltyp --', stypin, & ' vegtyp --', vtypin, & ' lai --', laiin, & ' roufns --', roufin, & ' veg --', vegin, & ' ndvi --', ndviin WRITE (6, '(a/a,i2)') & ' Number of soil types in each grid box:', & ' nstyp --', nstyp IF(stypin == 1) THEN IF ( nstyp1 == 1 ) THEN WRITE (6, '(a)') 'Read in the soil type data' READ (sfcunit,ERR=998) ((soiltyp(i,j,1),i=1,nx),j=1,ny) DO j=1,ny DO i=1,nx stypfrct(i,j,1) = 1.0 END DO END DO ELSE DO is=1,nstyp1 IF (is <= nstyps) THEN WRITE (6, '(a)') 'Read in the soil type data' READ (sfcunit,ERR=998) ((soiltyp(i,j,is),i=1,nx),j=1,ny) WRITE (6, '(a)') 'Read in the fraction of soil types' READ (sfcunit,ERR=998) ((stypfrct(i,j,is),i=1,nx),j=1,ny) ELSE READ (sfcunit,ERR=998) READ (sfcunit,ERR=998) ENDIF END DO END IF END IF IF(vtypin == 1) THEN WRITE (6, '(a)') 'Read in the vegetation type data' READ (sfcunit,ERR=998) vegtyp END IF IF(laiin == 1) THEN WRITE (6, '(a)') 'Read in the Leaf Area Index data' READ (sfcunit,ERR=998) lai END IF IF(roufin == 1) THEN WRITE (6, '(a)') 'Read in the surface roughness data' READ (sfcunit,ERR=998) roufns END IF IF(vegin == 1) THEN WRITE (6, '(a)') 'Read in the vegetatin fraction data' READ (sfcunit,ERR=998) veg END IF IF (ndviin == 1) THEN WRITE (6, '(a)') 'Read in the NDVI data' READ (sfcunit,ERR=998) ndvi END IF CLOSE ( sfcunit ) CALL retunit ( sfcunit ) ELSE !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block nstypin = MIN(nstyp1, nstyps) CALL hdfrd3di(sd_id,"soiltyp",nx,ny,nstypin,soiltyp,stat) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in soiltyp' stypin = 1 ELSE WRITE (6, '(a)') 'Variable soiltyp is not in the data set.' stypin = 0 END IF CALL hdfrd3d(sd_id,"stypfrct",nx,ny,nstypin, & stypfrct,stat,itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in stypfrct' ELSE WRITE (6, '(a)') 'Variable stypfrct is not in the data set.' stypfrct(:,:,1) = 1. stypfrct(:,:,2:nstypin) = 0. END IF CALL hdfrd2di(sd_id,"vegtyp",nx,ny,vegtyp,stat) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in vegtyp' vtypin = 1 ELSE WRITE (6, '(a)') 'Variable vegtyp is not in the data set.' vtypin = 0 END IF CALL hdfrd2d(sd_id,"lai",nx,ny,lai,stat,itmp) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in lai' laiin = 1 ELSE WRITE (6, '(a)') 'Variable lai is not in the data set.' laiin = 0 END IF CALL hdfrd2d(sd_id,"roufns",nx,ny,roufns,stat,itmp) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in roufns' roufin = 1 ELSE WRITE (6, '(a)') 'Variable roufns is not in the data set.' roufin = 0 END IF CALL hdfrd2d(sd_id,"veg",nx,ny,veg,stat,itmp) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in veg' vegin = 1 ELSE WRITE (6, '(a)') 'Variable veg is not in the data set.' vegin = 0 END IF CALL hdfrd2d(sd_id,"ndvi",nx,ny,ndvi,stat,itmp) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE (6, '(a)') 'Read in ndvi' ndviin = 1 ELSE WRITE (6, '(a)') 'Variable ndvi is not in the data set.' ndviin = 0 END IF CALL hdfclose(sd_id, stat) !wdt end block ! alternate dump format ... END IF CALL fix_stypfrct_nstyp(nx,ny,nstyp1,nstyp,stypfrct) IF(stypin == 0) THEN WRITE(6,'(/1x,a,a)') & 'Soil type data not present in the surface propery ', & 'data file, set it to styp.' DO i=1,nx DO j=1,ny soiltyp(i,j,1) = styp END DO END DO END IF IF(vtypin == 0) THEN WRITE(6,'(/1x,a,a)') & 'Vegetation type data not present in the surface propery ', & 'data file, set it to vtyp.' DO i=1,nx-1 DO j=1,ny-1 vegtyp(i,j) = vtyp END DO END DO END IF IF(laiin == 0) THEN WRITE(6,'(/1x,a,a)') & 'Leaf Area Index data not present in the surface propery ', & 'data file, set it to lai0.' DO i=1,nx-1 DO j=1,ny-1 lai(i,j) = lai0 END DO END DO END IF IF(roufin == 0) THEN WRITE(6,'(/1x,a,a)') & 'Roughness data not present in the surface propery ', & 'data file, set it to roufns0.' DO i=1,nx-1 DO j=1,ny-1 roufns(i,j) = roufns0 END DO END DO END IF IF(vegin == 0) THEN WRITE(6,'(/1x,a,a)') & 'Vegetation fraction not present in the surface propery ', & 'data file, set it to veg0.' DO i=1,nx-1 DO j=1,ny-1 veg(i,j) = veg0 END DO END DO END IF IF (mp_opt > 0) sfcfile(1:128) = savename(1:128) RETURN 998 WRITE (6,'(/a,i2/a)') & 'READSFCDT: Read error in surface data file ' & //sfcfile//' with the I/O unit ',sfcunit, & 'The model will STOP in subroutine READSFCDT.' CALL arpsstop("arpsstop called from READSFCDT reading sfc file",1) END SUBROUTINE readsfcdt ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE WRITTRN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE writtrn(nx,ny,ternfn,dx,dy, & 5,17 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & hterain) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write out a terrain data file to be used by ARPS. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 5/1/1995. ! ! MODIFICATION HISTORY: ! ! 2000/03/29 (Gene Bassett) ! Removed the globcst.inc include. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/03/29 (Gene Bassett) ! Added HDF4 format. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! ! mapproj Type of map projection used to setup the analysis grid. ! trulat1 1st real true latitude of map projection. ! trulat2 2nd real true latitude of map projection. ! trulon Real true longitude of map projection. ! sclfct Map scale factor. At latitude = trulat1 and trulat2 ! ! dx Model grid spacing in the x-direction east-west (meters) ! dy Model grid spacing in the y-direction east-west (meters) ! ctrlat Lat. at the origin of the model grid (deg. N) ! ctrlon Lon. at the origin of the model grid (deg. E) ! ! ternfn Terrain data file name ! hterain Terrain height (m) ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny CHARACTER (LEN=*) :: ternfn REAL :: dx REAL :: dy INTEGER :: mapproj ! Map projection REAL :: trulat1 ! 1st real true latitude of map projection REAL :: trulat2 ! 2nd real true latitude of map projection REAL :: trulon ! Real true longitude of map projection REAL :: sclfct ! Map scale factor REAL :: ctrlat ! Center latitude of the model domain (deg. N) REAL :: ctrlon ! Center longitude of the model domain (deg. E) REAL :: hterain(nx,ny) ! The height of terrain. !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- INTEGER :: idummy, ierr, nunit REAL :: rdummy !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER :: stat, sd_id ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! IF (terndmp == 0) RETURN WRITE (6,*) 'WRITTRN: Opening Terrain file ',ternfn !----------------------------------------------------------------------- ! ! Write out in Fortran unformatted. ! !----------------------------------------------------------------------- IF (terndmp == 1) THEN CALL getunit( nunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(ternfn, '-F f77 -N ieee', ierr) OPEN(nunit,FILE=trim(ternfn),FORM='unformatted', & STATUS='unknown') WRITE(nunit) nx,ny idummy = 0 rdummy = 0.0 WRITE(nunit) idummy,mapproj,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy WRITE(nunit) dx ,dy ,ctrlat,ctrlon,rdummy , & rdummy,trulat1,trulat2,trulon,sclfct, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy WRITE(nunit) hterain CLOSE(nunit) ELSE IF (terndmp == 2) THEN !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block !----------------------------------------------------------------------- ! ! Write out in HDF4. ! !----------------------------------------------------------------------- CALL hdfopen(trim(ternfn), 2, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "WRTTRN: ERROR creating HDF4 file: ", & trim(ternfn) RETURN END IF CALL hdfwrti(sd_id, 'nx', nx, stat) CALL hdfwrti(sd_id, 'ny', ny, stat) CALL hdfwrtr(sd_id, 'dx', dx, stat) CALL hdfwrtr(sd_id, 'dy', dy, stat) CALL hdfwrti(sd_id, 'mapproj', mapproj, stat) CALL hdfwrtr(sd_id, 'trulat1', trulat1, stat) CALL hdfwrtr(sd_id, 'trulat2', trulat2, stat) CALL hdfwrtr(sd_id, 'trulon', trulon, stat) CALL hdfwrtr(sd_id, 'sclfct', sclfct, stat) CALL hdfwrtr(sd_id, 'ctrlat', ctrlat, stat) CALL hdfwrtr(sd_id, 'ctrlon', ctrlon, stat) CALL hdfwrt2d(hterain,nx,ny,sd_id,0,0, & 'hterain','Terrain Height','m',itmp) ! 200 CONTINUE CALL hdfclose(sd_id,stat) IF (stat /= 0) THEN WRITE (6,*) "WRITTRN: ERROR on closing file ",trim(ternfn), & " (status",stat,")" END IF !wdt end block ! alternate dump format ... END IF RETURN END SUBROUTINE writtrn ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READTRN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE readtrn(nx,ny, dx,dy, ternfile, & 2,22 mapproj,trulat1,trulat2,trulon,sclfct, & ctrlat,ctrlon,hterain ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read the terrain data into model array hterain from a specified ! terrain data file. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 2/27/1994. ! ! MODIFICATION HISTORY: ! ! 9/10/94 (Weygandt & Y. Lu) ! Cleaned up documentation. ! ! 2000/03/29 (Gene Bassett) ! Removed the globcst.inc include. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/03/29 (Gene Bassett) ! Added HDF4 format. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! dx Grid interval in x-direction ! dy Grid interval in y-direction ! ! ternfile Terrain data file name ! ! mapproj Type of map projection used to setup the analysis grid. ! trulat1 1st real true latitude of map projection. ! trulat2 2nd real true latitude of map projection. ! trulon Real true longitude of map projection. ! sclfct Map scale factor. At latitude = trulat1 and trulat2 ! ! ctrlat Lat. at the origin of the model grid (deg. N) ! ctrlon Lon. at the origin of the model grid (deg. E) ! ! OUTPUT: ! ! hterain Terrain height (m) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx ! Number of grid points in the x-direction INTEGER :: ny ! Number of grid points in the y-direction REAL :: dx ! Grid interval in x-direction REAL :: dy ! Grid interval in y-direction CHARACTER (LEN=*) :: ternfile ! Terrain data file name INTEGER :: mapproj ! Map projection REAL :: trulat1 ! 1st real true latitude of map projection REAL :: trulat2 ! 2nd real true latitude of map projection REAL :: trulon ! Real true longitude of map projection REAL :: sclfct ! Map scale factor REAL :: ctrlat ! Center latitude of the model domain (deg. N) REAL :: ctrlon ! Center longitude of the model domain (deg. E) REAL :: hterain(nx,ny) ! Terrain height. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: inunit,istat INTEGER :: nxin,nyin,idummy,ierr REAL :: dxin,dyin,rdummy,amin,amax INTEGER :: ireturn INTEGER :: itmp1,itmp2 REAL :: rtmp1,rtmp2,rtmp3,rtmp4,rtmp5,rtmp6,rtmp7 REAL :: ctrlatin,ctrlonin, & trulat1in,trulat2in,trulonin,sclfctin INTEGER :: mapprojin CHARACTER (LEN=128) :: savename !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER :: stat, sd_id !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Read in the terrain data. ! !----------------------------------------------------------------------- ! IF (mp_opt > 0) THEN savename(1:128) = ternfile(1:128) WRITE(ternfile, '(a,a,2i2.2)') trim(savename),'_',loc_x,loc_y END IF WRITE (6,*) "READTRN: reading in external supplied terrain ", & "data from file ",trim(ternfile) !----------------------------------------------------------------------- ! ! Read in header information. ! !----------------------------------------------------------------------- IF (ternfmt == 0) THEN CALL getunit( inunit ) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(ternfile, '-F f77 -N ieee', ierr) OPEN(UNIT=inunit,FILE=trim(ternfile),FORM='unformatted', & STATUS='old',IOSTAT=istat) IF( istat /= 0) THEN WRITE(6,'(/1x,a,a,/1x,a/)') & 'Error occured when opening terrain data file ', & ternfile,' Job stopped in READTRN.' CALL arpsstop("arpsstop called from READTRN reading terrain file",1) END IF READ(inunit,ERR=999) nxin,nyin READ(inunit,ERR=999) idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy READ(inunit,ERR=999) dxin ,dyin ,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy ELSE !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt begin block CALL hdfopen(trim(ternfile), 1, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "READTRN: ERROR opening ", & trim(ternfile)," for reading." GO TO 999 END IF CALL hdfrdi(sd_id,"nx",nxin,istat) CALL hdfrdi(sd_id,"ny",nyin,istat) CALL hdfrdr(sd_id,"dx",dxin,istat) CALL hdfrdr(sd_id,"dy",dyin,istat) CALL hdfrdi(sd_id,"mapproj",mapprojin,istat) CALL hdfrdr(sd_id,"trulat1",trulat1in,istat) CALL hdfrdr(sd_id,"trulat2",trulat2in,istat) CALL hdfrdr(sd_id,"trulon",trulonin,istat) CALL hdfrdr(sd_id,"sclfct",sclfctin,istat) CALL hdfrdr(sd_id,"ctrlat",ctrlatin,istat) CALL hdfrdr(sd_id,"ctrlon",ctrlonin,istat) !wdt end block ! alternate dump format ... END IF IF (ternfmt == 0) THEN WRITE (6,*) & "READTRN: WARNING, not checking map projection parameters" CALL checkgrid2d(nx,ny,nxin,nyin, & dx,dy,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct, & dxin,dyin,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct,ireturn) ELSE CALL checkgrid2d(nx,ny,nxin,nyin, & dx,dy,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct, & dxin,dyin,ctrlatin,ctrlonin, & mapprojin,trulat1in,trulat2in,trulonin,sclfctin,ireturn) END IF IF (ireturn /= 0) THEN WRITE (6,*) "READTRN: ERROR, grid parameter mismatch" CALL arpsstop("arpsstop called from READTRN parameter mismatch",1) END IF IF (ternfmt == 0) THEN READ(inunit,ERR=999) hterain CALL retunit( inunit ) CLOSE (UNIT=inunit) ELSE !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. CALL hdfrd2d(sd_id,"hterain",nx,ny,hterain,stat,itmp) END IF WRITE(6,'(1x,a/)') 'Minimum and maximum terrain height:' CALL a3dmax0(hterain,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'htrnmin = ', amin,', htrnmax=',amax IF (mp_opt > 0) ternfile(1:128) = savename(1:128) RETURN 999 WRITE(6,'(1x,a)') & 'Error in reading terrain data. Job stopped in READTRN.' CALL arpsstop("arpsstop called from READTRN reading file",1) END SUBROUTINE readtrn ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE WRITESND ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE writesnd(nx,ny,nz, & 1,2 ubar,vbar,ptbar,pbar,qvbar, & zp, rhobar, zs) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Print the base state sounding profile at the center of the domain. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 3/17/1991. ! ! MODIFICATION HISTORY: ! ! 5/1/98 (G. Bassett, D. Weber) ! Moved from inibase. ! !----------------------------------------------------------------------- ! ! 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 ! ! OUTPUT: ! ! 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) ! qvbar Base state water vapor specific humidity (kg/kg) ! ! zp Vertical coordinate of grid points in physical space(m) ! ! rhobar Base state air density (kg/m**3) ! zs Physical coordinate height at scalar point (m) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! The number of grid points in 3 ! directions REAL :: ubar (nx,ny,nz) ! Base state u-velocity (m/s) REAL :: vbar (nx,ny,nz) ! Base state v-velocity (m/s) REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K) REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal). REAL :: qvbar (nx,ny,nz) ! Base state water specific humidity ! (kg/kg). REAL :: zp (nx,ny,nz) ! Physical height coordinate defined at ! w-point of staggered grid. REAL :: rhobar(nx,ny,nz) ! Base state air density (kg/m**3) REAL :: zs (nx,ny,nz) ! Physical coordinate height at scalar ! point (m) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k, istat, nunit, itrnmin, jtrnmin REAL :: ternmin ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF(myproc == 0) THEN ternmin = zp(1,1,2) itrnmin = 1 jtrnmin = 1 DO j=1,ny-1 DO i=1,nx-1 IF(zp(i,j,2) < ternmin) THEN ternmin = zp(i,j,2) itrnmin = i jtrnmin = j END IF END DO END DO i = itrnmin j = jtrnmin WRITE(6,'(/a,i4,a,i4/)') & ' Base state z-profiles at I=',i,', J=',j CALL getunit( nunit ) OPEN(UNIT=nunit, FILE=runname(1:lfnkey)//'.sound', & STATUS='unknown',IOSTAT=istat) IF(istat /= 0) THEN WRITE (6,'(1x,a,a)') 'Error opening file ', & runname(1:lfnkey)//'.sound' CALL arpsstop("arpsstop called from WRITESND opening file",1) END IF WRITE(6,'(1x,2a)') & ' k z(m) pbar(Pascal) ptbar(K) rhobar(kg/m**3)', & ' Qvbar(kg/kg) U(m/s) V(m/s)' WRITE(nunit,'(1x,2a)') & ' k z(m) pbar(Pascal) ptbar(K) rhobar(kg/m**3)', & ' Qvbar(kg/kg) U(m/s) V(m/s)' DO k=nz-1,1,-1 WRITE(6, '(1x,i4,2f12.3,f12.5,2f12.8,2f12.5)') & k,zs(i,j,k),pbar(i,j,k),ptbar(i,j,k),rhobar(i,j,k) & ,qvbar(i,j,k),ubar(i,j,k), vbar(i,j,k) WRITE(nunit,'(1x,i4,2f12.3,f12.5,2f12.8,2f12.5)') & k,zs(i,j,k),pbar(i,j,k),ptbar(i,j,k),rhobar(i,j,k) & ,qvbar(i,j,k),ubar(i,j,k), vbar(i,j,k) END DO CLOSE( UNIT = nunit ) CALL retunit( nunit ) END IF !Message Passing RETURN END SUBROUTINE writesnd ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SFCCNTL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE sfccntl(nx,ny, sfcoutfl, & 3,7 stypout,vtypout,laiout,rfnsout,vegout,ndviout, & x,y, temxy1,temxy2) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! ARPS surface property data description file for GrADS display ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 10/05/1998 ! ! 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) ! ! x The x-coord. of the physical and computational grid. ! Defined at u-point. ! y The y-coord. of the physical and computational grid. ! Defined at v-point. ! ! WORK ARRAY: ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! Number of grid points in 3 directions CHARACTER (LEN=* ) :: sfcoutfl ! Surface data file name INTEGER :: stypout ! Flag for output of soiltyp INTEGER :: vtypout ! Flag for output of vegtyp INTEGER :: laiout ! Flag for output of lai INTEGER :: rfnsout ! Flag for output of roufns INTEGER :: vegout ! Flag for output of veg INTEGER :: ndviout ! Flag for output of ndvi 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 :: temxy1(nx,ny) ! Temporary array REAL :: temxy2(nx,ny) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: varnumax PARAMETER ( varnumax = 100 ) CHARACTER (LEN=256) :: sfcctlfl CHARACTER (LEN=256) :: sfcdatfl CHARACTER (LEN=15) :: chrstr, chr1 CHARACTER (LEN=8) :: varnam(varnumax) CHARACTER (LEN=60) :: vartit(varnumax) CHARACTER (LEN=10) :: varparam(varnumax) INTEGER :: varlev(varnumax) INTEGER :: varnum INTEGER :: nchout0 CHARACTER (LEN=3) :: monnam(12) ! Name of months DATA monnam/'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', & 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/ CHARACTER (LEN=2) :: dtunit INTEGER :: ntm,tinc REAL :: lonmin,latmin,lonmax,latmax REAL :: xbgn,ybgn REAL :: xinc,yinc REAL :: lat11,lat12,lon11,lon12,lat21,lat22,lon21,lon22 REAL :: latinc,loninc INTEGER :: ctllen,fnlen INTEGER :: i,k, is ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Open the GrADS data control file: runname.ctl ! !----------------------------------------------------------------------- ! fnlen = LEN( sfcoutfl ) CALL strlnth( sfcoutfl, fnlen ) ctllen = fnlen + 4 sfcctlfl(1:ctllen) = sfcoutfl(1:fnlen)//'.ctl' CALL fnversn( sfcctlfl, ctllen ) CALL getunit (nchout0) WRITE (6,'(a)') 'The GrADS data control file is ' & //sfcctlfl(1:ctllen) OPEN (nchout0, FILE = sfcctlfl(1:ctllen), STATUS = 'unknown') xbgn = 0.5 * (x(1) + x(2)) ybgn = 0.5 * (y(1) + y(2)) xinc = (x(2) - x(1)) yinc = (y(2) - y(1)) CALL xytoll(nx,ny,x,y,temxy1,temxy2) CALL xytoll(1,1,xbgn,ybgn,lat11,lon11) CALL a3dmax0(temxy1,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & latmax,latmin) CALL a3dmax0(temxy2,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & lonmax,lonmin) latinc = (latmax-latmin)/(ny-1) loninc = (lonmax-lonmin)/(nx-1) WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') & 'latmin:latmax:latinc = ', & latmin,':',latmax,':',latinc WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') & 'lonmin:lonmax:loninc = ', & lonmin,':',lonmax,':',loninc WRITE (chrstr,'(i2.2,a,i2.2,a,i2.2,a3,i4.4)') & hour,':',minute,'Z',day,monnam(month),year ntm = 1 tinc = 1 dtunit = 'MO' DO i=1,varnumax varlev(i) = 0 varparam(i) = '99' END DO varnum = 0 IF ( stypout == 1 ) THEN IF ( nstyp == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'styp' vartit(varnum) = 'Soil type' varparam(varnum) = '-1,40,4' ELSE DO is=1,nstyp WRITE (chr1,'(i1)') is varnum = varnum + 1 varnam(varnum) = 'styp'//chr1 vartit(varnum) = 'Soil type '//chr1 varparam(varnum) = '-1,40,4' varnum = varnum + 1 varnam(varnum) = 'sfct'//chr1 vartit(varnum) = 'Fraction of soil type '//chr1 END DO END IF END IF IF ( vtypout == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'vtyp' vartit(varnum) = 'Vegetation type' varparam(varnum) = '-1,40,4' END IF IF ( laiout == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'lai' vartit(varnum) = 'Leaf Area Index' END IF IF ( rfnsout == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'roufns' vartit(varnum) = 'Surface roughness (m)' END IF IF ( vegout == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'veg' vartit(varnum) = 'Vegetation fraction' END IF IF ( ndviout == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'ndvi' vartit(varnum) = 'NDVI' END IF WRITE (nchout0,'(a/a)') & 'TITLE ARPS surface property data control for ' & //runname(1:lfnkey),'*' WRITE (nchout0,'(a,a)') & 'DSET ',sfcoutfl(1:fnlen) WRITE (nchout0,'(a)') & 'OPTIONS sequential' WRITE (nchout0,'(a,i10)') & 'FILEHEADER ',192 !!! The number depends on the file !!! structure of sfcoutfl. See iolib3d.f WRITE (nchout0,'(a/a)') & 'UNDEF -9.e+33','*' IF ( mapproj == 2 ) THEN WRITE (nchout0,'(a)') & '* For lat-lon-lev display, umcomment the following 4 lines.' WRITE (nchout0,'(a,1x,i8,1x,i3,a,2f12.6,2i3,3f12.6,2f12.2)') & 'PDEF',nx,ny,' LCC',lat11,lon11,1,1, & trulat1,trulat2,trulon,xinc,yinc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'XDEF',nx, ' LINEAR ',lonmin,loninc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'YDEF',ny, ' LINEAR ',latmin,latinc ELSE WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'XDEF',nx, ' LINEAR ',xbgn,xinc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'YDEF',ny, ' LINEAR ',ybgn,yinc END IF WRITE (nchout0,'(a,1x,i8,a,i1)') & 'ZDEF',1,' LEVELS ',0 WRITE (nchout0,'(a,1x,i8,a,a,3x,i2.2,a/a)') & 'TDEF',ntm,' LINEAR ',chrstr,tinc,dtunit,'*' WRITE (nchout0,'(a,1x,i3)') & 'VARS',varnum DO i = 1, varnum WRITE (nchout0,'(a6,1x,i3,2x,a,2x,a)') & varnam(i),varlev(i),varparam(i),vartit(i) END DO WRITE (nchout0,'(a)') & 'ENDVARS' CLOSE (nchout0) CALL retunit(nchout0) RETURN END SUBROUTINE sfccntl ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SOILCNTL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE soilcntl(nx,ny, soiloutfl, & 5,7 tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout,x,y) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! ARPS soil data description file for GrADS display ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 10/05/1998 ! ! 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) ! ! x The x-coord. of the physical and computational grid. ! Defined at u-point. ! y The y-coord. of the physical and computational grid. ! Defined at v-point. ! ! WORK ARRAY: ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! Number of grid points in 3 directions CHARACTER (LEN=*) :: soiloutfl ! Surface data file name INTEGER :: tsfcout,tsoilout,wsfcout,wdpout,wcanpout,snowdout 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 :: temxy1(nx,ny) ! Temporary array REAL :: temxy2(nx,ny) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: varnumax PARAMETER ( varnumax = 100 ) CHARACTER (LEN=256) :: soilctlfl CHARACTER (LEN=15) :: chrstr, chr1 CHARACTER (LEN=8) :: varnam(varnumax) CHARACTER (LEN=60) :: vartit(varnumax) CHARACTER (LEN=10) :: varparam(varnumax) INTEGER :: varlev(varnumax) INTEGER :: varnum INTEGER :: nchout0 CHARACTER (LEN=3) :: monnam(12) ! Name of months DATA monnam/'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', & 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/ CHARACTER (LEN=2) :: dtunit INTEGER :: ntm,tinc REAL :: lonmin,latmin,lonmax,latmax REAL :: xbgn,ybgn REAL :: xinc,yinc REAL :: lat11,lat12,lon11,lon12,lat21,lat22,lon21,lon22 REAL :: latinc,loninc INTEGER :: ctllen, fnlen INTEGER :: i,k, is ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Open the GrADS data control file ! !----------------------------------------------------------------------- ! fnlen = LEN( soiloutfl ) CALL strlnth( soiloutfl, fnlen ) ctllen = fnlen + 4 soilctlfl(1:ctllen) = soiloutfl(1:fnlen)//'.ctl' CALL fnversn( soilctlfl, ctllen ) CALL getunit (nchout0) WRITE (6,'(a)') 'The GrADS data control file is ' & //soilctlfl(1:ctllen) OPEN (nchout0, FILE = soilctlfl(1:ctllen), STATUS = 'unknown') xbgn = 0.5 * (x(1) + x(2)) ybgn = 0.5 * (y(1) + y(2)) xinc = (x(2) - x(1)) yinc = (y(2) - y(1)) CALL xytoll(nx,ny,x,y,temxy1,temxy2) CALL xytoll(1,1,xbgn,ybgn,lat11,lon11) CALL a3dmax0(temxy1,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & latmax,latmin) CALL a3dmax0(temxy2,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & lonmax,lonmin) latinc = (latmax-latmin)/(ny-1) loninc = (lonmax-lonmin)/(nx-1) WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') & 'latmin:latmax:latinc = ', & latmin,':',latmax,':',latinc WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') & 'lonmin:lonmax:loninc = ', & lonmin,':',lonmax,':',loninc WRITE (chrstr,'(i2.2,a,i2.2,a,i2.2,a3,i4.4)') & hour,':',minute,'Z',day,monnam(month),year ntm = 1 tinc = 1 dtunit = 'MN' DO i=1,varnumax varlev(i) = 0 varparam(i) = '99' END DO varnum = 0 IF ( tsfcout == 1 ) THEN IF ( nstyp <= 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'ts' vartit(varnum) = 'Surface skin temperature (K)' ELSE DO is=0,nstyp WRITE (chr1,'(i1)') is varnum = varnum + 1 varnam(varnum) = 'ts'//chr1 vartit(varnum) = 'Surface skin temperature (K) ' & //'for soil type '//chr1 END DO END IF END IF IF ( tsoilout == 1 ) THEN IF ( nstyp <= 1 ) THEN varnum = varnum + 1 varnam(varnum) = 't2' vartit(varnum) = 'Deep soil temperature (K)' ELSE DO is=0,nstyp WRITE (chr1,'(i1)') is varnum = varnum + 1 varnam(varnum) = 't2'//chr1 vartit(varnum) = 'Deep soil temperature (K)' & //' for soil type '//chr1 END DO END IF END IF IF ( wsfcout == 1 ) THEN IF ( nstyp <= 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'wg' vartit(varnum) = 'Surface skin soil moisture (m**3/m**3)' ELSE DO is=0,nstyp WRITE (chr1,'(i1)') is varnum = varnum + 1 varnam(varnum) = 'wg'//chr1 vartit(varnum) = 'Surface skin soil moisture (m**3/m**3)' & //' for soil type '//chr1 END DO END IF END IF IF ( wdpout == 1 ) THEN IF ( nstyp <= 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'w2' vartit(varnum) = 'Deep soil moisture (m**3/m**3)' ELSE DO is=0,nstyp WRITE (chr1,'(i1)') is varnum = varnum + 1 varnam(varnum) = 'w2'//chr1 vartit(varnum) = 'Deep soil moisture (m**3/m**3) ' & //' for soil type '//chr1 END DO END IF END IF IF ( wcanpout == 1 ) THEN IF ( nstyp <= 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'wr' vartit(varnum) = 'Canopy water amount (m)' ELSE DO is=0,nstyp WRITE (chr1,'(i1)') is varnum = varnum + 1 varnam(varnum) = 'wr'//chr1 vartit(varnum) = 'Canopy water amount (m) ' & //' for soil type '//chr1 END DO END IF END IF IF ( snowdout == 1 ) THEN varnum = varnum + 1 varnam(varnum) = 'snowd' vartit(varnum) = 'Snow depth (m)' END IF WRITE (nchout0,'(a/a)') & 'TITLE ARPS soil variable data control for ' & //runname(1:lfnkey),'*' WRITE (nchout0,'(a,a)') & 'DSET ',soiloutfl(1:fnlen) WRITE (nchout0,'(a)') & 'OPTIONS sequential' WRITE (nchout0,'(a,i10)') & 'FILEHEADER ',192 !!! The number depends on the file !!! structure of soiloutfl. See iolib3d.f WRITE (nchout0,'(a/a)') & 'UNDEF -9.e+33','*' IF ( mapproj == 2 ) THEN WRITE (nchout0,'(a)') & '* For lat-lon-lev display, umcomment the following 4 lines.' WRITE (nchout0,'(a,1x,i8,1x,i3,a,2f12.6,2i3,3f12.6,2f12.2)') & 'PDEF',nx,ny,' LCC',lat11,lon11,1,1, & trulat1,trulat2,trulon,xinc,yinc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'XDEF',nx, ' LINEAR ',lonmin,loninc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'YDEF',ny, ' LINEAR ',latmin,latinc ELSE WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'XDEF',nx, ' LINEAR ',xbgn,xinc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'YDEF',ny, ' LINEAR ',ybgn,yinc END IF WRITE (nchout0,'(a,1x,i8,a,i1)') & 'ZDEF',1,' LEVELS ',0 WRITE (nchout0,'(a,1x,i8,a,a,3x,i2.2,a/a)') & 'TDEF',ntm,' LINEAR ',chrstr,tinc,dtunit,'*' WRITE (nchout0,'(a,1x,i3)') & 'VARS',varnum DO i = 1, varnum WRITE (nchout0,'(a6,1x,i3,2x,a,2x,a)') & varnam(i),varlev(i),varparam(i),vartit(i) END DO WRITE (nchout0,'(a)') & 'ENDVARS' CLOSE (nchout0) CALL retunit(nchout0) RETURN END SUBROUTINE soilcntl ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE TRNCNTL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE trncntl(nx,ny, ternfn, x,y, temxy1,temxy2) 1,7 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! ARPS terrain data description file for GrADS display ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 10/05/1998 ! ! 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) ! ! x The x-coord. of the physical and computational grid. ! Defined at u-point. ! y The y-coord. of the physical and computational grid. ! Defined at v-point. ! ! WORK ARRAY: ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! Number of grid points in 3 directions CHARACTER (LEN=* ) :: ternfn ! Terrain data file name 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 :: temxy1(nx,ny) ! Temporary array REAL :: temxy2(nx,ny) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! CHARACTER (LEN=256) :: trnctlfl CHARACTER (LEN=15) :: chrstr, chr1 INTEGER :: nchout0 CHARACTER (LEN=3) :: monnam(12) ! Name of months DATA monnam/'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', & 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/ CHARACTER (LEN=2) :: dtunit INTEGER :: ntm,tinc REAL :: lonmin,latmin,lonmax,latmax REAL :: xbgn,ybgn REAL :: xinc,yinc REAL :: lat11,lat12,lon11,lon12,lat21,lat22,lon21,lon22 REAL :: latinc,loninc INTEGER :: ctllen, fnlen INTEGER :: i,k, is ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Open the GrADS data control file ! !----------------------------------------------------------------------- ! fnlen = LEN( ternfn ) CALL strlnth( ternfn, fnlen ) ctllen = fnlen + 4 trnctlfl(1:ctllen) = ternfn(1:fnlen)//'.ctl' CALL fnversn( trnctlfl, ctllen ) CALL getunit (nchout0) WRITE (6,'(a)') 'The GrADS data control file is ' & //trnctlfl(1:ctllen) OPEN (nchout0, FILE = trnctlfl(1:ctllen), STATUS = 'unknown') xbgn = 0.5 * (x(1) + x(2)) ybgn = 0.5 * (y(1) + y(2)) xinc = (x(2) - x(1)) yinc = (y(2) - y(1)) CALL xytoll(nx,ny,x,y,temxy1,temxy2) CALL xytoll(1,1,xbgn,ybgn,lat11,lon11) CALL a3dmax0(temxy1,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & latmax,latmin) CALL a3dmax0(temxy2,1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & lonmax,lonmin) latinc = (latmax-latmin)/(ny-1) loninc = (lonmax-lonmin)/(nx-1) WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') & 'latmin:latmax:latinc = ', & latmin,':',latmax,':',latinc WRITE (6,'(a,f10.4,a,f10.4,a,f10.4)') & 'lonmin:lonmax:loninc = ', & lonmin,':',lonmax,':',loninc WRITE (chrstr,'(i2.2,a,i2.2,a,i2.2,a3,i4.4)') & hour,':',minute,'Z',day,monnam(month),year ntm = 1 tinc = 1 dtunit = 'MN' WRITE (nchout0,'(a/a)') & 'TITLE ARPS terrain data control for ' & //runname(1:lfnkey),'*' WRITE (nchout0,'(a,a)') & 'DSET ',ternfn(1:fnlen) WRITE (nchout0,'(a)') & 'OPTIONS sequential' WRITE (nchout0,'(a,i10)') & 'FILEHEADER ',192 !!! The number depends on the file !!! structure of ternfn. See iolib3d.f WRITE (nchout0,'(a/a)') & 'UNDEF -9.e+33','*' IF ( mapproj == 2 ) THEN WRITE (nchout0,'(a)') & '* For lat-lon-lev display, umcomment the following 4 lines.' WRITE (nchout0,'(a,1x,i8,1x,i3,a,2f12.6,2i3,3f12.6,2f12.2)') & 'PDEF',nx,ny,' LCC',lat11,lon11,1,1, & trulat1,trulat2,trulon,xinc,yinc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'XDEF',nx, ' LINEAR ',lonmin,loninc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'YDEF',ny, ' LINEAR ',latmin,latinc ELSE WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'XDEF',nx, ' LINEAR ',xbgn,xinc WRITE (nchout0,'(a,1x,i8,a,f10.4,1x,f10.4)') & 'YDEF',ny, ' LINEAR ',ybgn,yinc END IF WRITE (nchout0,'(a,1x,i8,a,i1)') & 'ZDEF',1,' LEVELS ',0 WRITE (nchout0,'(a,1x,i8,a,a,3x,i2.2,a/a)') & 'TDEF',ntm,' LINEAR ',chrstr,tinc,dtunit,'*' WRITE (nchout0,'(a,1x,i3)') & 'VARS',1 WRITE (nchout0,'(a)') & 'trn 0 99 ARPS terrain (m)' WRITE (nchout0,'(a)') & 'ENDVARS' CLOSE (nchout0) CALL retunit(nchout0) RETURN END SUBROUTINE trncntl !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CHECKGRID3D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE checkgrid3d(nx,ny,nz,nxin,nyin,nzin, & 2 dx,dy,dz,dzmin,ctrlat,ctrlon, & strhopt,zrefsfc,dlayer1,dlayer2,zflat,strhtune, & mapproj,trulat1,trulat2,trulon,sclfct, & dxin,dyin,dzin,dzminin,ctrlatin,ctrlonin, & strhoptin,zrefsfcin,dlayer1in,dlayer2in,zflatin,strhtunein, & mapprojin,trulat1in,trulat2in,trulonin,sclfctin,ireturn) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Check grid information to see if input data is consistent with ! ARPS grid. ! !----------------------------------------------------------------------- ! ! AUTHOR: Gene Bassett ! 2000/03/24 ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx ! ny ! nz ! nxin ! nyin ! nzin ! dx ! dy ! dz ! dzmin ! ctrlat ! ctrlon ! strhopt ! zrefsfc ! dlayer1 ! dlayer2 ! zflat ! strhtune ! mapproj ! trulat1 ! trulat2 ! trulon ! sclfct ! dxin ! dyin ! dzin ! dzminin ! ctrlatin ! ctrlonin ! strhoptin ! zrefsfcin ! dlayer1in ! dlayer2in ! zflatin ! strhtunein ! mapprojin ! trulat1in ! trulat2in ! trulonin ! sclfctin ! ! OUTPUT: ! ! ireturn Flag indicating if the grids are the same (0-okay, ! 1-significant differences) ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nxin INTEGER :: nyin INTEGER :: nzin INTEGER :: nx,ny,nz REAL :: dx REAL :: dy REAL :: dz REAL :: dzmin REAL :: ctrlat REAL :: ctrlon INTEGER :: strhopt REAL :: zrefsfc REAL :: dlayer1 REAL :: dlayer2 REAL :: zflat ! INTEGER :: strhtune REAL :: strhtune INTEGER :: mapproj REAL :: trulat1 REAL :: trulat2 REAL :: trulon REAL :: sclfct REAL :: dxin REAL :: dyin REAL :: dzin REAL :: dzminin REAL :: ctrlatin REAL :: ctrlonin INTEGER :: strhoptin REAL :: zrefsfcin REAL :: dlayer1in REAL :: dlayer2in REAL :: zflatin ! INTEGER :: strhtunein REAL :: strhtunein INTEGER :: mapprojin REAL :: trulat1in REAL :: trulat2in REAL :: trulonin REAL :: sclfctin INTEGER :: ireturn !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- REAL :: eps PARAMETER (eps= 0.01) !----------------------------------------------------------------------- ! ! Include file: ! !----------------------------------------------------------------------- !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ !----------------------------------------------------------------------- ! ! Compare all the variables. (Note that for 3-D data sets one ought ! to also check hterain, which is not done here.) ! !----------------------------------------------------------------------- ireturn = 0 IF ((nxin /= nx) .OR. (nyin /= ny) .OR. (nzin /= nz)) THEN WRITE (6,'(/2(/5x,a),2(/5x,3(a,i9))/)') & 'ERROR: nx, ny or nz in file does not match', & 'the values in the program.', & 'In file, nx=', nxin, ', ny=', nyin, ', nz=',nzin, & 'In executable, nx=', nx, ', ny=', ny, ', nz=',nz ireturn = 1 END IF IF(ABS(dxin-dx) > eps .OR. ABS(dyin-dy) > eps .OR. & ABS(dzin-dz) > eps .OR. & ABS(dzminin-dzmin) > eps ) THEN WRITE(6,'(/2(/5x,a),4(/5x,2(a,f13.3))/)') & 'ERROR: dx, dy, dz or dzmin in the file ', & 'do not match those specified in the input file.', & 'In file, dx=', dxin, ', dy=', dyin, & ' dz=', dzin, ', dzmin=', dzminin, & 'In input, dx=', dx, ', dy=', dy, & ' dz=', dz, ', dzmin=', dzmin ireturn = 1 END IF IF(ABS(ctrlatin-ctrlat) > eps .OR. ABS(ctrlonin-ctrlon) > eps ) THEN WRITE(6,'(/2(/5x,a),2(/5x,2(a,f13.3))/)') & 'ERROR: Central latitude and/or longitude of the grid ', & 'in the file do not match those specified in input file.', & 'In file, ctrlat=',ctrlatin,', ctrlon=',ctrlonin, & 'In input, ctrlat=',ctrlat ,', ctrlon=',ctrlon ireturn = 1 END IF IF(strhoptin /= strhopt .OR. ABS(zrefsfcin-zrefsfc) > eps .OR. & ABS(dlayer1in-dlayer1) > eps .OR. & ABS(dlayer2in-dlayer2) > eps .OR. & ABS(zflatin-zflat) > eps .OR. & ABS(strhtunein-strhtune) > eps .OR. & mapprojin /= mapproj .OR. & ABS(trulat1in-trulat1) > eps .OR. & ABS(trulat2in-trulat2) > eps .OR. & ABS(trulonin-trulon ) > eps .OR. & ABS(sclfctin-sclfct ) > eps) THEN WRITE(6,'(/2(/5x,a),2(/5x,3(a,f13.3),2(a,i3),5(a,f13.3))/)') & 'ERROR: Map projection or other grid parameters do not ', & 'match those specified in input file.', & 'In file, trulat1=',trulat1in,', trulat2=',trulat2in, & ', trulon=',trulonin,', mapproj=',mapprojin, & ', strhopt=',strhoptin,', zrefsfc=',zrefsfcin, & ', dlayer1=',dlayer1in,', dlayer2=',dlayer2in, & ', zflat=',zflatin,', strhtune=',strhtunein, & 'In input, trulat1=',trulat1 ,', trulat2=',trulat2, & ', trulon=',trulon, ', mapproj=',mapproj, & ', strhopt=',strhopt,', zrefsfc=',zrefsfc, & ', dlayer1=',dlayer1,', dlayer2=',dlayer2, & ', zflat=',zflat,', strhtune=',strhtune ireturn = 1 END IF RETURN END SUBROUTINE checkgrid3d !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CHECKGRID2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## SUBROUTINE checkgrid2d(nx,ny,nxin,nyin, & 6 dx,dy,ctrlat,ctrlon, & mapproj,trulat1,trulat2,trulon,sclfct, & dxin,dyin,ctrlatin,ctrlonin, & mapprojin,trulat1in,trulat2in,trulonin,sclfctin,ireturn) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Check grid information to see if input data is consistent with ! ARPS grid. ! !----------------------------------------------------------------------- ! ! AUTHOR: Gene Bassett ! 2000/03/24 ! !----------------------------------------------------------------------- ! ! INPUT: ! ! nx ! ny ! nxin ! nyin ! dx ! dy ! ctrlat ! ctrlon ! mapproj ! trulat1 ! trulat2 ! trulon ! sclfct ! dxin ! dyin ! ctrlatin ! ctrlonin ! mapprojin ! trulat1in ! trulat2in ! trulonin ! sclfctin ! ! OUTPUT: ! ! ireturn Flag indicating if the grids are the same (0-okay, ! 1-significant differences) ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nxin INTEGER :: nyin INTEGER :: nx,ny REAL :: dx REAL :: dy REAL :: ctrlat REAL :: ctrlon INTEGER :: mapproj REAL :: trulat1 REAL :: trulat2 REAL :: trulon REAL :: sclfct REAL :: dxin REAL :: dyin REAL :: ctrlatin REAL :: ctrlonin INTEGER :: mapprojin REAL :: trulat1in REAL :: trulat2in REAL :: trulonin REAL :: sclfctin INTEGER :: ireturn !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- REAL :: eps PARAMETER (eps= 0.1) !----------------------------------------------------------------------- ! ! Include file: ! !----------------------------------------------------------------------- !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ !----------------------------------------------------------------------- ! ! Compare all the variables. ! !----------------------------------------------------------------------- ireturn = 0 IF ((nxin /= nx) .OR. (nyin /= ny)) THEN WRITE (6,'(/2(/5x,a),2(/5x,(a,i9))/)') & 'ERROR: nx and/or ny in file does not match', & 'the values in the program.', & 'In file, nx=', nxin, ', ny=', nyin, & 'In executable, nx=', nx, ', ny=', ny ireturn = 1 END IF IF(ABS(dxin-dx) > eps .OR. ABS(dyin-dy) > eps) THEN WRITE(6,'(/2(/5x,a),2(/5x,2(a,f13.3))/)') & 'ERROR: dx or dy in the file ', & 'do not match those specified in the input file.', & 'In file, dx=', dxin, ', dy=', dyin, & 'In input, dx=', dx, ', dy=', dy ireturn = 1 END IF IF(ABS(ctrlatin-ctrlat) > eps .OR. ABS(ctrlonin-ctrlon) > eps ) THEN WRITE(6,'(/2(/5x,a),2(/5x,2(a,f13.3))/)') & 'ERROR: Central latitude and/or longitude of the grid ', & 'in the file do not match those specified in input file.', & 'In file, ctrlat=',ctrlatin,', ctrlon=',ctrlonin, & 'In input, ctrlat=',ctrlat ,', ctrlon=',ctrlon ireturn = 1 END IF IF(mapprojin /= mapproj .OR. ABS(trulat1in-trulat1) > eps .OR. & ABS(trulat2in-trulat2) > eps .OR. & ABS(trulonin-trulon ) > eps .OR. & ABS(sclfctin-sclfct ) > eps) THEN WRITE(6,'(/2(/5x,a),2(/5x,3(a,f13.3),(a,i3,a,f13.3))/)') & 'ERROR: Map projection or other grid parameters do not ', & 'match those specified in input file.', & 'In file, trulat1=',trulat1in,', trulat2=',trulat2in, & ', trulon=',trulonin,', mapproj=',mapprojin,' sclfct=',sclfctin, & 'In input, trulat1=',trulat1 ,', trulat2=',trulat2, & ', trulon=',trulon, ', mapproj=',mapproj,' sclfct=',sclfct ireturn = 1 END IF RETURN END SUBROUTINE checkgrid2d