!-------------------------------------------------------------------------
!     NASA GSFC Land Information Systems LIS 2.3                         !
!-------------------------------------------------------------------------
!BOP
!
! !ROUTINE: noah_tileout.F90
!
! !DESCRIPTION:  
!  LIS NOAH data writer: Writes output in tile space 
!
! !REVISION HISTORY:
! 02 Dec 2003; Sujay Kumar, Initial Version
! 
! !INTERFACE:
subroutine noah_tileout(ld,tile,ftn,ftn_stats)
! !USES:
  use lis_module
  use tile_module
  use noah_varder
  use drv_output_mod

  implicit none
  
  type(lisdec) :: ld
  type(tiledec) :: tile
  integer :: ftn,ftn_stats
!EOP
  real :: gtmp (ld%d%glbngrid)
  real :: vmean,vstdev,vmin,vmax
  real :: rainf(ld%d%glbnch)
  real :: snowf(ld%d%glbnch)
  integer :: t
!BOC
  do t=1,ld%d%glbnch
     if(noah(t)%forcing(1) < 273.15) then
        rainf(t) = 0.0
        snowf(t) = noah(t)%forcing(8)
     else
        rainf(t) = noah(t)%forcing(8)
        snowf(t) = 0.0
     endif
  enddo
!-----------------------------------------------------------------
! General Energy Balance Components
!-----------------------------------------------------------------
  noah%snet = noah%snet/float(noah%count)
  call t2gr(noah%snet,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Net shortwave radiation (surface) (W/m2)
  call stats(noah%snet,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'SWnet(W/m2)', &
       vmean,vstdev,vmin,vmax
  
  noah%lwnet = noah%lwnet/float(noah%count)
  call t2gr(noah%lwnet,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Net longwave radiation (surface) (W/m2)
  
  call stats(noah%lwnet,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'LWnet(W/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%qle = noah%qle/float(noah%count)
  call t2gr(noah%qle,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Latent Heat Flux (W/m2)
  
  call stats(noah%qle,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'Qle(W/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%qh = noah%qh/float(noah%count)
  call t2gr(noah%qh,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Sensible Heat Flux (W/m2)
  
  call stats(noah%qh,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'Qh(W/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%qg = noah%qg/float(noah%count)
  call t2gr(noah%qg,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Ground Heat Flux (W/m2)
  
  call stats(noah%qg,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'Qg(W/m2)',&
       vmean,vstdev,vmin,vmax
!-----------------------------------------------------------------  
! General Water Balance Components
!-----------------------------------------------------------------
  noah%snowf = noah%snowf/float(noah%count)
  call t2gr(noah%snowf,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Snowfall rate (kg/m2s)
  
  call stats(noah%snowf,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'Snowf(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%rainf = noah%rainf/float(noah%count)
  call t2gr(noah%rainf,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Snowfall rate (kg/m2s)
  
  call stats(noah%rainf,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'Rainf(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%evap = noah%evap/float(noah%count)
  call t2gr(noah%evap,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Evapotranspiration (kg/m2s)??
  
  call stats(noah%evap,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'Evap(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%qs = noah%qs/float(noah%count)
  call t2gr(noah%qs,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Surface Runoff(kg/m2s)
  
  call stats(noah%qs,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'Qs(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%qsb = noah%qsb/float(noah%count)
  call t2gr(noah%qsb,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Subsurface Runoff (kg/m2s)??
  
  call stats(noah%qsb,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'Qsb(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%qsm = noah%qsm/float(noah%count)
  call t2gr(noah%qsm,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Snowmelt (kg/m2s)
  
  call t2gr(noah%smc(1)*1000.0*0.1+ &
       noah%smc(2)*1000.0*0.3 + & 
       noah%smc(3)*1000.0*0.6 + & 
       noah%smc(4)*1000.0 -noah%soilm_prev, & 
       gtmp,ld%d%glbngrid, & 
       ld%d%glbnch,tile)
  write(ftn) gtmp        !DelSoilMoist
  call stats(noah%smc(1)*1000.0*0.1+ &
       noah%smc(2)*1000.0*0.3 + & 
       noah%smc(3)*1000.0*0.6 + & 
       noah%smc(4)*1000.0 -noah%soilm_prev, & 
       ld%d%udef,ld%d%glbnch,vmean,vstdev,vmin, vmax)
  write(ftn_stats,999) 'DelSoilMoist(kg/m2s)', & 
       vmean,vstdev,vmin,vmax
  call t2gr( noah%weasd*1000.0-noah%swe_prev,gtmp,ld%d%glbngrid, & 
       ld%d%glbnch,tile)
  write(ftn) gtmp        !DelSWE
  call stats( noah%weasd*1000.0-noah%swe_prev, & 
       ld%d%udef,ld%d%glbnch,vmean,vstdev,vmin, vmax)
  write(ftn_stats,999) 'DelSWE(kg/m2s)', & 
       vmean,vstdev,vmin,vmax
!-----------------------------------------------------------------  
! Surface State Variables
! missing snowT, vegT, baresoilT,RadT
!-----------------------------------------------------------------  
  call t2gr(noah%avgsurft,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Average Surface Temperature (K)
  
  call stats(noah%avgsurft,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'AvgSurfT(K)',&
       vmean,vstdev,vmin,vmax
  
  call t2gr(noah%albedo,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Surface Albedo (-)
  
  call stats(noah%albedo,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'Albedo(-)',&
       vmean,vstdev,vmin,vmax
  
  noah%swe= noah%swe/float(noah%count)
  call t2gr(noah%swe,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp !Snow water equivalent (kg/m2)
  
  call stats(noah%swe,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'SWE(kg/m2)',&
       vmean,vstdev,vmin,vmax
!-----------------------------------------------------------------
!=== Subsurface State Variables
!-----------------------------------------------------------------
  noah%soilmoist1= noah%soilmoist1/float(noah%count)
  call t2gr(noah%soilmoist1,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Soil water content for layer1 (kg/m2)
  
  call stats(noah%soilmoist1,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'SoilMoist1(kg/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%soilmoist2= noah%soilmoist2/float(noah%count)
  call t2gr(noah%soilmoist1,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Soil water content for layer2 (kg/m2)
  
  call stats(noah%soilmoist2,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'SoilMoist2(kg/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%soilmoist3= noah%soilmoist3/float(noah%count)
  call t2gr(noah%soilmoist1,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Soil water content for layer3 (kg/m2)
  
  call stats(noah%soilmoist3,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'SoilMoist3(kg/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%soilmoist4= noah%soilmoist4/float(noah%count)
  call t2gr(noah%soilmoist1,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Soil water content for layer4 (kg/m2)
          
  call stats(noah%soilmoist4,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,999) 'SoilMoist4(kg/m2)',&
       vmean,vstdev,vmin,vmax
  
  noah%soilwet= noah%soilwet/float(noah%count)
  call t2gr(noah%soilwet,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Total Soil Wetness (-)
  
  call stats(noah%soilwet,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'SoilWet(-)',&
       vmean,vstdev,vmin,vmax
!-----------------------------------------------------------------  
!=== Evaporation Components
!-----------------------------------------------------------------  
  noah%tveg= noah%tveg/float(noah%count)
  call t2gr(noah%tveg,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Vegetation transpiration (kg/m2s)
  
  call stats(noah%tveg,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'TVeg(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%esoil= noah%esoil/float(noah%count)
  call t2gr(noah%esoil,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Bare soil evaporation (kg/m2s)
  
  call stats(noah%esoil,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'ESoil(kg/m2s)',&
       vmean,vstdev,vmin,vmax
  
  noah%rootmoist = noah%rootmoist/float(noah%count)
  call t2gr(noah%rootmoist,gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
  write(ftn) gtmp ! Root zone soil moisture (kg/m2)
  
  call stats(noah%rootmoist,ld%d%udef,ld%d%glbnch,vmean, & 
       vstdev,vmin, vmax)
  write(ftn_stats,998) 'RootMoist(kg/m2)',&
       vmean,vstdev,vmin,vmax
  
  if(ld%o%wfor.eq.1) then
     call t2gr(sqrt(noah%forcing(5)*noah%forcing(5)+ & 
          noah%forcing(6)*noah%forcing(6)),gtmp,ld%d%glbngrid, & 
          ld%d%glbnch,tile)
     write(ftn) gtmp        !Wind
     call stats(sqrt(noah%forcing(5)*noah%forcing(5)+ & 
          noah%forcing(6)*noah%forcing(6)), & 
          ld%d%udef,ld%d%glbnch,vmean,vstdev,vmin, vmax)
     write(ftn_stats,999) 'Wind(m/s)', & 
          vmean,vstdev,vmin,vmax
     
     call t2gr(rainf, & 
          gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !Rainf
     call stats(rainf, & 
          ld%d%udef,ld%d%glbnch,vmean,vstdev,vmin, vmax)
     write(ftn_stats,998) 'Rainf(kg/m2s)', & 
          vmean,vstdev,vmin,vmax
     
     call t2gr(snowf, & 
          gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !Snowf
     call stats(snowf, & 
          ld%d%udef,ld%d%glbnch,vmean,vstdev,vmin, vmax)
     write(ftn_stats,998) 'Snowf(kg/m2s)', & 
          vmean,vstdev,vmin,vmax
     
     call t2gr(noah%forcing(1),gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !Tair
     call stats(noah%forcing(1),ld%d%udef,ld%d%glbnch,vmean,vstdev, & 
          vmin, vmax)
     write(ftn_stats,999) 'Tair(K)', & 
          vmean,vstdev,vmin,vmax
     call t2gr(noah%forcing(2),gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !Qair
     call stats(noah%forcing(2),ld%d%udef,ld%d%glbnch,vmean,vstdev, & 
          vmin, vmax)
     write(ftn_stats,999) 'Qair(kg/kg)', & 
          vmean,vstdev,vmin,vmax
     call t2gr(noah%forcing(7),gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !PSurf
     call stats(noah%forcing(7),ld%d%udef,ld%d%glbnch,vmean,vstdev, & 
          vmin, vmax)
     write(ftn_stats,999) 'PSurf(Pa)', & 
          vmean,vstdev,vmin,vmax
     call t2gr(noah%forcing(3),gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !SWdown
     call stats(noah%forcing(3),ld%d%udef,ld%d%glbnch,vmean,vstdev, & 
          vmin, vmax)
     write(ftn_stats,999) 'SWdown (W/m2)', & 
          vmean,vstdev,vmin,vmax
     
     call t2gr(noah%forcing(4),gtmp,ld%d%glbngrid,ld%d%glbnch,tile)
     write(ftn) gtmp        !LWdown
     call stats(noah%forcing(4),ld%d%udef,ld%d%glbnch,vmean,vstdev, & 
          vmin, vmax)
     write(ftn_stats,999) 'LWdown(W/m2)', & 
          vmean,vstdev,vmin,vmax
     
  endif
998 FORMAT(1X,A18,4E14.3)
999 FORMAT(1X,A18,4F14.3)
!EOC
end subroutine noah_tileout