Changeset 5951 for branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
- Timestamp:
- 2015-11-30T12:48:01+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r5950 r5951 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 ldftra_oce ! ocean tracers lateral physics 18 USE ldfslp ! lateral mixing: slopes of mixing orientation 19 USE dynldf_bilapg ! lateral mixing (dyn_ldf_bilapg routine) 20 USE dynldf_bilap ! lateral mixing (dyn_ldf_bilap routine) 21 USE dynldf_iso ! lateral mixing (dyn_ldf_iso routine) 22 USE dynldf_lap ! lateral mixing (dyn_ldf_lap routine) 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 ) 23 22 USE trd_oce ! trends: ocean variables 24 USE trddyn ! trend manager: dynamics (trd_dyn 23 USE trddyn ! trend manager: dynamics (trd_dyn routine) 25 24 ! 26 25 USE prtctl ! Print control … … 28 27 USE lib_mpp ! distribued memory computing library 29 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 USE wrk_nemo 31 USE timing 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 ! ! Flag 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 … … 43 49 # include "vectopt_loop_substitute.h90" 44 50 !!---------------------------------------------------------------------- 45 !! NEMO/OPA 3. 3 , NEMO Consortium (2010)51 !! NEMO/OPA 3.7 , NEMO Consortium (2015) 46 52 !! $Id$ 47 53 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 62 68 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf') 63 69 ! 64 IF( l_trddyn ) THEN ! temporary save of ta and satrends65 CALL wrk_alloc( jpi, jpj, jpk,ztrdu, ztrdv )70 IF( l_trddyn ) THEN ! temporary save of momentum trends 71 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 66 72 ztrdu(:,:,:) = ua(:,:,:) 67 73 ztrdv(:,:,:) = va(:,:,:) … … 70 76 SELECT CASE ( nldf ) ! compute lateral mixing trend and add it to the general trend 71 77 ! 72 CASE ( 0 ) ; CALL dyn_ldf_lap ( kt ) ! iso-level laplacian 73 CASE ( 1 ) ; CALL dyn_ldf_iso ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 74 CASE ( 2 ) ; CALL dyn_ldf_bilap ( kt ) ! iso-level bilaplacian 75 CASE ( 3 ) ; CALL dyn_ldf_bilapg ( kt ) ! s-coord. horizontal bilaplacian 76 CASE ( 4 ) ! iso-level laplacian + bilaplacian 77 CALL dyn_ldf_lap ( kt ) 78 CALL dyn_ldf_bilap ( kt ) 79 CASE ( 5 ) ! rotated laplacian + bilaplacian (s-coord) 80 CALL dyn_ldf_iso ( kt ) 81 CALL dyn_ldf_bilapg ( kt ) 78 CASE ( np_lap ) ; CALL dyn_ldf_lap ( kt, ub, vb, ua, va, 1 ) ! iso-level laplacian 79 CASE ( np_lap_i ) ; CALL dyn_ldf_iso ( kt ) ! rotated laplacian 80 CASE ( np_blp ) ; CALL dyn_ldf_blp ( kt, ub, vb, ua, va ) ! iso-level bi-laplacian 82 81 ! 83 CASE ( -1 ) ! esopa: test all possibility with control print84 CALL dyn_ldf_lap ( kt )85 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask, &86 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )87 CALL dyn_ldf_iso ( kt )88 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask, &89 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )90 CALL dyn_ldf_bilap ( kt )91 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask, &92 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )93 CALL dyn_ldf_bilapg ( kt )94 CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask, &95 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )96 !97 CASE ( -2 ) ! neither laplacian nor bilaplacian schemes used98 IF( kt == nit000 ) THEN99 IF(lwp) WRITE(numout,*)100 IF(lwp) WRITE(numout,*) 'dyn_ldf : no lateral diffusion on momentum setup'101 IF(lwp) WRITE(numout,*) '~~~~~~~ '102 ENDIF103 82 END SELECT 104 83 … … 107 86 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 108 87 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 109 CALL wrk_dealloc( jpi, jpj, jpk,ztrdu, ztrdv )88 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 110 89 ENDIF 111 90 ! ! print sum trends (used for debugging) … … 126 105 INTEGER :: ioptio, ierr ! temporary integers 127 106 !!---------------------------------------------------------------------- 128 107 ! 129 108 ! ! Namelist nam_dynldf: already read in ldfdyn module 130 109 ! 131 110 IF(lwp) THEN ! Namelist print 132 111 WRITE(numout,*) … … 134 113 WRITE(numout,*) '~~~~~~~~~~~' 135 114 WRITE(numout,*) ' Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 136 WRITE(numout,*) ' laplacian operator ln_dynldf_lap 137 WRITE(numout,*) ' bilaplacian operator ln_dynldf_b ilap = ', ln_dynldf_bilap138 WRITE(numout,*) ' iso-level ln_dynldf_lev el = ', ln_dynldf_level139 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor 140 WRITE(numout,*) ' iso-neutral ln_dynldf_iso 115 WRITE(numout,*) ' laplacian operator ln_dynldf_lap = ', ln_dynldf_lap 116 WRITE(numout,*) ' bilaplacian operator ln_dynldf_blp = ', ln_dynldf_blp 117 WRITE(numout,*) ' iso-level ln_dynldf_lev = ', ln_dynldf_lev 118 WRITE(numout,*) ' horizontal (geopotential) ln_dynldf_hor = ', ln_dynldf_hor 119 WRITE(numout,*) ' iso-neutral ln_dynldf_iso = ', ln_dynldf_iso 141 120 ENDIF 142 143 ! ! control the consistency121 ! ! use of lateral operator or not 122 nldf = np_ERROR 144 123 ioptio = 0 145 IF( ln_dynldf_lap ) ioptio = ioptio + 1 146 IF( ln_dynldf_bilap ) ioptio = ioptio + 1 147 IF( ioptio < 1 ) CALL ctl_warn( ' neither laplacian nor bilaplacian operator set for dynamics' ) 148 ioptio = 0 149 IF( ln_dynldf_level ) ioptio = ioptio + 1 150 IF( ln_dynldf_hor ) ioptio = ioptio + 1 151 IF( ln_dynldf_iso ) ioptio = ioptio + 1 152 IF( ioptio > 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 153 154 IF( ln_dynldf_iso .AND. ln_traldf_hor ) CALL ctl_stop & 155 & ( 'Not sensible to use geopotential diffusion for tracers with isoneutral diffusion for dynamics' ) 156 157 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 158 ierr = 0 159 IF ( ln_dynldf_lap ) THEN ! laplacian operator 160 IF ( ln_zco ) THEN ! z-coordinate 161 IF ( ln_dynldf_level ) nldf = 0 ! iso-level (no rotation) 162 IF ( ln_dynldf_hor ) nldf = 0 ! horizontal (no rotation) 163 IF ( ln_dynldf_iso ) nldf = 1 ! isoneutral ( rotation) 124 IF( ln_dynldf_lap ) ioptio = ioptio + 1 125 IF( ln_dynldf_blp ) ioptio = ioptio + 1 126 IF( ioptio > 1 ) CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' ) 127 IF( ioptio == 0 ) nldf = np_no_ldf ! No lateral mixing operator 128 ! 129 IF( nldf /= np_no_ldf ) THEN ! direction ==>> type of operator 130 ioptio = 0 131 IF( ln_dynldf_lev ) ioptio = ioptio + 1 132 IF( ln_dynldf_hor ) ioptio = ioptio + 1 133 IF( ln_dynldf_iso ) ioptio = ioptio + 1 134 IF( ioptio > 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 135 IF( ioptio == 0 ) CALL ctl_stop( ' use at least ONE direction (level/hor/iso)' ) 136 ! 137 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 138 ierr = 0 139 IF ( ln_dynldf_lap ) THEN ! laplacian operator 140 IF ( ln_zco ) THEN ! z-coordinate 141 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 142 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level = horizontal (no rotation) 143 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 144 ENDIF 145 IF ( ln_zps ) THEN ! z-coordinate with partial step 146 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level (no rotation) 147 IF ( ln_dynldf_hor ) nldf = np_lap ! iso-level (no rotation) 148 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 149 ENDIF 150 IF ( ln_sco ) THEN ! s-coordinate 151 IF ( ln_dynldf_lev ) nldf = np_lap ! iso-level = horizontal (no rotation) 152 IF ( ln_dynldf_hor ) nldf = np_lap_i ! horizontal ( rotation) 153 IF ( ln_dynldf_iso ) nldf = np_lap_i ! iso-neutral ( rotation) 154 ENDIF 164 155 ENDIF 165 IF ( ln_zps ) THEN ! z-coordinate 166 IF ( ln_dynldf_level ) ierr = 1 ! iso-level not allowed 167 IF ( ln_dynldf_hor ) nldf = 0 ! horizontal (no rotation) 168 IF ( ln_dynldf_iso ) nldf = 1 ! isoneutral ( rotation) 156 ! 157 IF( ln_dynldf_blp ) THEN ! bilaplacian operator 158 IF ( ln_zco ) THEN ! z-coordinate 159 IF ( ln_dynldf_lev ) nldf = np_blp ! iso-level = horizontal (no rotation) 160 IF ( ln_dynldf_hor ) nldf = np_blp ! iso-level = horizontal (no rotation) 161 IF ( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 162 ENDIF 163 IF ( ln_zps ) THEN ! z-coordinate with partial step 164 IF ( ln_dynldf_lev ) nldf = np_blp ! iso-level (no rotation) 165 IF ( ln_dynldf_hor ) nldf = np_blp ! iso-level (no rotation) 166 IF ( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 167 ENDIF 168 IF ( ln_sco ) THEN ! s-coordinate 169 IF ( ln_dynldf_lev ) nldf = np_blp ! iso-level (no rotation) 170 IF ( ln_dynldf_hor ) ierr = 2 ! horizontal ( rotation) 171 IF ( ln_dynldf_iso ) ierr = 2 ! iso-neutral ( rotation) 172 ENDIF 169 173 ENDIF 170 IF ( ln_sco ) THEN ! s-coordinate 171 IF ( ln_dynldf_level ) nldf = 0 ! iso-level (no rotation) 172 IF ( ln_dynldf_hor ) nldf = 1 ! horizontal ( rotation) 173 IF ( ln_dynldf_iso ) nldf = 1 ! isoneutral ( rotation) 174 ENDIF 175 ENDIF 176 177 IF( ln_dynldf_bilap ) THEN ! bilaplacian operator 178 IF ( ln_zco ) THEN ! z-coordinate 179 IF ( ln_dynldf_level ) nldf = 2 ! iso-level (no rotation) 180 IF ( ln_dynldf_hor ) nldf = 2 ! horizontal (no rotation) 181 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 182 ENDIF 183 IF ( ln_zps ) THEN ! z-coordinate 184 IF ( ln_dynldf_level ) ierr = 1 ! iso-level not allowed 185 IF ( ln_dynldf_hor ) nldf = 2 ! horizontal (no rotation) 186 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 187 ENDIF 188 IF ( ln_sco ) THEN ! s-coordinate 189 IF ( ln_dynldf_level ) nldf = 2 ! iso-level (no rotation) 190 IF ( ln_dynldf_hor ) nldf = 3 ! horizontal ( rotation) 191 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 192 ENDIF 193 ENDIF 194 195 IF( ln_dynldf_lap .AND. ln_dynldf_bilap ) THEN ! mixed laplacian and bilaplacian operators 196 IF ( ln_zco ) THEN ! z-coordinate 197 IF ( ln_dynldf_level ) nldf = 4 ! iso-level (no rotation) 198 IF ( ln_dynldf_hor ) nldf = 4 ! horizontal (no rotation) 199 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 200 ENDIF 201 IF ( ln_zps ) THEN ! z-coordinate 202 IF ( ln_dynldf_level ) ierr = 1 ! iso-level not allowed 203 IF ( ln_dynldf_hor ) nldf = 4 ! horizontal (no rotation) 204 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 205 ENDIF 206 IF ( ln_sco ) THEN ! s-coordinate 207 IF ( ln_dynldf_level ) nldf = 4 ! iso-level (no rotation) 208 IF ( ln_dynldf_hor ) nldf = 5 ! horizontal ( rotation) 209 IF ( ln_dynldf_iso ) ierr = 2 ! isoneutral ( rotation) 210 ENDIF 211 ENDIF 212 213 IF( lk_esopa ) nldf = -1 ! esopa test 214 215 IF( ierr == 1 ) CALL ctl_stop( 'iso-level in z-coordinate - partial step, not allowed' ) 216 IF( ierr == 2 ) CALL ctl_stop( 'isoneutral bilaplacian operator does not exist' ) 217 IF( nldf == 1 .OR. nldf == 3 ) THEN ! rotation 218 IF( .NOT.lk_ldfslp ) CALL ctl_stop( 'the rotation of the diffusive tensor require key_ldfslp' ) 174 ! 175 IF( ierr == 2 ) CALL ctl_stop( 'rotated bi-laplacian operator does not exist' ) 176 ! 177 IF( nldf == np_lap_i ) l_ldfslp = .TRUE. ! rotation require the computation of the slopes 178 ! 219 179 ENDIF 220 180 221 181 IF(lwp) THEN 222 182 WRITE(numout,*) 223 IF( nldf == -2 ) WRITE(numout,*) ' neither laplacian nor bilaplacian schemes used' 224 IF( nldf == -1 ) WRITE(numout,*) ' ESOPA test All scheme used' 225 IF( nldf == 0 ) WRITE(numout,*) ' laplacian operator' 226 IF( nldf == 1 ) WRITE(numout,*) ' rotated laplacian operator' 227 IF( nldf == 2 ) WRITE(numout,*) ' bilaplacian operator' 228 IF( nldf == 3 ) WRITE(numout,*) ' rotated bilaplacian' 229 IF( nldf == 4 ) WRITE(numout,*) ' laplacian and bilaplacian operators' 230 IF( nldf == 5 ) WRITE(numout,*) ' rotated laplacian and bilaplacian operators' 183 IF( nldf == np_no_ldf ) WRITE(numout,*) ' NO lateral viscosity' 184 IF( nldf == np_lap ) WRITE(numout,*) ' iso-level laplacian operator' 185 IF( nldf == np_lap_i ) WRITE(numout,*) ' rotated laplacian operator with iso-level background' 186 IF( nldf == np_blp ) WRITE(numout,*) ' iso-level bi-laplacian operator' 231 187 ENDIF 232 188 !
Note: See TracChangeset
for help on using the changeset viewer.