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

    • Property svn:eol-style deleted
    • Property svn:executable deleted
    r1601 r2528  
    44   !! Ocean Active tracers : lateral diffusive trends  
    55   !!===================================================================== 
    6    !! History :  9.0  ! 05-11 (G. Madec)  Original code 
    7    !!---------------------------------------------------------------------- 
    8  
    9    !!---------------------------------------------------------------------- 
    10    !!   tra_ldf     : update the tracer trend with the lateral diffusion 
    11    !!       ldf_ctl : initialization, namelist read, and parameters control 
    12    !!       ldf_ano : compute lateral diffusion for constant T-S profiles 
     6   !! History :  9.0  ! 2005-11 (G. Madec)  Original code 
     7   !!       NEMO 3.0  ! 2008-01  (C. Ethe, G. Madec)  merge TRC-TRA  
     8   !!---------------------------------------------------------------------- 
     9 
     10   !!---------------------------------------------------------------------- 
     11   !!   tra_ldf      : update the tracer trend with the lateral diffusion 
     12   !!   tra_ldf_init : initialization, namelist read, and parameters control 
     13   !!       ldf_ano  : compute lateral diffusion for constant T-S profiles 
    1314   !!---------------------------------------------------------------------- 
    1415   USE oce             ! ocean dynamics and tracers 
     
    2021   USE traldf_bilap    ! lateral mixing             (tra_ldf_bilap routine) 
    2122   USE traldf_iso      ! lateral mixing               (tra_ldf_iso routine) 
     23   USE traldf_iso_grif ! lateral mixing          (tra_ldf_iso_grif routine) 
    2224   USE traldf_lap      ! lateral mixing               (tra_ldf_lap routine) 
    23    USE trdmod          ! ocean active tracers trends 
    24    USE trdmod_oce      ! ocean variables trends 
     25   USE trdmod_oce      ! ocean space and time domain 
     26   USE trdtra          ! ocean active tracers trends 
    2527   USE prtctl          ! Print control 
    2628   USE in_out_manager  ! I/O manager 
     
    3133   PRIVATE 
    3234 
    33    PUBLIC   tra_ldf    ! called by step.F90  
    34  
    35    INTEGER, PUBLIC ::   nldf = 0   ! type of lateral diffusion used defined from ln_traldf_... namlist logicals) 
    36                                    ! (need to be public to be used in vertical diffusion routine) 
     35   PUBLIC   tra_ldf         ! called by step.F90  
     36   PUBLIC   tra_ldf_init    ! called by opa.F90  
     37   ! 
     38   INTEGER ::   nldf = 0   ! type of lateral diffusion used defined from ln_traldf_... namlist logicals) 
    3739#if defined key_traldf_ano 
    38    REAL, DIMENSION(jpi,jpj,jpk) ::   t0_ldf, s0_ldf   ! lateral diffusion trends of T & S 
    39       !                                               ! for a constant vertical profile 
     40   REAL, DIMENSION(jpi,jpj,jpk) ::   t0_ldf, s0_ldf   ! lateral diffusion trends of T & S for a constant profile 
    4041#endif 
    4142 
     
    4445#  include "vectopt_loop_substitute.h90" 
    4546   !!---------------------------------------------------------------------- 
    46    !!   OPA 9.0 , LOCEAN-IPSL (2006)  
     47   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    4748   !! $Id$  
    48    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    49    !!---------------------------------------------------------------------- 
    50  
     49   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     50   !!---------------------------------------------------------------------- 
    5151CONTAINS 
    5252 
     
    5656      !!  
    5757      !! ** Purpose :   compute the lateral ocean tracer physics. 
    58       !! 
    5958      !!---------------------------------------------------------------------- 
    6059      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
    6160      !! 
    62       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztrdt, ztrds   ! 3D temporary workspace 
    63       !!---------------------------------------------------------------------- 
    64  
    65       IF( kt == nit000 )   CALL ldf_ctl          ! initialisation & control of options 
    66  
    67       IF( l_trdtra )   THEN                      ! temporary save of ta and sa trends 
    68          ztrdt(:,:,:) = ta(:,:,:)  
    69          ztrds(:,:,:) = sa(:,:,:)  
     61      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  ztrdt, ztrds 
     62      !!---------------------------------------------------------------------- 
     63 
     64      IF( l_trdtra )   THEN                    !* Save ta and sa trends 
     65         ALLOCATE( ztrdt(jpi,jpj,jpk) )   ;    ztrdt(:,:,:) = tsa(:,:,:,jp_tem)  
     66         ALLOCATE( ztrds(jpi,jpj,jpk) )   ;    ztrds(:,:,:) = tsa(:,:,:,jp_sal) 
    7067      ENDIF 
    7168 
    7269      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend 
    73       CASE ( 0 )   ;   CALL tra_ldf_lap   ( kt )      ! iso-level laplacian 
    74       CASE ( 1 )   ;   CALL tra_ldf_iso   ( kt )      ! rotated laplacian (except dk[ dk[.] ] part) 
    75       CASE ( 2 )   ;   CALL tra_ldf_bilap ( kt )      ! iso-level bilaplacian 
    76       CASE ( 3 )   ;   CALL tra_ldf_bilapg( kt )      ! s-coord. horizontal bilaplacian 
     70      CASE ( 0 )   ;   CALL tra_ldf_lap     ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts        )  ! iso-level laplacian 
     71      CASE ( 1 )                                                                              ! rotated laplacian 
     72         IF( ln_traldf_grif ) THEN                                                           
     73                       CALL tra_ldf_iso_grif( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 )      ! Griffies operator 
     74         ELSE                                                                                 
     75                       CALL tra_ldf_iso     ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 )      ! Madec operator 
     76         ENDIF 
     77      CASE ( 2 )   ;   CALL tra_ldf_bilap   ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts        )  ! iso-level bilaplacian 
     78      CASE ( 3 )   ;   CALL tra_ldf_bilapg  ( kt, 'TRA',             tsb, tsa, jpts        )  ! s-coord. geopot. bilap. 
    7779         ! 
    78       CASE ( -1 )                                     ! esopa: test all possibility with control print 
    79          CALL tra_ldf_lap    ( kt ) 
    80          CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf0 - Ta: ', mask1=tmask,               & 
    81             &          tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    82          CALL tra_ldf_iso    ( kt ) 
    83          CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf1 - Ta: ', mask1=tmask,               & 
    84             &          tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    85          CALL tra_ldf_bilap  ( kt ) 
    86          CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf2 - Ta: ', mask1=tmask,               & 
    87             &          tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    88          CALL tra_ldf_bilapg ( kt ) 
    89          CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf3 - Ta: ', mask1=tmask,               & 
    90             &          tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     80      CASE ( -1 )                                ! esopa: test all possibility with control print 
     81         CALL tra_ldf_lap   ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts        )  
     82         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf0 - Ta: ', mask1=tmask,               & 
     83         &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     84         IF( ln_traldf_grif ) THEN 
     85            CALL tra_ldf_iso_grif( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 ) 
     86         ELSE 
     87            CALL tra_ldf_iso     ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts, ahtb0 )   
     88         ENDIF 
     89         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf1 - Ta: ', mask1=tmask,               & 
     90         &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     91         CALL tra_ldf_bilap ( kt, 'TRA', gtsu, gtsv, tsb, tsa, jpts        )  
     92         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf2 - Ta: ', mask1=tmask,               & 
     93         &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     94         CALL tra_ldf_bilapg( kt, 'TRA',             tsb, tsa, jpts        )  
     95         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf3 - Ta: ', mask1=tmask,               & 
     96         &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    9197      END SELECT 
    9298 
    9399#if defined key_traldf_ano 
    94       ta(:,:,:) = ta(:,:,:) - t0_ldf(:,:,:)      ! anomaly: substract the reference diffusivity 
    95       sa(:,:,:) = sa(:,:,:) - s0_ldf(:,:,:) 
     100      tsa(:,:,:,jp_tem) = tsa(:,:,:,jp_tem) - t0_ldf(:,:,:)      ! anomaly: substract the reference diffusivity 
     101      tsa(:,:,:,jp_sal) = tsa(:,:,:,jp_sal) - s0_ldf(:,:,:) 
    96102#endif 
     103 
    97104      IF( l_trdtra )   THEN                      ! save the horizontal diffusive trends for further diagnostics 
    98          ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:) 
    99          ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:) 
    100          CALL trd_mod( ztrdt, ztrds, jptra_trd_ldf, 'TRA', kt ) 
     105         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 
     106         ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:) 
     107         CALL trd_tra( kt, 'TRA', jp_tem, jptra_trd_ldf, ztrdt ) 
     108         CALL trd_tra( kt, 'TRA', jp_sal, jptra_trd_ldf, ztrds ) 
     109         DEALLOCATE( ztrdt )      ;     DEALLOCATE( ztrds )  
    101110      ENDIF 
    102111      !                                          ! print mean trends (used for debugging) 
    103       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' ldf  - Ta: ', mask1=tmask,               & 
    104          &                       tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     112      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' ldf  - Ta: ', mask1=tmask,               & 
     113         &                       tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    105114      ! 
    106115   END SUBROUTINE tra_ldf 
    107116 
    108117 
    109    SUBROUTINE ldf_ctl 
    110       !!---------------------------------------------------------------------- 
    111       !!                  ***  ROUTINE ldf_ctl  *** 
     118   SUBROUTINE tra_ldf_init 
     119      !!---------------------------------------------------------------------- 
     120      !!                  ***  ROUTINE tra_ldf_init  *** 
    112121      !!  
    113122      !! ** Purpose :   Choice of the operator for the lateral tracer diffusion 
     
    122131      INTEGER ::   ioptio, ierr         ! temporary integers  
    123132!       
    124 !     NAMELIST/namtra_ldf/ ln_traldf_lap  , ln_traldf_bilap,                  & 
    125 !        &                 ln_traldf_level, ln_traldf_hor  , ln_traldf_iso,   & 
    126 !        &                 rn_aht_0       , rn_ahtb_0      , rn_aeiv_0 
    127133      !!---------------------------------------------------------------------- 
    128134 
     
    130136      ! =============================================== 
    131137     
    132 !     REWIND( numnam )                ! Namelist namtra_ldf already read in ldftra module 
    133 !     READ  ( numnam, namtra_ldf )     
    134  
    135138      IF(lwp) THEN                    ! Namelist print 
    136139         WRITE(numout,*) 
    137          WRITE(numout,*) 'tra:ldf_ctl : lateral tracer diffusive operator' 
     140         WRITE(numout,*) 'tra_ldf_init : lateral tracer diffusive operator' 
    138141         WRITE(numout,*) '~~~~~~~~~~~' 
    139          WRITE(numout,*) '   Namelist namtra_ldf : set lateral mixing parameters (type, direction, coefficients)' 
    140          WRITE(numout,*) '      laplacian operator          ln_traldf_lap   = ', ln_traldf_lap 
    141          WRITE(numout,*) '      bilaplacian operator        ln_traldf_bilap = ', ln_traldf_bilap 
    142          WRITE(numout,*) '      iso-level                   ln_traldf_level = ', ln_traldf_level 
    143          WRITE(numout,*) '      horizontal (geopotential)   ln_traldf_hor   = ', ln_traldf_hor 
    144          WRITE(numout,*) '      iso-neutral                 ln_traldf_iso   = ', ln_traldf_iso 
     142         WRITE(numout,*) '   Namelist namtra_ldf already read in ldftra module' 
     143         WRITE(numout,*) '   see ldf_tra_init report for lateral mixing parameters' 
     144         WRITE(numout,*) 
    145145      ENDIF 
    146146 
     
    225225      CALL ldf_ano 
    226226      ! 
    227    END SUBROUTINE ldf_ctl 
     227   END SUBROUTINE tra_ldf_init 
    228228 
    229229#if defined key_traldf_ano 
     
    271271      t0_ldf(:,:,:) = 0.e0 
    272272      s0_ldf(:,:,:) = 0.e0 
    273       ztb   (:,:,:) = tb (:,:,:) 
    274       zsb   (:,:,:) = sb (:,:,:) 
    275       ua    (:,:,:) = ta (:,:,:) 
    276       va    (:,:,:) = sa (:,:,:) 
     273      ztb   (:,:,:) = tsb (:,:,:,jp_tem) 
     274      zsb   (:,:,:) = tsb (:,:,:,jp_sal) 
     275      ua    (:,:,:) = tsa (:,:,:,jp_tem) 
     276      va    (:,:,:) = tsa (:,:,:,jp_sal) 
    277277      zavt  (:,:,:) = avt(:,:,:) 
    278278      IF( lk_zdfddm ) THEN CALL ctl_stop( ' key_traldf_ano with key_zdfddm not implemented' ) 
    279279      ! set tb, sb to reference values and avr to zero 
    280       tb (:,:,:) = zt_ref(:,:,:) 
    281       sb (:,:,:) = zs_ref(:,:,:) 
    282       ta (:,:,:) = 0.e0 
    283       sa (:,:,:) = 0.e0 
    284       avt(:,:,:) = 0.e0 
     280      tsb (:,:,:,jp_tem) = zt_ref(:,:,:) 
     281      tsb (:,:,:,jp_sal) = zs_ref(:,:,:) 
     282      tsa (:,:,:,jp_tem) = 0.e0 
     283      tsa (:,:,:,jp_sal) = 0.e0 
     284      avt(:,:,:)         = 0.e0 
    285285 
    286286      ! Compute the ldf trends 
     
    295295      IF( neuler == 1)   z12 = 1.e0 
    296296      IF( ln_zdfexp ) THEN      ! ta,sa are the trends 
    297          t0_ldf(:,:,:) = ta(:,:,:) 
    298          s0_ldf(:,:,:) = sa(:,:,:) 
     297         t0_ldf(:,:,:) = tsa(:,:,:,jp_tem) 
     298         s0_ldf(:,:,:) = tsa(:,:,:,jp_sal) 
    299299      ELSE 
    300300         DO jk = 1, jpkm1 
    301             t0_ldf(:,:,jk) = ( ta(:,:,jk) - tb(:,:,jk) ) / ( z12 *rdttra(jk) ) 
    302             s0_ldf(:,:,jk) = ( sa(:,:,jk) - tb(:,:,jk) ) / ( z12 *rdttra(jk) ) 
     301            t0_ldf(:,:,jk) = ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / ( z12 *rdttra(jk) ) 
     302            s0_ldf(:,:,jk) = ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / ( z12 *rdttra(jk) ) 
    303303         END DO 
    304304      ENDIF 
    305       tb    (:,:,:) = ztb (:,:,:) 
    306       sb    (:,:,:) = zsb (:,:,:) 
    307       ta    (:,:,:) = ua  (:,:,:) 
    308       sa    (:,:,:) = va  (:,:,:) 
    309       avt   (:,:,:) = zavt(:,:,:) 
     305      tsb(:,:,:,jp_tem) = ztb (:,:,:) 
     306      tsb(:,:,:,jp_sal) = zsb (:,:,:) 
     307      tsa(:,:,:,jp_tem) = ua  (:,:,:) 
     308      tsa(:,:,:,jp_sal) = va  (:,:,:) 
     309      avt(:,:,:)        = zavt(:,:,:) 
    310310      ! 
    311311   END SUBROUTINE ldf_ano 
Note: See TracChangeset for help on using the changeset viewer.