Latent Heat Flux Problem with ROMS 741

General scientific issues regarding ROMS

Moderators: arango, robertson

Post Reply
Message
Author
allencapa

Latent Heat Flux Problem with ROMS 741

#1 Unread post by allencapa »

Hi everyone,

I am using ROMS (Version 741) trying to simulate South Australia ocean (15oE - 40oE, 30oS - 40oS). However, after 1 month run, the SST is 2~3 degrees lower compared with HYCOM data (which is the initial and boundary condition). It seems that the main error is from latent heat flux, which is about -500 ~ -100 W2m-2. The atmosphere forcing I use is CFSR dataset, including rain, 2m air temperature, 2m specific humidity, 10m wind speed, MSL pressure, cloud cover, shortwave and longwave radiation. The varinfo.dat is as following,

Code: Select all

'Pair'                                             ! Input
  'surface air pressure'
  'Pascal'                                         ! [millibar]
  'Pair, scalar, series'
  'pair_time'
  'idPair'
  'r2dvar'
  0.01d0

'Tair'                                             ! Input
  'surface air temperature'
  'Celsius'                                        ! [Kelvin]
  'Tair, scalar, series'
  'tair_time'
  'idTair'
  'r2dvar'
  1.0d0

'Qair'                                             ! Input
  'surface air specific humidity'                  !  relative    or  specific
  'kg/kg'                                          ! [percentage  or  g/kg    ]
  'Qair, scalar, series'
  'qair_time'
  'idQair'
  'r2dvar'                                         ! relative        specific
  1.0d0                                            ! 1/100      or   1.0

'cloud'                                            ! Input
  'cloud fraction'
  'nondimensional'                                 ! [nondimensional]
  'cloud, scalar, series'
  'cloud_time'
  'idCfra'
  'r2dvar'
  0.01d0

'swrad'                                            ! Input/Output
  'solar shortwave radiation flux'
  'watt meter-2'                                   ! Input:  [Watt/m2]
  'shortwave radiation, scalar, series'            ! [Celsius m/s]
  'srf_time'                                       ! Output: [Watt/m2]
  'idSrad'
  'r2dvar'
  1.0d0

'lwrad_down'                                       ! Input
  'downwelling longwave radiation flux'
  'watt meter-2'                                   ! Input:  [Watt/m2]
  'downwelling longwave radiation, scalar, series' ! [Celsius m/s]
  'lrf_time'
  'idLdwn'
  'r2dvar'
  1.0d0

'lwrad'                                            ! Input/Output
  'net longwave radiation flux'
  'watt meter-2'                                   ! Input:  [Watt/m2]
  'longwave radiation, scalar, series'             ! [Celsius m/s]
  'lrf_time'                                       ! Output: [Watt/m2]
  'idLrad'
  'r2dvar'
  1.0d0

'latent'                                           ! Input/Output
  'net latent heat flux'
  'watt meter-2'                                   ! Input:  [Watt/m2]
  'latent heat flux, scalar, series'               ! [Celsius m/s]
  'lhf_time'                                       ! Output: [Watt/m2]
  'idLhea'
  'r2dvar'
  1.0d0

'sensible'                                         ! Input/Output
  'net sensible heat flux'
  'watt meter-2'                                   ! Input:  [Watt/m2]
  'sensible heat flux, scalar, series'             ! [Celsius m/s]
  'shf_time'                                       ! Output: [Watt/m2]
  'idShea'
  'r2dvar'
  1.0d0

'rain'                                             ! Input
  'rain fall rate'
  'kilogram meter-2 second-1'                      ! [kg m2/s]
  'rain, scalar, series'
  'rain_time'
  'idrain'
  'r2dvar'
  1.0d0                                            ! 1/rhow (0.001 m3/kg) if m/s

'evaporation'                                      ! Input
  'evaporation rate'
  'kilogram meter-2 second-1'                      ! [kg m2/s]
  'evaporation, scalar, series'
  'evap_time'
  'idevap'
  'r2dvar'
  1.0d0                                            ! 1/rhow (0.001 m3/kg) if m/s

'Uwind'                                            ! Input
  'surface u-wind component'
  'meter second-1'                                 ! [m/s]
  'u-wind, scalar, series'
  'wind_time'
  'idUair'
  'r2dvar'
  1.0d0

'Vwind'                                            ! Input
  'surface v-wind component'
  'meter second-1'                                 ! [m/s]
  'v-wind, scalar, series'
  'wind_time'
  'idVair'
  'r2dvar'
  1.0d0

'Dwave'                                            ! Input
  'wind-induced wave direction'
  'degrees'                                        ! [radians]
  'Dwave, scalar, series'
  'wave_time'
  'idWdir'
  'r2dvar'
  0.017453292519943295                             ! pi/180

'Hwave'                                            ! Input
  'wind-induced significant wave height'
  'meter'                                          ! [m]
  'Hwave, scalar, series'
  'wave_time'
  'idWamp'
  'r2dvar'
  1.0d0

'Lwave'                                            ! Input
  'wind-induced mean wavelength'
  'meter'                                          ! [m]
  'Lwave, scalar, series'
  'wave_time'
  'idWlen'
  'r2dvar'
  1.0

'Pwave_top'                                        ! Input
  'wind-induced surface wave Period'
  'second'                                         ! [s]
  'Pwave_top, scalar, series'
  'wave_time'
  'idWptp'
  'r2dvar'
  1.0d0

'Pwave_bot'                                        ! Input
  'wind-induced bottom wave Period'
  'second'                                         ! [s]
  'Pwave_bot, scalar, series'
  'wave_time'
  'idWpbt'
  'r2dvar'
  1.0d0

'Ub_swan'                                          ! Input
  'wind-induced bottom orbital velocity'
  'meter second-1'                                 ! [m/s]
  'Ub_swan, scalar, series'
  'wave_time'
  'idWorb'
  'r2dvar'
  1.0d0

'Wave_dissip'                                      ! Input
  'wave dissipation'
  'Watts meter-2'                                  ! [W/m2]
  'Wave_dissip, scalar, series'
  'wave_time'
  'idWdis'
  'r2dvar'
  0.00097561                                       !1/rho0

'Wave_break'                                       ! Input
  'percent wave breaking'
  'nondimensionsal'                                ! []
  'Wave_break, scalar, series'
  'wave_time'
  'idWbrk'
  'r2dvar'
  1.0d0

'Sxx_bar'                                          ! Output
'Uwind'                                            ! Input
  'surface u-wind component'
  'meter second-1'                                 ! [m/s]
  'u-wind, scalar, series'
  'wind_time'
  'idUair'
  'r2dvar'
  1.0d0

'Vwind'                                            ! Input
  'surface v-wind component'
  'meter second-1'                                 ! [m/s]
  'v-wind, scalar, series'
  'wind_time'
  'idVair'
  'r2dvar'
  1.0d0
I notice that wikiROMShttps://www.myroms.org/wiki/index.php/R ... eat_Fluxes mentions q10m in latent heat calculation. But it seems that previous versions of ROMS use q2m. Should I switch to q10m? If not, where may the problem be?

Thank you
Attachments
latent.ly.png

User avatar
arango
Site Admin
Posts: 1350
Joined: Wed Feb 26, 2003 4:41 pm
Location: DMCS, Rutgers University
Contact:

Re: Latent Heat Flux Problem with ROMS 741

#2 Unread post by arango »

It is up to you what values to use according to the dataset that you have. Notice that in ocean.in you need to specify the height (m) of the atmospheric fluxes:

Code: Select all

! Height (m) of atmospheric measurements for Bulk fluxes parameterization.

      BLK_ZQ == 10.0d0                     ! air humidity
      BLK_ZT == 10.0d0                     ! air temperature
      BLK_ZW == 10.0d0                     ! winds
Therefore, you can specify the correct height. See bulk_flux.F for details.

paula.campos
Posts: 1
Joined: Thu Jul 17, 2014 1:31 pm
Location: Instituto Nacional de Pesquisas Espacias (INPE)

Re: Latent Heat Flux Problem with ROMS 741

#3 Unread post by paula.campos »

Code: Select all

'Qair'                                             ! Input
  'surface air specific humidity'                  !  relative    or  specific
  'kg/kg'                                          ! [percentage  or  g/kg    ]
  'Qair, scalar, series'
  'qair_time'
  'idQair'
  'r2dvar'                                         ! relative        specific
  1.0d0                                            ! 1/100      or   1.0
Shouldn't you fix the scale, since you are providing Qair in kg/kg instead of g/kg?

allencapa

Re: Latent Heat Flux Problem with ROMS 741

#4 Unread post by allencapa »

Hi Hernan and Paula,

Thanks for your reply. I confirmed that the settings in .in file are correct. In addition, I compared the bulk_flux.F of ROMS 741 (which I am using) and ROMS 451 in COAWST(some colleagues have used before) and found that the calculation of latent heat is different. I tried to modify the code according to the old one and it seems to work properly now.

Here's what I modified,

Code: Select all

# if defined LONGWAVE
!
!  Use Berliand (1952) formula to calculate net longwave radiation.
!  The equation for saturation vapor pressure is from Gill (Atmosphere-
!  Ocean Dynamics, pp 606). Here the coefficient in the cloud term
!  is assumed constant, but it is a function of latitude varying from
!  1.0 at poles to 0.5 at the Equator).
!
! liyi add 20141125 begin 
#  ifdef SPECIFIC_HUMIDITY
!  specific humidity in units of kg/kg
          vap_p=PairM*RH/(1.0_r8+0.378_r8*RH)             !WPB
#  else
      IF(RH.lt.2.0_r8) THEN                               !WPB
! liyi add 20141125 end
          cff=(0.7859_r8+0.03477_r8*TairC(i))/                          &
     &        (1.0_r8+0.00412_r8*TairC(i))
          e_sat=10.0_r8**cff   ! saturation vapor pressure (hPa or mbar)
          vap_p=e_sat*RH       ! water vapor pressure (hPa or mbar)
! liyi add 20141125 begin 
      ELSE                                                !WPB
          vap_p=0.001_r8*PairM*RH/(1.0_r8+0.000378_r8*RH) !WPB
      ENDIF                                               !WPB
#  endif
! liyi add 20141125 end

Code: Select all

! liyi add 20141125 begin
#if defined CORE_FORCING || defined SPECIFIC_HUMIDITY    
! Incoming humidity is specific humidity in (kg/kg)
          Q(i)=RH
#else
! liyi add 20141125 end
          IF (RH.lt.2.0_r8) THEN                       !RH fraction
            cff=cff*RH                                 !Vapor pres (mb)
            Q(i)=0.62197_r8*(cff/(PairM-0.378_r8*cff)) !Spec hum (kg/kg)
          ELSE          !RH input was actually specific humidity in g/kg
            Q(i)=RH/1000.0_r8                          !Spec Hum (kg/kg)
          END IF
! liyi add 20141125 begin
#endif
! liyi add 20141125 end

It seems that ROMS calculates Q (Q=RH/1000) and vap_p (vap_p=0.001_r8*PairM*RH/(1.0_r8+0.000378_r8*RH)) from RH. But if 'RH input was actually specific humidity', this code may cause errors especially when the unit of RH is kg/kg. So should I times the input specific humidity by 1000 and specify it in varinfo.dat?

Thank you

Yi

Post Reply