- Timestamp:
- 2017-12-01T18:44:09+01:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90
r7913 r8882 14 14 !! 2.0 ! 2006-11 (G. Madec) flux form advection: add metric term 15 15 !! 3.2 ! 2009-04 (R. Benshila) vvl: correction of een scheme 16 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory16 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 17 !! 3.7 ! 2014-04 (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity 18 !! - ! 2014-06 (G. Madec) suppression of velocity curl from in-core memory 19 19 !! - ! 2016-12 (G. Madec, E. Clementi) add Stokes-Coriolis trends (ln_stcor=T) 20 !! 4.0 ! 2017-07 (G. Madec) linear dynamics + trends diag. with Stokes-Coriolis 20 21 !!---------------------------------------------------------------------- 21 22 22 23 !!---------------------------------------------------------------------- 23 !! dyn_vor : Update the momentum trend with the vorticity trend24 !! vor_ens : enstrophy conserving scheme (ln_dynvor_ens=T)25 !! vor_ene : energy conserving scheme (ln_dynvor_ene=T)26 !! vor_een : energy and enstrophy conserving (ln_dynvor_een=T)27 !! dyn_vor_init : set and control of the different vorticity option24 !! dyn_vor : Update the momentum trend with the vorticity trend 25 !! vor_ens : enstrophy conserving scheme (ln_dynvor_ens=T) 26 !! vor_ene : energy conserving scheme (ln_dynvor_ene=T) 27 !! vor_een : energy and enstrophy conserving (ln_dynvor_een=T) 28 !! dyn_vor_init : set and control of the different vorticity option 28 29 !!---------------------------------------------------------------------- 29 30 USE oce ! ocean dynamics and tracers 30 31 USE dom_oce ! ocean space and time domain 31 32 USE dommsk ! ocean mask 32 USE dynadv ! momentum advection (use ln_dynadv_vec value)33 USE dynadv ! momentum advection 33 34 USE trd_oce ! trends: ocean variables 34 35 USE trddyn ! trend manager: dynamics … … 40 41 USE in_out_manager ! I/O manager 41 42 USE lib_mpp ! MPP library 42 USE wrk_nemo ! Memory Allocation43 43 USE timing ! Timing 44 45 44 46 45 IMPLICIT NONE … … 80 79 # include "vectopt_loop_substitute.h90" 81 80 !!---------------------------------------------------------------------- 82 !! NEMO/OPA 3.7 , NEMO Consortium (2016)81 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 83 82 !! $Id$ 84 83 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 98 97 INTEGER, INTENT( in ) :: kt ! ocean time-step index 99 98 ! 100 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 101 !!---------------------------------------------------------------------- 102 ! 103 IF( nn_timing == 1 ) CALL timing_start('dyn_vor') 104 ! 105 IF( l_trddyn ) CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 106 ! 107 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 108 ! 109 CASE ( np_ENE ) !* energy conserving scheme 110 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 99 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 100 !!---------------------------------------------------------------------- 101 ! 102 IF( ln_timing ) CALL timing_start('dyn_vor') 103 ! 104 IF( l_trddyn ) THEN !== trend diagnostics case : split the added trend in two parts ==! 105 ! 106 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 107 ! 108 ztrdu(:,:,:) = ua(:,:,:) !* planetary vorticity trend (including Stokes-Coriolis force) 109 ztrdv(:,:,:) = va(:,:,:) 110 SELECT CASE( nvor_scheme ) 111 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, ncor, un , vn , ua, va ) ! energy conserving scheme 112 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 113 CASE( np_ENS ) ; CALL vor_ens( kt, ncor, un , vn , ua, va ) ! enstrophy conserving scheme 114 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 115 CASE( np_EEN ) ; CALL vor_een( kt, ncor, un , vn , ua, va ) ! energy & enstrophy scheme 116 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 117 END SELECT 118 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 119 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 120 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 121 ! 122 IF( n_dynadv /= np_LIN_dyn ) THEN !* relative vorticity or metric trend (only in non-linear case) 111 123 ztrdu(:,:,:) = ua(:,:,:) 112 124 ztrdv(:,:,:) = va(:,:,:) 113 CALL vor_ene( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend 125 SELECT CASE( nvor_scheme ) 126 CASE( np_ENE ) ; CALL vor_ene( kt, nrvm, un , vn , ua, va ) ! energy conserving scheme 127 CASE( np_ENS, np_MIX ) ; CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! enstrophy conserving scheme 128 CASE( np_EEN ) ; CALL vor_een( kt, nrvm, un , vn , ua, va ) ! energy & enstrophy scheme 129 END SELECT 114 130 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 115 131 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 116 132 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 117 ztrdu(:,:,:) = ua(:,:,:) 118 ztrdv(:,:,:) = va(:,:,:) 119 CALL vor_ene( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend 120 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 121 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 122 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 123 ELSE ! total vorticity trend 133 ENDIF 134 ! 135 DEALLOCATE( ztrdu, ztrdv ) 136 ! 137 ELSE !== total vorticity trend added to the general trend ==! 138 ! 139 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 140 CASE( np_ENE ) !* energy conserving scheme 124 141 CALL vor_ene( kt, ntot, un , vn , ua, va ) ! total vorticity trend 125 142 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 126 ENDIF 127 ! 128 CASE ( np_ENS ) !* enstrophy conserving scheme 129 IF( l_trddyn ) THEN ! trend diagnostics: splitthe trend in two 130 ztrdu(:,:,:) = ua(:,:,:) 131 ztrdv(:,:,:) = va(:,:,:) 132 CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend 133 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 134 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 135 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 136 ztrdu(:,:,:) = ua(:,:,:) 137 ztrdv(:,:,:) = va(:,:,:) 138 CALL vor_ens( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend 139 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 140 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 141 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 142 ELSE ! total vorticity trend 143 CASE( np_ENS ) !* enstrophy conserving scheme 143 144 CALL vor_ens( kt, ntot, un , vn , ua, va ) ! total vorticity trend 144 145 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 145 ENDIF 146 ! 147 CASE ( np_MIX ) !* mixed ene-ens scheme 148 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 149 ztrdu(:,:,:) = ua(:,:,:) 150 ztrdv(:,:,:) = va(:,:,:) 151 CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend (ens) 152 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 153 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 154 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 155 ztrdu(:,:,:) = ua(:,:,:) 156 ztrdv(:,:,:) = va(:,:,:) 157 CALL vor_ene( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend (ene) 158 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 159 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 160 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 161 ELSE ! total vorticity trend 146 CASE( np_MIX ) !* mixed ene-ens scheme 162 147 CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend (ens) 163 148 CALL vor_ene( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend (ene) 164 149 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 165 ENDIF 166 ! 167 CASE ( np_EEN ) !* energy and enstrophy conserving scheme 168 IF( l_trddyn ) THEN ! trend diagnostics: split the trend in two 169 ztrdu(:,:,:) = ua(:,:,:) 170 ztrdv(:,:,:) = va(:,:,:) 171 CALL vor_een( kt, nrvm, un , vn , ua, va ) ! relative vorticity or metric trend 172 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 173 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 174 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 175 ztrdu(:,:,:) = ua(:,:,:) 176 ztrdv(:,:,:) = va(:,:,:) 177 CALL vor_een( kt, ncor, un , vn , ua, va ) ! planetary vorticity trend 178 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 179 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 180 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 181 ELSE ! total vorticity trend 150 CASE( np_EEN ) !* energy and enstrophy conserving scheme 182 151 CALL vor_een( kt, ntot, un , vn , ua, va ) ! total vorticity trend 183 152 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 184 END IF185 ! 186 END SELECT153 END SELECT 154 ! 155 ENDIF 187 156 ! 188 157 ! ! print sum trends (used for debugging) … … 190 159 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 191 160 ! 192 IF( l_trddyn ) CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 193 ! 194 IF( nn_timing == 1 ) CALL timing_stop('dyn_vor') 161 IF( ln_timing ) CALL timing_stop('dyn_vor') 195 162 ! 196 163 END SUBROUTINE dyn_vor … … 217 184 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 218 185 !!---------------------------------------------------------------------- 219 INTEGER , INTENT(in ) :: kt ! ocean time-step index 220 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 221 ! ! =nrvm (relative vorticity or metric) 222 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun, pvn ! now velocities 223 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua, pva ! total v-trend 186 INTEGER , INTENT(in ) :: kt ! ocean time-step index 187 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 188 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 189 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 224 190 ! 225 191 INTEGER :: ji, jj, jk ! dummy loop indices 226 192 REAL(wp) :: zx1, zy1, zx2, zy2 ! local scalars 227 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz ! 2D workspace 228 !!---------------------------------------------------------------------- 229 ! 230 IF( nn_timing == 1 ) CALL timing_start('vor_ene') 231 ! 232 CALL wrk_alloc( jpi,jpj, zwx, zwy, zwz ) 193 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! 2D workspace 194 !!---------------------------------------------------------------------- 195 ! 196 IF( ln_timing ) CALL timing_start('vor_ene') 233 197 ! 234 198 IF( kt == nit000 ) THEN … … 264 228 DO ji = 1, fs_jpim1 ! vector opt. 265 229 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 266 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) &230 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) & 267 231 & * r1_e1e2f(ji,jj) 268 232 END DO … … 311 275 END DO ! End of slab 312 276 ! ! =============== 313 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz ) 314 ! 315 IF( nn_timing == 1 ) CALL timing_stop('vor_ene') 277 ! 278 IF( ln_timing ) CALL timing_stop('vor_ene') 316 279 ! 317 280 END SUBROUTINE vor_ene … … 338 301 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 339 302 !!---------------------------------------------------------------------- 340 INTEGER , INTENT(in ) :: kt ! ocean time-step index 341 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 342 ! ! =nrvm (relative vorticity or metric) 343 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun, pvn ! now velocities 344 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua, pva ! total v-trend 303 INTEGER , INTENT(in ) :: kt ! ocean time-step index 304 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 305 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 306 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 345 307 ! 346 308 INTEGER :: ji, jj, jk ! dummy loop indices 347 309 REAL(wp) :: zuav, zvau ! local scalars 348 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww ! 2D workspace 349 !!---------------------------------------------------------------------- 350 ! 351 IF( nn_timing == 1 ) CALL timing_start('vor_ens') 352 ! 353 CALL wrk_alloc( jpi,jpj, zwx, zwy, zwz ) 310 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz, zww ! 2D workspace 311 !!---------------------------------------------------------------------- 312 ! 313 IF( ln_timing ) CALL timing_start('vor_ens') 354 314 ! 355 315 IF( kt == nit000 ) THEN … … 431 391 END DO ! End of slab 432 392 ! ! =============== 433 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz ) 434 ! 435 IF( nn_timing == 1 ) CALL timing_stop('vor_ens') 393 ! 394 IF( ln_timing ) CALL timing_stop('vor_ens') 436 395 ! 437 396 END SUBROUTINE vor_ens … … 455 414 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 456 415 !!---------------------------------------------------------------------- 457 INTEGER , INTENT(in ) :: kt ! ocean time-step index 458 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 459 ! ! =nrvm (relative vorticity or metric) 460 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pun, pvn ! now velocities 461 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua, pva ! total v-trend 416 INTEGER , INTENT(in ) :: kt ! ocean time-step index 417 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 418 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 419 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 462 420 ! 463 421 INTEGER :: ji, jj, jk ! dummy loop indices … … 465 423 REAL(wp) :: zua, zva ! local scalars 466 424 REAL(wp) :: zmsk, ze3 ! local scalars 467 ! 468 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, z1_e3f 469 REAL(wp), POINTER, DIMENSION(:,:) :: ztnw, ztne, ztsw, ztse 470 !!---------------------------------------------------------------------- 471 ! 472 IF( nn_timing == 1 ) CALL timing_start('vor_een') 473 ! 474 CALL wrk_alloc( jpi,jpj, zwx , zwy , zwz , z1_e3f ) 475 CALL wrk_alloc( jpi,jpj, ztnw, ztne, ztsw, ztse ) 425 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy , zwz , z1_e3f 426 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse 427 !!---------------------------------------------------------------------- 428 ! 429 IF( ln_timing ) CALL timing_start('vor_een') 476 430 ! 477 431 IF( kt == nit000 ) THEN … … 599 553 ! ! =============== 600 554 ! 601 CALL wrk_dealloc( jpi,jpj, zwx , zwy , zwz , z1_e3f ) 602 CALL wrk_dealloc( jpi,jpj, ztnw, ztne, ztsw, ztse ) 603 ! 604 IF( nn_timing == 1 ) CALL timing_stop('vor_een') 555 IF( ln_timing ) CALL timing_stop('vor_een') 605 556 ! 606 557 END SUBROUTINE vor_een … … 618 569 INTEGER :: ios ! Local integer output status for namelist read 619 570 !! 620 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, nn_een_e3f, ln_dynvor_msk 571 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, & 572 & ln_dynvor_een, nn_een_e3f , ln_dynvor_msk 621 573 !!---------------------------------------------------------------------- 622 574 … … 672 624 ! 673 625 IF(lwp) WRITE(numout,*) ! type of calculated vorticity (set ncor, nrvm, ntot) 674 ncor = np_COR 675 IF( ln_dynadv_vec ) THEN 676 IF(lwp) WRITE(numout,*) ' ===>> Vector form advection : vorticity = Coriolis + relative vorticity' 626 ncor = np_COR ! planetary vorticity 627 SELECT CASE( n_dynadv ) 628 CASE( np_LIN_dyn ) 629 IF(lwp) WRITE(numout,*) ' ===>> linear dynamics : total vorticity = Coriolis' 630 nrvm = np_COR ! planetary vorticity 631 ntot = np_COR ! - - 632 CASE( np_VEC_c2 ) 633 IF(lwp) WRITE(numout,*) ' ===>> vector form dynamics : total vorticity = Coriolis + relative vorticity' 677 634 nrvm = np_RVO ! relative vorticity 678 ntot = np_CRV ! relative + planetary vorticity 679 ELSE680 IF(lwp) WRITE(numout,*) ' ===>> Flux form advection :vorticity = Coriolis + metric term'635 ntot = np_CRV ! relative + planetary vorticity 636 CASE( np_FLX_c2 , np_FLX_ubs ) 637 IF(lwp) WRITE(numout,*) ' ===>> flux form dynamics : total vorticity = Coriolis + metric term' 681 638 nrvm = np_MET ! metric term 682 639 ntot = np_CME ! Coriolis + metric term 683 END IF640 END SELECT 684 641 685 642 IF(lwp) THEN ! Print the choice 686 643 WRITE(numout,*) 687 IF( nvor_scheme == np_ENE ) WRITE(numout,*) ' ===>> energy conserving scheme' 688 IF( nvor_scheme == np_ENS ) WRITE(numout,*) ' ===>> enstrophy conserving scheme' 689 IF( nvor_scheme == np_MIX ) WRITE(numout,*) ' ===>> mixed enstrophy/energy conserving scheme' 690 IF( nvor_scheme == np_EEN ) WRITE(numout,*) ' ===>> energy and enstrophy conserving scheme' 644 SELECT CASE( nvor_scheme ) 645 CASE( np_ENE ) ; WRITE(numout,*) ' ===>> energy conserving scheme' 646 CASE( np_ENS ) ; WRITE(numout,*) ' ===>> enstrophy conserving scheme' 647 CASE( np_MIX ) ; WRITE(numout,*) ' ===>> mixed enstrophy/energy conserving scheme' 648 CASE( np_EEN ) ; WRITE(numout,*) ' ===>> energy and enstrophy conserving scheme' 649 END SELECT 691 650 ENDIF 692 651 !
Note: See TracChangeset
for help on using the changeset viewer.