- Timestamp:
- 2012-11-27T15:42:24+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
r3625 r3680 8 8 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 9 9 !! 3.2 ! 2010-05 (C. Ethe, G. Madec) merge TRC-TRA + switch from velocity to transport 10 !! 3.4 ! 2012-06 (P. Oddo, M. Vichi) include the upstream where needed 10 11 !!---------------------------------------------------------------------- 11 12 … … 28 29 USE timing ! Timing 29 30 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 31 USE eosbn2 ! equation of state 32 USE sbcrnf ! river runoffs 30 33 31 34 IMPLICIT NONE … … 34 37 PUBLIC tra_adv_muscl ! routine called by step.F90 35 38 36 LOGICAL :: l_trd ! flag to compute trends 37 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 43 ! ! and in closed seas (orca 2 and 4 configurations) 44 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: zind !: mixed upstream/centered index 38 45 !! * Substitutions 39 46 # include "domzgr_substitute.h90" … … 79 86 REAL(wp) :: ztra, zbtr, zdt, zalpha ! - - 80 87 REAL(wp), POINTER, DIMENSION(:,:,:) :: zslpx, zslpy 88 INTEGER :: ierr 81 89 !!---------------------------------------------------------------------- 82 90 ! … … 89 97 IF(lwp) WRITE(numout,*) 90 98 IF(lwp) WRITE(numout,*) 'tra_adv : MUSCL advection scheme on ', cdtype 99 IF(lwp) WRITE(numout,*) ' : xed up-stream ' , ln_traadv_msc_ups 91 100 IF(lwp) WRITE(numout,*) '~~~~~~~' 101 IF(lwp) WRITE(numout,*) 102 ! 103 ! 104 IF(ln_traadv_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 ENDIF 111 112 IF (.not. ALLOCATED(zind))THEN 113 ALLOCATE( zind(jpi,jpj,jpk), STAT=ierr ) 114 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'tra_adv_muscl: unable to allocate zind array') 115 ENDIF 116 ! 92 117 ! 93 118 l_trd = .FALSE. 94 119 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 95 ENDIF 96 120 121 ! 122 ! Upstream / centered scheme indicator 123 ! ------------------------------------ 124 zind(:,:,:) = 1._wp ! set equal to 0 where up-stream is needed 125 126 IF(ln_traadv_msc_ups) THEN 127 DO jk = 1, jpk 128 DO jj = 1, jpj 129 DO ji = 1, jpi 130 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 straits 133 END DO 134 END DO 135 END DO 136 ENDIF 137 ! 138 ENDIF ! end kit000 97 139 ! ! =========== 98 140 DO jn = 1, kjpt ! tracer loop … … 149 191 zalpha = 0.5 - z0u 150 192 zu = z0u - 0.5 * pun(ji,jj,jk) * zdt / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 151 zzwx = ptb(ji+1,jj,jk,jn) + z u * zslpx(ji+1,jj,jk)152 zzwy = ptb(ji ,jj,jk,jn) + z u * zslpx(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)) 153 195 zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 154 196 ! … … 156 198 zalpha = 0.5 - z0v 157 199 zv = z0v - 0.5 * pvn(ji,jj,jk) * zdt / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 158 zzwx = ptb(ji,jj+1,jk,jn) + z v * zslpy(ji,jj+1,jk)159 zzwy = ptb(ji,jj ,jk,jn) + z v * zslpy(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)) 160 202 zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 161 203 END DO … … 231 273 zalpha = 0.5 + z0w 232 274 zw = z0w - 0.5 * pwn(ji,jj,jk+1) * zdt * zbtr 233 zzwx = ptb(ji,jj,jk+1,jn) + z w * zslpx(ji,jj,jk+1)234 zzwy = ptb(ji,jj,jk ,jn) + z w * zslpx(ji,jj,jk)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 )) 235 277 zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 236 278 END DO
Note: See TracChangeset
for help on using the changeset viewer.