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

    r457 r503  
    11MODULE traadv_muscl 
    2    !!============================================================================== 
     2   !!====================================================================== 
    33   !!                       ***  MODULE  traadv_muscl  *** 
    44   !! Ocean active tracers:  horizontal & vertical advective trend 
    5    !!============================================================================== 
     5   !!====================================================================== 
     6   !! History :       !  06-00  (A.Estublier)  for passive tracers 
     7   !!                 !  01-08  (E.Durand, G.Madec)  adapted for T & S 
     8   !!            8.5  !  02-06  (G. Madec)  F90: Free form and module 
     9   !!---------------------------------------------------------------------- 
    610 
    711   !!---------------------------------------------------------------------- 
     
    913   !!                   and vertical advection trends using MUSCL scheme 
    1014   !!---------------------------------------------------------------------- 
    11    !! * Modules used 
    1215   USE oce             ! ocean dynamics and active tracers 
    1316   USE dom_oce         ! ocean space and time domain 
     
    2528   PRIVATE 
    2629 
    27    !! * Accessibility 
    28    PUBLIC tra_adv_muscl  ! routine called by step.F90 
     30   PUBLIC   tra_adv_muscl  ! routine called by step.F90 
    2931 
    3032   !! * Substitutions 
     
    3234#  include "vectopt_loop_substitute.h90" 
    3335   !!---------------------------------------------------------------------- 
    34    !!   OPA 9.0 , LOCEAN-IPSL (2005)  
     36   !!   OPA 9.0 , LOCEAN-IPSL (2006)  
    3537   !! $Header$  
    36    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
     38   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3739   !!---------------------------------------------------------------------- 
    3840 
     
    5052      !! 
    5153      !! ** 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 
     54      !!              - save trends in (ztrdt,ztrds) ('key_trdtra') 
     55      !! 
     56      !! References : Estubier, A., and M. Levy, Notes Techn. Pole de Modelisation 
     57      !!              IPSL, Sept. 2000 (http://www.lodyc.jussieu.fr/opa) 
    6358      !!---------------------------------------------------------------------- 
    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       !! * Local declarations 
    70       INTEGER ::   ji, jj, jk               ! dummy loop indices 
     59      USE oce, ONLY :   ztrdt => ua   ! use ua as workspace 
     60      USE oce, ONLY :   ztrds => va   ! use va as workspace 
     61      !! 
     62      INTEGER , INTENT(in)                         ::   kt    ! ocean time-step index 
     63      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pun   ! ocean velocity u-component 
     64      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pvn   ! ocean velocity v-component 
     65      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pwn   ! ocean velocity w-component 
     66      !! 
     67      INTEGER ::   ji, jj, jk   ! dummy loop indices 
    7168      REAL(wp) ::   & 
    7269         zu, zv, zw, zeu, zev,           &   
     
    7572         zzt1, zzt2, zalpha,             & 
    7673         zzs1, zzs2, z2,                 & 
    77          zta, zsa                           
    78       REAL(wp), DIMENSION (jpi,jpj,jpk) ::   & 
    79          zt1, zt2, ztp1, ztp2,               & 
    80          zs1, zs2, zsp1, zsp2,               & 
    81          ztdta, ztdsa 
     74         zta, zsa,                       & 
     75        z_hdivn_x, z_hdivn_y, z_hdivn 
     76      REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zt1, zt2, ztp1, ztp2   ! 3D workspace 
     77      REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zs1, zs2, zsp1, zsp2   !  "      " 
    8278      !!---------------------------------------------------------------------- 
    8379 
     
    8884      ENDIF 
    8985 
    90       IF( neuler == 0 .AND. kt == nit000 ) THEN 
    91           z2=1. 
    92       ELSE 
    93           z2=2. 
    94       ENDIF 
    95  
    96       ! Save ta and sa trends 
    97       IF( l_trdtra )   THEN 
    98          ztdta(:,:,:) = ta(:,:,:)  
    99          ztdsa(:,:,:) = sa(:,:,:)  
    100          l_adv = 'mus' 
    101       ENDIF 
    102  
     86      IF( neuler == 0 .AND. kt == nit000 ) THEN   ;    z2 = 1. 
     87      ELSE                                        ;    z2 = 2. 
     88      ENDIF 
    10389 
    10490      ! I. Horizontal advective fluxes 
    10591      ! ------------------------------ 
    106  
    10792      ! first guess of the slopes 
    10893      ! interior values 
     
    193178               zt1(ji,jj,jk) = zeu * ( zalpha * zzt1 + (1.-zalpha) * zzt2 ) 
    194179               zs1(ji,jj,jk) = zeu * ( zalpha * zzs1 + (1.-zalpha) * zzs2 ) 
    195  
     180               ! 
    196181               z0v = SIGN( 0.5, pvn(ji,jj,jk) )             
    197182               zalpha = 0.5 - z0v 
     
    211196      CALL lbc_lnk( zt2, 'V', -1. )   ;   CALL lbc_lnk( zs2, 'V', -1. ) 
    212197 
    213       ! Save MUSCL fluxes to compute i- & j- horizontal  
    214       ! advection trends in the MLD 
    215       IF( l_trdtra )   THEN 
    216          ! save i- terms 
    217          tladi(:,:,:) = zt1(:,:,:)  
    218          sladi(:,:,:) = zs1(:,:,:)  
    219          ! save j- terms 
    220          tladj(:,:,:) = zt2(:,:,:)  
    221          sladj(:,:,:) = zs2(:,:,:)  
    222       ENDIF 
    223  
    224       ! Compute & add the horizontal advective trend 
    225  
     198      ! Tracer flux divergence at t-point added to the general trend 
    226199      DO jk = 1, jpkm1 
    227200         DO jj = 2, jpjm1       
     
    244217      END DO         
    245218 
    246       ! Save the horizontal advective trends for diagnostic 
    247  
    248       IF( l_trdtra )   THEN 
    249          ! Recompute the horizontal advection zta & zsa trends computed  
    250          ! at the step 2. above in making the difference between the new  
    251          ! trends and the previous one ta()/sa - ztdta()/ztdsa() and add 
    252          ! the term tn()/sn()*hdivn() to recover the Uh gradh(T/S) trends 
    253          ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) + tn(:,:,:) * hdivn(:,:,:)  
    254          ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) + sn(:,:,:) * hdivn(:,:,:) 
    255  
    256          CALL trd_mod(ztdta, ztdsa, jpttdlad, 'TRA', kt) 
    257  
    258          ! Save the new ta and sa trends 
    259          ztdta(:,:,:) = ta(:,:,:)  
    260          ztdsa(:,:,:) = sa(:,:,:)  
    261  
    262       ENDIF 
    263  
    264       IF(ln_ctl) THEN 
    265          CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl had  - Ta: ', mask1=tmask ,  & 
    266             &         tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra' ) 
     219      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl had  - Ta: ', mask1=tmask ,  & 
     220         &                       tab3d_2=sa, clinfo2=             ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     221 
     222      ! Save the horizontal advective trends for diagnostics 
     223      IF( l_trdtra ) THEN 
     224         ztrdt(:,:,:) = 0.e0   ;   ztrds(:,:,:) = 0.e0 
     225         ! 
     226         ! T/S ZONAL advection trends 
     227         DO jk = 1, jpkm1 
     228            DO jj = 2, jpjm1 
     229               DO ji = fs_2, fs_jpim1   ! vector opt. 
     230                  !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 
     231                  !   N.B. This computation is not valid along OBCs (if any) 
     232#if defined key_zco 
     233                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 
     234                  z_hdivn_x = (  e2u(ji  ,jj) * pun(ji  ,jj,jk)                              & 
     235                     &         - e2u(ji-1,jj) * pun(ji-1,jj,jk) ) * zbtr 
     236#else 
     237                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     238                  z_hdivn_x = (  e2u(ji  ,jj) * fse3u(ji  ,jj,jk) * pun(ji  ,jj,jk)          & 
     239                     &         - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * pun(ji-1,jj,jk) ) * zbtr 
     240#endif 
     241                  ztrdt(ji,jj,jk) = - zbtr * ( zt1(ji,jj,jk) - zt1(ji-1,jj,jk) ) + tn(ji,jj,jk) * z_hdivn_x 
     242                  ztrds(ji,jj,jk) = - zbtr * ( zs1(ji,jj,jk) - zs1(ji-1,jj,jk) ) + sn(ji,jj,jk) * z_hdivn_x 
     243               END DO 
     244            END DO 
     245         END DO 
     246         CALL trd_mod(ztrdt, ztrds, jptra_trd_xad, 'TRA', kt) 
     247 
     248         ! T/S MERIDIONAL advection trends 
     249         DO jk = 1, jpkm1 
     250            DO jj = 2, jpjm1 
     251               DO ji = fs_2, fs_jpim1   ! vector opt. 
     252                  !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 
     253                  !   N.B. This computation is not valid along OBCs (if any) 
     254#if defined key_zco 
     255                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 
     256                  z_hdivn_y = (  e1v(ji,jj  ) * pvn(ji,jj  ,jk)                              & 
     257                     &         - e1v(ji,jj-1) * pvn(ji,jj-1,jk) ) * zbtr 
     258#else 
     259                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     260                  z_hdivn_y = (  e1v(ji,  jj) * fse3v(ji,jj  ,jk) * pvn(ji,jj  ,jk)          & 
     261                     &         - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * pvn(ji,jj-1,jk) ) * zbtr 
     262#endif 
     263                  ztrdt(ji,jj,jk) = - zbtr * ( zt2(ji,jj,jk) - zt2(ji,jj-1,jk) ) + tn(ji,jj,jk) * z_hdivn_y           
     264                  ztrds(ji,jj,jk) = - zbtr * ( zs2(ji,jj,jk) - zs2(ji,jj-1,jk) ) + sn(ji,jj,jk) * z_hdivn_y 
     265               END DO 
     266            END DO 
     267         END DO 
     268         CALL trd_mod(ztrdt, ztrds, jptra_trd_yad, 'TRA', kt) 
     269 
     270         ! Save the up-to-date ta and sa trends 
     271         ztrdt(:,:,:) = ta(:,:,:)  
     272         ztrds(:,:,:) = sa(:,:,:)  
     273         ! 
    267274      ENDIF 
    268275 
     
    378385 
    379386      ! Save the vertical advective trends for diagnostic 
    380  
     387      ! ------------------------------------------------- 
    381388      IF( l_trdtra )   THEN 
    382389         ! Recompute the vertical advection zta & zsa trends computed  
    383390         ! at the step 2. above in making the difference between the new  
    384          ! trends and the previous one: ta()/sa - ztdta()/ztdsa() and substract 
     391         ! trends and the previous one: ta()/sa - ztrdt()/ztrds() and substract 
    385392         ! the term tn()/sn()*hdivn() to recover the W gradz(T/S) trends 
    386          ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:) - tn(:,:,:) * hdivn(:,:,:)  
    387          ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:) - sn(:,:,:) * hdivn(:,:,:) 
    388  
    389          CALL trd_mod(ztdta, ztdsa, jpttdzad, 'TRA', kt) 
    390       ENDIF 
    391  
    392       IF(ln_ctl) THEN 
    393          CALL prt_ctl(tab3d_1=ta, clinfo1=' muscl zad  - Ta: ', mask1=tmask ,  & 
    394             &         tab3d_2=sa, clinfo2=' Sa: ', mask2=tmask, clinfo3='tra') 
    395       ENDIF 
    396  
     393 
     394         DO jk = 1, jpkm1 
     395            DO jj = 2, jpjm1 
     396               DO ji = fs_2, fs_jpim1   ! vector opt. 
     397#if defined key_zco 
     398                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 
     399                  z_hdivn_x = e2u(ji,jj)*pun(ji,jj,jk) - e2u(ji-1,jj)*pun(ji-1,jj,jk) 
     400                  z_hdivn_y = e1v(ji,jj)*pvn(ji,jj,jk) - e1v(ji,jj-1)*pvn(ji,jj-1,jk) 
     401#else 
     402                  zbtr      = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
     403                  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) 
     404                  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) 
     405#endif 
     406                  z_hdivn   = (z_hdivn_x + z_hdivn_y) * zbtr 
     407                  ztrdt(ji,jj,jk) = ta(ji,jj,jk) - ztrdt(ji,jj,jk) - tn(ji,jj,jk) * z_hdivn  
     408                  ztrds(ji,jj,jk) = sa(ji,jj,jk) - ztrds(ji,jj,jk) - sn(ji,jj,jk) * z_hdivn 
     409               END DO 
     410            END DO 
     411         END DO 
     412         CALL trd_mod(ztrdt, ztrds, jptra_trd_zad, 'TRA', kt) 
     413         ! 
     414      ENDIF 
     415 
     416      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ta, clinfo1=' muscl zad  - Ta: ', mask1=tmask ,   & 
     417         &                       tab3d_2=sa, clinfo2=             ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     418      ! 
    397419   END SUBROUTINE tra_adv_muscl 
    398420 
Note: See TracChangeset for help on using the changeset viewer.