New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 14592 for NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/ABL/ablmod.F90 – NEMO

Ignore:
Timestamp:
2021-03-05T17:03:57+01:00 (3 years ago)
Author:
gsamson
Message:

sbc_phy:

  • 2 new functions:
    • pres_temp: compute air pressure from air temperature and surface pressure
    • theta_exner: compute air/surface potential temperature following a dry adiabatic transformation
  • 3 modified functions:
    • Ri_bulk: use potential SST instead of SST + some simplifications TBD
    • bulk_formula: pass "rhoa" variable as input argument instead of calculing it with the old "gamma_moist" function inside the routine
    • update_qnsol_tau: pass "rhoa" variable as input argument to pass it to "bulk_formula" function
  • global small cleaning/cosmetics

sbcblk_algo_{ecmwf,coare3p?}: "rhoa" variable updated for CS/WL options and passed as input argument to "update_qnsol_tau" function

sbcblk & sbcabl:
add calls to "pres_temp" & "theta_exner" functions to compute air & surface potential temperatures (over both ocean and sea-ice) before computing sensible heat flux
special attention needed to check if CS/WL increment is properly applied

ticket #2632

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/ABL/ablmod.F90

    r14433 r14592  
    104104      ! 
    105105      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   zwnd_i, zwnd_j 
     106      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   zsspt 
     107      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   ztabs, zpre 
    106108      REAL(wp), DIMENSION(1:jpi      ,2:jpka)    ::   zCF 
    107109      ! 
     
    142144      zrough(:,:) = z0_from_Cd( ght_abl(2), pCd_du(:,:) / MAX( pwndm(:,:), 0.5_wp ) ) ! #LB: z0_from_Cd is define in sbc_phy.F90... 
    143145 
     146      ! sea surface potential temperature [K] 
     147      zsspt(:,:) = theta_exner( psst(:,:)+rt0, pslp_dta(:,:) ) 
     148 
    144149      ! 
    145150      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    187192               DO ji = 1,jpi  ! surface boundary condition for temperature 
    188193                  zztmp1 = psen(ji, jj) 
    189                   zztmp2 = psen(ji, jj) * ( psst(ji, jj) + rt0 ) 
     194                  zztmp2 = psen(ji, jj) * zsspt(ji, jj) 
    190195#if defined key_si3 
    191196                  zztmp1 = zztmp1 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * psen_ice(ji,jj) 
     
    495500               zcff2 = jp_alp3_dyn * zsig**3 + jp_alp2_dyn * zsig**2   & 
    496501                  &  + jp_alp1_dyn * zsig    + jp_alp0_dyn 
    497                zcff  = (1._wp-zmsk) + zmsk * zcff2 * rn_Dt   ! zcff = 1 for masked points 
    498                                                              ! rn_Dt = rDt_abl / nn_fsbc 
     502               zcff  = (1._wp-zmsk) + zmsk * zcff2 * rDt_abl   ! zcff = 1 for masked points 
    499503               zcff  = zcff * rest_eq(ji,jj) 
    500504               u_abl( ji, jj, jk, nt_a ) = (1._wp - zcff ) *  u_abl( ji, jj, jk, nt_a )   & 
     
    518522            zcff2 = jp_alp3_tra * zsig**3 + jp_alp2_tra * zsig**2   & 
    519523               &  + jp_alp1_tra * zsig    + jp_alp0_tra 
    520             zcff  = (1._wp-zmsk) + zmsk * zcff2 * rn_Dt   ! zcff = 1 for masked points 
    521                                                           ! rn_Dt = rDt_abl / nn_fsbc 
     524            zcff  = (1._wp-zmsk) + zmsk * zcff2 * rDt_abl   ! zcff = 1 for masked points 
    522525            tq_abl( ji, jj, jk, nt_a, jp_ta ) = (1._wp - zcff ) * tq_abl( ji, jj, jk, nt_a, jp_ta )   & 
    523526               &                                       + zcff   * pt_dta( ji, jj, jk ) 
     
    586589      ! 
    587590      DO_2D( 1, 1, 1, 1 ) 
    588          ztemp          =  tq_abl( ji, jj, 2, nt_a, jp_ta ) 
    589          zhumi          =  tq_abl( ji, jj, 2, nt_a, jp_qa ) 
    590          zcff           = rho_air( ztemp, zhumi, pslp_dta( ji, jj ) ) 
    591          psen( ji, jj ) =    - cp_air(zhumi) * zcff * psen(ji,jj) * ( psst(ji,jj) + rt0 - ztemp )   !GS: negative sign to respect aerobulk convention 
    592          pevp( ji, jj ) = rn_efac*MAX( 0._wp,  zcff * pevp(ji,jj) * ( pssq(ji,jj)       - zhumi ) ) 
     591         ztemp          = tq_abl( ji, jj, 2, nt_a, jp_ta ) 
     592         zhumi          = tq_abl( ji, jj, 2, nt_a, jp_qa ) 
     593         zpre( ji, jj ) = pres_temp( zhumi, pslp_dta(ji,jj), ght_abl(2), ptpot=ztemp, pta=ztabs( ji, jj ) ) 
     594         zcff           = rho_air( ztabs( ji, jj ), zhumi, zpre( ji, jj ) ) 
     595         psen( ji, jj ) =    - cp_air(zhumi) * zcff * psen(ji,jj) * ( zsspt(ji,jj) - ztemp )         !GS: negative sign to respect aerobulk convention 
     596         pevp( ji, jj ) = rn_efac*MAX( 0._wp,  zcff * pevp(ji,jj) * ( pssq(ji,jj)  - zhumi ) ) 
    593597         plat( ji, jj ) = - L_vap( psst(ji,jj) ) * pevp( ji, jj ) 
    594598         rhoa( ji, jj ) = zcff 
    595599      END_2D 
     600      !!GS: debug only; to be removed 
     601      CALL iom_put ( "pres_zu", zpre(:,:) )  
     602      CALL iom_put ( "tabs_zu", ztabs(:,:) )  
    596603 
    597604      DO_2D( 0, 1, 0, 1 ) 
     
    639646      !    Wind stress relative to the moving ice ( U10m - U_ice )   ! 
    640647      ! ------------------------------------------------------------ ! 
    641       DO_2D( 0, 0, 0, 0 ) 
    642          ptaui_ice(ji,jj) = 0.5_wp * ( rhoa(ji+1,jj) * pCd_du_ice(ji+1,jj) + rhoa(ji,jj) * pCd_du_ice(ji,jj)      )   & 
    643             &                      * ( 0.5_wp * ( u_abl(ji+1,jj,2,nt_a) + u_abl(ji,jj,2,nt_a) ) - pssu_ice(ji,jj) ) 
    644          ptauj_ice(ji,jj) = 0.5_wp * ( rhoa(ji,jj+1) * pCd_du_ice(ji,jj+1) + rhoa(ji,jj) * pCd_du_ice(ji,jj)      )   & 
    645             &                      * ( 0.5_wp * ( v_abl(ji,jj+1,2,nt_a) + v_abl(ji,jj,2,nt_a) ) - pssv_ice(ji,jj) ) 
    646       END_2D 
    647       CALL lbc_lnk( 'ablmod', ptaui_ice, 'U', -1.0_wp, ptauj_ice, 'V', -1.0_wp ) 
    648       ! 
    649       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=ptaui_ice  , clinfo1=' abl_stp: putaui : '   & 
    650          &                                , tab2d_2=ptauj_ice  , clinfo2='          pvtaui : ' ) 
     648      !DO_2D( 0, 0, 0, 0 ) 
     649      !   ptaui_ice(ji,jj) = 0.5_wp * ( rhoa(ji+1,jj) * pCd_du_ice(ji+1,jj) + rhoa(ji,jj) * pCd_du_ice(ji,jj)      )   & 
     650      !      &                      * ( 0.5_wp * ( u_abl(ji+1,jj,2,nt_a) + u_abl(ji,jj,2,nt_a) ) - pssu_ice(ji,jj) ) 
     651      !   ptauj_ice(ji,jj) = 0.5_wp * ( rhoa(ji,jj+1) * pCd_du_ice(ji,jj+1) + rhoa(ji,jj) * pCd_du_ice(ji,jj)      )   & 
     652      !      &                      * ( 0.5_wp * ( v_abl(ji,jj+1,2,nt_a) + v_abl(ji,jj,2,nt_a) ) - pssv_ice(ji,jj) ) 
     653      !END_2D 
     654      !CALL lbc_lnk( 'ablmod', ptaui_ice, 'U', -1.0_wp, ptauj_ice, 'V', -1.0_wp ) 
     655      !! 
     656      !IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=ptaui_ice  , clinfo1=' abl_stp: putaui : '   & 
     657      !   &                                , tab2d_2=ptauj_ice  , clinfo2='          pvtaui : ' ) 
     658 
    651659      ! ------------------------------------------------------------ ! 
    652660      !    Wind stress relative to the moving ice ( U10m - U_ice )   ! 
Note: See TracChangeset for help on using the changeset viewer.