Index: trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90
===================================================================
--- trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90	(revision 2524)
+++ trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90	(revision 2528)
@@ -4,5 +4,6 @@
    !! Ocean active tracers:  advection trend 
    !!==============================================================================
-   !! History :  2.0  !  05-11  (G. Madec)  Original code
+   !! History :  2.0  !  2005-11  (G. Madec)  Original code
+   !!            3.3  !  2010-09  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport
    !!----------------------------------------------------------------------
 
@@ -18,7 +19,7 @@
    USE traadv_muscl2   ! MUSCL2   scheme           (tra_adv_muscl2 routine)
    USE traadv_ubs      ! UBS      scheme           (tra_adv_ubs    routine)
-   USE traadv_qck     !! QUICKEST scheme           (tra_adv_qck    routine)
+   USE traadv_qck      ! QUICKEST scheme           (tra_adv_qck    routine)
    USE traadv_eiv      ! eddy induced velocity     (tra_adv_eiv    routine)
-   USE trabbl          ! tracers: bottom boundary layer
+   USE cla             ! cross land advection      (cla_traadv     routine)
    USE ldftra_oce      ! lateral diffusion coefficient on tracers
    USE in_out_manager  ! I/O manager
@@ -29,15 +30,18 @@
    PRIVATE
 
-   PUBLIC   tra_adv    ! routine called by step module
+   PUBLIC   tra_adv        ! routine called by step module
+   PUBLIC   tra_adv_init   ! routine called by opa module
  
-   !                                                   !!* Namelist namtra_adv *
-   LOGICAL, PUBLIC ::   ln_traadv_cen2   = .TRUE.       ! 2nd order centered scheme flag
-   LOGICAL, PUBLIC ::   ln_traadv_tvd    = .FALSE.      ! TVD scheme flag
-   LOGICAL, PUBLIC ::   ln_traadv_muscl  = .FALSE.      ! MUSCL scheme flag
-   LOGICAL, PUBLIC ::   ln_traadv_muscl2 = .FALSE.      ! MUSCL2 scheme flag
-   LOGICAL, PUBLIC ::   ln_traadv_ubs    = .FALSE.      ! UBS scheme flag
-   LOGICAL, PUBLIC ::   ln_traadv_qck    = .FALSE.      ! QUICKEST scheme flag
+   !                                        !!* Namelist namtra_adv *
+   LOGICAL ::   ln_traadv_cen2   = .TRUE.    ! 2nd order centered scheme flag
+   LOGICAL ::   ln_traadv_tvd    = .FALSE.   ! TVD scheme flag
+   LOGICAL ::   ln_traadv_muscl  = .FALSE.   ! MUSCL scheme flag
+   LOGICAL ::   ln_traadv_muscl2 = .FALSE.   ! MUSCL2 scheme flag
+   LOGICAL ::   ln_traadv_ubs    = .FALSE.   ! UBS scheme flag
+   LOGICAL ::   ln_traadv_qck    = .FALSE.   ! QUICKEST scheme flag
 
    INTEGER ::   nadv   ! choice of the type of advection scheme
+
+   REAL(wp), DIMENSION(jpk) ::   r2dt   ! vertical profile time-step, = 2 rdttra except at nit000 (=rdttra) if neuler=0
 
    !! * Substitutions
@@ -45,9 +49,8 @@
 #  include "vectopt_loop_substitute.h90"
    !!----------------------------------------------------------------------
-   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009) 
-   !! $Id$ 
-   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
+   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
+   !! $Id$
+   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
    !!----------------------------------------------------------------------
-
 CONTAINS
 
@@ -60,74 +63,72 @@
       !! ** Method  : - Update (ua,va) with the advection term following nadv
       !!----------------------------------------------------------------------
-#if ( defined key_trabbl_adv || defined key_traldf_eiv )
-      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zun, zvn, zwn   ! effective velocity
-#else
-      USE oce, ONLY :                       zun => un       ! the effective velocity is the
-      USE oce, ONLY :                       zvn => vn       ! Eulerian velocity
-      USE oce, ONLY :                       zwn => wn       ! 
-#endif
-      !!
       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
+      !
+      INTEGER ::   jk   ! dummy loop index
+      REAL(wp), DIMENSION(jpi,jpj,jpk)   ::  zun, zvn, zwn   ! 3D workspace: effective transport
       !!----------------------------------------------------------------------
+      !                                          ! set time step
+      IF( neuler == 0 .AND. kt == nit000 ) THEN     ! at nit000
+         r2dt(:) =  rdttra(:)                          ! = rdtra (restarting with Euler time stepping)
+      ELSEIF( kt <= nit000 + 1) THEN                ! at nit000 or nit000+1
+         r2dt(:) = 2. * rdttra(:)                      ! = 2 rdttra (leapfrog)
+      ENDIF
+      !
+      IF( nn_cla == 1 )   CALL cla_traadv( kt )       !==  Cross Land Advection  ==! (hor. advection)
+      !
+      !                                               !==  effective transport  ==!
+      DO jk = 1, jpkm1
+         zun(:,:,jk) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)                  ! eulerian transport only
+         zvn(:,:,jk) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
+         zwn(:,:,jk) = e1t(:,:) * e2t(:,:)      * wn(:,:,jk)
+      END DO
+      zwn(:,:,jpk) = 0.e0                                                     ! no transport trough the bottom
+      !
+      IF( lk_traldf_eiv .AND. .NOT. ln_traldf_grif )   &
+         &              CALL tra_adv_eiv( kt, zun, zvn, zwn, 'TRA' )          ! add the eiv transport (if necessary)
+      !
+      CALL iom_put( "uoce_eff", zun )                                         ! output effective transport      
+      CALL iom_put( "voce_eff", zvn )
+      CALL iom_put( "woce_eff", zwn )
 
-      IF( kt == nit000 )   CALL tra_adv_ctl          ! initialisation & control of options
-
-#if defined key_trabbl_adv
-      zun(:,:,:) = un(:,:,:) - u_bbl(:,:,:)          ! add the bbl velocity
-      zvn(:,:,:) = vn(:,:,:) - v_bbl(:,:,:)
-      zwn(:,:,:) = wn(:,:,:) + w_bbl(:,:,:)
-#endif
-      IF( lk_traldf_eiv ) THEN                       ! commpute and add the eiv velocity
-         IF( .NOT. lk_trabbl_adv ) THEN 
-            zun(:,:,:) = un(:,:,:)
-            zvn(:,:,:) = vn(:,:,:)
-            zwn(:,:,:) = wn(:,:,:)
-         ENDIF
-         CALL tra_adv_eiv( kt, zun, zvn, zwn ) 
-      ENDIF
-
-      SELECT CASE ( nadv )                           ! compute advection trend and add it to general trend
-      CASE ( 1 )   ;   CALL tra_adv_cen2    ( kt, zun, zvn, zwn )    ! 2nd order centered scheme
-      CASE ( 2 )   ;   CALL tra_adv_tvd     ( kt, zun, zvn, zwn )    ! TVD      scheme
-      CASE ( 3 )   ;   CALL tra_adv_muscl   ( kt, zun, zvn, zwn )    ! MUSCL    scheme
-      CASE ( 4 )   ;   CALL tra_adv_muscl2  ( kt, zun, zvn, zwn )    ! MUSCL2   scheme
-      CASE ( 5 )   ;   CALL tra_adv_ubs     ( kt, zun, zvn, zwn )    ! UBS      scheme
-      CASE ( 6 )   ;   CALL tra_adv_qck     ( kt, zun, zvn, zwn )    ! QUICKEST scheme
+      SELECT CASE ( nadv )                            !==  compute advection trend and add it to general trend  ==!
+      CASE ( 1 )   ;    CALL tra_adv_cen2  ( kt, 'TRA',       zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  2nd order centered
+      CASE ( 2 )   ;    CALL tra_adv_tvd   ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  TVD 
+      CASE ( 3 )   ;    CALL tra_adv_muscl ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb,      tsa, jpts )   !  MUSCL 
+      CASE ( 4 )   ;    CALL tra_adv_muscl2( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  MUSCL2 
+      CASE ( 5 )   ;    CALL tra_adv_ubs   ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  UBS 
+      CASE ( 6 )   ;    CALL tra_adv_qck   ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )   !  QUICKEST 
       !
-      CASE (-1 )                                                     ! esopa: test all possibility with control print
-                       CALL tra_adv_cen2    ( kt, zun, zvn, zwn )
-                       CALL prt_ctl( tab3d_1=ta, clinfo1=' adv0 - Ta: ', mask1=tmask,               &
-            &                        tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-                       CALL tra_adv_tvd     ( kt, zun, zvn, zwn )
-                       CALL prt_ctl( tab3d_1=ta, clinfo1=' adv2 - Ta: ', mask1=tmask,               &
-            &                        tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-                       CALL tra_adv_muscl   ( kt, zun, zvn, zwn )
-                       CALL prt_ctl( tab3d_1=ta, clinfo1=' adv3 - Ta: ', mask1=tmask,               &
-            &                        tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-                       CALL tra_adv_muscl2  ( kt, zun, zvn, zwn )
-                       CALL prt_ctl( tab3d_1=ta, clinfo1=' adv4 - Ta: ', mask1=tmask,               &
-            &                        tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-                       CALL tra_adv_ubs     ( kt, zun, zvn, zwn )
-                       CALL prt_ctl( tab3d_1=ta, clinfo1=' adv5 - Ta: ', mask1=tmask,               &
-            &                        tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
-                       CALL tra_adv_qck     ( kt, zun, zvn, zwn )
-                       CALL prt_ctl( tab3d_1=ta, clinfo1=' adv6 - Ta: ', mask1=tmask,               &
-            &                        tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+      CASE (-1 )                                      !==  esopa: test all possibility with control print  ==!
+         CALL tra_adv_cen2  ( kt, 'TRA',       zun, zvn, zwn, tsb, tsn, tsa, jpts )          
+         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv0 - Ta: ', mask1=tmask,               &
+            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+         CALL tra_adv_tvd   ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )          
+         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv1 - Ta: ', mask1=tmask,               &
+            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+         CALL tra_adv_muscl ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb,      tsa, jpts )          
+         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv3 - Ta: ', mask1=tmask,               &
+            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+         CALL tra_adv_muscl2( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )          
+         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv4 - Ta: ', mask1=tmask,               &
+            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+         CALL tra_adv_ubs   ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )          
+         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv5 - Ta: ', mask1=tmask,               &
+            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+         CALL tra_adv_qck   ( kt, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts )          
+         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv6 - Ta: ', mask1=tmask,               &
+            &          tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
       END SELECT
-       
-      CALL iom_put( "uoce_eff", zun )   ! effective i-current      
-      CALL iom_put( "voce_eff", zvn )   ! effective j-current
-      CALL iom_put( "woce_eff", zwn )   ! effective vert. current
-
+      !
       !                                              ! print mean trends (used for debugging)
-      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' adv  - Ta: ', mask1=tmask,               &
-         &                       tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
+      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv  - Ta: ', mask1=tmask,               &
+         &                       tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
       !
    END SUBROUTINE tra_adv
 
 
-   SUBROUTINE tra_adv_ctl
+   SUBROUTINE tra_adv_init
       !!---------------------------------------------------------------------
-      !!                  ***  ROUTINE tra_adv_ctl  ***
+      !!                  ***  ROUTINE tra_adv_init  ***
       !!                
       !! ** Purpose :   Control the consistency between namelist options for 
@@ -135,7 +136,7 @@
       !!----------------------------------------------------------------------
       INTEGER ::   ioptio
-
-      NAMELIST/namtra_adv/ ln_traadv_cen2 , ln_traadv_tvd,    &
-         &                 ln_traadv_muscl, ln_traadv_muscl2, &
+      !!
+      NAMELIST/namtra_adv/ ln_traadv_cen2 , ln_traadv_tvd,     &
+         &                 ln_traadv_muscl, ln_traadv_muscl2,  &
          &                 ln_traadv_ubs  , ln_traadv_qck
       !!----------------------------------------------------------------------
@@ -146,5 +147,5 @@
       IF(lwp) THEN                    ! Namelist print
          WRITE(numout,*)
-         WRITE(numout,*) 'tra_adv_ctl : choice/control of the tracer advection scheme'
+         WRITE(numout,*) 'tra_adv_init : choice/control of the tracer advection scheme'
          WRITE(numout,*) '~~~~~~~~~~~'
          WRITE(numout,*) '   Namelist namtra_adv : chose a advection scheme for tracers'
@@ -155,5 +156,5 @@
          WRITE(numout,*) '      UBS    advection scheme        ln_traadv_ubs    = ', ln_traadv_ubs
          WRITE(numout,*) '      QUICKEST advection scheme      ln_traadv_qck    = ', ln_traadv_qck
-    ENDIF
+      ENDIF
 
       ioptio = 0                      ! Parameter control
@@ -167,7 +168,4 @@
 
       IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE advection scheme in namelist namtra_adv' )
-
-      IF( n_cla == 1 .AND. .NOT. ln_traadv_cen2 )   &
-         &                CALL ctl_stop( 'cross-land advection only with 2nd order advection scheme' )
 
       !                              ! Set nadv
@@ -191,5 +189,5 @@
       ENDIF
       !
-   END SUBROUTINE tra_adv_ctl
+   END SUBROUTINE tra_adv_init
 
   !!======================================================================
