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 12193 for NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DIA/diahth.F90 – NEMO

Ignore:
Timestamp:
2019-12-11T17:15:54+01:00 (4 years ago)
Author:
davestorkey
Message:

2019/dev_r11943_MERGE_2019: Merge in dev_r12072_TOP-01_ENHANCE-11_cethe

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DIA/diahth.F90

    r11949 r12193  
    1111   !!            3.2  !  2009-07  (S. Masson) hc300 bugfix + cleaning + add new diag 
    1212   !!---------------------------------------------------------------------- 
    13 #if   defined key_diahth 
    14    !!---------------------------------------------------------------------- 
    15    !!   'key_diahth' :                              thermocline depth diag. 
    16    !!---------------------------------------------------------------------- 
    1713   !!   dia_hth      : Compute varius diagnostics associated with the mixed layer 
    1814   !!---------------------------------------------------------------------- 
     
    3228   PUBLIC   dia_hth_alloc ! routine called by nemogcm.F90 
    3329 
    34    LOGICAL , PUBLIC, PARAMETER ::   lk_diahth = .TRUE.    !: thermocline-20d depths flag 
     30   LOGICAL, SAVE  ::   l_hth     !: thermocline-20d depths flag 
    3531    
    3632   ! note: following variables should move to local variables once iom_put is always used  
    3733   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hth    !: depth of the max vertical temperature gradient [m] 
    3834   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hd20   !: depth of 20 C isotherm                         [m] 
     35   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hd26   !: depth of 26 C isotherm                         [m] 
    3936   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hd28   !: depth of 28 C isotherm                         [m] 
    4037   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   htc3   !: heat content of first 300 m                    [W] 
     38   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   htc7   !: heat content of first 700 m                    [W] 
     39   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   htc20  !: heat content of first 2000 m                   [W] 
     40 
    4141 
    4242   !!---------------------------------------------------------------------- 
     
    5252      !!--------------------------------------------------------------------- 
    5353      ! 
    54       ALLOCATE( hth(jpi,jpj), hd20(jpi,jpj), hd28(jpi,jpj), htc3(jpi,jpj), STAT=dia_hth_alloc ) 
     54      ALLOCATE( hth(jpi,jpj), hd20(jpi,jpj), hd26(jpi,jpj), hd28(jpi,jpj), & 
     55         &      htc3(jpi,jpj), htc7(jpi,jpj), htc20(jpi,jpj), STAT=dia_hth_alloc ) 
    5556      ! 
    5657      CALL mpp_sum ( 'diahth', dia_hth_alloc ) 
     
    8384      INTEGER, INTENT( in ) ::   Kmm     ! ocean time level index 
    8485      !! 
    85       INTEGER                          ::   ji, jj, jk            ! dummy loop arguments 
    86       INTEGER                          ::   iid, ilevel           ! temporary integers 
    87       INTEGER, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ik20, ik28  ! levels 
    88       REAL(wp)                         ::   zavt5 = 5.e-4_wp      ! Kz criterion for the turbocline depth 
    89       REAL(wp)                         ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth 
    90       REAL(wp)                         ::   zrho1 = 0.01_wp       ! density     criterion for mixed layer depth 
    91       REAL(wp)                         ::   ztem2 = 0.2_wp        ! temperature criterion for mixed layer depth 
    92       REAL(wp)                         ::   zthick_0, zcoef       ! temporary scalars 
    93       REAL(wp)                         ::   zztmp, zzdep          ! temporary scalars inside do loop 
    94       REAL(wp)                         ::   zu, zv, zw, zut, zvt  ! temporary workspace 
    95       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2  
    96       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2      
    97       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho10_3   ! MLD: rho = rho10m + zrho3       
    98       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC) 
    99       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztinv      ! max of temperature inversion 
    100       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdepinv    ! depth of temperature inversion 
    101       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03 
    102       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01 
    103       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zmaxdzT    ! max of dT/dz 
    104       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zthick     ! vertical integration thickness  
    105       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdelr      ! delta rho equivalent to deltaT = 0.2 
     86      INTEGER                      ::   ji, jj, jk            ! dummy loop arguments 
     87      REAL(wp)                     ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth 
     88      REAL(wp)                     ::   zrho1 = 0.01_wp       ! density     criterion for mixed layer depth 
     89      REAL(wp)                     ::   ztem2 = 0.2_wp        ! temperature criterion for mixed layer depth 
     90      REAL(wp)                     ::   zztmp, zzdep          ! temporary scalars inside do loop 
     91      REAL(wp)                     ::   zu, zv, zw, zut, zvt  ! temporary workspace 
     92      REAL(wp), DIMENSION(jpi,jpj) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2  
     93      REAL(wp), DIMENSION(jpi,jpj) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2      
     94      REAL(wp), DIMENSION(jpi,jpj) ::   zrho10_3   ! MLD: rho = rho10m + zrho3       
     95      REAL(wp), DIMENSION(jpi,jpj) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC) 
     96      REAL(wp), DIMENSION(jpi,jpj) ::   ztinv      ! max of temperature inversion 
     97      REAL(wp), DIMENSION(jpi,jpj) ::   zdepinv    ! depth of temperature inversion 
     98      REAL(wp), DIMENSION(jpi,jpj) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03 
     99      REAL(wp), DIMENSION(jpi,jpj) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01 
     100      REAL(wp), DIMENSION(jpi,jpj) ::   zmaxdzT    ! max of dT/dz 
     101      REAL(wp), DIMENSION(jpi,jpj) ::   zdelr      ! delta rho equivalent to deltaT = 0.2 
    106102      !!---------------------------------------------------------------------- 
    107103      IF( ln_timing )   CALL timing_start('dia_hth') 
    108104 
    109105      IF( kt == nit000 ) THEN 
     106         l_hth = .FALSE. 
     107         IF(   iom_use( 'mlddzt'   ) .OR. iom_use( 'mldr0_3'  ) .OR. iom_use( 'mldr0_1'  )    .OR.  &  
     108            &  iom_use( 'mld_dt02' ) .OR. iom_use( 'topthdep' ) .OR. iom_use( 'mldr10_3' )    .OR.  &     
     109            &  iom_use( '20d'      ) .OR. iom_use( '26d'      ) .OR. iom_use( '28d'      )    .OR.  &     
     110            &  iom_use( 'hc300'    ) .OR. iom_use( 'hc700'    ) .OR. iom_use( 'hc2000'   )    .OR.  &     
     111            &  iom_use( 'pycndep'  ) .OR. iom_use( 'tinv'     ) .OR. iom_use( 'depti'    )  ) l_hth = .TRUE. 
    110112         !                                      ! allocate dia_hth array 
    111          IF( dia_hth_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard arrays' ) 
    112  
    113          IF(.NOT. ALLOCATED(ik20) ) THEN 
    114             ALLOCATE(ik20(jpi,jpj), ik28(jpi,jpj), & 
    115                &      zabs2(jpi,jpj),   & 
    116                &      ztm2(jpi,jpj),    & 
    117                &      zrho10_3(jpi,jpj),& 
    118                &      zpycn(jpi,jpj),   & 
    119                &      ztinv(jpi,jpj),   & 
    120                &      zdepinv(jpi,jpj), & 
    121                &      zrho0_3(jpi,jpj), & 
    122                &      zrho0_1(jpi,jpj), & 
    123                &      zmaxdzT(jpi,jpj), & 
    124                &      zthick(jpi,jpj),  & 
    125                &      zdelr(jpi,jpj), STAT=ji) 
    126             CALL mpp_sum('diahth', ji) 
    127             IF( ji /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard ocean arrays' ) 
    128          END IF 
    129  
    130          IF(lwp) WRITE(numout,*) 
    131          IF(lwp) WRITE(numout,*) 'dia_hth : diagnostics of the thermocline depth' 
    132          IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    133          IF(lwp) WRITE(numout,*) 
     113         IF( l_hth ) THEN  
     114            IF( dia_hth_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard arrays' ) 
     115            IF(lwp) WRITE(numout,*) 
     116            IF(lwp) WRITE(numout,*) 'dia_hth : diagnostics of the thermocline depth' 
     117            IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
     118            IF(lwp) WRITE(numout,*) 
     119         ENDIF 
    134120      ENDIF 
    135121 
    136       ! initialization 
    137       ztinv  (:,:) = 0._wp   
    138       zdepinv(:,:) = 0._wp   
    139       zmaxdzT(:,:) = 0._wp   
    140       DO jj = 1, jpj 
    141          DO ji = 1, jpi 
    142             zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)  
    143             hth     (ji,jj) = zztmp 
    144             zabs2   (ji,jj) = zztmp 
    145             ztm2    (ji,jj) = zztmp 
    146             zrho10_3(ji,jj) = zztmp 
    147             zpycn   (ji,jj) = zztmp 
    148         END DO 
    149       END DO 
    150       IF( nla10 > 1 ) THEN  
    151          DO jj = 1, jpj 
    152             DO ji = 1, jpi 
    153                zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)  
    154                zrho0_3(ji,jj) = zztmp 
    155                zrho0_1(ji,jj) = zztmp 
    156             END DO 
    157          END DO 
     122      IF( l_hth ) THEN 
     123         ! 
     124         IF( iom_use( 'mlddzt' ) .OR. iom_use( 'mldr0_3' ) .OR. iom_use( 'mldr0_1' ) ) THEN 
     125            ! initialization 
     126            ztinv  (:,:) = 0._wp   
     127            zdepinv(:,:) = 0._wp   
     128            zmaxdzT(:,:) = 0._wp   
     129            DO jj = 1, jpj 
     130               DO ji = 1, jpi 
     131                  zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)  
     132                  hth     (ji,jj) = zztmp 
     133                  zabs2   (ji,jj) = zztmp 
     134                  ztm2    (ji,jj) = zztmp 
     135                  zrho10_3(ji,jj) = zztmp 
     136                  zpycn   (ji,jj) = zztmp 
     137                 END DO 
     138            END DO 
     139            IF( nla10 > 1 ) THEN  
     140               DO jj = 1, jpj 
     141                  DO ji = 1, jpi 
     142                     zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)  
     143                     zrho0_3(ji,jj) = zztmp 
     144                     zrho0_1(ji,jj) = zztmp 
     145                  END DO 
     146               END DO 
     147            ENDIF 
     148       
     149            ! Preliminary computation 
     150            ! computation of zdelr = (dr/dT)(T,S,10m)*(-0.2 degC) 
     151            DO jj = 1, jpj 
     152               DO ji = 1, jpi 
     153                  IF( tmask(ji,jj,nla10) == 1. ) THEN 
     154                     zu  =  1779.50 + 11.250 * ts(ji,jj,nla10,jp_tem,Kmm) - 3.80   * ts(ji,jj,nla10,jp_sal,Kmm)  & 
     155                        &           - 0.0745 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm)   & 
     156                        &           - 0.0100 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_sal,Kmm) 
     157                     zv  =  5891.00 + 38.000 * ts(ji,jj,nla10,jp_tem,Kmm) + 3.00   * ts(ji,jj,nla10,jp_sal,Kmm)  & 
     158                        &           - 0.3750 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm) 
     159                     zut =    11.25 -  0.149 * ts(ji,jj,nla10,jp_tem,Kmm) - 0.01   * ts(ji,jj,nla10,jp_sal,Kmm) 
     160                     zvt =    38.00 -  0.750 * ts(ji,jj,nla10,jp_tem,Kmm) 
     161                     zw  = (zu + 0.698*zv) * (zu + 0.698*zv) 
     162                     zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) 
     163                  ELSE 
     164                     zdelr(ji,jj) = 0._wp 
     165                  ENDIF 
     166               END DO 
     167            END DO 
     168 
     169            ! ------------------------------------------------------------- ! 
     170            ! thermocline depth: strongest vertical gradient of temperature ! 
     171            ! turbocline depth (mixing layer depth): avt = zavt5            ! 
     172            ! MLD: rho = rho(1) + zrho3                                     ! 
     173            ! MLD: rho = rho(1) + zrho1                                     ! 
     174            ! ------------------------------------------------------------- ! 
     175            DO jk = jpkm1, 2, -1   ! loop from bottom to 2 
     176               DO jj = 1, jpj 
     177                  DO ji = 1, jpi 
     178                     ! 
     179                     zzdep = gdepw(ji,jj,jk,Kmm) 
     180                     zztmp = ( ts(ji,jj,jk-1,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm) ) & 
     181                            & / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
     182                     zzdep = zzdep * tmask(ji,jj,1) 
     183 
     184                     IF( zztmp > zmaxdzT(ji,jj) ) THEN                         
     185                         zmaxdzT(ji,jj) = zztmp    
     186                         hth    (ji,jj) = zzdep                ! max and depth of dT/dz 
     187                     ENDIF 
     188                
     189                     IF( nla10 > 1 ) THEN  
     190                        zztmp = rhop(ji,jj,jk) - rhop(ji,jj,1)                       ! delta rho(1) 
     191                        IF( zztmp > zrho3 )   zrho0_3(ji,jj) = zzdep                ! > 0.03 
     192                        IF( zztmp > zrho1 )   zrho0_1(ji,jj) = zzdep                ! > 0.01 
     193                     ENDIF 
     194                  END DO 
     195               END DO 
     196            END DO 
     197          
     198            CALL iom_put( 'mlddzt', hth )            ! depth of the thermocline 
     199            IF( nla10 > 1 ) THEN  
     200               CALL iom_put( 'mldr0_3', zrho0_3 )   ! MLD delta rho(surf) = 0.03 
     201               CALL iom_put( 'mldr0_1', zrho0_1 )   ! MLD delta rho(surf) = 0.01 
     202            ENDIF 
     203            ! 
     204         ENDIF 
     205         ! 
     206         IF(  iom_use( 'mld_dt02' ) .OR. iom_use( 'topthdep' ) .OR. iom_use( 'mldr10_3' ) .OR.  &     
     207            &  iom_use( 'pycndep' ) .OR. iom_use( 'tinv'     ) .OR. iom_use( 'depti'    )  ) THEN 
     208            ! ------------------------------------------------------------- ! 
     209            ! MLD: abs( tn - tn(10m) ) = ztem2                              ! 
     210            ! Top of thermocline: tn = tn(10m) - ztem2                      ! 
     211            ! MLD: rho = rho10m + zrho3                                     ! 
     212            ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC)       ! 
     213            ! temperature inversion: max( 0, max of tn - tn(10m) )          ! 
     214            ! depth of temperature inversion                                ! 
     215            ! ------------------------------------------------------------- ! 
     216            DO jk = jpkm1, nlb10, -1   ! loop from bottom to nlb10 
     217               DO jj = 1, jpj 
     218                  DO ji = 1, jpi 
     219                     ! 
     220                     zzdep = gdepw(ji,jj,jk,Kmm) * tmask(ji,jj,1) 
     221                     ! 
     222                     zztmp = ts(ji,jj,nla10,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm)  ! - delta T(10m) 
     223                     IF( ABS(zztmp) > ztem2 )      zabs2   (ji,jj) = zzdep   ! abs > 0.2 
     224                     IF(     zztmp  > ztem2 )      ztm2    (ji,jj) = zzdep   ! > 0.2 
     225                     zztmp = -zztmp                                          ! delta T(10m) 
     226                     IF( zztmp >  ztinv(ji,jj) ) THEN                        ! temperature inversion 
     227                        ztinv(ji,jj) = zztmp    
     228                        zdepinv (ji,jj) = zzdep   ! max value and depth 
     229                     ENDIF 
     230 
     231                     zztmp = rhop(ji,jj,jk) - rhop(ji,jj,nla10)              ! delta rho(10m) 
     232                     IF( zztmp > zrho3        )    zrho10_3(ji,jj) = zzdep   ! > 0.03 
     233                     IF( zztmp > zdelr(ji,jj) )    zpycn   (ji,jj) = zzdep   ! > equi. delta T(10m) - 0.2 
     234                     ! 
     235                  END DO 
     236               END DO 
     237            END DO 
     238 
     239            CALL iom_put( 'mld_dt02', zabs2    )   ! MLD abs(delta t) - 0.2 
     240            CALL iom_put( 'topthdep', ztm2     )   ! T(10) - 0.2 
     241            CALL iom_put( 'mldr10_3', zrho10_3 )   ! MLD delta rho(10m) = 0.03 
     242            CALL iom_put( 'pycndep' , zpycn    )   ! MLD delta rho equi. delta T(10m) = 0.2 
     243            CALL iom_put( 'tinv'    , ztinv    )   ! max. temp. inv. (t10 ref)  
     244            CALL iom_put( 'depti'   , zdepinv  )   ! depth of max. temp. inv. (t10 ref)  
     245            ! 
     246         ENDIF 
     247  
     248         ! ------------------------------- ! 
     249         !  Depth of 20C/26C/28C isotherm  ! 
     250         ! ------------------------------- ! 
     251         IF( iom_use ('20d') ) THEN  ! depth of the 20 isotherm 
     252            ztem2 = 20. 
     253            CALL dia_hth_dep( Kmm, ztem2, hd20 )   
     254            CALL iom_put( '20d', hd20 )     
     255         ENDIF 
     256         ! 
     257         IF( iom_use ('26d') ) THEN  ! depth of the 26 isotherm 
     258            ztem2 = 26. 
     259            CALL dia_hth_dep( Kmm, ztem2, hd26 )   
     260            CALL iom_put( '26d', hd26 )     
     261         ENDIF 
     262         ! 
     263         IF( iom_use ('28d') ) THEN  ! depth of the 28 isotherm 
     264            ztem2 = 28. 
     265            CALL dia_hth_dep( Kmm, ztem2, hd28 )   
     266            CALL iom_put( '28d', hd28 )     
     267         ENDIF 
     268         
     269         ! ----------------------------- ! 
     270         !  Heat content of first 300 m  ! 
     271         ! ----------------------------- ! 
     272         IF( iom_use ('hc300') ) THEN   
     273            zzdep = 300. 
     274            CALL  dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc3 ) 
     275            CALL iom_put( 'hc300', rau0_rcp * htc3 )  ! vertically integrated heat content (J/m2) 
     276         ENDIF 
     277         ! 
     278         ! ----------------------------- ! 
     279         !  Heat content of first 700 m  ! 
     280         ! ----------------------------- ! 
     281         IF( iom_use ('hc700') ) THEN   
     282            zzdep = 700. 
     283            CALL  dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc7 ) 
     284            CALL iom_put( 'hc700', rau0_rcp * htc7 )  ! vertically integrated heat content (J/m2) 
     285   
     286         ENDIF 
     287         ! 
     288         ! ----------------------------- ! 
     289         !  Heat content of first 2000 m  ! 
     290         ! ----------------------------- ! 
     291         IF( iom_use ('hc2000') ) THEN   
     292            zzdep = 2000. 
     293            CALL  dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc20 ) 
     294            CALL iom_put( 'hc2000', rau0_rcp * htc20 )  ! vertically integrated heat content (J/m2)   
     295         ENDIF 
     296         ! 
    158297      ENDIF 
     298 
     299      ! 
     300      IF( ln_timing )   CALL timing_stop('dia_hth') 
     301      ! 
     302   END SUBROUTINE dia_hth 
     303 
     304   SUBROUTINE dia_hth_dep( Kmm, ptem, pdept ) 
     305      ! 
     306      INTEGER , INTENT(in) :: Kmm      ! ocean time level index 
     307      REAL(wp), INTENT(in) :: ptem 
     308      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pdept      
     309      ! 
     310      INTEGER  :: ji, jj, jk, iid 
     311      REAL(wp) :: zztmp, zzdep 
     312      INTEGER, DIMENSION(jpi,jpj) :: iktem 
    159313       
    160       ! Preliminary computation 
    161       ! computation of zdelr = (dr/dT)(T,S,10m)*(-0.2 degC) 
    162       DO jj = 1, jpj 
    163          DO ji = 1, jpi 
    164             IF( tmask(ji,jj,nla10) == 1. ) THEN 
    165                zu  =  1779.50 + 11.250 * ts(ji,jj,nla10,jp_tem,Kmm) - 3.80   * ts(ji,jj,nla10,jp_sal,Kmm)                             & 
    166                   &                                              - 0.0745 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm)   & 
    167                   &                                              - 0.0100 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_sal,Kmm) 
    168                zv  =  5891.00 + 38.000 * ts(ji,jj,nla10,jp_tem,Kmm) + 3.00   * ts(ji,jj,nla10,jp_sal,Kmm)                             & 
    169                   &                                              - 0.3750 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm) 
    170                zut =    11.25 -  0.149 * ts(ji,jj,nla10,jp_tem,Kmm) - 0.01   * ts(ji,jj,nla10,jp_sal,Kmm) 
    171                zvt =    38.00 -  0.750 * ts(ji,jj,nla10,jp_tem,Kmm) 
    172                zw  = (zu + 0.698*zv) * (zu + 0.698*zv) 
    173                zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) 
    174             ELSE 
    175                zdelr(ji,jj) = 0._wp 
    176             ENDIF 
    177          END DO 
    178       END DO 
    179  
    180       ! ------------------------------------------------------------- ! 
    181       ! thermocline depth: strongest vertical gradient of temperature ! 
    182       ! turbocline depth (mixing layer depth): avt = zavt5            ! 
    183       ! MLD: rho = rho(1) + zrho3                                     ! 
    184       ! MLD: rho = rho(1) + zrho1                                     ! 
    185       ! ------------------------------------------------------------- ! 
    186       DO jk = jpkm1, 2, -1   ! loop from bottom to 2 
    187          DO jj = 1, jpj 
    188             DO ji = 1, jpi 
    189                ! 
    190                zzdep = gdepw(ji,jj,jk,Kmm) 
    191                zztmp = ( ts(ji,jj,jk-1,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm) ) / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
    192                zzdep = zzdep * tmask(ji,jj,1) 
    193  
    194                IF( zztmp > zmaxdzT(ji,jj) ) THEN                         
    195                   zmaxdzT(ji,jj) = zztmp   ;   hth    (ji,jj) = zzdep                ! max and depth of dT/dz 
    196                ENDIF 
    197                 
    198                IF( nla10 > 1 ) THEN  
    199                   zztmp = rhop(ji,jj,jk) - rhop(ji,jj,1)                             ! delta rho(1) 
    200                   IF( zztmp > zrho3 )          zrho0_3(ji,jj) = zzdep                ! > 0.03 
    201                   IF( zztmp > zrho1 )          zrho0_1(ji,jj) = zzdep                ! > 0.01 
    202                ENDIF 
    203  
    204             END DO 
    205          END DO 
    206       END DO 
    207        
    208       CALL iom_put( "mlddzt", hth )            ! depth of the thermocline 
    209       IF( nla10 > 1 ) THEN  
    210          CALL iom_put( "mldr0_3", zrho0_3 )   ! MLD delta rho(surf) = 0.03 
    211          CALL iom_put( "mldr0_1", zrho0_1 )   ! MLD delta rho(surf) = 0.01 
    212       ENDIF 
    213  
    214       ! ------------------------------------------------------------- ! 
    215       ! MLD: abs( tn - tn(10m) ) = ztem2                              ! 
    216       ! Top of thermocline: tn = tn(10m) - ztem2                      ! 
    217       ! MLD: rho = rho10m + zrho3                                     ! 
    218       ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC)       ! 
    219       ! temperature inversion: max( 0, max of tn - tn(10m) )          ! 
    220       ! depth of temperature inversion                                ! 
    221       ! ------------------------------------------------------------- ! 
    222       DO jk = jpkm1, nlb10, -1   ! loop from bottom to nlb10 
    223          DO jj = 1, jpj 
    224             DO ji = 1, jpi 
    225                ! 
    226                zzdep = gdepw(ji,jj,jk,Kmm) * tmask(ji,jj,1) 
    227                ! 
    228                zztmp = ts(ji,jj,nla10,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm)  ! - delta T(10m) 
    229                IF( ABS(zztmp) > ztem2 )      zabs2   (ji,jj) = zzdep   ! abs > 0.2 
    230                IF(     zztmp  > ztem2 )      ztm2    (ji,jj) = zzdep   ! > 0.2 
    231                zztmp = -zztmp                                          ! delta T(10m) 
    232                IF( zztmp >  ztinv(ji,jj) ) THEN                        ! temperature inversion 
    233                   ztinv(ji,jj) = zztmp   ;   zdepinv (ji,jj) = zzdep   ! max value and depth 
    234                ENDIF 
    235  
    236                zztmp = rhop(ji,jj,jk) - rhop(ji,jj,nla10)              ! delta rho(10m) 
    237                IF( zztmp > zrho3        )    zrho10_3(ji,jj) = zzdep   ! > 0.03 
    238                IF( zztmp > zdelr(ji,jj) )    zpycn   (ji,jj) = zzdep   ! > equi. delta T(10m) - 0.2 
    239                ! 
    240             END DO 
    241          END DO 
    242       END DO 
    243  
    244       CALL iom_put( "mld_dt02", zabs2        )   ! MLD abs(delta t) - 0.2 
    245       CALL iom_put( "topthdep", ztm2         )   ! T(10) - 0.2 
    246       CALL iom_put( "mldr10_3", zrho10_3     )   ! MLD delta rho(10m) = 0.03 
    247       CALL iom_put( "pycndep" , zpycn        )   ! MLD delta rho equi. delta T(10m) = 0.2 
    248       CALL iom_put( "tinv"    , ztinv        )   ! max. temp. inv. (t10 ref)  
    249       CALL iom_put( "depti"   , zdepinv      )   ! depth of max. temp. inv. (t10 ref)  
    250  
    251  
    252       ! ----------------------------------- ! 
    253       ! search deepest level above 20C/28C  ! 
    254       ! ----------------------------------- ! 
    255       ik20(:,:) = 1 
    256       ik28(:,:) = 1 
     314      ! --------------------------------------- ! 
     315      ! search deepest level above ptem         ! 
     316      ! --------------------------------------- ! 
     317      iktem(:,:) = 1 
    257318      DO jk = 1, jpkm1   ! beware temperature is not always decreasing with depth => loop from top to bottom 
    258319         DO jj = 1, jpj 
    259320            DO ji = 1, jpi 
    260321               zztmp = ts(ji,jj,jk,jp_tem,Kmm) 
    261                IF( zztmp >= 20. )   ik20(ji,jj) = jk 
    262                IF( zztmp >= 28. )   ik28(ji,jj) = jk 
     322               IF( zztmp >= ptem )   iktem(ji,jj) = jk 
    263323            END DO 
    264324         END DO 
    265325      END DO 
    266326 
    267       ! --------------------------- ! 
    268       !  Depth of 20C/28C isotherm  ! 
    269       ! --------------------------- ! 
     327      ! ------------------------------- ! 
     328      !  Depth of ptem isotherm         ! 
     329      ! ------------------------------- ! 
    270330      DO jj = 1, jpj 
    271331         DO ji = 1, jpi 
    272332            ! 
    273             zzdep = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)       ! depth of the oean bottom 
     333            zzdep = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)       ! depth of the ocean bottom 
    274334            ! 
    275             iid = ik20(ji,jj) 
     335            iid = iktem(ji,jj) 
    276336            IF( iid /= 1 ) THEN  
    277                zztmp =      gdept(ji,jj,iid  ,Kmm)   &                     ! linear interpolation 
     337                zztmp =     gdept(ji,jj,iid  ,Kmm)   &                     ! linear interpolation 
    278338                  &  + (    gdept(ji,jj,iid+1,Kmm) - gdept(ji,jj,iid,Kmm)                       )   & 
    279339                  &  * ( 20.*tmask(ji,jj,iid+1) - ts(ji,jj,iid,jp_tem,Kmm)                       )   & 
    280340                  &  / ( ts(ji,jj,iid+1,jp_tem,Kmm) - ts(ji,jj,iid,jp_tem,Kmm) + (1.-tmask(ji,jj,1)) ) 
    281                hd20(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
     341               pdept(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
    282342            ELSE  
    283                hd20(ji,jj) = 0._wp 
     343               pdept(ji,jj) = 0._wp 
    284344            ENDIF 
    285             ! 
    286             iid = ik28(ji,jj) 
    287             IF( iid /= 1 ) THEN  
    288                zztmp =      gdept(ji,jj,iid  ,Kmm)   &                     ! linear interpolation 
    289                   &  + (    gdept(ji,jj,iid+1,Kmm) - gdept(ji,jj,iid,Kmm)                       )   & 
    290                   &  * ( 28.*tmask(ji,jj,iid+1) -    ts(ji,jj,iid,jp_tem,Kmm)                       )   & 
    291                   &  / (  ts(ji,jj,iid+1,jp_tem,Kmm) -    ts(ji,jj,iid,jp_tem,Kmm) + (1.-tmask(ji,jj,1)) ) 
    292                hd28(ji,jj) = MIN( zztmp , zzdep ) * tmask(ji,jj,1)      ! bound by the ocean depth 
    293             ELSE  
    294                hd28(ji,jj) = 0._wp 
    295             ENDIF 
    296  
    297345         END DO 
    298346      END DO 
    299       CALL iom_put( "20d", hd20 )   ! depth of the 20 isotherm 
    300       CALL iom_put( "28d", hd28 )   ! depth of the 28 isotherm 
    301  
    302       ! ----------------------------- ! 
    303       !  Heat content of first 300 m  ! 
    304       ! ----------------------------- ! 
    305  
    306       ! find ilevel with (ilevel+1) the deepest W-level above 300m (we assume we can use e3t_1d to do this search...) 
    307       ilevel   = 0 
    308       zthick_0 = 0._wp 
    309       DO jk = 1, jpkm1                       
    310          zthick_0 = zthick_0 + e3t_1d(jk) 
    311          IF( zthick_0 < 300. )   ilevel = jk 
    312       END DO 
     347      ! 
     348   END SUBROUTINE dia_hth_dep 
     349 
     350 
     351   SUBROUTINE dia_hth_htc( Kmm, pdep, pt, phtc ) 
     352      ! 
     353      INTEGER , INTENT(in) :: Kmm      ! ocean time level index 
     354      REAL(wp), INTENT(in) :: pdep     ! depth over the heat content 
     355      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: pt    
     356      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: phtc   
     357      ! 
     358      INTEGER  :: ji, jj, jk, ik 
     359      REAL(wp), DIMENSION(jpi,jpj) :: zthick 
     360      INTEGER , DIMENSION(jpi,jpj) :: ilevel 
     361 
     362 
    313363      ! surface boundary condition 
    314       IF( ln_linssh ) THEN   ;   zthick(:,:) = ssh(:,:,Kmm)   ;   htc3(:,:) = ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) * tmask(:,:,1)   
    315       ELSE                   ;   zthick(:,:) = 0._wp       ;   htc3(:,:) = 0._wp                                    
     364       
     365      IF( .NOT. ln_linssh ) THEN   ;   zthick(:,:) = 0._wp       ;   phtc(:,:) = 0._wp                                    
     366      ELSE                         ;   zthick(:,:) = ssh(:,:,Kmm)   ;   phtc(:,:) = pt(:,:,1) * ssh(:,:,Kmm) * tmask(:,:,1)    
    316367      ENDIF 
    317       ! integration down to ilevel 
    318       DO jk = 1, ilevel 
    319          zthick(:,:) = zthick(:,:) + e3t(:,:,jk,Kmm) 
    320          htc3  (:,:) = htc3  (:,:) + e3t(:,:,jk,Kmm) * ts(:,:,jk,jp_tem,Kmm) * tmask(:,:,jk) 
    321       END DO 
    322       ! deepest layer 
    323       zthick(:,:) = 300. - zthick(:,:)   !   remaining thickness to reach 300m 
     368      ! 
     369      ilevel(:,:) = 1 
     370      DO jk = 2, jpkm1 
     371         DO jj = 1, jpj 
     372            DO ji = 1, jpi 
     373               IF( ( gdept(ji,jj,jk,Kmm) < pdep ) .AND. ( tmask(ji,jj,jk) == 1 ) ) THEN 
     374                   ilevel(ji,jj) = jk 
     375                   zthick(ji,jj) = zthick(ji,jj) + e3t(ji,jj,jk,Kmm) 
     376                   phtc  (ji,jj) = phtc  (ji,jj) + e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk) 
     377               ENDIF 
     378            ENDDO 
     379         ENDDO 
     380      ENDDO 
     381      ! 
    324382      DO jj = 1, jpj 
    325383         DO ji = 1, jpi 
    326             htc3(ji,jj) = htc3(ji,jj) + ts(ji,jj,ilevel+1,jp_tem,Kmm)                  & 
    327                &                      * MIN( e3t(ji,jj,ilevel+1,Kmm), zthick(ji,jj) ) * tmask(ji,jj,ilevel+1) 
     384            ik = ilevel(ji,jj) 
     385            zthick(ji,jj) = pdep - zthick(ji,jj)   !   remaining thickness to reach depht pdep 
     386            phtc(ji,jj)   = phtc(ji,jj) + pt(ji,jj,ik+1) * MIN( e3t(ji,jj,ik+1,Kmm), zthick(ji,jj) ) & 
     387                                                          * tmask(ji,jj,ik+1) 
    328388         END DO 
    329       END DO 
    330       ! from temperature to heat contain 
    331       zcoef = rau0 * rcp 
    332       htc3(:,:) = zcoef * htc3(:,:) 
    333       CALL iom_put( "hc300", htc3 )      ! first 300m heat content 
    334       ! 
    335       IF( ln_timing )   CALL timing_stop('dia_hth') 
    336       ! 
    337    END SUBROUTINE dia_hth 
    338  
    339 #else 
    340    !!---------------------------------------------------------------------- 
    341    !!   Default option :                                       Empty module 
    342    !!---------------------------------------------------------------------- 
    343    LOGICAL , PUBLIC, PARAMETER ::   lk_diahth = .FALSE.  !: thermocline-20d depths flag 
    344 CONTAINS 
    345    SUBROUTINE dia_hth( kt, Kmm )         ! Empty routine 
    346       IMPLICIT NONE 
    347       INTEGER, INTENT( in ) :: kt 
    348       INTEGER, INTENT( in ) :: Kmm 
    349       WRITE(*,*) 'dia_hth: You should not have seen this print! error?', kt 
    350    END SUBROUTINE dia_hth 
    351 #endif 
     389      ENDDO 
     390      ! 
     391      ! 
     392   END SUBROUTINE dia_hth_htc 
    352393 
    353394   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.