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 11873 – NEMO

Changeset 11873


Ignore:
Timestamp:
2019-11-07T18:15:22+01:00 (5 years ago)
Author:
gsamson
Message:

dev_r11265_ABL: minor lbc bugfix, cleaning and additional outputs (#2131)

Location:
NEMO/branches/2019/dev_r11265_ASINTER-01_Guillaume_ABL1D
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11265_ASINTER-01_Guillaume_ABL1D/cfgs/SHARED/field_def_nemo-oce.xml

    r11587 r11873  
    361361          <field id="q_dta"      long_name="DTA specific humidity"         standard_name="dta_qspe"       unit="kg/kg"    /> 
    362362          <field id="coeft"      long_name="ABL nudging coefficient"       standard_name="coeft"          unit=""         /> 
     363          <field id="tke_abl"    long_name="ABL turbulent kinetic energy"  standard_name="abl_tke"        unit="m2/s2"    /> 
     364          <field id="avm_abl"    long_name="ABL turbulent viscosity"       standard_name="abl_avm"        unit="m2/s"     /> 
     365          <field id="avt_abl"    long_name="ABL turbulent diffusivity"     standard_name="abl_avt"        unit="m2/s"     /> 
     366          <field id="mxl_abl"    long_name="ABL mixing length"             standard_name="abl_mxl"        unit="m"        /> 
    363367   </field_group> 
    364368 
  • NEMO/branches/2019/dev_r11265_ASINTER-01_Guillaume_ABL1D/src/ABL/ablmod.F90

    r11586 r11873  
    4545              &          , ptm_su,pssu_ice,pssv_ice,pssq_ice,pcd_du_ice  &  
    4646              &          , psen_ice, pevp_ice, pwndm_ice, pfrac_oce      &  
    47            &          , ptaui_ice,     ptauj_ice                      & 
     47              &          , ptaui_ice,     ptauj_ice                      & 
    4848#endif            
    4949           &   ) 
     
    127127      DO jj = 1,jpj 
    128128         DO ji = 1,jpi 
    129           zzoce         = pCd_du    (ji,jj) * pwndm    (ji,jj) 
    130 #if defined key_si3            
    131          zzice         = pCd_du_ice(ji,jj) * pwndm_ice(ji,jj)  
    132           ustar2(ji,jj) = zzoce * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * zzice  
     129            zzoce         = pCd_du    (ji,jj) * pwndm    (ji,jj) 
     130#if defined key_si3 
     131            zzice         = pCd_du_ice(ji,jj) * pwndm_ice(ji,jj)  
     132            ustar2(ji,jj) = zzoce * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * zzice  
    133133#else 
    134            ustar2(ji,jj) = zzoce  
    135 #endif                   
     134            ustar2(ji,jj) = zzoce    
     135#endif 
    136136         END DO 
    137137      END DO   
     
    153153         DO jk = 3, jpkam1 
    154154            DO ji = 1, jpi   ! vector opt. 
    155                z_elem_a( ji,     jk              ) = - rdt_abl * Avt_abl( ji, jj, jk-1 ) / e3w_abl( jk-1 )          ! lower-diagonal 
    156                z_elem_c( ji,     jk              ) = - rdt_abl * Avt_abl( ji, jj, jk   ) / e3w_abl( jk   )          ! upper-diagonal        
    157                z_elem_b( ji,     jk              ) = e3t_abl(jk) - z_elem_a( ji, jk ) - z_elem_c( ji, jk )  !       diagonal            
     155               z_elem_a( ji,     jk              ) = - rdt_abl * Avt_abl( ji, jj, jk-1 ) / e3w_abl( jk-1 )   ! lower-diagonal 
     156               z_elem_c( ji,     jk              ) = - rdt_abl * Avt_abl( ji, jj, jk   ) / e3w_abl( jk   )   ! upper-diagonal        
     157               z_elem_b( ji,     jk              ) = e3t_abl(jk) - z_elem_a( ji, jk ) - z_elem_c( ji, jk )   !       diagonal            
    158158            END DO 
    159159         END DO   
     
    168168            z_elem_b( ji,     jpka           ) = e3t_abl( jpka ) - z_elem_a( ji,     jpka ) 
    169169         END DO             
    170                     
     170 
    171171         DO jtra = 1,jptq  ! loop on active tracers 
    172172                
    173173            DO jk = 3, jpkam1 
    174                DO ji = fs_2, fs_jpim1                  
     174               DO ji = 1,jpi 
    175175                  tq_abl  ( ji, jj, jk, nt_a, jtra ) = e3t_abl(jk) * tq_abl  ( ji, jj, jk, nt_n, jtra )   ! initialize right-hand-side 
    176176               END DO 
     
    178178 
    179179            IF(jtra == jp_ta) THEN 
    180                DO ji = 1,jpi  ! surface boundary condition for temperature               
     180               DO ji = 1,jpi  ! boundary conditions for temperature               
    181181                  zztmp1 = psen(ji, jj)  
    182               zztmp2 = psen(ji, jj) * ( psst(ji, jj) + rt0 )    
     182                  zztmp2 = psen(ji, jj) * ( psst(ji, jj) + rt0 )   
    183183#if defined key_si3              
    184184                  zztmp1 = zztmp1 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * psen_ice(ji,jj)  
    185185                  zztmp2 = zztmp2 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * psen_ice(ji,jj) * ptm_su(ji,jj) 
    186186#endif               
    187               z_elem_b( ji,     2              ) = e3t_abl( 2 ) - z_elem_c( ji, 2 ) + rdt_abl * zztmp1               
    188                   tq_abl  ( ji, jj, 2, nt_a, jtra  ) = e3t_abl( 2 ) * tq_abl  ( ji, jj, 2, nt_n, jtra ) + rdt_abl * zztmp2                
    189               tq_abl  ( ji, jj, jpka, nt_a, jtra ) = e3t_abl( jpka ) * tq_abl  ( ji, jj, jpka, nt_n, jtra ) 
     187                  z_elem_b( ji,     2                ) = e3t_abl( 2 ) - z_elem_c( ji, 2 ) + rdt_abl * zztmp1               
     188                  tq_abl  ( ji, jj, 2   , nt_a, jtra ) = e3t_abl( 2    ) * tq_abl  ( ji, jj, 2   , nt_n, jtra ) + rdt_abl * zztmp2                
     189                  tq_abl  ( ji, jj, jpka, nt_a, jtra ) = e3t_abl( jpka ) * tq_abl  ( ji, jj, jpka, nt_n, jtra ) 
    190190               END DO  
    191191            ELSE    
    192                DO ji = 1,jpi  ! surface boundary condition for humidity               
     192               DO ji = 1,jpi  ! boundary conditions for humidity               
    193193                  zztmp1 = pevp(ji, jj)  
    194               zztmp2 = pevp(ji, jj) * pssq(ji, jj)    
     194                  zztmp2 = pevp(ji, jj) * pssq(ji, jj)    
    195195#if defined key_si3              
    196196                  zztmp1 = zztmp1 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pevp_ice(ji,jj)  
    197               zztmp2 = zztmp2 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pevp_ice(ji, jj) * pssq_ice(ji, jj)     
     197                  zztmp2 = zztmp2 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pevp_ice(ji, jj) * pssq_ice(ji, jj)     
    198198#endif    
    199                   z_elem_b( ji,     2              ) = e3t_abl( 2 ) - z_elem_c( ji, 2 ) + rdt_abl * zztmp1 
    200                   tq_abl  ( ji, jj, 2, nt_a, jtra  ) = e3t_abl( 2 ) * tq_abl  ( ji, jj, 2, nt_n, jtra ) + rdt_abl * zztmp2                
     199                  z_elem_b( ji,     2                ) = e3t_abl( 2 ) - z_elem_c( ji, 2 ) + rdt_abl * zztmp1 
     200                  tq_abl  ( ji, jj, 2   , nt_a, jtra ) = e3t_abl( 2    ) * tq_abl  ( ji, jj, 2   , nt_n, jtra ) + rdt_abl * zztmp2                
    201201                  tq_abl  ( ji, jj, jpka, nt_a, jtra ) = e3t_abl( jpka ) * tq_abl  ( ji, jj, jpka, nt_n, jtra ) 
    202202               END DO                                      
     
    442442                  zcff  = (1._wp-zmsk) + zmsk * zcff2 * rdt   ! zcff = 1 for masked points 
    443443                                                              ! rdt = rdt_abl / nn_fsbc                           
    444         zcff  = zcff * rest_eq(ji,jj) ; z_cft( ji, jj, jk ) = zcff 
    445                
     444                  zcff  = zcff * rest_eq(ji,jj) 
     445                  z_cft( ji, jj, jk ) = zcff 
    446446                  u_abl( ji, jj, jk, nt_a ) = (1._wp - zcff ) *  u_abl( ji, jj, jk, nt_a )   & 
    447447                     &                               + zcff   * pu_dta( ji, jj, jk       )                       
     
    468468               zcff  = (1._wp-zmsk) + zmsk * zcff2 * rdt   ! zcff = 1 for masked points 
    469469                                                           ! rdt = rdt_abl / nn_fsbc                           
     470               !z_cft( ji, jj, jk ) = zcff 
    470471               tq_abl( ji, jj, jk, nt_a, jp_ta ) = (1._wp - zcff ) * tq_abl( ji, jj, jk, nt_a, jp_ta )   & 
    471472                  &                                       + zcff   * pt_dta( ji, jj, jk ) 
     
    474475                  &                                       + zcff   * pq_dta( ji, jj, jk ) 
    475476                
    476                ! z_cft( ji, jj, jk ) = zcff 
    477477            END DO 
    478478         END DO 
     
    483483      !                            !  6 *** MPI exchanges   
    484484      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    485      ! 
    486       CALL lbc_lnk_multi( 'ablmod',  u_abl(:,:,:,nt_a      ), 'T', -1.,  v_abl(:,:,:,nt_a      ), 'T', -1., kfillmode = jpfillnothing  ) 
    487       CALL lbc_lnk_multi( 'ablmod', tq_abl(:,:,:,nt_a,jp_ta), 'T',  1., tq_abl(:,:,:,nt_a,jp_qa), 'T',  1., kfillmode = jpfillnothing  )   ! ++++ this should not be needed... 
    488      ! 
    489       CALL iom_put ( 'u_abl',  u_abl(:,:,2:jpka,nt_a      )) 
    490       CALL iom_put ( 'v_abl',  v_abl(:,:,2:jpka,nt_a      )) 
    491       CALL iom_put ( 't_abl', tq_abl(:,:,2:jpka,nt_a,jp_ta)) 
    492       CALL iom_put ( 'q_abl', tq_abl(:,:,2:jpka,nt_a,jp_qa)) 
    493       CALL iom_put ( 'coeft',  z_cft(:,:,2:jpka           )) 
    494       CALL iom_put (  'pblh',   pblh(:,:                  )) 
     485      ! 
     486      CALL lbc_lnk_multi( 'ablmod',  u_abl(:,:,:,nt_a      ), 'T', -1.,  v_abl(:,:,:,nt_a      ), 'T', -1. ) 
     487      ! 
     488      ! first ABL level 
     489      IF ( iom_use("uz1_abl") ) CALL iom_put ( "uz1_abl",   u_abl(:,:,2,nt_a      ) ) 
     490      IF ( iom_use("vz1_abl") ) CALL iom_put ( "vz1_abl",   v_abl(:,:,2,nt_a      ) ) 
     491      IF ( iom_use("tz1_abl") ) CALL iom_put ( "tz1_abl",  tq_abl(:,:,2,nt_a,jp_ta) ) 
     492      IF ( iom_use("qz1_abl") ) CALL iom_put ( "qz1_abl",  tq_abl(:,:,2,nt_a,jp_qa) ) 
     493      IF ( iom_use("uz1_dta") ) CALL iom_put ( "uz1_dta",  pu_dta(:,:,2           ) ) 
     494      IF ( iom_use("vz1_dta") ) CALL iom_put ( "vz1_dta",  pv_dta(:,:,2           ) ) 
     495      IF ( iom_use("tz1_dta") ) CALL iom_put ( "tz1_dta",  pt_dta(:,:,2           ) ) 
     496      IF ( iom_use("qz1_dta") ) CALL iom_put ( "qz1_dta",  pq_dta(:,:,2           ) ) 
     497      ! all ABL levels 
     498      IF ( iom_use("u_abl"  ) ) CALL iom_put ( "u_abl"  ,   u_abl(:,:,2:jpka,nt_a      ) ) 
     499      IF ( iom_use("v_abl"  ) ) CALL iom_put ( "v_abl"  ,   v_abl(:,:,2:jpka,nt_a      ) ) 
     500      IF ( iom_use("t_abl"  ) ) CALL iom_put ( "t_abl"  ,  tq_abl(:,:,2:jpka,nt_a,jp_ta) ) 
     501      IF ( iom_use("q_abl"  ) ) CALL iom_put ( "q_abl"  ,  tq_abl(:,:,2:jpka,nt_a,jp_qa) ) 
     502      IF ( iom_use("tke_abl") ) CALL iom_put ( "tke_abl", tke_abl(:,:,2:jpka,nt_a      ) ) 
     503      IF ( iom_use("avm_abl") ) CALL iom_put ( "avm_abl", avm_abl(:,:,2:jpka           ) ) 
     504      IF ( iom_use("avt_abl") ) CALL iom_put ( "avt_abl", avm_abl(:,:,2:jpka           ) ) 
     505      IF ( iom_use("mxl_abl") ) CALL iom_put ( "mxl_abl", mxl_abl(:,:,2:jpka           ) ) 
     506      IF ( iom_use("pblh"   ) ) CALL iom_put (  "pblh"  ,    pblh(:,:                  ) ) 
     507      ! debug (to be removed) 
     508      IF ( iom_use("u_dta") ) CALL iom_put ( "u_dta",  pu_dta(:,:,2:jpka) ) 
     509      IF ( iom_use("v_dta") ) CALL iom_put ( "v_dta",  pv_dta(:,:,2:jpka) ) 
     510      IF ( iom_use("t_dta") ) CALL iom_put ( "t_dta",  pt_dta(:,:,2:jpka) ) 
     511      IF ( iom_use("q_dta") ) CALL iom_put ( "q_dta",  pq_dta(:,:,2:jpka) ) 
     512      IF ( iom_use("coeft") ) CALL iom_put ( "coeft",   z_cft(:,:,2:jpka) ) 
     513      IF( ln_geos_winds ) THEN 
     514         IF ( iom_use("uz1_geo") ) CALL iom_put ( "uz1_geo", pgu_dta(:,:,2           ) ) 
     515         IF ( iom_use("vz1_geo") ) CALL iom_put ( "vz1_geo", pgv_dta(:,:,2           ) ) 
     516      END IF 
     517      IF( ln_hpgls_frc ) THEN 
     518         IF ( iom_use("uz1_geo") ) CALL iom_put ( "uz1_geo",  pgu_dta(:,:,2)/MAX(fft_abl(:,:),2.5e-5_wp)   ) 
     519         IF ( iom_use("vz1_geo") ) CALL iom_put ( "vz1_geo", -pgv_dta(:,:,2)/MAX(fft_abl(:,:),2.5e-5_wp)   ) 
     520      END IF 
    495521      ! 
    496522      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    772798            END IF  
    773799         END DO 
    774          ! Optional : could add pblh smoothing if pblh is noisy horizontally ...  
    775          ! 
    776800      !-------------       
    777801      END DO       
    778802      !------------- 
    779      IF(ln_smth_pblh) THEN 
    780         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.) 
    781         CALL smooth_pblh( pblh, msk_abl ) 
    782         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.)     
    783      ENDIF 
     803      ! 
     804      ! Optional : could add pblh smoothing if pblh is noisy horizontally ...  
     805      IF(ln_smth_pblh) THEN 
     806         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.) 
     807         CALL smooth_pblh( pblh, msk_abl ) 
     808         CALL lbc_lnk( 'ablmod', pblh, 'T', 1.)    
     809      ENDIF 
    784810      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    785811      !                            !  Diagnostic mixing length computation 
Note: See TracChangeset for help on using the changeset viewer.