! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE readcvttrn ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE readcvttrn(ternfile,ternfmt,nx,ny,dx,dy, & 1,25 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon,& hterain) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read the terrain data into model array hterain from a specified ! terrain data file. This subroutine does not do grid checking as ! readtrn does. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! 9/20/2003 based on readtrn. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! ternfile Terrain data file name ! ternfmt Terrain file format ! ! OUTPUT : ! ! 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 ! ! 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) ! ! hterain Terrain height (m) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE CHARACTER(LEN=*), INTENT(IN) :: ternfile ! Terrain data file name INTEGER, INTENT(IN) :: ternfmt INTEGER, INTENT(OUT) :: nx ! Number of grid points in the x-direction INTEGER, INTENT(OUT) :: ny ! Number of grid points in the y-direction REAL, INTENT(OUT) :: dx ! Grid interval in x-direction REAL, INTENT(OUT) :: dy ! Grid interval in y-direction INTEGER, INTENT(OUT) :: mapproj ! Map projection REAL, INTENT(OUT) :: trulat1 ! 1st real true latitude of map projection REAL, INTENT(OUT) :: trulat2 ! 2nd real true latitude of map projection REAL, INTENT(OUT) :: trulon ! Real true longitude of map projection REAL, INTENT(OUT) :: sclfct ! Map scale factor REAL, INTENT(OUT) :: ctrlat ! Center latitude of the model domain (deg. N) REAL, INTENT(OUT) :: ctrlon ! Center longitude of the model domain (deg. E) REAL, POINTER :: hterain(:,:)! Terrain height. ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i, j INTEGER :: inunit,istat INTEGER :: idummy,ierr REAL :: rdummy,amin,amax INTEGER :: ireturn INTEGER(KIND=selected_int_kind(4)) :: itmp(1) ! unused array in hdf routines since NO COMPRESSION INTEGER :: sd_id REAL, ALLOCATABLE :: var2d(:,:) !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Read in the terrain data. ! !----------------------------------------------------------------------- ! WRITE (6,'(1x,/,3a,/)') "READCVTTRN: reading in external supplied ", & "terrain data from file ",trim(ternfile) !----------------------------------------------------------------------- ! ! Read in header information. ! !----------------------------------------------------------------------- IF (ternfmt == 1) 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 READCVTTRN.' STOP END IF READ(inunit,ERR=999) nx,ny READ(inunit,ERR=999) idummy,mapproj,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy READ(inunit,ERR=999) dx ,dy ,ctrlat,ctrlon,rdummy, & rdummy,trulat1,trulat2,trulon,sclfct, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy ELSE IF(ternfmt == 3) THEN 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",nx,istat) CALL hdfrdi(sd_id,"ny",ny,istat) CALL hdfrdr(sd_id,"dx",dx,istat) CALL hdfrdr(sd_id,"dy",dy,istat) CALL hdfrdi(sd_id,"mapproj",mapproj,istat) CALL hdfrdr(sd_id,"trulat1",trulat1,istat) CALL hdfrdr(sd_id,"trulat2",trulat2,istat) CALL hdfrdr(sd_id,"trulon",trulon,istat) CALL hdfrdr(sd_id,"sclfct",sclfct,istat) CALL hdfrdr(sd_id,"ctrlat",ctrlat,istat) CALL hdfrdr(sd_id,"ctrlon",ctrlon,istat) ELSE IF (ternfmt == 7) THEN CALL netopen(TRIM(ternfile),'R',sd_id) CALL net_get_trn(sd_id,nx,ny,dx,dy,mapproj,sclfct, & trulat1,trulat2,trulon,ctrlat,ctrlon, istat) ELSE ! alternate dump format ... WRITE(6,*) 'The supported terrain data format are ', & 'binary (ternfmt=1) and HDF4 no compressed (ternfmt = 3).' CALL arpsstop('Terrain data format is not supported.',1) END IF ALLOCATE(hterain(nx,ny), STAT = istat) IF (ternfmt == 1) THEN READ(inunit,ERR=999) hterain CALL retunit( inunit ) CLOSE (UNIT=inunit) ELSE IF (ternfmt == 3) THEN CALL hdfrd2d(sd_id,"hterain",nx,ny,hterain,istat,itmp) CALL hdfclose(sd_id,istat) ELSE IF (ternfmt == 7) THEN ALLOCATE(var2d(nx-1,ny-1), STAT = istat) CALL netread2d(sd_id,0,0,'HTERAIN',nx-1,ny-1,var2d) CALL netclose(sd_id) DO j = 1,ny-1 DO i = 1,nx-1 hterain(i,j) = var2d(i,j) END DO END DO CALL edgfill(hterain,1,nx, 1, nx-1, 1,ny, 1,ny-1, 1,1,1,1) DEALLOCATE(var2d) 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 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 readcvttrn ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READCVTSFC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE readcvtsfc(sfcfile,sfcfmt,nx,ny,nstyps,dx,dy, & 1,44 mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & stypin,vtypin,laiin,roufin,vegin,ndviin, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read the surface data sets from file sfcfile. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! 9/20/2003 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! sfcfile ! sfcfmt ! ! OUTPUT: ! ! 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) ! ! 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 CHARACTER(LEN=*), INTENT(IN) :: sfcfile ! Name of the surface data file INTEGER, INTENT(IN) :: sfcfmt INTEGER, INTENT(OUT) :: nx ! Number of grid points in the x-direction INTEGER, INTENT(OUT) :: ny ! Number of grid points in the y-direction INTEGER, INTENT(OUT) :: nstyps ! Max number of soil types in a grid box REAL, INTENT(OUT) :: dx REAL, INTENT(OUT) :: dy INTEGER, INTENT(OUT) :: mapproj ! Map projection REAL, INTENT(OUT) :: trulat1 ! 1st real true latitude of map projection REAL, INTENT(OUT) :: trulat2 ! 2nd real true latitude of map projection REAL, INTENT(OUT) :: trulon ! Real true longitude of map projection REAL, INTENT(OUT) :: sclfct ! Map scale factor REAL, INTENT(OUT) :: ctrlat ! Center latitude of the model domain (deg. N) REAL, INTENT(OUT) :: ctrlon ! Center longitude of the model domain (deg. E) INTEGER, INTENT(OUT) :: stypin,vtypin,laiin,roufin,vegin,ndviin INTEGER, POINTER :: soiltyp(:,:,:) ! Soil type in model domain REAL, POINTER :: stypfrct(:,:,:) ! Fraction of soil types INTEGER, POINTER :: vegtyp (:,:) ! Vegetation type in model domain REAL, POINTER :: lai (:,:) ! Leaf Area Index in model domain REAL, POINTER :: roufns (:,:) ! NDVI in model domain REAL, POINTER :: veg (:,:) ! Vegetation fraction REAL, POINTER :: ndvi (:,:) ! NDVI ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: idummy REAL :: rdummy INTEGER :: i,j,is INTEGER :: istat, ierr, ireturn INTEGER :: sfcunit INTEGER :: stat, sd_id INTEGER(KIND=selected_int_kind(4)) :: itmp(1) REAL :: atmp1(1),atmp2(1) ! unused arrays in hdf routines since NO COMPRESSION INTEGER, ALLOCATABLE :: temi(:,:,:) REAL, ALLOCATABLE :: temr(:,:,:) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! 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. ! !----------------------------------------------------------------------- ! WRITE (6,'(1x,/,3a)') "READCVTSFC: reading in external supplied ", & "surface data from file ",trim(sfcfile) !----------------------------------------------------------------------- ! ! Read in header information. ! !----------------------------------------------------------------------- IF (sfcfmt == 1) 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 READCVTSFC.' CALL arpsstop("arpsstop called from READCVTSFC 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) nx,ny READ (sfcunit,ERR=998) mapproj,stypin,vtypin,laiin,roufin, & vegin, ndviin,nstyps,idummy,idummy, & idummy, idummy,idummy,idummy,idummy, & idummy, idummy,idummy,idummy,idummy READ (sfcunit,ERR=998) dx,dy, ctrlat,ctrlon,trulat1, & trulat2,trulon, sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy ELSE IF (sfcfmt == 3) THEN !----------------------------------------------------------------------- ! ! HDF4 format. ! !----------------------------------------------------------------------- CALL hdfopen(trim(sfcfile), 1, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "READCVTSFC: ERROR opening ", & trim(sfcfile)," for reading." GO TO 998 END IF CALL hdfrdi(sd_id,"nstyp",nstyps,istat) CALL hdfrdi(sd_id,"nx",nx,istat) CALL hdfrdi(sd_id,"ny",ny,istat) CALL hdfrdr(sd_id,"dx",dx,istat) CALL hdfrdr(sd_id,"dy",dy,istat) CALL hdfrdi(sd_id,"mapproj",mapproj,istat) CALL hdfrdr(sd_id,"trulat1",trulat1,istat) CALL hdfrdr(sd_id,"trulat2",trulat2,istat) CALL hdfrdr(sd_id,"trulon",trulon,istat) CALL hdfrdr(sd_id,"sclfct",sclfct,istat) CALL hdfrdr(sd_id,"ctrlat",ctrlat,istat) CALL hdfrdr(sd_id,"ctrlon",ctrlon,istat) ELSE IF (sfcfmt == 7) THEN !----------------------------------------------------------------------- ! ! NetCDF format. ! !----------------------------------------------------------------------- CALL netopen(TRIM(sfcfile), 'R', sd_id) CALL net_get_sfc(sd_id,nx,ny,nstyps,dx,dy, & mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, & stypin,vtypin,laiin,roufin,vegin,ndviin,istat) ELSE ! alternate dump format ... WRITE(6,'(1x,3a)') 'The supported surface data format are ', & 'binary (sfcfmt=1), HDF4 no compressed (sfcfmt = 3). ', & 'and NetCDF (sfcfmt = 7).' CALL arpsstop('Surface data format is not supported.',1) END IF !sfcfmt loop nstyps = MAX( nstyps, 1 ) !----------------------------------------------------------------------- ! ! Read in the surface data from the surface data file. ! !----------------------------------------------------------------------- ALLOCATE(soiltyp (nx,ny,nstyps), STAT = istat) ALLOCATE(stypfrct(nx,ny,nstyps), STAT = istat) ALLOCATE(vegtyp (nx,ny), STAT = istat) ALLOCATE(lai (nx,ny), STAT = istat) ALLOCATE(roufns (nx,ny), STAT = istat) ALLOCATE(veg (nx,ny), STAT = istat) ALLOCATE(ndvi (nx,ny), STAT = istat) IF (sfcfmt == 1) 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 --', nstyps IF(stypin == 1) THEN IF ( nstyps == 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,nstyps 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) 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 IF (sfcfmt == 3) THEN CALL hdfrd3di(sd_id,"soiltyp",nx,ny,nstyps,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,nstyps, & 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:nstyps) = 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) ELSE IF (sfcfmt == 7) THEN ! NetCDF format 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 --', nstyps ALLOCATE(temr(nx-1,ny-1,nstyps), STAT = stat) ALLOCATE(temi(nx-1,ny-1,nstyps), STAT = stat) IF(stypin == 1) THEN CALL netread3di(sd_id,0,0,'SOILTYP',nx-1,ny-1,nstyps,temi) CALL netread3d (sd_id,0,0,'STYPFRCT',nx-1,ny-1,nstyps,temr) DO is = 1, nstyps DO j = 1, ny-1 DO i = 1, nx-1 soiltyp (i,j,is) = temi(i,j,is) stypfrct(i,j,is) = temr(i,j,is) END DO END DO END DO CALL iedgfill(soiltyp, 1,nx,1,nx-1,1,ny,1,ny-1,1,nstyps,1,nstyps) CALL edgfill(stypfrct,1,nx,1,nx-1,1,ny,1,ny-1,1,nstyps,1,nstyps) END IF IF(vtypin == 1) THEN CALL netread2di(sd_id,0,0,'VEGTYP',nx-1,ny-1,temi) DO j = 1, ny-1 DO i = 1, nx-1 vegtyp (i,j) = temi(i,j,1) END DO END DO CALL iedgfill(vegtyp, 1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1) END IF IF(laiin == 1) THEN CALL netread2d(sd_id,0,0,'LAI',nx-1,ny-1,temr) DO j = 1, ny-1 DO i = 1, nx-1 lai (i,j) = temr(i,j,1) END DO END DO CALL edgfill(lai,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1) END IF IF(roufin == 1) THEN CALL netread2d(sd_id,0,0,'ROUFNS',nx-1,ny-1,temr) DO j = 1, ny-1 DO i = 1, nx-1 roufns (i,j) = temr(i,j,1) END DO END DO CALL edgfill(roufns,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1) END IF IF(vegin == 1) THEN CALL netread2d(sd_id,0,0,'VEG',nx-1,ny-1,temr) DO j = 1, ny-1 DO i = 1, nx-1 veg (i,j) = temr(i,j,1) END DO END DO CALL edgfill(veg,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1) END IF IF (ndviin == 1) THEN CALL netread2d(sd_id,0,0,'NDVI',nx-1,ny-1,temr) DO j = 1, ny-1 DO i = 1, nx-1 ndvi (i,j) = temr(i,j,1) END DO END DO CALL edgfill(ndvi,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1) END IF CALL netclose(sd_id) DEALLOCATE(temi, temr) END IF RETURN 998 WRITE (6,'(/a,i2/a)') & 'READCVTSFC: Read error in surface data file ' & //sfcfile//' with the I/O unit ',sfcunit, & 'The model will STOP in subroutine READCVTSFC.' CALL arpsstop("arpsstop called from READCVTSFC reading sfc file",1) END SUBROUTINE readcvtsfc ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READCVTSOIL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE readcvtsoil(soilfile,soilfmt,nx,ny,nzsoil,nstyps,dx,dy, & 1,47 zpsoil,mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & zpsoilin,tsoilin,qsoilin,wcanpin,snowdin, & tsoil,qsoil,wetcanp,snowdpth,soiltyp ) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read the soil variables and ARPS grid parameters from file soilfile. ! It does the same job as subroutine readsoil in src/arps/iolib3d.f90. ! However, it skip the step to check the consistence between the passed ! in grid parameters with those read in from the file. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! Changed from readsoil in src/arps/iolib3d.f90. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT: ! ! soilfile ! soilfmt ! ! OUTPUT: ! ! nx Number of model grid points in the x-dir. (east/west) ! ny Number of model grid points in the y-dir. (north/south) ! nzsoil Number of model grid points in the soil. ! ! 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) ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m3/m3) ! wetcanp Canopy water amount ! snowdpth Snow depth (m) ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE CHARACTER(LEN=*), INTENT(IN) :: soilfile ! Name of the soil file INTEGER, INTENT(IN) :: soilfmt INTEGER, INTENT(OUT) :: nx ! Number of grid points in the x-direction INTEGER, INTENT(OUT) :: ny ! Number of grid points in the y-direction INTEGER, INTENT(OUT) :: nzsoil ! Number of grid points in the soil. INTEGER, INTENT(OUT) :: nstyps ! Number of soil types for each grid point REAL, INTENT(OUT) :: dx REAL, INTENT(OUT) :: dy INTEGER, INTENT(OUT) :: mapproj ! Map projection REAL, INTENT(OUT) :: trulat1 ! 1st real true latitude of map projection REAL, INTENT(OUT) :: trulat2 ! 2nd real true latitude of map projection REAL, INTENT(OUT) :: trulon ! Real true longitude of map projection REAL, INTENT(OUT) :: sclfct ! Map scale factor REAL, INTENT(OUT) :: ctrlat ! Center latitude of the model domain (deg. N) REAL, INTENT(OUT) :: ctrlon ! Center longitude of the model domain (deg. E) INTEGER, INTENT(OUT) :: zpsoilin INTEGER, INTENT(OUT) :: tsoilin INTEGER, INTENT(OUT) :: qsoilin INTEGER, INTENT(OUT) :: wcanpin INTEGER, INTENT(OUT) :: snowdin REAL, POINTER :: zpsoil (:,:,:) ! Soil depths (m) REAL, POINTER :: tsoil (:,:,:,:) ! Soil temperature (K) REAL, POINTER :: qsoil (:,:,:,:) ! Soil moisture (m3/m3) REAL, POINTER :: wetcanp(:,:,:) ! Canopy water amount INTEGER, POINTER :: soiltyp(:,:,:) ! Soil type in model domain REAL, POINTER :: snowdpth(:,:) ! Snow depth (m) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: flunit INTEGER :: idummy REAL :: rdummy INTEGER :: i,j,k,is INTEGER :: istat, ierr INTEGER :: ireturn INTEGER(KIND=selected_int_kind(4)) :: itmp(1) REAL :: atmp1(1),atmp2(1) ! unused arrays because of no-compression INTEGER :: stat, sd_id ! ! fmtver??: to label each data a version. ! intver??: an integer to allow faster comparison than fmtver??, ! which are strings. ! ! Verion 5.00: significant change in soil variables since version 4.10. ! CHARACTER (LEN=40) :: fmtver,fmtver410,fmtver500 INTEGER :: intver,intver410,intver500 PARAMETER (fmtver410='* 004.10 GrADS Soilvar Data',intver410=410) PARAMETER (fmtver500='* 005.00 GrADS Soilvar Data',intver500=500) CHARACTER (LEN=40) :: fmtverin INTEGER :: tsfcin ! for backward compatibility Zuwen He, 07/01/02 INTEGER :: wsfcin ! for backward compatibility Zuwen He, 07/01/02 INTEGER :: wdpin ! for backward compatibility Zuwen He, 07/01/02 INTEGER :: snowcin INTEGER :: stypin !----------------------------------------------------------------------- ! ! Working arrays ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: tem1(:,:,:) ! Temporary array REAL, ALLOCATABLE :: var3d (:,:,:) REAL, ALLOCATABLE :: var4d (:,:,:,:) INTEGER, ALLOCATABLE :: var3di(:,:,:) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! WRITE (6,'(1x,/,3a)') "READCVTSOIL: reading in external supplied ", & "soil data from file ",trim(soilfile) !----------------------------------------------------------------------- ! ! Read in header information. ! !----------------------------------------------------------------------- IF (soilfmt == 1) 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 soil data file ' & //soilfile//' using FORTRAN unit ',flunit, & ' Program stopped in READCVTSOIL.' CALL arpsstop("arpsstop called from READCVTSOIL 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=997) fmtverin ! The following code is not a safe practice. ! ! However, this may be the only way to distinguish versions ! prior to 500. IF (fmtverin == fmtver500) THEN intver=intver500 ELSE WRITE(6,'(/1x,a/)') & 'WARNING: Incoming data format are older than version 5.00!!! ' END IF WRITE(6,'(/1x,a,a/)') 'Incoming data format, fmtverin=',fmtverin READ (flunit,ERR=998) nx,ny,nzsoil GOTO 996 997 WRITE(6,'(/1x,a,a/)') & 'Incoming data format: fmtver=fmtver410. Data read-in may be wrong.' CLOSE (flunit) OPEN (UNIT=flunit,FILE=trim(soilfile),FORM='unformatted', & STATUS='old',IOSTAT=istat) READ (flunit,ERR=998) nx,ny nzsoil=2 intver=intver410 ! there is no fmtverin prior to version 500 fmtver=fmtver410 WRITE(6,'(/1x,a/,a/)') & 'WARNING: Incoming data format are to read as version 4.10' 996 CONTINUE IF (intver == intver410) THEN READ (flunit,ERR=998) mapproj,tsfcin,tsoilin,wsfcin,wdpin, & wcanpin,snowcin,snowdin,stypin,zpsoilin, & idummy, idummy, idummy, idummy,idummy, & idummy, idummy, idummy, idummy,nstyps ELSE IF (intver >= intver500) THEN READ (flunit,ERR=998) mapproj,tsoilin,qsoilin, & wcanpin,snowcin,snowdin,stypin,zpsoilin, & idummy, idummy, idummy, idummy,idummy, & idummy, idummy, idummy, idummy,nstyps END IF READ (flunit,ERR=998) dx, dy, ctrlat,ctrlon,trulat1, & trulat2,trulon,sclfct,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy ELSE IF (soilfmt == 3) THEN !HDF4 !----------------------------------------------------------------------- ! ! HDF4 format. ! !----------------------------------------------------------------------- CALL hdfopen(trim(soilfile), 1, sd_id) IF (sd_id < 0) THEN WRITE (6,*) "READCVTSOIL: ERROR opening ", & trim(soilfile)," for reading." GO TO 998 END IF CALL hdfrdc(sd_id,40,"fmtver",fmtverin,istat) ! ! The following code is a dangerous practice ! but it may be the only way to distinguish ! versions prior to 500. ! IF (fmtverin == fmtver500) THEN intver=intver500 ELSE intver=intver410 ! prior to 500, there is no fmtver variable istat=0 WRITE(6,'(/1x,a/,a/)') & 'WARNING: Incoming data format are older than version 5.00!!! ', & 'It is to be read as if it version 4.10!!! ' END IF CALL hdfrdi(sd_id,"nstyp",nstyps,istat) CALL hdfrdi(sd_id,"nx",nx,istat) CALL hdfrdi(sd_id,"ny",ny,istat) IF (intver >= intver500) THEN CALL hdfrdi(sd_id,"nzsoil",nzsoil,istat) ELSE nzsoil = 2 ! prior to version 500, it is 2 layer soil END IF CALL hdfrdr(sd_id,"dx",dx,istat) CALL hdfrdr(sd_id,"dy",dy,istat) CALL hdfrdi(sd_id,"mapproj",mapproj,istat) CALL hdfrdr(sd_id,"trulat1",trulat1, istat) CALL hdfrdr(sd_id,"trulat2",trulat2, istat) CALL hdfrdr(sd_id,"trulon", trulon, istat) CALL hdfrdr(sd_id,"sclfct", sclfct, istat) CALL hdfrdr(sd_id,"ctrlat", ctrlat, istat) CALL hdfrdr(sd_id,"ctrlon", ctrlon, istat) ELSE IF (soilfmt == 7) THEN CALL netopen(TRIM(soilfile), 'R', sd_id) CALL net_get_soil(sd_id,nx,ny,nzsoil,nstyps,dx,dy, & mapproj,sclfct,trulat1,trulat2,trulon,ctrlat,ctrlon, & zpsoilin,tsoilin,qsoilin,wcanpin,snowdin,stypin,istat) ELSE ! alternate dump format ... WRITE(6,'(1x,3a)') 'The supported soil data format are ', & 'binary (soilfmt=1), HDF4 no compressed (soilfmt = 3).', & 'and NetCDF (soilfmt = 7).' CALL arpsstop('Soil data format is not supported.',1) END IF nstyps = MAX(nstyps, 1) ALLOCATE (zpsoil(nx,ny,nzsoil),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READCVTSOIL: ERROR allocating zpsoil, returning" RETURN END IF ALLOCATE (tsoil(nx,ny,nzsoil,0:nstyps),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READCVTSOIL: ERROR allocating tsoil, returning" RETURN END IF ALLOCATE (qsoil(nx,ny,nzsoil,0:nstyps),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READCVTSOIL: ERROR allocating qsoil, returning" RETURN END IF ALLOCATE (wetcanp(nx,ny,0:nstyps),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READCVTSOIL: ERROR allocating wetcanp, returning" RETURN END IF ALLOCATE (soiltyp(nx,ny,nstyps),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READCVTSOIL: ERROR allocating soiltyp, returning" RETURN END IF ALLOCATE (snowdpth(nx,ny),stat=istat) IF (istat /= 0) THEN WRITE (6,*) "READCVTSOIL: ERROR allocating snowdpth, returning" RETURN END IF WRITE (6,'(a//a,i1/6(a,f7.2/))') & ' The map projection and griding information for the soil data:', & ' Projection: ', mapproj, & ' The 1st real true latitude: ', trulat1, & ' The 2nd real true latitude: ', trulat2, & ' The real true longitude: ', trulon, & ' Map scale factor: ', sclfct, & ' Latitude at the origin: ', ctrlat, & ' Longitude at the origin: ', ctrlon ! !----------------------------------------------------------------------- ! ! Read in the soil data from the soil data file. ! !----------------------------------------------------------------------- ! IF (intver == intver410) THEN ALLOCATE(tem1(nx,ny,0:nstyps),stat=istat) ! for reading old version ! tsfc,tsoil,wetsfc,wetdp END IF IF (soilfmt == 1) THEN ! Fortran unformatted IF (intver == intver410) THEN WRITE (6, '(a/8(a,i2/))') ' Surface data flags for: ', & ' zpsoilin --', zpsoilin, & ' tsfcin --', tsfcin, & ' tsoilin --', tsoilin, & ' wsfcin --', wsfcin, & ' wdpin --', wdpin, & ' wcanpin --', wcanpin, & ' snowdin --', snowdin, & ' stypin --', stypin ELSE IF (intver == intver500) THEN WRITE (6, '(a/6(a,i2/))') ' Surface data flags for: ', & ' zpsoilin --', zpsoilin, & ' tsoilin --', tsoilin, & ' qsoilin --', qsoilin, & ' wcanpin --', wcanpin, & ' snowdin --', snowdin, & ' stypin --', stypin END IF IF (intver == intver410) THEN zpsoil(:,:,1)=0. zpsoil(:,:,2)=-1. ELSE IF (intver >= intver500) THEN IF (zpsoilin /= 0) THEN WRITE(6,'(a)') 'Read in the soil depth data' DO k=1,nzsoil READ (flunit,ERR=998) ((zpsoil(i,j,k),i=1,nx),j=1,ny) END DO END IF END IF ! intver IF (intver == intver410) THEN IF ( tsfcin /= 0 ) THEN WRITE(6,'(a)') 'Read in the surface skin temperature data' IF ( nstyps == 1 ) THEN READ (flunit,ERR=998) ((tem1(i,j,0),i=1,nx),j=1,ny) tsoil(:,:,1,0)=tem1(:,:,0) ELSE READ (flunit,ERR=998) tem1 tsoil(:,:,1,:)=tem1(:,:,:) 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 ( nstyps == 1 ) THEN READ (flunit,ERR=998) ((tem1(i,j,0),i=1,nx),j=1,ny) tsoil(:,:,2,0)=tem1(:,:,0) ELSE READ (flunit,ERR=998) tem1 tsoil(:,:,2,:)=tem1(:,:,:) 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 ( nstyps == 1 ) THEN READ (flunit,ERR=998) ((tem1(i,j,0),i=1,nx),j=1,ny) qsoil(:,:,1,0)=tem1(:,:,0) ELSE READ (flunit,ERR=998) tem1 qsoil(:,:,1,:)=tem1(:,:,:) 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 ( nstyps == 1 ) THEN READ (flunit,ERR=998) ((tem1(i,j,0),i=1,nx),j=1,ny) qsoil(:,:,2,0)=tem1(:,:,0) ELSE READ (flunit,ERR=998) tem1 qsoil(:,:,2,:)=tem1(:,:,:) END IF ELSE WRITE(6,'(a)') 'Variable wetdp is not in the data set.' END IF IF ( wcanpin /= 0 ) THEN IF ( nstyps == 1 ) THEN READ (flunit,ERR=998) ((wetcanp(i,j,0),i=1,nx),j=1,ny) ELSE READ (flunit,ERR=998) wetcanp 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 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 END IF ELSE IF (intver >= intver500) THEN IF ( tsoilin /= 0 ) THEN DO is=0,nstyps WRITE(6,'(a,i4)') 'Read in the soil temperature for soil type ',is DO k=1,nzsoil READ (flunit,ERR=998) ((tsoil(i,j,k,is),i=1,nx),j=1,ny) END DO END DO ELSE WRITE(6,'(a)') 'Variable tsoil is not in the data set.' END IF IF ( qsoilin /= 0 ) THEN DO is=0,nstyps WRITE(6,'(a,i4)') 'Read in the soil moisture data for soil type ',is DO k=1,nzsoil READ (flunit,ERR=998) ((qsoil(i,j,k,is),i=1,nx),j=1,ny) END DO END DO ELSE WRITE(6,'(a)') 'Variable qsoil is not in the data set.' END IF IF ( wcanpin /= 0 ) THEN DO is=0,nstyps WRITE (6, '(a,i4)') 'Read in the canopy water amount data for soil type ',is READ (flunit,ERR=998) ((wetcanp(i,j,is),i=1,nx),j=1,ny) END DO 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 DO is=1,nstyps WRITE (6, '(a,i4)') 'Read soil type of soil data for soil type ',is READ (flunit,ERR=998) ((soiltyp(i,j,is),i=1,nx),j=1,ny) END DO END IF END IF CLOSE ( flunit ) CALL retunit ( flunit ) ELSE IF (soilfmt == 3) THEN IF (intver <= intver410) THEN WRITE(6,'(a)') 'WARNING: No zpsoil is defined in this version. ' WRITE(6,'(a)') 'Assume zpsoil(,,1)=0 and zpsoil(,,2)=-1.' zpsoil(:,:,1)=0. zpsoil(:,:,2)=-1. CALL hdfrd3d(sd_id,"tsfc",nx,ny,nstyps+1,tem1,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 tsoil(:,:,1,:)=tem1(:,:,:) CALL hdfrd3d(sd_id,"tsoil",nx,ny,nstyps+1,tem1,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 tsoil(:,:,2,:)=tem1(:,:,:) CALL hdfrd3d(sd_id,"wetsfc",nx,ny,nstyps+1,tem1,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 qsoil(:,:,1,:)=tem1(:,:,:) CALL hdfrd3d(sd_id,"wetdp",nx,ny,nstyps+1,tem1,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 qsoil(:,:,2,:)=tem1(:,:,:) ELSE IF (intver >= intver500) THEN CALL hdfrd3d(sd_id,"zpsoil",nx,ny,nzsoil,zpsoil,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the soil layer depth data' zpsoilin = 1 ELSE WRITE(6,'(a)') 'Variable zpsoil is not in the data set.' zpsoilin = 0 END IF CALL hdfrd4d(sd_id,"tsoil",nx,ny,nzsoil,nstyps+1,tsoil,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the soil temperature data' tsoilin = 1 ELSE WRITE(6,'(a)') 'Variable tsoil is not in the data set.' tsoilin = 0 END IF CALL hdfrd4d(sd_id,"qsoil",nx,ny,nzsoil,nstyps+1,qsoil,stat, & itmp,atmp1,atmp2) IF (stat > 1) GO TO 998 IF (stat == 0) THEN WRITE(6,'(a)') 'Read in the soil moisture data' qsoilin = 1 ELSE WRITE(6,'(a)') 'Variable qsoil is not in the data set.' qsoilin = 0 END IF END IF CALL hdfrd3d(sd_id,"wetcanp",nx,ny,nstyps+1,wetcanp,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,nstyps,soiltyp,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) ELSE IF (soilfmt == 7) THEN ALLOCATE(var3d (nx-1,ny-1,MAX(nzsoil,nstyps+1)), STAT = istat) ALLOCATE(var3di(nx-1,ny-1,nstyps), STAT = istat) ALLOCATE(var4d (nx-1,ny-1,nzsoil,nstyps+1), STAT = istat) IF (zpsoilin == 1) THEN CALL netread3d(sd_id,0,0,"ZPSOIL",nx-1,ny-1,nzsoil,var3d) WRITE(6,'(1x,a)') 'Read in the soil layer depth data.' DO k = 1, nzsoil DO j = 1,ny-1 DO i = 1,nx-1 zpsoil(i,j,k) = var3d(i,j,k) END DO END DO END DO CALL edgfill(zpsoil,1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1,nzsoil) END IF IF (tsoilin == 1) THEN CALL netread4d(sd_id,0,0,"TSOIL",nx-1,ny-1,nzsoil,nstyps+1,var4d) WRITE(6,'(1x,a)') 'Read in the soil temperature data.' DO is = 0, nstyps DO k = 1, nzsoil DO j = 1,ny-1 DO i = 1,nx-1 tsoil(i,j,k,is) = var4d(i,j,k,is+1) END DO END DO END DO CALL edgfill(tsoil(:,:,:,is),1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1,nzsoil) END DO END IF IF (qsoilin == 1) THEN CALL netread4d(sd_id,0,0,"QSOIL",nx-1,ny-1,nzsoil,nstyps+1,var4d) WRITE(6,'(1x,a)') 'Read in the soil moisture data.' DO is = 0, nstyps DO k = 1, nzsoil DO j = 1,ny-1 DO i = 1,nx-1 qsoil(i,j,k,is) = var4d(i,j,k,is+1) END DO END DO END DO CALL edgfill(qsoil(:,:,:,is),1,nx,1,nx-1,1,ny,1,ny-1,1,nzsoil,1,nzsoil) END DO END IF IF (wcanpin == 1) THEN CALL netread3d(sd_id,0,0,"WETCANP",nx-1,ny-1,nstyps+1,var3d) WRITE (6, '(1x,a)') 'Read in the canopy water amount data.' DO is = 0, nstyps DO j = 1,ny-1 DO i = 1,nx-1 wetcanp(i,j,is) = var3d(i,j,is+1) END DO END DO END DO CALL edgfill(wetcanp,1,nx,1,nx-1,1,ny,1,ny-1,1,nstyps+1,1,nstyps+1) END IF IF (snowdin == 1) THEN CALL netread2d(sd_id,0,0,"SNOWDPTH",nx-1,ny-1,var3d) WRITE (6, '(1x,a)') 'Read in the snow depth data.' DO j = 1,ny-1 DO i = 1,nx-1 snowdpth(i,j) = var3d(i,j,1) END DO END DO CALL edgfill(snowdpth,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1) END IF IF (stypin == 1) THEN CALL netread3di(sd_id,0,0,"SOILTYP",nx-1,ny-1,nstyps,var3di) WRITE (6, '(1x,a)') 'Read in soil type of soil data.' DO is = 1, nstyps DO j = 1,ny-1 DO i = 1,nx-1 soiltyp(i,j,is) = var3di(i,j,is) END DO END DO END DO CALL iedgfill(soiltyp,1,nx,1,nx-1,1,ny,1,ny-1,1,nstyps,1,nstyps) END IF CALL netclose(sd_id) DEALLOCATE(var3d,var3di) DEALLOCATE(var4d) END IF IF (intver == intver410) THEN IF (tsfcin /= tsoilin .OR. wsfcin /= wdpin) THEN WRITE (6,'(1x,a,a/,a/,a/)') 'READCVTSOIL: WARNING: ', & 'The soilvar data is of version ', fmtver410, & '. The inconsistency flag between tsfcin and tsoilin, ',& ' or between wsfin and wdpin, may cause some problems. ' END IF tsoilin = max(tsfcin,tsoilin) qsoilin = max(wsfcin,wdpin) DEALLOCATE(tem1) END IF RETURN 998 WRITE (6,'(/a,i2/a)') ' Read error in soil data file ' & //soilfile//' with the I/O unit ',flunit, & 'The model will STOP in subroutine READCVTSOIL.' CALL arpsstop("arpsstop called from READCVTSOIL reading surface data",1) RETURN END SUBROUTINE readcvtsoil