- Timestamp:
- 2012-11-30T16:15:07+01:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_MERGE_2012/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90
r3680 r3718 38 38 39 39 LOGICAL :: l_trd ! flag to compute trends 40 LOGICAL, PUBLIC :: ln_traadv_msc_ups= .FALSE. ! use upstream scheme within muscl 41 42 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 40 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 43 41 ! ! and in closed seas (orca 2 and 4 configurations) 44 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: zind !: mixed upstream/centered index42 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xind !: mixed upstream/centered index 45 43 !! * Substitutions 46 44 # include "domzgr_substitute.h90" … … 54 52 55 53 SUBROUTINE tra_adv_muscl( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 56 & ptb, pta, kjpt )54 & ptb, pta, kjpt, ld_msc_ups ) 57 55 !!---------------------------------------------------------------------- 58 56 !! *** ROUTINE tra_adv_muscl *** … … 76 74 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 77 75 INTEGER , INTENT(in ) :: kjpt ! number of tracers 76 LOGICAL , INTENT(in ) :: ld_msc_ups ! use upstream scheme within muscl 78 77 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 79 78 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 80 79 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before tracer field 81 80 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 81 82 82 ! 83 83 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 97 97 IF(lwp) WRITE(numout,*) 98 98 IF(lwp) WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype 99 IF(lwp) WRITE(numout,*) ' : xed up-stream ' , ln_traadv_msc_ups99 IF(lwp) WRITE(numout,*) ' : mixed up-stream ', ld_msc_ups 100 100 IF(lwp) WRITE(numout,*) '~~~~~~~' 101 101 IF(lwp) WRITE(numout,*) 102 102 ! 103 103 ! 104 IF( ln_traadv_msc_ups) THEN105 IF (.not. ALLOCATED(upsmsk))THEN106 ALLOCATE( upsmsk(jpi,jpj), STAT=ierr )107 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate upsmsk array')108 ENDIF109 upsmsk(:,:) = 0._wp ! not upstream by default104 IF( ld_msc_ups ) THEN 105 IF( .NOT. ALLOCATED( upsmsk ) ) THEN 106 ALLOCATE( upsmsk(jpi,jpj), STAT=ierr ) 107 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate upsmsk array') 108 ENDIF 109 upsmsk(:,:) = 0._wp ! not upstream by default 110 110 ENDIF 111 111 112 IF (.not. ALLOCATED(zind))THEN113 ALLOCATE( zind(jpi,jpj,jpk), STAT=ierr )112 IF( .NOT. ALLOCATED( xind ) ) THEN 113 ALLOCATE( xind(jpi,jpj,jpk), STAT=ierr ) 114 114 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate zind array') 115 115 ENDIF … … 119 119 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 120 120 121 !122 ! Upstream / centered scheme indicator123 ! ------------------------------------124 zind(:,:,:) = 1._wp ! set equal to 0 where up-stream isneeded125 126 IF( ln_traadv_msc_ups)THEN127 DO jk = 1, jpk128 DO jj = 1, jpj129 DO ji = 1, jpi130 zind(ji,jj,jk) = 1 - MAX ( &131 rnfmsk(ji,jj) * rnfmsk_z(jk), & ! near runoff mouths (& closed sea outflows)132 upsmsk(ji,jj) ) * tmask(ji,jj,jk) ! some of some straits133 END DO134 END DO135 END DO121 ! 122 ! Upstream / centered scheme indicator 123 ! ------------------------------------ 124 xind(:,:,:) = 1._wp ! set equal to 1 where up-stream is not needed 125 ! 126 IF( ld_msc_ups ) THEN 127 DO jk = 1, jpk 128 DO jj = 1, jpj 129 DO ji = 1, jpi 130 xind(ji,jj,jk) = 1 - MAX ( & 131 rnfmsk(ji,jj) * rnfmsk_z(jk), & ! near runoff mouths (& closed sea outflows) 132 upsmsk(ji,jj) ) * tmask(ji,jj,jk) ! some of some straits 133 END DO 134 END DO 135 END DO 136 136 ENDIF 137 !138 ENDIF ! end kit000137 ! 138 ENDIF 139 139 ! ! =========== 140 140 DO jn = 1, kjpt ! tracer loop … … 191 191 zalpha = 0.5 - z0u 192 192 zu = z0u - 0.5 * pun(ji,jj,jk) * zdt / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 193 zzwx = ptb(ji+1,jj,jk,jn) + zind(ji,jj,jk) * (zu * zslpx(ji+1,jj,jk))194 zzwy = ptb(ji ,jj,jk,jn) + zind(ji,jj,jk) * (zu * zslpx(ji ,jj,jk))193 zzwx = ptb(ji+1,jj,jk,jn) + xind(ji,jj,jk) * (zu * zslpx(ji+1,jj,jk)) 194 zzwy = ptb(ji ,jj,jk,jn) + xind(ji,jj,jk) * (zu * zslpx(ji ,jj,jk)) 195 195 zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 196 196 ! … … 198 198 zalpha = 0.5 - z0v 199 199 zv = z0v - 0.5 * pvn(ji,jj,jk) * zdt / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 200 zzwx = ptb(ji,jj+1,jk,jn) + zind(ji,jj,jk) * (zv * zslpy(ji,jj+1,jk))201 zzwy = ptb(ji,jj ,jk,jn) + zind(ji,jj,jk) * (zv * zslpy(ji,jj ,jk))200 zzwx = ptb(ji,jj+1,jk,jn) + xind(ji,jj,jk) * (zv * zslpy(ji,jj+1,jk)) 201 zzwy = ptb(ji,jj ,jk,jn) + xind(ji,jj,jk) * (zv * zslpy(ji,jj ,jk)) 202 202 zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 203 203 END DO … … 273 273 zalpha = 0.5 + z0w 274 274 zw = z0w - 0.5 * pwn(ji,jj,jk+1) * zdt * zbtr 275 zzwx = ptb(ji,jj,jk+1,jn) + zind(ji,jj,jk) * (zw * zslpx(ji,jj,jk+1))276 zzwy = ptb(ji,jj,jk ,jn) + zind(ji,jj,jk) * (zw * zslpx(ji,jj,jk ))275 zzwx = ptb(ji,jj,jk+1,jn) + xind(ji,jj,jk) * (zw * zslpx(ji,jj,jk+1)) 276 zzwy = ptb(ji,jj,jk ,jn) + xind(ji,jj,jk) * (zw * zslpx(ji,jj,jk )) 277 277 zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 278 278 END DO
Note: See TracChangeset
for help on using the changeset viewer.