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_lap.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_lap.F90

    • Property svn:eol-style deleted
    r1152 r2528  
    22   !!============================================================================== 
    33   !!                       ***  MODULE  traldf_lap  *** 
    4    !! Ocean active tracers:  horizontal component of the lateral tracer mixing trend 
     4   !! Ocean tracers:  horizontal component of the lateral tracer mixing trend 
    55   !!============================================================================== 
     6   !! History :  OPA  !  87-06  (P. Andrich, D. L Hostis)  Original code 
     7   !!                 !  91-11  (G. Madec) 
     8   !!                 !  95-11  (G. Madec)  suppress volumetric scale factors 
     9   !!                 !  96-01  (G. Madec)  statement function for e3 
     10   !!            NEMO !  02-06  (G. Madec)  F90: Free form and module 
     11   !!            1.0  !  04-08  (C. Talandier) New trends organization 
     12   !!                 !  05-11  (G. Madec)  add zps case 
     13   !!            3.0  !  10-06  (C. Ethe, G. Madec) Merge TRA-TRC 
     14   !!---------------------------------------------------------------------- 
    615 
    716   !!---------------------------------------------------------------------- 
     
    918   !!                 using a iso-level harmonic (laplacien) operator. 
    1019   !!---------------------------------------------------------------------- 
    11    !! * Modules used 
    1220   USE oce             ! ocean dynamics and active tracers 
    1321   USE dom_oce         ! ocean space and time domain 
    1422   USE ldftra_oce      ! ocean active tracers: lateral physics 
    15    USE trdmod          ! ocean active tracers trends  
    16    USE trdmod_oce      ! ocean variables trends 
    1723   USE in_out_manager  ! I/O manager 
    1824   USE diaptr          ! poleward transport diagnostics 
    19    USE prtctl          ! Print control 
    20  
     25   USE trc_oce         ! share passive tracers/Ocean variables 
    2126 
    2227   IMPLICIT NONE 
    2328   PRIVATE 
    2429 
    25    !! * Routine accessibility 
    26    PUBLIC tra_ldf_lap  ! routine called by step.F90 
     30   PUBLIC   tra_ldf_lap   ! routine called by step.F90 
     31 
     32   REAL(wp), DIMENSION(jpi,jpj) ::   e1ur, e2vr   ! scale factor coefficients 
    2733 
    2834   !! * Substitutions 
     
    3137#  include "vectopt_loop_substitute.h90" 
    3238   !!---------------------------------------------------------------------- 
    33    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
    34    !! $Id$  
    35    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     39   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     40   !! $Id$ 
     41   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    3642   !!---------------------------------------------------------------------- 
    37     
    3843CONTAINS 
    3944 
    40    SUBROUTINE tra_ldf_lap( kt ) 
     45   SUBROUTINE tra_ldf_lap( kt, cdtype, pgu, pgv,      & 
     46      &                                ptb, pta, kjpt )  
    4147      !!---------------------------------------------------------------------- 
    4248      !!                  ***  ROUTINE tra_ldf_lap  *** 
     
    4753      !! ** Method  :   Second order diffusive operator evaluated using before 
    4854      !!      fields (forward time scheme). The horizontal diffusive trends of  
    49       !!      temperature (idem for salinity) is given by: 
     55      !!      the tracer is given by: 
    5056      !!          difft = 1/(e1t*e2t*e3t) {  di-1[ aht e2u*e3u/e1u di(tb) ] 
    5157      !!                                   + dj-1[ aht e1v*e3v/e2v dj(tb) ] } 
    52       !!     Note: key_zco defined, the e3t=e3u=e3v, the trend becomes:   
    53       !!          difft = 1/(e1t*e2t) {  di-1[ aht e2u/e1u di(tb) ] 
    54       !!                               + dj-1[ aht e1v/e2v dj(tb) ] } 
    55       !!      Add this trend to the general tracer trend (ta,sa): 
    56       !!          (ta,sa) = (ta,sa) + ( difft , diffs ) 
     58      !!      Add this trend to the general tracer trend pta : 
     59      !!          pta = pta + difft 
    5760      !! 
    58       !! ** Action  : - Update (ta,sa) arrays with the before iso-level  
     61      !! ** Action  : - Update pta arrays with the before iso-level  
    5962      !!                harmonic mixing trend. 
     63      !!---------------------------------------------------------------------- 
     64      USE oce         , ztu => ua   ! use ua as workspace 
     65      USE oce         , ztv => va   ! use va as workspace 
    6066      !! 
    61       !! History : 
    62       !!   1.0  !  87-06  (P. Andrich, D. L Hostis)  Original code 
    63       !!        !  91-11  (G. Madec) 
    64       !!        !  95-11  (G. Madec)  suppress volumetric scale factors 
    65       !!        !  96-01  (G. Madec)  statement function for e3 
    66       !!   8.5  !  02-06  (G. Madec)  F90: Free form and module 
    67       !!   9.0  !  04-08  (C. Talandier) New trends organization 
    68       !!        !  05-11  (G. Madec)  add zps case 
    69       !!---------------------------------------------------------------------- 
    70       USE oce              , ztu => ua,  &  ! use ua as workspace 
    71          &                   zsu => va      ! use va as workspace 
    72  
    73       !! * Arguments 
    74       INTEGER, INTENT( in ) ::   kt       ! ocean time-step index 
    75        
    76       !! * Local save 
    77       REAL(wp), DIMENSION(jpi,jpj), SAVE ::   & 
    78          ze1ur, ze2vr, zbtr2              ! scale factor coefficients 
    79        
    80       !! * Local declarations 
    81       INTEGER ::   ji, jj, jk             ! dummy loop indices 
    82       INTEGER ::   iku, ikv               ! temporary integers 
    83       REAL(wp) ::   & 
    84          zabe1, zta,                   &  ! temporary scalars 
    85          zabe2, zsa, zbtr                 !    "         " 
    86       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
    87          ztv, zsv                         ! 3D workspace 
     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    ,kjpt), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels 
     71      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb        ! before and now tracer fields 
     72      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta        ! tracer trend  
     73      !! 
     74      INTEGER  ::   ji, jj, jk, jn       ! dummy loop indices 
     75      INTEGER  ::   iku, ikv             ! local integers 
     76      REAL(wp) ::   zabe1, zabe2, zbtr   ! local scalars 
    8877      !!---------------------------------------------------------------------- 
    8978       
    90       IF( kt == nit000 ) THEN 
     79      IF( kt == nit000 )  THEN 
    9180         IF(lwp) WRITE(numout,*) 
    92          IF(lwp) WRITE(numout,*) 'tra_ldf_lap : iso-level laplacian diffusion' 
     81         IF(lwp) WRITE(numout,*) 'tra_ldf_lap : iso-level laplacian diffusion on ', cdtype 
    9382         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
    94          ze1ur(:,:) = e2u(:,:) / e1u(:,:) 
    95          ze2vr(:,:) = e1v(:,:) / e2v(:,:) 
    96          zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 
     83         e1ur(:,:) = e2u(:,:) / e1u(:,:) 
     84         e2vr(:,:) = e1v(:,:) / e2v(:,:) 
    9785      ENDIF 
    98        
    99       !                                                  ! ============= 
    100       DO jk = 1, jpkm1                                   ! Vertical slab 
    101          !                                               ! ============= 
    102          ! 1. First derivative (gradient) 
    103          ! ------------------- 
    104          DO jj = 1, jpjm1 
    105             DO ji = 1, fs_jpim1   ! vector opt. 
    106 #if defined key_zco 
    107                zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj) 
    108                zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj) 
    109 #else 
    110                zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj) * fse3u(ji,jj,jk) 
    111                zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj) * fse3v(ji,jj,jk) 
    112 #endif 
    113                ztu(ji,jj,jk) = zabe1 * ( tb(ji+1,jj  ,jk) - tb(ji,jj,jk) ) 
    114                zsu(ji,jj,jk) = zabe1 * ( sb(ji+1,jj  ,jk) - sb(ji,jj,jk) ) 
    115                ztv(ji,jj,jk) = zabe2 * ( tb(ji  ,jj+1,jk) - tb(ji,jj,jk) ) 
    116                zsv(ji,jj,jk) = zabe2 * ( sb(ji  ,jj+1,jk) - sb(ji,jj,jk) ) 
    117             END DO   
    118          END DO   
    119          IF( ln_zps ) THEN      ! set gradient at partial step level 
     86 
     87      !                                                          ! =========== ! 
     88      DO jn = 1, kjpt                                            ! tracer loop ! 
     89         !                                                       ! =========== !     
     90         DO jk = 1, jpkm1                                            ! slab loop 
     91            !                                            
     92            ! 1. First derivative (gradient) 
     93            ! ------------------- 
    12094            DO jj = 1, jpjm1 
    12195               DO ji = 1, fs_jpim1   ! vector opt. 
    122                   ! last level 
    123                   iku = MIN ( mbathy(ji,jj), mbathy(ji+1,jj  ) ) - 1 
    124                   ikv = MIN ( mbathy(ji,jj), mbathy(ji  ,jj+1) ) - 1 
    125                   IF( iku == jk ) THEN 
    126                      zabe1 = fsahtu(ji,jj,iku) * umask(ji,jj,iku) * ze1ur(ji,jj) * fse3u(ji,jj,iku) 
    127                      ztu(ji,jj,jk) = zabe1 * gtu(ji,jj) 
    128                      zsu(ji,jj,jk) = zabe1 * gsu(ji,jj) 
    129                   ENDIF 
    130                   IF( ikv == jk ) THEN 
    131                      zabe2 = fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * ze2vr(ji,jj) * fse3v(ji,jj,ikv) 
    132                      ztv(ji,jj,jk) = zabe2 * gtv(ji,jj) 
    133                      zsv(ji,jj,jk) = zabe2 * gsv(ji,jj) 
    134                   ENDIF 
     96                  zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * e1ur(ji,jj) * fse3u(ji,jj,jk) 
     97                  zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * e2vr(ji,jj) * fse3v(ji,jj,jk) 
     98                  ztu(ji,jj,jk) = zabe1 * ( ptb(ji+1,jj  ,jk,jn) - ptb(ji,jj,jk,jn) ) 
     99                  ztv(ji,jj,jk) = zabe2 * ( ptb(ji  ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 
    135100               END DO 
    136101            END DO 
    137          ENDIF 
     102            IF( ln_zps ) THEN      ! set gradient at partial step level 
     103               DO jj = 1, jpjm1 
     104                  DO ji = 1, fs_jpim1   ! vector opt. 
     105                     ! last level 
     106                     iku = mbku(ji,jj) 
     107                     ikv = mbkv(ji,jj) 
     108                     IF( iku == jk ) THEN 
     109                        zabe1 = fsahtu(ji,jj,iku) * umask(ji,jj,iku) * e1ur(ji,jj) * fse3u(ji,jj,iku) 
     110                        ztu(ji,jj,jk) = zabe1 * pgu(ji,jj,jn) 
     111                     ENDIF 
     112                     IF( ikv == jk ) THEN 
     113                        zabe2 = fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * e2vr(ji,jj) * fse3v(ji,jj,ikv) 
     114                        ztv(ji,jj,jk) = zabe2 * pgv(ji,jj,jn) 
     115                     ENDIF 
     116                  END DO 
     117               END DO 
     118            ENDIF 
    138119          
    139120          
    140          ! 2. Second derivative (divergence) 
    141          ! -------------------- 
    142          DO jj = 2, jpjm1 
    143             DO ji = fs_2, fs_jpim1   ! vector opt. 
    144 #if defined key_zco 
    145                zbtr = zbtr2(ji,jj) 
    146 #else 
    147                zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 
    148 #endif 
    149                ! horizontal diffusive trends 
    150                zta = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   & 
    151                   &          + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) 
    152                zsa = zbtr * (  zsu(ji,jj,jk) - zsu(ji-1,jj,jk)   & 
    153                   &          + zsv(ji,jj,jk) - zsv(ji,jj-1,jk)  ) 
    154                ! add it to the general tracer trends 
    155                ta(ji,jj,jk) = ta(ji,jj,jk) + zta 
    156                sa(ji,jj,jk) = sa(ji,jj,jk) + zsa 
    157             END DO   
    158          END DO   
    159          !                                               ! ============= 
    160       END DO                                             !  End of slab   
    161       !                                                  ! ============= 
    162  
    163       ! "zonal" mean lateral diffusive heat and salt transport  
    164       IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 
    165          IF( lk_zco ) THEN   ! z-coordinate - full step (1D arrays) 
    166             DO jk = 1, jpkm1 
    167                DO jj = 2, jpjm1 
    168                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    169                     ztv(ji,jj,jk) = ztv(ji,jj,jk) * fse3v(ji,jj,jk) 
    170                     zsv(ji,jj,jk) = zsv(ji,jj,jk) * fse3v(ji,jj,jk) 
    171                   END DO 
     121            ! 2. Second derivative (divergence) added to the general tracer trends 
     122            ! --------------------------------------------------------------------- 
     123            DO jj = 2, jpjm1 
     124               DO ji = fs_2, fs_jpim1   ! vector opt. 
     125                  zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     126                  ! horizontal diffusive trends added to the general tracer trends 
     127                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   & 
     128                     &                                          + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) 
    172129               END DO 
    173130            END DO 
     131            ! 
     132         END DO                                             !  End of slab   
     133         ! 
     134         ! "Poleward" diffusive heat or salt transports 
     135         IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nn_fptr ) == 0 ) ) THEN 
     136            IF( jn  == jp_tem)   htr_ldf(:) = ptr_vj( ztv(:,:,:) ) 
     137            IF( jn  == jp_sal)   str_ldf(:) = ptr_vj( ztv(:,:,:) ) 
    174138         ENDIF 
    175          pht_ldf(:) = ptr_vj( ztv(:,:,:) ) 
    176          pst_ldf(:) = ptr_vj( zsv(:,:,:) ) 
    177       ENDIF 
    178  
     139         !                                                  ! ================== 
     140      END DO                                                ! end of tracer loop 
     141      !                                                     ! ================== 
    179142   END SUBROUTINE tra_ldf_lap 
    180143 
Note: See TracChangeset for help on using the changeset viewer.