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 2148 – NEMO

Changeset 2148


Ignore:
Timestamp:
2010-10-04T15:53:42+02:00 (14 years ago)
Author:
cetlod
Message:

merge LOCEAN 2010 developments branches

Location:
branches/DEV_r2106_LOCEAN2010/NEMO
Files:
1 added
35 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DOM/dom_oce.F90

    r2006 r2148  
    145145   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   e3vw_1             !: analytical vertical scale factors at  VW-- 
    146146   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   e3w_1  , e3uw_1    !:                                       W--UW  points (m) 
     147   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   e3t_b              !: before         -      -      -    -   T      points (m) 
     148   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   e3u_b  , e3v_b     !:   -            -      -      -    -   U--V   points (m) 
    147149#else 
    148150   LOGICAL, PUBLIC, PARAMETER ::   lk_vvl = .FALSE.   !: fixed grid flag 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DOM/domvvl.F90

    r2004 r2148  
    5151      !!---------------------------------------------------------------------- 
    5252      INTEGER  ::   ji, jj, jk 
    53       REAL(wp) ::   zcoefu, zcoefv, zcoeff 
     53      REAL(wp) ::   zcoefu , zcoefv   , zcoeff                   ! temporary scalars 
     54      REAL(wp) ::   zv_t_ij, zv_t_ip1j, zv_t_ijp1, zv_t_ip1jp1   !     -        - 
     55      REAL(wp), DIMENSION(jpi,jpj) ::  zs_t, zs_u_1, zs_v_1      !     -     2D workspace 
    5456      !!---------------------------------------------------------------------- 
    5557 
     
    6264      IF( lk_zco )   CALL ctl_stop( 'dom_vvl : key_zco is incompatible with variable volume option key_vvl') 
    6365 
    64       IF( ln_zco) THEN 
    65          DO jk = 1, jpk 
    66             gdept(:,:,jk) = gdept_0(jk) 
    67             gdepw(:,:,jk) = gdepw_0(jk) 
    68             gdep3w(:,:,jk) = gdepw_0(jk) 
    69             e3t (:,:,jk) = e3t_0(jk) 
    70             e3u (:,:,jk) = e3t_0(jk) 
    71             e3v (:,:,jk) = e3t_0(jk) 
    72             e3f (:,:,jk) = e3t_0(jk) 
    73             e3w (:,:,jk) = e3w_0(jk) 
    74             e3uw(:,:,jk) = e3w_0(jk) 
    75             e3vw(:,:,jk) = e3w_0(jk) 
    76          END DO 
    77       ELSE 
    78          fsdept(:,:,:) = gdept (:,:,:) 
    79          fsdepw(:,:,:) = gdepw (:,:,:) 
    80          fsde3w(:,:,:) = gdep3w(:,:,:) 
    81          fse3t (:,:,:) = e3t   (:,:,:) 
    82          fse3u (:,:,:) = e3u   (:,:,:) 
    83          fse3v (:,:,:) = e3v   (:,:,:) 
    84          fse3f (:,:,:) = e3f   (:,:,:) 
    85          fse3w (:,:,:) = e3w   (:,:,:) 
    86          fse3uw(:,:,:) = e3uw  (:,:,:) 
    87          fse3vw(:,:,:) = e3vw  (:,:,:) 
    88       ENDIF 
     66      fsdept(:,:,:) = gdept (:,:,:) 
     67      fsdepw(:,:,:) = gdepw (:,:,:) 
     68      fsde3w(:,:,:) = gdep3w(:,:,:) 
     69      fse3t (:,:,:) = e3t   (:,:,:) 
     70      fse3u (:,:,:) = e3u   (:,:,:) 
     71      fse3v (:,:,:) = e3v   (:,:,:) 
     72      fse3f (:,:,:) = e3f   (:,:,:) 
     73      fse3w (:,:,:) = e3w   (:,:,:) 
     74      fse3uw(:,:,:) = e3uw  (:,:,:) 
     75      fse3vw(:,:,:) = e3vw  (:,:,:) 
    8976 
    9077      !                                 !==  mu computation  ==! 
     
    130117         hv_0(:,:) = hv_0(:,:) + fse3v_0(:,:,jk) * vmask(:,:,jk) 
    131118      END DO 
     119       
     120      ! surface at t-points and inverse surface at (u/v)-points used in surface averaging computations 
     121      ! for ssh and scale factors 
     122      zs_t  (:,:) =       e1t(:,:) * e2t(:,:) 
     123      zs_u_1(:,:) = 0.5 / e1u(:,:) * e2u(:,:) 
     124      zs_v_1(:,:) = 0.5 / e1v(:,:) * e2v(:,:) 
    132125 
    133126      DO jj = 1, jpjm1                          ! initialise before and now Sea Surface Height at u-, v-, f-points 
    134127         DO ji = 1, jpim1   ! NO vector opt. 
    135             zcoefu = 0.5  * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) ) 
    136             zcoefv = 0.5  * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) ) 
    137             zcoeff = 0.25 * umask(ji,jj,1) * umask(ji,jj+1,1) 
    138             sshu_b(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)     & 
    139                &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) )    
    140             sshv_b(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )     & 
    141                &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) )    
    142             sshf_b(ji,jj) = zcoeff * ( sshb(ji  ,jj) + sshb(ji  ,jj+1)                 & 
    143                &                     + sshb(ji+1,jj) + sshb(ji+1,jj+1) )                
    144             sshu_n(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn(ji  ,jj)     & 
    145                &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn(ji+1,jj) )    
    146             sshv_n(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn(ji,jj  )     &  
    147                &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn(ji,jj+1) )      
    148             sshf_n(ji,jj) = zcoeff * ( sshn(ji  ,jj) + sshn(ji  ,jj+1)                 & 
    149                &                     + sshn(ji+1,jj) + sshn(ji+1,jj+1) )                
     128            zcoefu = umask(ji,jj,1) * zs_u_1(ji,jj) 
     129            zcoefv = vmask(ji,jj,1) * zs_v_1(ji,jj) 
     130            zcoeff = 0.5 * umask(ji,jj,1) * umask(ji,jj+1,1) / ( e1f(ji,jj) * e2f(ji,jj) ) 
     131            ! before fields 
     132            zv_t_ij       = zs_t(ji  ,jj  ) * sshb(ji  ,jj  ) 
     133            zv_t_ip1j     = zs_t(ji+1,jj  ) * sshb(ji+1,jj  ) 
     134            zv_t_ijp1     = zs_t(ji  ,jj+1) * sshb(ji  ,jj+1) 
     135            sshu_b(ji,jj) = zcoefu * ( zv_t_ij + zv_t_ip1j ) 
     136            sshv_b(ji,jj) = zcoefv * ( zv_t_ij + zv_t_ijp1 ) 
     137            ! now fields 
     138            zv_t_ij       = zs_t(ji  ,jj  ) * sshn(ji  ,jj  ) 
     139            zv_t_ip1j     = zs_t(ji+1,jj  ) * sshn(ji+1,jj  ) 
     140            zv_t_ijp1     = zs_t(ji  ,jj+1) * sshn(ji  ,jj+1) 
     141            zv_t_ip1jp1   = zs_t(ji  ,jj+1) * sshn(ji  ,jj+1) 
     142            sshu_n(ji,jj) = zcoefu * ( zv_t_ij + zv_t_ip1j ) 
     143            sshv_n(ji,jj) = zcoefv * ( zv_t_ij + zv_t_ijp1 ) 
     144            sshf_n(ji,jj) = zcoeff * ( zv_t_ij + zv_t_ip1j + zv_t_ijp1 + zv_t_ip1jp1 ) 
    150145         END DO 
    151146      END DO 
    152       CALL lbc_lnk( sshu_b, 'U', 1. )   ;   CALL lbc_lnk( sshu_n, 'U', 1. )      ! lateral boundary conditions 
    153       CALL lbc_lnk( sshv_b, 'V', 1. )   ;   CALL lbc_lnk( sshv_n, 'V', 1. ) 
    154       CALL lbc_lnk( sshf_b, 'F', 1. )   ;   CALL lbc_lnk( sshf_n, 'F', 1. ) 
     147      CALL lbc_lnk( sshu_n, 'U', 1. )   ;   CALL lbc_lnk( sshu_b, 'U', 1. )      ! lateral boundary conditions 
     148      CALL lbc_lnk( sshv_n, 'V', 1. )   ;   CALL lbc_lnk( sshv_b, 'V', 1. ) 
     149      CALL lbc_lnk( sshf_n, 'F', 1. ) 
     150 
     151                                                ! initialise before scale factors at (u/v)-points 
     152      ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
     153      DO jk = 1, jpkm1 
     154         DO jj = 1, jpjm1 
     155            DO ji = 1, jpim1 
     156               zv_t_ij           = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
     157               zv_t_ip1j         = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
     158               zv_t_ijp1         = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
     159               fse3u_b(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
     160               fse3v_b(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
     161            END DO 
     162         END DO 
     163      END DO 
     164      CALL lbc_lnk( fse3u_b(:,:,:), 'U', 1. )               ! lateral boundary conditions 
     165      CALL lbc_lnk( fse3v_b(:,:,:), 'V', 1. ) 
     166      ! Add initial scale factor to scale factor anomaly 
     167      fse3u_b(:,:,:) = fse3u_b(:,:,:) + fse3u_0(:,:,:) 
     168      fse3v_b(:,:,:) = fse3v_b(:,:,:) + fse3v_0(:,:,:) 
    155169      ! 
    156          DO jk = 1, jpkm1 
    157             fsdept(:,:,jk) = fsdept_n(:,:,jk)          ! now local depths stored in fsdep. arrays 
    158             fsdepw(:,:,jk) = fsdepw_n(:,:,jk) 
    159             fsde3w(:,:,jk) = fsde3w_n(:,:,jk) 
    160             ! 
    161             fse3t (:,:,jk) = fse3t_n (:,:,jk)          ! vertical scale factors stored in fse3. arrays 
    162             fse3u (:,:,jk) = fse3u_n (:,:,jk) 
    163             fse3v (:,:,jk) = fse3v_n (:,:,jk) 
    164             fse3f (:,:,jk) = fse3f_n (:,:,jk) 
    165             fse3w (:,:,jk) = fse3w_n (:,:,jk) 
    166             fse3uw(:,:,jk) = fse3uw_n(:,:,jk) 
    167             fse3vw(:,:,jk) = fse3vw_n(:,:,jk) 
    168          END DO 
    169  
    170  
    171  
    172170   END SUBROUTINE dom_vvl 
    173171 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DOM/domzgr_substitute.h90

    r1565 r2148  
    4646#   define  fse3vw(i,j,k)  e3vw_1(i,j,k) 
    4747 
    48 #   define  fsdept_b(i,j,k)  (fsdept_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
    49 #   define  fsdepw_b(i,j,k)  (fsdepw_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
    50 #   define  fsde3w_b(i,j,k)  (fsde3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))-sshb(i,j)) 
    51 #   define  fse3t_b(i,j,k)   (fse3t_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
    52 #   define  fse3u_b(i,j,k)   (fse3u_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
    53 #   define  fse3v_b(i,j,k)   (fse3v_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
    54 #   define  fse3f_b(i,j,k)   (fse3f_0(i,j,k)*(1.+sshf_b(i,j)*muf(i,j,k))) 
    55 #   define  fse3w_b(i,j,k)   (fse3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     48#   define  fse3t_b(i,j,k)   e3t_b(i,j,k) 
     49#   define  fse3u_b(i,j,k)   e3u_b(i,j,k) 
     50#   define  fse3v_b(i,j,k)   e3v_b(i,j,k) 
    5651#   define  fse3uw_b(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
    5752#   define  fse3vw_b(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     
    7065#   define  fse3t_m(i,j,k)   (fse3t_0(i,j,k)*(1.+ssh_m(i,j)*mut(i,j,k))) 
    7166 
    72 #   define  fsdept_a(i,j,k)  (fsdept_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
    73 #   define  fsdepw_a(i,j,k)  (fsdepw_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
    74 #   define  fsde3w_a(i,j,k)  (fsde3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))-ssha(i,j)) 
    7567#   define  fse3t_a(i,j,k)   (fse3t_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
    7668#   define  fse3u_a(i,j,k)   (fse3u_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 
    7769#   define  fse3v_a(i,j,k)   (fse3v_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 
    78 #   define  fse3f_a(i,j,k)   (fse3f_0(i,j,k)*(1.+sshf_a(i,j)*muf(i,j,k))) 
    79 #   define  fse3w_a(i,j,k)   (fse3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
    80 #   define  fse3uw_a(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 
    81 #   define  fse3vw_a(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 
    8270 
    8371#else 
     
    9482#   define  fse3vw(i,j,k)  fse3vw_0(i,j,k) 
    9583 
    96 #   define  fsdept_b(i,j,k)  fsdept_0(i,j,k) 
    97 #   define  fsdepw_b(i,j,k)  fsdepw_0(i,j,k) 
    98 #   define  fsde3w_b(i,j,k)  fsde3w_0(i,j,k) 
    9984#   define  fse3t_b(i,j,k)   fse3t_0(i,j,k) 
    10085#   define  fse3u_b(i,j,k)   fse3u_0(i,j,k) 
    10186#   define  fse3v_b(i,j,k)   fse3v_0(i,j,k) 
    102 #   define  fse3f_b(i,j,k)   fse3f_0(i,j,k) 
    103 #   define  fse3w_b(i,j,k)   fse3w_0(i,j,k) 
    10487#   define  fse3uw_b(i,j,k)  fse3uw_0(i,j,k) 
    10588#   define  fse3vw_b(i,j,k)  fse3vw_0(i,j,k) 
     
    118101#   define  fse3t_m(i,j,k)   fse3t_0(i,j,k) 
    119102 
    120 #   define  fsdept_a(i,j,k)  fsdept_0(i,j,k) 
    121 #   define  fsdepw_a(i,j,k)  fsdepw_0(i,j,k) 
    122 #   define  fsde3w_a(i,j,k)  fsde3w_0(i,j,k) 
    123103#   define  fse3t_a(i,j,k)   fse3t_0(i,j,k) 
    124104#   define  fse3u_a(i,j,k)   fse3u_0(i,j,k) 
    125105#   define  fse3v_a(i,j,k)   fse3v_0(i,j,k) 
    126 #   define  fse3f_a(i,j,k)   fse3f_0(i,j,k) 
    127 #   define  fse3w_a(i,j,k)   fse3w_0(i,j,k) 
    128 #   define  fse3uw_a(i,j,k)  fse3uw_0(i,j,k) 
    129 #   define  fse3vw_a(i,j,k)  fse3vw_0(i,j,k) 
    130106#endif 
    131107   !!---------------------------------------------------------------------- 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DYN/divcur.F90

    r1953 r2148  
    1414   USE in_out_manager  ! I/O manager 
    1515   USE obc_oce         ! ocean lateral open boundary condition 
    16    USE bdy_oce        ! Unstructured open boundaries variables 
     16   USE bdy_oce         ! Unstructured open boundaries variables 
    1717   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    1818 
     
    8787      INTEGER ::   ii, ij, jl     ! temporary integer 
    8888      INTEGER ::   ijt, iju       ! temporary integer 
     89      REAL(wp) ::  zraur, zdep 
    8990      REAL(wp), DIMENSION(   jpi  ,1:jpj+2) ::   zwu   ! workspace 
    9091      REAL(wp), DIMENSION(-1:jpi+2,  jpj  ) ::   zwv   ! workspace 
     
    301302      !! * Local declarations 
    302303      INTEGER  ::   ji, jj, jk          ! dummy loop indices 
     304      REAL(wp) ::  zraur, zdep 
    303305      !!---------------------------------------------------------------------- 
    304306 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DYN/dynnxt.F90

    r1970 r2148  
    2222   USE oce             ! ocean dynamics and tracers 
    2323   USE dom_oce         ! ocean space and time domain 
     24   USE sbc_oce         ! Surface boundary condition: ocean fields 
     25   USE phycst          ! physical constants 
    2426   USE dynspg_oce      ! type of surface pressure gradient 
    2527   USE dynadv          ! dynamics: vector invariant versus flux form 
     
    8789      !!               un,vn   now horizontal velocity of next time-step 
    8890      !!---------------------------------------------------------------------- 
     91      USE oce, ONLY :   ze3u_f => ta   ! use ta as 3D workspace 
     92      USE oce, ONLY :   ze3v_f => sa   ! use sa as 3D workspace 
    8993      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    9094      !! 
     
    9599      REAL(wp) ::   zue3a , zue3n , zue3b    ! temporary scalar 
    96100      REAL(wp) ::   zve3a , zve3n , zve3b    !    -         - 
    97       REAL(wp) ::   ze3u_b, ze3u_n, ze3u_a   !    -         - 
    98       REAL(wp) ::   ze3v_b, ze3v_n, ze3v_a   !    -         -  
    99101      REAL(wp) ::   zuf   , zvf              !    -         -  
     102      REAL(wp) ::   zec                      !    -         -  
     103      REAL(wp) ::   zv_t_ij  , zv_t_ip1j     !     -        - 
     104      REAL(wp) ::   zv_t_ijp1                !     -        - 
     105      REAL(wp), DIMENSION(jpi,jpj) ::  zs_t, zs_u_1, zs_v_1      ! temporary 2D workspace 
    100106      !!---------------------------------------------------------------------- 
    101107 
     
    146152# if defined key_obc 
    147153      !                                !* OBC open boundaries 
    148       IF( lk_obc )   CALL obc_dyn( kt ) 
     154      CALL obc_dyn( kt ) 
    149155      ! 
    150156      IF ( lk_dynspg_exp .OR. lk_dynspg_ts ) THEN 
     
    212218         END DO 
    213219      ELSE                                             !* Leap-Frog : Asselin filter and swap 
    214          IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN          ! applied on velocity 
     220         !                                ! =============! 
     221         IF( .NOT. lk_vvl ) THEN          ! Fixed volume ! 
     222            !                             ! =============! 
    215223            DO jk = 1, jpkm1                               
    216224               DO jj = 1, jpj 
    217225                  DO ji = 1, jpi     
    218                      zuf = atfp * ( ub(ji,jj,jk) + ua(ji,jj,jk) ) + atfp1 * un(ji,jj,jk) 
    219                      zvf = atfp * ( vb(ji,jj,jk) + va(ji,jj,jk) ) + atfp1 * vn(ji,jj,jk) 
     226                     zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2.e0 * un(ji,jj,jk) + ua(ji,jj,jk) ) 
     227                     zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2.e0 * vn(ji,jj,jk) + va(ji,jj,jk) ) 
    220228                     ! 
    221229                     ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
     
    226234               END DO 
    227235            END DO 
    228          ELSE                                                ! applied on thickness weighted velocity 
     236            !                             ! ================! 
     237         ELSE                             ! Variable volume ! 
     238            !                             ! ================! 
     239            ! Before scale factor at t-points 
     240            ! ------------------------------- 
    229241            DO jk = 1, jpkm1 
    230                DO jj = 1, jpj 
    231                   DO ji = 1, jpi 
    232                      ze3u_a = fse3u_a(ji,jj,jk) 
    233                      ze3v_a = fse3v_a(ji,jj,jk) 
    234                      ze3u_n = fse3u_n(ji,jj,jk) 
    235                      ze3v_n = fse3v_n(ji,jj,jk) 
    236                      ze3u_b = fse3u_b(ji,jj,jk) 
    237                      ze3v_b = fse3v_b(ji,jj,jk) 
    238                      ! 
    239                      zue3a = ua(ji,jj,jk) * ze3u_a 
    240                      zve3a = va(ji,jj,jk) * ze3v_a 
    241                      zue3n = un(ji,jj,jk) * ze3u_n 
    242                      zve3n = vn(ji,jj,jk) * ze3v_n 
    243                      zue3b = ub(ji,jj,jk) * ze3u_b 
    244                      zve3b = vb(ji,jj,jk) * ze3v_b 
    245                      ! 
    246                      zuf  = ( atfp  * ( zue3b  + zue3a  ) + atfp1 * zue3n  )   & 
    247                         & / ( atfp  * ( ze3u_b + ze3u_a ) + atfp1 * ze3u_n ) * umask(ji,jj,jk) 
    248                      zvf  = ( atfp  * ( zve3b  + zve3a  ) + atfp1 * zve3n  )   & 
    249                         & / ( atfp  * ( ze3v_b + ze3v_a ) + atfp1 * ze3v_n ) * vmask(ji,jj,jk) 
    250                      ! 
    251                      ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
    252                      vb(ji,jj,jk) = zvf 
    253                      un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
    254                      vn(ji,jj,jk) = va(ji,jj,jk) 
    255                   END DO 
    256                END DO 
    257             END DO 
     242               fse3t_b(:,:,jk) = fse3t_n(:,:,jk)                                   & 
     243                  &              + atfp * (  fse3t_b(:,:,jk) + fse3t_a(:,:,jk)     & 
     244                  &                         - 2.e0 * fse3t_n(:,:,jk)            ) 
     245            ENDDO 
     246            ! Add volume filter correction only at the first level of t-point scale factors 
     247            zec = atfp * rdt / rau0 
     248            fse3t_b(:,:,1) = fse3t_b(:,:,1) - zec * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 
     249            ! surface at t-points and inverse surface at (u/v)-points used in surface averaging computations 
     250            zs_t  (:,:) =       e1t(:,:) * e2t(:,:) 
     251            zs_u_1(:,:) = 0.5 / e1u(:,:) * e2u(:,:) 
     252            zs_v_1(:,:) = 0.5 / e1v(:,:) * e2v(:,:) 
     253            ! 
     254            IF( ln_dynadv_vec ) THEN 
     255               ! Before scale factor at (u/v)-points 
     256               ! ----------------------------------- 
     257               ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
     258               DO jk = 1, jpkm1 
     259                  DO jj = 1, jpjm1 
     260                     DO ji = 1, jpim1 
     261                        zv_t_ij           = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
     262                        zv_t_ip1j         = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
     263                        zv_t_ijp1         = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
     264                        fse3u_b(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
     265                        fse3v_b(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
     266                     END DO 
     267                  END DO 
     268               END DO 
     269               ! lateral boundary conditions 
     270               CALL lbc_lnk( fse3u_b(:,:,:), 'U', 1. ) 
     271               CALL lbc_lnk( fse3v_b(:,:,:), 'V', 1. ) 
     272               ! Add initial scale factor to scale factor anomaly 
     273               fse3u_b(:,:,:) = fse3u_b(:,:,:) + fse3u_0(:,:,:) 
     274               fse3v_b(:,:,:) = fse3v_b(:,:,:) + fse3v_0(:,:,:) 
     275               ! Leap-Frog - Asselin filter and swap: applied on velocity 
     276               ! ----------------------------------- 
     277               DO jk = 1, jpkm1 
     278                  DO jj = 1, jpj 
     279                     DO ji = 1, jpi 
     280                        zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2.e0 * un(ji,jj,jk) + ua(ji,jj,jk) ) 
     281                        zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2.e0 * vn(ji,jj,jk) + va(ji,jj,jk) ) 
     282                        ! 
     283                        ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
     284                        vb(ji,jj,jk) = zvf 
     285                        un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
     286                        vn(ji,jj,jk) = va(ji,jj,jk) 
     287                     END DO 
     288                  END DO 
     289               END DO 
     290               ! 
     291            ELSE 
     292               ! Temporary filered scale factor at (u/v)-points (will become before scale factor) 
     293               !----------------------------------------------- 
     294               ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 
     295               DO jk = 1, jpkm1 
     296                  DO jj = 1, jpjm1 
     297                     DO ji = 1, jpim1 
     298                        zv_t_ij          = zs_t(ji  ,jj  ) * fse3t_b(ji  ,jj  ,jk) 
     299                        zv_t_ip1j        = zs_t(ji+1,jj  ) * fse3t_b(ji+1,jj  ,jk) 
     300                        zv_t_ijp1        = zs_t(ji  ,jj+1) * fse3t_b(ji  ,jj+1,jk) 
     301                        ze3u_f(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 
     302                        ze3v_f(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 
     303                     END DO 
     304                  END DO 
     305               END DO 
     306               ! lateral boundary conditions 
     307               CALL lbc_lnk( ze3u_f, 'U', 1. ) 
     308               CALL lbc_lnk( ze3v_f, 'V', 1. ) 
     309               ! Add initial scale factor to scale factor anomaly 
     310               ze3u_f(:,:,:) = ze3u_f(:,:,:) + fse3u_0(:,:,:) 
     311               ze3v_f(:,:,:) = ze3v_f(:,:,:) + fse3v_0(:,:,:) 
     312               ! Leap-Frog - Asselin filter and swap: applied on thickness weighted velocity 
     313               ! -----------------------------------             =========================== 
     314               DO jk = 1, jpkm1 
     315                  DO jj = 1, jpj 
     316                     DO ji = 1, jpim1 
     317                        zue3a = ua(ji,jj,jk) * fse3u_a(ji,jj,jk) 
     318                        zve3a = va(ji,jj,jk) * fse3v_a(ji,jj,jk) 
     319                        zue3n = un(ji,jj,jk) * fse3u_n(ji,jj,jk) 
     320                        zve3n = vn(ji,jj,jk) * fse3v_n(ji,jj,jk) 
     321                        zue3b = ub(ji,jj,jk) * fse3u_b(ji,jj,jk) 
     322                        zve3b = vb(ji,jj,jk) * fse3v_b(ji,jj,jk) 
     323                        ! 
     324                        zuf  = ( zue3n + atfp * ( zue3b - 2.e0 * zue3n  + zue3a ) ) / ze3u_f(ji,jj,jk) 
     325                        zvf  = ( zve3n + atfp * ( zve3b - 2.e0 * zve3n  + zve3a ) ) / ze3v_f(ji,jj,jk) 
     326                        ! 
     327                        ub(ji,jj,jk) = zuf                      ! ub <-- filtered velocity 
     328                        vb(ji,jj,jk) = zvf 
     329                        un(ji,jj,jk) = ua(ji,jj,jk)             ! un <-- ua 
     330                        vn(ji,jj,jk) = va(ji,jj,jk) 
     331                     END DO 
     332                  END DO 
     333               END DO 
     334               fse3u_b(:,:,:) = ze3u_f(:,:,:)                   ! e3u_b <-- filtered scale factor 
     335               fse3v_b(:,:,:) = ze3v_f(:,:,:) 
     336               CALL lbc_lnk( ub, 'U', -1. )                     ! lateral boundary conditions 
     337               CALL lbc_lnk( vb, 'V', -1. ) 
     338            ENDIF 
     339            ! 
    258340         ENDIF 
     341         ! 
    259342      ENDIF 
    260343 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DYN/dynzdf_exp.F90

    r1537 r2148  
    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  !  1002-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 an explicit time-stepping scheme. 
    1415   !!---------------------------------------------------------------------- 
    15    !! * Modules used 
    1616   USE oce             ! ocean dynamics and tracers 
    1717   USE dom_oce         ! ocean space and time domain 
     
    2424   PRIVATE 
    2525 
    26    !! * Routine accessibility 
    27    PUBLIC dyn_zdf_exp    ! called by step.F90 
     26   PUBLIC   dyn_zdf_exp   ! called by step.F90 
    2827 
    2928   !! * Substitutions 
     
    3130#  include "vectopt_loop_substitute.h90" 
    3231   !!---------------------------------------------------------------------- 
    33    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
     32   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
    3433   !! $Id$ 
    3534   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     
    4746      !!      technique. The vertical diffusion of momentum is given by: 
    4847      !!         diffu = dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ub) ) 
    49       !!      Surface boundary conditions: wind stress input 
     48      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2) 
    5049      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F90) 
    5150      !!      Add this trend to the general trend ua : 
     
    5453      !! ** Action : - Update (ua,va) with the vertical diffusive trend 
    5554      !!--------------------------------------------------------------------- 
    56       !! * Arguments 
    57       INTEGER , INTENT( in ) ::   kt                           ! ocean time-step index 
    58       REAL(wp), INTENT( in ) ::   p2dt                         ! time-step  
    59  
    60       !! * Local declarations 
    61       INTEGER ::   ji, jj, jk, jl                              ! dummy loop indices 
    62       REAL(wp) ::   zrau0r, zlavmr, zua, zva                   ! temporary scalars 
    63       REAL(wp), DIMENSION(jpi,jpk) ::   zwx, zwy, zwz, zww     ! temporary workspace arrays 
     55      INTEGER , INTENT(in) ::   kt     ! ocean time-step index 
     56      REAL(wp), INTENT(in) ::   p2dt   ! time-step  
     57      !! 
     58      INTEGER ::   ji, jj, jk, jl                            ! dummy loop indices 
     59      REAL(wp) ::   zrau0r, zlavmr, zua, zva                 ! temporary scalars 
     60      REAL(wp), DIMENSION(jpi,jpk) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    6461      !!---------------------------------------------------------------------- 
    6562 
    6663      IF( kt == nit000 ) THEN 
    6764         IF(lwp) WRITE(numout,*) 
    68          IF(lwp) WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion explicit operator' 
     65         IF(lwp) WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator' 
    6966         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
    7067      ENDIF 
    7168 
    72       ! Local constant initialization 
    73       ! ----------------------------- 
    74       zrau0r = 1. / rau0                                   ! inverse of the reference density 
    75       zlavmr = 1. / float( nn_zdfexp )                      ! inverse of the number of sub time step 
     69      zrau0r = 1. / rau0                              ! Local constant initialization 
     70      zlavmr = 1. / REAL( nn_zdfexp ) 
    7671 
    77       !                                                ! =============== 
    78       DO jj = 2, jpjm1                                 !  Vertical slab 
    79          !                                             ! =============== 
    80  
    81          ! Surface boundary condition 
    82          DO ji = 2, jpim1 
    83             zwy(ji,1) = utau(ji,jj) * zrau0r 
    84             zww(ji,1) = vtau(ji,jj) * zrau0r 
     72      !                                               ! =============== 
     73      DO jj = 2, jpjm1                                !  Vertical slab 
     74         !                                            ! =============== 
     75         DO ji = 2, jpim1         ! Surface boundary condition 
     76            zwy(ji,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r 
     77            zww(ji,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r 
    8578         END DO   
    86  
    87          ! Initialization of x, z and contingently trends array 
    88          DO jk = 1, jpk 
     79         DO jk = 1, jpk         ! Initialization of x, z and contingently trends array 
    8980            DO ji = 2, jpim1 
    9081               zwx(ji,jk) = ub(ji,jj,jk) 
     
    9283            END DO   
    9384         END DO   
    94  
    95          ! Time splitting loop 
    96          DO jl = 1, nn_zdfexp 
    97  
    98             ! First vertical derivative 
    99             DO jk = 2, jpk 
     85         ! 
     86         DO jl = 1, nn_zdfexp     ! Time splitting loop 
     87            ! 
     88            DO jk = 2, jpk            ! First vertical derivative 
    10089               DO ji = 2, jpim1 
    10190                  zwy(ji,jk) = avmu(ji,jj,jk) * ( zwx(ji,jk-1) - zwx(ji,jk) ) / fse3uw(ji,jj,jk)  
     
    10392               END DO   
    10493            END DO   
    105  
    106             ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 
    107             DO jk = 1, jpkm1 
     94            DO jk = 1, jpkm1          ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp 
    10895               DO ji = 2, jpim1 
    109                   zua = zlavmr*( zwy(ji,jk) - zwy(ji,jk+1) ) / fse3u(ji,jj,jk) 
    110                   zva = zlavmr*( zww(ji,jk) - zww(ji,jk+1) ) / fse3v(ji,jj,jk) 
     96                  zua = zlavmr * ( zwy(ji,jk) - zwy(ji,jk+1) ) / fse3u(ji,jj,jk) 
     97                  zva = zlavmr * ( zww(ji,jk) - zww(ji,jk+1) ) / fse3v(ji,jj,jk) 
    11198                  ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
    11299                  va(ji,jj,jk) = va(ji,jj,jk) + zva 
    113  
    114                   zwx(ji,jk) = zwx(ji,jk) + p2dt*zua*umask(ji,jj,jk) 
    115                   zwz(ji,jk) = zwz(ji,jk) + p2dt*zva*vmask(ji,jj,jk) 
     100                  ! 
     101                  zwx(ji,jk) = zwx(ji,jk) + p2dt * zua * umask(ji,jj,jk) 
     102                  zwz(ji,jk) = zwz(ji,jk) + p2dt * zva * vmask(ji,jj,jk) 
    116103               END DO   
    117104            END DO   
    118  
     105            ! 
    119106         END DO   
    120  
    121          !                                             ! =============== 
    122       END DO                                           !   End of slab 
    123       !                                                ! =============== 
    124  
     107         !                                            ! =============== 
     108      END DO                                          !   End of slab 
     109      !                                               ! =============== 
    125110   END SUBROUTINE dyn_zdf_exp 
    126111 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DYN/dynzdf_imp.F90

    r1662 r2148  
    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 , LOCEAN-IPSL (2010)  
    3833   !! $Id$ 
    39    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     34   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    4035   !!---------------------------------------------------------------------- 
    4136 
    4237CONTAINS 
    43  
    4438 
    4539   SUBROUTINE dyn_zdf_imp( kt, p2dt ) 
     
    5448      !!             dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) ) 
    5549      !!      backward time stepping 
    56       !!      Surface boundary conditions: wind stress input 
     50      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2) 
    5751      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F) 
    5852      !!      Add this trend to the general trend ua : 
    5953      !!         ua = ua + dz( avmu dz(u) ) 
    6054      !! 
    61       !! ** Action : - Update (ua,va) arrays with the after vertical diffusive 
    62       !!               mixing trend. 
     55      !! ** Action : - Update (ua,va) arrays with the after vertical diffusive mixing trend. 
    6356      !!--------------------------------------------------------------------- 
    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 
     57      USE oce, ONLY :  zwd   => ta      ! use ta as workspace 
     58      USE oce, ONLY :  zws   => sa      ! use sa as workspace 
     59      !! 
     60      INTEGER , INTENT( in ) ::   kt    ! ocean time-step index 
     61      REAL(wp), INTENT( in ) ::  p2dt   ! vertical profile of tracer time-step 
     62      !! 
     63      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
     64      REAL(wp) ::   zrau0r, zcoef         ! temporary scalars 
     65      REAL(wp) ::   zzwi, zzws, zrhs       ! temporary scalars 
     66      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwi        ! 3D workspace 
    7767      !!---------------------------------------------------------------------- 
    7868 
     
    9585      ! friction velocity in dyn_bfr using values from the previous timestep. There 
    9686      ! is no need to include these in the implicit calculation. 
    97       DO jk = 1, jpkm1 
     87      ! 
     88      DO jk = 1, jpkm1        ! Matrix 
    9889         DO jj = 2, jpjm1  
    9990            DO ji = fs_2, fs_jpim1   ! vector opt. 
    10091               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) 
     92               zzwi          = zcoef * avmu (ji,jj,jk  ) / fse3uw(ji,jj,jk  ) 
     93               zwi(ji,jj,jk) = zzwi  * umask(ji,jj,jk) 
     94               zzws          = zcoef * avmu (ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 
     95               zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1) 
    10596               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws 
    10697            END DO 
    10798         END DO 
    10899      END DO 
    109  
    110       ! Surface boudary conditions 
    111       DO jj = 2, jpjm1  
     100      DO jj = 2, jpjm1        ! Surface boudary conditions 
    112101         DO ji = fs_2, fs_jpim1   ! vector opt. 
    113102            zwi(ji,jj,1) = 0. 
     
    130119      !   The solution (the after velocity) is in ua 
    131120      !----------------------------------------------------------------------- 
    132  
    133       ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k) 
    134       DO jk = 2, jpkm1 
     121      ! 
     122      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    135123         DO jj = 2, jpjm1    
    136124            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    139127         END DO 
    140128      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) 
     129      ! 
     130      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
     131         DO ji = fs_2, fs_jpim1   ! vector opt. 
     132            ua(ji,jj,1) = ub(ji,jj,1)   & 
     133               &        + p2dt * (  ua(ji,jj,1) + 0.5 * ( utau_b(ji,jj) + utau(ji,jj) ) / ( fse3u(ji,jj,1) * rau0 )  ) 
    151134         END DO 
    152135      END DO 
     
    159142         END DO 
    160143      END DO 
    161  
    162       ! thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk 
    163       DO jj = 2, jpjm1    
     144      ! 
     145      DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  == 
    164146         DO ji = fs_2, fs_jpim1   ! vector opt. 
    165147            ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
     
    173155         END DO 
    174156      END DO 
    175  
    176       ! Normalization to obtain the general momentum trend ua 
    177       DO jk = 1, jpkm1 
     157      ! 
     158      DO jk = 1, jpkm1        !==  Normalization to obtain the general momentum trend ua  == 
    178159         DO jj = 2, jpjm1    
    179160            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    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) 
    202184               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zzws 
     
    204186         END DO 
    205187      END DO 
    206  
    207       ! Surface boudary conditions 
    208       DO jj = 2, jpjm1    
     188      DO jj = 2, jpjm1        ! Surface boudary conditions 
    209189         DO ji = fs_2, fs_jpim1   ! vector opt. 
    210190            zwi(ji,jj,1) = 0.e0 
     
    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)   & 
     221               &        + p2dt * (  va(ji,jj,1) + 0.5 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( 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) 
     
    271243         END DO 
    272244      END DO 
    273  
    274       ! Normalization to obtain the general momentum trend va 
    275       DO jk = 1, jpkm1 
     245      ! 
     246      DO jk = 1, jpkm1     !==  Normalization to obtain the general momentum trend va  == 
    276247         DO jj = 2, jpjm1    
    277248            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    280251         END DO 
    281252      END DO 
    282  
     253      ! 
    283254   END SUBROUTINE dyn_zdf_imp 
    284255 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/DYN/sshwzv.F90

    r2113 r2148  
    55   !!============================================================================== 
    66   !! History :  3.1  !  2009-02  (G. Madec, M. Leclair)  Original code 
     7   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  modified LF-RA  
    78   !!---------------------------------------------------------------------- 
    89 
     
    2728   USE diaar5, ONLY :   lk_diaar5 
    2829   USE iom 
    29    USE sbcrnf, ONLY : rnf_dep, rnf_mod_dep  ! River runoff  
     30   USE sbcrnf, ONLY : rnf_dep, rnf_mod_dep  ! River runoff 
    3031 
    3132   IMPLICIT NONE 
     
    3839#  include "domzgr_substitute.h90" 
    3940#  include "vectopt_loop_substitute.h90" 
    40  
    41    !!---------------------------------------------------------------------- 
    42    !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
     41   !!---------------------------------------------------------------------- 
     42   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
    4343   !! $Id$ 
    4444   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     
    5454      !!              and update the now vertical coordinate (lk_vvl=T). 
    5555      !! 
    56       !! ** Method  : - 
    57       !! 
    58       !!              - Using the incompressibility hypothesis, the vertical  
     56      !! ** Method  : - Using the incompressibility hypothesis, the vertical  
    5957      !!      velocity is computed by integrating the horizontal divergence   
    6058      !!      from the bottom to the surface minus the scale factor evolution. 
     
    6361      !! ** action  :   ssha    : after sea surface height 
    6462      !!                wn      : now vertical velocity 
    65       !! if lk_vvl=T:   sshu_a, sshv_a, sshf_a  : after sea surface height 
    66       !!                          at u-, v-, f-point s 
    67       !!                hu, hv, hur, hvr : ocean depth and its inverse at u-,v-points 
     63      !!                sshu_a, sshv_a, sshf_a  : after sea surface height (lk_vvl=T) 
     64      !!                hu, hv, hur, hvr        : ocean depth and its inverse at u-,v-points 
     65      !! 
     66      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    6867      !!---------------------------------------------------------------------- 
    6968      USE oce, ONLY :   z3d => ta   ! use ta as 3D workspace 
     
    7372      INTEGER  ::   ji, jj, jk      ! dummy loop indices 
    7473      REAL(wp) ::   zcoefu, zcoefv, zcoeff      ! temporary scalars 
    75       REAL(wp) ::   z2dt, zraur     ! temporary scalars 
     74      REAL(wp) ::   z2dt, z1_2dt, z1_rau0       ! temporary scalars 
    7675      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv       ! 2D workspace 
    7776      REAL(wp), DIMENSION(jpi,jpj) ::   z2d         ! 2D workspace 
     
    7978 
    8079      IF( kt == nit000 ) THEN 
     80         ! 
    8181         IF(lwp) WRITE(numout,*) 
    8282         IF(lwp) WRITE(numout,*) 'ssh_wzv : after sea surface height and now vertical velocity ' 
     
    9595                  sshv_b(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )     & 
    9696                     &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) ) 
    97                   sshf_b(ji,jj) = zcoeff * ( sshb(ji  ,jj) + sshb(ji  ,jj+1)                 & 
    98                      &                     + sshb(ji+1,jj) + sshb(ji+1,jj+1) ) 
    9997                  sshu_n(ji,jj) = zcoefu * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn(ji  ,jj)     & 
    10098                     &                     + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn(ji+1,jj) ) 
    10199                  sshv_n(ji,jj) = zcoefv * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn(ji,jj  )     & 
    102100                     &                     + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn(ji,jj+1) ) 
    103                   sshf_n(ji,jj) = zcoeff * ( sshn(ji  ,jj) + sshn(ji  ,jj+1)                 & 
    104                      &                     + sshn(ji+1,jj) + sshn(ji+1,jj+1) ) 
    105101               END DO 
    106102            END DO 
    107103            CALL lbc_lnk( sshu_b, 'U', 1. )   ;   CALL lbc_lnk( sshu_n, 'U', 1. ) 
    108104            CALL lbc_lnk( sshv_b, 'V', 1. )   ;   CALL lbc_lnk( sshv_n, 'V', 1. ) 
    109             CALL lbc_lnk( sshf_b, 'F', 1. )   ;   CALL lbc_lnk( sshf_n, 'F', 1. ) 
     105            DO jj = 1, jpjm1 
     106               DO ji = 1, jpim1      ! NO Vector Opt. 
     107                  sshf_n(ji,jj) = 0.5  * umask(ji,jj,1) * umask(ji,jj+1,1)                   & 
     108                       &               / ( e1f(ji,jj  ) * e2f(ji,jj  ) )                     & 
     109                       &               * ( e1u(ji,jj  ) * e2u(ji,jj  ) * sshu_n(ji,jj  )     & 
     110                       &                 + e1u(ji,jj+1) * e2u(ji,jj+1) * sshu_n(ji,jj+1) ) 
     111               END DO 
     112            END DO 
     113            CALL lbc_lnk( sshf_n, 'F', 1. ) 
    110114         ENDIF 
    111115         ! 
    112116      ENDIF 
    113117 
    114       !                                           !------------------------------! 
    115       IF( lk_vvl ) THEN                           !  Update Now Vertical coord.  !   (only in vvl case) 
    116       !                                           !------------------------------! 
     118      !                                           !------------------------------------------! 
     119      IF( lk_vvl ) THEN                           !  Regridding: Update Now Vertical coord.  !   (only in vvl case) 
     120         !                                        !------------------------------------------! 
    117121         DO jk = 1, jpkm1 
    118             fsdept(:,:,jk) = fsdept_n(:,:,jk)          ! now local depths stored in fsdep. arrays 
     122            fsdept(:,:,jk) = fsdept_n(:,:,jk)         ! now local depths stored in fsdep. arrays 
    119123            fsdepw(:,:,jk) = fsdepw_n(:,:,jk) 
    120124            fsde3w(:,:,jk) = fsde3w_n(:,:,jk) 
    121125            ! 
    122             fse3t (:,:,jk) = fse3t_n (:,:,jk)          ! vertical scale factors stored in fse3. arrays 
     126            fse3t (:,:,jk) = fse3t_n (:,:,jk)         ! vertical scale factors stored in fse3. arrays 
    123127            fse3u (:,:,jk) = fse3u_n (:,:,jk) 
    124128            fse3v (:,:,jk) = fse3v_n (:,:,jk) 
     
    128132            fse3vw(:,:,jk) = fse3vw_n(:,:,jk) 
    129133         END DO 
    130          !                                             ! now ocean depth (at u- and v-points) 
    131          hu(:,:) = hu_0(:,:) + sshu_n(:,:) 
     134         ! 
     135         hu(:,:) = hu_0(:,:) + sshu_n(:,:)            ! now ocean depth (at u- and v-points) 
    132136         hv(:,:) = hv_0(:,:) + sshv_n(:,:) 
    133          !                                             ! now masked inverse of the ocean depth (at u- and v-points) 
     137         !                                            ! now masked inverse of the ocean depth (at u- and v-points) 
    134138         hur(:,:) = umask(:,:,1) / ( hu(:,:) + 1.e0 - umask(:,:,1) ) 
    135139         hvr(:,:) = vmask(:,:,1) / ( hv(:,:) + 1.e0 - vmask(:,:,1) ) 
    136140         ! 
    137          ! 
    138          DO jj = 1, jpj 
    139             DO ji = 1, jpi 
    140                rnf_dep(ji,jj) = 0. 
    141                DO jk = 1, rnf_mod_dep(ji,jj)                          ! recalculates rnf_dep to be the depth  
    142                   rnf_dep(ji,jj) = rnf_dep(ji,jj) + fse3t(ji,jj,jk)    ! in metres to the bottom of the relevant grid box  
    143                ENDDO 
    144             ENDDO 
    145          ENDDO 
    146          !  
    147       ENDIF 
    148  
    149                          CALL div_cur( kt )            ! Horizontal divergence & Relative vorticity 
    150       IF( n_cla == 1 )   CALL div_cla( kt )            ! Cross Land Advection (Update Hor. divergence) 
    151  
    152       ! set time step size (Euler/Leapfrog) 
    153       z2dt = 2. * rdt  
     141      ENDIF 
     142      ! 
     143 
     144                         CALL div_cur( kt )           ! Horizontal divergence & Relative vorticity 
     145      IF( n_cla == 1 )   CALL div_cla( kt )           ! Cross Land Advection (Update Hor. divergence) 
     146 
     147      z2dt = 2. * rdt                                 ! set time step size (Euler/Leapfrog) 
    154148      IF( neuler == 0 .AND. kt == nit000 )   z2dt =rdt 
    155  
    156       zraur = 1. / rau0 
    157149 
    158150      !                                           !------------------------------! 
     
    163155        zhdiv(:,:) = zhdiv(:,:) + fse3t(:,:,jk) * hdivn(:,:,jk) 
    164156      END DO 
    165  
    166157      !                                                ! Sea surface elevation time stepping 
    167       ssha(:,:) = (  sshb(:,:) - z2dt * ( zraur * ( emp(:,:)-rnf(:,:) ) + zhdiv(:,:) )  ) * tmask(:,:,1)  
     158      ! In forward Euler time stepping case, the same formulation as in the leap-frog case can be used 
     159      ! because emp_b field is initialized with the vlaues of emp field. Hence, 0.5 * ( emp + emp_b -2*rnf ) = emp 
     160      z1_rau0 = 0.5 / rau0 
     161      ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) - 2 * rnf(:,:) ) + zhdiv(:,:) )  ) & 
     162      &                      * tmask(:,:,1) 
    168163 
    169164#if defined key_obc 
    170       IF ( Agrif_Root() ) THEN  
     165      IF( Agrif_Root() ) THEN  
    171166         ssha(:,:) = ssha(:,:) * obctmsk(:,:) 
    172          CALL lbc_lnk( ssha, 'T', 1. )  ! absolutly compulsory !! (jmm) 
     167         CALL lbc_lnk( ssha, 'T', 1. )                ! absolutly compulsory !! (jmm) 
    173168      ENDIF 
    174169#endif 
    175  
    176170      !                                                ! Sea Surface Height at u-,v- and f-points (vvl case only) 
    177171      IF( lk_vvl ) THEN                                ! (required only in key_vvl case) 
     
    184178                  &                                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )     & 
    185179                  &                                    + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) ) 
    186                sshf_a(ji,jj) = 0.25 * umask(ji,jj,1) * umask (ji,jj+1,1)                                 &  
    187                   &                                  * ( ssha(ji  ,jj) + ssha(ji  ,jj+1)                 & 
    188                   &                                    + ssha(ji+1,jj) + ssha(ji+1,jj+1) ) 
    189180            END DO 
    190181         END DO 
    191          CALL lbc_lnk( sshu_a, 'U', 1. )               ! Boundaries conditions 
     182         ! Boundaries conditions 
     183         CALL lbc_lnk( sshu_a, 'U', 1. ) 
    192184         CALL lbc_lnk( sshv_a, 'V', 1. ) 
    193          CALL lbc_lnk( sshf_a, 'F', 1. ) 
    194       ENDIF 
    195  
     185      ENDIF 
    196186      !                                           !------------------------------! 
    197187      !                                           !     Now Vertical Velocity    ! 
    198188      !                                           !------------------------------! 
    199       !                                                ! integrate from the bottom the hor. divergence 
    200       DO jk = jpkm1, 1, -1 
    201          wn(:,:,jk) = wn(:,:,jk+1) -    fse3t_n(:,:,jk) * hdivn(:,:,jk)   & 
    202               &                    - (  fse3t_a(:,:,jk)                   & 
    203               &                       - fse3t_b(:,:,jk) ) * tmask(:,:,jk) / z2dt 
     189      z1_2dt = 1.e0 / z2dt 
     190      DO jk = jpkm1, 1, -1                             ! integrate from the bottom the hor. divergence 
     191         ! - ML - need 3 lines here because replacement of fse3t by its expression yields too long lines otherwise 
     192         wn(:,:,jk) = wn(:,:,jk+1) -    fse3t_n(:,:,jk) * hdivn(:,:,jk)        & 
     193            &                      - (  fse3t_a(:,:,jk) - fse3t_b(:,:,jk) )    & 
     194            &                         * tmask(:,:,jk) * z1_2dt 
    204195      END DO 
    205       ! 
     196 
     197      !                                           !------------------------------! 
     198      !                                           !           outputs            ! 
     199      !                                           !------------------------------! 
    206200      CALL iom_put( "woce", wn                    )   ! vertical velocity 
    207201      CALL iom_put( "ssh" , sshn                  )   ! sea surface height 
    208202      CALL iom_put( "ssh2", sshn(:,:) * sshn(:,:) )   ! square of sea surface height 
    209       IF( lk_diaar5 ) THEN 
     203      IF( lk_diaar5 ) THEN                            ! vertical mass transport & its square value 
     204         ! Caution: in the VVL case, it only correponds to the baroclinic mass transport. 
    210205         z2d(:,:) = rau0 * e1t(:,:) * e2t(:,:) 
    211206         DO jk = 1, jpk 
    212207            z3d(:,:,jk) = wn(:,:,jk) * z2d(:,:) 
    213208         END DO 
    214          CALL iom_put( "w_masstr" , z3d                     )   !           vertical mass transport 
    215          CALL iom_put( "w_masstr2", z3d(:,:,:) * z3d(:,:,:) )   ! square of vertical mass transport 
    216       ENDIF 
     209         CALL iom_put( "w_masstr" , z3d                     )   
     210         CALL iom_put( "w_masstr2", z3d(:,:,:) * z3d(:,:,:) ) 
     211      ENDIF 
     212      ! 
     213      IF(ln_ctl)   CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha  - : ', mask1=tmask, ovlap=1 ) 
    217214      ! 
    218215   END SUBROUTINE ssh_wzv 
     
    227224      !!              ssha  already computed in ssh_wzv   
    228225      !! 
    229       !! ** Method  : - apply Asselin time fiter to now ssh and swap : 
    230       !!             sshn = ssha + atfp * ( sshb -2 sshn + ssha ) 
    231       !!             sshn = ssha 
     226      !! ** Method  : - apply Asselin time fiter to now ssh (excluding the forcing 
     227      !!              from the filter, see Leclair and Madec 2010) and swap : 
     228      !!                sshn = ssha + atfp * ( sshb -2 sshn + ssha ) 
     229      !!                            - atfp * rdt * ( emp_b - emp ) / rau0 
     230      !!                sshn = ssha 
    232231      !! 
    233232      !! ** action  : - sshb, sshn   : before & now sea surface height 
    234233      !!                               ready for the next time step 
    235       !!---------------------------------------------------------------------- 
    236       INTEGER, INTENT( in ) ::   kt      ! ocean time-step index 
    237       !! 
    238       INTEGER  ::   ji, jj               ! dummy loop indices 
     234      !! 
     235      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
     236      !!---------------------------------------------------------------------- 
     237      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     238      !! 
     239      INTEGER  ::   ji, jj   ! dummy loop indices 
     240      REAL(wp) ::   zec      ! temporary scalar 
    239241      !!---------------------------------------------------------------------- 
    240242 
     
    245247      ENDIF 
    246248 
    247       ! Time filter and swap of the ssh 
    248       ! ------------------------------- 
    249  
    250       IF( lk_vvl ) THEN      ! Variable volume levels :   ssh at t-, u-, v, f-points 
    251          !                   ! ---------------------- ! 
     249      !                       !--------------------------! 
     250      IF( lk_vvl ) THEN       !  Variable volume levels  ! 
     251         !                    !--------------------------! 
     252         ! 
     253         ! ssh at t-, u-, v, f-points 
     254         !=========================== 
    252255         IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler time-stepping at first time-step : no filter 
    253256            sshn  (:,:) = ssha  (:,:)                        ! now <-- after  (before already = now) 
    254257            sshu_n(:,:) = sshu_a(:,:) 
    255258            sshv_n(:,:) = sshv_a(:,:) 
    256             sshf_n(:,:) = sshf_a(:,:) 
     259            DO jj = 1, jpjm1 
     260               DO ji = 1, jpim1      ! NO Vector Opt. 
     261                  sshf_n(ji,jj) = 0.5  * umask(ji,jj,1) * umask(ji,jj+1,1)                   & 
     262                     &               / ( e1f(ji,jj  ) * e2f(ji,jj  ) )                     & 
     263                     &               * ( e1u(ji,jj  ) * e2u(ji,jj  ) * sshu_n(ji,jj  )     & 
     264                     &                 + e1u(ji,jj+1) * e2u(ji,jj+1) * sshu_n(ji,jj+1) ) 
     265               END DO 
     266            END DO 
     267            ! Boundaries conditions 
     268            CALL lbc_lnk( sshf_n, 'F', 1. ) 
    257269         ELSE                                           ! Leap-Frog time-stepping: Asselin filter + swap 
     270            zec = atfp * rdt / rau0 
    258271            DO jj = 1, jpj 
    259272               DO ji = 1, jpi                                ! before <-- now filtered 
    260                   sshb  (ji,jj) = sshn(ji,jj)   + atfp * ( sshb  (ji,jj) - 2 * sshn  (ji,jj) + ssha  (ji,jj) ) 
    261                   sshu_b(ji,jj) = sshu_n(ji,jj) + atfp * ( sshu_b(ji,jj) - 2 * sshu_n(ji,jj) + sshu_a(ji,jj) ) 
    262                   sshv_b(ji,jj) = sshv_n(ji,jj) + atfp * ( sshv_b(ji,jj) - 2 * sshv_n(ji,jj) + sshv_a(ji,jj) ) 
    263                   sshf_b(ji,jj) = sshf_n(ji,jj) + atfp * ( sshf_b(ji,jj) - 2 * sshf_n(ji,jj) + sshf_a(ji,jj) ) 
     273                  sshb  (ji,jj) = sshn  (ji,jj) + atfp * ( sshb(ji,jj) - 2 * sshn(ji,jj) + ssha(ji,jj) )   & 
     274                     &                          - zec  * ( emp_b(ji,jj) - emp(ji,jj) ) * tmask(ji,jj,1) 
    264275                  sshn  (ji,jj) = ssha  (ji,jj)              ! now <-- after 
    265276                  sshu_n(ji,jj) = sshu_a(ji,jj) 
    266277                  sshv_n(ji,jj) = sshv_a(ji,jj) 
    267                   sshf_n(ji,jj) = sshf_a(ji,jj) 
    268                END DO 
    269             END DO 
     278               END DO 
     279            END DO 
     280            DO jj = 1, jpjm1 
     281               DO ji = 1, jpim1      ! NO Vector Opt. 
     282                  sshf_n(ji,jj) = 0.5  * umask(ji,jj,1) * umask(ji,jj+1,1)                 & 
     283                     &               / ( e1f(ji,jj  ) * e2f(ji,jj  ) )                     & 
     284                     &               * ( e1u(ji,jj  ) * e2u(ji,jj  ) * sshu_n(ji,jj  )     & 
     285                     &                 + e1u(ji,jj+1) * e2u(ji,jj+1) * sshu_n(ji,jj+1) ) 
     286               END DO 
     287            END DO 
     288            ! Boundaries conditions 
     289            CALL lbc_lnk( sshf_n, 'F', 1. ) 
     290            DO jj = 1, jpjm1 
     291               DO ji = 1, jpim1      ! NO Vector Opt. 
     292                  sshu_b(ji,jj) = 0.5  * umask(ji,jj,1) / ( e1u(ji  ,jj) * e2u(ji  ,jj) )                   & 
     293                     &                                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)     & 
     294                     &                                    + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) ) 
     295                  sshv_b(ji,jj) = 0.5  * vmask(ji,jj,1) / ( e1v(ji,jj  ) * e2v(ji,jj  ) )                   & 
     296                     &                                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )     & 
     297                     &                                    + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) ) 
     298               END DO 
     299            END DO 
     300            ! Boundaries conditions 
     301            CALL lbc_lnk( sshu_b, 'U', 1. ) 
     302            CALL lbc_lnk( sshv_b, 'V', 1. ) 
    270303         ENDIF 
    271          ! 
    272       ELSE                   ! fixed levels :   ssh at t-point only 
    273          !                   ! ------------ ! 
     304         !                    !--------------------------! 
     305      ELSE                    !        fixed levels      ! 
     306         !                    !--------------------------! 
     307         ! 
     308         ! ssh at t-point only 
     309         !==================== 
    274310         IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler time-stepping at first time-step : no filter 
    275311            sshn(:,:) = ssha(:,:)                            ! now <-- after  (before already = now) 
     
    278314            DO jj = 1, jpj 
    279315               DO ji = 1, jpi                                ! before <-- now filtered 
    280                   sshb(ji,jj) = sshn(ji,jj) + atfp * ( sshb(ji,jj) - 2 * sshn(ji,jj) + ssha(ji,jj) )     
     316                  sshb(ji,jj) = sshn(ji,jj) + atfp * ( sshb(ji,jj) - 2 * sshn(ji,jj) + ssha(ji,jj) ) 
    281317                  sshn(ji,jj) = ssha(ji,jj)                  ! now <-- after 
    282318               END DO 
     
    286322      ENDIF 
    287323      ! 
    288       IF(ln_ctl)   CALL prt_ctl(tab2d_1=sshb    , clinfo1=' sshb  - : ', mask1=tmask, ovlap=1 ) 
     324      IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb  - : ', mask1=tmask, ovlap=1 ) 
    289325      ! 
    290326   END SUBROUTINE ssh_nxt 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/IOM/restart.F90

    r2104 r2148  
    77   !!   NEMO     1.0  !  2002-08  (G. Madec)  F90: Free form 
    88   !!            2.0  !  2006-07  (S. Masson)  use IOM for restart 
    9    !!            3.3  !  2010-10  (C. Ethe, G. Madec) TRC-TRA merge (T-S in 4D) 
     9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  modified LF-RA 
     10   !!            - -  !  2010-10  (C. Ethe, G. Madec) TRC-TRA merge (T-S in 4D) 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    2627   USE zdfmxl          ! mixed layer depth 
    2728   USE trdmld_oce      ! ocean active mixed layer tracers trends variables 
     29   USE domvvl          ! variable volume 
    2830   USE traswp          ! swap from 4D T-S to 3D T & S and vice versa 
    2931 
     
    3941 
    4042   !! * Substitutions 
     43#  include "domzgr_substitute.h90" 
    4144#  include "vectopt_loop_substitute.h90" 
    4245   !!---------------------------------------------------------------------- 
     
    123126      CALL iom_rstput( kt, nitrst, numrow, 'hdivb'  , hdivb   ) 
    124127      CALL iom_rstput( kt, nitrst, numrow, 'sshb'   , sshb    ) 
     128      IF( lk_vvl ) & 
     129      CALL iom_rstput( kt, nitrst, numrow, 'fse3t_b', fse3t_b(:,:,:) ) 
    125130      ! 
    126131      CALL iom_rstput( kt, nitrst, numrow, 'un'     , un      )     ! now fields 
     
    154159      !!---------------------------------------------------------------------- 
    155160      REAL(wp) ::   zrdt, zrdttra1 
    156       INTEGER  ::   jlibalt = jprstlib 
     161      INTEGER  ::   jk, jlibalt = jprstlib 
    157162      LOGICAL  ::   llok 
    158163      !!---------------------------------------------------------------------- 
     
    192197      CALL iom_get( numror, jpdom_autoglo, 'hdivb', hdivb ) 
    193198      CALL iom_get( numror, jpdom_autoglo, 'sshb' , sshb  ) 
     199      IF( lk_vvl )  & 
     200      CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
    194201      ! 
    195202      CALL iom_get( numror, jpdom_autoglo, 'un'   , un    )        ! now    fields 
     
    219226         hdivb(:,:,:) = hdivn(:,:,:) 
    220227         sshb (:,:)   = sshn (:,:) 
     228         IF( lk_vvl ) THEN 
     229            DO jk = 1, jpk 
     230               fse3t_b(:,:,jk) = fse3t_n(:,:,jk) 
     231            ENDDO 
     232         ENDIF 
    221233      ENDIF 
    222234      ! 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/sbc_oce.F90

    r2000 r2148  
    66   !! History :  3.0   !  2006-06  (G. Madec)  Original code 
    77   !!             -    !  2008-08  (G. Madec)  namsbc moved from sbcmod 
     8   !!            3.3   !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps 
    89   !!---------------------------------------------------------------------- 
    910   USE par_oce          ! ocean parameters 
     
    3738   !!              Ocean Surface Boundary Condition fields 
    3839   !!---------------------------------------------------------------------- 
    39    LOGICAL , PUBLIC ::   lhftau = .FALSE.              !: HF tau contribution: mean of stress module - module of the mean stress 
    40    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   utau      !: sea surface i-stress (ocean referential)     [N/m2] 
    41    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   vtau      !: sea surface j-stress (ocean referential)     [N/m2] 
    42    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   taum      !: module of sea surface stress (at T-point)    [N/m2]  
    43    !! wndm is used only in PISCES to compute gases exchanges at the surface of the free ocean or in the leads in sea-ice parts 
    44    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   wndm      !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]  
    45    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qsr       !: sea heat flux:     solar                     [W/m2] 
    46    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qns       !: sea heat flux: non solar                     [W/m2] 
    47    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qsr_tot   !: total     solar heat flux (over sea and ice) [W/m2] 
    48    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qns_tot   !: total non solar heat flux (over sea and ice) [W/m2] 
    49    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   emp       !: freshwater budget: volume flux               [Kg/m2/s] 
    50    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   emps      !: freshwater budget: concentration/dillution   [Kg/m2/s] 
    51    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   rnf       !: river runoff   [Kg/m2/s]   
    52    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   emp_tot   !: total evaporation - (liquid + solid) precpitation over oce and ice 
    53    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   tprecip   !: total precipitation           [Kg/m2/s] 
    54    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sprecip   !: solid precipitation           [Kg/m2/s] 
    55 !!$   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   rrunoff       !: runoff 
    56 !!$   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   calving       !: calving 
    57    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   fr_i      !: ice fraction  (between 0 to 1)               - 
     40   LOGICAL , PUBLIC ::   lhftau = .FALSE.              !: HF tau used in TKE: mean(stress module) - module(mean stress) 
     41   !!                                   !!   now    ! before   !! 
     42   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2] 
     43   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2] 
     44   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]  
     45   !! wndm is used only in PISCES to compute surface gases exchanges in ice-free ocean or leads 
     46   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s] 
     47   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qsr               !: sea heat flux:     solar                     [W/m2] 
     48   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2] 
     49   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2] 
     50   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2] 
     51   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s] 
     52   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   emps   , emps_b   !: freshwater budget: concentration/dillution   [Kg/m2/s] 
     53   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s] 
     54   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   rnf               !: river runoff   [Kg/m2/s]   
     55   ! - ML - begin 
     56   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sbc_hc_n          !: sbc heat content trend now                   [K.m/s] 
     57   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sbc_hc_b          !:  "   "      "      "   before                   " 
     58   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sbc_sc_n          !: sbc salt content trend now                   [psu.m/s] 
     59   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sbc_sc_b          !:  "   "      "      "   before                   " 
     60   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   qsr_hc_n      !: heat content trend due to qsr flux now       [K.m/s] 
     61   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   qsr_hc_b      !:  "      "      "    "  "   "   "   before       " 
     62   ! - ML - end 
     63   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   tprecip           !: total precipitation                          [Kg/m2/s] 
     64   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sprecip           !: solid precipitation                          [Kg/m2/s] 
     65   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1) 
    5866#if defined key_cpl_carbon_cycle 
    59    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   atm_co2   !: atmospheric pCO2                             [ppm] 
     67   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   atm_co2           !: atmospheric pCO2                             [ppm] 
    6068#endif 
     69!!$   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   rrunoff        !: runoff 
     70!!$   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   calving        !: calving 
    6171 
    6272   !!---------------------------------------------------------------------- 
     
    7181 
    7282   !!---------------------------------------------------------------------- 
    73    !!   OPA 9.0 , LOCEAN-IPSL (2006)  
    74    !! $ Id: $ 
     83   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
     84   !! $Id$ 
    7585   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    7686   !!====================================================================== 
    77  
    7887END MODULE sbc_oce 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/sbcmod.F90

    r2000 r2148  
    44   !! Surface module :  provide to the ocean its surface boundary condition 
    55   !!====================================================================== 
    6    !! History :  3.0   !  07-2006  (G. Madec)  Original code 
    7    !!             -    !  08-2008  (S. Masson, E. .... ) coupled interface 
     6   !! History :  3.0  !  2006-07  (G. Madec)  Original code 
     7   !!            3.1  !  2008-08  (S. Masson, E. Maisonnave, G. Madec) coupled interface 
     8   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps 
    89   !!---------------------------------------------------------------------- 
    910 
     
    4950#  include "domzgr_substitute.h90" 
    5051   !!---------------------------------------------------------------------- 
    51    !! NEMO/OPA 3.0 , LOCEAN-IPSL (2008)  
     52   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
    5253   !! $Id$ 
    5354   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     
    8687!!gm  IF( lk_sbc_cpl       ) THEN   ;   ln_cpl      = .TRUE.   ;   ELSE   ;   ln_cpl      = .FALSE.   ;   ENDIF 
    8788 
    88       IF ( Agrif_Root() ) THEN 
     89      IF( Agrif_Root() ) THEN 
    8990        IF( lk_lim2 )            nn_ice      = 2 
    9091        IF( lk_lim3 )            nn_ice      = 3 
     
    179180      !!                CAUTION : never mask the surface stress field (tke sbc) 
    180181      !! 
    181       !! ** Action  : - set the ocean surface boundary condition, i.e.   
    182       !!                utau, vtau, qns, qsr, emp, emps, qrp, erp 
     182      !! ** Action  : - set the ocean surface boundary condition at before and now  
     183      !!                time step, i.e.   
     184      !!                utau_b, vtau_b, qns_b, qsr_b, emp_n, emps_b, qrp_b, erp_b 
     185      !!                utau  , vtau  , qns  , qsr  , emp  , emps  , qrp  , erp 
    183186      !!              - updte the ice fraction : fr_i 
    184187      !!---------------------------------------------------------------------- 
     
    186189      !!--------------------------------------------------------------------- 
    187190 
    188       CALL iom_setkt( kt + nn_fsbc - 1 )         !  in sbc, iom_put is called every nn_fsbc time step 
    189       ! 
    190       ! ocean to sbc mean sea surface variables (ss._m) 
    191       ! --------------------------------------- 
    192       CALL sbc_ssm( kt )                         ! sea surface mean currents (at U- and V-points),  
    193       !                                          ! temperature and salinity (at T-point) over nf_sbc time-step 
    194       !                                          ! (i.e. sst_m, sss_m, ssu_m, ssv_m) 
    195  
    196       ! sbc formulation 
    197       ! --------------- 
    198           
    199       SELECT CASE( nsbc )                        ! Compute ocean surface boundary condition 
    200       !                                          ! (i.e. utau,vtau, qns, qsr, emp, emps) 
     191      !                                            ! ---------------------------------------- ! 
     192      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          ! 
     193         !                                         ! ---------------------------------------- ! 
     194         utau_b(:,:) = utau(:,:)                         ! Swap the ocean forcing fields 
     195         vtau_b(:,:) = vtau(:,:)                         ! (except at nit000 where before fields 
     196         qns_b (:,:) = qns (:,:)                         !  are set at the end of the routine) 
     197         ! The 3D heat content due to qsr forcing is treated in traqsr 
     198         ! qsr_b (:,:) = qsr (:,:) 
     199         emp_b (:,:) = emp (:,:) 
     200         emps_b(:,:) = emps(:,:) 
     201      ENDIF 
     202      !                                            ! ---------------------------------------- ! 
     203      !                                            !        forcing field computation         ! 
     204      !                                            ! ---------------------------------------- ! 
     205 
     206      CALL iom_setkt( kt + nn_fsbc - 1 )                 ! in sbc, iom_put is called every nn_fsbc time step 
     207      ! 
     208      CALL sbc_ssm( kt )                                 ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 
     209      !                                                  ! averaged over nf_sbc time-step 
     210 
     211                                                   !==  sbc formulation  ==! 
     212                                                             
     213      SELECT CASE( nsbc )                                ! Compute ocean surface boundary condition 
     214      !                                                  ! (i.e. utau,vtau, qns, qsr, emp, emps) 
    201215      CASE(  0 )   ;   CALL sbc_gyre    ( kt )                    ! analytical formulation : GYRE configuration 
    202216      CASE(  1 )   ;   CALL sbc_ana     ( kt )                    ! analytical formulation : uniform sbc 
     
    214228      END SELECT 
    215229 
    216       ! Misc. Options 
    217       ! ------------- 
     230      !                                            !==  Misc. Options  ==! 
    218231 
    219232!!gm  IF( ln_dm2dc       )   CALL sbc_dcy( kt )                 ! Daily mean qsr distributed over the Diurnal Cycle 
     
    236249      !                                                         ! (update freshwater fluxes) 
    237250      ! 
     251      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    ! 
     252         !                                             ! ---------------------------------------- ! 
     253         IF( ln_rstart .AND.    &                               !* Restart: read in restart file 
     254            & iom_varid( numror, 'utau_b', ldstop = .FALSE. ) > 0 ) THEN  
     255            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields red in the restart file' 
     256            CALL iom_get( numror, jpdom_autoglo, 'utau_b', utau_b )   ! before i-stress  (U-point) 
     257            CALL iom_get( numror, jpdom_autoglo, 'vtau_b', vtau_b )   ! before j-stress  (V-point) 
     258            CALL iom_get( numror, jpdom_autoglo, 'qns_b' , qns_b  )   ! before non solar heat flux (T-point) 
     259            ! The 3D heat content due to qsr forcing is treated in traqsr 
     260            ! CALL iom_get( numror, jpdom_autoglo, 'qsr_b' , qsr_b  )   ! before     solar heat flux (T-point) 
     261            CALL iom_get( numror, jpdom_autoglo, 'emp_b' , emp_b  )   ! before     freshwater flux (T-point) 
     262            CALL iom_get( numror, jpdom_autoglo, 'emps_b', emps_b )   ! before C/D freshwater flux (T-point) 
     263         ELSE                                                   !* no restart: set from nit000 values 
     264            IF(lwp) WRITE(numout,*) '          nit000-1 surface forcing fields set to nit000' 
     265            utau_b(:,:) = utau(:,:)  
     266            vtau_b(:,:) = vtau(:,:) 
     267            qns_b (:,:) = qns (:,:) 
     268            ! qsr_b (:,:) = qsr (:,:) 
     269            emp_b (:,:) = emp (:,:) 
     270            emps_b(:,:) = emps(:,:) 
     271         ENDIF 
     272      ENDIF 
     273      !                                                ! ---------------------------------------- ! 
     274      IF( lrst_oce ) THEN                              !      Write in the ocean restart file     ! 
     275         !                                             ! ---------------------------------------- ! 
     276         IF(lwp) WRITE(numout,*) 
     277         IF(lwp) WRITE(numout,*) 'sbc : ocean surface forcing fields written in ocean restart file ',   & 
     278            &                    'at it= ', kt,' date= ', ndastp 
     279         IF(lwp) WRITE(numout,*) '~~~~' 
     280         CALL iom_rstput( kt, nitrst, numrow, 'utau_b' , utau ) 
     281         CALL iom_rstput( kt, nitrst, numrow, 'vtau_b' , vtau ) 
     282         CALL iom_rstput( kt, nitrst, numrow, 'qns_b'  , qns  ) 
     283         ! The 3D heat content due to qsr forcing is treated in traqsr 
     284         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  ) 
     285         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  ) 
     286         CALL iom_rstput( kt, nitrst, numrow, 'emps_b' , emps ) 
     287      ENDIF 
     288 
     289      !                                                ! ---------------------------------------- ! 
     290      !                                                !        Outputs and control print         ! 
     291      !                                                ! ---------------------------------------- ! 
    238292      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 
    239          CALL iom_put( "emp-rnf"  , (emp-rnf)  )                ! upward water flux  
    240          CALL iom_put( "emps-rnf" , (emps-rnf) )                ! c/d water flux  
    241          CALL iom_put( "qns+qsr"  , qns + qsr  )                ! total heat flux   (caution if ln_dm2dc=true, to be  
    242          CALL iom_put( "qns"      , qns        )                ! solar heat flux    moved after the call to iom_setkt) 
    243          CALL iom_put( "qsr"      ,       qsr  )                ! solar heat flux    moved after the call to iom_setkt) 
    244          IF(  nn_ice > 0 )   CALL iom_put( "ice_cover", fr_i )  ! ice fraction  
     293         CALL iom_put( "emp-rnf" , emp  - rnf )                   ! upward water flux 
     294         CALL iom_put( "emps-rnf", emps - rnf )                   ! c/d water flux 
     295         CALL iom_put( "qns+qsr" , qns  + qsr )                   ! total heat flux   (caution if ln_dm2dc=true, to be  
     296         CALL iom_put( "qns"     , qns        )                   ! solar heat flux    moved after the call to iom_setkt) 
     297         CALL iom_put( "qsr"     ,       qsr  )                   ! solar heat flux    moved after the call to iom_setkt) 
     298         IF( nn_ice > 0 )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction  
    245299      ENDIF 
    246300      ! 
     
    253307      ! 
    254308      IF(ln_ctl) THEN         ! print mean trends (used for debugging) 
    255          CALL prt_ctl(tab2d_1=fr_i   , clinfo1=' fr_i - : ', mask1=tmask, ovlap=1 ) 
    256          CALL prt_ctl(tab2d_1=(emp-rnf) , clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 )  
    257          CALL prt_ctl(tab2d_1=(emps-rnf), clinfo1=' emps-rnf - : ', mask1=tmask, ovlap=1 )  
    258          CALL prt_ctl(tab2d_1=qns    , clinfo1=' qns  - : ', mask1=tmask, ovlap=1 ) 
    259          CALL prt_ctl(tab2d_1=qsr    , clinfo1=' qsr  - : ', mask1=tmask, ovlap=1 ) 
    260          CALL prt_ctl(tab3d_1=tmask  , clinfo1=' tmask : ', mask1=tmask, ovlap=1, kdim=jpk ) 
    261          CALL prt_ctl(tab3d_1=tn     , clinfo1=' sst  - : ', mask1=tmask, ovlap=1, kdim=1   ) 
    262          CALL prt_ctl(tab3d_1=sn     , clinfo1=' sss  - : ', mask1=tmask, ovlap=1, kdim=1   ) 
    263          CALL prt_ctl(tab2d_1=utau   , clinfo1=' utau - : ', mask1=umask,                      & 
    264             &         tab2d_2=vtau   , clinfo2=' vtau - : ', mask2=vmask, ovlap=1 ) 
     309         CALL prt_ctl(tab2d_1=fr_i      , clinfo1=' fr_i    - : ', mask1=tmask, ovlap=1 ) 
     310         CALL prt_ctl(tab2d_1=(emp-rnf) , clinfo1=' emp-rnf  - : ', mask1=tmask, ovlap=1 ) 
     311         CALL prt_ctl(tab2d_1=(emps-rnf), clinfo1=' emps-rnf - : ', mask1=tmask, ovlap=1 ) 
     312         CALL prt_ctl(tab2d_1=qns       , clinfo1=' qns      - : ', mask1=tmask, ovlap=1 ) 
     313         CALL prt_ctl(tab2d_1=qsr       , clinfo1=' qsr      - : ', mask1=tmask, ovlap=1 ) 
     314         CALL prt_ctl(tab3d_1=tmask     , clinfo1=' tmask    - : ', mask1=tmask, ovlap=1, kdim=jpk ) 
     315         CALL prt_ctl(tab3d_1=tn        , clinfo1=' sst      - : ', mask1=tmask, ovlap=1, kdim=1   ) 
     316         CALL prt_ctl(tab3d_1=sn        , clinfo1=' sss      - : ', mask1=tmask, ovlap=1, kdim=1   ) 
     317         CALL prt_ctl(tab2d_1=utau      , clinfo1=' utau    - : ', mask1=umask,                      & 
     318            &         tab2d_2=vtau      , clinfo2=' vtau    - : ', mask2=vmask, ovlap=1 ) 
    265319      ENDIF 
    266320      ! 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/sbcrnf.F90

    r2113 r2148  
    3333   TYPE(FLD_N)       , PUBLIC ::   sn_cnf                 !: information about the runoff mouth file to be read 
    3434   TYPE(FLD_N)                ::   sn_sal_rnf             !: information about the salinities of runoff file to be read   
    35    TYPE(FLD_N)                ::   sn_tem_rnf             !: information about the temperatures of runoff file to be read   
     35   TYPE(FLD_N)                ::   sn_tmp_rnf             !: information about the temperatures of runoff file to be read   
    3636   TYPE(FLD_N)                ::   sn_dep_rnf             !: information about the depth which river inflow affects 
    3737   LOGICAL           , PUBLIC ::   ln_rnf_mouth = .false. !: specific treatment in mouths vicinity 
     
    5353   INTEGER, PUBLIC, DIMENSION(jpi,jpj) ::  rnf_mod_dep     !: depth of runoff in model levels   
    5454   REAL,    PUBLIC, DIMENSION(jpi,jpj) ::  rnf_sal         !: salinity of river runoff   
    55    REAL,    PUBLIC, DIMENSION(jpi,jpj) ::  rnf_tem         !: temperature of river runoff   
     55   REAL,    PUBLIC, DIMENSION(jpi,jpj) ::  rnf_tmp         !: temperature of river runoff   
    5656   
    5757   INTEGER  ::  ji, jj ,jk    ! dummy loop indices   
     
    8686      !!---------------------------------------------------------------------- 
    8787      !                                    
    88       IF( kt == nit000 ) THEN   
    89          CALL sbc_rnf_init                      ! Read namelist and allocate structures 
    90       ENDIF 
     88      IF( kt == nit000 )  CALL sbc_rnf_init     ! Read namelist and allocate structures  
    9189 
    9290      !                                                   !-------------------! 
     
    117115            IF ( ln_rnf_att ) THEN   
    118116               rnf_sal(:,:) = ( sf_sal_rnf(1)%fnow(:,:,1) )   
    119                rnf_tem(:,:) = ( sf_tem_rnf(1)%fnow(:,:,1) )   
     117               rnf_tmp(:,:) = ( sf_tem_rnf(1)%fnow(:,:,1) )   
    120118            ELSE   
    121119               rnf_sal(:,:) = 0   
    122                rnf_tem(:,:) = -999   
     120               rnf_tmp(:,:) = -999   
    123121            ENDIF   
    124122            CALL iom_put( "runoffs", rnf )         ! runoffs 
     
    143141      CHARACTER(len=32) ::   rn_dep_file   ! runoff file name   
    144142      !!  
    145       NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, sn_rnf, sn_cnf, sn_sal_rnf, sn_tem_rnf, sn_dep_rnf,   &   
     143      NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, sn_rnf, sn_cnf, sn_sal_rnf, sn_tmp_rnf, sn_dep_rnf,   &   
    146144         &                 ln_rnf_mouth, ln_rnf_att, rn_hrnf, rn_avt_rnf, rn_rfact   
    147145      !!---------------------------------------------------------------------- 
     
    157155 
    158156      sn_sal_rnf = FLD_N( 'runoffs',  24.  , 'rosaline' ,  .TRUE.    , .true. ,   'yearly'  , ''    , ''  )   
    159       sn_tem_rnf = FLD_N( 'runoffs',  24.  , 'rotemper' ,  .TRUE.    , .true. ,   'yearly'  , ''    , ''  )   
     157      sn_tmp_rnf = FLD_N( 'runoffs',  24.  , 'rotemper' ,  .TRUE.    , .true. ,   'yearly'  , ''    , ''  )   
    160158      sn_dep_rnf = FLD_N( 'runoffs',   0.  , 'rodepth'  ,  .FALSE.   , .true. ,   'yearly'  , ''    , ''  )   
    161159      ! 
     
    218216         IF ( ln_rnf_att ) THEN   
    219217            CALL fld_fill (sf_sal_rnf, (/ sn_sal_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' )   
    220             CALL fld_fill (sf_tem_rnf, (/ sn_tem_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' )   
     218            CALL fld_fill (sf_tem_rnf, (/ sn_tmp_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' )   
    221219   
    222220            rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname )   
     
    248246      ENDIF 
    249247      ! 
    250       DO jj = 1, jpj 
    251          DO ji = 1, jpi 
    252             rnf_dep(ji,jj) = 0. 
    253             DO jk = 1, rnf_mod_dep(ji,jj)                          ! recalculates rnf_dep to be the depth  
    254                rnf_dep(ji,jj) = rnf_dep(ji,jj) + fse3t(ji,jj,jk)    ! in metres to the bottom of the relevant grid box  
    255             ENDDO 
    256          ENDDO 
    257       ENDDO 
    258       !  
    259248 
    260249      !                                   ! ======================== 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/trabbc.F90

    r2104 r2148  
    3636   REAL(wp) ::   rn_geoflx_cst = 86.4e-3      ! Constant value of geothermal heat flux 
    3737 
    38    INTEGER , DIMENSION(jpi,jpj) ::   nbotlevt   ! ocean bottom level index at T-pt 
    39    REAL(wp), DIMENSION(jpi,jpj) ::   qgh_trd0   ! geothermal heating trend 
     38   INTEGER , DIMENSION(jpi,jpj)         ::   nbotlevt   ! ocean bottom level index at T-pt 
     39   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qgh_trd0   ! geothermal heating trend 
    4040  
    4141   !! * Substitutions 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/trabbl.F90

    r2123 r2148  
    138138 
    139139 
    140    SUBROUTINE tra_bbl_dif( ptrab, ptraa, kjpt ) 
     140   SUBROUTINE tra_bbl_dif( ptb, pta, kjpt ) 
    141141      !!---------------------------------------------------------------------- 
    142142      !!                  ***  ROUTINE tra_bbl_dif  *** 
     
    155155      !!      convection is satified) 
    156156      !! 
    157       !! ** Action  :   ptraa   increased by the bbl diffusive trend 
     157      !! ** Action  :   pta   increased by the bbl diffusive trend 
    158158      !! 
    159159      !! References : Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 
     
    161161      !!----------------------------------------------------------------------   
    162162      INTEGER                              , INTENT(in   ) ::   kjpt    ! number of tracers 
    163       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptrab   ! before and now tracer fields 
    164       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   ptraa   ! tracer trend  
     163      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb   ! before and now tracer fields 
     164      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta   ! tracer trend  
    165165      !! 
    166166      INTEGER  ::   ji, jj, jn   ! dummy loop indices 
    167167      INTEGER  ::   ik           ! local integers 
    168168      REAL(wp) ::   zbtr         ! local scalars 
     169      REAL(wp), DIMENSION(jpi,jpj) ::   zptb   ! tracer trend  
    169170      !!---------------------------------------------------------------------- 
    170171      ! 
    171       !                                                   ! =========== 
    172172      DO jn = 1, kjpt                                     ! tracer loop 
    173173         !                                                ! =========== 
     174#  if defined key_vectopt_loop 
     175         DO jj = 1, 1   ! vector opt. (forced unrolling) 
     176            DO ji = 1, jpij 
     177#else 
     178         DO jj = 1, jpj 
     179            DO ji = 1, jpi  
     180#endif 
     181               ik = mbkt(ji,jj)                        ! bottom T-level index 
     182               zptb(ji,jj) = ptb(ji,jj,ik,jn)              ! bottom before T and S 
     183            END DO 
     184         END DO 
     185         !                                                ! Compute the trend 
    174186#  if defined key_vectopt_loop 
    175187         DO jj = 1, 1   ! vector opt. (forced unrolling) 
     
    181193               ik = mbkt(ji,jj)                            ! bottom T-level index 
    182194               zbtr = e1e2t_r(ji,jj)  / fse3t(ji,jj,ik) 
    183                ptraa(ji,jj,ik,jn) = ptraa(ji,jj,ik,jn)                                                         & 
    184                   &               + (   ahu_bbl(ji,jj) * ( ptrab(ji+1,jj  ,ik,jn) - ptrab(ji  ,jj  ,ik,jn) )   & 
    185                   &                   - ahu_bbl(ji,jj) * ( ptrab(ji  ,jj  ,ik,jn) - ptrab(ji-1,jj  ,ik,jn) )   & 
    186                   &                   + ahv_bbl(ji,jj) * ( ptrab(ji  ,jj+1,ik,jn) - ptrab(ji  ,jj  ,ik,jn) )   & 
    187                   &                   - ahv_bbl(ji,jj) * ( ptrab(ji  ,jj  ,ik,jn) - ptrab(ji  ,jj-1,ik,jn) )   ) * zbtr 
     195               pta(ji,jj,ik,jn) = pta(ji,jj,ik,jn)                                                         & 
     196                  &               + (   ahu_bbl(ji  ,jj  ) * ( zptb(ji+1,jj  ) - zptb(ji  ,jj  ) )   & 
     197                  &                   - ahu_bbl(ji-1,jj  ) * ( zptb(ji  ,jj  ) - zptb(ji-1,jj  ) )   & 
     198                  &                   + ahv_bbl(ji  ,jj  ) * ( zptb(ji  ,jj+1) - zptb(ji  ,jj  ) )   & 
     199                  &                   - ahv_bbl(ji  ,jj-1) * ( zptb(ji  ,jj  ) - zptb(ji  ,jj-1) )   ) * zbtr 
    188200            END DO 
    189201         END DO 
     
    194206    
    195207 
    196    SUBROUTINE tra_bbl_adv( ptrab, ptraa, kjpt ) 
     208   SUBROUTINE tra_bbl_adv( ptb, pta, kjpt ) 
    197209      !!---------------------------------------------------------------------- 
    198210      !!                  ***  ROUTINE trc_bbl  *** 
     
    212224      !!----------------------------------------------------------------------   
    213225      INTEGER                              , INTENT(in   ) ::   kjpt    ! number of tracers 
    214       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptrab   ! before and now tracer fields 
    215       REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   ptraa   ! tracer trend  
     226      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb   ! before and now tracer fields 
     227      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta   ! tracer trend  
    216228      !! 
    217229      INTEGER  ::   ji, jj, jk, jn           ! dummy loop indices 
     
    240252                  !                                               ! up  -slope T-point (shelf bottom point) 
    241253                  zbtr = e1e2t_r(iis,jj) / fse3t(iis,jj,ikus) 
    242                   ztra = zu_bbl * ( ptrab(iid,jj,ikus,jn) - ptrab(iis,jj,ikus,jn) ) * zbtr 
    243                   ptraa(iis,jj,ikus,jn) = ptraa(iis,jj,ikus,jn) + ztra 
     254                  ztra = zu_bbl * ( ptb(iid,jj,ikus,jn) - ptb(iis,jj,ikus,jn) ) * zbtr 
     255                  pta(iis,jj,ikus,jn) = pta(iis,jj,ikus,jn) + ztra 
    244256                  !                    
    245257                  DO jk = ikus, ikud-1                            ! down-slope upper to down T-point (deep column) 
    246258                     zbtr = e1e2t_r(iid,jj) / fse3t(iid,jj,jk) 
    247                      ztra = zu_bbl * ( ptrab(iid,jj,jk+1,jn) - ptrab(iid,jj,jk,jn) ) * zbtr 
    248                      ptraa(iid,jj,jk,jn) = ptraa(iid,jj,jk,jn) + ztra 
     259                     ztra = zu_bbl * ( ptb(iid,jj,jk+1,jn) - ptb(iid,jj,jk,jn) ) * zbtr 
     260                     pta(iid,jj,jk,jn) = pta(iid,jj,jk,jn) + ztra 
    249261                  END DO 
    250262                  !  
    251263                  zbtr = e1e2t_r(iid,jj) / fse3t(iid,jj,ikud) 
    252                   ztra = zu_bbl * ( ptrab(iis,jj,ikus,jn) - ptrab(iid,jj,ikud,jn) ) * zbtr 
    253                   ptraa(iid,jj,ikud,jn) = ptraa(iid,jj,ikud,jn) + ztra 
     264                  ztra = zu_bbl * ( ptb(iis,jj,ikus,jn) - ptb(iid,jj,ikud,jn) ) * zbtr 
     265                  pta(iid,jj,ikud,jn) = pta(iid,jj,ikud,jn) + ztra 
    254266               ENDIF 
    255267               ! 
     
    262274                  ! up  -slope T-point (shelf bottom point) 
    263275                  zbtr = e1e2t_r(ji,ijs) / fse3t(ji,ijs,ikvs) 
    264                   ztra = zv_bbl * ( ptrab(ji,ijd,ikvs,jn) - ptrab(ji,ijs,ikvs,jn) ) * zbtr 
    265                   ptraa(ji,ijs,ikvs,jn) = ptraa(ji,ijs,ikvs,jn) + ztra 
     276                  ztra = zv_bbl * ( ptb(ji,ijd,ikvs,jn) - ptb(ji,ijs,ikvs,jn) ) * zbtr 
     277                  pta(ji,ijs,ikvs,jn) = pta(ji,ijs,ikvs,jn) + ztra 
    266278                  !                    
    267279                  DO jk = ikvs, ikvd-1                            ! down-slope upper to down T-point (deep column) 
    268280                     zbtr = e1e2t_r(ji,ijd) / fse3t(ji,ijd,jk) 
    269                      ztra = zv_bbl * ( ptrab(ji,ijd,jk+1,jn) - ptrab(ji,ijd,jk,jn) ) * zbtr 
    270                      ptraa(ji,ijd,jk,jn) = ptraa(ji,ijd,jk,jn)  + ztra 
     281                     ztra = zv_bbl * ( ptb(ji,ijd,jk+1,jn) - ptb(ji,ijd,jk,jn) ) * zbtr 
     282                     pta(ji,ijd,jk,jn) = pta(ji,ijd,jk,jn)  + ztra 
    271283                  END DO 
    272284                  !                                               ! down-slope T-point (deep bottom point) 
    273285                  zbtr = e1e2t_r(ji,ijd) / fse3t(ji,ijd,ikvd) 
    274                   ztra = zv_bbl * ( ptrab(ji,ijs,ikvs,jn) - ptrab(ji,ijd,ikvd,jn) ) * zbtr 
    275                   ptraa(ji,ijd,ikvd,jn) = ptraa(ji,ijd,ikvd,jn) + ztra 
     286                  ztra = zv_bbl * ( ptb(ji,ijs,ikvs,jn) - ptb(ji,ijd,ikvd,jn) ) * zbtr 
     287                  pta(ji,ijd,ikvd,jn) = pta(ji,ijd,ikvd,jn) + ztra 
    276288               ENDIF 
    277289            END DO 
     
    370382#endif 
    371383            ik = mbkt(ji,jj)                        ! bottom T-level index 
    372             ztb (ji,jj) = tsb(ji,jj,ik,jp_tem)      ! bottom before T and S 
    373             zsb (ji,jj) = tsb(ji,jj,ik,jp_sal) 
     384            ztb (ji,jj) = tsb(ji,jj,ik,jp_tem) * tmask(ji,jj,1)      ! bottom before T and S 
     385            zsb (ji,jj) = tsb(ji,jj,ik,jp_sal) * tmask(ji,jj,1) 
    374386            zdep(ji,jj) = fsdept_0(ji,jj,ik)        ! bottom T-level reference depth 
    375387            ! 
     
    575587      ahv_bbl_0(:,:) = rn_ahtbbl * e1v(:,:) * e3v_bbl_0(:,:) / e2v(:,:)  * vmask(:,:,1) 
    576588 
     589 
    577590      IF( cp_cfg == "orca" ) THEN   !* ORCA configuration : regional enhancement of ah_bbl 
    578591         ! 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/tranxt.F90

    r2120 r2148  
    1515   !!            3.0  !  2008-06  (G. Madec)  time stepping always done in trazdf 
    1616   !!            3.1  !  2009-02  (G. Madec, R. Benshila)  re-introduce the vvl option 
    17    !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA 
     17   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  semi-implicit hpg with asselin filter + modified LF-RA 
     18   !!             -   !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA 
    1819   !!---------------------------------------------------------------------- 
    1920 
    2021   !!---------------------------------------------------------------------- 
    21    !!   tra_nxt       : time stepping on temperature and salinity 
    22    !!   tra_nxt_fix   : time stepping on temperature and salinity : fixed    volume case 
    23    !!   tra_nxt_vvl   : time stepping on temperature and salinity : variable volume case 
     22   !!   tra_nxt       : time stepping on tracers 
     23   !!   tra_nxt_fix   : time stepping on tracers : fixed    volume case 
     24   !!   tra_nxt_vvl   : time stepping on tracers : variable volume case 
    2425   !!---------------------------------------------------------------------- 
    2526   USE oce             ! ocean dynamics and tracers variables 
    2627   USE dom_oce         ! ocean space and time domain variables  
     28   USE sbc_oce         ! surface boundary condition: ocean 
    2729   USE zdf_oce         ! ??? 
    2830   USE domvvl          ! variable volume 
     
    3840   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    3941   USE prtctl          ! Print control 
     42   USE traqsr          ! penetrative solar radiation (needed for nksr) 
    4043   USE traswp          ! swap array 
    4144   USE agrif_opa_update 
     
    4952   PUBLIC   tra_nxt_vvl   ! to be used in trcnxt 
    5053 
     54   REAL(wp)                 ::   rbcp            ! Brown & Campana parameters for semi-implicit hpg 
    5155   REAL(wp), DIMENSION(jpk) ::   r2dt   ! vertical profile time step, =2*rdttra (leapfrog) or =rdttra (Euler) 
    5256 
     
    96100         IF(lwp) WRITE(numout,*) 'tra_nxt : achieve the time stepping by Asselin filter and array swap' 
    97101         IF(lwp) WRITE(numout,*) '~~~~~~~' 
     102         ! 
     103         rbcp    = 0.25 * (1. + atfp) * (1. + atfp) * ( 1. - atfp)       ! Brown & Campana parameter for semi-implicit hpg 
    98104      ENDIF 
    99105 
     
    107113#endif 
    108114 
    109 #if defined key_obc 
     115#if defined key_obc  
    110116      IF( lk_obc )   CALL obc_tra( kt )  ! OBC open boundaries 
    111117#endif 
     
    114120#endif 
    115121#if defined key_agrif 
    116       CALL Agrif_tra                     ! AGRIF zoom boundaries 
     122      CALL Agrif_tra                   ! AGRIF zoom boundaries 
    117123#endif 
    118124 
     
    133139 
    134140      ! Leap-Frog + Asselin filter time stepping 
    135       IF( lk_vvl )   THEN   ;   CALL tra_nxt_vvl( kt, tsb, tsn, tsa, jpts )  ! variable volume level (vvl)      
    136       ELSE                  ;   CALL tra_nxt_fix( kt, tsb, tsn, tsa, jpts )  ! fixed    volume level  
     141      IF( lk_vvl )   THEN   ;   CALL tra_nxt_vvl( kt, 'TRA', tsb, tsn, tsa, jpts )  ! variable volume level (vvl)      
     142      ELSE                  ;   CALL tra_nxt_fix( kt,        tsb, tsn, tsa, jpts )  ! fixed    volume level  
    137143      ENDIF 
    138144 
     
    176182      !!              - swap tracer fields to prepare the next time_step. 
    177183      !!                This can be summurized for tempearture as: 
    178       !!             ztm = (ta+2tn+tb)/4       ln_dynhpg_imp = T 
    179       !!             ztm = 0                   otherwise 
     184      !!             ztm = tn + rbcp * [ta -2 tn + tb ]       ln_dynhpg_imp = T 
     185      !!             ztm = 0                                   otherwise 
     186      !!                   with rbcp=1/4 * (1-atfp^4) / (1-atfp) 
    180187      !!             tb  = tn + atfp*[ tb - 2 tn + ta ] 
    181       !!             tn  = ta  
     188      !!             tn  = ta   
    182189      !!             ta  = ztm       (NB: reset to 0 after eos_bn2 call) 
    183190      !! 
     
    185192      !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
    186193      !!---------------------------------------------------------------------- 
    187       INTEGER , INTENT(in   )                               ::  kt            ! ocean time-step index 
    188       INTEGER , INTENT(in   )                               ::  kjpt            ! number of tracers 
    189       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb  ! before tracer fields 
    190       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn  ! now tracer fields 
    191       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta         ! tracer trend 
     194      INTEGER , INTENT(in   )                               ::  kt       ! ocean time-step index 
     195      INTEGER , INTENT(in   )                               ::  kjpt     ! number of tracers 
     196      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb      ! before tracer fields 
     197      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn      ! now tracer fields 
     198      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta      ! tracer trend 
    192199      !! 
    193200      INTEGER  :: ji, jj, jk, jn   ! dummy loop indices 
    194       REAL(wp) :: ztm, ztf     ! temporary scalars 
     201      REAL(wp) :: ztd, ztm         ! temporary scalars 
    195202      !!---------------------------------------------------------------------- 
    196203 
     
    205212         !                                             ! (only swap) 
    206213         DO jn = 1, kjpt 
    207             DO jk = 1, jpkm1                               
     214            DO jk = 1, jpkm1 
    208215               ptn(:,:,jk,jn) = pta(:,:,jk,jn)     ! ptb <-- ptn 
    209216            END DO 
     
    219226                  DO jj = 1, jpj 
    220227                     DO ji = 1, jpi 
    221                         ztm = 0.25 * ( pta(ji,jj,jk,jn) + 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn) )  ! mean pt 
    222                         ztf = atfp * ( pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn) )  ! Asselin filter on pt  
    223                         ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + ztf                                      ! ptb <-- filtered ptn  
    224                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                            ! ptn <-- pta 
    225                         pta(ji,jj,jk,jn) = ztm                                                           ! pta <-- mean pt 
     228                        ztd = pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn)    !  time laplacian on tracers 
     229                        ztm = ptn(ji,jj,jk,jn) + rbcp * ztd                                 !  used for both Asselin and Brown & Campana filters 
     230                        ! 
     231                        ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + atfp * ztd                    ! ptb <-- filtered ptn  
     232                        ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                 ! ptn <-- pta 
     233                        pta(ji,jj,jk,jn) = ztm                                              ! pta <-- Brown & Campana average 
    226234                     END DO 
    227235                  END DO 
     
    235243                  DO jj = 1, jpj 
    236244                     DO ji = 1, jpi 
    237                         ztf = atfp * ( pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn) )       ! Asselin filter on t  
    238                         ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + ztf                                     ! ptb <-- filtered ptn  
    239                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                           ! ptn <-- pta 
     245                        ztd = pta(ji,jj,jk,jn) - 2.* ptn(ji,jj,jk,jn) + ptb(ji,jj,jk,jn)    ! time laplacian on tracers 
     246                        !  
     247                        ptb(ji,jj,jk,jn) = ptn(ji,jj,jk,jn) + atfp * ztd                    ! ptb <-- filtered ptn  
     248                        ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                                 ! ptn <-- pta 
    240249                     END DO 
    241250                  END DO 
    242251               END DO 
    243252            END DO 
    244             ! 
    245253         ENDIF 
    246254         ! 
     
    250258 
    251259 
    252    SUBROUTINE tra_nxt_vvl( kt, ptb, ptn, pta, kjpt ) 
     260   SUBROUTINE tra_nxt_vvl( kt, cdtype, ptb, ptn, pta, kjpt ) 
    253261      !!---------------------------------------------------------------------- 
    254262      !!                   ***  ROUTINE tra_nxt_vvl  *** 
     
    263271      !!              - swap tracer fields to prepare the next time_step. 
    264272      !!                This can be summurized for tempearture as: 
    265       !!             ztm = (e3t_a*ta+2*e3t_n*tn+e3t_b*tb)   ln_dynhpg_imp = T 
    266       !!                  /(e3t_a   +2*e3t_n   +e3t_b   )     
    267       !!             ztm = 0                                otherwise 
     273      !!             ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] )   ln_dynhpg_imp = T 
     274      !!                  /( e3t_n    + rbcp*[ e3t_b    - 2 e3t_n    + e3t_a    ] )    
     275      !!             ztm = 0                                                       otherwise 
    268276      !!             tb  = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 
    269277      !!                  /( e3t_n    + atfp*[ e3t_b    - 2 e3t_n    + e3t_a    ] ) 
     
    274282      !!              - (ta,sa) time averaged (t,s)   (ln_dynhpg_imp = T) 
    275283      !!---------------------------------------------------------------------- 
    276       INTEGER , INTENT(in   )                               ::  kt            ! ocean time-step index 
    277       INTEGER , INTENT(in   )                               ::  kjpt            ! number of tracers 
    278       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb  ! before tracer fields 
    279       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn  ! now tracer fields 
    280       REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta         ! tracer trend 
     284      INTEGER         , INTENT(in   )                               ::  kt       ! ocean time-step index 
     285      CHARACTER(len=3), INTENT(in   )                               ::  cdtype   ! =TRA or TRC (tracer indicator) 
     286      INTEGER         , INTENT(in   )                               ::  kjpt     ! number of tracers 
     287      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptb      ! before tracer fields 
     288      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  ptn      ! now tracer fields 
     289      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt)  ::  pta      ! tracer trend 
    281290      !!      
    282       INTEGER  ::   ji, jj, jk, jn             ! dummy loop indices 
    283       REAL(wp) ::   ztm , ztc_f , ztf , ztca, ztcn, ztcb   ! temporary scalar 
    284       REAL(wp) ::   ze3mr, ze3fr                           !    -         - 
    285       REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a, ze3t_f         !    -         - 
     291      INTEGER  ::   ji, jj, jk, jn                 ! dummy loop indices 
     292      REAL(wp) ::   ztc_a , ztc_n , ztc_b          ! temporary scalar 
     293      REAL(wp) ::   ztc_f , ztc_d , ztc_m          !    -         - 
     294      REAL(wp) ::   ze3t_b, ze3t_n, ze3t_a         !    -         - 
     295      REAL(wp) ::   ze3t_f, ze3t_d, ze3t_m         !    -         - 
     296      REAL     ::   zfact1, zfact2                 !    -         - 
    286297      !!---------------------------------------------------------------------- 
    287298 
     
    293304      ! 
    294305      ! 
    295       IF( neuler == 0 .AND. kt == nit000 ) THEN        ! Euler time-stepping at first time-step 
    296          !                                             ! (only swap) 
     306      IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler time-stepping at first time-step 
     307         !                                           ! (only swap) 
    297308         DO jn = 1, kjpt 
    298             DO jk = 1, jpkm1                               
    299                ptn(:,:,jk,jn) = pta(:,:,jk,jn)         ! ptb <-- ptn 
     309            DO jk = 1, jpkm1 
     310               ptn(:,:,jk,jn) = pta(:,:,jk,jn)       ! ptb <-- ptn 
    300311            END DO 
    301312         END DO 
    302313         !                                               
    303       ELSE                                              ! general case (Leapfrog + Asselin filter 
     314      ELSE                                           ! general case (Leapfrog + Asselin filter) 
    304315         ! 
    305          !                                              ! ----------------------- ! 
    306          IF( ln_dynhpg_imp ) THEN                       ! semi-implicite hpg case ! 
    307             !                                           ! ----------------------- ! 
    308             DO jn = 1, kjpt                                
     316         !                                           ! ----------------------- ! 
     317         IF( ln_dynhpg_imp ) THEN                    ! semi-implicite hpg case ! 
     318            !                                        ! ----------------------- ! 
     319            DO jn = 1, kjpt                           
    309320               DO jk = 1, jpkm1 
    310321                  DO jj = 1, jpj 
     
    314325                        ze3t_a = fse3t_a(ji,jj,jk) 
    315326                        !                                         ! tracer content at Before, now and after 
    316                         ztcb = ptb(ji,jj,jk,jn) *  ze3t_b   
    317                         ztcn = ptn(ji,jj,jk,jn) *  ze3t_n   
    318                         ztca = pta(ji,jj,jk,jn) *  ze3t_a   
    319                         ! 
    320                         !                                         ! Asselin filter on thickness and tracer content 
    321                         ze3t_f = atfp * ( ze3t_a - 2.* ze3t_n + ze3t_b ) 
    322                         ztc_f  = atfp * ( ztca   - 2.* ztcn   + ztcb   )  
    323                         ! 
    324                         !                                         ! filtered tracer including the correction  
    325                         ze3fr = 1.e0  / ( ze3t_n + ze3t_f ) 
    326                         ztf   = ze3fr * ( ztcn   + ztc_f  ) 
    327                         !                                         ! mean thickness and tracer 
    328                         ze3mr = 1.e0  / ( ze3t_a + 2.* ze3t_n + ze3t_b ) 
    329                         ztm   = ze3mr * ( ztca   + 2.* ztcn   + ztcb   ) 
    330                         !!gm mean e3t have to be saved and used in dynhpg  or it can be recomputed in dynhpg !! 
    331                         !!gm                 e3t_m(ji,jj,jk) = 0.25 / ze3mr 
     327                        ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b   
     328                        ztc_n  = ptn(ji,jj,jk,jn) * ze3t_n   
     329                        ztc_a  = pta(ji,jj,jk,jn) * ze3t_a   
     330                        !                                         ! Time laplacian on tracer contents 
     331                        !                                         ! used for both Asselin and Brown & Campana filters 
     332                        ze3t_d =  ze3t_b - 2.* ze3t_n + ze3t_a  
     333                        ztc_d  =  ztc_b  - 2.* ztc_n  + ztc_a   
     334                        !                                         ! Asselin Filter on thicknesses and tracer contents 
     335                        ztc_f  = ztc_n  + atfp * ztc_d 
     336                        ztc_m  = ztc_n  + rbcp * ztc_d 
     337                        !                                          
     338                        ze3t_f = 1.0 / ( ze3t_n + atfp * ze3t_d ) 
     339                        ze3t_m = 1.0 / ( ze3t_n + rbcp * ze3t_d ) 
    332340                        !                                         ! swap of arrays 
    333                         ptb(ji,jj,jk,jn) = ztf                             ! ptb <-- ptn + filter 
    334                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)              ! ptn <-- pta 
    335                         pta(ji,jj,jk,jn) = ztm                             ! pta <-- mean t 
     341                        ptb(ji,jj,jk,jn) = ztc_f * ze3t_f              ! ptb <-- ptn filtered 
     342                        pta(ji,jj,jk,jn) = ztc_m * ze3t_m              ! pta <-- Brown & Campana average 
     343                        ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)            ! ptn <-- pta 
    336344                     END DO 
    337345                  END DO 
    338346               END DO 
    339347            END DO 
    340             !                                        ! ----------------------- ! 
    341          ELSE                                        !    explicit hpg case    ! 
    342             !                                        ! ----------------------- ! 
    343             DO jn = 1, kjpt       
    344                DO jk = 1, jpkm1 
    345                   DO jj = 1, jpj 
    346                      DO ji = 1, jpi 
    347                         ze3t_b = fse3t_b(ji,jj,jk) 
    348                         ze3t_n = fse3t_n(ji,jj,jk) 
    349                         ze3t_a = fse3t_a(ji,jj,jk) 
    350                         !                                         ! tracer content at Before, now and after 
    351                         ztcb = ptb(ji,jj,jk,jn) *  ze3t_b   
    352                         ztcn = ptn(ji,jj,jk,jn) *  ze3t_n    
    353                         ztca = pta(ji,jj,jk,jn) *  ze3t_a   
    354                         ! 
    355                         !                                         ! Asselin filter on thickness and tracer content 
    356                         ze3t_f = atfp * ( ze3t_a - 2.* ze3t_n + ze3t_b ) 
    357                         ztc_f  = atfp * ( ztca   - 2.* ztcn   + ztcb   )  
    358                         ! 
    359                         !                                         ! filtered tracer including the correction  
    360                         ze3fr = 1.e0 / ( ze3t_n + ze3t_f ) 
    361                         ztf   =  ( ztcn  + ztc_f ) * ze3fr 
    362                         !                                         ! swap of arrays 
    363                         ptb(ji,jj,jk,jn) = ztf                    ! tb <-- tn filtered 
    364                         ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)       ! tn <-- ta 
     348            !                                           ! ----------------------- ! 
     349         ELSE                                           !    explicit hpg case    ! 
     350            !                                           ! ----------------------- ! 
     351            IF( cdtype == 'TRA' ) THEN 
     352               !               
     353               DO jn = 1, kjpt       
     354                  DO jk = 1, jpkm1 
     355                     zfact1 = atfp * rdttra(jk) 
     356                     zfact2 = zfact1 / rau0 
     357                     DO jj = 1, jpj 
     358                        DO ji = 1, jpi 
     359                           ze3t_b = fse3t_b(ji,jj,jk) 
     360                           ze3t_n = fse3t_n(ji,jj,jk) 
     361                           ze3t_a = fse3t_a(ji,jj,jk) 
     362                           !                                         ! tracer content at Before, now and after 
     363                           ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b 
     364                           ztc_n  = ptn(ji,jj,jk,jn) * ze3t_n 
     365                           ztc_a  = pta(ji,jj,jk,jn) * ze3t_a 
     366                           ! 
     367                           ze3t_f = ze3t_n + atfp * ( ze3t_b - 2. * ze3t_n + ze3t_a ) 
     368                           ztc_f  = ztc_n  + atfp * ( ztc_a  - 2. * ztc_n  + ztc_b ) 
     369 
     370                           IF( jk == 1 ) THEN 
     371                               ze3t_f = ze3t_f - zfact2 * ( emp_b(ji,jj) - emp(ji,jj) ) 
     372                               IF( jn == jp_tem )   ztc_f  = ztc_f  - zfact1 * ( sbc_hc_n(ji,jj) - sbc_hc_b(ji,jj) ) 
     373                               IF( jn == jp_sal )   ztc_f  = ztc_f  - zfact1 * ( sbc_sc_n(ji,jj) - sbc_sc_b(ji,jj) ) 
     374                           ENDIF 
     375                           IF( jn == jp_tem .AND. ln_traqsr .AND. jk <= nksr )  & 
     376                           &                        ztc_f  = ztc_f  - zfact1 * ( qsr_hc_n(ji,jj,jk) - qsr_hc_b(ji,jj,jk) )  
     377 
     378                           ze3t_f = 1.e0 / ze3t_f 
     379                           ptb(ji,jj,jk,jn) = ztc_f * ze3t_f                           ! tb <-- tn filtered 
     380                           ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                             ! tn <-- ta 
     381                        END DO 
    365382                     END DO 
    366383                  END DO 
    367384               END DO 
    368             END DO 
     385               ! 
     386            ELSE IF( cdtype == 'TRC' ) THEN 
     387               !               
     388               DO jn = 1, kjpt       
     389                  DO jk = 1, jpkm1 
     390                     DO jj = 1, jpj 
     391                        DO ji = 1, jpi 
     392                           ze3t_b = fse3t_b(ji,jj,jk) 
     393                           ze3t_n = fse3t_n(ji,jj,jk) 
     394                           ze3t_a = fse3t_a(ji,jj,jk) 
     395                           !                                         ! tracer content at Before, now and after 
     396                           ztc_b  = ptb(ji,jj,jk,jn) * ze3t_b 
     397                           ztc_n  = ptn(ji,jj,jk,jn) * ze3t_n 
     398                           ztc_a  = pta(ji,jj,jk,jn) * ze3t_a 
     399                           ! 
     400                           ze3t_f = ze3t_n + atfp * ( ze3t_b - 2. * ze3t_n + ze3t_a ) 
     401                           ztc_f  = ztc_n  + atfp * ( ztc_a  - 2. * ztc_n  + ztc_b  ) 
     402 
     403                           ze3t_f = 1.e0 / ze3t_f 
     404                           ptb(ji,jj,jk,jn) = ztc_f * ze3t_f                           ! tb <-- tn filtered 
     405                           ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                             ! tn <-- ta 
     406                        END DO 
     407                     END DO 
     408                  END DO 
     409               END DO 
     410               ! 
     411            END IF 
    369412            ! 
    370413         ENDIF 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/traqsr.F90

    r2024 r2148  
    2727   USE iom             ! I/O manager 
    2828   USE fldread         ! read input fields 
     29   USE restart         ! ocean restart 
    2930 
    3031   IMPLICIT NONE 
     
    4748   ! Module variables 
    4849   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_chl   ! structure of input Chl (file informations, fields read) 
    49    INTEGER ::   nksr   ! levels below which the light cannot penetrate ( depth larger than 391 m) 
     50   INTEGER, PUBLIC ::   nksr              ! levels below which the light cannot penetrate ( depth larger than 391 m) 
    5051   REAL(wp), DIMENSION(3,61) ::   rkrgb   !: tabulated attenuation coefficients for RGB absorption 
    5152 
     
    9596      REAL(wp) ::   zchl, zcoef, zsi0r   ! temporary scalars 
    9697      REAL(wp) ::   zc0, zc1, zc2, zc3   !    -         - 
     98      REAL(wp) ::   z1_e3t, zfact        !    -         - 
    9799      REAL(wp), DIMENSION(jpi,jpj)     ::   zekb, zekg, zekr            ! 2D workspace 
    98100      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ze0, ze1 , ze2, ze3, zea    ! 3D workspace 
     
    111113         ALLOCATE( ztrds(jpi,jpj,jpk) )   ;    ztrds(:,:,:) = 0. 
    112114      ENDIF 
     115 
     116      !                                        Set before qsr tracer content field 
     117      !                                        *********************************** 
     118      IF( kt == nit000 ) THEN                     ! Set the forcing field at nit000 - 1 
     119         !                                        ! ----------------------------------- 
     120         IF( ln_rstart .AND.    &                    ! Restart: read in restart file 
     121              & iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0 ) THEN 
     122            IF(lwp) WRITE(numout,*) '          nit000-1 qsr tracer content forcing field red in the restart file' 
     123            zfact = 0.5e0 
     124            CALL iom_get( numror, jpdom_autoglo, 'qsr_hc_b', qsr_hc_b )   ! before heat content trend due to Qsr flux 
     125         ELSE                                           ! No restart or restart not found: Euler forward time stepping 
     126            zfact = 1.e0 
     127            qsr_hc_b(:,:,:) = 0.e0 
     128         ENDIF 
     129      ELSE                                        ! Swap of forcing field 
     130         !                                        ! --------------------- 
     131         zfact = 0.5e0 
     132         qsr_hc_b(:,:,:) = qsr_hc_n(:,:,:) 
     133      ENDIF 
     134      !                                        Compute now qsr tracer content field 
     135      !                                        ************************************ 
    113136       
    114137      !                                           ! ============================================== ! 
     
    118141            DO jj = 2, jpjm1 
    119142               DO ji = fs_2, fs_jpim1   ! vector opt. 
    120                   ta(ji,jj,jk) = ta(ji,jj,jk) + ro0cpr * ( etot3(ji,jj,jk) - etot3(ji,jj,jk+1) ) / fse3t(ji,jj,jk)  
     143                  qsr_hc_n(ji,jj,jk) = ro0cpr * ( etot3(ji,jj,jk) - etot3(ji,jj,jk+1) ) / fse3t(ji,jj,jk)  
    121144               END DO 
    122145            END DO 
     
    175198               ! 
    176199               DO jk = 1, nksr                                        ! compute and add qsr trend to ta 
    177                   tsa(:,:,jk,jp_tem) = tsa(:,:,jk,jp_tem) + ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) / fse3t(:,:,jk) 
     200                  qsr_hc_n(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) 
    178201               END DO 
    179202               zea(:,:,nksr+1:jpk) = 0.e0     ! below 400m set to zero 
     
    182205            ELSE                                                 !*  Constant Chlorophyll 
    183206               DO jk = 1, nksr 
    184                   tsa(:,:,jk,jp_tem) = tsa(:,:,jk,jp_tem) + etot3(:,:,jk) * qsr(:,:) 
     207                  qsr_hc_n(:,:,jk) = etot3(:,:,jk) * qsr(:,:) 
    185208               END DO 
    186209            ENDIF 
     
    194217               DO jj = 2, jpjm1 
    195218                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    196                      tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + etot3(ji,jj,jk) * qsr(ji,jj) 
     219                     qsr_hc_n(ji,jj,jk) = etot3(ji,jj,jk) * qsr(ji,jj) 
    197220                  END DO 
    198221               END DO 
     
    200223            ! 
    201224         ENDIF 
     225         ! 
     226      ENDIF 
     227      !                                        Add to the general trend 
     228      !                                        ************************ 
     229      DO jk = 1, nksr 
     230         DO jj = 2, jpjm1  
     231            DO ji = fs_2, fs_jpim1   ! vector opt. 
     232               z1_e3t = zfact / fse3t(ji,jj,jk) 
     233               tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + ( qsr_hc_b(ji,jj,jk) + qsr_hc_n(ji,jj,jk) ) * z1_e3t 
     234            END DO 
     235         END DO 
     236      END DO 
     237      ! 
     238      IF( lrst_oce ) THEN   !                  Write in the ocean restart file 
     239         !                                     ******************************* 
     240         IF(lwp) WRITE(numout,*) 
     241         IF(lwp) WRITE(numout,*) 'qsr tracer content forcing field written in ocean restart file ',   & 
     242            &                    'at it= ', kt,' date= ', ndastp 
     243         IF(lwp) WRITE(numout,*) '~~~~' 
     244         CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b', qsr_hc_n ) 
    202245         ! 
    203246      ENDIF 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/trasbc.F90

    r2113 r2148  
    77   !!            8.2  !  2001-02  (D. Ludicone)  sea ice and free surface 
    88   !!  NEMO      1.0  !  2002-06  (G. Madec)  F90: Free form and module 
    9    !!            3.3  !  2010-09  (C. Ethe, G. Madec) Merge TRA-TRC 
     9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps 
     10   !!             -   !  2010-09  (C. Ethe, G. Madec) Merge TRA-TRC 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    2223   USE in_out_manager  ! I/O manager 
    2324   USE prtctl          ! Print control 
     25   USE restart         ! ocean restart 
    2426   USE sbcrnf          ! River runoff   
    2527   USE sbcmod          ! ln_rnf   
     28   USE iom 
    2629 
    2730   IMPLICIT NONE 
     
    103106      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    104107      !! 
    105       INTEGER  ::   ji, jj, jk      ! dummy loop indices   
    106       REAL(wp) ::   zta, zsa        ! local scalars, adjustment to temperature and salinity   
    107       REAL(wp) ::   zata, zasa      ! local scalars, calculations of automatic change to temp & sal due to vvl (done elsewhere)   
     108      INTEGER  ::   ji, jj, jk           ! dummy loop indices   
     109      REAL(wp) ::   zta, zsa, zrnf       ! local scalars, adjustment to temperature and salinity   
    108110      REAL(wp) ::   zsrau, zse3t, zdep   ! local scalars, 1/density, 1/height of box, 1/height of effected water column   
    109111      REAL(wp) ::   zdheat, zdsalt       ! total change of temperature and salinity   
     112      REAL(wp) ::   zfact, z1_e3t        !  
    110113      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  ztrdt, ztrds 
    111114      !!---------------------------------------------------------------------- 
     
    118121 
    119122      zsrau = 1. / rau0             ! initialization 
    120 #if defined key_zco 
    121       zse3t = 1. / e3t_0(1) 
    122 #endif 
    123123 
    124124      IF( l_trdtra )   THEN                    !* Save ta and sa trends 
     
    127127      ENDIF 
    128128 
    129       IF( .NOT.ln_traqsr )   qsr(:,:) = 0.e0   ! no solar radiation penetration 
    130  
    131       ! Concentration dilution effect on (t,s) due to evapouration, precipitation and qns, but not river runoff   
     129!!gm      IF( .NOT.ln_traqsr )   qsr(:,:) = 0.e0   ! no solar radiation penetration 
     130      IF( .NOT.ln_traqsr ) THEN     ! no solar radiation penetration 
     131         qns(:,:) = qns(:,:) + qsr(:,:)      ! total heat flux in qns 
     132         qsr(:,:) = 0.e0                     ! qsr set to zero 
     133      ENDIF 
     134 
     135      !                                          Set before sbc tracer content fields 
     136      !                                          ************************************ 
     137      IF( kt == nit000 ) THEN                      ! Set the forcing field at nit000 - 1 
     138         !                                         ! ----------------------------------- 
     139         IF( ln_rstart .AND.    &                     ! Restart: read in restart file 
     140              & iom_varid( numror, 'sbc_hc_b', ldstop = .FALSE. ) > 0 ) THEN 
     141            IF(lwp) WRITE(numout,*) '          nit000-1 surface tracer content forcing fields red in the restart file' 
     142            zfact = 0.5e0 
     143            CALL iom_get( numror, jpdom_autoglo, 'sbc_hc_b', sbc_hc_b )   ! before heat content sbc trend 
     144            CALL iom_get( numror, jpdom_autoglo, 'sbc_sc_b', sbc_sc_b )   ! before salt content sbc trend 
     145         ELSE                                         ! No restart or restart not found: Euler forward time stepping 
     146            zfact = 1.e0 
     147            sbc_hc_b(:,:) = 0.e0 
     148            sbc_sc_b(:,:) = 0.e0 
     149         ENDIF 
     150      ELSE                                         ! Swap of forcing fields 
     151         !                                         ! ---------------------- 
     152         zfact = 0.5e0 
     153         sbc_hc_b(:,:) = sbc_hc_n(:,:) 
     154         sbc_sc_b(:,:) = sbc_sc_n(:,:) 
     155      ENDIF 
     156      !                                          Compute now sbc tracer content fields 
     157      !                                          ************************************* 
     158 
     159                                                   ! Concentration dilution effect on (t,s) due to   
     160                                                   ! evaporation, precipitation and qns, but not river runoff  
     161                                                
     162      IF( lk_vvl ) THEN                            ! Variable Volume case 
     163         DO jj = 2, jpj 
     164            DO ji = fs_2, fs_jpim1   ! vector opt. 
     165               ! temperature : heat flux + cooling/heating effet of EMP flux 
     166               sbc_hc_n(ji,jj) = ro0cpr * qns(ji,jj) - zsrau * emp(ji,jj) * tsn(ji,jj,1,jp_tem) 
     167               ! concent./dilut. effect due to sea-ice melt/formation and (possibly) SSS restoration 
     168               sbc_sc_n(ji,jj) = ( emps(ji,jj) - emp(ji,jj) ) * zsrau * tsn(ji,jj,1,jp_sal) 
     169            END DO 
     170         END DO 
     171      ELSE                                         ! Constant Volume case 
     172         DO jj = 2, jpj 
     173            DO ji = fs_2, fs_jpim1   ! vector opt. 
     174               ! temperature : heat flux 
     175               sbc_hc_n(ji,jj) = ro0cpr * qns(ji,jj) 
     176               ! salinity    : salt flux + concent./dilut. effect (both in emps) 
     177               sbc_sc_n(ji,jj) = zsrau * emps(ji,jj) * tsn(ji,jj,1,jp_sal) 
     178            END DO 
     179         END DO 
     180      ENDIF 
     181                                                   ! Concentration dilution effect on (t,s) due to   
     182                                                   ! river runoff without T, S and depth attributes 
     183      IF( ln_rnf ) THEN  
     184         ! 
     185         IF( lk_vvl ) THEN                            ! Variable Volume case  
     186            !                                         ! cooling/heating effect of runoff & No salinity concent./dilut. effect 
     187            DO jj = 2, jpj 
     188               DO ji = fs_2, fs_jpim1   ! vector opt. 
     189                  sbc_hc_n(ji,jj) = sbc_hc_n(ji,jj) + zsrau * rnf(ji,jj) * tsn(ji,jj,1,jp_tem) 
     190               END DO 
     191            END DO 
     192         ELSE                                         ! Constant Volume case 
     193            !                                         ! concent./dilut. effect only 
     194            DO jj = 2, jpj  
     195               DO ji = fs_2, fs_jpim1   ! vector opt. 
     196                  sbc_sc_n(ji,jj) = sbc_sc_n(ji,jj) - zsrau * rnf(ji,jj) * tsn(ji,jj,1,jp_sal) 
     197               END DO 
     198            END DO 
     199         ENDIF 
     200         !   
     201      ENDIF 
     202      !                                          Add to the general trend 
     203      !                                          ************************ 
    132204      DO jj = 2, jpj 
    133205         DO ji = fs_2, fs_jpim1   ! vector opt. 
    134 #if ! defined key_zco 
    135             zse3t = 1. / fse3t(ji,jj,1) 
    136 #endif 
    137             IF( lk_vvl) THEN 
    138                ! temperature : heat flux and heat content of EMP flux 
    139                zta = ( ro0cpr * qns(ji,jj) - emp(ji,jj) * zsrau * tsn(ji,jj,1,jp_tem) ) * zse3t 
    140                ! Salinity    : concent./dilut. effect due to sea-ice melt/formation and (possibly) SSS restoration 
    141                zsa = ( emps(ji,jj) - emp(ji,jj) ) * zsrau * tsn(ji,jj,1,jp_sal) * zse3t 
    142             ELSE 
    143                zta =  ro0cpr * qns(ji,jj) * zse3t                         ! temperature : heat flux  
    144                zsa =  emps(ji,jj) * zsrau * tsn(ji,jj,1,jp_sal) * zse3t   ! salinity :  concent./dilut. effect  
    145             ENDIF 
    146             tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zta                  ! add the trend to the general tracer trend 
    147             tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + zsa 
     206            z1_e3t = zfact / fse3t(ji,jj,1) 
     207            tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + ( sbc_hc_b(ji,jj) + sbc_hc_n(ji,jj) ) * z1_e3t 
     208            tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + ( sbc_sc_b(ji,jj) + sbc_sc_n(ji,jj) ) * z1_e3t 
    148209         END DO 
    149210      END DO 
     211      !                                          Write in the ocean restart file 
     212      !                                          ******************************* 
     213      IF( lrst_oce ) THEN 
     214         IF(lwp) WRITE(numout,*) 
     215         IF(lwp) WRITE(numout,*) 'sbc : ocean surface tracer content forcing fields written in ocean restart file ',   & 
     216            &                    'at it= ', kt,' date= ', ndastp 
     217         IF(lwp) WRITE(numout,*) '~~~~' 
     218         CALL iom_rstput( kt, nitrst, numrow, 'sbc_hc_b', sbc_hc_n ) 
     219         CALL iom_rstput( kt, nitrst, numrow, 'sbc_sc_b', sbc_sc_n ) 
     220      ENDIF 
    150221 
    151222      IF( ln_rnf .AND. ln_rnf_att ) THEN        ! Concentration / dilution effect on (t,s) due to river runoff   
     223        ! 
    152224        DO jj = 1, jpj   
    153225           DO ji = 1, jpi   
    154               zdep = 1. / rnf_dep(ji,jj)   
    155               zse3t= 1. / fse3t(ji,jj,1)   
    156               IF( rnf_tem(ji,jj) == -999 )   rnf_tem(ji,jj) = tsn(ji,jj,1,jp_tem)   ! if not specified set runoff temp to be sst   
     226              zdep  = 1. / rnf_dep(ji,jj)   
     227              zse3t = 1. / fse3t(ji,jj,1)   
     228              rnf_dep(ji,jj) = 0.e0 
     229              DO jk = 1, rnf_mod_dep(ji,jj)                          ! recalculates rnf_dep to be the depth   
     230                rnf_dep(ji,jj) = rnf_dep(ji,jj) + fse3t(ji,jj,jk)    ! in metres to the bottom of the relevant grid box   
     231              END DO 
     232              IF( rnf_tmp(ji,jj) == -999 )   rnf_tmp(ji,jj) = tsn(ji,jj,1,jp_tem)   ! if not specified set runoff temp to be sst   
    157233   
    158234              IF( rnf(ji,jj) > 0.e0 ) THEN   
    159    
     235                ! 
     236                zrnf = rnf(ji,jj) * zsrau * zdep 
    160237                IF( lk_vvl ) THEN   
    161238                  ! indirect flux, concentration or dilution effect : force a dilution effect in all levels  
     
    163240                  zdsalt = 0.e0   
    164241                  DO jk = 1, rnf_mod_dep(ji,jj)   
    165                     zta = -tsn(ji,jj,jk,jp_tem) * rnf(ji,jj) * zsrau * zdep   
    166                     zsa = -tsn(ji,jj,jk,jp_sal) * rnf(ji,jj) * zsrau * zdep   
     242                    zta = -tsn(ji,jj,jk,jp_tem) * zrnf   
     243                    zsa = -tsn(ji,jj,jk,jp_sal) * zrnf   
    167244                    tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta        ! add the trend to the general tracer trend 
    168245                    tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 
     
    171248                  END DO   
    172249                  ! negate this total change in heat and salt content from top level    !!gm I don't understand this 
    173                   zta = -zdheat * zse3t   
    174                   zsa = -zdsalt * zse3t   
    175                   tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zta            ! add the trend to the general tracer trend 
    176                   tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + zsa 
    177      
    178                   ! direct flux   
    179                   zta = rnf_tem(ji,jj) * rnf(ji,jj) * zsrau * zdep   
    180                   zsa = rnf_sal(ji,jj) * rnf(ji,jj) * zsrau * zdep   
     250                  tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) - zdheat * zse3t 
     251                  tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) - zdsalt * zse3t 
    181252     
    182253                  DO jk = 1, rnf_mod_dep(ji,jj)   
    183                     tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta        ! add the trend to the general tracer trend 
    184                     tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 
     254                    tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + rnf_tmp(ji,jj) * zrnf 
     255                    tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + rnf_sal(ji,jj) * zrnf 
    185256                  END DO   
    186257                ELSE   
    187258                  DO jk = 1, rnf_mod_dep(ji,jj)   
    188                     zta = ( rnf_tem(ji,jj) - tsn(ji,jj,jk,jp_tem) ) * rnf(ji,jj) * zsrau * zdep   
    189                     zsa = ( rnf_sal(ji,jj) - tsn(ji,jj,jk,jp_sal) ) * rnf(ji,jj) * zsrau * zdep   
    190                     tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta        ! add the trend to the general tracer trend 
    191                     tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa 
     259                    tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + ( rnf_tmp(ji,jj) - tsn(ji,jj,jk,jp_tem) ) * zrnf 
     260                    tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + ( rnf_sal(ji,jj) - tsn(ji,jj,jk,jp_sal) ) * zrnf 
    192261                  END DO   
    193262                ENDIF   
    194263   
    195               ELSEIF( rnf(ji,jj) < 0.e0) THEN   ! for use in baltic when flow is out of domain, want no change in temp and sal   
     264              ELSEIF( rnf(ji,jj) < 0.e0 ) THEN   ! for use in baltic when flow is out of domain, want no change in temp and sal   
    196265   
    197266                IF( lk_vvl ) THEN   
    198267                  ! calculate automatic adjustment to sal and temp due to dilution/concentraion effect    
    199                   zata = tsn(ji,jj,1,jp_tem) * rnf(ji,jj) * zsrau * zse3t   
    200                   zasa = tsn(ji,jj,1,jp_sal) * rnf(ji,jj) * zsrau * zse3t   
    201                   tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zata                  ! add the trend to the general tracer trend 
    202                   tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + zasa 
     268                  zrnf = rnf(ji,jj) * zsrau * zse3t 
     269                  tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + tsn(ji,jj,1,jp_tem) * zrnf  
     270                  tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + tsn(ji,jj,1,jp_sal) * zrnf 
    203271                ENDIF   
    204272   
     
    207275           END DO   
    208276        END DO   
    209  
    210       ELSE IF( ln_rnf ) THEN      ! Concentration dilution effect on (t,s) due to runoff without T, S and depth attributes 
    211  
    212  
    213         DO jj = 2, jpj 
    214            DO ji = fs_2, fs_jpim1   ! vector opt. 
    215 #if ! defined key_zco 
    216               zse3t = 1. / fse3t(ji,jj,1) 
    217 #endif 
    218               IF( lk_vvl) THEN 
    219                  zta =    rnf(ji,jj) * zsrau * tsn(ji,jj,1,jp_tem) * zse3t       ! & cooling/heating effect of runoff 
    220                  zsa =    0.e0                                                   ! No salinity concent./dilut. effect 
    221               ELSE 
    222                  zta =    0.0                                            ! temperature : heat flux  
    223                  zsa =  - rnf(ji,jj) * zsrau * tsn(ji,jj,1,jp_sal) * zse3t     ! salinity :  concent./dilut. effect 
    224               ENDIF 
    225               tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + zta          ! add the trend to the general tracer trend 
    226               tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + zsa 
    227            END DO 
    228         END DO 
    229   
     277        ! 
    230278      ENDIF   
    231279 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/istate.F90

    r2104 r2148  
    6767      !! ** Purpose :   Initialization of the dynamics and tracer fields. 
    6868      !!---------------------------------------------------------------------- 
     69      ! - ML - needed for initialization of e3t_b 
     70      INTEGER  ::  jk     ! dummy loop indice 
    6971 
    7072      IF(lwp) WRITE(numout,*) 
     
    128130         IF( ln_zps .AND. .NOT. lk_c1d )   CALL zps_hde( nit000, jpts, tsb, gtsu, gtsv,  & ! zps: before hor. gradient 
    129131            &                                                          rhd, gru , grv  )   ! of t,s,rd at ocean bottom 
    130          !     
     132         !    
     133         ! - ML - sshn could be modified by istate_eel, so that initialization of fse3t_b is done here 
     134         IF( lk_vvl ) THEN 
     135            DO jk = 1, jpk 
     136               fse3t_b(:,:,jk) = fse3t_n(:,:,jk) 
     137            ENDDO 
     138         ENDIF 
     139         !  
    131140      ENDIF 
    132141      ! 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/oce.F90

    r2104 r2148  
    3636   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sshu_b ,  sshu_n  ,  sshu_a  !: sea surface height at u-point [m] 
    3737   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sshv_b ,  sshv_n  ,  sshv_a  !: sea surface height at u-point [m] 
    38    REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   sshf_b ,  sshf_n  ,  sshf_a  !: sea surface height at f-point [m] 
     38   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::             sshf_n             !: sea surface height at f-point [m] 
    3939   ! 
    4040   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   spgu, spgv                   !: horizontal surface pressure gradient 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/opa.F90

    r2104 r2148  
    281281      IF( lk_diaar5    )    CALL dia_ar5_init   ! ar5 diag 
    282282                            CALL dia_ptr_init   ! Poleward TRansports initialization 
     283                            CALL dia_hsb_init   ! heat content, salt content and volume budgets 
    283284                            CALL trd_mod_init   ! Mixed-layer/Vorticity/Integral constraints trends 
    284285      ! 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/step.F90

    r2104 r2148  
    221221                               CALL ssh_nxt( kstp )         ! sea surface height at next time step 
    222222 
     223      IF( ln_diahsb        )   CALL dia_hsb( kstp )         ! - ML - global conservation diagnostics 
     224 
    223225      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    224226      ! Control and restarts 
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/step_oce.F90

    r2104 r2148  
    8585   USE diahth           ! thermocline depth                (dia_hth routine) 
    8686   USE diafwb           ! freshwater budget                (dia_fwb routine) 
     87   USE diahsb           ! heat, salt and volume budgets    (dia_hsb routine) 
    8788   USE flo_oce          ! floats variables 
    8889   USE floats           ! floats computation               (flo_stp routine) 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/PISCES/p4zmort.F90

    r2104 r2148  
    235235      !! 
    236236      !! ** Method  :   Read the nampismort namelist and check the parameters 
    237       !!      called at the first timestep (nittrc000) 
     237      !!      called at the first timestep 
    238238      !! 
    239239      !! ** input   :   Namelist nampismort 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/PISCES/p4zrem.F90

    r2104 r2148  
    408408      !! 
    409409      !! ** Method  :   Read the nampisrem namelist and check the parameters 
    410       !!      called at the first timestep (nittrc000) 
     410      !!      called at the first timestep 
    411411      !! 
    412412      !! ** input   :   Namelist nampisrem 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/PISCES/p4zsink.F90

    r2104 r2148  
    321321      !! 
    322322      !! ** Method  :   Read the nampiskrs namelist and check the parameters 
    323       !!      called at the first timestep (nittrc000) 
     323      !!      called at the first timestep  
    324324      !! 
    325325      !! ** input   :   Namelist nampiskrs 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trcadv.F90

    r2082 r2148  
    6565      !!---------------------------------------------------------------------- 
    6666 
    67       IF( kt == nittrc000 )   CALL trc_adv_ctl          ! initialisation & control of options 
     67      IF( kt == nit000 )   CALL trc_adv_ctl          ! initialisation & control of options 
    6868 
    69       IF( neuler == 0 .AND. kt == nittrc000 ) THEN     ! at nit000 
     69      IF( neuler == 0 .AND. kt == nit000 ) THEN     ! at nit000 
    7070         r2dt(:) =  rdttra(:) * FLOAT(nn_dttrc)          ! = rdtra (restarting with Euler time stepping) 
    71       ELSEIF( kt <= nittrc000 + nn_dttrc ) THEN          ! at nit000 or nit000+1 
     71      ELSEIF( kt <= nit000 + nn_dttrc ) THEN          ! at nit000 or nit000+1 
    7272         r2dt(:) = 2. * rdttra(:) * FLOAT(nn_dttrc)      ! = 2 rdttra (leapfrog) 
    7373      ENDIF 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trcdmp.F90

    r2030 r2148  
    8282      ! 0. Initialization (first time-step only) 
    8383      !    -------------- 
    84       IF( kt == nittrc000 ) CALL trc_dmp_init 
     84      IF( kt == nit000 ) CALL trc_dmp_init 
    8585 
    8686      IF( l_trdtrc )   ALLOCATE( ztrtrd(jpi,jpj,jpk) )   ! temporary save of trends 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trcldf.F90

    r2082 r2148  
    6262      !!---------------------------------------------------------------------- 
    6363 
    64       IF( kt == nittrc000 )   CALL ldf_ctl          ! initialisation & control of options 
     64      IF( kt == nit000 )   CALL ldf_ctl          ! initialisation & control of options 
    6565 
    6666      IF( l_trdtrc )  THEN  
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trcnxt.F90

    r2082 r2148  
    8686      !!---------------------------------------------------------------------- 
    8787 
    88       IF( kt == nittrc000 .AND. lwp ) THEN 
     88      IF( kt == nit000 .AND. lwp ) THEN 
    8989         WRITE(numout,*) 
    9090         WRITE(numout,*) 'trc_nxt : time stepping on passive tracers' 
     
    109109 
    110110      ! set time step size (Euler/Leapfrog) 
    111       IF( neuler == 0 .AND. kt ==  nittrc000) THEN  ;  r2dt(:) =     rdttra(:) * FLOAT( nn_dttrc )  ! at nit000             (Euler) 
    112       ELSEIF( kt <= nittrc000 + 1 )           THEN  ;  r2dt(:) = 2.* rdttra(:) * FLOAT( nn_dttrc )  ! at nit000 or nit000+1 (Leapfrog) 
     111      IF( neuler == 0 .AND. kt ==  nit000) THEN  ;  r2dt(:) =     rdttra(:) * FLOAT( nn_dttrc )  ! at nit000             (Euler) 
     112      ELSEIF( kt <= nit000 + 1 )           THEN  ;  r2dt(:) = 2.* rdttra(:) * FLOAT( nn_dttrc )  ! at nit000 or nit000+1 (Leapfrog) 
    113113      ENDIF 
    114114 
     
    120120 
    121121      ! Leap-Frog + Asselin filter time stepping 
    122       IF( lk_vvl ) THEN   ;   CALL tra_nxt_vvl( kt, nittrc000, trb, trn, tra, jptra )      ! variable volume level (vvl)  
    123       ELSE                ;   CALL tra_nxt_fix( kt, nittrc000, trb, trn, tra, jptra )      ! fixed    volume level  
     122      IF( lk_vvl ) THEN   ;   CALL tra_nxt_vvl( kt, 'TRC', trb, trn, tra, jptra )      ! variable volume level (vvl)  
     123      ELSE                ;   CALL tra_nxt_fix( kt,       trb, trn, tra, jptra )      ! fixed    volume level  
    124124      ENDIF 
    125125 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trcrad.F90

    r2030 r2148  
    5454      !!---------------------------------------------------------------------- 
    5555 
    56       IF( kt == nittrc000 ) THEN 
     56      IF( kt == nit000 ) THEN 
    5757         IF(lwp) WRITE(numout,*) 
    5858         IF(lwp) WRITE(numout,*) 'trc_rad : Correct artificial negative concentrations ' 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trcsbc.F90

    r2052 r2148  
    6565      !! * Local declarations 
    6666      INTEGER  ::   ji, jj, jn           ! dummy loop indices 
    67       REAL(wp) ::   ztra, zsrau, zse3t   ! temporary scalars 
     67      REAL(wp) ::   zsrau, zse3t   ! temporary scalars 
    6868      REAL(wp), DIMENSION(jpi,jpj) ::   zemps  ! surface freshwater flux 
    6969      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrtrd 
     
    7171      !!---------------------------------------------------------------------- 
    7272 
    73       IF( kt == nittrc000 ) THEN 
     73      IF( kt == nit000 ) THEN 
    7474         IF(lwp) WRITE(numout,*) 
    7575         IF(lwp) WRITE(numout,*) 'trc_sbc : Passive tracers surface boundary condition' 
     
    8282#if ! defined key_offline 
    8383      ! Concentration dilution effect on tracer due to evaporation, precipitation, and river runoff 
    84       IF( lk_vvl ) THEN   ;   zemps(:,:) = emps(:,:) - emp(:,:)   ! volume variable 
    85       ELSE                ;   zemps(:,:) = emps(:,:) - rnf(:,:)   ! linear free surface  
     84      IF( lk_vvl ) THEN                      ! volume variable 
     85         zemps(:,:) = emps(:,:) - emp(:,:)    
     86!!ch         zemps(:,:) = 0. 
     87      ELSE                                   ! linear free surface 
     88         IF( ln_rnf ) THEN  ;  zemps(:,:) = emps(:,:) - rnf(:,:)   !  E-P-R 
     89         ELSE               ;  zemps(:,:) = emps(:,:) 
     90         ENDIF  
    8691      ENDIF  
    8792#else 
     
    9196      ENDIF 
    9297#endif 
     98 
    9399      ! 0. initialization 
    94100      zsrau = 1. / rau0 
    95 #if defined key_zco 
    96       zse3t = 1. / e3t_0(1) 
    97 #endif 
    98  
    99101      DO jn = 1, jptra 
    100102         ! 
    101103         IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn)  ! save trends 
    102  
     104         !                                             ! add the trend to the general tracer trend 
    103105         DO jj = 2, jpj 
    104106            DO ji = fs_2, fs_jpim1   ! vector opt. 
    105 #if ! defined key_zco  
    106107               zse3t = 1. / fse3t(ji,jj,1) 
    107 #endif 
    108                ! add the trend to the general tracer trend 
    109                ztra = zemps(ji,jj) *  zsrau * trn(ji,jj,1,jn) * zse3t 
    110                tra(ji,jj,1,jn) = tra(ji,jj,1,jn) + ztra 
     108               tra(ji,jj,1,jn) = tra(ji,jj,1,jn) + zemps(ji,jj) *  zsrau * trn(ji,jj,1,jn) * zse3t 
    111109            END DO 
    112110         END DO 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trczdf.F90

    r2082 r2148  
    6161      !!--------------------------------------------------------------------- 
    6262 
    63       IF( kt == nittrc000 )   CALL zdf_ctl          ! initialisation & control of options 
     63      IF( kt == nit000 )   CALL zdf_ctl          ! initialisation & control of options 
    6464 
    6565#if ! defined key_pisces 
    66       IF( neuler == 0 .AND. kt == nittrc000 ) THEN     ! at nit000 
     66      IF( neuler == 0 .AND. kt == nit000 ) THEN     ! at nit000 
    6767         r2dt(:) =  rdttra(:) * FLOAT(nn_dttrc)          ! = rdtra (restarting with Euler time stepping) 
    68       ELSEIF( kt <= nittrc000 + nn_dttrc ) THEN          ! at nit000 or nit000+1 
     68      ELSEIF( kt <= nit000 + nn_dttrc ) THEN          ! at nit000 or nit000+1 
    6969         r2dt(:) = 2. * rdttra(:) * FLOAT(nn_dttrc)      ! = 2 rdttra (leapfrog) 
    7070      ENDIF 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trdmld_trc.F90

    r2052 r2148  
    361361      !!---------------------------------------------------------------------- 
    362362 
    363       IF( llwarn ) THEN                                           ! warnings 
    364          IF(      ( nittrc000 /= nit000   ) & 
    365               .OR.( nn_dttrc    /= 1        )    ) THEN 
    366  
    367             WRITE(numout,*) 'Be careful, trends diags never validated' 
    368             STOP 'Uncomment this line to proceed' 
    369          ENDIF 
    370       ENDIF 
     363      IF( nn_dttrc  /= 1  ) CALL ctl_stop( " Be careful, trends diags never validated " ) 
    371364 
    372365      ! ====================================================================== 
     
    422415      ! II.1 Set before values of vertically averages passive tracers 
    423416      ! ------------------------------------------------------------- 
    424       IF( kt > nittrc000 ) THEN 
     417      IF( kt > nit000 ) THEN 
    425418         DO jn = 1, jptra 
    426419            IF( ln_trdtrc(jn) ) THEN 
     
    507500      tmltrd_trc(:,:,:,:) = tmltrd_trc(:,:,:,:) * rn_ucf_trc 
    508501 
    509       itmod = kt - nittrc000 + 1 
     502      itmod = kt - nit000 + 1 
    510503      it    = kt 
    511504 
     
    915908      !!---------------------------------------------------------------------- 
    916909      ! ... Warnings 
    917       IF( llwarn ) THEN 
    918          IF(      ( nittrc000 /= nit000   ) & 
    919               .OR.( nn_dttrc    /= 1        )    ) THEN 
    920  
    921             WRITE(numout,*) 'Be careful, trends diags never validated' 
    922             STOP 'Uncomment this line to proceed' 
    923          END IF 
    924       END IF 
     910      IF( nn_dttrc  /= 1  ) CALL ctl_stop( " Be careful, trends diags never validated " ) 
    925911 
    926912      ! ====================================================================== 
     
    10381024 
    10391025      ! define time axis 
    1040       itmod = kt - nittrc000 + 1 
     1026      itmod = kt - nit000 + 1 
    10411027      it    = kt 
    10421028 
     
    13181304            CALL dia_nam( clhstnam, nn_trd_trc, csuff ) 
    13191305            CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,                                            & 
    1320                &        1, jpi, 1, jpj, nittrc000-nn_dttrc, zjulian, rdt, nh_t(jn), nidtrd(jn), domain_id=nidom ) 
     1306               &        1, jpi, 1, jpj, nit000, zjulian, rdt, nh_t(jn), nidtrd(jn), domain_id=nidom ) 
    13211307       
    13221308            !-- Define the ML depth variable 
     
    13311317          CALL dia_nam( clhstnam, nn_trd_trc, 'trdbio' ) 
    13321318          CALL histbeg( clhstnam, jpi, glamt, jpj, gphit,                                            & 
    1333              &             1, jpi, 1, jpj, nittrc000-nn_dttrc, zjulian, rdt, nh_tb, nidtrdbio, domain_id=nidom ) 
     1319             &             1, jpi, 1, jpj, nit000, zjulian, rdt, nh_tb, nidtrdbio, domain_id=nidom ) 
    13341320#endif 
    13351321 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/TRP/trdmod_trc.F90

    r2030 r2148  
    5050      !!---------------------------------------------------------------------- 
    5151 
    52       IF( kt == nittrc000 ) THEN 
     52      IF( kt == nit000 ) THEN 
    5353!         IF(lwp)WRITE(numout,*) 
    5454!         IF(lwp)WRITE(numout,*) 'trd_mod_trc:' 
  • branches/DEV_r2106_LOCEAN2010/NEMO/TOP_SRC/oce_trc.F90

    r2104 r2148  
    201201   USE sbc_oce , ONLY :   emps       =>    emps       !: freshwater budget: concentration/dillution   [Kg/m2/s] 
    202202   USE sbc_oce , ONLY :   rnf        =>    rnf        !: river runoff   [Kg/m2/s] 
     203   USE sbc_oce , ONLY :   ln_rnf     =>    ln_rnf     !: runoffs / runoff mouths 
    203204   USE sbc_oce , ONLY :   fr_i       =>    fr_i       !: ice fraction (between 0 to 1) 
    204205   USE traqsr  , ONLY :   rn_abs     =>    rn_abs     !: fraction absorbed in the very near surface 
Note: See TracChangeset for help on using the changeset viewer.