Changeset 7931 for branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC
- Timestamp:
- 2017-04-19T12:15:07+02:00 (7 years ago)
- Location:
- branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/C1D/step_c1d.F90
r6140 r7931 27 27 PUBLIC stp_c1d ! called by opa.F90 28 28 29 !! * Substitutions30 # include "zdfddm_substitute.h90"31 29 !!---------------------------------------------------------------------- 32 30 !! NEMO/C1D 3.7 , NEMO Consortium (2015) … … 93 91 IF( ln_zdfevd ) CALL zdf_evd( kstp ) ! enhanced vertical eddy diffusivity 94 92 IF( lk_zdftmx ) CALL zdf_tmx( kstp ) ! tidal vertical mixing 95 IF( l k_zdfddm ) CALL zdf_ddm( kstp ) ! double diffusive mixing93 IF( ln_zdfddm ) CALL zdf_ddm( kstp ) ! double diffusive mixing 96 94 CALL zdf_mxl( kstp ) ! mixed layer depth 97 95 -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/DIA/diaar5.F90
r7753 r7931 39 39 40 40 !! * Substitutions 41 # include "zdfddm_substitute.h90"42 41 # include "vectopt_loop_substitute.h90" 43 42 !!---------------------------------------------------------------------- … … 212 211 ! Exclude points where rn2 is negative as convection kicks in here and 213 212 ! work is not being done against stratification 214 CALL wrk_alloc( jpi, jpj, zpe ) 215 zpe(:,:) = 0._wp 216 IF( lk_zdfddm ) THEN 217 DO ji=1,jpi 218 DO jj=1,jpj 219 DO jk=1,jpk 220 zrw = ( gdepw_n(ji,jj,jk ) - gdept_n(ji,jj,jk) ) & 221 & / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 222 ! 223 zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 224 zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 225 ! 226 zpe(ji, jj) = zpe(ji, jj) - MIN(0._wp, rn2(ji,jj,jk)) * & 227 & grav * (avt(ji,jj,jk) * zaw * (tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) & 228 & - fsavs(ji,jj,jk) * zbw * (tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) ) 229 230 ENDDO 231 ENDDO 232 ENDDO 213 CALL wrk_alloc( jpi, jpj, zpe ) 214 zpe(:,:) = 0._wp 215 IF( ln_zdfddm ) THEN 216 DO jk = 2, jpk 217 DO jj = 1, jpj 218 DO ji = 1, jpi 219 IF( rn2(ji,jj,jk) > 0._wp ) THEN 220 zrw = ( gdepw_n(ji,jj,jk ) - gdept_n(ji,jj,jk) ) & 221 & / ( gdept_n(ji,jj,jk-1) - gdept_n(ji,jj,jk) ) 222 !!gm this can be reduced to : (depw-dept) / e3w (NB idem dans bn2 !) 223 ! zrw = ( gdept_n(ji,jj,jk) - gdepw_n(ji,jj,jk) ) / e3w_n(ji,jj,jk) 224 !!gm end 225 ! 226 zaw = rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem)* zrw 227 zbw = rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal)* zrw 228 ! 229 zpe(ji, jj) = zpe(ji, jj) & 230 & - grav * ( avt(ji,jj,jk) * zaw * (tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) & 231 & - avs(ji,jj,jk) * zbw * (tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) ) 232 ENDIF 233 END DO 234 END DO 235 END DO 233 236 ELSE 234 DO ji = 1, jpi 235 DO jj = 1, jpj 236 DO jk = 1, jpk 237 zpe(ji,jj) = zpe(ji,jj) + avt(ji, jj, jk) * MIN(0._wp,rn2(ji, jj, jk)) * rau0 * e3w_n(ji, jj, jk) 238 ENDDO 239 ENDDO 240 ENDDO 241 ENDIF 242 CALL lbc_lnk( zpe, 'T', 1._wp) 237 DO jk = 1, jpk 238 DO ji = 1, jpi 239 DO jj = 1, jpj 240 zpe(ji,jj) = zpe(ji,jj) + avt(ji, jj, jk) * MIN(0._wp,rn2(ji, jj, jk)) * rau0 * e3w_n(ji, jj, jk) 241 END DO 242 END DO 243 END DO 244 ENDIF 245 !!gm useless lbc_lnk since the computation above is performed over 1:jpi & 1:jpj 246 !!gm CALL lbc_lnk( zpe, 'T', 1._wp) 243 247 CALL iom_put( 'tnpeo', zpe ) 244 248 CALL wrk_dealloc( jpi, jpj, zpe ) -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/DIA/diawri.F90
r7753 r7931 80 80 81 81 !! * Substitutions 82 # include "zdfddm_substitute.h90"83 82 # include "vectopt_loop_substitute.h90" 84 83 !!---------------------------------------------------------------------- … … 234 233 235 234 CALL iom_put( "avt" , avt ) ! T vert. eddy diff. coef. 235 CALL iom_put( "avs" , avs ) ! S vert. eddy diff. coef. (useful only with key_zdfddm) 236 236 CALL iom_put( "avm" , avmu ) ! T vert. eddy visc. coef. 237 CALL iom_put( "avs" , fsavs(:,:,:) ) ! S vert. eddy diff. coef. (useful only with key_zdfddm) 238 239 IF( iom_use('logavt') ) CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt (:,:,:) ) ) ) 240 IF( iom_use('logavs') ) CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, fsavs(:,:,:) ) ) ) 237 238 IF( iom_use('logavt') ) CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt(:,:,:) ) ) ) 239 IF( iom_use('logavs') ) CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, avs(:,:,:) ) ) ) 241 240 242 241 IF ( iom_use("sstgrad") .OR. iom_use("sstgrad2") ) THEN … … 750 749 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) 751 750 752 IF( l k_zdfddm ) THEN751 IF( ln_zdfddm ) THEN 753 752 CALL histdef( nid_W,"voddmavs","Salt Vertical Eddy Diffusivity" , "m2/s" , & ! avs 754 753 & jpi, jpj, nh_W, ipk, 1, ipk, nz_W, 32, clop, zsto, zout ) … … 875 874 CALL histwrite( nid_W, "votkeavt", it, avt , ndim_T, ndex_T ) ! T vert. eddy diff. coef. 876 875 CALL histwrite( nid_W, "votkeavm", it, avmu , ndim_T, ndex_T ) ! T vert. eddy visc. coef. 877 IF( l k_zdfddm ) THEN878 CALL histwrite( nid_W, "voddmavs", it, fsavs(:,:,:), ndim_T, ndex_T ) ! S vert. eddy diff. coef.876 IF( ln_zdfddm ) THEN 877 CALL histwrite( nid_W, "voddmavs", it, avs , ndim_T, ndex_T ) ! S vert. eddy diff. coef. 879 878 ENDIF 880 879 881 880 IF( ln_wave .AND. ln_sdw ) THEN 882 CALL histwrite( nid_U, "sdzocrtx", it, usd 883 CALL histwrite( nid_V, "sdmecrty", it, vsd 884 CALL histwrite( nid_W, "sdvecrtz", it, wsd 881 CALL histwrite( nid_U, "sdzocrtx", it, usd , ndim_U , ndex_U ) ! i-StokesDrift-current 882 CALL histwrite( nid_V, "sdmecrty", it, vsd , ndim_V , ndex_V ) ! j-StokesDrift-current 883 CALL histwrite( nid_W, "sdvecrtz", it, wsd , ndim_T , ndex_T ) ! StokesDrift vert. current 885 884 ENDIF 886 885 -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90
r7753 r7931 41 41 42 42 !! * Substitutions 43 # include "zdfddm_substitute.h90"44 43 # include "vectopt_loop_substitute.h90" 45 44 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf_exp.F90
r6140 r7931 41 41 42 42 !! * Substitutions 43 # include "zdfddm_substitute.h90"44 43 # include "vectopt_loop_substitute.h90" 45 44 !!---------------------------------------------------------------------- … … 62 61 !! ztb = ptb + p2dt difft 63 62 !! where difft = dz( avt dz(ptb) ) = 1/e3t dk+1( avt/e3w dk(ptb) ) 64 !! (if l k_zdfddm=T use avs on salinity and passive tracers instead of avt)63 !! (if ln_zdfddm=T use avs on salinity and passive tracers instead of avt) 65 64 !! difft is evaluated with an Euler split-explit scheme using a 66 65 !! no flux boundary condition at both surface and bottomi boundaries. … … 116 115 zwf(ji,jj,jk) = avt(ji,jj,jk) * ( ztb(ji,jj,jk-1) - ztb(ji,jj,jk) ) / e3w_b(ji,jj,jk) 117 116 ELSE ! salinity or pass. tracer : use of avs 118 zwf(ji,jj,jk) = fsavs(ji,jj,jk) * ( ztb(ji,jj,jk-1) - ztb(ji,jj,jk) ) / e3w_b(ji,jj,jk)117 zwf(ji,jj,jk) = avs(ji,jj,jk) * ( ztb(ji,jj,jk-1) - ztb(ji,jj,jk) ) / e3w_b(ji,jj,jk) 119 118 END IF 120 119 END DO -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf_imp.F90
r7753 r7931 44 44 45 45 !! * Substitutions 46 # include "zdfddm_substitute.h90"47 46 # include "vectopt_loop_substitute.h90" 48 47 !!---------------------------------------------------------------------- … … 66 65 !! It is computed using a backward time scheme (t=after field) 67 66 !! which provide directly the after tracer field. 68 !! If l k_zdfddm=T, use avs for salinity or for passive tracers67 !! If ln_zdfddm=T, use avs for salinity or for passive tracers 69 68 !! Surface and bottom boundary conditions: no diffusive flux on 70 69 !! both tracers (bottom, applied through the masked field avt). … … 102 101 ! Build matrix if temperature or salinity (only in double diffusion case) or first passive tracer 103 102 ! 104 IF( ( cdtype == 'TRA' .AND. ( jn == jp_tem .OR. ( jn == jp_sal .AND. l k_zdfddm ) ) ) .OR. &103 IF( ( cdtype == 'TRA' .AND. ( jn == jp_tem .OR. ( jn == jp_sal .AND. ln_zdfddm ) ) ) .OR. & 105 104 & ( cdtype == 'TRC' .AND. jn == 1 ) ) THEN 106 105 ! 107 106 ! vertical mixing coef.: avt for temperature, avs for salinity and passive tracers 108 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN ; zwt(:,:,2:jpk) = avt 109 ELSE ; zwt(:,:,2:jpk) = fsavs(:,:,2:jpk)107 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN ; zwt(:,:,2:jpk) = avt(:,:,2:jpk) 108 ELSE ; zwt(:,:,2:jpk) = avs(:,:,2:jpk) 110 109 ENDIF 111 110 zwt(:,:,1) = 0._wp -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRD/trdglo.F90
r6140 r7931 53 53 !! * Substitutions 54 54 # include "vectopt_loop_substitute.h90" 55 # include "zdfddm_substitute.h90"56 55 !!---------------------------------------------------------------------- 57 56 !! NEMO/OPA 3.3 , NEMO Consortium (2010) -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRD/trdmxl.F90
r6140 r7931 69 69 INTEGER :: ionce, icount 70 70 71 !! * Substitutions72 # include "zdfddm_substitute.h90"73 71 !!---------------------------------------------------------------------- 74 72 !! NEMO/OPA 3.3 , NEMO Consortium (2010) -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRD/trdpen.F90
r6140 r7931 37 37 38 38 !! * Substitutions 39 # include "zdfddm_substitute.h90"40 39 # include "vectopt_loop_substitute.h90" 41 40 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/TRD/trdtra.F90
r7646 r7931 42 42 43 43 !! * Substitutions 44 # include "zdfddm_substitute.h90"45 44 # include "vectopt_loop_substitute.h90" 46 45 !!---------------------------------------------------------------------- … … 129 128 DO jk = 2, jpk 130 129 zwt(:,:,jk) = avt(:,:,jk) * ( tsa(:,:,jk-1,jp_tem) - tsa(:,:,jk,jp_tem) ) / e3w_n(:,:,jk) * tmask(:,:,jk) 131 zws(:,:,jk) = fsavs(:,:,jk) * ( tsa(:,:,jk-1,jp_sal) - tsa(:,:,jk,jp_sal) ) / e3w_n(:,:,jk) * tmask(:,:,jk)130 zws(:,:,jk) = avs(:,:,jk) * ( tsa(:,:,jk-1,jp_sal) - tsa(:,:,jk,jp_sal) ) / e3w_n(:,:,jk) * tmask(:,:,jk) 132 131 END DO 133 132 ! -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdf_oce.F90
r7646 r7931 23 23 24 24 ! !!* namelist namzdf: vertical diffusion * 25 !!gm 26 ! ! vertical closure scheme flags 27 LOGICAL , PUBLIC :: ln_zdfcst !: constant coefficients 28 LOGICAL , PUBLIC :: ln_zdfric !: Richardson depend coefficients 29 LOGICAL , PUBLIC :: ln_zdftke !: Turbulent Kinetic Energy closure 30 LOGICAL , PUBLIC :: ln_zdfgls !: Generic Length Sclare closure 31 ! ! tidal induced mixing 32 LOGICAL , PUBLIC :: ln_zdftmx !: tidal mixing parameterization flag 33 ! ! double diffusion 34 LOGICAL , PUBLIC :: ln_zdfddm !: double diffusive mixing flag 35 REAL(wp), PUBLIC :: rn_avts !: maximum value of avs for salt fingering 36 REAL(wp), PUBLIC :: rn_hsbfr !: heat/salt buoyancy flux ratio 37 !!gm 38 LOGICAL , PUBLIC :: ln_zdfexp !: explicit vertical diffusion scheme flag 39 INTEGER , PUBLIC :: nn_zdfexp !: number of sub-time step (explicit time stepping) 40 LOGICAL , PUBLIC :: ln_zdfevd !: convection: enhanced vertical diffusion flag 41 INTEGER , PUBLIC :: nn_evdm !: =0/1 flag to apply enhanced avm or not 42 REAL(wp), PUBLIC :: rn_evd !: vertical eddy coeff. for enhanced vert. diff. (m2/s) 43 LOGICAL , PUBLIC :: ln_zdfnpc !: convection: non-penetrative convection flag 44 INTEGER , PUBLIC :: nn_npc !: non penetrative convective scheme call frequency 45 INTEGER , PUBLIC :: nn_npcp !: non penetrative convective scheme print frequency 46 ! ! Surface wave-induced mixing 47 LOGICAL , PUBLIC :: ln_zdfqiao !: Enhanced wave vertical mixing Qiao(2010) formulation flag 48 ! ! coefficients 25 49 REAL(wp), PUBLIC :: rn_avm0 !: vertical eddy viscosity (m2/s) 26 50 REAL(wp), PUBLIC :: rn_avt0 !: vertical eddy diffusivity (m2/s) 27 51 INTEGER , PUBLIC :: nn_avb !: constant or profile background on avt (=0/1) 28 INTEGER , PUBLIC :: nn_havtb !: horizontal shape or not for avtb (=0/1) 29 LOGICAL , PUBLIC :: ln_zdfexp !: explicit vertical diffusion scheme flag 30 INTEGER , PUBLIC :: nn_zdfexp !: number of sub-time step (explicit time stepping) 31 LOGICAL , PUBLIC :: ln_zdfevd !: convection: enhanced vertical diffusion flag 32 INTEGER , PUBLIC :: nn_evdm !: =0/1 flag to apply enhanced avm or not 33 REAL(wp), PUBLIC :: rn_avevd !: vertical eddy coeff. for enhanced vert. diff. (m2/s) 34 LOGICAL , PUBLIC :: ln_zdfnpc !: convection: non-penetrative convection flag 35 INTEGER , PUBLIC :: nn_npc !: non penetrative convective scheme call frequency 36 INTEGER , PUBLIC :: nn_npcp !: non penetrative convective scheme print frequency 37 LOGICAL , PUBLIC :: ln_zdfqiao !: Enhanced wave vertical mixing Qiao(2010) formulation flag 52 INTEGER , PUBLIC :: nn_havtb !: horizontal shape or not for avtb (=0/1) ! ! convection 38 53 54 55 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avt , avs !: vertical eddy diffusivity coef at w-pt [m2/s] 39 56 40 57 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:) :: avmb , avtb !: background profile of avm and avt … … 43 60 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:) :: tfrua, tfrva !: top friction coefficients set in zdfbfr 44 61 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avmu , avmv !: vertical viscosity coef at uw- & vw-pts [m2/s] 45 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avm , avt!: vertical viscosity & diffusivity coef at w-pt [m2/s]62 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avm !: vertical viscosity & diffusivity coef at w-pt [m2/s] 46 63 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avt_k , avm_k ! not enhanced Kz 47 64 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: avmu_k, avmv_k ! not enhanced Kz … … 64 81 & tfrua(jpi, jpj), tfrva(jpi, jpj) , & 65 82 & avmu (jpi,jpj,jpk), avm (jpi,jpj,jpk) , & 66 & avmv (jpi,jpj,jpk), avt (jpi,jpj,jpk) , &83 & avmv (jpi,jpj,jpk), avt (jpi,jpj,jpk) , avs (jpi,jpj,jpk), & 67 84 & avt_k (jpi,jpj,jpk), avm_k (jpi,jpj,jpk) , & 68 85 & avmu_k(jpi,jpj,jpk), avmv_k(jpi,jpj,jpk) , & -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfddm.F90
r7753 r7931 9 9 !! 3.6 ! 2013-04 (G. Madec, F. Roquet) zrau compute locally using interpolation of alpha & beta 10 10 !!---------------------------------------------------------------------- 11 #if defined key_zdfddm 11 12 12 !!---------------------------------------------------------------------- 13 !! 'key_zdfddm' : double diffusion13 !! zdf_ddm : compute the Kz for salinity 14 14 !!---------------------------------------------------------------------- 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 15 USE oce ! ocean dynamics and tracers variables 16 USE dom_oce ! ocean space and time domain variables 17 USE zdf_oce ! ocean vertical physics variables 21 18 USE eosbn2 ! equation of state 22 19 ! 23 USE in_out_manager 24 USE lbclnk 25 USE prtctl 26 USE lib_mpp 27 USE wrk_nemo 28 USE timing 20 USE in_out_manager ! I/O manager 21 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 USE prtctl ! Print control 23 USE lib_mpp ! MPP library 24 USE wrk_nemo ! work arrays 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 … … 51 38 !!---------------------------------------------------------------------- 52 39 CONTAINS 53 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_alloc62 63 40 64 41 SUBROUTINE zdf_ddm( kt ) … … 174 151 & + 0.15 * zrau(ji,jj) * zmskd2(ji,jj) ) 175 152 ! 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 ) 153 avs(ji,jj,jk) = avt(ji,jj,jk) + zavfs + zavds 154 avt(ji,jj,jk) = avt(ji,jj,jk) + zavft + zavdt 155 avm(ji,jj,jk) = avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds ) 184 156 END DO 185 157 END DO … … 221 193 END SUBROUTINE zdf_ddm 222 194 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 195 !!====================================================================== 277 196 END MODULE zdfddm -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90
r7753 r7931 82 82 DO ji = 2, jpi 83 83 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN 84 avt (ji ,jj ,jk) = rn_ avevd * tmask(ji ,jj ,jk)85 avm (ji ,jj ,jk) = rn_ avevd * tmask(ji ,jj ,jk)86 avmu(ji ,jj ,jk) = rn_ avevd * umask(ji ,jj ,jk)87 avmu(ji-1,jj ,jk) = rn_ avevd * umask(ji-1,jj ,jk)88 avmv(ji ,jj ,jk) = rn_ avevd * vmask(ji ,jj ,jk)89 avmv(ji ,jj-1,jk) = rn_ avevd * vmask(ji ,jj-1,jk)84 avt (ji ,jj ,jk) = rn_evd * tmask(ji ,jj ,jk) 85 avm (ji ,jj ,jk) = rn_evd * tmask(ji ,jj ,jk) 86 avmu(ji ,jj ,jk) = rn_evd * umask(ji ,jj ,jk) 87 avmu(ji-1,jj ,jk) = rn_evd * umask(ji-1,jj ,jk) 88 avmv(ji ,jj ,jk) = rn_evd * vmask(ji ,jj ,jk) 89 avmv(ji ,jj-1,jk) = rn_evd * vmask(ji ,jj-1,jk) 90 90 ENDIF 91 91 END DO … … 104 104 DO ji = 1, jpi 105 105 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) & 106 avt(ji,jj,jk) = rn_ avevd * tmask(ji,jj,jk)106 avt(ji,jj,jk) = rn_evd * tmask(ji,jj,jk) 107 107 END DO 108 108 END DO -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfini.F90
r7646 r7931 51 51 INTEGER :: ioptio, ios ! local integers 52 52 !! 53 NAMELIST/namzdf/ rn_avm0, rn_avt0, nn_avb, nn_havtb, ln_zdfexp, nn_zdfexp, & 54 & ln_zdfevd, nn_evdm, rn_avevd, ln_zdfnpc, nn_npc, nn_npcp, & 55 & ln_zdfqiao 53 NAMELIST/namzdf/ ln_zdfcst, ln_zdfric, ln_zdftke, ln_zdfgls, & ! type of closure scheme 54 & ln_zdfevd, nn_evdm, rn_evd , & ! convection : evd 55 & ln_zdfnpc, nn_npc , nn_npcp, & ! convection : npc 56 & ln_zdfddm, rn_avts, rn_hsbfr, & ! double diffusion 57 & ln_zdftmx, & ! tidal mixing 58 & ln_zdfqiao, & ! surface wave-induced mixing 59 & ln_zdfexp, nn_zdfexp, & ! time-stepping 60 & rn_avm0, rn_avt0, nn_avb, nn_havtb ! coefficients 61 62 63 !!org NAMELIST/namzdf/ rn_avm0, rn_avt0, nn_avb, nn_havtb, ln_zdfexp, nn_zdfexp, & 64 !!org & ln_zdfevd, nn_evdm, rn_avevd, ln_zdfnpc, nn_npc, nn_npcp, & 65 !!org & ln_zdfqiao 56 66 !!---------------------------------------------------------------------- 57 67 … … 70 80 WRITE(numout,*) '~~~~~~~~' 71 81 WRITE(numout,*) ' Namelist namzdf : set vertical mixing mixing parameters' 82 WRITE(numout,*) ' vertical closure scheme' 83 WRITE(numout,*) ' constant vertical mixing coefficient ln_zdfcst = ', ln_zdfcst 84 WRITE(numout,*) ' constant vertical mixing coefficient ln_zdfric = ', ln_zdfric 85 WRITE(numout,*) ' constant vertical mixing coefficient ln_zdftke = ', ln_zdftke 86 WRITE(numout,*) ' constant vertical mixing coefficient ln_zdfgls = ', ln_zdfgls 87 WRITE(numout,*) ' convection: ' 88 WRITE(numout,*) ' enhanced vertical diffusion ln_zdfevd = ', ln_zdfevd 89 WRITE(numout,*) ' applied on momentum (=1/0) nn_evdm = ', nn_evdm 90 WRITE(numout,*) ' vertical coefficient for evd rn_evd = ', rn_evd 91 WRITE(numout,*) ' non-penetrative convection (npc) ln_zdfnpc = ', ln_zdfnpc 92 WRITE(numout,*) ' npc call frequency nn_npc = ', nn_npc 93 WRITE(numout,*) ' npc print frequency nn_npcp = ', nn_npcp 94 WRITE(numout,*) ' double diffusive mixing ln_zdfddm = ', ln_zdfddm 95 WRITE(numout,*) ' maximum avs for dd mixing rn_avts = ', rn_avts 96 WRITE(numout,*) ' heat/salt buoyancy flux ratio rn_hsbfr= ', rn_hsbfr 97 WRITE(numout,*) ' surface wave-induced mixing ln_zdfqiao= ', ln_zdfqiao ! surface wave induced mixing 98 WRITE(numout,*) ' tidal mixing ln_zdftmx = ', ln_zdftmx 99 WRITE(numout,*) ' time splitting / backward scheme ln_zdfexp = ', ln_zdfexp 100 WRITE(numout,*) ' number of sub-time step (ln_zdfexp=T) nn_zdfexp = ', nn_zdfexp 101 WRITE(numout,*) ' coefficients : ' 72 102 WRITE(numout,*) ' vertical eddy viscosity rn_avm0 = ', rn_avm0 73 103 WRITE(numout,*) ' vertical eddy diffusivity rn_avt0 = ', rn_avt0 74 104 WRITE(numout,*) ' constant background or profile nn_avb = ', nn_avb 75 105 WRITE(numout,*) ' horizontal variation for avtb nn_havtb = ', nn_havtb 76 WRITE(numout,*) ' time splitting / backward scheme ln_zdfexp = ', ln_zdfexp 77 WRITE(numout,*) ' number of time step nn_zdfexp = ', nn_zdfexp 78 WRITE(numout,*) ' enhanced vertical diffusion ln_zdfevd = ', ln_zdfevd 79 WRITE(numout,*) ' applied on momentum (=1/0) nn_evdm = ', nn_evdm 80 WRITE(numout,*) ' vertical coefficient for evd rn_avevd = ', rn_avevd 81 WRITE(numout,*) ' non-penetrative convection (npc) ln_zdfnpc = ', ln_zdfnpc 82 WRITE(numout,*) ' npc call frequency nn_npc = ', nn_npc 83 WRITE(numout,*) ' npc print frequency nn_npcp = ', nn_npcp 84 WRITE(numout,*) ' Qiao formulation flag ln_zdfqiao=', ln_zdfqiao 85 ENDIF 106 ENDIF 107 108 IF(ln_zdfddm) THEN ! double diffusive mixing' 109 ALLOCATE( avs(jpi,jpj,jpk) ) 110 avs(:,:,:) = rn_avt0 * wmask(:,:,:) 111 ENDIF 112 86 113 87 114 ! !* Parameter & logical controls -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftmx.F90
r7779 r7931 163 163 ! ! ----------------------- ! 164 164 DO jk = 2, jpkm1 !* update momentum & tracer diffusivity with tidal mixing 165 avt(:,:,jk) = av t(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk)165 avt(:,:,jk) = avs(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk) 166 166 avm(:,:,jk) = avm(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk) 167 167 DO jj = 2, jpjm1 … … 591 591 592 592 !! * Substitutions 593 # include "zdfddm_substitute.h90"594 593 # include "vectopt_loop_substitute.h90" 595 594 !!---------------------------------------------------------------------- … … 700 699 emix_tmx(:,:,jk) = zfact(:,:) * ( EXP( ( gde3w_n(:,:,jk ) - zhdep(:,:) ) / hcri_tmx(:,:) ) & 701 700 & - EXP( ( gde3w_n(:,:,jk-1) - zhdep(:,:) ) / hcri_tmx(:,:) ) ) * wmask(:,:,jk) & 701 !!gm delta(gde3w_n) = e3t_n !! Please verify the grid-point position w versus t-point 702 702 & / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) ) 703 703 END DO … … 824 824 IF( kt == nit000 ) THEN !* Control print at first time-step: diagnose the energy consumed by zav_wave 825 825 ztpc = 0._wp 826 !!gm used of glosum 3D.... 826 827 DO jk = 2, jpkm1 827 828 DO jj = 1, jpj … … 860 861 CALL iom_put( "av_ratio", zav_ratio ) 861 862 DO jk = 2, jpkm1 !* update momentum & tracer diffusivity with wave-driven mixing 862 fsavs(:,:,jk) = avt(:,:,jk) + zav_wave(:,:,jk) * zav_ratio(:,:,jk)863 avt 864 avm 863 avs(:,:,jk) = avs(:,:,jk) + zav_wave(:,:,jk) * zav_ratio(:,:,jk) 864 avt(:,:,jk) = avt(:,:,jk) + zav_wave(:,:,jk) 865 avm(:,:,jk) = avm(:,:,jk) + zav_wave(:,:,jk) 865 866 END DO 866 867 ! 867 868 ELSE !* update momentum & tracer diffusivity with wave-driven mixing 868 869 DO jk = 2, jpkm1 869 fsavs(:,:,jk) = avt(:,:,jk) + zav_wave(:,:,jk)870 avt 871 avm 870 avs(:,:,jk) = avs(:,:,jk) + zav_wave(:,:,jk) 871 avt(:,:,jk) = avt(:,:,jk) + zav_wave(:,:,jk) 872 avm(:,:,jk) = avm(:,:,jk) + zav_wave(:,:,jk) 872 873 END DO 873 874 ENDIF … … 976 977 & 'the viscous molecular value & a very small diffusive value, resp.' 977 978 ENDIF 978 979 IF( .NOT.lk_zdfddm ) CALL ctl_stop( 'STOP', 'zdf_tmx_init_new : key_zdftmx_new requires key_zdfddm' ) 980 979 981 980 ! ! allocate tmx arrays 982 981 IF( zdf_tmx_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_tmx_init : unable to allocate tmx arrays' ) -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r7904 r7931 463 463 IF( lk_zdfgls ) CALL zdf_gls_init ! GLS closure scheme 464 464 IF( lk_zdftmx ) CALL zdf_tmx_init ! tidal vertical mixing 465 IF( lk_zdfddm ) CALL zdf_ddm_init ! double diffusive mixing465 !!gm IF( ln_zdfddm ) CALL zdf_ddm_init ! double diffusive mixing 466 466 467 467 ! ! Lateral physics -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/step.F90
r7753 r7931 136 136 IF( lk_zdfcst ) THEN ! Constant Kz (reset avt, avm[uv] to the background value) 137 137 avt (:,:,:) = rn_avt0 * wmask (:,:,:) 138 avm (:,:,:) = rn_avm0 * wmask (:,:,:) 138 139 avmu(:,:,:) = rn_avm0 * wumask(:,:,:) 139 140 avmv(:,:,:) = rn_avm0 * wvmask(:,:,:) 140 141 ENDIF 141 142 ! 142 143 IF( ln_rnf_mouth ) THEN ! increase diffusivity at rivers mouths 143 144 DO jk = 2, nkrnf ; avt(:,:,jk) = avt(:,:,jk) + 2._wp * rn_avt_rnf * rnfmsk(:,:) * tmask(:,:,jk) ; END DO 144 145 ENDIF 146 ! 145 147 IF( ln_zdfevd ) CALL zdf_evd( kstp ) ! enhanced vertical eddy diffusivity 146 148 ! 149 IF( ln_zdfddm ) THEN ! double diffusive mixing 150 CALL zdf_ddm( kstp ) 151 ELSE ! avs=avt 152 DO jk = 2, jpkm1 ; avs(:,:,jk) = avt(:,:,jk) ; END DO 153 ENDIF 154 ! 147 155 IF( lk_zdftmx ) CALL zdf_tmx( kstp ) ! tidal vertical mixing 148 149 IF( lk_zdfddm ) CALL zdf_ddm( kstp ) ! double diffusive mixing150 156 151 157 CALL zdf_mxl( kstp ) ! mixed layer depth -
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/stpctl.F90
r7904 r7931 87 87 ! 88 88 IF( MOD( kt, nwrite ) == 1 .AND. lwp ) THEN 89 WRITE(numout,*) ' ==>> time-step= ',kt,' |U| max: ', zmax(1), ' SSS min:', - zmax(2) 89 WRITE(numout,*) ' ==>> time-step= ', kt, ' |ssh| max: ', zmax(1), ' |U| max: ', zmax(2), & 90 & ' SSS min: ' , - zmax(3) 90 91 ENDIF 91 92 !
Note: See TracChangeset
for help on using the changeset viewer.