! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SOILDIAG ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE soildiag(nx,ny,nzsoil,x,y,zpsoil, & 1,2 soiltyp,vegtyp,lai,roufns,veg,hterain, & tsoil,qsoil,wetcanp, qvsfc, & usflx,vsflx,ptsflx,qvsflx, & windsp,psfc,rhoa,precip, & tair,qvair, & cdha,cdqa,cdma, & radsw, rnflx, & shflx,lhflx,gflx,ct, & evaprg,evaprtr,evaprr, qvsat, & qvsata,f34,tem1soil) ! !------------------------------------------------------------------ ! ! PURPOSE: ! ! Calculate and print out diagnostics for the surface processes. ! !----------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 08/02/94 ! ! MODIFICATION HISTORY: ! ! 10/31/94 (Y. Liu) ! Re-wrote the subroputine to make it more general. ! ! 02/07/1995 (Yuhe Liu) ! Added a new 2-D array, veg(nx,ny), to the diagnostic printing list ! ! 03/27/1995 (Yuhe Liu) ! Changed the solor radiation used in the calculation of surface ! resistence factor F1 from the one at the top of atmosphere to the ! one at the surface. ! ! 03/27/1995 (Yuhe Liu) ! Added the surface resistence into the data dumping. ! ! 05/14/2002 (J. Brotzge) ! Added new variables/modified call statements to allow for multiple ! soil schemes ! !----------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nzsoil Number of grid points in the soil ! ! soiltyp Soil type at the horizontal grid points ! vegtyp Vegetation type at the horizontal grid points ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! hterain The height of surface terrain ! zpsoil Depth of soil (m) ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy water amount ! windsp Wind speed just above the surface (m/s) ! ! usflx Surface flux of u-momentum ! vsflx Surface flux of v-momentum ! ptsflx Surface flux of heat (K*kg/(m**2*s)) ! qvsflx Surface flux of moisture (K*kg/(m**2*s)) ! ! psfc Surface pressure (Pascal) ! rhoa Near sfc air density ! prcpln Precipitation path length ! tair Air temperature (K) near the surface ! qvair S.H. near the surface ! cdha Surface drag coefficient for heat ! cdqa Surface drag coefficient for moisture ! cdma Surface drag coefficient for momentum ! zenith Zenith ! radsw Solar radiation at the top of atmosphere ! f34 Input coefficient: f3*f4, output surface resistance ! ! OUTPUT: ! ! rnflx Net radiation flus ! shflx Sensible heat flux ! lhflx Latent heat flux ! gflx Diffusive heat flux from ground surface to deep soil ! rsw Net short wave radiation to the surface ! rlwu Up-ward long wave radiation flux ! rlwd Down-ward long wave radiation flux ! trwv Transmisivity due to water vapor ! trsw Total transmisivity ! alfz Zenith dependent albedo ! alf Albedo ! ct Thermal capacity ! f34 Surface resistence ! qvsat Surface specific humidity at saturation ! evaprg Evaporation from groud surface ! evaprtr Transpiration of the remaining part (1-delta) of leaves ! evaprr Direct evaporation from the fraction delta ! ! WORK ARRAY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny INTEGER :: nzsoil REAL :: x(nx) ! X-coordinates REAL :: y(ny) ! Y-coordinates REAL :: zpsoil (nx,ny,nzsoil) ! Depth of soil INTEGER :: soiltyp(nx,ny) ! Soil type at the horizontal grid points INTEGER :: vegtyp (nx,ny) ! Vegetation type at the horizontal grid points REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: hterain(nx,ny) ! The height of surface terrain REAL :: tsoil (nx,ny,nzsoil) ! Soil temperature (K) REAL :: qsoil (nx,ny,nzsoil) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny) ! Canopy water amount REAL :: qvsfc (nx,ny) ! Effective S.H. at sfc. REAL :: usflx (nx,ny) ! surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx (nx,ny) ! surface flux of heat (K*kg/(m**2*s)) REAL :: qvsflx (nx,ny) ! surface flux of moisture (kg/(m**2*s)) REAL :: windsp (nx,ny) ! Wind speed just above the surface (m/s) REAL :: psfc (nx,ny) ! Surface pressure (Pascal) REAL :: rhoa (nx,ny) ! Near sfc air density REAL :: precip (nx,ny) ! Precipitation flux reaching the surface REAL :: tair (nx,ny) ! Air temperature (K) near the surface REAL :: qvair (nx,ny) ! S.H. near the surface REAL :: cdha (nx,ny) ! Surface drag coefficient for heat REAL :: cdqa (nx,ny) ! Surface drag coefficient for moisture REAL :: cdma (nx,ny) ! Surface drag coefficient for momentum REAL :: radsw (nx,ny) ! Solar radiation to the surface REAL :: rnflx (nx,ny) ! Net radiation flus REAL :: shflx (nx,ny) ! Sensible heat flux REAL :: lhflx (nx,ny) ! Latent heat flux REAL :: gflx (nx,ny) ! Diffusive heat flux from ground surface to ! deep soil REAL :: ct (nx,ny) ! Thermal capacity REAL :: evaprg (nx,ny) ! Evaporation from groud surface REAL :: evaprtr(nx,ny) ! Transpiration of the remaining part ! (1-delta) of leaves REAL :: evaprr (nx,ny) ! Direct evaporation from the fraction delta REAL :: qvsat (nx,ny) ! Surface specific humidity at saturation REAL :: qvsata (nx,ny) ! qvsat(tair) (kg/kg) REAL :: f34 (nx,ny) ! f34 and surface resistance REAL :: tem1soil (nx,ny,nzsoil) ! Temporary array ! !----------------------------------------------------------------------- ! ! Include files: globcst.inc and phycst.inc ! ! solarc Solar constant (W/m**2) ! emissg Emissivity of the ground ! emissa Emissivity of the atmosphere ! sbcst Stefen-Boltzmann constant ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'mp.inc' ! !----------------------------------------------------------------------- ! ! Local variables: ! !----------------------------------------------------------------------- ! LOGICAL :: dumpsfc ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! dumpsfc = .false. IF ( (curtim > tstart) .AND. (nhisdmp > 0) )THEN IF ( hdmpopt == 1 )THEN dumpsfc = (MOD(nstep,nhisdmp) == 0) ELSE IF ( hdmpopt == 2 )THEN dumpsfc = (nstep == hdmpstp(nhisdmp)) END IF ELSE IF ( curtim == tstart ) THEN dumpsfc = .true. END IF IF ( .NOT. dumpsfc ) THEN RETURN END IF IF(myproc ==0) WRITE (6,'(a,i8,a,f10.2,a)') & ' Dump surface and soil-veg variables at time step, ',nstep, & ', model time=',curtim,' (s)' ! !----------------------------------------------------------------------- ! ! Calculate the saturated specific humidity, qvsats. ! !----------------------------------------------------------------------- ! IF(mp_opt >0 .AND. joindmp > 0) THEN CALL wrtjoinflx(nx,ny,nzsoil,x,y,zpsoil, & soiltyp,vegtyp,lai,roufns,veg,hterain, & tsoil,qsoil,wetcanp, qvsfc, & usflx,vsflx,ptsflx,qvsflx, & windsp,psfc,rhoa,precip, & tair,qvair, & cdha,cdqa,cdma, & radsw, rnflx, & shflx,lhflx,gflx,ct, & evaprg,evaprtr,evaprr,qvsat, & qvsata, f34,tem1soil) ELSE CALL wrtflx(nx,ny,nzsoil,x,y,zpsoil, & soiltyp,vegtyp,lai,roufns,veg,hterain, & tsoil,qsoil,wetcanp, qvsfc, & usflx,vsflx,ptsflx,qvsflx, & windsp,psfc,rhoa,precip, & tair,qvair, & cdha,cdqa,cdma, & radsw, rnflx, & shflx,lhflx,gflx,ct, & evaprg,evaprtr,evaprr,qvsat, & qvsata, f34,tem1soil) END IF RETURN END SUBROUTINE soildiag ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE WRTFLX ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE wrtflx(nx,ny,nzsoil,x,y,zpsoil, & 1,38 soiltyp,vegtyp,lai,roufns,veg,hterain, & tsoil,qsoil,wetcanp, qvsfc, & usflx,vsflx,ptsflx,qvsflx, & windsp,psfc,rhoa,precip,tair,qvair, & cdh,cdq,cdm, & radsw, rnflx, & shflx,lhflx,gflx, ct, & evaprg,evaprtr,evaprr,qvsat, & qvsata,f34,tem1soil) ! !----------------------------------------------------------------- ! ! PURPOSE: ! ! Write surface fields in GrADS format for diagnostic purpose. ! !----------------------------------------------------------------- ! ! AUTHOR: Yuhe Liu ! 4/15/1994. ! ! MODIFICATION HISTORY: ! ! 10/30/94 (Y. Liu) ! using the real names for variables instead of temporary array ! names. ! ! 02/07/1995 (Yuhe Liu) ! Added a new 2-D array, veg(nx,ny), to the diagnostic printing list ! ! 05/31/2002 (J. Brotzge) ! Added new soil variables. ! !------------------------------------------------------------------ ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nzsoil Number of grid points in the soil ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! hterain The height of surface terrain ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy moisture ! qvsfc Effective specific humidity at sfc. ! ! usflx Surface flux of u-momentum ! vsflx Surface flux of v-momentum ! ptsflx Surface flux of heat (K*kg/(m**2*s)) ! qvsflx Surface flux of moisture (K*kg/(m**2*s)) ! ! windsp Wind speed (m/s) ! rhosfc Surface air density (kg/m**3) ! psfc Surface pressure (Pascal) ! preci Precipitation flux reaching the surface ! cdh Surface drag coefficient for heat ! cdq Surface drag coefficient for moisture ! cdm Surface drag coefficient for momentum ! ! radsw Incoming solar radiation flux at surface ! rnflx Net radiation flux ! shflx Sensible heat flux ! lhflx Latent heat flux ! gflx Diffusive ground heat flux ! evaprg Evaporation from groud surface ! evaprtr Transpiration of the remaining part (1-delta) of leaves ! evaprr Direct evaporation from the fraction delta ! f34 Surface resistence ! ct Thermal capacity ! qvsat Surface specific humidity at saturation, qvs(Ts) ! qvsata Surface air specific humidity at saturation, qvs(Ta) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! The number grid points in 3 directions INTEGER :: nzsoil ! The number grid points in the soil REAL :: x(nx) ! X-coordinates REAL :: y(ny) ! Y-coordinates REAL :: zpsoil (nx,ny,nzsoil) INTEGER :: soiltyp(nx,ny) ! Soil type at each point INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: hterain(nx,ny) ! The height of surface terrain REAL :: qvsfc(nx,ny) ! Effective S.H. at sfc. REAL :: tsoil(nx,ny,nzsoil) ! Soil temperature (K) REAL :: qsoil(nx,ny,nzsoil) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny) ! Canopy water amount REAL :: usflx (nx,ny) ! surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx (nx,ny) ! surface flux of heat (K*kg/(m**2*s)) REAL :: qvsflx (nx,ny) ! surface flux of moisture (kg/(m**2*s)) REAL :: windsp (nx,ny) ! Wind speed just above the surface (m/s) REAL :: psfc (nx,ny) ! Surface pressure (Pascal) REAL :: rhoa (nx,ny) ! Near sfc air density REAL :: precip (nx,ny) ! Precipitation flux reaching the surface REAL :: tair (nx,ny) ! Air temperature near the surface REAL :: qvair (nx,ny) ! Specific humidity near the surface REAL :: cdh (nx,ny) ! Surface drag coefficient for heat REAL :: cdq (nx,ny) ! Surface drag coefficient for moisture REAL :: cdm (nx,ny) ! Surface drag coefficient for momentum REAL :: radsw (nx,ny) ! Incoming solar radiation at surface REAL :: rnflx (nx,ny) ! Net radiation flus REAL :: shflx (nx,ny) ! Sensible heat flux REAL :: lhflx (nx,ny) ! Latent heat flux REAL :: gflx (nx,ny) ! Diffusive heat flux from ground surface to ! deep soil REAL :: ct (nx,ny) ! Thermal capacity REAL :: evaprg (nx,ny) ! Evaporation from groud surface REAL :: evaprtr(nx,ny) ! Transpiration of the remaining part ! (1-delta) of leaves REAL :: evaprr (nx,ny) ! Direct evaporation from the fraction delta REAL :: qvsat (nx,ny) ! qvs(ts) REAL :: qvsata (nx,ny) ! qvs(ta) REAL :: f34 (nx,ny) REAL :: tem1soil (nx,ny,nzsoil) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k, m INTEGER :: tnum,tint INTEGER :: year1,month1,day1, hour1,minute1,second1 INTEGER :: jday1, loopdy CHARACTER (LEN=2) :: dtunit INTEGER :: mndys(12) ! days for each months CHARACTER (LEN=3) :: monnam(12) CHARACTER (LEN=70) :: flnctl, flnflx INTEGER :: flxunit, flnctlen, flxlen LOGICAL :: firstcall INTEGER :: ierr REAL :: latmin, latmax, lonmin, lonmax, latinc, loninc ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !----------------------------------------------------------------------- ! ! Save and initialize variables. ! !----------------------------------------------------------------------- ! SAVE firstcall, flxunit,flnflx,flxlen DATA firstcall /.true./ DATA mndys /0,31,59,90,120,151,181,212,243,273,304,334/ DATA monnam /'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', & 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! CALL xytoll(nx,ny,x,y,tem1soil(1,1,1),tem1soil(1,1,2)) CALL a3dmax0(tem1soil(1,1,1),1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & latmax,latmin) CALL a3dmax0(tem1soil(1,1,2),1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & lonmax,lonmin) latinc = (latmax-latmin)/(ny-1) loninc = (lonmax-lonmin)/(nx-1) IF ( firstcall ) THEN IF ( thisdmp <= 0.0 ) THEN WRITE (6, '(/a,a)') & 'Since thisdmp <= 0, only data at the first time step ', & 'will be dumped.' tnum = 1 tint = 1 dtunit = 'MN' ELSE IF ( thisdmp < 60.0 ) THEN WRITE (6, '(/a/a)') & 'GrADS reqiures the smallest uint minute for time interval.', & 'Here we use uint MN to represent the second.' tnum = nint(tstop/thisdmp) tint = nint(thisdmp) dtunit = 'MN' ELSE IF ( thisdmp < 3600.0 ) THEN tnum = nint(tstop/thisdmp) tint = nint(thisdmp/60.) dtunit = 'MN' ELSE IF ( thisdmp < 86400.0 ) THEN tnum = nint(tstop/thisdmp) tint = nint(thisdmp/3600.) dtunit = 'HR' ELSE tnum = nint(tstop/thisdmp) tint = nint(thisdmp/86400.) dtunit = 'DY' END IF IF (tnum < 1) tnum = 1 IF ( initopt /= 2 ) THEN second1 = second minute1 = minute hour1 = hour day1 = day month1 = month year1 = year ELSE second1 = MOD( second + nint(tstart), 60 ) minute1 = ( second + nint(tstart) ) / 60 minute1 = MOD( minute + minute1, 60 ) hour1 = ( minute + ( second + nint(tstart) ) / 60 ) /60 hour1 = MOD( hour + hour1, 24 ) day1 = ( hour + ( minute & + ( second + nint(tstart) ) / 60 ) /60 ) / 24 jday1 = jday + day1 loopdy = 0 IF ( MOD( year, 4 ) == 0 ) loopdy = 1 year1 = year + jday1 / ( 365 + loopdy ) jday1 = MOD( jday1, 365 + loopdy ) month1 = 1 DO m = 2, 11 IF ( jday1 > mndys(m) .AND. jday1 <= mndys(m+1) + loopdy ) month1 = m END DO day1 = jday1 - mndys(month1) END IF flnctlen = lfnkey + 7 flnctl(1:flnctlen) = runname(1:lfnkey)//'.sfcctl' CALL fnversn( flnctl, flnctlen ) flnflx(1:ldirnam) = dirname(1:ldirnam) flxlen = ldirnam + lfnkey + 8 flnflx(1:flxlen) = flnflx(1:ldirnam)//'/'//runname(1:lfnkey) & //'.sfcflx' IF (mp_opt > 0) THEN WRITE(flnflx, '(a,a,2i2.2)') runname(1:lfnkey),'.flx_',loc_x,loc_y flxlen = lfnkey + 4 + 5 END IF CALL fnversn( flnflx, flxlen ) ! !----------------------------------------------------------------------- ! ! Open GrADS data control file for surface variables. ! !----------------------------------------------------------------------- ! IF (myproc == 0) THEN CALL getunit (flxunit) OPEN (UNIT = flxunit, FILE = flnctl(1:flnctlen), & FORM = 'formatted', STATUS = 'new') WRITE (6,'(a,a,a)') 'The GrADS control file for surface ', & 'fluxes and other fields is ', flnctl(1:flnctlen) WRITE (flxunit,'(a,a)') & 'TITLE Surface Fluxes, Temperature and Moisture for run ', & runname(1:lfnkey) WRITE (flxunit,'(a)') & '*' WRITE (flxunit,'(a,a)') & 'DSET ', flnflx(1:flxlen) WRITE (flxunit,'(a)') & 'OPTIONS sequential big_endian' ! 'OPTIONS sequential cray_32bit_ieee' WRITE (flxunit,'(a)') & 'UNDEF -9.e+33' WRITE (flxunit,'(a,i8,a,2f10.4)') & 'XDEF ', nx, ' LINEAR ', lonmin, loninc WRITE (flxunit,'(a,i8,a,2f10.4)') & 'YDEF ', ny, ' LINEAR ', latmin, latinc WRITE (flxunit,'(a,i8,a)') & 'ZDEF ',nzsoil,' LEVELS ' WRITE (flxunit,'(8f10.2)') & ((zpsoil(1,1,k)+zpsoil(1,1,k-1))/2.,k=nzsoil,2,-1), & zpsoil(1,1,1)/1. WRITE (flxunit,'(a,i8,a,i2.2,a,i2.2,a,i2.2,a3,i4.4,3X,i2.2,a)') & 'TDEF ', tnum, ' LINEAR ', & hour1,':',minute1,'Z',day1,monnam(month1),year1,tint,dtunit WRITE (flxunit,'(a)') & '*' WRITE (flxunit,'(a)') & 'VARS 35' WRITE (flxunit,'(a)') & 'styp 0 -1,40,4 Soil type (4-byte integer)' WRITE (flxunit,'(a,a)') & 'vtyp 0 -1,40,4 Vegetation type 4-byte integer)' WRITE (flxunit,'(a)') & 'lai 0 99 Leaf Area Index' WRITE (flxunit,'(a)') & 'rfns 0 99 Surface roughness' WRITE (flxunit,'(a)') & 'veg 0 99 Vegetation fraction' WRITE (flxunit,'(a)') & 'trn 0 99 Surface terrain' WRITE (flxunit,'(a)') & 'va 0 99 Surface wind speed (m/s)' WRITE (flxunit,'(a)') & 'ps 0 99 Surface pressure (Pascal)' WRITE (flxunit,'(a)') & 'rhoa 0 99 Surface air density (kg/m**3)' WRITE (flxunit,'(a,a)') & 'rain 0 99 Surface precipitation rate ', & '(kg/s/m**2)' WRITE (flxunit,'(a)') & 'ta 0 99 Surface air temperature (K)' WRITE (flxunit,'(a,a)') & 'qva 0 99 Surface specific humidity (k', & 'g/kg) ' WRITE (flxunit,'(a)') & 'ct 0 99 Surface Heat Capacity' WRITE (flxunit,'(a,a)') & 'qvsat 0 99 Specific humidity at ', & 'ground surface' WRITE (flxunit,'(a)') & 'qvsata 0 99 Surface air specific humidity' WRITE (flxunit,'(a)') & 'f34 0 99 Surface resistence' WRITE (flxunit,'(a)') & 'cdh 0 99 Cdh' WRITE (flxunit,'(a)') & 'cdq 0 99 Cdq' WRITE (flxunit,'(a)') & 'cdm 0 99 Cdm' WRITE (flxunit,'(a)') & 'eg 0 99 Evaporation from ground' WRITE (flxunit,'(a,a)') & 'etr 0 99 Evaporation directly from ', & 'the foliage' WRITE (flxunit,'(a,a)') & 'er 0 99 Transpiration of the part ', & 'of the leaves' WRITE (flxunit,'(a,a)') & 'radsw 0 99 Incoming solar radiation ', & '(W/m**2)' WRITE (flxunit,'(a)') & 'rn 0 99 Net radiation (W/m**2)' WRITE (flxunit,'(a)') & 'h 0 99 Sensible heat flux (W/m**2)' WRITE (flxunit,'(a)') & 'le 0 99 Latent heat flux (W/m**2)' WRITE (flxunit,'(a,a)') & 'g 0 99 Ground diffusive heat flux' WRITE (flxunit,'(a,i2,a)') & 'tsoil ',nzsoil,' 99 Soil temperature (K)' WRITE (flxunit,'(a,a)') & 'qvsfc 0 99 Surface water vapor mixing ' WRITE (flxunit,'(a,i2,a)') & 'qsoil ',nzsoil,' 99 Soil moisture (m**3/m**3)' WRITE (flxunit,'(a)') & 'wr 0 99 Canopy moisture' WRITE (flxunit,'(a)') & 'uflx 0 99 U flux' WRITE (flxunit,'(a)') & 'vflx 0 99 V flux' WRITE (flxunit,'(a)') & 'ptflx 0 99 PT flux' WRITE (flxunit,'(a)') & 'qvflx 0 99 QV flux' WRITE (flxunit,'(a)') & 'ENDVARS' CLOSE (flxunit) CALL retunit (flxunit) END IF !----------------------------------------------------------------------- ! ! Open GrADS data file for surface variables. ! !----------------------------------------------------------------------- ! CALL getunit (flxunit) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(flnflx(1:flxlen), '-F f77 -N ieee', ierr) OPEN (UNIT = flxunit, FILE = flnflx(1:flxlen), & FORM = 'unformatted', STATUS = 'new',ACCESS = 'sequential') firstcall = .false. END IF WRITE (flxunit) soiltyp ! Soil type WRITE (flxunit) vegtyp ! Veg. type WRITE (flxunit) lai ! LAI WRITE (flxunit) roufns ! Roughness WRITE (flxunit) veg ! Veg WRITE (flxunit) hterain ! Terrain CALL edgfill(windsp, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) windsp ! Va CALL edgfill(psfc, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) psfc ! Psfc CALL edgfill(rhoa, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) rhoa ! Sfc rhoa CALL edgfill(precip, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) precip ! Precipitation CALL edgfill(tair, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) tair ! Tair CALL edgfill(qvair, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) qvair ! Qvair CALL edgfill(ct, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) ct ! Ct CALL edgfill(qvsat, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) qvsat ! Qvsat CALL edgfill(qvsata, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) qvsata ! qvsata CALL edgfill(f34, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) f34 ! f34 CALL edgfill(cdh, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) cdh ! cdh CALL edgfill(cdq, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) cdq ! cdq CALL edgfill(cdm, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) cdm ! cdm CALL edgfill(evaprg, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) evaprg ! Eg CALL edgfill(evaprtr,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) evaprtr ! Etr CALL edgfill(evaprr, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) evaprr ! Er CALL edgfill(radsw, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) radsw ! Radsw CALL edgfill(rnflx, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) rnflx ! Net rad. flux CALL edgfill(shflx, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) shflx ! H flux CALL edgfill(lhflx, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) lhflx ! LE flux CALL edgfill(gflx, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) gflx ! G flux CALL edgfill(tsoil,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil) DO k=nzsoil,1,-1 WRITE (flxunit) ((tsoil(i,j,k),i=1,nx),j=1,ny) ! Soil temp. END DO CALL edgfill(qvsfc, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) qvsfc ! Eff. SH dif. CALL edgfill(qsoil,1,nx,1,nx-1, 1,ny,1,ny-1, 1,nzsoil,1,nzsoil) DO k=nzsoil,1,-1 WRITE (flxunit) ((qsoil(i,j,k),i=1,nx),j=1,ny) ! Soil moist END DO CALL edgfill(wetcanp,1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) wetcanp ! Canopy moist CALL edgfill(usflx, 1,nx,1,nx, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) usflx ! u flux CALL edgfill(vsflx, 1,nx,1,nx-1, 1,ny,1,ny, 1,1,1,1) WRITE (flxunit) vsflx ! v flux CALL edgfill(ptsflx, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) ptsflx ! pt flux CALL edgfill(qvsflx, 1,nx,1,nx-1, 1,ny,1,ny-1, 1,1,1,1) WRITE (flxunit) qvsflx ! qv flux RETURN END SUBROUTINE wrtflx ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE WRTJOINFLX ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE wrtjoinflx(nx,ny,nzsoil,x,y,zpsoil, & 1,73 soiltyp,vegtyp,lai,roufns,veg,hterain, & tsoil,qsoil,wetcanp, qvsfc, & usflx,vsflx,ptsflx,qvsflx, & windsp,psfc,rhoa,precip,tair,qvair, & cdh,cdq,cdm, & radsw, rnflx, & shflx,lhflx,gflx, ct, & evaprg,evaprtr,evaprr,qvsat, & qvsata,f34,tem1soil) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Write joined surface fields in GrADS format for parallel runs. ! !----------------------------------------------------------------------- ! ! AUTHOR: Yunheng Wang ! 10/18/2002. ! Based on subroutine wrtflx. ! ! MODIFICATION HISTORY: ! !---------------------------------------------------------------------- ! ! INPUT: ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nzsoil Number of grid points in the soil ! ! soiltyp Soil type ! vegtyp Vegetation type ! lai Leaf Area Index ! roufns Surface roughness ! veg Vegetation fraction ! hterain The height of surface terrain ! ! tsoil Soil temperature (K) ! qsoil Soil moisture (m**3/m**3) ! wetcanp Canopy moisture ! qvsfc Effective specific humidity at sfc. ! ! usflx Surface flux of u-momentum ! vsflx Surface flux of v-momentum ! ptsflx Surface flux of heat (K*kg/(m**2*s)) ! qvsflx Surface flux of moisture (K*kg/(m**2*s)) ! ! windsp Wind speed (m/s) ! rhosfc Surface air density (kg/m**3) ! psfc Surface pressure (Pascal) ! preci Precipitation flux reaching the surface ! cdh Surface drag coefficient for heat ! cdq Surface drag coefficient for moisture ! cdm Surface drag coefficient for momentum ! ! radsw Incoming solar radiation flux at surface ! rnflx Net radiation flux ! shflx Sensible heat flux ! lhflx Latent heat flux ! gflx Diffusive ground heat flux ! evaprg Evaporation from groud surface ! evaprtr Transpiration of the remaining part (1-delta) of leaves ! evaprr Direct evaporation from the fraction delta ! f34 Surface resistence ! ct Thermal capacity ! qvsat Surface specific humidity at saturation, qvs(Ts) ! qvsata Surface air specific humidity at saturation, qvs(Ta) ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny ! The number grid points in 3 directions INTEGER :: nzsoil ! The number grid points in the soil REAL :: x(nx) ! X-coordinates REAL :: y(ny) ! Y-coordinates REAL :: zpsoil (nx,ny,nzsoil) INTEGER :: soiltyp(nx,ny) ! Soil type at each point INTEGER :: vegtyp (nx,ny) ! Vegetation type at each point REAL :: lai (nx,ny) ! Leaf Area Index REAL :: roufns (nx,ny) ! Surface roughness REAL :: veg (nx,ny) ! Vegetation fraction REAL :: hterain(nx,ny) ! The height of surface terrain REAL :: qvsfc(nx,ny) ! Effective S.H. at sfc. REAL :: tsoil(nx,ny,nzsoil) ! Soil temperature (K) REAL :: qsoil(nx,ny,nzsoil) ! Soil moisture (m**3/m**3) REAL :: wetcanp(nx,ny) ! Canopy water amount REAL :: usflx (nx,ny) ! surface flux of u-momentum (kg/(m*s**2)) REAL :: vsflx (nx,ny) ! surface flux of v-momentum (kg/(m*s**2)) REAL :: ptsflx (nx,ny) ! surface flux of heat (K*kg/(m**2*s)) REAL :: qvsflx (nx,ny) ! surface flux of moisture (kg/(m**2*s)) REAL :: windsp (nx,ny) ! Wind speed just above the surface (m/s) REAL :: psfc (nx,ny) ! Surface pressure (Pascal) REAL :: rhoa (nx,ny) ! Near sfc air density REAL :: precip (nx,ny) ! Precipitation flux reaching the surface REAL :: tair (nx,ny) ! Air temperature near the surface REAL :: qvair (nx,ny) ! Specific humidity near the surface REAL :: cdh (nx,ny) ! Surface drag coefficient for heat REAL :: cdq (nx,ny) ! Surface drag coefficient for moisture REAL :: cdm (nx,ny) ! Surface drag coefficient for momentum REAL :: radsw (nx,ny) ! Incoming solar radiation at surface REAL :: rnflx (nx,ny) ! Net radiation flus REAL :: shflx (nx,ny) ! Sensible heat flux REAL :: lhflx (nx,ny) ! Latent heat flux REAL :: gflx (nx,ny) ! Diffusive heat flux from ground surface to ! deep soil REAL :: ct (nx,ny) ! Thermal capacity REAL :: evaprg (nx,ny) ! Evaporation from groud surface REAL :: evaprtr(nx,ny) ! Transpiration of the remaining part ! (1-delta) of leaves REAL :: evaprr (nx,ny) ! Direct evaporation from the fraction delta REAL :: qvsat (nx,ny) ! qvs(ts) REAL :: qvsata (nx,ny) ! qvs(ta) REAL :: f34 (nx,ny) REAL :: tem1soil (nx,ny,nzsoil) ! Temporary array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k, m INTEGER :: tnum,tint INTEGER :: year1,month1,day1, hour1,minute1,second1 INTEGER :: jday1, loopdy CHARACTER (LEN=2) :: dtunit INTEGER :: mndys(12) ! days for each months CHARACTER (LEN=3) :: monnam(12) CHARACTER (LEN=70) :: flnctl, flnflx INTEGER :: flxunit, flnctlen, flxlen LOGICAL :: firstcall INTEGER :: ierr REAL :: latmin, latmax, lonmin, lonmax, latinc, loninc INTEGER :: nxlg, nylg REAL, ALLOCATABLE :: out2d(:,:), out3d(:,:,:) INTEGER, ALLOCATABLE :: out2di(:,:) ! !----------------------------------------------------------------------- ! ! Include files ! !----------------------------------------------------------------------- ! INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! Grid & map parameters. INCLUDE 'phycst.inc' INCLUDE 'soilcst.inc' INCLUDE 'mp.inc' ! Message passing parameters. ! !----------------------------------------------------------------------- ! ! Save and initialize variables. ! !----------------------------------------------------------------------- ! SAVE firstcall, flxunit,flnflx,flxlen DATA firstcall/.true./ DATA mndys/0,31,59,90,120,151,181,212,243,273,304,334/ DATA monnam/'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', & 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'/ ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! nxlg = (nx-3)*nproc_x+3 nylg = (ny-3)*nproc_y+3 ALLOCATE(out2d(nxlg, nylg)) ALLOCATE(out2di(nxlg, nylg)) ALLOCATE(out3d(nxlg, nylg, nzsoil)) CALL xytoll(nx,ny,x,y,tem1soil(1,1,1),tem1soil(1,1,2)) CALL a3dmax0(tem1soil(1,1,1),1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & latmax,latmin) CALL a3dmax0(tem1soil(1,1,2),1,nx,1,nx,1,ny,1,ny-1,1,1,1,1, & lonmax,lonmin) IF(myproc == 0) THEN latinc = (latmax-latmin)/(nylg-1) loninc = (lonmax-lonmin)/(nxlg-1) IF ( firstcall ) THEN IF ( thisdmp <= 0.0 ) THEN WRITE (6, '(/a,a)') & 'Since thisdmp <= 0, only data at the first time step ', & 'will be dumped.' tnum = 1 tint = 1 dtunit = 'MN' ELSE IF ( thisdmp < 60.0 ) THEN WRITE (6, '(/a/a)') & 'GrADS reqiures the smallest uint minute for time interval.', & 'Here we use uint MN to represent the second.' tnum = nint(tstop/thisdmp) tint = nint(thisdmp) dtunit = 'MN' ELSE IF ( thisdmp < 3600.0 ) THEN tnum = nint(tstop/thisdmp) tint = nint(thisdmp/60.) dtunit = 'MN' ELSE IF ( thisdmp < 86400.0 ) THEN tnum = nint(tstop/thisdmp) tint = nint(thisdmp/3600.) dtunit = 'HR' ELSE tnum = nint(tstop/thisdmp) tint = nint(thisdmp/86400.) dtunit = 'DY' END IF IF (tnum < 1) tnum = 1 IF ( initopt /= 2 ) THEN second1 = second minute1 = minute hour1 = hour day1 = day month1 = month year1 = year ELSE second1 = MOD( second + nint(tstart), 60 ) minute1 = ( second + nint(tstart) ) / 60 minute1 = MOD( minute + minute1, 60 ) hour1 = ( minute + ( second + nint(tstart) ) / 60 ) /60 hour1 = MOD( hour + hour1, 24 ) day1 = ( hour + ( minute & + ( second + nint(tstart) ) / 60 ) /60 ) / 24 jday1 = jday + day1 loopdy = 0 IF ( MOD( year, 4 ) == 0 ) loopdy = 1 year1 = year + jday1 / ( 365 + loopdy ) jday1 = MOD( jday1, 365 + loopdy ) month1 = 1 DO m = 2, 11 IF ( jday1 > mndys(m) .AND. jday1 <= mndys(m+1) + loopdy ) month1 = m END DO day1 = jday1 - mndys(month1) END IF flnctlen = lfnkey + 7 flnctl(1:flnctlen) = runname(1:lfnkey)//'.sfcctl' CALL fnversn( flnctl, flnctlen ) flnflx(1:ldirnam) = dirname(1:ldirnam) flxlen = ldirnam + lfnkey + 8 flnflx(1:flxlen) = flnflx(1:ldirnam)//'/'//runname(1:lfnkey) & //'.sfcflx' CALL fnversn( flnflx, flxlen ) ! !----------------------------------------------------------------------- ! ! Open GrADS data control file for surface variables. ! !----------------------------------------------------------------------- ! CALL getunit (flxunit) OPEN (UNIT = flxunit, FILE = flnctl(1:flnctlen), & FORM = 'formatted', STATUS = 'new') WRITE (6,'(a,a,a)') 'The GrADS control file for surface ', & 'fluxes and other fields is ', flnctl(1:flnctlen) WRITE (flxunit,'(a,a)') & 'TITLE Surface Fluxes, Temperature and Moisture ', & runname(1:lfnkey) WRITE (flxunit,'(a)') & '*' WRITE (flxunit,'(a,a)') & 'DSET ', flnflx(1:flxlen) WRITE (flxunit,'(a)') & '*OPTIONS sequential cray_32bit_ieee' WRITE (flxunit,'(a)') & 'OPTIONS sequential big_endian' WRITE (flxunit,'(a)') & 'UNDEF -9.e+33' WRITE (flxunit,'(a,i8,a,2f10.4)') & 'XDEF ', nxlg, ' LINEAR ', lonmin, loninc WRITE (flxunit,'(a,i8,a,2f10.4)') & 'YDEF ', nylg, ' LINEAR ', latmin, latinc WRITE (flxunit,'(a,i8,a)') & 'ZDEF ',nzsoil,' LEVELS ' WRITE (flxunit,'(8f10.2)') & ((zpsoil(1,1,k)+zpsoil(1,1,k-1))/2.,k=nzsoil,2,-1), & zpsoil(1,1,1) WRITE (flxunit,'(a,i8,a,i2.2,a,i2.2,a,i2.2,a3,i4.4,3X,i2.2,a)') & 'TDEF ', tnum, ' LINEAR ', & hour1,':',minute1,'Z',day1,monnam(month1),year1, & tint,dtunit WRITE (flxunit,'(a)') & '*' WRITE (flxunit,'(a)') & 'VARS 35' WRITE (flxunit,'(a)') & 'styp 0 -1,40,4 Soil type (4-byte integer)' WRITE (flxunit,'(a,a)') & 'vtyp 0 -1,40,4 Vegetation type 4-byte integer)' WRITE (flxunit,'(a)') & 'lai 0 99 Leaf Area Index' WRITE (flxunit,'(a)') & 'rfns 0 99 Surface roughness' WRITE (flxunit,'(a)') & 'veg 0 99 Vegetation fraction' WRITE (flxunit,'(a)') & 'trn 0 99 Surface terrain' WRITE (flxunit,'(a)') & 'va 0 99 Surface wind speed (m/s)' WRITE (flxunit,'(a)') & 'ps 0 99 Surface pressure (Pascal)' WRITE (flxunit,'(a)') & 'rhoa 0 99 Surface air density (kg/m**3)' WRITE (flxunit,'(a,a)') & 'rain 0 99 Surface precipitation rate ', & '(kg/s/m**2)' WRITE (flxunit,'(a)') & 'ta 0 99 Surface air temperature (K)' WRITE (flxunit,'(a,a)') & 'qva 0 99 Surface specific humidity (k', & 'g/kg) ' WRITE (flxunit,'(a)') & 'ct 0 99 Surface Heat Capacity' WRITE (flxunit,'(a,a)') & 'qvsat 0 99 Specific humidity at ', & 'ground surface' WRITE (flxunit,'(a)') & 'qvsata 0 99 Surface air specific humidity' WRITE (flxunit,'(a)') & 'f34 0 99 Surface resistence' WRITE (flxunit,'(a)') & 'cdh 0 99 Cdh' WRITE (flxunit,'(a)') & 'cdq 0 99 Cdq' WRITE (flxunit,'(a)') & 'cdm 0 99 Cdm' WRITE (flxunit,'(a)') & 'eg 0 99 Evaporation from ground' WRITE (flxunit,'(a,a)') & 'etr 0 99 Evaporation directly from ', & 'the foliage' WRITE (flxunit,'(a,a)') & 'er 0 99 Transpiration of the part ', & 'of the leaves' WRITE (flxunit,'(a,a)') & 'radsw 0 99 Incoming solar radiation ', & '(W/m**2)' WRITE (flxunit,'(a)') & 'rn 0 99 Net radiation (W/m**2)' WRITE (flxunit,'(a)') & 'h 0 99 Sensible heat flux (W/m**2)' WRITE (flxunit,'(a)') & 'le 0 99 Latent heat flux (W/m**2)' WRITE (flxunit,'(a)') & 'g 0 99 Ground diffusive heat flux' WRITE (flxunit,'(a,i2,a)') & 'tsoil ',nzsoil,' 99 Soil temperature (K)' WRITE (flxunit,'(a,a)') & 'qvsfc 0 99 Surface water vapor mixing ' WRITE (flxunit,'(a,i2,a)') & 'qsoil ',nzsoil,' 99 Soil moisture (m**3/m**3)' WRITE (flxunit,'(a)') & 'wr 0 99 Canopy moisture' WRITE (flxunit,'(a)') & 'uflx 0 99 U flux' WRITE (flxunit,'(a)') & 'vflx 0 99 V flux' WRITE (flxunit,'(a)') & 'ptflx 0 99 PT flux' WRITE (flxunit,'(a)') & 'qvflx 0 99 QV flux' WRITE (flxunit,'(a)') & 'ENDVARS' CLOSE (flxunit) CALL retunit (flxunit) !----------------------------------------------------------------------- ! ! Open GrADS data file for surface variables. ! !----------------------------------------------------------------------- ! CALL getunit (flxunit) CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile(flnflx(1:flxlen), '-F f77 -N ieee', ierr) OPEN (UNIT = flxunit, FILE = flnflx(1:flxlen), & FORM = 'unformatted', STATUS = 'new',ACCESS = 'sequential') END IF ! firstcall END IF ! myproc == 0 firstcall = .false. CALL mpimerge2di(soiltyp,nx,ny,out2di) IF(myproc == 0) WRITE (flxunit) out2di ! Soil type CALL mpimerge2di(vegtyp,nx,ny,out2di) IF(myproc == 0) WRITE (flxunit) out2di ! Veg. type CALL mpimerge2d(lai,nx,ny,out2d) IF(myproc == 0) WRITE (flxunit) out2d ! LAI CALL mpimerge2d(roufns,nx,ny,out2d) IF(myproc == 0) WRITE (flxunit) out2d ! Roughness CALL mpimerge2d(veg,nx,ny,out2d) IF(myproc == 0) WRITE (flxunit) out2d ! Veg CALL mpimerge2d(hterain,nx,ny,out2d) IF(myproc == 0) WRITE (flxunit) out2d ! Terrain CALL mpimerge2d(windsp,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1) WRITE (flxunit) out2d ! Va END IF CALL mpimerge2d(psfc,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d,1,nxlg,1,nxlg-1,1,nylg,1,nylg-1,1,1,1,1) WRITE (flxunit) out2d ! Psfc END IF CALL mpimerge2d(rhoa,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d,1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Sfc rhoa END IF CALL mpimerge2d(precip,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Precipitation END IF CALL mpimerge2d(tair,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Tair END IF CALL mpimerge2d(qvair,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Qvair END IF CALL mpimerge2d(ct,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Ct END IF CALL mpimerge2d(qvsat,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Qvsat END IF CALL mpimerge2d(qvsata,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! qvsata END IF CALL mpimerge2d(f34,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! f34 END IF CALL mpimerge2d(cdh,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! cdh END IF CALL mpimerge2d(cdq,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! cdq END IF CALL mpimerge2d(cdm,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! cdm END IF CALL mpimerge2d(evaprg,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Eg END IF CALL mpimerge2d(evaprtr,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d,1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Etr END IF CALL mpimerge2d(evaprr,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Er END IF CALL mpimerge2d(radsw,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Radsw END IF CALL mpimerge2d(rnflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Net rad. flux END IF CALL mpimerge2d(shflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! H flux END IF CALL mpimerge2d(lhflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! LE flux END IF CALL mpimerge2d(gflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! G flux END IF CALL mpimerge3d(tsoil,nx,ny,nzsoil,out3d) IF(myproc == 0) THEN CALL edgfill(out3d,1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,nzsoil,1,nzsoil) DO k=nzsoil,1, -1 WRITE (flxunit) ((out3d(i,j,k),i=1,nxlg),j=1,nylg) ! Soil temp. END DO END IF CALL mpimerge2d(qvsfc,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Eff. SH dif. END IF CALL mpimerge3d(qsoil,nx,ny,nzsoil,out3d) IF(myproc == 0) THEN CALL edgfill(out3d,1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,nzsoil,1,nzsoil) DO k=nzsoil,1,-1 WRITE (flxunit) ((out3d(i,j,k),i=1,nxlg),j=1,nylg) ! Soil moist END DO END IF CALL mpimerge2d(wetcanp,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d,1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! Canopy moist END IF CALL mpimerge2d(usflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! u flux END IF CALL mpimerge2d(vsflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg, 1,1,1,1) WRITE (flxunit) out2d ! v flux END IF CALL mpimerge2d(ptsflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! pt flux END IF CALL mpimerge2d(qvsflx,nx,ny,out2d) IF(myproc == 0) THEN CALL edgfill(out2d, 1,nxlg,1,nxlg-1, 1,nylg,1,nylg-1, 1,1,1,1) WRITE (flxunit) out2d ! qv flux END IF DEALLOCATE(out2d) DEALLOCATE(out2di) DEALLOCATE(out3d) RETURN END SUBROUTINE wrtjoinflx