- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r4522 r6225 4 4 !! Ocean physics: lateral diffusivity trends 5 5 !!===================================================================== 6 !! History : 9.0 ! 05-11 (G. Madec) Original code (new step architecture) 6 !! History : 2.0 ! 2005-11 (G. Madec) Original code (new step architecture) 7 !! 3.7 ! 2014-01 (F. Lemarie, G. Madec) restructuration/simplification of ahm specification, 8 !! ! add velocity dependent coefficient and optional read in file 7 9 !!---------------------------------------------------------------------- 8 10 … … 14 16 USE dom_oce ! ocean space and time domain 15 17 USE phycst ! physical constants 16 USE ldfdyn_oce ! ocean dynamics lateral physics 17 USE ldfslp ! lateral mixing: slopes of mixing orientation 18 USE dynldf_bilapg ! lateral mixing (dyn_ldf_bilapg routine) 19 USE dynldf_bilap ! lateral mixing (dyn_ldf_bilap routine) 20 USE dynldf_iso ! lateral mixing (dyn_ldf_iso routine) 21 USE dynldf_lap ! lateral mixing (dyn_ldf_lap routine) 22 USE ldftra_oce, ONLY: ln_traldf_hor ! ocean tracers lateral physics 23 USE trdmod ! ocean dynamics and tracer trends 24 USE trdmod_oce ! ocean variables trends 18 USE ldfdyn ! lateral diffusion: eddy viscosity coef. 19 USE ldfslp ! lateral diffusion: slopes of mixing orientation 20 USE dynldf_lap_blp ! lateral mixing (dyn_ldf_lap & dyn_ldf_blp routines) 21 USE dynldf_iso ! lateral mixing (dyn_ldf_iso routine ) 22 USE trd_oce ! trends: ocean variables 23 USE trddyn ! trend manager: dynamics (trd_dyn routine) 24 ! 25 25 USE prtctl ! Print control 26 26 USE in_out_manager ! I/O manager 27 27 USE lib_mpp ! distribued memory computing library 28 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 USE wrk_nemo ! Memory Allocation 30 USE timing ! Timing 31 29 USE wrk_nemo ! Memory Allocation 30 USE timing ! Timing 32 31 33 32 IMPLICIT NONE … … 37 36 PUBLIC dyn_ldf_init ! called by opa module 38 37 39 INTEGER :: nldf = -2 ! type of lateral diffusion used defined from ln_dynldf_... namlist logicals) 38 ! ! Parameter to control the type of lateral viscous operator 39 INTEGER, PARAMETER, PUBLIC :: np_ERROR =-10 ! error in setting the operator 40 INTEGER, PARAMETER, PUBLIC :: np_no_ldf = 00 ! without operator (i.e. no lateral viscous trend) 41 ! !! laplacian ! bilaplacian ! 42 INTEGER, PARAMETER, PUBLIC :: np_lap = 10 , np_blp = 20 ! iso-level operator 43 INTEGER, PARAMETER, PUBLIC :: np_lap_i = 11 ! iso-neutral or geopotential operator 44 45 INTEGER :: nldf ! type of lateral diffusion used defined from ln_dynldf_... (namlist logicals) 40 46 41 47 !! * Substitutions 42 # include "domzgr_substitute.h90"43 48 # include "vectopt_loop_substitute.h90" 44 49 !!---------------------------------------------------------------------- 45 !! NEMO/OPA 3. 3 , NEMO Consortium (2010)50 !! NEMO/OPA 3.7 , NEMO Consortium (2015) 46 51 !! $Id$ 47 52 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 55 60 !! ** Purpose : compute the lateral ocean dynamics physics. 56 61 !!---------------------------------------------------------------------- 57 !58 62 INTEGER, INTENT(in) :: kt ! ocean time-step index 59 63 ! … … 63 67 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf') 64 68 ! 65 IF( l_trddyn ) THEN ! temporary save of ta and satrends66 CALL wrk_alloc( jpi, jpj, jpk,ztrdu, ztrdv )69 IF( l_trddyn ) THEN ! temporary save of momentum trends 70 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 67 71 ztrdu(:,:,:) = ua(:,:,:) 68 72 ztrdv(:,:,:) = va(:,:,:) … … 71 75 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend 72 76 ! 73 CASE ( 0 ) ; CALL dyn_ldf_lap ( kt ) ! iso-level laplacian 74 CASE ( 1 ) ; CALL dyn_ldf_iso ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 75 CASE ( 2 ) ; CALL dyn_ldf_bilap ( kt ) ! iso-level bilaplacian 76 CASE ( 3 ) ; CALL dyn_ldf_bilapg ( kt ) ! s-coord. horizontal bilaplacian 77 CASE ( 4 ) ! iso-level laplacian + bilaplacian 78 CALL dyn_ldf_lap ( kt ) 79 CALL dyn_ldf_bilap ( kt ) 80 CASE ( 5 ) ! rotated laplacian + bilaplacian (s-coord) 81 CALL dyn_ldf_iso ( kt ) 82 CALL dyn_ldf_bilapg ( kt ) 77 CASE ( np_lap ) ; CALL dyn_ldf_lap ( kt, ub, vb, ua, va, 1 ) ! iso-level laplacian 78 CASE ( np_lap_i ) ; CALL dyn_ldf_iso ( kt ) ! rotated laplacian 79 CASE ( np_blp ) ; CALL dyn_ldf_blp ( kt, ub, vb, ua, va ) ! iso-level bi-laplacian 83 80 ! 84 CASE ( -1 ) ! esopa: test all possibility with control print85 CALL dyn_ldf_lap ( kt )86 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask, &87 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )88 CALL dyn_ldf_iso ( kt )89 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask, &90 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )91 CALL dyn_ldf_bilap ( kt )92 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask, &93 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )94 CALL dyn_ldf_bilapg ( kt )95 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask, &96 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )97 !98 CASE ( -2 ) ! neither laplacian nor bilaplacian schemes used99 IF( kt == nit000 ) THEN100 IF(lwp) WRITE(numout,*)101 IF(lwp) WRITE(numout,*) 'dyn_ldf : no lateral diffusion on momentum setup'102 IF(lwp) WRITE(numout,*) '~~~~~~~ '103 ENDIF104 81 END SELECT 105 82 … … 107 84 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 108 85 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 109 CALL trd_ mod( ztrdu, ztrdv, jpdyn_trd_ldf, 'DYN', kt )110 CALL wrk_dealloc( jpi, jpj, jpk,ztrdu, ztrdv )86 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 87 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 111 88 ENDIF 112 89 ! ! print sum trends (used for debugging) … … 127 104 INTEGER :: ioptio, ierr ! temporary integers 128 105 !!---------------------------------------------------------------------- 129 106 ! 130 107 ! ! Namelist nam_dynldf: already read in ldfdyn module 131 108 ! 132 109 IF(lwp) THEN ! Namelist print 133 110 WRITE(numout,*) … … 135 112 WRITE(numout,*) '~~~~~~~~~~~' 136 113 WRITE(numout,*) ' Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 137 WRITE(numout,*) ' laplacian operator ln_dynldf_lap 138 WRITE(numout,*) ' bilaplacian operator ln_dynldf_b ilap = ', ln_dynldf_bilap139 WRITE(numout,*) ' iso-level ln_dynldf_lev el = ', ln_dynldf_level140 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor 141 WRITE(numout,*) ' iso-neutral ln_dynldf_iso 114 WRITE(numout,*) ' laplacian operator ln_dynldf_lap = ', ln_dynldf_lap 115 WRITE(numout,*) ' bilaplacian operator ln_dynldf_blp = ', ln_dynldf_blp 116 WRITE(numout,*) ' iso-level ln_dynldf_lev = ', ln_dynldf_lev 117 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor = ', ln_dynldf_hor 118 WRITE(numout,*) ' iso-neutral ln_dynldf_iso = ', ln_dynldf_iso 142 119 ENDIF 143 144 ! ! control the consistency120 ! ! use of lateral operator or not 121 nldf = np_ERROR 145 122 ioptio = 0 146 IF( ln_dynldf_lap ) ioptio = ioptio + 1 147 IF( ln_dynldf_bilap ) ioptio = ioptio + 1 148 IF( ioptio < 1 ) CALL ctl_warn( ' neither laplacian nor bilaplacian operator set for dynamics' ) 149 ioptio = 0 150 IF( ln_dynldf_level ) ioptio = ioptio + 1 151 IF( ln_dynldf_hor ) ioptio = ioptio + 1 152 IF( ln_dynldf_iso ) ioptio = ioptio + 1 153 IF( ioptio > 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 154 155 IF( ln_dynldf_iso .AND. ln_traldf_hor ) CALL ctl_stop & 156 & ( 'Not sensible to use geopotential diffusion for tracers with isoneutral diffusion for dynamics' ) 157 158 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 159 ierr = 0 160 IF ( ln_dynldf_lap ) THEN ! laplacian operator 161 IF ( ln_zco ) THEN ! z-coordinate 162 IF ( ln_dynldf_level ) nldf = 0 ! iso-level (no rotation) 163 IF ( ln_dynldf_hor ) nldf = 0 ! horizontal (no rotation) 164 IF ( ln_dynldf_iso ) nldf = 1 ! isoneutral ( rotation) 123 IF( ln_dynldf_lap ) ioptio = ioptio + 1 124 IF( ln_dynldf_blp ) ioptio = ioptio + 1 125 IF( ioptio > 1 ) CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' ) 126 IF( ioptio == 0 ) nldf = np_no_ldf ! No lateral mixing operator 127 ! 128 IF( nldf /= np_no_ldf ) THEN ! direction ==>> type of operator 129 ioptio = 0 130 IF( ln_dynldf_lev ) ioptio = ioptio + 1 131 IF( ln_dynldf_hor ) ioptio = ioptio + 1 132 IF( ln_dynldf_iso ) ioptio = ioptio + 1 133 IF( ioptio > 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 134 IF( ioptio == 0 ) CALL ctl_stop( ' use at least ONE direction (level/hor/iso)' ) 135 ! 136 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 137 ierr = 0 138 IF ( ln_dynldf_lap ) THEN ! laplacian operator 139 IF ( ln_zco ) THEN ! z-coordinate 140 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 141 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level = horizontal (no rotation) 142 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 143 ENDIF 144 IF ( ln_zps ) THEN ! z-coordinate with partial step 145 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level (no rotation) 146 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level (no rotation) 147 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 148 ENDIF 149 IF ( ln_sco ) THEN ! s-coordinate 150 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 151 IF ( ln_dynldf_hor ) nldf = np_lap_i ! horizontal ( rotation) 152 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 153 ENDIF 165 154 ENDIF 166 IF ( ln_zps ) THEN ! z-coordinate 167 IF ( ln_dynldf_level ) ierr = 1 ! iso-level not allowed 168 IF ( ln_dynldf_hor ) nldf = 0 ! horizontal (no rotation) 169 IF ( ln_dynldf_iso ) nldf = 1 ! isoneutral ( rotation) 155 ! 156 IF( ln_dynldf_blp ) THEN ! bilaplacian operator 157 IF ( ln_zco ) THEN ! z-coordinate 158 IF ( ln_dynldf_lev ) nldf = np_blp ! iso-level = horizontal (no rotation) 159 IF ( ln_dynldf_hor ) nldf = np_blp ! iso-level = horizontal (no rotation) 160 IF ( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 161 ENDIF 162 IF ( ln_zps ) THEN ! z-coordinate with partial step 163 IF ( ln_dynldf_lev ) nldf = np_blp ! iso-level (no rotation) 164 IF ( ln_dynldf_hor ) nldf = np_blp ! iso-level (no rotation) 165 IF ( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 166 ENDIF 167 IF ( ln_sco ) THEN ! s-coordinate 168 IF ( ln_dynldf_lev ) nldf = np_blp ! iso-level (no rotation) 169 IF ( ln_dynldf_hor ) ierr = 2 ! horizontal ( rotation) 170 IF ( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 171 ENDIF 170 172 ENDIF 171 IF ( ln_sco ) THEN ! s-coordinate 172 IF ( ln_dynldf_level ) nldf = 0 ! iso-level (no rotation) 173 IF ( ln_dynldf_hor ) nldf = 1 ! horizontal ( rotation) 174 IF ( ln_dynldf_iso ) nldf = 1 ! isoneutral ( rotation) 175 ENDIF 176 ENDIF 177 178 IF( ln_dynldf_bilap ) THEN ! bilaplacian operator 179 IF ( ln_zco ) THEN ! z-coordinate 180 IF ( ln_dynldf_level ) nldf = 2 ! iso-level (no rotation) 181 IF ( ln_dynldf_hor ) nldf = 2 ! horizontal (no rotation) 182 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 183 ENDIF 184 IF ( ln_zps ) THEN ! z-coordinate 185 IF ( ln_dynldf_level ) ierr = 1 ! iso-level not allowed 186 IF ( ln_dynldf_hor ) nldf = 2 ! horizontal (no rotation) 187 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 188 ENDIF 189 IF ( ln_sco ) THEN ! s-coordinate 190 IF ( ln_dynldf_level ) nldf = 2 ! iso-level (no rotation) 191 IF ( ln_dynldf_hor ) nldf = 3 ! horizontal ( rotation) 192 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 193 ENDIF 194 ENDIF 195 196 IF( ln_dynldf_lap .AND. ln_dynldf_bilap ) THEN ! mixed laplacian and bilaplacian operators 197 IF ( ln_zco ) THEN ! z-coordinate 198 IF ( ln_dynldf_level ) nldf = 4 ! iso-level (no rotation) 199 IF ( ln_dynldf_hor ) nldf = 4 ! horizontal (no rotation) 200 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 201 ENDIF 202 IF ( ln_zps ) THEN ! z-coordinate 203 IF ( ln_dynldf_level ) ierr = 1 ! iso-level not allowed 204 IF ( ln_dynldf_hor ) nldf = 4 ! horizontal (no rotation) 205 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 206 ENDIF 207 IF ( ln_sco ) THEN ! s-coordinate 208 IF ( ln_dynldf_level ) nldf = 4 ! iso-level (no rotation) 209 IF ( ln_dynldf_hor ) nldf = 5 ! horizontal ( rotation) 210 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 211 ENDIF 212 ENDIF 213 214 IF( lk_esopa ) nldf = -1 ! esopa test 215 216 IF( ierr == 1 ) CALL ctl_stop( 'iso-level in z-coordinate - partial step, not allowed' ) 217 IF( ierr == 2 ) CALL ctl_stop( 'isoneutral bilaplacian operator does not exist' ) 218 IF( nldf == 1 .OR. nldf == 3 ) THEN ! rotation 219 IF( .NOT.lk_ldfslp ) CALL ctl_stop( 'the rotation of the diffusive tensor require key_ldfslp' ) 173 ! 174 IF( ierr == 2 ) CALL ctl_stop( 'rotated bi-laplacian operator does not exist' ) 175 ! 176 IF( nldf == np_lap_i ) l_ldfslp = .TRUE. ! rotation require the computation of the slopes 177 ! 220 178 ENDIF 221 179 222 180 IF(lwp) THEN 223 181 WRITE(numout,*) 224 IF( nldf == -2 ) WRITE(numout,*) ' neither laplacian nor bilaplacian schemes used' 225 IF( nldf == -1 ) WRITE(numout,*) ' ESOPA test All scheme used' 226 IF( nldf == 0 ) WRITE(numout,*) ' laplacian operator' 227 IF( nldf == 1 ) WRITE(numout,*) ' rotated laplacian operator' 228 IF( nldf == 2 ) WRITE(numout,*) ' bilaplacian operator' 229 IF( nldf == 3 ) WRITE(numout,*) ' rotated bilaplacian' 230 IF( nldf == 4 ) WRITE(numout,*) ' laplacian and bilaplacian operators' 231 IF( nldf == 5 ) WRITE(numout,*) ' rotated laplacian and bilaplacian operators' 182 IF( nldf == np_no_ldf ) WRITE(numout,*) ' NO lateral viscosity' 183 IF( nldf == np_lap ) WRITE(numout,*) ' iso-level laplacian operator' 184 IF( nldf == np_lap_i ) WRITE(numout,*) ' rotated laplacian operator with iso-level background' 185 IF( nldf == np_blp ) WRITE(numout,*) ' iso-level bi-laplacian operator' 232 186 ENDIF 233 187 !
Note: See TracChangeset
for help on using the changeset viewer.