Changeset 461
- Timestamp:
- 2006-05-10T19:15:54+02:00 (18 years ago)
- Location:
- trunk/NEMO/OPA_SRC/LDF
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/LDF/ldfdyn.F90
r247 r461 104 104 WRITE(numout,*) ' horizontal eddy viscosity ahm0 = ', ahm0 105 105 WRITE(numout,*) ' background viscosity ahmb0 = ', ahmb0 106 WRITE(numout,*) 107 ENDIF 108 109 ! Parameter control 110 111 ! control the input 112 ioptio = 0 113 IF( ln_dynldf_lap ) ioptio = ioptio + 1 114 IF( ln_dynldf_bilap ) ioptio = ioptio + 1 115 IF( ioptio /= 1 ) THEN 116 IF(lwp) WRITE(numout,cform_err) 117 IF(lwp) WRITE(numout,*) ' use ONE of the 2 lap/bilap operator type on momentum' 118 nstop = nstop + 1 119 ENDIF 120 ioptio = 0 121 IF( ln_dynldf_level ) ioptio = ioptio + 1 122 IF( ln_dynldf_hor ) ioptio = ioptio + 1 123 IF( ln_dynldf_iso ) ioptio = ioptio + 1 124 IF( ioptio /= 1 ) THEN 125 IF(lwp) WRITE(numout,cform_err) 126 IF(lwp) WRITE(numout,*) ' use only ONE direction (level/hor/iso)' 127 nstop = nstop + 1 128 ENDIF 129 130 IF( lk_sco ) THEN ! s-coordinates: rotation required for horizontal or isopycnal direction 131 IF( ( ln_dynldf_iso .OR. ln_dynldf_hor ) .AND. .NOT.lk_ldfslp ) THEN 132 IF(lwp) WRITE(numout,cform_err) 133 IF(lwp) WRITE(numout,*) ' the rotation of the viscous tensor require key_ldfslp' 134 IF( .NOT.lk_esopa ) nstop = nstop + 1 135 ENDIF 136 ELSE ! z-coordinates with/without partial step: 137 ln_dynldf_level = ln_dynldf_level .OR. ln_dynldf_hor ! level mixing = horizontal mixing 138 ln_dynldf_hor = .FALSE. 139 IF(lwp) WRITE(numout,*) ' horizontal mixing in z-coord or partial steps: force ln_dynldf_level = T' 140 IF(lwp) WRITE(numout,*) ' and force ln_dynldf_hor = F' 141 IF( ln_dynldf_iso .AND. .NOT.lk_ldfslp ) THEN ! rotation required for isopycnal mixing 142 IF(lwp) WRITE(numout,cform_err) 143 IF(lwp) WRITE(numout,*) ' the rotation of the viscous tensor require key_ldfslp' 144 IF( .NOT.lk_esopa ) nstop = nstop + 1 145 ENDIF 146 ENDIF 147 148 l_dynldf_lap = ln_dynldf_lap .AND. ln_dynldf_level ! iso-level laplacian operator 149 l_dynldf_bilap = ln_dynldf_bilap .AND. ln_dynldf_level ! iso-level bilaplacian operator 150 l_dynldf_bilapg = ln_dynldf_bilap .AND. ln_dynldf_hor ! geopotential bilap. (s-coord) 151 l_dynldf_iso = ln_dynldf_lap .AND. & ! laplacian operator 152 & ( ln_dynldf_iso .OR. ln_dynldf_hor ) ! iso-neutral (z-coord) or horizontal (s-coord) 153 154 l_dynzdf_iso = .FALSE. 155 IF( l_dynldf_iso ) l_dynzdf_iso = .TRUE. 156 157 ioptio = 0 158 IF( l_dynldf_lap ) ioptio = ioptio + 1 159 IF( l_dynldf_bilap ) ioptio = ioptio + 1 160 IF( l_dynldf_bilapg ) ioptio = ioptio + 1 161 IF( l_dynldf_iso ) ioptio = ioptio + 1 162 IF( ioptio /= 1 ) THEN 163 IF(lwp) WRITE(numout,cform_err) 164 IF(lwp) WRITE(numout,*) ' this combination of operator and direction has not been implemented' 165 nstop = nstop + 1 166 ENDIF 167 IF( lk_esopa ) THEN 168 l_dynldf_lap = .TRUE. ; l_dynldf_bilap = .TRUE. ; l_dynldf_bilapg = .TRUE. 169 l_dynldf_iso = .TRUE. ; l_dynzdf_iso = .TRUE. 170 IF(lwp ) WRITE(numout,*) ' esopa test: use all lateral physics options' 171 ENDIF 172 173 ! control print 174 IF( l_dynldf_lap .AND. lwp ) WRITE(numout,*) ' iso-level laplacian momentum operator' 175 IF( l_dynldf_bilap .AND. lwp ) WRITE(numout,*) ' iso-level bilaplacian momentum operator' 176 IF( l_dynldf_bilapg .AND. lwp ) WRITE(numout,*) ' geopotential bilaplacian momentum operator' 177 IF( l_dynldf_iso .AND. lwp ) WRITE(numout,*) ' iso-neutral laplacian momentum operator' 106 ENDIF 107 108 ! ... check of lateral diffusive operator on tracers 109 ! ==> will be done in trazdf module 178 110 179 111 ! ... Space variation of eddy coefficients … … 190 122 IF(lwp) WRITE(numout,*) ' momentum mixing coef. = F( depth )' 191 123 ioptio = ioptio+1 192 IF( l k_sco ) THEN124 IF( ln_sco ) THEN 193 125 IF(lwp) WRITE(numout,cform_err) 194 IF(lwp) WRITE(numout,*) ' key_dynldf_c1d cannot be used in s-coordinate ( key_s_coord)'126 IF(lwp) WRITE(numout,*) ' key_dynldf_c1d cannot be used in s-coordinate (ln_sco)' 195 127 nstop = nstop + 1 196 128 ENDIF … … 206 138 207 139 208 IF( l _dynldf_bilap .OR. l_dynldf_bilapg) THEN140 IF( ln_dynldf_bilap ) THEN 209 141 IF(lwp) WRITE(numout,*) ' biharmonic momentum diffusion' 210 142 IF( ahm0 > 0 .AND. .NOT. lk_esopa ) THEN … … 276 208 !!---------------------------------------------------------------------- 277 209 278 zm00 = TANH( ( pdam - gdept (1 ) ) / pwam )279 zm01 = TANH( ( pdam - gdept (jpkm1) ) / pwam )210 zm00 = TANH( ( pdam - gdept_0(1 ) ) / pwam ) 211 zm01 = TANH( ( pdam - gdept_0(jpkm1) ) / pwam ) 280 212 zmhs = zm00 / zm01 281 213 zmhb = ( 1.e0 - pbot ) / ( 1.e0 - zmhs ) / zm01 … … 324 256 !!---------------------------------------------------------------------- 325 257 326 zm00 = TANH( ( pdam - gdept (1 ) ) / pwam )327 zm01 = TANH( ( pdam - gdept (jpkm1) ) / pwam )258 zm00 = TANH( ( pdam - gdept_0(1 ) ) / pwam ) 259 zm01 = TANH( ( pdam - gdept_0(jpkm1) ) / pwam ) 328 260 zmhs = zm00 / zm01 329 261 zmhb = ( 1.e0 - pbot ) / ( 1.e0 - zmhs ) / zm01 … … 373 305 !!---------------------------------------------------------------------- 374 306 375 zm00 = TANH( ( pdam - gdept (1 ) ) / pwam )376 zm01 = TANH( ( pdam - gdept (jpkm1) ) / pwam )307 zm00 = TANH( ( pdam - gdept_0(1 ) ) / pwam ) 308 zm01 = TANH( ( pdam - gdept_0(jpkm1) ) / pwam ) 377 309 zmhs = zm00 / zm01 378 310 zmhb = ( 1.e0 - pbot ) / ( 1.e0 - zmhs ) / zm01 -
trunk/NEMO/OPA_SRC/LDF/ldfdyn_c3d.h90
r247 r461 121 121 122 122 zh = MAX( zh, fsdept(1,1,1) ) ! at least the first reach ahm0 123 IF( l k_zco ) THEN ! z-coordinate, same profile everywhere123 IF( ln_zco ) THEN ! z-coordinate, same profile everywhere 124 124 IF(lwp) WRITE(numout,'(36x," ahm ", 7x)') 125 125 DO jk = 1, jpk … … 136 136 END DO 137 137 ELSE ! partial steps or s-ccordinate 138 # if defined key_partial_steps || defined key_s_coord 138 # if defined key_zco 139 zc = gdept_0(jpkm1) 140 # else 139 141 zc = MAXVAL( fsdept(:,:,jpkm1) ) 140 # else141 zc = fsdept(:,:,jpkm1)142 142 # endif 143 143 IF( lk_mpp ) CALL mpp_max( zc ) ! max over the global domain -
trunk/NEMO/OPA_SRC/LDF/ldfdyn_oce.F90
r247 r461 36 36 ahmb0 = 0._wp ! lateral background eddy viscosity (m2/s) 37 37 38 LOGICAL :: & ! flag of the lateral diff. scheme used39 l_dynldf_lap , & ! iso-level laplacian operator40 l_dynldf_bilap , & ! iso-level bilaplacian operator41 l_dynldf_bilapg , & ! geopotential bilap. (s-coord)42 l_dynldf_iso , & ! iso-neutral laplacian or horizontal lapacian (s-coord)43 l_dynzdf_iso ! iso-neutral laplacian or horizontal lapacian (s-coord)44 45 46 38 #if defined key_dynldf_c3d 47 39 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & ! ** 3D coefficients ** -
trunk/NEMO/OPA_SRC/LDF/ldfeiv.F90
r450 r461 10 10 !!---------------------------------------------------------------------- 11 11 !! ldf_eiv : compute the eddy induced velocity coefficients 12 !! Same results but not same routine if 'key_ autotasking'12 !! Same results but not same routine if 'key_mpp_omp' 13 13 !! is defined or not 14 14 !!---------------------------------------------------------------------- … … 41 41 CONTAINS 42 42 43 # if defined key_ autotasking44 !!---------------------------------------------------------------------- 45 !! 'key_ autotasking' :autotasking (j-slab)43 # if defined key_mpp_omp 44 !!---------------------------------------------------------------------- 45 !! 'key_mpp_omp' : OpenMP / NEC autotasking (j-slab) 46 46 !!---------------------------------------------------------------------- 47 47 … … 79 79 IF(lwp) WRITE(numout,*) 80 80 IF(lwp) WRITE(numout,*) 'ldf_eiv : eddy induced velocity coefficients' 81 IF(lwp) WRITE(numout,*) '~~~~~~~ key_autotasking'81 IF(lwp) WRITE(numout,*) '~~~~~~~ NEC autotasking / OpenMP : j-slab' 82 82 ENDIF 83 83 … … 176 176 zaht = ( 1. - MIN( 1., ABS( ff(ji,jj) / zf20 ) ) ) * ( aht0 - zaht_min ) & 177 177 & + aht0 * upsrnfh(ji,jj) ! enhanced near river mouths 178 ahtu(ji,jj) = MAX( MAX( zaht_min, aeiu(ji,jj) ) + zaht, aht0 )179 ahtv(ji,jj) = MAX( MAX( zaht_min, aeiv(ji,jj) ) + zaht, aht0 )180 ahtw(ji,jj) = MAX( MAX( zaht_min, aeiw(ji,jj) ) + zaht, aht0 )178 ahtu(ji,jj) = MAX( zaht_min, aeiu(ji,jj) ) + zaht 179 ahtv(ji,jj) = MAX( zaht_min, aeiv(ji,jj) ) + zaht 180 ahtw(ji,jj) = MAX( zaht_min, aeiw(ji,jj) ) + zaht 181 181 END DO 182 182 END DO … … 249 249 250 250 DO jk = 1, jpk 251 # if defined key_vectopt_loop && ! defined key_ autotasking251 # if defined key_vectopt_loop && ! defined key_mpp_omp 252 252 !CDIR NOVERRCHK 253 253 DO ji = 1, jpij ! vector opt. … … 360 360 ENDIF 361 361 ENDIF 362 362 363 363 IF( aeiv0 == 0.e0 ) THEN 364 364 aeiu(:,:) = 0.e0 -
trunk/NEMO/OPA_SRC/LDF/ldfslp.F90
r258 r461 49 49 !!---------------------------------------------------------------------- 50 50 !! OPA 9.0 , LOCEAN-IPSL (2005) 51 !! $Header$52 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt53 51 !!---------------------------------------------------------------------- 54 52 … … 71 69 !! of 10cm/s) 72 70 !! A horizontal shapiro filter is applied to the slopes 73 !! 'key_s_coord' defined:add to the previously computed slopes71 !! ln_sco=T, s-coordinate, add to the previously computed slopes 74 72 !! the slope of the model level surface. 75 73 !! macro-tasked on horizontal slab (jk-loop) (2, jpk-1) 76 74 !! [slopes already set to zero at level 1, and to zero or the ocean 77 !! bottom slope ( 'key_s_coord' defined) at level jpk in inildf]75 !! bottom slope (ln_sco=T) at level jpk in inildf] 78 76 !! 79 77 !! ** Action : - uslp, wslpi, and vslp, wslpj, the i- and j-slopes … … 85 83 !! 8.1 ! 99-10 (A. Jouzeau) NEW profile 86 84 !! 8.5 ! 99-10 (G. Madec) Free form, F90 85 !! 9.0 ! 05-10 (A. Beckmann) correction for s-coordinates 87 86 !!---------------------------------------------------------------------- 88 87 !! * Modules used … … 99 98 !! * Local declarations 100 99 INTEGER :: ji, jj, jk ! dummy loop indices 101 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integer 102 #if defined key_partial_steps 103 INTEGER :: iku, ikv ! temporary integers 104 #endif 100 INTEGER :: ii0, ii1, ij0, ij1, & ! temporary integer 101 & iku, ikv ! " " 105 102 REAL(wp) :: & 106 zeps, zmg, zm05g, zcoef1, zcoef2, & ! temporary scalars 107 zau, zbu, zav, zbv, & 108 zai, zbi, zaj, zbj, & 109 zcofu, zcofv, zcofw, & 110 z1u, z1v, z1wu, z1wv, & 103 zeps, zmg, zm05g, & ! temporary scalars 104 zcoef1, zcoef2, zcoef3, & ! 105 zau, zbu, zav, zbv, & 106 zai, zbi, zaj, zbj, & 107 zcofu, zcofv, zcofw, & 108 z1u, z1v, z1wu, z1wv, & 111 109 zalpha 112 110 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zww … … 140 138 END DO 141 139 142 #if defined key_partial_steps 143 ! partial steps correction at the bottom ocean level (zps_hde routine) 144 # if defined key_vectopt_loop && ! defined key_autotasking 145 jj = 1 146 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling) 140 IF( ln_zps ) THEN ! partial steps correction at the bottom ocean level (zps_hde routine) 141 # if defined key_vectopt_loop && ! defined key_mpp_omp 142 jj = 1 143 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling) 147 144 # else 148 DO jj = 1, jpjm1149 DO ji = 1, jpim1150 # endif 151 ! last ocean level152 iku = MIN ( mbathy(ji,jj), mbathy(ji+1,jj) ) - 1153 ikv = MIN ( mbathy(ji,jj), mbathy(ji,jj+1) ) - 1154 zgru(ji,jj,iku) = gru(ji,jj)155 zgrv(ji,jj,ikv) = grv(ji,jj)156 # if ! defined key_vectopt_loop || defined key_ autotasking157 END DO158 # endif 159 END DO160 #endif 145 DO jj = 1, jpjm1 146 DO ji = 1, jpim1 147 # endif 148 ! last ocean level 149 iku = MIN ( mbathy(ji,jj), mbathy(ji+1,jj) ) - 1 150 ikv = MIN ( mbathy(ji,jj), mbathy(ji,jj+1) ) - 1 151 zgru(ji,jj,iku) = gru(ji,jj) 152 zgrv(ji,jj,ikv) = grv(ji,jj) 153 # if ! defined key_vectopt_loop || defined key_mpp_omp 154 END DO 155 # endif 156 END DO 157 ENDIF 161 158 162 159 ! Slopes of isopycnal surfaces just below the mixed layer … … 205 202 ! uslp and vslp output in zwz and zww, resp. 206 203 zalpha = MAX( omlmask(ji,jj,jk), omlmask(ji+1,jj,jk) ) 207 #if defined key_s_coord208 204 zwz (ji,jj,jk) = ( zau / ( zbu - zeps ) * ( 1. - zalpha) & 209 & + zalpha * uslpml(ji,jj) & 210 & * ( fsdepu(ji,jj,jk) - .5*fse3u(ji,jj,1) ) & 211 & / MAX( hmlpt(ji,jj), hmlpt(ji+1,jj), 5. ) ) & 212 & * umask(ji,jj,jk) 205 & + zalpha * uslpml(ji,jj) & 206 & * 0.5 * ( fsdept(ji+1,jj,jk)+fsdept(ji,jj,jk)-fse3u(ji,jj,1) ) & 207 & / MAX( hmlpt(ji,jj), hmlpt(ji+1,jj), 5. ) ) * umask(ji,jj,jk) 213 208 zalpha = MAX( omlmask(ji,jj,jk), omlmask(ji,jj+1,jk) ) 214 209 zww (ji,jj,jk) = ( zav / ( zbv - zeps ) * ( 1. - zalpha) & 215 & + zalpha * vslpml(ji,jj) & 216 & * ( fsdepv(ji,jj,jk) - .5*fse3v(ji,jj,1) ) & 217 & / MAX( hmlpt(ji,jj), hmlpt(ji,jj+1), 5. ) ) & 218 & * vmask(ji,jj,jk) 219 #else 220 ! z-coord and partial steps slope computed in the same way 221 zwz (ji,jj,jk) = ( zau / ( zbu - zeps ) * ( 1. - zalpha) & 222 & + zalpha * uslpml(ji,jj) & 223 & * ( fsdept(ji,jj,jk) - .5*fse3u(ji,jj,1)) & 224 & / MAX (hmlpt(ji,jj),hmlpt(ji+1,jj),5.) ) & 225 & * umask (ji,jj,jk) 226 zalpha = MAX(omlmask(ji,jj,jk),omlmask(ji,jj+1,jk)) 227 zww (ji,jj,jk) = ( zav / ( zbv - zeps ) * ( 1. - zalpha) & 228 & + zalpha * vslpml(ji,jj) & 229 & * ( fsdept(ji,jj,jk) - .5*fse3v(ji,jj,1)) & 230 & / MAX(hmlpt(ji,jj),hmlpt(ji,jj+1),5.) ) & 231 & * vmask (ji,jj,jk) 232 #endif 210 & + zalpha * vslpml(ji,jj) & 211 & * 0.5 * ( fsdept(ji,jj+1,jk)+fsdept(ji,jj,jk)-fse3v(ji,jj,1) ) & 212 & / MAX( hmlpt(ji,jj), hmlpt(ji,jj+1), 5. ) ) * vmask(ji,jj,jk) 233 213 END DO 234 214 END DO … … 294 274 END DO 295 275 END DO 296 297 298 IF( lk_sco ) THEN299 ! Add the slope of level surfaces300 ! -----------------------------------301 ! 'key_s_coord' defined but not 'key_traldfiso' the computation is done302 ! in inildf, ldfslp never called303 ! 'key_s_coord' and 'key_traldfiso' defined, the slope of level surfaces304 ! is added to the slope of isopycnal surfaces.305 ! c a u t i o n : minus sign as fsdep has positive value306 307 DO jj = 2, jpjm1308 DO ji = fs_2, fs_jpim1 ! vector opt.309 uslp(ji,jj,jk) = uslp(ji,jj,jk) - 1. / e1u(ji,jj) &310 & * ( fsdept(ji+1,jj,jk) - fsdept(ji,jj,jk) )311 vslp(ji,jj,jk) = vslp(ji,jj,jk) - 1. / e2v(ji,jj) &312 & * ( fsdept(ji,jj+1,jk) - fsdept(ji,jj,jk) )313 END DO314 END DO315 ENDIF316 276 317 277 … … 356 316 zbj = MIN( zwy (ji,jj,jk), -100.*ABS(zaj), -7.e+3/fse3w(ji,jj,jk)*ABS(zaj) ) 357 317 ! wslpi and wslpj output in zwz and zww, resp. 358 zalpha = MAX(omlmask(ji,jj,jk),omlmask(ji,jj,jk-1)) 359 zwz(ji,jj,jk) = ( zai / ( zbi - zeps) * ( 1. - zalpha ) & 360 & + zalpha * wslpiml(ji,jj) & 361 & * fsdepw(ji,jj,jk) / MAX( hmlp(ji,jj),10. ) ) & 362 & * tmask (ji,jj,jk) 363 zww(ji,jj,jk) = ( zaj / ( zbj - zeps) * ( 1. - zalpha ) & 364 & + zalpha * wslpjml(ji,jj) & 365 & * fsdepw(ji,jj,jk) / MAX( hmlp(ji,jj),10. ) ) & 366 & * tmask (ji,jj,jk) 318 zalpha = MAX( omlmask(ji,jj,jk), omlmask(ji,jj,jk-1) ) 319 zcoef3 = fsdepw(ji,jj,jk) / MAX( hmlp(ji,jj), 10. ) 320 zwz(ji,jj,jk) = ( zai / ( zbi - zeps) * ( 1. - zalpha ) & 321 & + zcoef3 * wslpiml(ji,jj) * zalpha ) * tmask (ji,jj,jk) 322 zww(ji,jj,jk) = ( zaj / ( zbj - zeps) * ( 1. - zalpha ) & 323 & + zcoef3 * wslpjml(ji,jj) * zalpha ) * tmask (ji,jj,jk) 367 324 END DO 368 325 END DO … … 426 383 END DO 427 384 428 IF( lk_sco ) THEN429 430 ! Slope of level surfaces431 ! -----------------------432 ! 'key_s_coord' defined but not 'key_traldfiso' the computation is done433 ! in inildf, ldfslp never called434 ! 'key_s_coord' and 'key_traldfiso' defined, the slope of level surfaces435 ! is added to the slope of isopycnal surfaces.436 437 DO jj = 2, jpjm1438 DO ji = fs_2, fs_jpim1 ! vector opt.439 wslpi(ji,jj,jk) = wslpi(ji,jj,jk) - 1. / e1t(ji,jj) &440 & * ( fsdepuw(ji+1,jj,jk) - fsdepuw(ji,jj,jk) )441 wslpj(ji,jj,jk) = wslpj(ji,jj,jk) - 1. / e2t(ji,jj) &442 & * ( fsdepvw(ji,jj+1,jk) - fsdepvw(ji,jj,jk) )443 END DO444 END DO445 ENDIF446 385 447 386 ! III. Specific grid points … … 476 415 ! III Lateral boundary conditions on all slopes (uslp , vslp, 477 416 ! ------------------------------- wslpi, wslpj ) 478 CALL lbc_lnk( uslp , 'U', -1. ) 479 CALL lbc_lnk( vslp , 'V', -1. ) 480 CALL lbc_lnk( wslpi, 'W', -1. ) 481 CALL lbc_lnk( wslpj, 'W', -1. ) 417 CALL lbc_lnk( uslp , 'U', -1. ) ; CALL lbc_lnk( vslp , 'V', -1. ) 418 CALL lbc_lnk( wslpi, 'W', -1. ) ; CALL lbc_lnk( wslpj, 'W', -1. ) 482 419 483 420 IF(ln_ctl) THEN … … 553 490 ! mask for mixed layer 554 491 DO jk = 1, jpk 555 # if defined key_vectopt_loop && ! defined key_ autotasking492 # if defined key_vectopt_loop && ! defined key_mpp_omp 556 493 jj = 1 557 494 DO ji = 1, jpij ! vector opt. (forced unrolling) … … 567 504 omlmask(ji,jj,jk) = 0.e0 568 505 ENDIF 569 # if ! defined key_vectopt_loop || defined key_ autotasking506 # if ! defined key_vectopt_loop || defined key_mpp_omp 570 507 END DO 571 508 # endif … … 585 522 zwy(:,jpj) = 0.e0 586 523 zwy(jpi,:) = 0.e0 587 # if defined key_vectopt_loop && ! defined key_ autotasking524 # if defined key_vectopt_loop && ! defined key_mpp_omp 588 525 jj = 1 589 526 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling) … … 598 535 & * ( pn2(ji,jj,ik) + pn2(ji,jj,ik+1) ) & 599 536 & / MAX( tmask(ji,jj,ik) + tmask (ji,jj,ik+1), 1. ) 600 # if ! defined key_vectopt_loop || defined key_ autotasking537 # if ! defined key_vectopt_loop || defined key_mpp_omp 601 538 END DO 602 539 # endif … … 606 543 607 544 ! Slope at u points 608 # if defined key_vectopt_loop && ! defined key_ autotasking545 # if defined key_vectopt_loop && ! defined key_mpp_omp 609 546 jj = 1 610 547 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) … … 623 560 ! uslpml 624 561 uslpml (ji,jj) = zau / ( zbu - zeps ) * umask (ji,jj,ik) 625 # if ! defined key_vectopt_loop || defined key_ autotasking562 # if ! defined key_vectopt_loop || defined key_mpp_omp 626 563 END DO 627 564 # endif … … 635 572 zwy ( :, jpj) = 0.e0 636 573 zwy ( jpi, :) = 0.e0 637 # if defined key_vectopt_loop && ! defined key_ autotasking574 # if defined key_vectopt_loop && ! defined key_mpp_omp 638 575 jj = 1 639 576 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling) … … 647 584 & * ( pn2(ji,jj,ik) + pn2(ji,jj,ik+1) ) & 648 585 & / MAX( tmask(ji,jj,ik) + tmask (ji,jj,ik+1), 1. ) 649 # if ! defined key_vectopt_loop || defined key_ autotasking586 # if ! defined key_vectopt_loop || defined key_mpp_omp 650 587 END DO 651 588 # endif … … 656 593 657 594 ! Slope at v points 658 # if defined key_vectopt_loop && ! defined key_ autotasking595 # if defined key_vectopt_loop && ! defined key_mpp_omp 659 596 jj = 1 660 597 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) … … 673 610 ! vslpml 674 611 vslpml (ji,jj) = zav / ( zbv - zeps ) * vmask (ji,jj,ik) 675 # if ! defined key_vectopt_loop || defined key_ autotasking612 # if ! defined key_vectopt_loop || defined key_mpp_omp 676 613 END DO 677 614 # endif … … 687 624 ! Local vertical density gradient evaluated from N^2 688 625 ! zwy = d/dz(prd)= - mk ( prd ) / grav * pn2 -- at w point 689 # if defined key_vectopt_loop && ! defined key_ autotasking626 # if defined key_vectopt_loop && ! defined key_mpp_omp 690 627 jj = 1 691 628 DO ji = 1, jpij ! vector opt. (forced unrolling) … … 699 636 zwy (ji,jj) = zm05g * pn2 (ji,jj,ik) * & 700 637 & ( prd (ji,jj,ik) + prd (ji,jj,ikm1) + 2. ) 701 # if ! defined key_vectopt_loop || defined key_ autotasking638 # if ! defined key_vectopt_loop || defined key_mpp_omp 702 639 END DO 703 640 # endif … … 705 642 706 643 ! Slope at w point 707 # if defined key_vectopt_loop && ! defined key_ autotasking644 # if defined key_vectopt_loop && ! defined key_mpp_omp 708 645 jj = 1 709 646 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) … … 735 672 wslpiml (ji,jj) = zai / ( zbi - zeps) * tmask (ji,jj,ik) 736 673 wslpjml (ji,jj) = zaj / ( zbj - zeps) * tmask (ji,jj,ik) 737 # if ! defined key_vectopt_loop || defined key_ autotasking674 # if ! defined key_vectopt_loop || defined key_mpp_omp 738 675 END DO 739 676 # endif … … 787 724 788 725 IF( ln_traldf_hor .OR. ln_dynldf_hor ) THEN 726 IF(lwp) THEN 727 WRITE(numout,*) ' Horizontal mixing in s-coordinate: slope = slope of s-surfaces' 728 ENDIF 789 729 790 730 ! geopotential diffusion in s-coordinates on tracers and/or momentum … … 797 737 DO jj = 2, jpjm1 798 738 DO ji = fs_2, fs_jpim1 ! vector opt. 799 uslp (ji,jj,jk) = -1. / e1u(ji,jj) * umask(ji,jj,jk) & 800 & * ( fsdept(ji+1,jj,jk) - fsdept(ji,jj,jk) ) 801 vslp (ji,jj,jk) = -1. / e2v(ji,jj) * vmask(ji,jj,jk) & 802 & * ( fsdept(ji,jj+1,jk) - fsdept(ji,jj,jk) ) 803 wslpi(ji,jj,jk) = -1. / e1t(ji,jj) * tmask(ji,jj,jk) & 804 & * ( fsdepuw(ji+1,jj,jk) - fsdepuw(ji,jj,jk) ) 805 wslpj(ji,jj,jk) = -1. / e2t(ji,jj) * tmask(ji,jj,jk) & 806 & * ( fsdepvw(ji,jj+1,jk) - fsdepvw(ji,jj,jk) ) 739 uslp (ji,jj,jk) = -1./e1u(ji,jj) * ( fsdept(ji+1,jj,jk) - fsdept(ji ,jj ,jk) ) * umask(ji,jj,jk) 740 vslp (ji,jj,jk) = -1./e2v(ji,jj) * ( fsdept(ji,jj+1,jk) - fsdept(ji ,jj ,jk) ) * vmask(ji,jj,jk) 741 wslpi(ji,jj,jk) = -1./e1t(ji,jj) * ( fsdepw(ji+1,jj,jk) - fsdepw(ji-1,jj,jk) ) * tmask(ji,jj,jk) * 0.5 742 wslpj(ji,jj,jk) = -1./e2t(ji,jj) * ( fsdepw(ji,jj+1,jk) - fsdepw(ji,jj-1,jk) ) * tmask(ji,jj,jk) * 0.5 807 743 END DO 808 744 END DO … … 810 746 811 747 ! Lateral boundary conditions on the slopes 812 CALL lbc_lnk( uslp , 'U', -1. ) 813 CALL lbc_lnk( vslp , 'V', -1. ) 814 CALL lbc_lnk( wslpi, 'W', -1. ) 815 CALL lbc_lnk( wslpj, 'W', -1. ) 748 CALL lbc_lnk( uslp , 'U', -1. ) ; CALL lbc_lnk( vslp , 'V', -1. ) 749 CALL lbc_lnk( wslpi, 'W', -1. ) ; CALL lbc_lnk( wslpj, 'W', -1. ) 816 750 ENDIF 817 751 -
trunk/NEMO/OPA_SRC/LDF/ldftra.F90
r247 r461 4 4 !! Ocean physics: lateral diffusivity coefficient 5 5 !!===================================================================== 6 6 !! History : 7 !! ! 07-97 (G. Madec) from inimix.F split in 2 routines 8 !! ! 08-97 (G. Madec) multi dimensional coefficients 9 !! 8.5 ! 02-09 (G. Madec) F90: Free form and module 10 !! 9.0 ! 05-11 (G. Madec) 7 11 !!---------------------------------------------------------------------- 8 12 !! ldf_tra_init : initialization, namelist read, and parameters control … … 32 36 !!--------------------------------------------------------------------------------- 33 37 !! OPA 9.0 , LOCEAN-IPSL (2005) 34 !! $Header$ 35 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 38 !! $Header$ 39 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 36 40 !!--------------------------------------------------------------------------------- 37 41 … … 42 46 !! *** ROUTINE ldf_tra_init *** 43 47 !! 44 !! ** Purpose : initializations of the horizontal ocean tracer physics48 !! ** Purpose : initializations of the tracer lateral mixing coeff. 45 49 !! 46 !! ** Method : 47 !! Direction of lateral diffusion (tracers and/or momentum) 48 !! ln_traldf_iso = T : initialize the slope arrays to zero 49 !! ln_traldf_geop = T : initialise the slope arrays to the i- and 50 !! j-slopes of s-surfaces 51 !! Eddy diffusivity and eddy induced velocity cefficients: 50 !! ** Method : the Eddy diffusivity and eddy induced velocity ceoff. 51 !! are defined as follows: 52 52 !! default option : constant coef. aht0, aeiv0 (namelist) 53 53 !! 'key_traldf_c1d': depth dependent coef. defined in … … 63 63 !! profile. 64 64 !! 65 !! Reference :66 !! Madec, G. and M. Imbard, 1996, A global ocean mesh to overcome67 !! the North Pole singularity, Climate Dynamics, 12, 381-388.68 !!69 !! History :70 !! ! 07-97 (G. Madec) from inimix.F split in 2 routines71 !! ! 08-97 (G. Madec) multi dimensional coefficients72 !! 8.5 ! 02-09 (G. Madec) F90: Free form and module73 65 !!---------------------------------------------------------------------- 74 !! * Modules used75 66 USE ioipsl 76 67 77 !! * Local declarations78 68 INTEGER :: ioptio ! ??? 79 69 LOGICAL :: ll_print = .FALSE. ! =T print eddy coef. in numout … … 93 83 IF(lwp) THEN 94 84 WRITE(numout,*) 95 WRITE(numout,*) 'ldf_tra : lateral tracer physics'96 WRITE(numout,*) '~~~~~~~ '97 WRITE(numout,*) ' Namelist nam_traldf : set lateral mixing parameters (type, direction, coefficients)'85 WRITE(numout,*) 'ldf_tra_init : lateral tracer physics' 86 WRITE(numout,*) '~~~~~~~~~~~~ ' 87 WRITE(numout,*) ' Namelist nam_traldf : lateral mixing coefficients' 98 88 WRITE(numout,*) ' laplacian operator ln_traldf_lap = ', ln_traldf_lap 99 89 WRITE(numout,*) ' bilaplacian operator ln_traldf_bilap = ', ln_traldf_bilap 100 WRITE(numout,*) ' iso-level ln_traldf_level = ', ln_traldf_level101 WRITE(numout,*) ' horizontal (geopotential) ln_traldf_hor = ', ln_traldf_hor102 WRITE(numout,*) ' iso-neutral ln_traldf_iso = ', ln_traldf_iso103 90 WRITE(numout,*) ' lateral eddy diffusivity aht0 = ', aht0 104 91 WRITE(numout,*) ' background hor. diffusivity ahtb0 = ', ahtb0 … … 109 96 ! Parameter control 110 97 111 ! control the input 112 ioptio = 0 113 IF( ln_traldf_lap ) ioptio = ioptio + 1 114 IF( ln_traldf_bilap ) ioptio = ioptio + 1 115 IF( ioptio /= 1 ) THEN 116 IF(lwp) WRITE(numout,cform_err) 117 IF(lwp) WRITE(numout,*) ' use ONE of the 2 lap/bilap operator type on tracer' 118 nstop = nstop + 1 119 ENDIF 120 ioptio = 0 121 IF( ln_traldf_level ) ioptio = ioptio + 1 122 IF( ln_traldf_hor ) ioptio = ioptio + 1 123 IF( ln_traldf_iso ) ioptio = ioptio + 1 124 IF( ioptio /= 1 ) THEN 125 IF(lwp) WRITE(numout,cform_err) 126 IF(lwp) WRITE(numout,*) ' use only ONE direction (level/hor/iso)' 127 nstop = nstop + 1 128 ENDIF 129 130 ! ... Choice of the lateral scheme used 131 IF( lk_traldf_eiv ) THEN 132 IF(lwp) WRITE(numout,*) ' eddy induced velocity on tracers' 133 IF( .NOT.ln_traldf_iso .OR. ln_traldf_bilap ) THEN 134 IF(lwp) WRITE(numout,cform_err) 135 IF(lwp) WRITE(numout,*) ' the eddy induced velocity on tracers requires isopycnal laplacian diffusion' 136 nstop = nstop + 1 137 ENDIF 138 ENDIF 139 140 IF( lk_sco ) THEN ! s-coordinates: rotation required for horizontal or isopycnal mixing 141 IF( ( ln_traldf_iso .OR. ln_traldf_hor ) .AND. .NOT.lk_ldfslp ) THEN 142 IF(lwp) WRITE(numout,cform_err) 143 IF(lwp) WRITE(numout,*) ' the rotation of the diffusive tensor require key_ldfslp' 144 IF( .NOT.lk_esopa ) nstop = nstop + 1 145 ENDIF 146 ELSE ! z-coordinates with/without partial step: 147 ln_traldf_level = ln_traldf_level .OR. ln_traldf_hor ! level diffusion = horizontal diffusion 148 ln_traldf_hor = .FALSE. 149 IF(lwp) WRITE(numout,*) ' horizontal mixing in z-coord or partial steps: force ln_traldf_level = T' 150 IF(lwp) WRITE(numout,*) ' and force ln_traldf_hor = F' 151 IF( ln_traldf_iso .AND. .NOT.lk_ldfslp ) THEN ! rotation required for isopycnal mixing 152 IF(lwp) WRITE(numout,cform_err) 153 IF(lwp) WRITE(numout,*) ' the rotation of the diffusive tensor require key_ldfslp' 154 IF( .NOT.lk_esopa ) nstop = nstop + 1 155 ENDIF 156 ENDIF 157 158 l_traldf_lap = ln_traldf_lap .AND. ln_traldf_level ! iso-level laplacian operator 159 l_traldf_bilap = ln_traldf_bilap .AND. ln_traldf_level ! iso-level bilaplacian operator 160 l_traldf_bilapg = ln_traldf_bilap .AND. ln_traldf_hor ! geopotential bilap. (s-coord) 161 l_traldf_iso = ln_traldf_lap .AND. & ! laplacian operator 162 & ( ln_traldf_iso .OR. ln_traldf_hor ) & ! iso-neutral (z-coord) or horizontal (s-coord) 163 & .AND. .NOT.lk_zps 164 l_traldf_iso_zps = ln_traldf_lap .AND. & ! laplacian operator 165 & ( ln_traldf_iso .OR. ln_traldf_hor ) & ! iso-neutral (partial steps) 166 & .AND. lk_zps ! or geopotential in mixed partial steps/s-coord 167 l_trazdf_iso = .FALSE. 168 l_trazdf_iso_vo = .FALSE. 169 IF( l_traldf_iso ) l_trazdf_iso = .TRUE. 170 IF( l_traldf_iso_zps ) l_trazdf_iso = .TRUE. 171 #if defined key_vectopt_memory 172 IF( l_trazdf_iso ) THEN 173 l_trazdf_iso = .FALSE. 174 l_trazdf_iso_vo = .TRUE. 175 ENDIF 176 #endif 177 178 ioptio = 0 179 IF( l_traldf_lap ) ioptio = ioptio + 1 180 IF( l_traldf_bilap ) ioptio = ioptio + 1 181 IF( l_traldf_bilapg ) ioptio = ioptio + 1 182 IF( l_traldf_iso ) ioptio = ioptio + 1 183 IF( l_traldf_iso_zps ) ioptio = ioptio + 1 184 IF( ioptio /= 1 ) THEN 185 IF(lwp) WRITE(numout,cform_err) 186 IF(lwp) WRITE(numout,*) ' this combination of operator and direction has not been implemented' 187 nstop = nstop + 1 188 ENDIF 189 IF( lk_esopa ) THEN 190 l_traldf_lap = .TRUE. ; l_traldf_bilap = .TRUE. ; l_traldf_bilapg = .TRUE. 191 l_traldf_iso = .TRUE. ; l_traldf_iso_zps = .TRUE. 192 l_trazdf_iso = .TRUE. ; l_trazdf_iso_vo = .TRUE. 193 IF(lwp ) WRITE(numout,*) ' esopa test: use all lateral physics options' 194 ENDIF 195 98 ! ... Check consistency for type and direction : 99 ! ==> will be done in traldf module 196 100 197 101 ! ... Space variation of eddy coefficients … … 208 112 IF(lwp) WRITE(numout,*) ' tracer mixing coef. = F( depth )' 209 113 ioptio = ioptio + 1 210 IF( lk_sco ) THEN114 IF( .NOT. ln_zco ) THEN 211 115 IF(lwp) WRITE(numout,cform_err) 212 IF(lwp) WRITE(numout,*) ' key_traldf_c1d can not be used in s-coordinate (key_s_coord)'116 IF(lwp) WRITE(numout,*) ' key_traldf_c1d can only be used in z-coordinate - full step' 213 117 nstop = nstop + 1 214 118 ENDIF … … 223 127 ENDIF 224 128 225 IF( l _traldf_bilap .OR. l_traldf_bilapg) THEN129 IF( ln_traldf_bilap ) THEN 226 130 IF(lwp) WRITE(numout,*) ' biharmonic tracer diffusion' 227 131 IF( aht0 > 0 .AND. .NOT. lk_esopa ) THEN … … 244 148 245 149 #if defined key_traldf_c3d 246 CALL ldf_tra_c3d( ll_print ) 150 CALL ldf_tra_c3d( ll_print ) ! aht = 3D coef. = F( longitude, latitude, depth ) 247 151 #elif defined key_traldf_c2d 248 CALL ldf_tra_c2d( ll_print ) 152 CALL ldf_tra_c2d( ll_print ) ! aht = 2D coef. = F( longitude, latitude ) 249 153 #elif defined key_traldf_c1d 250 CALL ldf_tra_c1d( ll_print ) 154 CALL ldf_tra_c1d( ll_print ) ! aht = 1D coef. = F( depth ) 251 155 #else 252 ! Constant coefficients156 ! Constant coefficients 253 157 IF(lwp)WRITE(numout,*) 254 IF(lwp)WRITE(numout,*) ' inildf: constant eddy diffusivity coef.' 255 IF(lwp)WRITE(numout,*) ' ~~~~~~' 256 IF(lwp)WRITE(numout,*) ' ahtu = ahtv = ahtw = aht0 = ', aht0 158 IF(lwp)WRITE(numout,*) ' constant eddy diffusivity coef. ahtu = ahtv = ahtw = aht0 = ', aht0 257 159 IF( lk_traldf_eiv ) THEN 258 160 IF(lwp)WRITE(numout,*) 259 IF(lwp)WRITE(numout,*) ' inildf: constant eddy induced velocity coef.' 260 IF(lwp)WRITE(numout,*) ' ~~~~~~ ' 261 IF(lwp)WRITE(numout,*) ' aeiu = aeiv = aeiw = aeiv0 = ', aeiv0 161 IF(lwp)WRITE(numout,*) ' constant eddy induced velocity coef. aeiu = aeiv = aeiw = aeiv0 = ', aeiv0 262 162 ENDIF 263 163 #endif -
trunk/NEMO/OPA_SRC/LDF/ldftra_c1d.h90
r247 r461 42 42 IF( lk_traldf_eiv ) THEN 43 43 IF(lwp) WRITE(numout,*) 44 IF(lwp) WRITE(numout,*) ' inildf: 1D eddy diffusivity and eddy induced velocity coefficients'45 IF(lwp) WRITE(numout,*) ' ~~~~~~ -- '44 IF(lwp) WRITE(numout,*) ' ldf_tra_c1d : 1D eddy diffusivity and eddy induced velocity coefficients' 45 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~ -- ' 46 46 IF(lwp) WRITE(numout,*) 47 47 ELSE -
trunk/NEMO/OPA_SRC/LDF/ldftra_c2d.h90
r247 r461 43 43 IF( lk_traldf_eiv ) THEN 44 44 IF(lwp) WRITE(numout,*) 45 IF(lwp) WRITE(numout,*) ' inildf: 2D eddy diffusivity and eddy'46 IF(lwp) WRITE(numout,*) ' ~~~~~~ -- induced velocity coefficients'45 IF(lwp) WRITE(numout,*) ' ldf_tra_c2d : 2D eddy diffusivity and eddy' 46 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~ -- induced velocity coefficients' 47 47 IF(lwp) WRITE(numout,*) 48 48 ELSE 49 49 IF(lwp) WRITE(numout,*) 50 IF(lwp) WRITE(numout,*) ' inildf: 2D eddy diffusivity coefficient'51 IF(lwp) WRITE(numout,*) ' ~~~~~~ --'50 IF(lwp) WRITE(numout,*) ' ldf_tra2d : 2D eddy diffusivity coefficient' 51 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~ --' 52 52 IF(lwp) WRITE(numout,*) 53 53 ENDIF 54 55 zdx_max = MAXVAL( e1t(:,:) ) 56 IF( lk_mpp ) CALL mpp_max( zdx_max ) ! max over the global domain 54 57 55 58 ! harmonic operator : (U-, V-, W-points) 56 59 ! ================== 57 60 IF( ln_traldf_lap ) THEN 58 61 62 za00 = aht0 / zdx_max 63 64 !RB ahtu(:,:) = za00 * e1u(:,:) ! set ahtu = ahtv at u- and v-points, 65 !RB ahtv(:,:) = za00 * e1f(:,:) ! and ahtw at w-point (idem T-point) 66 !RB ahtw(:,:) = za00 * e1t(:,:) ! 59 67 ahtu(:,:) = aht0 ! set ahtu = ahtv at u- and v-points, 60 68 ahtv(:,:) = aht0 ! and ahtw at w-point (idem T-point) 61 ahtw(:,:) = aht0 ! 69 ahtw(:,:) = aht0 ! 70 71 62 72 63 73 CALL lbc_lnk( ahtu, 'U', 1. ) ! Lateral boundary conditions … … 88 98 ! Here: ahm is proportional to the cube of the maximum of the gridspacing 89 99 ! in the to horizontal direction 90 91 zdx_max = MAXVAL( e1t(:,:) )92 IF( lk_mpp ) CALL mpp_max( zdx_max ) ! max over the global domain93 100 94 101 za00 = aht0 / ( zdx_max * zdx_max * zdx_max ) -
trunk/NEMO/OPA_SRC/LDF/ldftra_c3d.h90
r247 r461 43 43 IF( lk_traldf_eiv ) THEN 44 44 IF(lwp) WRITE(numout,*) 45 IF(lwp) WRITE(numout,*) ' inildf: 3D eddy diffusivity and eddy induced velocity coefficients'46 IF(lwp) WRITE(numout,*) ' ~~~~~~ -- '45 IF(lwp) WRITE(numout,*) ' ldf_tra_c3d : 3D eddy diffusivity and eddy induced velocity coefficients' 46 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~ -- ' 47 47 IF(lwp) WRITE(numout,*) 48 48 ELSE 49 49 IF(lwp) WRITE(numout,*) 50 IF(lwp) WRITE(numout,*) ' inildf: 3D eddy diffusivity coefficient'51 IF(lwp) WRITE(numout,*) ' ~~~~~~ -- '50 IF(lwp) WRITE(numout,*) ' ldf_tra_c3d : 3D eddy diffusivity coefficient' 51 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~ -- ' 52 52 IF(lwp) WRITE(numout,*) 53 53 ENDIF -
trunk/NEMO/OPA_SRC/LDF/ldftra_oce.F90
r247 r461 35 35 ahtb0 = 0._wp , & !: lateral background eddy diffusivity (m2/s) 36 36 aeiv0 = 2000._wp !: eddy induced velocity coefficient (m2/s) 37 38 LOGICAL , PUBLIC :: & !: flag of the lateral diff. scheme used39 l_traldf_lap , & !: iso-level laplacian operator40 l_traldf_bilap , & !: iso-level bilaplacian operator41 l_traldf_bilapg , & !: geopotential bilap. (s-coord)42 l_traldf_iso , & !: iso-neutral laplacian or horizontal lapacian (s-coord)43 l_trazdf_iso , & !: idem for the vertical component44 l_trazdf_iso_vo , & !: idem with vectopt_memory45 l_traldf_iso_zps !: iso-neutral laplacian (partial steps)46 37 47 38 #if defined key_traldf_c3d
Note: See TracChangeset
for help on using the changeset viewer.