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 457 for trunk/NEMO/OPA_SRC/TRA/trazdf_imp.F90 – NEMO

Ignore:
Timestamp:
2006-05-10T19:01:19+02:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_update_049:RB: reorganization of tracers part, remove traadv_cen2_atsk.h90 traldf_iso_zps.F90 trazdf_iso.F90 trazdf_iso_vopt.F90, change atsk routines to jki

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/TRA/trazdf_imp.F90

    r258 r457  
    11MODULE trazdf_imp 
    22   !!============================================================================== 
    3    !!                    ***  MODULE  trazdf_imp  *** 
     3   !!                 ***  MODULE  trazdf_imp  *** 
    44   !! Ocean active tracers:  vertical component of the tracer mixing trend 
    55   !!============================================================================== 
    6  
    7    !!---------------------------------------------------------------------- 
    8    !!   tra_zdf_imp  : update the tracer trend with the vertical diffusion 
    9    !!                  using an implicit time-stepping. 
     6   !! History : 
     7   !!   6.0  !  90-10  (B. Blanke)  Original code 
     8   !!   7.0  !  91-11 (G. Madec) 
     9   !!        !  92-06 (M. Imbard) correction on tracer trend loops 
     10   !!        !  96-01 (G. Madec) statement function for e3 
     11   !!        !  97-05 (G. Madec) vertical component of isopycnal 
     12   !!        !  97-07 (G. Madec) geopotential diffusion in s-coord 
     13   !!        !  00-08 (G. Madec) double diffusive mixing 
     14   !!   8.5  !  02-08 (G. Madec)  F90: Free form and module 
     15   !!   9.0  !  04-08 (C. Talandier) New trends organization 
     16   !!   " "  !  06-11 (G. Madec)  New step reorganisation 
     17   !!---------------------------------------------------------------------- 
     18   !!   tra_zdf_imp : Update the tracer trend with the diagonal vertical   
     19   !!                 part of the mixing tensor. 
     20   !!                 Vector optimization, use k-j-i loops. 
    1021   !!---------------------------------------------------------------------- 
    1122   !! * Modules used 
    12    USE oce             ! ocean dynamics and active tracers 
    13    USE dom_oce         ! ocean space and time domain 
    14    USE zdf_oce         ! ocean vertical physics 
     23   USE oce             ! ocean dynamics and tracers variables 
     24   USE dom_oce         ! ocean space and time domain variables  
     25   USE zdf_oce         ! ocean vertical physics variables 
    1526   USE ldftra_oce      ! ocean active tracers: lateral physics 
    16    USE zdfddm          ! ocean vertical physics: double diffusion 
    17    USE zdfkpp          ! KPP parameterisation 
     27   USE ldfslp          ! lateral physics: slope of diffusion 
    1828   USE trdmod          ! ocean active tracers trends  
    1929   USE trdmod_oce      ! ocean variables trends 
     30   USE zdfddm          ! ocean vertical physics: double diffusion 
    2031   USE in_out_manager  ! I/O manager 
     32   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2133   USE prtctl          ! Print control 
    22  
    2334 
    2435   IMPLICIT NONE 
     
    2637 
    2738   !! * Routine accessibility 
    28    PUBLIC tra_zdf_imp          ! routine called by step.F90 
    29  
    30    !! * Module variable 
    31    REAL(wp), DIMENSION(jpk) ::   & 
    32       r2dt                     ! vertical profile of 2 x tracer time-step 
     39   PUBLIC tra_zdf_imp   !  routine called by step.F90 
    3340 
    3441   !! * Substitutions 
    3542#  include "domzgr_substitute.h90" 
     43#  include "ldftra_substitute.h90" 
    3644#  include "zdfddm_substitute.h90" 
    37    !!---------------------------------------------------------------------- 
    38    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
    39    !! $Header$  
    40    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    41    !!---------------------------------------------------------------------- 
    42  
     45#  include "vectopt_loop_substitute.h90" 
     46   !!---------------------------------------------------------------------- 
     47   !!---------------------------------------------------------------------- 
     48   !!  OPA 9.0 , LOCEAN-IPSL (2005)  
     49   !!---------------------------------------------------------------------- 
    4350CONTAINS 
    44  
    45    SUBROUTINE tra_zdf_imp( kt ) 
     51    
     52   SUBROUTINE tra_zdf_imp( kt, p2dt ) 
    4653      !!---------------------------------------------------------------------- 
    4754      !!                  ***  ROUTINE tra_zdf_imp  *** 
    4855      !! 
    49       !! ** Purpose :   Compute the trend due to the vertical tracer mixing  
    50       !!      using an implicit time stepping and add it to the general trend 
    51       !!      of the tracer equations. 
    52       !! 
    53       !! ** Method  :   The vertical diffusion of tracers (t & s) is given by: 
    54       !!          difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(ta) ) 
    55       !!      It is thus evaluated using a backward time scheme 
     56      !! ** Purpose :   Compute the trend due to the vertical tracer diffusion 
     57      !!     including the vertical component of lateral mixing (only for 2nd 
     58      !!     order operator, for fourth order it is already computed and add 
     59      !!     to the general trend in traldf.F) and add it to the general trend 
     60      !!     of the tracer equations. 
     61      !! 
     62      !! ** Method  :   The vertical component of the lateral diffusive trends 
     63      !!      is provided by a 2nd order operator rotated along neural or geo- 
     64      !!      potential surfaces to which an eddy induced advection can be  
     65      !!      added. It is computed using before fields (forward in time) and  
     66      !!      isopycnal or geopotential slopes computed in routine ldfslp. 
     67      !! 
     68      !!      Second part: vertical trend associated with the vertical physics 
     69      !!      ===========  (including the vertical flux proportional to dk[t] 
     70      !!                  associated with the lateral mixing, through the 
     71      !!                  update of avt) 
     72      !!      The vertical diffusion of tracers (t & s) is given by: 
     73      !!             difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(t) ) 
     74      !!      It is computed using a backward time scheme (t=ta). 
    5675      !!      Surface and bottom boundary conditions: no diffusive flux on 
    5776      !!      both tracers (bottom, applied through the masked field avt). 
    5877      !!      Add this trend to the general trend ta,sa : 
    59       !!          ta = ta + dz( avt dz(t) ) 
    60       !!         (sa = sa + dz( avs dz(t) ) if lk_zdfddm=T) 
    61       !! 
    62       !! ** Action  : - Update (ta,sa) with the before vertical diffusion trend 
    63       !!              - save the trends in (ttrd,strd) ('key_trdtra') 
    64       !! 
    65       !! History : 
    66       !!   6.0  !  90-10  (B. Blanke)  Original code 
    67       !!   7.0  !  91-11  (G. Madec) 
    68       !!        !  92-06  (M. Imbard)  correction on tracer trend loops 
    69       !!        !  96-01  (G. Madec)  statement function for e3 
    70       !!        !  97-05  (G. Madec)  vertical component of isopycnal 
    71       !!        !  97-07  (G. Madec)  geopotential diffusion in s-coord 
    72       !!        !  00-08  (G. Madec)  double diffusive mixing 
    73       !!   8.5  !  02-08  (G. Madec)  F90: Free form and module 
    74       !!   9.0  !  04-08  (C. Talandier) New trends organization 
    75       !!   9.0  !  05-01  (C. Ethe )  non-local flux in KPP vertical mixing scheme 
     78      !!         ta = ta + dz( avt dz(t) ) 
     79      !!         (sa = sa + dz( avs dz(t) ) if lk_zdfddm=T ) 
     80      !! 
     81      !!      Third part: recover avt resulting from the vertical physics 
     82      !!      ==========  alone, for further diagnostics (for example to 
     83      !!                  compute the turbocline depth in zdfmxl.F90). 
     84      !!         avt = zavt 
     85      !!         (avs = zavs if lk_zdfddm=T ) 
     86      !! 
     87      !! ** Action  : - Update (ta,sa) with before vertical diffusion trend 
     88      !! 
    7689      !!--------------------------------------------------------------------- 
    77       !! * Modules used      
    78       USE oce, ONLY :    ztdta => ua,       & ! use ua as 3D workspace    
    79                          ztdsa => va          ! use va as 3D workspace    
    80  
     90      !! * Modules used 
     91      USE oce    , ONLY :   zwd   => ua,  &  ! ua used as workspace 
     92                            zws   => va      ! va   "          " 
    8193      !! * Arguments 
    82       INTEGER, INTENT( in ) ::   kt           ! ocean time-step index 
     94      INTEGER, INTENT( in ) ::   kt          ! ocean time-step index 
     95      REAL(wp), DIMENSION(jpk), INTENT( in ) ::   & 
     96         p2dt                                ! vertical profile of tracer time-step 
    8397 
    8498      !! * Local declarations 
    85       INTEGER ::   ji, jj, jk                 ! dummy loop indices 
    86       INTEGER ::   ikst, ikenm2, ikstp1 
    87       REAL(wp), DIMENSION(jpi,jpk) ::   & 
    88          zwd, zws, zwi,          &  ! ??? 
    89          zwx, zwy, zwz, zwt         ! ??? 
     99      INTEGER  ::   ji, jj, jk               ! dummy loop indices 
     100      REAL(wp) ::   zavi, zrhs               ! temporary scalars 
     101      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   & 
     102         zwi, zwt, zavsi                     ! workspace arrays 
    90103      !!--------------------------------------------------------------------- 
    91104 
    92  
    93       ! 0. Local constant initialization 
    94       ! -------------------------------- 
    95  
    96       ! time step = 2 rdttra ex 
    97       IF( neuler == 0 .AND. kt == nit000 ) THEN 
    98          r2dt(:) =  rdttra(:)              ! restarting with Euler time stepping 
    99       ELSEIF( kt <= nit000 + 1) THEN 
    100          r2dt(:) = 2. * rdttra(:)          ! leapfrog 
     105      IF( kt == nit000 ) THEN 
     106         IF(lwp)WRITE(numout,*) 
     107         IF(lwp)WRITE(numout,*) 'tra_zdf_imp : implicit vertical mixing (k-j-i loops)' 
     108         IF(lwp)WRITE(numout,*) '~~~~~~~~~~~ ' 
     109         zavi = 0.e0      ! avoid warning at compilation phase when lk_ldfslp=F 
    101110      ENDIF 
    102111 
    103       ! Save ta and sa trends 
    104       IF( l_trdtra )   THEN 
    105          ztdta(:,:,:) = ta(:,:,:)  
    106          ztdsa(:,:,:) = sa(:,:,:)  
    107       ENDIF 
    108  
    109       !                                                ! =============== 
    110       DO jj = 2, jpjm1                                 !  Vertical slab 
    111          !                                             ! =============== 
    112          ! 0. Matrix construction 
    113          ! ---------------------- 
    114  
    115          ! Diagonal, inferior, superior (including the bottom boundary condition via avt masked) 
    116          DO jk = 1, jpkm1 
    117             DO ji = 2, jpim1 
    118                zwi(ji,jk) = - r2dt(jk) * avt(ji,jj,jk  )   & 
    119                                        / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
    120                zws(ji,jk) = - r2dt(jk) * avt(ji,jj,jk+1)   & 
    121                                        / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
    122                zwd(ji,jk) = 1. - zwi(ji,jk) - zws(ji,jk) 
    123             END DO 
    124          END DO 
    125  
    126          ! Surface boudary conditions 
    127          DO ji = 2, jpim1 
    128             zwi(ji,1) = 0.e0 
    129             zwd(ji,1) = 1. - zws(ji,1) 
    130          END DO 
    131  
    132          ! 1. Vertical diffusion on temperature 
    133          ! -------------------------=========== 
    134  
    135          ! Second member construction 
    136 #if defined key_zdfkpp 
    137          ! add non-local temperature flux ( in convective case only) 
    138          DO jk = 1, jpkm1 
    139             DO ji = 2, jpim1   
    140                zwy(ji,jk) = tb(ji,jj,jk) + r2dt(jk) * ta(ji,jj,jk)  & 
    141                   &  - r2dt(jk) * ( ghats(ji,jj,jk) * avt(ji,jj,jk) - ghats(ji,jj,jk+1) * avt(ji,jj,jk+1) ) & 
    142                   &               * wt0(ji,jj) / fse3t(ji,jj,jk)  
    143             END DO 
    144          END DO 
     112      ! I. Local initialization 
     113      ! ----------------------- 
     114      zwd  (1,:, : ) = 0.e0     ;     zwd  (jpi,:,:) = 0.e0 
     115      zws  (1,:, : ) = 0.e0     ;     zws  (jpi,:,:) = 0.e0 
     116      zwi  (1,:, : ) = 0.e0     ;     zwi  (jpi,:,:) = 0.e0 
     117      zwt  (1,:, : ) = 0.e0     ;     zwt  (jpi,:,:) = 0.e0 
     118      zavsi(1,:, : ) = 0.e0     ;     zavsi(jpi,:,:) = 0.e0 
     119      zwt  (:,:,jpk) = 0.e0     ;     zwt  ( : ,:,1) = 0.e0 
     120      zavsi(:,:,jpk) = 0.e0     ;     zavsi( : ,:,1) = 0.e0 
     121 
     122      ! II. Vertical trend associated with the vertical physics 
     123      ! ======================================================= 
     124      !     (including the vertical flux proportional to dk[t] associated 
     125      !      with the lateral mixing, through the avt update) 
     126      !     dk[ avt dk[ (t,s) ] ] diffusive trends 
     127 
     128 
     129      ! II.0 Matrix construction 
     130      ! ------------------------ 
     131 
     132#if defined key_ldfslp 
     133      ! update and save of avt (and avs if double diffusive mixing) 
     134      DO jk = 2, jpkm1 
     135         DO jj = 2, jpjm1 
     136            DO ji = fs_2, fs_jpim1   ! vector opt. 
     137               zavi = fsahtw(ji,jj,jk)                       &   ! vertical mixing coef. due to lateral mixing 
     138                  & * (  wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   & 
     139                  &    + wslpj(ji,jj,jk) * wslpj(ji,jj,jk)  ) 
     140               zwt(ji,jj,jk) = avt(ji,jj,jk) + zavi              ! zwt=avt+zavi (total vertical mixing coef. on temperature) 
     141# if defined key_zdfddm 
     142               zavsi(ji,jj,jk) = fsavs(ji,jj,jk) + zavi          ! dd mixing: zavsi = total vertical mixing coef. on salinity 
     143# endif 
     144            END DO 
     145         END DO 
     146      END DO 
     147 
     148      ! Diagonal, inferior, superior  (including the bottom boundary condition via avt masked) 
     149      DO jk = 1, jpkm1 
     150         DO jj = 2, jpjm1 
     151            DO ji = fs_2, fs_jpim1   ! vector opt. 
     152               zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
     153               zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
     154               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     155            END DO 
     156         END DO 
     157      END DO 
    145158#else 
    146          DO jk = 1, jpkm1 
    147             DO ji = 2, jpim1              
    148                zwy(ji,jk) = tb(ji,jj,jk) + r2dt(jk) * ta(ji,jj,jk) 
    149             END DO 
    150          END DO 
     159      ! Diagonal, inferior, superior  (including the bottom boundary condition via avt masked) 
     160      DO jk = 1, jpkm1 
     161         DO jj = 2, jpjm1 
     162            DO ji = fs_2, fs_jpim1   ! vector opt. 
     163               zwi(ji,jj,jk) = - p2dt(jk) * avt(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
     164               zws(ji,jj,jk) = - p2dt(jk) * avt(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
     165               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     166            END DO 
     167         END DO 
     168      END DO 
    151169#endif 
    152170 
    153          ! Matrix inversion from the first level 
    154          ikst = 1 
    155  
    156 #   include "zdf.matrixsolver.h90" 
    157  
    158          ! Save the masked temperature after in ta 
    159          ! (c a u t i o n:  temperature not its trend, Leap-frog scheme done 
    160          !                  it will not be done in tranxt) 
    161          DO jk = 1, jpkm1 
    162             DO ji = 2, jpim1 
    163                ta(ji,jj,jk) = zwx(ji,jk) * tmask(ji,jj,jk) 
    164             END DO 
    165          END DO 
    166  
    167  
    168          ! 2. Vertical diffusion on salinity 
    169          ! -------------------------======== 
     171      ! Surface boudary conditions 
     172      DO jj = 2, jpjm1 
     173         DO ji = fs_2, fs_jpim1   ! vector opt. 
     174            zwi(ji,jj,1) = 0.e0 
     175            zwd(ji,jj,1) = 1. - zws(ji,jj,1) 
     176         END DO 
     177      END DO 
     178 
     179 
     180      ! II.1. Vertical diffusion on t 
     181      ! --------------------------- 
     182 
     183      !! Matrix inversion from the first level 
     184      !!---------------------------------------------------------------------- 
     185      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk ) 
     186      ! 
     187      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 ) 
     188      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 ) 
     189      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 ) 
     190      !        (        ...               )( ...  ) ( ...  ) 
     191      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
     192      ! 
     193      !   m is decomposed in the product of an upper and lower triangular matrix 
     194      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
     195      !   The second member is in 2d array zwy 
     196      !   The solution is in 2d array zwx 
     197      !   The 3d arry zwt is a work space array 
     198      !   zwy is used and then used as a work space array : its value is modified! 
     199 
     200      ! first recurrence:   Tk = Dk - Ik Sk-1 / Tk-1   (increasing k) 
     201      DO jj = 2, jpjm1 
     202         DO ji = fs_2, fs_jpim1 
     203            zwt(ji,jj,1) = zwd(ji,jj,1) 
     204         END DO 
     205      END DO 
     206      DO jk = 2, jpkm1 
     207         DO jj = 2, jpjm1 
     208            DO ji = fs_2, fs_jpim1 
     209               zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1)  /zwt(ji,jj,jk-1) 
     210            END DO 
     211         END DO 
     212      END DO 
     213 
     214      ! second recurrence:    Zk = Yk - Ik / Tk-1  Zk-1 
     215      DO jj = 2, jpjm1 
     216         DO ji = fs_2, fs_jpim1 
     217            ta(ji,jj,1) = tb(ji,jj,1) + p2dt(1) * ta(ji,jj,1) 
     218         END DO 
     219      END DO 
     220      DO jk = 2, jpkm1 
     221         DO jj = 2, jpjm1 
     222            DO ji = fs_2, fs_jpim1 
     223               zrhs = tb(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk)   ! zrhs=right hand side  
     224               ta(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *ta(ji,jj,jk-1) 
     225            END DO 
     226         END DO 
     227      END DO 
     228 
     229      ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 
     230      ! Save the masked temperature after in ta 
     231      ! (c a u t i o n:  temperature not its trend, Leap-frog scheme done it will not be done in tranxt) 
     232      DO jj = 2, jpjm1 
     233         DO ji = fs_2, fs_jpim1 
     234            ta(ji,jj,jpkm1) = ta(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 
     235         END DO 
     236      END DO 
     237      DO jk = jpk-2, 1, -1 
     238         DO jj = 2, jpjm1 
     239            DO ji = fs_2, fs_jpim1 
     240               ta(ji,jj,jk) = ( ta(ji,jj,jk) - zws(ji,jj,jk) * ta(ji,jj,jk+1) ) / zwt(ji,jj,jk) * tmask(ji,jj,jk) 
     241            END DO 
     242         END DO 
     243      END DO 
     244 
     245      ! II.2 Vertical diffusion on salinity 
     246      ! ----------------------------------- 
    170247 
    171248#if defined key_zdfddm 
    172          ! Rebuild the Matrix as avt /= avs 
    173  
    174          ! Diagonal, inferior, superior 
    175          ! (including the bottom boundary condition via avs masked) 
    176          DO jk = 1, jpkm1 
    177             DO ji = 2, jpim1 
    178                zwi(ji,jk) = - r2dt(jk) * fsavs(ji,jj,jk  )   & 
    179                   /( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
    180                zws(ji,jk) = - r2dt(jk) * fsavs(ji,jj,jk+1)   & 
    181                   /( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
    182                zwd(ji,jk) = 1. - zwi(ji,jk) - zws(ji,jk) 
    183             END DO 
    184          END DO 
    185  
    186          ! Surface boudary conditions 
    187          DO ji = 2, jpim1 
    188             zwi(ji,1) = 0.e0 
    189             zwd(ji,1) = 1. - zws(ji,1) 
    190          END DO 
     249      ! Rebuild the Matrix as avt /= avs 
     250 
     251      ! Diagonal, inferior, superior  (including the bottom boundary condition via avs masked) 
     252# if defined key_ldfslp 
     253      DO jk = 1, jpkm1 
     254         DO jj = 2, jpjm1 
     255            DO ji = fs_2, fs_jpim1   ! vector opt. 
     256               zwi(ji,jj,jk) = - p2dt(jk) * zavsi(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
     257               zws(ji,jj,jk) = - p2dt(jk) * zavsi(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
     258               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     259            END DO 
     260         END DO 
     261      END DO 
     262# else 
     263      DO jk = 1, jpkm1 
     264         DO jj = 2, jpjm1 
     265            DO ji = fs_2, fs_jpim1   ! vector opt. 
     266               zwi(ji,jj,jk) = - p2dt(jk) * avs(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) ) 
     267               zws(ji,jj,jk) = - p2dt(jk) * avs(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) ) 
     268               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     269            END DO 
     270         END DO 
     271      END DO 
     272# endif 
     273 
     274      ! Surface boudary conditions 
     275      DO jj = 2, jpjm1 
     276         DO ji = fs_2, fs_jpim1   ! vector opt. 
     277            zwi(ji,jj,1) = 0.e0 
     278            zwd(ji,jj,1) = 1. - zws(ji,jj,1) 
     279         END DO 
     280      END DO 
    191281#endif 
    192          ! Second member construction 
    193 #if defined key_zdfkpp 
    194          ! add non-local salinity flux ( in convective case only) 
    195          DO jk = 1, jpkm1 
    196             DO ji = 2, jpim1   
    197                zwy(ji,jk) = sb(ji,jj,jk) + r2dt(jk) * sa(ji,jj,jk)  & 
    198                   &  - r2dt(jk) * ( ghats(ji,jj,jk) * fsavs(ji,jj,jk) - ghats(ji,jj,jk+1) * fsavs(ji,jj,jk+1) ) & 
    199                   &               * ws0(ji,jj) / fse3t(ji,jj,jk)  
    200             END DO 
    201          END DO 
    202 #else 
    203          DO jk = 1, jpkm1 
    204             DO ji = 2, jpim1              
    205                zwy(ji,jk) = sb(ji,jj,jk) + r2dt(jk) * sa(ji,jj,jk) 
    206             END DO 
    207          END DO 
    208 #endif 
    209   
    210          ! Matrix inversion from the first level 
    211          ikst = 1 
    212  
    213 #   include "zdf.matrixsolver.h90" 
    214  
    215  
    216          ! Save the masked salinity after in sa 
    217          ! (c a u t i o n:  salinity not its trend, Leap-frog scheme done 
    218          !                  it will not be done in tranxt) 
    219          DO jk = 1, jpkm1 
    220             DO ji = 2, jpim1 
    221                sa(ji,jj,jk) = zwx(ji,jk)  * tmask(ji,jj,jk) 
    222             END DO 
    223          END DO 
    224  
    225          !                                             ! =============== 
    226       END DO                                           !   End of slab 
    227       !                                                ! =============== 
    228  
    229       ! save the trends for diagnostic 
    230       ! Compute and save the vertical diffusive temperature & salinity trends 
    231       IF( l_trdtra )   THEN 
    232          ! compute the vertical diffusive trends in substracting the previous  
    233          ! trends ztdta()/ztdsa() to the new one computed (dT/dt or dS/dt)  
    234          ! with the new temperature/salinity ta/sa 
    235          DO jk = 1, jpkm1 
    236             ztdta(:,:,jk) = ( ( ta(:,:,jk) - tb(:,:,jk) ) / r2dt(jk) )   & ! new trend 
    237                 &           - ztdta(:,:,jk)                                ! old trend 
    238             ztdsa(:,:,jk) = ( ( sa(:,:,jk) - sb(:,:,jk) ) / r2dt(jk) )   & ! new trend 
    239                 &           - ztdsa(:,:,jk)                                ! old trend 
    240          END DO 
    241  
    242          CALL trd_mod(ztdta, ztdsa, jpttdzdf, 'TRA', kt) 
    243       ENDIF 
    244  
    245       IF(ln_ctl) THEN         ! print mean trends (used for debugging) 
    246          CALL prt_ctl(tab3d_1=ta, clinfo1=' zdf  - Ta: ', mask1=tmask, & 
    247             &         tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 
    248       ENDIF 
     282 
     283 
     284      !! Matrix inversion from the first level 
     285      !!---------------------------------------------------------------------- 
     286      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk ) 
     287      ! 
     288      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 ) 
     289      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 ) 
     290      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 ) 
     291      !        (        ...               )( ...  ) ( ...  ) 
     292      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
     293      ! 
     294      !   m is decomposed in the product of an upper and lower triangular 
     295      !   matrix 
     296      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
     297      !   The second member is in 2d array zwy 
     298      !   The solution is in 2d array zwx 
     299      !   The 3d arry zwt is a work space array 
     300      !   zwy is used and then used as a work space array : its value is modified! 
     301 
     302      ! first recurrence:   Tk = Dk - Ik Sk-1 / Tk-1   (increasing k) 
     303      DO jj = 2, jpjm1 
     304         DO ji = fs_2, fs_jpim1 
     305            zwt(ji,jj,1) = zwd(ji,jj,1) 
     306         END DO 
     307      END DO 
     308      DO jk = 2, jpkm1 
     309         DO jj = 2, jpjm1 
     310            DO ji = fs_2, fs_jpim1 
     311               zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1)  /zwt(ji,jj,jk-1) 
     312            END DO 
     313         END DO 
     314      END DO 
     315 
     316      ! second recurrence:    Zk = Yk - Ik / Tk-1  Zk-1 
     317      DO jj = 2, jpjm1 
     318         DO ji = fs_2, fs_jpim1 
     319            sa(ji,jj,1) = sb(ji,jj,1) + p2dt(1) * sa(ji,jj,1) 
     320         END DO 
     321      END DO 
     322      DO jk = 2, jpkm1 
     323         DO jj = 2, jpjm1 
     324            DO ji = fs_2, fs_jpim1 
     325               zrhs = sb(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk)   ! zrhs=right hand side 
     326               sa(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *sa(ji,jj,jk-1) 
     327            END DO 
     328         END DO 
     329      END DO 
     330 
     331      ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk 
     332      ! Save the masked temperature after in ta 
     333      ! (c a u t i o n:  temperature not its trend, Leap-frog scheme done it will not be done in tranxt) 
     334      DO jj = 2, jpjm1 
     335         DO ji = fs_2, fs_jpim1 
     336            sa(ji,jj,jpkm1) = sa(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 
     337         END DO 
     338      END DO 
     339      DO jk = jpk-2, 1, -1 
     340         DO jj = 2, jpjm1 
     341            DO ji = fs_2, fs_jpim1 
     342               sa(ji,jj,jk) = ( sa(ji,jj,jk) - zws(ji,jj,jk) * sa(ji,jj,jk+1) ) / zwt(ji,jj,jk) * tmask(ji,jj,jk) 
     343            END DO 
     344         END DO 
     345      END DO 
    249346 
    250347   END SUBROUTINE tra_zdf_imp 
Note: See TracChangeset for help on using the changeset viewer.