- Timestamp:
- 2017-12-13T15:58:53+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfddm.F90
r7753 r9019 8 8 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 9 9 !! 3.6 ! 2013-04 (G. Madec, F. Roquet) zrau compute locally using interpolation of alpha & beta 10 !! 4.0 ! 2017-04 (G. Madec) remove CPP ddm key & avm at t-point only 10 11 !!---------------------------------------------------------------------- 11 #if defined key_zdfddm 12 12 13 !!---------------------------------------------------------------------- 13 !! 'key_zdfddm' : double diffusion14 !! zdf_ddm : compute the Kz for salinity 14 15 !!---------------------------------------------------------------------- 15 !! zdf_ddm : compute the Ks for salinity 16 !! zdf_ddm_init : read namelist and control the parameters 17 !!---------------------------------------------------------------------- 18 USE oce ! ocean dynamics and tracers variables 19 USE dom_oce ! ocean space and time domain variables 20 USE zdf_oce ! ocean vertical physics variables 16 USE oce ! ocean dynamics and tracers variables 17 USE dom_oce ! ocean space and time domain variables 18 USE zdf_oce ! ocean vertical physics variables 21 19 USE eosbn2 ! equation of state 22 20 ! 23 USE in_out_manager ! I/O manager 24 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 25 USE prtctl ! Print control 26 USE lib_mpp ! MPP library 27 USE wrk_nemo ! work arrays 28 USE timing ! Timing 21 USE in_out_manager ! I/O manager 22 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 23 USE prtctl ! Print control 24 USE lib_mpp ! MPP library 25 USE timing ! Timing 29 26 30 27 IMPLICIT NONE … … 32 29 33 30 PUBLIC zdf_ddm ! called by step.F90 34 PUBLIC zdf_ddm_init ! called by opa.F9035 PUBLIC zdf_ddm_alloc ! called by nemogcm.F9036 37 LOGICAL , PUBLIC, PARAMETER :: lk_zdfddm = .TRUE. !: double diffusive mixing flag38 39 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avs !: salinity vertical diffusivity coeff. at w-point40 41 ! !!* Namelist namzdf_ddm : double diffusive mixing *42 REAL(wp) :: rn_avts ! maximum value of avs for salt fingering43 REAL(wp) :: rn_hsbfr ! heat/salt buoyancy flux ratio44 31 45 32 !! * Substitutions … … 52 39 CONTAINS 53 40 54 INTEGER FUNCTION zdf_ddm_alloc() 55 !!---------------------------------------------------------------------- 56 !! *** ROUTINE zdf_ddm_alloc *** 57 !!---------------------------------------------------------------------- 58 ALLOCATE( avs(jpi,jpj,jpk) , STAT= zdf_ddm_alloc ) 59 IF( lk_mpp ) CALL mpp_sum ( zdf_ddm_alloc ) 60 IF( zdf_ddm_alloc /= 0 ) CALL ctl_warn('zdf_ddm_alloc: failed to allocate arrays') 61 END FUNCTION zdf_ddm_alloc 62 63 64 SUBROUTINE zdf_ddm( kt ) 41 SUBROUTINE zdf_ddm( kt, p_avm, p_avt, p_avs ) 65 42 !!---------------------------------------------------------------------- 66 43 !! *** ROUTINE zdf_ddm *** … … 86 63 !! avt = avt + zavft + zavdt 87 64 !! avs = avs + zavfs + zavds 88 !! avm u, avmv arerequired to remain at least above avt and avs.65 !! avm is required to remain at least above avt and avs. 89 66 !! 90 67 !! ** Action : avt, avs : updated vertical eddy diffusivity coef. for T & S … … 92 69 !! References : Merryfield et al., JPO, 29, 1124-1142, 1999. 93 70 !!---------------------------------------------------------------------- 94 INTEGER, INTENT(in) :: kt ! ocean time-step indexocean time step 71 INTEGER, INTENT(in ) :: kt ! ocean time-step indexocean time step 72 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: p_avm ! Kz on momentum (w-points) 73 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: p_avt ! Kz on temperature (w-points) 74 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_avs ! Kz on salinity (w-points) 95 75 ! 96 76 INTEGER :: ji, jj , jk ! dummy loop indices … … 100 80 REAL(wp) :: zavft, zavfs ! - - 101 81 REAL(wp) :: zavdt, zavds ! - - 102 REAL(wp), POINTER, DIMENSION(:,:) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd382 REAL(wp), DIMENSION(jpi,jpj) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 103 83 !!---------------------------------------------------------------------- 104 84 ! 105 IF( nn_timing == 1 ) CALL timing_start('zdf_ddm') 106 ! 107 CALL wrk_alloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 ) 85 IF( ln_timing ) CALL timing_start('zdf_ddm') 108 86 ! 109 87 ! ! =============== … … 112 90 ! Define the mask 113 91 ! --------------- 114 DO jj = 1, jpj ! R=zrau = (alpha / beta) (dk[t] / dk[s]) 92 !!gm WORK to be done: change the code from vector optimisation to scalar one. 93 !!gm ==>>> test in the loop instead of use of mask arrays 94 !!gm and many acces in memory 95 96 DO jj = 1, jpj !== R=zrau = (alpha / beta) (dk[t] / dk[s]) ==! 115 97 DO ji = 1, jpi 116 98 zrw = ( gdepw_n(ji,jj,jk ) - gdept_n(ji,jj,jk) ) & 99 !!gm please, use e3w_n below 117 100 & / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 118 101 ! … … 129 112 END DO 130 113 131 DO jj = 1, jpj ! indicators:114 DO jj = 1, jpj !== indicators ==! 132 115 DO ji = 1, jpi 133 116 ! stability indicator: msks=1 if rn2>0; 0 elsewhere … … 174 157 & + 0.15 * zrau(ji,jj) * zmskd2(ji,jj) ) 175 158 ! add to the eddy viscosity coef. previously computed 176 # if defined key_zdftmx_new 177 ! key_zdftmx_new: New internal wave-driven param: use avs value computed by zdftmx 178 avs (ji,jj,jk) = avs(ji,jj,jk) + zavfs + zavds 179 # else 180 avs (ji,jj,jk) = avt(ji,jj,jk) + zavfs + zavds 181 # endif 182 avt (ji,jj,jk) = avt(ji,jj,jk) + zavft + zavdt 183 avm (ji,jj,jk) = avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds ) 184 END DO 185 END DO 186 187 188 ! Increase avmu, avmv if necessary 189 ! -------------------------------- 190 !!gm to be changed following the definition of avm. 191 DO jj = 1, jpjm1 192 DO ji = 1, fs_jpim1 ! vector opt. 193 avmu(ji,jj,jk) = MAX( avmu(ji,jj,jk), & 194 & avt(ji,jj,jk), avt(ji+1,jj,jk), & 195 & avs(ji,jj,jk), avs(ji+1,jj,jk) ) * wumask(ji,jj,jk) 196 avmv(ji,jj,jk) = MAX( avmv(ji,jj,jk), & 197 & avt(ji,jj,jk), avt(ji,jj+1,jk), & 198 & avs(ji,jj,jk), avs(ji,jj+1,jk) ) * wvmask(ji,jj,jk) 159 p_avs(ji,jj,jk) = p_avt(ji,jj,jk) + zavfs + zavds 160 p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zavft + zavdt 161 p_avm(ji,jj,jk) = p_avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds ) 199 162 END DO 200 163 END DO … … 203 166 ! ! =============== 204 167 ! 205 CALL lbc_lnk( avt , 'W', 1._wp ) ! Lateral boundary conditions (unchanged sign)206 CALL lbc_lnk( avs , 'W', 1._wp )207 CALL lbc_lnk( avm , 'W', 1._wp )208 CALL lbc_lnk( avmu, 'U', 1._wp )209 CALL lbc_lnk( avmv, 'V', 1._wp )210 211 168 IF(ln_ctl) THEN 212 169 CALL prt_ctl(tab3d_1=avt , clinfo1=' ddm - t: ', tab3d_2=avs , clinfo2=' s: ', ovlap=1, kdim=jpk) 213 CALL prt_ctl(tab3d_1=avmu, clinfo1=' ddm - u: ', mask1=umask, &214 & tab3d_2=avmv, clinfo2= ' v: ', mask2=vmask, ovlap=1, kdim=jpk)215 170 ENDIF 216 171 ! 217 CALL wrk_dealloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 ) 218 ! 219 IF( nn_timing == 1 ) CALL timing_stop('zdf_ddm') 172 IF( ln_timing ) CALL timing_stop('zdf_ddm') 220 173 ! 221 174 END SUBROUTINE zdf_ddm 222 175 223 224 SUBROUTINE zdf_ddm_init225 !!----------------------------------------------------------------------226 !! *** ROUTINE zdf_ddm_init ***227 !!228 !! ** Purpose : Initialization of double diffusion mixing scheme229 !!230 !! ** Method : Read the namzdf_ddm namelist and check the parameter values231 !! called by zdf_ddm at the first timestep (nit000)232 !!----------------------------------------------------------------------233 INTEGER :: ios ! local integer234 !!235 NAMELIST/namzdf_ddm/ rn_avts, rn_hsbfr236 !!----------------------------------------------------------------------237 !238 REWIND( numnam_ref ) ! Namelist namzdf_ddm in reference namelist : Double diffusion mixing scheme239 READ ( numnam_ref, namzdf_ddm, IOSTAT = ios, ERR = 901)240 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ddm in reference namelist', lwp )241 242 REWIND( numnam_cfg ) ! Namelist namzdf_ddm in configuration namelist : Double diffusion mixing scheme243 READ ( numnam_cfg, namzdf_ddm, IOSTAT = ios, ERR = 902 )244 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ddm in configuration namelist', lwp )245 IF(lwm) WRITE ( numond, namzdf_ddm )246 !247 IF(lwp) THEN ! Parameter print248 WRITE(numout,*)249 WRITE(numout,*) 'zdf_ddm : double diffusive mixing'250 WRITE(numout,*) '~~~~~~~'251 WRITE(numout,*) ' Namelist namzdf_ddm : set dd mixing parameter'252 WRITE(numout,*) ' maximum avs for dd mixing rn_avts = ', rn_avts253 WRITE(numout,*) ' heat/salt buoyancy flux ratio rn_hsbfr = ', rn_hsbfr254 ENDIF255 !256 ! ! allocate zdfddm arrays257 IF( zdf_ddm_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_ddm_init : unable to allocate arrays' )258 ! ! initialization to masked Kz259 avs(:,:,:) = rn_avt0 * wmask(:,:,:)260 !261 END SUBROUTINE zdf_ddm_init262 263 #else264 !!----------------------------------------------------------------------265 !! Default option : Dummy module No double diffusion266 !!----------------------------------------------------------------------267 LOGICAL, PUBLIC, PARAMETER :: lk_zdfddm = .FALSE. !: double diffusion flag268 CONTAINS269 SUBROUTINE zdf_ddm( kt ) ! Dummy routine270 WRITE(*,*) 'zdf_ddm: You should not have seen this print! error?', kt271 END SUBROUTINE zdf_ddm272 SUBROUTINE zdf_ddm_init ! Dummy routine273 END SUBROUTINE zdf_ddm_init274 #endif275 276 176 !!====================================================================== 277 177 END MODULE zdfddm
Note: See TracChangeset
for help on using the changeset viewer.