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

Ignore:
Timestamp:
2006-09-27T10:52:29+02:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_update_064 : CT : general trends update including the addition of mean windows analysis possibility in the mixed layer

File:
1 edited

Legend:

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

    r457 r503  
    44   !! Ocean active tracers:  horizontal & vertical advective trend 
    55   !!============================================================================== 
     6   !! History :  9.0  !  02-06  (G. Madec) from traadv_muscl 
     7   !!---------------------------------------------------------------------- 
    68 
    79   !!---------------------------------------------------------------------- 
     
    911   !!                    and vertical advection trends using MUSCL2 scheme 
    1012   !!---------------------------------------------------------------------- 
    11    !! * Modules used 
    1213   USE oce             ! ocean dynamics and active tracers 
    1314   USE dom_oce         ! ocean space and time domain 
     
    3233#  include "vectopt_loop_substitute.h90" 
    3334   !!---------------------------------------------------------------------- 
    34    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
     35   !!   OPA 9.0 , LOCEAN-IPSL (2006)  
    3536   !! $Header$  
    36    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     37   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3738   !!---------------------------------------------------------------------- 
    3839 
     
    5051      !! 
    5152      !! ** Action  : - update (ta,sa) with the now advective tracer trends 
    52       !!              - save trends in (ztdta,ztdsa) ('key_trdtra') 
    53       !! 
    54       !! References :                 
    55       !!      Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 
    56       !! IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 
    57       !! 
    58       !! History : 
    59       !!        !  06-00  (A.Estublier)  for passive tracers 
    60       !!        !  01-08  (E.Durand G.Madec)  adapted for T & S 
    61       !!   8.5  !  02-06  (G. Madec)  F90: Free form and module 
    62       !!   9.0  !  04-08  (C. Talandier) New trends organization 
     53      !!              - save trends in (ztrdt,ztrds) ('key_trdtra') 
     54      !! 
     55      !! References : Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 
     56      !!              IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 
    6357      !!---------------------------------------------------------------------- 
    64       !! * Arguments 
    65       INTEGER , INTENT( in ) ::   kt          ! ocean time-step index 
    66       REAL(wp), INTENT( in ), DIMENSION(jpi,jpj,jpk) ::   & 
    67          pun, pvn, pwn                        ! now ocean velocity fields 
    68  
    69  
    70       !! * Local declarations 
    71       INTEGER ::   ji, jj, jk               ! dummy loop indices 
     58      USE oce              , ztrdt => ua   ! use ua as workspace 
     59      USE oce              , ztrds => va   ! use va as workspace 
     60      !! 
     61      INTEGER , INTENT(in)                         ::   kt    ! ocean time-step index 
     62      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pun   ! ocean velocity u-component 
     63      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pvn   ! ocean velocity v-component 
     64      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pwn   ! ocean velocity w-component 
     65      !! 
     66      INTEGER ::   ji, jj, jk   ! dummy loop indices 
    7267      REAL(wp) ::   & 
    7368         zu, zv, zw, zeu, zev,           &   
     
    7671         zzt1, zzt2, zalpha,             & 
    7772         zzs1, zzs2, z2,                 & 
    78          zta, zsa 
    79       REAL(wp), DIMENSION (jpi,jpj,jpk) ::   & 
    80          zt1, zt2, ztp1, ztp2,   & 
    81          zs1, zs2, zsp1, zsp2,   & 
    82          ztdta, ztdsa 
     73         zta, zsa,                       & 
     74         z_hdivn_x, z_hdivn_y, z_hdivn 
     75      REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zt1, zt2, ztp1, ztp2   ! 3D workspace 
     76      REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zs1, zs2, zsp1, zsp2   !  "      " 
    8377      !!---------------------------------------------------------------------- 
    8478 
     
    8983      ENDIF 
    9084 
    91       IF( neuler == 0 .AND. kt == nit000 ) THEN 
    92           z2=1. 
    93       ELSE 
    94           z2=2. 
    95       ENDIF 
    96  
    97       ! Save ta and sa trends 
    98       IF( l_trdtra )   THEN 
    99          ztdta(:,:,:) = ta(:,:,:)  
    100          ztdsa(:,:,:) = sa(:,:,:)  
    101          l_adv = 'mu2' 
    102       ENDIF 
    103  
     85      IF( neuler == 0 .AND. kt == nit000 ) THEN   ;   z2 = 1. 
     86      ELSE                                        ;   z2 = 2. 
     87      ENDIF 
    10488 
    10589      ! I. Horizontal advective fluxes 
     
    194178               zt1(ji,jj,jk) = zeu * ( zalpha * zzt1 + (1.-zalpha) * zzt2 ) 
    195179               zs1(ji,jj,jk) = zeu * ( zalpha * zzs1 + (1.-zalpha) * zzs2 ) 
    196  
     180               ! 
    197181               z0v = SIGN( 0.5, pvn(ji,jj,jk) )             
    198182               zalpha = 0.5 - z0v 
     
    271255      CALL lbc_lnk( zt2, 'V', -1. )   ;   CALL lbc_lnk( zs2, 'V', -1. ) 
    272256 
    273       ! Save MUSCL fluxes to compute i- & j- horizontal  
    274       ! advection trends in the MLD 
    275       IF( l_trdtra )   THEN 
    276          ! save i- terms 
    277          tladi(:,:,:) = zt1(:,:,:)  
    278          sladi(:,:,:) = zs1(:,:,:)  
    279          ! save j- terms 
    280          tladj(:,:,:) = zt2(:,:,:)  
    281          sladj(:,:,:) = zs2(:,:,:)  
    282       ENDIF 
    283  
    284257      ! Compute & add the horizontal advective trend 
    285258 
     
    305278 
    306279      ! Save the horizontal advective trends for diagnostic 
    307  
    308       IF( l_trdtra )   THEN 
    309          ! Recompute the horizontal advection zta & zsa trends computed  
    310          ! at the step 2. above in making the difference between the new  
    311          ! trends and the previous one ta()/sa - ztdta()/ztdsa() and add 
    312          ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 
    313          ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:)  
    314          ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 
    315  
    316          CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 
    317  
    318          ! Save the new ta and sa trends 
    319          ztdta(:,:,:) = ta(:,:,:)  
    320          ztdsa(:,:,:) = sa(:,:,:)  
    321  
    322       ENDIF 
    323  
    324       IF(ln_ctl) THEN 
    325          CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl2 had  - Ta: ', mask1=tmask, & 
    326             &         tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 
    327       ENDIF 
     280      IF( l_trdtra ) THEN 
     281         ztrdt(:,:,:) = 0.e0   ;   ztrds(:,:,:) = 0.e0 
     282         ! 
     283         ! T/S ZONAL advection trends 
     284         DO jk = 1, jpkm1 
     285            DO jj = 2, jpjm1 
     286               DO ji = fs_2, fs_jpim1   ! vector opt. 
     287                  !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 
     288                  !   N.B. This computation is not valid along OBCs (if any) 
     289#if defined key_zco 
     290                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 
     291                  z_hdivn_x = (  e2u(ji  ,jj) * pun(ji  ,jj,jk)                              & 
     292                     &         - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 
     293#else 
     294                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     295                  z_hdivn_x = (  e2u(ji  ,jj) * fse3u(ji  ,jj,jk) * pun(ji  ,jj,jk)          & 
     296                     &         - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 
     297#endif 
     298                  ztrdt(ji,jj,jk) = - zbtr * ( zt1(ji,jj,jk) - zt1(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 
     299                  ztrds(ji,jj,jk) = - zbtr * ( zs1(ji,jj,jk) - zs1(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 
     300               END DO 
     301            END DO 
     302         END DO 
     303         CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 
     304 
     305         ! T/S MERIDIONAL advection trends 
     306         DO jk = 1, jpkm1 
     307            DO jj = 2, jpjm1 
     308               DO ji = fs_2, fs_jpim1   ! vector opt. 
     309                  !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 
     310                  !   N.B. This computation is not valid along OBCs (if any) 
     311#if defined key_zco 
     312                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 
     313                  z_hdivn_y = (  e1v(ji,jj  ) * pvn(ji,jj  ,jk)                              & 
     314                     &         - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 
     315#else 
     316                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     317                  z_hdivn_y = (  e1v(ji,  jj) * fse3v(ji,jj  ,jk) * pvn(ji,jj  ,jk)          & 
     318                     &         - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 
     319#endif 
     320                  ztrdt(ji,jj,jk) = - zbtr * ( zt2(ji,jj,jk) - zt2(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y           
     321                  ztrds(ji,jj,jk) = - zbtr * ( zs2(ji,jj,jk) - zs2(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 
     322               END DO 
     323            END DO 
     324         END DO 
     325         CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 
     326 
     327         ! Save the up-to-date ta and sa trends 
     328         ztrdt(:,:,:) = ta(:,:,:)  
     329         ztrds(:,:,:) = sa(:,:,:)  
     330         ! 
     331      ENDIF 
     332 
     333      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl2 had  - Ta: ', mask1=tmask,   & 
     334         &                       tab3d_2=sa, clinfo2=              ' Sa: ', mask2=tmask, clinfo3='tra') 
    328335 
    329336      ! "zonal" mean advective heat and salt transport 
     
    451458 
    452459      ! Save the vertical advective trends for diagnostic 
    453  
    454460      IF( l_trdtra )   THEN 
    455461         ! Recompute the vertical advection zta & zsa trends computed  
    456462         ! at the step 2. above in making the difference between the new  
    457          ! trends and the previous one: ta()/sa - ztdta()/ztdsa() and substract 
     463         ! trends and the previous one: ta()/sa - ztrdt()/ztrds() and substract 
    458464         ! the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 
    459          ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - tn(:,:,:) * hdivn(:,:,:)  
    460          ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 
    461  
    462          CALL trd_mod(ztdta, ztdsa, jpttdzad, 'TRA', kt) 
    463       ENDIF 
    464  
    465       IF(ln_ctl) THEN 
    466          CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl2 zad  - Ta: ', mask1=tmask, & 
    467             &         tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 
    468  
    469       ENDIF 
    470  
     465 
     466         DO jk = 1, jpkm1 
     467            DO jj = 2, jpjm1 
     468               DO ji = fs_2, fs_jpim1   ! vector opt. 
     469#if defined key_zco 
     470                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 
     471                  z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 
     472                  z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 
     473#else 
     474                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     475                  z_hdivn_x = e2u(ji,jj)*fse3u(ji,jj,jk)*pun(ji,jj,jk) - e2u(ji-1,jj)*fse3u(ji-1,jj,jk)*pun(ji-1,jj,jk) 
     476                  z_hdivn_y = e1v(ji,jj)*fse3v(ji,jj,jk)*pvn(ji,jj,jk) - e1v(ji,jj-1)*fse3v(ji,jj-1,jk)*pvn(ji,jj-1,jk) 
     477#endif 
     478                  z_hdivn   = (z_hdivn_x + z_hdivn_y) * zbtr 
     479                  ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn  
     480                  ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 
     481               END DO 
     482            END DO 
     483         END DO 
     484         CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 
     485         ! 
     486      ENDIF 
     487 
     488      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl2 zad  - Ta: ', mask1=tmask,   & 
     489         &                       tab3d_2=sa, clinfo2=              ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     490      ! 
    471491   END SUBROUTINE tra_adv_muscl2 
    472492 
Note: See TracChangeset for help on using the changeset viewer.