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 2528 for trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_bilapg.F90 – NEMO

Ignore:
Timestamp:
2010-12-27T18:33:53+01:00 (13 years ago)
Author:
rblod
Message:

Update NEMOGCM from branch nemo_v3_3_beta

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_bilapg.F90

    • Property svn:eol-style deleted
    r1152 r2528  
    22   !!============================================================================== 
    33   !!                       ***  MODULE  traldf_bilapg  *** 
    4    !! Ocean active tracers:  horizontal component of the lateral tracer mixing trend 
     4   !! Ocean  tracers:  horizontal component of the lateral tracer mixing trend 
     5   !!============================================================================== 
     6   !! History : 8.0   ! 1997-07  (G. Madec)  Original code 
     7   !!   NEMO    1.0   ! 2002-08  (G. Madec)  F90: Free form and module 
     8   !!           3.3   ! 2010-06  (C. Ethe, G. Madec) Merge TRA-TRC 
    59   !!============================================================================== 
    610#if defined key_ldfslp   ||   defined key_esopa 
     
    1216   !!   ldfght         :  ??? 
    1317   !!---------------------------------------------------------------------- 
    14    !! * Modules used 
    1518   USE oce             ! ocean dynamics and tracers variables 
    1619   USE dom_oce         ! ocean space and time domain variables 
    1720   USE ldftra_oce      ! ocean active tracers: lateral physics 
    18    USE trdmod          ! ocean active tracers trends  
    19    USE trdmod_oce      ! ocean variables trends 
    2021   USE in_out_manager  ! I/O manager 
    2122   USE ldfslp          ! iso-neutral slopes available 
    2223   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    2324   USE diaptr          ! poleward transport diagnostics  
    24    USE prtctl          ! Print control 
     25   USE trc_oce         ! share passive tracers/Ocean variables 
    2526 
    2627   IMPLICIT NONE 
    2728   PRIVATE 
    2829 
    29    !! * Routine accessibility 
    30    PUBLIC tra_ldf_bilapg    ! routine called by step.F90 
     30   PUBLIC   tra_ldf_bilapg   ! routine called by step.F90 
    3131 
    3232   !! * Substitutions 
     
    3535#  include "ldfeiv_substitute.h90" 
    3636   !!---------------------------------------------------------------------- 
    37    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
    38    !! $Id$  
    39    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    40    !!---------------------------------------------------------------------- 
    41     
     37   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     38   !! $Id$ 
     39   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     40   !!---------------------------------------------------------------------- 
    4241CONTAINS 
    4342 
    44    SUBROUTINE tra_ldf_bilapg( kt ) 
     43   SUBROUTINE tra_ldf_bilapg( kt, cdtype, ptb, pta, kjpt ) 
    4544      !!---------------------------------------------------------------------- 
    4645      !!                 ***  ROUTINE tra_ldf_bilapg  *** 
    4746      !!                     
    48       !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive  
     47      !! ** Purpose :   Compute the before horizontal tracer diffusive  
    4948      !!      trend and add it to the general trend of tracer equation. 
    5049      !! 
     
    5453      !!      computed in routine inildf. 
    5554      !!         -1- compute the geopotential harmonic operator applied to 
    56       !!      (tb,sb) and multiply it by the eddy diffusivity coefficient 
    57       !!      (done by a call to ldfght routine, result in (wk1,wk2) arrays). 
     55      !!        ptb and multiply it by the eddy diffusivity coefficient 
     56      !!       (done by a call to ldfght routine, result in wk1 arrays). 
    5857      !!      Applied the domain lateral boundary conditions by call to lbc_lnk 
    5958      !!         -2- compute the geopotential harmonic operator applied to 
    60       !!      (wk1,wk2) by a second call to ldfght routine (result in (wk3,wk4) 
     59      !!      wk1 by a second call to ldfght routine (result in wk2) 
    6160      !!      arrays). 
    62       !!         -3- Add this trend to the general trend (ta,sa): 
    63       !!            (ta,sa) = (ta,sa) + (wk3,wk4) 
    64       !! 
    65       !! ** Action : - Update (ta,sa) arrays with the before geopotential  
     61      !!         -3- Add this trend to the general trend  
     62      !!            pta = pta + wk2 
     63      !! 
     64      !! ** Action : - Update pta arrays with the before geopotential  
    6665      !!               biharmonic mixing trend. 
    67       !! 
    68       !! History : 
    69       !!   8.0  !  97-07  (G. Madec)  Original code 
    70       !!   8.5  !  02-08  (G. Madec)  F90: Free form and module 
    71       !!   9.0  !  04-08  (C. Talandier) New trends organization 
    72       !!---------------------------------------------------------------------- 
    73       !! * Modules used 
    74       USE oce           , wk1 => ua,  &  ! use ua as workspace 
    75          &                wk2 => va      ! use va as workspace 
    76  
    77       !! * Arguments 
    78       INTEGER, INTENT( in ) ::   kt           ! ocean time-step index 
    79  
    80       !! * Local declarations 
    81       INTEGER ::   ji, jj, jk                 ! dummy loop indices 
    82       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
    83          wk3, wk4                ! work array used for rotated biharmonic 
    84          !                       ! operator on tracers and/or momentum 
    85       !!---------------------------------------------------------------------- 
    86  
    87       IF( kt == nit000 ) THEN 
     66      !!---------------------------------------------------------------------- 
     67      INTEGER         , INTENT(in   )                      ::   kt       ! ocean time-step index 
     68      CHARACTER(len=3), INTENT(in   )                      ::   cdtype   ! =TRA or TRC (tracer indicator) 
     69      INTEGER         , INTENT(in   )                      ::   kjpt     ! number of tracers 
     70      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb      ! before and now tracer fields 
     71      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta      ! tracer trend  
     72      !! 
     73      INTEGER ::   ji, jj, jk, jn                 ! dummy loop indices 
     74      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt) ::   wk1, wk2   ! 4D workspace 
     75      !!---------------------------------------------------------------------- 
     76 
     77      IF( kt == nit000 )  THEN 
    8878         IF(lwp) WRITE(numout,*) 
    89          IF(lwp) WRITE(numout,*) 'tra_ldf_bilapg : horizontal biharmonic operator in s-coordinate' 
     79         IF(lwp) WRITE(numout,*) 'tra_ldf_bilapg : horizontal biharmonic operator in s-coordinate on ', cdtype 
    9080         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~' 
    9181      ENDIF 
    9282 
    93       ! 1. Laplacian of (tb,sb) * aht 
     83      ! 1. Laplacian of ptb * aht 
    9484      ! -----------------------------  
    95       ! rotated harmonic operator applied to (tb,sb) 
    96       ! and multiply by aht (output in (wk1,wk2) ) 
    97  
    98       CALL ldfght ( kt, tb, sb, wk1, wk2, 1 ) 
    99  
    100  
    101       ! Lateral boundary conditions on (wk1,wk2)   (unchanged sign) 
    102       CALL lbc_lnk( wk1, 'T', 1. )   ;   CALL lbc_lnk( wk2, 'T', 1. ) 
    103  
    104       ! 2. Bilaplacian of (tb,sb) 
     85      CALL ldfght( kt, cdtype, ptb, wk1, kjpt, 1 )      ! rotated harmonic operator applied to ptb and multiply by aht  
     86      !                                                 ! output in wk1  
     87      ! 
     88      DO jn = 1, kjpt 
     89         CALL lbc_lnk( wk1(:,:,:,jn) , 'T', 1. )        ! Lateral boundary conditions on wk1   (unchanged sign) 
     90      END DO 
     91 
     92      ! 2. Bilaplacian of ptb 
    10593      ! ------------------------- 
    106       ! rotated harmonic operator applied to (wk1,wk2) 
    107       ! (output in (wk3,wk4) ) 
    108  
    109       CALL ldfght ( kt, wk1, wk2, wk3, wk4, 2 ) 
     94      CALL ldfght( kt, cdtype, wk1, wk2, kjpt, 2 )      ! rotated harmonic operator applied to wk1 ; output in wk2 
    11095 
    11196 
    11297      ! 3. Update the tracer trends                    (j-slab :   2, jpj-1) 
    11398      ! --------------------------- 
    114       !                                                ! =============== 
    115       DO jj = 2, jpjm1                                 !  Vertical slab 
    116          !                                             ! =============== 
    117          DO jk = 1, jpkm1 
    118             DO ji = 2, jpim1 
    119                ! add it to the general tracer trends 
    120                ta(ji,jj,jk) = ta(ji,jj,jk) + wk3(ji,jj,jk) 
    121                sa(ji,jj,jk) = sa(ji,jj,jk) + wk4(ji,jj,jk) 
     99      DO jn = 1, kjpt 
     100         DO jj = 2, jpjm1 
     101            DO jk = 1, jpkm1 
     102               DO ji = 2, jpim1 
     103                  ! add it to the general tracer trends 
     104                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + wk2(ji,jj,jk,jn) 
     105               END DO 
    122106            END DO 
    123107         END DO 
    124          !                                             ! =============== 
    125       END DO                                           !   End of slab 
    126       !                                                ! =============== 
    127  
     108      END DO 
     109      ! 
    128110   END SUBROUTINE tra_ldf_bilapg 
    129111 
    130112 
    131    SUBROUTINE ldfght ( kt, pt, ps, plt, pls, kaht ) 
     113   SUBROUTINE ldfght ( kt, cdtype, pt, plt, kjpt, kaht ) 
    132114      !!---------------------------------------------------------------------- 
    133115      !!                  ***  ROUTINE ldfght  *** 
    134116      !!           
    135       !! ** Purpose :   Apply a geopotential harmonic operator to (pt,ps) and  
     117      !! ** Purpose :   Apply a geopotential harmonic operator to (pt) and  
    136118      !!      multiply it by the eddy diffusivity coefficient (if kaht=1). 
    137119      !!      Routine only used in s-coordinates (l_sco=T) with bilaplacian 
     
    140122      !! 
    141123      !! ** Method  :   The harmonic operator rotated along geopotential  
    142       !!      surfaces is applied to (pt,ps) using the slopes of geopotential 
     124      !!      surfaces is applied to (pt) using the slopes of geopotential 
    143125      !!      surfaces computed in inildf routine. The result is provided in 
    144126      !!      (plt,pls) arrays. It is computed in 2 steps: 
     
    166148      !!         plt  =  1  / (e1t*e2t*e3t) { plt + dk[ zftw ] } 
    167149      !! 
    168       !! * Action : 
    169       !!      'key_trdtra' defined: the trend is saved for diagnostics. 
    170       !! 
    171       !! History : 
    172       !!   8.0  !  97-07  (G. Madec)  Original code 
    173       !!   8.5  !  02-08  (G. Madec)  F90: Free form and module 
    174       !!---------------------------------------------------------------------- 
    175       !! * Arguments 
    176       INTEGER, INTENT( in ) ::   kt           ! ocean time-step index 
    177       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in  ) ::   & 
    178          pt, ps           ! tracer fields (before t and s for 1st call 
    179       !                   ! and laplacian of these fields for 2nd call. 
    180       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) ::   & 
    181          plt, pls         ! partial harmonic operator applied to 
    182       !                   ! pt & ps components except 
    183       !                   ! second order vertical derivative term) 
    184       INTEGER, INTENT( in ) ::   & 
    185          kaht             ! =1 multiply the laplacian by the eddy diffusivity coeff. 
    186       !                   ! =2 no multiplication 
    187  
    188       !! * Local declarations 
    189       INTEGER ::   ji, jj, jk             ! dummy loop indices 
    190       REAL(wp) ::   & 
    191          zabe1, zabe2, zmku, zmkv,     &  ! temporary scalars 
    192          zbtr, ztah, zsah, ztav, zsav, & 
    193          zcof0, zcof1, zcof2,          & 
    194          zcof3, zcof4 
    195       REAL(wp), DIMENSION(jpi,jpj) ::  & 
    196          zftu, zfsu,                   &  ! workspace 
    197          zdkt, zdk1t,                  & 
    198          zdks, zdk1s 
    199       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
    200          zftv, zfsv                       ! workspace (only v components for ptr) 
    201       REAL(wp), DIMENSION(jpi,jpk) ::  & 
    202          zftw, zfsw,                   &  ! workspace 
    203          zdit, zdjt, zdj1t,            & 
    204          zdis, zdjs, zdj1s 
    205       !!---------------------------------------------------------------------- 
    206  
    207       !                               ! ********** !   ! =============== 
    208       DO jk = 1, jpkm1                ! First step !   ! Horizontal slab 
    209          !                            ! ********** !   ! =============== 
    210  
    211          ! I.1 Vertical gradient of pt and ps at level jk and jk+1 
    212          ! ------------------------------------------------------- 
    213          !     surface boundary condition: zdkt(jk=1)=zdkt(jk=2) 
    214  
    215          zdk1t(:,:) = ( pt(:,:,jk) - pt(:,:,jk+1) ) * tmask(:,:,jk+1) 
    216          zdk1s(:,:) = ( ps(:,:,jk) - ps(:,:,jk+1) ) * tmask(:,:,jk+1) 
    217  
    218          IF( jk == 1 ) THEN 
    219             zdkt(:,:) = zdk1t(:,:) 
    220             zdks(:,:) = zdk1s(:,:) 
    221          ELSE 
    222             zdkt(:,:) = ( pt(:,:,jk-1) - pt(:,:,jk) ) * tmask(:,:,jk) 
    223             zdks(:,:) = ( ps(:,:,jk-1) - ps(:,:,jk) ) * tmask(:,:,jk) 
     150      !!---------------------------------------------------------------------- 
     151      USE oce         , zftv => ua     ! use ua as workspace 
     152      !! 
     153      INTEGER         , INTENT(in )                              ::  kt      ! ocean time-step index 
     154      CHARACTER(len=3), INTENT(in )                              ::  cdtype  ! =TRA or TRC (tracer indicator)  
     155      INTEGER         , INTENT(in )                              ::  kjpt    !: dimension of  
     156      REAL(wp)        , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) ::  pt      ! tracer fields ( before for 1st call 
     157      !                                                         ! and laplacian of these fields for 2nd call.  
     158      REAL(wp)        , INTENT(out), DIMENSION(jpi,jpj,jpk,kjpt) ::  plt     !: partial harmonic operator applied to  pt  components except 
     159      !                                                             !: second order vertical derivative term   
     160      INTEGER         , INTENT(in )                              ::  kaht    !: =1 multiply the laplacian by the eddy diffusivity coeff. 
     161      !                                                             !: =2 no multiplication  
     162      !! 
     163      INTEGER ::   ji, jj, jk,jn          ! dummy loop indices 
     164      !                                   ! temporary scalars 
     165      REAL(wp) ::  zabe1, zabe2, zmku, zmkv  
     166      REAL(wp) ::  zbtr, ztah, ztav 
     167      REAL(wp) ::  zcof0, zcof1, zcof2, zcof3, zcof4 
     168      REAL(wp), DIMENSION(jpi,jpj) ::  zftu,  zdkt, zdk1t       ! workspace 
     169      REAL(wp), DIMENSION(jpi,jpk) ::  zftw, zdit, zdjt, zdj1t  !  
     170      !!---------------------------------------------------------------------- 
     171 
     172      ! 
     173      DO jn = 1, kjpt 
     174         !                               ! ********** !   ! =============== 
     175         DO jk = 1, jpkm1                ! First step !   ! Horizontal slab 
     176            !                            ! ********** !   ! =============== 
     177             
     178            ! I.1 Vertical gradient of pt and ps at level jk and jk+1 
     179            ! ------------------------------------------------------- 
     180            !     surface boundary condition: zdkt(jk=1)=zdkt(jk=2) 
     181             
     182            zdk1t(:,:) = ( pt(:,:,jk,jn) - pt(:,:,jk+1,jn) ) * tmask(:,:,jk+1) 
     183            IF( jk == 1 ) THEN 
     184               zdkt(:,:) = zdk1t(:,:) 
     185            ELSE 
     186               zdkt(:,:) = ( pt(:,:,jk-1,jn) - pt(:,:,jk,jn) ) * tmask(:,:,jk) 
     187            ENDIF 
     188 
     189 
     190            ! I.2 Horizontal fluxes 
     191            ! --------------------- 
     192             
     193            DO jj = 1, jpjm1 
     194               DO ji = 1, jpim1 
     195                  zabe1 = e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) 
     196                  zabe2 = e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) 
     197                   
     198                  zmku = 1./MAX( tmask(ji+1,jj,jk  )+tmask(ji,jj,jk+1)   & 
     199                     &          +tmask(ji+1,jj,jk+1)+tmask(ji,jj,jk  ),1. ) 
     200                  zmkv = 1./MAX( tmask(ji,jj+1,jk  )+tmask(ji,jj,jk+1)   & 
     201                     &          +tmask(ji,jj+1,jk+1)+tmask(ji,jj,jk  ),1. ) 
     202                   
     203                  zcof1 = -e2u(ji,jj) * uslp(ji,jj,jk) * zmku 
     204                  zcof2 = -e1v(ji,jj) * vslp(ji,jj,jk) * zmkv 
     205                   
     206                  zftu(ji,jj)= umask(ji,jj,jk) *   & 
     207                     &         (  zabe1 *( pt   (ji+1,jj,jk,jn) - pt(ji,jj,jk,jn) )   & 
     208                     &          + zcof1 *( zdkt (ji+1,jj) + zdk1t(ji,jj)     & 
     209                     &                    +zdk1t(ji+1,jj) + zdkt (ji,jj) )  ) 
     210                   
     211                  zftv(ji,jj,jk)= vmask(ji,jj,jk) *   & 
     212                     &         (  zabe2 *( pt(ji,jj+1,jk,jn) - pt(ji,jj,jk,jn) )   & 
     213                     &          + zcof2 *( zdkt (ji,jj+1) + zdk1t(ji,jj)     & 
     214                     &                    +zdk1t(ji,jj+1) + zdkt (ji,jj) )  )                   
     215               END DO 
     216            END DO 
     217 
     218 
     219            ! I.3 Second derivative (divergence) (not divided by the volume) 
     220            ! --------------------- 
     221             
     222            DO jj = 2 , jpjm1 
     223               DO ji = 2 , jpim1 
     224                  ztah = zftu(ji,jj) - zftu(ji-1,jj) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) 
     225                  plt(ji,jj,jk,jn) = ztah 
     226               END DO 
     227            END DO 
     228            !                                             ! =============== 
     229         END DO                                           !   End of slab 
     230         !                                                ! =============== 
     231         ! "Poleward" diffusive heat or salt transport 
     232         IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( kaht == 2 ) .AND. ( MOD( kt, nn_fptr ) == 0 ) ) THEN 
     233            IF( jn == jp_tem)   htr_ldf(:) = ptr_vj( zftv(:,:,:) ) 
     234            IF( jn == jp_sal)   str_ldf(:) = ptr_vj( zftv(:,:,:) ) 
    224235         ENDIF 
    225236 
    226  
    227          ! I.2 Horizontal fluxes 
    228          ! --------------------- 
    229  
    230          DO jj = 1, jpjm1 
    231             DO ji = 1, jpim1 
    232                zabe1 = e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) 
    233                zabe2 = e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) 
    234  
    235                zmku=1./MAX( tmask(ji+1,jj,jk  )+tmask(ji,jj,jk+1)   & 
    236                            +tmask(ji+1,jj,jk+1)+tmask(ji,jj,jk  ),1. ) 
    237                zmkv=1./MAX( tmask(ji,jj+1,jk  )+tmask(ji,jj,jk+1)   & 
    238                            +tmask(ji,jj+1,jk+1)+tmask(ji,jj,jk  ),1. ) 
    239  
    240                zcof1= -e2u(ji,jj) * uslp(ji,jj,jk) * zmku 
    241                zcof2= -e1v(ji,jj) * vslp(ji,jj,jk) * zmkv 
    242  
    243                zftu(ji,jj)= umask(ji,jj,jk) *   & 
    244                   (  zabe1 *( pt(ji+1,jj,jk) - pt(ji,jj,jk) )   & 
    245                    + zcof1 *( zdkt (ji+1,jj) + zdk1t(ji,jj)     & 
    246                              +zdk1t(ji+1,jj) + zdkt (ji,jj) )  ) 
    247  
    248                zftv(ji,jj,jk)= vmask(ji,jj,jk) *   & 
    249                   (  zabe2 *( pt(ji,jj+1,jk) - pt(ji,jj,jk) )   & 
    250                    + zcof2 *( zdkt (ji,jj+1) + zdk1t(ji,jj)     & 
    251                              +zdk1t(ji,jj+1) + zdkt (ji,jj) )  ) 
    252  
    253                zfsu(ji,jj)= umask(ji,jj,jk) *   & 
    254                   (  zabe1 *( ps(ji+1,jj,jk) - ps(ji,jj,jk) )   & 
    255                    + zcof1 *( zdks (ji+1,jj) + zdk1s(ji,jj)     & 
    256                              +zdk1s(ji+1,jj) + zdks (ji,jj) )  ) 
    257  
    258                zfsv(ji,jj,jk)= vmask(ji,jj,jk) *   & 
    259                   (  zabe2 *( ps(ji,jj+1,jk) - ps(ji,jj,jk) )   & 
    260                    + zcof2 *( zdks (ji,jj+1) + zdk1s(ji,jj)     & 
    261                              +zdk1s(ji,jj+1) + zdks (ji,jj) )  ) 
    262             END DO 
    263          END DO 
    264  
    265  
    266          ! I.3 Second derivative (divergence) (not divided by the volume) 
    267          ! --------------------- 
    268  
    269          DO jj = 2 , jpjm1 
    270             DO ji = 2 , jpim1 
    271                ztah = zftu(ji,jj) - zftu(ji-1,jj) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) 
    272                zsah = zfsu(ji,jj) - zfsu(ji-1,jj) + zfsv(ji,jj,jk) - zfsv(ji,jj-1,jk) 
    273                plt(ji,jj,jk) = ztah 
    274                pls(ji,jj,jk) = zsah 
    275             END DO 
    276          END DO 
    277          !                                             ! =============== 
    278       END DO                                           !   End of slab 
    279       !                                                ! =============== 
    280   
    281       !!but this should be done somewhere after  
    282       ! "zonal" mean diffusive heat and salt transport 
    283       IF( ln_diaptr .AND. ( kaht == 2 ) .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 
    284          pht_ldf(:) = ptr_vj( zftv(:,:,:) ) 
    285          pst_ldf(:) = ptr_vj( zfsv(:,:,:) ) 
    286       ENDIF 
    287  
    288       !                             ! ************ !   ! =============== 
    289       DO jj = 2, jpjm1              !  Second step !   ! Horizontal slab 
    290          !                          ! ************ !   ! =============== 
    291  
    292          ! II.1 horizontal tracer gradient 
    293          ! ------------------------------- 
    294  
    295          DO jk = 1, jpk 
    296             DO ji = 1, jpim1 
    297                zdit (ji,jk) = ( pt(ji+1,jj  ,jk) - pt(ji,jj  ,jk) ) * umask(ji,jj  ,jk) 
    298                zdis (ji,jk) = ( ps(ji+1,jj  ,jk) - ps(ji,jj  ,jk) ) * umask(ji,jj  ,jk) 
    299                zdjt (ji,jk) = ( pt(ji  ,jj+1,jk) - pt(ji,jj  ,jk) ) * vmask(ji,jj  ,jk) 
    300                zdjs (ji,jk) = ( ps(ji  ,jj+1,jk) - ps(ji,jj  ,jk) ) * vmask(ji,jj  ,jk) 
    301                zdj1t(ji,jk) = ( pt(ji  ,jj  ,jk) - pt(ji,jj-1,jk) ) * vmask(ji,jj-1,jk) 
    302                zdj1s(ji,jk) = ( ps(ji  ,jj  ,jk) - ps(ji,jj-1,jk) ) * vmask(ji,jj-1,jk) 
    303             END DO 
    304          END DO 
    305  
    306  
    307          ! II.2 Vertical fluxes 
    308          ! -------------------- 
    309  
    310          ! Surface and bottom vertical fluxes set to zero 
    311          zftw(:, 1 ) = 0.e0 
    312          zfsw(:, 1 ) = 0.e0 
    313          zftw(:,jpk) = 0.e0 
    314          zfsw(:,jpk) = 0.e0 
    315  
    316          ! interior (2=<jk=<jpk-1) 
    317          DO jk = 2, jpkm1 
    318             DO ji = 2, jpim1 
    319                zcof0 = e1t(ji,jj) * e2t(ji,jj) / fse3w(ji,jj,jk)   & 
    320                      * (  wslpi(ji,jj,jk) * wslpi(ji,jj,jk)        & 
    321                         + wslpj(ji,jj,jk) * wslpj(ji,jj,jk)  ) 
    322  
    323                zmku =1./MAX(  umask(ji  ,jj,jk-1)+umask(ji-1,jj,jk)   & 
    324                              +umask(ji-1,jj,jk-1)+umask(ji  ,jj,jk), 1. ) 
    325  
    326                zmkv =1./MAX(  vmask(ji,jj  ,jk-1)+vmask(ji,jj-1,jk)   & 
    327                              +vmask(ji,jj-1,jk-1)+vmask(ji,jj  ,jk), 1. ) 
    328  
    329                zcof3 = - e2t(ji,jj) * wslpi (ji,jj,jk) * zmku 
    330                zcof4 = - e1t(ji,jj) * wslpj (ji,jj,jk) * zmkv 
    331  
    332                zftw(ji,jk) = tmask(ji,jj,jk) *   & 
    333                   (  zcof0 * ( pt  (ji,jj,jk-1) - pt  (ji,jj,jk) )   & 
    334                    + zcof3 * ( zdit (ji  ,jk-1) + zdit (ji-1,jk)     & 
    335                               +zdit (ji-1,jk-1) + zdit (ji  ,jk) )   & 
    336                    + zcof4 * ( zdjt (ji  ,jk-1) + zdj1t(ji  ,jk)     & 
    337                               +zdj1t(ji  ,jk-1) + zdjt (ji  ,jk) )  ) 
    338  
    339                zfsw(ji,jk) = tmask(ji,jj,jk) *   & 
    340                   (  zcof0 * ( ps  (ji,jj,jk-1) - ps  (ji,jj,jk) )   & 
    341                    + zcof3 * ( zdis (ji  ,jk-1) + zdis (ji-1,jk)     & 
    342                               +zdis (ji-1,jk-1) + zdis (ji  ,jk) )   & 
    343                    + zcof4 * ( zdjs (ji  ,jk-1) + zdj1s(ji  ,jk)     & 
    344                               +zdj1s(ji  ,jk-1) + zdjs (ji  ,jk) )  ) 
    345             END DO 
    346          END DO 
    347  
    348  
    349          ! II.3 Divergence of vertical fluxes added to the horizontal divergence 
    350          ! --------------------------------------------------------------------- 
    351  
    352          IF( kaht == 1 ) THEN 
    353             ! multiply the laplacian by the eddy diffusivity coefficient 
    354             DO jk = 1, jpkm1 
     237         !                             ! ************ !   ! =============== 
     238         DO jj = 2, jpjm1              !  Second step !   ! Horizontal slab 
     239            !                          ! ************ !   ! =============== 
     240             
     241            ! II.1 horizontal tracer gradient 
     242            ! ------------------------------- 
     243             
     244            DO jk = 1, jpk 
     245               DO ji = 1, jpim1 
     246                  zdit (ji,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj  ,jk,jn) ) * umask(ji,jj  ,jk) 
     247                  zdjt (ji,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj  ,jk,jn) ) * vmask(ji,jj  ,jk) 
     248                  zdj1t(ji,jk) = ( pt(ji  ,jj  ,jk,jn) - pt(ji,jj-1,jk,jn) ) * vmask(ji,jj-1,jk) 
     249               END DO 
     250            END DO 
     251 
     252 
     253            ! II.2 Vertical fluxes 
     254            ! -------------------- 
     255             
     256            ! Surface and bottom vertical fluxes set to zero 
     257            zftw(:, 1 ) = 0.e0 
     258            zftw(:,jpk) = 0.e0 
     259             
     260            ! interior (2=<jk=<jpk-1) 
     261            DO jk = 2, jpkm1 
    355262               DO ji = 2, jpim1 
    356                   ! eddy coef. divided by the volume element 
    357                   zbtr = fsahtt(ji,jj,jk) / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 
    358                   ! vertical divergence 
    359                   ztav = zftw(ji,jk) - zftw(ji,jk+1) 
    360                   zsav = zfsw(ji,jk) - zfsw(ji,jk+1) 
    361                   ! harmonic operator applied to (pt,ps) and multiply by aht 
    362                   plt(ji,jj,jk) = ( plt(ji,jj,jk) + ztav ) * zbtr 
    363                   pls(ji,jj,jk) = ( pls(ji,jj,jk) + zsav ) * zbtr 
    364                END DO 
    365             END DO 
    366          ELSEIF( kaht == 2 ) THEN 
    367             ! second call, no multiplication 
    368             DO jk = 1, jpkm1 
    369                DO ji = 2, jpim1 
    370                   ! inverse of the volume element 
    371                   zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 
    372                   ! vertical divergence 
    373                   ztav = zftw(ji,jk) - zftw(ji,jk+1) 
    374                   zsav = zfsw(ji,jk) - zfsw(ji,jk+1) 
    375                   ! harmonic operator applied to (pt,ps)  
    376                   plt(ji,jj,jk) = ( plt(ji,jj,jk) + ztav ) * zbtr 
    377                   pls(ji,jj,jk) = ( pls(ji,jj,jk) + zsav ) * zbtr 
    378                END DO 
    379             END DO 
    380          ELSE 
    381             IF(lwp) WRITE(numout,*) ' ldfght: kaht= 1 or 2, here =', kaht 
    382             IF(lwp) WRITE(numout,*) '         We stop' 
    383             STOP 'ldfght' 
    384          ENDIF 
    385          !                                             ! =============== 
    386       END DO                                           !   End of slab 
    387       !                                                ! =============== 
     263                  zcof0 = e1t(ji,jj) * e2t(ji,jj) / fse3w(ji,jj,jk)   & 
     264                     &     * (  wslpi(ji,jj,jk) * wslpi(ji,jj,jk)        & 
     265                     &        + wslpj(ji,jj,jk) * wslpj(ji,jj,jk)  ) 
     266                   
     267                  zmku = 1./MAX(  umask(ji  ,jj,jk-1)+umask(ji-1,jj,jk)   & 
     268                     &           +umask(ji-1,jj,jk-1)+umask(ji  ,jj,jk), 1. ) 
     269                   
     270                  zmkv = 1./MAX(  vmask(ji,jj  ,jk-1)+vmask(ji,jj-1,jk)   & 
     271                     &           +vmask(ji,jj-1,jk-1)+vmask(ji,jj  ,jk), 1. ) 
     272                   
     273                  zcof3 = - e2t(ji,jj) * wslpi (ji,jj,jk) * zmku 
     274                  zcof4 = - e1t(ji,jj) * wslpj (ji,jj,jk) * zmkv 
     275                   
     276                  zftw(ji,jk) = tmask(ji,jj,jk) *   & 
     277                     &    (  zcof0 * ( pt   (ji,jj,jk-1,jn) - pt   (ji  ,jj,jk,jn) )   & 
     278                     &     + zcof3 * ( zdit (ji   ,jk-1   ) + zdit (ji-1,jk      )     & 
     279                     &                +zdit (ji-1 ,jk-1   ) + zdit (ji  ,jk      ) )   & 
     280                     &     + zcof4 * ( zdjt (ji   ,jk-1   ) + zdj1t(ji  ,jk)     & 
     281                     &                +zdj1t(ji   ,jk-1   ) + zdjt (ji  ,jk      ) )  )                  
     282               END DO 
     283            END DO 
     284 
     285 
     286            ! II.3 Divergence of vertical fluxes added to the horizontal divergence 
     287            ! --------------------------------------------------------------------- 
     288             
     289            IF( kaht == 1 ) THEN 
     290               ! multiply the laplacian by the eddy diffusivity coefficient 
     291               DO jk = 1, jpkm1 
     292                  DO ji = 2, jpim1 
     293                     ! eddy coef. divided by the volume element 
     294                     zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     295                     ! vertical divergence 
     296                     ztav = fsahtt(ji,jj,jk) * ( zftw(ji,jk) - zftw(ji,jk+1) ) 
     297                     ! harmonic operator applied to (pt,ps) and multiply by aht 
     298                     plt(ji,jj,jk,jn) = ( plt(ji,jj,jk,jn) + ztav ) * zbtr 
     299                  END DO 
     300               END DO 
     301            ELSEIF( kaht == 2 ) THEN 
     302               ! second call, no multiplication 
     303               DO jk = 1, jpkm1 
     304                  DO ji = 2, jpim1 
     305                     ! inverse of the volume element 
     306                     zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     307                     ! vertical divergence 
     308                     ztav = zftw(ji,jk) - zftw(ji,jk+1) 
     309                     ! harmonic operator applied to (pt,ps)  
     310                     plt(ji,jj,jk,jn) = ( plt(ji,jj,jk,jn) + ztav ) * zbtr 
     311                  END DO 
     312               END DO 
     313            ELSE 
     314               IF(lwp) WRITE(numout,*) ' ldfght: kaht= 1 or 2, here =', kaht 
     315               IF(lwp) WRITE(numout,*) '         We stop' 
     316               STOP 'ldfght' 
     317            ENDIF 
     318            !                                             ! =============== 
     319         END DO                                           !   End of slab 
     320         !                                                ! =============== 
     321      END DO 
     322      ! 
    388323   END SUBROUTINE ldfght 
    389324 
     
    393328   !!---------------------------------------------------------------------- 
    394329CONTAINS 
    395    SUBROUTINE tra_ldf_bilapg( kt )               ! Dummy routine 
    396       WRITE(*,*) 'tra_ldf_bilapg: You should not have seen this print! error?', kt 
     330   SUBROUTINE tra_ldf_bilapg( kt, cdtype, ptb, pta, kjpt )      ! Empty routine 
     331      CHARACTER(len=3) ::   cdtype 
     332      REAL, DIMENSION(:,:,:,:) ::   ptb, pta 
     333      WRITE(*,*) 'tra_ldf_iso: You should not have seen this print! error?', kt, cdtype, ptb(1,1,1,1), pta(1,1,1,1), kjpt 
    397334   END SUBROUTINE tra_ldf_bilapg 
    398335#endif 
Note: See TracChangeset for help on using the changeset viewer.