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 3666 for branches/2012/dev_LOCEAN_UKMO_CMCC_INGV_2012/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90 – NEMO

Ignore:
Timestamp:
2012-11-26T15:22:04+01:00 (11 years ago)
Author:
cetlod
Message:

commit the changes resulting for the merged branches, see ticket #1025

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_LOCEAN_UKMO_CMCC_INGV_2012/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90

    r3294 r3666  
    88   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module 
    99   !!            3.2  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport 
     10   !!            3.4  !  2012-06  (P. Oddo) include the upstream where needed 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    1819   USE trdmod_oce      ! tracers trends  
    1920   USE trdtra      ! tracers trends  
     21   USE eosbn2          ! equation of state  
    2022   USE in_out_manager  ! I/O manager 
    2123   USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
    2224   USE trabbl          ! tracers: bottom boundary layer 
     25   USE sbcrnf          ! river runoffs 
    2326   USE lib_mpp         ! distribued memory computing 
    2427   USE lbclnk          ! ocean lateral boundary condition (or mpp link)  
     
    2730   USE wrk_nemo        ! Memory Allocation 
    2831   USE timing          ! Timing 
     32   USE eosbn2          ! equation of state 
     33   USE sbcrnf          ! river runoffs 
    2934 
    3035   IMPLICIT NONE 
     
    3540   LOGICAL  :: l_trd       ! flag to compute trends 
    3641 
     42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 
     43   !                                                             !  and in closed seas (orca 2 and 4 configurations) 
    3744   !! * Substitutions 
    3845#  include "domzgr_substitute.h90" 
     
    7885      REAL(wp) ::   ztra, zbtr, zdt, zalpha   !   -      - 
    7986      REAL(wp), POINTER, DIMENSION(:,:,:) :: zslpx, zslpy 
     87      INTEGER  ::   ierr 
     88      REAL(wp) ::   zice                             ! temporary scalars 
     89      REAL(wp), POINTER, DIMENSION(:,:  ) :: ztfreez 
     90      REAL(wp), POINTER, DIMENSION(:,:,:) :: zind 
    8091      !!---------------------------------------------------------------------- 
    8192      ! 
     
    8394      ! 
    8495      CALL wrk_alloc( jpi, jpj, jpk, zslpx, zslpy ) 
     96      CALL wrk_alloc( jpi, jpj, ztfreez ) 
     97      CALL wrk_alloc( jpi, jpj, jpk, zind ) 
    8598      ! 
    8699 
     
    89102         IF(lwp) WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype 
    90103         IF(lwp) WRITE(numout,*) '~~~~~~~' 
     104         IF(lwp) WRITE(numout,*) 
     105         ! 
     106         ! 
     107         IF (.not. ALLOCATED(upsmsk))THEN 
     108             ALLOCATE( upsmsk(jpi,jpj), STAT=ierr ) 
     109             IF( ierr /= 0 )   CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate array') 
     110         ENDIF 
     111         ! 
     112         upsmsk(:,:) = 0._wp                             ! not upstream by default 
    91113         ! 
    92114         l_trd = .FALSE. 
     
    94116      ENDIF 
    95117 
     118      ! 
     119      ! Upstream / centered scheme indicator 
     120      ! ------------------------------------ 
     121      ztfreez(:,:) = tfreez( tsn(:,:,1,jp_sal) ) 
     122      DO jk = 1, jpk 
     123         DO jj = 1, jpj 
     124            DO ji = 1, jpi 
     125               !                                        ! below ice covered area (if tn < "freezing"+0.1 ) 
     126               IF( tsn(ji,jj,jk,jp_tem) <= ztfreez(ji,jj) + 0.1_wp ) THEN   ;   zice = 1.e0 
     127               ELSE                                                         ;   zice = 0.e0 
     128               ENDIF 
     129               zind(ji,jj,jk) = MAX (   & 
     130                  rnfmsk(ji,jj) * rnfmsk_z(jk),      &  ! near runoff mouths (& closed sea outflows) 
     131                  upsmsk(ji,jj)               ,      &  ! some of some straits 
     132                  zice                               &  ! below ice covered area (if tn < "freezing"+0.1 ) 
     133                  &                  ) * tmask(ji,jj,jk) 
     134               zind(ji,jj,jk) = 1 - zind(ji,jj,jk) 
     135            END DO 
     136         END DO 
     137      END DO 
    96138      !                                                     ! =========== 
    97139      DO jn = 1, kjpt                                       ! tracer loop 
     
    148190                  zalpha = 0.5 - z0u 
    149191                  zu  = z0u - 0.5 * pun(ji,jj,jk) * zdt / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
    150                   zzwx = ptb(ji+1,jj,jk,jn) + zu * zslpx(ji+1,jj,jk) 
    151                   zzwy = ptb(ji  ,jj,jk,jn) + zu * zslpx(ji  ,jj,jk) 
     192                  zzwx = ptb(ji+1,jj,jk,jn) + zind(ji,jj,jk) * (zu * zslpx(ji+1,jj,jk)) 
     193                  zzwy = ptb(ji  ,jj,jk,jn) + zind(ji,jj,jk) * (zu * zslpx(ji  ,jj,jk)) 
    152194                  zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    153195                  ! 
     
    155197                  zalpha = 0.5 - z0v 
    156198                  zv  = z0v - 0.5 * pvn(ji,jj,jk) * zdt / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    157                   zzwx = ptb(ji,jj+1,jk,jn) + zv * zslpy(ji,jj+1,jk) 
    158                   zzwy = ptb(ji,jj  ,jk,jn) + zv * zslpy(ji,jj  ,jk)  
     199                  zzwx = ptb(ji,jj+1,jk,jn) + zind(ji,jj,jk) * (zv * zslpy(ji,jj+1,jk)) 
     200                  zzwy = ptb(ji,jj  ,jk,jn) + zind(ji,jj,jk) * (zv * zslpy(ji,jj  ,jk)) 
    159201                  zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    160202               END DO 
     
    230272                  zalpha = 0.5 + z0w 
    231273                  zw  = z0w - 0.5 * pwn(ji,jj,jk+1) * zdt * zbtr  
    232                   zzwx = ptb(ji,jj,jk+1,jn) + zw * zslpx(ji,jj,jk+1) 
    233                   zzwy = ptb(ji,jj,jk  ,jn) + zw * zslpx(ji,jj,jk  ) 
     274                  zzwx = ptb(ji,jj,jk+1,jn) + zind(ji,jj,jk) * (zw * zslpx(ji,jj,jk+1)) 
     275                  zzwy = ptb(ji,jj,jk  ,jn) + zind(ji,jj,jk) * (zw * zslpx(ji,jj,jk  )) 
    234276                  zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 
    235277               END DO  
     
    255297      ! 
    256298      CALL wrk_dealloc( jpi, jpj, jpk, zslpx, zslpy ) 
     299      CALL wrk_dealloc( jpi, jpj, ztfreez ) 
     300      CALL wrk_dealloc( jpi, jpj, jpk, zind ) 
    257301      ! 
    258302      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_muscl') 
Note: See TracChangeset for help on using the changeset viewer.