Changeset 3671


Ignore:
Timestamp:
2012-11-27T13:49:55+01:00 (8 years ago)
Author:
epico
Message:

Reorganize the MUSCL upstream switching scheme

Location:
branches/2012/dev_LOCEAN_UKMO_CMCC_INGV_2012/NEMOGCM/NEMO/OPA_SRC/TRA
Files:
2 edited

Legend:

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

    r3294 r3671  
    4545   LOGICAL ::   ln_traadv_qck    = .FALSE.   ! QUICKEST scheme flag 
    4646 
     47 
    4748   INTEGER ::   nadv   ! choice of the type of advection scheme 
    4849 
     
    152153      NAMELIST/namtra_adv/ ln_traadv_cen2 , ln_traadv_tvd,     & 
    153154         &                 ln_traadv_muscl, ln_traadv_muscl2,  & 
    154          &                 ln_traadv_ubs  , ln_traadv_qck 
     155         &                 ln_traadv_ubs  , ln_traadv_qck,     & 
     156         &                 ln_traadv_msc_ups 
    155157      !!---------------------------------------------------------------------- 
    156158 
     
    169171         WRITE(numout,*) '      UBS    advection scheme        ln_traadv_ubs    = ', ln_traadv_ubs 
    170172         WRITE(numout,*) '      QUICKEST advection scheme      ln_traadv_qck    = ', ln_traadv_qck 
     173         WRITE(numout,*) '      upstream scheme within muscl   ln_traadv_msc_ups= ', ln_traadv_msc_ups 
    171174      ENDIF 
    172175 
  • branches/2012/dev_LOCEAN_UKMO_CMCC_INGV_2012/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90

    r3666 r3671  
    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 
     10   !!            3.4  !  2012-06  (P. Oddo, M. Vichi) include the upstream where needed 
    1111   !!---------------------------------------------------------------------- 
    1212 
     
    1818   USE dom_oce         ! ocean space and time domain 
    1919   USE trdmod_oce      ! tracers trends  
    20    USE trdtra      ! tracers trends  
     20   USE trdtra          ! tracers trends  
    2121   USE eosbn2          ! equation of state  
    2222   USE in_out_manager  ! I/O manager 
     
    3838   PUBLIC   tra_adv_muscl  ! routine called by step.F90 
    3939 
    40    LOGICAL  :: l_trd       ! flag to compute trends 
     40   LOGICAL  :: l_trd                        ! flag to compute trends 
     41   LOGICAL, PUBLIC  :: ln_traadv_msc_ups= .FALSE.   ! use upstream scheme within muscl 
    4142 
    4243   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 
    4344   !                                                             !  and in closed seas (orca 2 and 4 configurations) 
     45   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: zind         !: mixed upstream/centered index 
    4446   !! * Substitutions 
    4547#  include "domzgr_substitute.h90" 
     
    8688      REAL(wp), POINTER, DIMENSION(:,:,:) :: zslpx, zslpy 
    8789      INTEGER  ::   ierr 
    88       REAL(wp) ::   zice                             ! temporary scalars 
    89       REAL(wp), POINTER, DIMENSION(:,:  ) :: ztfreez 
    90       REAL(wp), POINTER, DIMENSION(:,:,:) :: zind 
    9190      !!---------------------------------------------------------------------- 
    9291      ! 
     
    9493      ! 
    9594      CALL wrk_alloc( jpi, jpj, jpk, zslpx, zslpy ) 
    96       CALL wrk_alloc( jpi, jpj, ztfreez ) 
    97       CALL wrk_alloc( jpi, jpj, jpk, zind ) 
    9895      ! 
    9996 
     
    10198         IF(lwp) WRITE(numout,*) 
    10299         IF(lwp) WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype 
     100         IF(lwp) WRITE(numout,*) '        : xed up-stream            ' , ln_traadv_msc_ups 
    103101         IF(lwp) WRITE(numout,*) '~~~~~~~' 
    104102         IF(lwp) WRITE(numout,*) 
    105103         ! 
    106104         ! 
    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') 
     105         IF(ln_traadv_msc_ups) THEN 
     106           IF (.not. ALLOCATED(upsmsk))THEN 
     107               ALLOCATE( upsmsk(jpi,jpj), STAT=ierr ) 
     108               IF( ierr /= 0 )   CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate upsmsk array') 
     109           ENDIF 
     110           upsmsk(:,:) = 0._wp                             ! not upstream by default 
    110111         ENDIF 
    111          ! 
    112          upsmsk(:,:) = 0._wp                             ! not upstream by default 
     112 
     113         IF (.not. ALLOCATED(zind))THEN 
     114             ALLOCATE( zind(jpi,jpj,jpk), STAT=ierr ) 
     115             IF( ierr /= 0 )   CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate zind array') 
     116         ENDIF 
     117         ! 
    113118         ! 
    114119         l_trd = .FALSE. 
    115120         IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 
    116       ENDIF 
    117121 
    118122      ! 
    119123      ! Upstream / centered scheme indicator 
    120124      ! ------------------------------------ 
    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 
     125         zind(:,:,:) = 1._wp                             ! set equal to 0 where up-stream is needed 
     126 
     127         IF(ln_traadv_msc_ups) THEN 
     128           DO jk = 1, jpk 
     129              DO jj = 1, jpj 
     130                 DO ji = 1, jpi 
     131                    zind(ji,jj,jk) = 1  - MAX (           & 
     132                       rnfmsk(ji,jj) * rnfmsk_z(jk),      &  ! near runoff mouths (& closed sea outflows) 
     133                       upsmsk(ji,jj) ) * tmask(ji,jj,jk)     ! some of some straits 
     134                 END DO 
     135              END DO 
     136           END DO 
     137         ENDIF  
     138      ! 
     139      ENDIF ! end kit000 
    138140      !                                                     ! =========== 
    139141      DO jn = 1, kjpt                                       ! tracer loop 
     
    297299      ! 
    298300      CALL wrk_dealloc( jpi, jpj, jpk, zslpx, zslpy ) 
    299       CALL wrk_dealloc( jpi, jpj, ztfreez ) 
    300       CALL wrk_dealloc( jpi, jpj, jpk, zind ) 
    301301      ! 
    302302      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_muscl') 
Note: See TracChangeset for help on using the changeset viewer.