PROGRAM arps2wrf,82 ! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPS2WRF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Converts ADAS analysis file and/or EXT2ARPS dumps in ARPS grid to ! the corresponding WRF initialization file (wrfinput_d01) and ! the lateral boundary file (wrfbdy_d01) ! ! This program reads in a history file produced by ADAS and/or EXT2ARPS ! in any ARPS history format (except HDF 4 format), interpolates ! variables to WRF grid specified in the namelist file - arps2wrf.input ! and writes out these variables in NetCDF/PHDF5 format as wrfinput_d01 ! and wrfbdy_d01 ! ! Users can specify two options for the surface characteristics, such as ! vegetation type, soil type, and greenness fraction etc. ! ! Option 1 sfcinitopt = "ARPS", this program reads surface variables from ! the file created by ARPSSFC. the data must be at the same ! grid as that in the ADAS/EXT2ARPS data file. ! ! o Variables read in are: "soiltyp", "vegtyp", "veg"; ! o Variable, "xice", "xland", will be determined after the above ! variables are interpolated to WRF grid. ! o This option cannot set "SHDMAX","SHDMIN","SNOALB","ALBBCK". ! Should study whether it has negative effect to WRF run??? ! ! Option 2 sfcinitopt = "WRFSI", this program reads those variables from ! the static file 'static.wrfsi' created by gridgen_model of ! WRFSI package. The data must be at the same grid as those ! specified for WRF model in the input file, arps2wrf.input. ! ! (1). Users only need to run "window_domain_rt.pl" to generate ! WRFSI static file. (Actually, only gridgen_model.exe component). ! (2). One static file works for all runs in the same domain. ! ! ! INPUT ! arps2wrf.input NAMELIST ! runname.bin000000 ADAS time-dependent variable file ! runname.bingrdbas ADAS base state file ! runname.sfcdata ARPSSFC outputs ! OR ! static.wrfsi WRFSI static file ! ! OR ! outputs from ext2arps for lateral boundary conditions. ! ! OUTPUT ! wrfinput_d01 ! wrfbdy_d01 ! wrfnamelist.input ! ! Libraries: ! libarps.a ! libadas.a ! NetCDF library ! ! Subroutine calls: ! dtaread ! Subroutines defined in file interplib.f90 and wrf_iolib.f90 ! ! Use module ! wrf_metadata Defined in module_wrf_metadata.f90 ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang, Dan Weber, Keith Brewster ! 07/08/2003 ! ! MODIFICATION HISTORY: ! ! 03/10/2004 Yunheng Wang ! Upgraded to support WRF version 1.4 which was downloaded from ! WRF tiger team website on Feb. 10, 2004. ! ! 07/28/2004 Yunheng Wang ! Upgraded WRF V1.4 support to V2.0 support. So the unofficial release ! WRF V1.4 would not be supported any more since ARPS5.1.3. ! ! 11/20/2004 Yunheng Wang ! Reorangized to support PHDF5 format using WRF external IO-PHDF5 ! package. Upgraded to support WRFV2.0.3. Removed supports for ! previous WRF version. ! ! 01/10/2005 Yunheng Wang ! Added WRF internal binary support. Please note that WRF binary does ! not support random access. So the dumping order is important for ! binary data. The current code support WRFV2.0.3.1. The compatiblity ! between WRF versions will be bad, but it should not affect other ! IO format. ! !----------------------------------------------------------------------- ! ! ARPS DATA ARRAYS ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp z coordinate of grid points in physical space (m) ! zpsoil z coordinate of soil model (m) ! ! w vertical component of velocity in Cartesian ! coordinates (m/s). ! ! ptprt perturbation potential temperature (K) ! pprt perturbation pressure (Pascal) ! uprt perturbation x velocity component (m/s) ! vprt perturbation y velocity component (m/s) ! wprt perturbation z velocity component (m/s) ! ! qv water vapor mixing ratio (kg/kg) ! qc Cloud water mixing ratio (kg/kg) ! qr Rainwater mixing ratio (kg/kg) ! qi Cloud ice mixing ratio (kg/kg) ! qs Snow mixing ratio (kg/kg) ! qh Hail mixing ratio (kg/kg) ! ! ubar Base state x velocity component (m/s) ! vbar Base state y velocity component (m/s) ! wbar Base state z velocity component (m/s) ! ptbar Base state potential temperature (K) ! pbar Base state pressure (Pascal) ! rhobar Base state density (kg/m**3) ! qvbar Base state water vapor mixing ratio (kg/kg) ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! ! tsoil Soil Temperature (K) ! qsoil Soil moisture ! wetcanp Canopy water amount ! ! rain Total rain (raing + rainc) ! raing Grid supersaturation rain ! rainc Cumulus convective rain ! !----------------------------------------------------------------------- ! ! Variable Declarations: ! !----------------------------------------------------------------------- ! USE wrf_metadata ! WRF constants and metadata IMPLICIT NONE !---------------------------------------------------------------------- ! ! ARPS grid variables ! !--------------------------------------------------------------------- INTEGER :: nx,ny,nz ! Grid dimensions for ARPS. INTEGER :: nzsoil ! Soil levels INTEGER :: nstyps ! Maximum number of soil types. INTEGER, PARAMETER :: nhisfile_max=100 INTEGER, PARAMETER :: max_vertical_levels = 100 CHARACTER(LEN=256) :: grdbasfn CHARACTER(LEN=256) :: hisfile(nhisfile_max) CHARACTER(LEN=256) :: bdybasfn(nhisfile_max) INTEGER :: hinfmt,nhisfile,lengbf,lenfil ! 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=80) :: execname ! !----------------------------------------------------------------------- ! ! ARPS include files: ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'phycst.inc' INCLUDE 'mp.inc' ! !----------------------------------------------------------------------- ! ! Variables for mpi jobs ! !----------------------------------------------------------------------- INTEGER, PARAMETER :: fzone_arps = 3, fzone_wrf = 1 INTEGER :: ncompressx, ncompressy ! compression in x and y direction: ! ncompressx=nprocx_in/nproc_x ! ncompressy=nprocy_in/nproc_y INTEGER :: nxsm, nysm ! smaller domain INTEGER :: nxlg, nylg ! global domain INTEGER :: nxlg_wrf, nylg_wrf INTEGER :: nprocx_in, nprocy_in INTEGER :: ii,jj,ia,ja REAL, DIMENSION(:), POINTER :: xsm,ysm REAL, DIMENSION(:,:,:), POINTER :: zpsm,zpsoilsm REAL, DIMENSION(:,:,:), POINTER :: uprtsm, vprtsm, wprtsm, & ptprtsm, pprtsm, qvprtsm REAL, DIMENSION(:,:,:), POINTER :: qcsm, qrsm, qism, qssm, qhsm REAL, DIMENSION(:,:,:), POINTER :: tkesm, kmhsm, kmvsm REAL, DIMENSION(:,:,:), POINTER :: ubarsm, vbarsm, wbarsm, & ptbarsm,pbarsm, qvbarsm,rhobarsm REAL, DIMENSION(:,:,:), POINTER :: prcratesm INTEGER, DIMENSION(:,:,:), POINTER :: soiltypsm INTEGER, DIMENSION(:,:), POINTER :: vegtypsm REAL, DIMENSION(:,:,:), POINTER :: stypfrctsm(:,:,:) REAL, DIMENSION(:,:,:,:), POINTER :: tsoilsm, qsoilsm REAL, DIMENSION(:,:,:), POINTER :: wetcanpsm REAL, DIMENSION(:,:), POINTER :: laism, roufnssm, vegsm, & snowdpthsm, raingsm, raincsm REAL, DIMENSION(:,:,:), POINTER :: radfrcsm(:,:,:) REAL, DIMENSION(:,:), POINTER :: radswsm, rnflxsm, radswnetsm, radlwinsm REAL, DIMENSION(:,:), POINTER :: usflxsm, vsflxsm, ptsflxsm, qvsflxsm ! !----------------------------------------------------------------------- ! ! ARPS arrays to be read in: ! !----------------------------------------------------------------------- ! REAL, DIMENSION(:), POINTER :: x ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL, DIMENSION(:), POINTER :: y ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL, DIMENSION(:), POINTER :: z ! The z-coord. of the computational ! grid. Defined at w-point. REAL, DIMENSION(:,:,:), POINTER :: zp ! The height of the terrain. REAL, DIMENSION(:,:,:), POINTER :: zpsoil ! The height of the soil model. REAL, DIMENSION(:,:,:), POINTER :: uprt ! Perturbation u-velocity (m/s) REAL, DIMENSION(:,:,:), POINTER :: vprt ! Perturbation v-velocity (m/s) REAL, DIMENSION(:,:,:), POINTER :: wprt ! Perturbation w-velocity (m/s) REAL, DIMENSION(:,:,:), POINTER :: ptprt ! Perturbation potential temperature (K) REAL, DIMENSION(:,:,:), POINTER :: pprt ! Perturbation pressure (Pascal) REAL, DIMENSION(:,:,:), POINTER :: qvprt ! Perturbation water vapor specific ! humidity (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: qc ! Cloud water mixing ratio (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: qr ! Rain water mixing ratio (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: qi ! Cloud ice mixing ratio (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: qs ! Snow mixing ratio (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: qh ! Hail mixing ratio (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: qv ! Water vapor specific humidity (kg/kg) REAL, DIMENSION(:,:,:), POINTER :: tke ! Turbulent Kinetic Energy ((m/s)**2) REAL, DIMENSION(:,:,:), POINTER :: kmh ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL, DIMENSION(:,:,:), POINTER :: kmv ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) REAL, DIMENSION(:,:,:), POINTER :: ubar ! Base state u-velocity (m/s) REAL, DIMENSION(:,:,:), POINTER :: vbar ! Base state v-velocity (m/s) REAL, DIMENSION(:,:,:), POINTER :: wbar ! Base state w-velocity (m/s) REAL, DIMENSION(:,:,:), POINTER :: ptbar ! Base state potential temperature (K) REAL, DIMENSION(:,:,:), POINTER :: pbar ! Base state pressure (Pascal) REAL, DIMENSION(:,:,:), POINTER :: rhobar ! Base state air density (kg/m**3) REAL, DIMENSION(:,:,:), POINTER :: qvbar ! Base state water vapor specific INTEGER, DIMENSION(:,:,:), POINTER :: soiltyp ! Soil type REAL, DIMENSION(:,:,:), POINTER :: stypfrct ! Soil type INTEGER, DIMENSION(:,:), POINTER :: vegtyp ! Vegetation type REAL, DIMENSION(:,:), POINTER :: lai ! Leaf Area Index REAL, DIMENSION(:,:), POINTER :: roufns ! Surface roughness REAL, DIMENSION(:,:), POINTER :: veg ! Vegetation fraction REAL, DIMENSION(:,:,:,:), POINTER :: tsoil ! Soil Temperature (K) REAL, DIMENSION(:,:,:,:), POINTER :: qsoil ! Soil Moisture REAL, DIMENSION(:,:,:), POINTER :: wetcanp ! Canopy water amount REAL, DIMENSION(:,:), POINTER :: snowdpth ! Snow depth (m) REAL, DIMENSION(:,:), POINTER :: rain ! Total rainfall REAL, DIMENSION(:,:), POINTER :: raing ! Grid supersaturation rain REAL, DIMENSION(:,:), POINTER :: rainc ! Cumulus convective rain REAL, DIMENSION(:,:,:), POINTER :: prcrate ! precipitation rate (kg/(m**2*s)) ! prcrate(1,1,1) = total precip. rate ! prcrate(1,1,2) = grid scale precip. rate ! prcrate(1,1,3) = cumulus precip. rate ! prcrate(1,1,4) = microphysics precip. rate REAL, DIMENSION(:,:,:), POINTER :: radfrc ! Radiation forcing (K/s) REAL, DIMENSION(:,:), POINTER :: radsw ! Solar radiation reaching the surface REAL, DIMENSION(:,:), POINTER :: rnflx ! Net radiation flux absorbed by surface REAL, DIMENSION(:,:), POINTER :: radswnet ! Net shortwave radiation REAL, DIMENSION(:,:), POINTER :: radlwin ! Incoming longwave radiation REAL, DIMENSION(:,:), POINTER :: usflx ! Surface flux of u-momentum (kg/(m*s**2)) REAL, DIMENSION(:,:), POINTER :: vsflx ! Surface flux of v-momentum (kg/(m*s**2)) REAL, DIMENSION(:,:), POINTER :: ptsflx ! Surface heat flux (K*kg/(m*s**2)) REAL, DIMENSION(:,:), POINTER :: qvsflx ! Surface moisture flux (kg/(m**2*s)) !----------------------------------------------------------------------- ! ! 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 ! = nz-2 if the same grid as ARPS ! All are staggered values INTEGER :: nzsoil_wrf ! WRF number of soil layers ! see sf_surface_physics REAL :: lattru_wrf(2) ! array of true latitude of WRF map projection REAL :: lontru_wrf ! true longitude of WRF map projection ! = trulon_wrf ! Namelist variable declaration CHARACTER(LEN=5) :: sfcinitopt ! either "ARPS" or "WRFSI" INTEGER :: create_bdy ! Create WRF boundary file INTEGER :: create_namelist ! Dump WRF namelist.input INTEGER :: use_arps_grid ! Use ARPS horizontal grid as WRF grid INTEGER :: tintv_bdyin ! ARPS boundary file interval (in seconds) INTEGER :: 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):: wrfnamelist ! file name for WRF namelist.input 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 REAL :: ptop ! WRF atmosphere top pressure in Pascal REAL :: zlevels_wrf(max_vertical_levels) ! WRF mass levels from 1.0 at surfact to ! 0.0 at atmosphere top INTEGER :: iorder ! order of polynomial for horizontal ! interpolation (1 or 2) INTEGER :: korder ! vertical interpolation order (1 or 2) INTEGER :: dyn_opt ! WRF dynamics option ! only works for = 2 Eulerian mass coordinate INTEGER :: diff_opt ! WRF diffusion option INTEGER :: km_opt ! WRF eddy coefficient option REAL :: khdif ! Horizontal diffusion constant (m^2/s) REAL :: kvdif ! Vertical diffusion constant (m^2/s) INTEGER :: 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 :: ra_lw_physics ! Longwave radiaiton option INTEGER :: ra_sw_physics ! Shortwave radiation option INTEGER :: sf_sfclay_physics ! WRF surface-layer option INTEGER :: 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 :: bl_pbl_physics ! boundary-layer option INTEGER :: cu_physics ! cumulus option REAL :: dt ! time-step for advection INTEGER :: spec_bdy_width ! number of rows for specified boundary values nudging INTEGER :: nprocx_wrf ! Number of X direction processors for WRF run INTEGER :: nprocy_wrf ! Number of Y direction processors for WRF run INTEGER :: io_form ! !----------------------------------------------------------------------- ! ! ARPS working arrays ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: xs(:),ys(:) ! ARPS coordinate at scalar points REAL, ALLOCATABLE :: zps(:,:,:) ! ARPS vertical coordinate at scalar points REAL, ALLOCATABLE :: temp(:,:,:) ! ARPS temperature REAL, ALLOCATABLE :: tem1(:,:,:), tem2(:,:,:), tem3(:,:,:) !----------------------------------------------------------------------- ! ! WRF grid related variables ! !----------------------------------------------------------------------- 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 :: zlevels_half(:) ! WRF vertical mass points at half levels REAL, ALLOCATABLE :: zs_wrf(:) ! Depth of center of soil layers REAL, ALLOCATABLE :: dzs_wrf(:) ! Thickness of soil layers !----------------------------------------------------------------------- ! ! Horizontally interpolation arrays ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: x2d(:,:,:) REAL, ALLOCATABLE :: y2d(:,:,:) ! WRF coordinate at ARPS grid INTEGER, ALLOCATABLE :: iloc(:,:,:) ! i index of WRF point in ARPS array. INTEGER, ALLOCATABLE :: jloc(:,:,:) ! j index of WRF point in ARPS array. REAL, ALLOCATABLE :: dxfld(:,:) ! interpolation arrays calculated REAL, ALLOCATABLE :: rdxfld(:,:) ! in advance to speed up the REAL, ALLOCATABLE :: dyfld(:,:) ! interpolation REAL, ALLOCATABLE :: rdyfld(:,:) ! !----------------------------------------------------------------------- ! ! WRF work arrays ! (These arrays defined at WRF grid horizontally and ! vertically at ARPS physical heights) ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: t_tmp(:,:,:) REAL, ALLOCATABLE :: p_tmp(:,:,:) REAL, ALLOCATABLE :: qv_tmp(:,:,:) REAL, ALLOCATABLE :: zps_tmp(:,:,:) REAL, ALLOCATABLE :: etap(:,:,:,:) ! air mass at ARPS physical height vertically REAL, ALLOCATABLE :: tsoil_tmp(:,:,:) ! Defined at ARPS soil layers REAL, ALLOCATABLE :: qsoil_tmp(:,:,:) REAL, ALLOCATABLE :: zpsoil_tmp(:,:,:) REAL, ALLOCATABLE :: work3d(:,:,:) REAL, ALLOCATABLE :: work2d(:,:) !----------------------------------------------------------------------- ! ! WRF ARRAYS ! (Those are arrays defined at WRF grid both horizontally ! and vetically) ! !----------------------------------------------------------------------- REAL, ALLOCATABLE :: mu(:,:) ! WRF air mass at surface REAL, ALLOCATABLE :: hterain_wrf(:,:) ! WRF topograph REAL, ALLOCATABLE :: u_wrf(:,:,:) ! u-velocity (m/s) REAL, ALLOCATABLE :: v_wrf(:,:,:) ! v-velocity (m/s) REAL, ALLOCATABLE :: w_wrf(:,:,:) ! w-velocity (m/s) REAL, ALLOCATABLE :: ph_wrf(:,:,:) ! perturbation geopotential REAL, ALLOCATABLE :: phb_wrf(:,:,:) ! base state geopotential REAL, ALLOCATABLE :: pot_wrf(:,:,:) ! total potential. temp. REAL, ALLOCATABLE :: pt_wrf(:,:,:) ! perturbation potential. temp. REAL, ALLOCATABLE :: qv_wrf(:,:,:) ! Water vapor mixing ratio REAL, ALLOCATABLE :: p_wrf(:,:,:) ! perturbation pressure REAL, ALLOCATABLE :: pb_wrf(:,:,:) ! reference pressure REAL, ALLOCATABLE :: qc_wrf(:,:,:) REAL, ALLOCATABLE :: qr_wrf(:,:,:) REAL, ALLOCATABLE :: qi_wrf(:,:,:) REAL, ALLOCATABLE :: qs_wrf(:,:,:) REAL, ALLOCATABLE :: qg_wrf(:,:,:) REAL, ALLOCATABLE :: mup_wrf(:,:) ! perturbation air mass REAL, ALLOCATABLE :: mub_wrf(:,:) ! base air mass REAL, ALLOCATABLE :: tem1_wrf(:,:,:) ! WRF temporary arrays REAL, ALLOCATABLE :: tem2_wrf(:,:,:) REAL, ALLOCATABLE :: tem3_wrf(:,:,:) REAL, ALLOCATABLE :: tem4_wrf(:,:,:) INTEGER, ALLOCATABLE :: soiltyp_wrf(:,:),vegtyp_wrf(:,:) REAL, ALLOCATABLE :: vegfrct_wrf(:,:) REAL, ALLOCATABLE :: xice(:,:),xland(:,:) ! flags why they are reals? REAL, ALLOCATABLE :: sst_wrf(:,:) REAL, ALLOCATABLE :: hgt_wrf(:,:),tmn_wrf(:,:) REAL, ALLOCATABLE :: shdmin(:,:),shdmax(:,:),albbck(:,:),snoalb(:,:) REAL, ALLOCATABLE :: tslb_wrf(:,:,:) REAL, ALLOCATABLE :: smois_wrf(:,:,:) REAL, ALLOCATABLE :: snowh_wrf(:,:) REAL, ALLOCATABLE :: canwat_wrf(:,:) !---------------------------------------------------------------------- ! ! OUTPUT work arrays ! !---------------------------------------------------------------------- TYPE(wrf_global_metadata) :: global_meta REAL, ALLOCATABLE :: uatv_wrf(:,:,:) REAL, ALLOCATABLE :: vatu_wrf(:,:,:) 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) !----------------------------------------------------------------------- ! ! Boundary arrays ! !----------------------------------------------------------------------- REAL, DIMENSION(:,:,:), ALLOCATABLE :: ubdy3dtemp1,vbdy3dtemp1, & tbdy3dtemp1,pbdy3dtemp1,qbdy3dtemp1 REAL, DIMENSION(:,:), ALLOCATABLE :: mbdy2dtemp1 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ubdy3dtemp2,vbdy3dtemp2, & tbdy3dtemp2,pbdy3dtemp2,qbdy3dtemp2 REAL, DIMENSION(:,:), ALLOCATABLE :: mbdy2dtemp2 REAL, DIMENSION(:,:,:), ALLOCATABLE :: bdys,bdyn,bdyw,bdye REAL, DIMENSION(:,:,:), ALLOCATABLE :: blgs,blgn,blgw,blge !----------------------------------------------------------------------- ! ! Misc local variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,n,ifile INTEGER :: istatus, lenstr, ireturn INTEGER :: year1,month1,day1,hour1,minute1,second1 INTEGER :: abstime, abstime1 REAL :: time, gmthr LOGICAL :: init, hinterp_needed LOGICAL :: fexist REAL :: latnot(2),ctrx, ctry, scalef REAL :: swx, swy REAL :: swx_wrf, swy_wrf CHARACTER(LEN=256) :: filename CHARACTER(LEN=24) :: times_str CHARACTER(LEN=24) :: nextbdytimes INTEGER :: nchr, ncid, nchout REAL :: rdummy REAL, PARAMETER :: eps = 1.0E-5 !WDT 2004-01-20 GMB: set SST ! REAL :: cnt,sst_sum,dist_weight ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! CALL mpinit_proc ! !----------------------------------------------------------------------- ! ! Initializations ! !----------------------------------------------------------------------- ! IF(myproc == 0) WRITE(6,'(14(/5x,a),/)') & '###############################################################',& '###############################################################',& '#### ####',& '#### Welcome to ARPS2WRF ####',& '#### ####',& '#### Program that reads in history files generated by ####',& '#### ADAS/ARPS and produces files for WRF to start: ####',& '#### ####',& '#### wrfinput_d01, wrfbdy_d01, namelist.input ####',& '#### ####',& '###############################################################',& '###############################################################' !----------------------------------------------------------------------- ! ! First, read in namelist input ! !----------------------------------------------------------------------- dyn_opt = 2 CALL readnamelist(0,hinfmt,bdybasfn,hisfile,nhisfile, & 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,filename,times_str,rdummy,rdummy, & 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) filename = ' ' execname = ' ' IF (mp_opt == 0) THEN execname = 'ARPS2WRF (serial)' ELSE WRITE(execname,'(a,I3,a,I3,a)') 'ARPS2WRF (Parallel, ',nproc_x,'x',nproc_y,')' END IF !----------------------------------------------------------------------- ! ! Allocate ARPS arrays ! !----------------------------------------------------------------------- ALLOCATE(x (nx)) ALLOCATE(y (ny)) ALLOCATE(z (nz)) ALLOCATE(zp (nx,ny,nz)) ALLOCATE(zpsoil (nx,ny,nzsoil)) ALLOCATE(uprt (nx,ny,nz)) ALLOCATE(vprt (nx,ny,nz)) ALLOCATE(wprt (nx,ny,nz)) ALLOCATE(ptprt (nx,ny,nz)) ALLOCATE(pprt (nx,ny,nz)) ALLOCATE(qvprt (nx,ny,nz)) ALLOCATE(qv (nx,ny,nz)) ALLOCATE(qc (nx,ny,nz)) ALLOCATE(qr (nx,ny,nz)) ALLOCATE(qi (nx,ny,nz)) ALLOCATE(qs (nx,ny,nz)) ALLOCATE(qh (nx,ny,nz)) ALLOCATE(tke (nx,ny,nz)) ALLOCATE(kmh (nx,ny,nz)) ALLOCATE(kmv (nx,ny,nz)) ALLOCATE(ubar (nx,ny,nz)) ALLOCATE(vbar (nx,ny,nz)) ALLOCATE(wbar (nx,ny,nz)) ALLOCATE(ptbar (nx,ny,nz)) ALLOCATE(pbar (nx,ny,nz)) ALLOCATE(rhobar (nx,ny,nz)) ALLOCATE(qvbar (nx,ny,nz)) ALLOCATE(soiltyp (nx,ny,nstyps)) ALLOCATE(stypfrct(nx,ny,nstyps)) ALLOCATE(vegtyp (nx,ny)) ALLOCATE(lai (nx,ny)) ALLOCATE(roufns (nx,ny)) ALLOCATE(veg (nx,ny)) ALLOCATE(tsoil (nx,ny,nzsoil,0:nstyps)) ALLOCATE(qsoil (nx,ny,nzsoil,0:nstyps)) ALLOCATE(wetcanp(nx,ny,0:nstyps)) ALLOCATE(snowdpth(nx,ny)) ALLOCATE(rain (nx,ny)) ALLOCATE(raing(nx,ny)) ALLOCATE(rainc(nx,ny)) ALLOCATE(prcrate(nx,ny,4)) ALLOCATE(radfrc(nx,ny,nz)) ALLOCATE(radsw (nx,ny)) ALLOCATE(rnflx (nx,ny)) ALLOCATE(radswnet(nx,ny)) ALLOCATE(radlwin(nx,ny)) ALLOCATE(usflx (nx,ny)) ALLOCATE(vsflx (nx,ny)) ALLOCATE(ptsflx(nx,ny)) ALLOCATE(qvsflx(nx,ny)) x =0.0 y =0.0 z =0.0 zp =0.0 zpsoil =0.0 uprt =0.0 vprt =0.0 wprt =0.0 ptprt =0.0 pprt =0.0 qvprt =0.0 qc =0.0 qr =0.0 qi =0.0 qs =0.0 qh =0.0 tke =0.0 kmh =0.0 kmv =0.0 ubar =0.0 vbar =0.0 wbar =0.0 ptbar =0.0 pbar =0.0 rhobar =0.0 qvbar =0.0 qv =0.0 soiltyp =0.0 stypfrct=0.0 vegtyp =0.0 lai =0.0 roufns =0.0 veg =0.0 tsoil =0.0 qsoil =0.0 wetcanp =0.0 snowdpth=0.0 rain = 0.0 raing = 0.0 rainc = 0.0 prcrate = 0.0 radfrc =0.0 radsw =0.0 rnflx =0.0 radswnet=0.0 radlwin =0.0 usflx =0.0 vsflx =0.0 ptsflx=0.0 qvsflx=0.0 ALLOCATE(xs(nx), STAT = istatus) ALLOCATE(ys(ny), STAT = istatus) ALLOCATE(zps(nx,ny,nz), STAT = istatus) ALLOCATE(temp(nx,ny,nz), STAT = istatus) xs = 0.0 ys = 0.0 zps = 0.0 temp = 0.0 !--------------------------------------------------------------------------- ! ! Allocate WRF arrays ! !--------------------------------------------------------------------------- ALLOCATE(zlevels_half(nz_wrf-1), STAT= istatus) DO k = 1, nz_wrf-1 zlevels_half(k) = (zlevels_wrf(k)+zlevels_wrf(k+1))*0.5 END DO ALLOCATE(mu (nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(hterain_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(soiltyp_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(vegtyp_wrf (nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(vegfrct_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(xice (nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(xland (nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(sst_wrf(nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(hgt_wrf(nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(tmn_wrf(nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(shdmin (nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(shdmax (nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(albbck (nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(snoalb (nx_wrf, ny_wrf ), STAT = istatus) ALLOCATE(snowh_wrf (nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(canwat_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(u_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(v_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(w_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(ph_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(phb_wrf(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(pot_wrf(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(pt_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(p_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(pb_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qv_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qc_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qr_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qi_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qs_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qg_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(mup_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(mub_wrf(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(tem1_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(tem2_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(tem3_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(tem4_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(zs_wrf (6), STAT = istatus) ! maximum soil layer is 6 ALLOCATE(dzs_wrf(6), 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) mu = 0.0 hterain_wrf = 0.0 soiltyp_wrf = 0 vegtyp_wrf = 0 xice = 0.0 xland = 0.0 u_wrf = 0.0 v_wrf = 0.0 ph_wrf = 0.0 phb_wrf = 0.0 pot_wrf = 0.0 pt_wrf = 0.0 p_wrf = 0.0 pb_wrf = 0.0 qv_wrf = 0.0 qc_wrf = 0.0 qr_wrf = 0.0 qi_wrf = 0.0 qs_wrf = 0.0 qg_wrf = 0.0 mup_wrf = 0.0 mub_wrf = 0.0 zs_wrf = 0.0 dzs_wrf = 0.0 snowh_wrf = 0.0 canwat_wrf = 0.0 !----------------------------------------------------------------------- ! ! Allocate temporary arrays ! !----------------------------------------------------------------------- nxlg_wrf = (nx_wrf-fzone_wrf)*nproc_x+fzone_wrf nylg_wrf = (ny_wrf-fzone_wrf)*nproc_y+fzone_wrf ALLOCATE(tem1(nx,ny,nz), STAT= istatus) ALLOCATE(tem2(nx,ny,nz), STAT= istatus) ALLOCATE(tem3(nx,ny,nz), STAT= istatus) ALLOCATE(t_tmp (nx_wrf,ny_wrf,nz), STAT = istatus) ALLOCATE(p_tmp (nx_wrf,ny_wrf,nz), STAT = istatus) ALLOCATE(qv_tmp (nx_wrf,ny_wrf,nz), STAT = istatus) ALLOCATE(zps_tmp (nx_wrf,ny_wrf,nz), STAT = istatus) ALLOCATE(etap (nx_wrf,ny_wrf,nz,3), STAT = istatus) ALLOCATE(work3d(nx_wrf,ny_wrf,nz), STAT = istatus) ALLOCATE(work2d(nx_wrf,ny_wrf), STAT = istatus) IF(create_bdy == 1) THEN ALLOCATE(ubdy3dtemp1(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(vbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(tbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(pbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(mbdy2dtemp1(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(ubdy3dtemp2(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(vbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(tbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(pbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(qbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(mbdy2dtemp2(nx_wrf,ny_wrf), STAT = istatus) ALLOCATE(bdys(nx_wrf,nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(bdyn(nx_wrf,nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(bdyw(ny_wrf,nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(bdye(ny_wrf,nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(blgs(nxlg_wrf, nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(blgn(nxlg_wrf, nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(blgw(nylg_wrf, nz_wrf, spec_bdy_width), STAT = istatus) ALLOCATE(blge(nylg_wrf, nz_wrf, spec_bdy_width), STAT = istatus) blgs = 0.0 blgn = 0.0 blgw = 0.0 blge = 0.0 bdys = 0.0 bdyn = 0.0 bdyw = 0.0 bdye = 0.0 END IF ALLOCATE(x2d (nx_wrf,ny_wrf,3), STAT = istatus) ALLOCATE(y2d (nx_wrf,ny_wrf,3), STAT = istatus) ALLOCATE(iloc (nx_wrf,ny_wrf,3), STAT = istatus) ALLOCATE(jloc (nx_wrf,ny_wrf,3), STAT = istatus) x2d = 0.0 y2d = 0.0 iloc = 0 jloc = 0 ! ! mpi variables ! nxsm = (nx-fzone_arps)/ncompressx + fzone_arps nysm = (ny-fzone_arps)/ncompressy + fzone_arps nxlg = (nx-fzone_arps)*nproc_x + fzone_arps nylg = (ny-fzone_arps)*nproc_y + fzone_arps IF(ncompressx > 1 .OR. ncompressy > 1) THEN ALLOCATE(xsm (nxsm),STAT=istatus) ALLOCATE(ysm (nysm),STAT=istatus) ALLOCATE(zpsm (nxsm,nysm,nz), STAT=istatus) ALLOCATE(zpsoilsm(nxsm,nysm,nzsoil),STAT=istatus) ALLOCATE(uprtsm(nxsm,nysm,nz), STAT=istatus) ALLOCATE(vprtsm(nxsm,nysm,nz), STAT=istatus) ALLOCATE(wprtsm(nxsm,nysm,nz), STAT=istatus) ALLOCATE(ptprtsm(nxsm,nysm,nz),STAT=istatus) ALLOCATE(pprtsm(nxsm,nysm,nz), STAT=istatus) ALLOCATE(qvprtsm(nxsm,nysm,nz),STAT=istatus) ALLOCATE(qcsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(qrsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(qism (nxsm,nysm,nz),STAT=istatus) ALLOCATE(qssm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(qhsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(tkesm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(kmhsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(kmvsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(ubarsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(vbarsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(wbarsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(ptbarsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(pbarsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(rhobarsm(nxsm,nysm,nz),STAT=istatus) ALLOCATE(qvbarsm (nxsm,nysm,nz),STAT=istatus) ALLOCATE(soiltypsm (nxsm,nysm,nstyps),STAT=istatus) ALLOCATE(stypfrctsm(nxsm,nysm,nstyps),STAT=istatus) ALLOCATE(vegtypsm (nxsm,nysm),STAT=istatus) ALLOCATE(laism (nxsm,nysm),STAT=istatus) ALLOCATE(roufnssm (nxsm,nysm),STAT=istatus) ALLOCATE(vegsm (nxsm,nysm),STAT=istatus) ALLOCATE(tsoilsm (nxsm,nysm,nzsoil,0:nstyps),STAT=istatus) ALLOCATE(qsoilsm (nxsm,nysm,nzsoil,0:nstyps),STAT=istatus) ALLOCATE(wetcanpsm (nxsm,nysm,0:nstyps),STAT=istatus) ALLOCATE(snowdpthsm(nxsm,nysm),STAT=istatus) ALLOCATE(raingsm (nxsm,nysm),STAT=istatus) ALLOCATE(raincsm (nxsm,nysm),STAT=istatus) ALLOCATE(prcratesm (nxsm,nysm,4),STAT=istatus) ALLOCATE(radfrcsm(nxsm,nysm,nz),STAT=istatus) ALLOCATE(radswsm (nxsm,nysm),STAT=istatus) ALLOCATE(rnflxsm (nxsm,nysm),STAT=istatus) ALLOCATE(radswnetsm (nxsm,nysm),STAT=istatus) ALLOCATE(radlwinsm (nxsm,nysm),STAT=istatus) ALLOCATE(usflxsm (nxsm,nysm),STAT=istatus) ALLOCATE(vsflxsm (nxsm,nysm),STAT=istatus) ALLOCATE(ptsflxsm(nxsm,nysm),STAT=istatus) ALLOCATE(qvsflxsm(nxsm,nysm),STAT=istatus) CALL check_alloc_status(istatus, "arpsplt:qvsflxsm") xsm = 0.0 ysm = 0.0 zpsm = 0.0 zpsoilsm= 0.0 uprtsm = 0.0 vprtsm = 0.0 wprtsm = 0.0 ptprtsm = 0.0 pprtsm = 0.0 qvprtsm = 0.0 qcsm = 0.0 qrsm = 0.0 qism = 0.0 qssm = 0.0 qhsm = 0.0 tkesm = 0.0 kmhsm = 0.0 kmvsm = 0.0 ubarsm = 0.0 vbarsm = 0.0 wbarsm = 0.0 ptbarsm = 0.0 pbarsm = 0.0 rhobarsm= 0.0 qvbarsm = 0.0 soiltypsm = 0.0 stypfrctsm= 0.0 vegtypsm = 0.0 laism = 0.0 roufnssm = 0.0 vegsm = 0.0 tsoilsm = 0.0 qsoilsm = 0.0 wetcanpsm = 0.0 snowdpthsm= 0.0 raingsm = 0.0 raincsm = 0.0 prcratesm = 0.0 radfrcsm = 0.0 radswsm = 0.0 rnflxsm = 0.0 radswnetsm = 0.0 radlwinsm = 0.0 usflxsm = 0.0 vsflxsm = 0.0 ptsflxsm = 0.0 qvsflxsm = 0.0 ELSE xsm => x ysm => y zpsm => zp zpsoilsm => zpsoil uprtsm => uprt vprtsm => vprt wprtsm => wprt ptprtsm => ptprt pprtsm => pprt qvprtsm => qvprt qcsm => qc qrsm => qr qism => qi qssm => qs qhsm => qh tkesm => tke kmhsm => kmh kmvsm => kmv ubarsm => ubar vbarsm => vbar wbarsm => wbar ptbarsm => ptbar pbarsm => pbar rhobarsm => rhobar qvbarsm => qvbar soiltypsm => soiltyp stypfrctsm => stypfrct vegtypsm => vegtyp laism => lai roufnssm => roufns vegsm => veg tsoilsm => tsoil qsoilsm => qsoil wetcanpsm => wetcanp snowdpthsm => snowdpth raingsm => raing raincsm => rainc prcratesm => prcrate radfrcsm => radfrc radswsm => radsw rnflxsm => rnflx radswnetsm => radswnet radlwinsm => radlwin usflxsm => usflx vsflxsm => vsflx ptsflxsm => ptsflx qvsflxsm => qvsflx END IF !-------------------------------------------------------------------- ! ! Begin loop over all of the history files ! !-------------------------------------------------------------------- init = .FALSE. DO ifile = 1,nhisfile lenfil = LEN_TRIM(hisfile(ifile)) CALL strlnth( hisfile(ifile), lenfil) DO jj = 1, ncompressy DO ii = 1, ncompressx IF (mp_opt > 0 .AND. readsplit <= 0) THEN WRITE(hisfile(ifile)(lenfil+1:lenfil+5),'(a,i2.2,i2.2)') '_', & ncompressx*(loc_x-1)+ii,ncompressy*(loc_y-1)+jj lenfil= lenfil + 5 WRITE(6,'(a,I5,2a/)') 'Processor: ',myproc, & ' reading file: ', hisfile(ifile)(1:lenfil) ELSE IF (myproc == 0) THEN WRITE(6,'(/2a/)') ' Reading file: ',hisfile(ifile)(1:lenfil) END IF ! !----------------------------------------------------------------------- ! ! Set the gridread parameter to 0 so that the boundary ! grid/base file will be read. ! !----------------------------------------------------------------------- ! IF( mgrdbas == 0 .OR. ifile == 1) THEN grdbasfn = bdybasfn(1) lengbf = LEN_TRIM(grdbasfn) IF (mp_opt > 0 .AND. readsplit <= 0) THEN WRITE(grdbasfn(lengbf+1:lengbf+5),'(a,i2.2,i2.2)') '_', & ncompressx*(loc_x-1)+ii,ncompressy*(loc_y-1)+jj lengbf= lengbf + 5 END IF WRITE(6,'(1x,a,a)') ' The grid/base name is ', grdbasfn(1:lengbf) IF (ifile == 1) CALL setgbrd(0) ELSE IF (mgrdbas == 1 .AND. ifile == 2) THEN grdbasfn = bdybasfn(2) lengbf = LEN_TRIM(grdbasfn) IF (mp_opt > 0 .AND. readsplit <= 0) THEN WRITE(grdbasfn(lengbf+1:lengbf+5),'(a,i2.2,i2.2)') '_', & ncompressx*(loc_x-1)+ii,ncompressy*(loc_y-1)+jj lengbf= lengbf + 5 END IF WRITE(6,'(1x,a,a)') ' The grid/base name is ', grdbasfn(1:lengbf) CALL setgbrd(0) ELSE IF (mgrdbas == 2 .AND. ifile >= 2) THEN grdbasfn = bdybasfn(ifile) lengbf = LEN_TRIM(grdbasfn) IF (mp_opt > 0 .AND. readsplit <= 0) THEN WRITE(grdbasfn(lengbf+1:lengbf+5),'(a,i2.2,i2.2)') '_', & ncompressx*(loc_x-1)+ii,ncompressy*(loc_y-1)+jj lengbf= lengbf + 5 END IF WRITE(6,'(1x,a,a)') ' The grid/base name is ', grdbasfn(1:lengbf) CALL setgbrd(0) END IF ! !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! CALL dtaread(nx,ny,nz,nzsoil,nstyps,hinfmt,nchr,grdbasfn(1:lengbf), & lengbf, hisfile(ifile)(1:lenfil),lenfil,time, & xsm,ysm,z,zpsm,zpsoilsm,uprtsm,vprtsm,wprtsm,ptprtsm,pprtsm, & qvprtsm, qcsm, qrsm, qism, qssm, qhsm, tkesm, kmhsm, kmvsm, & ubarsm, vbarsm, wbarsm, ptbarsm, pbarsm, rhobarsm, qvbarsm, & soiltypsm,stypfrctsm,vegtypsm,laism,roufnssm,vegsm, & tsoilsm,qsoilsm,wetcanpsm,snowdpthsm, & raingsm,raincsm,prcratesm, & radfrcsm,radswsm,rnflxsm,radswnetsm,radlwinsm, & usflxsm,vsflxsm,ptsflxsm,qvsflxsm, & ireturn, tem1,tem2,tem3) !----------------------------------------------------------------------- ! ! ireturn = 0 for a successful read ! !----------------------------------------------------------------------- ! IF( ireturn /= 0 ) CALL arpsstop('dtaread errors.',1) IF(ncompressx > 1 .OR. ncompressy > 1) THEN ! need join DO j = 1, nysm ja = (jj-1)*(nysm-3)+j DO i = 1, nxsm ia = (ii-1)*(nxsm-3)+i x(ia) = xsm(i) vegtyp(ia,ja) = vegtypsm(i,j) lai(ia,ja) = laism(i,j) roufns(ia,ja) = roufnssm(i,j) veg(ia,ja) = vegsm(i,j) snowdpth(ia,ja) = snowdpthsm(i,j) raing(ia,ja) = raingsm(i,j) rainc(ia,ja) = raincsm(i,j) radsw(ia,ja) = radswsm(i,j) radswnet(ia,ja) = radswnetsm(i,j) radlwin(ia,ja) = radlwinsm(i,j) rnflx(ia,ja) = rnflxsm(i,j) usflx(ia,ja) = usflxsm(i,j) vsflx(ia,ja) = vsflxsm(i,j) ptsflx(ia,ja) = ptsflxsm(i,j) qvsflx(ia,ja) = qvsflxsm(i,j) prcrate(ia,ja,:) = prcratesm(i,j,:) zp(ia,ja,:) = zpsm(i,j,:) zpsoil(ia,ja,:) = zpsoilsm(i,j,:) uprt(ia,ja,:) = uprtsm(i,j,:) vprt(ia,ja,:) = vprtsm(i,j,:) wprt(ia,ja,:) = wprtsm(i,j,:) ptprt(ia,ja,:) = ptprtsm(i,j,:) pprt(ia,ja,:) = pprtsm(i,j,:) qvprt(ia,ja,:) = qvprtsm(i,j,:) qc(ia,ja,:) = qcsm(i,j,:) qr(ia,ja,:) = qrsm(i,j,:) qi(ia,ja,:) = qism(i,j,:) qs(ia,ja,:) = qssm(i,j,:) qh(ia,ja,:) = qhsm(i,j,:) tke(ia,ja,:) = tkesm(i,j,:) kmh(ia,ja,:) = kmhsm(i,j,:) kmv(ia,ja,:) = kmvsm(i,j,:) ubar(ia,ja,:) = ubarsm(i,j,:) vbar(ia,ja,:) = vbarsm(i,j,:) wbar(ia,ja,:) = wbarsm(i,j,:) ptbar(ia,ja,:) = ptbarsm(i,j,:) pbar(ia,ja,:) = pbarsm(i,j,:) rhobar(ia,ja,:) = rhobarsm(i,j,:) qvbar(ia,ja,:) = qvbarsm(i,j,:) radfrc(ia,ja,:) = radfrcsm(i,j,:) soiltyp(ia,ja,:) = soiltypsm(i,j,:) stypfrct(ia,ja,:) = stypfrctsm(i,j,:) tsoil(ia,ja,:,:) = tsoilsm(i,j,:,:) qsoil(ia,ja,:,:) = qsoilsm(i,j,:,:) wetcanp(ia,ja,:) = wetcanpsm(i,j,:) END DO !i y(ja) = ysm(j) END DO !j END IF ! join needed END DO END DO ! Data read finished CALL ctim2abss( year,month,day,hour,minute,second, abstime ) abstime = abstime + INT(time) CALL abss2ctim( abstime, year, month, day, hour, minute, second ) CALL julday( year, month, day, jday) !======================================================================= ! ! Only do the following for the first time level ! !======================================================================= IF( ifile == 1 ) THEN gmthr = hour + minute/60. + second/3600. IF(use_arps_grid == 1) THEN mapproj_wrf = mapproj sclfct_wrf = sclfct trulat1_wrf = trulat1 trulat2_wrf = trulat2 trulon_wrf = trulon ctrlat_wrf = ctrlat ctrlon_wrf = ctrlon dx_wrf = x(3)-x(2) dy_wrf = y(3)-y(2) hinterp_needed = .FALSE. ELSE trulat1_wrf = lattru_wrf(1) trulat2_wrf = lattru_wrf(2) trulon_wrf = lontru_wrf END IF IF (myproc == 0) THEN 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 END IF IF(mapproj == mapproj_wrf .AND. & trulat1 == trulat1_wrf .AND. trulat2 == trulat2_wrf .AND. & trulon == trulon_wrf .AND. & ctrlat == ctrlat_wrf .AND. ctrlon == ctrlon_wrf .AND. & nx == nx_wrf + 2 .AND. ny == ny_wrf + 2 .AND. & ABS(dx_wrf-dx) < eps .AND. ABS(dy_wrf-dy) < eps ) THEN ! ARPS and WRF are at the same grid ! Horizontal interpolations are not necessary hinterp_needed = .FALSE. IF(myproc == 0) & WRITE(6,'(/a/)') 'NOTE: No horizontal interpolation will be performed.' ELSE hinterp_needed = .TRUE. WRITE(6,'(/a/)') 'NOTE: Horizontal interpolation will be performed.' END IF IF (hinterp_needed .AND. mp_opt > 0) THEN WRITE(6,'(1x,/2a/)') 'ARPS2WRF_mpi does not support horizontal ', & 'interpolation still. Please check and try again.' CALL arpsstop('mpi mode still does not implemented.',1) END IF year1 = year month1 = month day1 = day hour1 = hour minute1= minute second1= second abstime1 = abstime ! !----------------------------------------------------------------------- ! ! Establish coordinate for ARPS scalar fields. ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO xs(nx)=2.*xs(nx-1)-xs(nx-2) DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO ys(ny)=2.*ys(ny-1)-ys(ny-2) DO k=1,nz-1 DO j=1,ny DO i=1,nx zps(i,j,k)=0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO END DO END DO zps(:,:,nz) = 2*zps(:,:,nz-1)-zps(:,:,nz-2) ! !----------------------------------------------------------------------- ! ! Establish WRF map projection and find latitude and longitude of WRF grid. ! and compute the lat/lon at domain corners ! ! 1 -- T point, 2 -- U point, 3 -- V point, 4 -- massless point ! !----------------------------------------------------------------------- ! ALLOCATE(lat_wrf(nx_wrf,ny_wrf,3), STAT = istatus) ALLOCATE(lon_wrf(nx_wrf,ny_wrf,3), STAT = istatus) lattru_wrf(1) = trulat1_wrf lattru_wrf(2) = trulat2_wrf lontru_wrf = trulon_wrf ! sclfct_wrf changes inside CALL build_wrf_grid(nx_wrf,ny_wrf,nxlg_wrf,nylg_wrf,dx_wrf,dy_wrf,& mapproj_wrf,sclfct_wrf,lattru_wrf,lontru_wrf, & ctrlat_wrf,ctrlon_wrf,swx_wrf,swy_wrf, & lat_wrf,lon_wrf,lat_ll,lat_ul,lat_ur,lat_lr, & lon_ll,lon_ul,lon_ur,lon_lr,istatus) !----------------------------------------------------------------------- ! ! Find x,y locations of WRF grid in terms of the ARPS grid. ! !----------------------------------------------------------------------- IF (hinterp_needed .OR. sfcinitopt == 'ARPS') THEN latnot(1) = trulat1 latnot(2) = trulat2 scalef = 1.0/sclfct ALLOCATE(dxfld (nx,3), STAT = istatus) ALLOCATE(rdxfld(nx,3), STAT = istatus) ALLOCATE(dyfld (ny,3), STAT = istatus) ALLOCATE(rdyfld(ny,3), STAT = istatus) CALL prepinterp(nx,ny,nxlg,nylg,nxlg_wrf,nylg_wrf,dx,dy,x,y,xs,ys,& mapproj,scalef,latnot,trulon,ctrlat,ctrlon,swx,swy, & lat_wrf,lon_wrf,x2d,y2d,iloc,jloc, & dxfld,rdxfld,dyfld,rdyfld,istatus) END IF !----------------------------------------------------------------------- ! ! Read in surface characteristic data to intialize ! !----------------------------------------------------------------------- CALL get_sfcdt(sfcinitopt,sfcdtfl,ncompressx,ncompressy,nxsm,nysm,& nx,ny,nstyps,dx,dy,mapproj,trulat1,trulat2,trulon,sclfct, & ctrlat,ctrlon,soiltyp,stypfrct,vegtyp,veg,tem1, & hinterp_needed,nx_wrf,ny_wrf,dx_wrf,dy_wrf, & mapproj_wrf,trulat1_wrf,trulat2_wrf,trulon_wrf,jday, & x2d(:,:,1),y2d(:,:,1),xs,ys,iloc(:,:,1),jloc(:,:,1), & hgt_wrf,soiltyp_wrf,vegtyp_wrf,vegfrct_wrf,xice,xland, & tmn_wrf,shdmin,shdmax,albbck,snoalb,istatus) IF (istatus /= 0) & CALL arpsstop('ERROR: reading surface data. Aborted.',1) !----------------------------------------------------------------------- ! ! Set up soil model vertical layers ! !----------------------------------------------------------------------- CALL init_soil_depth(sf_surface_physics,zs_wrf,dzs_wrf,nzsoil_wrf) ! !----------------------------------------------------------------------- ! ! Get 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 init = .TRUE. END IF ! ifile == 1 !======================================================================= ! ! All files should do the followings ! !======================================================================= ! Restore to WRF map projection CALL setmapr(mapproj_wrf,sclfct_wrf,lattru_wrf,lontru_wrf) CALL setorig( 1, swx_wrf, swy_wrf) !----------------------------------------------------------------------- ! ! Begin ARPS data conversions ! ! NOTE: ! From now on, pprt, ptprt, qvprt, uprt,vprt, wprt will hold total ! values of the variables instead of only the perturbation part. ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny DO i=1,nx pprt(i,j,k) = pprt(i,j,k) + pbar(i,j,k) ptprt(i,j,k)= ptprt(i,j,k)+ ptbar(i,j,k) qvprt(i,j,k)= qvprt(i,j,k)+ qvbar(i,j,k) uprt(i,j,k) = uprt(i,j,k) + ubar(i,j,k) vprt(i,j,k) = vprt(i,j,k) + vbar(i,j,k) wprt(i,j,k) = wprt(i,j,k) + wbar(i,j,k) qi(i,j,k) = qi(i,j,k) + qs(i,j,k) + qh(i,j,k) END DO END DO END DO ! ! Put temperature into temp ! DO k=1,nz DO j=1,ny DO i=1,nx temp(i,j,k)=ptprt(i,j,k)*(pprt(i,j,k)/p0)**rddcp END DO END DO END DO !---------------------------------------------------------------------- ! ! Check ARPS vertical domain ! !---------------------------------------------------------------------- DO j = 1,ny-1 DO i = 1,nx-1 IF(pprt(i,j,nz-1) > ptop + 1000) THEN WRITE(6,'(/2a)') 'It seems that WRF vertical domain is ', & 'outside of the ARPS physical domain.' WRITE(6,'(/a,F6.0,a,/a,I3,a,I3,a,F6.0,a,a)') & 'WRF top pressure is ', ptop,' Pascal.', & 'ARPS top pressure at i = ',i,' j = ',j, & ' is ',pprt(i,j,nz-1), ' Pascal.' CALL arpsstop('Vertical domain unmatch.',1) END IF END DO END DO ! !----------------------------------------------------------------------- ! ! Horizontally interpolate ARPS state variables to WRF grid ! !----------------------------------------------------------------------- ! IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & temp,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & t_tmp,tem1,tem2,tem3) CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & pprt,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & p_tmp,tem1,tem2,tem3) CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & zps,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & zps_tmp,tem1,tem2,tem3) CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qvprt,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & qv_tmp,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf t_tmp (i,j,k) = temp (i+1,j+1,k) p_tmp (i,j,k) = pprt (i+1,j+1,k) zps_tmp(i,j,k) = zps (i+1,j+1,k) qv_tmp (i,j,k) = qvprt(i+1,j+1,k) END DO END DO END DO END IF IF (ternopt == 0 .OR. sfcinitopt(1:4) == 'ARPS') THEN IF (hinterp_needed) THEN CALL hinterp(nx,ny,1,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & zp(:,:,2),dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & hterain_wrf,tem1,tem2,tem3) ELSE DO j = 1,ny_wrf DO i = 1,nx_wrf hterain_wrf(i,j) = zp(i+1,j+1,2) ! terrain height of source data END DO END DO END IF WHERE(hterain_wrf < 0) hterain_wrf = 0.0 ELSE IF (ternopt == 1) THEN hterain_wrf(:,:) = hgt_wrf(:,:) ELSE WRITE(6,'(a,I2,a)') ' **** WARNING: wrong ternopt = ',ternopt,' ****' CALL arpsstop('Wrong ternopt setting.',1) END IF ! !----------------------------------------------------------------------- ! ! Convert specific humidity to mixing ratio (kg/kg) ! ! NOTE: qv_tmp will be mixing ratio instead of specific humidity ! from now on. ! !----------------------------------------------------------------------- ! DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf qv_tmp(i,j,k) = qv_tmp(i,j,k) / (1-qv_tmp(i,j,k)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Compute ETAP in ARPS vertical grid ! !----------------------------------------------------------------------- ! CALL compute_eta_3d(nx_wrf,ny_wrf,nz,p_tmp,t_tmp,qv_tmp,zps_tmp, & hterain_wrf,ptop,etap(:,:,:,1),mu) ! T points DO k = 1, nz DO j = 1, ny_wrf DO i = 2, nx_wrf etap(i,j,k,2) = 0.5*(etap(i-1,j,k,1)+etap(i,j,k,1)) END DO etap(1,j,k,2) = 2*etap(2,j,k,2) - etap(3,j,k,2) ! U points END DO END DO DO k = 1, nz DO j = 2, ny_wrf DO i = 1, nx_wrf etap(i,j,k,3) = 0.5*(etap(i,j-1,k,1)+etap(i,j,k,1)) END DO END DO etap(:,1,k,3) = 2*etap(:,2,k,3) - etap(:,3,k,3) ! V points END DO !----------------------------------------------------------------------- ! ! Process U wind ! !----------------------------------------------------------------------- IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,2),jloc(:,:,2),x,ys,x2d(:,:,2),y2d(:,:,2), & uprt,dxfld(:,2),dyfld(:,2),rdxfld(:,2),rdyfld(:,2), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = uprt(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,2), & zlevels_half, work3d, u_wrf, .TRUE.) !----------------------------------------------------------------------- ! ! Process V wind ! !----------------------------------------------------------------------- IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,3),jloc(:,:,3),xs,y,x2d(:,:,3),y2d(:,:,3), & vprt,dxfld(:,3),dyfld(:,3),rdxfld(:,3),rdyfld(:,3), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = vprt(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,3), & zlevels_half,work3d, v_wrf, .TRUE.) !------------------------------------------------------------------- ! ! Rotate U/V from ARPS grid to WRF grid ! !------------------------------------------------------------------ IF(hinterp_needed) THEN ALLOCATE(uatv_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) ALLOCATE(vatu_wrf (nx_wrf,ny_wrf,nz_wrf), STAT = istatus) CALL rotate_UV(nx_wrf,ny_wrf,nz_wrf, & mapproj,scalef,latnot,trulon,swx,swy,mapproj_wrf, & sclfct_wrf,lattru_wrf,lontru_wrf,swx_wrf,swy_wrf, & lon_wrf(:,:,2),lon_wrf(:,:,3),u_wrf,v_wrf, & uatv_wrf,vatu_wrf, & tem1_wrf,tem2_wrf,tem3_wrf,tem4_wrf,istatus) DEALLOCATE(uatv_wrf,vatu_wrf) END IF w_wrf(:,:,:) = 0.0 !----------------------------------------------------------------------- ! ! Process Potential temperature ! !----------------------------------------------------------------------- IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & ptprt,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = ptprt(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half, work3d, pot_wrf,.TRUE.) !----------------------------------------------------------------------- ! ! Process Water vapor mixing ratio ! !----------------------------------------------------------------------- CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half,qv_tmp,qv_wrf,.TRUE.) !----------------------------------------------------------------------- ! ! Compute geopotential, air mass etc. ! ! NOTE: ! pot_wrf is potential temperature at WRF grid, total ! qv_wrf is WRF water vapor mixing ratio ! pt_wrf is the output of the purturbation potential temperature ! pot_wrf - t0 ! !----------------------------------------------------------------------- CALL compute_ph(nx_wrf,ny_wrf,nz_wrf,hterain_wrf,zlevels_wrf,ptop, & mu,pot_wrf,qv_wrf,mup_wrf,mub_wrf,ph_wrf,phb_wrf, & pt_wrf,p_wrf,pb_wrf, & tem1_wrf,tem2_wrf,tem3_wrf,tem4_wrf) !======================================================================= ! ! Input file only block ! !======================================================================= IF (ifile == 1) THEN ! compute WRF input file variables only !----------------------------------------------------------------------- ! ! Microphysics variables ! !----------------------------------------------------------------------- ! Compute QCLOUD and QRAIN, QSNOW, QICE, QGRAUP ! ! NOTE: They are not all zeros according to real.exe. ! We can initialize them here use those values from ARPS. ! IF(mp_physics >= 1 .AND. mp_physics <= 6 .OR. mp_physics == 8) THEN ! QCLOUD IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qc,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = qc(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half, work3d, qc_wrf,.TRUE.) END IF IF((mp_physics >= 1 .AND. mp_physics <= 4) .OR. mp_physics == 6 & .OR. mp_physics == 8) THEN ! QRAIN IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qr,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = qr(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half, work3d, qr_wrf, .TRUE.) END IF IF( mp_physics == 2 .OR. mp_physics == 4 .OR. mp_physics == 6 & .OR. mp_physics == 8) THEN ! QICE IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qi,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = qi(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half, work3d, qi_wrf, .TRUE.) ! QSNOW IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qs,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = qs(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half, work3d, qs_wrf,.TRUE.) END IF IF(mp_physics == 2 .OR. mp_physics == 6 .OR. mp_physics == 8) THEN ! QGRAUP IF (hinterp_needed) THEN CALL hinterp(nx,ny,nz,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qh,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & work3d,tem1,tem2,tem3) ELSE DO k = 1,nz DO j = 1,ny_wrf DO i = 1,nx_wrf work3d(i,j,k) = qh(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp(nx_wrf,ny_wrf,nz,nz_wrf-1,korder,etap(:,:,:,1), & zlevels_half, work3d, qg_wrf, .TRUE.) END IF !---------------------------------------------------------------------- ! ! Compute Soil related variables ! !----------------------------------------------------------------------- ! ! Interpolate soil variables ! ALLOCATE(tsoil_tmp (nx_wrf,ny_wrf,nzsoil), STAT = istatus) ALLOCATE(qsoil_tmp (nx_wrf,ny_wrf,nzsoil), STAT = istatus) ALLOCATE(zpsoil_tmp(nx_wrf,ny_wrf,nzsoil), STAT = istatus) ALLOCATE(tslb_wrf (nx_wrf,ny_wrf,nzsoil_wrf), STAT = istatus) ALLOCATE(smois_wrf (nx_wrf,ny_wrf,nzsoil_wrf), STAT = istatus) tslb_wrf = 0.0 smois_wrf = 0.0 DO k = 1, nzsoil DO j = 1,ny DO i = 1,nx zpsoil(i,j,k) = zp(i,j,2) - zpsoil(i,j,k) END DO END DO END DO IF (hinterp_needed) THEN CALL hinterp(nx,ny,nzsoil,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & tsoil(:,:,:,0),dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & tsoil_tmp,tem1,tem2,tem3) !WDT - FIXME - be careful about horizontal interpolation of soiL !temperature and moisture without matching soil types! !See how ext2arps handles this. GMB CALL hinterp(nx,ny,nzsoil,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & qsoil(:,:,:,0),dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & qsoil_tmp,tem1,tem2,tem3) CALL hinterp(nx,ny,nzsoil,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & zpsoil,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1),& zpsoil_tmp,tem1,tem2,tem3) ELSE DO k = 1,nzsoil DO j = 1,ny_wrf DO i = 1,nx_wrf ! tsoil_tmp(i,j,k) = tsoil(i+1,j+1,k,0) ! qsoil_tmp(i,j,k) = qsoil(i+1,j+1,k,0) !WDT 2004-01-10 GMB: for water, set WRF deep layer to be ARPS top layer !so soil depth interpolation is disabled IF ( vegtyp(i+1,j+1) == 14 .AND. k > 1) THEN tsoil_tmp(i,j,k) = tsoil(i+1,j+1,1,0) qsoil_tmp(i,j,k) = qsoil(i+1,j+1,1,0) ELSE tsoil_tmp(i,j,k) = tsoil(i+1,j+1,k,0) qsoil_tmp(i,j,k) = qsoil(i+1,j+1,k,0) ENDIF zpsoil_tmp(i,j,k) = zpsoil(i+1,j+1,k) END DO END DO END DO END IF CALL vinterp_soil(nx_wrf,ny_wrf,nzsoil,zpsoil_tmp,tsoil_tmp, & qsoil_tmp,nzsoil_wrf,zs_wrf,tslb_wrf,smois_wrf) WHERE(smois_wrf < 0.0) smois_wrf = 0.0 WHERE(smois_wrf > 1.0) smois_wrf = 1.0 ! ! Process Water equivalent of accumulated snow ! IF (hinterp_needed) THEN CALL hinterp(nx,ny,1,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & snowdpth,dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & snowh_wrf,tem1,tem2,tem3) ELSE snowh_wrf = snowdpth(2:nx-1,2:ny-1) END IF WHERE(snowh_wrf < 0.0) snowh_wrf = 0.0 ! ! Canopy water amount (meter, in ARPS, kg/m**2 in WRF) ! IF (hinterp_needed) THEN CALL hinterp(nx,ny,1,nx_wrf,ny_wrf,iorder, & iloc(:,:,1),jloc(:,:,1),xs,ys,x2d(:,:,1),y2d(:,:,1), & wetcanp(:,:,0), & dxfld(:,1),dyfld(:,1),rdxfld(:,1),rdyfld(:,1), & canwat_wrf,tem1,tem2,tem3) ELSE canwat_wrf(:,:) = wetcanp(2:nx-1,2:ny-1,0) END IF canwat_wrf(:,:) = canwat_wrf(:,:)*1000. ! ! SST, ARPS does not provide, use tsoil at surface to approximate ! sst_wrf(:,:) = 0.0 DO j = 1, ny_wrf-1 DO i = 1, nx_wrf-1 IF(vegtyp_wrf(i,j) == ISWATER) THEN sst_wrf(i,j) = tsoil_tmp(i,j,1) !WDT 2004-01-20 GMB: set all SST's ! Use average of SST of neighbors +-2 points away ! ! NOTE: Since WRF arrays do not provide overlay region for MPI-mode ! in current code. User should expect inconsistent with ! no-mpi mode. However, the difference should be small. ! ! No meaning to set SST over land, comment out by Y. Wang. on 02/10/2005. ! ! ELSE ! cnt = 0.125 ! sst_sum = 0.125*tsoil_tmp(i,j,nzsoil) ! own deep soil temp counts too ! DO jj = j-2,j+2 ! DO ii = i-2,i+2 ! IF (jj>0 .AND. jj< ny_wrf-1 .AND. ii>0 .AND. ii<nx_wrf-1 & ! .AND. vegtyp_wrf(ii,jj)==ISWATER) THEN ! dist_weight = 1./((jj-j)**2+(ii-i)**2) ! cnt = cnt + dist_weight ! sst_sum = sst_sum + dist_weight*tsoil_tmp(i,j,1) ! ENDIF ! END DO ! END DO ! IF (cnt > 0) sst_wrf(i,j) = sst_sum/cnt ENDIF END DO END DO !----------------------------------------------------------------------- ! ! Consistence check ! !----------------------------------------------------------------------- ! oops1 = 0 ! oops2 = 0 ! DO j = 1,ny_wrf ! DO i = 1,nx_wrf ! IF ( ( (xland(i,j) > 1.5) .AND. (vegtyp_wrf(i,j) /= ISWATER .OR. soiltyp_wrf(i,j) /= 14) ) & ! .OR. ( (xland(i,j) < 1.5) .AND. (vegtyp_wrf(i,j) == ISWATER .OR. soiltyp_wrf(i,j) == 14) ) & ! ) THEN ! IF ( sst(i,j) < 1. ) THEN ! oops1=oops1+1 ! vegtyp_wrf(i,j) = 5 ! soiltyp_wrf(i,j) = 8 ! xland(i,j) = 1 ! ELSE IF ( sst_wrf(i,j) > 1. ) THEN ! oops2=oops2+1 ! vegtyp_wrf(i,j) = ISWATER ! soiltyp_wrf(i,j) = 14 ! xland(i,j) = 2 ! ELSE ! print *,'the landmask and soil/veg cats do not match' ! print *,'i,j=',i,j ! print *,'xland=',xland(i,j) ! print *,'ivgtyp=',vegtyp_wrf(i,j) ! print *,'isltyp=',soiltyp_wrf(i,j) ! print *,'iswater=', ISWATER ! print *,'tslb=',tslb_wrf(i,j,:) ! print *,'sst=',sst_wrf(i,j) ! END IF ! END IF ! END DO ! END DO !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! ! OUTPUT of WRF input begin ! !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! !----------------------------------------------------------------------- ! ! Open WRF input file ! !----------------------------------------------------------------------- filename = 'wrfinput_d01' lenstr = LEN_TRIM(dirname) IF(lenstr > 0) filename = dirname(1:lenstr) // TRIM(filename) IF(myproc == 0) PRINT *, ' Output file name is ',TRIM(filename) CALL open_output_file(filename,'INPUT',io_form,nxlg_wrf,nylg_wrf, & nz_wrf, nzsoil_wrf,spec_bdy_width,mp_physics,ncid) !----------------------------------------------------------------------- ! ! Initialize and write global attributes ! !----------------------------------------------------------------------- WRITE(times_str,'(I4.4,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a)')& year,'-',month,'-',day,'_',hour,':',minute,':',second,'.0000' ! set damp_opt = 0 CALL set_global_meta(nxlg_wrf,nylg_wrf,nz_wrf,execname,times_str, & dx_wrf,dy_wrf,dt,dyn_opt,diff_opt,km_opt,0, & khdif,kvdif, & mp_physics,ra_lw_physics, ra_sw_physics, & sf_sfclay_physics,sf_surface_physics, & bl_pbl_physics,cu_physics, & ctrlat_wrf,ctrlon_wrf,trulat1_wrf,trulat2_wrf, & trulon_wrf, & year,jday,hour,minute,second,mapproj_wrf, & global_meta) CALL write_global_attribute(ncid,io_form,global_meta,.FALSE.) IF (io_form == IO_NET) THEN ! this call because we do not use WRF ! external IO package for NetCDF format CALL write_times_str(ncid,io_form,'Times', & times_str(1:19),times_str(1:19),ifile-1) END IF !----------------------------------------------------------------------- ! ! Data writing ! !----------------------------------------------------------------------- CALL write_wrf_input(ncid,io_form,times_str(1:19), & nx_wrf,ny_wrf,nz_wrf,nxlg_wrf,nylg_wrf, & nzsoil_wrf,spec_bdy_width,fzone_wrf,dx_wrf,dy_wrf, & zlevels_wrf, zlevels_half,ptop,mp_physics, & mapproj_wrf,trulat1_wrf,trulat2_wrf,trulon_wrf, & ctrlat_wrf,ctrlon_wrf,lat_wrf(:,:,1),lon_wrf(:,:,1),& lat_ll,lat_ul,lat_ur,lat_lr, & lon_ll,lon_ul,lon_ur,lon_lr, & msft_wrf,msfu_wrf,msfv_wrf,zs_wrf,dzs_wrf, & u_wrf,v_wrf,w_wrf,ph_wrf,phb_wrf,pt_wrf, & p_wrf,pb_wrf,mup_wrf,mub_wrf,mu, & qv_wrf,qc_wrf,qr_wrf,qi_wrf,qs_wrf,qg_wrf, & soiltyp_wrf,vegtyp_wrf,vegfrct_wrf,xland, & xice,tmn_wrf,shdmax,shdmin,snoalb, & snowh_wrf,canwat_wrf,albbck,sst_wrf, & hterain_wrf,tsoil_tmp(:,:,1),tslb_wrf,smois_wrf, & tem1_wrf,tem2_wrf,tem3_wrf,tem4_wrf,istatus) !----------------------------------------------------------------------- ! ! Close WRF input file ! !----------------------------------------------------------------------- CALL close_output_file(ncid,io_form) ! close input file IF(ALLOCATED(tsoil_tmp)) DEALLOCATE(tsoil_tmp,qsoil_tmp,zpsoil_tmp) IF(ALLOCATED(vegtyp_wrf))DEALLOCATE(soiltyp_wrf,vegtyp_wrf,vegfrct_wrf) IF(ALLOCATED(xland)) DEALLOCATE(xland,xice) END IF ! ifile == 1 !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ! ! WRF boundary dumping begin, block for all files ! !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% IF(create_bdy == 1) THEN IF (spec_bdy_width > MIN(nx_wrf,ny_wrf)) THEN WRITE(6,'(a,/,a,I3,a,2(I4,a))') 'WARNING: ' // & 'Lateral boundary zone is larger than the local domain.', & ' Spec_bdy_width = ',spec_bdy_width, & ' Local domain size = ',nx_wrf,'X',ny_wrf,'.' WRITE(6,'(a,/)') 'WRF boundary file cannot be generated.' CALL arpsstop('Boundary zone too large.',1) END IF IF (ifile == 1) THEN CALL couple(nx_wrf,ny_wrf,nz_wrf,'U',mup_wrf,mub_wrf,u_wrf, & msfu_wrf,ubdy3dtemp1,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'V',mup_wrf,mub_wrf,v_wrf, & msfv_wrf,vbdy3dtemp1,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'T',mup_wrf,mub_wrf,pt_wrf, & msft_wrf,tbdy3dtemp1,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'H',mup_wrf,mub_wrf,ph_wrf, & msft_wrf,pbdy3dtemp1,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'T',mup_wrf,mub_wrf,qv_wrf, & msft_wrf,qbdy3dtemp1,work2d) mbdy2dtemp1 = mup_wrf ELSE WRITE(nextbdytimes,'(I4.4,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a)')& year,'-',month,'-',day,'_',hour,':',minute,':',second,'.0000' abstime = abstime-tintv_bdyin CALL abss2ctim( abstime, year, month, day, hour, minute, second ) CALL julday( year, month, day, jday) WRITE(times_str,'(I4.4,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a1,I2.2,a)')& year,'-',month,'-',day,'_',hour,':',minute,':',second,'.0000' WRITE(6,'(a,I4.4,5(a,I2.2))') '=== Begin boundary dumps at: ', & year,'/',month,'/',day,'-',hour,':',minute,':',second IF (ifile == 2) THEN IF( ABS(abstime - abstime1) > eps) THEN WRITE(6,'(2a)') 'ERROR: the first boundary file must be ', & 'data valid at: the initial time + tintv_bdyin.' WRITE(6,'(a,I4.4,5(a,I2.2),a,I6)') 'Expected data time: ', & year1,'/',month1,'/',day1,'-',hour1,':',minute1,':', & second1,' + ',tintv_bdyin WRITE(6,'(a,I4.4,5(a,I2.2))') 'Found data valid time: ', & year,'/',month,'/',day,'-',hour,':',minute,':',second CALL arpsstop('Inconsistent time.',1) END IF filename = 'wrfbdy_d01' 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,'BDY',io_form, & nxlg_wrf,nylg_wrf,nz_wrf,nzsoil_wrf,spec_bdy_width,& mp_physics,ncid) ! ! Initialize and write global attributes ! CALL set_global_meta(nxlg_wrf,nylg_wrf,nz_wrf,execname, & times_str, & dx_wrf,dy_wrf,dt,dyn_opt,diff_opt,km_opt,0, & khdif,kvdif, & mp_physics,ra_lw_physics, ra_sw_physics, & sf_sfclay_physics,sf_surface_physics, & bl_pbl_physics,cu_physics, & ctrlat_wrf,ctrlon_wrf,trulat1_wrf,trulat2_wrf, & trulon_wrf, & year,jday,hour,minute,second,mapproj_wrf, & global_meta) ! set damp_opt = 0 CALL write_global_attribute(ncid,io_form,global_meta,.TRUE.) END IF ! ifile == 2 IF (io_form == IO_NET) THEN ! this call because we do not use WRF ! external IO package for NetCDF format CALL write_times_str(ncid,io_form,'Times', & times_str(1:19),times_str(1:19),ifile-1) END IF CALL write_times_str(ncid,io_form,'THISBDYTIME', & times_str(1:19),times_str(1:19),ifile-1) CALL write_times_str(ncid,io_form,'NEXTBDYTIME', & times_str(1:19),nextbdytimes(1:19),ifile-1) !----------------------------------------------------------------------- ! ! Boundary data writing ! !----------------------------------------------------------------------- CALL couple(nx_wrf,ny_wrf,nz_wrf,'U',mup_wrf,mub_wrf,u_wrf, & msfu_wrf,ubdy3dtemp2,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'V',mup_wrf,mub_wrf,v_wrf, & msfv_wrf,vbdy3dtemp2,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'T',mup_wrf,mub_wrf,pt_wrf, & msft_wrf,tbdy3dtemp2,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'H',mup_wrf,mub_wrf,ph_wrf, & msft_wrf,pbdy3dtemp2,work2d) CALL couple(nx_wrf,ny_wrf,nz_wrf,'T',mup_wrf,mub_wrf,qv_wrf, & msft_wrf,qbdy3dtemp2,work2d) mbdy2dtemp2 = mup_wrf CALL write_wrf_bdy(ncid,io_form,times_str(1:19),ifile-1, & nx_wrf,ny_wrf,nz_wrf,spec_bdy_width, & nxlg_wrf,nylg_wrf,fzone_wrf,tintv_bdyin, & ubdy3dtemp1,ubdy3dtemp2, & vbdy3dtemp1,vbdy3dtemp2, & tbdy3dtemp1,tbdy3dtemp2, & pbdy3dtemp1,pbdy3dtemp2, & qbdy3dtemp1,qbdy3dtemp2, & mbdy2dtemp1,mbdy2dtemp2, & bdys,bdyn,bdyw,bdye, & blgw,blge,blgs,blgn, & tem1_wrf,tem2_wrf,istatus) ubdy3dtemp1 = ubdy3dtemp2 vbdy3dtemp1 = vbdy3dtemp2 tbdy3dtemp1 = tbdy3dtemp2 pbdy3dtemp1 = pbdy3dtemp2 qbdy3dtemp1 = qbdy3dtemp2 mbdy2dtemp1 = mbdy2dtemp2 ! close boundary file IF(ifile == nhisfile) CALL close_output_file(ncid,io_form) END IF ! ifile > 1 END IF ! create_wrf_bdy END DO ! ifile CALL io_shutdown(io_form) !----------------------------------------------------------------- ! ! Write out a namelist file for WRF to run if needed. ! !----------------------------------------------------------------- IF (create_namelist == 1 .AND. myproc == 0) THEN CALL write_wrf_namelist(nchout,TRIM(dirname)//TRIM(wrfnamelist),io_form, & nx_wrf,ny_wrf,nz_wrf,nzsoil_wrf,nxlg_wrf,nylg_wrf, & dx_wrf,dy_wrf,dt,spec_bdy_width, & year, month, day, hour, minute, second, tintv_bdyin, & year1,month1,day1,hour1,minute1,second1, & mp_physics,ra_lw_physics,ra_sw_physics,sf_sfclay_physics, & sf_surface_physics,bl_pbl_physics,cu_physics, & diff_opt,km_opt,khdif,kvdif,nprocx_wrf,nprocy_wrf, & istatus) END IF !----------------------------------------------------------------------- ! ! Generate a ready file is needed ! !----------------------------------------------------------------------- IF ( readyfl == 1 .AND. myproc == 0) THEN CALL getunit( nchout ) IF(create_bdy == 1) THEN WRITE(filename,'(a)') "wrfinput_bdy_d01.ncdf" //"_ready" ELSE WRITE (filename,'(a)') "wrfinput_d01.ncdf" // "_ready" END IF WRITE(filename,'(a)') TRIM(dirname) // TRIM(filename) OPEN (UNIT=nchout,FILE=trim(filename)) WRITE (nchout,'(a)') "wrfinput_d01" IF(create_bdy == 1) WRITE(nchout,'(a)') "wrfbdy_d01" IF(create_namelist == 1) WRITE(nchout,'(a)') "namelist.input" CLOSE (nchout) CALL retunit (nchout ) END IF CALL arpsstop(' ==== ARPS2WRF terminated normally. ====',0) END PROGRAM arps2wrf