! !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSINTRP ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! PROGRAM arpsintrp,335 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! This program interpolates gridded data from one ARPS grid to another. ! It can be used to prepare data for running ARPS in a one-way nested ! mode. It's exepcted to replace ARPSR2H in this capacity. ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! ! 3/27/1997. Written based on ARPSR2H and ARPSCVT. ! ! MODIFICATION HISTORY: ! ! 7/31/1997 (M. Xue) ! Added options for specifying the terrain for the new grid, in ! addition to interpolated terrain. ! ! 4/24/1998 (D. Weber) ! Added hydrostatic extrapolation calculations for pprt and pbar ! when the fine grid terrain is lower in elevation than the ! coarse grid terrain. (DO LOOP 1423) Note: this update is ! functional for bglopt=2 ONLY. ! ! 4/24/1998 (D. Weber) ! Added option for quadratic interpolation in the vertical. ! intrpvopt = 1 for linear ! intrpvopt = 2 for quadratic ! ! 4/1/1999 (M. Xue) ! ! Rewrote major portions of the program. Special treatment given ! to grid points below input grid ground. When output grid ! terrain falls below ground, base-state variables are reconstructed ! from averages on horizontal planes to ensure x or y independency ! below ground. This is done only for bglopt=4, however. ! The new code also runs much faster. ! ! 2000/04/05 (Gene Bassett) ! Added bglopt=5, which is similar to bglopt=4 but uses the ! method in ext2arps for constructing the base sounding. ! ! 2000/04/17 (Ming Xue) ! Added an option that allows one to specify input history data ! at a constant time interval. ! ! 2000/05/20 (Gene Bassett) ! Converted to F90, creating allocation and main subroutines. ! ! 2000/07/28 (Ming Xue) ! Converted to F90 free format. Use ALLOCATABLE instead of ! POINTER allocation to avoid double memory usage. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2000/10/31 (Gene Bassett) ! Refined handling of interpolating soil variables. ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ! 2001/06/28 (Gene Bassett) ! Added ntagopt, option to set surface winds in new grid to the surface ! winds in the original grid for areas where new terrain is above the ! original terrain. ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! REAL, allocatable :: u (:,:,:) ! Total u-velocity (m/s). REAL, allocatable :: v (:,:,:) ! Total v-velocity (m/s). REAL, allocatable :: w (:,:,:) ! Total w-velocity (m/s). REAL, allocatable :: ptprt (:,:,:) ! Perturbation potential temperature ! from that of base state atmosphere (Kelvin). REAL, allocatable :: pprt (:,:,:) ! Perturbation pressure from that ! of base state atmosphere (Pascal). REAL, allocatable :: qv (:,:,:) ! Water vapor specific humidity (kg/kg). REAL, allocatable :: qc (:,:,:) ! Cloud water mixing ratio (kg/kg). REAL, allocatable :: qr (:,:,:) ! Rain water mixing ratio (kg/kg). REAL, allocatable :: qi (:,:,:) ! Cloud ice mixing ratio (kg/kg). REAL, allocatable :: qs (:,:,:) ! Snow mixing ratio (kg/kg). REAL, allocatable :: qh (:,:,:) ! Hail mixing ratio (kg/kg). REAL, allocatable :: tke (:,:,:) ! Turbulent Kinetic Energy ((m/s)**2) REAL, allocatable :: kmh (:,:,:) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL, allocatable :: kmv (:,:,:) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) INTEGER, allocatable :: soiltyp(:,:,:) ! Soil type REAL, allocatable :: stypfrct(:,:,:) ! Fraction of soil type INTEGER, allocatable :: vegtyp(:,:) ! Vegetation type REAL, allocatable :: lai (:,:) ! Leaf Area Index REAL, allocatable :: roufns (:,:) ! Surface roughness REAL, allocatable :: veg (:,:) ! Vegetation fraction REAL, allocatable :: ndvi (:,:) ! NDVI REAL, allocatable :: tsfc (:,:,:) ! Ground sfc. temperature (K) REAL, allocatable :: tsoil (:,:,:) ! Deep soil temperature (K) REAL, allocatable :: wetsfc (:,:,:) ! Surface soil moisture REAL, allocatable :: wetdp (:,:,:) ! Deep soil moisture REAL, allocatable :: wetcanp (:,:,:) ! Canopy water amount REAL, allocatable :: snowdpth(:,:) ! Snow depth (m) REAL, allocatable :: raing(:,:) ! Grid supersaturation rain REAL, allocatable :: rainc(:,:) ! Cumulus convective rain REAL, allocatable :: 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, allocatable :: radfrc(:,:,:) ! Radiation forcing (K/s) REAL, allocatable :: radsw (:,:) ! Solar radiation reaching the surface REAL, allocatable :: rnflx (:,:) ! Net radiation flux absorbed by surface REAL, allocatable :: usflx (:,:) ! Surface flux of u-momentum (kg/(m*s**2)) REAL, allocatable :: vsflx (:,:) ! Surface flux of v-momentum (kg/(m*s**2)) REAL, allocatable :: ptsflx(:,:) ! Surface heat flux (K*kg/(m*s**2)) REAL, allocatable :: qvsflx(:,:) ! Surface moisture flux (kg/(m**2*s)) REAL, allocatable :: ubar (:,:,:) ! Base state u-velocity (m/s). REAL, allocatable :: vbar (:,:,:) ! Base state v-velocity (m/s). REAL, allocatable :: wbar (:,:,:) ! Base state w-velocity (m/s). REAL, allocatable :: ptbar (:,:,:) ! Base state potential temperature (K) REAL, allocatable :: pbar (:,:,:) ! Base state pressure (Pascal). REAL, allocatable :: rhobar(:,:,:) ! Base state air density (kg/m**3) REAL, allocatable :: qvbar (:,:,:) ! Base state water vapor specific humidity ! (kg/kg). REAL, allocatable :: x (:) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL, allocatable :: y (:) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL, allocatable :: z (:) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. REAL, allocatable :: zp (:,:,:) ! The physical height coordinate defined at ! w-point on the staggered grid. REAL, allocatable :: hterain(:,:) ! The height of terrain. REAL, allocatable :: uprt (:,:,:) ! Perturbation u-velocity (m/s) REAL, allocatable :: vprt (:,:,:) ! Perturbation v-velocity (m/s) REAL, allocatable :: qvprt (:,:,:) ! Perturbation water vapor specific ! humidity (kg/kg) REAL, allocatable :: tem1 (:,:,:) ! Temporary array REAL, allocatable :: tem2 (:,:,:) ! Temporary array REAL, allocatable :: tem3 (:,:,:) ! Temporary array !wdt update REAL, allocatable :: tem4 (:,:,:) ! Temporary array ! !----------------------------------------------------------------------- ! ! Arrays on the new grid: ! !----------------------------------------------------------------------- ! REAL, allocatable :: u1 (:,:,:) ! Total u-velocity (m/s). REAL, allocatable :: v1 (:,:,:) ! Total v-velocity (m/s). REAL, allocatable :: w1 (:,:,:) ! Total w-velocity (m/s). REAL, allocatable :: ptprt1(:,:,:) ! Perturbation potential temperature ! from that of base state atmosphere (Kelvin). REAL, allocatable :: pprt1 (:,:,:) ! Perturbation pressure from that ! of base state atmosphere (Pascal). REAL, allocatable :: qv1 (:,:,:) ! Water vapor specific humidity (kg/kg). REAL, allocatable :: qc1 (:,:,:) ! Cloud water mixing ratio (kg/kg). REAL, allocatable :: qr1 (:,:,:) ! Rain water mixing ratio (kg/kg). REAL, allocatable :: qi1 (:,:,:) ! Cloud ice mixing ratio (kg/kg). REAL, allocatable :: qs1 (:,:,:) ! Snow mixing ratio (kg/kg). REAL, allocatable :: qh1 (:,:,:) ! Hail mixing ratio (kg/kg). REAL, allocatable :: tke1 (:,:,:) ! Turbulent Kinetic Energy ((m/s)**2) REAL, allocatable :: kmh1 (:,:,:) ! Horizontal turb. mixing coef. for ! momentum. ( m**2/s ) REAL, allocatable :: kmv1 (:,:,:) ! Vertical turb. mixing coef. for ! momentum. ( m**2/s ) INTEGER, allocatable :: soiltyp1(:,:,:) ! Soil type REAL, allocatable :: stypfrct1(:,:,:) ! Frction of soil type INTEGER, allocatable :: vegtyp1 (:,:) ! Vegetation type REAL, allocatable :: lai1 (:,:) ! Leaf Area Index REAL, allocatable :: roufns1 (:,:) ! Surface roughness REAL, allocatable :: veg1 (:,:) ! Vegetation fraction REAL, allocatable :: tsfc1 (:,:,:) ! Ground sfc. temperature (K) REAL, allocatable :: tsoil1 (:,:,:) ! Deep soil temperature (K) REAL, allocatable :: wetsfc1 (:,:,:) ! Surface soil moisture REAL, allocatable :: wetdp1 (:,:,:) ! Deep soil moisture REAL, allocatable :: wetcanp1(:,:,:) ! Canopy water amount REAL, allocatable :: snowdpth1(:,:) ! Snow depth (m) REAL, allocatable :: raing1(:,:) ! Grid supersaturation rain REAL, allocatable :: rainc1(:,:) ! Cumulus convective rain REAL, allocatable :: prcrate1(:,:,:) ! 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, allocatable :: radfrc1(:,:,:) ! Radiation forcing (K/s) REAL, allocatable :: radsw1 (:,:) ! Solar radiation reaching the surface REAL, allocatable :: rnflx1 (:,:) ! Net radiation flux absorbed by surface REAL, allocatable :: usflx1 (:,:) ! Surface flux of u-momentum (kg/(m*s**2)) REAL, allocatable :: vsflx1 (:,:) ! Surface flux of v-momentum (kg/(m*s**2)) REAL, allocatable :: ptsflx1(:,:) ! Surface heat flux (K*kg/(m*s**2)) REAL, allocatable :: qvsflx1(:,:) ! Surface moisture flux (kg/(m**2*s)) REAL, allocatable :: ubar1 (:,:,:) ! Base state u-velocity (m/s). REAL, allocatable :: vbar1 (:,:,:) ! Base state v-velocity (m/s). REAL, allocatable :: ptbar1(:,:,:) ! Base state potential temperature (K) REAL, allocatable :: pbar1 (:,:,:) ! Base state pressure (Pascal). REAL, allocatable :: rhobar1(:,:,:) ! Base state air density (kg/m**3) REAL, allocatable :: qvbar1(:,:,:) ! Base state water vapor specific humidity ! (kg/kg). REAL, allocatable :: x1 (:) ! The x-coord. of the physical and ! computational grid. Defined at u-point. REAL, allocatable :: y1 (:) ! The y-coord. of the physical and ! computational grid. Defined at v-point. REAL, allocatable :: z1 (:) ! The z-coord. of the computational grid. ! Defined at w-point on the staggered grid. !wdt update REAL, allocatable :: x1_out(:) REAL, allocatable :: y1_out(:) REAL, allocatable :: zp1 (:,:,:) ! The physical height coordinate defined at ! w-point on the staggered grid. REAL, allocatable :: hterain1(:,:) ! Terrain height (m) !wdt update REAL, allocatable :: htrn1orig(:,:) ! Terrain height (m) REAL, allocatable :: j11 (:,:,:) ! Coordinate transformation Jacobian -d(zp)/dx. REAL, allocatable :: j21 (:,:,:) ! Coordinate transformation Jacobian -d(zp)/dy. REAL, allocatable :: j31 (:,:,:) ! Coordinate transformation Jacobian d(zp)/dz. REAL, allocatable :: tem11 (:,:,:) ! Work array REAL, allocatable :: tem21 (:,:,:) ! Work array REAL, allocatable :: wgtsx(:,:) ! Weight for interpolation in x-dir for scalar points REAL, allocatable :: wgtsy(:,:) ! Weight for interpolation in y-dir for scalar points REAL, allocatable :: wgtux(:,:) ! Weight for interpolation in x-dir for u points REAL, allocatable :: wgtvy(:,:) ! Weight for interpolation in y-dir for v points REAL, allocatable :: wgtz(:,:,:,:) ! Weight for interpolation in z-dir for v points INTEGER, allocatable :: isx(:),jsy(:),iux(:),jvy(:),kz(:,:,:) REAL, allocatable :: zp1d1 (:) ! Temporary array REAL, allocatable :: dzp1d1(:) ! Temporary array ! !----------------------------------------------------------------------- ! ! More arrays. ! !----------------------------------------------------------------------- ! REAL, allocatable :: xs (:), ys (:) ! x,y coord for scalar points REAL, allocatable :: xs1(:), ys1(:) ! x,y coord for scalar points REAL, allocatable :: xs_2d(:,:), ys_2d(:,:) ! used by subroutine extmnsnd REAL, allocatable :: temx1yz (:,:,:) REAL, allocatable :: temx1y1z (:,:,:) REAL, allocatable :: temx1y1zb(:,:,:) REAL, allocatable :: temz1d1(:),temz1d2(:),temz1d3(:),temz1d4(:), & temz1d5(:),temz1d6(:),temz1d7(:) REAL, allocatable :: zsnd(:),ptsnd(:),qvsnd(:),psnd(:), & ubsnd(:),vbsnd(:) REAL, allocatable :: ptpsfc(:,:),ppsfc (:,:),qvsfc(:,:),qcsfc(:,:) REAL, allocatable :: qrsfc (:,:),qisfc (:,:),qssfc(:,:),qhsfc(:,:) REAL, allocatable :: tkesfc(:,:),kmhsfc(:,:),kmvsfc(:,:) REAL, allocatable :: ptbsfc(:,:),pbsfc(:,:),qvbsfc(:,:) REAL, allocatable :: htrnx1y1(:,:),radsfc(:,:) INTEGER, allocatable :: ktrnx1y1(:,:) !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. 2000/11/01 GMB soil consistency: INTEGER, allocatable :: ix(:,:),jy(:,:) REAL, allocatable :: xw(:,:),yw(:,:) ! !----------------------------------------------------------------------- ! nx, ny, nz: Dimensions of input grid. ! nx1, ny1, nz1: Dimensions of output grid. !----------------------------------------------------------------------- ! INTEGER :: nx ! Number of input grid points in the x-direction INTEGER :: ny ! Number of input grid points in the y-direction INTEGER :: nz ! Number of input grid points in the z-direction INTEGER :: nx1 ! Number of output grid points in the x-direction INTEGER :: ny1 ! Number of output grid points in the y-direction INTEGER :: nz1 ! Number of output grid points in the z-direction INTEGER :: nxyz,nxy,nxyz1,nxy1 ! !----------------------------------------------------------------------- ! ! Soil types. ! !----------------------------------------------------------------------- ! INTEGER :: nstypin ! Number of soil types in input data INTEGER :: nstyp1 ! Number of soil types for ouput data ! !----------------------------------------------------------------------- ! ! Misc ! !----------------------------------------------------------------------- ! INTEGER :: lvlprof ! Number of levels in 1-d average sounding ! !----------------------------------------------------------------------- ! INTEGER :: hinfmt,nhisfile_max,nhisfile,lengbf,nf,lenfil PARAMETER (nhisfile_max=200) CHARACTER (LEN=132) :: grdbasfn,hisfile(nhisfile_max) INTEGER :: ireturn NAMELIST /output_dims/ nx1,ny1,nz1 INTEGER :: max_plevels PARAMETER (max_plevels=1000) REAL :: plevels(max_plevels) ! Array contain the values of pressure levels to ! which fields will be interpolated. ! !----------------------------------------------------------------------- ! ! Parameters for the output grid. ! ! Note: ! ! Given nx1, ny1 and nz1, the physical domain size of the refined ! grid will be xl1=(nx1-3)*dx1 by yl1=(ny1-3)*dy1 by zh1=(nz1-3)*dz1. ! Dx1, dy1 and dz1 are the grid intervals of the refined grid. ! !----------------------------------------------------------------------- ! REAL :: xorig1, yorig1, zorig1 REAL :: xctr1 , yctr1 REAL :: ctrlat1, ctrlon1 REAL :: origlat, origlon REAL :: dx1,dy1 ! Grid intervals of the refined grid. INTEGER :: strhopt1 ! Vertical grid stretching option. ! = 0, no stretching in vertical. ! >= 1, with stretching in vertical. REAL :: dz1 ! Average grid spacing in vertical direction in ! transformed computational space (m). REAL :: dzmin1 ! Minimun grid spacing in vertical direction in ! physcal space (m). REAL :: zrefsfc1 ! The reference height of the surface ! (ground level) (m) REAL :: dlayer11 ! The depth of the lower layer with uniform ! (dz=dzmin) vertical spacing (m) REAL :: dlayer21 ! The depth of the mid layer with stetched ! vertical spacing (m) REAL :: strhtune1 ! Tuning parameter for stretching option 2 ! A Value between 0.2 and 5.0 is appropriate. ! A larger value gives a more linear stretching. REAL :: zflat1 ! The height at which the grid levels ! becomes flat in the terrain-following ! coordinate transformation (m). ! !----------------------------------------------------------------------- ! ! Terrain option parameters for the new grid: ! !----------------------------------------------------------------------- ! INTEGER :: ternopt1 ! Model terrain option. ! = 0, no terrain, the ground is flat; ! = 1, bell-shaped mountain; ! = 2, terrain data read from terrain data ! base (not implemented yet) !wdt-williams 2002-01-17 GMB ntmerge INTEGER :: ntmerge ! Number of zones over which to merge original ! and new terrain at the bondaries ! (used when ternopt1=4). INTEGER :: ternfmt1 ! Terrain data file format. INTEGER :: mntopt1 ! Option for choosing idealized mountain ! type. REAL :: hmount1 ! The mountain height (m) REAL :: mntwidx1 ! The half-width of bell-shaped mountain ! in x-dir. REAL :: mntwidy1 ! The half-width of bell-shaped mountain ! in y-dir. REAL :: mntctrx1 ! The x coordinate of the bell-shaped ! mountain center. REAL :: mntctry1 ! The y coordinate of the bell-shaped ! mountain center. CHARACTER (LEN=132) :: terndta1 ! Name of the terrain data file REAL :: zflat11,za,zb ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: nunit INTEGER :: i, j, k REAL :: amin, amax REAL :: tmp1,tmp2 REAL :: radnd,pi2,z0 INTEGER :: k0,kk CHARACTER (LEN=132) :: basdmpfn INTEGER :: lbasdmpf CHARACTER (LEN=132) :: ternfn,sfcoutfl,soiloutfl,temchar INTEGER :: lternfn,lfn INTEGER :: iss !wdt-williams 2002-01-17 GMB ntmerge DOUBLE PRECISION :: ntmergeinv, mfac INTEGER :: idist ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'phycst.inc' INCLUDE 'globcst.inc' INCLUDE 'grid.inc' INCLUDE 'bndry.inc' INCLUDE 'indtflg.inc' INCLUDE 'alloc.inc' !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. INCLUDE 'exbc.inc' INTEGER :: houtfmt, nchin, nchout CHARACTER (LEN=132) :: filename INTEGER :: grdbas REAL :: time !wdt update INTEGER :: vroutcnt DATA vroutcnt /0/ INTEGER :: nfile, length, lenstr CHARACTER (LEN=132) :: timsnd CHARACTER (LEN=80) :: new_runname INTEGER :: tmstrln REAL :: xeps, yeps REAL :: ctrx,ctry,swx,swy,alatpro(2),sclf,dxscl,dyscl !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght INTEGER :: bglopt,ntagopt REAL :: misvalue,aghght REAL :: snddelz,delz,dtdz,tbark1,tbark,ttotk1,ttotk,lnpbar,lnptot INTEGER :: i1mn,i1mx,j1mn,j1mx INTEGER :: npoint_below_ground ! flag indicating if any point in the ! output grid terrain is below input grid terrain INTEGER :: redo_base_state REAL :: zpmin,zpmax,zpmin1,pbartop, tem,tema,a,b,c,d ! !----------------------------------------------------------------------- ! ! namelist Declarations: ! !----------------------------------------------------------------------- ! NAMELIST /jobname/ runname INTEGER :: z_or_p ! Control parameter denoting if the output grid is ! in height or pressure coordinates. INTEGER :: xy_or_ll ! Control parameter denoting if (xctr1,yctr1) or ! (ctrlat1,ctrlon1) are to be used to specify the new ! grid center. INTEGER :: intrphopt ! Option for horizontal interpolation ! = 1 linear, =2 quadratic INTEGER :: intrpvopt ! Option for vertical interpolation ! = 1 linear, =2 quadratic INTEGER :: snap_to_grid, same_res INTEGER :: istatus, ib,jb !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids INTEGER, PARAMETER :: MAX_GRD=200 INTEGER :: noutgrds REAL :: xctr_grd(MAX_GRD), yctr_grd(MAX_GRD) REAL :: clat_grd(MAX_GRD), clon_grd(MAX_GRD) CHARACTER (LEN=80 ) :: name_grd(MAX_GRD) INTEGER :: ng !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids REAL :: ctrlat_sv, ctrlon_sv, latitud_sv, dx_sv, dy_sv, dz_sv REAL :: dzmin_sv, zrefsfc_sv, dlayer1_sv, dlayer2_sv, zflat_sv, strhtune_sv INTEGER :: strhopt_sv, nstyp_sv !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids NAMELIST /newgrid/ z_or_p,xy_or_ll,strhopt1,xctr1,yctr1, & ctrlat1,ctrlon1,snap_to_grid,same_res,dx1,dy1,dz1,dzmin1, & zrefsfc1,dlayer11,dlayer21,strhtune1,zflat1,plevels,nstyp1, & noutgrds,xctr_grd,yctr_grd,clat_grd,clon_grd,name_grd !wdt-williams 2002-01-17 GMB ntmerge NAMELIST /newterrain/ ternopt1,mntopt1,hmount1,mntwidx1,mntwidy1, & mntctrx1,mntctry1,terndta1,ternfmt1,ntmerge !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght NAMELIST /bgloption/ bglopt,misvalue,intrphopt,intrpvopt,ntagopt,aghght NAMELIST /sfc_data/ sfcdat,styp,vtyp,lai0,roufns0,veg0, & sfcdtfl,sfcfmt !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. NAMELIST /output/ dirname,exbcdmp,hdmpfmt,grbpkbit,hdfcompr, & grdout,basout,varout,mstout,rainout,prcout,iceout, & tkeout, trbout,sfcout,landout,radout,flxout, & qcexout,qrexout,qiexout,qsexout,qhexout, & totout,filcmprs,readyfl,sfcdmp,soildmp,terndmp,ngbrz,zbrdmp !wdt update ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! REAL :: cpu0, cpu_time, f_cputime REAL :: xctr1_old,yctr1_old,xsw,ysw,xsw1,ysw1,xsw1_old,ysw1_old REAL :: ctrlat1_old, ctrlon1_old !wdt update REAL :: rhmax = 1.0 REAL :: qvsat !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght REAL :: hght0, dhght, fac !wdt update ! !----------------------------------------------------------------------- ! ! Function f_qvsat and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsat !fpp$ expand (f_qvsat) !dir$ inline always f_qvsat !*$* inline routine (f_qvsat) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! cpu0 = f_cputime() WRITE(6,'(/9(/2x,a)/)') & '###############################################################', & '###############################################################', & '### ###', & '### Welcome to ARPSINTRP ###', & '### This program converts the history dump data ###', & '### sets generated by ARPS, between various formats. ###', & '### ###', & '###############################################################', & '###############################################################' ! !----------------------------------------------------------------------- ! ! Read in the input parameters. ! !----------------------------------------------------------------------- ! CALL get_input_file_names(hinfmt,grdbasfn,hisfile,nhisfile) lengbf = len_trim(grdbasfn) CALL get_dims_from_data(hinfmt,grdbasfn(1:lengbf), & nx,ny,nz,nstypin, ireturn) nstypin = max(1,nstypin) IF( ireturn /= 0 ) THEN PRINT*,'Problem occured when trying to get dimensions from data.' PRINT*,'Program stopped.' STOP END IF WRITE(6,'(3(a,i5))') 'nx =',nx,', ny=',ny,', nz=',nz READ(5,output_dims, END=105) WRITE(6,'(/a,a/)') & 'NAMELIST block intrp_dims sucessfully read.' WRITE(6,'(3(a,i5))') 'nx1=',nx1,', ny1=',ny1,', nz1=',nz1 GO TO 10 105 WRITE(6,'(/a,a/)') & 'Error reading NAMELIST block intrp_dims. ', & 'Program ARPSINTRP stopped.' STOP 1 10 CONTINUE WRITE (6,'(/a,g13.3/)') "Current memory allocation (in words):", & current_memory_use ! IF (max_plevels < nz1) THEN WRITE (6,*) "ARPSINTRP: ERROR, nz1 < max_plevels. Stopping." WRITE (6,*) "nz1 =",nz1," max_plevels = ",max_plevels STOP 1 END IF mgrid = 1 nestgrd = 0 ! !----------------------------------------------------------------------- ! ! Set the default parameters ! !----------------------------------------------------------------------- ! runname = 'intrp' z_or_p = 1 xy_or_ll = 1 xctr1 = 512000.0 yctr1 = 512000.0 ctrlat1 = 34.0 ctrlon1 = -98.0 dx1 = 4000.0 dy1 = 4000.0 dz1 = 350.0 strhopt1 = 2 dzmin1 = 20.0 zrefsfc1 = 0.0 dlayer11 = 0.0 dlayer21 = 1.0E5 strhtune1 = 1.0 zflat1 = 1.0E5 nstyp1 = -1 !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids noutgrds = 0 xctr_grd = 0 yctr_grd = 0 clat_grd = ctrlat1 clon_grd = ctrlon1 name_grd = 'NULL' ternopt1 = 3 !wdt-williams 2002-01-17 GMB ntmerge ntmerge = 1 mntopt1 = 1 hmount1 = 0.000 mntwidx1 = 10000.000 mntwidy1 = 10000.000 mntctrx1 = 10000.000 mntctry1 = 10000.000 terndta1 = 'arpstern.dat' ternfmt1 = 0 bglopt = 1 misvalue = -9999.0 intrphopt = 1 intrpvopt = 1 !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght ntagopt = 0 aghght = 500.0 sfcdat = 1 styp = 3 vtyp = 10 lai0 = 0.31 roufns0 = 0.1 veg0 = 0.0 sfcdtfl = 'arpssfc.data' sfcfmt = 0 dirname = './' exbcdmp = 1 hdmpfmt = 1 grbpkbit = 16 hdfcompr = 0 filcmprs = 0 readyfl = 1 basout = 0 grdout = 0 varout = 1 mstout = 1 iceout = 1 tkeout = 1 trbout = 0 rainout = 0 sfcout = 0 snowout = 0 landout = 0 qcexout = 0 qrexout = 0 qiexout = 0 qsexout = 0 qhexout = 0 !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. ngbrz = 5 zbrdmp = 10000.0 sfcdmp = 1 soildmp = 1 terndmp = 1 same_res = 0 snap_to_grid = 0 READ (5,jobname,END=100) WRITE(6,'(/a/)') 'Sucessfully read namelist block JOBNAME.' WRITE(6,'(/2x,a,a)') 'The name of this run is: ', runname new_runname = runname ! !----------------------------------------------------------------------- ! ! Set the output grid and the variable control parameters ! !----------------------------------------------------------------------- ! READ (5,newgrid) WRITE(6,'(/a/)') 'Sucessfully read namelist block NEWGRID.' PRINT* PRINT*,' Input parameters for the new refined grid:' PRINT* PRINT*,' z_or_p= ', z_or_p PRINT*,' xy_or_ll= ', xy_or_ll PRINT*,' Input dx1:' PRINT*,' dx1 = ',dx1 PRINT*,' dy1 = ',dy1 PRINT*,' strhopt1= ',strhopt1 PRINT*,' dz1 = ',dz1 PRINT*,' dzmin1 = ',dzmin1 PRINT*,' xctr1 = ',xctr1 PRINT*,' yctr1 = ',yctr1 PRINT*,' ctrlat1 = ',ctrlat1 PRINT*,' ctrlon1 = ',ctrlon1 PRINT*,'plevels =', (plevels(k),k=1,nz1) PRINT*,' nstyp1 = ',nstyp1 !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids PRINT*,'noutgrds = ',noutgrds IF (noutgrds > MAX_GRD) THEN WRITE (*,*) "ERROR, noutgrds greater than MAX_GRD. ", & "Set noutgrds to less than or equal to ",MAX_GRD," ABORTING!" STOP ENDIF IF (noutgrds > 0) THEN DO ng = 1,noutgrds PRINT*,'xctr_grd(',ng,') = ',xctr_grd(ng) PRINT*,'yctr_grd(',ng,') = ',yctr_grd(ng) PRINT*,'clat_grd(',ng,') = ',clat_grd(ng) PRINT*,'clon_grd(',ng,') = ',clon_grd(ng) PRINT*,'name_grd(',ng,') = ',name_grd(ng) END DO ENDIF ! !----------------------------------------------------------------------- ! ! Specify the terrain initialization option parameters: ! !----------------------------------------------------------------------- ! READ (5,newterrain,END=100) WRITE(6,'(/a)') 'Sucessfully read namelist block NEWTERRAIN.' WRITE(6,'(1x,a,i4)') 'ternopt1 =', ternopt1 !wdt-williams 2002-01-17 GMB ntmerge WRITE(6,'(1x,a,i4)') 'ntmerge =', ntmerge WRITE(6,'(1x,a,i4)') 'mntopt1 =', mntopt1 WRITE(6,'(1x,a,f10.3)') 'hmount1 =',hmount1 WRITE(6,'(1x,a,f10.3)') 'mntwidx1=',mntwidx WRITE(6,'(1x,a,f10.3)') 'mntwidy1=',mntwidy WRITE(6,'(1x,a,f10.3)') 'mntctrx1=',mntctrx WRITE(6,'(1x,a,f10.3)') 'mntctry1=',mntctry lenstr = 132 CALL strlnth( terndta1, lenstr) WRITE(6,'(2x,a,a/)') 'terndta1 = ',terndta1(1:lenstr) WRITE(6,'(1x,a,i4)') 'ternfmt1 =', ternfmt1 ternfmt = ternfmt1 READ(5,bgloption,END=100) WRITE(6,'(/a)') 'Sucessfully read namelist block BLGOPTION.' WRITE(6,'(1x,a,i4)') 'bglopt =', bglopt WRITE(6,'(1x,a,f10.3)') 'misvalue=', misvalue WRITE(6,'(1x,a,i4)') 'intrphopt =', intrphopt WRITE(6,'(1x,a,i4)') 'intrpvopt =', intrpvopt !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght WRITE(6,'(1x,a,i4)') 'ntagopt =', ntagopt WRITE(6,'(1x,a,f10.3)') 'aghght =', aghght ! !----------------------------------------------------------------------- ! ! Set the control parameters for soil data: ! !----------------------------------------------------------------------- ! READ (5,sfc_data,END=100) WRITE(6,'(/a/)') 'Sucessfully read namelist block SOIL_DATA.' IF (sfcdat .eq. 1) THEN nstyp = 1 nstypin = nstyp ELSE nstyp = nstypin ENDIF IF (nstyp1 .eq. -1) nstyp1 = nstyp WRITE (6,'(a,i3)') "Number of soil types to be used for input data:",nstypin ! !----------------------------------------------------------------------- ! ! Set the control parameters for output: ! !----------------------------------------------------------------------- ! WRITE(6,'(a)') & ' Reading in control parameters for the output data files..' READ (5,output,END=100) WRITE(6,'(a)') 'Sucessfully read namelist block OUTPUT.' houtfmt = hdmpfmt ! IF( houtfmt.eq.0 ) THEN ! write(6,'(/1x,a/)') 'Output format is 0, no data is dumped.' ! STOP 9103 ! ENDIF IF ( houtfmt == 10 .AND. grbpkbit <= 0 ) THEN WRITE(6,'(a,a,i2/a)') & 'The bit width for packing GRIB data was invalid, ', & 'The old value was ', grbpkbit, 'Reset it to 16 bits' grbpkbit = 16 END IF totout = 1 IF (sfcout == 1) THEN snowout = 1 END IF GO TO 15 100 WRITE(6,'(a)') & 'Error reading NAMELIST file. Program ARPSINTRP stopped.' STOP 9104 15 CONTINUE ldirnam=LEN(dirname) CALL strlnth( dirname , ldirnam) lengbf=len_trim(grdbasfn) WRITE(6,'(/a,a)')' The grid/base name is ', grdbasfn(1:lengbf) ! !----------------------------------------------------------------------- ! ! Allocate arrays. ! !----------------------------------------------------------------------- ! WRITE (6,'(/a,g13.3/)') "Current memory allocation (in words):", & current_memory_use ! lvlprof=MAX(601,nz) nxyz = nx*ny*nz nxy = nx*ny allocate( CALL alloc_status_accounting(istatus,nxyz,'u') allocate( CALL alloc_status_accounting(istatus,nxyz,'v') allocate( CALL alloc_status_accounting(istatus,nxyz,'w') allocate(ptprt(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'ptprt') allocate(pprt(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'pprt') allocate(qv(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qv') allocate(qc(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qc') allocate(qr(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qr') allocate(qi(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qi') allocate(qs(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qs') allocate(qh(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qh') allocate(tke(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'tke') allocate(kmh(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'kmh') allocate(kmv(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'kmh') allocate(soiltyp(nx,ny,nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*nstypin,'soiltyp') allocate(stypfrct(nx,ny,nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*nstypin,'stypfrct') allocate(vegtyp(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'vegtyp ') allocate(lai(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'lai ') allocate(roufns(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'roufns ') allocate(veg(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'veg ') allocate(ndvi(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'ndvi ') allocate(tsfc(nx,ny,0:nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*(nstypin+1),'tsfc ') allocate(tsoil(nx,ny,0:nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*(nstypin+1),'tsoil ') allocate(wetsfc(nx,ny,0:nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*(nstypin+1),'wetsfc ') allocate(wetdp(nx,ny,0:nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*(nstypin+1),'wetdp ') allocate(wetcanp(nx,ny,0:nstypin),stat=istatus) CALL alloc_status_accounting(istatus,nxy*(nstypin+1),'wetcanp') allocate(snowdpth(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'snowdpth') allocate(raing(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'raing') allocate(rainc(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'rainc') allocate(prcrate(nx,ny,4),stat=istatus) CALL alloc_status_accounting(istatus,nxy*4,'prcrate') allocate(radfrc(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'radfrc') allocate(radsw(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'radsw ') allocate(rnflx(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'rnflx ') allocate(usflx(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'usflx ') allocate(vsflx(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'vsflx ') allocate(ptsflx(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'ptsflx') allocate(qvsflx(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'qvsflx') allocate(ubar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'ubar') allocate(vbar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'vbar') allocate(wbar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'wbar') allocate(ptbar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'ptbar') allocate(pbar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'pbar') allocate(rhobar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'rhobar') allocate(qvbar(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qvbar') allocate( CALL alloc_status_accounting(istatus,nx,'x') allocate( CALL alloc_status_accounting(istatus,ny,'y') allocate( CALL alloc_status_accounting(istatus,nz,'z') allocate(zp(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'zp') allocate(hterain(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'hterain') allocate(uprt(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'uprt') allocate(vprt(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'vprt') allocate(qvprt(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'qvprt') allocate(tem1(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'tem1') allocate(tem2(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'tem2') allocate(tem3(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'tem3') !wdt update allocate(tem4(nx,ny,nz),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'tem4') allocate(u1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'u1') allocate(v1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'v1') allocate(w1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'w1') allocate(ptprt1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'ptprt1') allocate(pprt1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz,'pprt1') nxyz1 = nx1*ny1*nz1 nxy1 = nx1*ny1 print*,'Start allocating arrays for output grid.' allocate(qv1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qv1') qv1 = 0.0 allocate(qc1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qc1') qc1 = 0.0 allocate(qr1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qr1') qr1 = 0.0 allocate(qi1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qi1') qi1 = 0.0 allocate(qs1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qs1') qs1 = 0.0 allocate(qh1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qh1') qh1 = 0.0 allocate(tke1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'tke1') tke1= 0.0 allocate(kmh1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'kmh1') kmh1= 0.0 allocate(kmv1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'kmv1') kmv1= 0.0 allocate(soiltyp1(nx1,ny1,nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*nstyp1,'soiltyp1') allocate(stypfrct1(nx1,ny1,nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*nstyp1,'stypfrct1') soiltyp1 = 0 stypfrct1 = 0.0 allocate(vegtyp1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'vegtyp1') vegtyp1 = 0 allocate(lai1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'lai1') lai1 = 0.0 allocate(roufns1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'roufns1') roufns1 = 0.0 allocate(veg1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'veg1') veg1 = 0.0 allocate(tsfc1(nx1,ny1,0:nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*(nstyp1+1),'tsfc1') allocate(tsoil1(nx1,ny1,0:nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*(nstyp1+1),'tsoil1') allocate(wetsfc1(nx1,ny1,0:nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*(nstyp1+1),'wetsfc1') allocate(wetdp1(nx1,ny1,0:nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*(nstyp1+1),'wetdp1') allocate(wetcanp1(nx1,ny1,0:nstyp1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*(nstyp1+1),'wetcanp1') tsfc1 = 0.0 tsoil1 = 0.0 wetsfc1 = 0.0 wetdp1 = 0.0 wetcanp1 = 0.0 allocate(snowdpth1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*(nstyp1+1),'snowdpth1') snowdpth1 = 0.0 allocate(raing1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'raing1') raing1 = 0.0 allocate(rainc1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'rainc1') rainc1 = 0.0 allocate(prcrate1(nx1,ny1,4),stat=istatus) CALL alloc_status_accounting(istatus,nxy1*4,'prcrate1') prcrate1 = 0.0 allocate(radfrc1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'radfrc1') radfrc1 = 0.0 allocate(radsw1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'radsw1') radsw1 = 0.0 allocate(rnflx1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'rnflx1') rnflx1 = 0.0 allocate(usflx1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'usflx1') usflx1 = 0.0 allocate(vsflx1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'vsflx1') vsflx1 = 0.0 allocate(ptsflx1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'ptsflx1') ptsflx1 = 0.0 allocate(qvsflx1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qvsflx1') qvsflx1 = 0.0 allocate(ubar1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'ubar1') ubar1 = 0.0 allocate(vbar1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'vbar1') vbar1 = 0.0 allocate(ptbar1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'pbar1') ptbar1 = 0.0 allocate(pbar1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'ptbar1') pbar1 = 0.0 allocate(rhobar1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'rhobar1') rhobar1 = 0.0 allocate(qvbar1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'qvbar1') qvbar1 = 0.0 allocate(x1(nx1),stat=istatus) CALL alloc_status_accounting(istatus,nx1,'x1') x1 = 0.0 allocate(y1(ny1),stat=istatus) CALL alloc_status_accounting(istatus,ny1,'y1') y1 = 0.0 !wdt update allocate(x1_out(nx1),stat=istatus) CALL alloc_status_accounting(istatus,nx1,'x1_out') x1_out = 0.0 allocate(y1_out(ny1),stat=istatus) CALL alloc_status_accounting(istatus,ny1,'y1_out') y1_out = 0.0 allocate(z1(nz1),stat=istatus) CALL alloc_status_accounting(istatus,nz1,'z1') z1 = 0.0 allocate(zp1(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'zp1') zp1 = 0.0 allocate(hterain1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'hterain1') hterain1 = 0.0 !wdt update allocate(htrn1orig(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'htrn1orig') htrn1orig = 0.0 allocate(j11(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'j11') j11 = 0.0 allocate(j21(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'j21') j21 = 0.0 allocate(j31(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'j31') j31 = 1.0 allocate(tem11(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'tem11') tem11 = 0.0 allocate(tem21(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'tem21') tem21 = 0.0 allocate(wgtsx(nx1,3),stat=istatus) CALL alloc_status_accounting(istatus,nx1*3,'wgtsx') wgtsx = 0.0 allocate(wgtsy(ny1,3),stat=istatus) CALL alloc_status_accounting(istatus,ny1*3,'wgtsy') wgtsy = 0.0 allocate(wgtux(nx1,3),stat=istatus) CALL alloc_status_accounting(istatus,nx1*3,'wgtux') wgtux = 0.0 allocate(wgtvy(ny1,3),stat=istatus) CALL alloc_status_accounting(istatus,ny1*3,'wgtvy') wgtvy = 0.0 allocate(wgtz(nx1,ny1,nz1,3),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1*3,'wgtz') wgtz = 0.0 allocate(isx(nx1),stat=istatus) CALL alloc_status_accounting(istatus,nx1,'isx') isx = 0.0 allocate(jsy(ny1),stat=istatus) CALL alloc_status_accounting(istatus,ny1,'jsy') jsy = 0.0 allocate(iux(nx1),stat=istatus) CALL alloc_status_accounting(istatus,nx1,'iux') iux = 0.0 allocate(jvy(ny1),stat=istatus) CALL alloc_status_accounting(istatus,ny1,'jvy') jvy = 0.0 allocate(kz(nx1,ny1,nz1),stat=istatus) CALL alloc_status_accounting(istatus,nxyz1,'kz') kz = 0.0 allocate(zp1d1(nz1),stat=istatus) CALL alloc_status_accounting(istatus,nz1,'zp1d1') zp1d1 = 0.0 allocate(dzp1d1(nz1),stat=istatus) CALL alloc_status_accounting(istatus,nz1,'dzp1d1') dzp1d1 = 0.0 allocate(xs(nx ),stat=istatus) CALL alloc_status_accounting(istatus,nx,'xs') xs = 0.0 allocate(ys(ny ),stat=istatus) CALL alloc_status_accounting(istatus,ny,'ys') ys = 0.0 allocate(xs1(nx1),stat=istatus) CALL alloc_status_accounting(istatus,nx1,'xs1') xs1 = 0.0 allocate(ys1(ny1),stat=istatus) CALL alloc_status_accounting(istatus,ny1,'ys1') ys1 = 0.0 allocate(xs_2d(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'xs_2d') xs_2d = 0.0 allocate(ys_2d(nx,ny),stat=istatus) CALL alloc_status_accounting(istatus,nxy,'ys_2d') ys_2d = 0.0 allocate(temx1yz(nx1,ny ,nz),stat=istatus) CALL alloc_status_accounting(istatus,nx1*ny*nz,'temx1yz') temx1yz = 0.0 allocate(temx1y1z(nx1,ny1,nz),stat=istatus) CALL alloc_status_accounting(istatus,nx1*ny1*nz,'temx1y1z') temx1y1z = 0.0 allocate(temx1y1zb(nx1,ny1,nz),stat=istatus) CALL alloc_status_accounting(istatus,nx1*ny1*nz,'temx1y1zb') temx1y1zb = 0.0 allocate(temz1d1(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d1') temz1d1 = 0.0 allocate(temz1d2(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d2') temz1d2 = 0.0 allocate(temz1d3(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d3') temz1d3 = 0.0 allocate(temz1d4(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d4') temz1d4 = 0.0 allocate(temz1d5(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d5') temz1d5 = 0.0 allocate(temz1d6(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d6') temz1d6 = 0.0 allocate(temz1d7(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'temz1d7') temz1d7 = 0.0 allocate(zsnd(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'zsnd') zsnd = 0.0 allocate(ptsnd(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'ptsnd') ptsnd = 0.0 allocate(qvsnd(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'qvsnd') qvsnd = 0.0 allocate(psnd(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'psnd') psnd = 0.0 allocate(ubsnd(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'ubsnd') ubsnd = 0.0 allocate(vbsnd(lvlprof),stat=istatus) CALL alloc_status_accounting(istatus,lvlprof,'vbsnd') vbsnd = 0.0 allocate(ptpsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'ptpsfc') ptpsfc = 0.0 allocate(ppsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'ppsfc') ppsfc = 0.0 allocate(qvsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qvsfc') qvsfc = 0.0 allocate(qcsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qcsfc') qcsfc = 0.0 allocate(qrsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qrsfc') qrsfc = 0.0 allocate(qisfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qisfc') qisfc = 0.0 allocate(qssfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qssfc') qssfc = 0.0 allocate(qhsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qhsfc') qhsfc = 0.0 allocate(tkesfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'tkesfc') tkesfc = 0.0 allocate(kmhsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'kmhsfc') kmhsfc = 0.0 allocate(kmvsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'kmvsfc') kmvsfc = 0.0 allocate(ptbsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'ptbsfc') ptbsfc = 0.0 allocate(pbsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'pbsfc') pbsfc = 0.0 allocate(qvbsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'qvbsfc') qvbsfc = 0.0 allocate(htrnx1y1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'htrnx1y1') htrnx1y1 = 0.0 allocate(radsfc(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'radsfc') radsfc = 0.0 allocate(ktrnx1y1(nx1,ny1),stat=istatus) CALL alloc_status_accounting(istatus,nxy1,'ktrnx1y1') ktrnx1y1 = 0.0 !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. 2000/11/01 GMB soil consistency: allocate (ix(nx1,ny1),stat=istatus) allocate (jy(nx1,ny1),stat=istatus) allocate (xw(nx1,ny1),stat=istatus) allocate (yw(nx1,ny1),stat=istatus) nxyz = nx*ny*nz CALL flzero(u , nxyz) CALL flzero(v , nxyz) CALL flzero(uprt , nxyz) CALL flzero(vprt , nxyz) CALL flzero(w , nxyz) CALL flzero(ptprt , nxyz) CALL flzero(pprt , nxyz) CALL flzero(qv , nxyz) CALL flzero(qvprt , nxyz) CALL flzero(qc , nxyz) CALL flzero(qr , nxyz) CALL flzero(qi , nxyz) CALL flzero(qs , nxyz) CALL flzero(qh , nxyz) CALL flzero(tke , nxyz) CALL flzero(kmh , nxyz) CALL flzero(kmv , nxyz) CALL flzero(ubar , nxyz) CALL flzero(vbar , nxyz) CALL flzero(wbar , nxyz) CALL flzero(ptbar , nxyz) CALL flzero(pbar , nxyz) CALL flzero(rhobar, nxyz) CALL flzero(qvbar , nxyz) CALL flzero(x, nx) CALL flzero(y, ny) CALL flzero(z, nz) CALL flzero(zp , nxyz) DO iss=0,nstyp DO j=1,ny DO i=1,nx tsfc (i,j,iss) = 0.0 tsoil (i,j,iss) = 0.0 wetsfc (i,j,iss) = 0.0 wetdp (i,j,iss) = 0.0 wetcanp(i,j,iss) = 0.0 END DO END DO END DO DO iss=1,nstyp DO j=1,ny DO i=1,nx soiltyp (i,j,iss) = 0 stypfrct(i,j,iss) = 0.0 END DO END DO END DO vegtyp = 0 snowdpth= 0.0 lai = 0.0 roufns = 0.0 veg = 0.0 ndvi = 0.0 raing = 0.0 rainc = 0.0 prcrate = 0.0 prcrate = 0.0 prcrate = 0.0 prcrate = 0.0 radsw = 0.0 rnflx = 0.0 usflx = 0.0 vsflx = 0.0 ptsflx = 0.0 qvsflx = 0.0 radfrc = 0.0 ! !----------------------------------------------------------------------- ! ! Run interpolation. ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! Loop over data files ! !----------------------------------------------------------------------- ! ireturn = 0 DO nfile = 1,nhisfile filename = hisfile(nfile) lenfil=len_trim(filename) WRITE(6,'(/a,a,a)') & ' Data set ', filename(1:lenfil) ,' to be processed.' ! !----------------------------------------------------------------------- ! ! Read all input data arrays ! !----------------------------------------------------------------------- ! 102 CONTINUE CALL dtaread(nx,ny,nz,nstyp, & hinfmt, nchin,grdbasfn(1:lengbf),lengbf, & filename(1:lenfil),lenfil,time, & x,y,z,zp, uprt ,vprt ,w,ptprt, pprt , & qvprt, qc, qr, qi, qs, qh, tke,kmh,kmv, & ubar, vbar, wbar, ptbar, pbar, rhobar, qvbar, & soiltyp,stypfrct,vegtyp,lai,roufns,veg, & tsfc, tsoil, wetsfc, wetdp, wetcanp,snowdpth, & raing,rainc,prcrate, & radfrc,radsw,rnflx, & usflx,vsflx,ptsflx,qvsflx, & ireturn, tem1, tem2, tem3) !wdt update moved code block to here !wdt begin block curtim = time IF( hinfmt == 9 .AND. ireturn == 2 ) THEN WRITE(6,'(/1x,a/)') 'The end of GrADS file was reached.' CLOSE ( nchin ) CALL retunit( nchin ) GO TO 9001 END IF IF( ireturn /= 0 ) GO TO 9002 ! Read was unsuccessful ! !----------------------------------------------------------------------- ! ! Grid and base related calculations that need to be done only once. ! !----------------------------------------------------------------------- ! IF( nfile == 1) THEN ! Need to do this only once. ! !----------------------------------------------------------------------- ! ! Set-up land surface property data, if requested. ! !----------------------------------------------------------------------- ! IF ( sfcdat == 0 ) GO TO 110 IF ( sfcdat == 1 ) THEN nstyp = 1 DO j=1, ny-1 DO i=1, nx-1 soiltyp(i,j,1) = styp vegtyp (i,j) = vtyp lai (i,j) = lai0 roufns (i,j) = roufns0 veg (i,j) = veg0 END DO END DO ELSE IF (sfcdat == 2 .OR. (sfcdat == 3.AND.landin /= 1) ) THEN ! !----------------------------------------------------------------------- ! ! Read the surface property data from file sfcdtfl (passed ! in globcst.inc). ! !----------------------------------------------------------------------- ! CALL readsfcdt( nx,ny,nstyp,sfcdtfl,dx,dy, & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat,ctrlon, & soiltyp,stypfrct,vegtyp,lai,roufns,veg,ndvi ) ELSE IF(sfcdat == 3 .AND. landin == 1) THEN WRITE(6,'(1x,a/,a/)') & 'Surface property data in the history file was used.', & 'Data in ',sfcdtfl,' ignored.' ELSE WRITE(6,'(1x,a,i3,a/)') & 'Invalid surface data input option. sfcdat =',sfcdat, & '. Program stopped in ARPSINTRP' STOP END IF ! sfcdat option IF ( nstyp == 1 ) THEN DO j=1,ny DO i=1,nx stypfrct(i,j,1) = 1.0 END DO END DO END IF 110 CONTINUE DO j=1,ny DO i=1,nx hterain(i,j) = zp(i,j,2) END DO END DO dx = x(2) - x(1) dy = y(2) - y(1) xorig = x(2) yorig = y(2) zorig = z(2) WRITE(6,'(1x,a,3f15.3)') 'xorig, yorig, zorig =', & xorig, yorig, zorig ebc = 3 wbc = 3 sbc = 3 nbc = 3 dx = x(2)-x(1) dy = y(2)-y(1) dz = z(2)-z(1) END IF !wdt end block ! !----------------------------------------------------------------------- ! ! Set up the map projection of the input grid. ! !----------------------------------------------------------------------- ! alatpro(1)=trulat1 alatpro(2)=trulat2 dx = x(2)-x(1) dy = y(2)-y(1) IF( sclfct /= 1.0) THEN sclf = 1.0/sclfct dxscl = dx*sclf dyscl = dy*sclf ELSE sclf = 1.0 dxscl = dx dyscl = dy END IF PRINT*,mapproj,sclf,alatpro,trulon,ctrlat,ctrlon !wdt update: moved code block IF (same_res == 1) THEN IF(dx /= dx1 .OR. dy /= dy1) THEN WRITE (*,*) "WARNING: resetting dx1 and/or dy1 to match input grid." ENDIF dx1 = dx dy1 = dy ENDIF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ng = 0 500 CONTINUE ! Loop here for each output grid (noutgrds) IF (noutgrds > 0) THEN ng = ng + 1 ctrlat1 = clat_grd(ng) ctrlon1 = clon_grd(ng) xctr1 = xctr_grd(ng) yctr1 = yctr_grd(ng) ENDIF CALL setmapr( mapproj,sclf,alatpro,trulon ) CALL lltoxy( 1,1, ctrlat,ctrlon, ctrx, ctry ) swx = ctrx - (FLOAT(nx-3)/2.)*dxscl swy = ctry - (FLOAT(ny-3)/2.)*dyscl CALL setorig( 1, swx, swy) ! set up the model origin to the coord. CALL xytoll(1,1,(FLOAT(nx-3)/2.)*dx,(FLOAT(ny-3)/2.)*dy, & tmp1,tmp2) PRINT*,'ctrlat=',tmp1,', ctrlon=',tmp2 IF (xy_or_ll == 1) THEN CALL xytoll(1,1,xctr1,yctr1, ctrlat1,ctrlon1) ELSE IF (xy_or_ll == 2) THEN CALL lltoxy(1,1, ctrlat1,ctrlon1, xctr1,yctr1) ELSE WRITE (*,*) "ERROR: xy_or_ll =",xy_or_ll," not a valid value." STOP END IF IF (same_res == 1) THEN IF(dx /= dx1 .OR. dy /= dy1) THEN WRITE (*,*) "WARNING: resetting dx1 and/or dy1 to match input grid." ENDIF dx1 = dx dy1 = dy ENDIF ctrlat1_old = ctrlat1 ctrlon1_old = ctrlon1 IF( snap_to_grid /= 0 .OR. same_res == 1) THEN xsw = x(1) ysw = y(1) xsw1 = xctr1-(nx1-1)*dx1*0.5 ysw1 = yctr1-(ny1-1)*dy1*0.5 xsw1_old = xsw1 ysw1_old = ysw1 PRINT*,'mod =', MOD(dx,dx1),MOD(dy,dy1) IF(((dx >= dx1 .AND. & ABS((MOD(dx,dx1)-dx1)*MOD(dx,dx1)) <= 0.001*dx1).OR. & (dx <= dx1 .AND. & ABS((MOD(dx1,dx)-dx )*MOD(dx1,dx)) <= 0.001*dx )).AND. & ((dy >= dy1 .AND. & ABS((MOD(dy,dy1)-dy1)*MOD(dy,dy1)) <= 0.001*dy1).OR. & (dy <= dy1 .AND. & ABS((MOD(dy1,dy)-dy )*MOD(dy1,dy)) <= 0.001*dy ) )) THEN PRINT*,'is multiple' IF(snap_to_grid == 1) THEN xsw1 = xsw + nint( (xsw1_old-xsw)/dx1 )*dx1 ysw1 = ysw + nint( (ysw1_old-ysw)/dy1 )*dy1 ELSE IF(snap_to_grid == 2) THEN xsw1 = xsw + nint( (xsw1_old-xsw)/dx )*dx ysw1 = ysw + nint( (ysw1_old-ysw)/dy )*dy END IF PRINT*,'xsw,ysw,xsw1,ysw1=',xsw,ysw,xsw1,ysw1 PRINT*,'xsw1_old,ysw1_old=',xsw1_old,ysw1_old IF((snap_to_grid /= 0) .AND. ( & (ABS((xsw1_old - xsw1)) > 0.00001*dx1).OR. & (ABS((ysw1_old - ysw1)) > 0.00001*dy1) )) THEN xctr1_old = xctr1 yctr1_old = yctr1 xctr1 = xsw1+(nx1-1)*dx1*0.5 yctr1 = ysw1+(ny1-1)*dy1*0.5 ! ! Note there is a possibility that the shifted grid is out of bound ! The checking is done later. ! WRITE(6,'(/1x,a/)') & '################################################################' WRITE(6,'(/1x,a/,2(/1x,a)/)') & ' ATTENTION:', & 'xctr1 and/or yctr1 reset so that some of the output ', & 'grid lines match those of input grid.' WRITE(6,'(1x,2(a,f17.5))')'Original xctr1_old=',xctr1_old, & ', yctr1_old=',yctr1_old WRITE(6,'(1x,2(a,f17.5))')'New xctr1 = ',xctr1, & ', yctr1 = ',yctr1 WRITE(6,'(/1x,a/)') & '################################################################' CALL xytoll(1,1,xctr1,yctr1, ctrlat1,ctrlon1) END IF ELSE same_res = 0 ! ??? END IF END IF IF( nz1 /= nz .AND. same_res == 1) THEN WRITE (*,*) "WARNING: nz1 (",nz1,") does not match nz (",nz,")." WRITE (*,*) " Resetting same_res to 0." same_res = 0 ENDIF WRITE(6,'(1x,2(a,f17.5))') & 'Original ctrlat1_old = ',ctrlat1_old,', ctrlon1_old = ', & ctrlon1_old WRITE(6,'(1x,2(a,f17.5))') & 'Final ctrlat1 = ',ctrlat1 ,', ctrlon1 = ',ctrlon1 WRITE(6,'(1x,2(a,f17.5))') & 'Final xctr1 = ',xctr1, ', yctr1 = ',yctr1 WRITE(6,'(a,i2/)')'same_res = ', same_res !wdt update: moved code block to above ! !----------------------------------------------------------------------- ! ! Perform spatial interpolations. ! !----------------------------------------------------------------------- ! !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! IF( nfile == 1) THEN IF( nfile == 1 .or. noutgrds > 0) THEN ! Need to do this for the first file only !wdt update moved code block here xorig1 = xctr1 - (nx1-3)*dx1*0.5 yorig1 = yctr1 - (ny1-3)*dy1*0.5 zorig1 = zorig DO i=1,nx1 x1(i) =xorig1+(i-2.0)*dx1 xs1(i)=xorig1+(i-1.5)*dx1 END DO DO j=1,ny1 y1 (j) =yorig1+(j-2.0)*dy1 ys1(j) =yorig1+(j-1.5)*dy1 END DO ib= nint(x1(1)/dx)+1 jb= nint(y1(1)/dy)+1 DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO DO k=1,nz1 z1(k)=zorig1+(k-2.0)*dz1 END DO IF( nfile == 1) THEN ! Need to do this for the first file only xeps = 0.01*dx yeps = 0.01*dy PRINT*,'x (2),x (nx -1),y (2),y (ny -1) =', & x(2),x(nx-1),y(2),y(ny-1) PRINT*,'x1(2),x1(nx1-1),y1(2),y1(ny1-1) =', & x1(2),x1(nx1-1),y1(2),y1(ny1-1) IF(x1( 1) < x( 1)-xeps.OR.x1(nx1) > x(nx)+xeps.OR. & y1( 1) < y( 1)-yeps.OR.y1(ny1) > y(ny)+yeps) THEN WRITE(6,'(3(/2x,a),/2x,2(a,f12.4),2(a,i5),2(a,f12.4),/2x,a)') & 'Sorry, at least part of your new grid is outside the border of', & 'the original grid, please check input parameters', & 'dx1,dy1, nx1, ny1, xctr1 and yctr1. Currently,', & 'dx1=',dx1,', dy1=',dy1,', nx1=',nx1,', ny1=',ny1, & ', xctr1=',xctr1,', yctr1=',yctr1, & 'Job stopped in ARPSINTRP.' GOTO 600 !wdt STOP 1001 END IF END IF IF( same_res == 0 ) THEN IF( intrphopt == 1) THEN ! Weights for 1st order interpolation DO i=1,nx1-1 isx(i) = MAX(1, MIN(nx-2, INT((xs1(i)-xs(1))/dx)+1 )) wgtsx(i,1)= (xs(isx(i)+1)-xs1(i))/(xs(isx(i)+1)-xs(isx(i))) END DO DO j=1,ny1-1 jsy(j) = MAX(1, MIN(ny-2, INT((ys1(j)-ys(1))/dy)+1 )) wgtsy(j,1)= (ys(jsy(j)+1)-ys1(j))/(ys(jsy(j)+1)-ys(jsy(j))) END DO DO i=1,nx1 iux(i) = MAX(1, MIN(nx-1, INT((x1 (i)-x (1))/dx)+1 )) wgtux(i,1)= (x (iux(i)+1)-x1 (i))/(x (iux(i)+1)-x (iux(i))) END DO DO j=1,ny1 jvy(j) = MAX(1, MIN(ny-1, INT((y1 (j)-y (1))/dy)+1 )) wgtvy(j,1)= (y (jvy(j)+1)-y1 (j))/(y (jvy(j)+1)-y (jvy(j))) END DO ELSE ! Weights for second order interpolation DO i=1,nx1-1 isx(i) = MAX(2, MIN(nx-2, INT((xs1(i)-xs(1))/dx)+1 )) d=xs1(i) a=xs(isx(i)-1) b=xs(isx(i)) c=xs(isx(i)+1) wgtsx(i,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtsx(i,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtsx(i,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO DO j=1,ny1-1 jsy(j) = MAX(2, MIN(ny-2, INT((ys1(j)-ys(1))/dy)+1 )) d=ys1(j) a=ys(jsy(j)-1) b=ys(jsy(j)) c=ys(jsy(j)+1) wgtsy(j,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtsy(j,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtsy(j,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO DO i=1,nx1 iux(i) = MAX(2, MIN(nx-1, INT((x1 (i)-x (1))/dx)+1 )) d=x1(i) a=x(iux(i)-1) b=x(iux(i)) c=x(iux(i)+1) wgtux(i,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtux(i,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtux(i,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO DO j=1,ny1 jvy(j) = MAX(2, MIN(ny-1, INT((y1 (j)-y (1))/dy)+1 )) d=y1(j) a=y(jvy(j)-1) b=y(jvy(j)) c=y(jvy(j)+1) wgtvy(j,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtvy(j,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtvy(j,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END IF ! intrphopt = ? IF( ternopt1 == 0 ) THEN DO i=1,nx1-1 DO j=1,ny1-1 hterain1(i,j) = zrefsfc1 END DO END DO ELSE IF( ternopt1 == 1 ) THEN ! Bell-shaped mountain ! !----------------------------------------------------------------------- ! ! Define the bell-shaped mountain ! !----------------------------------------------------------------------- ! pi2 = 1.5707963267949 DO j=1,ny1-1 DO i=1,nx1-1 IF( mntwidy1 < 0.0 ) THEN ! 2-d terrain in x-z plane. radnd = 1.0+((xs1(i)-mntctrx1)/mntwidx1)**2 ELSE IF( mntwidx1 < 0.0 ) THEN ! 2-d terrain in y-z plane. radnd = 1.0+((ys1(j)-mntctry1)/mntwidy1)**2 ELSE ! 3-d terrain radnd = 1.0+((xs1(i)-mntctrx1)/mntwidx1)**2 & +((ys1(j)-mntctry1)/mntwidy1)**2 END IF hterain1(i,j) = zrefsfc1 + hmount1/radnd END DO END DO ELSE IF( ternopt1 == 2 .or. ternopt1 == 4 ) THEN ! Read from terrain data base ! !----------------------------------------------------------------------- ! ! Read in the terrain data. ! !----------------------------------------------------------------------- ! lenstr = 132 CALL strlnth( terndta1, lenstr) CALL readtrn( nx1,ny1,dx1,dy1, terndta1(1:lenstr), & mapproj,trulat1,trulat2,trulon,sclfct,ctrlat1,ctrlon1, & hterain1 ) ! !----------------------------------------------------------------------- ! ! Define the new grid terrain by interpolation ! !----------------------------------------------------------------------- ! !wdt update END IF !wdt update IF( ternopt1 == 3 .or. ternopt1 == 4 ) THEN !wdt update htrn1orig CALL intrpxy3d(hterain,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & htrn1orig,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) !wdt-williams 2002-01-17 GMB ntmerge !hterain1 = htrn1orig ! uncomment if ternopt1=4 (ntmerge) dissabled IF (ternopt1 == 3) THEN hterain1 = htrn1orig ELSE ntmergeinv = 1.d0/ntmerge DO j = 1,ny1 DO i = 1,nx1 idist = max(0,min(ntmerge,i-2,nx1-2-i,j-2,ny1-2-j)) mfac = idist*ntmergeinv hterain1(i,j) = (1.d0-mfac)*htrn1orig(i,j) & + mfac*hterain1(i,j) END DO END DO END IF END IF npoint_below_ground = 0 IF( ternopt1 /= 3) THEN CALL intrpxy3d(hterain,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & temx1y1z,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL a3dmax0(hterain,1,nx,1,nx-1,1,ny,1,ny-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'htmin = ', amin,', htmax =',amax CALL a3dmax0(temx1y1z,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ht1min = ', amin,', ht1max =',amax CALL a3dmax0(hterain1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ht1min = ', amin,', ht1max =',amax npoint_below_ground = 0 DO i=1,nx1-1 DO j=1,ny1-1 IF( hterain1(i,j) < temx1y1z(i,j,1)-1.0E-2) THEN npoint_below_ground = 1 GO TO 2100 END IF END DO END DO 2100 CONTINUE END IF ! !----------------------------------------------------------------------- ! ! Set up a stretched vertical grid for the output grid. ! ! For strhopt1=1, function y = a+b*x**3 is used to specify dz as a ! function of k. ! For strhopt1=2, function y = c + a*tanh(b*x) is used to specify dz ! as a function of k. ! !----------------------------------------------------------------------- ! IF ( strhopt1 == 0 ) THEN DO k=1,nz1 zp1d1(k) = z1(k) END DO ELSE IF ( strhopt1 == 1 .OR.strhopt1 == 2 ) THEN za = zrefsfc1 + MAX(0.0, MIN(dlayer11, z1(nz1-2)-zrefsfc1 )) zb = za + MAX(0.0, MIN(dlayer21, z1(nz1-1)-za )) IF( dlayer11 >= (nz1-3)*dzmin1 ) THEN WRITE(6,'(/1x,a,f13.3,/a,f13.3,a,a)') & 'Can not setup a vertical grid with uniform dz=',dzmin1, & ' over the depth of ',dlayer11,' please specify a smaller ', & 'value of dlayer11. Program stopped in ARPSINTRP.' STOP 9105 END IF CALL strhgrd(nz1,strhopt1,zrefsfc1,za,zb,z1(nz1-1), & dzmin1,strhtune1, zp1d1,dzp1d1) ELSE WRITE(6,'(1x,a,i3,a/)') & 'Invalid vertical grid stretching option, strhopt1 was ',strhopt1, & '. Program stopped in INIGRD.' STOP 9106 END IF !----------------------------------------------------------------------- ! ! Physical height of computational grid defined as ! ! Zp=(z-zrefsfc)*(Zm-hterain)/(Zm-zrefsfc)+hterain for z=<Zm. ! ZP=z for z>Zm ! ! where Zm the height at which the grid levels becomes flat. ! Hm < Zm =< Ztop, hm is the height of mountain and Ztop the height ! of model top. ! !----------------------------------------------------------------------- ! DO k=nz1-1,2,-1 IF(zp1d1(k) <= zflat1) THEN zflat11 = zp1d1(k) EXIT END IF END DO 525 CONTINUE zflat11=MAX(MIN(z1(nz1-1),zflat11),zrefsfc1) DO k=2,nz1-1 IF(zp1d1(k) > zflat11) THEN DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,k)=zp1d1(k) END DO END DO ELSE DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,k)=(zp1d1(k)-zrefsfc1)*(zflat11-hterain1(i,j)) & /(zflat11-zrefsfc1)+hterain1(i,j) END DO END DO END IF END DO DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,2)=hterain1(i,j) zp1(i,j,1)=2.0*zp1(i,j,2)-zp1(i,j,3) zp1(i,j,nz1)=2.0*zp1(i,j,nz1-1)-zp1(i,j,nz1-2) END DO END DO ! CALL jacob(nx1,ny1,nz1,x1,y1,z1,zp1,j11,j21,j31) END IF ! same_res = 0? END IF ! IF (nfile.eq.1) ! !----------------------------------------------------------------------- ! ! Calculate total fields from that for base state and perturbations ! !----------------------------------------------------------------------- ! DO k=1,nz DO j=1,ny DO i=1,nx u (i,j,k)=uprt (i,j,k)+ubar (i,j,k) v (i,j,k)=vprt (i,j,k)+vbar (i,j,k) qv(i,j,k)=qvprt(i,j,k)+qvbar(i,j,k) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Start interpolation or sampling in the case of same_res=1. ! !----------------------------------------------------------------------- ! IF( same_res == 1 ) THEN DO k=1,nz1 DO j=1,ny1 DO i=1,nx1 u1 (i,j,k)=u (i+ib,j+jb,k) v1 (i,j,k)=v (i+ib,j+jb,k) w1 (i,j,k)=w (i+ib,j+jb,k) ptprt1(i,j,k)=ptprt(i+ib,j+jb,k) pprt1 (i,j,k)=pprt (i+ib,j+jb,k) qv1 (i,j,k)=qv (i+ib,j+jb,k) qc1 (i,j,k)=qc (i+ib,j+jb,k) qr1 (i,j,k)=qr (i+ib,j+jb,k) qi1 (i,j,k)=qi (i+ib,j+jb,k) qs1 (i,j,k)=qs (i+ib,j+jb,k) qh1 (i,j,k)=qh (i+ib,j+jb,k) tke1 (i,j,k)=tke (i+ib,j+jb,k) kmh1 (i,j,k)=kmh (i+ib,j+jb,k) kmv1 (i,j,k)=kmv (i+ib,j+jb,k) radfrc1(i,j,k)=radfrc(i+ib,j+jb,k) rhobar1(i,j,k)=rhobar(i+ib,j+jb,k) END DO END DO END DO !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! IF( nfile == 1) THEN IF( nfile == 1 .or. noutgrds > 0) THEN DO k=1,nz1 DO i=1,nx1 DO j=1,ny1 ubar1 (i,j,k)=ubar (i+ib,j+jb,k) vbar1 (i,j,k)=vbar (i+ib,j+jb,k) ptbar1(i,j,k)=ptbar(i+ib,j+jb,k) pbar1 (i,j,k)=pbar (i+ib,j+jb,k) qvbar1(i,j,k)=qvbar(i+ib,j+jb,k) zp1 (i,j,k)=zp (i+ib,j+jb,k) END DO END DO END DO CALL jacob(nx1,ny1,nz1,x1,y1,z1,zp1,j11,j21,j31) END IF DO i=1,nx1 DO j=1,ny1 hterain1(i,j)=hterain(i+ib,j+jb) soiltyp1 (i,j,:)=soiltyp (i+ib,j+jb,:) stypfrct1(i,j,:)=stypfrct(i+ib,j+jb,:) vegtyp1(i,j)=vegtyp(i+ib,j+jb) lai1 (i,j)=lai (i+ib,j+jb) roufns1(i,j)=roufns(i+ib,j+jb) veg1 (i,j)=veg (i+ib,j+jb) tsfc1 (i,j,:)=tsfc (i+ib,j+jb,:) tsoil1 (i,j,:)=tsoil (i+ib,j+jb,:) wetsfc1 (i,j,:)=wetsfc (i+ib,j+jb,:) wetdp1 (i,j,:)=wetdp (i+ib,j+jb,:) wetcanp1 (i,j,:)=wetcanp (i+ib,j+jb,:) snowdpth1(i,j)=snowdpth(i+ib,j+jb) raing1 (i,j)=raing(i+ib,j+jb) rainc1 (i,j)=rainc(i+ib,j+jb) prcrate1(i,j,1:4)=prcrate(i+ib,j+jb,1:4) radsw1 (i,j)=radsw (i+ib,j+jb) rnflx1 (i,j)=rnflx (i+ib,j+jb) usflx1 (i,j)=usflx (i+ib,j+jb) vsflx1 (i,j)=vsflx (i+ib,j+jb) ptsflx1(i,j)=ptsflx(i+ib,j+jb) qvsflx1(i,j)=qvsflx(i+ib,j+jb) END DO END DO GO TO 800 END IF ! !----------------------------------------------------------------------- ! ! Intepolate the 2-D arrays to the new grid ! !----------------------------------------------------------------------- ! CALL intrpxy3d(rainc,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & rainc1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(raing,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & raing1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(prcrate,nx,1,nx-1,ny,1,ny-1,4,1,4, & wgtsx,isx,wgtsy,jsy,intrphopt, & prcrate1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(radsw,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & radsw1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(rnflx,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & rnflx1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(usflx,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & usflx1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(vsflx,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & vsflx1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(ptsflx,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & ptsflx1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(qvsflx,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & qvsflx1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(lai,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & lai1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(roufns,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & roufns1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(veg,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & veg1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. 2000/11/01 GMB soil consistency: DO j = 1,ny1 DO i = 1,nx1 ix(i,j) = isx(i) jy(i,j) = jsy(j) xw(i,j) = & MAX(0.,MIN(1.,(xs(isx(i)+1)-xs1(i))/(xs(isx(i)+1)-xs(isx(i))))) yw(i,j) = & MAX(0.,MIN(1.,(ys(jsy(j)+1)-ys1(j))/(ys(jsy(j)+1)-ys(jsy(j))))) END DO END DO CALL intrp_soil(nx,ny,nx1,ny1,nstypin,nstyp1,xw,yw,ix,jy, & tsfc,tsoil,wetsfc,wetdp,wetcanp, & soiltyp,stypfrct,vegtyp, & tsfc1,tsoil1,wetsfc1,wetdp1,wetcanp1, & soiltyp1,stypfrct1,vegtyp1) ! CALL intrpxy3d(tsfc,nx,1,nx-1,ny,1,ny-1,nstyp+1,1,nstyp+1, & ! wgtsx,isx,wgtsy,jsy,intrphopt, & ! tsfc1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) ! ! CALL intrpxy3d(tsoil,nx,1,nx-1,ny,1,ny-1,nstyp+1,1,nstyp+1, & ! wgtsx,isx,wgtsy,jsy,intrphopt, & ! tsoil1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) ! ! CALL intrpxy3d(wetsfc,nx,1,nx-1,ny,1,ny-1,nstyp+1,1,nstyp+1, & ! wgtsx,isx,wgtsy,jsy,intrphopt, & ! wetsfc1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) ! ! CALL intrpxy3d(wetdp,nx,1,nx-1,ny,1,ny-1,nstyp+1,1,nstyp+1, & ! wgtsx,isx,wgtsy,jsy,intrphopt, & ! wetdp1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) ! ! CALL intrpxy3d(wetcanp,nx,1,nx-1,ny,1,ny-1,nstyp+1,1,nstyp+1, & ! wgtsx,isx,wgtsy,jsy,intrphopt, & ! wetcanp1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) CALL intrpxy3d(snowdpth,nx,1,nx-1,ny,1,ny-1,1,1,1, & wgtsx,isx,wgtsy,jsy,intrphopt, & snowdpth1,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. 2000/11/01 GMB soil consistency: ! DO i=1,nx1-1 ! DO j=1,ny1-1 ! vegtyp1 (i,j) = vegtyp (isx(i),jsy(j)) ! END DO ! END DO ! ! DO iss=1,nstyp ! DO j=1,ny1-1 ! DO i=1,nx1-1 ! soiltyp1 (i,j,iss) = soiltyp (isx(i),jsy(j),iss) ! stypfrct1(i,j,iss) = stypfrct(isx(i),jsy(j),iss) ! END DO ! END DO ! END DO ! !----------------------------------------------------------------------- ! ! Intepolate 3D arrays ! !----------------------------------------------------------------------- ! IF( z_or_p == 2) THEN ! This situation has not been tested since ! last major change to this program DO k=1,nz DO j=1,ny-1 DO i=1,nx-1 zp(i,j,k) = -ALOG( (pbar(i,j,k)+pprt(i,j,k))*1.0E-5 ) END DO END DO END DO DO k=1,nz1 DO j=1,ny1-1 DO i=1,nx1-1 zp1(i,j,k) = -ALOG( plevels(k)*1.0E-3 ) END DO END DO END DO END IF IF( npoint_below_ground /= 0.AND.z_or_p == 1.AND. & (bglopt == 4 .OR. bglopt == 5)) THEN ! Reconstruct horizontally homogeneous base state redo_base_state = 1 ELSE redo_base_state = 0 END IF IF( redo_base_state /= 0 ) THEN zpmin=0.5*(zp(2,2, 2)+zp(2,2,3)) zpmax=0.5*(zp(2,2,nz)+zp(2,2,nz-1)) DO i=2,nx-2 DO j=2,ny-2 zpmin=MIN(zpmin,0.5*(zp(i,j, 2)+zp(i,j, 3))) zpmax=MAX(zpmax,0.5*(zp(i,j,nz)+zp(i,j,nz-1))) END DO END DO zpmin1=MIN(zpmin1,0.5*(zp1(1,1,1)+zp1(1,1,2))) DO i=2,nx1-2 DO j=2,ny1-2 zpmin1=MIN(zpmin1,0.5*(zp1(i,j,1)+zp1(i,j,2))) END DO END DO snddelz = (zpmax-zpmin)/(lvlprof-2) DO k=1,lvlprof zsnd(k)= zpmin+(k-2)*snddelz END DO IF (bglopt == 4) THEN DO k=2,lvlprof temz1d3(k)=0.0 temz1d4(k)=0.0 temz1d5(k)=0.0 temz1d6(k)=0.0 temz1d7(k)=0.0 END DO pbartop = 0.0 DO i=2,nx-2 DO j=2,ny-2 DO k=2,nz-1 temz1d1(k)=ptbar(i,j,k) temz1d2(k)=0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO CALL inte1d(temz1d1(2),temz1d2(2),nz-2, & ptsnd(2),zsnd(2),lvlprof-1) DO k=2,nz-1 temz1d1(k)=qvbar(i,j,k) END DO CALL inte1d(temz1d1(2),temz1d2(2),nz-2, & qvsnd(2),zsnd(2),lvlprof-1) DO k=2,nz-1 temz1d1(k)=(ubar(i,j,k)+ubar(i+1,j,k))*0.5 END DO CALL inte1d(temz1d1(2),temz1d2(2),nz-2, & ubsnd(2),zsnd(2),lvlprof-1) DO k=2,nz-1 temz1d1(k)=(vbar(i,j,k)+vbar(i,j+1,k))*0.5 END DO CALL inte1d(temz1d1(2),temz1d2(2),nz-2, & vbsnd(2),zsnd(2),lvlprof-1) DO k=2,nz-1 temz1d1(k)=ALOG(pbar(i,j,k)) END DO CALL inte1d(temz1d1(2),temz1d2(2),nz-2, & tem,zsnd(lvlprof-1),1) pbartop = pbartop+tem DO k=2,lvlprof IF(zsnd(k) >= temz1d2(2)-1.0E-5) THEN ! Add only points above ground temz1d3(k)=temz1d3(k)+1 temz1d4(k)=temz1d4(k)+ptsnd(k) temz1d5(k)=temz1d5(k)+qvsnd(k) temz1d6(k)=temz1d6(k)+ubsnd(k) temz1d7(k)=temz1d7(k)+vbsnd(k) END IF END DO END DO END DO ! ! Obtain averages ! DO k=2,lvlprof ptsnd(k)=temz1d4(k)/temz1d3(k) qvsnd(k)=temz1d5(k)/temz1d3(k) ubsnd(k)=temz1d6(k)/temz1d3(k) vbsnd(k)=temz1d7(k)/temz1d3(k) END DO pbartop=EXP(pbartop/temz1d3(lvlprof-1)) ! ! Integrate hydrostatic equation down from top ! DO k=2,lvlprof temz1d1(k) = ptsnd(k)*(1.0+rvdrd*qvsnd(k))/(1.0+qvsnd(k)) END DO psnd(lvlprof-1) = ( pbartop/p0 )**(rddcp) DO k=lvlprof-2,2,-1 psnd(k)=psnd(k+1)-g*(zsnd(k)-zsnd(k+1)) & /(cp*0.5*(temz1d1(k)+temz1d1(k+1))) END DO DO k=lvlprof,lvlprof psnd(k)=psnd(k-1)-g*(zsnd(k)-zsnd(k-1)) & /(cp*0.5*(temz1d1(k)+temz1d1(k-1))) END DO DO k = 2,lvlprof psnd(k) = psnd(k)**(1/rddcp) * p0 END DO IF( zpmin1 < zpmin ) THEN ! Extend 1d sounding to zpmin1 using ! constant temperature lapse rate dtdz = -0.0068 ! Minus lapse rate zsnd(1)=zpmin1 delz = zpmin1 - zpmin tbark1 = ptsnd(2) * (psnd(2)/p0)**rddcp tbark = tbark1+dtdz*delz lnpbar = ALOG(psnd(2))-g*2.0*delz/(rd*(tbark1+tbark)) psnd(1) = EXP(lnpbar) ptsnd(1)=tbark*(p0/psnd(1))**rddcp qvsnd(1)=qvsnd(2) ubsnd(1)=ubsnd(2) vbsnd(1)=vbsnd(2) ELSE ! Set for safty, won't be used. psnd(1)=psnd(2) ptsnd(1)=ptsnd(2) qvsnd(1)=qvsnd(2) ubsnd(1)=ubsnd(2) vbsnd(1)=vbsnd(2) END IF ELSE ! bglopt=5 !wdt update ! ! Use extmnsnd (from ext2arps) to get average sounding ! ! tem1 - zp at zone center DO k=1,nz DO j=1,ny DO i=1,nx tem1(i,j,k) = 0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO END DO END DO ! tem2 = log(pbar) ! tem3 = t ! tem4 = rhstar DO k=1,nz DO j=1,ny DO i=1,nx tem2(i,j,k) = ALOG(pbar(i,j,k)) ! log pressure tem3(i,j,k) = (ptprt(i,j,k)+ptbar(i,j,k)) & *(((pprt(i,j,k)+pbar(i,j,k))/p0)**rddcp) ! temperature qvsat=f_qvsat( pprt(i,j,k)+pbar(i,j,k), tem3(i,j,k) ) tem4(i,j,k)=SQRT(AMAX1(0.,(rhmax-(qv(i,j,k)/qvsat)))) END DO END DO END DO DO j=1,ny-1 DO i=1,nx-1 xs_2d(i,j) = xs(i) ys_2d(i,j) = ys(j) END DO END DO i1mn = MAX(1,INT(xorig1/dx1-1.)) i1mx = MIN(nx-1,i1mn+nx1+1) j1mn = MAX(1,INT(yorig1/dy1-1.)) j1mx = MIN(ny-1,j1mn+ny1+1) !wdt update CALL extmnsnd(nx1,ny1,nx,ny,nz,lvlprof, & i1mn,i1mx,j1mn,j1mx,2,nz-1, & xs1,ys1,xs_2d,ys_2d, & tem1,tem2,tem3,tem4, & u,v, & ! note: not vital that u & v be staggered zsnd,temz1d1,psnd,temz1d2,ptsnd,temz1d3, & qvsnd,temz1d4,ubsnd,vbsnd) END IF WRITE(6,'(/a/)')' Reconstructed horizontal average sounding:' DO k = lvlprof,1,-1 WRITE(6,'(a,i4,4f10.2,f10.6)') 'k,z,p,pt,t,qv=', & k,zsnd(k),psnd(k),ptsnd(k), & ptsnd(k)*(psnd(k)/p0)**rddcp,qvsnd(k) END DO END IF ! !----------------------------------------------------------------------- ! ! Intepolate 3D arrays at u-point ! !----------------------------------------------------------------------- ! CALL avgz(zp1, 0 , nx1,ny1,nz1,1,nx1-1,1,ny1-1,1,nz1-1, tem11 ) CALL avgsu(tem11,nx1,ny1,nz1,1,ny1-1,1,nz1-1, tem21, tem11) CALL avgz(zp, 0 , nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, tem1 ) CALL avgsu(tem1,nx,ny,nz,1,ny-1,1,nz-1, tem2, tem1) CALL intrpxy3d(tem2,nx,1,nx,ny,1,ny-1,nz,1,nz-1, & wgtux,iux,wgtsy,jsy,intrphopt, & temx1y1zb,nx1,1,nx1, ny1,1,ny1-1, temx1yz) DO i=1,nx1 DO j=1,ny1-1 k0 = nz-2 DO k=nz1-1,1,-1 z0 = tem21(i,j,k) DO kk=k0,1,-1 IF(z0 >= temx1y1zb(i,j,kk)) THEN k0 = kk EXIT END IF END DO 1115 CONTINUE IF(intrpvopt == 1) kz(i,j,k)=MAX(1,MIN(k0,nz-2)) IF(intrpvopt == 2) kz(i,j,k)=MAX(2,MIN(k0,nz-2)) END DO END DO END DO IF( intrpvopt == 1) THEN DO i=1,nx1 DO j=1,ny1-1 DO k=1,nz1-1 wgtz(i,j,k,1)=(temx1y1zb(i,j,kz(i,j,k)+1)-tem21(i,j,k))/ & (temx1y1zb(i,j,kz(i,j,k)+1)-temx1y1zb(i,j,kz(i,j,k))) END DO END DO END DO ELSE DO i=1,nx1 DO j=1,ny1-1 DO k=1,nz1-1 d=tem21(i,j,k) a=temx1y1zb(i,j,kz(i,j,k)-1) b=temx1y1zb(i,j,kz(i,j,k)) c=temx1y1zb(i,j,kz(i,j,k)+1) wgtz(i,j,k,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtz(i,j,k,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtz(i,j,k,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END DO END DO END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! IF( nfile == 1) THEN IF(nfile == 1 .or. noutgrds > 0) THEN IF( redo_base_state == 0 ) THEN ! get base-state from original arrays CALL intrpxyz3d(ubar,nx,1,nx,ny,1,ny-1,nz,1,nz-1, & wgtux,iux,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & ubar1,nx1,1,nx1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO i=1,nx1 DO j=1,ny1-1 DO k=1,nz1-1 IF(tem21(i,j,k) < temx1y1zb(i,j,2)) THEN ! below input grid ground IF(bglopt == 2) THEN ubar1(i,j,k)=temx1y1z(i,j,2) ELSE IF(bglopt == 3) THEN ubar1(i,j,k)=0.0 END IF END IF END DO END DO END DO ELSE IF( redo_base_state == 1 ) THEN ! reconstruct base-state from 1d soundings DO k=1,nz1-1 DO j=1,ny1-1 DO i=1,nx1 kk = MAX(1,MIN(lvlprof-1, & INT((tem21(i,j,k)-zsnd(2))/snddelz)+2)) IF(tem21(i,j,k) < zsnd(2)) kk = 1 tem = (tem21(i,j,k)-zsnd(kk))/(zsnd(kk+1)-zsnd(kk)) ubar1(i,j,k)= ubsnd(kk)+(ubsnd(kk+1)-ubsnd(kk))*tem END DO END DO END DO END IF END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght IF (ntagopt == 1) THEN ! adjust tem21 (heights) so that surface wind is ! same as input surface wind (by matching tem21 ! to the input height, temx1y1zb, near the surface). DO i=1,nx1 DO j=1,ny1-1 hght0 = tem21(i,j,2) dhght = hght0 - temx1y1zb(i,j,2) IF (dhght > 0) THEN DO k=1,nz1-1 fac = MAX(0., tem21(i,j,k) - hght0)/aghght IF (fac > 1) EXIT tem21(i,j,k) = fac*fac*tem21(i,j,k) & + (1.-fac*fac)*(tem21(i,j,k)-dhght) END DO ENDIF END DO END DO DO i=1,nx1 DO j=1,ny1-1 k0 = nz-2 DO k=nz1-1,1,-1 z0 = tem21(i,j,k) DO kk=k0,1,-1 IF(z0 >= temx1y1zb(i,j,kk)) THEN k0 = kk EXIT END IF END DO IF(intrpvopt == 1) kz(i,j,k)=MAX(1,MIN(k0,nz-2)) IF(intrpvopt == 2) kz(i,j,k)=MAX(2,MIN(k0,nz-2)) END DO END DO END DO IF( intrpvopt == 1) THEN DO i=1,nx1 DO j=1,ny1-1 DO k=1,nz1-1 wgtz(i,j,k,1)=(temx1y1zb(i,j,kz(i,j,k)+1)-tem21(i,j,k))/ & (temx1y1zb(i,j,kz(i,j,k)+1)-temx1y1zb(i,j,kz(i,j,k))) END DO END DO END DO ELSE DO i=1,nx1 DO j=1,ny1-1 DO k=1,nz1-1 d=tem21(i,j,k) a=temx1y1zb(i,j,kz(i,j,k)-1) b=temx1y1zb(i,j,kz(i,j,k)) c=temx1y1zb(i,j,kz(i,j,k)+1) wgtz(i,j,k,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtz(i,j,k,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtz(i,j,k,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END DO END DO END IF END IF CALL intrpxyz3d(u,nx,1,nx,ny,1,ny-1,nz,1,nz-1, & wgtux,iux,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & u1,nx1,1,nx1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght IF( npoint_below_ground /= 0 ) THEN ! Set values below input grid ground DO i=1,nx1 DO j=1,ny1-1 DO k=nz1-2,1,-1 IF(tem21(i,j,k) < temx1y1zb(i,j,2)) THEN ! below input grid ground IF(bglopt == 2 .OR. bglopt == 4 .OR. bglopt == 5) THEN u1 (i,j,k)=temx1y1z(i,j,2) ELSE IF(bglopt == 3) THEN u1 (i,j,k)=misvalue END IF END IF END DO END DO END DO END IF ! !----------------------------------------------------------------------- ! ! Intepolate 3D arrays at v-point ! !----------------------------------------------------------------------- ! CALL avgz(zp1, 0, nx1,ny1,nz1,1,nx1-1,1,ny1-1,1,nz1-1, tem11 ) CALL avgsv(tem11,nx1,ny1,nz1,1,nx1-1,1,nz1-1, tem21, tem11) CALL avgz(zp, 0, nx,ny,nz,1,nx-1,1,ny-1,1,nz-1, tem1 ) CALL avgsv(tem1,nx,ny,nz,1,nx-1,1,nz-1, tem2, tem1) CALL intrpxy3d(tem2,nx,1,nx-1,ny,1,ny,nz,1,nz-1, & wgtsx,isx,wgtvy,jvy,intrphopt, & temx1y1zb,nx1,1,nx1-1, ny1,1,ny1, temx1yz) DO i=1,nx1-1 DO j=1,ny1 k0=nz-2 DO k=nz1-1,1,-1 z0 = tem21(i,j,k) DO kk=k0,1,-1 IF(z0 >= temx1y1zb(i,j,kk)) THEN k0 = kk EXIT END IF END DO 1215 CONTINUE IF(intrpvopt == 1) kz(i,j,k)=MAX(1,MIN(k0,nz-2)) IF(intrpvopt == 2) kz(i,j,k)=MAX(2,MIN(k0,nz-2)) END DO END DO END DO IF( intrpvopt == 1) THEN DO i=1,nx1-1 DO j=1,ny1 DO k=1,nz1-1 wgtz(i,j,k,1)=(temx1y1zb(i,j,kz(i,j,k)+1)-tem21(i,j,k))/ & (temx1y1zb(i,j,kz(i,j,k)+1)-temx1y1zb(i,j,kz(i,j,k))) END DO END DO END DO ELSE DO i=1,nx1-1 DO j=1,ny1 DO k=1,nz1-1 d=tem21(i,j,k) a=temx1y1zb(i,j,kz(i,j,k)-1) b=temx1y1zb(i,j,kz(i,j,k)) c=temx1y1zb(i,j,kz(i,j,k)+1) wgtz(i,j,k,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtz(i,j,k,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtz(i,j,k,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END DO END DO END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! IF( nfile == 1) THEN IF(nfile == 1 .or. noutgrds > 0) THEN IF( redo_base_state == 0 ) THEN ! get base-state from original arrays CALL intrpxyz3d(vbar,nx,1,nx-1,ny,1,ny,nz,1,nz-1, & wgtsx,isx,wgtvy,jvy,wgtz,kz, & intrphopt,intrpvopt, & vbar1,nx1,1,nx1-1, ny1,1,ny1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO i=1,nx1-1 DO j=1,ny1 DO k=nz1-2,1,-1 IF(tem21(i,j,k) < temx1y1zb(i,j,2)) THEN ! below input grid ground IF(bglopt == 2) THEN vbar1(i,j,k)=temx1y1z(i,j,2) ELSE IF(bglopt == 3) THEN vbar1(i,j,k)=0.0 END IF END IF END DO END DO END DO ELSE IF( redo_base_state == 1 ) THEN ! reconstruct base-state from 1d soundings DO k=1,nz1-1 DO i=1,nx1-1 DO j=1,ny1 kk = MAX(1,MIN(lvlprof-1, & INT((tem21(i,j,k)-zsnd(2))/snddelz)+2)) IF(tem21(i,j,k) < zsnd(2)) kk = 1 tem = (tem21(i,j,k)-zsnd(kk))/(zsnd(kk+1)-zsnd(kk)) vbar1(i,j,k)= vbsnd(kk)+(vbsnd(kk+1)-vbsnd(kk))*tem END DO END DO END DO END IF END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght IF (ntagopt == 1) THEN ! adjust tem21 (heights) so that surface wind is ! same as input surface wind (by matching tem21 ! to the input height, temx1y1zb, near the surface). DO i=1,nx1-1 DO j=1,ny1 hght0 = tem21(i,j,2) dhght = hght0 - temx1y1zb(i,j,2) IF (dhght > 0) THEN DO k=1,nz1-1 fac = MAX(0., tem21(i,j,k) - hght0)/aghght IF (fac > 1) EXIT tem21(i,j,k) = fac*fac*tem21(i,j,k) & + (1.-fac*fac)*(tem21(i,j,k)-dhght) END DO ENDIF END DO END DO DO i=1,nx1-1 DO j=1,ny1 k0=nz-2 DO k=nz1-1,1,-1 z0 = tem21(i,j,k) DO kk=k0,1,-1 IF(z0 >= temx1y1zb(i,j,kk)) THEN k0 = kk EXIT END IF END DO IF(intrpvopt == 1) kz(i,j,k)=MAX(1,MIN(k0,nz-2)) IF(intrpvopt == 2) kz(i,j,k)=MAX(2,MIN(k0,nz-2)) END DO END DO END DO IF( intrpvopt == 1) THEN DO i=1,nx1-1 DO j=1,ny1 DO k=1,nz1-1 wgtz(i,j,k,1)=(temx1y1zb(i,j,kz(i,j,k)+1)-tem21(i,j,k))/ & (temx1y1zb(i,j,kz(i,j,k)+1)-temx1y1zb(i,j,kz(i,j,k))) END DO END DO END DO ELSE DO i=1,nx1-1 DO j=1,ny1 DO k=1,nz1-1 d=tem21(i,j,k) a=temx1y1zb(i,j,kz(i,j,k)-1) b=temx1y1zb(i,j,kz(i,j,k)) c=temx1y1zb(i,j,kz(i,j,k)+1) wgtz(i,j,k,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtz(i,j,k,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtz(i,j,k,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END DO END DO END IF END IF CALL intrpxyz3d(v,nx,1,nx-1,ny,1,ny,nz,1,nz-1, & wgtsx,isx,wgtvy,jvy,wgtz,kz, & intrphopt,intrpvopt, & v1,nx1,1,nx1-1, ny1,1,ny1,nz1,1,nz1-1, & temx1yz,temx1y1z) !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght IF( npoint_below_ground /= 0 ) THEN ! Set values below input grid ground DO i=1,nx1-1 DO j=1,ny1 DO k=nz1-2,1,-1 IF(tem21(i,j,k) < temx1y1zb(i,j,2)) THEN ! below input grid ground IF(bglopt == 2 .OR. bglopt == 4 .OR. bglopt == 5) THEN v1 (i,j,k)=temx1y1z(i,j,2) ELSE IF(bglopt == 3) THEN v1 (i,j,k)=misvalue END IF END IF END DO END DO END DO END IF ! !----------------------------------------------------------------------- ! ! Intepolate 3D arrays at w-point ! !----------------------------------------------------------------------- ! CALL intrpxy3d(zp,nx,1,nx-1,ny,1,ny-1,nz,1,nz, & wgtsx,isx,wgtsy,jsy,intrphopt, & temx1y1zb,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) !wdt update: use tem21 instead of zp1 below tem21 = zp1 !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght IF (ntagopt == 1) THEN ! adjust tem21 (heights) so that surface wind is ! same as input surface wind (by matching tem21 ! to the input height, temx1y1zb, near the surface). DO i=1,nx1-1 DO j=1,ny1-1 hght0 = tem21(i,j,2) dhght = hght0 - temx1y1zb(i,j,2) IF (dhght > 0) THEN DO k=1,nz1-1 fac = MAX(0., tem21(i,j,k) - hght0)/aghght IF (fac > 1) EXIT tem21(i,j,k) = fac*fac*tem21(i,j,k) & + (1.-fac*fac)*(tem21(i,j,k)-dhght) END DO ENDIF END DO END DO END IF DO i=1,nx1-1 DO j=1,ny1-1 k0 = nz-1 DO k=nz1,1,-1 z0 = tem21(i,j,k) DO kk=k0,1,-1 IF(z0 >= temx1y1zb(i,j,kk)) THEN k0 = kk EXIT END IF END DO 1315 CONTINUE IF(intrpvopt == 1) kz(i,j,k)=MAX(2,MIN(k0,nz-1)) IF(intrpvopt == 2) kz(i,j,k)=MAX(3,MIN(k0,nz-1)) END DO END DO END DO IF( intrpvopt == 1) THEN DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,nz1 wgtz(i,j,k,1)=(temx1y1zb(i,j,kz(i,j,k)+1)-tem21(i,j,k))/ & (temx1y1zb(i,j,kz(i,j,k)+1)-temx1y1zb(i,j,kz(i,j,k))) END DO END DO END DO ELSE DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,nz1 d=tem21(i,j,k) a=temx1y1zb(i,j,kz(i,j,k)-1) b=temx1y1zb(i,j,kz(i,j,k)) c=temx1y1zb(i,j,kz(i,j,k)+1) wgtz(i,j,k,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtz(i,j,k,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtz(i,j,k,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END DO END DO END IF CALL intrpxyz3d(w,nx,1,nx-1,ny,1,ny-1,nz,1,nz, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & w1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1, & temx1yz,temx1y1z) !wdt Copyright (c) 2001 Weather Decision Technologies, Inc.: ntagopt,aghght IF( npoint_below_ground /= 0 ) THEN ! Set values below input grid ground DO i=1,nx1-1 DO j=1,ny1-1 DO k=nz1-1,1,-1 IF(zp1(i,j,k) < temx1y1zb(i,j,2)) THEN ! Blow input grid ground IF(bglopt == 2 .OR. bglopt == 4 .OR. bglopt == 5) THEN w1(i,j,k)=temx1y1z(i,j,2) ELSE IF(bglopt == 3) THEN w1(i,j,k)=misvalue END IF END IF END DO END DO END DO END IF !----------------------------------------------------------------------- ! ! Interpolate 3D arrays at scalar point ! !----------------------------------------------------------------------- CALL avgz(zp1,0,nx1,ny1,nz1,1,nx1-1,1,ny1-1,1,nz1-1,tem21) CALL avgz(zp,0,nx,ny,nz,1,nx-1,1,ny-1,1,nz-1,tem2) CALL intrpxy3d(tem2,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,intrphopt, & temx1y1zb,nx1,1,nx1-1, ny1,1,ny1-1, temx1yz) DO i=1,nx1-1 DO j=1,ny1-1 htrnx1y1(i,j)=temx1y1zb(i,j,2) ! Old terrain on new grid at scalar level ! e.g., z of first grid level AGL. DO k=1,nz1-1 IF(tem21(i,j,k) >= htrnx1y1(i,j)) GO TO 1350 END DO 1350 CONTINUE ktrnx1y1(i,j)= k-1 ! The first scale-level below the first scale level ! above input grid ground END DO END DO DO i=1,nx1-1 DO j=1,ny1-1 k0=nz-2 DO k=nz1-1,1,-1 z0 = tem21(i,j,k) DO kk=k0,1,-1 IF(z0 >= temx1y1zb(i,j,kk) ) THEN k0 = kk EXIT END IF END DO 1415 CONTINUE IF(intrpvopt == 1) kz(i,j,k)=MAX(1,MIN(k0,nz-2)) IF(intrpvopt == 2) kz(i,j,k)=MAX(2,MIN(k0,nz-2)) END DO END DO END DO IF( intrpvopt == 1) THEN DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,nz1-1 wgtz(i,j,k,1)=(temx1y1zb(i,j,kz(i,j,k)+1)-tem21(i,j,k))/ & (temx1y1zb(i,j,kz(i,j,k)+1)-temx1y1zb(i,j,kz(i,j,k))) END DO END DO END DO ELSE DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,nz1-1 d=tem21(i,j,k) a=temx1y1zb(i,j,kz(i,j,k)-1) b=temx1y1zb(i,j,kz(i,j,k)) c=temx1y1zb(i,j,kz(i,j,k)+1) wgtz(i,j,k,1)= (d-b)*(d-c)/((a-b)*(a-c)) wgtz(i,j,k,2)= (d-a)*(d-c)/((b-a)*(b-c)) wgtz(i,j,k,3)= (d-a)*(d-b)/((c-a)*(c-b)) END DO END DO END DO END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! IF( nfile == 1) THEN IF(nfile == 1 .or. noutgrds > 0) THEN IF( redo_base_state == 0) THEN ! Get base-state from original arrays DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem1(i,j,k)=ALOG(pbar(i,j,k)) END DO END DO END DO CALL intrpxyz3d(tem1,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & pbar1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO k=1,nz1-1 DO j=1,ny1-1 DO i=1,nx1-1 pbar1(i,j,k)=EXP(pbar1(i,j,k)) END DO END DO END DO DO i=1,nx1-1 DO j=1,ny1-1 pbsfc(i,j)= EXP(temx1y1z(i,j,2)) END DO END DO CALL intrpxyz3d(ptbar,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & ptbar1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO i=1,nx1-1 DO j=1,ny1-1 ptbsfc(i,j)= temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(qvbar,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qvbar1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO i=1,nx1-1 DO j=1,ny1-1 qvbsfc(i,j)= temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(rhobar,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & rhobar1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) ELSE IF( redo_base_state == 1 ) THEN ! reconstruct base-state from 1d soundings DO k=1,nz1-1 DO i=1,nx1-1 DO j=1,ny1-1 kk = MAX(1,MIN(lvlprof-1, & INT((tem21(i,j,k)-zsnd(2))/snddelz)+2)) IF(tem21(i,j,k) < zsnd(2)) kk = 1 tem = (tem21(i,j,k)-zsnd(kk))/(zsnd(kk+1)-zsnd(kk)) ptbar1(i,j,k)= ptsnd(kk)+(ptsnd(kk+1)-ptsnd(kk))*tem qvbar1(i,j,k)= qvsnd(kk)+(qvsnd(kk+1)-qvsnd(kk))*tem tema = ALOG(psnd (kk) ) pbar1 (i,j,k)=EXP(tema+(ALOG(psnd(kk+1))-tema)*tem) rhobar1(i,j,k)=pbar1(i,j,k)/ & (rd*ptbar1(i,j,k)*(pbar1(i,j,k)/p0)**rddcp) END DO END DO END DO DO i=1,nx1-1 DO j=1,ny1-1 kk= MAX(1,MIN(lvlprof-1, & INT((htrnx1y1(i,j)-zsnd(2))/snddelz)+2)) IF(htrnx1y1(i,j) < zsnd(2)) k = 1 tem = (htrnx1y1(i,j)-zsnd(kk))/(zsnd(kk+1)-zsnd(kk)) ptbsfc(i,j)= ptsnd(kk)+(ptsnd(kk+1)-ptsnd(kk))*tem qvbsfc(i,j)= qvsnd(kk)+(qvsnd(kk+1)-qvsnd(kk))*tem pbsfc (i,j)= EXP(ALOG(psnd (kk))+ & (ALOG(psnd (kk+1))-ALOG(psnd (kk)))*tem) END DO END DO END IF END IF DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem2(i,j,k)=ALOG(pbar(i,j,k)+pprt(i,j,k)) END DO END DO END DO CALL intrpxyz3d(tem2,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & pprt1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO k=1,nz1-1 DO j=1,ny1-1 DO i=1,nx1-1 pprt1(i,j,k)=EXP(pprt1(i,j,k))-pbar1(i,j,k) END DO END DO END DO DO j=1,ny1-1 DO i=1,nx1-1 ppsfc(i,j)=EXP(temx1y1z(i,j,2))-pbsfc(i,j) END DO END DO IF ( redo_base_state == 1 ) THEN DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 tem2(i,j,k)=ptprt(i,j,k)+ptbar(i,j,k) END DO END DO END DO CALL intrpxyz3d(tem2,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & ptprt1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 ptpsfc(i,j)=temx1y1z(i,j,2)-ptbsfc(i,j) END DO END DO DO k=1,nz1-1 DO j=1,ny1-1 DO i=1,nx1-1 ptprt1(i,j,k)=ptprt1(i,j,k)-ptbar1(i,j,k) END DO END DO END DO ELSE CALL intrpxyz3d(ptprt,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & ptprt1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 ptpsfc(i,j)=temx1y1z(i,j,2) END DO END DO END IF CALL intrpxyz3d(qv,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qv1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 qvsfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(qc,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qc1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 qcsfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(qr,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qr1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 qrsfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(qi,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qi1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 qisfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(qs,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qs1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 qssfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(qh,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & qh1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 qhsfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(tke,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & tke1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 tkesfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(kmh,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & kmh1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 kmhsfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(kmv,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & kmv1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 kmvsfc(i,j)=temx1y1z(i,j,2) END DO END DO CALL intrpxyz3d(radfrc,nx,1,nx-1,ny,1,ny-1,nz,1,nz-1, & wgtsx,isx,wgtsy,jsy,wgtz,kz, & intrphopt,intrpvopt, & radfrc1,nx1,1,nx1-1, ny1,1,ny1-1,nz1,1,nz1-1, & temx1yz,temx1y1z) DO j=1,ny1-1 DO i=1,nx1-1 radsfc(i,j)=temx1y1z(i,j,2) END DO END DO ! ! Reset extrapolated values below ground for certain options ! IF( npoint_below_ground /= 0 ) THEN ! Set values below input grid ground IF( bglopt == 2 ) THEN ! Constant extension below ground DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,ktrnx1y1(i,j) ! only below ground ptprt1(i,j,k) = ptpsfc(i,j) pprt1 (i,j,k) = ppsfc (i,j) qv1 (i,j,k) = qvsfc (i,j) qc1 (i,j,k) = qcsfc (i,j) qr1 (i,j,k) = qrsfc (i,j) qi1 (i,j,k) = qisfc (i,j) qs1 (i,j,k) = qssfc (i,j) qh1 (i,j,k) = qhsfc (i,j) tke1 (i,j,k) = tkesfc(i,j) kmh1 (i,j,k) = kmhsfc(i,j) kmv1 (i,j,k) = kmhsfc(i,j) qvbar1(i,j,k) = qvbsfc(i,j) ptbar1(i,j,k) = ptbsfc(i,j) pbar1 (i,j,k) = pbsfc (i,j) rhobar1(i,j,k)= pbsfc(i,j)/ & (rd*ptbsfc(i,j)*(pbsfc(i,j)/p0)**rddcp) radfrc1(i,j,k)= radsfc(i,j) END DO END DO END DO ELSE IF( bglopt == 3 ) THEN ! Set to a missing value DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,ktrnx1y1(i,j) ! only below ground ptprt1(i,j,k) = misvalue pprt1 (i,j,k) = misvalue qvbar1(i,j,k) = 0.0 qv1 (i,j,k) = misvalue qc1 (i,j,k) = misvalue qr1 (i,j,k) = misvalue qi1 (i,j,k) = misvalue qs1 (i,j,k) = misvalue qh1 (i,j,k) = misvalue tke1 (i,j,k) = misvalue kmh1 (i,j,k) = misvalue kmv1 (i,j,k) = misvalue ptbar1(i,j,k) = 0.0 pbar1 (i,j,k) = 0.0 rhobar1(i,j,k)= misvalue radfrc1(i,j,k)= misvalue END DO END DO END DO ! ELSE IF( bglopt == 4 .OR. bglopt == 5) THEN ! Using a constant lapse rate for temperature ! and then the hydrostatic balance for pressure DO i=1,nx1-1 DO j=1,ny1-1 DO k=1,ktrnx1y1(i,j) ! only below ground qv1 (i,j,k) = qvsfc (i,j) qc1 (i,j,k) = qcsfc (i,j) qr1 (i,j,k) = qrsfc (i,j) qi1 (i,j,k) = qisfc (i,j) qs1 (i,j,k) = qssfc (i,j) qh1 (i,j,k) = qhsfc (i,j) tke1 (i,j,k) = tkesfc(i,j) kmh1 (i,j,k) = kmhsfc(i,j) kmv1 (i,j,k) = kmhsfc(i,j) radfrc1(i,j,k)= radsfc(i,j) ! ptprt1(i,j,k) = ptpsfc(i,j) ! pprt1 (i,j,k) = ppsfc (i,j) qvbar1(i,j,k) = qvbsfc(i,j) END DO END DO END DO IF( redo_base_state == 1 ) THEN ! There are points below ground dtdz = -0.0068 ! Minus lapse rate DO i=1,nx1-1 DO j=1,ny1-1 k=ktrnx1y1(i,j) ! First level below input grid ground IF( k >= 1) THEN delz = tem21(i,j,k)-htrnx1y1(i,j) ttotk1 = (ptbsfc(i,j)+ptpsfc(i,j)) * & ((pbsfc (i,j)+ppsfc (i,j))/p0)**rddcp ttotk = ttotk1+dtdz*delz lnptot = ALOG(pbsfc (i,j)+ppsfc (i,j)) & -g*2.0*delz/(rd*(ttotk1+ttotk)) pprt1(i,j,k) = EXP(lnptot)-pbar1(i,j,k) ptprt1(i,j,k)= ttotk*(p0/(pbar1(i,j,k)+pprt1(i,j,k))) & **rddcp-ptbar1(i,j,k) END IF DO k=ktrnx1y1(i,j)-1,1,-1 ! other below-ground levels delz = tem21(i,j,k)-tem21(i,j,k+1) ttotk1 = (ptbar1(i,j,k+1)+ptprt1(i,j,k+1)) * & ((pbar1 (i,j,k+1)+pprt1 (i,j,k+1))/p0)**rddcp ttotk = ttotk1+dtdz*delz lnptot = ALOG(pbar1(i,j,k+1)+pprt1(i,j,k+1)) & -g*2.0*delz/(rd*(ttotk1+ttotk)) pprt1(i,j,k) = EXP(lnptot)-pbar1(i,j,k) ptprt1(i,j,k)= ttotk*(p0/(pbar1(i,j,k)+pprt1(i,j,k))) & **rddcp-ptbar1(i,j,k) END DO END DO END DO END IF END IF END IF ! Check on npoint_below_ground 800 CONTINUE xgrdorg = xorig1 ygrdorg = yorig1 CALL xytoll(1,1,xgrdorg,ygrdorg,origlat,origlon) CALL setorig( 2, origlat, origlon) ! set up the model origin on new grid !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! IF( nfile == 1) THEN IF(nfile == 1 .or. noutgrds > 0) THEN !wdt update DO i=1,nx1 x1_out(i) = x1(i)-xgrdorg END DO !wdt update DO j=1,ny1 y1_out(j) = y1(j)-ygrdorg END DO WRITE (*,*) "ctrlat & ctrlon:",ctrlat1,ctrlon1 !wdt update: code block moved here !wdt begin block WRITE(6,'(/2x,a)')'For the output grid:' WRITE(6,'(2x,a,f15.7)') & 'The latitude of the output grid center, ctrlat1=',ctrlat1 WRITE(6,'(2x,a,f15.7/)') & 'The longitude of the output grid center, ctrlon1=',ctrlon1 WRITE(6,'(2x,a,f15.7)') & 'The x coordinate of the output grid center, xctr1=',xctr1 WRITE(6,'(2x,a,f15.7)') & 'The y coordinate of the output grid center, yctr1=',yctr1 IF( ABS(xctr1-xctr1_old) > 0.0001*dx .OR. & ABS(yctr1-yctr1_old) > 0.0001*dy ) THEN WRITE(6,'(/1x,a/)') & '################################################################' WRITE(6,'(/2x,a/2x,a)') & 'Note that xctr1 and/or yctr1 had been changed by the program', & 'due to snap_to_grid option. Check earlier messages.' WRITE(6,'(/1x,a/)') & '################################################################' END IF WRITE(6,'(/2x,a/2x,a,2f15.7,a)') & 'The SW corner (i,j)=(2,2) of the grid is located at ', & '(',xgrdorg,ygrdorg,') of the input grid.' !wdt begin block END IF !----------------------------------------------------------------------- ! ! Copy grid information to the common block variables so that output ! routines have the correct values for the new grid. ! !----------------------------------------------------------------------- !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ! save global setting before setting them to new grid values ctrlat_sv = ctrlat ctrlon_sv = ctrlon latitud_sv = latitud dx_sv = dx dy_sv = dy dz_sv = dz dzmin_sv = dzmin strhopt_sv = strhopt zrefsfc_sv = zrefsfc dlayer1_sv = dlayer1 dlayer2_sv = dlayer2 zflat_sv = zflat strhtune_sv = strhtune nstyp_sv = nstyp ctrlat = ctrlat1 ctrlon = ctrlon1 latitud = ctrlat dx = dx1 dy = dy1 dz = dz1 dzmin = dzmin1 strhopt = strhopt1 zrefsfc = zrefsfc1 dlayer1 = dlayer11 dlayer2 = dlayer21 zflat = zflat1 strhtune = strhtune1 nstyp = nstyp1 WRITE (cmnt(nocmnt),'(a,i4,a,i4,a,i4)') & ' nx =',nx1,', ny =',ny1,', nz =',nz1 ! !----------------------------------------------------------------------- ! ! Print out the max/min of output varaibles. ! !----------------------------------------------------------------------- ! WRITE(6,'(/1x,a/)') & 'Min. and max. of input data interpolated to the new grid:' !wdt update CALL a3dmax0(x1_out,1,nx1,1,nx1,1,1,1,1,1,1,1,1, amax,amin) WRITE(6,'(/1x,2(a,e13.6))') 'xmin = ', amin,', xmax =',amax !wdt update CALL a3dmax0(y1_out,1,ny1,1,ny1,1,1,1,1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ymin = ', amin,', ymax =',amax CALL a3dmax0(z1,1,nz1,1,nz1,1,1,1,1,1,1,1,1, amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'zmin = ', amin,', zmax =',amax CALL a3dmax0(zp1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'zpmin = ', amin,', zpmax =',amax CALL a3dmax0(ubar1,1,nx1,1,nx1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ubarmin = ', amin,', ubarmax =',amax CALL a3dmax0(vbar1,1,nx1,1,nx1-1,1,ny1,1,ny1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'vbarmin = ', amin,', vbarmax =',amax CALL a3dmax0(ptbar1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ptbarmin= ', amin,', ptbarmax=',amax CALL a3dmax0(pbar1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'pbarmin = ', amin,', pbarmax =',amax CALL a3dmax0(rhobar1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'rhobarmin=', amin,', rhobarmax=',amax CALL a3dmax0(qvbar1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qvbarmin= ', amin,', qvbarmax=',amax CALL a3dmax0(u1,1,nx1,1,nx1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'umin = ', amin,', umax =',amax CALL a3dmax0(v1,1,nx1,1,nx1-1,1,ny1,1,ny1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'vmin = ', amin,', vmax =',amax CALL a3dmax0(w1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'wmin = ', amin,', wmax =',amax CALL a3dmax0(ptprt1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ptprtmin= ', amin,', ptprtmax=',amax CALL a3dmax0(pprt1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'pprtmin = ', amin,', pprtmax =',amax CALL a3dmax0(qv1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qvmin = ', amin,', qvmax =',amax CALL a3dmax0(qc1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qcmin = ', amin,', qcmax =',amax CALL a3dmax0(qr1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qrmin = ', amin,', qrmax =',amax CALL a3dmax0(qi1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qimin = ', amin,', qimax =',amax CALL a3dmax0(qs1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qsmin = ', amin,', qsmax =',amax CALL a3dmax0(qh1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qhmin = ', amin,', qhmax =',amax CALL a3dmax0(tke1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'tkemin = ', amin,', tkemax =',amax CALL a3dmax0(kmh1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'kmhmin = ', amin,', kmhmax =',amax CALL a3dmax0(kmv1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'kmvmin = ', amin,', kmvmax =',amax CALL a3dmax0(raing1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'raingmin= ', amin,', raingmax=',amax CALL a3dmax0(rainc1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'raincmin= ', amin,', raincmax=',amax CALL a3dmax0(prcrate1(1,1,1),1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'prcr1min= ', amin,', prcr1max=',amax CALL a3dmax0(prcrate1(1,1,2),1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'prcr2min= ', amin,', prcr2max=',amax CALL a3dmax0(prcrate1(1,1,3),1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'prcr3min= ', amin,', prcr3max=',amax CALL a3dmax0(prcrate1(1,1,4),1,nx1,1,nx1-1,1,ny1,1,ny1-1, & 1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'prcr4min= ', amin,', prcr4max=',amax DO iss = 0, nstyp1 CALL a3dmax0(tsfc1(1,1,iss),1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6),a,i3)') & 'tsfcmin = ', amin,', tsfcmax =',amax,' for soil type=',iss CALL a3dmax0(tsoil1(1,1,iss),1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6),a,i3)') & 'tsoilmin= ', amin,', tsoilmax=',amax,' for soil type=',iss CALL a3dmax0(wetsfc1(1,1,iss),1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6),a,i3)') & 'wetsmin = ', amin,', wetsmax =',amax,' for soil type=',iss CALL a3dmax0(wetdp1(1,1,iss),1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6),a,i3)') & 'wetdmin = ', amin,', wetdmax =',amax,' for soil type=',iss CALL a3dmax0(wetcanp1(1,1,iss), & 1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1,amax,amin) WRITE(6,'(1x,2(a,e13.6),a,i3)') & 'wetcmin = ', amin,', wetcmax =',amax,' for soil type=',iss END DO CALL a3dmax0(roufns1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'roufnmin= ', amin,', roufnmax =',amax CALL a3dmax0(veg1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'vegmin = ', amin,', vegmax =',amax CALL a3dmax0(radfrc1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,nz1,1,nz1-1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'radfnmin= ', amin,', radfnmax =',amax CALL a3dmax0(radsw1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'radswmin= ', amin,', radswmax =',amax CALL a3dmax0(rnflx1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'rnflxmin= ', amin,', rnflxmax =',amax CALL a3dmax0(usflx1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'usflxmin= ', amin,', usflxmax =',amax CALL a3dmax0(vsflx1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'vsflxmin= ', amin,', vsflxmax =',amax CALL a3dmax0(ptsflx1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'ptflxmin= ', amin,', ptflxmax =',amax CALL a3dmax0(qvsflx1,1,nx1,1,nx1-1,1,ny1,1,ny1-1,1,1,1,1, & amax,amin) WRITE(6,'(1x,2(a,e13.6))') 'qvflxmin= ', amin,', qvflxmax =',amax tem11= 0.0 ! To be put in place of wbar ! !----------------------------------------------------------------------- ! ! Data dump of the model grid and base state arrays: ! ! First find a unique name basdmpfn(1:lbasdmpf) for the grid and ! base state array dump file ! ! If grid/base state data has been written out once, skip ! the following writing block. Also no need to write out ! separate data for Savi3D dump. The same for GrADS dump. ! !----------------------------------------------------------------------- ! runname = new_runname !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids IF (noutgrds > 0) THEN runname = name_grd(ng) ENDIF CALL gtlfnkey(runname, lfnkey) IF(houtfmt /= 9 ) THEN !wdt update IF( nfile > 1 ) GO TO 300 ! If done already, skip this part. CALL gtbasfn(runname(1:lfnkey),dirname,ldirnam,hdmpfmt, & 1,0,basdmpfn,lbasdmpf) PRINT* PRINT*,'Output grid/base state file is ', basdmpfn(1:lbasdmpf) grdbas = 1 ! Dump out grd and base state arrays only !wdt update CALL setcornerll( nx1,ny1,x1_out,y1_out ) !wdt update CALL dtadump(nx1,ny1,nz1,nstyp1,hdmpfmt,nchout, & basdmpfn(1:lbasdmpf),grdbas,filcmprs, & u1,v1,w1,ptprt1,pprt1,qv1,qc1,qr1,qi1,qs1,qh1, & tke1,kmh1,kmv1, & ubar1,vbar1,tem11,ptbar1,pbar1,rhobar1,qvbar1, & x1_out,y1_out,z1,zp1,hterain1,j11,j21,j31, & soiltyp1,stypfrct1,vegtyp1,lai1,roufns1,veg1, & tsfc1,tsoil1,wetsfc1,wetdp1,wetcanp1,snowdpth1, & raing1,rainc1,prcrate1, & radfrc1,radsw1,rnflx1, & usflx1,vsflx1,ptsflx1,qvsflx1, & tem21,wgtz,kz) !wdt update - removed gboutcnt 300 CONTINUE END IF ! !----------------------------------------------------------------------- ! ! Then the time dependent fields: ! !----------------------------------------------------------------------- ! IF( .NOT. (houtfmt == 9 .AND. vroutcnt == 1) ) THEN ! !----------------------------------------------------------------------- ! ! Reconstruct the file name using the specified directory name ! !----------------------------------------------------------------------- ! CALL gtdmpfn(runname(1:lfnkey),dirname, & ldirnam,curtim,hdmpfmt,1,0, hdmpfn, ldmpf) END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. IF ( exbcdmp == 4 ) rayklow = -1 WRITE(6,'(a,a)') 'Writing t-dependent variable history dump ', & hdmpfn(1:ldmpf) grdbas = 0 !wdt update CALL dtadump(nx1,ny1,nz1,nstyp1,hdmpfmt,nchout, & hdmpfn(1:ldmpf),grdbas,filcmprs, & u1,v1,w1,ptprt1,pprt1,qv1,qc1,qr1,qi1,qs1,qh1, & tke1,kmh1,kmv1, & ubar1,vbar1,tem11,ptbar1,pbar1,rhobar1,qvbar1, & x1_out,y1_out,z1,zp1,hterain1,j11,j21,j31, & soiltyp1,stypfrct1,vegtyp1,lai1,roufns1,veg1, & tsfc1,tsoil1,wetsfc1,wetdp1,wetcanp1,snowdpth1, & raing1,rainc1,prcrate1, & radfrc1,radsw1,rnflx1, & usflx1,vsflx1,ptsflx1,qvsflx1, & tem21,wgtz,kz) ! !----------------------------------------------------------------------- ! ! Write out soil model variable file ! !----------------------------------------------------------------------- ! IF (sfcin == 1 .AND. soildmp > 0) THEN CALL cvttsnd( curtim, timsnd, tmstrln ) soiloutfl = runname(1:lfnkey)//".soilvar."//timsnd(1:tmstrln) lfn = lfnkey + 9 + tmstrln IF( dirname /= ' ' ) THEN temchar = soiloutfl soiloutfl = dirname(1:ldirnam)//'/'//temchar lfn = lfn + ldirnam + 1 END IF CALL fnversn(soiloutfl, lfn) PRINT *, 'Write soil initial data to ',soiloutfl(1:lfn) CALL wrtsoil(nx1,ny1,nstyp1, soiloutfl(1:lfn), dx1,dy1, & mapproj,trulat1,trulat2,trulon,sclfct, & ctrlat1,ctrlon1, & 1,1,1,1,1,1, & tsfc1,tsoil1,wetsfc1,wetdp1,wetcanp1,snowdpth1,soiltyp1) !wdt update IF (soildmp == 1) CALL soilcntl(nx1,ny1, soiloutfl(1:lfn), & 1,1,1,1,1,1, x1_out,y1_out) END IF ! sfcin.eq.1 IF(nfile == 1) THEN ! Need to do this only once ! !----------------------------------------------------------------------- ! ! Write out terrain data ! !----------------------------------------------------------------------- ! IF (terndmp > 0) THEN CALL getunit( nunit ) ternfn = runname(1:lfnkey)//".trndata" lternfn = lfnkey + 8 IF( dirname /= ' ' ) THEN temchar = ternfn ternfn = dirname(1:ldirnam)//'/'//temchar lternfn = lternfn + ldirnam + 1 END IF CALL fnversn(ternfn, lternfn ) PRINT *, 'Write terrain data to ',ternfn(1:lternfn) CALL writtrn(nx1,ny1,ternfn(1:lternfn), dx1,dy1, & mapproj,trulat1,trulat2,trulon,sclfct, & ctrlat1,ctrlon1,hterain1) !wdt update IF (terndmp == 1) & CALL trncntl(nx1,ny1,ternfn(1:lternfn), x1_out,y1_out) END IF !----------------------------------------------------------------------- ! ! Write out surface property data file: sfcoutfl . ! !----------------------------------------------------------------------- ! IF (landin == 1 .AND. sfcdmp > 0) THEN sfcoutfl = runname(1:lfnkey)//".sfcdata" lfn = lfnkey + 8 IF( dirname /= ' ' ) THEN temchar = sfcoutfl sfcoutfl = dirname(1:ldirnam)//'/'//temchar lfn = lfn + ldirnam + 1 END IF CALL fnversn(sfcoutfl, lfn) PRINT *, 'Write surface property data in ',sfcoutfl(1:lfn) CALL wrtsfcdt(nx1,ny1,nstyp1,sfcoutfl(1:lfn), dx1,dy1, & mapproj,trulat1,trulat2,trulon,sclfct, & ctrlat1,ctrlon1, & 1,1,1,1,1,0, & soiltyp1,stypfrct1,vegtyp1,lai1,roufns1,veg1,veg1) !wdt udpate IF (sfcdmp == 1) CALL sfccntl(nx1,ny1, sfcoutfl(1:lfn), & 1,1,1,1,1,0, x1_out,y1_out) END IF ! landin.eq.1 END IF !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids ctrlat = ctrlat_sv ctrlon = ctrlon_sv latitud = latitud_sv dx = dx_sv dy = dy_sv dz = dz_sv dzmin = dzmin_sv strhopt = strhopt_sv zrefsfc = zrefsfc_sv dlayer1 = dlayer1_sv dlayer2 = dlayer2_sv zflat = zflat_sv strhtune = strhtune_sv nstyp = nstyp_sv !wdt Copyright (c) 2001 Weather Decision Technologies, Inc. !wdt 2001-10-26 GMB multiple output grids 600 CONTINUE !wdt IF (noutgrds > 0 .and. ng < noutgrds) GOTO 500 vroutcnt = 1 ! Variables have been written out at least once IF (hinfmt == 9) GO TO 102 END DO 9001 CONTINUE !wdt update: moved code block to above WRITE (6,'(/a,g13.3,a)') "Current memory allocation=", & current_memory_use,' (Mw).' WRITE (6,'(a,g13.3,a/)') "Maxumum memory allocation=", & max_memory_use,' (Mw).' cpu_time = f_cputime() - cpu0 PRINT*,'Total CPU time used =', cpu_time,' (s).' STOP 9002 CONTINUE WRITE(6,'(1x,a,i2,/1x,a)') & 'Data read was unsuccessful. ireturn =', ireturn, & 'Job stopped in ARPSINTRP.' STOP 9002 END PROGRAM arpsintrp SUBROUTINE intrpx3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, wgtx,ix, & 1 intrphopt,aout,nx1,is1,ie1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Perform interpolation in the first dimension ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/1/1999. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke INTEGER :: nx1,is1,ie1 REAL :: ain (nx ,ny,nz) REAL :: aout(nx1,ny,nz) REAL :: wgtx(nx1,3) INTEGER :: ix(nx1) INTEGER :: intrphopt INTEGER :: i,j,k IF(intrphopt == 1) THEN DO k=ks ,ke DO j=js ,je DO i=is1,ie1 aout(i,j,k)= wgtx(i,1) *ain(ix(i) ,j,k) & +(1.0-wgtx(i,1))*ain(ix(i)+1,j,k) END DO END DO END DO ELSE DO k=ks ,ke DO j=js ,je DO i=is1,ie1 aout(i,j,k)=wgtx(i,1)*ain(ix(i)-1,j,k) & +wgtx(i,2)*ain(ix(i) ,j,k) & +wgtx(i,3)*ain(ix(i)+1,j,k) END DO END DO END DO END IF RETURN END SUBROUTINE intrpx3d SUBROUTINE intrpy3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, wgty,jy, & 1 intrphopt,aout,ny1,js1,je1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Perform interpolation in the second dimension ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/1/1999. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke INTEGER :: ny1,js1,je1 REAL :: ain (nx,ny ,nz) REAL :: aout(nx,ny1,nz) REAL :: wgty(ny1,3) INTEGER :: jy(ny1) INTEGER :: intrphopt INTEGER :: i,j,k IF(intrphopt == 1) THEN DO k=ks ,ke DO j=js1,je1 DO i=is ,ie aout(i,j,k)= wgty(j,1) *ain(i,jy(j) ,k) & +(1.0-wgty(j,1))*ain(i,jy(j)+1,k) END DO END DO END DO ELSE DO k=ks ,ke DO j=js1,je1 DO i=is ,ie aout(i,j,k)=wgty(j,1)*ain(i,jy(j)-1,k) & +wgty(j,2)*ain(i,jy(j) ,k) & +wgty(j,3)*ain(i,jy(j)+1,k) END DO END DO END DO END IF RETURN END SUBROUTINE intrpy3d SUBROUTINE intrpz3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, wgtz,kz, & 1 intrpvopt,aout,nz1,ks1,ke1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Perform interpolation in the third dimension ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/1/1999. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke INTEGER :: nz1,ks1,ke1 REAL :: ain (nx,ny,nz) REAL :: aout(nx,ny,nz1) REAL :: wgtz(nx,ny,nz1,3) INTEGER :: kz(nx,ny,nz1) INTEGER :: intrpvopt INTEGER :: i,j,k IF(intrpvopt == 1) THEN DO k=ks1,ke1 DO i=is ,ie DO j=js ,je aout(i,j,k)= wgtz(i,j,k,1) *ain(i,j,kz(i,j,k) ) & +(1.0-wgtz(i,j,k,1))*ain(i,j,kz(i,j,k)+1) END DO END DO END DO ELSE DO k=ks1,ke1 DO i=is ,ie DO j=js ,je aout(i,j,k)=wgtz(i,j,k,1)*ain(i,j,kz(i,j,k)-1) & +wgtz(i,j,k,2)*ain(i,j,kz(i,j,k) ) & +wgtz(i,j,k,3)*ain(i,j,kz(i,j,k)+1) END DO END DO END DO END IF RETURN END SUBROUTINE intrpz3d SUBROUTINE intrpxy3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, & 20,2 wgtx,ix,wgty,jy,intrphopt, & aout,nx1,is1,ie1, ny1,js1,je1, & temx1yz) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Perform interpolation in the first and second dimensions ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/1/1999. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke INTEGER :: nx1,is1,ie1, ny1,js1,je1 REAL :: ain (nx ,ny ,nz) REAL :: aout(nx1,ny1,nz) REAL :: wgtx(nx1,3),wgty(ny1,3) INTEGER :: ix(nx1),jy(ny1) INTEGER :: intrphopt REAL :: temx1yz(nx1,ny,nz) CALL intrpx3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, & wgtx,ix,intrphopt, temx1yz,nx1,is1,ie1) CALL intrpy3d(temx1yz,nx1,is1,ie1, ny,js,je, nz,ks,ke, & wgty,jy,intrphopt, aout, ny1,js1,je1) RETURN END SUBROUTINE intrpxy3d SUBROUTINE intrpxyz3d(ain,nx,is,ie, ny,js,je, nz,ks,ke, & 22,2 wgtx,ix,wgty,jy,wgtz,kz, & intrphopt,intrpvopt, & aout,nx1,is1,ie1, ny1,js1,je1, nz1,ks1,ke1, & temx1yz,temx1y1z) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! Perform interpolation in all three dimensions ! !----------------------------------------------------------------------- ! ! AUTHOR: Ming Xue ! 4/1/1999. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,is,ie, ny,js,je, nz,ks,ke INTEGER :: nx1,is1,ie1, ny1,js1,je1, nz1,ks1,ke1 REAL :: ain (nx ,ny ,nz) REAL :: aout(nx1,ny1,nz1) REAL :: wgtx(nx1,3),wgty(ny1,3),wgtz(nx1,ny1,nz1,3) INTEGER :: ix(nx1),jy(ny1),kz(nx1,ny1,nz1) INTEGER :: intrphopt INTEGER :: intrpvopt REAL :: temx1yz (nx1,ny ,nz) REAL :: temx1y1z(nx1,ny1,nz) CALL intrpxy3d(ain, nx,is,ie, ny,js,je, nz,ks,ke, & wgtx,ix,wgty,jy,intrphopt, & temx1y1z, nx1,is1,ie1, ny1,js1,je1, temx1yz) CALL intrpz3d (temx1y1z, nx1,is1,ie1, ny1,js1,je1, nz,ks,ke, & wgtz,kz,intrpvopt, & aout, nz1,ks1,ke1) RETURN END SUBROUTINE intrpxyz3d