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 791 for branches/dev_001_GM/NEMO/OPA_SRC/TRA/traadv_tvd.F90 – NEMO

Ignore:
Timestamp:
2008-01-12T21:33:34+01:00 (16 years ago)
Author:
gm
Message:

dev_001_GM - TRA/traadv : switch from velocity to transport + optimised traadv_eiv2 introduced - compilation OK

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_001_GM/NEMO/OPA_SRC/TRA/traadv_tvd.F90

    r786 r791  
    44   !! Ocean active tracers:  horizontal & vertical advective trend 
    55   !!============================================================================== 
    6    !! History :  7.0  !  95-12  (L. Mortier)  Original code 
    7    !!            8.0  !  00-01  (H. Loukos)  adapted to ORCA  
    8    !!             -   !  00-10  (MA Foujols E.Kestenare)  include file not routine 
    9    !!             -   !  00-12  (E. Kestenare M. Levy)  fix bug in trtrd indexes 
    10    !!             -   !  01-07  (E. Durand G. Madec)  adaptation to ORCA config 
    11    !!            8.5  !  02-06  (G. Madec)  F90: Free form and module 
    12    !!   NEMO     1.0  !  04-01  (A. de Miranda, G. Madec, J.M. Molines ): advective bbl 
    13    !!             -   !  08-04  (S. Cravatte) add the i-, j- & k- trends computation 
    14    !!             -   !  05-11  (V. Garnier) Surface pressure gradient organization 
    15    !!            2.4  !  08-01  (G. Madec) Merge TRA-TRC 
     6   !! History :  7.0  !  1995-12  (L. Mortier)  Original code 
     7   !!            8.0  !  2000-01  (H. Loukos)  adapted to ORCA  
     8   !!             -   !  2000-10  (MA Foujols E.Kestenare)  include file not routine 
     9   !!             -   !  2000-12  (E. Kestenare M. Levy)  fix bug in trtrd indexes 
     10   !!             -   !  2001-07  (E. Durand G. Madec)  adaptation to ORCA config 
     11   !!            8.5  !  2002-06  (G. Madec)  F90: Free form and module 
     12   !!   NEMO     1.0  !  2004-01  (A. de Miranda, G. Madec, J.M. Molines ): advective bbl 
     13   !!             -   !  2008-04  (S. Cravatte) add the i-, j- & k- trends computation 
     14   !!             -   !  2005-11  (V. Garnier) Surface pressure gradient organization 
     15   !!            2.4  !  2008-01  (G. Madec)  merge TRC-TRA + switch from velocity to transport 
    1616   !!---------------------------------------------------------------------- 
    1717 
     
    4242   !!---------------------------------------------------------------------- 
    4343   !! NEMO/OPA 2.4 , LOCEAN-IPSL (2008)  
    44    !! $Id:$  
     44   !! $Id$  
    4545   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    4646   !!---------------------------------------------------------------------- 
     
    7070      REAL(wp)        , INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pta             ! tracer trend  
    7171      !! 
    72       INTEGER  ::   ji, jj, jk              ! dummy loop indices 
    73       REAL(wp) ::   ztai, ztaj, ztak 
    74       REAL(wp) ::   z2dtt, zbtr, zeu, zev   ! temporary scalar 
    75       REAL(wp) ::   zew, z2                          ! temporary scalar 
    76       REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk           !    "         " 
    77       REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk            !    "         " 
    78       REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zti, ztu, ztv, ztw   ! temporary workspace 
     72      INTEGER  ::   ji, jj, jk               ! dummy loop indices 
     73      REAL(wp) ::   z2dtt, zbtr, z2, zzti    ! temporary scalar 
     74      REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk   !    "         " 
     75      REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk   !    "         " 
     76      REAL(wp), DIMENSION (jpi,jpj,jpk) ::   zti, ztu, ztv, ztw   ! 3D workspace 
    7977      !!---------------------------------------------------------------------- 
    8078 
     
    8785      ENDIF 
    8886 
    89       IF( neuler == 0 .AND. kt == nit000 ) THEN   ;    z2 = 1. 
    90       ELSE                                        ;    z2 = 2. 
     87      IF( neuler == 0 .AND. kt == nit000 ) THEN   ;    z2 = 1.      ! euler   time-stepping 
     88      ELSE                                        ;    z2 = 2.      ! leap-frog time-stepping 
    9189      ENDIF 
    9290 
     
    103101         DO jj = 1, jpjm1 
    104102            DO ji = 1, fs_jpim1   ! vector opt. 
    105                zeu = 0.5 * e2u(ji,jj) * fse3u(ji,jj,jk) * pun(ji,jj,jk) 
    106                zev = 0.5 * e1v(ji,jj) * fse3v(ji,jj,jk) * pvn(ji,jj,jk) 
    107                ! upstream scheme 
    108                zfp_ui = zeu + ABS( zeu ) 
    109                zfm_ui = zeu - ABS( zeu ) 
    110                zfp_vj = zev + ABS( zev ) 
    111                zfm_vj = zev - ABS( zev ) 
    112                ztu(ji,jj,jk) = zfp_ui * ptb(ji,jj,jk) + zfm_ui * ptb(ji+1,jj  ,jk) 
    113                ztv(ji,jj,jk) = zfp_vj * ptb(ji,jj,jk) + zfm_vj * ptb(ji  ,jj+1,jk) 
    114             END DO 
    115          END DO 
    116       END DO 
    117  
     103               zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) 
     104               zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 
     105               zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 
     106               zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 
     107               ztu(ji,jj,jk) = 0.5 * ( zfp_ui * ptb(ji,jj,jk) + zfm_ui * ptb(ji+1,jj  ,jk) ) 
     108               ztv(ji,jj,jk) = 0.5 * ( zfp_vj * ptb(ji,jj,jk) + zfm_vj * ptb(ji  ,jj+1,jk) ) 
     109            END DO 
     110         END DO 
     111      END DO 
     112      ! 
    118113      ! upstream tracer flux in the k direction 
    119       ! Surface value 
    120       IF( lk_dynspg_rl .OR. lk_vvl ) THEN               ! rigid lid or variable volume: flux set to zero 
    121          ztw(:,:,1) = 0.e0 
    122       ELSE                                              ! free surface 
    123          ztw(:,:,1) = e1t(:,:) * e2t(:,:) * pwn(:,:,1) * ptb(:,:,1) 
    124       ENDIF 
    125  
    126       ! Interior value 
    127       DO jk = 2, jpkm1 
     114      !                                                                           ! Surface value 
     115      IF( lk_dynspg_rl .OR. lk_vvl ) THEN   ;   ztw(:,:,1) = 0.e0                      ! rigid lid or non-linear fs 
     116      ELSE                                  ;   ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1)   ! free surface 
     117      ENDIF 
     118      ! 
     119      DO jk = 2, jpkm1                                                            ! Interior value 
    128120         DO jj = 1, jpj 
    129121            DO ji = 1, jpi 
    130                zew = 0.5 * e1t(ji,jj) * e2t(ji,jj) * pwn(ji,jj,jk) 
    131                zfp_wk = zew + ABS( zew ) 
    132                zfm_wk = zew - ABS( zew ) 
    133                ztw(ji,jj,jk) = zfp_wk * ptb(ji,jj,jk) + zfm_wk * ptb(ji,jj,jk-1) 
    134             END DO 
    135          END DO 
    136       END DO 
    137  
    138       ! total advective trend 
    139       DO jk = 1, jpkm1 
     122               zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 
     123               zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 
     124               ztw(ji,jj,jk) = 0.5 * ( zfp_wk * ptb(ji,jj,jk) + zfm_wk * ptb(ji,jj,jk-1) ) 
     125            END DO 
     126         END DO 
     127      END DO 
     128      ! 
     129      ! upstream advective trend 
     130      DO jk = 1, jpkm1 
     131         z2dtt = z2 * rdttra(jk) 
    140132         DO jj = 2, jpjm1 
    141133            DO ji = fs_2, fs_jpim1   ! vector opt. 
    142134               zbtr = 1./ ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
    143                ! i- j- horizontal & k- vertical advective trends 
    144                ztai = - ( ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk  ) ) * zbtr 
    145                ztaj = - ( ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk  ) ) * zbtr 
    146                ztak = - ( ztw(ji,jj,jk) - ztw(ji  ,jj  ,jk+1) ) * zbtr 
    147135               ! total intermediate advective trends 
    148                zti(ji,jj,jk) = ztai + ztaj + ztak 
    149             END DO 
    150          END DO 
    151       END DO 
    152  
    153       !  Save the horizontal advective trends for diagnostic 
    154       ! ----------------------------------------------------- 
     136               zzti = - ( ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk  )            & 
     137                  &     + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk  )            & 
     138                  &     + ztw(ji,jj,jk) - ztw(ji  ,jj  ,jk+1) ) * zbtr 
     139               ! update and guess with monotonic sheme 
     140               pta(ji,jj,jk) =   pta(ji,jj,jk) +         zzti 
     141               zti(ji,jj,jk) = ( ptb(ji,jj,jk) + z2dtt * zzti ) * tmask(ji,jj,jk) 
     142            END DO 
     143         END DO 
     144      END DO 
     145      ! 
     146      CALL lbc_lnk( zti, 'T', 1. )      ! Lateral boundary conditions on zti   (unchanged sign) 
     147 
     148 
     149      !                                 ! trend diagnostics (contribution of upstream fluxes) 
    155150      IF( l_trdtra ) THEN 
    156151         CALL trd_tra_adv( kt, ktra, jpt_trd_xad, cdtype, ztu, pun, ptn ) 
     
    158153         CALL trd_tra_adv( kt, ktra, jpt_trd_zad, cdtype, ztw, pwn, ptn ) 
    159154      ENDIF 
    160  
    161       ! update and guess with monotonic sheme 
    162       DO jk = 1, jpkm1 
    163          z2dtt = z2 * rdttra(jk) 
    164          DO jj = 2, jpjm1 
    165             DO ji = fs_2, fs_jpim1   ! vector opt. 
    166                pta(ji,jj,jk) =  pta(ji,jj,jk) + zti(ji,jj,jk) 
    167                zti (ji,jj,jk) = ( ptb(ji,jj,jk) + z2dtt * zti(ji,jj,jk) ) * tmask(ji,jj,jk) 
    168             END DO 
    169          END DO 
    170       END DO 
    171  
    172       ! Lateral boundary conditions on zti   (unchanged sign) 
    173       CALL lbc_lnk( zti, 'T', 1. ) 
     155      !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     156      IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 
     157         IF( ktra == jp_tem)   pht_adv(:) = ptr_vj( ztv(:,:,:) )  
     158         IF( ktra == jp_sal)   pst_adv(:) = ptr_vj( ztv(:,:,:) ) 
     159      ENDIF 
    174160 
    175161 
    176162      ! 3. antidiffusive flux : high order minus low order 
    177163      ! -------------------------------------------------- 
    178       ! antidiffusive flux on i and j 
     164      !                                 ! anti-diffusive flux on i and j 
    179165      DO jk = 1, jpkm1 
    180166         DO jj = 1, jpjm1 
    181167            DO ji = 1, fs_jpim1   ! vector opt. 
    182                zeu = 0.5 * e2u(ji,jj) * fse3u(ji,jj,jk) * pun(ji,jj,jk) 
    183                zev = 0.5 * e1v(ji,jj) * fse3v(ji,jj,jk) * pvn(ji,jj,jk) 
    184                ztu(ji,jj,jk) = zeu * ( ptn(ji,jj,jk) + ptn(ji+1,jj,jk) ) - ztu(ji,jj,jk) 
    185                ztv(ji,jj,jk) = zev * ( ptn(ji,jj,jk) + ptn(ji,jj+1,jk) ) - ztv(ji,jj,jk) 
    186             END DO 
    187          END DO 
    188       END DO 
    189        
    190       ! antidiffusive flux on k 
    191       ! Surface value 
    192       ztw(:,:,1) = 0.e0 
    193  
    194       ! Interior value 
    195       DO jk = 2, jpkm1 
     168               ztu(ji,jj,jk) = 0.5 * pun(ji,jj,jk) * ( ptn(ji,jj,jk) + ptn(ji+1,jj,jk) ) - ztu(ji,jj,jk) 
     169               ztv(ji,jj,jk) = 0.5 * pvn(ji,jj,jk) * ( ptn(ji,jj,jk) + ptn(ji,jj+1,jk) ) - ztv(ji,jj,jk) 
     170            END DO 
     171         END DO 
     172      END DO 
     173      !                                 ! antidiffusive flux on k 
     174      ztw(:,:,1) = 0.e0                      ! Surface value 
     175      ! 
     176      DO jk = 2, jpkm1                       ! Interior value 
    196177         DO jj = 1, jpj 
    197178            DO ji = 1, jpi 
    198                zew = 0.5 * e1t(ji,jj) * e2t(ji,jj) * pwn(ji,jj,jk) 
    199                ztw(ji,jj,jk) = zew * ( ptn(ji,jj,jk) + ptn(ji,jj,jk-1) ) - ztw(ji,jj,jk) 
    200             END DO 
    201          END DO 
    202       END DO 
    203  
    204       ! Lateral bondary conditions 
    205       CALL lbc_lnk( ztu, 'U', -1. ) 
     179               ztw(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk) + ptn(ji,jj,jk-1) ) - ztw(ji,jj,jk) 
     180            END DO 
     181         END DO 
     182      END DO 
     183      ! 
     184      CALL lbc_lnk( ztu, 'U', -1. )     ! Lateral bondary conditions on upstream fluxes 
    206185      CALL lbc_lnk( ztv, 'V', -1. ) 
    207186      CALL lbc_lnk( ztw, 'W',  1. ) 
    208187 
    209       ! 4. monotonicity algorithm 
    210       ! ------------------------- 
     188      !                                 ! monotonicity algorithm 
    211189      CALL nonosc( ptb, ztu, ztv, ztw, zti, z2 ) 
    212190 
    213191 
    214       ! 5. final trend with corrected fluxes 
    215       ! ------------------------------------ 
     192      ! 4. final trend with anti-diffusive fluxes 
     193      ! ----------------------------------------- 
    216194      DO jk = 1, jpkm1 
    217195         DO jj = 2, jpjm1 
    218196            DO ji = fs_2, fs_jpim1   ! vector opt.   
    219197               zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 
    220                ! i- j- horizontal & k- vertical advective trends 
    221                ztai = - ( ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk  )) * zbtr 
    222                ztaj = - ( ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk  )) * zbtr 
    223                ztak = - ( ztw(ji,jj,jk) - ztw(ji  ,jj  ,jk+1)) * zbtr 
    224  
    225                ! add them to the general tracer trends 
    226                pta(ji,jj,jk) = pta(ji,jj,jk) + ztai + ztaj + ztak 
    227             END DO 
    228          END DO 
    229       END DO 
    230  
    231 !!gm  the transport computation is wrong, the upstream part is missing ! 
    232       ! "zonal" mean advective heat and salt transport 
    233       IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 
    234          IF( ktra == jp_tem)   pht_adv(:) = ptr_vj( ztv(:,:,:) ) 
    235          IF( ktra == jp_sal)   pst_adv(:) = ptr_vj( ztv(:,:,:) ) 
    236       ENDIF 
    237  
    238       !  Save the horizontal advective trends for diagnostic 
    239       ! ----------------------------------------------------- 
    240       IF( l_trdtra ) THEN 
     198               ! anti-diffusive trends added to the general tracer trends 
     199               pta(ji,jj,jk) = pta(ji,jj,jk) - ( ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk  )             & 
     200                  &                            + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk  )             & 
     201                  &                            + ztw(ji,jj,jk) - ztw(ji  ,jj  ,jk+1)  ) * zbtr 
     202            END DO 
     203         END DO 
     204      END DO 
     205 
     206      IF( l_trdtra ) THEN               ! trend diagnostic (contribution of anti-diffusive fluxes) 
    241207         CALL trd_tra_adv( kt, ktra, jpt_trd_xad, cdtype, ztu, pun, ptn, cnbpas='bis' )   ! <<< Add to iad trend 
    242208         CALL trd_tra_adv( kt, ktra, jpt_trd_yad, cdtype, ztv, pvn, ptn, cnbpas='bis' )   ! <<< Add to jad trend 
    243209         CALL trd_tra_adv( kt, ktra, jpt_trd_zad, cdtype, ztw, pwn, ptn, cnbpas='bis' )   ! <<< Add to zad trend 
    244210      ENDIF 
    245  
     211      !                                 ! "Poleward" heat and salt transports (contribution of anti-diffusive fluxes) 
     212      IF( cdtype == 'TRA' .AND. ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN 
     213         IF( ktra == jp_tem)   pht_adv(:) = pht_adv(:) + ptr_vj( ztv(:,:,:) ) 
     214         IF( ktra == jp_sal)   pst_adv(:) = pst_adv(:) + ptr_vj( ztv(:,:,:) ) 
     215      ENDIF 
     216      !                                 ! control print 
    246217      IF(ln_ctl)   CALL prt_ctl( tab3d_1=pta, clinfo1=' tvd - adv: ', mask1=tmask, clinfo3=cdtype ) 
    247218      ! 
     
    276247      zbetup(:,:,:) = 0.e0   ;   zbetdo(:,:,:) = 0.e0   
    277248 
     249!!gm   optimisation :  add the optimal version I wrote 1 year ago 
    278250      ! Search local extrema 
    279251      ! -------------------- 
Note: See TracChangeset for help on using the changeset viewer.