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 2450 for branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/TRA/zpshde.F90 – NEMO

Ignore:
Timestamp:
2010-12-04T16:20:50+01:00 (14 years ago)
Author:
gm
Message:

v3.3beta: #766 share the deepest ocean level indices continuaton

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/TRA/zpshde.F90

    r2287 r2450  
    11MODULE zpshde 
    2    !!============================================================================== 
     2   !!====================================================================== 
    33   !!                       ***  MODULE zpshde   *** 
    4    !! z-coordinate - partial step : Horizontal Derivative 
    5    !!============================================================================== 
     4   !! z-coordinate + partial step : Horizontal Derivative at ocean bottom level 
     5   !!====================================================================== 
    66   !! History :  OPA  !  2002-04  (A. Bozec)  Original code 
    7    !!            8.5  !  2002-08  (G. Madec E. Durand)  Optimization and Free form 
    8    !!   NEMO     1.0  !  2004-03  (C. Ethe)  adapted for passive tracers 
     7   !!   NEMO     1.0  !  2002-08  (G. Madec E. Durand)  Optimization and Free form 
     8   !!             -   !  2004-03  (C. Ethe)  adapted for passive tracers 
    99   !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA  
    10    !!============================================================================== 
     10   !!====================================================================== 
    1111    
    1212   !!---------------------------------------------------------------------- 
     
    1414   !!                   ocean level (Z-coord. with Partial Steps) 
    1515   !!---------------------------------------------------------------------- 
    16    USE dom_oce         ! ocean space domain variables 
    17    USE oce             ! ocean dynamics and tracers variables 
     16   USE oce             ! ocean: dynamics and tracers variables 
     17   USE dom_oce         ! domain: ocean variables 
    1818   USE phycst          ! physical constants 
     19   USE eosbn2          ! ocean equation of state 
    1920   USE in_out_manager  ! I/O manager 
    20    USE eosbn2          ! ocean equation of state 
    2121   USE lbclnk          ! lateral boundary conditions (or mpp link) 
    2222 
     
    2424   PRIVATE 
    2525 
    26    PUBLIC   zps_hde        ! routine called by step.F90 
    27    PUBLIC   zps_hde_init   ! routine called by opa.F90 
    28  
    29    INTEGER, DIMENSION(jpi,jpj) ::   mbatu, mbatv   ! bottom ocean level index at U- and V-points 
     26   PUBLIC   zps_hde    ! routine called by step.F90 
    3027 
    3128   !! * Substitutions 
     
    3532   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3633   !! $Id$ 
    37    !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     34   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    3835   !!---------------------------------------------------------------------- 
    3936CONTAINS 
     
    4441      !!                     ***  ROUTINE zps_hde  *** 
    4542      !!                     
    46       !! ** Purpose :   Compute the horizontal derivative of T, S and rd 
     43      !! ** Purpose :   Compute the horizontal derivative of T, S and rho 
    4744      !!      at u- and v-points with a linear interpolation for z-coordinate 
    4845      !!      with partial steps. 
     
    7875      !!      formulation of the equation of state (eos). 
    7976      !!      Gradient formulation for rho : 
    80       !!          di(rho) = rd~ - rd(i,j,k) or rd (i+1,j,k) - rd~ 
    81       !! 
    82       !! ** Action  : - pgtu, pgtv: horizontal gradient of tracer at U/V-points 
    83       !!              - pgru, pgrv: horizontal gradient of rd if present at U/V-points  
    84       !!                and rd at V-points  
     77      !!          di(rho) = rd~ - rd(i,j,k) or rd(i+1,j,k) - rd~ 
     78      !! 
     79      !! ** Action  : - pgtu, pgtv: horizontal gradient of tracer at u- & v-points 
     80      !!              - pgru, pgrv: horizontal gradient of rho (if present) at u- & v-points  
    8581      !!---------------------------------------------------------------------- 
    8682      INTEGER                              , INTENT(in   )           ::  kt          ! ocean time-step index 
     
    9288      !! 
    9389      INTEGER  ::   ji, jj, jn      ! Dummy loop indices 
    94       INTEGER  ::   iku, ikv        ! partial step level at u- and v-points 
     90      INTEGER  ::   iku, ikv, ikum1, ikvm1   ! partial step level (ocean bottom level) at u- and v-points 
    9591      REAL(wp), DIMENSION(jpi,jpj,kjpt) ::   zti, ztj     ! interpolated value of tracer 
    9692      REAL(wp), DIMENSION(jpi,jpj)      ::   zri, zrj     ! interpolated value of rd 
     
    9995      !!---------------------------------------------------------------------- 
    10096 
    101  
    102       ! Interpolation of tracers at the last ocean level 
    103       DO jn = 1, kjpt 
     97      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==! 
    10498         ! 
    10599# if defined key_vectopt_loop 
     
    110104            DO ji = 1, jpim1 
    111105# endif 
    112                ! last level 
    113                iku = mbatu(ji,jj) 
    114                ikv = mbatv(ji,jj) 
    115                ze3wu  = fse3w(ji+1,jj  ,iku) - fse3w(ji,jj,iku) 
    116                ze3wv  = fse3w(ji  ,jj+1,ikv) - fse3w(ji,jj,ikv) 
    117  
     106               iku = mbku(ji,jj)   ;   ikum1 = MAX( iku , 1 )        ! last and before last ocean level at u- & v-points 
     107               ikv = mbkv(ji,jj)   ;   ikvm1 = MAX( ikv , 1 )        ! if level first is a p-step, ik.m1=1 
     108               ze3wu = fse3w(ji+1,jj  ,iku) - fse3w(ji,jj,iku) 
     109               ze3wv = fse3w(ji  ,jj+1,ikv) - fse3w(ji,jj,ikv) 
     110               ! 
    118111               ! i- direction 
    119                IF( ze3wu >= 0. ) THEN      ! case 1 
     112               IF( ze3wu >= 0._wp ) THEN      ! case 1 
    120113                  zmaxu =  ze3wu / fse3w(ji+1,jj,iku) 
    121114                  ! interpolated values of tracers 
    122                   zti(ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,iku-1,jn) - pta(ji+1,jj,iku,jn) ) 
     115                  zti(ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,ikum1,jn) - pta(ji+1,jj,iku,jn) ) 
    123116                  ! gradient of  tracers 
    124117                  pgtu(ji,jj,jn) = umask(ji,jj,1) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) ) 
    125                ELSE                        ! case 2 
     118               ELSE                           ! case 2 
    126119                  zmaxu = -ze3wu / fse3w(ji,jj,iku) 
    127120                  ! interpolated values of tracers 
    128                   zti(ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,iku-1,jn) - pta(ji,jj,iku,jn) ) 
     121                  zti(ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,ikum1,jn) - pta(ji,jj,iku,jn) ) 
    129122                  ! gradient of tracers 
    130123                  pgtu(ji,jj,jn) = umask(ji,jj,1) * ( pta(ji+1,jj,iku,jn) - zti(ji,jj,jn) ) 
    131124               ENDIF 
    132  
     125               ! 
    133126               ! j- direction 
    134                IF( ze3wv >= 0. ) THEN      ! case 1 
     127               IF( ze3wv >= 0._wp ) THEN      ! case 1 
    135128                  zmaxv =  ze3wv / fse3w(ji,jj+1,ikv) 
    136129                  ! interpolated values of tracers 
    137                   ztj(ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikv-1,jn) - pta(ji,jj+1,ikv,jn) ) 
     130                  ztj(ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikvm1,jn) - pta(ji,jj+1,ikv,jn) ) 
    138131                  ! gradient of tracers 
    139132                  pgtv(ji,jj,jn) = vmask(ji,jj,1) * ( ztj(ji,jj,jn) - pta(ji,jj,ikv,jn) ) 
    140                ELSE                        ! case 2 
     133               ELSE                           ! case 2 
    141134                  zmaxv =  -ze3wv / fse3w(ji,jj,ikv) 
    142135                  ! interpolated values of tracers 
    143                   ztj(ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikv-1,jn) - pta(ji,jj,ikv,jn) ) 
     136                  ztj(ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikvm1,jn) - pta(ji,jj,ikv,jn) ) 
    144137                  ! gradient of tracers 
    145138                  pgtv(ji,jj,jn) = vmask(ji,jj,1) * ( pta(ji,jj+1,ikv,jn) - ztj(ji,jj,jn) ) 
     
    162155            DO ji = 1, jpim1 
    163156# endif 
    164                iku = mbatu(ji,jj) 
    165                ikv = mbatv(ji,jj) 
     157               iku = mbku(ji,jj) 
     158               ikv = mbkv(ji,jj) 
    166159               ze3wu  = fse3w(ji+1,jj  ,iku) - fse3w(ji,jj,iku) 
    167160               ze3wv  = fse3w(ji  ,jj+1,ikv) - fse3w(ji,jj,ikv) 
    168                IF( ze3wu >= 0. ) THEN    
    169                   zhi(ji,jj) = fsdept(ji  ,jj,iku) 
    170                ELSE                    
    171                   zhi(ji,jj) = fsdept(ji+1,jj,iku) 
    172                ENDIF 
    173                IF( ze3wv >= 0. ) THEN   
    174                   zhj(ji,jj) = fsdept(ji,jj  ,ikv) 
    175                ELSE                    
    176                   zhj(ji,jj) = fsdept(ji,jj+1,ikv) 
     161               IF( ze3wu >= 0._wp ) THEN   ;   zhi(ji,jj) = fsdept(ji  ,jj,iku)     ! i-direction: case 1 
     162               ELSE                        ;   zhi(ji,jj) = fsdept(ji+1,jj,iku)     ! -     -      case 2 
     163               ENDIF 
     164               IF( ze3wv >= 0._wp ) THEN   ;   zhj(ji,jj) = fsdept(ji,jj  ,ikv)     ! j-direction: case 1 
     165               ELSE                        ;   zhj(ji,jj) = fsdept(ji,jj+1,ikv)     ! -     -      case 2 
    177166               ENDIF 
    178167# if ! defined key_vectopt_loop 
     
    193182            DO ji = 1, jpim1 
    194183# endif 
    195                iku = mbatu(ji,jj) 
    196                ikv = mbatv(ji,jj) 
     184               iku = mbku(ji,jj) 
     185               ikv = mbkv(ji,jj) 
    197186               ze3wu  = fse3w(ji+1,jj  ,iku) - fse3w(ji,jj,iku) 
    198187               ze3wv  = fse3w(ji  ,jj+1,ikv) - fse3w(ji,jj,ikv) 
    199                IF( ze3wu >= 0. ) THEN    ! i-direction: case 1 
    200                   pgru(ji,jj) = umask(ji,jj,1) * ( zri(ji,jj) - prd(ji,jj,iku) ) 
    201                ELSE                      ! i-direction: case 2 
    202                   pgru(ji,jj) = umask(ji,jj,1) * ( prd(ji+1,jj,iku) - zri(ji,jj) ) 
    203                ENDIF 
    204                IF( ze3wv >= 0. ) THEN    ! j-direction: case 1 
    205                   pgrv(ji,jj) = vmask(ji,jj,1) * ( zrj(ji,jj) - prd(ji,jj,ikv) ) 
    206                ELSE                      ! j-direction: case 2 
    207                   pgrv(ji,jj) = vmask(ji,jj,1) * ( prd(ji,jj+1,ikv) - zrj(ji,jj) ) 
     188               IF( ze3wu >= 0._wp ) THEN   ;   pgru(ji,jj) = umask(ji,jj,1) * ( zri(ji  ,jj) - prd(ji,jj,iku) )   ! i: 1 
     189               ELSE                        ;   pgru(ji,jj) = umask(ji,jj,1) * ( prd(ji+1,jj,iku) - zri(ji,jj) )   ! i: 2 
     190               ENDIF 
     191               IF( ze3wv >= 0._wp ) THEN   ;   pgrv(ji,jj) = vmask(ji,jj,1) * ( zrj(ji,jj  ) - prd(ji,jj,ikv) )   ! j: 1 
     192               ELSE                        ;   pgrv(ji,jj) = vmask(ji,jj,1) * ( prd(ji,jj+1,ikv) - zrj(ji,jj) )   ! j: 2 
    208193               ENDIF 
    209194# if ! defined key_vectopt_loop 
     
    217202   END SUBROUTINE zps_hde 
    218203 
    219  
    220    SUBROUTINE zps_hde_init 
    221       !!---------------------------------------------------------------------- 
    222       !!                     ***  ROUTINE zps_hde_init  *** 
    223       !! 
    224       !! ** Purpose : Computation of bottom ocean level index at U- and V-points  
    225       !!                     
    226       !!---------------------------------------------------------------------- 
    227       INTEGER ::   ji, jj   ! Dummy loop indices 
    228       REAL(wp), DIMENSION(jpi,jpj) ::   zti, ztj     ! 2D workspace  
    229       !!---------------------------------------------------------------------- 
    230       ! 
    231       mbatu(:,:) = 0 
    232       mbatv(:,:) = 0 
    233       DO jj = 1, jpjm1 
    234          DO ji = 1, fs_jpim1   ! vector opt. 
    235             mbatu(ji,jj) = MAX( MIN( mbathy(ji,jj), mbathy(ji+1,jj  ) ) - 1, 2 ) 
    236             mbatv(ji,jj) = MAX( MIN( mbathy(ji,jj), mbathy(ji  ,jj+1) ) - 1, 2 ) 
    237          END DO 
    238       END DO 
    239       zti(:,:) = FLOAT( mbatu(:,:) ) 
    240       ztj(:,:) = FLOAT( mbatv(:,:) ) 
    241       ! lateral boundary conditions: T-point, sign unchanged 
    242       CALL lbc_lnk( zti , 'U', 1. )   ;   CALL lbc_lnk( ztj , 'V', 1. ) 
    243       mbatu(:,:) = MAX( INT( zti(:,:) ), 2 ) 
    244       mbatv(:,:) = MAX( INT( ztj(:,:) ), 2 ) 
    245       ! 
    246    END SUBROUTINE zps_hde_init 
    247204   !!====================================================================== 
    248205END MODULE zpshde 
Note: See TracChangeset for help on using the changeset viewer.