! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSSFC20 ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! PROGRAM arpssfc20,41 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Prepare surface data file for ARPS model. ! ! The following data sets will be generated: ! ! soiltyp -- Soil type, translated from Wilson, M. F. and ! Henderson-Sellers soil type data set, array styp. ! Array styp was transferred from 1-byte data file to ! 4-integer ASCII file without changing the definition. ! (Original source: 1-degree 180x360 GED in CD-ROM) ! ! vegtyp -- Vegetation type, translated from Olson, J. S., World ! Ecosystems, array vtyp. The array vtyp was ! transferred from 1-byte data file to 4-integer ASCII ! file without changing the definition. ! (Original source: 10-minute 1080x2160 GED in CD-ROM) ! ! lai -- Leaf Area Index, calculated from the vegetation type, ! vegtyp and NDVI which is provided by Gallo, K. P., ! Normalized Difference Vegetation Index in GED CD-ROM ! and transferred from 1-byte data file to 4-integer ! ASCII file without changing the definition. ! (Original NDVI source: 10-minute 1080x2160 GED in ! CD-ROM) ! ! roufns -- Surface roughness which will be obtained from a data ! table vs. vegtyp. ! ! veg -- Vegetation fraction which will be obtained from a data ! table vs. vegtyp or the NESDIS green vegetation data ! set (Gutman and Ignatov, 1998). ! ! This program will put the these data sets into the ARPS ! model grid points. You may chose one of three different map ! projections. ! ! The structure of this program is as follows: ! ! 1. Determine the model domain and set up the analysis grid. ! (subroutine setgrd) ! ! 2. Read in the surface data set. ! (subroutine gtsfcdt) ! ! 3. Calculate: ! ! soil type (soiltyp); ! vegetation type (vegtyp); ! Leaf Area Index (lai); ! surface roughness (roufns). ! vegetation fraction (veg). ! ! (subroutine gtsoiltyp, gtvegtyp, gtndvi, and gtlai, gtrfns, and ! gtveg) ! ! 4. Output soiltyp, vegtyp, lai, roufns, and veg in ARPS model ! domain into the file sfcoutfl by calling WRTSFCDT. ! ! sfcoutfl is constructed to be runname(1:lfnkey)//".sfcdata ! ! 5. Plot the data for diagnostic purpose. ! (subroutine plot) ! !----------------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 02/20/94 ! ! MODIFICATIONS: ! ! 01/25/1995 (Y. Liu) ! Added the scheme that produce an artificial distribution of soil ! and vegetation parameters in two specified regions in ARPS domain. ! ! 02/07/1995 (Y. Liu) ! Added new 2-D array, veg, to the data set file. ! ! 05/08/1996 (Yuhe Liu) ! Added an adjustment to make soil type and vegetation type ! consistent with each other for ice and water surface. ! ! 02/20/1997 (Gene Bassett) ! Added look-up option for setting veg, lai, & roufns. Added nsmthsl, ! the number of smoothing passes to make, and altered code to average ! the LOG of roufns. ! ! 04/08/1997 (Leilei Wang and Vince Wong) ! Version 2.0 for STATSGO 1 km soil texture data. ! ! REFERENCE: ! Miller, D.A. and R.A. White. 1996. A soils dataset for ! environmental modeling applications in the United States. ! (To be submitted to Earth Interactions). ! ! 08/11/1997 (Leilei Wang and Vince Wong) ! Introduce 1km North American Land Cover Characteristic Data Set ! (Vegetation type data set and NDVI data set) into ARPS. ! Use GED data as background field in area outside US or North ! American. ! ! 10/10/1997 (Yuhe Liu) ! Added a call to print integer value for integer arrays at each ! grid point ! ! 04/15/1998 (Dan Weber) ! Added subroutine vegfrac to read in the vegetation fraction data ! set from NESDIS. This data set will overwrite any pre-existing ! value when data are present. The pre-existing data is generated ! using the veg type/table conversion. ! ! 07/16/1999 (Gene Bassett) ! Corrected dimensions passed into get_ged, getstyp2 & getndvi2. ! ! 2000/08/23 (Gene Bassett) ! Added F90 allocation of arrays. ! ! 2001/2/26 (Ming Xue) ! Cleaned up the code and reduced temporary storage usage. ! ! 2001/6/20 (Yunheng Wang) ! Modify main program and subroutine to reduce memory usage. ! ! 2001/07/26 (Gene Bassett) ! Moved calls to getstyp1, getvtyp1, getndvi1 inside get_statsgo ! and calls to getstyp2 getvtyp2 getvtyp2 inside get_ged to ! eliminate input variables colst,rowst,colvt,rowvt,colnv,&rownv. ! !----------------------------------------------------------------------- ! ! INPUT: ! ! Input read in from the input file, namelist &projection ! ! mapproj Type of map projection used to setup the analysis grid. ! mapproj = 1 Polar Stereographic projection ! = 2 Mercator projection ! = 3 Lambert ! ! 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 ! distance on map = (Distance on earth) * sclfct ! For ARPS model runs, generally this is 1.0. ! ! Input read in from the input file, namelist &modgrid ! ! dx Model grid spacing in the x-direction east-west (meters) ! dy Model grid spacing in the y-direction east-west (meters) ! ! ctrlat Latitude of the southwest corner of the analysis grid ! (deg. N) ! ctrlon Longitude of the southwest corner of the analysis grid ! (deg. E) ! ! Input read in from the input file, namelist &outflag ! ! 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 ! ! 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 soiltyp ! vtypout Flag for output of vegtyp ! 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 vegetation fraction ! ! 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 ! !----------------------------------------------------------------------- ! Variable Declarations. !----------------------------------------------------------------------- IMPLICIT NONE INCLUDE 'arpssfc.inc' INTEGER :: nx,ny,nz INTEGER :: nstyps INTEGER :: scol,srow PARAMETER (scol = 360,srow=180) INTEGER :: vncol,vnrow PARAMETER (vncol = 2160,vnrow=1080) CHARACTER (LEN=65 ) :: glab ! label for plots CHARACTER (LEN=255) :: fstypfl ! File name of soil data set CHARACTER (LEN=255) :: bstypfl ! File name of soil data set CHARACTER (LEN=255) :: fvtypfl ! File name of Vegetation data set CHARACTER (LEN=255) :: bvtypfl ! File name of Vegetation data set CHARACTER (LEN=255) :: fndvifl ! File name of foreground NDVI data CHARACTER (LEN=255) :: bndvifl ! File name of background NDVI data CHARACTER (LEN=255) :: lkupfl ! File name of look-up file CHARACTER (LEN=255) :: vfrcdr ! Directory name for vegetation ! fraction data file. INTEGER :: schmopt ! Scheme of options INTEGER :: sdatopt ! Soil type data options INTEGER :: vdatopt ! Vegetation type data options INTEGER :: ndatopt ! NDVI data options INTEGER :: vfrcopt ! Vegetation fraction option INTEGER :: nsmthsl ! Number of passes to smooth the data INTEGER :: fgbgni ! First index in x-direction in foreground region INTEGER :: fgendi ! Last index in x-direction in foreground region INTEGER :: fgbgnj ! First index in y-direction in foreground region INTEGER :: fgendj ! Last index in y-direction in foreground region INTEGER :: fgstyp ! Soil type for the foreground INTEGER :: fgvtyp ! Vegetation type for the foreground REAL :: fglai ! Leaf Area Index for the foreground REAL :: fgrfns ! Surface roughness for the foreground REAL :: fgveg ! Vegetation fraction for the foreground INTEGER :: bgstyp ! Soil type for the background INTEGER :: bgvtyp ! Vegetation type for the background REAL :: bglai ! Leaf Area Index for the background REAL :: bgrfns ! Surface roughness for the background REAL :: bgveg ! Vegetation fraction for the background INTEGER :: drawval ! Option to draw integer value at each grid point INTEGER, ALLOCATABLE :: ged_styp(:,:)! Background soil types INTEGER, ALLOCATABLE :: ged_vtyp(:,:)! Background vegetation types REAL, ALLOCATABLE :: ged_ndvi(:,:)! Background NDVI INTEGER, ALLOCATABLE :: soiltyp (:,:,:) ! Soil type in model domain REAL, ALLOCATABLE :: stypfrct(:,:,:) ! Fraction of soil types INTEGER, ALLOCATABLE :: vegtyp (:,:) ! Vegetation type in model domain REAL, ALLOCATABLE :: ndvi (:,:) ! NDVI in model domain REAL, ALLOCATABLE :: lai (:,:) ! Leaf Area Index in model domain REAL, ALLOCATABLE :: roufns (:,:) ! Surface roughness in model domain REAL, ALLOCATABLE :: veg (:,:) ! Vegetation fraction in model domain REAL, ALLOCATABLE :: vegin1 (:,:) ! Green Vegetation fraction data. ! for use in reading in the NESDIS ! green vegetation data set. month#1 REAL, ALLOCATABLE :: vegin2 (:,:) ! Green Vegetation fraction data. ! for use in reading in the NESDIS ! green vegetation data set. month#2 REAL, ALLOCATABLE :: x (:) ! Model grid point values in x-dir. REAL, ALLOCATABLE :: y (:) ! Model grid point values in y-dir. REAL, ALLOCATABLE :: x1 (:,:) ! Model grid point values in x-dir. REAL, ALLOCATABLE :: y1 (:,:) ! Model grid point values in y-dir. REAL, ALLOCATABLE :: xs (:) ! X coordinates for scalar fields REAL, ALLOCATABLE :: ys (:) ! Y coordinates for scalar fields REAL, ALLOCATABLE :: glat (:,:) ! Lat. of model grid REAL, ALLOCATABLE :: glon (:,:) ! Lon. of model grid REAL, ALLOCATABLE :: vegtbl(:) ! veg as a fuction of vtype. REAL, ALLOCATABLE :: laitbl(:) ! lai as a fuction of vtype. REAL, ALLOCATABLE :: z0tbl (:) ! z0 (:) as a fuction of vtype. INTEGER, ALLOCATABLE :: item3(:,:) ! Temporary array REAL, ALLOCATABLE :: rtem2(:,:) ! Temporary array REAL, ALLOCATABLE :: rtem3(:,:) ! Temporary array INTEGER :: itmp(1) !Temporary array pointer REAL :: rtmp(1) !Temporary array pointers !----------------------------------------------------------------------- ! Misc. local variables: !----------------------------------------------------------------------- CHARACTER (LEN=255) :: sfcoutfl, temchar INTEGER :: lfn INTEGER :: i,j, is, n INTEGER :: lenstr REAL :: resl REAL :: alatpro(2) ! Latitude at which the map projection ! is true (degees N) REAL :: alonpro ! Longitude at which the map ! projection is true (degrees E) REAL :: sclf ! Map scale factor (m) REAL :: cint ! Contour interval REAL :: tema, temb, temc, temd, t1, t2 INTEGER :: itema,itemb CHARACTER (LEN=12) :: nfile1,nfile2 ! for reading in the green vegetation ! fraction data set. !----------------------------------------------------------------------- ! Include files: !----------------------------------------------------------------------- INCLUDE 'globcst.inc' INCLUDE 'grid.inc' !----------------------------------------------------------------------- ! Namelists: !----------------------------------------------------------------------- NAMELIST /sfc_data_dims/ gvnx,gvny NAMELIST /soil_veg_data/ schmopt,sdatopt,vdatopt,ndatopt,vfrcopt, & nstyp,nsmthsl,fgbgni,fgendi,fgbgnj, & fgendj,fgstyp,fgvtyp,fglai,fgrfns,fgveg, & bgstyp,bgvtyp,bglai,bgrfns,bgveg, & stypout,vtypout,laiout, & rfnsout,vegout,ndviout,drawval, & fstypfl,bstypfl,fvtypfl,bvtypfl, & fndvifl,bndvifl,lkupfl,vfrcdr INCLUDE 'ext2arps.inc' ! Not actually needed by this program. ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Set default value of nsmthsl: nsmthsl = 1 drawval = 0 CALL initpara(nx,ny,nz,nstyps) nstyp = nstyps !wdt ! CALL initadas ! The adas parameters are not used by this program, ! ! but the name list blocks need to be read in sequence on ! ! Cray machines such as J90. ! ! READ(5, extdfile) ! These ext2arps parameters are not nssed by this program. ! ! They are read for the same reason given above. ! WRITE(6,'(a)')'Namelist block extdfile sucessfully read.' IF (sfcdmp == 0) sfcdmp = 1 ! Force the dumping of surface data ! since sfcdmp defaults to 0 in initpara. alatpro(1) = trulat1 alatpro(2) = trulat2 alonpro = trulon WRITE (6, '(a)') 'Read the namelist file.' READ (5, sfc_data_dims) READ (5, soil_veg_data) IF ( schmopt < 0 .OR. schmopt > 4 ) THEN WRITE (6,'(a,i2/a)') & 'Unrecognized scheme option: ', schmopt, & 'Program stopped' STOP END IF IF ( schmopt > 1 .AND. (sdatopt < 1 .OR. sdatopt > 2) ) THEN WRITE (6,'(a,i2/a)') & 'Unrecognized data option: ', sdatopt, & 'Program stopped' STOP END IF IF ( nstyp <= 0 ) THEN nstyp = 1 WRITE (6,'(a,i2)') & 'The nstyp must be greater than 0. Reset it to 1.' ELSE IF ( nstyp > nstyps ) THEN nstyp = nstyps WRITE (6,'(a,a,i2)') & 'The nstyp must be less than, or equal to nstyps. ', & 'Reset it to nstyps = ', nstyps END IF WRITE (6, '(/1x,a)') '&soil_veg_data' WRITE (6, '(3x,a,i4,a)') 'schmopt = ', schmopt,',' WRITE (6, '(3x,a,i4,a)') 'sdatopt = ', sdatopt,',' WRITE (6, '(3x,a,i4,a)') 'vdatopt = ', vdatopt,',' WRITE (6, '(3x,a,i4,a)') 'ndatopt = ', ndatopt,',' WRITE (6, '(3x,a,i4,a)') 'vfrcopt = ', vfrcopt,',' WRITE (6, '(3x,a,i4,a)') 'nstyp = ', nstyp, ',' WRITE (6, '(3x,a,i4,a)') 'nsmthsl = ', nsmthsl,',' WRITE (6, '(3x,a,i4,a)') 'fgbgni = ', fgbgni, ',' WRITE (6, '(3x,a,i4,a)') 'fgendi = ', fgendi, ',' WRITE (6, '(3x,a,i4,a)') 'fgbgnj = ', fgbgni, ',' WRITE (6, '(3x,a,i4,a)') 'fgendj = ', fgendi, ',' WRITE (6, '(3x,a,i4,a)') 'fgstyp = ', fgstyp, ',' WRITE (6, '(3x,a,i4,a)') 'fgvtyp = ', fgvtyp, ',' WRITE (6, '(3x,a,f10.3,a)') 'fglai = ', fglai, ',' WRITE (6, '(3x,a,f10.3,a)') 'fgrfns = ', fgrfns, ',' WRITE (6, '(3x,a,f10.3,a)') 'fgveg = ', fgveg, ',' WRITE (6, '(3x,a,i4,a)') 'bgstyp = ', bgstyp, ',' WRITE (6, '(3x,a,i4,a)') 'bgvtyp = ', bgvtyp, ',' WRITE (6, '(3x,a,f10.3,a)') 'bglai = ', bglai, ',' WRITE (6, '(3x,a,f10.3,a)') 'bgrfns = ', bgrfns, ',' WRITE (6, '(3x,a,f10.3,a)') 'bgveg = ', bgveg, ',' WRITE (6, '(3x,a,i4,a)') 'stypout = ', stypout,',' WRITE (6, '(3x,a,i4,a)') 'vtypout = ', vtypout,',' WRITE (6, '(3x,a,i4,a)') 'laiout = ', laiout, ',' WRITE (6, '(3x,a,i4,a)') 'rfnsout = ', rfnsout,',' WRITE (6, '(3x,a,i4,a)') 'vegout = ', vegout, ',' WRITE (6, '(3x,a,i4,a)') 'ndviout = ', ndviout,',' lenstr = LEN( fstypfl ) CALL strlnth( fstypfl, lenstr) WRITE (6, '(3x,a,a,a)') & 'fstypfl = ''', fstypfl(1:lenstr), ''',' lenstr = LEN( fvtypfl ) CALL strlnth( fvtypfl, lenstr) WRITE (6, '(3x,a,a,a)') & 'fvtypfl = ''', fvtypfl(1:lenstr), ''',' lenstr = LEN( fndvifl ) CALL strlnth( fndvifl, lenstr) WRITE (6, '(3x,a,a,a)') & 'fndvifl = ''', fndvifl(1:lenstr), ''',' lenstr = LEN( bstypfl ) CALL strlnth( bstypfl, lenstr) WRITE (6, '(3x,a,a,a)') & 'bstypfl = ''', bstypfl(1:lenstr), ''',' lenstr = LEN( bvtypfl ) CALL strlnth( bvtypfl, lenstr) WRITE (6, '(3x,a,a,a)') & 'bvtypfl = ''', bvtypfl(1:lenstr), ''',' lenstr = LEN( bndvifl ) CALL strlnth( bndvifl, lenstr) WRITE (6, '(3x,a,a,a)') & 'bndvifl = ''', bndvifl(1:lenstr), ''',' lenstr = LEN ( lkupfl ) CALL strlnth( lkupfl, lenstr) WRITE (6, '(3x,a,a,a)') & 'lkupfl = ''', lkupfl(1:lenstr), ''',' lenstr = LEN ( vfrcdr ) CALL strlnth( vfrcdr, lenstr) WRITE (6, '(3x,a,a,a)') & 'vfrcdr = ''', vfrcdr(1:lenstr), ''',' WRITE (6, '(3x,a,i4,a)') '&END' !----------------------------------------------------------------------- ! Allocate arrays. !----------------------------------------------------------------------- ALLOCATE(ged_styp(nx,ny)) ALLOCATE(ged_vtyp(nx,ny)) ALLOCATE(ged_ndvi(nx,ny)) ALLOCATE(soiltyp(nx,ny,nstyps)) ALLOCATE(stypfrct(nx,ny,nstyps)) ALLOCATE(vegtyp(nx,ny)) ALLOCATE(ndvi(nx,ny)) ALLOCATE(lai(nx,ny)) ALLOCATE(roufns(nx,ny)) ALLOCATE(veg(nx,ny)) ALLOCATE(vegin1(gvnx,gvny)) ALLOCATE(vegin2(gvnx,gvny)) ALLOCATE( ALLOCATE( ALLOCATE(x1(nx,ny)) ALLOCATE(y1(nx,ny)) ALLOCATE(xs(nx)) ALLOCATE(ys(ny)) ALLOCATE(glat(nx,ny)) ALLOCATE(glon(nx,ny)) ALLOCATE(vegtbl(nvegtyp)) ALLOCATE(laitbl(nvegtyp)) ALLOCATE(z0tbl(nvegtyp)) ALLOCATE(item3(nx,ny)) ALLOCATE(rtem2(nx,ny)) ALLOCATE(rtem3(nx,ny)) !----------------------------------------------------------------------- ! Set the grid for the model and the extended buffer area. !----------------------------------------------------------------------- CALL setgrd( nx,ny, x, y ) DO i = 1,nx xs(i) = x(i) + dx/2 ! for scalar coordinates END DO DO j = 1,ny ys(j) = y(j) + dy/2 ! for scalar coordinates END DO CALL xytoll( nx,ny, xs,ys, glat,glon ) DO j = 1, ny DO i = 1, nx glon(i,j) = MOD( glon(i,j) + 360., 360. ) END DO END DO !----------------------------------------------------------------------- ! Check if the specified region is in the ARPS domain !----------------------------------------------------------------------- IF ( schmopt == 1 .OR. schmopt == 2 ) THEN IF ( fgbgni > fgendi .OR. fgbgnj > fgendj ) THEN WRITE (6, '(a/a)') & 'The indeces for the specified region were not consistent.', & 'Program ARPSSFC12 stopped.' STOP END IF IF ( fgbgni < 1 .OR. fgendi > nx .OR. fgbgnj < 1 .OR. fgendj > ny ) THEN fgbgni = MAX( fgbgni, 1 ) fgendi = MIN( fgendi, nx ) fgbgnj = MAX( fgbgnj, 1 ) fgendj = MIN( fgendj, ny ) WRITE (6, '(a/a/a,i4,4x,a,i4,4x,a,i4,4x,a,i4/a)') & 'The specified foreground region was out of the ARPS domain,', & 'The adjusted region will be:', & 'fgbgni = ',fgbgni, 'fgendi = ',fgendi, & 'fgbgnj = ',fgbgnj, 'fgendj = ',fgendj, & 'Program ARPSSFC12 will continue.' END IF END IF !----------------------------------------------------------------------- ! For different schmopt, determine the soil and vegetation type, ! roughness and vegetation fraction. !----------------------------------------------------------------------- IF ( schmopt == 0 .OR. schmopt == 1 ) THEN ! User specified values nstyp = 1 DO j = 1, ny DO i = 1, nx soiltyp(i,j,1) = bgstyp stypfrct(i,j,1) = 1.0 vegtyp (i,j) = bgvtyp lai (i,j) = bglai roufns (i,j) = bgrfns veg (i,j) = bgveg END DO END DO ELSE IF ( schmopt == 2 .OR. schmopt == 3 .OR. schmopt == 4 ) THEN !----------------------------------------------------------------------- ! Determine the soil type for ARPS !----------------------------------------------------------------------- IF ( stypout /= 0 )THEN IF ( sdatopt == 1 ) THEN !----------------------------------------------------------------------- ! Get the STATSGO soil texture data and store in a subarray stypdat ! just enough to cover the model domain. ! Translate the soil classes data storged in stypdat into the USDA soil ! type categories. nstyp soil types with the highest percentages are ! then brought to the model grid points, with each type being associated ! with a value of soil type fraction. !----------------------------------------------------------------------- ! set up stypfrct for the areas where STATSGO doesn't cover stypfrct(:,:,1) = 1. stypfrct(:,:,2:nstyp) = 0. CALL get_statsgo(1,fstypfl,bstypfl,nx,ny,nstyp,x1,y1, & scol,srow,glat,glon,resl, soiltyp,stypfrct) ELSE IF ( sdatopt == 2 ) THEN !----------------------------------------------------------------------- ! Get the GED soil type data !----------------------------------------------------------------------- nstyp = 1 ! 1 only for now for this data set. !----------------------------------------------------------------------- ! Get the original translated surface soil data to array styp. ! Translate the soil classes data (stypdat) into the USDA soil type ! category and fill them into the model grid array soiltyp. !----------------------------------------------------------------------- CALL get_ged(1,bstypfl,nx,ny,scol,srow,resl,glon,glat, & soiltyp, rtmp ) stypfrct(:,:,1) = 1.0 END IF END IF !----------------------------------------------------------------------- ! Process vegetation type data !----------------------------------------------------------------------- IF ( vtypout /= 0 .OR. laiout /= 0 .OR. rfnsout /= 0 ) THEN IF ( vdatopt == 1 ) THEN !----------------------------------------------------------------------- ! Get the USGS North American 1km vegetation data just covering the ! model domain to array stypdat. ! Calculate vegetation type array using statistical method to get ! vegtyp(nx,ny) !----------------------------------------------------------------------- CALL get_statsgo(2,fvtypfl,bvtypfl,nx,ny,nstyp,x1,y1, & vncol,vnrow,glat,glon,resl,vegtyp,rtmp) ELSE IF ( vdatopt == 2 ) THEN !----------------------------------------------------------------------- ! Get the original translated World Ecosystem Classes of vegetation ! data to array vegtyp. ! Transfer the World Ecosystem Classes data into the 12 vegetation ! type categories and fill into model grid array, vegtyp(nx,ny) !----------------------------------------------------------------------- CALL get_ged(2, bvtypfl,nx,ny,vncol,vnrow,resl,glon,glat, & vegtyp,rtmp) END IF IF ( schmopt == 4 ) THEN CALL gtlkuptbl( lkupfl, vegtbl, laitbl, z0tbl ) ELSE IF ( ndatopt == 1 ) THEN !----------------------------------------------------------------------- ! Get the USGS 1km monthly byteNDVI data just covering the ! model domain to array stypdat. ! Calculate real NDVI type data using statistical method to get ! ndvi(nx,ny) !----------------------------------------------------------------------- CALL get_statsgo(3,fndvifl,bndvifl,nx,ny,nstyp,x1,y1, & vncol,vnrow,glat,glon,resl,itmp,ndvi) ELSE IF ( ndatopt == 2 ) THEN !----------------------------------------------------------------------- ! Get the original translated byte-NDVI data to array ndvibyt. ! Calculate the real-NDVI data from byte-NDVI and fill into model ! grid array, ndvi(nx,ny) !----------------------------------------------------------------------- CALL get_ged(3,bndvifl,nx,ny,vncol,vnrow,resl,glon,glat, & itmp,ndvi) END IF END IF END IF IF ( laiout /= 0 ) THEN !----------------------------------------------------------------------- ! Calculate the Leaf Area Index array, lai(nx,ny), from the NDVI ! data and vegetation type data, in the model grid. !----------------------------------------------------------------------- IF ( schmopt == 4 ) THEN CALL gtlaitbl( nx,ny, vegtyp, laitbl, lai ) ELSE CALL getlai( nx,ny, vegtyp, ndvi, lai ) END IF END IF IF ( rfnsout /= 0 ) THEN ! !----------------------------------------------------------------------- ! Get the surface roufness from the tabledata vs vegtyp. !----------------------------------------------------------------------- ! IF ( schmopt == 4 ) THEN CALL gtrfnstbl( nx,ny, vegtyp, z0tbl, roufns ) ELSE CALL getrfns( nx,ny, vegtyp, roufns ) END IF END IF IF ( vegout /= 0 ) THEN ! !----------------------------------------------------------------------- ! Get the vegetation fraction from the tabledata vs vegtyp. ! ! Allow the vegetation table/fraction conversion to proceed. ! It will be overwritten with data from NESDIS if gvfrcopt=1, only ! in the location where data are present. ! Reference: Gutman and Ignotov, 1998 in press. !----------------------------------------------------------------------- ! CALL getveg( nx,ny, vegtyp, veg ) IF ( schmopt == 4 ) THEN ! use the vegetation type conversion table method. CALL gtvegtbl( nx,ny, vegtyp, vegtbl, veg ) ! old code... END IF IF(vfrcopt == 1)THEN ! over write the table derived values ! where we have data..... CALL gvegfrac(nx,ny,vfrcdr,glat,glon,vegin1,vegin2,veg) END IF END IF ! !----------------------------------------------------------------------- ! Smooth lai, log(roufns), and veg. !----------------------------------------------------------------------- ! IF ( rfnsout /= 0 ) THEN DO j = 1,ny DO i = 1,nx rtem3(i,j) = LOG ( MAX(0.00001,roufns(i,j)) ) END DO END DO END IF DO n = 1,nsmthsl IF ( laiout /= 0 ) THEN CALL smooth25p( lai, nx,ny,1,nx,1,ny, rtem2 ) END IF IF ( rfnsout /= 0 ) THEN CALL smooth25p( rtem3, nx,ny,1,nx,1,ny, rtem2 ) END IF IF ( vegout /= 0 ) THEN CALL smooth25p( veg, nx,ny,1,nx,1,ny, rtem2 ) END IF IF ( ndviout /= 0 ) THEN CALL smooth25p( ndvi, nx,ny,1,nx,1,ny, rtem2 ) END IF END DO IF ( rfnsout /= 0 ) THEN DO j = 1,ny DO i = 1,nx roufns(i,j) = EXP ( rtem3(i,j) ) END DO END DO END IF ELSE WRITE (6, '(a,i4/a)') 'Unexpected schmopt: ',schmopt, & 'Program ARPSSFC12 stopped here' STOP END IF ! !----------------------------------------------------------------------- ! Set the data sets for the foreground region. !----------------------------------------------------------------------- ! IF ( schmopt == 1 .OR. schmopt == 2 ) THEN DO j = fgbgnj, fgendj DO i = fgbgni, fgendi soiltyp(i,j,1) = fgstyp vegtyp (i,j) = fgvtyp lai (i,j) = fglai roufns (i,j) = fgrfns veg (i,j) = fgveg END DO END DO END IF ! !----------------------------------------------------------------------- ! Eliminate the inconsistence over water between soil type and ! vegetation type !----------------------------------------------------------------------- ! DO is=1,nstyp DO j=1,ny DO i=1,nx IF ( vegtyp(i,j) == 14 ) THEN soiltyp(i,j,is) = 13 END IF END DO END DO END DO ! !----------------------------------------------------------------------- ! Write out a surface property data file !----------------------------------------------------------------------- ! sfcoutfl = runname(1:lfnkey)//".sfcdata" lfn = lfnkey + 7 IF( dirname /= ' ' ) THEN temchar = sfcoutfl sfcoutfl = dirname(1:ldirnam)//'/'//temchar lfn = lfn + ldirnam + 1 END IF CALL fnversn(sfcoutfl, lfn) PRINT *, 'Write surface property data in ',sfcoutfl(1:lfn) CALL wrtsfcdt(nx,ny,nstyp, sfcoutfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & stypout,vtypout,laiout,rfnsout,vegout,ndviout, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) ! !----------------------------------------------------------------------- ! Creating the GrADS control file for data display !----------------------------------------------------------------------- ! IF (sfcdmp == 1) CALL sfccntl( nx,ny, sfcoutfl, & stypout,vtypout,laiout,rfnsout,vegout,ndviout, & x,y, item3,rtem2 ) ! !----------------------------------------------------------------------- ! Plotting out the results using NCAR graphics !----------------------------------------------------------------------- ! CALL opngks tema = glat(1,ny) temb = glon(1,ny) temc = glat(nx,1) temd = glon(nx,1) PRINT *, 'The up-left corner (lat,lon) is ',tema,temb PRINT *, 'The down-right corner (lat,lon) is ',temc,temd DO is=1,nstyp WRITE (glab,'(a,i1,a)') 'Soil Type ',is,' in Model Grid' IF ( drawval == 0 ) THEN DO j = 1, ny DO i = 1, nx rtem2(i,j) = FLOAT( soiltyp(i,j,is) ) END DO END DO cint = 1 CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,rtem2 ) ELSE CALL plotint( nx,ny,nx, mapproj,alatpro,alonpro, & tema,temb,temc,temd,glab,soiltyp(1,1,is) ) END IF cint = 0 WRITE (glab,'(a,i1,a)') & 'Fraction of Soil Type ',is,' in Model Grid' CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,stypfrct(1,1,is) ) END DO WRITE (glab,'(a)') 'Vegetation Type in Model Grid' IF ( drawval == 0 ) THEN DO j = 1, ny DO i = 1, nx rtem2(i,j) = FLOAT( vegtyp(i,j) ) END DO END DO cint = 1 CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,rtem2 ) ELSE CALL plotint( nx,ny,nx, mapproj,alatpro,alonpro, & tema,temb,temc,temd,glab,vegtyp ) END IF cint = 0 WRITE (glab,'(a)') 'Leaf Area Index in Model Grid' CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,lai ) WRITE (glab,'(a)') 'Surface Roughness' CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,roufns ) WRITE (glab,'(a)') 'Vegetation Fraction' CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,veg ) cint = 0.05 WRITE (glab,'(a)') 'NDVI' CALL plot( nx,ny,nx, mapproj,alatpro,alonpro, cint, & tema,temb,temc,temd,glab,ndvi ) CALL clsgks STOP END PROGRAM arpssfc20