!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE READNAMELIST ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE readnamelist(progopt,hinfmt,bdybasfn,hisfile,nhisfile, & 2,51
nx,ny,nz,nzsoil,nstyps,nprocx_in,nprocy_in,ncompressx,ncompressy, &
use_arps_grid,nx_wrf,ny_wrf,nz_wrf,zlevels_wrf,ptop, &
mapproj_wrf,sclfct_wrf,lattru_wrf,lontru_wrf, &
ctrlat_wrf,ctrlon_wrf,dx_wrf,dy_wrf,dt,base_temp, &
sfcinitopt,static_dir,start_date,silwt,wvln, &
create_bdy,mgrdbas,tintv_bdyin,spec_bdy_width, &
diff_opt,km_opt,khdif,kvdif,mp_physics,ra_lw_physics, &
ra_sw_physics,sf_sfclay_physics,sf_surface_physics,bl_pbl_physics, &
cu_physics, nprocx_wrf,nprocy_wrf,iorder,korder,io_form, &
create_namelist,wrfnamelist,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! To read and propagate namelist input.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Yunheng Wang
! 09/15/2005
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER, INTENT(IN) :: progopt ! 0 = ARPS2WRF
! 1 = WRFSTATIC
INTEGER, INTENT(OUT) :: istatus
!----------------------------------------------------------------------
!
! ARPS grid variables
!
!---------------------------------------------------------------------
INTEGER, INTENT(OUT) :: nx,ny,nz ! Grid dimensions for ARPS.
INTEGER, INTENT(OUT) :: nzsoil ! Soil levels
INTEGER, INTENT(OUT) :: nstyps ! Maximum number of soil types.
INTEGER, PARAMETER :: nhisfile_max = 100
INTEGER, PARAMETER :: max_vertical_levels = 100
CHARACTER(LEN=*), INTENT(OUT) :: hisfile(nhisfile_max)
CHARACTER(LEN=*), INTENT(OUT) :: bdybasfn(nhisfile_max)
INTEGER, INTENT(OUT) :: hinfmt
INTEGER, INTENT(OUT) :: nhisfile
CHARACTER(LEN=256) :: grdbasfn
INTEGER :: lengbf
! hisfile(1) and bdybasfn(1) are for WRF input file
! They can be any ARPS history dumps including ADAS output,
! ARPS output or EXT2ARPS output
!
! hisfile(2:nhisfil), bdybasfn(2:nhisfile) are for
! WRF lateral bounday files. They can be either ARPS history
! dumps or EXT2ARPS outputs
CHARACTER(LEN=4), PARAMETER :: finfmt(11) = &
(/'.bin','.asc','.hdf','.pak','.svi','.bn2', &
'.net','.npk','.gad','.grb','.v5d' /)
!
!-----------------------------------------------------------------------
!
! ARPS include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'mp.inc'
!
!-----------------------------------------------------------------------
!
! Variables for mpi jobs
!
!-----------------------------------------------------------------------
INTEGER, PARAMETER :: fzone_arps = 3, fzone_wrf = 1
INTEGER, INTENT(OUT) :: ncompressx, ncompressy ! compression in x and y direction:
! ncompressx=nprocx_in/nproc_x
! ncompressy=nprocy_in/nproc_y
INTEGER, INTENT(OUT) :: nprocx_in, nprocy_in
!-----------------------------------------------------------------------
!
! 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, INTENT(OUT) :: nx_wrf ! = nx-2 if the same grid as ARPS
INTEGER, INTENT(OUT) :: ny_wrf ! = ny-2 if the same grid as ARPS
INTEGER, INTENT(OUT) :: nz_wrf ! = nz-2 if the same grid as ARPS
! All are staggered values
REAL, INTENT(OUT) :: lattru_wrf(2) ! array of true latitude of WRF map projection
REAL, INTENT(OUT) :: lontru_wrf ! true longitude of WRF map projection
! = trulon_wrf
! Namelist variable declaration
CHARACTER(LEN=5), INTENT(OUT) :: sfcinitopt ! either "ARPS" or "WRFSI"
CHARACTER(LEN=256), INTENT(OUT) :: static_dir
CHARACTER(LEN=19), INTENT(OUT) :: start_date
REAL :: silavwt_parm_wrf,toptwvl_parm_wrf
REAL, INTENT(OUT) :: silwt,wvln
INTEGER, INTENT(OUT) :: create_bdy ! Create WRF boundary file
INTEGER, INTENT(OUT) :: create_namelist ! Dump WRF namelist.input
INTEGER, INTENT(OUT) :: use_arps_grid ! Use ARPS horizontal grid as WRF grid
CHARACTER(LEN=80) :: bdyfheader ! ARPS boundary input file header
INTEGER :: tbgn_bdyin ! ARPS boundary begin time (in seconds)
INTEGER, INTENT(OUT) :: tintv_bdyin ! ARPS boundary file interval (in seconds)
INTEGER :: tend_bdyin ! Last ARPS boundary file time
INTEGER, INTENT(OUT) :: mgrdbas ! Options for grid base file
! = 0 share same grid base as initial state file
! = 1 All ARPS boundary files share one grd base
! file but it is difference from the inital
! base file as specified using grdbasfn
! = 2 Each file has its own grid base file
CHARACTER(LEN=256), INTENT(OUT) :: wrfnamelist ! file name for WRF namelist.input
INTEGER, INTENT(OUT) :: mapproj_wrf ! Type of map projection in WRF model grid
! modproj = 1 Polar Stereographic
! projection.
! = 2 Mercator projection.
! = 3 Lambert projection.
REAL, INTENT(OUT) :: 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, INTENT(OUT) :: ctrlat_wrf ! Center latitude of WRF model domain (deg. N)
REAL, INTENT(OUT) :: ctrlon_wrf ! Center longitude of WRF model domain (deg. E)
REAL, INTENT(OUT) :: dx_wrf ! WRF Grid spacing in x-direction
REAL, INTENT(OUT) :: dy_wrf ! WRF Grid spacing in y-direction
INTEGER :: vertgrd_opt ! WRF sigma level scheme
REAL, INTENT(OUT) :: ptop ! WRF atmosphere top pressure in Pascal
REAL :: pbot
REAL, INTENT(OUT) :: zlevels_wrf(max_vertical_levels)
! WRF mass levels from 1.0 at surfact to
! 0.0 at atmosphere top
INTEGER, INTENT(OUT) :: iorder ! order of polynomial for horizontal
! interpolation (1 or 2)
INTEGER, INTENT(OUT) :: korder ! vertical interpolation order (1 or 2)
INTEGER :: dyn_opt ! WRF dynamics option
! only works for = 2 Eulerian mass coordinate
INTEGER, INTENT(OUT) :: diff_opt ! WRF diffusion option
INTEGER, INTENT(OUT) :: km_opt ! WRF eddy coefficient option
REAL, INTENT(OUT) :: khdif ! Horizontal diffusion constant (m^2/s)
REAL, INTENT(OUT) :: kvdif ! Vertical diffusion constant (m^2/s)
INTEGER, INTENT(OUT) :: mp_physics ! WRF microphysics options
!= 2 Lin et al. scheme
! (QVAPOR,QRAIN,QSNOW,QCLOUD,QICE,QGRAUP)
!= 3 NCEP 3-class simple ice scheme
! (QVAPOR,QCLOUD,QICE,QRAIN,QSNOW)
!= 4 NCEP 5-class scheme
! (QVAPOR,QCLOUD,QICE,QRAIN,QSNOW)
!= 5 Ferrier (new Eta) microphysics
! (QVAPOR,QCLOUD)
INTEGER, INTENT(OUT) :: ra_lw_physics ! Longwave radiaiton option
INTEGER, INTENT(OUT) :: ra_sw_physics ! Shortwave radiation option
INTEGER, INTENT(OUT) :: sf_sfclay_physics ! WRF surface-layer option
INTEGER, INTENT(OUT) :: sf_surface_physics ! WRF land-surface option
! = 0 no land-surface
! (DO NOT use)
! = 1 Thermal diffusion scheme
! (nzsoil_wrf = 5)
! = 2 OSU land-surface model
! (nzsoil_wrf = 4)
! = 3 Do not use
! (nzsoil_wrf = 6)
INTEGER, INTENT(OUT) :: bl_pbl_physics ! boundary-layer option
INTEGER, INTENT(OUT) :: cu_physics ! cumulus option
REAL, INTENT(OUT) :: dt ! time-step for advection
INTEGER, INTENT(OUT) :: spec_bdy_width ! number of rows for specified boundary values nudging
REAL, INTENT(OUT) :: base_temp
INTEGER, INTENT(OUT) :: nprocx_wrf ! Number of X direction processors for WRF run
INTEGER, INTENT(OUT) :: nprocy_wrf ! Number of Y direction processors for WRF run
INTEGER, INTENT(OUT) :: io_form
NAMELIST /message_passing/nproc_x, nproc_y, readsplit, nprocx_in, nprocy_in
NAMELIST /sfcdt/ sfcinitopt,ternopt,sfcfmt,sfcdtfl, &
static_dir,silavwt_parm_wrf,toptwvl_parm_wrf,start_date
NAMELIST /bdyspc/ create_bdy,bdyfheader,tbgn_bdyin, &
tintv_bdyin,tend_bdyin,mgrdbas
NAMELIST /wrf_grid/ use_arps_grid,nx_wrf,ny_wrf, &
mapproj_wrf, sclfct_wrf, &
trulat1_wrf, trulat2_wrf,trulon_wrf, &
ctrlat_wrf, ctrlon_wrf, &
dx_wrf, dy_wrf, ptop, &
vertgrd_opt,nz_wrf,pbot,zlevels_wrf
NAMELIST /interp_options/ iorder, korder
NAMELIST /wrf_opts/ diff_opt, km_opt, khdif, kvdif, &
mp_physics, ra_lw_physics, ra_sw_physics, &
sf_sfclay_physics, sf_surface_physics, &
bl_pbl_physics, cu_physics, base_temp, dt, &
spec_bdy_width, nprocx_wrf, nprocy_wrf
NAMELIST /output/ dirname,readyfl,io_form, &
create_namelist,wrfnamelist
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,n,ifile, nlevels
INTEGER :: lenstr, ireturn
LOGICAL :: fexist
REAL :: sigma1,sigma2
REAL :: plevel1,plevel2
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Read mpi related block
!
!-----------------------------------------------------------------------
IF(myproc == 0) THEN
READ(5,message_passing)
WRITE(6,'(a)')'Namelist message_passing was successfully read.'
END IF
CALL mpupdatei
(nproc_x,1)
CALL mpupdatei
(nproc_y,1)
CALL mpupdatei
(readsplit,1)
IF(readsplit > 0) THEN
nprocx_in = nproc_x
nprocy_in = nproc_y
END IF
CALL mpupdatei
(nprocx_in,1)
CALL mpupdatei
(nprocy_in,1)
ncompressx = nprocx_in/nproc_x
ncompressy = nprocy_in/nproc_y
IF (mp_opt > 0 .AND. ( &
(MOD(nprocx_in,nproc_x) /= 0 .OR. MOD(nprocy_in,nproc_y) /= 0) &
.OR. (ncompressx < 1 .OR. ncompressy < 1) ) ) THEN
IF (myproc == 0) WRITE(6,'(3x,a/,2(3x,2(a,I2)/))') &
'nprocx_in (nprocy_in) must be a multiplier of nproc_x(nproc_y)', &
'nprocx_in = ',nprocx_in, 'nprocy_in = ',nprocy_in, &
'nproc_x = ', nproc_x, 'nproc_y = ', nproc_y
CALL arpsstop
('unmatched dimension size.',1);
END IF
IF (mp_opt == 0) THEN
ncompressx = 1
ncompressy = 1
nproc_x = 1
nproc_y = 1
nprocx_in = 1
nprocy_in = 1
myproc = 0
loc_x = 1
loc_y = 1
readsplit = 0
ELSE
CALL mpinit_var
END IF
!
!-----------------------------------------------------------------------
!
! Get the names of the input data files.
!
!-----------------------------------------------------------------------
!
nhisfile = 1
IF(myproc == 0) THEN
CALL get_input_file_names
(hinfmt,grdbasfn,hisfile,nhisfile)
IF(nhisfile > 1) THEN
PRINT *, 'This program only processes one initilized data for WRF model.'
PRINT *, 'Check the namelist file arps2wrf.input.'
CALL arpsstop
('Wrong namelist parameter.',1)
END IF
bdybasfn(1) = grdbasfn
lengbf = len_trim(grdbasfn)
END IF
CALL mpupdatei
(hinfmt,1)
n = 1
IF (progopt == 1) n = 0
!----------------------------------------------------------------------
!
! Get surface characteristics file options
!
!----------------------------------------------------------------------
!
sfcinitopt(1:5) = ' '
sfcfmt = 1
sfcdtfl(1:128) = ' '
ternopt = 0
static_dir(1:128) = ' '
start_date = '1998-05-25_00:00:00'
silavwt_parm_wrf = 0.0
toptwvl_parm_wrf = 2.0
IF (myproc == 0) THEN
READ(5,sfcdt)
IF (progopt == 0) THEN
IF (sfcinitopt == 'ARPS' .AND. mp_opt > 0 .AND. readsplit == 0) THEN
WRITE(grdbasfn,'(2a,2I2.2)') TRIM(sfcdtfl),'_',loc_x,loc_y
ELSE
WRITE(grdbasfn,'(a)') TRIM(sfcdtfl)
END IF
INQUIRE(FILE=trim(grdbasfn), EXIST = fexist )
IF(.NOT. fexist) THEN
WRITE(6,*) 'The file ',TRIM(grdbasfn),' you specified does not exist.'
CALL arpsstop
('File does not exist.',1)
END IF
END IF
END IF
lenstr = LEN_TRIM(static_dir)
IF (static_dir(lenstr:lenstr) /= '/') THEN
lenstr = lenstr + 1
static_dir(lenstr:lenstr) = '/'
END IF
silwt = silavwt_parm_wrf
wvln = toptwvl_parm_wrf
CALL mpupdatei
(sfcfmt,1)
CALL mpupdatec
(sfcinitopt,5)
CALL mpupdatec
(sfcdtfl,128)
!----------------------------------------------------------------------
!
! Get boundary file specifications
!
!----------------------------------------------------------------------
!
create_bdy = 0
bdyfheader = './eta25may1998'
tbgn_bdyin = 10800
tintv_bdyin= 10800
tend_bdyin = 21600
mgrdbas = 0
IF (myproc == 0) THEN
READ(5,bdyspc)
IF(create_bdy == 1 .AND. progopt == 0) THEN
IF(tintv_bdyin < 1) THEN
WRITE(6,'(/a,I6,a/)') 'ERROR: Boudnary interval (tintv_bdyin =', &
tintv_bdyin,') is not correct. Terminating ...'
CALL arpsstop
('Wrong namelist input parameters.',1)
END IF
DO i = tbgn_bdyin,tend_bdyin,tintv_bdyin
nhisfile = nhisfile + 1
WRITE(hisfile(nhisfile),'(2a,I6.6)') &
TRIM(bdyfheader),finfmt(hinfmt),i
IF (mp_opt > 0 .AND. readsplit <= 0 ) THEN
WRITE(grdbasfn,'(a,a,2i2.2)') TRIM(hisfile(nhisfile)),'_',loc_x,loc_y
ELSE
WRITE(grdbasfn,'(a)') hisfile(nhisfile) ! used as temporary string
END IF
INQUIRE(FILE=trim(grdbasfn), EXIST = fexist )
IF(.NOT. fexist) THEN
WRITE(6,'(/1x,3a,I6,a/)') 'WARING: The file ',TRIM(grdbasfn), &
' does not exist. Boundary file at ',i,' was skipped.'
nhisfile = nhisfile - 1
!CYCLE
CALL arpsstop
('File does not exist.',1)
END IF
IF(mgrdbas == 1 .AND. nhisfile == 2) THEN
WRITE(bdybasfn(nhisfile),'(3a)') &
TRIM(bdyfheader),finfmt(hinfmt),'grdbas'
n = 2 ! maximum index when checking the existance of grid and base file
ELSE IF(mgrdbas > 1) THEN
WRITE(bdybasfn(nhisfile),'(3a,I2.2)') &
TRIM(bdyfheader),finfmt(hinfmt),'grdbas.',nhisfile-1
n = nhisfile
END IF
END DO
END IF ! create_bdy == 1
!
! only do check for the root processor because nproc_x may
! not equal nprocx_in, etc.
!
DO i = 1,n
IF (mp_opt > 0 .AND. readsplit <= 0 ) THEN
WRITE(grdbasfn,'(a,a,2i2.2)') TRIM(bdybasfn(i)),'_',loc_x,loc_y
ELSE
WRITE(grdbasfn,'(a)') TRIM(bdybasfn(i)) ! used as temporary string
END IF
INQUIRE(FILE=trim(grdbasfn), EXIST = fexist )
IF(.NOT. fexist) THEN
WRITE(6,*) 'The file ',TRIM(grdbasfn),' does not exist.'
CALL arpsstop
('File does not exist.',1)
END IF
END DO
END IF ! myproc == 0
CALL mpupdatei
(n,1)
CALL mpupdatei
(nhisfile,1)
CALL mpupdatec
(bdybasfn,nhisfile_max*132) ! does not include processor info.
CALL mpupdatec
(hisfile,nhisfile_max*132)
CALL mpupdatei
(create_bdy,1)
CALL mpupdatei
(mgrdbas, 1)
CALL mpupdatei
(tintv_bdyin,1)
!-----------------------------------------------------------------------
!
! Get WRF grid options
!
!-----------------------------------------------------------------------
!
use_arps_grid = 0
nx_wrf = nx-2
ny_wrf = ny-2
ptop = 5000
pbot = 101300
vertgrd_opt = 0
nz_wrf = 31
zlevels_wrf = -1.0
IF (myproc == 0) THEN
READ(5,wrf_grid)
IF(use_arps_grid == 1) THEN
WRITE(6,'(/,3(1x,a/))') &
'***** You have chosen to use ARPS grid in the data as your ******', &
'***** WRF grid. Please note that the two fake points in each ******', &
'***** direction of ARPS grid are not used. ******'
!-----------------------------------------------------------------------
!
! Now get dimension from ARPS file
!
!-----------------------------------------------------------------------
IF(mp_opt > 0 .AND. readsplit <= 0) THEN
WRITE(grdbasfn,'(a,a,2i2.2)') bdybasfn(1)(1:lengbf),'_',loc_x,loc_y
lengbf = lengbf + 5
END IF
CALL get_dims_from_data
(hinfmt,grdbasfn(1:lengbf), &
nx,ny,nz,nzsoil,nstyps,ireturn)
IF( ireturn /= 0 ) THEN
PRINT*,'Problem occured when trying to get dimensions from data.'
PRINT*,'Program stopped.'
CALL arpsstop
('get_dims_from_data error.',1)
END IF
IF (mp_opt > 0) THEN
IF( readsplit > 0 ) THEN
IF( MOD(nx-fzone_arps,nproc_x) /= 0 .OR. &
MOD(ny-fzone_arps,nproc_y) /= 0) THEN
WRITE(6,'(a/,a/,4(a,i5))') &
'The specification of nproc_x or nproc_y is not matched with nx or ny.',&
'nx-3 and ny-3 must be multiples of nproc_x and nproc_y respectively.', &
'nx = ', nx, ' ny = ', ny, ' nproc_x = ',nproc_x, ' nproc_y = ',nproc_y
nx = 0
ny = 0
ELSE
nx = (nx-fzone_arps)/nproc_x + fzone_arps
ny = (ny-fzone_arps)/nproc_y + fzone_arps
END IF
ELSE
nx = (nx-fzone_arps)*ncompressx + fzone_arps
ny = (ny-fzone_arps)*ncompressy + fzone_arps
END IF
END IF
WRITE(6,'(5(a,i5))') 'nx=',nx,', ny=',ny,', nz=',nz, &
', nzsoil=',nzsoil,', nstyps=',nstyps
nx_wrf = nx - 2
ny_wrf = ny - 2
ELSE IF (mp_opt > 0) THEN
WRITE(6,'(1x,2a,/,a,/,2a,/,a,/,a)') 'WARING: At present, ', &
'arps2wrf_mpi only works when WRF horizontal grid and', &
' ARPS horizontal grid are the same.', 'Please set ', &
'use_arps_grid = 1 in arps2wrf.input.', &
'Or use no-mpi version of arps2wrf.', &
' Program stopping ...'
CALL arpsstop
('MPI mode does not work.',1)
END IF
IF(vertgrd_opt == 0) THEN
!-----------------------------------------------------------------------
!
! Check the validation of vertical level specifications
!
!-----------------------------------------------------------------------
nz_wrf = 0
! Make sure first value is 1.0
IF (zlevels_wrf(1) /= 1.0) THEN
WRITE(6,'(A,F6.3)') 'Bad first level: ',zlevels_wrf(1)
WRITE(6,'(A)') 'Mass coordinate must range from 1.0 at ' &
//'surface to 0.0 at top.'
CALL arpsstop
('Bad WRF vertical levels.',1)
END IF
nlevels = 1
! Make sure things are decreasing to 0.0 from bottom to top.
level_check_loop: &
DO k = 2, max_vertical_levels
! See if this is a valid level, if so increment nlevels
! and perform additional QC checks
IF (zlevels_wrf(k) >= 0.) THEN
! Check for decreasing value of META (after 2nd value found)
IF (zlevels_wrf(k) >= zlevels_wrf(k-1)) THEN
PRINT '(A,I2,A,I2)', 'Level ',k, 'is >= level ' , k-1
PRINT '(A)', 'Mass must be listed in descending order!'
CALL arpsstop
('Bad WRF vertical levels.',1)
ELSE
nlevels = nlevels + 1
END IF
ELSE
IF (nlevels < 2) THEN
PRINT '(A)', 'Not enough levels specified'
CALL arpsstop
('Bad WRF vertical levels.',1)
ELSE
nz_wrf = nlevels
! Check to make sure top level is 0.0
IF (zlevels_wrf(nz_wrf) /= 0.) THEN
PRINT '(A,F6.3)', 'Bad top level value: ',zlevels_wrf(nz_wrf)
PRINT '(A)', 'Top level must be 0.0 for Mass Eta.'
CALL arpsstop
('Bad WRF vertical levels.',1)
END IF
EXIT level_check_loop
END IF
END IF
END DO level_check_loop
ELSE IF (vertgrd_opt == 1) THEN
IF(nz_wrf < 15) nz_wrf = 15
DO k = 1,nz_wrf
zlevels_wrf(k) = (nz_wrf-k) / (nz_wrf - 1.)
END DO
ELSE IF (vertgrd_opt == 2) THEN
IF(nz_wrf < 15) nz_wrf = 15
DO k = 1,nz_wrf,1
zlevels_wrf(k) = SQRT( (nz_wrf-k)/(nz_wrf-1.) )
END DO
ELSE IF (vertgrd_opt == 3) THEN
IF(nz_wrf < 15) nz_wrf = 15
nlevels = 1
DO k = 1, nz_wrf
sigma1 = (k-1) / (nz_wrf-1.)
sigma2 = SQRT( (k-1) /(nz_wrf-1.) )
plevel1 = sigma1 * (pbot - ptop) + ptop
plevel2 = sigma2 * (pbot - ptop) + ptop
IF (plevel1 < 33333.33) THEN
zlevels_wrf(nlevels) = sigma1
nlevels = nlevels + 1
END IF
IF (plevel2 > 33333.33) THEN
zlevels_wrf(nlevels) = sigma2
nlevels = nlevels + 1
END IF
END DO
nz_wrf = nlevels - 1
WRITE(6,'(a,a,I3)') 'WARNING: the actual number of vertical', &
' levels has been changed to ',nz_wrf
!
! Sort the levels in decrease order (bubble sort for simplicity)
!
DO k = 1,nz_wrf
DO nlevels = 1, nz_wrf-k
IF (zlevels_wrf(nlevels+1) > zlevels_wrf(nlevels) ) THEN
sigma1 = zlevels_wrf(nlevels)
zlevels_wrf(nlevels) = zlevels_wrf(nlevels+1)
zlevels_wrf(nlevels+1) = sigma1
END IF
END DO
END DO
END IF
!
! Ouput vertical levels for testing
!
WRITE(6,'(/2(a,I3))') 'Number of vertical levels is ',nz_wrf, &
'. vertical sigma schems is ',vertgrd_opt
WRITE(6,FMT='(1x,/,a)',ADVANCE='NO') ' levels = '
DO nlevels = 1, nz_wrf
IF ( nlevels /= 1 .AND. MOD(nlevels,5) == 1 ) WRITE(6,FMT='(10x)',ADVANCE='NO')
WRITE(6,FMT='(F8.5,A1)',ADVANCE='NO') zlevels_wrf(nlevels),', '
IF ( MOD(nlevels,5) == 0 ) WRITE(6,*)
END DO
WRITE(6,*)
END IF ! myproc == 0
CALL mpupdatei
(nx,1)
CALL mpupdatei
(ny,1)
CALL mpupdatei
(nz,1)
CALL mpupdatei
(nzsoil,1)
CALL mpupdatei
(nstyps,1)
IF( nx <= 0 .OR. ny <= 0 ) THEN
CALL arpsstop
('Wrong size of dimensions.',1);
END IF
nstyp = nstyps
CALL mpupdatei
(nx_wrf,1)
CALL mpupdatei
(ny_wrf,1)
CALL mpupdatei
(nz_wrf,1)
CALL mpupdatei
(use_arps_grid,1)
CALL mpupdater
(ptop,1)
CALL mpupdater
(zlevels_wrf,max_vertical_levels)
!
! Map projection parameters do not need to be updated because
! use_arps_grid must be 1 for mpi job
!
lattru_wrf(1) = trulat1_wrf
lattru_wrf(2) = trulat2_wrf
lontru_wrf = trulon_wrf
!-----------------------------------------------------------------------
!
! Get WRF options (NetCDF file needs them for global attributes)
!
!-----------------------------------------------------------------------
dyn_opt = 2
! IF(dyn_opt /= 2) THEN
! WRITE(6,*) 'NOTE: ARPS2WRF only works for WRF MASS core at present'
! WRITE(6,*) ' dyn_opt has been reseted to 2.'
! END IF
diff_opt = 0
km_opt = 1
khdif = 0.0
kvdif = 0.0
mp_physics = 1 ! must be specified, used for moist variable determination
ra_lw_physics = 1
ra_sw_physics = 1
sf_sfclay_physics = 1
sf_surface_physics = 1 ! must be specified, used for soil layer determination
bl_pbl_physics = 1
cu_physics = 1
base_temp = 290.
dt = 40
spec_bdy_width = 5
nprocx_wrf = -1
nprocy_wrf = -1
IF (myproc == 0) THEN
READ(5,wrf_opts)
IF(progopt == 0 .AND. &
(sf_surface_physics > 3 .OR. sf_surface_physics < 1) ) THEN
WRITE(6,*) 'Not a valid sf_surface_physics option - ',sf_surface_physics
WRITE(6,*) 'It must be either 1, 2 or 3.'
CALL arpsstop
('Bad WRF namelist parameters inside arps2wrf.input.',1)
END IF
END IF
CALL mpupdatei
(mp_physics,1)
CALL mpupdatei
(sf_surface_physics,1)
CALL mpupdatei
(spec_bdy_width,1)
CALL mpupdater
(base_temp,1)
!
!-----------------------------------------------------------------------
!
! Get interpolation options
!
!-----------------------------------------------------------------------
!
iorder = 3
korder = 2
IF (myproc == 0) READ(5,interp_options)
CALL mpupdatei
(iorder,1)
CALL mpupdatei
(korder,1)
!
!-----------------------------------------------------------------------
!
! Get output options
!
!-----------------------------------------------------------------------
!
dirname = './'
readyfl = 0
create_namelist = 0
IF (myproc == 0) THEN
READ(5,output)
lenstr = LEN_TRIM(dirname)
IF(lenstr > 0) THEN
IF(dirname(lenstr:lenstr) /= '/') THEN
dirname(lenstr+1:lenstr+1) = '/'
lenstr = lenstr + 1
END IF
ELSE
dirname = './'
END IF
END IF
CALL mpupdatei
(io_form,1)
!-----------------------------------------------------------------------
!
! Successfully finished with namelist input
!
!-----------------------------------------------------------------------
istatus = 0
RETURN
END SUBROUTINE readnamelist