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 3294 for trunk/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90 – NEMO

Ignore:
Timestamp:
2012-01-28T17:44:18+01:00 (12 years ago)
Author:
rblod
Message:

Merge of 3.4beta into the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r2777 r3294  
    1414   !!            3.2  !  2009-04  (B. Lemaire)  Introduce iom_put 
    1515   !!            3.3  !  2010-10  (S. Masson)  add diurnal cycle 
     16   !!            3.4  !  2011-11  (C. Harris) Fill arrays required by CICE 
    1617   !!---------------------------------------------------------------------- 
    1718 
     
    3233   USE in_out_manager  ! I/O manager 
    3334   USE lib_mpp         ! distribued memory computing library 
     35   USE wrk_nemo        ! work arrays 
     36   USE timing          ! Timing 
    3437   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3538   USE prtctl          ! Print control 
    36 #if defined key_lim3 
     39   USE sbcwave,ONLY :  cdn_wave !wave module  
     40#if defined key_lim3 || defined key_cice 
    3741   USE sbc_ice         ! Surface boundary condition: ice fields 
    3842#endif 
     
    4347   PUBLIC   sbc_blk_core         ! routine called in sbcmod module 
    4448   PUBLIC   blk_ice_core         ! routine called in sbc_ice_lim module 
     49   PUBLIC   turb_core_2z         ! routine calles in sbcblk_mfs module 
    4550 
    4651   INTEGER , PARAMETER ::   jpfld   = 9           ! maximum number of files to read  
     
    182187      !                                                        ! surface ocean fluxes computed with CLIO bulk formulea 
    183188      IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( sf, sst_m, ssu_m, ssv_m ) 
     189 
     190#if defined key_cice 
     191      IF( MOD( kt - 1, nn_fsbc ) == 0 )   THEN 
     192         qlw_ice(:,:,1)   = sf(jp_qlw)%fnow(:,:,1)  
     193         qsr_ice(:,:,1)   = sf(jp_qsr)%fnow(:,:,1) 
     194         tatm_ice(:,:)    = sf(jp_tair)%fnow(:,:,1)          
     195         qatm_ice(:,:)    = sf(jp_humi)%fnow(:,:,1) 
     196         tprecip(:,:)     = sf(jp_prec)%fnow(:,:,1) * rn_pfac 
     197         sprecip(:,:)     = sf(jp_snow)%fnow(:,:,1) * rn_pfac 
     198         wndi_ice(:,:)    = sf(jp_wndi)%fnow(:,:,1) 
     199         wndj_ice(:,:)    = sf(jp_wndj)%fnow(:,:,1) 
     200      ENDIF 
     201#endif 
    184202      ! 
    185203   END SUBROUTINE sbc_blk_core 
     
    207225      !!  ** Nota  :   sf has to be a dummy argument for AGRIF on NEC 
    208226      !!--------------------------------------------------------------------- 
    209       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    210       USE wrk_nemo, ONLY:   zwnd_i => wrk_2d_1  , zwnd_j => wrk_2d_2      ! wind speed components at T-point 
    211       USE wrk_nemo, ONLY:   zqsatw => wrk_2d_3           ! specific humidity at pst 
    212       USE wrk_nemo, ONLY:   zqlw   => wrk_2d_4  , zqsb   => wrk_2d_5      ! long wave and sensible heat fluxes 
    213       USE wrk_nemo, ONLY:   zqla   => wrk_2d_6  , zevap  => wrk_2d_7      ! latent heat fluxes and evaporation 
    214       USE wrk_nemo, ONLY:   Cd     => wrk_2d_8           ! transfer coefficient for momentum      (tau) 
    215       USE wrk_nemo, ONLY:   Ch     => wrk_2d_9           ! transfer coefficient for sensible heat (Q_sens) 
    216       USE wrk_nemo, ONLY:   Ce     => wrk_2d_10          ! transfer coefficient for evaporation   (Q_lat) 
    217       USE wrk_nemo, ONLY:   zst    => wrk_2d_11          ! surface temperature in Kelvin 
    218       USE wrk_nemo, ONLY:   zt_zu  => wrk_2d_12          ! air temperature at wind speed height 
    219       USE wrk_nemo, ONLY:   zq_zu  => wrk_2d_13          ! air spec. hum.  at wind speed height 
    220       ! 
    221227      TYPE(fld), INTENT(in), DIMENSION(:)   ::   sf    ! input data 
    222228      REAL(wp) , INTENT(in), DIMENSION(:,:) ::   pst   ! surface temperature                      [Celcius] 
     
    226232      INTEGER  ::   ji, jj               ! dummy loop indices 
    227233      REAL(wp) ::   zcoef_qsatw, zztmp   ! local variable 
     234      REAL(wp), DIMENSION(:,:), POINTER ::   zwnd_i, zwnd_j    ! wind speed components at T-point 
     235      REAL(wp), DIMENSION(:,:), POINTER ::   zqsatw            ! specific humidity at pst 
     236      REAL(wp), DIMENSION(:,:), POINTER ::   zqlw, zqsb        ! long wave and sensible heat fluxes 
     237      REAL(wp), DIMENSION(:,:), POINTER ::   zqla, zevap       ! latent heat fluxes and evaporation 
     238      REAL(wp), DIMENSION(:,:), POINTER ::   Cd                ! transfer coefficient for momentum      (tau) 
     239      REAL(wp), DIMENSION(:,:), POINTER ::   Ch                ! transfer coefficient for sensible heat (Q_sens) 
     240      REAL(wp), DIMENSION(:,:), POINTER ::   Ce                ! tansfert coefficient for evaporation   (Q_lat) 
     241      REAL(wp), DIMENSION(:,:), POINTER ::   zst               ! surface temperature in Kelvin 
     242      REAL(wp), DIMENSION(:,:), POINTER ::   zt_zu             ! air temperature at wind speed height 
     243      REAL(wp), DIMENSION(:,:), POINTER ::   zq_zu             ! air spec. hum.  at wind speed height 
    228244      !!--------------------------------------------------------------------- 
    229  
    230       IF( wrk_in_use(2, 1,2,3,4,5,6,7,8,9,10,11,12,13) ) THEN 
    231          CALL ctl_stop('blk_oce_core: requested workspace arrays unavailable')   ;   RETURN 
    232       ENDIF 
     245      ! 
     246      IF( nn_timing == 1 )  CALL timing_start('blk_oce_core') 
     247      ! 
     248      CALL wrk_alloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zqlw, zqsb, zqla, zevap ) 
     249      CALL wrk_alloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
    233250      ! 
    234251      ! local scalars ( place there for vector optimisation purposes) 
     
    380397      ENDIF 
    381398      ! 
    382       IF( wrk_not_released(2, 1,2,3,4,5,6,7,8,9,10,11,12,13) )   & 
    383           CALL ctl_stop('blk_oce_core: failed to release workspace arrays') 
     399      CALL wrk_dealloc( jpi,jpj, zwnd_i, zwnd_j, zqsatw, zqlw, zqsb, zqla, zevap ) 
     400      CALL wrk_dealloc( jpi,jpj, Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
     401      ! 
     402      IF( nn_timing == 1 )  CALL timing_stop('blk_oce_core') 
    384403      ! 
    385404   END SUBROUTINE blk_oce_core 
     
    403422      !! caution : the net upward water flux has with mm/day unit 
    404423      !!--------------------------------------------------------------------- 
    405       USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released 
    406       USE wrk_nemo, ONLY:   z_wnds_t => wrk_2d_1                ! wind speed ( = | U10m - U_ice | ) at T-point 
    407       USE wrk_nemo, ONLY:   wrk_3d_4 , wrk_3d_5 , wrk_3d_6 , wrk_3d_7 
    408       !! 
    409424      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pst      ! ice surface temperature (>0, =rt0 over land) [Kelvin] 
    410425      REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pui      ! ice surface velocity (i- and i- components      [m/s] 
     
    434449      REAL(wp) ::             zwndi_t , zwndj_t                  ! relative wind components at T-point 
    435450      !! 
     451      REAL(wp), DIMENSION(:,:)  , POINTER ::   z_wnds_t          ! wind speed ( = | U10m - U_ice | ) at T-point 
    436452      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw             ! long wave heat flux over ice 
    437453      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qsb             ! sensible  heat flux over ice 
     
    439455      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqsb            ! sensible  heat sensitivity over ice 
    440456      !!--------------------------------------------------------------------- 
     457      ! 
     458      IF( nn_timing == 1 )  CALL timing_start('blk_ice_core') 
     459      ! 
     460      CALL wrk_alloc( jpi,jpj, z_wnds_t ) 
     461      CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb )  
    441462 
    442463      ijpl  = pdim                            ! number of ice categories 
    443  
    444       ! Set-up access to workspace arrays 
    445       IF( wrk_in_use(2, 1) .OR. wrk_in_use(3, 4,5,6,7) ) THEN 
    446          CALL ctl_stop('blk_ice_core: requested workspace arrays unavailable')   ;   RETURN 
    447       ELSE IF(ijpl > jpk) THEN 
    448          CALL ctl_stop('blk_ice_core: no. of ice categories > jpk so wrk_nemo 3D workspaces cannot be used.') 
    449          RETURN 
    450       END IF 
    451       ! Set-up pointers to sub-arrays of workspaces 
    452       z_qlw  => wrk_3d_4(:,:,1:ijpl) 
    453       z_qsb  => wrk_3d_5(:,:,1:ijpl) 
    454       z_dqlw => wrk_3d_6(:,:,1:ijpl) 
    455       z_dqsb => wrk_3d_7(:,:,1:ijpl) 
    456464 
    457465      ! local scalars ( place there for vector optimisation purposes) 
     
    606614      ENDIF 
    607615 
    608       IF( wrk_not_released(2, 1)       .OR.   & 
    609           wrk_not_released(3, 4,5,6,7) )   CALL ctl_stop('blk_ice_core: failed to release workspace arrays') 
     616      CALL wrk_dealloc( jpi,jpj, z_wnds_t ) 
     617      CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb )  
     618      ! 
     619      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core') 
    610620      ! 
    611621   END SUBROUTINE blk_ice_core 
     
    628638      !! References :   Large & Yeager, 2004 : ??? 
    629639      !!---------------------------------------------------------------------- 
    630       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released, iwrk_in_use, iwrk_not_released 
    631       USE wrk_nemo, ONLY: dU10 => wrk_2d_14        ! dU                             [m/s] 
    632       USE wrk_nemo, ONLY: dT => wrk_2d_15          ! air/sea temperature difference   [K] 
    633       USE wrk_nemo, ONLY: dq => wrk_2d_16          ! air/sea humidity difference      [K] 
    634       USE wrk_nemo, ONLY: Cd_n10 => wrk_2d_17      ! 10m neutral drag coefficient 
    635       USE wrk_nemo, ONLY: Ce_n10 => wrk_2d_18      ! 10m neutral latent coefficient 
    636       USE wrk_nemo, ONLY: Ch_n10 => wrk_2d_19      ! 10m neutral sensible coefficient 
    637       USE wrk_nemo, ONLY: sqrt_Cd_n10 => wrk_2d_20 ! root square of Cd_n10 
    638       USE wrk_nemo, ONLY: sqrt_Cd => wrk_2d_21     ! root square of Cd 
    639       USE wrk_nemo, ONLY: T_vpot => wrk_2d_22      ! virtual potential temperature    [K] 
    640       USE wrk_nemo, ONLY: T_star => wrk_2d_23      ! turbulent scale of tem. fluct. 
    641       USE wrk_nemo, ONLY: q_star => wrk_2d_24      ! turbulent humidity of temp. fluct. 
    642       USE wrk_nemo, ONLY: U_star => wrk_2d_25      ! turb. scale of velocity fluct. 
    643       USE wrk_nemo, ONLY: L => wrk_2d_26           ! Monin-Obukov length              [m] 
    644       USE wrk_nemo, ONLY: zeta => wrk_2d_27        ! stability parameter at height zu 
    645       USE wrk_nemo, ONLY: U_n10 => wrk_2d_28       ! neutral wind velocity at 10m     [m] 
    646       USE wrk_nemo, ONLY: xlogt  => wrk_2d_29,    xct => wrk_2d_30,   & 
    647                           zpsi_h => wrk_2d_31, zpsi_m => wrk_2d_32 
    648       USE wrk_nemo, ONLY: stab => iwrk_2d_1      ! 1st guess stability test integer 
    649       ! 
    650640      REAL(wp)                , INTENT(in   ) ::   zu      ! altitude of wind measurement       [m] 
    651641      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   sst     ! sea surface temperature         [Kelvin] 
     
    662652      REAL(wp), PARAMETER ::   grav   = 9.8   ! gravity                        
    663653      REAL(wp), PARAMETER ::   kappa  = 0.4   ! von Karman s constant 
     654 
     655      REAL(wp), DIMENSION(:,:), POINTER  ::   dU10          ! dU                                   [m/s] 
     656      REAL(wp), DIMENSION(:,:), POINTER  ::   dT            ! air/sea temperature differeence      [K] 
     657      REAL(wp), DIMENSION(:,:), POINTER  ::   dq            ! air/sea humidity difference          [K] 
     658      REAL(wp), DIMENSION(:,:), POINTER  ::   Cd_n10        ! 10m neutral drag coefficient 
     659      REAL(wp), DIMENSION(:,:), POINTER  ::   Ce_n10        ! 10m neutral latent coefficient 
     660      REAL(wp), DIMENSION(:,:), POINTER  ::   Ch_n10        ! 10m neutral sensible coefficient 
     661      REAL(wp), DIMENSION(:,:), POINTER  ::   sqrt_Cd_n10   ! root square of Cd_n10 
     662      REAL(wp), DIMENSION(:,:), POINTER  ::   sqrt_Cd       ! root square of Cd 
     663      REAL(wp), DIMENSION(:,:), POINTER  ::   T_vpot        ! virtual potential temperature        [K] 
     664      REAL(wp), DIMENSION(:,:), POINTER  ::   T_star        ! turbulent scale of tem. fluct. 
     665      REAL(wp), DIMENSION(:,:), POINTER  ::   q_star        ! turbulent humidity of temp. fluct. 
     666      REAL(wp), DIMENSION(:,:), POINTER  ::   U_star        ! turb. scale of velocity fluct. 
     667      REAL(wp), DIMENSION(:,:), POINTER  ::   L             ! Monin-Obukov length                  [m] 
     668      REAL(wp), DIMENSION(:,:), POINTER  ::   zeta          ! stability parameter at height zu 
     669      REAL(wp), DIMENSION(:,:), POINTER  ::   U_n10         ! neutral wind velocity at 10m         [m]    
     670      REAL(wp), DIMENSION(:,:), POINTER  ::   xlogt, xct, zpsi_h, zpsi_m 
     671       
     672      INTEGER , DIMENSION(:,:), POINTER  ::   stab          ! 1st guess stability test integer 
    664673      !!---------------------------------------------------------------------- 
    665  
    666       IF(  wrk_in_use(2,             14,15,16,17,18,19,        & 
    667                          20,21,22,23,24,25,26,27,28,29,        & 
    668                          30,31,32)                      .OR.   & 
    669           iwrk_in_use(2, 1)                               ) THEN 
    670          CALL ctl_stop('TURB_CORE_1Z: requested workspace arrays unavailable')   ;   RETURN 
    671       ENDIF 
     674      ! 
     675      IF( nn_timing == 1 )  CALL timing_start('TURB_CORE_1Z') 
     676      ! 
     677      CALL wrk_alloc( jpi,jpj, stab )   ! integer 
     678      CALL wrk_alloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
     679      CALL wrk_alloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta, U_n10, xlogt, xct, zpsi_h, zpsi_m ) 
    672680 
    673681      !! * Start 
     
    682690      !! Neutral Drag Coefficient 
    683691      stab    = 0.5 + sign(0.5,dT)    ! stable : stab = 1 ; unstable : stab = 0  
    684       Cd_n10  = 1E-3 * ( 2.7/dU10 + 0.142 + dU10/13.09 )    !   L & Y eq. (6a) 
     692      IF  ( ln_cdgw ) THEN 
     693        cdn_wave = cdn_wave - rsmall*(tmask(:,:,1)-1) 
     694        Cd_n10(:,:) =   cdn_wave 
     695      ELSE 
     696        Cd_n10  = 1E-3 * ( 2.7/dU10 + 0.142 + dU10/13.09 )    !   L & Y eq. (6a) 
     697      ENDIF 
    685698      sqrt_Cd_n10 = sqrt(Cd_n10) 
    686699      Ce_n10  = 1E-3 * ( 34.6 * sqrt_Cd_n10 )               !   L & Y eq. (6b) 
     
    705718         zpsi_m  = psi_m(zeta) 
    706719 
    707          !! Shifting the wind speed to 10m and neutral stability : 
    708          U_n10 = dU10*1./(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)) !  L & Y eq. (9a) 
    709  
    710          !! Updating the neutral 10m transfer coefficients : 
    711          Cd_n10  = 1E-3 * (2.7/U_n10 + 0.142 + U_n10/13.09)              !  L & Y eq. (6a) 
    712          sqrt_Cd_n10 = sqrt(Cd_n10) 
    713          Ce_n10  = 1E-3 * (34.6 * sqrt_Cd_n10)                           !  L & Y eq. (6b) 
    714          stab    = 0.5 + sign(0.5,zeta) 
    715          Ch_n10  = 1E-3*sqrt_Cd_n10*(18.*stab + 32.7*(1-stab))           !  L & Y eq. (6c), (6d) 
    716  
    717          !! Shifting the neutral  10m transfer coefficients to ( zu , zeta ) : 
    718          !! 
    719          xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10) - zpsi_m) 
    720          Cd  = Cd_n10/(xct*xct) ;  sqrt_Cd = sqrt(Cd) 
     720         IF  ( ln_cdgw ) THEN 
     721           sqrt_Cd=kappa/((kappa/sqrt_Cd_n10) - zpsi_m) ; Cd=sqrt_Cd*sqrt_Cd; 
     722         ELSE 
     723           !! Shifting the wind speed to 10m and neutral stability : 
     724           U_n10 = dU10*1./(1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m)) !  L & Y eq. (9a) 
     725 
     726           !! Updating the neutral 10m transfer coefficients : 
     727           Cd_n10  = 1E-3 * (2.7/U_n10 + 0.142 + U_n10/13.09)              !  L & Y eq. (6a) 
     728           sqrt_Cd_n10 = sqrt(Cd_n10) 
     729           Ce_n10  = 1E-3 * (34.6 * sqrt_Cd_n10)                           !  L & Y eq. (6b) 
     730           stab    = 0.5 + sign(0.5,zeta) 
     731           Ch_n10  = 1E-3*sqrt_Cd_n10*(18.*stab + 32.7*(1-stab))           !  L & Y eq. (6c), (6d) 
     732 
     733           !! Shifting the neutral  10m transfer coefficients to ( zu , zeta ) : 
     734           !! 
     735           xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10) - zpsi_m) 
     736           Cd  = Cd_n10/(xct*xct) ;  sqrt_Cd = sqrt(Cd) 
     737         ENDIF 
    721738         !! 
    722739         xlogt = log(zu/10.) - zpsi_h 
     
    730747      END DO 
    731748      !! 
    732       IF( wrk_not_released(2,             14,15,16,17,18,19,          & 
    733          &                    20,21,22,23,24,25,26,27,28,29,          & 
    734          &                    30,31,32                      )   .OR.  &       
    735          iwrk_not_released(2, 1)                                  )   & 
    736          CALL ctl_stop('TURB_CORE_1Z: failed to release workspace arrays') 
     749      CALL wrk_dealloc( jpi,jpj, stab )   ! integer 
     750      CALL wrk_dealloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
     751      CALL wrk_dealloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta, U_n10, xlogt, xct, zpsi_h, zpsi_m ) 
     752      ! 
     753      IF( nn_timing == 1 )  CALL timing_stop('TURB_CORE_1Z') 
    737754      ! 
    738755    END SUBROUTINE TURB_CORE_1Z 
     
    754771      !! References :   Large & Yeager, 2004 : ??? 
    755772      !!---------------------------------------------------------------------- 
    756       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released, iwrk_in_use, iwrk_not_released 
    757       USE wrk_nemo, ONLY: dU10 => wrk_2d_14        ! dU                             [m/s] 
    758       USE wrk_nemo, ONLY: dT => wrk_2d_15          ! air/sea temperature difference   [K] 
    759       USE wrk_nemo, ONLY: dq => wrk_2d_16          ! air/sea humidity difference      [K] 
    760       USE wrk_nemo, ONLY: Cd_n10 => wrk_2d_17      ! 10m neutral drag coefficient 
    761       USE wrk_nemo, ONLY: Ce_n10 => wrk_2d_18      ! 10m neutral latent coefficient 
    762       USE wrk_nemo, ONLY: Ch_n10 => wrk_2d_19      ! 10m neutral sensible coefficient 
    763       USE wrk_nemo, ONLY: sqrt_Cd_n10 => wrk_2d_20 ! root square of Cd_n10 
    764       USE wrk_nemo, ONLY: sqrt_Cd => wrk_2d_21     ! root square of Cd 
    765       USE wrk_nemo, ONLY: T_vpot => wrk_2d_22      ! virtual potential temperature    [K] 
    766       USE wrk_nemo, ONLY: T_star => wrk_2d_23     ! turbulent scale of tem. fluct. 
    767       USE wrk_nemo, ONLY: q_star => wrk_2d_24     ! turbulent humidity of temp. fluct. 
    768       USE wrk_nemo, ONLY: U_star => wrk_2d_25     ! turb. scale of velocity fluct. 
    769       USE wrk_nemo, ONLY: L => wrk_2d_26          ! Monin-Obukov length              [m] 
    770       USE wrk_nemo, ONLY: zeta_u => wrk_2d_27     ! stability parameter at height zu 
    771       USE wrk_nemo, ONLY: zeta_t => wrk_2d_28     ! stability parameter at height zt 
    772       USE wrk_nemo, ONLY: U_n10 => wrk_2d_29      ! neutral wind velocity at 10m     [m] 
    773       USE wrk_nemo, ONLY: xlogt => wrk_2d_30, xct => wrk_2d_31, zpsi_hu => wrk_2d_32, zpsi_ht => wrk_2d_33, zpsi_m => wrk_2d_34 
    774       USE wrk_nemo, ONLY: stab => iwrk_2d_1      ! 1st guess stability test integer 
    775       !! 
    776       REAL(wp), INTENT(in)   :: & 
    777          zt,      &     ! height for T_zt and q_zt                   [m] 
    778          zu             ! height for dU                              [m] 
    779       REAL(wp), INTENT(in), DIMENSION(jpi,jpj) ::  & 
    780          sst,      &     ! sea surface temperature              [Kelvin] 
    781          T_zt,     &     ! potential air temperature            [Kelvin] 
    782          q_sat,    &     ! sea surface specific humidity         [kg/kg] 
    783          q_zt,     &     ! specific air humidity                 [kg/kg] 
    784          dU              ! relative wind module |U(zu)-U(0)|       [m/s] 
    785       REAL(wp), INTENT(out), DIMENSION(jpi,jpj)  ::  & 
    786          Cd,       &     ! transfer coefficient for momentum         (tau) 
    787          Ch,       &     ! transfer coefficient for sensible heat (Q_sens) 
    788          Ce,       &     ! transfert coefficient for evaporation   (Q_lat) 
    789          T_zu,     &     ! air temp. shifted at zu                     [K] 
    790          q_zu            ! spec. hum.  shifted at zu               [kg/kg] 
     773      REAL(wp), INTENT(in   )                     ::   zt       ! height for T_zt and q_zt                   [m] 
     774      REAL(wp), INTENT(in   )                     ::   zu       ! height for dU                              [m] 
     775      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   sst      ! sea surface temperature              [Kelvin] 
     776      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   T_zt     ! potential air temperature            [Kelvin] 
     777      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_sat    ! sea surface specific humidity         [kg/kg] 
     778      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   q_zt     ! specific air humidity                 [kg/kg] 
     779      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj) ::   dU       ! relative wind module |U(zu)-U(0)|       [m/s] 
     780      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Cd       ! transfer coefficient for momentum         (tau) 
     781      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ch       ! transfer coefficient for sensible heat (Q_sens) 
     782      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ce       ! transfert coefficient for evaporation   (Q_lat) 
     783      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   T_zu     ! air temp. shifted at zu                     [K] 
     784      REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   q_zu     ! spec. hum.  shifted at zu               [kg/kg] 
    791785 
    792786      INTEGER :: j_itt 
    793       INTEGER, PARAMETER :: nb_itt = 3   ! number of itterations 
    794       REAL(wp), PARAMETER ::                        & 
    795          grav   = 9.8,      &  ! gravity                        
    796          kappa  = 0.4          ! von Karman's constant 
     787      INTEGER , PARAMETER :: nb_itt = 3              ! number of itterations 
     788      REAL(wp), PARAMETER ::   grav   = 9.8          ! gravity                        
     789      REAL(wp), PARAMETER ::   kappa  = 0.4          ! von Karman's constant 
     790       
     791      REAL(wp), DIMENSION(:,:), POINTER ::   dU10          ! dU                                [m/s] 
     792      REAL(wp), DIMENSION(:,:), POINTER ::   dT            ! air/sea temperature differeence   [K] 
     793      REAL(wp), DIMENSION(:,:), POINTER ::   dq            ! air/sea humidity difference       [K] 
     794      REAL(wp), DIMENSION(:,:), POINTER ::   Cd_n10        ! 10m neutral drag coefficient 
     795      REAL(wp), DIMENSION(:,:), POINTER ::   Ce_n10        ! 10m neutral latent coefficient 
     796      REAL(wp), DIMENSION(:,:), POINTER ::   Ch_n10        ! 10m neutral sensible coefficient 
     797      REAL(wp), DIMENSION(:,:), POINTER ::   sqrt_Cd_n10   ! root square of Cd_n10 
     798      REAL(wp), DIMENSION(:,:), POINTER ::   sqrt_Cd       ! root square of Cd 
     799      REAL(wp), DIMENSION(:,:), POINTER ::   T_vpot        ! virtual potential temperature        [K] 
     800      REAL(wp), DIMENSION(:,:), POINTER ::   T_star        ! turbulent scale of tem. fluct. 
     801      REAL(wp), DIMENSION(:,:), POINTER ::   q_star        ! turbulent humidity of temp. fluct. 
     802      REAL(wp), DIMENSION(:,:), POINTER ::   U_star        ! turb. scale of velocity fluct. 
     803      REAL(wp), DIMENSION(:,:), POINTER ::   L             ! Monin-Obukov length                  [m] 
     804      REAL(wp), DIMENSION(:,:), POINTER ::   zeta_u        ! stability parameter at height zu 
     805      REAL(wp), DIMENSION(:,:), POINTER ::   zeta_t        ! stability parameter at height zt 
     806      REAL(wp), DIMENSION(:,:), POINTER ::   U_n10         ! neutral wind velocity at 10m        [m] 
     807      REAL(wp), DIMENSION(:,:), POINTER ::   xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m 
     808 
     809      INTEGER , DIMENSION(:,:), POINTER ::   stab          ! 1st stability test integer 
    797810      !!---------------------------------------------------------------------- 
    798       !!  * Start 
    799  
    800       IF(  wrk_in_use(2,             14,15,16,17,18,19,        & 
    801                          20,21,22,23,24,25,26,27,28,29,        &          
    802                          30,31,32,33,34)                .OR.   & 
    803           iwrk_in_use(2, 1)                               ) THEN 
    804          CALL ctl_stop('TURB_CORE_2Z: requested workspace arrays unavailable')   ;   RETURN 
    805       ENDIF 
     811      ! 
     812      IF( nn_timing == 1 )  CALL timing_start('TURB_CORE_2Z') 
     813      ! 
     814      CALL wrk_alloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
     815      CALL wrk_alloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta_u, zeta_t, U_n10 ) 
     816      CALL wrk_alloc( jpi,jpj, xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m ) 
     817      CALL wrk_alloc( jpi,jpj, stab )   ! interger 
    806818 
    807819      !! Initial air/sea differences 
     
    812824      !! Neutral Drag Coefficient : 
    813825      stab = 0.5 + sign(0.5,dT)                 ! stab = 1  if dT > 0  -> STABLE 
    814       Cd_n10  = 1E-3*( 2.7/dU10 + 0.142 + dU10/13.09 )  
     826      IF( ln_cdgw ) THEN 
     827        cdn_wave = cdn_wave - rsmall*(tmask(:,:,1)-1) 
     828        Cd_n10(:,:) =   cdn_wave 
     829      ELSE 
     830        Cd_n10  = 1E-3*( 2.7/dU10 + 0.142 + dU10/13.09 )  
     831      ENDIF 
    815832      sqrt_Cd_n10 = sqrt(Cd_n10) 
    816833      Ce_n10  = 1E-3*( 34.6 * sqrt_Cd_n10 ) 
     
    853870         stab = 0.5 + sign(0.5,q_zu) ;  q_zu = stab*q_zu 
    854871         !! 
    855          !! Updating the neutral 10m transfer coefficients : 
    856          Cd_n10  = 1E-3 * (2.7/U_n10 + 0.142 + U_n10/13.09)    ! L & Y eq. (6a) 
    857          sqrt_Cd_n10 = sqrt(Cd_n10) 
    858          Ce_n10  = 1E-3 * (34.6 * sqrt_Cd_n10)                 ! L & Y eq. (6b) 
    859          stab    = 0.5 + sign(0.5,zeta_u) 
    860          Ch_n10  = 1E-3*sqrt_Cd_n10*(18.*stab + 32.7*(1-stab)) ! L & Y eq. (6c-6d) 
    861          !! 
    862          !! 
    863          !! Shifting the neutral 10m transfer coefficients to (zu,zeta_u) : 
    864 !        xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10.) - psi_m(zeta_u)) 
    865          xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m) 
    866          Cd = Cd_n10/(xct*xct) ; sqrt_Cd = sqrt(Cd) 
    867          !! 
    868 !        xlogt = log(zu/10.) - psi_h(zeta_u) 
     872         IF( ln_cdgw ) THEN 
     873            sqrt_Cd=kappa/((kappa/sqrt_Cd_n10) - zpsi_m) ; Cd=sqrt_Cd*sqrt_Cd; 
     874         ELSE 
     875           !! Updating the neutral 10m transfer coefficients : 
     876           Cd_n10  = 1E-3 * (2.7/U_n10 + 0.142 + U_n10/13.09)    ! L & Y eq. (6a) 
     877           sqrt_Cd_n10 = sqrt(Cd_n10) 
     878           Ce_n10  = 1E-3 * (34.6 * sqrt_Cd_n10)                 ! L & Y eq. (6b) 
     879           stab    = 0.5 + sign(0.5,zeta_u) 
     880           Ch_n10  = 1E-3*sqrt_Cd_n10*(18.*stab + 32.7*(1-stab)) ! L & Y eq. (6c-6d) 
     881           !! 
     882           !! 
     883           !! Shifting the neutral 10m transfer coefficients to (zu,zeta_u) : 
     884           xct = 1. + sqrt_Cd_n10/kappa*(log(zu/10.) - zpsi_m) 
     885           Cd = Cd_n10/(xct*xct) ; sqrt_Cd = sqrt(Cd) 
     886         ENDIF 
     887         !! 
    869888         xlogt = log(zu/10.) - zpsi_hu 
    870889         !! 
     
    878897      END DO 
    879898      !! 
    880      IF( wrk_not_released(2,              14,15,16,17,18,19,          & 
    881          &                    20,21,22,23,24,25,26,27,28,29,          & 
    882          &                    30,31,32,33,34                )   .OR.  &   
    883          iwrk_not_released(2, 1)                                  )   & 
    884          CALL ctl_stop('TURB_CORE_2Z: failed to release workspace arrays') 
     899      CALL wrk_dealloc( jpi,jpj, dU10, dT, dq, Cd_n10, Ce_n10, Ch_n10, sqrt_Cd_n10, sqrt_Cd, L ) 
     900      CALL wrk_dealloc( jpi,jpj, T_vpot, T_star, q_star, U_star, zeta_u, zeta_t, U_n10 ) 
     901      CALL wrk_dealloc( jpi,jpj, xlogt, xct, zpsi_hu, zpsi_ht, zpsi_m ) 
     902      CALL wrk_dealloc( jpi,jpj, stab )   ! interger 
     903      ! 
     904      IF( nn_timing == 1 )  CALL timing_stop('TURB_CORE_2Z') 
    885905      ! 
    886906    END SUBROUTINE TURB_CORE_2Z 
     
    889909    FUNCTION psi_m(zta)   !! Psis, L & Y eq. (8c), (8d), (8e) 
    890910      !------------------------------------------------------------------------------- 
    891       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    892       USE wrk_nemo, ONLY:     X2 => wrk_2d_35 
    893       USE wrk_nemo, ONLY:     X  => wrk_2d_36 
    894       USE wrk_nemo, ONLY: stabit => wrk_2d_37 
    895       !! 
    896911      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: zta 
    897912 
    898913      REAL(wp), PARAMETER :: pi = 3.141592653589793_wp 
    899914      REAL(wp), DIMENSION(jpi,jpj)             :: psi_m 
     915      REAL(wp), DIMENSION(:,:), POINTER        :: X2, X, stabit 
    900916      !------------------------------------------------------------------------------- 
    901917 
    902       IF( wrk_in_use(2, 35,36,37) ) THEN 
    903          CALL ctl_stop('psi_m: requested workspace arrays unavailable')   ;   RETURN 
    904       ENDIF 
     918      CALL wrk_alloc( jpi,jpj, X2, X, stabit ) 
    905919 
    906920      X2 = sqrt(abs(1. - 16.*zta))  ;  X2 = max(X2 , 1.0) ;  X  = sqrt(X2) 
     
    909923         &    + (1. - stabit)*(2*log((1. + X)/2) + log((1. + X2)/2) - 2*atan(X) + pi/2)  ! Unstable  
    910924 
    911       IF( wrk_not_released(2, 35,36,37) )   CALL ctl_stop('psi_m: failed to release workspace arrays') 
     925      CALL wrk_dealloc( jpi,jpj, X2, X, stabit ) 
    912926      ! 
    913927    END FUNCTION psi_m 
     
    916930    FUNCTION psi_h( zta )    !! Psis, L & Y eq. (8c), (8d), (8e) 
    917931      !------------------------------------------------------------------------------- 
    918       USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 
    919       USE wrk_nemo, ONLY:     X2 => wrk_2d_35 
    920       USE wrk_nemo, ONLY:     X  => wrk_2d_36 
    921       USE wrk_nemo, ONLY: stabit => wrk_2d_37 
    922       ! 
    923932      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   zta 
    924933      ! 
    925934      REAL(wp), DIMENSION(jpi,jpj)             ::   psi_h 
     935      REAL(wp), DIMENSION(:,:), POINTER        :: X2, X, stabit 
    926936      !------------------------------------------------------------------------------- 
    927937 
    928       IF( wrk_in_use(2, 35,36,37) ) THEN 
    929          CALL ctl_stop('psi_h: requested workspace arrays unavailable')   ;   RETURN 
    930       ENDIF 
     938      CALL wrk_alloc( jpi,jpj, X2, X, stabit ) 
    931939 
    932940      X2 = sqrt(abs(1. - 16.*zta))  ;  X2 = max(X2 , 1.) ;  X  = sqrt(X2) 
     
    935943         &    + (1. - stabit)*(2.*log( (1. + X2)/2. ))                 ! Unstable 
    936944 
    937       IF( wrk_not_released(2, 35,36,37) )   CALL ctl_stop('psi_h: failed to release workspace arrays') 
     945      CALL wrk_dealloc( jpi,jpj, X2, X, stabit ) 
    938946      ! 
    939947    END FUNCTION psi_h 
Note: See TracChangeset for help on using the changeset viewer.