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 12377 for NEMO/trunk/src/OCE/DIA – NEMO

Ignore:
Timestamp:
2020-02-12T15:39:06+01:00 (4 years ago)
Author:
acc
Message:

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge --ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The --ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

Location:
NEMO/trunk
Files:
1 deleted
9 edited
2 copied

Legend:

Unmodified
Added
Removed
  • NEMO/trunk

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
  • NEMO/trunk/src/OCE/DIA/dia25h.F90

    r11536 r12377  
    3939CONTAINS 
    4040 
    41    SUBROUTINE dia_25h_init  
     41   SUBROUTINE dia_25h_init( Kbb ) 
    4242      !!--------------------------------------------------------------------------- 
    4343      !!                  ***  ROUTINE dia_25h_init  *** 
     
    4747      !! ** Method : Read namelist 
    4848      !!--------------------------------------------------------------------------- 
     49      INTEGER, INTENT(in) :: Kbb       ! Time level index 
     50      ! 
    4951      INTEGER ::   ios                 ! Local integer output status for namelist read 
    5052      INTEGER ::   ierror              ! Local integer for memory allocation 
     
    5355      !!---------------------------------------------------------------------- 
    5456      ! 
    55       REWIND ( numnam_ref )              ! Read Namelist nam_dia25h in reference namelist : 25hour mean diagnostics 
    5657      READ   ( numnam_ref, nam_dia25h, IOSTAT=ios, ERR= 901 ) 
    5758901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nam_dia25h in reference namelist' ) 
    58       REWIND( numnam_cfg )              ! Namelist nam_dia25h in configuration namelist  25hour diagnostics 
    5959      READ  ( numnam_cfg, nam_dia25h, IOSTAT = ios, ERR = 902 ) 
    6060902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nam_dia25h in configuration namelist' ) 
     
    9595      ! ------------------------- ! 
    9696      cnt_25h = 1  ! sets the first value of sum at timestep 1 (note - should strictly be at timestep zero so before values used where possible)  
    97       tn_25h  (:,:,:) = tsb (:,:,:,jp_tem) 
    98       sn_25h  (:,:,:) = tsb (:,:,:,jp_sal) 
    99       sshn_25h(:,:)   = sshb(:,:) 
    100       un_25h  (:,:,:) = ub  (:,:,:) 
    101       vn_25h  (:,:,:) = vb  (:,:,:) 
     97      tn_25h  (:,:,:) = ts (:,:,:,jp_tem,Kbb) 
     98      sn_25h  (:,:,:) = ts (:,:,:,jp_sal,Kbb) 
     99      sshn_25h(:,:)   = ssh(:,:,Kbb) 
     100      un_25h  (:,:,:) = uu  (:,:,:,Kbb) 
     101      vn_25h  (:,:,:) = vv  (:,:,:,Kbb) 
    102102      avt_25h (:,:,:) = avt (:,:,:) 
    103103      avm_25h (:,:,:) = avm (:,:,:) 
     
    116116 
    117117 
    118    SUBROUTINE dia_25h( kt 
     118   SUBROUTINE dia_25h( kt, Kmm 
    119119      !!---------------------------------------------------------------------- 
    120120      !!                 ***  ROUTINE dia_25h  *** 
     
    125125      !!---------------------------------------------------------------------- 
    126126      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     127      INTEGER, INTENT(in) ::   Kmm  ! ocean time level index 
    127128      !! 
    128129      INTEGER ::   ji, jj, jk 
     
    150151      ! wn_25h could not be initialised in dia_25h_init, so we do it here instead 
    151152      IF( kt == nn_it000 ) THEN 
    152          wn_25h(:,:,:) = wn(:,:,:) 
     153         wn_25h(:,:,:) = ww(:,:,:) 
    153154      ENDIF 
    154155 
     
    161162         ENDIF 
    162163 
    163          tn_25h  (:,:,:)     = tn_25h  (:,:,:) + tsn (:,:,:,jp_tem) 
    164          sn_25h  (:,:,:)     = sn_25h  (:,:,:) + tsn (:,:,:,jp_sal) 
    165          sshn_25h(:,:)       = sshn_25h(:,:)   + sshn(:,:) 
    166          un_25h  (:,:,:)     = un_25h  (:,:,:) + un  (:,:,:) 
    167          vn_25h  (:,:,:)     = vn_25h  (:,:,:) + vn  (:,:,:) 
    168          wn_25h  (:,:,:)     = wn_25h  (:,:,:) + wn  (:,:,:) 
     164         tn_25h  (:,:,:)     = tn_25h  (:,:,:) + ts (:,:,:,jp_tem,Kmm) 
     165         sn_25h  (:,:,:)     = sn_25h  (:,:,:) + ts (:,:,:,jp_sal,Kmm) 
     166         sshn_25h(:,:)       = sshn_25h(:,:)   + ssh(:,:,Kmm) 
     167         un_25h  (:,:,:)     = un_25h  (:,:,:) + uu  (:,:,:,Kmm) 
     168         vn_25h  (:,:,:)     = vn_25h  (:,:,:) + vv  (:,:,:,Kmm) 
     169         wn_25h  (:,:,:)     = wn_25h  (:,:,:) + ww  (:,:,:) 
    169170         avt_25h (:,:,:)     = avt_25h (:,:,:) + avt (:,:,:) 
    170171         avm_25h (:,:,:)     = avm_25h (:,:,:) + avm (:,:,:) 
     
    245246         ! 
    246247         ! After the write reset the values to cnt=1 and sum values equal current value  
    247          tn_25h  (:,:,:) = tsn (:,:,:,jp_tem) 
    248          sn_25h  (:,:,:) = tsn (:,:,:,jp_sal) 
    249          sshn_25h(:,:)   = sshn(:,:) 
    250          un_25h  (:,:,:) = un  (:,:,:) 
    251          vn_25h  (:,:,:) = vn  (:,:,:) 
    252          wn_25h  (:,:,:) = wn  (:,:,:) 
     248         tn_25h  (:,:,:) = ts (:,:,:,jp_tem,Kmm) 
     249         sn_25h  (:,:,:) = ts (:,:,:,jp_sal,Kmm) 
     250         sshn_25h(:,:)   = ssh(:,:,Kmm) 
     251         un_25h  (:,:,:) = uu  (:,:,:,Kmm) 
     252         vn_25h  (:,:,:) = vv  (:,:,:,Kmm) 
     253         wn_25h  (:,:,:) = ww  (:,:,:) 
    253254         avt_25h (:,:,:) = avt (:,:,:) 
    254255         avm_25h (:,:,:) = avm (:,:,:) 
  • NEMO/trunk/src/OCE/DIA/diaar5.F90

    r12276 r12377  
    3939       
    4040   !! * Substitutions 
    41 #  include "vectopt_loop_substitute.h90" 
     41#  include "do_loop_substitute.h90" 
    4242   !!---------------------------------------------------------------------- 
    4343   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    6262 
    6363 
    64    SUBROUTINE dia_ar5( kt ) 
     64   SUBROUTINE dia_ar5( kt, Kmm ) 
    6565      !!---------------------------------------------------------------------- 
    6666      !!                    ***  ROUTINE dia_ar5  *** 
     
    7070      ! 
    7171      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     72      INTEGER, INTENT( in ) ::   Kmm  ! ocean time level index 
    7273      ! 
    7374      INTEGER  ::   ji, jj, jk, iks, ikb                      ! dummy loop arguments 
     
    8990         ALLOCATE( zrhd(jpi,jpj,jpk) , zrhop(jpi,jpj,jpk) ) 
    9091         ALLOCATE( ztsn(jpi,jpj,jpk,jpts) ) 
    91          zarea_ssh(:,:) = area(:,:) * sshn(:,:) 
     92         zarea_ssh(:,:) = area(:,:) * ssh(:,:,Kmm) 
    9293      ENDIF 
    9394      ! 
     
    99100         zrhd(:,:,jpk) = 0._wp        ! ocean volume ; rhd is used as workspace 
    100101         DO jk = 1, jpkm1 
    101             zrhd(:,:,jk) = area(:,:) * e3t_n(:,:,jk) * tmask(:,:,jk) 
     102            zrhd(:,:,jk) = area(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
    102103         END DO 
    103104         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         CALL iom_put( 'masscello' , rau0 * e3t(:,:,:,Kmm) * tmask(:,:,:) )  ! ocean mass 
    105106      ENDIF  
    106107      ! 
    107108      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 
     109         DO_2D_11_11 
     110            ikb = mbkt(ji,jj) 
     111            z2d(ji,jj) = e3t(ji,jj,ikb,Kmm) 
     112         END_2D 
    114113         CALL iom_put( 'e3tb', z2d ) 
    115114      ENDIF  
     
    122121         CALL iom_put( 'voltot', zvol               ) 
    123122         CALL iom_put( 'sshtot', zvolssh / area_tot ) 
    124          CALL iom_put( 'sshdyn', sshn(:,:) - (zvolssh / area_tot) ) 
     123         CALL iom_put( 'sshdyn', ssh(:,:,Kmm) - (zvolssh / area_tot) ) 
    125124         ! 
    126125      ENDIF 
     
    128127      IF( iom_use( 'botpres' ) .OR. iom_use( 'sshthster' )  .OR. iom_use( 'sshsteric' )  ) THEN     
    129128         !                      
    130          ztsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem)                    ! thermosteric ssh 
     129         ztsn(:,:,:,jp_tem) = ts(:,:,:,jp_tem,Kmm)                    ! thermosteric ssh 
    131130         ztsn(:,:,:,jp_sal) = sn0(:,:,:) 
    132          CALL eos( ztsn, zrhd, gdept_n(:,:,:) )                       ! now in situ density using initial salinity 
     131         CALL eos( ztsn, zrhd, gdept(:,:,:,Kmm) )                       ! now in situ density using initial salinity 
    133132         ! 
    134133         zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice 
    135134         DO jk = 1, jpkm1 
    136             zbotpres(:,:) = zbotpres(:,:) + e3t_n(:,:,jk) * zrhd(:,:,jk) 
     135            zbotpres(:,:) = zbotpres(:,:) + e3t(:,:,jk,Kmm) * zrhd(:,:,jk) 
    137136         END DO 
    138137         IF( ln_linssh ) THEN 
     
    141140                  DO jj = 1, jpj 
    142141                     iks = mikt(ji,jj) 
    143                      zbotpres(ji,jj) = zbotpres(ji,jj) + sshn(ji,jj) * zrhd(ji,jj,iks) + riceload(ji,jj) 
     142                     zbotpres(ji,jj) = zbotpres(ji,jj) + ssh(ji,jj,Kmm) * zrhd(ji,jj,iks) + riceload(ji,jj) 
    144143                  END DO 
    145144               END DO 
    146145            ELSE 
    147                zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 
     146               zbotpres(:,:) = zbotpres(:,:) + ssh(:,:,Kmm) * zrhd(:,:,1) 
    148147            END IF 
    149148!!gm 
     
    157156       
    158157         !                                         ! steric sea surface height 
    159          CALL eos( tsn, zrhd, zrhop, gdept_n(:,:,:) )                 ! now in situ and potential density 
     158         CALL eos( ts(:,:,:,:,Kmm), zrhd, zrhop, gdept(:,:,:,Kmm) )                 ! now in situ and potential density 
    160159         zrhop(:,:,jpk) = 0._wp 
    161160         CALL iom_put( 'rhop', zrhop ) 
     
    163162         zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice 
    164163         DO jk = 1, jpkm1 
    165             zbotpres(:,:) = zbotpres(:,:) + e3t_n(:,:,jk) * zrhd(:,:,jk) 
     164            zbotpres(:,:) = zbotpres(:,:) + e3t(:,:,jk,Kmm) * zrhd(:,:,jk) 
    166165         END DO 
    167166         IF( ln_linssh ) THEN 
     
    170169                  DO jj = 1,jpj 
    171170                     iks = mikt(ji,jj) 
    172                      zbotpres(ji,jj) = zbotpres(ji,jj) + sshn(ji,jj) * zrhd(ji,jj,iks) + riceload(ji,jj) 
     171                     zbotpres(ji,jj) = zbotpres(ji,jj) + ssh(ji,jj,Kmm) * zrhd(ji,jj,iks) + riceload(ji,jj) 
    173172                  END DO 
    174173               END DO 
    175174            ELSE 
    176                zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) 
     175               zbotpres(:,:) = zbotpres(:,:) + ssh(:,:,Kmm) * zrhd(:,:,1) 
    177176            END IF 
    178177         END IF 
     
    183182         !                                         ! ocean bottom pressure 
    184183         zztmp = rau0 * grav * 1.e-4_wp               ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa 
    185          zbotpres(:,:) = zztmp * ( zbotpres(:,:) + sshn(:,:) + thick0(:,:) ) 
     184         zbotpres(:,:) = zztmp * ( zbotpres(:,:) + ssh(:,:,Kmm) + thick0(:,:) ) 
    186185         CALL iom_put( 'botpres', zbotpres ) 
    187186         ! 
     
    191190          !                                         ! Mean density anomalie, temperature and salinity 
    192191          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 
     192          DO_3D_11_11( 1, jpkm1 ) 
     193             zztmp = area(ji,jj) * e3t(ji,jj,jk,Kmm) 
     194             ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zztmp * ts(ji,jj,jk,jp_tem,Kmm) 
     195             ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zztmp * ts(ji,jj,jk,jp_sal,Kmm) 
     196          END_3D 
    202197 
    203198          IF( ln_linssh ) THEN 
     
    206201                  DO jj = 1, jpj 
    207202                     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)  
     203                     ztsn(ji,jj,1,jp_tem) = ztsn(ji,jj,1,jp_tem) + zarea_ssh(ji,jj) * ts(ji,jj,iks,jp_tem,Kmm)  
     204                     ztsn(ji,jj,1,jp_sal) = ztsn(ji,jj,1,jp_sal) + zarea_ssh(ji,jj) * ts(ji,jj,iks,jp_sal,Kmm)  
    210205                  END DO 
    211206               END DO 
    212207            ELSE 
    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)  
     208               ztsn(:,:,1,jp_tem) = ztsn(:,:,1,jp_tem) + zarea_ssh(:,:) * ts(:,:,1,jp_tem,Kmm)  
     209               ztsn(:,:,1,jp_sal) = ztsn(:,:,1,jp_sal) + zarea_ssh(:,:) * ts(:,:,1,jp_sal,Kmm)  
    215210            END IF 
    216211         ENDIF 
     
    233228            ztpot(:,:,jpk) = 0._wp 
    234229            DO jk = 1, jpkm1 
    235                ztpot(:,:,jk) = eos_pt_from_ct( tsn(:,:,jk,jp_tem), tsn(:,:,jk,jp_sal) ) 
     230               ztpot(:,:,jk) = eos_pt_from_ct( ts(:,:,jk,jp_tem,Kmm), ts(:,:,jk,jp_sal,Kmm) ) 
    236231            END DO 
    237232            ! 
     
    242237               z2d(:,:) = 0._wp 
    243238               DO jk = 1, jpkm1 
    244                  z2d(:,:) = z2d(:,:) + area(:,:) * e3t_n(:,:,jk) * ztpot(:,:,jk) 
     239                 z2d(:,:) = z2d(:,:) + area(:,:) * e3t(:,:,jk,Kmm) * ztpot(:,:,jk) 
    245240               END DO 
    246241               ztemp = glob_sum( 'diaar5', z2d(:,:)  )  
     
    255250             IF( iom_use( 'tosmint_pot') ) THEN 
    256251               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 
     252               DO_3D_11_11( 1, jpkm1 ) 
     253                  z2d(ji,jj) = z2d(ji,jj) + rau0 * e3t(ji,jj,jk,Kmm) *  ztpot(ji,jj,jk) 
     254               END_3D 
    264255               CALL iom_put( 'tosmint_pot', z2d )  
    265256            ENDIF 
     
    268259      ELSE        
    269260         IF( iom_use('ssttot') ) THEN   ! Output sst in case we use EOS-80 
    270             zsst  = glob_sum( 'diaar5', area(:,:) * tsn(:,:,1,jp_tem) ) 
     261            zsst  = glob_sum( 'diaar5', area(:,:) * ts(:,:,1,jp_tem,Kmm) ) 
    271262            CALL iom_put('ssttot', zsst / area_tot ) 
    272263         ENDIF 
     
    280271         zpe(:,:) = 0._wp 
    281272         IF( ln_zdfddm ) THEN 
    282             DO jk = 2, jpk 
    283                DO jj = 1, jpj 
    284                   DO ji = 1, jpi 
    285                      IF( rn2(ji,jj,jk) > 0._wp ) THEN 
    286                         zrw = ( gdept_n(ji,jj,jk) - gdepw_n(ji,jj,jk) ) / e3w_n(ji,jj,jk) 
    287                         ! 
    288                         zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 
    289                         zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 
    290                         ! 
    291                         zpe(ji, jj) = zpe(ji,jj)   & 
    292                            &        -  grav * (  avt(ji,jj,jk) * zaw * (tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) )  & 
    293                            &                   - avs(ji,jj,jk) * zbw * (tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) ) 
    294                      ENDIF 
    295                   END DO 
    296                END DO 
    297              END DO 
     273            DO_3D_11_11( 2, jpk ) 
     274               IF( rn2(ji,jj,jk) > 0._wp ) THEN 
     275                  zrw = ( gdept(ji,jj,jk,Kmm) - gdepw(ji,jj,jk,Kmm) ) / e3w(ji,jj,jk,Kmm) 
     276                  ! 
     277                  zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 
     278                  zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 
     279                  ! 
     280                  zpe(ji, jj) = zpe(ji,jj)   & 
     281                     &        -  grav * (  avt(ji,jj,jk) * zaw * (ts(ji,jj,jk-1,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm) )  & 
     282                     &                   - avs(ji,jj,jk) * zbw * (ts(ji,jj,jk-1,jp_sal,Kmm) - ts(ji,jj,jk,jp_sal,Kmm) ) ) 
     283               ENDIF 
     284            END_3D 
    298285          ELSE 
    299             DO jk = 1, jpk 
    300                DO ji = 1, jpi 
    301                   DO jj = 1, jpj 
    302                      zpe(ji,jj) = zpe(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * rau0 * e3w_n(ji,jj,jk) 
    303                   END DO 
    304                END DO 
    305             END DO 
     286            DO_3D_11_11( 1, jpk ) 
     287               zpe(ji,jj) = zpe(ji,jj) + avt(ji,jj,jk) * MIN(0._wp,rn2(ji,jj,jk)) * rau0 * e3w(ji,jj,jk,Kmm) 
     288            END_3D 
    306289         ENDIF 
    307290          CALL iom_put( 'tnpeo', zpe ) 
     
    320303 
    321304 
    322    SUBROUTINE dia_ar5_hst( ktra, cptr, pua, pva )  
     305   SUBROUTINE dia_ar5_hst( ktra, cptr, puflx, pvflx )  
    323306      !!---------------------------------------------------------------------- 
    324307      !!                    ***  ROUTINE dia_ar5_htr *** 
     
    329312      INTEGER                         , INTENT(in )  :: ktra  ! tracer index 
    330313      CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf' 
    331       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pua   ! 3D input array of advection/diffusion 
    332       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pva   ! 3D input array of advection/diffusion 
     314      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: puflx  ! u-flux of advection/diffusion 
     315      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pvflx  ! v-flux of advection/diffusion 
    333316      ! 
    334317      INTEGER    ::  ji, jj, jk 
     
    336319 
    337320     
    338       z2d(:,:) = pua(:,:,1)  
    339       DO jk = 1, jpkm1 
    340          DO jj = 2, jpjm1 
    341             DO ji = fs_2, fs_jpim1   ! vector opt. 
    342                z2d(ji,jj) = z2d(ji,jj) + pua(ji,jj,jk)  
    343             END DO 
    344          END DO 
    345        END DO 
     321      z2d(:,:) = puflx(:,:,1)  
     322      DO_3D_00_00( 1, jpkm1 ) 
     323         z2d(ji,jj) = z2d(ji,jj) + puflx(ji,jj,jk)  
     324      END_3D 
    346325       CALL lbc_lnk( 'diaar5', z2d, 'U', -1. ) 
    347326       IF( cptr == 'adv' ) THEN 
     
    354333       ENDIF 
    355334       ! 
    356        z2d(:,:) = pva(:,:,1)  
    357        DO jk = 1, jpkm1 
    358           DO jj = 2, jpjm1 
    359              DO ji = fs_2, fs_jpim1   ! vector opt. 
    360                 z2d(ji,jj) = z2d(ji,jj) + pva(ji,jj,jk)  
    361              END DO 
    362           END DO 
    363        END DO 
     335       z2d(:,:) = pvflx(:,:,1)  
     336       DO_3D_00_00( 1, jpkm1 ) 
     337          z2d(ji,jj) = z2d(ji,jj) + pvflx(ji,jj,jk)  
     338       END_3D 
    364339       CALL lbc_lnk( 'diaar5', z2d, 'V', -1. ) 
    365340       IF( cptr == 'adv' ) THEN 
     
    406381         zvol0 (:,:) = 0._wp 
    407382         thick0(:,:) = 0._wp 
    408          DO jk = 1, jpkm1 
    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 
     383         DO_3D_11_11( 1, jpkm1 ) 
     384            idep = tmask(ji,jj,jk) * e3t_0(ji,jj,jk) 
     385            zvol0 (ji,jj) = zvol0 (ji,jj) +  idep * area(ji,jj) 
     386            thick0(ji,jj) = thick0(ji,jj) +  idep     
     387         END_3D 
    417388         vol0 = glob_sum( 'diaar5', zvol0 ) 
    418389         DEALLOCATE( zvol0 ) 
     
    428399            sn0(:,:,:) = sn0(:,:,:) * tmask(:,:,:) 
    429400            IF( ln_zps ) THEN               ! z-coord. partial steps 
    430                DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step) 
    431                   DO ji = 1, jpi 
    432                      ik = mbkt(ji,jj) 
    433                      IF( ik > 1 ) THEN 
    434                         zztmp = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) ) 
    435                         sn0(ji,jj,ik) = ( 1._wp - zztmp ) * sn0(ji,jj,ik) + zztmp * sn0(ji,jj,ik-1) 
    436                      ENDIF 
    437                   END DO 
    438                END DO 
     401               DO_2D_11_11 
     402                  ik = mbkt(ji,jj) 
     403                  IF( ik > 1 ) THEN 
     404                     zztmp = ( gdept_1d(ik) - gdept_0(ji,jj,ik) ) / ( gdept_1d(ik) - gdept_1d(ik-1) ) 
     405                     sn0(ji,jj,ik) = ( 1._wp - zztmp ) * sn0(ji,jj,ik) + zztmp * sn0(ji,jj,ik-1) 
     406                  ENDIF 
     407               END_2D 
    439408            ENDIF 
    440409            ! 
  • NEMO/trunk/src/OCE/DIA/diacfl.F90

    r11532 r12377  
    3333 
    3434   !! * Substitutions 
    35 #  include "vectopt_loop_substitute.h90" 
     35#  include "do_loop_substitute.h90" 
    3636   !!---------------------------------------------------------------------- 
    3737   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4141CONTAINS 
    4242 
    43    SUBROUTINE dia_cfl ( kt ) 
     43   SUBROUTINE dia_cfl ( kt, Kmm ) 
    4444      !!---------------------------------------------------------------------- 
    4545      !!                  ***  ROUTINE dia_cfl  *** 
     
    4949      !!---------------------------------------------------------------------- 
    5050      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     51      INTEGER, INTENT(in) ::   Kmm  ! ocean time level index 
    5152      ! 
    5253      INTEGER                          ::   ji, jj, jk                       ! dummy loop indices 
     
    6465      ! 
    6566      !                 
    66       DO jk = 1, jpk       ! calculate Courant numbers 
    67          DO jj = 1, jpj 
    68             DO ji = 1, jpi 
    69                zCu_cfl(ji,jj,jk) = ABS( un(ji,jj,jk) ) * z2dt / e1u  (ji,jj)      ! for i-direction 
    70                zCv_cfl(ji,jj,jk) = ABS( vn(ji,jj,jk) ) * z2dt / e2v  (ji,jj)      ! for j-direction 
    71                zCw_cfl(ji,jj,jk) = ABS( wn(ji,jj,jk) ) * z2dt / e3w_n(ji,jj,jk)   ! for k-direction 
    72             END DO 
    73          END DO          
    74       END DO 
     67      DO_3D_11_11( 1, jpk ) 
     68         zCu_cfl(ji,jj,jk) = ABS( uu(ji,jj,jk,Kmm) ) * z2dt / e1u  (ji,jj)      ! for i-direction 
     69         zCv_cfl(ji,jj,jk) = ABS( vv(ji,jj,jk,Kmm) ) * z2dt / e2v  (ji,jj)      ! for j-direction 
     70         zCw_cfl(ji,jj,jk) = ABS( ww(ji,jj,jk) ) * z2dt / e3w(ji,jj,jk,Kmm)   ! for k-direction 
     71      END_3D 
    7572      ! 
    7673      ! write outputs 
  • NEMO/trunk/src/OCE/DIA/diadct.F90

    r11536 r12377  
    123123      !!--------------------------------------------------------------------- 
    124124 
    125      REWIND( numnam_ref )              ! Namelist nam_diadct in reference namelist : Diagnostic: transport through sections 
    126125     READ  ( numnam_ref, nam_diadct, IOSTAT = ios, ERR = 901) 
    127126901  IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_diadct in reference namelist' ) 
    128127 
    129      REWIND( numnam_cfg )              ! Namelist nam_diadct in configuration namelist : Diagnostic: transport through sections 
    130128     READ  ( numnam_cfg, nam_diadct, IOSTAT = ios, ERR = 902 ) 
    131129902  IF( ios >  0 ) CALL ctl_nam ( ios , 'nam_diadct in configuration namelist' ) 
     
    175173  
    176174  
    177   SUBROUTINE dia_dct( kt ) 
     175  SUBROUTINE dia_dct( kt, Kmm ) 
    178176     !!--------------------------------------------------------------------- 
    179177     !!               ***  ROUTINE diadct  ***   
     
    192190     !!               Reinitialise all relevant arrays to zero  
    193191     !!--------------------------------------------------------------------- 
    194      INTEGER, INTENT(in) ::   kt 
     192     INTEGER, INTENT(in) ::   kt    ! ocean time step 
     193     INTEGER, INTENT(in) ::   Kmm   ! time level index 
    195194     ! 
    196195     INTEGER ::   jsec              ! loop on sections 
     
    232231 
    233232           !Compute transport through section   
    234            CALL transport(secs(jsec),lldebug,jsec)  
     233           CALL transport(Kmm,secs(jsec),lldebug,jsec)  
    235234 
    236235        ENDDO 
     
    246245           ! Sum over each class  
    247246           DO jsec=1,nb_sec  
    248               CALL dia_dct_sum(secs(jsec),jsec)  
     247              CALL dia_dct_sum(Kmm,secs(jsec),jsec)  
    249248           ENDDO  
    250249 
     
    558557 
    559558 
    560    SUBROUTINE transport(sec,ld_debug,jsec) 
     559   SUBROUTINE transport(Kmm,sec,ld_debug,jsec) 
    561560     !!------------------------------------------------------------------------------------------- 
    562561     !!                     ***  ROUTINE transport  *** 
     
    578577     !! 
    579578     !!------------------------------------------------------------------------------------------- 
     579     INTEGER      ,INTENT(IN)    :: Kmm         ! time level index 
    580580     TYPE(SECTION),INTENT(INOUT) :: sec 
    581581     LOGICAL      ,INTENT(IN)    :: ld_debug 
     
    673673            SELECT CASE( sec%direction(jseg) ) 
    674674               CASE(0,1)  
    675                   ztn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) )  
    676                   zsn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) )  
    677                   zrhop = interp(k%I,k%J,jk,'V',rhop)  
    678                   zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0)  
    679                   zsshn =  0.5*( sshn(k%I,k%J) + sshn(k%I,k%J+1)    ) * vmask(k%I,k%J,1)  
     675                  ztn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_tem,Kmm) )  
     676                  zsn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_sal,Kmm) )  
     677                  zrhop = interp(Kmm,k%I,k%J,jk,'V',rhop)  
     678                  zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*rau0+rau0)  
     679                  zsshn =  0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I,k%J+1,Kmm)    ) * vmask(k%I,k%J,1)  
    680680               CASE(2,3)  
    681                   ztn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) )  
    682                   zsn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) )  
    683                   zrhop = interp(k%I,k%J,jk,'U',rhop)  
    684                   zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0)  
    685                   zsshn =  0.5*( sshn(k%I,k%J) + sshn(k%I+1,k%J)    ) * umask(k%I,k%J,1)   
     681                  ztn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_tem,Kmm) )  
     682                  zsn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_sal,Kmm) )  
     683                  zrhop = interp(Kmm,k%I,k%J,jk,'U',rhop)  
     684                  zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*rau0+rau0)  
     685                  zsshn =  0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I+1,k%J,Kmm)    ) * umask(k%I,k%J,1)   
    686686               END SELECT  
    687687               ! 
    688                zdep= gdept_n(k%I,k%J,jk)  
     688               zdep= gdept(k%I,k%J,jk,Kmm)  
    689689   
    690690               SELECT CASE( sec%direction(jseg) )                !compute velocity with the correct direction  
    691691               CASE(0,1)    
    692692                  zumid=0._wp 
    693                   zvmid=isgnv*vn(k%I,k%J,jk)*vmask(k%I,k%J,jk)  
     693                  zvmid=isgnv*vv(k%I,k%J,jk,Kmm)*vmask(k%I,k%J,jk)  
    694694               CASE(2,3)  
    695                   zumid=isgnu*un(k%I,k%J,jk)*umask(k%I,k%J,jk)  
     695                  zumid=isgnu*uu(k%I,k%J,jk,Kmm)*umask(k%I,k%J,jk)  
    696696                  zvmid=0._wp 
    697697               END SELECT  
     
    699699               !zTnorm=transport through one cell;  
    700700               !velocity* cell's length * cell's thickness  
    701                zTnorm = zumid*e2u(k%I,k%J) * e3u_n(k%I,k%J,jk)     &  
    702                   &   + zvmid*e1v(k%I,k%J) * e3v_n(k%I,k%J,jk)  
     701               zTnorm = zumid*e2u(k%I,k%J) * e3u(k%I,k%J,jk,Kmm)     &  
     702                  &   + zvmid*e1v(k%I,k%J) * e3v(k%I,k%J,jk,Kmm)  
    703703 
    704704!!gm  THIS is WRONG  no transport due to ssh in linear free surface case !!!!! 
     
    765765 
    766766 
    767   SUBROUTINE dia_dct_sum(sec,jsec)  
     767  SUBROUTINE dia_dct_sum(Kmm,sec,jsec)  
    768768     !!-------------------------------------------------------------  
    769769     !! Purpose: Average the transport over nn_dctwri time steps   
     
    784784     !!  
    785785     !!-------------------------------------------------------------  
     786     INTEGER      ,INTENT(IN)    :: Kmm         ! time level index 
    786787     TYPE(SECTION),INTENT(INOUT) :: sec  
    787788     INTEGER      ,INTENT(IN)    :: jsec        ! numeric identifier of section  
     
    845846              SELECT CASE( sec%direction(jseg) )  
    846847              CASE(0,1)  
    847                  ztn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_tem) )  
    848                  zsn   = interp(k%I,k%J,jk,'V',tsn(:,:,:,jp_sal) )  
    849                  zrhop = interp(k%I,k%J,jk,'V',rhop)  
    850                  zrhoi = interp(k%I,k%J,jk,'V',rhd*rau0+rau0)  
     848                 ztn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_tem,Kmm) )  
     849                 zsn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_sal,Kmm) )  
     850                 zrhop = interp(Kmm,k%I,k%J,jk,'V',rhop)  
     851                 zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*rau0+rau0)  
    851852 
    852853              CASE(2,3)  
    853                  ztn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_tem) )  
    854                  zsn   = interp(k%I,k%J,jk,'U',tsn(:,:,:,jp_sal) )  
    855                  zrhop = interp(k%I,k%J,jk,'U',rhop)  
    856                  zrhoi = interp(k%I,k%J,jk,'U',rhd*rau0+rau0)  
    857                  zsshn =  0.5*( sshn(k%I,k%J)    + sshn(k%I+1,k%J)    ) * umask(k%I,k%J,1)   
     854                 ztn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_tem,Kmm) )  
     855                 zsn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_sal,Kmm) )  
     856                 zrhop = interp(Kmm,k%I,k%J,jk,'U',rhop)  
     857                 zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*rau0+rau0)  
     858                 zsshn =  0.5*( ssh(k%I,k%J,Kmm)    + ssh(k%I+1,k%J,Kmm)    ) * umask(k%I,k%J,1)   
    858859              END SELECT  
    859860  
    860               zdep= gdept_n(k%I,k%J,jk)  
     861              zdep= gdept(k%I,k%J,jk,Kmm)  
    861862   
    862863              !-------------------------------  
     
    11011102 
    11021103 
    1103    FUNCTION interp(ki, kj, kk, cd_point, ptab) 
     1104   FUNCTION interp(Kmm, ki, kj, kk, cd_point, ptab) 
    11041105  !!---------------------------------------------------------------------- 
    11051106  !! 
     
    11621163  !!---------------------------------------------------------------------- 
    11631164  !*arguments 
     1165  INTEGER, INTENT(IN)                          :: Kmm          ! time level index 
    11641166  INTEGER, INTENT(IN)                          :: ki, kj, kk   ! coordinate of point 
    11651167  CHARACTER(len=1), INTENT(IN)                 :: cd_point     ! type of point (U, V) 
     
    11961198  IF( ln_sco )THEN   ! s-coordinate case 
    11971199 
    1198      zdepu = ( gdept_n(ii1,ij1,kk) +  gdept_n(ii2,ij2,kk) ) * 0.5_wp  
    1199      zdep1 = gdept_n(ii1,ij1,kk) - zdepu 
    1200      zdep2 = gdept_n(ii2,ij2,kk) - zdepu 
     1200     zdepu = ( gdept(ii1,ij1,kk,Kmm) +  gdept(ii2,ij2,kk,Kmm) ) * 0.5_wp  
     1201     zdep1 = gdept(ii1,ij1,kk,Kmm) - zdepu 
     1202     zdep2 = gdept(ii2,ij2,kk,Kmm) - zdepu 
    12011203 
    12021204     ! weights 
     
    12101212  ELSE       ! full step or partial step case  
    12111213 
    1212      ze3t  = e3t_n(ii2,ij2,kk) - e3t_n(ii1,ij1,kk)  
    1213      zwgt1 = ( e3w_n(ii2,ij2,kk) - e3w_n(ii1,ij1,kk) ) / e3w_n(ii2,ij2,kk) 
    1214      zwgt2 = ( e3w_n(ii1,ij1,kk) - e3w_n(ii2,ij2,kk) ) / e3w_n(ii1,ij1,kk) 
     1214     ze3t  = e3t(ii2,ij2,kk,Kmm) - e3t(ii1,ij1,kk,Kmm)  
     1215     zwgt1 = ( e3w(ii2,ij2,kk,Kmm) - e3w(ii1,ij1,kk,Kmm) ) / e3w(ii2,ij2,kk,Kmm) 
     1216     zwgt2 = ( e3w(ii1,ij1,kk,Kmm) - e3w(ii2,ij2,kk,Kmm) ) / e3w(ii1,ij1,kk,Kmm) 
    12151217 
    12161218     IF(kk .NE. 1)THEN 
     
    12451247      IMPLICIT NONE 
    12461248   END SUBROUTINE dia_dct_init 
    1247    SUBROUTINE dia_dct( kt ) 
     1249 
     1250   SUBROUTINE dia_dct( kt, Kmm )         ! Dummy routine 
    12481251      IMPLICIT NONE 
    1249       INTEGER, INTENT(in) ::   kt 
     1252      INTEGER, INTENT( in ) :: kt   ! ocean time-step index 
     1253      INTEGER, INTENT( in ) :: Kmm  ! ocean time level index 
     1254      WRITE(*,*) 'dia_dct: You should not have seen this print! error?', kt 
    12501255   END SUBROUTINE dia_dct 
    12511256   ! 
  • NEMO/trunk/src/OCE/DIA/diahsb.F90

    r11536 r12377  
    1717   USE phycst         ! physical constants 
    1818   USE sbc_oce        ! surface thermohaline fluxes 
     19   USE isf_oce        ! ice shelf fluxes 
    1920   USE sbcrnf         ! river runoff 
    20    USE sbcisf         ! ice shelves 
    2121   USE domvvl         ! vertical scale factors 
    2222   USE traqsr         ! penetrative solar radiation 
     
    4848   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   ssh_hc_loc_ini, ssh_sc_loc_ini   ! 
    4949   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   hc_loc_ini, sc_loc_ini, e3t_ini  ! 
    50  
    51    !! * Substitutions 
    52 #  include "vectopt_loop_substitute.h90" 
     50   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   tmask_ini 
     51 
    5352   !!---------------------------------------------------------------------- 
    5453   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    5857CONTAINS 
    5958 
    60    SUBROUTINE dia_hsb( kt ) 
     59   SUBROUTINE dia_hsb( kt, Kbb, Kmm ) 
    6160      !!--------------------------------------------------------------------------- 
    6261      !!                  ***  ROUTINE dia_hsb  *** 
     
    6968      !! 
    7069      !!--------------------------------------------------------------------------- 
    71       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     70      INTEGER, INTENT(in) ::   kt         ! ocean time-step index 
     71      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
    7272      ! 
    7373      INTEGER    ::   ji, jj, jk                  ! dummy loop indice 
     
    8686      IF( ln_timing )   CALL timing_start('dia_hsb')       
    8787      ! 
    88       tsn(:,:,:,1) = tsn(:,:,:,1) * tmask(:,:,:) ; tsb(:,:,:,1) = tsb(:,:,:,1) * tmask(:,:,:) ; 
    89       tsn(:,:,:,2) = tsn(:,:,:,2) * tmask(:,:,:) ; tsb(:,:,:,2) = tsb(:,:,:,2) * tmask(:,:,:) ; 
     88      ts(:,:,:,1,Kmm) = ts(:,:,:,1,Kmm) * tmask(:,:,:) ; ts(:,:,:,1,Kbb) = ts(:,:,:,1,Kbb) * tmask(:,:,:) ; 
     89      ts(:,:,:,2,Kmm) = ts(:,:,:,2,Kmm) * tmask(:,:,:) ; ts(:,:,:,2,Kbb) = ts(:,:,:,2,Kbb) * tmask(:,:,:) ; 
    9090      ! ------------------------- ! 
    9191      ! 1 - Trends due to forcing ! 
    9292      ! ------------------------- ! 
    93       z_frc_trd_v = r1_rau0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) * surf(:,:) )   ! volume fluxes 
     93      z_frc_trd_v = r1_rau0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * surf(:,:) )   ! volume fluxes 
    9494      z_frc_trd_t =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) )                       ! heat fluxes 
    9595      z_frc_trd_s =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) )                       ! salt fluxes 
     
    9898      IF( ln_rnf_sal)   z_frc_trd_s = z_frc_trd_s + glob_sum( 'diahsb', rnf_tsc(:,:,jp_sal) * surf(:,:) ) 
    9999      !                    ! Add ice shelf heat & salt input 
    100       IF( ln_isf    )   z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', risf_tsc(:,:,jp_tem) * surf(:,:) ) 
     100      IF( ln_isf    )   z_frc_trd_t = z_frc_trd_t & 
     101         &                          + glob_sum( 'diahsb', ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ) 
    101102      !                    ! Add penetrative solar radiation 
    102103      IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + r1_rau0_rcp * glob_sum( 'diahsb', qsr     (:,:) * surf(:,:) ) 
     
    108109            DO ji=1,jpi 
    109110               DO jj=1,jpj 
    110                   z2d0(ji,jj) = surf(ji,jj) * wn(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_tem) 
    111                   z2d1(ji,jj) = surf(ji,jj) * wn(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_sal) 
     111                  z2d0(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb) 
     112                  z2d1(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb) 
    112113               END DO 
    113114            END DO 
    114115         ELSE 
    115             z2d0(:,:) = surf(:,:) * wn(:,:,1) * tsb(:,:,1,jp_tem) 
    116             z2d1(:,:) = surf(:,:) * wn(:,:,1) * tsb(:,:,1,jp_sal) 
     116            z2d0(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb) 
     117            z2d1(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb) 
    117118         END IF 
    118119         z_wn_trd_t = - glob_sum( 'diahsb', z2d0 )  
     
    135136 
    136137      !                    ! volume variation (calculated with ssh) 
    137       zdiff_v1 = glob_sum_full( 'diahsb', surf(:,:)*sshn(:,:) - surf_ini(:,:)*ssh_ini(:,:) ) 
     138      zdiff_v1 = glob_sum_full( 'diahsb', surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) ) 
    138139 
    139140      !                    ! heat & salt content variation (associated with ssh) 
     
    142143            DO ji = 1, jpi 
    143144               DO jj = 1, jpj 
    144                   z2d0(ji,jj) = surf(ji,jj) * ( tsn(ji,jj,mikt(ji,jj),jp_tem) * sshn(ji,jj) - ssh_hc_loc_ini(ji,jj) )  
    145                   z2d1(ji,jj) = surf(ji,jj) * ( tsn(ji,jj,mikt(ji,jj),jp_sal) * sshn(ji,jj) - ssh_sc_loc_ini(ji,jj) )  
     145                  z2d0(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) )  
     146                  z2d1(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) )  
    146147               END DO 
    147148            END DO 
    148149         ELSE                          ! no under ice-shelf seas 
    149             z2d0(:,:) = surf(:,:) * ( tsn(:,:,1,jp_tem) * sshn(:,:) - ssh_hc_loc_ini(:,:) )  
    150             z2d1(:,:) = surf(:,:) * ( tsn(:,:,1,jp_sal) * sshn(:,:) - ssh_sc_loc_ini(:,:) )  
     150            z2d0(:,:) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) )  
     151            z2d1(:,:) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) )  
    151152         END IF 
    152153         z_ssh_hc = glob_sum_full( 'diahsb', z2d0 )  
     
    155156      ! 
    156157      DO jk = 1, jpkm1           ! volume variation (calculated with scale factors) 
    157          zwrk(:,:,jk) = ( surf(:,:)*e3t_n(:,:,jk) - surf_ini(:,:)*e3t_ini(:,:,jk) ) * tmask(:,:,jk) 
     158         zwrk(:,:,jk) = surf(:,:)*e3t(:,:,jk,Kmm)*tmask(:,:,jk) - surf_ini(:,:)*e3t_ini(:,:,jk)*tmask_ini(:,:,jk) 
    158159      END DO 
    159       zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
     160      zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) )     ! glob_sum_full needed as tmask and tmask_ini could be different 
    160161      DO jk = 1, jpkm1           ! heat content variation 
    161          zwrk(:,:,jk) = ( surf(:,:)*e3t_n(:,:,jk)*tsn(:,:,jk,jp_tem) - surf_ini(:,:)*hc_loc_ini(:,:,jk) ) * tmask(:,:,jk) 
     162         zwrk(:,:,jk) = ( surf(:,:)*e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm) - surf_ini(:,:)*hc_loc_ini(:,:,jk) ) 
    162163      END DO 
    163164      zdiff_hc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
    164165      DO jk = 1, jpkm1           ! salt content variation 
    165          zwrk(:,:,jk) = ( surf(:,:)*e3t_n(:,:,jk)*tsn(:,:,jk,jp_sal) - surf_ini(:,:)*sc_loc_ini(:,:,jk) ) * tmask(:,:,jk) 
     166         zwrk(:,:,jk) = ( surf(:,:)*e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm) - surf_ini(:,:)*sc_loc_ini(:,:,jk) ) 
    166167      END DO 
    167168      zdiff_sc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
     
    185186      ! ----------------------- ! 
    186187      DO jk = 1, jpkm1           ! total ocean volume (calculated with scale factors) 
    187          zwrk(:,:,jk) = surf(:,:) * e3t_n(:,:,jk) * tmask(:,:,jk) 
     188         zwrk(:,:,jk) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
    188189      END DO 
    189       zvol_tot = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
     190      zvol_tot = glob_sum( 'diahsb', zwrk(:,:,:) ) 
    190191 
    191192!!gm to be added ? 
    192193!      IF( ln_linssh ) THEN            ! fixed volume, add the ssh contribution 
    193 !        zvol_tot = zvol_tot + glob_sum( 'diahsb', surf(:,:) * sshn(:,:) ) 
     194!        zvol_tot = zvol_tot + glob_sum( 'diahsb', surf(:,:) * ssh(:,:,Kmm) ) 
    194195!      ENDIF 
    195196!!gm end 
     
    233234      ENDIF 
    234235      ! 
    235       IF( lrst_oce )   CALL dia_hsb_rst( kt, 'WRITE' ) 
     236      IF( lrst_oce )   CALL dia_hsb_rst( kt, Kmm, 'WRITE' ) 
    236237      ! 
    237238      IF( ln_timing )   CALL timing_stop('dia_hsb') 
     
    240241 
    241242 
    242    SUBROUTINE dia_hsb_rst( kt, cdrw ) 
     243   SUBROUTINE dia_hsb_rst( kt, Kmm, cdrw ) 
    243244      !!--------------------------------------------------------------------- 
    244245      !!                   ***  ROUTINE dia_hsb_rst  *** 
     
    249250      !!---------------------------------------------------------------------- 
    250251      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     252      INTEGER         , INTENT(in) ::   Kmm    ! ocean time level index 
    251253      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    252254      ! 
     
    270272            CALL iom_get( numror, jpdom_autoglo, 'ssh_ini'   , ssh_ini   , ldxios = lrxios ) 
    271273            CALL iom_get( numror, jpdom_autoglo, 'e3t_ini'   , e3t_ini   , ldxios = lrxios ) 
     274            CALL iom_get( numror, jpdom_autoglo, 'tmask_ini' , tmask_ini , ldxios = lrxios ) 
    272275            CALL iom_get( numror, jpdom_autoglo, 'hc_loc_ini', hc_loc_ini, ldxios = lrxios ) 
    273276            CALL iom_get( numror, jpdom_autoglo, 'sc_loc_ini', sc_loc_ini, ldxios = lrxios ) 
     
    281284            IF(lwp) WRITE(numout,*) 
    282285            surf_ini(:,:) = e1e2t(:,:) * tmask_i(:,:)         ! initial ocean surface 
    283             ssh_ini(:,:) = sshn(:,:)                          ! initial ssh 
     286            ssh_ini(:,:) = ssh(:,:,Kmm)                          ! initial ssh 
    284287            DO jk = 1, jpk 
    285288              ! if ice sheet/oceqn coupling, need to mask ini variables here (mask could change at the next NEMO instance). 
    286                e3t_ini   (:,:,jk) = e3t_n(:,:,jk)                      * tmask(:,:,jk)  ! initial vertical scale factors 
    287                hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * e3t_n(:,:,jk) * tmask(:,:,jk)  ! initial heat content 
    288                sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * e3t_n(:,:,jk) * tmask(:,:,jk)  ! initial salt content 
     289               e3t_ini   (:,:,jk) = e3t(:,:,jk,Kmm)                      * tmask(:,:,jk)  ! initial vertical scale factors 
     290               tmask_ini (:,:,jk) = tmask(:,:,jk)                                       ! initial mask 
     291               hc_loc_ini(:,:,jk) = ts(:,:,jk,jp_tem,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)  ! initial heat content 
     292               sc_loc_ini(:,:,jk) = ts(:,:,jk,jp_sal,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)  ! initial salt content 
    289293            END DO 
    290294            frc_v = 0._wp                                           ! volume       trend due to forcing 
     
    295299                  DO ji = 1, jpi 
    296300                     DO jj = 1, jpj 
    297                         ssh_hc_loc_ini(ji,jj) = tsn(ji,jj,mikt(ji,jj),jp_tem) * sshn(ji,jj)   ! initial heat content in ssh 
    298                         ssh_sc_loc_ini(ji,jj) = tsn(ji,jj,mikt(ji,jj),jp_sal) * sshn(ji,jj)   ! initial salt content in ssh 
     301                        ssh_hc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm)   ! initial heat content in ssh 
     302                        ssh_sc_loc_ini(ji,jj) = ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm)   ! initial salt content in ssh 
    299303                     END DO 
    300304                   END DO 
    301305                ELSE 
    302                   ssh_hc_loc_ini(:,:) = tsn(:,:,1,jp_tem) * sshn(:,:)   ! initial heat content in ssh 
    303                   ssh_sc_loc_ini(:,:) = tsn(:,:,1,jp_sal) * sshn(:,:)   ! initial salt content in ssh 
     306                  ssh_hc_loc_ini(:,:) = ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm)   ! initial heat content in ssh 
     307                  ssh_sc_loc_ini(:,:) = ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm)   ! initial salt content in ssh 
    304308               END IF 
    305309               frc_wn_t = 0._wp                                       ! initial heat content misfit due to free surface 
     
    325329         CALL iom_rstput( kt, nitrst, numrow, 'ssh_ini'   , ssh_ini   , ldxios = lwxios ) 
    326330         CALL iom_rstput( kt, nitrst, numrow, 'e3t_ini'   , e3t_ini   , ldxios = lwxios ) 
     331         CALL iom_rstput( kt, nitrst, numrow, 'tmask_ini' , tmask_ini , ldxios = lwxios ) 
    327332         CALL iom_rstput( kt, nitrst, numrow, 'hc_loc_ini', hc_loc_ini, ldxios = lwxios ) 
    328333         CALL iom_rstput( kt, nitrst, numrow, 'sc_loc_ini', sc_loc_ini, ldxios = lwxios ) 
     
    338343 
    339344 
    340    SUBROUTINE dia_hsb_init 
     345   SUBROUTINE dia_hsb_init( Kmm ) 
    341346      !!--------------------------------------------------------------------------- 
    342347      !!                  ***  ROUTINE dia_hsb  *** 
     
    350355      !!             - Compute coefficients for conversion 
    351356      !!--------------------------------------------------------------------------- 
     357      INTEGER, INTENT(in) :: Kmm ! time level index 
     358      ! 
    352359      INTEGER ::   ierror, ios   ! local integer 
    353360      !! 
     
    360367         WRITE(numout,*) '~~~~~~~~~~~~ ' 
    361368      ENDIF 
    362       REWIND( numnam_ref )              ! Namelist namhsb in reference namelist 
    363369      READ  ( numnam_ref, namhsb, IOSTAT = ios, ERR = 901) 
    364370901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namhsb in reference namelist' ) 
    365       REWIND( numnam_cfg )              ! Namelist namhsb in configuration namelist 
    366371      READ  ( numnam_cfg, namhsb, IOSTAT = ios, ERR = 902 ) 
    367372902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namhsb in configuration namelist' ) 
     
    396401      ! ------------------- ! 
    397402      ALLOCATE( hc_loc_ini(jpi,jpj,jpk), sc_loc_ini(jpi,jpj,jpk), surf_ini(jpi,jpj), & 
    398          &      e3t_ini(jpi,jpj,jpk), surf(jpi,jpj),  ssh_ini(jpi,jpj), STAT=ierror  ) 
     403         &      e3t_ini(jpi,jpj,jpk), surf(jpi,jpj),  ssh_ini(jpi,jpj), tmask_ini(jpi,jpj,jpk),STAT=ierror  ) 
    399404      IF( ierror > 0 ) THEN 
    400405         CALL ctl_stop( 'dia_hsb_init: unable to allocate hc_loc_ini' )   ;   RETURN 
     
    417422      ! 4 - initial conservation variables ! 
    418423      ! ---------------------------------- ! 
    419       CALL dia_hsb_rst( nit000, 'READ' )  !* read or initialize all required files 
     424      CALL dia_hsb_rst( nit000, Kmm, 'READ' )  !* read or initialize all required files 
    420425      ! 
    421426   END SUBROUTINE dia_hsb_init 
  • NEMO/trunk/src/OCE/DIA/diahth.F90

    r12276 r12377  
    4040 
    4141 
     42   !! * Substitutions 
     43#  include "do_loop_substitute.h90" 
    4244   !!---------------------------------------------------------------------- 
    4345   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    6163 
    6264 
    63    SUBROUTINE dia_hth( kt ) 
     65   SUBROUTINE dia_hth( kt, Kmm ) 
    6466      !!--------------------------------------------------------------------- 
    6567      !!                  ***  ROUTINE dia_hth  *** 
     
    8284      !!------------------------------------------------------------------- 
    8385      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     86      INTEGER, INTENT( in ) ::   Kmm     ! ocean time level index 
    8487      !! 
    8588      INTEGER                      ::   ji, jj, jk            ! dummy loop arguments 
     
    126129            zdepinv(:,:) = 0._wp   
    127130            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 
     131            DO_2D_11_11 
     132               zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)  
     133               hth     (ji,jj) = zztmp 
     134               zabs2   (ji,jj) = zztmp 
     135               ztm2    (ji,jj) = zztmp 
     136               zrho10_3(ji,jj) = zztmp 
     137               zpycn   (ji,jj) = zztmp 
     138            END_2D 
    138139            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 
     140               DO_2D_11_11 
     141                  zztmp = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)  
     142                  zrho0_3(ji,jj) = zztmp 
     143                  zrho0_1(ji,jj) = zztmp 
     144               END_2D 
    146145            ENDIF 
    147146       
    148147            ! Preliminary computation 
    149148            ! 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 
     149            DO_2D_11_11 
     150               IF( tmask(ji,jj,nla10) == 1. ) THEN 
     151                  zu  =  1779.50 + 11.250 * ts(ji,jj,nla10,jp_tem,Kmm) - 3.80   * ts(ji,jj,nla10,jp_sal,Kmm)  & 
     152                     &           - 0.0745 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm)   & 
     153                     &           - 0.0100 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_sal,Kmm) 
     154                  zv  =  5891.00 + 38.000 * ts(ji,jj,nla10,jp_tem,Kmm) + 3.00   * ts(ji,jj,nla10,jp_sal,Kmm)  & 
     155                     &           - 0.3750 * ts(ji,jj,nla10,jp_tem,Kmm) * ts(ji,jj,nla10,jp_tem,Kmm) 
     156                  zut =    11.25 -  0.149 * ts(ji,jj,nla10,jp_tem,Kmm) - 0.01   * ts(ji,jj,nla10,jp_sal,Kmm) 
     157                  zvt =    38.00 -  0.750 * ts(ji,jj,nla10,jp_tem,Kmm) 
     158                  zw  = (zu + 0.698*zv) * (zu + 0.698*zv) 
     159                  zdelr(ji,jj) = ztem2 * (1000.*(zut*zv - zvt*zu)/zw) 
     160               ELSE 
     161                  zdelr(ji,jj) = 0._wp 
     162               ENDIF 
     163            END_2D 
    167164 
    168165            ! ------------------------------------------------------------- ! 
     
    172169            ! MLD: rho = rho(1) + zrho1                                     ! 
    173170            ! ------------------------------------------------------------- ! 
    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 
     171            DO_3DS_11_11( jpkm1, 2, -1 ) 
     172               ! 
     173               zzdep = gdepw(ji,jj,jk,Kmm) 
     174               zztmp = ( ts(ji,jj,jk-1,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm) ) & 
     175                      & / zzdep * tmask(ji,jj,jk)   ! vertical gradient of temperature (dT/dz) 
     176               zzdep = zzdep * tmask(ji,jj,1) 
     177 
     178               IF( zztmp > zmaxdzT(ji,jj) ) THEN                         
     179                   zmaxdzT(ji,jj) = zztmp    
     180                   hth    (ji,jj) = zzdep                ! max and depth of dT/dz 
     181               ENDIF 
     182          
     183               IF( nla10 > 1 ) THEN  
     184                  zztmp = rhop(ji,jj,jk) - rhop(ji,jj,1)                       ! delta rho(1) 
     185                  IF( zztmp > zrho3 )   zrho0_3(ji,jj) = zzdep                ! > 0.03 
     186                  IF( zztmp > zrho1 )   zrho0_1(ji,jj) = zzdep                ! > 0.01 
     187               ENDIF 
     188            END_3D 
    196189          
    197190            CALL iom_put( 'mlddzt', hth )            ! depth of the thermocline 
     
    213206            ! depth of temperature inversion                                ! 
    214207            ! ------------------------------------------------------------- ! 
    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 
     208            DO_3DS_11_11( jpkm1, nlb10, -1 ) 
     209               ! 
     210               zzdep = gdepw(ji,jj,jk,Kmm) * tmask(ji,jj,1) 
     211               ! 
     212               zztmp = ts(ji,jj,nla10,jp_tem,Kmm) - ts(ji,jj,jk,jp_tem,Kmm)  ! - delta T(10m) 
     213               IF( ABS(zztmp) > ztem2 )      zabs2   (ji,jj) = zzdep   ! abs > 0.2 
     214               IF(     zztmp  > ztem2 )      ztm2    (ji,jj) = zzdep   ! > 0.2 
     215               zztmp = -zztmp                                          ! delta T(10m) 
     216               IF( zztmp >  ztinv(ji,jj) ) THEN                        ! temperature inversion 
     217                  ztinv(ji,jj) = zztmp    
     218                  zdepinv (ji,jj) = zzdep   ! max value and depth 
     219               ENDIF 
     220 
     221               zztmp = rhop(ji,jj,jk) - rhop(ji,jj,nla10)              ! delta rho(10m) 
     222               IF( zztmp > zrho3        )    zrho10_3(ji,jj) = zzdep   ! > 0.03 
     223               IF( zztmp > zdelr(ji,jj) )    zpycn   (ji,jj) = zzdep   ! > equi. delta T(10m) - 0.2 
     224               ! 
     225            END_3D 
    237226 
    238227            CALL iom_put( 'mld_dt02', zabs2    )   ! MLD abs(delta t) - 0.2 
     
    250239         IF( iom_use ('20d') ) THEN  ! depth of the 20 isotherm 
    251240            ztem2 = 20. 
    252             CALL dia_hth_dep( ztem2, hd20 )   
     241            CALL dia_hth_dep( Kmm, ztem2, hd20 )   
    253242            CALL iom_put( '20d', hd20 )     
    254243         ENDIF 
     
    256245         IF( iom_use ('26d') ) THEN  ! depth of the 26 isotherm 
    257246            ztem2 = 26. 
    258             CALL dia_hth_dep( ztem2, hd26 )   
     247            CALL dia_hth_dep( Kmm, ztem2, hd26 )   
    259248            CALL iom_put( '26d', hd26 )     
    260249         ENDIF 
     
    262251         IF( iom_use ('28d') ) THEN  ! depth of the 28 isotherm 
    263252            ztem2 = 28. 
    264             CALL dia_hth_dep( ztem2, hd28 )   
     253            CALL dia_hth_dep( Kmm, ztem2, hd28 )   
    265254            CALL iom_put( '28d', hd28 )     
    266255         ENDIF 
     
    271260         IF( iom_use ('hc300') ) THEN   
    272261            zzdep = 300. 
    273             CALL  dia_hth_htc( zzdep, tsn(:,:,:,jp_tem), htc3 ) 
     262            CALL  dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc3 ) 
    274263            CALL iom_put( 'hc300', rau0_rcp * htc3 )  ! vertically integrated heat content (J/m2) 
    275264         ENDIF 
     
    280269         IF( iom_use ('hc700') ) THEN   
    281270            zzdep = 700. 
    282             CALL  dia_hth_htc( zzdep, tsn(:,:,:,jp_tem), htc7 ) 
     271            CALL  dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc7 ) 
    283272            CALL iom_put( 'hc700', rau0_rcp * htc7 )  ! vertically integrated heat content (J/m2) 
    284273   
     
    290279         IF( iom_use ('hc2000') ) THEN   
    291280            zzdep = 2000. 
    292             CALL  dia_hth_htc( zzdep, tsn(:,:,:,jp_tem), htc20 ) 
     281            CALL  dia_hth_htc( Kmm, zzdep, ts(:,:,:,jp_tem,Kmm), htc20 ) 
    293282            CALL iom_put( 'hc2000', rau0_rcp * htc20 )  ! vertically integrated heat content (J/m2)   
    294283         ENDIF 
     
    301290   END SUBROUTINE dia_hth 
    302291 
    303    SUBROUTINE dia_hth_dep( ptem, pdept ) 
    304       ! 
     292   SUBROUTINE dia_hth_dep( Kmm, ptem, pdept ) 
     293      ! 
     294      INTEGER , INTENT(in) :: Kmm      ! ocean time level index 
    305295      REAL(wp), INTENT(in) :: ptem 
    306296      REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pdept      
     
    314304      ! --------------------------------------- ! 
    315305      iktem(:,:) = 1 
    316       DO jk = 1, jpkm1   ! beware temperature is not always decreasing with depth => loop from top to bottom 
    317          DO jj = 1, jpj 
    318             DO ji = 1, jpi 
    319                zztmp = tsn(ji,jj,jk,jp_tem) 
    320                IF( zztmp >= ptem )   iktem(ji,jj) = jk 
    321             END DO 
    322          END DO 
    323       END DO 
     306      DO_3D_11_11( 1, jpkm1 ) 
     307         zztmp = ts(ji,jj,jk,jp_tem,Kmm) 
     308         IF( zztmp >= ptem )   iktem(ji,jj) = jk 
     309      END_3D 
    324310 
    325311      ! ------------------------------- ! 
    326312      !  Depth of ptem isotherm         ! 
    327313      ! ------------------------------- ! 
    328       DO jj = 1, jpj 
    329          DO ji = 1, jpi 
    330             ! 
    331             zzdep = gdepw_n(ji,jj,mbkt(ji,jj)+1)       ! depth of the ocean bottom 
    332             ! 
    333             iid = iktem(ji,jj) 
    334             IF( iid /= 1 ) THEN  
    335                 zztmp =     gdept_n(ji,jj,iid  )   &                     ! linear interpolation 
    336                   &  + (    gdept_n(ji,jj,iid+1) - gdept_n(ji,jj,iid)                       )   & 
    337                   &  * ( 20.*tmask(ji,jj,iid+1) - tsn(ji,jj,iid,jp_tem)                       )   & 
    338                   &  / ( tsn(ji,jj,iid+1,jp_tem) - tsn(ji,jj,iid,jp_tem) + (1.-tmask(ji,jj,1)) ) 
    339                pdept(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
    340             ELSE  
    341                pdept(ji,jj) = 0._wp 
    342             ENDIF 
    343          END DO 
    344       END DO 
     314      DO_2D_11_11 
     315         ! 
     316         zzdep = gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)       ! depth of the ocean bottom 
     317         ! 
     318         iid = iktem(ji,jj) 
     319         IF( iid /= 1 ) THEN  
     320             zztmp =     gdept(ji,jj,iid  ,Kmm)   &                     ! linear interpolation 
     321               &  + (    gdept(ji,jj,iid+1,Kmm) - gdept(ji,jj,iid,Kmm)                       )   & 
     322               &  * ( 20.*tmask(ji,jj,iid+1) - ts(ji,jj,iid,jp_tem,Kmm)                       )   & 
     323               &  / ( ts(ji,jj,iid+1,jp_tem,Kmm) - ts(ji,jj,iid,jp_tem,Kmm) + (1.-tmask(ji,jj,1)) ) 
     324            pdept(ji,jj) = MIN( zztmp , zzdep) * tmask(ji,jj,1)       ! bound by the ocean depth 
     325         ELSE  
     326            pdept(ji,jj) = 0._wp 
     327         ENDIF 
     328      END_2D 
    345329      ! 
    346330   END SUBROUTINE dia_hth_dep 
    347331 
    348332 
    349    SUBROUTINE dia_hth_htc( pdep, ptn, phtc ) 
    350       ! 
     333   SUBROUTINE dia_hth_htc( Kmm, pdep, pt, phtc ) 
     334      ! 
     335      INTEGER , INTENT(in) :: Kmm      ! ocean time level index 
    351336      REAL(wp), INTENT(in) :: pdep     ! depth over the heat content 
    352       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: ptn    
     337      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) :: pt    
    353338      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: phtc   
    354339      ! 
     
    361346       
    362347      IF( .NOT. ln_linssh ) THEN   ;   zthick(:,:) = 0._wp       ;   phtc(:,:) = 0._wp                                    
    363       ELSE                         ;   zthick(:,:) = sshn(:,:)   ;   phtc(:,:) = ptn(:,:,1) * sshn(:,:) * tmask(:,:,1)    
     348      ELSE                         ;   zthick(:,:) = ssh(:,:,Kmm)   ;   phtc(:,:) = pt(:,:,1) * ssh(:,:,Kmm) * tmask(:,:,1)    
    364349      ENDIF 
    365350      ! 
    366351      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       ! 
    379       DO jj = 1, jpj 
    380          DO ji = 1, jpi 
    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) 
    385          END DO 
    386       ENDDO 
     352      DO_3D_11_11( 2, jpkm1 ) 
     353         IF( ( gdept(ji,jj,jk,Kmm) < pdep ) .AND. ( tmask(ji,jj,jk) == 1 ) ) THEN 
     354             ilevel(ji,jj) = jk 
     355             zthick(ji,jj) = zthick(ji,jj) + e3t(ji,jj,jk,Kmm) 
     356             phtc  (ji,jj) = phtc  (ji,jj) + e3t(ji,jj,jk,Kmm) * pt(ji,jj,jk) 
     357         ENDIF 
     358      END_3D 
     359      ! 
     360      DO_2D_11_11 
     361         ik = ilevel(ji,jj) 
     362         zthick(ji,jj) = pdep - zthick(ji,jj)   !   remaining thickness to reach depht pdep 
     363         phtc(ji,jj)   = phtc(ji,jj) + pt(ji,jj,ik+1) * MIN( e3t(ji,jj,ik+1,Kmm), zthick(ji,jj) ) & 
     364                                                       * tmask(ji,jj,ik+1) 
     365      END_2D 
    387366      ! 
    388367      ! 
  • NEMO/trunk/src/OCE/DIA/diaptr.F90

    r12276 r12377  
    4646   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hstr_ove, hstr_btr, hstr_vtr   !: heat Salt TRansports(overturn, baro, merional) 
    4747 
    48    LOGICAL, PUBLIC ::   ln_diaptr   !  Poleward transport flag (T) or not (F) 
    49    LOGICAL, PUBLIC ::   ln_subbas   !  Atlantic/Pacific/Indian basins calculation 
     48   LOGICAL , PUBLIC ::   l_diaptr        !: tracers  trend flag (set from namelist in trdini) 
    5049   INTEGER, PARAMETER, PUBLIC ::   nptr = 5  ! (glo, atl, pac, ind, ipc) 
    5150 
     
    6059   REAL(wp), TARGET, ALLOCATABLE, SAVE, DIMENSION(:,:) :: p_fval2d 
    6160 
     61   LOGICAL ::   ll_init = .TRUE.        !: tracers  trend flag (set from namelist in trdini) 
    6262   !! * Substitutions 
    63 #  include "vectopt_loop_substitute.h90" 
     63#  include "do_loop_substitute.h90" 
    6464   !!---------------------------------------------------------------------- 
    6565   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    6969CONTAINS 
    7070 
    71    SUBROUTINE dia_ptr( pvtr ) 
     71   SUBROUTINE dia_ptr( kt, Kmm, pvtr ) 
    7272      !!---------------------------------------------------------------------- 
    7373      !!                  ***  ROUTINE dia_ptr  *** 
    7474      !!---------------------------------------------------------------------- 
     75      INTEGER                         , INTENT(in)           ::   kt     ! ocean time-step index      
     76      INTEGER                         , INTENT(in)           ::   Kmm    ! time level index 
    7577      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport 
    7678      ! 
     
    9294      ! 
    9395      IF( ln_timing )   CALL timing_start('dia_ptr') 
    94       ! 
     96 
     97      IF( kt == nit000 .AND. ll_init )   CALL dia_ptr_init 
     98      ! 
     99      IF( .NOT. l_diaptr )   RETURN 
     100 
    95101      IF( PRESENT( pvtr ) ) THEN 
    96102         IF( iom_use( 'zomsf' ) ) THEN    ! effective MSF 
     
    111117            zmask(:,:,:) = 0._wp 
    112118            zts(:,:,:,:) = 0._wp 
    113             DO jk = 1, jpkm1 
    114                DO jj = 1, jpjm1 
    115                   DO ji = 1, jpi 
    116                      zvfc = e1v(ji,jj) * e3v_n(ji,jj,jk) 
    117                      zmask(ji,jj,jk)      = vmask(ji,jj,jk)      * zvfc 
    118                      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 
    119                      zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj+1,jk,jp_sal)) * 0.5 * zvfc 
    120                   ENDDO 
    121                ENDDO 
    122              ENDDO 
     119            DO_3D_10_11( 1, jpkm1 ) 
     120               zvfc = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) 
     121               zmask(ji,jj,jk)      = vmask(ji,jj,jk)      * zvfc 
     122               zts(ji,jj,jk,jp_tem) = (ts(ji,jj,jk,jp_tem,Kmm)+ts(ji,jj+1,jk,jp_tem,Kmm)) * 0.5 * zvfc  !Tracers averaged onto V grid 
     123               zts(ji,jj,jk,jp_sal) = (ts(ji,jj,jk,jp_sal,Kmm)+ts(ji,jj+1,jk,jp_sal,Kmm)) * 0.5 * zvfc 
     124            END_3D 
    123125         ENDIF 
    124126         IF( iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) ) THEN 
     
    186188         zts(:,:,:,:) = 0._wp 
    187189         IF( iom_use( 'zotem' ) .OR. iom_use( 'zosal' ) .OR. iom_use( 'zosrf' )  ) THEN    ! i-mean i-k-surface  
    188             DO jk = 1, jpkm1 
    189                DO jj = 1, jpj 
    190                   DO ji = 1, jpi 
    191                      zsfc = e1t(ji,jj) * e3t_n(ji,jj,jk) 
    192                      zmask(ji,jj,jk)      = tmask(ji,jj,jk)      * zsfc 
    193                      zts(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) * zsfc 
    194                      zts(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) * zsfc 
    195                   END DO 
    196                END DO 
    197             END DO 
     190            DO_3D_11_11( 1, jpkm1 ) 
     191               zsfc = e1t(ji,jj) * e3t(ji,jj,jk,Kmm) 
     192               zmask(ji,jj,jk)      = tmask(ji,jj,jk)      * zsfc 
     193               zts(ji,jj,jk,jp_tem) = ts(ji,jj,jk,jp_tem,Kmm) * zsfc 
     194               zts(ji,jj,jk,jp_sal) = ts(ji,jj,jk,jp_sal,Kmm) * zsfc 
     195            END_3D 
    198196            ! 
    199197            DO jn = 1, nptr 
     
    280278         IF( iom_use( 'sopstvtr' ) .OR. iom_use( 'sophtvtr' ) ) THEN 
    281279            zts(:,:,:,:) = 0._wp 
    282             DO jk = 1, jpkm1 
    283                DO jj = 1, jpjm1 
    284                   DO ji = 1, jpi 
    285                      zvfc = e1v(ji,jj) * e3v_n(ji,jj,jk) 
    286                      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 
    287                      zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj+1,jk,jp_sal)) * 0.5 * zvfc 
    288                   ENDDO 
    289                ENDDO 
    290              ENDDO 
     280            DO_3D_10_11( 1, jpkm1 ) 
     281               zvfc = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) 
     282               zts(ji,jj,jk,jp_tem) = (ts(ji,jj,jk,jp_tem,Kmm)+ts(ji,jj+1,jk,jp_tem,Kmm)) * 0.5 * zvfc  !Tracers averaged onto V grid 
     283               zts(ji,jj,jk,jp_sal) = (ts(ji,jj,jk,jp_sal,Kmm)+ts(ji,jj+1,jk,jp_sal,Kmm)) * 0.5 * zvfc 
     284            END_3D 
    291285             CALL dia_ptr_hst( jp_tem, 'vtr', zts(:,:,:,jp_tem) ) 
    292286             CALL dia_ptr_hst( jp_sal, 'vtr', zts(:,:,:,jp_sal) ) 
     
    326320      !! ** Purpose :   Initialization, namelist read 
    327321      !!---------------------------------------------------------------------- 
    328       INTEGER ::  inum, jn, ios, ierr           ! local integers 
    329       !! 
    330       NAMELIST/namptr/ ln_diaptr, ln_subbas 
     322      INTEGER ::  inum, jn           ! local integers 
     323      !! 
    331324      REAL(wp), DIMENSION(jpi,jpj) :: zmsk 
    332325      !!---------------------------------------------------------------------- 
    333326 
    334  
    335       REWIND( numnam_ref )              ! Namelist namptr in reference namelist : Poleward transport 
    336       READ  ( numnam_ref, namptr, IOSTAT = ios, ERR = 901) 
    337 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namptr in reference namelist' ) 
    338  
    339       REWIND( numnam_cfg )              ! Namelist namptr in configuration namelist : Poleward transport 
    340       READ  ( numnam_cfg, namptr, IOSTAT = ios, ERR = 902 ) 
    341 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namptr in configuration namelist' ) 
    342       IF(lwm) WRITE ( numond, namptr ) 
    343  
     327      l_diaptr = .FALSE. 
     328      IF(   iom_use( 'zomsf'    ) .OR. iom_use( 'zotem'    ) .OR. iom_use( 'zosal'    ) .OR.  & 
     329         &  iom_use( 'zosrf'    ) .OR. iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) .OR.  & 
     330         &  iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) .OR. iom_use( 'sophtadv' ) .OR.  & 
     331         &  iom_use( 'sopstadv' ) .OR. iom_use( 'sophtldf' ) .OR. iom_use( 'sopstldf' ) .OR.  &  
     332         &  iom_use( 'sophteiv' ) .OR. iom_use( 'sopsteiv' ) .OR. iom_use( 'sopstvtr' ) .OR.  & 
     333         &  iom_use( 'sophtvtr' ) .OR. iom_use( 'uocetr_vsum_cumul' ) )  l_diaptr  = .TRUE. 
     334 
     335  
    344336      IF(lwp) THEN                     ! Control print 
    345337         WRITE(numout,*) 
     
    347339         WRITE(numout,*) '~~~~~~~~~~~~' 
    348340         WRITE(numout,*) '   Namelist namptr : set ptr parameters' 
    349          WRITE(numout,*) '      Poleward heat & salt transport (T) or not (F)      ln_diaptr  = ', ln_diaptr 
     341         WRITE(numout,*) '      Poleward heat & salt transport (T) or not (F)      l_diaptr  = ', l_diaptr 
    350342      ENDIF 
    351343 
    352       IF( ln_diaptr ) THEN   
     344      IF( l_diaptr ) THEN   
    353345         ! 
    354346         IF( dia_ptr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dia_ptr_init : unable to allocate arrays' ) 
     
    389381         hstr_vtr(:,:,:) = 0._wp           ! 
    390382         ! 
     383         ll_init = .FALSE. 
     384         ! 
    391385      ENDIF  
    392386      !  
     
    394388 
    395389 
    396    SUBROUTINE dia_ptr_hst( ktra, cptr, pva )  
     390   SUBROUTINE dia_ptr_hst( ktra, cptr, pvflx )  
    397391      !!---------------------------------------------------------------------- 
    398392      !!                    ***  ROUTINE dia_ptr_hst *** 
     
    403397      INTEGER                         , INTENT(in )  :: ktra  ! tracer index 
    404398      CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf'/'eiv' 
    405       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pva   ! 3D input array of advection/diffusion 
     399      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pvflx   ! 3D input array of advection/diffusion 
    406400      INTEGER                                        :: jn    ! 
    407401 
     
    410404         IF( ktra == jp_tem )  THEN 
    411405             DO jn = 1, nptr 
    412                 hstr_adv(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     406                hstr_adv(:,jp_tem,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    413407             ENDDO 
    414408         ENDIF 
    415409         IF( ktra == jp_sal )  THEN 
    416410             DO jn = 1, nptr 
    417                 hstr_adv(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     411                hstr_adv(:,jp_sal,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    418412             ENDDO 
    419413         ENDIF 
     
    423417         IF( ktra == jp_tem )  THEN 
    424418             DO jn = 1, nptr 
    425                 hstr_ldf(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     419                hstr_ldf(:,jp_tem,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    426420             ENDDO 
    427421         ENDIF 
    428422         IF( ktra == jp_sal )  THEN 
    429423             DO jn = 1, nptr 
    430                 hstr_ldf(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     424                hstr_ldf(:,jp_sal,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    431425             ENDDO 
    432426         ENDIF 
     
    436430         IF( ktra == jp_tem )  THEN 
    437431             DO jn = 1, nptr 
    438                 hstr_eiv(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     432                hstr_eiv(:,jp_tem,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    439433             ENDDO 
    440434         ENDIF 
    441435         IF( ktra == jp_sal )  THEN 
    442436             DO jn = 1, nptr 
    443                 hstr_eiv(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     437                hstr_eiv(:,jp_sal,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    444438             ENDDO 
    445439         ENDIF 
     
    449443         IF( ktra == jp_tem )  THEN 
    450444             DO jn = 1, nptr 
    451                 hstr_vtr(:,jp_tem,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     445                hstr_vtr(:,jp_tem,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    452446             ENDDO 
    453447         ENDIF 
    454448         IF( ktra == jp_sal )  THEN 
    455449             DO jn = 1, nptr 
    456                 hstr_vtr(:,jp_sal,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     450                hstr_vtr(:,jp_sal,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) 
    457451             ENDDO 
    458452         ENDIF 
     
    486480 
    487481 
    488    FUNCTION ptr_sj_3d( pva, pmsk )   RESULT ( p_fval ) 
     482   FUNCTION ptr_sj_3d( pvflx, pmsk )   RESULT ( p_fval ) 
    489483      !!---------------------------------------------------------------------- 
    490484      !!                    ***  ROUTINE ptr_sj_3d  *** 
     
    492486      !! ** Purpose :   i-k sum computation of a j-flux array 
    493487      !! 
    494       !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i). 
    495       !!              pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
    496       !! 
    497       !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    498       !!---------------------------------------------------------------------- 
    499       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk)  ::   pva   ! mask flux array at V-point 
     488      !! ** Method  : - i-k sum of pvflx using the interior 2D vmask (vmask_i). 
     489      !!              pvflx is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
     490      !! 
     491      !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx 
     492      !!---------------------------------------------------------------------- 
     493      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk)  ::   pvflx  ! mask flux array at V-point 
    500494      REAL(wp), INTENT(in), DIMENSION(jpi,jpj)      ::   pmsk   ! Optional 2D basin mask 
    501495      ! 
     
    509503      ijpj = jpj 
    510504      p_fval(:) = 0._wp 
    511       DO jk = 1, jpkm1 
    512          DO jj = 2, jpjm1 
    513             DO ji = fs_2, fs_jpim1   ! Vector opt. 
    514                p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj) 
    515             END DO 
    516          END DO 
    517       END DO 
     505      DO_3D_00_00( 1, jpkm1 ) 
     506         p_fval(jj) = p_fval(jj) + pvflx(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj) 
     507      END_3D 
    518508#if defined key_mpp_mpi 
    519509      CALL mpp_sum( 'diaptr', p_fval, ijpj, ncomm_znl) 
     
    523513 
    524514 
    525    FUNCTION ptr_sj_2d( pva, pmsk )   RESULT ( p_fval ) 
     515   FUNCTION ptr_sj_2d( pvflx, pmsk )   RESULT ( p_fval ) 
    526516      !!---------------------------------------------------------------------- 
    527517      !!                    ***  ROUTINE ptr_sj_2d  *** 
    528518      !! 
    529       !! ** Purpose :   "zonal" and vertical sum computation of a i-flux array 
    530       !! 
    531       !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i). 
    532       !!      pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
    533       !! 
    534       !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    535       !!---------------------------------------------------------------------- 
    536       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pva   ! mask flux array at V-point 
     519      !! ** Purpose :   "zonal" and vertical sum computation of a j-flux array 
     520      !! 
     521      !! ** Method  : - i-k sum of pvflx using the interior 2D vmask (vmask_i). 
     522      !!      pvflx is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
     523      !! 
     524      !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx 
     525      !!---------------------------------------------------------------------- 
     526      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pvflx  ! mask flux array at V-point 
    537527      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pmsk   ! Optional 2D basin mask 
    538528      ! 
     
    546536      ijpj = jpj 
    547537      p_fval(:) = 0._wp 
    548       DO jj = 2, jpjm1 
    549          DO ji = fs_2, fs_jpim1   ! Vector opt. 
    550             p_fval(jj) = p_fval(jj) + pva(ji,jj) * pmsk(ji,jj) * tmask_i(ji,jj) 
    551          END DO 
    552       END DO 
     538      DO_2D_00_00 
     539         p_fval(jj) = p_fval(jj) + pvflx(ji,jj) * pmsk(ji,jj) * tmask_i(ji,jj) 
     540      END_2D 
    553541#if defined key_mpp_mpi 
    554542      CALL mpp_sum( 'diaptr', p_fval, ijpj, ncomm_znl ) 
     
    577565      p_fval(:,:) = 0._wp 
    578566      DO jc = 1, jpnj ! looping over all processors in j axis 
    579          DO jj = 2, jpjm1 
    580             DO ji = fs_2, fs_jpim1   ! Vector opt. 
    581                p_fval(ji,jj) = p_fval(ji,jj-1) + pva(ji,jj) * tmask_i(ji,jj) 
    582             END DO 
    583          END DO 
     567         DO_2D_00_00 
     568            p_fval(ji,jj) = p_fval(ji,jj-1) + pva(ji,jj) * tmask_i(ji,jj) 
     569         END_2D 
    584570         CALL lbc_lnk( 'diaptr', p_fval, 'U', -1. ) 
    585571      END DO 
     
    595581      !! ** Purpose :   i-sum computation of an array 
    596582      !! 
    597       !! ** Method  : - i-sum of pva using the interior 2D vmask (vmask_i). 
    598       !! 
    599       !! ** Action  : - p_fval: i-mean poleward flux of pva 
     583      !! ** Method  : - i-sum of field using the interior 2D vmask (pmsk). 
     584      !! 
     585      !! ** Action  : - p_fval: i-sum of masked field 
    600586      !!---------------------------------------------------------------------- 
    601587      !! 
     
    618604      p_fval(:,:) = 0._wp 
    619605      ! 
    620       DO jk = 1, jpkm1 
    621          DO jj = 2, jpjm1 
    622             DO ji = fs_2, fs_jpim1   ! Vector opt. 
    623                p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj) 
    624             END DO 
    625          END DO 
    626       END DO 
     606      DO_3D_00_00( 1, jpkm1 ) 
     607         p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * pmsk(ji,jj) * tmask_i(ji,jj) 
     608      END_3D 
    627609      ! 
    628610#if defined key_mpp_mpi 
  • NEMO/trunk/src/OCE/DIA/diawri.F90

    r12206 r12377  
    2626   !!---------------------------------------------------------------------- 
    2727   USE oce            ! ocean dynamics and tracers  
     28   USE isf_oce 
     29   USE isfcpl 
     30   USE abl            ! abl variables in case ln_abl = .true. 
    2831   USE dom_oce        ! ocean space and time domain 
    2932   USE phycst         ! physical constants 
     
    5659   USE lib_mpp         ! MPP library 
    5760   USE timing          ! preformance summary 
    58    USE diurnal_bulk    ! diurnal warm layer 
    59    USE cool_skin       ! Cool skin 
     61   USE diu_bulk        ! diurnal warm layer 
     62   USE diu_coolskin    ! Cool skin 
    6063 
    6164   IMPLICIT NONE 
     
    6568   PUBLIC   dia_wri_state 
    6669   PUBLIC   dia_wri_alloc           ! Called by nemogcm module 
    67  
     70#if ! defined key_iomput    
     71   PUBLIC   dia_wri_alloc_abl       ! Called by sbcabl  module (if ln_abl = .true.) 
     72#endif 
    6873   INTEGER ::   nid_T, nz_T, nh_T, ndim_T, ndim_hT   ! grid_T file 
    6974   INTEGER ::          nb_T              , ndim_bT   ! grid_T file 
     
    7176   INTEGER ::   nid_V, nz_V, nh_V, ndim_V, ndim_hV   ! grid_V file 
    7277   INTEGER ::   nid_W, nz_W, nh_W                    ! grid_W file 
     78   INTEGER ::   nid_A, nz_A, nh_A, ndim_A, ndim_hA   ! grid_ABL file    
    7379   INTEGER ::   ndex(1)                              ! ??? 
    7480   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_hT, ndex_hU, ndex_hV 
     81   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_hA, ndex_A ! ABL 
    7582   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_T, ndex_U, ndex_V 
    7683   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: ndex_bT 
    7784 
    7885   !! * Substitutions 
    79 #  include "vectopt_loop_substitute.h90" 
     86#  include "do_loop_substitute.h90" 
    8087   !!---------------------------------------------------------------------- 
    8188   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    96103 
    97104    
    98    SUBROUTINE dia_wri( kt ) 
     105   SUBROUTINE dia_wri( kt, Kmm ) 
    99106      !!--------------------------------------------------------------------- 
    100107      !!                  ***  ROUTINE dia_wri  *** 
     
    106113      !!---------------------------------------------------------------------- 
    107114      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
     115      INTEGER, INTENT( in ) ::   Kmm     ! ocean time level index 
    108116      !! 
    109117      INTEGER ::   ji, jj, jk       ! dummy loop indices 
     
    119127      ! Output the initial state and forcings 
    120128      IF( ninist == 1 ) THEN                        
    121          CALL dia_wri_state( 'output.init' ) 
     129         CALL dia_wri_state( Kmm, 'output.init' ) 
    122130         ninist = 0 
    123131      ENDIF 
     
    128136      CALL iom_put("e3v_0", e3v_0(:,:,:) ) 
    129137      ! 
    130       CALL iom_put( "e3t" , e3t_n(:,:,:) ) 
    131       CALL iom_put( "e3u" , e3u_n(:,:,:) ) 
    132       CALL iom_put( "e3v" , e3v_n(:,:,:) ) 
    133       CALL iom_put( "e3w" , e3w_n(:,:,:) ) 
     138      CALL iom_put( "e3t" , e3t(:,:,:,Kmm) ) 
     139      CALL iom_put( "e3u" , e3u(:,:,:,Kmm) ) 
     140      CALL iom_put( "e3v" , e3v(:,:,:,Kmm) ) 
     141      CALL iom_put( "e3w" , e3w(:,:,:,Kmm) ) 
    134142      IF( iom_use("e3tdef") )   & 
    135          CALL iom_put( "e3tdef"  , ( ( e3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 ) 
     143         CALL iom_put( "e3tdef"  , ( ( e3t(:,:,:,Kmm) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 ) 
    136144 
    137145      IF( ll_wd ) THEN 
    138          CALL iom_put( "ssh" , (sshn+ssh_ref)*tmask(:,:,1) )   ! sea surface height (brought back to the reference used for wetting and drying) 
     146         CALL iom_put( "ssh" , (ssh(:,:,Kmm)+ssh_ref)*tmask(:,:,1) )   ! sea surface height (brought back to the reference used for wetting and drying) 
    139147      ELSE 
    140          CALL iom_put( "ssh" , sshn )              ! sea surface height 
     148         CALL iom_put( "ssh" , ssh(:,:,Kmm) )              ! sea surface height 
    141149      ENDIF 
    142150 
    143151      IF( iom_use("wetdep") )   &                  ! wet depth 
    144          CALL iom_put( "wetdep" , ht_0(:,:) + sshn(:,:) ) 
     152         CALL iom_put( "wetdep" , ht_0(:,:) + ssh(:,:,Kmm) ) 
    145153       
    146       CALL iom_put( "toce", tsn(:,:,:,jp_tem) )    ! 3D temperature 
    147       CALL iom_put(  "sst", tsn(:,:,1,jp_tem) )    ! surface temperature 
     154      CALL iom_put( "toce", ts(:,:,:,jp_tem,Kmm) )    ! 3D temperature 
     155      CALL iom_put(  "sst", ts(:,:,1,jp_tem,Kmm) )    ! surface temperature 
    148156      IF ( iom_use("sbt") ) THEN 
    149          DO jj = 1, jpj 
    150             DO ji = 1, jpi 
    151                ikbot = mbkt(ji,jj) 
    152                z2d(ji,jj) = tsn(ji,jj,ikbot,jp_tem) 
    153             END DO 
    154          END DO 
     157         DO_2D_11_11 
     158            ikbot = mbkt(ji,jj) 
     159            z2d(ji,jj) = ts(ji,jj,ikbot,jp_tem,Kmm) 
     160         END_2D 
    155161         CALL iom_put( "sbt", z2d )                ! bottom temperature 
    156162      ENDIF 
    157163       
    158       CALL iom_put( "soce", tsn(:,:,:,jp_sal) )    ! 3D salinity 
    159       CALL iom_put(  "sss", tsn(:,:,1,jp_sal) )    ! surface salinity 
     164      CALL iom_put( "soce", ts(:,:,:,jp_sal,Kmm) )    ! 3D salinity 
     165      CALL iom_put(  "sss", ts(:,:,1,jp_sal,Kmm) )    ! surface salinity 
    160166      IF ( iom_use("sbs") ) THEN 
    161          DO jj = 1, jpj 
    162             DO ji = 1, jpi 
    163                ikbot = mbkt(ji,jj) 
    164                z2d(ji,jj) = tsn(ji,jj,ikbot,jp_sal) 
    165             END DO 
    166          END DO 
     167         DO_2D_11_11 
     168            ikbot = mbkt(ji,jj) 
     169            z2d(ji,jj) = ts(ji,jj,ikbot,jp_sal,Kmm) 
     170         END_2D 
    167171         CALL iom_put( "sbs", z2d )                ! bottom salinity 
    168172      ENDIF 
     
    171175         zztmp = rau0 * 0.25 
    172176         z2d(:,:) = 0._wp 
    173          DO jj = 2, jpjm1 
    174             DO ji = fs_2, fs_jpim1   ! vector opt. 
    175                zztmp2 = (  ( rCdU_bot(ji+1,jj)+rCdU_bot(ji  ,jj) ) * un(ji  ,jj,mbku(ji  ,jj))  )**2   & 
    176                   &   + (  ( rCdU_bot(ji  ,jj)+rCdU_bot(ji-1,jj) ) * un(ji-1,jj,mbku(ji-1,jj))  )**2   & 
    177                   &   + (  ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj  ) ) * vn(ji,jj  ,mbkv(ji,jj  ))  )**2   & 
    178                   &   + (  ( rCdU_bot(ji,jj  )+rCdU_bot(ji,jj-1) ) * vn(ji,jj-1,mbkv(ji,jj-1))  )**2 
    179                z2d(ji,jj) = zztmp * SQRT( zztmp2 ) * tmask(ji,jj,1)  
    180                ! 
    181             END DO 
    182          END DO 
     177         DO_2D_00_00 
     178            zztmp2 = (  ( rCdU_bot(ji+1,jj)+rCdU_bot(ji  ,jj) ) * uu(ji  ,jj,mbku(ji  ,jj),Kmm)  )**2   & 
     179               &   + (  ( rCdU_bot(ji  ,jj)+rCdU_bot(ji-1,jj) ) * uu(ji-1,jj,mbku(ji-1,jj),Kmm)  )**2   & 
     180               &   + (  ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj  ) ) * vv(ji,jj  ,mbkv(ji,jj  ),Kmm)  )**2   & 
     181               &   + (  ( rCdU_bot(ji,jj  )+rCdU_bot(ji,jj-1) ) * vv(ji,jj-1,mbkv(ji,jj-1),Kmm)  )**2 
     182            z2d(ji,jj) = zztmp * SQRT( zztmp2 ) * tmask(ji,jj,1)  
     183            ! 
     184         END_2D 
    183185         CALL lbc_lnk( 'diawri', z2d, 'T', 1. ) 
    184186         CALL iom_put( "taubot", z2d )            
    185187      ENDIF 
    186188          
    187       CALL iom_put( "uoce", un(:,:,:) )            ! 3D i-current 
    188       CALL iom_put(  "ssu", un(:,:,1) )            ! surface i-current 
     189      CALL iom_put( "uoce", uu(:,:,:,Kmm) )            ! 3D i-current 
     190      CALL iom_put(  "ssu", uu(:,:,1,Kmm) )            ! surface i-current 
    189191      IF ( iom_use("sbu") ) THEN 
    190          DO jj = 1, jpj 
    191             DO ji = 1, jpi 
    192                ikbot = mbku(ji,jj) 
    193                z2d(ji,jj) = un(ji,jj,ikbot) 
    194             END DO 
    195          END DO 
     192         DO_2D_11_11 
     193            ikbot = mbku(ji,jj) 
     194            z2d(ji,jj) = uu(ji,jj,ikbot,Kmm) 
     195         END_2D 
    196196         CALL iom_put( "sbu", z2d )                ! bottom i-current 
    197197      ENDIF 
    198198       
    199       CALL iom_put( "voce", vn(:,:,:) )            ! 3D j-current 
    200       CALL iom_put(  "ssv", vn(:,:,1) )            ! surface j-current 
     199      CALL iom_put( "voce", vv(:,:,:,Kmm) )            ! 3D j-current 
     200      CALL iom_put(  "ssv", vv(:,:,1,Kmm) )            ! surface j-current 
    201201      IF ( iom_use("sbv") ) THEN 
    202          DO jj = 1, jpj 
    203             DO ji = 1, jpi 
    204                ikbot = mbkv(ji,jj) 
    205                z2d(ji,jj) = vn(ji,jj,ikbot) 
    206             END DO 
    207          END DO 
     202         DO_2D_11_11 
     203            ikbot = mbkv(ji,jj) 
     204            z2d(ji,jj) = vv(ji,jj,ikbot,Kmm) 
     205         END_2D 
    208206         CALL iom_put( "sbv", z2d )                ! bottom j-current 
    209207      ENDIF 
    210208 
    211       IF( ln_zad_Aimp ) wn = wn + wi               ! Recombine explicit and implicit parts of vertical velocity for diagnostic output 
    212       ! 
    213       CALL iom_put( "woce", wn )                   ! vertical velocity 
     209      IF( ln_zad_Aimp ) ww = ww + wi               ! Recombine explicit and implicit parts of vertical velocity for diagnostic output 
     210      ! 
     211      CALL iom_put( "woce", ww )                   ! vertical velocity 
    214212      IF( iom_use('w_masstr') .OR. iom_use('w_masstr2') ) THEN   ! vertical mass transport & its square value 
    215213         ! Caution: in the VVL case, it only correponds to the baroclinic mass transport. 
    216214         z2d(:,:) = rau0 * e1e2t(:,:) 
    217215         DO jk = 1, jpk 
    218             z3d(:,:,jk) = wn(:,:,jk) * z2d(:,:) 
     216            z3d(:,:,jk) = ww(:,:,jk) * z2d(:,:) 
    219217         END DO 
    220218         CALL iom_put( "w_masstr" , z3d )   
     
    222220      ENDIF 
    223221      ! 
    224       IF( ln_zad_Aimp ) wn = wn - wi               ! Remove implicit part of vertical velocity that was added for diagnostic output 
     222      IF( ln_zad_Aimp ) ww = ww - wi               ! Remove implicit part of vertical velocity that was added for diagnostic output 
    225223 
    226224      CALL iom_put( "avt" , avt )                  ! T vert. eddy diff. coef. 
     
    232230 
    233231      IF ( iom_use("sstgrad") .OR. iom_use("sstgrad2") ) THEN 
    234          DO jj = 2, jpjm1                                    ! sst gradient 
    235             DO ji = fs_2, fs_jpim1   ! vector opt. 
    236                zztmp  = tsn(ji,jj,1,jp_tem) 
    237                zztmpx = ( tsn(ji+1,jj,1,jp_tem) - zztmp ) * r1_e1u(ji,jj) + ( zztmp - tsn(ji-1,jj  ,1,jp_tem) ) * r1_e1u(ji-1,jj) 
    238                zztmpy = ( tsn(ji,jj+1,1,jp_tem) - zztmp ) * r1_e2v(ji,jj) + ( zztmp - tsn(ji  ,jj-1,1,jp_tem) ) * r1_e2v(ji,jj-1) 
    239                z2d(ji,jj) = 0.25 * ( zztmpx * zztmpx + zztmpy * zztmpy )   & 
    240                   &              * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * umask(ji,jj-1,1) 
    241             END DO 
    242          END DO 
     232         DO_2D_00_00 
     233            zztmp  = ts(ji,jj,1,jp_tem,Kmm) 
     234            zztmpx = ( ts(ji+1,jj,1,jp_tem,Kmm) - zztmp ) * r1_e1u(ji,jj) + ( zztmp - ts(ji-1,jj  ,1,jp_tem,Kmm) ) * r1_e1u(ji-1,jj) 
     235            zztmpy = ( ts(ji,jj+1,1,jp_tem,Kmm) - zztmp ) * r1_e2v(ji,jj) + ( zztmp - ts(ji  ,jj-1,1,jp_tem,Kmm) ) * r1_e2v(ji,jj-1) 
     236            z2d(ji,jj) = 0.25 * ( zztmpx * zztmpx + zztmpy * zztmpy )   & 
     237               &              * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * umask(ji,jj-1,1) 
     238         END_2D 
    243239         CALL lbc_lnk( 'diawri', z2d, 'T', 1. ) 
    244240         CALL iom_put( "sstgrad2",  z2d )          ! square of module of sst gradient 
     
    250246      IF( iom_use("heatc") ) THEN 
    251247         z2d(:,:)  = 0._wp  
    252          DO jk = 1, jpkm1 
    253             DO jj = 1, jpj 
    254                DO ji = 1, jpi 
    255                   z2d(ji,jj) = z2d(ji,jj) + e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_tem) * tmask(ji,jj,jk) 
    256                END DO 
    257             END DO 
    258          END DO 
     248         DO_3D_11_11( 1, jpkm1 ) 
     249            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) * tmask(ji,jj,jk) 
     250         END_3D 
    259251         CALL iom_put( "heatc", rau0_rcp * z2d )   ! vertically integrated heat content (J/m2) 
    260252      ENDIF 
     
    262254      IF( iom_use("saltc") ) THEN 
    263255         z2d(:,:)  = 0._wp  
    264          DO jk = 1, jpkm1 
    265             DO jj = 1, jpj 
    266                DO ji = 1, jpi 
    267                   z2d(ji,jj) = z2d(ji,jj) + e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_sal) * tmask(ji,jj,jk) 
    268                END DO 
    269             END DO 
    270          END DO 
     256         DO_3D_11_11( 1, jpkm1 ) 
     257            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk) 
     258         END_3D 
    271259         CALL iom_put( "saltc", rau0 * z2d )          ! vertically integrated salt content (PSU*kg/m2) 
    272260      ENDIF 
     
    274262      IF ( iom_use("eken") ) THEN 
    275263         z3d(:,:,jpk) = 0._wp  
    276          DO jk = 1, jpkm1 
    277             DO jj = 2, jpjm1 
    278                DO ji = fs_2, fs_jpim1   ! vector opt. 
    279                   zztmp  = 0.25_wp * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    280                   z3d(ji,jj,jk) = zztmp * (  un(ji-1,jj,jk)**2 * e2u(ji-1,jj) * e3u_n(ji-1,jj,jk)   & 
    281                      &                     + un(ji  ,jj,jk)**2 * e2u(ji  ,jj) * e3u_n(ji  ,jj,jk)   & 
    282                      &                     + vn(ji,jj-1,jk)**2 * e1v(ji,jj-1) * e3v_n(ji,jj-1,jk)   & 
    283                      &                     + vn(ji,jj  ,jk)**2 * e1v(ji,jj  ) * e3v_n(ji,jj  ,jk)   ) 
    284                END DO 
    285             END DO 
    286          END DO 
     264         DO_3D_00_00( 1, jpkm1 ) 
     265            zztmp  = 0.25_wp * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
     266            z3d(ji,jj,jk) = zztmp * (  uu(ji-1,jj,jk,Kmm)**2 * e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm)   & 
     267               &                     + uu(ji  ,jj,jk,Kmm)**2 * e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm)   & 
     268               &                     + vv(ji,jj-1,jk,Kmm)**2 * e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm)   & 
     269               &                     + vv(ji,jj  ,jk,Kmm)**2 * e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm)   ) 
     270         END_3D 
    287271         CALL lbc_lnk( 'diawri', z3d, 'T', 1. ) 
    288272         CALL iom_put( "eken", z3d )                 ! kinetic energy 
    289273      ENDIF 
    290274      ! 
    291       CALL iom_put( "hdiv", hdivn )                  ! Horizontal divergence 
     275      CALL iom_put( "hdiv", hdiv )                  ! Horizontal divergence 
    292276      ! 
    293277      IF( iom_use("u_masstr") .OR. iom_use("u_masstr_vint") .OR. iom_use("u_heattr") .OR. iom_use("u_salttr") ) THEN 
     
    295279         z2d(:,:) = 0.e0 
    296280         DO jk = 1, jpkm1 
    297             z3d(:,:,jk) = rau0 * un(:,:,jk) * e2u(:,:) * e3u_n(:,:,jk) * umask(:,:,jk) 
     281            z3d(:,:,jk) = rau0 * uu(:,:,jk,Kmm) * e2u(:,:) * e3u(:,:,jk,Kmm) * umask(:,:,jk) 
    298282            z2d(:,:) = z2d(:,:) + z3d(:,:,jk) 
    299283         END DO 
     
    304288      IF( iom_use("u_heattr") ) THEN 
    305289         z2d(:,:) = 0._wp  
    306          DO jk = 1, jpkm1 
    307             DO jj = 2, jpjm1 
    308                DO ji = fs_2, fs_jpim1   ! vector opt. 
    309                   z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_tem) + tsn(ji+1,jj,jk,jp_tem) ) 
    310                END DO 
    311             END DO 
    312          END DO 
     290         DO_3D_00_00( 1, jpkm1 ) 
     291            z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji+1,jj,jk,jp_tem,Kmm) ) 
     292         END_3D 
    313293         CALL lbc_lnk( 'diawri', z2d, 'U', -1. ) 
    314294         CALL iom_put( "u_heattr", 0.5*rcp * z2d )    ! heat transport in i-direction 
     
    317297      IF( iom_use("u_salttr") ) THEN 
    318298         z2d(:,:) = 0.e0  
    319          DO jk = 1, jpkm1 
    320             DO jj = 2, jpjm1 
    321                DO ji = fs_2, fs_jpim1   ! vector opt. 
    322                   z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_sal) + tsn(ji+1,jj,jk,jp_sal) ) 
    323                END DO 
    324             END DO 
    325          END DO 
     299         DO_3D_00_00( 1, jpkm1 ) 
     300            z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji+1,jj,jk,jp_sal,Kmm) ) 
     301         END_3D 
    326302         CALL lbc_lnk( 'diawri', z2d, 'U', -1. ) 
    327303         CALL iom_put( "u_salttr", 0.5 * z2d )        ! heat transport in i-direction 
     
    332308         z3d(:,:,jpk) = 0.e0 
    333309         DO jk = 1, jpkm1 
    334             z3d(:,:,jk) = rau0 * vn(:,:,jk) * e1v(:,:) * e3v_n(:,:,jk) * vmask(:,:,jk) 
     310            z3d(:,:,jk) = rau0 * vv(:,:,jk,Kmm) * e1v(:,:) * e3v(:,:,jk,Kmm) * vmask(:,:,jk) 
    335311         END DO 
    336312         CALL iom_put( "v_masstr", z3d )              ! mass transport in j-direction 
     
    339315      IF( iom_use("v_heattr") ) THEN 
    340316         z2d(:,:) = 0.e0  
    341          DO jk = 1, jpkm1 
    342             DO jj = 2, jpjm1 
    343                DO ji = fs_2, fs_jpim1   ! vector opt. 
    344                   z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_tem) + tsn(ji,jj+1,jk,jp_tem) ) 
    345                END DO 
    346             END DO 
    347          END DO 
     317         DO_3D_00_00( 1, jpkm1 ) 
     318            z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji,jj+1,jk,jp_tem,Kmm) ) 
     319         END_3D 
    348320         CALL lbc_lnk( 'diawri', z2d, 'V', -1. ) 
    349321         CALL iom_put( "v_heattr", 0.5*rcp * z2d )    !  heat transport in j-direction 
     
    352324      IF( iom_use("v_salttr") ) THEN 
    353325         z2d(:,:) = 0._wp  
    354          DO jk = 1, jpkm1 
    355             DO jj = 2, jpjm1 
    356                DO ji = fs_2, fs_jpim1   ! vector opt. 
    357                   z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( tsn(ji,jj,jk,jp_sal) + tsn(ji,jj+1,jk,jp_sal) ) 
    358                END DO 
    359             END DO 
    360          END DO 
     326         DO_3D_00_00( 1, jpkm1 ) 
     327            z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji,jj+1,jk,jp_sal,Kmm) ) 
     328         END_3D 
    361329         CALL lbc_lnk( 'diawri', z2d, 'V', -1. ) 
    362330         CALL iom_put( "v_salttr", 0.5 * z2d )        !  heat transport in j-direction 
     
    365333      IF( iom_use("tosmint") ) THEN 
    366334         z2d(:,:) = 0._wp 
    367          DO jk = 1, jpkm1 
    368             DO jj = 2, jpjm1 
    369                DO ji = fs_2, fs_jpim1   ! vector opt. 
    370                   z2d(ji,jj) = z2d(ji,jj) + e3t_n(ji,jj,jk) *  tsn(ji,jj,jk,jp_tem) 
    371                END DO 
    372             END DO 
    373          END DO 
     335         DO_3D_00_00( 1, jpkm1 ) 
     336            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) *  ts(ji,jj,jk,jp_tem,Kmm) 
     337         END_3D 
    374338         CALL lbc_lnk( 'diawri', z2d, 'T', -1. ) 
    375339         CALL iom_put( "tosmint", rau0 * z2d )        ! Vertical integral of temperature 
     
    377341      IF( iom_use("somint") ) THEN 
    378342         z2d(:,:)=0._wp 
    379          DO jk = 1, jpkm1 
    380             DO jj = 2, jpjm1 
    381                DO ji = fs_2, fs_jpim1   ! vector opt. 
    382                   z2d(ji,jj) = z2d(ji,jj) + e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_sal) 
    383                END DO 
    384             END DO 
    385          END DO 
     343         DO_3D_00_00( 1, jpkm1 ) 
     344            z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) 
     345         END_3D 
    386346         CALL lbc_lnk( 'diawri', z2d, 'T', -1. ) 
    387347         CALL iom_put( "somint", rau0 * z2d )         ! Vertical integral of salinity 
     
    390350      CALL iom_put( "bn2", rn2 )                      ! Brunt-Vaisala buoyancy frequency (N^2) 
    391351      ! 
    392            
    393       IF (ln_dia25h)   CALL dia_25h( kt )             ! 25h averaging 
     352       
     353      IF (ln_dia25h)   CALL dia_25h( kt, Kmm )        ! 25h averaging 
    394354 
    395355      IF( ln_timing )   CALL timing_stop('dia_wri') 
     
    411371         &      ndex_hV(jpi*jpj) , ndex_V(jpi*jpj*jpk) , STAT=ierr(1) ) 
    412372         ! 
    413       dia_wri_alloc = MAXVAL(ierr) 
     373     dia_wri_alloc = MAXVAL(ierr) 
    414374      CALL mpp_sum( 'diawri', dia_wri_alloc ) 
    415375      ! 
    416376   END FUNCTION dia_wri_alloc 
     377  
     378   INTEGER FUNCTION dia_wri_alloc_abl() 
     379      !!---------------------------------------------------------------------- 
     380     ALLOCATE(   ndex_hA(jpi*jpj), ndex_A (jpi*jpj*jpkam1), STAT=dia_wri_alloc_abl) 
     381      CALL mpp_sum( 'diawri', dia_wri_alloc_abl ) 
     382      ! 
     383   END FUNCTION dia_wri_alloc_abl 
    417384 
    418385    
    419    SUBROUTINE dia_wri( kt ) 
     386   SUBROUTINE dia_wri( kt, Kmm ) 
    420387      !!--------------------------------------------------------------------- 
    421388      !!                  ***  ROUTINE dia_wri  *** 
     
    430397      !!---------------------------------------------------------------------- 
    431398      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     399      INTEGER, INTENT( in ) ::   Kmm  ! ocean time level index 
    432400      ! 
    433401      LOGICAL ::   ll_print = .FALSE.                        ! =T print and flush numout 
     
    437405      INTEGER  ::   ierr                                     ! error code return from allocation 
    438406      INTEGER  ::   iimi, iima, ipk, it, itmod, ijmi, ijma   ! local integers 
     407      INTEGER  ::   ipka                                     ! ABL 
    439408      INTEGER  ::   jn, ierror                               ! local integers 
    440409      REAL(wp) ::   zsto, zout, zmax, zjulian                ! local scalars 
     
    442411      REAL(wp), DIMENSION(jpi,jpj)   :: zw2d       ! 2D workspace 
    443412      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zw3d       ! 3D workspace 
     413      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zw3d_abl   ! ABL 3D workspace 
    444414      !!---------------------------------------------------------------------- 
    445415      ! 
    446416      IF( ninist == 1 ) THEN     !==  Output the initial state and forcings  ==! 
    447          CALL dia_wri_state( 'output.init' ) 
     417         CALL dia_wri_state( Kmm, 'output.init' ) 
    448418         ninist = 0 
    449419      ENDIF 
     
    475445      ijmi = 1      ;      ijma = jpj 
    476446      ipk = jpk 
     447      IF(ln_abl) ipka = jpkam1 
    477448 
    478449      ! define time axis 
     
    577548            &          "m", ipk, gdepw_1d, nz_W, "down" ) 
    578549 
     550         IF( ln_abl ) THEN  
     551         ! Define the ABL grid FILE ( nid_A ) 
     552            CALL dia_nam( clhstnam, nn_write, 'grid_ABL' ) 
     553            IF(lwp) WRITE(numout,*) " Name of NETCDF file ", clhstnam    ! filename 
     554            CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,           &  ! Horizontal grid: glamt and gphit 
     555               &          iimi, iima-iimi+1, ijmi, ijma-ijmi+1,       & 
     556               &          nit000-1, zjulian, rdt, nh_A, nid_A, domain_id=nidom, snc4chunks=snc4set ) 
     557            CALL histvert( nid_A, "ght_abl", "Vertical T levels",      &  ! Vertical grid: gdept 
     558               &           "m", ipka, ght_abl(2:jpka), nz_A, "up" ) 
     559            !                                                            ! Index of ocean points 
     560         ALLOCATE( zw3d_abl(jpi,jpj,ipka) )  
     561         zw3d_abl(:,:,:) = 1._wp  
     562         CALL wheneq( jpi*jpj*ipka, zw3d_abl, 1, 1., ndex_A , ndim_A  )      ! volume 
     563            CALL wheneq( jpi*jpj     , zw3d_abl, 1, 1., ndex_hA, ndim_hA )      ! surface 
     564         DEALLOCATE(zw3d_abl) 
     565         ENDIF 
    579566 
    580567         ! Declare all the output fields as NETCDF variables 
     
    586573            &          jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout ) 
    587574         IF(  .NOT.ln_linssh  ) THEN 
    588             CALL histdef( nid_T, "vovvle3t", "Level thickness"                    , "m"      ,&  ! e3t_n 
     575            CALL histdef( nid_T, "vovvle3t", "Level thickness"                    , "m"      ,&  ! e3t(:,:,:,Kmm) 
    589576            &             jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout ) 
    590             CALL histdef( nid_T, "vovvldep", "T point depth"                      , "m"      ,&  ! e3t_n 
     577            CALL histdef( nid_T, "vovvldep", "T point depth"                      , "m"      ,&  ! e3t(:,:,:,Kmm) 
    591578            &             jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout ) 
    592             CALL histdef( nid_T, "vovvldef", "Squared level deformation"          , "%^2"    ,&  ! e3t_n 
     579            CALL histdef( nid_T, "vovvldef", "Squared level deformation"          , "%^2"    ,&  ! e3t(:,:,:,Kmm) 
    593580            &             jpi, jpj, nh_T, ipk, 1, ipk, nz_T, 32, clop, zsto, zout ) 
    594581         ENDIF 
     
    607594            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    608595         IF(  ln_linssh  ) THEN 
    609             CALL histdef( nid_T, "sosst_cd", "Concentration/Dilution term on temperature"     &  ! emp * tsn(:,:,1,jp_tem) 
     596            CALL histdef( nid_T, "sosst_cd", "Concentration/Dilution term on temperature"     &  ! emp * ts(:,:,1,jp_tem,Kmm) 
    610597            &                                                                  , "KgC/m2/s",  &  ! sosst_cd 
    611598            &             jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    612             CALL histdef( nid_T, "sosss_cd", "Concentration/Dilution term on salinity"        &  ! emp * tsn(:,:,1,jp_sal) 
     599            CALL histdef( nid_T, "sosss_cd", "Concentration/Dilution term on salinity"        &  ! emp * ts(:,:,1,jp_sal,Kmm) 
    613600            &                                                                  , "KgPSU/m2/s",&  ! sosss_cd 
    614601            &             jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
     
    626613         CALL histdef( nid_T, "sowindsp", "wind speed at 10m"                  , "m/s"    ,   &  ! wndm 
    627614            &          jpi, jpj, nh_T, 1  , 1, 1  , -99 , 32, clop, zsto, zout ) 
    628 ! 
     615         ! 
     616         IF( ln_abl ) THEN 
     617            CALL histdef( nid_A, "t_abl", "Potential Temperature"     , "K"        ,       &  ! t_abl 
     618               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout ) 
     619            CALL histdef( nid_A, "q_abl", "Humidity"                  , "kg/kg"    ,       &  ! q_abl 
     620               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout )  
     621            CALL histdef( nid_A, "u_abl", "Atmospheric U-wind   "     , "m/s"        ,     &  ! u_abl 
     622               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout ) 
     623            CALL histdef( nid_A, "v_abl", "Atmospheric V-wind   "     , "m/s"    ,         &  ! v_abl 
     624               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout )  
     625            CALL histdef( nid_A, "tke_abl", "Atmospheric TKE   "     , "m2/s2"    ,        &  ! tke_abl 
     626               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout )  
     627            CALL histdef( nid_A, "avm_abl", "Atmospheric turbulent viscosity", "m2/s"   ,  &  ! avm_abl 
     628               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout )  
     629            CALL histdef( nid_A, "avt_abl", "Atmospheric turbulent diffusivity", "m2/s2",  &  ! avt_abl 
     630               &          jpi, jpj, nh_A, ipka, 1, ipka, nz_A, 32, clop, zsto, zout )  
     631            CALL histdef( nid_A, "pblh", "Atmospheric boundary layer height "  , "m",      &  ! pblh 
     632               &          jpi, jpj, nh_A,  1  , 1, 1   , -99 , 32, clop, zsto, zout )                  
     633#if defined key_si3 
     634            CALL histdef( nid_A, "oce_frac", "Fraction of open ocean"  , " ",      &  ! ato_i 
     635               &          jpi, jpj, nh_A,  1  , 1, 1   , -99 , 32, clop, zsto, zout ) 
     636#endif 
     637            CALL histend( nid_A, snc4chunks=snc4set ) 
     638         ENDIF 
     639         ! 
    629640         IF( ln_icebergs ) THEN 
    630641            CALL histdef( nid_T, "calving"             , "calving mass input"                       , "kg/s"   , & 
     
    686697 
    687698         !                                                                                      !!! nid_U : 3D 
    688          CALL histdef( nid_U, "vozocrtx", "Zonal Current"                      , "m/s"    ,   &  ! un 
     699         CALL histdef( nid_U, "vozocrtx", "Zonal Current"                      , "m/s"    ,   &  ! uu(:,:,:,Kmm) 
    689700            &          jpi, jpj, nh_U, ipk, 1, ipk, nz_U, 32, clop, zsto, zout ) 
    690701         IF( ln_wave .AND. ln_sdw) THEN 
     
    699710 
    700711         !                                                                                      !!! nid_V : 3D 
    701          CALL histdef( nid_V, "vomecrty", "Meridional Current"                 , "m/s"    ,   &  ! vn 
     712         CALL histdef( nid_V, "vomecrty", "Meridional Current"                 , "m/s"    ,   &  ! vv(:,:,:,Kmm) 
    702713            &          jpi, jpj, nh_V, ipk, 1, ipk, nz_V, 32, clop, zsto, zout ) 
    703714         IF( ln_wave .AND. ln_sdw) THEN 
     
    712723 
    713724         !                                                                                      !!! nid_W : 3D 
    714          CALL histdef( nid_W, "vovecrtz", "Vertical Velocity"                  , "m/s"    ,   &  ! wn 
     725         CALL histdef( nid_W, "vovecrtz", "Vertical Velocity"                  , "m/s"    ,   &  ! ww 
    715726            &          jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 
    716727         CALL histdef( nid_W, "votkeavt", "Vertical Eddy Diffusivity"          , "m2/s"   ,   &  ! avt 
     
    750761 
    751762      IF( .NOT.ln_linssh ) THEN 
    752          CALL histwrite( nid_T, "votemper", it, tsn(:,:,:,jp_tem) * e3t_n(:,:,:) , ndim_T , ndex_T  )   ! heat content 
    753          CALL histwrite( nid_T, "vosaline", it, tsn(:,:,:,jp_sal) * e3t_n(:,:,:) , ndim_T , ndex_T  )   ! salt content 
    754          CALL histwrite( nid_T, "sosstsst", it, tsn(:,:,1,jp_tem) * e3t_n(:,:,1) , ndim_hT, ndex_hT )   ! sea surface heat content 
    755          CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal) * e3t_n(:,:,1) , ndim_hT, ndex_hT )   ! sea surface salinity content 
     763         CALL histwrite( nid_T, "votemper", it, ts(:,:,:,jp_tem,Kmm) * e3t(:,:,:,Kmm) , ndim_T , ndex_T  )   ! heat content 
     764         CALL histwrite( nid_T, "vosaline", it, ts(:,:,:,jp_sal,Kmm) * e3t(:,:,:,Kmm) , ndim_T , ndex_T  )   ! salt content 
     765         CALL histwrite( nid_T, "sosstsst", it, ts(:,:,1,jp_tem,Kmm) * e3t(:,:,1,Kmm) , ndim_hT, ndex_hT )   ! sea surface heat content 
     766         CALL histwrite( nid_T, "sosaline", it, ts(:,:,1,jp_sal,Kmm) * e3t(:,:,1,Kmm) , ndim_hT, ndex_hT )   ! sea surface salinity content 
    756767      ELSE 
    757          CALL histwrite( nid_T, "votemper", it, tsn(:,:,:,jp_tem) , ndim_T , ndex_T  )   ! temperature 
    758          CALL histwrite( nid_T, "vosaline", it, tsn(:,:,:,jp_sal) , ndim_T , ndex_T  )   ! salinity 
    759          CALL histwrite( nid_T, "sosstsst", it, tsn(:,:,1,jp_tem) , ndim_hT, ndex_hT )   ! sea surface temperature 
    760          CALL histwrite( nid_T, "sosaline", it, tsn(:,:,1,jp_sal) , ndim_hT, ndex_hT )   ! sea surface salinity 
     768         CALL histwrite( nid_T, "votemper", it, ts(:,:,:,jp_tem,Kmm) , ndim_T , ndex_T  )   ! temperature 
     769         CALL histwrite( nid_T, "vosaline", it, ts(:,:,:,jp_sal,Kmm) , ndim_T , ndex_T  )   ! salinity 
     770         CALL histwrite( nid_T, "sosstsst", it, ts(:,:,1,jp_tem,Kmm) , ndim_hT, ndex_hT )   ! sea surface temperature 
     771         CALL histwrite( nid_T, "sosaline", it, ts(:,:,1,jp_sal,Kmm) , ndim_hT, ndex_hT )   ! sea surface salinity 
    761772      ENDIF 
    762773      IF( .NOT.ln_linssh ) THEN 
    763          zw3d(:,:,:) = ( ( e3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 
    764          CALL histwrite( nid_T, "vovvle3t", it, e3t_n (:,:,:) , ndim_T , ndex_T  )   ! level thickness 
    765          CALL histwrite( nid_T, "vovvldep", it, gdept_n(:,:,:) , ndim_T , ndex_T  )   ! t-point depth 
     774         zw3d(:,:,:) = ( ( e3t(:,:,:,Kmm) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 
     775         CALL histwrite( nid_T, "vovvle3t", it, e3t (:,:,:,Kmm) , ndim_T , ndex_T  )   ! level thickness 
     776         CALL histwrite( nid_T, "vovvldep", it, gdept(:,:,:,Kmm) , ndim_T , ndex_T  )   ! t-point depth 
    766777         CALL histwrite( nid_T, "vovvldef", it, zw3d             , ndim_T , ndex_T  )   ! level thickness deformation 
    767778      ENDIF 
    768       CALL histwrite( nid_T, "sossheig", it, sshn          , ndim_hT, ndex_hT )   ! sea surface height 
     779      CALL histwrite( nid_T, "sossheig", it, ssh(:,:,Kmm)          , ndim_hT, ndex_hT )   ! sea surface height 
    769780      CALL histwrite( nid_T, "sowaflup", it, ( emp-rnf )   , ndim_hT, ndex_hT )   ! upward water flux 
    770781      CALL histwrite( nid_T, "sorunoff", it, rnf           , ndim_hT, ndex_hT )   ! river runoffs 
     
    773784                                                                                  ! in linear free surface case) 
    774785      IF( ln_linssh ) THEN 
    775          zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_tem) 
     786         zw2d(:,:) = emp (:,:) * ts(:,:,1,jp_tem,Kmm) 
    776787         CALL histwrite( nid_T, "sosst_cd", it, zw2d, ndim_hT, ndex_hT )          ! c/d term on sst 
    777          zw2d(:,:) = emp (:,:) * tsn(:,:,1,jp_sal) 
     788         zw2d(:,:) = emp (:,:) * ts(:,:,1,jp_sal,Kmm) 
    778789         CALL histwrite( nid_T, "sosss_cd", it, zw2d, ndim_hT, ndex_hT )          ! c/d term on sss 
    779790      ENDIF 
     
    784795      CALL histwrite( nid_T, "soicecov", it, fr_i          , ndim_hT, ndex_hT )   ! ice fraction    
    785796      CALL histwrite( nid_T, "sowindsp", it, wndm          , ndim_hT, ndex_hT )   ! wind speed    
    786 ! 
     797      ! 
     798      IF( ln_abl ) THEN  
     799         ALLOCATE( zw3d_abl(jpi,jpj,jpka) ) 
     800         IF( ln_mskland )   THEN  
     801            DO jk=1,jpka 
     802               zw3d_abl(:,:,jk) = tmask(:,:,1) 
     803            END DO        
     804         ELSE 
     805            zw3d_abl(:,:,:) = 1._wp      
     806         ENDIF        
     807         CALL histwrite( nid_A,  "pblh"   , it, pblh(:,:)                  *zw3d_abl(:,:,1     ), ndim_hA, ndex_hA )   ! pblh  
     808         CALL histwrite( nid_A,  "u_abl"  , it, u_abl   (:,:,2:jpka,nt_n  )*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! u_abl 
     809         CALL histwrite( nid_A,  "v_abl"  , it, v_abl   (:,:,2:jpka,nt_n  )*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! v_abl 
     810         CALL histwrite( nid_A,  "t_abl"  , it, tq_abl  (:,:,2:jpka,nt_n,1)*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! t_abl 
     811         CALL histwrite( nid_A,  "q_abl"  , it, tq_abl  (:,:,2:jpka,nt_n,2)*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! q_abl        
     812         CALL histwrite( nid_A,  "tke_abl", it, tke_abl (:,:,2:jpka,nt_n  )*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! tke_abl 
     813         CALL histwrite( nid_A,  "avm_abl", it, avm_abl (:,:,2:jpka       )*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! avm_abl 
     814         CALL histwrite( nid_A,  "avt_abl", it, avt_abl (:,:,2:jpka       )*zw3d_abl(:,:,2:jpka), ndim_A , ndex_A  )   ! avt_abl  
     815#if defined key_si3 
     816         CALL histwrite( nid_A,  "oce_frac"   , it, ato_i(:,:)                                  , ndim_hA, ndex_hA )   ! ato_i 
     817#endif 
     818         DEALLOCATE(zw3d_abl) 
     819      ENDIF 
     820      ! 
    787821      IF( ln_icebergs ) THEN 
    788822         ! 
     
    811845         CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping 
    812846         CALL histwrite( nid_T, "sowafldp", it, erp           , ndim_hT, ndex_hT )   ! freshwater flux damping 
    813          zw2d(:,:) = erp(:,:) * tsn(:,:,1,jp_sal) * tmask(:,:,1) 
     847         zw2d(:,:) = erp(:,:) * ts(:,:,1,jp_sal,Kmm) * tmask(:,:,1) 
    814848         CALL histwrite( nid_T, "sosafldp", it, zw2d          , ndim_hT, ndex_hT )   ! salt flux damping 
    815849      ENDIF 
     
    824858#endif 
    825859 
    826       CALL histwrite( nid_U, "vozocrtx", it, un            , ndim_U , ndex_U )    ! i-current 
     860      CALL histwrite( nid_U, "vozocrtx", it, uu(:,:,:,Kmm)            , ndim_U , ndex_U )    ! i-current 
    827861      CALL histwrite( nid_U, "sozotaux", it, utau          , ndim_hU, ndex_hU )   ! i-wind stress 
    828862 
    829       CALL histwrite( nid_V, "vomecrty", it, vn            , ndim_V , ndex_V  )   ! j-current 
     863      CALL histwrite( nid_V, "vomecrty", it, vv(:,:,:,Kmm)            , ndim_V , ndex_V  )   ! j-current 
    830864      CALL histwrite( nid_V, "sometauy", it, vtau          , ndim_hV, ndex_hV )   ! j-wind stress 
    831865 
    832866      IF( ln_zad_Aimp ) THEN 
    833          CALL histwrite( nid_W, "vovecrtz", it, wn + wi     , ndim_T, ndex_T )    ! vert. current 
     867         CALL histwrite( nid_W, "vovecrtz", it, ww + wi     , ndim_T, ndex_T )    ! vert. current 
    834868      ELSE 
    835          CALL histwrite( nid_W, "vovecrtz", it, wn          , ndim_T, ndex_T )    ! vert. current 
     869         CALL histwrite( nid_W, "vovecrtz", it, ww          , ndim_T, ndex_T )    ! vert. current 
    836870      ENDIF 
    837871      CALL histwrite( nid_W, "votkeavt", it, avt            , ndim_T, ndex_T )    ! T vert. eddy diff. coef. 
     
    854888         CALL histclo( nid_V ) 
    855889         CALL histclo( nid_W ) 
     890         IF(ln_abl) CALL histclo( nid_A ) 
    856891      ENDIF 
    857892      ! 
     
    861896#endif 
    862897 
    863    SUBROUTINE dia_wri_state( cdfile_name ) 
     898   SUBROUTINE dia_wri_state( Kmm, cdfile_name ) 
    864899      !!--------------------------------------------------------------------- 
    865900      !!                 ***  ROUTINE dia_wri_state  *** 
     
    874909      !!      File 'output.abort.nc' is created in case of abnormal job end 
    875910      !!---------------------------------------------------------------------- 
     911      INTEGER           , INTENT( in ) ::   Kmm              ! time level index 
    876912      CHARACTER (len=* ), INTENT( in ) ::   cdfile_name      ! name of the file created 
    877913      !! 
    878       INTEGER :: inum 
     914      INTEGER :: inum, jk 
    879915      !!---------------------------------------------------------------------- 
    880916      !  
     
    890926#endif 
    891927 
    892       CALL iom_rstput( 0, 0, inum, 'votemper', tsn(:,:,:,jp_tem) )    ! now temperature 
    893       CALL iom_rstput( 0, 0, inum, 'vosaline', tsn(:,:,:,jp_sal) )    ! now salinity 
    894       CALL iom_rstput( 0, 0, inum, 'sossheig', sshn              )    ! sea surface height 
    895       CALL iom_rstput( 0, 0, inum, 'vozocrtx', un                )    ! now i-velocity 
    896       CALL iom_rstput( 0, 0, inum, 'vomecrty', vn                )    ! now j-velocity 
     928      CALL iom_rstput( 0, 0, inum, 'votemper', ts(:,:,:,jp_tem,Kmm) )    ! now temperature 
     929      CALL iom_rstput( 0, 0, inum, 'vosaline', ts(:,:,:,jp_sal,Kmm) )    ! now salinity 
     930      CALL iom_rstput( 0, 0, inum, 'sossheig', ssh(:,:,Kmm)              )    ! sea surface height 
     931      CALL iom_rstput( 0, 0, inum, 'vozocrtx', uu(:,:,:,Kmm)                )    ! now i-velocity 
     932      CALL iom_rstput( 0, 0, inum, 'vomecrty', vv(:,:,:,Kmm)                )    ! now j-velocity 
    897933      IF( ln_zad_Aimp ) THEN 
    898          CALL iom_rstput( 0, 0, inum, 'vovecrtz', wn + wi        )    ! now k-velocity 
     934         CALL iom_rstput( 0, 0, inum, 'vovecrtz', ww + wi        )    ! now k-velocity 
    899935      ELSE 
    900          CALL iom_rstput( 0, 0, inum, 'vovecrtz', wn             )    ! now k-velocity 
    901       ENDIF 
     936         CALL iom_rstput( 0, 0, inum, 'vovecrtz', ww             )    ! now k-velocity 
     937      ENDIF 
     938      CALL iom_rstput( 0, 0, inum, 'risfdep', risfdep            )    ! now k-velocity 
     939      CALL iom_rstput( 0, 0, inum, 'ht'     , ht                 )    ! now water column height 
     940 
     941      IF ( ln_isf ) THEN 
     942         IF (ln_isfcav_mlt) THEN 
     943            CALL iom_rstput( 0, 0, inum, 'fwfisf_cav', fwfisf_cav          )    ! now k-velocity 
     944            CALL iom_rstput( 0, 0, inum, 'rhisf_cav_tbl', rhisf_tbl_cav    )    ! now k-velocity 
     945            CALL iom_rstput( 0, 0, inum, 'rfrac_cav_tbl', rfrac_tbl_cav    )    ! now k-velocity 
     946            CALL iom_rstput( 0, 0, inum, 'misfkb_cav', REAL(misfkb_cav,8)    )    ! now k-velocity 
     947            CALL iom_rstput( 0, 0, inum, 'misfkt_cav', REAL(misfkt_cav,8)    )    ! now k-velocity 
     948            CALL iom_rstput( 0, 0, inum, 'mskisf_cav', REAL(mskisf_cav,8), ktype = jp_i1 ) 
     949         END IF 
     950         IF (ln_isfpar_mlt) THEN 
     951            CALL iom_rstput( 0, 0, inum, 'isfmsk_par', REAL(mskisf_par,8)  )    ! now k-velocity 
     952            CALL iom_rstput( 0, 0, inum, 'fwfisf_par', fwfisf_par          )    ! now k-velocity 
     953            CALL iom_rstput( 0, 0, inum, 'rhisf_par_tbl', rhisf_tbl_par    )    ! now k-velocity 
     954            CALL iom_rstput( 0, 0, inum, 'rfrac_par_tbl', rfrac_tbl_par    )    ! now k-velocity 
     955            CALL iom_rstput( 0, 0, inum, 'misfkb_par', REAL(misfkb_par,8)    )    ! now k-velocity 
     956            CALL iom_rstput( 0, 0, inum, 'misfkt_par', REAL(misfkt_par,8)    )    ! now k-velocity 
     957            CALL iom_rstput( 0, 0, inum, 'mskisf_par', REAL(mskisf_par,8), ktype = jp_i1 ) 
     958         END IF 
     959      END IF 
     960 
    902961      IF( ALLOCATED(ahtu) ) THEN 
    903962         CALL iom_rstput( 0, 0, inum,  'ahtu', ahtu              )    ! aht at u-point 
     
    915974      CALL iom_rstput( 0, 0, inum, 'sometauy', vtau              )    ! j-wind stress 
    916975      IF(  .NOT.ln_linssh  ) THEN              
    917          CALL iom_rstput( 0, 0, inum, 'vovvldep', gdept_n        )    !  T-cell depth  
    918          CALL iom_rstput( 0, 0, inum, 'vovvle3t', e3t_n          )    !  T-cell thickness   
     976         CALL iom_rstput( 0, 0, inum, 'vovvldep', gdept(:,:,:,Kmm)        )    !  T-cell depth  
     977         CALL iom_rstput( 0, 0, inum, 'vovvle3t', e3t(:,:,:,Kmm)          )    !  T-cell thickness   
    919978      END IF 
    920979      IF( ln_wave .AND. ln_sdw ) THEN 
     
    923982         CALL iom_rstput( 0, 0, inum, 'sdvecrtz', wsd            )    ! now StokesDrift k-velocity 
    924983      ENDIF 
     984      IF ( ln_abl ) THEN 
     985         CALL iom_rstput ( 0, 0, inum, "uz1_abl",   u_abl(:,:,2,nt_a  ) )   ! now first level i-wind 
     986         CALL iom_rstput ( 0, 0, inum, "vz1_abl",   v_abl(:,:,2,nt_a  ) )   ! now first level j-wind 
     987         CALL iom_rstput ( 0, 0, inum, "tz1_abl",  tq_abl(:,:,2,nt_a,1) )   ! now first level temperature 
     988         CALL iom_rstput ( 0, 0, inum, "qz1_abl",  tq_abl(:,:,2,nt_a,2) )   ! now first level humidity 
     989      ENDIF 
    925990  
    926991#if defined key_si3 
Note: See TracChangeset for help on using the changeset viewer.