Changeset 12799


Ignore:
Timestamp:
2020-04-23T10:11:38+02:00 (6 months ago)
Author:
gsamson
Message:

move rhoa computation from sbcabl to sbcblk (to avoid restartability issue over sea-ice); correct prt_ctl calls in ablmod and comment a ctl_stop in iom to allow using 3D atm forcing with bulk mode

Location:
NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/ABL/ablmod.F90

    r12749 r12799  
    1818   USE dom_oce, ONLY  : tmask 
    1919   USE sbc_oce, ONLY  : ght_abl, ghw_abl, e3t_abl, e3w_abl, jpka, jpkam1, rhoa 
    20    USE sbcblk         ! use rn_?fac 
     20   USE sbcblk         ! use rn_?fac, cdn_oce 
    2121   USE sbcblk_phy     ! use some physical constants for flux computation 
    2222   ! 
     
    102102#endif 
    103103      ! 
    104       REAL(wp), DIMENSION(1:jpi,1:jpj   )        ::   zwnd_i, zwnd_j 
    105       REAL(wp), DIMENSION(1:jpi,2:jpka  )        ::   zCF 
    106       ! 
    107       REAL(wp), DIMENSION(1:jpi,1:jpka  )        ::   z_elem_a 
    108       REAL(wp), DIMENSION(1:jpi,1:jpka  )        ::   z_elem_b 
    109       REAL(wp), DIMENSION(1:jpi,1:jpka  )        ::   z_elem_c 
     104      REAL(wp), DIMENSION(1:jpi,1:jpj       )    ::   zwnd_i, zwnd_j 
     105      REAL(wp), DIMENSION(1:jpi      ,2:jpka)    ::   zCF 
     106      ! 
     107      REAL(wp), DIMENSION(1:jpi      ,1:jpka)    ::   z_elem_a 
     108      REAL(wp), DIMENSION(1:jpi      ,1:jpka)    ::   z_elem_b 
     109      REAL(wp), DIMENSION(1:jpi      ,1:jpka)    ::   z_elem_c 
    110110      ! 
    111111      INTEGER             ::   ji, jj, jk, jtra, jbak               ! dummy loop indices 
     
    351351#if defined key_si3 
    352352            zztmp1 = zztmp1 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pcd_du_ice(ji, jj) 
    353             zzice  = 0.5_wp * ( pssu_ice(ji-1, jj) + pssu_ice(ji,jj) ) * rn_vfac 
     353            zzice  = 0.5_wp * ( pssu_ice(ji-1, jj) + pssu_ice(ji, jj) ) * rn_vfac 
    354354            zztmp2 = zztmp2 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pcd_du_ice(ji, jj) * zzice 
    355355#endif 
     
    425425#if defined key_si3 
    426426            zztmp1 = zztmp1 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pcd_du_ice(ji, jj) 
    427             zzice  = 0.5_wp * ( pssv_ice(ji, jj) + pssv_ice(ji,jj-1) ) * rn_vfac 
     427            zzice  = 0.5_wp * ( pssv_ice(ji, jj) + pssv_ice(ji, jj-1) ) * rn_vfac 
    428428            zztmp2 = zztmp2 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * pcd_du_ice(ji, jj) * zzice 
    429429#endif 
     
    624624 
    625625      IF(sn_cfctl%l_prtctl) THEN 
    626          CALL prt_ctl( tab2d_1=pwndm  , clinfo1=' abl_stp: wndm   : ' ) 
    627          CALL prt_ctl( tab2d_1=ptaui  , clinfo1=' abl_stp: utau   : ' ) 
    628          CALL prt_ctl( tab2d_2=ptauj  , clinfo2=          'vtau   : ' ) 
     626         CALL prt_ctl( tab2d_1=ptaui , clinfo1=' abl_stp: utau   : ', mask1=umask,   & 
     627            &          tab2d_2=ptauj , clinfo2='          vtau   : ', mask2=vmask ) 
     628         CALL prt_ctl( tab2d_1=pwndm , clinfo1=' abl_stp: wndm   : ' ) 
    629629      ENDIF 
    630630 
     
    647647      CALL lbc_lnk_multi( 'ablmod', ptaui_ice, 'U', -1., ptauj_ice, 'V', -1. ) 
    648648      ! 
    649       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=ptaui_ice  , clinfo1=' abl_stp: putaui : '   & 
    650          &                                , tab2d_2=ptauj_ice  , clinfo2='          pvtaui : ' ) 
     649      IF(sn_cfctl%l_prtctl) THEN 
     650         CALL prt_ctl( tab2d_1=ptaui_ice , clinfo1=' abl_stp: utau_ice : ', mask1=umask,   & 
     651            &          tab2d_2=ptauj_ice , clinfo2='          vtau_ice : ', mask2=vmask ) 
     652      END IF 
    651653#endif 
    652654      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    722724         ! Compute vertical shear 
    723725         DO jk = 2, jpkam1 
    724             DO ji = 1,jpi 
     726            DO ji = 1, jpi 
    725727               zcff        = 1.0_wp / e3w_abl( jk )**2 
    726728               zdU         = zcff* Avm_abl(ji,jj,jk) * (u_abl( ji, jj, jk+1, tind)-u_abl( ji, jj, jk  , tind) )**2 
     
    889891            DO jk = 2, jpkam1 
    890892               DO ji = 1, jpi 
    891                   zbuoy             = MAX( zbn2(ji, jj, jk), rsmall ) 
     893                  zbuoy = MAX( zbn2(ji, jj, jk), rsmall ) 
    892894                  mxlm_abl( ji, jj, jk ) = MAX( mxl_min,  & 
    893                      &               SQRT( 2._wp * tke_abl( ji, jj, jk, nt_a ) / zbuoy )   ) 
     895                     &               SQRT( 2._wp * tke_abl( ji, jj, jk, nt_a ) / zbuoy ) ) 
    894896               END DO 
    895897            END DO 
  • NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/ABL/sbcabl.F90

    r12770 r12799  
    209209      ! ABL timestep 
    210210      rDt_abl = nn_fsbc * rn_Dt 
     211      IF(lwp) WRITE(numout,*) ' ABL timestep = ', rDt_abl,' s' 
    211212 
    212213      ! Check parameters for dynamics 
     
    294295      ENDIF 
    295296 
    296       rhoa(:,:) = rho_air( tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa), sf(jp_slp)%fnow(:,:,1) ) !!GS: rhoa must be (re)computed here here to avoid division by zero in blk_ice_1 (TBI) 
    297  
    298297   END SUBROUTINE sbc_abl_init 
    299298 
     
    335334      CALL fld_read( kt, nn_fsbc, sf )             ! input fields provided at the current time-step 
    336335 
    337       !!------------------------------------------------------------------------------------------- 
    338       !! 2 - Compute Cd x ||U||, Ch x ||U||, Ce x ||U||, and SSQ using now fields 
    339       !!------------------------------------------------------------------------------------------- 
    340  
    341       CALL blk_oce_1( kt,  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),   &   !   <<= in 
    342          &                tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),   &   !   <<= in 
    343          &                sf(jp_slp )%fnow(:,:,1) , sst_m, ssu_m, ssv_m     ,   &   !   <<= in 
    344          &                sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1) ,   &   !   <<= in 
    345          &                tsk_m, zssq, zcd_du, zsen, zevp                       )   !   =>> out 
    346  
    347 #if defined key_si3 
    348       CALL blk_ice_1(  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),    &   !   <<= in 
    349          &            tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),    &   !   <<= in 
    350          &            sf(jp_slp)%fnow(:,:,1)  ,  u_ice, v_ice, tm_su    ,    &   !   <<= in 
    351          &            pseni=zseni, pevpi=zevpi, pssqi=zssqi, pcd_dui=zcd_dui )   !   <<= out 
    352 #endif 
    353  
    354       !!------------------------------------------------------------------------------------------- 
    355       !! 3 - Advance ABL variables from now (n) to after (n+1) 
    356       !!------------------------------------------------------------------------------------------- 
    357  
    358       CALL abl_stp( kt, tsk_m, ssu_m, ssv_m, zssq,                          &   !   <<= in 
    359          &              sf(jp_wndi)%fnow(:,:,:), sf(jp_wndj)%fnow(:,:,:),   &   !   <<= in 
    360          &              sf(jp_tair)%fnow(:,:,:), sf(jp_humi)%fnow(:,:,:),   &   !   <<= in 
    361          &              sf(jp_slp )%fnow(:,:,1),                            &   !   <<= in 
    362          &              sf(jp_hpgi)%fnow(:,:,:), sf(jp_hpgj)%fnow(:,:,:),   &   !   <<= in 
    363          &              zcd_du, zsen, zevp,                                 &   !   <=> in/out 
    364          &              wndm, utau, vtau, taum                              &   !   =>> out 
    365 #if defined key_si3 
    366          &            , tm_su, u_ice, v_ice, zssqi, zcd_dui                 &   !   <<= in 
    367          &            , zseni, zevpi, wndm_ice, ato_i                       &   !   <<= in 
    368          &            , utau_ice, vtau_ice                                  &   !   =>> out 
    369 #endif 
    370          &                                                                  ) 
    371       !!------------------------------------------------------------------------------------------- 
    372       !! 4 - Finalize flux computation using ABL variables at (n+1), nt_n corresponds to (n+1) since 
    373       !!                                                                time swap is done in abl_stp 
    374       !!------------------------------------------------------------------------------------------- 
    375  
    376       CALL blk_oce_2( tq_abl(:,:,2,nt_n,jp_ta),                            & 
    377          &            sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1),   & 
    378          &            sf(jp_prec)%fnow(:,:,1) , sf(jp_snow)%fnow(:,:,1),   & 
    379          &            tsk_m, zsen, zevp                                ) 
    380  
    381       CALL abl_rst_opn( kt )                       ! Open abl restart file (if necessary) 
    382       IF( lrst_abl ) CALL abl_rst_write( kt )      ! -- abl restart file 
    383  
    384 #if defined key_si3 
    385       ! Avoid a USE abl in icesbc module 
    386       sf(jp_tair)%fnow(:,:,1) = tq_abl(:,:,2,nt_n,jp_ta);  sf(jp_humi)%fnow(:,:,1) = tq_abl(:,:,2,nt_n,jp_qa) 
    387 #endif 
     336      IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
     337 
     338        !!------------------------------------------------------------------------------------------- 
     339        !! 2 - Compute Cd x ||U||, Ch x ||U||, Ce x ||U||, and SSQ using now fields 
     340        !!------------------------------------------------------------------------------------------- 
     341   
     342        CALL blk_oce_1( kt,  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),   &   !   <<= in 
     343           &                tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),   &   !   <<= in 
     344           &                sf(jp_slp )%fnow(:,:,1) , sst_m, ssu_m, ssv_m     ,   &   !   <<= in 
     345           &                sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1) ,   &   !   <<= in 
     346           &                tsk_m, zssq, zcd_du, zsen, zevp                       )   !   =>> out 
     347 
     348#if defined key_si3 
     349         CALL blk_ice_1(  u_abl(:,:,2,nt_n      ),  v_abl(:,:,2,nt_n      ),    &   !   <<= in 
     350            &            tq_abl(:,:,2,nt_n,jp_ta), tq_abl(:,:,2,nt_n,jp_qa),    &   !   <<= in 
     351            &            sf(jp_slp)%fnow(:,:,1)  ,  u_ice, v_ice, tm_su    ,    &   !   <<= in 
     352            &            pseni=zseni, pevpi=zevpi, pssqi=zssqi, pcd_dui=zcd_dui )   !   <<= out 
     353#endif 
     354 
     355         !!------------------------------------------------------------------------------------------- 
     356         !! 3 - Advance ABL variables from now (n) to after (n+1) 
     357         !!------------------------------------------------------------------------------------------- 
     358    
     359         CALL abl_stp( kt, tsk_m, ssu_m, ssv_m, zssq,                          &   !   <<= in 
     360            &              sf(jp_wndi)%fnow(:,:,:), sf(jp_wndj)%fnow(:,:,:),   &   !   <<= in 
     361            &              sf(jp_tair)%fnow(:,:,:), sf(jp_humi)%fnow(:,:,:),   &   !   <<= in 
     362            &              sf(jp_slp )%fnow(:,:,1),                            &   !   <<= in 
     363            &              sf(jp_hpgi)%fnow(:,:,:), sf(jp_hpgj)%fnow(:,:,:),   &   !   <<= in 
     364            &              zcd_du, zsen, zevp,                                 &   !   <=> in/out 
     365            &              wndm, utau, vtau, taum                              &   !   =>> out 
     366#if defined key_si3 
     367            &            , tm_su, u_ice, v_ice, zssqi, zcd_dui                 &   !   <<= in 
     368            &            , zseni, zevpi, wndm_ice, ato_i                       &   !   <<= in 
     369            &            , utau_ice, vtau_ice                                  &   !   =>> out 
     370#endif 
     371            &                                                                  ) 
     372         !!------------------------------------------------------------------------------------------- 
     373         !! 4 - Finalize flux computation using ABL variables at (n+1), nt_n corresponds to (n+1) since 
     374         !!                                                                time swap is done in abl_stp 
     375         !!------------------------------------------------------------------------------------------- 
     376 
     377         CALL blk_oce_2( tq_abl(:,:,2,nt_n,jp_ta),                            & 
     378            &            sf(jp_qsr )%fnow(:,:,1) , sf(jp_qlw )%fnow(:,:,1),   & 
     379            &            sf(jp_prec)%fnow(:,:,1) , sf(jp_snow)%fnow(:,:,1),   & 
     380            &            tsk_m, zsen, zevp                                ) 
     381    
     382         CALL abl_rst_opn( kt )                       ! Open abl restart file (if necessary) 
     383         IF( lrst_abl ) CALL abl_rst_write( kt )      ! -- abl restart file 
     384 
     385#if defined key_si3 
     386         ! Avoid a USE abl in icesbc module 
     387         sf(jp_tair)%fnow(:,:,1) = tq_abl(:,:,2,nt_n,jp_ta);  sf(jp_humi)%fnow(:,:,1) = tq_abl(:,:,2,nt_n,jp_qa) 
     388#endif 
     389      END IF 
    388390 
    389391   END SUBROUTINE sbc_abl 
  • NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/OCE/IOM/iom.F90

    r12489 r12799  
    11931193                           &         'we accept this case, even if there is a possible mix-up between z and time dimension' )    
    11941194                     idmspc = idmspc - 1 
    1195                   ELSE 
    1196                      CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,'         ,   & 
    1197                         &                         'we do not accept data with '//cldmspc//' spatial dimensions',   & 
    1198                         &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     1195                  !!GS: possibility to read 3D ABL atmopsheric forcing and use 1st level to force BULK simulation 
     1196                  !ELSE 
     1197                  !   CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,',   & 
     1198                  !      &                         'we do not accept data with '//cldmspc//' spatial dimensions'  ,   & 
     1199                  !      &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
    11991200                  ENDIF 
    12001201            ENDIF 
  • NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/OCE/SBC/sbcblk.F90

    r12588 r12799  
    658658 
    659659      IF( ln_abl ) THEN         !==  ABL formulation  ==!   multiplication by rho_air and turbulent fluxes computation done in ablstp 
    660          !! FL do we need this multiplication by tmask ... ??? 
    661660         DO_2D_11_11 
    662             zztmp = zU_zu(ji,jj) !* tmask(ji,jj,1) 
     661            zztmp = zU_zu(ji,jj) 
    663662            wndm(ji,jj)   = zztmp                   ! Store zU_zu in wndm to compute ustar2 in ablmod 
    664663            pcd_du(ji,jj) = zztmp * zcd_oce(ji,jj) 
    665664            psen(ji,jj)   = zztmp * zch_oce(ji,jj) 
    666665            pevp(ji,jj)   = zztmp * zce_oce(ji,jj) 
     666            rhoa(ji,jj)   = rho_air( ptair(ji,jj), phumi(ji,jj), pslp(ji,jj) ) 
    667667         END_2D 
    668668      ELSE                      !==  BLK formulation  ==!   turbulent fluxes computation 
Note: See TracChangeset for help on using the changeset viewer.