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/DYN/dynzdf_imp.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/DYN/dynzdf_imp.F90

    • Property svn:eol-style deleted
    r1662 r2528  
    44   !! Ocean dynamics:  vertical component(s) of the momentum mixing trend 
    55   !!============================================================================== 
    6    !! History :      !  90-10  (B. Blanke)  Original code 
    7    !!                !  97-05  (G. Madec)  vertical component of isopycnal 
    8    !!           8.5  !  02-08  (G. Madec)  F90: Free form and module 
     6   !! History :  OPA  !  1990-10  (B. Blanke)  Original code 
     7   !!            8.0  !  1997-05  (G. Madec)  vertical component of isopycnal 
     8   !!   NEMO     1.0  !  2002-08  (G. Madec)  F90: Free form and module 
     9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps 
    910   !!---------------------------------------------------------------------- 
    1011 
     
    1314   !!                  sion using a implicit time-stepping. 
    1415   !!---------------------------------------------------------------------- 
    15    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
    16    !! $Id$ 
    17    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    18    !!---------------------------------------------------------------------- 
    19    !! * Modules used 
    2016   USE oce             ! ocean dynamics and tracers 
    2117   USE dom_oce         ! ocean space and time domain 
     
    2824   PRIVATE 
    2925 
    30    !! * Routine accessibility 
    31    PUBLIC dyn_zdf_imp    ! called by step.F90 
     26   PUBLIC   dyn_zdf_imp   ! called by step.F90 
    3227 
    3328   !! * Substitutions 
     
    3530#  include "vectopt_loop_substitute.h90" 
    3631   !!---------------------------------------------------------------------- 
    37    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
     32   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3833   !! $Id$ 
    39    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    40    !!---------------------------------------------------------------------- 
    41  
     34   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     35   !!---------------------------------------------------------------------- 
    4236CONTAINS 
    43  
    4437 
    4538   SUBROUTINE dyn_zdf_imp( kt, p2dt ) 
     
    5447      !!             dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) ) 
    5548      !!      backward time stepping 
    56       !!      Surface boundary conditions: wind stress input 
     49      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2) 
    5750      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F) 
    5851      !!      Add this trend to the general trend ua : 
    5952      !!         ua = ua + dz( avmu dz(u) ) 
    6053      !! 
    61       !! ** Action : - Update (ua,va) arrays with the after vertical diffusive 
    62       !!               mixing trend. 
     54      !! ** Action : - Update (ua,va) arrays with the after vertical diffusive mixing trend. 
    6355      !!--------------------------------------------------------------------- 
    64       !! * Modules used 
    65       USE oce, ONLY :  zwd   => ta,   &                ! use ta as workspace 
    66                        zws   => sa                     ! use sa as workspace 
    67  
    68       !! * Arguments 
    69       INTEGER , INTENT( in ) ::   kt                   ! ocean time-step index 
    70       REAL(wp), INTENT( in ) ::  p2dt                  ! vertical profile of tracer time-step 
    71  
    72       !! * Local declarations 
    73       INTEGER ::   ji, jj, jk                          ! dummy loop indices 
    74       REAL(wp) ::   zrau0r, z2dtf, zcoef, zzws, zrhs   ! temporary scalars 
    75       REAL(wp) ::   zzwi                               ! temporary scalars 
    76       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwi        ! temporary workspace arrays 
     56      USE oce, ONLY :  zwd   => ta      ! use ta as workspace 
     57      USE oce, ONLY :  zws   => sa      ! use sa as workspace 
     58      !! 
     59      INTEGER , INTENT( in ) ::   kt    ! ocean time-step index 
     60      REAL(wp), INTENT( in ) ::  p2dt   ! vertical profile of tracer time-step 
     61      !! 
     62      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
     63      REAL(wp) ::   z1_p2dt, zcoef         ! temporary scalars 
     64      REAL(wp) ::   zzwi, zzws, zrhs       ! temporary scalars 
     65      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwi        ! 3D workspace 
    7766      !!---------------------------------------------------------------------- 
    7867 
     
    8574      ! 0. Local constant initialization 
    8675      ! -------------------------------- 
    87       zrau0r = 1. / rau0      ! inverse of the reference density 
     76      z1_p2dt = 1._wp / p2dt      ! inverse of the timestep 
    8877 
    8978      ! 1. Vertical diffusion on u 
     
    9584      ! friction velocity in dyn_bfr using values from the previous timestep. There 
    9685      ! is no need to include these in the implicit calculation. 
    97       DO jk = 1, jpkm1 
     86      ! 
     87      DO jk = 1, jpkm1        ! Matrix 
    9888         DO jj = 2, jpjm1  
    9989            DO ji = fs_2, fs_jpim1   ! vector opt. 
    10090               zcoef = - p2dt / fse3u(ji,jj,jk) 
    101                zzwi          = zcoef * avmu(ji,jj,jk  ) / fse3uw(ji,jj,jk  ) 
    102                zwi(ji,jj,jk) = zzwi * umask(ji,jj,jk) 
    103                zzws          = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 
    104                zws(ji,jj,jk) = zzws * umask(ji,jj,jk+1) 
    105                zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws 
    106             END DO 
    107          END DO 
    108       END DO 
    109  
    110       ! Surface boudary conditions 
    111       DO jj = 2, jpjm1  
    112          DO ji = fs_2, fs_jpim1   ! vector opt. 
    113             zwi(ji,jj,1) = 0. 
    114             zwd(ji,jj,1) = 1. - zws(ji,jj,1) 
     91               zzwi          = zcoef * avmu (ji,jj,jk  ) / fse3uw(ji,jj,jk  ) 
     92               zwi(ji,jj,jk) = zzwi  * umask(ji,jj,jk) 
     93               zzws          = zcoef * avmu (ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 
     94               zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1) 
     95               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws 
     96            END DO 
     97         END DO 
     98      END DO 
     99      DO jj = 2, jpjm1        ! Surface boudary conditions 
     100         DO ji = fs_2, fs_jpim1   ! vector opt. 
     101            zwi(ji,jj,1) = 0._wp 
     102            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
    115103         END DO 
    116104      END DO 
     
    130118      !   The solution (the after velocity) is in ua 
    131119      !----------------------------------------------------------------------- 
    132  
    133       ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k) 
    134       DO jk = 2, jpkm1 
     120      ! 
     121      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    135122         DO jj = 2, jpjm1    
    136123            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    139126         END DO 
    140127      END DO 
    141  
    142       ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1 
    143       DO jj = 2, jpjm1    
    144          DO ji = fs_2, fs_jpim1   ! vector opt. 
    145 !!! change les resultats (derniers digit, pas significativement + rapide 1* de moins) 
    146 !!!         ua(ji,jj,1) = ub(ji,jj,1)  & 
    147 !!!                      + p2dt * ( ua(ji,jj,1) + utau(ji,jj) / ( fse3u(ji,jj,1)*rau0 ) ) 
    148             z2dtf = p2dt / ( fse3u(ji,jj,1)*rau0 ) 
    149             ua(ji,jj,1) = ub(ji,jj,1)  & 
    150                          + p2dt *  ua(ji,jj,1) + z2dtf * utau(ji,jj) 
     128      ! 
     129      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
     130         DO ji = fs_2, fs_jpim1   ! vector opt. 
     131            ua(ji,jj,1) = ub(ji,jj,1) + p2dt * (  ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
     132               &                                                       / ( fse3u(ji,jj,1) * rau0       )  ) 
    151133         END DO 
    152134      END DO 
     
    159141         END DO 
    160142      END DO 
    161  
    162       ! thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk 
    163       DO jj = 2, jpjm1    
     143      ! 
     144      DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  == 
    164145         DO ji = fs_2, fs_jpim1   ! vector opt. 
    165146            ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
     
    169150         DO jj = 2, jpjm1    
    170151            DO ji = fs_2, fs_jpim1   ! vector opt. 
    171                ua(ji,jj,jk) =( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
     152               ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
    172153            END DO 
    173154         END DO 
     
    178159         DO jj = 2, jpjm1    
    179160            DO ji = fs_2, fs_jpim1   ! vector opt. 
    180                ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) / p2dt 
     161               ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) * z1_p2dt 
    181162            END DO 
    182163         END DO 
     
    192173      ! friction velocity in dyn_bfr using values from the previous timestep. There 
    193174      ! is no need to include these in the implicit calculation. 
    194       DO jk = 1, jpkm1 
     175      ! 
     176      DO jk = 1, jpkm1        ! Matrix 
    195177         DO jj = 2, jpjm1    
    196178            DO ji = fs_2, fs_jpim1   ! vector opt. 
    197179               zcoef = -p2dt / fse3v(ji,jj,jk) 
    198                zzwi          = zcoef * avmv(ji,jj,jk  ) / fse3vw(ji,jj,jk  ) 
     180               zzwi          = zcoef * avmv (ji,jj,jk  ) / fse3vw(ji,jj,jk  ) 
    199181               zwi(ji,jj,jk) =  zzwi * vmask(ji,jj,jk) 
    200                zzws       = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1) 
     182               zzws          = zcoef * avmv (ji,jj,jk+1) / fse3vw(ji,jj,jk+1) 
    201183               zws(ji,jj,jk) =  zzws * vmask(ji,jj,jk+1) 
    202                zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws 
    203             END DO 
    204          END DO 
    205       END DO 
    206  
    207       ! Surface boudary conditions 
    208       DO jj = 2, jpjm1    
    209          DO ji = fs_2, fs_jpim1   ! vector opt. 
    210             zwi(ji,jj,1) = 0.e0 
    211             zwd(ji,jj,1) = 1. - zws(ji,jj,1) 
     184               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws 
     185            END DO 
     186         END DO 
     187      END DO 
     188      DO jj = 2, jpjm1        ! Surface boudary conditions 
     189         DO ji = fs_2, fs_jpim1   ! vector opt. 
     190            zwi(ji,jj,1) = 0._wp 
     191            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
    212192         END DO 
    213193      END DO 
     
    223203      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
    224204      ! 
    225       !   m is decomposed in the product of an upper and lower triangular 
    226       !   matrix 
     205      !   m is decomposed in the product of an upper and lower triangular matrix 
    227206      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
    228207      !   The solution (after velocity) is in 2d array va 
    229208      !----------------------------------------------------------------------- 
    230  
    231       ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k) 
    232       DO jk = 2, jpkm1 
     209      ! 
     210      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    233211         DO jj = 2, jpjm1    
    234212            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    237215         END DO 
    238216      END DO 
    239  
    240       ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1 
    241       DO jj = 2, jpjm1 
    242          DO ji = fs_2, fs_jpim1   ! vector opt. 
    243 !!! change les resultats (derniers digit, pas significativement + rapide 1* de moins) 
    244 !!!         va(ji,jj,1) = vb(ji,jj,1)  & 
    245 !!!                      + p2dt * ( va(ji,jj,1) + vtau(ji,jj) / ( fse3v(ji,jj,1)*rau0 ) ) 
    246             z2dtf = p2dt / ( fse3v(ji,jj,1)*rau0 ) 
    247             va(ji,jj,1) = vb(ji,jj,1)  & 
    248                          + p2dt * va(ji,jj,1) + z2dtf * vtau(ji,jj) 
     217      ! 
     218      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
     219         DO ji = fs_2, fs_jpim1   ! vector opt. 
     220            va(ji,jj,1) = vb(ji,jj,1) + p2dt * (  va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
     221               &                                                       / ( fse3v(ji,jj,1) * rau0       )  ) 
    249222         END DO 
    250223      END DO 
     
    257230         END DO 
    258231      END DO 
    259  
    260       ! thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk 
    261       DO jj = 2, jpjm1    
     232      ! 
     233      DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  == 
    262234         DO ji = fs_2, fs_jpim1   ! vector opt. 
    263235            va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
     
    267239         DO jj = 2, jpjm1    
    268240            DO ji = fs_2, fs_jpim1   ! vector opt. 
    269                va(ji,jj,jk) =( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
     241               va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
    270242            END DO 
    271243         END DO 
     
    276248         DO jj = 2, jpjm1    
    277249            DO ji = fs_2, fs_jpim1   ! vector opt. 
    278                va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) / p2dt 
    279             END DO 
    280          END DO 
    281       END DO 
    282  
     250               va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) * z1_p2dt 
     251            END DO 
     252         END DO 
     253      END DO 
     254      ! 
    283255   END SUBROUTINE dyn_zdf_imp 
    284256 
Note: See TracChangeset for help on using the changeset viewer.