Changeset 10879


Ignore:
Timestamp:
2019-04-16T14:58:06+02:00 (19 months ago)
Author:
anaguiar
Message:

Changes to reinstate heat fluxes, see https://code.metoffice.gov.uk/trac/gmed/ticket/454

Location:
branches/UKMO/dev_r5518_FOAMv14_output_heat_fluxes/NEMOGCM/NEMO/OPA_SRC/SBC
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_FOAMv14_output_heat_fluxes/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90

    r8046 r10879  
    9898   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress) 
    9999   !!                                   !!   now    ! before   !! 
    100    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2] 
    101    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2] 
    102    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]  
     100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)       [N/m2] 
     101   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)       [N/m2] 
     102   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)      [N/m2]  
    103103   !! wndm is used onmpute surface gases exchanges in ice-free ocean or leads 
    104    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s] 
    105    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2] 
    106    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2] 
    107    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2] 
    108    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2] 
    109    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s] 
    110    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSU/m2/s] 
    111    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s] 
    112    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s] 
     104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)    [m/s] 
     105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                       [W/m2] 
     106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                       [W/m2] 
     107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qlw               !: downward longwave heat flux over sea non solar [W/m2] 
     108   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsb               !: downward sensible heat flux over sea non solar [W/m2] 
     109   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qla               !: downward latent heat flux over sea non solar   [W/m2] 
     110   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice)   [W/m2] 
     111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice)   [W/m2] 
     112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux                 [Kg/m2/s] 
     113   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                      [PSU/m2/s] 
     114   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                   [Kg/m2/s] 
     115   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting            [Kg/m2/s] 
    113116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff        [Kg/m2/s]   
    114117   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwfisf , fwfisf_b !: ice shelf melting   [Kg/m2/s]   
     
    188191         ! 
    189192      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        & 
     193         &      qlw    (jpi,jpj) , qsb  (jpi,jpj) , qla  (jpi,jpj),        & 
    190194         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        & 
    191195         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        & 
  • branches/UKMO/dev_r5518_FOAMv14_output_heat_fluxes/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r9288 r10879  
    253253      REAL(wp), DIMENSION(:,:), POINTER ::   zwnd_i, zwnd_j    ! wind speed components at T-point 
    254254      REAL(wp), DIMENSION(:,:), POINTER ::   zqsatw            ! specific humidity at pst 
    255       REAL(wp), DIMENSION(:,:), POINTER ::   zqlw, zqsb        ! long wave and sensible heat fluxes 
    256       REAL(wp), DIMENSION(:,:), POINTER ::   zqla, zevap       ! latent heat fluxes and evaporation 
     255      REAL(wp), DIMENSION(:,:), POINTER ::   zevap             ! evaporation 
    257256      REAL(wp), DIMENSION(:,:), POINTER ::   Cd                ! transfer coefficient for momentum      (tau) 
    258257      REAL(wp), DIMENSION(:,:), POINTER ::   Ch                ! transfer coefficient for sensible heat (Q_sens) 
     
    265264      IF( nn_timing == 1 )  CALL timing_start('blk_oce_core') 
    266265      ! 
    267       CALL wrk_alloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zqlw, zqsb, zqla, zevap ) 
     266      CALL wrk_alloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zevap ) 
    268267      CALL wrk_alloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
    269268      ! 
     
    311310      ENDIF 
    312311 
    313       zqlw(:,:) = (  sf(jp_qlw)%fnow(:,:,1) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:)  ) * tmask(:,:,1)   ! Long  Wave 
     312      qlw(:,:) = (  sf(jp_qlw)%fnow(:,:,1) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:)  ) * tmask(:,:,1)   ! Long  Wave 
    314313      ! ----------------------------------------------------------------------------- ! 
    315314      !     II    Turbulent FLUXES                                                    ! 
     
    359358         !! q_air and t_air are (or "are almost") given at 10m (wind reference height) 
    360359         zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - sf(jp_humi)%fnow(:,:,1) )*wndm(:,:) ) ! Evaporation 
    361          zqsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - sf(jp_tair)%fnow(:,:,1) )*wndm(:,:)   ! Sensible Heat 
     360         qsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - sf(jp_tair)%fnow(:,:,1) )*wndm(:,:)   ! Sensible Heat 
    362361      ELSE 
    363362         !! q_air and t_air are not given at 10m (wind reference height) 
    364363         ! Values of temp. and hum. adjusted to height of wind during bulk algorithm iteration must be used!!! 
    365364         zevap(:,:) = rn_efac*MAX( 0._wp,     rhoa*Ce(:,:)*( zqsatw(:,:) - zq_zu(:,:) )*wndm(:,:) )   ! Evaporation 
    366          zqsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - zt_zu(:,:) )*wndm(:,:)     ! Sensible Heat 
    367       ENDIF 
    368       zqla (:,:) = Lv * zevap(:,:)                                                              ! Latent Heat 
     365         qsb (:,:) =                     cpa*rhoa*Ch(:,:)*( zst   (:,:) - zt_zu(:,:) )*wndm(:,:)     ! Sensible Heat 
     366      ENDIF 
     367      qla (:,:) = Lv * zevap(:,:)                                                              ! Latent Heat 
    369368 
    370369      IF(ln_ctl) THEN 
    371          CALL prt_ctl( tab2d_1=zqla  , clinfo1=' blk_oce_core: zqla   : ', tab2d_2=Ce , clinfo2=' Ce  : ' ) 
    372          CALL prt_ctl( tab2d_1=zqsb  , clinfo1=' blk_oce_core: zqsb   : ', tab2d_2=Ch , clinfo2=' Ch  : ' ) 
    373          CALL prt_ctl( tab2d_1=zqlw  , clinfo1=' blk_oce_core: zqlw   : ', tab2d_2=qsr, clinfo2=' qsr : ' ) 
     370         CALL prt_ctl( tab2d_1=qla  , clinfo1=' blk_oce_core: qla   : ', tab2d_2=Ce , clinfo2=' Ce  : ' ) 
     371         CALL prt_ctl( tab2d_1=qsb  , clinfo1=' blk_oce_core: qsb   : ', tab2d_2=Ch , clinfo2=' Ch  : ' ) 
     372         CALL prt_ctl( tab2d_1=qlw  , clinfo1=' blk_oce_core: qlw   : ', tab2d_2=qsr, clinfo2=' qsr : ' ) 
    374373         CALL prt_ctl( tab2d_1=zqsatw, clinfo1=' blk_oce_core: zqsatw : ', tab2d_2=zst, clinfo2=' zst : ' ) 
    375374         CALL prt_ctl( tab2d_1=utau  , clinfo1=' blk_oce_core: utau   : ', mask1=umask,   & 
     
    386385         &         - sf(jp_prec)%fnow(:,:,1) * rn_pfac  ) * tmask(:,:,1) 
    387386      ! 
    388       qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                &   ! Downward Non Solar  
     387      qns(:,:) = qlw(:,:) - qsb(:,:) - qla(:,:)                                   &   ! Downward Non Solar  
    389388         &     - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus                         &   ! remove latent melting heat for solid precip 
    390389         &     - zevap(:,:) * pst(:,:) * rcp                                      &   ! remove evap heat content at SST 
     
    395394      ! 
    396395#if defined key_lim3 
    397       qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                ! non solar without emp (only needed by LIM3) 
     396      qns_oce(:,:) = qlw(:,:) - qsb(:,:) - qla(:,:)                                ! non solar without emp (only needed by LIM3) 
    398397      qsr_oce(:,:) = qsr(:,:) 
    399398#endif 
    400399      ! 
    401400      IF ( nn_ice == 0 ) THEN 
    402          CALL iom_put( "qlw_oce" ,   zqlw )                 ! output downward longwave heat over the ocean 
    403          CALL iom_put( "qsb_oce" , - zqsb )                 ! output downward sensible heat over the ocean 
    404          CALL iom_put( "qla_oce" , - zqla )                 ! output downward latent   heat over the ocean 
    405          CALL iom_put( "qemp_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
    406          CALL iom_put( "qns_oce" ,   qns  )                 ! output downward non solar heat over the ocean 
    407          CALL iom_put( "qsr_oce" ,   qsr  )                 ! output downward solar heat over the ocean 
    408          CALL iom_put( "qt_oce"  ,   qns+qsr )              ! output total downward heat over the ocean 
    409          tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac   ! output total precipitation [kg/m2/s] 
    410          sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac   ! output solid precipitation [kg/m2/s] 
    411          CALL iom_put( 'snowpre', sprecip * 86400. )        ! Snow 
    412          CALL iom_put( 'precip' , tprecip * 86400. )        ! Total precipitation 
     401          CALL iom_put( "qlw_oce" ,   qlw )                  ! output downward longwave heat over the ocean 
     402          CALL iom_put( "qsb_oce" , - qsb )                  ! output downward sensible heat over the ocean 
     403          CALL iom_put( "qla_oce" , - qla )                  ! output downward latent   heat over the ocean 
     404          CALL iom_put( "qemp_oce",   qns-qlw+qsb+qla )      ! output downward heat content of E-P over the ocean 
     405          CALL iom_put( "qns_oce" ,   qns  )                 ! output downward non solar heat over the ocean 
     406          CALL iom_put( "qsr_oce" ,   qsr  )                 ! output downward solar heat over the ocean 
     407          CALL iom_put( "qt_oce"  ,   qns+qsr )              ! output total downward heat over the ocean 
     408          tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac   ! output total precipitation [kg/m2/s] 
     409          sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac   ! output solid precipitation [kg/m2/s] 
     410          CALL iom_put( 'snowpre', sprecip * 86400. )        ! Snow 
     411          CALL iom_put( 'precip' , tprecip * 86400. )        ! Total precipitation 
    413412      ENDIF 
    414413      ! 
    415414      IF(ln_ctl) THEN 
    416          CALL prt_ctl(tab2d_1=zqsb , clinfo1=' blk_oce_core: zqsb   : ', tab2d_2=zqlw , clinfo2=' zqlw  : ') 
    417          CALL prt_ctl(tab2d_1=zqla , clinfo1=' blk_oce_core: zqla   : ', tab2d_2=qsr  , clinfo2=' qsr   : ') 
     415         CALL prt_ctl(tab2d_1=qsb , clinfo1=' blk_oce_core: qsb   : ', tab2d_2=qlw , clinfo2=' qlw  : ') 
     416         CALL prt_ctl(tab2d_1=qla , clinfo1=' blk_oce_core: qla   : ', tab2d_2=qsr  , clinfo2=' qsr   : ') 
    418417         CALL prt_ctl(tab2d_1=pst  , clinfo1=' blk_oce_core: pst    : ', tab2d_2=emp  , clinfo2=' emp   : ') 
    419418         CALL prt_ctl(tab2d_1=utau , clinfo1=' blk_oce_core: utau   : ', mask1=umask,   & 
     
    421420      ENDIF 
    422421      ! 
    423       CALL wrk_dealloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zqlw, zqsb, zqla, zevap ) 
     422      CALL wrk_dealloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zevap ) 
    424423      CALL wrk_dealloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
    425424      ! 
  • branches/UKMO/dev_r5518_FOAMv14_output_heat_fluxes/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90

    r10302 r10879  
    668668! Solar penetrative radiation and non solar surface heat flux 
    669669 
    670 ! Scale qsr and qns according to ice fraction (bulk formulae only) 
     670! Scale qsr, qns, qlw, qsb, qla according to ice fraction (bulk formulae only) 
    671671 
    672672      IF (ksbc == jp_core) THEN 
    673673         qsr(:,:)=qsr(:,:)*(1.0-fr_i(:,:)) 
    674674         qns(:,:)=qns(:,:)*(1.0-fr_i(:,:)) 
     675         qlw(:,:)=qlw(:,:)*(1.0-fr_i(:,:)) 
     676         qsb(:,:)=qsb(:,:)*(1.0-fr_i(:,:)) 
     677         qla(:,:)=qla(:,:)*(1.0-fr_i(:,:)) 
    675678      ENDIF 
    676679! Take into account snow melting except for fully coupled when already in qns_tot 
     
    680683      ELSE 
    681684         qns(:,:)= qns(:,:)-sprecip(:,:)*Lfresh*(1.0-fr_i(:,:)) 
     685         qla(:,:)= qla(:,:)+sprecip(:,:)*Lfresh*(1.0-fr_i(:,:)) 
    682686      ENDIF 
    683687 
  • branches/UKMO/dev_r5518_FOAMv14_output_heat_fluxes/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90

    r10302 r10879  
    479479         CALL iom_put( "taum"  , taum       )                   ! wind stress module  
    480480         CALL iom_put( "wspd"  , wndm       )                   ! wind speed  module over free ocean or leads in presence of sea-ice 
     481         IF( nn_ice > 0 ) THEN  
     482            CALL iom_put( "qlw_oce"  ,   qlw   )                ! output surface_net_downward_longwave_flux 
     483            CALL iom_put( "qsb_oce"  , - qsb   )                ! output surface_downward_sensible_heat_flux 
     484            CALL iom_put( "qla_oce"  , - qla   )                ! output surface_downward_latent_heat_flux 
     485         ENDIF 
    481486      ENDIF 
    482487      ! 
Note: See TracChangeset for help on using the changeset viewer.