PROGRAM wrfstatic,41 ! !################################################################## !################################################################## !###### ###### !###### PROGRAM WRFSTATIC ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! ! ! PURPOSE: ! ! Read static file sets and produce static file for ARPS2WRF & WRF. ! ! NOTE: ! o It will replace both grid_gen.exe and staticpost in WRFSI. ! o This program shares the same namelist input file as ARPS2WRF ! for convenience with an extra namelist variable for static ! dataset directory in input/arps2wrf.input. ! ! Required Static datasets (the same as WRFSI requirements): ! ! 1. albedo_ncep ! 2. greenfrac ! 3. islope ! 4. landuse_30s ! 5. maxsnowalb ! 6. soiltemp_1deg ! 7. soiltype_bot_30s ! 8. soiltype_top_30s ! *. topo_30s (not required for ARPS2WRF, because terrain will ! be provided by arpstrn/arpstern.) ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang (09/28/2005) ! Created initially based on WRFSIV2.1. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! USE wrf_metadata ! WRF constants and metadata !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! IMPLICIT NONE !---------------------------------------------------------------------- ! ! ARPS grid variables ! !--------------------------------------------------------------------- INTEGER, PARAMETER :: nhisfile_max = 100 INTEGER, PARAMETER :: max_vertical_levels = 100 CHARACTER(LEN=256) :: grdbasfn CHARACTER(LEN=256) :: bdybasfn(nhisfile_max) CHARACTER(LEN=256) :: hisfile(nhisfile_max) INTEGER :: hinfmt,nhisfile,lengbf CHARACTER(LEN=80) :: execname ! !----------------------------------------------------------------------- ! ! ARPS include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! !----------------------------------------------------------------------- ! ! Variables for split files ! !----------------------------------------------------------------------- INTEGER :: nprocx_in, nprocy_in INTEGER :: nxsm, nysm INTEGER, PARAMETER :: fzone_arps = 3 INTEGER, PARAMETER :: fzone_wrf = 1 !----------------------------------------------------------------------- ! ! ARPS variables to be read in: ! !----------------------------------------------------------------------- ! INTEGER :: nx,ny,nz ! Grid dimensions for ARPS. INTEGER :: nzsoil ! Soil levels INTEGER :: nstyps ! Maximum number of soil types. INTEGER :: mapproj REAL :: sclfct REAL :: trulat1, trulat2, trulon REAL :: ctrlat, ctrlon REAL :: dx, dy REAL :: time !----------------------------------------------------------------------- ! ! Namelist definitions for ARPS2WRF.input ! ! sfcdt Specify surface characteristics ! bdyspc Obtain boundary input files (ARPS format) ! wrf_grid Define WRF horizontal and vertical grid ! interp_options Choose interpolation scheme ! wrf_opts WRF options from namelist.input ! output Ouput options ! !----------------------------------------------------------------------- ! INTEGER :: nx_wrf ! = nx-2 if the same grid as ARPS INTEGER :: ny_wrf ! = ny-2 if the same grid as ARPS INTEGER :: nz_wrf INTEGER :: nzsoil_wrf REAL :: dx_wrfscl ! grid length times map scale REAL :: dy_wrfscl REAL :: lattru_wrf(2) ! array of true latitude of WRF map projection REAL :: lontru_wrf ! true longitude of WRF map projection ! = trulon_wrf REAL :: sclf_wrf ! map scale factor (usually = 1.0) ! Namelist variable declaration CHARACTER(LEN=5) :: sfcinitopt ! either "ARPS" or "WRFSI" CHARACTER(LEN=256):: static_dir CHARACTER(LEN=19) :: start_date REAL :: wvln, silwt INTEGER :: use_arps_grid ! Use ARPS horizontal grid as WRF grid INTEGER :: mapproj_wrf ! Type of map projection in WRF model grid ! modproj = 1 Polar Stereographic ! projection. ! = 2 Mercator projection. ! = 3 Lambert projection. REAL :: sclfct_wrf ! Map scale factor. ! Distance on map, between two latitudes ! trulat1 and trulat2, ! is = (Distance on earth)*sclfct. ! For ARPS model runs, ! generally this is 1.0 REAL :: trulat1_wrf, trulat2_wrf, trulon_wrf ! 1st, 2nd real true latitude and true longitude ! of WRF map projection REAL :: ctrlat_wrf ! Center latitude of WRF model domain (deg. N) REAL :: ctrlon_wrf ! Center longitude of WRF model domain (deg. E) REAL :: dx_wrf ! WRF Grid spacing in x-direction REAL :: dy_wrf ! WRF Grid spacing in y-direction INTEGER :: spec_bdy_width INTEGER :: mp_physics INTEGER :: io_form INTEGER :: idummy REAL :: rdummy REAL :: rdumary(max_vertical_levels) CHARACTER(LEN=256) :: cdummy !----------------------------------------------------------------------- ! ! WRF grid related variables ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: x_wrf(:) ! X coordinate of WRF U points REAL, ALLOCATABLE :: y_wrf(:) ! Y coordinate of WRF V points REAL, ALLOCATABLE :: xs_wrf(:) ! X coordinate of WRF mass points REAL, ALLOCATABLE :: ys_wrf(:) ! Y coordinate of WRF mass points REAL, ALLOCATABLE :: lat_wrf(:,:,:) ! WRF grid point latitudes REAL, ALLOCATABLE :: lon_wrf(:,:,:) ! WRF grid point lontitudes REAL, ALLOCATABLE :: msft_wrf(:,:) ! Map scale factor on mass grid REAL, ALLOCATABLE :: msfu_wrf(:,:) ! Map scale factor on u grid REAL, ALLOCATABLE :: msfv_wrf(:,:) ! Map scale factor on v grid REAL, ALLOCATABLE :: cosalpha(:,:) REAL, ALLOCATABLE :: sinalpha(:,:) REAL, ALLOCATABLE :: f(:,:) REAL, ALLOCATABLE :: e(:,:) REAL, ALLOCATABLE :: hgt(:,:) REAL, ALLOCATABLE :: topostdv(:,:) REAL, ALLOCATABLE :: toposlpx(:,:) REAL, ALLOCATABLE :: toposlpy(:,:) REAL, ALLOCATABLE :: landuse(:,:) REAL, ALLOCATABLE :: landmask(:,:) REAL, ALLOCATABLE :: landusef(:,:,:) REAL, ALLOCATABLE :: soilctop(:,:,:) REAL, ALLOCATABLE :: soilcbot(:,:,:) REAL, ALLOCATABLE :: green12m(:,:,:) REAL, ALLOCATABLE :: albdo12m(:,:,:) REAL, ALLOCATABLE :: shdmax(:,:) REAL, ALLOCATABLE :: shdmin(:,:) REAL, ALLOCATABLE :: tmn(:,:) REAL, ALLOCATABLE :: slopecat(:,:) REAL, ALLOCATABLE :: snoalb(:,:) REAL :: xsub0, ysub0 REAL :: lat_ll(4), lat_lr(4), lat_ul(4), lat_ur(4) REAL :: lon_ll(4), lon_lr(4), lon_ul(4), lon_ur(4) !----------------------------------------------------------------------- ! ! Temporary working arrays ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: tem2d1(:,:), tem2d2(:,:), tem2d3(:,:) REAL, ALLOCATABLE :: tem3d(:,:,:) !----------------------------------------------------------------------- ! ! Misc local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,n INTEGER :: istatus, lenstr, ireturn INTEGER :: abstime INTEGER :: iter LOGICAL :: fexist,dem_data REAL :: latnot(2),ctrx, ctry, swx, swy CHARACTER(LEN=200) :: filename, tmpstr CHARACTER(LEN=24) :: times_str INTEGER :: nchr, ncid, nchout REAL, PARAMETER :: eps = 1.0E-5 CHARACTER(LEN=16), PARAMETER :: setnames(9) = (/ 'topo_30s ', & 'landuse_30s ', 'islope ', 'greenfrac ', & 'maxsnowalb ', 'soiltemp_1deg ', 'soiltype_bot_30s', & 'soiltype_top_30s', 'albedo_ncep ' /) CHARACTER(LEN=2), PARAMETER :: setindx(9) = (/ '/U', & '/V', '/I', '/G', & '/M', '/T', '/O', & '/O', '/A' /) INTEGER, PARAMETER :: TOPO = 1, LUSE = 2, ISLOPE = 3, & GFRAC= 4, SNOWALB = 5, SOILTMP= 6, & SOILTB=7, SOILTT = 8, ALBEDO = 9 CHARACTER(LEN=200) :: path_to_soiltemp_1deg COMMON /lapscmn/ path_to_soiltemp_1deg REAL :: projrot_latlon REAL :: projrot_deg REAL :: bilinear_interp !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! WRITE(6,'(10(/5x,a),/)') & '###############################################################',& '###############################################################',& '#### ####',& '#### Welcome to WRFSTATIC ####',& '#### ####',& '#### Program that reads in static datasets and generates ####',& '#### WRF static file for ARPS2WRF or WRF. ####',& '#### ####',& '###############################################################',& '###############################################################' !----------------------------------------------------------------------- ! ! First, read namelist input ! !----------------------------------------------------------------------- CALL readnamelist(1,hinfmt,bdybasfn,hisfile,nhisfile, & nx,ny,idummy,idummy,idummy,nprocx_in,nprocy_in,idummy,idummy, & use_arps_grid,nx_wrf,ny_wrf,idummy,rdumary,rdummy, & mapproj_wrf,sclfct_wrf,lattru_wrf,lontru_wrf, & ctrlat_wrf,ctrlon_wrf,dx_wrf,dy_wrf,rdummy,rdummy, & sfcinitopt,static_dir,start_date,silwt,wvln, & idummy,idummy,rdummy,spec_bdy_width, & idummy,rdummy,rdummy,rdummy,mp_physics,idummy, & idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy,io_form, & idummy,cdummy,istatus) trulat1_wrf = lattru_wrf(1) trulat2_wrf = lattru_wrf(2) trulon_wrf = lontru_wrf WRITE(grdbasfn,'(a)') bdybasfn(1) nz_wrf = 1 nzsoil_wrf = 1 nproc_x = 1 nproc_y = 1 loc_x = 1 loc_y = 1 myproc = 0 readsplit = 0 execname = 'WRFSTATIC' !-------------------------------------------------------------------- ! ! Begin to set WRF horizontal grid ! !-------------------------------------------------------------------- IF (use_arps_grid == 1) THEN lengbf = LEN_TRIM(grdbasfn) IF (nprocx_in > 1 .OR. nprocy_in > 1) THEN WRITE(grdbasfn(lengbf+1:lengbf+5),'(a,i2.2,i2.2)') '_',1,1 lengbf = lengbf + 5 END IF WRITE(6,'(1x,/2a)') ' Reading file: ',grdbasfn(1:lengbf) CALL get_arps_dims_atts(nchr,hinfmt,grdbasfn,lengbf, & nx,ny,nz,nzsoil,nstyps, & year,month,day,hour,minute,second,time, & mapproj, sclfct,trulat1,trulat2,trulon, & ctrlat,ctrlon,dx,dy,ireturn) IF( ireturn /= 0 ) CALL arpsstop('dtaread errors.',1) nxsm = nx nysm = ny IF (nprocx_in > 1 .OR. nprocy_in > 1) THEN nx = (nxsm-fzone_arps)*nprocx_in + fzone_arps ny = (nysm-fzone_arps)*nprocy_in + fzone_arps END IF nx_wrf = nx - 2 ny_wrf = ny - 2 mapproj_wrf = mapproj sclfct_wrf = sclfct trulat1_wrf = trulat1 trulat2_wrf = trulat2 trulon_wrf = trulon ctrlat_wrf = ctrlat ctrlon_wrf = ctrlon dx_wrf = dx dy_wrf = dy WRITE(6,'(a38)') ' ARPS grid WRF grid' WRITE(6,'(a38)') ' ========== ==========' WRITE(6,'(a,I10,4x,I10)') ' nx = ',nx,nx_wrf WRITE(6,'(a,I10,4x,I10)') ' ny = ',ny,ny_wrf WRITE(6,'(a,I10,4x,I10)') ' mapproj = ',mapproj,mapproj_wrf WRITE(6,'(a,F10.2,4x,F10.2)') ' sclfct = ',sclfct,sclfct_wrf WRITE(6,'(a,F10.2,4x,F10.2)') ' trulat1 = ',trulat1,trulat1_wrf WRITE(6,'(a,F10.2,4x,F10.2)') ' trulat2 = ',trulat2,trulat2_wrf WRITE(6,'(a,F10.2,4x,F10.2)') ' trulon = ',trulon,trulon_wrf WRITE(6,'(a,F10.2,4x,F10.2)') ' ctrlat = ',ctrlat,ctrlat_wrf WRITE(6,'(a,F10.2,4x,F10.2)') ' ctrlon = ',ctrlon,ctrlon_wrf WRITE(6,'(a,F10.0,4x,F10.0)') ' dx = ',dx,dx_wrf WRITE(6,'(a,F10.0,4x,F10.0)') ' dy = ',dy,dy_wrf CALL ctim2abss( year,month,day,hour,minute,second, abstime ) abstime = abstime + INT(time) CALL abss2ctim( abstime, year, month, day, hour, minute, second ) WRITE(start_date,'(I4.4,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2)') & year,'-',month,'-',day,'_',hour,':',minute,':',second END IF times_str = start_date !--------------------------------------------------------------------------- ! ! Allocate WRF arrays ! !--------------------------------------------------------------------------- ALLOCATE(x_wrf (nx_wrf), STAT = istatus) ALLOCATE(y_wrf (ny_wrf), STAT = istatus) ALLOCATE(xs_wrf(nx_wrf), STAT = istatus) ALLOCATE(ys_wrf(ny_wrf), STAT = istatus) ALLOCATE(lat_wrf(nx_wrf,ny_wrf,3), STAT = istatus) ! mass grid ALLOCATE(lon_wrf(nx_wrf,ny_wrf,3), STAT = istatus) ALLOCATE(msft_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(msfu_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(msfv_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(f(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(e(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(cosalpha(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(sinalpha(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(hgt(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(topostdv(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(toposlpx(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(toposlpy(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(landuse (nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(landmask(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(slopecat(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(tmn(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(snoalb(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(shdmax(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(shdmin(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(landusef(nx_wrf,ny_wrf,LanduseCategories), STAT = istatus) ALLOCATE(soilctop(nx_wrf,ny_wrf,SoilCategories), STAT = istatus) ALLOCATE(soilcbot(nx_wrf,ny_wrf,SoilCategories), STAT = istatus) ALLOCATE(green12m(nx_wrf,ny_wrf,12), STAT = istatus) ALLOCATE(albdo12m(nx_wrf,ny_wrf,12), STAT = istatus) ALLOCATE(tem2d1(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(tem2d2(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(tem2d3(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(tem3d (nx_wrf,ny_wrf,LanduseCategories), STAT = istatus) msft_wrf = 0.0 msfu_wrf = 0.0 msfv_wrf = 0.0 ! !----------------------------------------------------------------------- ! ! Establish WRF map projection ! !----------------------------------------------------------------------- ! lattru_wrf(1) = trulat1_wrf lattru_wrf(2) = trulat2_wrf lontru_wrf = trulon_wrf sclf_wrf = 1.0/sclfct_wrf dx_wrfscl = dx_wrf*sclf_wrf dy_wrfscl = dy_wrf*sclf_wrf CALL setmapr(mapproj_wrf,sclf_wrf,lattru_wrf,lontru_wrf) CALL lltoxy( 1,1, ctrlat_wrf,ctrlon_wrf, ctrx, ctry ) swx = ctrx - 0.5*(nx_wrf-1) * dx_wrfscl swy = ctry - 0.5*(ny_wrf-1) * dy_wrfscl CALL setorig( 1, swx, swy) xsub0 = dx_wrf * (nx_wrf-fzone_wrf) * (loc_x-1) ysub0 = dy_wrf * (ny_wrf-fzone_wrf) * (loc_y-1) DO i=1,nx_wrf x_wrf(i)= sclf_wrf*xsub0 + (i-1)*dx_wrfscl END DO DO j=1,ny_wrf y_wrf(j)= sclf_wrf*ysub0 + (j-1)*dy_wrfscl END DO DO i=1,nx_wrf-1 xs_wrf(i)=0.5*(x_wrf(i)+x_wrf(i+1)) END DO xs_wrf(nx_wrf)=2.*xs_wrf(nx_wrf-1)-xs_wrf(nx_wrf-2) DO j=1,ny_wrf-1 ys_wrf(j)=0.5*(y_wrf(j)+y_wrf(j+1)) END DO ys_wrf(ny_wrf)=2.*ys_wrf(ny_wrf-1)-ys_wrf(ny_wrf-2) !----------------------------------------------------------------------- ! ! Find latitude and longitude of WRF grid. ! !----------------------------------------------------------------------- CALL xytoll(nx_wrf,ny_wrf,xs_wrf,ys_wrf, & lat_wrf(:,:,1),lon_wrf(:,:,1)) ! T points CALL xytoll(nx_wrf,ny_wrf,x_wrf,ys_wrf, & lat_wrf(:,:,2),lon_wrf(:,:,2)) ! U points CALL xytoll(nx_wrf,ny_wrf,xs_wrf,y_wrf, & lat_wrf(:,:,3),lon_wrf(:,:,3)) ! V points !----------------------------------------------------------------------- ! ! Find Map scale factor ! !----------------------------------------------------------------------- CALL lattomf(nx_wrf,ny_wrf,lat_wrf(:,:,1),msft_wrf) !mass points CALL lattomf(nx_wrf,ny_wrf,lat_wrf(:,:,2),msfu_wrf) !U points CALL lattomf(nx_wrf,ny_wrf,lat_wrf(:,:,3),msfv_wrf) !V points !----------------------------------------------------------------------- ! ! Latitude and Longitude variables at corns ! !----------------------------------------------------------------------- ! ! Latitude, 1 -- T point, 2 -- U point, 3 -- V point, 4 -- massless point ! lat_ll(1) = lat_wrf( 1, 1,1) lat_ul(1) = lat_wrf( 1,ny_wrf-1,1) lat_ur(1) = lat_wrf(nx_wrf-1,ny_wrf-1,1) lat_lr(1) = lat_wrf(nx_wrf-1, 1,1) lon_ll(1) = lon_wrf( 1, 1,1) lon_ul(1) = lon_wrf( 1,ny_wrf-1,1) lon_ur(1) = lon_wrf(nx_wrf-1,ny_wrf-1,1) lon_lr(1) = lon_wrf(nx_wrf-1, 1,1) lat_ll(2) = lat_wrf( 1, 1,2) lat_ul(2) = lat_wrf( 1,ny_wrf-1,2) lat_ur(2) = lat_wrf(nx_wrf, ny_wrf-1,2) lat_lr(2) = lat_wrf(nx_wrf, 1,2) lon_ll(2) = lon_wrf( 1, 1,2) lon_ul(2) = lon_wrf( 1,ny_wrf-1,2) lon_ur(2) = lon_wrf(nx_wrf, ny_wrf-1,2) lon_lr(2) = lon_wrf(nx_wrf, 1,2) lat_ll(3) = lat_wrf( 1, 1,3) lat_ul(3) = lat_wrf( 1, ny_wrf,3) lat_ur(3) = lat_wrf(nx_wrf-1, ny_wrf,3) lat_lr(3) = lat_wrf(nx_wrf-1, 1,3) lon_ll(3) = lon_wrf( 1, 1,3) lon_ul(3) = lon_wrf( 1, ny_wrf,3) lon_ur(3) = lon_wrf(nx_wrf-1, ny_wrf,3) lon_lr(3) = lon_wrf(nx_wrf-1, 1,3) CALL xytoll(1,1,x_wrf(1), y_wrf(1), lat_ll(4),lon_ll(4)) CALL xytoll(1,1,x_wrf(1), y_wrf(ny_wrf),lat_ul(4),lon_ul(4)) CALL xytoll(1,1,x_wrf(nx_wrf),y_wrf(ny_wrf),lat_ur(4),lon_ur(4)) CALL xytoll(1,1,x_wrf(nx_wrf),y_wrf(1), lat_lr(4),lon_lr(4)) DO j=1,ny_wrf-1 DO i=1,nx_wrf-1 f(i,j) =2*omega_ear*SIN(lat_wrf(i,j,1)*d2rfactor) e(i,j) =2*omega_ear*COS(lat_wrf(i,j,1)*d2rfactor) END DO END DO DO j=1,ny_wrf-1 DO i=1,nx_wrf-1 projrot_deg = projrot_latlon(mapproj_wrf,trulat1_wrf, & trulat2_wrf,trulon_wrf,ctrlat_wrf,ctrlon_wrf,& lat_wrf(i,j,1),lon_wrf(i,j,1),istatus) IF(istatus == 1)THEN sinalpha(i,j) = SIN(d2rfactor*projrot_deg) cosalpha(i,j) = COS(d2rfactor*projrot_deg) ELSE CALL wrf_debug(1,'WARNING: Problem in projrot_latlon.') END IF END DO END DO !---------------------- Terrain USGS 30 sec -------------------------- ! type = U ! symbol = TOPO lenstr = LEN_TRIM(static_dir) WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(TOPO)),setindx(TOPO) CALL rdgeodat(nx_wrf,ny_wrf,x_wrf,y_wrf,dx_wrf, & dy_wrf,TRIM(tmpstr),wvln,silwt,1, & tem2d1,tem3d,tem2d2,tem2d3,dem_data,istatus) hgt(:,:)=0.0 DO j = 2,ny_wrf DO i = 2,nx_wrf hgt(i-1,j-1) = bilinear_interp(i,j,nx_wrf,ny_wrf,tem2d1) END DO END DO WHERE( (hgt(:,:)< 0.01) .AND. (hgt(:,:)> -0.01) ) hgt(:,:) = 0.0 topostdv(:,:) = tem3d (:,:,1) ! Actually, they are over non-stagger points, why? toposlpx(:,:) = tem2d2(:,:) toposlpy(:,:) = tem2d3(:,:) ! ------------------- 30s Landuse ------------------------- ! type = V ! symbol = LUSE wvln = 2.0 ! they will be fixed from now on silwt = 0.0 WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(LUSE)),setindx(LUSE) CALL rdgeodat(nx_wrf,ny_wrf,xs_wrf,ys_wrf,dx_wrf, & dy_wrf,TRIM(tmpstr),wvln,silwt,LanduseCategories, & tem2d1,tem3d,tem2d2,tem2d3,dem_data,istatus) landuse(:,:) = tem2d1(:,:) landmask(:,:) = 1. where(landuse(:,:) == ISWATER) landmask(:,:) = 0. DO n = 1,LanduseCategories landusef(:,:,n) = tem3d(:,:,n) END DO ! ------------------------------------------------------------------- ! potential fix of fictitous islands for certain resolution domains. ! Story here is that west coast terrain can be "funky" possibly due ! to steepness and method to compute avg terrain. tem2d1(:,:) = 1.- tem3d(:,:,ISWATER) ! Filter land fraction with 2dx,iter iter = MIN(10,INT(8000./dx_wrf)) DO n = 1,iter CALL filter_2dx(tem2d1,nx_wrf,ny_wrf,1, 0.5) CALL filter_2dx(tem2d1,nx_wrf,ny_wrf,1,-0.5) END DO WHERE(tem2d1(:,:) <= 0.1 .AND. hgt(:,:) < 5.0) hgt(:,:) = 0.0 ! -------------- Top Layer Soil Type ------------------------- ! type = O ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(SOILTT)),setindx(SOILTT) CALL rdgeodat(nx_wrf,ny_wrf,xs_wrf,ys_wrf,dx_wrf, & dy_wrf,TRIM(tmpstr),wvln,silwt,SoilCategories, & tem2d1,tem3d,tem2d2,tem2d3,dem_data,ireturn) ! make water points = 0 for adjust_geog. later well put it back to original WHERE(tem2d1 == 14) tem2d1 = 0.0 CALL adjust_geog(nx_wrf-1,ny_wrf-1,1,'soiltype',ireturn, & lat_wrf (1:nx_wrf-1,1:ny_wrf-1,1), hgt(1:nx_wrf-1,1:ny_wrf-1), & landmask(1:nx_wrf-1,1:ny_wrf-1),tem2d1(1:nx_wrf-1,1:ny_wrf-1), & istatus) WHERE(tem2d1 == 0.0) tem2d1 = 14. DO n = 1,SoilCategories soilctop(:,:,n) = tem3d(:,:,n) END DO ! -------------- Bottom Layer Soil Type ------------------------- ! type = O ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(SOILTB)),setindx(SOILTB) CALL rdgeodat(nx_wrf,ny_wrf,xs_wrf,ys_wrf,dx_wrf, & dy_wrf,TRIM(tmpstr),wvln,silwt,SoilCategories, & tem2d1,tem3d,tem2d2,tem2d3,dem_data,ireturn) ! make water points = 0 for adjust_geog. later well put it back to original WHERE(tem2d1 == 14) tem2d1 = 0.0 CALL adjust_geog(nx_wrf-1,ny_wrf-1,1,'soiltype',ireturn, & lat_wrf (1:nx_wrf-1,1:ny_wrf-1,1), hgt(1:nx_wrf-1,1:ny_wrf-1), & landmask(1:nx_wrf-1,1:ny_wrf-1),tem2d1(1:nx_wrf-1,1:ny_wrf-1), & istatus) WHERE(tem2d1 == 0.0) tem2d1 = 14. DO n = 1,SoilCategories soilcbot(:,:,n) = tem3d(:,:,n) END DO ! ----------------- Greenness Fraction -------------------- ! type = G ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(GFRAC)),setindx(GFRAC) tem3d(:,:,:) = 0.0 CALL proc_geodat(nx_wrf,ny_wrf,12,TRIM(tmpstr), & lat_wrf(:,:,1),lon_wrf(:,:,1),landmask,tem3d,istatus) DO n = 1,12 green12m(:,:,n) = tem3d(:,:,n) END DO ! annual max/min greenness fraction in domain ! -------------------------------------------- print*,' compute max/min greenness frac at grid points' DO j=1,ny_wrf DO i=1,nx_wrf shdmax(i,j) = MAXVAL(green12m(i,j,:)) shdmin(i,j) = MINVAL(green12m(i,j,:)) END DO END DO ! --------------- Deep Soil Temperature ------------------- ! type = T ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(SOILTMP)),setindx(SOILTMP) path_to_soiltemp_1deg = tmpstr CALL proc_geodat(nx_wrf,ny_wrf,1,TRIM(tmpstr), & lat_wrf(:,:,1),lon_wrf(:,:,1),landmask, & tmn,ireturn) CALL adjust_geog(nx_wrf-1,ny_wrf-1,1,'soiltemp',ireturn, & lat_wrf(1:nx_wrf-1,1:ny_wrf-1,1),hgt(1:nx_wrf-1,1:ny_wrf-1), & landmask(1:nx_wrf-1,1:ny_wrf-1),tmn(1:nx_wrf-1,1:ny_wrf-1), & istatus) ! -------------- Terrain slope index categories ------------------------- ! type = I ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(ISLOPE)),setindx(ISLOPE) CALL rdgeodat(nx_wrf,ny_wrf,xs_wrf,ys_wrf,dx_wrf, & dy_wrf,TRIM(tmpstr),wvln,silwt,9, & tem2d1,tem3d,tem2d2,tem2d3,dem_data,ireturn) slopecat(:,:) = tem2d1(:,:) ! put the categories back to the original raw data. if it is a land ! point but islope indicates water, force islope = 1. WHERE(slopecat .eq. 8) slopecat = 13.0 WHERE(slopecat .eq. 9) slopecat = 0.0 CALL adjust_geog(nx_wrf-1,ny_wrf-1,1,'islope',ireturn, & lat_wrf(1:nx_wrf-1,1:ny_wrf-1,1),hgt(1:nx_wrf-1,1:ny_wrf-1), & landmask(1:nx_wrf-1,1:ny_wrf-1),slopecat(1:nx_wrf-1,1:ny_wrf-1), & istatus) ! force land points to have the correct (default) islope value. WHERE(slopecat(:,:) == 0.0 .AND. landmask(:,:) == 1.0) & slopecat(:,:) = 1.0 ! force water points to have the correct category for islope WHERE(landmask(:,:) == 0.0) slopecat(:,:)=0.0 ! ---------------Monthly Albedo Climatology-------------------------- ! type = A ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(ALBEDO)),setindx(ALBEDO) CALL proc_geodat(nx_wrf,ny_wrf,12,TRIM(tmpstr), & lat_wrf(:,:,1),lon_wrf(:,:,1),landmask(:,:),tem3d,istatus) DO n=1,12 albdo12m(:,:,n) = tem3d(:,:,n) WHERE(landmask(:,:) == 0.0) albdo12m(:,:,n) = 0.08 END DO ! ---------------- Max Snow Albedo ------------------ ! type = M ! WRITE(tmpstr,'(3a)') static_dir(1:lenstr), & TRIM(setnames(SNOWALB)),setindx(SNOWALB) CALL proc_geodat(nx_wrf,ny_wrf,1,TRIM(tmpstr), & lat_wrf(:,:,1),lon_wrf(:,:,1),landmask(:,:), & tem2d1,istatus) snoalb(:,:) = tem2d1 ! ! force max albedo = 0.08 over water. force max albedo = 0.7 over ice ! WHERE(landmask(:,:) == 0.0) snoalb = 0.08 WHERE(landuse(:,:) == ISICE)snoalb = 0.7 ! --------------------------------------------------------------------------------- ! Lets compare the grids to landmask to assess their consistency (or lack thereof) ! --------------------------------------------------------------------------------- ! CALL gridcompare(nx_wrf,ny_wrf,i,xxx,landmask) ! !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! ! OUTPUT of WRF static begin ! !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% filename = sfcdtfl lenstr = LEN_TRIM(dirname) IF(lenstr > 0) filename = dirname(1:lenstr) // TRIM(filename) PRINT *, ' Output file name is ',TRIM(filename) CALL open_output_file(filename,'STATIC',io_form,nx_wrf,ny_wrf, & nz_wrf, nzsoil_wrf,spec_bdy_width,mp_physics,ncid) !----------------------------------------------------------------------- ! ! Initialize and write global attributes ! !----------------------------------------------------------------------- CALL write_static_attribute(ncid,io_form,start_date, & nx_wrf,ny_wrf,dx_wrf,dy_wrf, & mapproj_wrf,trulat1_wrf,trulat2_wrf,trulon_wrf,& ctrlat_wrf,ctrlon_wrf, & lat_ll,lat_ul,lat_ur,lat_lr, & lon_ll,lon_ul,lon_ur,lon_lr, istatus) CALL write_times_str(ncid,io_form,'Times', & times_str(1:19),times_str(1:19),1) CALL write_wrf_static(ncid,io_form,times_str(1:19), & nx_wrf,ny_wrf,LanduseCategories,SoilCategories, & lat_wrf(:,:,1),lon_wrf(:,:,1),f,e, & msft_wrf,msfu_wrf,msfv_wrf,cosalpha,sinalpha, & hgt,topostdv,toposlpx,toposlpy,landmask,landusef, & soilctop,soilcbot,tmn,slopecat,snoalb, & shdmax,shdmin,green12m,albdo12m, istatus) CALL close_output_file(ncid,io_form) ! close input file CALL io_shutdown(io_form) !----------------------------------------------------------------------- ! ! Generate a ready file if needed ! !----------------------------------------------------------------------- IF ( readyfl == 1 ) THEN CALL getunit( nchout ) WRITE (filename,'(2a)') trim(sfcdtfl),"_ready" WRITE(filename,'(a)') TRIM(dirname) // TRIM(filename) OPEN (UNIT=nchout,FILE=trim(filename)) WRITE (nchout,'(a)') trim(sfcdtfl) CLOSE (nchout) CALL retunit (nchout ) END IF CALL arpsstop(' ==== WRFSTATIC terminated normally. ====',0) END PROGRAM wrfstatic