- Timestamp:
- 2016-07-19T10:38:35+02:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90
r5385 r6808 9 9 10 10 !!---------------------------------------------------------------------- 11 !! tra_zdf : Update the tracer trend with the vertical diffusion12 !! tra_zdf_init : initialisation of the computation11 !! tra_zdf : Update the tracer trend with the vertical diffusion 12 !! tra_zdf_init : initialisation of the computation 13 13 !!---------------------------------------------------------------------- 14 USE oce 15 USE dom_oce 16 USE domvvl 17 USE phycst 18 USE zdf_oce 19 USE sbc_oce 20 USE dynspg_oce21 USE trazdf_exp ! vertical diffusion: explicit (tra_zdf_exp routine)22 USE trazdf_ imp ! vertical diffusion: implicit (tra_zdf_improutine)23 USE ldftra_oce ! ocean active tracers: lateral physics24 USE trd_oce 25 USE trdtra ! trends manager: tracers14 USE oce ! ocean dynamics and tracers variables 15 USE dom_oce ! ocean space and time domain variables 16 USE domvvl ! variable volume 17 USE phycst ! physical constant 18 USE zdf_oce ! ocean vertical physics variables 19 USE sbc_oce ! surface boundary condition: ocean 20 USE ldftra ! lateral diffusion: eddy diffusivity 21 USE ldfslp ! lateral diffusion: iso-neutral slope 22 USE trazdf_exp ! vertical diffusion: explicit (tra_zdf_exp routine) 23 USE trazdf_imp ! vertical diffusion: implicit (tra_zdf_imp routine) 24 USE trd_oce ! trends: ocean variables 25 USE trdtra ! trends: tracer trend manager 26 26 ! 27 USE in_out_manager 28 USE prtctl 29 USE lbclnk 30 USE lib_mpp 31 USE wrk_nemo 32 USE timing 27 USE in_out_manager ! I/O manager 28 USE prtctl ! Print control 29 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 USE lib_mpp ! MPP library 31 USE wrk_nemo ! Memory allocation 32 USE timing ! Timing 33 33 34 34 IMPLICIT NONE … … 41 41 42 42 !! * Substitutions 43 # include "domzgr_substitute.h90"44 43 # include "zdfddm_substitute.h90" 45 44 # include "vectopt_loop_substitute.h90" 46 45 !!---------------------------------------------------------------------- 47 !! NEMO/OPA 3.7 , NEMO Consortium (201 4)46 !! NEMO/OPA 3.7 , NEMO Consortium (2015) 48 47 !! $Id$ 49 48 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 58 57 !!--------------------------------------------------------------------- 59 58 INTEGER, INTENT( in ) :: kt ! ocean time-step index 60 ! !59 ! 61 60 INTEGER :: jk ! Dummy loop indices 62 61 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdt, ztrds ! 3D workspace … … 66 65 ! 67 66 IF( neuler == 0 .AND. kt == nit000 ) THEN ! at nit000 68 r2dt ra(:) = rdttra(:) ! = rdtra(restarting with Euler time stepping)67 r2dt = rdt ! = rdt (restarting with Euler time stepping) 69 68 ELSEIF( kt <= nit000 + 1) THEN ! at nit000 or nit000+1 70 r2dt ra(:) = 2. * rdttra(:) ! = 2 rdttra(leapfrog)69 r2dt = 2. * rdt ! = 2 rdt (leapfrog) 71 70 ENDIF 72 71 ! 73 72 IF( l_trdtra ) THEN !* Save ta and sa trends 74 73 CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) … … 76 75 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 77 76 ENDIF 78 77 ! 79 78 SELECT CASE ( nzdf ) ! compute lateral mixing trend and add it to the general trend 80 CASE ( 0 ) ; CALL tra_zdf_exp( kt, nit000, 'TRA', r2dtra, nn_zdfexp, tsb, tsa, jpts ) ! explicit scheme 81 CASE ( 1 ) ; CALL tra_zdf_imp( kt, nit000, 'TRA', r2dtra, tsb, tsa, jpts ) ! implicit scheme 82 CASE ( -1 ) ! esopa: test all possibility with control print 83 CALL tra_zdf_exp( kt, nit000, 'TRA', r2dtra, nn_zdfexp, tsb, tsa, jpts ) 84 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' zdf0 - Ta: ', mask1=tmask, & 85 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 86 CALL tra_zdf_imp( kt, nit000, 'TRA', r2dtra, tsb, tsa, jpts ) 87 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' zdf1 - Ta: ', mask1=tmask, & 88 & tab3d_2=tsa(:,:,:,jp_sal), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 79 CASE ( 0 ) ; CALL tra_zdf_exp( kt, nit000, 'TRA', r2dt, nn_zdfexp, tsb, tsa, jpts ) ! explicit scheme 80 CASE ( 1 ) ; CALL tra_zdf_imp( kt, nit000, 'TRA', r2dt, tsb, tsa, jpts ) ! implicit scheme 89 81 END SELECT 82 !!gm WHY here ! and I don't like that ! 90 83 ! DRAKKAR SSS control { 91 84 ! JMM avoid negative salinities near river outlet ! Ugly fix 92 85 ! JMM : restore negative salinities to small salinities: 93 WHERE ( tsa(:,:,:,jp_sal) < 0._wp ) tsa(:,:,:,jp_sal) = 0.1_wp 86 WHERE( tsa(:,:,:,jp_sal) < 0._wp ) tsa(:,:,:,jp_sal) = 0.1_wp 87 !!gm 94 88 95 89 IF( l_trdtra ) THEN ! save the vertical diffusive trends for further diagnostics 96 90 DO jk = 1, jpkm1 97 ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / r2dt ra(jk)) - ztrdt(:,:,jk)98 ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / r2dt ra(jk)) - ztrds(:,:,jk)91 ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / r2dt ) - ztrdt(:,:,jk) 92 ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / r2dt ) - ztrds(:,:,jk) 99 93 END DO 94 !!gm this should be moved in trdtra.F90 and done on all trends 100 95 CALL lbc_lnk( ztrdt, 'T', 1. ) 101 96 CALL lbc_lnk( ztrds, 'T', 1. ) 97 !!gm 102 98 CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdf, ztrdt ) 103 99 CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdf, ztrds ) 104 100 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 105 101 ENDIF 106 107 102 ! ! print mean trends (used for debugging) 108 103 IF(ln_ctl) CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' zdf - Ta: ', mask1=tmask, & … … 123 118 !! nzdf = 0 explicit (time-splitting) scheme (ln_zdfexp=T) 124 119 !! = 1 implicit (euler backward) scheme (ln_zdfexp=F) 125 !! NB: rotation of lateral mixing operator or TKE or KPP scheme,126 !! theimplicit scheme is required.120 !! NB: rotation of lateral mixing operator or TKE & GLS schemes, 121 !! an implicit scheme is required. 127 122 !!---------------------------------------------------------------------- 128 123 USE zdftke 129 124 USE zdfgls 130 USE zdfkpp131 125 !!---------------------------------------------------------------------- 132 126 ! 133 127 ! Choice from ln_zdfexp already read in namelist in zdfini module 134 128 IF( ln_zdfexp ) THEN ; nzdf = 0 ! use explicit scheme 135 129 ELSE ; nzdf = 1 ! use implicit scheme 136 130 ENDIF 137 131 ! 138 132 ! Force implicit schemes 139 IF( lk_zdftke .OR. lk_zdfgls .OR. lk_zdfkpp ) nzdf = 1 ! TKE, GLS or KPPphysics140 IF( ln_traldf_iso ) nzdf = 1! iso-neutral lateral physics141 IF( ln_traldf_hor .AND. ln_sco ) nzdf = 1! horizontal lateral physics in s-coordinate133 IF( lk_zdftke .OR. lk_zdfgls ) nzdf = 1 ! TKE, or GLS physics 134 IF( ln_traldf_iso ) nzdf = 1 ! iso-neutral lateral physics 135 IF( ln_traldf_hor .AND. ln_sco ) nzdf = 1 ! horizontal lateral physics in s-coordinate 142 136 IF( ln_zdfexp .AND. nzdf == 1 ) CALL ctl_stop( 'tra_zdf : If using the rotation of lateral mixing operator', & 143 & ' TKE or KPP scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 144 145 ! Test: esopa 146 IF( lk_esopa ) nzdf = -1 ! All schemes used 147 137 & ' GLS or TKE scheme, the implicit scheme is required, set ln_zdfexp = .false.' ) 138 ! 148 139 IF(lwp) THEN 149 140 WRITE(numout,*) 150 141 WRITE(numout,*) 'tra_zdf_init : vertical tracer physics scheme' 151 142 WRITE(numout,*) '~~~~~~~~~~~' 152 IF( nzdf == -1 ) WRITE(numout,*) ' ESOPA test All scheme used'153 143 IF( nzdf == 0 ) WRITE(numout,*) ' Explicit time-splitting scheme' 154 144 IF( nzdf == 1 ) WRITE(numout,*) ' Implicit (euler backward) scheme'
Note: See TracChangeset
for help on using the changeset viewer.