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 12109 for NEMO/branches/2019/dev_r12072_TOP-01_ENHANCE-11_CEthe/src/OCE/DIA – NEMO

Ignore:
Timestamp:
2019-12-07T12:40:06+01:00 (4 years ago)
Author:
cetlod
Message:

check out & merge dev_r11643_ENHANCE-11_CEthe_Shaconemo_diags branch onto dev_r12072_TOP-01_ENHANCE-11_CEthe

Location:
NEMO/branches/2019/dev_r12072_TOP-01_ENHANCE-11_CEthe/src/OCE/DIA
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r12072_TOP-01_ENHANCE-11_CEthe/src/OCE/DIA/diaar5.F90

    r11993 r12109  
    7171      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
    7272      ! 
    73       INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    74       REAL(wp) ::   zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass 
     73      INTEGER  ::   ji, jj, jk, iks, ikb                      ! dummy loop arguments 
     74      REAL(wp) ::   zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass, zsst 
    7575      REAL(wp) ::   zaw, zbw, zrw 
    7676      ! 
    7777      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: zarea_ssh , zbotpres       ! 2D workspace  
    78       REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: zpe                         ! 2D workspace  
    79       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   :: zrhd , zrhop               ! 3D workspace 
     78      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: zpe, z2d                   ! 2D workspace  
     79      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   :: zrhd , zrhop, ztpot   ! 3D workspace 
    8080      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ztsn                       ! 4D workspace 
    8181 
     
    8686 
    8787      IF( l_ar5 ) THEN  
    88          ALLOCATE( zarea_ssh(jpi,jpj) , zbotpres(jpi,jpj) ) 
     88         ALLOCATE( zarea_ssh(jpi,jpj), zbotpres(jpi,jpj), z2d(jpi,jpj) ) 
    8989         ALLOCATE( zrhd(jpi,jpj,jpk) , zrhop(jpi,jpj,jpk) ) 
    9090         ALLOCATE( ztsn(jpi,jpj,jpk,jpts) ) 
     
    9292      ENDIF 
    9393      ! 
     94      CALL iom_put( 'e2u'      , e2u (:,:) ) 
     95      CALL iom_put( 'e1v'      , e1v (:,:) ) 
     96      CALL iom_put( 'areacello', area(:,:) ) 
     97      ! 
     98      IF( iom_use( 'volcello' ) .OR. iom_use( 'masscello' )  ) THEN   
     99         zrhd(:,:,jpk) = 0._wp        ! ocean volume ; rhd is used as workspace 
     100         DO jk = 1, jpkm1 
     101            zrhd(:,:,jk) = area(:,:) * e3t_n(:,:,jk) * tmask(:,:,jk) 
     102         END DO 
     103         CALL iom_put( 'volcello'  , zrhd(:,:,:)  )  ! WARNING not consistent with CMIP DR where volcello is at ca. 2000 
     104         CALL iom_put( 'masscello' , rau0 * e3t_n(:,:,:) * tmask(:,:,:) )  ! ocean mass 
     105      ENDIF  
     106      ! 
     107      IF( iom_use( 'e3tb' ) )  THEN    ! bottom layer thickness 
     108         DO jj = 1, jpj 
     109            DO ji = 1, jpi 
     110               ikb = mbkt(ji,jj) 
     111               z2d(ji,jj) = e3t_n(ji,jj,ikb) 
     112            END DO 
     113         END DO 
     114         CALL iom_put( 'e3tb', z2d ) 
     115      ENDIF  
     116      ! 
    94117      IF( iom_use( 'voltot' ) .OR. iom_use( 'sshtot' )  .OR. iom_use( 'sshdyn' )  ) THEN     
    95118         !                                         ! total volume of liquid seawater 
    96          zvolssh = SUM( zarea_ssh(:,:) )  
    97          CALL mpp_sum( 'diaar5', zvolssh ) 
    98          zvol = vol0 + zvolssh 
     119         zvolssh = glob_sum( 'diaar5', zarea_ssh(:,:) )  
     120         zvol    = vol0 + zvolssh 
    99121       
    100122         CALL iom_put( 'voltot', zvol               ) 
     
    118140               DO ji = 1, jpi 
    119141                  DO jj = 1, jpj 
    120                      zbotpres(ji,jj) = zbotpres(ji,jj) + sshn(ji,jj) * zrhd(ji,jj,mikt(ji,jj)) + riceload(ji,jj) 
     142                     iks = mikt(ji,jj) 
     143                     zbotpres(ji,jj) = zbotpres(ji,jj) + sshn(ji,jj) * zrhd(ji,jj,iks) + riceload(ji,jj) 
    121144                  END DO 
    122145               END DO 
     
    129152         END IF 
    130153         !                                          
    131          zarho = SUM( area(:,:) * zbotpres(:,:) )  
    132          CALL mpp_sum( 'diaar5', zarho ) 
     154         zarho = glob_sum( 'diaar5', area(:,:) * zbotpres(:,:) )  
    133155         zssh_steric = - zarho / area_tot 
    134156         CALL iom_put( 'sshthster', zssh_steric ) 
     
    147169               DO ji = 1,jpi 
    148170                  DO jj = 1,jpj 
    149                      zbotpres(ji,jj) = zbotpres(ji,jj) + sshn(ji,jj) * zrhd(ji,jj,mikt(ji,jj)) + riceload(ji,jj) 
     171                     iks = mikt(ji,jj) 
     172                     zbotpres(ji,jj) = zbotpres(ji,jj) + sshn(ji,jj) * zrhd(ji,jj,iks) + riceload(ji,jj) 
    150173                  END DO 
    151174               END DO 
     
    155178         END IF 
    156179         !     
    157          zarho = SUM( area(:,:) * zbotpres(:,:) )  
    158          CALL mpp_sum( 'diaar5', zarho ) 
     180         zarho = glob_sum( 'diaar5', area(:,:) * zbotpres(:,:) )  
    159181         zssh_steric = - zarho / area_tot 
    160182         CALL iom_put( 'sshsteric', zssh_steric ) 
    161        
    162183         !                                         ! ocean bottom pressure 
    163184         zztmp = rau0 * grav * 1.e-4_wp               ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa 
     
    168189 
    169190      IF( iom_use( 'masstot' ) .OR. iom_use( 'temptot' )  .OR. iom_use( 'saltot' )  ) THEN     
    170          !                                         ! Mean density anomalie, temperature and salinity 
    171          ztemp = 0._wp 
    172          zsal  = 0._wp 
    173          DO jk = 1, jpkm1 
    174             DO jj = 1, jpj 
    175                DO ji = 1, jpi 
    176                   zztmp = area(ji,jj) * e3t_n(ji,jj,jk) 
    177                   ztemp = ztemp + zztmp * tsn(ji,jj,jk,jp_tem) 
    178                   zsal  = zsal  + zztmp * tsn(ji,jj,jk,jp_sal) 
    179                END DO 
    180             END DO 
    181          END DO 
    182          IF( ln_linssh ) THEN 
     191          !                                         ! Mean density anomalie, temperature and salinity 
     192          ztsn(:,:,:,:) = 0._wp                    ! ztsn(:,:,1,jp_tem/sal) is used here as 2D Workspace for temperature & salinity 
     193          DO jk = 1, jpkm1 
     194             DO jj = 1, jpj 
     195                DO ji = 1, jpi 
     196                   zztmp = area(ji,jj) * e3t_n(ji,jj,jk) 
     197                   ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zztmp * tsn(ji,jj,jk,jp_tem) 
     198                   ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zztmp * tsn(ji,jj,jk,jp_sal) 
     199                ENDDO 
     200             ENDDO 
     201          ENDDO 
     202 
     203          IF( ln_linssh ) THEN 
    183204            IF( ln_isfcav ) THEN 
    184205               DO ji = 1, jpi 
    185206                  DO jj = 1, jpj 
    186                      ztemp = ztemp + zarea_ssh(ji,jj) * tsn(ji,jj,mikt(ji,jj),jp_tem)  
    187                      zsal  = zsal  + zarea_ssh(ji,jj) * tsn(ji,jj,mikt(ji,jj),jp_sal)  
     207                     iks = mikt(ji,jj) 
     208                     ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zarea_ssh(ji,jj) * tsn(ji,jj,iks,jp_tem)  
     209                     ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zarea_ssh(ji,jj) * tsn(ji,jj,iks,jp_sal)  
    188210                  END DO 
    189211               END DO 
    190212            ELSE 
    191                ztemp = ztemp + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_tem) ) 
    192                zsal  = zsal  + SUM( zarea_ssh(:,:) * tsn(:,:,1,jp_sal) ) 
     213               ztsn(:,:,1,jp_tem) = ztsn(:,:,1,jp_tem) + zarea_ssh(:,:) * tsn(:,:,1,jp_tem)  
     214               ztsn(:,:,1,jp_sal) = ztsn(:,:,1,jp_sal) + zarea_ssh(:,:) * tsn(:,:,1,jp_sal)  
    193215            END IF 
    194216         ENDIF 
    195          IF( lk_mpp ) THEN   
    196             CALL mpp_sum( 'diaar5', ztemp ) 
    197             CALL mpp_sum( 'diaar5', zsal  ) 
    198          END IF 
    199          ! 
    200          zmass = rau0 * ( zarho + zvol )                 ! total mass of liquid seawater 
    201          ztemp = ztemp / zvol                            ! potential temperature in liquid seawater 
    202          zsal  = zsal  / zvol                            ! Salinity of liquid seawater 
     217         ! 
     218         ztemp = glob_sum( 'diaar5', ztsn(:,:,1,jp_tem) ) 
     219         zsal  = glob_sum( 'diaar5', ztsn(:,:,1,jp_sal) ) 
     220         zmass = rau0 * ( zarho + zvol )       
    203221         ! 
    204222         CALL iom_put( 'masstot', zmass ) 
    205          CALL iom_put( 'temptot', ztemp ) 
    206          CALL iom_put( 'saltot' , zsal  ) 
    207          ! 
     223         CALL iom_put( 'temptot', ztemp / zvol ) 
     224         CALL iom_put( 'saltot' , zsal  / zvol ) 
     225         ! 
     226      ENDIF      
     227 
     228      IF( ln_teos10 ) THEN        ! ! potential temperature (TEOS-10 case) 
     229         IF( iom_use( 'toce_pot') .OR. iom_use( 'temptot_pot' ) .OR. iom_use( 'sst_pot' )  & 
     230                                  .OR. iom_use( 'ssttot' ) .OR.  iom_use( 'tosmint_pot' ) ) THEN 
     231            ! 
     232            ALLOCATE( ztpot(jpi,jpj,jpk) ) 
     233            ztpot(:,:,jpk) = 0._wp 
     234            DO jk = 1, jpkm1 
     235               ztpot(:,:,jk) = eos_pt_from_ct( tsn(:,:,jk,jp_tem), tsn(:,:,jk,jp_sal) ) 
     236            END DO 
     237            ! 
     238            CALL iom_put( 'toce_pot', ztpot(:,:,:) )  ! potential temperature (TEOS-10 case) 
     239            CALL iom_put( 'sst_pot' , ztpot(:,:,1) )  ! surface temperature 
     240            ! 
     241            IF( iom_use( 'temptot_pot' ) ) THEN   ! Output potential temperature in case we use TEOS-10 
     242               z2d(:,:) = 0._wp 
     243               DO jk = 1, jpkm1 
     244                 z2d(:,:) = z2d(:,:) + area(:,:) * e3t_n(:,:,jk) * ztpot(:,:,jk) 
     245               END DO 
     246               ztemp = glob_sum( 'diaar5', z2d(:,:)  )  
     247               CALL iom_put( 'temptot_pot', ztemp / zvol ) 
     248             ENDIF 
     249             ! 
     250             IF( iom_use( 'ssttot' ) ) THEN   ! Output potential temperature in case we use TEOS-10 
     251               zsst = glob_sum( 'diaar5',  area(:,:) * ztpot(:,:,1)  )  
     252               CALL iom_put( 'ssttot', zsst / area_tot ) 
     253             ENDIF 
     254             ! Vertical integral of temperature 
     255             IF( iom_use( 'tosmint_pot') ) THEN 
     256               z2d(:,:) = 0._wp 
     257               DO jk = 1, jpkm1 
     258                  DO jj = 1, jpj 
     259                     DO ji = 1, jpi   ! vector opt. 
     260                        z2d(ji,jj) = z2d(ji,jj) + rau0 * e3t_n(ji,jj,jk) *  ztpot(ji,jj,jk) 
     261                     END DO 
     262                  END DO 
     263               END DO 
     264               CALL iom_put( 'tosmint_pot', z2d )  
     265            ENDIF 
     266            DEALLOCATE( ztpot ) 
     267        ENDIF 
     268      ELSE        
     269         IF( iom_use('ssttot') ) THEN   ! Output sst in case we use EOS-80 
     270            zsst  = glob_sum( 'diaar5', area(:,:) * tsn(:,:,1,jp_tem) ) 
     271            CALL iom_put('ssttot', zsst / area_tot ) 
     272         ENDIF 
    208273      ENDIF 
    209274 
    210275      IF( iom_use( 'tnpeo' )) THEN     
    211       ! Work done against stratification by vertical mixing 
    212       ! Exclude points where rn2 is negative as convection kicks in here and 
    213       ! work is not being done against stratification 
     276        ! Work done against stratification by vertical mixing 
     277        ! Exclude points where rn2 is negative as convection kicks in here and 
     278        ! work is not being done against stratification 
    214279         ALLOCATE( zpe(jpi,jpj) ) 
    215280         zpe(:,:) = 0._wp 
     
    219284                  DO ji = 1, jpi 
    220285                     IF( rn2(ji,jj,jk) > 0._wp ) THEN 
    221                         zrw =   ( gdepw_n(ji,jj,jk  ) - gdept_n(ji,jj,jk) )   & 
    222                            &  / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 
    223 !!gm  this can be reduced to :  (depw-dept) / e3w   (NB idem dans bn2 !) 
    224 !                        zrw =   ( gdept_n(ji,jj,jk) - gdepw_n(ji,jj,jk) ) / e3w_n(ji,jj,jk) 
    225 !!gm end 
     286                        zrw = ( gdept_n(ji,jj,jk) - gdepw_n(ji,jj,jk) ) / e3w_n(ji,jj,jk) 
    226287                        ! 
    227288                        zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 
    228289                        zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 
    229290                        ! 
    230                         zpe(ji, jj) = zpe(ji, jj)            & 
     291                        zpe(ji, jj) = zpe(ji,jj)   & 
    231292                           &        -  grav * (  avt(ji,jj,jk) * zaw * (tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) )  & 
    232293                           &                   - avs(ji,jj,jk) * zbw * (tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) ) 
     
    239300               DO ji = 1, jpi 
    240301                  DO jj = 1, jpj 
    241                      zpe(ji,jj) = zpe(ji,jj) + avt(ji, jj, jk) * MIN(0._wp,rn2(ji, jj, jk)) * rau0 * e3w_n(ji, jj, jk) 
     302                     zpe(ji,jj) = zpe(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * rau0 * e3w_n(ji,jj,jk) 
    242303                  END DO 
    243304               END DO 
    244305            END DO 
    245306         ENDIF 
    246 !!gm useless lbc_lnk since the computation above is performed over 1:jpi & 1:jpj 
    247 !!gm           CALL lbc_lnk( 'diaar5', zpe, 'T', 1._wp)          
    248307          CALL iom_put( 'tnpeo', zpe ) 
    249308          DEALLOCATE( zpe ) 
     
    251310 
    252311      IF( l_ar5 ) THEN 
    253         DEALLOCATE( zarea_ssh , zbotpres ) 
     312        DEALLOCATE( zarea_ssh , zbotpres, z2d ) 
    254313        DEALLOCATE( zrhd      , zrhop    ) 
    255314        DEALLOCATE( ztsn                 ) 
     
    287346       CALL lbc_lnk( 'diaar5', z2d, 'U', -1. ) 
    288347       IF( cptr == 'adv' ) THEN 
    289           IF( ktra == jp_tem ) CALL iom_put( "uadv_heattr" , rau0_rcp * z2d )  ! advective heat transport in i-direction 
    290           IF( ktra == jp_sal ) CALL iom_put( "uadv_salttr" , rau0     * z2d )  ! advective salt transport in i-direction 
     348          IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rau0_rcp * z2d )  ! advective heat transport in i-direction 
     349          IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rau0     * z2d )  ! advective salt transport in i-direction 
    291350       ENDIF 
    292351       IF( cptr == 'ldf' ) THEN 
    293           IF( ktra == jp_tem ) CALL iom_put( "udiff_heattr" , rau0_rcp * z2d ) ! diffusive heat transport in i-direction 
    294           IF( ktra == jp_sal ) CALL iom_put( "udiff_salttr" , rau0     * z2d ) ! diffusive salt transport in i-direction 
     352          IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rau0_rcp * z2d ) ! diffusive heat transport in i-direction 
     353          IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rau0     * z2d ) ! diffusive salt transport in i-direction 
    295354       ENDIF 
    296355       ! 
     
    305364       CALL lbc_lnk( 'diaar5', z2d, 'V', -1. ) 
    306365       IF( cptr == 'adv' ) THEN 
    307           IF( ktra == jp_tem ) CALL iom_put( "vadv_heattr" , rau0_rcp * z2d )  ! advective heat transport in j-direction 
    308           IF( ktra == jp_sal ) CALL iom_put( "vadv_salttr" , rau0     * z2d )  ! advective salt transport in j-direction 
     366          IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rau0_rcp * z2d )  ! advective heat transport in j-direction 
     367          IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rau0     * z2d )  ! advective salt transport in j-direction 
    309368       ENDIF 
    310369       IF( cptr == 'ldf' ) THEN 
    311           IF( ktra == jp_tem ) CALL iom_put( "vdiff_heattr" , rau0_rcp * z2d ) ! diffusive heat transport in j-direction 
    312           IF( ktra == jp_sal ) CALL iom_put( "vdiff_salttr" , rau0     * z2d ) ! diffusive salt transport in j-direction 
     370          IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rau0_rcp * z2d ) ! diffusive heat transport in j-direction 
     371          IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rau0     * z2d ) ! diffusive salt transport in j-direction 
    313372       ENDIF 
    314373           
     
    323382      !!---------------------------------------------------------------------- 
    324383      INTEGER  ::   inum 
    325       INTEGER  ::   ik 
     384      INTEGER  ::   ik, idep 
    326385      INTEGER  ::   ji, jj, jk  ! dummy loop indices 
    327386      REAL(wp) ::   zztmp   
    328387      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   zsaldta   ! Jan/Dec levitus salinity 
     388      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zvol0      
    329389      ! 
    330390      !!---------------------------------------------------------------------- 
     
    340400         IF( dia_ar5_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ar5_init : unable to allocate arrays' ) 
    341401 
    342          area(:,:) = e1e2t(:,:) * tmask_i(:,:) 
    343  
    344          area_tot = SUM( area(:,:) )   ;   CALL mpp_sum( 'diaar5', area_tot ) 
    345  
    346          vol0        = 0._wp 
     402         area(:,:) = e1e2t(:,:) 
     403         area_tot  = glob_sum( 'diaar5', area(:,:) ) 
     404 
     405         ALLOCATE( zvol0(jpi,jpj) ) 
     406         zvol0 (:,:) = 0._wp 
    347407         thick0(:,:) = 0._wp 
    348408         DO jk = 1, jpkm1 
    349             vol0        = vol0        + SUM( area (:,:) * tmask(:,:,jk) * e3t_0(:,:,jk) ) 
    350             thick0(:,:) = thick0(:,:) +    tmask_i(:,:) * tmask(:,:,jk) * e3t_0(:,:,jk) 
    351          END DO 
    352          CALL mpp_sum( 'diaar5', vol0 ) 
     409            DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step) 
     410               DO ji = 1, jpi 
     411                  idep = tmask(ji,jj,jk) * e3t_0(ji,jj,jk) 
     412                  zvol0 (ji,jj) = zvol0 (ji,jj) +  idep * area(ji,jj) 
     413                  thick0(ji,jj) = thick0(ji,jj) +  idep     
     414               END DO 
     415            END DO 
     416         END DO 
     417         vol0 = glob_sum( 'diaar5', zvol0 ) 
     418         DEALLOCATE( zvol0 ) 
    353419 
    354420         IF( iom_use( 'sshthster' ) ) THEN 
    355             ALLOCATE( zsaldta(jpi,jpj,jpj,jpts) ) 
     421            ALLOCATE( zsaldta(jpi,jpj,jpk,jpts) ) 
    356422            CALL iom_open ( 'sali_ref_clim_monthly', inum ) 
    357423            CALL iom_get  ( inum, jpdom_data, 'vosaline' , zsaldta(:,:,:,1), 1  ) 
  • NEMO/branches/2019/dev_r12072_TOP-01_ENHANCE-11_CEthe/src/OCE/DIA/diahth.F90

    r11993 r12109  
    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 ) 
     
    8283      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    8384      !! 
    84       INTEGER                          ::   ji, jj, jk            ! dummy loop arguments 
    85       INTEGER                          ::   iid, ilevel           ! temporary integers 
    86       INTEGER, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ik20, ik28  ! levels 
    87       REAL(wp)                         ::   zavt5 = 5.e-4_wp      ! Kz criterion for the turbocline depth 
    88       REAL(wp)                         ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth 
    89       REAL(wp)                         ::   zrho1 = 0.01_wp       ! density     criterion for mixed layer depth 
    90       REAL(wp)                         ::   ztem2 = 0.2_wp        ! temperature criterion for mixed layer depth 
    91       REAL(wp)                         ::   zthick_0, zcoef       ! temporary scalars 
    92       REAL(wp)                         ::   zztmp, zzdep          ! temporary scalars inside do loop 
    93       REAL(wp)                         ::   zu, zv, zw, zut, zvt  ! temporary workspace 
    94       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2  
    95       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2      
    96       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho10_3   ! MLD: rho = rho10m + zrho3       
    97       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC) 
    98       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ztinv      ! max of temperature inversion 
    99       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdepinv    ! depth of temperature inversion 
    100       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03 
    101       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01 
    102       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zmaxdzT    ! max of dT/dz 
    103       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zthick     ! vertical integration thickness  
    104       REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zdelr      ! delta rho equivalent to deltaT = 0.2 
     85      INTEGER                      ::   ji, jj, jk            ! dummy loop arguments 
     86      REAL(wp)                     ::   zrho3 = 0.03_wp       ! density     criterion for mixed layer depth 
     87      REAL(wp)                     ::   zrho1 = 0.01_wp       ! density     criterion for mixed layer depth 
     88      REAL(wp)                     ::   ztem2 = 0.2_wp        ! temperature criterion for mixed layer depth 
     89      REAL(wp)                     ::   zztmp, zzdep          ! temporary scalars inside do loop 
     90      REAL(wp)                     ::   zu, zv, zw, zut, zvt  ! temporary workspace 
     91      REAL(wp), DIMENSION(jpi,jpj) ::   zabs2      ! MLD: abs( tn - tn(10m) ) = ztem2  
     92      REAL(wp), DIMENSION(jpi,jpj) ::   ztm2       ! Top of thermocline: tn = tn(10m) - ztem2      
     93      REAL(wp), DIMENSION(jpi,jpj) ::   zrho10_3   ! MLD: rho = rho10m + zrho3       
     94      REAL(wp), DIMENSION(jpi,jpj) ::   zpycn      ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC) 
     95      REAL(wp), DIMENSION(jpi,jpj) ::   ztinv      ! max of temperature inversion 
     96      REAL(wp), DIMENSION(jpi,jpj) ::   zdepinv    ! depth of temperature inversion 
     97      REAL(wp), DIMENSION(jpi,jpj) ::   zrho0_3    ! MLD rho = rho(surf) = 0.03 
     98      REAL(wp), DIMENSION(jpi,jpj) ::   zrho0_1    ! MLD rho = rho(surf) = 0.01 
     99      REAL(wp), DIMENSION(jpi,jpj) ::   zmaxdzT    ! max of dT/dz 
     100      REAL(wp), DIMENSION(jpi,jpj) ::   zdelr      ! delta rho equivalent to deltaT = 0.2 
    105101      !!---------------------------------------------------------------------- 
    106102      IF( ln_timing )   CALL timing_start('dia_hth') 
    107103 
    108104      IF( kt == nit000 ) THEN 
     105         l_hth = .FALSE. 
     106         IF(   iom_use( 'mlddzt'   ) .OR. iom_use( 'mldr0_3'  ) .OR. iom_use( 'mldr0_1'  )    .OR.  &  
     107            &  iom_use( 'mld_dt02' ) .OR. iom_use( 'topthdep' ) .OR. iom_use( 'mldr10_3' )    .OR.  &     
     108            &  iom_use( '20d'      ) .OR. iom_use( '26d'      ) .OR. iom_use( '28d'      )    .OR.  &     
     109            &  iom_use( 'hc300'    ) .OR. iom_use( 'hc700'    ) .OR. iom_use( 'hc2000'   )    .OR.  &     
     110            &  iom_use( 'pycndep'  ) .OR. iom_use( 'tinv'     ) .OR. iom_use( 'depti'    )  ) l_hth = .TRUE. 
    109111         !                                      ! allocate dia_hth array 
    110          IF( dia_hth_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard arrays' ) 
    111  
    112          IF(.NOT. ALLOCATED(ik20) ) THEN 
    113             ALLOCATE(ik20(jpi,jpj), ik28(jpi,jpj), & 
    114                &      zabs2(jpi,jpj),   & 
    115                &      ztm2(jpi,jpj),    & 
    116                &      zrho10_3(jpi,jpj),& 
    117                &      zpycn(jpi,jpj),   & 
    118                &      ztinv(jpi,jpj),   & 
    119                &      zdepinv(jpi,jpj), & 
    120                &      zrho0_3(jpi,jpj), & 
    121                &      zrho0_1(jpi,jpj), & 
    122                &      zmaxdzT(jpi,jpj), & 
    123                &      zthick(jpi,jpj),  & 
    124                &      zdelr(jpi,jpj), STAT=ji) 
    125             CALL mpp_sum('diahth', ji) 
    126             IF( ji /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard ocean arrays' ) 
    127          END IF 
    128  
    129          IF(lwp) WRITE(numout,*) 
    130          IF(lwp) WRITE(numout,*) 'dia_hth : diagnostics of the thermocline depth' 
    131          IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    132          IF(lwp) WRITE(numout,*) 
     112         IF( l_hth ) THEN  
     113            IF( dia_hth_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_hth : unable to allocate standard arrays' ) 
     114            IF(lwp) WRITE(numout,*) 
     115            IF(lwp) WRITE(numout,*) 'dia_hth : diagnostics of the thermocline depth' 
     116            IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
     117            IF(lwp) WRITE(numout,*) 
     118         ENDIF 
    133119      ENDIF 
    134120 
    135       ! initialization 
    136       ztinv  (:,:) = 0._wp   
    137       zdepinv(:,:) = 0._wp   
    138       zmaxdzT(:,:) = 0._wp   
    139       DO jj = 1, jpj 
    140          DO ji = 1, jpi 
    141             zztmp = gdepw_n(ji,jj,mbkt(ji,jj)+1)  
    142             hth     (ji,jj) = zztmp 
    143             zabs2   (ji,jj) = zztmp 
    144             ztm2    (ji,jj) = zztmp 
    145             zrho10_3(ji,jj) = zztmp 
    146             zpycn   (ji,jj) = zztmp 
    147         END DO 
    148       END DO 
    149       IF( nla10 > 1 ) THEN  
    150          DO jj = 1, jpj 
    151             DO ji = 1, jpi 
    152                zztmp = gdepw_n(ji,jj,mbkt(ji,jj)+1)  
    153                zrho0_3(ji,jj) = zztmp 
    154                zrho0_1(ji,jj) = zztmp 
    155             END DO 
    156          END DO 
     121      IF( l_hth ) THEN 
     122         ! 
     123         IF( iom_use( 'mlddzt' ) .OR. iom_use( 'mldr0_3' ) .OR. iom_use( 'mldr0_1' ) ) THEN 
     124            ! initialization 
     125            ztinv  (:,:) = 0._wp   
     126            zdepinv(:,:) = 0._wp   
     127            zmaxdzT(:,:) = 0._wp   
     128            DO jj = 1, jpj 
     129               DO ji = 1, jpi 
     130                  zztmp = gdepw_n(ji,jj,mbkt(ji,jj)+1)  
     131                  hth     (ji,jj) = zztmp 
     132                  zabs2   (ji,jj) = zztmp 
     133                  ztm2    (ji,jj) = zztmp 
     134                  zrho10_3(ji,jj) = zztmp 
     135                  zpycn   (ji,jj) = zztmp 
     136                 END DO 
     137            END DO 
     138            IF( nla10 > 1 ) THEN  
     139               DO jj = 1, jpj 
     140                  DO ji = 1, jpi 
     141                     zztmp = gdepw_n(ji,jj,mbkt(ji,jj)+1)  
     142                     zrho0_3(ji,jj) = zztmp 
     143                     zrho0_1(ji,jj) = zztmp 
     144                  END DO 
     145               END DO 
     146            ENDIF 
     147       
     148            ! Preliminary computation 
     149            ! computation of zdelr = (dr/dT)(T,S,10m)*(-0.2 degC) 
     150            DO jj = 1, jpj 
     151               DO ji = 1, jpi 
     152                  IF( tmask(ji,jj,nla10) == 1. ) THEN 
     153                     zu  =  1779.50 + 11.250 * tsn(ji,jj,nla10,jp_tem) - 3.80   * tsn(ji,jj,nla10,jp_sal)  & 
     154                        &           - 0.0745 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem)   & 
     155                        &           - 0.0100 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_sal) 
     156                     zv  =  5891.00 + 38.000 * tsn(ji,jj,nla10,jp_tem) + 3.00   * tsn(ji,jj,nla10,jp_sal)  & 
     157                        &           - 0.3750 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem) 
     158                     zut =    11.25 -  0.149 * tsn(ji,jj,nla10,jp_tem) - 0.01   * tsn(ji,jj,nla10,jp_sal) 
     159                     zvt =    38.00 -  0.750 * tsn(ji,jj,nla10,jp_tem) 
     160                     zw  = (zu + 0.698*zv) * (zu + 0.698*zv) 
     161                     zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) 
     162                  ELSE 
     163                     zdelr(ji,jj) = 0._wp 
     164                  ENDIF 
     165               END DO 
     166            END DO 
     167 
     168            ! ------------------------------------------------------------- ! 
     169            ! thermocline depth: strongest vertical gradient of temperature ! 
     170            ! turbocline depth (mixing layer depth): avt = zavt5            ! 
     171            ! MLD: rho = rho(1) + zrho3                                     ! 
     172            ! MLD: rho = rho(1) + zrho1                                     ! 
     173            ! ------------------------------------------------------------- ! 
     174            DO jk = jpkm1, 2, -1   ! loop from bottom to 2 
     175               DO jj = 1, jpj 
     176                  DO ji = 1, jpi 
     177                     ! 
     178                     zzdep = gdepw_n(ji,jj,jk) 
     179                     zztmp = ( tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) & 
     180                            & / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
     181                     zzdep = zzdep * tmask(ji,jj,1) 
     182 
     183                     IF( zztmp > zmaxdzT(ji,jj) ) THEN                         
     184                         zmaxdzT(ji,jj) = zztmp    
     185                         hth    (ji,jj) = zzdep                ! max and depth of dT/dz 
     186                     ENDIF 
     187                
     188                     IF( nla10 > 1 ) THEN  
     189                        zztmp = rhop(ji,jj,jk) - rhop(ji,jj,1)                       ! delta rho(1) 
     190                        IF( zztmp > zrho3 )   zrho0_3(ji,jj) = zzdep                ! > 0.03 
     191                        IF( zztmp > zrho1 )   zrho0_1(ji,jj) = zzdep                ! > 0.01 
     192                     ENDIF 
     193                  END DO 
     194               END DO 
     195            END DO 
     196          
     197            CALL iom_put( 'mlddzt', hth )            ! depth of the thermocline 
     198            IF( nla10 > 1 ) THEN  
     199               CALL iom_put( 'mldr0_3', zrho0_3 )   ! MLD delta rho(surf) = 0.03 
     200               CALL iom_put( 'mldr0_1', zrho0_1 )   ! MLD delta rho(surf) = 0.01 
     201            ENDIF 
     202            ! 
     203         ENDIF 
     204         ! 
     205         IF(  iom_use( 'mld_dt02' ) .OR. iom_use( 'topthdep' ) .OR. iom_use( 'mldr10_3' ) .OR.  &     
     206            &  iom_use( 'pycndep' ) .OR. iom_use( 'tinv'     ) .OR. iom_use( 'depti'    )  ) THEN 
     207            ! ------------------------------------------------------------- ! 
     208            ! MLD: abs( tn - tn(10m) ) = ztem2                              ! 
     209            ! Top of thermocline: tn = tn(10m) - ztem2                      ! 
     210            ! MLD: rho = rho10m + zrho3                                     ! 
     211            ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC)       ! 
     212            ! temperature inversion: max( 0, max of tn - tn(10m) )          ! 
     213            ! depth of temperature inversion                                ! 
     214            ! ------------------------------------------------------------- ! 
     215            DO jk = jpkm1, nlb10, -1   ! loop from bottom to nlb10 
     216               DO jj = 1, jpj 
     217                  DO ji = 1, jpi 
     218                     ! 
     219                     zzdep = gdepw_n(ji,jj,jk) * tmask(ji,jj,1) 
     220                     ! 
     221                     zztmp = tsn(ji,jj,nla10,jp_tem) - tsn(ji,jj,jk,jp_tem)  ! - delta T(10m) 
     222                     IF( ABS(zztmp) > ztem2 )      zabs2   (ji,jj) = zzdep   ! abs > 0.2 
     223                     IF(     zztmp  > ztem2 )      ztm2    (ji,jj) = zzdep   ! > 0.2 
     224                     zztmp = -zztmp                                          ! delta T(10m) 
     225                     IF( zztmp >  ztinv(ji,jj) ) THEN                        ! temperature inversion 
     226                        ztinv(ji,jj) = zztmp    
     227                        zdepinv (ji,jj) = zzdep   ! max value and depth 
     228                     ENDIF 
     229 
     230                     zztmp = rhop(ji,jj,jk) - rhop(ji,jj,nla10)              ! delta rho(10m) 
     231                     IF( zztmp > zrho3        )    zrho10_3(ji,jj) = zzdep   ! > 0.03 
     232                     IF( zztmp > zdelr(ji,jj) )    zpycn   (ji,jj) = zzdep   ! > equi. delta T(10m) - 0.2 
     233                     ! 
     234                  END DO 
     235               END DO 
     236            END DO 
     237 
     238            CALL iom_put( 'mld_dt02', zabs2    )   ! MLD abs(delta t) - 0.2 
     239            CALL iom_put( 'topthdep', ztm2     )   ! T(10) - 0.2 
     240            CALL iom_put( 'mldr10_3', zrho10_3 )   ! MLD delta rho(10m) = 0.03 
     241            CALL iom_put( 'pycndep' , zpycn    )   ! MLD delta rho equi. delta T(10m) = 0.2 
     242            CALL iom_put( 'tinv'    , ztinv    )   ! max. temp. inv. (t10 ref)  
     243            CALL iom_put( 'depti'   , zdepinv  )   ! depth of max. temp. inv. (t10 ref)  
     244            ! 
     245         ENDIF 
     246  
     247         ! ------------------------------- ! 
     248         !  Depth of 20C/26C/28C isotherm  ! 
     249         ! ------------------------------- ! 
     250         IF( iom_use ('20d') ) THEN  ! depth of the 20 isotherm 
     251            ztem2 = 20. 
     252            CALL dia_hth_dep( ztem2, hd20 )   
     253            CALL iom_put( '20d', hd20 )     
     254         ENDIF 
     255         ! 
     256         IF( iom_use ('26d') ) THEN  ! depth of the 26 isotherm 
     257            ztem2 = 26. 
     258            CALL dia_hth_dep( ztem2, hd26 )   
     259            CALL iom_put( '26d', hd26 )     
     260         ENDIF 
     261         ! 
     262         IF( iom_use ('28d') ) THEN  ! depth of the 28 isotherm 
     263            ztem2 = 28. 
     264            CALL dia_hth_dep( ztem2, hd28 )   
     265            CALL iom_put( '28d', hd28 )     
     266         ENDIF 
     267         
     268         ! ----------------------------- ! 
     269         !  Heat content of first 300 m  ! 
     270         ! ----------------------------- ! 
     271         IF( iom_use ('hc300') ) THEN   
     272            zzdep = 300. 
     273            CALL  dia_hth_htc( zzdep, tsn(:,:,:,jp_tem), htc3 ) 
     274            CALL iom_put( 'hc300', rau0_rcp * htc3 )  ! vertically integrated heat content (J/m2) 
     275         ENDIF 
     276         ! 
     277         ! ----------------------------- ! 
     278         !  Heat content of first 700 m  ! 
     279         ! ----------------------------- ! 
     280         IF( iom_use ('hc700') ) THEN   
     281            zzdep = 700. 
     282            CALL  dia_hth_htc( zzdep, tsn(:,:,:,jp_tem), htc7 ) 
     283            CALL iom_put( 'hc700', rau0_rcp * htc7 )  ! vertically integrated heat content (J/m2) 
     284   
     285         ENDIF 
     286         ! 
     287         ! ----------------------------- ! 
     288         !  Heat content of first 2000 m  ! 
     289         ! ----------------------------- ! 
     290         IF( iom_use ('hc2000') ) THEN   
     291            zzdep = 2000. 
     292            CALL  dia_hth_htc( zzdep, tsn(:,:,:,jp_tem), htc20 ) 
     293            CALL iom_put( 'hc2000', rau0_rcp * htc20 )  ! vertically integrated heat content (J/m2)   
     294         ENDIF 
     295         ! 
    157296      ENDIF 
     297 
     298      ! 
     299      IF( ln_timing )   CALL timing_stop('dia_hth') 
     300      ! 
     301   END SUBROUTINE dia_hth 
     302 
     303   SUBROUTINE dia_hth_dep( ptem, pdept ) 
     304      ! 
     305      REAL(wp), INTENT(in) :: ptem 
     306      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pdept      
     307      ! 
     308      INTEGER  :: ji, jj, jk, iid 
     309      REAL(wp) :: zztmp, zzdep 
     310      INTEGER, DIMENSION(jpi,jpj) :: iktem 
    158311       
    159       ! Preliminary computation 
    160       ! computation of zdelr = (dr/dT)(T,S,10m)*(-0.2 degC) 
    161       DO jj = 1, jpj 
    162          DO ji = 1, jpi 
    163             IF( tmask(ji,jj,nla10) == 1. ) THEN 
    164                zu  =  1779.50 + 11.250 * tsn(ji,jj,nla10,jp_tem) - 3.80   * tsn(ji,jj,nla10,jp_sal)                             & 
    165                   &                                              - 0.0745 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem)   & 
    166                   &                                              - 0.0100 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_sal) 
    167                zv  =  5891.00 + 38.000 * tsn(ji,jj,nla10,jp_tem) + 3.00   * tsn(ji,jj,nla10,jp_sal)                             & 
    168                   &                                              - 0.3750 * tsn(ji,jj,nla10,jp_tem) * tsn(ji,jj,nla10,jp_tem) 
    169                zut =    11.25 -  0.149 * tsn(ji,jj,nla10,jp_tem) - 0.01   * tsn(ji,jj,nla10,jp_sal) 
    170                zvt =    38.00 -  0.750 * tsn(ji,jj,nla10,jp_tem) 
    171                zw  = (zu + 0.698*zv) * (zu + 0.698*zv) 
    172                zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) 
    173             ELSE 
    174                zdelr(ji,jj) = 0._wp 
    175             ENDIF 
    176          END DO 
    177       END DO 
    178  
    179       ! ------------------------------------------------------------- ! 
    180       ! thermocline depth: strongest vertical gradient of temperature ! 
    181       ! turbocline depth (mixing layer depth): avt = zavt5            ! 
    182       ! MLD: rho = rho(1) + zrho3                                     ! 
    183       ! MLD: rho = rho(1) + zrho1                                     ! 
    184       ! ------------------------------------------------------------- ! 
    185       DO jk = jpkm1, 2, -1   ! loop from bottom to 2 
    186          DO jj = 1, jpj 
    187             DO ji = 1, jpi 
    188                ! 
    189                zzdep = gdepw_n(ji,jj,jk) 
    190                zztmp = ( tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
    191                zzdep = zzdep * tmask(ji,jj,1) 
    192  
    193                IF( zztmp > zmaxdzT(ji,jj) ) THEN                         
    194                   zmaxdzT(ji,jj) = zztmp   ;   hth    (ji,jj) = zzdep                ! max and depth of dT/dz 
    195                ENDIF 
    196                 
    197                IF( nla10 > 1 ) THEN  
    198                   zztmp = rhop(ji,jj,jk) - rhop(ji,jj,1)                             ! delta rho(1) 
    199                   IF( zztmp > zrho3 )          zrho0_3(ji,jj) = zzdep                ! > 0.03 
    200                   IF( zztmp > zrho1 )          zrho0_1(ji,jj) = zzdep                ! > 0.01 
    201                ENDIF 
    202  
    203             END DO 
    204          END DO 
    205       END DO 
    206        
    207       CALL iom_put( "mlddzt", hth )            ! depth of the thermocline 
    208       IF( nla10 > 1 ) THEN  
    209          CALL iom_put( "mldr0_3", zrho0_3 )   ! MLD delta rho(surf) = 0.03 
    210          CALL iom_put( "mldr0_1", zrho0_1 )   ! MLD delta rho(surf) = 0.01 
    211       ENDIF 
    212  
    213       ! ------------------------------------------------------------- ! 
    214       ! MLD: abs( tn - tn(10m) ) = ztem2                              ! 
    215       ! Top of thermocline: tn = tn(10m) - ztem2                      ! 
    216       ! MLD: rho = rho10m + zrho3                                     ! 
    217       ! pycnocline: rho = rho10m + (dr/dT)(T,S,10m)*(-0.2 degC)       ! 
    218       ! temperature inversion: max( 0, max of tn - tn(10m) )          ! 
    219       ! depth of temperature inversion                                ! 
    220       ! ------------------------------------------------------------- ! 
    221       DO jk = jpkm1, nlb10, -1   ! loop from bottom to nlb10 
    222          DO jj = 1, jpj 
    223             DO ji = 1, jpi 
    224                ! 
    225                zzdep = gdepw_n(ji,jj,jk) * tmask(ji,jj,1) 
    226                ! 
    227                zztmp = tsn(ji,jj,nla10,jp_tem) - tsn(ji,jj,jk,jp_tem)  ! - delta T(10m) 
    228                IF( ABS(zztmp) > ztem2 )      zabs2   (ji,jj) = zzdep   ! abs > 0.2 
    229                IF(     zztmp  > ztem2 )      ztm2    (ji,jj) = zzdep   ! > 0.2 
    230                zztmp = -zztmp                                          ! delta T(10m) 
    231                IF( zztmp >  ztinv(ji,jj) ) THEN                        ! temperature inversion 
    232                   ztinv(ji,jj) = zztmp   ;   zdepinv (ji,jj) = zzdep   ! max value and depth 
    233                ENDIF 
    234  
    235                zztmp = rhop(ji,jj,jk) - rhop(ji,jj,nla10)              ! delta rho(10m) 
    236                IF( zztmp > zrho3        )    zrho10_3(ji,jj) = zzdep   ! > 0.03 
    237                IF( zztmp > zdelr(ji,jj) )    zpycn   (ji,jj) = zzdep   ! > equi. delta T(10m) - 0.2 
    238                ! 
    239             END DO 
    240          END DO 
    241       END DO 
    242  
    243       CALL iom_put( "mld_dt02", zabs2        )   ! MLD abs(delta t) - 0.2 
    244       CALL iom_put( "topthdep", ztm2         )   ! T(10) - 0.2 
    245       CALL iom_put( "mldr10_3", zrho10_3     )   ! MLD delta rho(10m) = 0.03 
    246       CALL iom_put( "pycndep" , zpycn        )   ! MLD delta rho equi. delta T(10m) = 0.2 
    247       CALL iom_put( "tinv"    , ztinv        )   ! max. temp. inv. (t10 ref)  
    248       CALL iom_put( "depti"   , zdepinv      )   ! depth of max. temp. inv. (t10 ref)  
    249  
    250  
    251       ! ----------------------------------- ! 
    252       ! search deepest level above 20C/28C  ! 
    253       ! ----------------------------------- ! 
    254       ik20(:,:) = 1 
    255       ik28(:,:) = 1 
     312      ! --------------------------------------- ! 
     313      ! search deepest level above ptem         ! 
     314      ! --------------------------------------- ! 
     315      iktem(:,:) = 1 
    256316      DO jk = 1, jpkm1   ! beware temperature is not always decreasing with depth => loop from top to bottom 
    257317         DO jj = 1, jpj 
    258318            DO ji = 1, jpi 
    259319               zztmp = tsn(ji,jj,jk,jp_tem) 
    260                IF( zztmp >= 20. )   ik20(ji,jj) = jk 
    261                IF( zztmp >= 28. )   ik28(ji,jj) = jk 
     320               IF( zztmp >= ptem )   iktem(ji,jj) = jk 
    262321            END DO 
    263322         END DO 
    264323      END DO 
    265324 
    266       ! --------------------------- ! 
    267       !  Depth of 20C/28C isotherm  ! 
    268       ! --------------------------- ! 
     325      ! ------------------------------- ! 
     326      !  Depth of ptem isotherm         ! 
     327      ! ------------------------------- ! 
    269328      DO jj = 1, jpj 
    270329         DO ji = 1, jpi 
    271330            ! 
    272             zzdep = gdepw_n(ji,jj,mbkt(ji,jj)+1)       ! depth of the oean bottom 
     331            zzdep = gdepw_n(ji,jj,mbkt(ji,jj)+1)       ! depth of the ocean bottom 
    273332            ! 
    274             iid = ik20(ji,jj) 
     333            iid = iktem(ji,jj) 
    275334            IF( iid /= 1 ) THEN  
    276                zztmp =      gdept_n(ji,jj,iid  )   &                     ! linear interpolation 
     335                zztmp =     gdept_n(ji,jj,iid  )   &                     ! linear interpolation 
    277336                  &  + (    gdept_n(ji,jj,iid+1) - gdept_n(ji,jj,iid)                       )   & 
    278337                  &  * ( 20.*tmask(ji,jj,iid+1) - tsn(ji,jj,iid,jp_tem)                       )   & 
    279338                  &  / ( tsn(ji,jj,iid+1,jp_tem) - tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 
    280                hd20(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
     339               pdept(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
    281340            ELSE  
    282                hd20(ji,jj) = 0._wp 
     341               pdept(ji,jj) = 0._wp 
    283342            ENDIF 
    284             ! 
    285             iid = ik28(ji,jj) 
    286             IF( iid /= 1 ) THEN  
    287                zztmp =      gdept_n(ji,jj,iid  )   &                     ! linear interpolation 
    288                   &  + (    gdept_n(ji,jj,iid+1) - gdept_n(ji,jj,iid)                       )   & 
    289                   &  * ( 28.*tmask(ji,jj,iid+1) -    tsn(ji,jj,iid,jp_tem)                       )   & 
    290                   &  / (  tsn(ji,jj,iid+1,jp_tem) -    tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 
    291                hd28(ji,jj) = MIN( zztmp , zzdep ) * tmask(ji,jj,1)      ! bound by the ocean depth 
    292             ELSE  
    293                hd28(ji,jj) = 0._wp 
    294             ENDIF 
    295  
    296343         END DO 
    297344      END DO 
    298       CALL iom_put( "20d", hd20 )   ! depth of the 20 isotherm 
    299       CALL iom_put( "28d", hd28 )   ! depth of the 28 isotherm 
    300  
    301       ! ----------------------------- ! 
    302       !  Heat content of first 300 m  ! 
    303       ! ----------------------------- ! 
    304  
    305       ! find ilevel with (ilevel+1) the deepest W-level above 300m (we assume we can use e3t_1d to do this search...) 
    306       ilevel   = 0 
    307       zthick_0 = 0._wp 
    308       DO jk = 1, jpkm1                       
    309          zthick_0 = zthick_0 + e3t_1d(jk) 
    310          IF( zthick_0 < 300. )   ilevel = jk 
    311       END DO 
     345      ! 
     346   END SUBROUTINE dia_hth_dep 
     347 
     348 
     349   SUBROUTINE dia_hth_htc( pdep, ptn, phtc ) 
     350      ! 
     351      REAL(wp), INTENT(in) :: pdep     ! depth over the heat content 
     352      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: ptn    
     353      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: phtc   
     354      ! 
     355      INTEGER  :: ji, jj, jk, ik 
     356      REAL(wp), DIMENSION(jpi,jpj) :: zthick 
     357      INTEGER , DIMENSION(jpi,jpj) :: ilevel 
     358 
     359 
    312360      ! surface boundary condition 
    313       IF( ln_linssh ) THEN   ;   zthick(:,:) = sshn(:,:)   ;   htc3(:,:) = tsn(:,:,1,jp_tem) * sshn(:,:) * tmask(:,:,1)   
    314       ELSE                   ;   zthick(:,:) = 0._wp       ;   htc3(:,:) = 0._wp                                    
     361       
     362      IF( .NOT. ln_linssh ) THEN   ;   zthick(:,:) = 0._wp       ;   phtc(:,:) = 0._wp                                    
     363      ELSE                         ;   zthick(:,:) = sshn(:,:)   ;   phtc(:,:) = ptn(:,:,1) * sshn(:,:) * tmask(:,:,1)    
    315364      ENDIF 
    316       ! integration down to ilevel 
    317       DO jk = 1, ilevel 
    318          zthick(:,:) = zthick(:,:) + e3t_n(:,:,jk) 
    319          htc3  (:,:) = htc3  (:,:) + e3t_n(:,:,jk) * tsn(:,:,jk,jp_tem) * tmask(:,:,jk) 
    320       END DO 
    321       ! deepest layer 
    322       zthick(:,:) = 300. - zthick(:,:)   !   remaining thickness to reach 300m 
     365      ! 
     366      ilevel(:,:) = 1 
     367      DO jk = 2, jpkm1 
     368         DO jj = 1, jpj 
     369            DO ji = 1, jpi 
     370               IF( ( gdept_n(ji,jj,jk) < pdep ) .AND. ( tmask(ji,jj,jk) == 1 ) ) THEN 
     371                   ilevel(ji,jj) = jk 
     372                   zthick(ji,jj) = zthick(ji,jj) + e3t_n(ji,jj,jk) 
     373                   phtc  (ji,jj) = phtc  (ji,jj) + e3t_n(ji,jj,jk) * ptn(ji,jj,jk) 
     374               ENDIF 
     375            ENDDO 
     376         ENDDO 
     377      ENDDO 
     378      ! 
    323379      DO jj = 1, jpj 
    324380         DO ji = 1, jpi 
    325             htc3(ji,jj) = htc3(ji,jj) + tsn(ji,jj,ilevel+1,jp_tem)                  & 
    326                &                      * MIN( e3t_n(ji,jj,ilevel+1), zthick(ji,jj) ) * tmask(ji,jj,ilevel+1) 
     381            ik = ilevel(ji,jj) 
     382            zthick(ji,jj) = pdep - zthick(ji,jj)   !   remaining thickness to reach depht pdep 
     383            phtc(ji,jj)   = phtc(ji,jj) + ptn(ji,jj,ik+1) * MIN( e3t_n(ji,jj,ik+1), zthick(ji,jj) ) & 
     384                                                          * tmask(ji,jj,ik+1) 
    327385         END DO 
    328       END DO 
    329       ! from temperature to heat contain 
    330       zcoef = rau0 * rcp 
    331       htc3(:,:) = zcoef * htc3(:,:) 
    332       CALL iom_put( "hc300", htc3 )      ! first 300m heat content 
    333       ! 
    334       IF( ln_timing )   CALL timing_stop('dia_hth') 
    335       ! 
    336    END SUBROUTINE dia_hth 
    337  
    338 #else 
    339    !!---------------------------------------------------------------------- 
    340    !!   Default option :                                       Empty module 
    341    !!---------------------------------------------------------------------- 
    342    LOGICAL , PUBLIC, PARAMETER ::   lk_diahth = .FALSE.  !: thermocline-20d depths flag 
    343 CONTAINS 
    344    SUBROUTINE dia_hth( kt )         ! Empty routine 
    345       IMPLICIT NONE 
    346       INTEGER, INTENT( in ) :: kt 
    347       WRITE(*,*) 'dia_hth: You should not have seen this print! error?', kt 
    348    END SUBROUTINE dia_hth 
    349 #endif 
     386      ENDDO 
     387      ! 
     388      ! 
     389   END SUBROUTINE dia_hth_htc 
    350390 
    351391   !!====================================================================== 
  • NEMO/branches/2019/dev_r12072_TOP-01_ENHANCE-11_CEthe/src/OCE/DIA/diaptr.F90

    r11993 r12109  
    1010   !!            3.6  ! 2014-12  (C. Ethe) use of IOM 
    1111   !!            3.6  ! 2016-06  (T. Graham) Addition of diagnostics for CMIP6 
     12   !!            4.0  ! 2010-08  ( C. Ethe, J. Deshayes ) Improvment 
    1213   !!---------------------------------------------------------------------- 
    1314 
     
    4243 
    4344   !                                  !!** namelist  namptr  ** 
    44    REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_adv, htr_ldf, htr_eiv   !: Heat TRansports (adv, diff, Bolus.) 
    45    REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   str_adv, str_ldf, str_eiv   !: Salt TRansports (adv, diff, Bolus.) 
    46    REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_ove, str_ove   !: heat Salt TRansports ( overturn.) 
    47    REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_btr, str_btr   !: heat Salt TRansports ( barotropic ) 
    48  
    49    LOGICAL, PUBLIC ::   ln_diaptr   !  Poleward transport flag (T) or not (F) 
    50    LOGICAL, PUBLIC ::   ln_subbas   !  Atlantic/Pacific/Indian basins calculation 
    51    INTEGER, PUBLIC ::   nptr        ! = 1 (l_subbas=F) or = 5 (glo, atl, pac, ind, ipc) (l_subbas=T)  
     45   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hstr_adv, hstr_ldf, hstr_eiv   !: Heat/Salt TRansports(adv, diff, Bolus.) 
     46   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hstr_ove, hstr_btr, hstr_vtr   !: heat Salt TRansports(overturn, baro, merional) 
     47 
     48   LOGICAL , PUBLIC ::   l_diaptr        !: tracers  trend flag (set from namelist in trdini) 
     49   INTEGER, PARAMETER, PUBLIC ::   nptr = 5  ! (glo, atl, pac, ind, ipc) 
    5250 
    5351   REAL(wp) ::   rc_sv    = 1.e-6_wp   ! conversion from m3/s to Sverdrup 
    5452   REAL(wp) ::   rc_pwatt = 1.e-15_wp  ! conversion from W    to PW (further x rau0 x Cp) 
    55    REAL(wp) ::   rc_ggram = 1.e-6_wp   ! conversion from g    to Pg 
    56  
    57    CHARACTER(len=3), ALLOCATABLE, SAVE, DIMENSION(:)     :: clsubb 
    58    REAL(wp),         ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk   ! T-point basin interior masks 
    59    REAL(wp),         ALLOCATABLE, SAVE, DIMENSION(:,:)   :: btm30   ! mask out Southern Ocean (=0 south of 30°S) 
    60  
    61    REAL(wp), TARGET, ALLOCATABLE, SAVE, DIMENSION(:)     :: p_fval1d 
    62    REAL(wp), TARGET, ALLOCATABLE, SAVE, DIMENSION(:,:)   :: p_fval2d 
    63  
     53   REAL(wp) ::   rc_ggram = 1.e-9_wp   ! conversion from g    to Gg  (further x rau0) 
     54 
     55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk   ! T-point basin interior masks 
     56   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk34 ! mask out Southern Ocean (=0 south of 34°S) 
     57 
     58   REAL(wp), TARGET, ALLOCATABLE, SAVE, DIMENSION(:)   :: p_fval1d 
     59   REAL(wp), TARGET, ALLOCATABLE, SAVE, DIMENSION(:,:) :: p_fval2d 
     60 
     61   LOGICAL ::   ll_init = .TRUE.        !: tracers  trend flag (set from namelist in trdini) 
    6462   !! * Substitutions 
    6563#  include "vectopt_loop_substitute.h90" 
     
    7169CONTAINS 
    7270 
    73    SUBROUTINE dia_ptr( pvtr ) 
     71   SUBROUTINE dia_ptr( kt, pvtr ) 
    7472      !!---------------------------------------------------------------------- 
    7573      !!                  ***  ROUTINE dia_ptr  *** 
    7674      !!---------------------------------------------------------------------- 
     75      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index      
    7776      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport 
    7877      ! 
     
    8079      REAL(wp) ::   zsfc,zvfc               ! local scalar 
    8180      REAL(wp), DIMENSION(jpi,jpj)     ::  z2d   ! 2D workspace 
    82       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  z3d   ! 3D workspace 
    8381      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zmask   ! 3D workspace 
     82      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  z3d    ! 3D workspace 
    8483      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) ::  zts   ! 3D workspace 
    85       REAL(wp), DIMENSION(jpj)     ::  vsum   ! 1D workspace 
    86       REAL(wp), DIMENSION(jpj,jpts)     ::  tssum   ! 1D workspace 
    87   
     84      REAL(wp), DIMENSION(jpj)      ::  zvsum, ztsum, zssum   ! 1D workspace 
    8885      ! 
    8986      !overturning calculation 
    90       REAL(wp), DIMENSION(jpj,jpk,nptr) ::   sjk  , r1_sjk ! i-mean i-k-surface and its inverse 
    91       REAL(wp), DIMENSION(jpj,jpk,nptr) ::   v_msf, sn_jk  , tn_jk ! i-mean T and S, j-Stream-Function 
    92       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zvn   ! 3D workspace 
    93  
    94  
    95       CHARACTER( len = 12 )  :: cl1 
     87      REAL(wp), DIMENSION(jpj,jpk,nptr) :: sjk, r1_sjk, v_msf  ! i-mean i-k-surface and its inverse 
     88      REAL(wp), DIMENSION(jpj,jpk,nptr) :: zt_jk, zs_jk ! i-mean T and S, j-Stream-Function 
     89 
     90      REAL(wp), DIMENSION(jpi,jpj,jpk,nptr)  :: z4d1, z4d2 
     91      REAL(wp), DIMENSION(jpi,jpj,nptr)      :: z3dtr ! i-mean T and S, j-Stream-Function 
    9692      !!---------------------------------------------------------------------- 
    9793      ! 
    9894      IF( ln_timing )   CALL timing_start('dia_ptr') 
    9995 
    100       ! 
     96      IF( kt == nit000 .AND. ll_init )   CALL dia_ptr_init 
     97      ! 
     98      IF( .NOT. l_diaptr )   RETURN 
     99 
    101100      IF( PRESENT( pvtr ) ) THEN 
    102          IF( iom_use("zomsfglo") ) THEN    ! effective MSF 
    103             z3d(1,:,:) = ptr_sjk( pvtr(:,:,:) )  ! zonal cumulative effective transport 
    104             DO jk = 2, jpkm1  
    105               z3d(1,:,jk) = z3d(1,:,jk-1) + z3d(1,:,jk)   ! effective j-Stream-Function (MSF) 
     101         IF( iom_use( 'zomsf' ) ) THEN    ! effective MSF 
     102            DO jn = 1, nptr                                    ! by sub-basins 
     103               z4d1(1,:,:,jn) =  ptr_sjk( pvtr(:,:,:), btmsk34(:,:,jn) )  ! zonal cumulative effective transport excluding closed seas 
     104               DO jk = jpkm1, 1, -1  
     105                  z4d1(1,:,jk,jn) = z4d1(1,:,jk+1,jn) - z4d1(1,:,jk,jn)    ! effective j-Stream-Function (MSF) 
     106               END DO 
     107               DO ji = 1, jpi 
     108                  z4d1(ji,:,:,jn) = z4d1(1,:,:,jn) 
     109               ENDDO 
    106110            END DO 
    107             DO ji = 1, jpi 
    108                z3d(ji,:,:) = z3d(1,:,:) 
    109             ENDDO 
    110             cl1 = TRIM('zomsf'//clsubb(1) ) 
    111             CALL iom_put( cl1, z3d * rc_sv ) 
    112             DO jn = 2, nptr                                    ! by sub-basins 
    113                z3d(1,:,:) =  ptr_sjk( pvtr(:,:,:), btmsk(:,:,jn)*btm30(:,:) )  
    114                DO jk = 2, jpkm1  
    115                   z3d(1,:,jk) = z3d(1,:,jk-1) + z3d(1,:,jk)    ! effective j-Stream-Function (MSF) 
    116                END DO 
    117                DO ji = 1, jpi 
    118                   z3d(ji,:,:) = z3d(1,:,:) 
    119                ENDDO 
    120                cl1 = TRIM('zomsf'//clsubb(jn) ) 
    121                CALL iom_put( cl1, z3d * rc_sv ) 
    122             END DO 
    123          ENDIF 
    124          IF( iom_use("sopstove") .OR. iom_use("sophtove") .OR. iom_use("sopstbtr") .OR. iom_use("sophtbtr") ) THEN 
     111            CALL iom_put( 'zomsf', z4d1 * rc_sv ) 
     112         ENDIF 
     113         IF(  iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) .OR.   & 
     114            & iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) ) THEN 
    125115            ! define fields multiplied by scalar 
    126116            zmask(:,:,:) = 0._wp 
    127117            zts(:,:,:,:) = 0._wp 
    128             zvn(:,:,:) = 0._wp 
    129118            DO jk = 1, jpkm1 
    130119               DO jj = 1, jpjm1 
     
    134123                     zts(ji,jj,jk,jp_tem) = (tsn(ji,jj,jk,jp_tem)+tsn(ji,jj+1,jk,jp_tem)) * 0.5 * zvfc  !Tracers averaged onto V grid 
    135124                     zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj+1,jk,jp_sal)) * 0.5 * zvfc 
    136                      zvn(ji,jj,jk)        = vn(ji,jj,jk)         * zvfc 
    137125                  ENDDO 
    138126               ENDDO 
    139127             ENDDO 
    140128         ENDIF 
    141          IF( iom_use("sopstove") .OR. iom_use("sophtove") ) THEN 
    142              sjk(:,:,1) = ptr_sjk( zmask(:,:,:), btmsk(:,:,1) ) 
    143              r1_sjk(:,:,1) = 0._wp 
    144              WHERE( sjk(:,:,1) /= 0._wp )   r1_sjk(:,:,1) = 1._wp / sjk(:,:,1) 
    145  
    146              ! i-mean T and S, j-Stream-Function, global 
    147              tn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_tem) ) * r1_sjk(:,:,1) 
    148              sn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_sal) ) * r1_sjk(:,:,1) 
    149              v_msf(:,:,1) = ptr_sjk( zvn(:,:,:) ) 
    150  
    151              htr_ove(:,1) = SUM( v_msf(:,:,1)*tn_jk(:,:,1) ,2 ) 
    152              str_ove(:,1) = SUM( v_msf(:,:,1)*sn_jk(:,:,1) ,2 ) 
    153  
    154              z2d(1,:) = htr_ove(:,1) * rc_pwatt        !  (conversion in PW) 
    155              DO ji = 1, jpi 
    156                z2d(ji,:) = z2d(1,:) 
    157              ENDDO 
    158              cl1 = 'sophtove' 
    159              CALL iom_put( TRIM(cl1), z2d ) 
    160              z2d(1,:) = str_ove(:,1) * rc_ggram        !  (conversion in Gg) 
    161              DO ji = 1, jpi 
    162                z2d(ji,:) = z2d(1,:) 
    163              ENDDO 
    164              cl1 = 'sopstove' 
    165              CALL iom_put( TRIM(cl1), z2d ) 
    166              IF( ln_subbas ) THEN 
    167                 DO jn = 2, nptr 
    168                     sjk(:,:,jn) = ptr_sjk( zmask(:,:,:), btmsk(:,:,jn) ) 
    169                     r1_sjk(:,:,jn) = 0._wp 
    170                     WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 
    171  
    172                     ! i-mean T and S, j-Stream-Function, basin 
    173                     tn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
    174                     sn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
    175                     v_msf(:,:,jn) = ptr_sjk( zvn(:,:,:), btmsk(:,:,jn) )  
    176                     htr_ove(:,jn) = SUM( v_msf(:,:,jn)*tn_jk(:,:,jn) ,2 ) 
    177                     str_ove(:,jn) = SUM( v_msf(:,:,jn)*sn_jk(:,:,jn) ,2 ) 
    178  
    179                     z2d(1,:) = htr_ove(:,jn) * rc_pwatt !  (conversion in PW) 
    180                     DO ji = 1, jpi 
    181                         z2d(ji,:) = z2d(1,:) 
    182                     ENDDO 
    183                     cl1 = TRIM('sophtove_'//clsubb(jn)) 
    184                     CALL iom_put( cl1, z2d ) 
    185                     z2d(1,:) = str_ove(:,jn) * rc_ggram        ! (conversion in Gg) 
    186                     DO ji = 1, jpi 
    187                         z2d(ji,:) = z2d(1,:) 
    188                     ENDDO 
    189                     cl1 = TRIM('sopstove_'//clsubb(jn)) 
    190                     CALL iom_put( cl1, z2d ) 
    191                 END DO 
    192              ENDIF 
    193          ENDIF 
    194          IF( iom_use("sopstbtr") .OR. iom_use("sophtbtr") ) THEN 
    195          ! Calculate barotropic heat and salt transport here  
    196              sjk(:,1,1) = ptr_sj( zmask(:,:,:), btmsk(:,:,1) ) 
    197              r1_sjk(:,1,1) = 0._wp 
    198              WHERE( sjk(:,1,1) /= 0._wp )   r1_sjk(:,1,1) = 1._wp / sjk(:,1,1) 
    199              
    200             vsum = ptr_sj( zvn(:,:,:), btmsk(:,:,1)) 
    201             tssum(:,jp_tem) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,1) ) 
    202             tssum(:,jp_sal) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,1) ) 
    203             htr_btr(:,1) = vsum * tssum(:,jp_tem) * r1_sjk(:,1,1) 
    204             str_btr(:,1) = vsum * tssum(:,jp_sal) * r1_sjk(:,1,1) 
    205             z2d(1,:) = htr_btr(:,1) * rc_pwatt        !  (conversion in PW) 
    206             DO ji = 2, jpi 
    207                z2d(ji,:) = z2d(1,:) 
    208             ENDDO 
    209             cl1 = 'sophtbtr' 
    210             CALL iom_put( TRIM(cl1), z2d ) 
    211             z2d(1,:) = str_btr(:,1) * rc_ggram        !  (conversion in Gg) 
    212             DO ji = 2, jpi 
    213               z2d(ji,:) = z2d(1,:) 
    214             ENDDO 
    215             cl1 = 'sopstbtr' 
    216             CALL iom_put( TRIM(cl1), z2d ) 
    217             IF( ln_subbas ) THEN 
    218                 DO jn = 2, nptr 
    219                     sjk(:,1,jn) = ptr_sj( zmask(:,:,:), btmsk(:,:,jn) ) 
    220                     r1_sjk(:,1,jn) = 0._wp 
    221                     WHERE( sjk(:,1,jn) /= 0._wp )   r1_sjk(:,1,jn) = 1._wp / sjk(:,1,jn) 
    222                     vsum = ptr_sj( zvn(:,:,:), btmsk(:,:,jn)) 
    223                     tssum(:,jp_tem) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) 
    224                     tssum(:,jp_sal) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) 
    225                     htr_btr(:,jn) = vsum * tssum(:,jp_tem) * r1_sjk(:,1,jn) 
    226                     str_btr(:,jn) = vsum * tssum(:,jp_sal) * r1_sjk(:,1,jn) 
    227                     z2d(1,:) = htr_btr(:,jn) * rc_pwatt !  (conversion in PW) 
    228                     DO ji = 1, jpi 
    229                         z2d(ji,:) = z2d(1,:) 
    230                     ENDDO 
    231                     cl1 = TRIM('sophtbtr_'//clsubb(jn)) 
    232                     CALL iom_put( cl1, z2d ) 
    233                     z2d(1,:) = str_btr(:,jn) * rc_ggram        ! (conversion in Gg) 
    234                     DO ji = 1, jpi 
    235                         z2d(ji,:) = z2d(1,:) 
    236                     ENDDO 
    237                     cl1 = TRIM('sopstbtr_'//clsubb(jn)) 
    238                     CALL iom_put( cl1, z2d ) 
    239                ENDDO 
    240             ENDIF !ln_subbas 
    241          ENDIF !iom_use("sopstbtr....) 
     129         IF( iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) ) THEN 
     130            DO jn = 1, nptr 
     131               sjk(:,:,jn) = ptr_sjk( zmask(:,:,:), btmsk(:,:,jn) ) 
     132               r1_sjk(:,:,jn) = 0._wp 
     133               WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 
     134               ! i-mean T and S, j-Stream-Function, basin 
     135               zt_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     136               zs_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     137               v_msf(:,:,jn) = ptr_sjk( pvtr(:,:,:), btmsk34(:,:,jn) )  
     138               hstr_ove(:,jp_tem,jn) = SUM( v_msf(:,:,jn)*zt_jk(:,:,jn), 2 ) 
     139               hstr_ove(:,jp_sal,jn) = SUM( v_msf(:,:,jn)*zs_jk(:,:,jn), 2 ) 
     140               ! 
     141            ENDDO 
     142            DO jn = 1, nptr 
     143               z3dtr(1,:,jn) = hstr_ove(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW) 
     144               DO ji = 1, jpi 
     145                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     146               ENDDO 
     147            ENDDO 
     148            CALL iom_put( 'sophtove', z3dtr ) 
     149            DO jn = 1, nptr 
     150               z3dtr(1,:,jn) = hstr_ove(:,jp_sal,jn) * rc_ggram !  (conversion in Gg) 
     151               DO ji = 1, jpi 
     152                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     153               ENDDO 
     154            ENDDO 
     155            CALL iom_put( 'sopstove', z3dtr ) 
     156         ENDIF 
     157 
     158         IF( iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) ) THEN 
     159            ! Calculate barotropic heat and salt transport here  
     160            DO jn = 1, nptr 
     161               sjk(:,1,jn) = ptr_sj( zmask(:,:,:), btmsk(:,:,jn) ) 
     162               r1_sjk(:,1,jn) = 0._wp 
     163               WHERE( sjk(:,1,jn) /= 0._wp )   r1_sjk(:,1,jn) = 1._wp / sjk(:,1,jn) 
     164               ! 
     165               zvsum(:) = ptr_sj( pvtr(:,:,:), btmsk34(:,:,jn) ) 
     166               ztsum(:) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) 
     167               zssum(:) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) 
     168               hstr_btr(:,jp_tem,jn) = zvsum(:) * ztsum(:) * r1_sjk(:,1,jn) 
     169               hstr_btr(:,jp_sal,jn) = zvsum(:) * zssum(:) * r1_sjk(:,1,jn) 
     170               ! 
     171            ENDDO 
     172            DO jn = 1, nptr 
     173               z3dtr(1,:,jn) = hstr_btr(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW) 
     174               DO ji = 1, jpi 
     175                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     176               ENDDO 
     177            ENDDO 
     178            CALL iom_put( 'sophtbtr', z3dtr ) 
     179            DO jn = 1, nptr 
     180               z3dtr(1,:,jn) = hstr_btr(:,jp_sal,jn) * rc_ggram !  (conversion in Gg) 
     181               DO ji = 1, jpi 
     182                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     183               ENDDO 
     184            ENDDO 
     185            CALL iom_put( 'sopstbtr', z3dtr ) 
     186         ENDIF  
    242187         ! 
    243188      ELSE 
    244189         ! 
    245          IF( iom_use("zotemglo") ) THEN    ! i-mean i-k-surface  
     190         zmask(:,:,:) = 0._wp 
     191         zts(:,:,:,:) = 0._wp 
     192         IF( iom_use( 'zotem' ) .OR. iom_use( 'zosal' ) .OR. iom_use( 'zosrf' )  ) THEN    ! i-mean i-k-surface  
    246193            DO jk = 1, jpkm1 
    247194               DO jj = 1, jpj 
     
    254201               END DO 
    255202            END DO 
     203            ! 
    256204            DO jn = 1, nptr 
    257205               zmask(1,:,:) = ptr_sjk( zmask(:,:,:), btmsk(:,:,jn) ) 
    258                cl1 = TRIM('zosrf'//clsubb(jn) ) 
    259                CALL iom_put( cl1, zmask ) 
    260                ! 
    261                z3d(1,:,:) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) & 
    262                   &            / MAX( zmask(1,:,:), 10.e-15 ) 
    263                DO ji = 1, jpi 
    264                   z3d(ji,:,:) = z3d(1,:,:) 
    265                ENDDO 
    266                cl1 = TRIM('zotem'//clsubb(jn) ) 
    267                CALL iom_put( cl1, z3d ) 
    268                ! 
    269                z3d(1,:,:) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) & 
    270                   &            / MAX( zmask(1,:,:), 10.e-15 ) 
    271                DO ji = 1, jpi 
    272                   z3d(ji,:,:) = z3d(1,:,:) 
    273                ENDDO 
    274                cl1 = TRIM('zosal'//clsubb(jn) ) 
    275                CALL iom_put( cl1, z3d ) 
    276             END DO 
     206               z4d1(:,:,:,jn) = zmask(:,:,:) 
     207            ENDDO 
     208            CALL iom_put( 'zosrf', z4d1 ) 
     209            ! 
     210            DO jn = 1, nptr 
     211               z4d2(1,:,:,jn) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) & 
     212                  &            / MAX( z4d1(1,:,:,jn), 10.e-15 ) 
     213               DO ji = 1, jpi 
     214                  z4d2(ji,:,:,jn) = z4d2(1,:,:,jn) 
     215               ENDDO 
     216            ENDDO 
     217            CALL iom_put( 'zotem', z4d2 ) 
     218            ! 
     219            DO jn = 1, nptr 
     220               z4d2(1,:,:,jn) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) & 
     221                  &            / MAX( z4d1(1,:,:,jn), 10.e-15 ) 
     222               DO ji = 1, jpi 
     223                  z4d2(ji,:,:,jn) = z4d2(1,:,:,jn) 
     224               ENDDO 
     225            ENDDO 
     226            CALL iom_put( 'zosal', z4d2 ) 
     227            ! 
    277228         ENDIF 
    278229         ! 
    279230         !                                ! Advective and diffusive heat and salt transport 
    280          IF( iom_use("sophtadv") .OR. iom_use("sopstadv") ) THEN    
    281             z2d(1,:) = htr_adv(:,1) * rc_pwatt        !  (conversion in PW) 
    282             DO ji = 1, jpi 
    283                z2d(ji,:) = z2d(1,:) 
    284             ENDDO 
    285             cl1 = 'sophtadv'                  
    286             CALL iom_put( TRIM(cl1), z2d ) 
    287             z2d(1,:) = str_adv(:,1) * rc_ggram        ! (conversion in Gg) 
    288             DO ji = 1, jpi 
    289                z2d(ji,:) = z2d(1,:) 
    290             ENDDO 
    291             cl1 = 'sopstadv' 
    292             CALL iom_put( TRIM(cl1), z2d ) 
    293             IF( ln_subbas ) THEN 
    294               DO jn=2,nptr 
    295                z2d(1,:) = htr_adv(:,jn) * rc_pwatt        !  (conversion in PW) 
    296                DO ji = 1, jpi 
    297                  z2d(ji,:) = z2d(1,:) 
    298                ENDDO 
    299                cl1 = TRIM('sophtadv_'//clsubb(jn))                  
    300                CALL iom_put( cl1, z2d ) 
    301                z2d(1,:) = str_adv(:,jn) * rc_ggram        ! (conversion in Gg) 
    302                DO ji = 1, jpi 
    303                   z2d(ji,:) = z2d(1,:) 
    304                ENDDO 
    305                cl1 = TRIM('sopstadv_'//clsubb(jn))                  
    306                CALL iom_put( cl1, z2d )               
    307               ENDDO 
    308             ENDIF 
    309          ENDIF 
    310          ! 
    311          IF( iom_use("sophtldf") .OR. iom_use("sopstldf") ) THEN    
    312             z2d(1,:) = htr_ldf(:,1) * rc_pwatt        !  (conversion in PW)  
    313             DO ji = 1, jpi 
    314                z2d(ji,:) = z2d(1,:) 
    315             ENDDO 
    316             cl1 = 'sophtldf' 
    317             CALL iom_put( TRIM(cl1), z2d ) 
    318             z2d(1,:) = str_ldf(:,1) * rc_ggram        !  (conversion in Gg) 
    319             DO ji = 1, jpi 
    320                z2d(ji,:) = z2d(1,:) 
    321             ENDDO 
    322             cl1 = 'sopstldf' 
    323             CALL iom_put( TRIM(cl1), z2d ) 
    324             IF( ln_subbas ) THEN 
    325               DO jn=2,nptr 
    326                z2d(1,:) = htr_ldf(:,jn) * rc_pwatt        !  (conversion in PW) 
    327                DO ji = 1, jpi 
    328                  z2d(ji,:) = z2d(1,:) 
    329                ENDDO 
    330                cl1 = TRIM('sophtldf_'//clsubb(jn))                  
    331                CALL iom_put( cl1, z2d ) 
    332                z2d(1,:) = str_ldf(:,jn) * rc_ggram        ! (conversion in Gg) 
    333                DO ji = 1, jpi 
    334                   z2d(ji,:) = z2d(1,:) 
    335                ENDDO 
    336                cl1 = TRIM('sopstldf_'//clsubb(jn))                  
    337                CALL iom_put( cl1, z2d )               
    338               ENDDO 
    339             ENDIF 
    340          ENDIF 
    341  
    342          IF( iom_use("sophteiv") .OR. iom_use("sopsteiv") ) THEN  
    343             z2d(1,:) = htr_eiv(:,1) * rc_pwatt        !  (conversion in PW)  
    344             DO ji = 1, jpi 
    345                z2d(ji,:) = z2d(1,:) 
    346             ENDDO 
    347             cl1 = 'sophteiv' 
    348             CALL iom_put( TRIM(cl1), z2d ) 
    349             z2d(1,:) = str_eiv(:,1) * rc_ggram        !  (conversion in Gg) 
    350             DO ji = 1, jpi 
    351                z2d(ji,:) = z2d(1,:) 
    352             ENDDO 
    353             cl1 = 'sopsteiv' 
    354             CALL iom_put( TRIM(cl1), z2d ) 
    355             IF( ln_subbas ) THEN 
    356                DO jn=2,nptr 
    357                   z2d(1,:) = htr_eiv(:,jn) * rc_pwatt        !  (conversion in PW) 
     231         IF( iom_use( 'sophtadv' ) .OR. iom_use( 'sopstadv' ) ) THEN   
     232            !  
     233            DO jn = 1, nptr 
     234               z3dtr(1,:,jn) = hstr_adv(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW) 
     235               DO ji = 1, jpi 
     236                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     237               ENDDO 
     238            ENDDO 
     239            CALL iom_put( 'sophtadv', z3dtr ) 
     240            DO jn = 1, nptr 
     241               z3dtr(1,:,jn) = hstr_adv(:,jp_sal,jn) * rc_ggram !  (conversion in Gg) 
     242               DO ji = 1, jpi 
     243                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     244               ENDDO 
     245            ENDDO 
     246            CALL iom_put( 'sopstadv', z3dtr ) 
     247         ENDIF 
     248         ! 
     249         IF( iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) ) THEN   
     250            !  
     251            DO jn = 1, nptr 
     252               z3dtr(1,:,jn) = hstr_ldf(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW) 
     253               DO ji = 1, jpi 
     254                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     255               ENDDO 
     256            ENDDO 
     257            CALL iom_put( 'sophtldf', z3dtr ) 
     258            DO jn = 1, nptr 
     259               z3dtr(1,:,jn) = hstr_ldf(:,jp_sal,jn) * rc_ggram !  (conversion in Gg) 
     260               DO ji = 1, jpi 
     261                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     262               ENDDO 
     263            ENDDO 
     264            CALL iom_put( 'sopstldf', z3dtr ) 
     265         ENDIF 
     266         ! 
     267         IF( iom_use( 'sophteiv' ) .OR. iom_use( 'sopsteiv' ) ) THEN   
     268            !  
     269            DO jn = 1, nptr 
     270               z3dtr(1,:,jn) = hstr_eiv(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW) 
     271               DO ji = 1, jpi 
     272                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     273               ENDDO 
     274            ENDDO 
     275            CALL iom_put( 'sophteiv', z3dtr ) 
     276            DO jn = 1, nptr 
     277               z3dtr(1,:,jn) = hstr_eiv(:,jp_sal,jn) * rc_ggram !  (conversion in Gg) 
     278               DO ji = 1, jpi 
     279                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     280               ENDDO 
     281            ENDDO 
     282            CALL iom_put( 'sopsteiv', z3dtr ) 
     283         ENDIF 
     284         ! 
     285         IF( iom_use( 'sopstvtr' ) .OR. iom_use( 'sophtvtr' ) ) THEN 
     286            zts(:,:,:,:) = 0._wp 
     287            DO jk = 1, jpkm1 
     288               DO jj = 1, jpjm1 
    358289                  DO ji = 1, jpi 
    359                      z2d(ji,:) = z2d(1,:) 
     290                     zvfc = e1v(ji,jj) * e3v_n(ji,jj,jk) 
     291                     zts(ji,jj,jk,jp_tem) = (tsn(ji,jj,jk,jp_tem)+tsn(ji,jj+1,jk,jp_tem)) * 0.5 * zvfc  !Tracers averaged onto V grid 
     292                     zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj+1,jk,jp_sal)) * 0.5 * zvfc 
    360293                  ENDDO 
    361                   cl1 = TRIM('sophteiv_'//clsubb(jn))                  
    362                   CALL iom_put( cl1, z2d ) 
    363                   z2d(1,:) = str_eiv(:,jn) * rc_ggram        ! (conversion in Gg) 
    364                   DO ji = 1, jpi 
    365                      z2d(ji,:) = z2d(1,:) 
    366                   ENDDO 
    367                   cl1 = TRIM('sopsteiv_'//clsubb(jn))  
    368                   CALL iom_put( cl1, z2d )               
    369                ENDDO 
    370             ENDIF 
     294               ENDDO 
     295             ENDDO 
     296             CALL dia_ptr_hst( jp_tem, 'vtr', zts(:,:,:,jp_tem) ) 
     297             CALL dia_ptr_hst( jp_sal, 'vtr', zts(:,:,:,jp_sal) ) 
     298             DO jn = 1, nptr 
     299                z3dtr(1,:,jn) = hstr_vtr(:,jp_tem,jn) * rc_pwatt  !  (conversion in PW) 
     300                DO ji = 1, jpi 
     301                   z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     302                ENDDO 
     303             ENDDO 
     304             CALL iom_put( 'sophtvtr', z3dtr ) 
     305             DO jn = 1, nptr 
     306               z3dtr(1,:,jn) = hstr_vtr(:,jp_sal,jn) * rc_ggram !  (conversion in Gg) 
     307               DO ji = 1, jpi 
     308                  z3dtr(ji,:,jn) = z3dtr(1,:,jn) 
     309               ENDDO 
     310            ENDDO 
     311            CALL iom_put( 'sopstvtr', z3dtr ) 
     312         ENDIF 
     313         ! 
     314         IF( iom_use( 'uocetr_vsum_cumul' ) ) THEN 
     315            CALL iom_get_var(  'uocetr_vsum_op', z2d ) ! get uocetr_vsum_op from xml 
     316            z2d(:,:) = ptr_ci_2d( z2d(:,:) )   
     317            CALL iom_put( 'uocetr_vsum_cumul', z2d ) 
    371318         ENDIF 
    372319         ! 
     
    384331      !! ** Purpose :   Initialization, namelist read 
    385332      !!---------------------------------------------------------------------- 
    386       INTEGER ::  jn           ! local integers 
    387       INTEGER ::  inum, ierr   ! local integers 
    388       INTEGER ::  ios          ! Local integer output status for namelist read 
    389       !! 
    390       NAMELIST/namptr/ ln_diaptr, ln_subbas 
    391       !!---------------------------------------------------------------------- 
    392  
    393       REWIND( numnam_ref )              ! Namelist namptr in reference namelist : Poleward transport 
    394       READ  ( numnam_ref, namptr, IOSTAT = ios, ERR = 901) 
    395 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namptr in reference namelist' ) 
    396  
    397       REWIND( numnam_cfg )              ! Namelist namptr in configuration namelist : Poleward transport 
    398       READ  ( numnam_cfg, namptr, IOSTAT = ios, ERR = 902 ) 
    399 902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namptr in configuration namelist' ) 
    400       IF(lwm) WRITE ( numond, namptr ) 
    401  
     333      INTEGER ::  inum, jn           ! local integers 
     334      !! 
     335      REAL(wp), DIMENSION(jpi,jpj) :: zmsk 
     336      !!---------------------------------------------------------------------- 
     337 
     338      l_diaptr = .FALSE. 
     339      IF(   iom_use( 'zomsf'    ) .OR. iom_use( 'zotem'    ) .OR. iom_use( 'zosal'    ) .OR.  & 
     340         &  iom_use( 'zosrf'    ) .OR. iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) .OR.  & 
     341         &  iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) .OR. iom_use( 'sophtadv' ) .OR.  & 
     342         &  iom_use( 'sopstadv' ) .OR. iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) .OR.  &  
     343         &  iom_use( 'sophteiv' ) .OR. iom_use( 'sopsteiv' ) .OR. iom_use( 'sopstvtr' ) .OR.  & 
     344         &  iom_use( 'sophtvtr' ) .OR. iom_use( 'uocetr_vsum_cumul' ) )  l_diaptr  = .TRUE. 
     345 
     346  
    402347      IF(lwp) THEN                     ! Control print 
    403348         WRITE(numout,*) 
     
    405350         WRITE(numout,*) '~~~~~~~~~~~~' 
    406351         WRITE(numout,*) '   Namelist namptr : set ptr parameters' 
    407          WRITE(numout,*) '      Poleward heat & salt transport (T) or not (F)      ln_diaptr  = ', ln_diaptr 
    408          WRITE(numout,*) '      Global (F) or glo/Atl/Pac/Ind/Indo-Pac basins      ln_subbas  = ', ln_subbas 
     352         WRITE(numout,*) '      Poleward heat & salt transport (T) or not (F)      l_diaptr  = ', l_diaptr 
    409353      ENDIF 
    410354 
    411       IF( ln_diaptr ) THEN   
    412          ! 
    413          IF( ln_subbas ) THEN  
    414             nptr = 5            ! Global, Atlantic, Pacific, Indian, Indo-Pacific 
    415             ALLOCATE( clsubb(nptr) ) 
    416             clsubb(1) = 'glo' ;  clsubb(2) = 'atl'  ;  clsubb(3) = 'pac'  ;  clsubb(4) = 'ind'  ;  clsubb(5) = 'ipc' 
    417          ELSE                
    418             nptr = 1       ! Global only 
    419             ALLOCATE( clsubb(nptr) ) 
    420             clsubb(1) = 'glo'  
    421          ENDIF 
    422  
    423          !                                      ! allocate dia_ptr arrays 
     355      IF( l_diaptr ) THEN   
     356         ! 
    424357         IF( dia_ptr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ptr_init : unable to allocate arrays' ) 
    425358 
    426359         rc_pwatt = rc_pwatt * rau0_rcp          ! conversion from K.s-1 to PetaWatt 
     360         rc_ggram = rc_ggram * rau0              ! conversion from m3/s to Gg/s 
    427361 
    428362         IF( lk_mpp )   CALL mpp_ini_znl( numout )     ! Define MPI communicator for zonal sum 
    429363 
    430          IF( ln_subbas ) THEN                ! load sub-basin mask 
    431             CALL iom_open( 'subbasins', inum,  ldstop = .FALSE.  ) 
    432             CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) )   ! Atlantic basin 
    433             CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) )   ! Pacific  basin 
    434             CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) )   ! Indian   basin 
    435             CALL iom_close( inum ) 
    436             btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) )          ! Indo-Pacific basin 
    437             WHERE( gphit(:,:) < -30._wp)   ;   btm30(:,:) = 0._wp      ! mask out Southern Ocean 
    438             ELSE WHERE                     ;   btm30(:,:) = ssmask(:,:) 
    439             END WHERE 
    440          ENDIF 
    441     
    442          btmsk(:,:,1) = tmask_i(:,:)                                   ! global ocean 
    443        
    444          DO jn = 1, nptr 
     364         btmsk(:,:,1) = tmask_i(:,:)                  
     365         CALL iom_open( 'subbasins', inum,  ldstop = .FALSE.  ) 
     366         CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) )   ! Atlantic basin 
     367         CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) )   ! Pacific  basin 
     368         CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) )   ! Indian   basin 
     369         CALL iom_close( inum ) 
     370         btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) )          ! Indo-Pacific basin 
     371         DO jn = 2, nptr 
    445372            btmsk(:,:,jn) = btmsk(:,:,jn) * tmask_i(:,:)               ! interior domain only 
    446373         END DO 
     374         ! JD : modification so that overturning streamfunction is available in Atlantic at 34S to compare with observations 
     375         WHERE( gphit(:,:)*tmask_i(:,:) < -34._wp) 
     376           zmsk(:,:) = 0._wp      ! mask out Southern Ocean 
     377         ELSE WHERE                   
     378           zmsk(:,:) = ssmask(:,:) 
     379         END WHERE 
     380         btmsk34(:,:,1) = btmsk(:,:,1)                  
     381         DO jn = 2, nptr 
     382            btmsk34(:,:,jn) = btmsk(:,:,jn) * zmsk(:,:)               ! interior domain only 
     383         ENDDO 
    447384 
    448385         ! Initialise arrays to zero because diatpr is called before they are first calculated 
    449386         ! Note that this means diagnostics will not be exactly correct when model run is restarted. 
    450          htr_adv(:,:) = 0._wp  ;  str_adv(:,:) =  0._wp  
    451          htr_ldf(:,:) = 0._wp  ;  str_ldf(:,:) =  0._wp  
    452          htr_eiv(:,:) = 0._wp  ;  str_eiv(:,:) =  0._wp  
    453          htr_ove(:,:) = 0._wp  ;   str_ove(:,:) =  0._wp 
    454          htr_btr(:,:) = 0._wp  ;   str_btr(:,:) =  0._wp 
     387         hstr_adv(:,:,:) = 0._wp            
     388         hstr_ldf(:,:,:) = 0._wp            
     389         hstr_eiv(:,:,:) = 0._wp            
     390         hstr_ove(:,:,:) = 0._wp            
     391         hstr_btr(:,:,:) = 0._wp           ! 
     392         hstr_vtr(:,:,:) = 0._wp           ! 
     393         ! 
     394         ll_init = .FALSE. 
    455395         ! 
    456396      ENDIF  
     
    471411      INTEGER                                        :: jn    ! 
    472412 
     413      ! 
    473414      IF( cptr == 'adv' ) THEN 
    474          IF( ktra == jp_tem )  htr_adv(:,1) = ptr_sj( pva(:,:,:) ) 
    475          IF( ktra == jp_sal )  str_adv(:,1) = ptr_sj( pva(:,:,:) ) 
     415         IF( ktra == jp_tem )  THEN 
     416             DO jn = 1, nptr 
     417                hstr_adv(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     418             ENDDO 
     419         ENDIF 
     420         IF( ktra == jp_sal )  THEN 
     421             DO jn = 1, nptr 
     422                hstr_adv(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     423             ENDDO 
     424         ENDIF 
    476425      ENDIF 
     426      ! 
    477427      IF( cptr == 'ldf' ) THEN 
    478          IF( ktra == jp_tem )  htr_ldf(:,1) = ptr_sj( pva(:,:,:) ) 
    479          IF( ktra == jp_sal )  str_ldf(:,1) = ptr_sj( pva(:,:,:) ) 
     428         IF( ktra == jp_tem )  THEN 
     429             DO jn = 1, nptr 
     430                hstr_ldf(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     431             ENDDO 
     432         ENDIF 
     433         IF( ktra == jp_sal )  THEN 
     434             DO jn = 1, nptr 
     435                hstr_ldf(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     436             ENDDO 
     437         ENDIF 
    480438      ENDIF 
     439      ! 
    481440      IF( cptr == 'eiv' ) THEN 
    482          IF( ktra == jp_tem )  htr_eiv(:,1) = ptr_sj( pva(:,:,:) ) 
    483          IF( ktra == jp_sal )  str_eiv(:,1) = ptr_sj( pva(:,:,:) ) 
     441         IF( ktra == jp_tem )  THEN 
     442             DO jn = 1, nptr 
     443                hstr_eiv(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     444             ENDDO 
     445         ENDIF 
     446         IF( ktra == jp_sal )  THEN 
     447             DO jn = 1, nptr 
     448                hstr_eiv(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     449             ENDDO 
     450         ENDIF 
    484451      ENDIF 
    485452      ! 
    486       IF( ln_subbas ) THEN 
    487          ! 
    488          IF( cptr == 'adv' ) THEN 
    489              IF( ktra == jp_tem ) THEN  
    490                 DO jn = 2, nptr 
    491                    htr_adv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
    492                 END DO 
    493              ENDIF 
    494              IF( ktra == jp_sal ) THEN  
    495                 DO jn = 2, nptr 
    496                    str_adv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
    497                 END DO 
    498              ENDIF 
    499          ENDIF 
    500          IF( cptr == 'ldf' ) THEN 
    501              IF( ktra == jp_tem ) THEN  
    502                 DO jn = 2, nptr 
    503                     htr_ldf(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
    504                  END DO 
    505              ENDIF 
    506              IF( ktra == jp_sal ) THEN  
    507                 DO jn = 2, nptr 
    508                    str_ldf(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
    509                 END DO 
    510              ENDIF 
    511          ENDIF 
    512          IF( cptr == 'eiv' ) THEN 
    513              IF( ktra == jp_tem ) THEN  
    514                 DO jn = 2, nptr 
    515                     htr_eiv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
    516                  END DO 
    517              ENDIF 
    518              IF( ktra == jp_sal ) THEN  
    519                 DO jn = 2, nptr 
    520                    str_eiv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
    521                 END DO 
    522              ENDIF 
    523          ENDIF 
    524          ! 
     453      IF( cptr == 'vtr' ) THEN 
     454         IF( ktra == jp_tem )  THEN 
     455             DO jn = 1, nptr 
     456                hstr_vtr(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     457             ENDDO 
     458         ENDIF 
     459         IF( ktra == jp_sal )  THEN 
     460             DO jn = 1, nptr 
     461                hstr_vtr(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     462             ENDDO 
     463         ENDIF 
    525464      ENDIF 
     465      ! 
    526466   END SUBROUTINE dia_ptr_hst 
    527467 
     
    536476      ierr(:) = 0 
    537477      ! 
    538       ALLOCATE( btmsk(jpi,jpj,nptr) ,              & 
    539          &      htr_adv(jpj,nptr) , str_adv(jpj,nptr) ,   & 
    540          &      htr_eiv(jpj,nptr) , str_eiv(jpj,nptr) ,   & 
    541          &      htr_ove(jpj,nptr) , str_ove(jpj,nptr) ,   & 
    542          &      htr_btr(jpj,nptr) , str_btr(jpj,nptr) ,   & 
    543          &      htr_ldf(jpj,nptr) , str_ldf(jpj,nptr) , STAT=ierr(1)  ) 
    544          ! 
    545       ALLOCATE( p_fval1d(jpj), p_fval2d(jpj,jpk), Stat=ierr(2)) 
    546       ! 
    547       ALLOCATE( btm30(jpi,jpj), STAT=ierr(3)  ) 
    548  
    549          ! 
    550       dia_ptr_alloc = MAXVAL( ierr ) 
    551       CALL mpp_sum( 'diaptr', dia_ptr_alloc ) 
     478      IF( .NOT. ALLOCATED( btmsk ) ) THEN 
     479         ALLOCATE( btmsk(jpi,jpj,nptr)    , btmsk34(jpi,jpj,nptr),   & 
     480            &      hstr_adv(jpj,jpts,nptr), hstr_eiv(jpj,jpts,nptr), & 
     481            &      hstr_ove(jpj,jpts,nptr), hstr_btr(jpj,jpts,nptr), & 
     482            &      hstr_ldf(jpj,jpts,nptr), hstr_vtr(jpj,jpts,nptr), STAT=ierr(1)  ) 
     483            ! 
     484         ALLOCATE( p_fval1d(jpj), p_fval2d(jpj,jpk), Stat=ierr(2)) 
     485         ! 
     486         dia_ptr_alloc = MAXVAL( ierr ) 
     487         CALL mpp_sum( 'diaptr', dia_ptr_alloc ) 
     488      ENDIF 
    552489      ! 
    553490   END FUNCTION dia_ptr_alloc 
     
    565502      !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    566503      !!---------------------------------------------------------------------- 
    567       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk)       ::   pva   ! mask flux array at V-point 
    568       REAL(wp), INTENT(in), DIMENSION(jpi,jpj), OPTIONAL ::   pmsk   ! Optional 2D basin mask 
     504      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk)  ::   pva   ! mask flux array at V-point 
     505      REAL(wp), INTENT(in), DIMENSION(jpi,jpj)      ::   pmsk   ! Optional 2D basin mask 
    569506      ! 
    570507      INTEGER                  ::   ji, jj, jk   ! dummy loop arguments 
     
    577514      ijpj = jpj 
    578515      p_fval(:) = 0._wp 
    579       IF( PRESENT( pmsk ) ) THEN  
    580          DO jk = 1, jpkm1 
    581             DO jj = 2, jpjm1 
    582                DO ji = fs_2, fs_jpim1   ! Vector opt. 
    583                   p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * tmask_i(ji,jj) * pmsk(ji,jj) 
    584                END DO 
     516      DO jk = 1, jpkm1 
     517         DO jj = 2, jpjm1 
     518            DO ji = fs_2, fs_jpim1   ! Vector opt. 
     519               p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj) 
    585520            END DO 
    586521         END DO 
    587       ELSE 
    588          DO jk = 1, jpkm1 
    589             DO jj = 2, jpjm1 
    590                DO ji = fs_2, fs_jpim1   ! Vector opt. 
    591                   p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * tmask_i(ji,jj)  
    592                END DO 
    593             END DO 
    594          END DO 
    595       ENDIF 
     522      END DO 
    596523#if defined key_mpp_mpi 
    597524      CALL mpp_sum( 'diaptr', p_fval, ijpj, ncomm_znl) 
     
    612539      !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    613540      !!---------------------------------------------------------------------- 
    614       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)           ::   pva   ! mask flux array at V-point 
    615       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj), OPTIONAL ::   pmsk   ! Optional 2D basin mask 
     541      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pva   ! mask flux array at V-point 
     542      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pmsk   ! Optional 2D basin mask 
    616543      ! 
    617544      INTEGER                  ::   ji,jj       ! dummy loop arguments 
     
    624551      ijpj = jpj 
    625552      p_fval(:) = 0._wp 
    626       IF( PRESENT( pmsk ) ) THEN  
    627          DO jj = 2, jpjm1 
    628             DO ji = nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    629                p_fval(jj) = p_fval(jj) + pva(ji,jj) * tmask_i(ji,jj) * pmsk(ji,jj) 
    630             END DO 
     553      DO jj = 2, jpjm1 
     554         DO ji = fs_2, fs_jpim1   ! Vector opt. 
     555            p_fval(jj) = p_fval(jj) + pva(ji,jj) * pmsk(ji,jj) * tmask_i(ji,jj) 
    631556         END DO 
    632       ELSE 
    633          DO jj = 2, jpjm1 
    634             DO ji = nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    635                p_fval(jj) = p_fval(jj) + pva(ji,jj) * tmask_i(ji,jj) 
    636             END DO 
    637          END DO 
    638       ENDIF 
     557      END DO 
    639558#if defined key_mpp_mpi 
    640559      CALL mpp_sum( 'diaptr', p_fval, ijpj, ncomm_znl ) 
     
    643562   END FUNCTION ptr_sj_2d 
    644563 
     564   FUNCTION ptr_ci_2d( pva )   RESULT ( p_fval ) 
     565      !!---------------------------------------------------------------------- 
     566      !!                    ***  ROUTINE ptr_ci_2d  *** 
     567      !! 
     568      !! ** Purpose :   "meridional" cumulated sum computation of a j-flux array 
     569      !! 
     570      !! ** Method  : - j cumulated sum of pva using the interior 2D vmask (umask_i). 
     571      !! 
     572      !! ** Action  : - p_fval: j-cumulated sum of pva 
     573      !!---------------------------------------------------------------------- 
     574      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)  ::   pva   ! mask flux array at V-point 
     575      ! 
     576      INTEGER                  ::   ji,jj,jc       ! dummy loop arguments 
     577      INTEGER                  ::   ijpj        ! ???  
     578      REAL(wp), DIMENSION(jpi,jpj) :: p_fval ! function value 
     579      !!-------------------------------------------------------------------- 
     580      !  
     581      ijpj = jpj  ! ??? 
     582      p_fval(:,:) = 0._wp 
     583      DO jc = 1, jpnj ! looping over all processors in j axis 
     584         DO jj = 2, jpjm1 
     585            DO ji = fs_2, fs_jpim1   ! Vector opt. 
     586               p_fval(ji,jj) = p_fval(ji,jj-1) + pva(ji,jj) * tmask_i(ji,jj) 
     587            END DO 
     588         END DO 
     589         CALL lbc_lnk( 'diaptr', p_fval, 'U', -1. ) 
     590      END DO 
     591      !  
     592   END FUNCTION ptr_ci_2d 
     593 
     594 
    645595 
    646596   FUNCTION ptr_sjk( pta, pmsk )   RESULT ( p_fval ) 
     
    656606      !! 
    657607      IMPLICIT none 
    658       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk)           ::   pta    ! mask flux array at V-point 
    659       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)    , OPTIONAL ::   pmsk   ! Optional 2D basin mask 
     608      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pta    ! mask flux array at V-point 
     609      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)    ::   pmsk   ! Optional 2D basin mask 
    660610      !! 
    661611      INTEGER                           :: ji, jj, jk ! dummy loop arguments 
     
    673623      p_fval(:,:) = 0._wp 
    674624      ! 
    675       IF( PRESENT( pmsk ) ) THEN  
    676          DO jk = 1, jpkm1 
    677             DO jj = 2, jpjm1 
    678 !!gm here, use of tmask_i  ==> no need of loop over nldi, nlei.... 
    679                DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    680                   p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * pmsk(ji,jj) 
    681                END DO 
     625      DO jk = 1, jpkm1 
     626         DO jj = 2, jpjm1 
     627            DO ji = fs_2, fs_jpim1   ! Vector opt. 
     628               p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj) 
    682629            END DO 
    683630         END DO 
    684       ELSE  
    685          DO jk = 1, jpkm1 
    686             DO jj = 2, jpjm1 
    687                DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    688                   p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * tmask_i(ji,jj) 
    689                END DO 
    690             END DO 
    691          END DO 
    692       END IF 
     631      END DO 
    693632      ! 
    694633#if defined key_mpp_mpi 
Note: See TracChangeset for help on using the changeset viewer.