Changeset 3294 for trunk/NEMOGCM/NEMO/OPA_SRC/DYN
- Timestamp:
- 2012-01-28T17:44:18+01:00 (12 years ago)
- Location:
- trunk/NEMOGCM/NEMO/OPA_SRC/DYN
- Files:
-
- 24 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/divcur.F90
r2715 r3294 27 27 USE sbc_oce, ONLY : ln_rnf ! surface boundary condition: ocean 28 28 USE sbcrnf ! river runoff 29 USE obc_oce ! ocean lateral open boundary condition30 29 USE cla ! cross land advection (cla_div routine) 31 30 USE in_out_manager ! I/O manager 32 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 33 32 USE lib_mpp ! MPP library 33 USE wrk_nemo ! Memory Allocation 34 USE timing ! Timing 34 35 35 36 IMPLICIT NONE … … 84 85 INTEGER, INTENT(in) :: kt ! ocean time-step index 85 86 ! 86 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zwu ! specific 2D workspace87 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zwv ! specific 2D workspace88 !89 87 INTEGER :: ji, jj, jk, jl ! dummy loop indices 90 88 INTEGER :: ii, ij, ijt, iju, ierr ! local integer 91 89 REAL(wp) :: zraur, zdep ! local scalar 92 !!---------------------------------------------------------------------- 93 90 REAL(wp), POINTER, DIMENSION(:,:) :: zwu ! specific 2D workspace 91 REAL(wp), POINTER, DIMENSION(:,:) :: zwv ! specific 2D workspace 92 !!---------------------------------------------------------------------- 93 ! 94 IF( nn_timing == 1 ) CALL timing_start('div_cur') 95 ! 96 CALL wrk_alloc( jpi , jpj+2, zwu ) 97 CALL wrk_alloc( jpi+4, jpj , zwv, kjstart = -1 ) 98 ! 94 99 IF( kt == nit000 ) THEN 95 100 IF(lwp) WRITE(numout,*) 96 101 IF(lwp) WRITE(numout,*) 'div_cur : horizontal velocity divergence and relative vorticity' 97 102 IF(lwp) WRITE(numout,*) '~~~~~~~ NOT optimal for auto-tasking case' 98 !99 ALLOCATE( zwu( jpi, 1:jpj+2) , zwv(-1:jpi+2, jpj) , STAT=ierr )100 IF( lk_mpp ) CALL mpp_sum( ierr )101 IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'div_cur : unable to allocate arrays' )102 103 ENDIF 103 104 … … 121 122 END DO 122 123 123 #if defined key_obc124 IF( Agrif_Root() ) THEN125 ! open boundaries (div must be zero behind the open boundary)126 ! mpp remark: The zeroing of hdivn can probably be extended to 1->jpi/jpj for the correct row/column127 IF( lp_obc_east ) hdivn(nie0p1:nie1p1,nje0 :nje1 ,jk) = 0.e0 ! east128 IF( lp_obc_west ) hdivn(niw0 :niw1 ,njw0 :njw1 ,jk) = 0.e0 ! west129 IF( lp_obc_north ) hdivn(nin0 :nin1 ,njn0p1:njn1p1,jk) = 0.e0 ! north130 IF( lp_obc_south ) hdivn(nis0 :nis1 ,njs0 :njs1 ,jk) = 0.e0 ! south131 ENDIF132 #endif133 124 IF( .NOT. AGRIF_Root() ) THEN 134 125 IF ((nbondi == 1).OR.(nbondi == 2)) hdivn(nlci-1 , : ,jk) = 0.e0 ! east … … 241 232 CALL lbc_lnk( hdivn, 'T', 1. ) ; CALL lbc_lnk( rotn , 'F', 1. ) ! lateral boundary cond. (no sign change) 242 233 ! 234 CALL wrk_dealloc( jpi , jpj+2, zwu ) 235 CALL wrk_dealloc( jpi+4, jpj , zwv, kjstart = -1 ) 236 ! 237 IF( nn_timing == 1 ) CALL timing_stop('div_cur') 238 ! 243 239 END SUBROUTINE div_cur 244 240 … … 278 274 REAL(wp) :: zraur, zdep ! local scalars 279 275 !!---------------------------------------------------------------------- 280 276 ! 277 IF( nn_timing == 1 ) CALL timing_start('div_cur') 278 ! 281 279 IF( kt == nit000 ) THEN 282 280 IF(lwp) WRITE(numout,*) … … 304 302 END DO 305 303 306 #if defined key_obc307 IF( Agrif_Root() ) THEN308 ! open boundaries (div must be zero behind the open boundary)309 ! mpp remark: The zeroing of hdivn can probably be extended to 1->jpi/jpj for the correct row/column310 IF( lp_obc_east ) hdivn(nie0p1:nie1p1,nje0 :nje1 ,jk) = 0.e0 ! east311 IF( lp_obc_west ) hdivn(niw0 :niw1 ,njw0 :njw1 ,jk) = 0.e0 ! west312 IF( lp_obc_north ) hdivn(nin0 :nin1 ,njn0p1:njn1p1,jk) = 0.e0 ! north313 IF( lp_obc_south ) hdivn(nis0 :nis1 ,njs0 :njs1 ,jk) = 0.e0 ! south314 ENDIF315 #endif316 304 IF( .NOT. AGRIF_Root() ) THEN 317 305 IF ((nbondi == 1).OR.(nbondi == 2)) hdivn(nlci-1 , : ,jk) = 0.e0 ! east … … 340 328 CALL lbc_lnk( hdivn, 'T', 1. ) ; CALL lbc_lnk( rotn , 'F', 1. ) ! lateral boundary cond. (no sign change) 341 329 ! 330 IF( nn_timing == 1 ) CALL timing_stop('div_cur') 331 ! 342 332 END SUBROUTINE div_cur 343 333 -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90
r2715 r3294 19 19 USE in_out_manager ! I/O manager 20 20 USE lib_mpp ! MPP library 21 USE timing ! Timing 21 22 22 23 IMPLICIT NONE … … 57 58 !!---------------------------------------------------------------------- 58 59 ! 60 IF( nn_timing == 1 ) CALL timing_start('dyn_adv') 61 ! 59 62 SELECT CASE ( nadv ) ! compute advection trend and add it to general trend 60 63 CASE ( 0 ) … … 72 75 CALL dyn_adv_ubs ( kt ) 73 76 END SELECT 77 ! 78 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv') 74 79 ! 75 80 END SUBROUTINE dyn_adv -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_cen2.F90
r2715 r3294 20 20 USE lib_mpp ! MPP library 21 21 USE prtctl ! Print control 22 USE wrk_nemo ! Memory Allocation 23 USE timing ! Timing 22 24 23 25 IMPLICIT NONE … … 47 49 !! ** Action : (ua,va) updated with the now vorticity term trend 48 50 !!---------------------------------------------------------------------- 49 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released50 USE oce , ONLY: zfu => ta , zfv => sa ! (ta,sa) used as 3D workspace51 USE wrk_nemo, ONLY: zfu_t => wrk_3d_1 , zfv_t => wrk_3d_4 , zfu_uw =>wrk_3d_6 ! 3D workspaces52 USE wrk_nemo, ONLY: zfu_f => wrk_3d_2 , zfv_f => wrk_3d_5 , zfv_vw =>wrk_3d_753 USE wrk_nemo, ONLY: zfw => wrk_3d_354 !55 51 INTEGER, INTENT( in ) :: kt ! ocean time-step index 56 52 ! 57 53 INTEGER :: ji, jj, jk ! dummy loop indices 58 54 REAL(wp) :: zbu, zbv ! local scalars 55 REAL(wp), POINTER, DIMENSION(:,:,:) :: zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfw 56 REAL(wp), POINTER, DIMENSION(:,:,:) :: zfu, zfv 59 57 !!---------------------------------------------------------------------- 60 58 ! 59 IF( nn_timing == 1 ) CALL timing_start('dyn_adv_cen2') 60 ! 61 CALL wrk_alloc( jpi, jpj, jpk, zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 62 ! 61 63 IF( kt == nit000 .AND. lwp ) THEN 62 64 WRITE(numout,*) … … 64 66 WRITE(numout,*) '~~~~~~~~~~~~' 65 67 ENDIF 66 67 ! Check that global workspace arrays aren't already in use 68 IF( wrk_in_use(3, 1,2,3,4,5,6,7) ) THEN 69 CALL ctl_stop('dyn_adv_cen2 : requested workspace array unavailable') ; RETURN 70 ENDIF 71 68 ! 72 69 IF( l_trddyn ) THEN ! Save ua and va trends 73 70 zfu_uw(:,:,:) = ua(:,:,:) … … 162 159 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 163 160 ! 164 IF( wrk_not_released(3, 1,2,3,4,5,6,7) ) CALL ctl_stop('dyn_adv_cen2: failed to release workspace array') 161 CALL wrk_dealloc( jpi, jpj, jpk, zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 162 ! 163 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv_cen2') 165 164 ! 166 165 END SUBROUTINE dyn_adv_cen2 -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_ubs.F90
r2715 r3294 22 22 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 23 23 USE lib_mpp ! MPP library 24 USE wrk_nemo ! Memory Allocation 25 USE timing ! Timing 24 26 25 27 IMPLICIT NONE 26 28 PRIVATE 27 29 28 REAL(wp), PARAMETER :: gamma1 = 1._wp/ 4._wp ! =1/4 quick ; =1/3 3rd order UBS30 REAL(wp), PARAMETER :: gamma1 = 1._wp/3._wp ! =1/4 quick ; =1/3 3rd order UBS 29 31 REAL(wp), PARAMETER :: gamma2 = 1._wp/8._wp ! =0 2nd order ; =1/8 4th order centred 30 32 … … 62 64 !! before velocity (forward in time). 63 65 !! Default value (hard coded in the begining of the module) are 64 !! gamma1=1/ 4and gamma2=1/8.66 !! gamma1=1/3 and gamma2=1/8. 65 67 !! 66 68 !! ** Action : - (ua,va) updated with the 3D advective momentum trends … … 68 70 !! Reference : Shchepetkin & McWilliams, 2005, Ocean Modelling. 69 71 !!---------------------------------------------------------------------- 70 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released71 USE oce , ONLY: zfu => ta , zfv => sa ! (ta,sa) used as 3D workspace72 USE wrk_nemo, ONLY: zfu_t => wrk_3d_1 , zfv_t =>wrk_3d_4 , zfu_uw =>wrk_3d_6 ! 3D workspace73 USE wrk_nemo, ONLY: zfu_f => wrk_3d_2 , zfv_f =>wrk_3d_5 , zfv_vw =>wrk_3d_774 USE wrk_nemo, ONLY: zfw => wrk_3d_375 USE wrk_nemo, ONLY: zlu_uu => wrk_4d_1 , zlv_vv=>wrk_4d_3 ! 4D workspace76 USE wrk_nemo, ONLY: zlu_uv => wrk_4d_2 , zlv_vu=>wrk_4d_477 !78 72 INTEGER, INTENT(in) :: kt ! ocean time-step index 79 73 ! … … 81 75 REAL(wp) :: zbu, zbv ! temporary scalars 82 76 REAL(wp) :: zui, zvj, zfuj, zfvi, zl_u, zl_v ! temporary scalars 77 REAL(wp), POINTER, DIMENSION(:,:,: ) :: zfu, zfv 78 REAL(wp), POINTER, DIMENSION(:,:,: ) :: zfu_t, zfv_t, zfu_f, zfv_f, zfu_uw, zfv_vw, zfw 79 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zlu_uu, zlv_vv, zlu_uv, zlv_vu 83 80 !!---------------------------------------------------------------------- 84 81 ! 82 IF( nn_timing == 1 ) CALL timing_start('dyn_adv_ubs') 83 ! 84 CALL wrk_alloc( jpi, jpj, jpk, zfu_t , zfv_t , zfu_f , zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 85 CALL wrk_alloc( jpi, jpj, jpk, jpts, zlu_uu, zlv_vv, zlu_uv, zlv_vu ) 86 ! 85 87 IF( kt == nit000 ) THEN 86 88 IF(lwp) WRITE(numout,*) … … 88 90 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 89 91 ENDIF 90 91 ! Check that required workspace arrays are not already in use 92 IF( wrk_in_use(3, 1,2,3,4,5,6,7) .OR. wrk_in_use(4, 1,2,3,4) ) THEN 93 CALL ctl_stop('dyn_adv_ubs: requested workspace array unavailable') ; RETURN 94 ENDIF 95 92 ! 96 93 zfu_t(:,:,:) = 0._wp 97 94 zfv_t(:,:,:) = 0._wp … … 254 251 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 255 252 ! 256 IF( wrk_not_released(3, 1,2,3,4,5,6,7) .OR. & 257 wrk_not_released(4, 1,2,3,4) ) CALL ctl_stop('dyn_adv_ubs: failed to release workspace array') 253 CALL wrk_dealloc( jpi, jpj, jpk, zfu_t , zfv_t , zfu_f , zfv_f, zfu_uw, zfv_vw, zfu, zfv, zfw ) 254 CALL wrk_dealloc( jpi, jpj, jpk, jpts, zlu_uu, zlv_vv, zlu_uv, zlv_vu ) 255 ! 256 IF( nn_timing == 1 ) CALL timing_stop('dyn_adv_ubs') 258 257 ! 259 258 END SUBROUTINE dyn_adv_ubs -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90
r2715 r3294 5 5 !!============================================================================== 6 6 !! History : 3.2 ! 2008-11 (A. C. Coward) Original code 7 !! 3.4 ! 2011-09 (H. Liu) Make it consistent with semi-implicit 8 !! Bottom friction (ln_bfrimp = .true.) 7 9 !!---------------------------------------------------------------------- 8 10 … … 13 15 USE dom_oce ! ocean space and time domain variables 14 16 USE zdf_oce ! ocean vertical physics variables 17 USE zdfbfr ! ocean bottom friction variables 15 18 USE trdmod ! ocean active dynamics and tracers trends 16 19 USE trdmod_oce ! ocean variables trends 17 20 USE in_out_manager ! I/O manager 18 21 USE prtctl ! Print control 22 USE timing ! Timing 23 USE wrk_nemo ! Memory Allocation 19 24 20 25 IMPLICIT NONE … … 42 47 !! ** Action : (ua,va) momentum trend increased by bottom friction trend 43 48 !!--------------------------------------------------------------------- 44 USE oce, ONLY: ztrduv => tsa ! tsa used as 4D workspace45 !!46 49 INTEGER, INTENT(in) :: kt ! ocean time-step index 47 50 !! … … 49 52 INTEGER :: ikbu, ikbv ! local integers 50 53 REAL(wp) :: zm1_2dt ! local scalar 54 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 51 55 !!--------------------------------------------------------------------- 52 56 ! 53 zm1_2dt = - 1._wp / ( 2._wp * rdt ) 57 IF( nn_timing == 1 ) CALL timing_start('dyn_bfr') 58 ! 59 IF( .NOT.ln_bfrimp) THEN ! only for explicit bottom friction form 60 ! implicit bfr is implemented in dynzdf_imp 54 61 55 IF( l_trddyn ) THEN ! temporary save of ua and va trends 56 ztrduv(:,:,:,1) = ua(:,:,:) 57 ztrduv(:,:,:,2) = va(:,:,:) 58 ENDIF 62 zm1_2dt = - 1._wp / ( 2._wp * rdt ) 63 64 IF( l_trddyn ) THEN ! temporary save of ua and va trends 65 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 66 ztrdu(:,:,:) = ua(:,:,:) 67 ztrdv(:,:,:) = va(:,:,:) 68 ENDIF 69 59 70 60 71 # if defined key_vectopt_loop 61 DO jj = 1, 162 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling)72 DO jj = 1, 1 73 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 63 74 # else 64 DO jj = 2, jpjm165 DO ji = 2, jpim175 DO jj = 2, jpjm1 76 DO ji = 2, jpim1 66 77 # endif 67 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels68 ikbv = mbkv(ji,jj)69 !70 ! Apply stability criteria on absolute value : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt)71 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX( bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt ) * ub(ji,jj,ikbu)72 va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX( bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt ) * vb(ji,jj,ikbv)73 END DO74 END DO78 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels 79 ikbv = mbkv(ji,jj) 80 ! 81 ! Apply stability criteria on absolute value : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 82 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX( bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt ) * ub(ji,jj,ikbu) 83 va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX( bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt ) * vb(ji,jj,ikbv) 84 END DO 85 END DO 75 86 87 ! 88 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 89 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 90 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 91 CALL trd_mod( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_trd_bfr, 'DYN', kt ) 92 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 93 ENDIF 94 ! ! print mean trends (used for debugging) 95 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr - Ua: ', mask1=umask, & 96 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 97 ! 98 ENDIF ! end explicit bottom friction 76 99 ! 77 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 78 ztrduv(:,:,:,1) = ua(:,:,:) - ztrduv(:,:,:,1) 79 ztrduv(:,:,:,2) = va(:,:,:) - ztrduv(:,:,:,2) 80 CALL trd_mod( ztrduv(:,:,:,1), ztrduv(:,:,:,2), jpdyn_trd_bfr, 'DYN', kt ) 81 ENDIF 82 ! ! print mean trends (used for debugging) 83 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr - Ua: ', mask1=umask, & 84 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 100 IF( nn_timing == 1 ) CALL timing_stop('dyn_bfr') 85 101 ! 86 102 END SUBROUTINE dyn_bfr -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90
r2715 r3294 14 14 !! - ! 2005-11 (G. Madec) style & small optimisation 15 15 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 16 !! 3.4 ! 2011-11 (H. Liu) hpg_prj: Original code for s-coordinates 17 !! ! (A. Coward) suppression of hel, wdj and rot options 16 18 !!---------------------------------------------------------------------- 17 19 … … 23 25 !! hpg_zps : z-coordinate plus partial steps (interpolation) 24 26 !! hpg_sco : s-coordinate (standard jacobian formulation) 25 !! hpg_hel : s-coordinate (helsinki modification)26 !! hpg_wdj : s-coordinate (weighted density jacobian)27 27 !! hpg_djc : s-coordinate (Density Jacobian with Cubic polynomial) 28 !! hpg_ rot : s-coordinate (ROTated axes scheme)28 !! hpg_prj : s-coordinate (Pressure Jacobian with Cubic polynomial) 29 29 !!---------------------------------------------------------------------- 30 30 USE oce ! ocean dynamics and tracers … … 37 37 USE lbclnk ! lateral boundary condition 38 38 USE lib_mpp ! MPP library 39 USE wrk_nemo ! Memory Allocation 40 USE timing ! Timing 39 41 40 42 IMPLICIT NONE … … 48 50 LOGICAL , PUBLIC :: ln_hpg_zps = .FALSE. !: z-coordinate - partial steps (interpolation) 49 51 LOGICAL , PUBLIC :: ln_hpg_sco = .FALSE. !: s-coordinate (standard jacobian formulation) 50 LOGICAL , PUBLIC :: ln_hpg_hel = .FALSE. !: s-coordinate (helsinki modification)51 LOGICAL , PUBLIC :: ln_hpg_wdj = .FALSE. !: s-coordinate (weighted density jacobian)52 52 LOGICAL , PUBLIC :: ln_hpg_djc = .FALSE. !: s-coordinate (Density Jacobian with Cubic polynomial) 53 LOGICAL , PUBLIC :: ln_hpg_rot = .FALSE. !: s-coordinate (ROTated axes scheme) 54 REAL(wp), PUBLIC :: rn_gamma = 0._wp !: weighting coefficient 53 LOGICAL , PUBLIC :: ln_hpg_prj = .FALSE. !: s-coordinate (Pressure Jacobian scheme) 55 54 LOGICAL , PUBLIC :: ln_dynhpg_imp = .FALSE. !: semi-implicite hpg flag 56 55 57 INTEGER :: nhpg = 0 ! = 0 to 6, type of pressure gradient scheme used ! (deduced from ln_hpg_... flags)56 INTEGER :: nhpg = 0 ! = 0 to 7, type of pressure gradient scheme used ! (deduced from ln_hpg_... flags) 58 57 59 58 !! * Substitutions … … 77 76 !! - Save the trend (l_trddyn=T) 78 77 !!---------------------------------------------------------------------- 79 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released80 USE wrk_nemo, ONLY: ztrdu => wrk_3d_1 , ztrdv => wrk_3d_2 ! 3D workspace81 !!82 78 INTEGER, INTENT(in) :: kt ! ocean time-step index 83 !!---------------------------------------------------------------------- 84 ! 85 IF( wrk_in_use(3, 1,2) ) THEN 86 CALL ctl_stop('dyn_hpg: requested workspace arrays are unavailable') ; RETURN 87 ENDIF 79 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 80 !!---------------------------------------------------------------------- 81 ! 82 IF( nn_timing == 1 ) CALL timing_start('dyn_hpg') 88 83 ! 89 84 IF( l_trddyn ) THEN ! Temporary saving of ua and va trends (l_trddyn) 85 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 90 86 ztrdu(:,:,:) = ua(:,:,:) 91 87 ztrdv(:,:,:) = va(:,:,:) 92 88 ENDIF 93 89 ! 94 SELECT CASE ( nhpg ) ! Hydr astatic pressure gradient computation90 SELECT CASE ( nhpg ) ! Hydrostatic pressure gradient computation 95 91 CASE ( 0 ) ; CALL hpg_zco ( kt ) ! z-coordinate 96 92 CASE ( 1 ) ; CALL hpg_zps ( kt ) ! z-coordinate plus partial steps (interpolation) 97 93 CASE ( 2 ) ; CALL hpg_sco ( kt ) ! s-coordinate (standard jacobian formulation) 98 CASE ( 3 ) ; CALL hpg_hel ( kt ) ! s-coordinate (helsinki modification) 99 CASE ( 4 ) ; CALL hpg_wdj ( kt ) ! s-coordinate (weighted density jacobian) 100 CASE ( 5 ) ; CALL hpg_djc ( kt ) ! s-coordinate (Density Jacobian with Cubic polynomial) 101 CASE ( 6 ) ; CALL hpg_rot ( kt ) ! s-coordinate (ROTated axes scheme) 94 CASE ( 3 ) ; CALL hpg_djc ( kt ) ! s-coordinate (Density Jacobian with Cubic polynomial) 95 CASE ( 4 ) ; CALL hpg_prj ( kt ) ! s-coordinate (Pressure Jacobian scheme) 102 96 END SELECT 103 97 ! … … 106 100 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 107 101 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_hpg, 'DYN', kt ) 102 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 108 103 ENDIF 109 104 ! … … 111 106 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 112 107 ! 113 IF( wrk_not_released(3, 1,2) ) CALL ctl_stop('dyn_hpg: failed to release workspace arrays')108 IF( nn_timing == 1 ) CALL timing_stop('dyn_hpg') 114 109 ! 115 110 END SUBROUTINE dyn_hpg … … 128 123 INTEGER :: ioptio = 0 ! temporary integer 129 124 !! 130 NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco, ln_hpg_hel,&131 & ln_hpg_ wdj, ln_hpg_djc, ln_hpg_rot, rn_gamma, ln_dynhpg_imp125 NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco, & 126 & ln_hpg_djc, ln_hpg_prj, ln_dynhpg_imp 132 127 !!---------------------------------------------------------------------- 133 128 ! … … 143 138 WRITE(numout,*) ' z-coord. - partial steps (interpolation) ln_hpg_zps = ', ln_hpg_zps 144 139 WRITE(numout,*) ' s-coord. (standard jacobian formulation) ln_hpg_sco = ', ln_hpg_sco 145 WRITE(numout,*) ' s-coord. (helsinki modification) ln_hpg_hel = ', ln_hpg_hel146 WRITE(numout,*) ' s-coord. (weighted density jacobian) ln_hpg_wdj = ', ln_hpg_wdj147 140 WRITE(numout,*) ' s-coord. (Density Jacobian: Cubic polynomial) ln_hpg_djc = ', ln_hpg_djc 148 WRITE(numout,*) ' s-coord. (ROTated axes scheme) ln_hpg_rot = ', ln_hpg_rot 149 WRITE(numout,*) ' weighting coeff. (wdj scheme) rn_gamma = ', rn_gamma 141 WRITE(numout,*) ' s-coord. (Pressure Jacobian: Cubic polynomial) ln_hpg_prj = ', ln_hpg_prj 150 142 WRITE(numout,*) ' time stepping: centered (F) or semi-implicit (T) ln_dynhpg_imp = ', ln_dynhpg_imp 151 143 ENDIF 152 144 ! 153 IF( lk_vvl .AND. .NOT. ln_hpg_sco ) & 154 & CALL ctl_stop('dyn_hpg_init : variable volume key_vvl require the standard jacobian formulation hpg_sco') 145 IF( ln_hpg_djc ) & 146 & CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method & 147 & currently disabled (bugs under investigation). Please select & 148 & either ln_hpg_sco or ln_hpg_prj instead') 149 ! 150 IF( lk_vvl .AND. .NOT. (ln_hpg_sco.OR.ln_hpg_prj) ) & 151 & CALL ctl_stop('dyn_hpg_init : variable volume key_vvl requires:& 152 & the standard jacobian formulation hpg_sco or & 153 & the pressure jacobian formulation hpg_prj') 155 154 ! 156 155 ! ! Set nhpg from ln_hpg_... flags … … 158 157 IF( ln_hpg_zps ) nhpg = 1 159 158 IF( ln_hpg_sco ) nhpg = 2 160 IF( ln_hpg_hel ) nhpg = 3 161 IF( ln_hpg_wdj ) nhpg = 4 162 IF( ln_hpg_djc ) nhpg = 5 163 IF( ln_hpg_rot ) nhpg = 6 164 ! 165 ! ! Consitency check 159 IF( ln_hpg_djc ) nhpg = 3 160 IF( ln_hpg_prj ) nhpg = 4 161 ! 162 ! ! Consistency check 166 163 ioptio = 0 167 164 IF( ln_hpg_zco ) ioptio = ioptio + 1 168 165 IF( ln_hpg_zps ) ioptio = ioptio + 1 169 166 IF( ln_hpg_sco ) ioptio = ioptio + 1 170 IF( ln_hpg_hel ) ioptio = ioptio + 1171 IF( ln_hpg_wdj ) ioptio = ioptio + 1172 167 IF( ln_hpg_djc ) ioptio = ioptio + 1 173 IF( ln_hpg_ rot) ioptio = ioptio + 1168 IF( ln_hpg_prj ) ioptio = ioptio + 1 174 169 IF( ioptio /= 1 ) CALL ctl_stop( 'NO or several hydrostatic pressure gradient options used' ) 175 170 ! … … 193 188 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 194 189 !!---------------------------------------------------------------------- 195 USE oce, ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace196 !!197 190 INTEGER, INTENT(in) :: kt ! ocean time-step index 198 191 !! 199 192 INTEGER :: ji, jj, jk ! dummy loop indices 200 193 REAL(wp) :: zcoef0, zcoef1 ! temporary scalars 201 !!---------------------------------------------------------------------- 202 194 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 195 !!---------------------------------------------------------------------- 196 ! 197 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 198 ! 203 199 IF( kt == nit000 ) THEN 204 200 IF(lwp) WRITE(numout,*) … … 221 217 END DO 222 218 END DO 219 223 220 ! 224 221 ! interior value (2=<jk=<jpkm1) … … 242 239 END DO 243 240 ! 241 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 242 ! 244 243 END SUBROUTINE hpg_zco 245 244 … … 253 252 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 254 253 !!---------------------------------------------------------------------- 255 USE oce, ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace256 !!257 254 INTEGER, INTENT(in) :: kt ! ocean time-step index 258 255 !! … … 260 257 INTEGER :: iku, ikv ! temporary integers 261 258 REAL(wp) :: zcoef0, zcoef1, zcoef2, zcoef3 ! temporary scalars 262 !!---------------------------------------------------------------------- 263 259 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 260 !!---------------------------------------------------------------------- 261 ! 262 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 263 ! 264 264 IF( kt == nit000 ) THEN 265 265 IF(lwp) WRITE(numout,*) … … 267 267 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate with partial steps - vector optimization' 268 268 ENDIF 269 269 270 270 271 ! Local constant initialization … … 284 285 END DO 285 286 287 286 288 ! interior value (2=<jk=<jpkm1) 287 289 DO jk = 2, jpkm1 … … 303 305 END DO 304 306 END DO 307 305 308 306 309 ! partial steps correction at the last level (use gru & grv computed in zpshde.F90) … … 333 336 END DO 334 337 ! 338 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 339 ! 335 340 END SUBROUTINE hpg_zps 336 341 … … 354 359 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 355 360 !!---------------------------------------------------------------------- 356 USE oce, ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace357 !!358 361 INTEGER, INTENT(in) :: kt ! ocean time-step index 359 362 !! 360 363 INTEGER :: ji, jj, jk ! dummy loop indices 361 364 REAL(wp) :: zcoef0, zuap, zvap, znad ! temporary scalars 362 !!---------------------------------------------------------------------- 363 365 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 366 !!---------------------------------------------------------------------- 367 ! 368 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 369 ! 364 370 IF( kt == nit000 ) THEN 365 371 IF(lwp) WRITE(numout,*) … … 417 423 END DO 418 424 ! 425 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 426 ! 419 427 END SUBROUTINE hpg_sco 420 421 422 SUBROUTINE hpg_hel( kt )423 !!---------------------------------------------------------------------424 !! *** ROUTINE hpg_hel ***425 !!426 !! ** Method : s-coordinate case.427 !! The now hydrostatic pressure gradient at a given level428 !! jk is computed by taking the vertical integral of the in-situ429 !! density gradient along the model level from the suface to that430 !! level. s-coordinates (ln_sco): a corrective term is added431 !! to the horizontal pressure gradient :432 !! zhpi = grav ..... + 1/e1u mi(rhd) di[ grav dep3w ]433 !! zhpj = grav ..... + 1/e2v mj(rhd) dj[ grav dep3w ]434 !! add it to the general momentum trend (ua,va).435 !! ua = ua - 1/e1u * zhpi436 !! va = va - 1/e2v * zhpj437 !!438 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend439 !! - Save the trend (l_trddyn=T)440 !!----------------------------------------------------------------------441 USE oce, ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace442 !!443 INTEGER, INTENT(in) :: kt ! ocean time-step index444 !!445 INTEGER :: ji, jj, jk ! dummy loop indices446 REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars447 !!----------------------------------------------------------------------448 449 IF( kt == nit000 ) THEN450 IF(lwp) WRITE(numout,*)451 IF(lwp) WRITE(numout,*) 'dyn:hpg_hel : hydrostatic pressure gradient trend'452 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, helsinki modified scheme'453 ENDIF454 455 ! Local constant initialization456 zcoef0 = - grav * 0.5_wp457 458 ! Surface value459 DO jj = 2, jpjm1460 DO ji = fs_2, fs_jpim1 ! vector opt.461 ! hydrostatic pressure gradient along s-surfaces462 zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3t(ji+1,jj ,1) * rhd(ji+1,jj ,1) &463 & - fse3t(ji ,jj ,1) * rhd(ji ,jj ,1) )464 zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3t(ji ,jj+1,1) * rhd(ji ,jj+1,1) &465 & - fse3t(ji ,jj ,1) * rhd(ji ,jj ,1) )466 ! s-coordinate pressure gradient correction467 zuap = -zcoef0 * ( rhd (ji+1,jj,1) + rhd (ji,jj,1) ) &468 & * ( fsdept(ji+1,jj,1) - fsdept(ji,jj,1) ) / e1u(ji,jj)469 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) ) &470 & * ( fsdept(ji,jj+1,1) - fsdept(ji,jj,1) ) / e2v(ji,jj)471 ! add to the general momentum trend472 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap473 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap474 END DO475 END DO476 !477 ! interior value (2=<jk=<jpkm1)478 DO jk = 2, jpkm1479 DO jj = 2, jpjm1480 DO ji = fs_2, fs_jpim1 ! vector opt.481 ! hydrostatic pressure gradient along s-surfaces482 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) &483 & + zcoef0 / e1u(ji,jj) * ( fse3t(ji+1,jj,jk ) * rhd(ji+1,jj,jk) &484 & -fse3t(ji ,jj,jk ) * rhd(ji ,jj,jk) ) &485 & + zcoef0 / e1u(ji,jj) * ( fse3t(ji+1,jj,jk-1) * rhd(ji+1,jj,jk-1) &486 & -fse3t(ji ,jj,jk-1) * rhd(ji ,jj,jk-1) )487 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) &488 & + zcoef0 / e2v(ji,jj) * ( fse3t(ji,jj+1,jk ) * rhd(ji,jj+1,jk) &489 & -fse3t(ji,jj ,jk ) * rhd(ji,jj, jk) ) &490 & + zcoef0 / e2v(ji,jj) * ( fse3t(ji,jj+1,jk-1) * rhd(ji,jj+1,jk-1) &491 & -fse3t(ji,jj ,jk-1) * rhd(ji,jj, jk-1) )492 ! s-coordinate pressure gradient correction493 zuap = - zcoef0 * ( rhd (ji+1,jj,jk) + rhd (ji,jj,jk) ) &494 & * ( fsdept(ji+1,jj,jk) - fsdept(ji,jj,jk) ) / e1u(ji,jj)495 zvap = - zcoef0 * ( rhd (ji,jj+1,jk) + rhd (ji,jj,jk) ) &496 & * ( fsdept(ji,jj+1,jk) - fsdept(ji,jj,jk) ) / e2v(ji,jj)497 ! add to the general momentum trend498 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap499 va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) + zvap500 END DO501 END DO502 END DO503 !504 END SUBROUTINE hpg_hel505 506 507 SUBROUTINE hpg_wdj( kt )508 !!---------------------------------------------------------------------509 !! *** ROUTINE hpg_wdj ***510 !!511 !! ** Method : Weighted Density Jacobian (wdj) scheme (song 1998)512 !! The weighting coefficients from the namelist parameter rn_gamma513 !! (alpha=0.5-rn_gamma ; beta=1-alpha=0.5+rn_gamma514 !!515 !! Reference : Song, Mon. Wea. Rev., 126, 3213-3230, 1998.516 !!----------------------------------------------------------------------517 USE oce, ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace518 !!519 INTEGER, INTENT(in) :: kt ! ocean time-step index520 !!521 INTEGER :: ji, jj, jk ! dummy loop indices522 REAL(wp) :: zcoef0, zuap, zvap ! temporary scalars523 REAL(wp) :: zalph , zbeta ! " "524 !!----------------------------------------------------------------------525 526 IF( kt == nit000 ) THEN527 IF(lwp) WRITE(numout,*)528 IF(lwp) WRITE(numout,*) 'dyn:hpg_wdj : hydrostatic pressure gradient trend'529 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ Weighted Density Jacobian'530 ENDIF531 532 ! Local constant initialization533 zcoef0 = - grav * 0.5_wp534 zalph = 0.5_wp - rn_gamma ! weighting coefficients (alpha=0.5-rn_gamma535 zbeta = 0.5_wp + rn_gamma ! (beta =1-alpha=0.5+rn_gamma536 537 ! Surface value (no ponderation)538 DO jj = 2, jpjm1539 DO ji = fs_2, fs_jpim1 ! vector opt.540 ! hydrostatic pressure gradient along s-surfaces541 zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3w(ji+1,jj ,1) * rhd(ji+1,jj ,1) &542 & - fse3w(ji ,jj ,1) * rhd(ji ,jj ,1) )543 zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3w(ji ,jj+1,1) * rhd(ji ,jj+1,1) &544 & - fse3w(ji ,jj ,1) * rhd(ji, jj ,1) )545 ! s-coordinate pressure gradient correction546 zuap = -zcoef0 * ( rhd (ji+1,jj,1) + rhd (ji,jj,1) ) &547 & * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj)548 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) ) &549 & * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj)550 ! add to the general momentum trend551 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap552 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap553 END DO554 END DO555 556 ! Interior value (2=<jk=<jpkm1) (weighted with zalph & zbeta)557 DO jk = 2, jpkm1558 DO jj = 2, jpjm1559 DO ji = fs_2, fs_jpim1 ! vector opt.560 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj) &561 & * ( ( fsde3w(ji+1,jj,jk ) + fsde3w(ji,jj,jk ) &562 & - fsde3w(ji+1,jj,jk-1) - fsde3w(ji,jj,jk-1) ) &563 & * ( zalph * ( rhd (ji+1,jj,jk-1) - rhd (ji,jj,jk-1) ) &564 & + zbeta * ( rhd (ji+1,jj,jk ) - rhd (ji,jj,jk ) ) ) &565 & - ( rhd (ji+1,jj,jk ) + rhd (ji,jj,jk ) &566 & - rhd (ji+1,jj,jk-1) - rhd (ji,jj,jk-1) ) &567 & * ( zalph * ( fsde3w(ji+1,jj,jk-1) - fsde3w(ji,jj,jk-1) ) &568 & + zbeta * ( fsde3w(ji+1,jj,jk ) - fsde3w(ji,jj,jk ) ) ) )569 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj) &570 & * ( ( fsde3w(ji,jj+1,jk ) + fsde3w(ji,jj,jk ) &571 & - fsde3w(ji,jj+1,jk-1) - fsde3w(ji,jj,jk-1) ) &572 & * ( zalph * ( rhd (ji,jj+1,jk-1) - rhd (ji,jj,jk-1) ) &573 & + zbeta * ( rhd (ji,jj+1,jk ) - rhd (ji,jj,jk ) ) ) &574 & - ( rhd (ji,jj+1,jk ) + rhd (ji,jj,jk ) &575 & - rhd (ji,jj+1,jk-1) - rhd (ji,jj,jk-1) ) &576 & * ( zalph * ( fsde3w(ji,jj+1,jk-1) - fsde3w(ji,jj,jk-1) ) &577 & + zbeta * ( fsde3w(ji,jj+1,jk ) - fsde3w(ji,jj,jk ) ) ) )578 ! add to the general momentum trend579 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk)580 va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk)581 END DO582 END DO583 END DO584 !585 END SUBROUTINE hpg_wdj586 587 428 588 429 SUBROUTINE hpg_djc( kt ) … … 594 435 !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003 595 436 !!---------------------------------------------------------------------- 596 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released597 USE oce , ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace598 USE wrk_nemo, ONLY: drhox => wrk_3d_1 , dzx => wrk_3d_2599 USE wrk_nemo, ONLY: drhou => wrk_3d_3 , dzu => wrk_3d_4 , rho_i => wrk_3d_5600 USE wrk_nemo, ONLY: drhoy => wrk_3d_6 , dzy => wrk_3d_7601 USE wrk_nemo, ONLY: drhov => wrk_3d_8 , dzv => wrk_3d_9 , rho_j => wrk_3d_10602 USE wrk_nemo, ONLY: drhoz => wrk_3d_11 , dzz => wrk_3d_12603 USE wrk_nemo, ONLY: drhow => wrk_3d_13 , dzw => wrk_3d_14604 USE wrk_nemo, ONLY: rho_k => wrk_3d_15605 !!606 437 INTEGER, INTENT(in) :: kt ! ocean time-step index 607 438 !! … … 610 441 REAL(wp) :: z1_10, cffu, cffx ! " " 611 442 REAL(wp) :: z1_12, cffv, cffy ! " " 612 !!---------------------------------------------------------------------- 613 614 IF( wrk_in_use(3, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ) THEN 615 CALL ctl_stop('dyn:hpg_djc: requested workspace arrays unavailable') ; RETURN 616 ENDIF 443 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zhpj 444 REAL(wp), POINTER, DIMENSION(:,:,:) :: dzx, dzy, dzz, dzu, dzv, dzw 445 REAL(wp), POINTER, DIMENSION(:,:,:) :: drhox, drhoy, drhoz, drhou, drhov, drhow 446 REAL(wp), POINTER, DIMENSION(:,:,:) :: rho_i, rho_j, rho_k 447 !!---------------------------------------------------------------------- 448 ! 449 CALL wrk_alloc( jpi, jpj, jpk, dzx , dzy , dzz , dzu , dzv , dzw ) 450 CALL wrk_alloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 451 CALL wrk_alloc( jpi, jpj, jpk, rho_i, rho_j, rho_k, zhpi, zhpj ) 452 ! 617 453 618 454 IF( kt == nit000 ) THEN … … 811 647 END DO 812 648 ! 813 IF( wrk_not_released(3, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) ) & 814 CALL ctl_stop('dyn:hpg_djc: failed to release workspace arrays') 649 CALL wrk_dealloc( jpi, jpj, jpk, dzx , dzy , dzz , dzu , dzv , dzw ) 650 CALL wrk_dealloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 651 CALL wrk_dealloc( jpi, jpj, jpk, rho_i, rho_j, rho_k, zhpi, zhpj ) 815 652 ! 816 653 END SUBROUTINE hpg_djc 817 654 818 655 819 SUBROUTINE hpg_ rot( kt )656 SUBROUTINE hpg_prj( kt ) 820 657 !!--------------------------------------------------------------------- 821 !! *** ROUTINE hpg_rot *** 822 !! 823 !! ** Method : rotated axes scheme (Thiem and Berntsen 2005) 824 !! 825 !! Reference: Thiem & Berntsen, Ocean Modelling, In press, 2005. 826 !!---------------------------------------------------------------------- 827 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 828 USE oce , ONLY: zhpi => ta , zhpj => sa ! (ta,sa) used as 3D workspace 829 USE wrk_nemo, ONLY: zdistr => wrk_2d_1 , zsina => wrk_2d_2 , zcosa => wrk_2d_3 830 USE wrk_nemo, ONLY: zhpiorg => wrk_3d_1 , zhpirot => wrk_3d_2 831 USE wrk_nemo, ONLY: zhpitra => wrk_3d_3 , zhpine => wrk_3d_4 832 USE wrk_nemo, ONLY: zhpjorg => wrk_3d_5 , zhpjrot => wrk_3d_6 833 USE wrk_nemo, ONLY: zhpjtra => wrk_3d_7 , zhpjne => wrk_3d_8 834 !! 835 INTEGER, INTENT(in) :: kt ! ocean time-step index 836 !! 837 INTEGER :: ji, jj, jk ! dummy loop indices 838 REAL(wp) :: zforg, zcoef0, zuap, zmskd1, zmskd1m ! temporary scalar 839 REAL(wp) :: zfrot , zvap, zmskd2, zmskd2m ! " " 840 !!---------------------------------------------------------------------- 841 842 IF( wrk_in_use(2, 1,2,3) .OR. & 843 wrk_in_use(3, 1,2,3,4,5,6,7,8) ) THEN 844 CALL ctl_stop('dyn:hpg_rot: requested workspace arrays unavailable') ; RETURN 845 ENDIF 846 658 !! *** ROUTINE hpg_prj *** 659 !! 660 !! ** Method : s-coordinate case. 661 !! A Pressure-Jacobian horizontal pressure gradient method 662 !! based on the constrained cubic-spline interpolation for 663 !! all vertical coordinate systems 664 !! 665 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 666 !! - Save the trend (l_trddyn=T) 667 !! 668 !!---------------------------------------------------------------------- 669 INTEGER, PARAMETER :: polynomial_type = 1 ! 1: cubic spline, 2: linear 670 INTEGER, INTENT(in) :: kt ! ocean time-step index 671 !! 672 INTEGER :: ji, jj, jk, jkk ! dummy loop indices 673 REAL(wp) :: zcoef0, znad ! temporary scalars 674 !! 675 !! The local variables for the correction term 676 INTEGER :: jk1, jis, jid, jjs, jjd 677 REAL(wp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps 678 REAL(wp) :: zrhdt1 679 REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 680 INTEGER :: zbhitwe, zbhitns 681 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdeptht, zrhh 682 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 683 !!---------------------------------------------------------------------- 684 ! 685 CALL wrk_alloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 686 CALL wrk_alloc( jpi,jpj,jpk, zdeptht, zrhh ) 687 ! 847 688 IF( kt == nit000 ) THEN 848 689 IF(lwp) WRITE(numout,*) 849 IF(lwp) WRITE(numout,*) 'dyn:hpg_ rot: hydrostatic pressure gradient trend'850 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, rotated axes scheme used'690 IF(lwp) WRITE(numout,*) 'dyn:hpg_prj : hydrostatic pressure gradient trend' 691 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, cubic spline pressure Jacobian' 851 692 ENDIF 852 693 853 ! ------------------------------- 854 ! Local constant initialization 855 ! ------------------------------- 856 zcoef0 = - grav * 0.5_wp 857 zforg = 0.95_wp 858 zfrot = 1._wp - zforg 859 860 ! inverse of the distance between 2 diagonal T-points (defined at F-point) (here zcoef0/distance) 861 zdistr(:,:) = zcoef0 / SQRT( e1f(:,:)*e1f(:,:) + e2f(:,:)*e1f(:,:) ) 862 863 ! sinus and cosinus of diagonal angle at F-point 864 zsina(:,:) = ATAN2( e2f(:,:), e1f(:,:) ) 865 zcosa(:,:) = COS( zsina(:,:) ) 866 zsina(:,:) = SIN( zsina(:,:) ) 867 868 ! --------------- 869 ! Surface value 870 ! --------------- 871 ! compute and add to the general trend the pressure gradients along the axes 872 DO jj = 2, jpjm1 873 DO ji = fs_2, fs_jpim1 ! vector opt. 874 ! hydrostatic pressure gradient along s-surfaces 875 zhpiorg(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3t(ji+1,jj,1) * rhd(ji+1,jj,1) & 876 & - fse3t(ji ,jj,1) * rhd(ji ,jj,1) ) 877 zhpjorg(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3t(ji,jj+1,1) * rhd(ji,jj+1,1) & 878 & - fse3t(ji,jj ,1) * rhd(ji,jj ,1) ) 879 ! s-coordinate pressure gradient correction 880 zuap = -zcoef0 * ( rhd (ji+1,jj ,1) + rhd (ji,jj,1) ) & 881 & * ( fsdept(ji+1,jj ,1) - fsdept(ji,jj,1) ) / e1u(ji,jj) 882 zvap = -zcoef0 * ( rhd (ji ,jj+1,1) + rhd (ji,jj,1) ) & 883 & * ( fsdept(ji ,jj+1,1) - fsdept(ji,jj,1) ) / e2v(ji,jj) 884 ! add to the general momentum trend 885 ua(ji,jj,1) = ua(ji,jj,1) + zforg * ( zhpiorg(ji,jj,1) + zuap ) 886 va(ji,jj,1) = va(ji,jj,1) + zforg * ( zhpjorg(ji,jj,1) + zvap ) 887 END DO 888 END DO 889 890 ! compute the pressure gradients in the diagonal directions 891 DO jj = 1, jpjm1 892 DO ji = 1, fs_jpim1 ! vector opt. 893 zmskd1 = tmask(ji+1,jj+1,1) * tmask(ji ,jj,1) ! mask in the 1st diagnonal 894 zmskd2 = tmask(ji ,jj+1,1) * tmask(ji+1,jj,1) ! mask in the 2nd diagnonal 895 ! hydrostatic pressure gradient along s-surfaces 896 zhpitra(ji,jj,1) = zdistr(ji,jj) * zmskd1 * ( fse3t(ji+1,jj+1,1) * rhd(ji+1,jj+1,1) & 897 & - fse3t(ji ,jj ,1) * rhd(ji ,jj ,1) ) 898 zhpjtra(ji,jj,1) = zdistr(ji,jj) * zmskd2 * ( fse3t(ji ,jj+1,1) * rhd(ji ,jj+1,1) & 899 & - fse3t(ji+1,jj ,1) * rhd(ji+1,jj ,1) ) 900 ! s-coordinate pressure gradient correction 901 zuap = -zdistr(ji,jj) * zmskd1 * ( rhd (ji+1,jj+1,1) + rhd (ji ,jj,1) ) & 902 & * ( fsdept(ji+1,jj+1,1) - fsdept(ji ,jj,1) ) 903 zvap = -zdistr(ji,jj) * zmskd2 * ( rhd (ji ,jj+1,1) + rhd (ji+1,jj,1) ) & 904 & * ( fsdept(ji ,jj+1,1) - fsdept(ji+1,jj,1) ) 905 ! back rotation 906 zhpine(ji,jj,1) = zcosa(ji,jj) * ( zhpitra(ji,jj,1) + zuap ) & 907 & - zsina(ji,jj) * ( zhpjtra(ji,jj,1) + zvap ) 908 zhpjne(ji,jj,1) = zsina(ji,jj) * ( zhpitra(ji,jj,1) + zuap ) & 909 & + zcosa(ji,jj) * ( zhpjtra(ji,jj,1) + zvap ) 910 END DO 911 END DO 912 913 ! interpolate and add to the general trend the diagonal gradient 914 DO jj = 2, jpjm1 915 DO ji = fs_2, fs_jpim1 ! vector opt. 916 ! averaging 917 zhpirot(ji,jj,1) = 0.5 * ( zhpine(ji,jj,1) + zhpine(ji ,jj-1,1) ) 918 zhpjrot(ji,jj,1) = 0.5 * ( zhpjne(ji,jj,1) + zhpjne(ji-1,jj ,1) ) 919 ! add to the general momentum trend 920 ua(ji,jj,1) = ua(ji,jj,1) + zfrot * zhpirot(ji,jj,1) 921 va(ji,jj,1) = va(ji,jj,1) + zfrot * zhpjrot(ji,jj,1) 922 END DO 923 END DO 924 925 ! ----------------- 926 ! 2. interior value (2=<jk=<jpkm1) 927 ! ----------------- 928 ! compute and add to the general trend the pressure gradients along the axes 929 DO jk = 2, jpkm1 930 DO jj = 2, jpjm1 931 DO ji = fs_2, fs_jpim1 ! vector opt. 932 ! hydrostatic pressure gradient along s-surfaces 933 zhpiorg(ji,jj,jk) = zhpiorg(ji,jj,jk-1) & 934 & + zcoef0 / e1u(ji,jj) * ( fse3t(ji+1,jj,jk ) * rhd(ji+1,jj,jk ) & 935 & - fse3t(ji ,jj,jk ) * rhd(ji ,jj,jk ) & 936 & + fse3t(ji+1,jj,jk-1) * rhd(ji+1,jj,jk-1) & 937 & - fse3t(ji ,jj,jk-1) * rhd(ji ,jj,jk-1) ) 938 zhpjorg(ji,jj,jk) = zhpjorg(ji,jj,jk-1) & 939 & + zcoef0 / e2v(ji,jj) * ( fse3t(ji,jj+1,jk ) * rhd(ji,jj+1,jk ) & 940 & - fse3t(ji,jj ,jk ) * rhd(ji,jj, jk ) & 941 & + fse3t(ji,jj+1,jk-1) * rhd(ji,jj+1,jk-1) & 942 & - fse3t(ji,jj ,jk-1) * rhd(ji,jj, jk-1) ) 943 ! s-coordinate pressure gradient correction 944 zuap = - zcoef0 * ( rhd (ji+1,jj ,jk) + rhd (ji,jj,jk) ) & 945 & * ( fsdept(ji+1,jj ,jk) - fsdept(ji,jj,jk) ) / e1u(ji,jj) 946 zvap = - zcoef0 * ( rhd (ji ,jj+1,jk) + rhd (ji,jj,jk) ) & 947 & * ( fsdept(ji ,jj+1,jk) - fsdept(ji,jj,jk) ) / e2v(ji,jj) 948 ! add to the general momentum trend 949 ua(ji,jj,jk) = ua(ji,jj,jk) + zforg*( zhpiorg(ji,jj,jk) + zuap ) 950 va(ji,jj,jk) = va(ji,jj,jk) + zforg*( zhpjorg(ji,jj,jk) + zvap ) 694 !!---------------------------------------------------------------------- 695 ! Local constant initialization 696 zcoef0 = - grav 697 znad = 0.0_wp 698 IF( lk_vvl ) znad = 1._wp 699 700 ! Clean 3-D work arrays 701 zhpi(:,:,:) = 0._wp 702 zrhh(:,:,:) = rhd(:,:,:) 703 704 ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 705 DO jj = 1, jpj 706 DO ji = 1, jpi 707 jk = mbathy(ji,jj) 708 IF( jk <= 0 ) THEN; zrhh(ji,jj,:) = 0._wp 709 ELSE IF(jk == 1) THEN; zrhh(ji,jj, jk+1:jpk) = rhd(ji,jj,jk) 710 ELSE IF(jk < jpkm1) THEN 711 DO jkk = jk+1, jpk 712 zrhh(ji,jj,jkk) = interp1(fsde3w(ji,jj,jkk), fsde3w(ji,jj,jkk-1), & 713 fsde3w(ji,jj,jkk-2), rhd(ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 714 END DO 715 ENDIF 716 END DO 717 END DO 718 719 ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdeptht(:,:,:)" 720 DO jj = 1, jpj 721 DO ji = 1, jpi 722 zdeptht(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) 723 zdeptht(ji,jj,1) = zdeptht(ji,jj,1) - sshn(ji,jj) * znad 724 DO jk = 2, jpk 725 zdeptht(ji,jj,jk) = zdeptht(ji,jj,jk-1) + fse3w(ji,jj,jk) 726 END DO 727 END DO 728 END DO 729 730 DO jk = 1, jpkm1 731 DO jj = 1, jpj 732 DO ji = 1, jpi 733 fsp(ji,jj,jk) = zrhh(ji,jj,jk) 734 xsp(ji,jj,jk) = zdeptht(ji,jj,jk) 735 END DO 736 END DO 737 END DO 738 739 ! Construct the vertical density profile with the 740 ! constrained cubic spline interpolation 741 ! rho(z) = asp + bsp*z + csp*z^2 + dsp*z^3 742 CALL cspline(fsp,xsp,asp,bsp,csp,dsp,polynomial_type) 743 744 ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 745 DO jj = 2, jpj 746 DO ji = 2, jpi 747 zrhdt1 = zrhh(ji,jj,1) - interp3(zdeptht(ji,jj,1),asp(ji,jj,1), & 748 bsp(ji,jj,1), csp(ji,jj,1), & 749 dsp(ji,jj,1) ) * 0.5_wp * zdeptht(ji,jj,1) 750 zrhdt1 = MAX(zrhdt1, 1000._wp - rau0) ! no lighter than fresh water 751 752 ! assuming linear profile across the top half surface layer 753 zhpi(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) * zrhdt1 754 END DO 755 END DO 756 757 ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 758 DO jk = 2, jpkm1 759 DO jj = 2, jpj 760 DO ji = 2, jpi 761 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + & 762 integ2(zdeptht(ji,jj,jk-1), zdeptht(ji,jj,jk),& 763 asp(ji,jj,jk-1), bsp(ji,jj,jk-1), & 764 csp(ji,jj,jk-1), dsp(ji,jj,jk-1)) 765 END DO 766 END DO 767 END DO 768 769 ! Z coordinate of U(ji,jj,1:jpkm1) and V(ji,jj,1:jpkm1) 770 DO jj = 2, jpjm1 771 DO ji = 2, jpim1 772 zu(ji,jj,1) = - ( fse3u(ji,jj,1) - sshu_n(ji,jj) * znad) 773 zv(ji,jj,1) = - ( fse3v(ji,jj,1) - sshv_n(ji,jj) * znad) 774 END DO 775 END DO 776 777 DO jk = 2, jpkm1 778 DO jj = 2, jpjm1 779 DO ji = 2, jpim1 780 zu(ji,jj,jk) = zu(ji,jj,jk-1)- fse3u(ji,jj,jk) 781 zv(ji,jj,jk) = zv(ji,jj,jk-1)- fse3v(ji,jj,jk) 782 END DO 783 END DO 784 END DO 785 786 DO jk = 1, jpkm1 787 DO jj = 2, jpjm1 788 DO ji = 2, jpim1 789 zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * fse3u(ji,jj,jk) 790 zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * fse3v(ji,jj,jk) 791 END DO 792 END DO 793 END DO 794 795 DO jk = 1, jpkm1 796 DO jj = 2, jpjm1 797 DO ji = 2, jpim1 798 zpwes = 0._wp; zpwed = 0._wp 799 zpnss = 0._wp; zpnsd = 0._wp 800 zuijk = zu(ji,jj,jk) 801 zvijk = zv(ji,jj,jk) 802 803 !!!!! for u equation 804 IF( jk <= mbku(ji,jj) ) THEN 805 IF( -zdeptht(ji+1,jj,mbku(ji,jj)) >= -zdeptht(ji,jj,mbku(ji,jj)) ) THEN 806 jis = ji + 1; jid = ji 807 ELSE 808 jis = ji; jid = ji +1 809 ENDIF 810 811 ! integrate the pressure on the shallow side 812 jk1 = jk 813 zbhitwe = 0 814 DO WHILE ( -zdeptht(jis,jj,jk1) > zuijk ) 815 IF( jk1 == mbku(ji,jj) ) THEN 816 zbhitwe = 1 817 EXIT 818 ENDIF 819 zdeps = MIN(zdeptht(jis,jj,jk1+1), -zuijk) 820 zpwes = zpwes + & 821 integ2(zdeptht(jis,jj,jk1), zdeps, & 822 asp(jis,jj,jk1), bsp(jis,jj,jk1), & 823 csp(jis,jj,jk1), dsp(jis,jj,jk1)) 824 jk1 = jk1 + 1 825 END DO 826 827 IF(zbhitwe == 1) THEN 828 zuijk = -zdeptht(jis,jj,jk1) 829 ENDIF 830 831 ! integrate the pressure on the deep side 832 jk1 = jk 833 zbhitwe = 0 834 DO WHILE ( -zdeptht(jid,jj,jk1) < zuijk ) 835 IF( jk1 == 1 ) THEN 836 zbhitwe = 1 837 EXIT 838 ENDIF 839 zdeps = MAX(zdeptht(jid,jj,jk1-1), -zuijk) 840 zpwed = zpwed + & 841 integ2(zdeps, zdeptht(jid,jj,jk1), & 842 asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1), & 843 csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 844 jk1 = jk1 - 1 845 END DO 846 847 IF( zbhitwe == 1 ) THEN 848 zdeps = zdeptht(jid,jj,1) + MIN(zuijk, sshn(jid,jj)*znad) 849 zrhdt1 = zrhh(jid,jj,1) - interp3(zdeptht(jid,jj,1), asp(jid,jj,1), & 850 bsp(jid,jj,1), csp(jid,jj,1), & 851 dsp(jid,jj,1)) * zdeps 852 zrhdt1 = MAX(zrhdt1, 1000._wp - rau0) ! no lighter than fresh water 853 zpwed = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 854 ENDIF 855 856 ! update the momentum trends in u direction 857 858 zdpdx1 = zcoef0 / e1u(ji,jj) * (zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk)) 859 IF( lk_vvl ) THEN 860 zdpdx2 = zcoef0 / e1u(ji,jj) * & 861 ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 862 ELSE 863 zdpdx2 = zcoef0 / e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 864 ENDIF 865 866 ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * & 867 & umask(ji,jj,jk) * tmask(ji,jj,jk) * tmask(ji+1,jj,jk) 868 ENDIF 869 870 !!!!! for v equation 871 IF( jk <= mbkv(ji,jj) ) THEN 872 IF( -zdeptht(ji,jj+1,mbkv(ji,jj)) >= -zdeptht(ji,jj,mbkv(ji,jj)) ) THEN 873 jjs = jj + 1; jjd = jj 874 ELSE 875 jjs = jj ; jjd = jj + 1 876 ENDIF 877 878 ! integrate the pressure on the shallow side 879 jk1 = jk 880 zbhitns = 0 881 DO WHILE ( -zdeptht(ji,jjs,jk1) > zvijk ) 882 IF( jk1 == mbkv(ji,jj) ) THEN 883 zbhitns = 1 884 EXIT 885 ENDIF 886 zdeps = MIN(zdeptht(ji,jjs,jk1+1), -zvijk) 887 zpnss = zpnss + & 888 integ2(zdeptht(ji,jjs,jk1), zdeps, & 889 asp(ji,jjs,jk1), bsp(ji,jjs,jk1), & 890 csp(ji,jjs,jk1), dsp(ji,jjs,jk1) ) 891 jk1 = jk1 + 1 892 END DO 893 894 IF(zbhitns == 1) THEN 895 zvijk = -zdeptht(ji,jjs,jk1) 896 ENDIF 897 898 ! integrate the pressure on the deep side 899 jk1 = jk 900 zbhitns = 0 901 DO WHILE ( -zdeptht(ji,jjd,jk1) < zvijk ) 902 IF( jk1 == 1 ) THEN 903 zbhitns = 1 904 EXIT 905 ENDIF 906 zdeps = MAX(zdeptht(ji,jjd,jk1-1), -zvijk) 907 zpnsd = zpnsd + & 908 integ2(zdeps, zdeptht(ji,jjd,jk1), & 909 asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 910 csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 911 jk1 = jk1 - 1 912 END DO 913 914 IF( zbhitns == 1 ) THEN 915 zdeps = zdeptht(ji,jjd,1) + MIN(zvijk, sshn(ji,jjd)*znad) 916 zrhdt1 = zrhh(ji,jjd,1) - interp3(zdeptht(ji,jjd,1), asp(ji,jjd,1), & 917 bsp(ji,jjd,1), csp(ji,jjd,1), & 918 dsp(ji,jjd,1) ) * zdeps 919 zrhdt1 = MAX(zrhdt1, 1000._wp - rau0) ! no lighter than fresh water 920 zpnsd = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 921 ENDIF 922 923 ! update the momentum trends in v direction 924 925 zdpdy1 = zcoef0 / e2v(ji,jj) * (zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk)) 926 IF( lk_vvl ) THEN 927 zdpdy2 = zcoef0 / e2v(ji,jj) * & 928 ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 929 ELSE 930 zdpdy2 = zcoef0 / e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 931 ENDIF 932 933 va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2)*& 934 & vmask(ji,jj,jk)*tmask(ji,jj,jk)*tmask(ji,jj+1,jk) 935 ENDIF 936 937 938 END DO 939 END DO 940 END DO 941 ! 942 CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 943 CALL wrk_dealloc( jpi,jpj,jpk, zdeptht, zrhh ) 944 ! 945 END SUBROUTINE hpg_prj 946 947 SUBROUTINE cspline(fsp, xsp, asp, bsp, csp, dsp, polynomial_type) 948 !!---------------------------------------------------------------------- 949 !! *** ROUTINE cspline *** 950 !! 951 !! ** Purpose : constrained cubic spline interpolation 952 !! 953 !! ** Method : f(x) = asp + bsp*x + csp*x^2 + dsp*x^3 954 !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 955 !! 956 !!---------------------------------------------------------------------- 957 IMPLICIT NONE 958 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: fsp, xsp ! value and coordinate 959 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: asp, bsp, csp, dsp ! coefficients of 960 ! the interpoated function 961 INTEGER, INTENT(in) :: polynomial_type ! 1: cubic spline 962 ! 2: Linear 963 964 ! Local Variables 965 INTEGER :: ji, jj, jk ! dummy loop indices 966 INTEGER :: jpi, jpj, jpkm1 967 REAL(wp) :: zdf1, zdf2, zddf1, zddf2, ztmp1, ztmp2, zdxtmp 968 REAL(wp) :: zdxtmp1, zdxtmp2, zalpha 969 REAL(wp) :: zdf(size(fsp,3)) 970 !!---------------------------------------------------------------------- 971 972 jpi = size(fsp,1) 973 jpj = size(fsp,2) 974 jpkm1 = size(fsp,3) - 1 975 976 977 IF (polynomial_type == 1) THEN ! Constrained Cubic Spline 978 DO ji = 1, jpi 979 DO jj = 1, jpj 980 !!Fritsch&Butland's method, 1984 (preferred, but more computation) 981 ! DO jk = 2, jpkm1-1 982 ! zdxtmp1 = xsp(ji,jj,jk) - xsp(ji,jj,jk-1) 983 ! zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 984 ! zdf1 = ( fsp(ji,jj,jk) - fsp(ji,jj,jk-1) ) / zdxtmp1 985 ! zdf2 = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp2 986 ! 987 ! zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 988 ! 989 ! IF(zdf1 * zdf2 <= 0._wp) THEN 990 ! zdf(jk) = 0._wp 991 ! ELSE 992 ! zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 993 ! ENDIF 994 ! END DO 995 996 !!Simply geometric average 997 DO jk = 2, jpkm1-1 998 zdf1 = (fsp(ji,jj,jk) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk) - xsp(ji,jj,jk-1)) 999 zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk)) 1000 1001 IF(zdf1 * zdf2 <= 0._wp) THEN 1002 zdf(jk) = 0._wp 1003 ELSE 1004 zdf(jk) = 2._wp * zdf1 * zdf2 / (zdf1 + zdf2) 1005 ENDIF 1006 END DO 1007 1008 zdf(1) = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 1009 & ( xsp(ji,jj,2) - xsp(ji,jj,1) ) - 0.5_wp * zdf(2) 1010 zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 1011 & ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - & 1012 & 0.5_wp * zdf(jpkm1 - 1) 1013 1014 DO jk = 1, jpkm1 - 1 1015 zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1016 ztmp1 = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 1017 ztmp2 = 6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 1018 zddf1 = -2._wp * ztmp1 + ztmp2 1019 ztmp1 = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 1020 zddf2 = 2._wp * ztmp1 - ztmp2 1021 1022 dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 1023 csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 1024 bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - & 1025 & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 1026 & dsp(ji,jj,jk) * ((xsp(ji,jj,jk+1) + xsp(ji,jj,jk))**2 - & 1027 & xsp(ji,jj,jk+1) * xsp(ji,jj,jk)) 1028 asp(ji,jj,jk) = fsp(ji,jj,jk) - xsp(ji,jj,jk) * (bsp(ji,jj,jk) + & 1029 & (xsp(ji,jj,jk) * (csp(ji,jj,jk) + & 1030 & dsp(ji,jj,jk) * xsp(ji,jj,jk)))) 1031 END DO 951 1032 END DO 952 1033 END DO 953 END DO 954 955 ! compute the pressure gradients in the diagonal directions 956 DO jk = 2, jpkm1 957 DO jj = 1, jpjm1 958 DO ji = 1, fs_jpim1 ! vector opt. 959 zmskd1 = tmask(ji+1,jj+1,jk ) * tmask(ji ,jj,jk ) ! level jk mask in the 1st diagnonal 960 zmskd1m = tmask(ji+1,jj+1,jk-1) * tmask(ji ,jj,jk-1) ! level jk-1 " " 961 zmskd2 = tmask(ji ,jj+1,jk ) * tmask(ji+1,jj,jk ) ! level jk mask in the 2nd diagnonal 962 zmskd2m = tmask(ji ,jj+1,jk-1) * tmask(ji+1,jj,jk-1) ! level jk-1 " " 963 ! hydrostatic pressure gradient along s-surfaces 964 zhpitra(ji,jj,jk) = zhpitra(ji,jj,jk-1) & 965 & + zdistr(ji,jj) * zmskd1 * ( fse3t(ji+1,jj+1,jk ) * rhd(ji+1,jj+1,jk) & 966 & -fse3t(ji ,jj ,jk ) * rhd(ji ,jj ,jk) ) & 967 & + zdistr(ji,jj) * zmskd1m * ( fse3t(ji+1,jj+1,jk-1) * rhd(ji+1,jj+1,jk-1) & 968 & -fse3t(ji ,jj ,jk-1) * rhd(ji ,jj ,jk-1) ) 969 zhpjtra(ji,jj,jk) = zhpjtra(ji,jj,jk-1) & 970 & + zdistr(ji,jj) * zmskd2 * ( fse3t(ji ,jj+1,jk ) * rhd(ji ,jj+1,jk) & 971 & -fse3t(ji+1,jj ,jk ) * rhd(ji+1,jj, jk) ) & 972 & + zdistr(ji,jj) * zmskd2m * ( fse3t(ji ,jj+1,jk-1) * rhd(ji ,jj+1,jk-1) & 973 & -fse3t(ji+1,jj ,jk-1) * rhd(ji+1,jj, jk-1) ) 974 ! s-coordinate pressure gradient correction 975 zuap = - zdistr(ji,jj) * zmskd1 * ( rhd (ji+1,jj+1,jk) + rhd (ji ,jj,jk) ) & 976 & * ( fsdept(ji+1,jj+1,jk) - fsdept(ji ,jj,jk) ) 977 zvap = - zdistr(ji,jj) * zmskd2 * ( rhd (ji ,jj+1,jk) + rhd (ji+1,jj,jk) ) & 978 & * ( fsdept(ji ,jj+1,jk) - fsdept(ji+1,jj,jk) ) 979 ! back rotation 980 zhpine(ji,jj,jk) = zcosa(ji,jj) * ( zhpitra(ji,jj,jk) + zuap ) & 981 & - zsina(ji,jj) * ( zhpjtra(ji,jj,jk) + zvap ) 982 zhpjne(ji,jj,jk) = zsina(ji,jj) * ( zhpitra(ji,jj,jk) + zuap ) & 983 & + zcosa(ji,jj) * ( zhpjtra(ji,jj,jk) + zvap ) 1034 1035 ELSE IF (polynomial_type == 2) THEN ! Linear 1036 DO ji = 1, jpi 1037 DO jj = 1, jpj 1038 DO jk = 1, jpkm1-1 1039 zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1040 ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 1041 1042 dsp(ji,jj,jk) = 0._wp 1043 csp(ji,jj,jk) = 0._wp 1044 bsp(ji,jj,jk) = ztmp1 / zdxtmp 1045 asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 1046 END DO 984 1047 END DO 985 1048 END DO 986 END DO 987 988 ! interpolate and add to the general trend 989 DO jk = 2, jpkm1 990 DO jj = 2, jpjm1 991 DO ji = fs_2, fs_jpim1 ! vector opt. 992 ! averaging 993 zhpirot(ji,jj,jk) = 0.5 * ( zhpine(ji,jj,jk) + zhpine(ji ,jj-1,jk) ) 994 zhpjrot(ji,jj,jk) = 0.5 * ( zhpjne(ji,jj,jk) + zhpjne(ji-1,jj ,jk) ) 995 ! add to the general momentum trend 996 ua(ji,jj,jk) = ua(ji,jj,jk) + zfrot * zhpirot(ji,jj,jk) 997 va(ji,jj,jk) = va(ji,jj,jk) + zfrot * zhpjrot(ji,jj,jk) 998 END DO 999 END DO 1000 END DO 1001 ! 1002 IF( wrk_not_released(2, 1,2,3) .OR. & 1003 wrk_not_released(3, 1,2,3,4,5,6,7,8) ) CALL ctl_stop('dyn:hpg_rot: failed to release workspace arrays') 1004 ! 1005 END SUBROUTINE hpg_rot 1049 1050 ELSE 1051 CALL ctl_stop( 'invalid polynomial type in cspline' ) 1052 ENDIF 1053 1054 1055 END SUBROUTINE cspline 1056 1057 1058 FUNCTION interp1(x, xl, xr, fl, fr) RESULT(f) 1059 !!---------------------------------------------------------------------- 1060 !! *** ROUTINE interp1 *** 1061 !! 1062 !! ** Purpose : 1-d linear interpolation 1063 !! 1064 !! ** Method : 1065 !! interpolation is straight forward 1066 !! extrapolation is also permitted (no value limit) 1067 !! 1068 !!---------------------------------------------------------------------- 1069 IMPLICIT NONE 1070 REAL(wp), INTENT(in) :: x, xl, xr, fl, fr 1071 REAL(wp) :: f ! result of the interpolation (extrapolation) 1072 REAL(wp) :: zdeltx 1073 !!---------------------------------------------------------------------- 1074 1075 zdeltx = xr - xl 1076 IF(abs(zdeltx) <= 10._wp * EPSILON(x)) THEN 1077 f = 0.5_wp * (fl + fr) 1078 ELSE 1079 f = ( (x - xl ) * fr - ( x - xr ) * fl ) / zdeltx 1080 ENDIF 1081 1082 END FUNCTION interp1 1083 1084 FUNCTION interp2(x, a, b, c, d) RESULT(f) 1085 !!---------------------------------------------------------------------- 1086 !! *** ROUTINE interp1 *** 1087 !! 1088 !! ** Purpose : 1-d constrained cubic spline interpolation 1089 !! 1090 !! ** Method : cubic spline interpolation 1091 !! 1092 !!---------------------------------------------------------------------- 1093 IMPLICIT NONE 1094 REAL(wp), INTENT(in) :: x, a, b, c, d 1095 REAL(wp) :: f ! value from the interpolation 1096 !!---------------------------------------------------------------------- 1097 1098 f = a + x* ( b + x * ( c + d * x ) ) 1099 1100 END FUNCTION interp2 1101 1102 1103 FUNCTION interp3(x, a, b, c, d) RESULT(f) 1104 !!---------------------------------------------------------------------- 1105 !! *** ROUTINE interp1 *** 1106 !! 1107 !! ** Purpose : Calculate the first order of deriavtive of 1108 !! a cubic spline function y=a+b*x+c*x^2+d*x^3 1109 !! 1110 !! ** Method : f=dy/dx=b+2*c*x+3*d*x^2 1111 !! 1112 !!---------------------------------------------------------------------- 1113 IMPLICIT NONE 1114 REAL(wp), INTENT(in) :: x, a, b, c, d 1115 REAL(wp) :: f ! value from the interpolation 1116 !!---------------------------------------------------------------------- 1117 1118 f = b + x * ( 2._wp * c + 3._wp * d * x) 1119 1120 END FUNCTION interp3 1121 1122 1123 FUNCTION integ2(xl, xr, a, b, c, d) RESULT(f) 1124 !!---------------------------------------------------------------------- 1125 !! *** ROUTINE interp1 *** 1126 !! 1127 !! ** Purpose : 1-d constrained cubic spline integration 1128 !! 1129 !! ** Method : integrate polynomial a+bx+cx^2+dx^3 from xl to xr 1130 !! 1131 !!---------------------------------------------------------------------- 1132 IMPLICIT NONE 1133 REAL(wp), INTENT(in) :: xl, xr, a, b, c, d 1134 REAL(wp) :: za1, za2, za3 1135 REAL(wp) :: f ! integration result 1136 !!---------------------------------------------------------------------- 1137 1138 za1 = 0.5_wp * b 1139 za2 = c / 3.0_wp 1140 za3 = 0.25_wp * d 1141 1142 f = xr * ( a + xr * ( za1 + xr * ( za2 + za3 * xr ) ) ) - & 1143 & xl * ( a + xl * ( za1 + xl * ( za2 + za3 * xl ) ) ) 1144 1145 END FUNCTION integ2 1146 1006 1147 1007 1148 !!====================================================================== -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynkeg.F90
r2777 r3294 19 19 USE lib_mpp ! MPP library 20 20 USE prtctl ! Print control 21 USE wrk_nemo ! Memory Allocation 22 USE timing ! Timing 21 23 22 24 IMPLICIT NONE … … 52 54 !! - save this trends (l_trddyn=T) for post-processing 53 55 !!---------------------------------------------------------------------- 54 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released55 USE oce , ONLY: ztrdu => ta , ztrdv => sa ! (ta,sa) used as 3D workspace56 USE wrk_nemo, ONLY: zhke => wrk_3d_1 ! 3D workspace57 !!58 56 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 57 !! 60 58 INTEGER :: ji, jj, jk ! dummy loop indices 61 59 REAL(wp) :: zu, zv ! temporary scalars 60 REAL(wp), POINTER, DIMENSION(:,:,:) :: zhke 61 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 62 62 !!---------------------------------------------------------------------- 63 64 IF( wrk_in_use(3,1) ) THEN65 CALL ctl_stop('dyn_keg: requested workspace array is unavailable') ; RETURN66 ENDIF67 63 ! 64 IF( nn_timing == 1 ) CALL timing_start('dyn_keg') 65 ! 66 CALL wrk_alloc( jpi, jpj, jpk, zhke ) 67 ! 68 68 IF( kt == nit000 ) THEN 69 69 IF(lwp) WRITE(numout,*) … … 73 73 74 74 IF( l_trddyn ) THEN ! Save ua and va trends 75 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 75 76 ztrdu(:,:,:) = ua(:,:,:) 76 77 ztrdv(:,:,:) = va(:,:,:) … … 131 132 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 132 133 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_keg, 'DYN', kt ) 134 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 133 135 ENDIF 134 136 ! … … 136 138 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 137 139 ! 138 IF( wrk_not_released(3, 1) ) CALL ctl_stop('dyn_keg: failed to release workspace array') 140 CALL wrk_dealloc( jpi, jpj, jpk, zhke ) 141 ! 142 IF( nn_timing == 1 ) CALL timing_stop('dyn_keg') 139 143 ! 140 144 END SUBROUTINE dyn_keg -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90
r2715 r3294 26 26 USE lib_mpp ! distribued memory computing library 27 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 28 USE wrk_nemo ! Memory Allocation 29 USE timing ! Timing 30 28 31 29 32 IMPLICIT NONE … … 51 54 !! ** Purpose : compute the lateral ocean dynamics physics. 52 55 !!---------------------------------------------------------------------- 53 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released54 USE wrk_nemo, ONLY: ztrdu => wrk_3d_1 , ztrdv => wrk_3d_255 56 ! 56 57 INTEGER, INTENT(in) :: kt ! ocean time-step index 57 ! !----------------------------------------------------------------------58 59 IF( wrk_in_use(3, 1,2) ) THEN60 CALL ctl_stop('dyn_ldf: requested workspace arrays unavailable') ; RETURN61 ENDIF58 ! 59 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 60 !!---------------------------------------------------------------------- 61 ! 62 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf') 62 63 ! 63 64 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 65 CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 64 66 ztrdu(:,:,:) = ua(:,:,:) 65 67 ztrdv(:,:,:) = va(:,:,:) … … 105 107 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 106 108 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_ldf, 'DYN', kt ) 109 CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 107 110 ENDIF 108 111 ! ! print sum trends (used for debugging) … … 110 113 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 111 114 ! 112 IF( wrk_not_released(3, 1,2) ) CALL ctl_stop('dyn_ldf: failed to release workspace arrays')115 IF( nn_timing == 1 ) CALL timing_stop('dyn_ldf') 113 116 ! 114 117 END SUBROUTINE dyn_ldf … … 147 150 IF( ln_dynldf_hor ) ioptio = ioptio + 1 148 151 IF( ln_dynldf_iso ) ioptio = ioptio + 1 149 IF( ioptio /=1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' )152 IF( ioptio > 1 ) CALL ctl_stop( ' use only ONE direction (level/hor/iso)' ) 150 153 151 154 ! ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilap.F90
r2715 r3294 23 23 USE trdmod_oce ! ocean variables trends 24 24 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 25 USE wrk_nemo ! Memory Allocation 26 USE timing ! Timing 25 27 26 28 IMPLICIT NONE … … 74 76 !! mixing trend. 75 77 !!---------------------------------------------------------------------- 76 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released77 USE wrk_nemo, ONLY: zcu => wrk_2d_1 , zcv => wrk_2d_2 ! 3D workspace78 USE wrk_nemo, ONLY: zuf => wrk_3d_3 , zut => wrk_3d_4 ! 3D workspace79 USE wrk_nemo, ONLY: zlu => wrk_3d_5 , zlv => wrk_3d_680 78 ! 81 79 INTEGER, INTENT(in) :: kt ! ocean time-step index … … 83 81 INTEGER :: ji, jj, jk ! dummy loop indices 84 82 REAL(wp) :: zua, zva, zbt, ze2u, ze2v ! temporary scalar 83 REAL(wp), POINTER, DIMENSION(:,: ) :: zcu, zcv 84 REAL(wp), POINTER, DIMENSION(:,:,:) :: zuf, zut, zlu, zlv 85 85 !!---------------------------------------------------------------------- 86 87 IF( wrk_in_use(2, 1,2) .OR. wrk_in_use(3, 3,4,5,6) ) THEN 88 CALL ctl_stop('dyn_ldf_bilap : requested workspace arrays unavailable') ; RETURN 89 ENDIF 90 86 ! 87 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_bilap') 88 ! 89 CALL wrk_alloc( jpi, jpj, zcu, zcv ) 90 CALL wrk_alloc( jpi, jpj, jpk, zuf, zut, zlu, zlv ) 91 ! 91 92 IF( kt == nit000 .AND. lwp ) THEN 92 93 WRITE(numout,*) … … 207 208 END DO ! End of slab 208 209 ! ! =============== 209 IF( wrk_not_released(2, 1,2) .OR. & 210 wrk_not_released(3, 3,4,5,6) ) CALL ctl_stop('dyn_ldf_bilap: failed to release workspace arrays') 210 CALL wrk_dealloc( jpi, jpj, zcu, zcv ) 211 CALL wrk_dealloc( jpi, jpj, jpk, zuf, zut, zlu, zlv ) 212 ! 213 IF( nn_timing == 1 ) CALL timing_stop('dyn_ldf_bilap') 211 214 ! 212 215 END SUBROUTINE dyn_ldf_bilap -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_bilapg.F90
r2715 r3294 27 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 28 28 USE prtctl ! Print control 29 USE wrk_nemo ! Memory Allocation 30 USE timing ! Timing 31 29 32 30 33 IMPLICIT NONE … … 84 87 !! - save the trend in (zwk3,zwk4) ('key_trddyn') 85 88 !!---------------------------------------------------------------------- 86 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released87 USE wrk_nemo, ONLY: zwk1 => wrk_3d_3 , zwk2 => wrk_3d_4 ! 3D workspace88 USE oce , ONLY: zwk3 => ta , zwk4 => sa ! ta, sa used as 3D workspace89 !90 89 INTEGER, INTENT( in ) :: kt ! ocean time-step index 91 90 ! 92 91 INTEGER :: ji, jj, jk ! dummy loop indices 93 !!---------------------------------------------------------------------- 94 95 IF( wrk_in_use(3, 3,4) ) THEN 96 CALL ctl_stop('dyn_ldf_bilapg: requested workspace arrays unavailable') ; RETURN 97 ENDIF 98 92 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwk1, zwk2, zwk3, zwk4 93 !!---------------------------------------------------------------------- 94 ! 95 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_bilapg') 96 ! 97 CALL wrk_alloc( jpi, jpj, jpk, zwk1, zwk2, zwk3, zwk4 ) 98 ! 99 99 IF( kt == nit000 ) THEN 100 100 IF(lwp) WRITE(numout,*) 101 101 IF(lwp) WRITE(numout,*) 'dyn_ldf_bilapg : horizontal biharmonic operator in s-coordinate' 102 102 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~' 103 zwk1(:,:,:) = 0.e0 ; zwk3(:,:,:) = 0.e0104 zwk2(:,:,:) = 0.e0 ; zwk4(:,:,:) = 0.e0105 103 ! ! allocate dyn_ldf_bilapg arrays 106 104 IF( dyn_ldf_bilapg_alloc() /= 0 ) CALL ctl_stop('STOP', 'dyn_ldf_bilapg: failed to allocate arrays') 107 105 ENDIF 106 ! 107 zwk1(:,:,:) = 0.e0 ; zwk3(:,:,:) = 0.e0 108 zwk2(:,:,:) = 0.e0 ; zwk4(:,:,:) = 0.e0 108 109 109 110 ! Laplacian of (ub,vb) multiplied by ahm … … 129 130 END DO 130 131 ! 131 IF( wrk_not_released(3, 3,4) ) CALL ctl_stop('dyn_ldf_bilapg: failed to release workspace arrays') 132 CALL wrk_dealloc( jpi, jpj, jpk, zwk1, zwk2, zwk3, zwk4 ) 133 ! 134 IF( nn_timing == 1 ) CALL timing_stop('dyn_ldf_bilapg') 132 135 ! 133 136 END SUBROUTINE dyn_ldf_bilapg … … 175 178 !! 'key_trddyn' defined: the trend is saved for diagnostics. 176 179 !!---------------------------------------------------------------------- 177 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released178 USE wrk_nemo, ONLY: ziut => wrk_2d_1 , zjuf => wrk_2d_2 , zjvt => wrk_2d_3179 USE wrk_nemo, ONLY: zivf => wrk_2d_4 , zdku => wrk_2d_5 , zdk1u => wrk_2d_6180 USE wrk_nemo, ONLY: zdkv => wrk_2d_7 , zdk1v => wrk_2d_8181 180 !! 182 181 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu , pv ! 1st call: before horizontal velocity … … 192 191 REAL(wp) :: zbur, zbvr, zmkt, zmkf, zuav, zvav ! - - 193 192 REAL(wp) :: zuwslpi, zuwslpj, zvwslpi, zvwslpj ! - - 194 !!---------------------------------------------------------------------- 195 196 IF( wrk_in_use(2, 1,2,3,4,5,6,7,8) ) THEN 197 CALL ctl_stop('dyn:ldfguv: requested workspace arrays unavailable') ; RETURN 198 END IF 193 ! 194 REAL(wp), POINTER, DIMENSION(:,:) :: ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v 195 !!---------------------------------------------------------------------- 196 ! 197 IF( nn_timing == 1 ) CALL timing_start('ldfguv') 198 ! 199 CALL wrk_alloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v ) 200 ! 199 201 ! ! ********** ! ! =============== 200 202 DO jk = 1, jpkm1 ! First step ! ! Horizontal slab … … 452 454 ! ! =============== 453 455 454 IF( wrk_not_released(2, 1,2,3,4,5,6,7,8) ) CALL ctl_stop('dyn:ldfguv: failed to release workspace arrays') 456 CALL wrk_dealloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v ) 457 ! 458 IF( nn_timing == 1 ) CALL timing_stop('ldfguv') 455 459 ! 456 460 END SUBROUTINE ldfguv -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90
r2715 r3294 29 29 USE lib_mpp ! MPP library 30 30 USE prtctl ! Print control 31 USE wrk_nemo ! Memory Allocation 32 USE timing ! Timing 31 33 32 34 IMPLICIT NONE … … 105 107 !! of the rotated operator in dynzdf module 106 108 !!---------------------------------------------------------------------- 107 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released108 USE wrk_nemo, ONLY: ziut => wrk_2d_1 , zjuf => wrk_2d_2 , zjvt => wrk_2d_3 ! 2D workspace109 USE wrk_nemo, ONLY: zivf => wrk_2d_4 , zdku => wrk_2d_5 , zdkv => wrk_2d_6 ! 2D workspace110 USE wrk_nemo, ONLY: zdk1u => wrk_2d_7 , zdk1v => wrk_2d_8111 109 ! 112 110 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 117 115 REAL(wp) :: zcoef0, zcoef3, zcoef4, zmkt, zmkf ! - - 118 116 REAL(wp) :: zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj ! - - 117 ! 118 REAL(wp), POINTER, DIMENSION(:,:) :: ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v 119 119 !!---------------------------------------------------------------------- 120 121 IF( wrk_in_use(2, 1,2,3,4,5,6,7,8) ) THEN122 CALL ctl_stop('dyn_ldf_iso: requested workspace arrays unavailable') ; RETURN123 END IF124 120 ! 121 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_iso') 122 ! 123 CALL wrk_alloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v ) 124 ! 125 125 IF( kt == nit000 ) THEN 126 126 IF(lwp) WRITE(numout,*) … … 427 427 END DO ! End of slab 428 428 ! ! =============== 429 430 IF( wrk_not_released(2, 1,2,3,4,5,6,7,8) ) CALL ctl_stop('dyn_ldf_iso: failed to release workspace arrays') 429 CALL wrk_dealloc( jpi, jpj, ziut, zjuf, zjvt, zivf, zdku, zdk1u, zdkv, zdk1v ) 430 ! 431 IF( nn_timing == 1 ) CALL timing_stop('dyn_ldf_iso') 431 432 ! 432 433 END SUBROUTINE dyn_ldf_iso -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_lap.F90
r2715 r3294 23 23 USE trdmod_oce ! ocean variables trends 24 24 USE ldfslp ! iso-neutral slopes 25 USE timing ! Timing 25 26 26 27 IMPLICIT NONE … … 68 69 !!---------------------------------------------------------------------- 69 70 ! 71 IF( nn_timing == 1 ) CALL timing_start('dyn_ldf_lap') 72 ! 70 73 IF( kt == nit000 ) THEN 71 74 IF(lwp) WRITE(numout,*) … … 95 98 END DO ! End of slab 96 99 ! ! =============== 100 IF( nn_timing == 1 ) CALL timing_stop('dyn_ldf_lap') 101 ! 97 102 END SUBROUTINE dyn_ldf_lap 98 103 -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90
r2779 r3294 33 33 USE obcdyn_bt ! 2D open boundary condition for momentum (obc_dyn_bt routine) 34 34 USE obcvol ! ocean open boundary condition (obc_vol routines) 35 USE bdy_oce ! unstructured open boundary conditions 36 USE bdydta ! unstructured open boundary conditions 37 USE bdydyn ! unstructured open boundary conditions 35 USE bdy_oce ! ocean open boundary conditions 36 USE bdydta ! ocean open boundary conditions 37 USE bdydyn ! ocean open boundary conditions 38 USE bdyvol ! ocean open boundary condition (bdy_vol routines) 38 39 USE in_out_manager ! I/O manager 39 40 USE lbclnk ! lateral boundary condition (or mpp link) 40 41 USE lib_mpp ! MPP library 42 USE wrk_nemo ! Memory Allocation 41 43 USE prtctl ! Print control 42 44 #if defined key_agrif 43 45 USE agrif_opa_interp 44 46 #endif 47 USE timing ! Timing 45 48 46 49 IMPLICIT NONE … … 77 80 !! * Apply lateral boundary conditions on after velocity 78 81 !! at the local domain boundaries through lbc_lnk call, 79 !! at the radiative open boundaries (lk_obc=T), 80 !! at the relaxed open boundaries (lk_bdy=T), and 82 !! at the one-way open boundaries (lk_obc=T), 81 83 !! at the AGRIF zoom boundaries (lk_agrif=T) 82 84 !! … … 92 94 !! un,vn now horizontal velocity of next time-step 93 95 !!---------------------------------------------------------------------- 94 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released95 USE oce , ONLY: ze3u_f => ta , ze3v_f => sa ! (ta,sa) used as 3D workspace96 USE wrk_nemo, ONLY: zs_t => wrk_2d_1 , zs_u_1 => wrk_2d_2 , zs_v_1 => wrk_2d_397 !98 96 INTEGER, INTENT( in ) :: kt ! ocean time-step index 99 97 ! 100 98 INTEGER :: ji, jj, jk ! dummy loop indices 99 INTEGER :: iku, ikv ! local integers 101 100 #if ! defined key_dynspg_flt 102 101 REAL(wp) :: z2dt ! temporary scalar 103 102 #endif 104 REAL(wp) :: zue3a, zue3n, zue3b, zuf 105 REAL(wp) :: zve3a, zve3n, zve3b, zvf ! - -106 REAL(wp) :: zec, zv_t_ij, zv_t_ip1j, zv_t_ijp1103 REAL(wp) :: zue3a, zue3n, zue3b, zuf, zec ! local scalars 104 REAL(wp) :: zve3a, zve3n, zve3b, zvf ! - - 105 REAL(wp), POINTER, DIMENSION(:,:,:) :: ze3u_f, ze3v_f 107 106 !!---------------------------------------------------------------------- 108 109 IF( wrk_in_use(2, 1,2,3) ) THEN110 CALL ctl_stop('dyn_nxt: requested workspace arrays unavailable') ; RETURN111 ENDIF112 107 ! 108 IF( nn_timing == 1 ) CALL timing_start('dyn_nxt') 109 ! 110 CALL wrk_alloc( jpi,jpj,jpk, ze3u_f, ze3v_f ) 111 ! 113 112 IF( kt == nit000 ) THEN 114 113 IF(lwp) WRITE(numout,*) … … 174 173 ENDIF 175 174 ! 176 # elif defined key_bdy 175 # elif defined key_bdy 177 176 ! !* BDY open boundaries 178 IF( .NOT. lk_dynspg_flt ) THEN 179 CALL bdy_dyn_frs( kt ) 180 # if ! defined key_vvl 181 ua_e(:,:) = 0.e0 182 va_e(:,:) = 0.e0 183 ! Set these variables for use in bdy_dyn_fla 184 hur_e(:,:) = hur(:,:) 185 hvr_e(:,:) = hvr(:,:) 186 DO jk = 1, jpkm1 !! Vertically integrated momentum trends 187 ua_e(:,:) = ua_e(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 188 va_e(:,:) = va_e(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 189 END DO 190 ua_e(:,:) = ua_e(:,:) * hur(:,:) 191 va_e(:,:) = va_e(:,:) * hvr(:,:) 192 DO jk = 1 , jpkm1 193 ua(:,:,jk) = ua(:,:,jk) - ua_e(:,:) 194 va(:,:,jk) = va(:,:,jk) - va_e(:,:) 195 END DO 196 CALL bdy_dta_fla( kt+1, 0,2*nn_baro) 197 CALL bdy_dyn_fla( sshn_b ) 198 CALL lbc_lnk( ua_e, 'U', -1. ) ! Boundary points should be updated 199 CALL lbc_lnk( va_e, 'V', -1. ) ! 200 DO jk = 1 , jpkm1 201 ua(:,:,jk) = ( ua(:,:,jk) + ua_e(:,:) ) * umask(:,:,jk) 202 va(:,:,jk) = ( va(:,:,jk) + va_e(:,:) ) * vmask(:,:,jk) 203 END DO 204 # endif 205 ENDIF 177 IF( lk_dynspg_exp ) CALL bdy_dyn( kt ) 178 IF( lk_dynspg_ts ) CALL bdy_dyn( kt, dyn3d_only=.true. ) 179 180 !!$ Do we need a call to bdy_vol here?? 181 ! 206 182 # endif 207 183 ! … … 238 214 ELSE ! Variable volume ! 239 215 ! ! ================! 240 ! Before scale factor at t-points 241 ! ------------------------------- 242 DO jk = 1, jpkm1 216 ! 217 DO jk = 1, jpkm1 ! Before scale factor at t-points 243 218 fse3t_b(:,:,jk) = fse3t_n(:,:,jk) & 244 219 & + atfp * ( fse3t_b(:,:,jk) + fse3t_a(:,:,jk) & 245 & - 2.e0 * fse3t_n(:,:,jk) ) 246 ENDDO 247 ! Add volume filter correction only at the first level of t-point scale factors 248 zec = atfp * rdt / rau0 220 & - 2._wp * fse3t_n(:,:,jk) ) 221 END DO 222 zec = atfp * rdt / rau0 ! Add filter correction only at the 1st level of t-point scale factors 249 223 fse3t_b(:,:,1) = fse3t_b(:,:,1) - zec * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 250 ! surface at t-points and inverse surface at (u/v)-points used in surface averaging computations251 zs_t (:,:) = e1t(:,:) * e2t(:,:)252 zs_u_1(:,:) = 0.5 / ( e1u(:,:) * e2u(:,:) )253 zs_v_1(:,:) = 0.5 / ( e1v(:,:) * e2v(:,:) )254 224 ! 255 IF( ln_dynadv_vec ) THEN 256 ! Before scale factor at (u/v)-points 257 ! ----------------------------------- 258 ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 259 DO jk = 1, jpkm1 260 DO jj = 1, jpjm1 261 DO ji = 1, jpim1 262 zv_t_ij = zs_t(ji ,jj ) * fse3t_b(ji ,jj ,jk) 263 zv_t_ip1j = zs_t(ji+1,jj ) * fse3t_b(ji+1,jj ,jk) 264 zv_t_ijp1 = zs_t(ji ,jj+1) * fse3t_b(ji ,jj+1,jk) 265 fse3u_b(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 266 fse3v_b(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 267 END DO 268 END DO 269 END DO 270 ! lateral boundary conditions 271 CALL lbc_lnk( fse3u_b(:,:,:), 'U', 1. ) 272 CALL lbc_lnk( fse3v_b(:,:,:), 'V', 1. ) 273 ! Add initial scale factor to scale factor anomaly 274 fse3u_b(:,:,:) = fse3u_b(:,:,:) + fse3u_0(:,:,:) 275 fse3v_b(:,:,:) = fse3v_b(:,:,:) + fse3v_0(:,:,:) 276 ! Leap-Frog - Asselin filter and swap: applied on velocity 277 ! ----------------------------------- 278 DO jk = 1, jpkm1 279 DO jj = 1, jpj 225 IF( ln_dynadv_vec ) THEN ! vector invariant form (no thickness weighted calulation) 226 ! 227 ! ! before scale factors at u- & v-pts (computed from fse3t_b) 228 CALL dom_vvl_2( kt, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 229 ! 230 DO jk = 1, jpkm1 ! Leap-Frog - Asselin filter and swap: applied on velocity 231 DO jj = 1, jpj ! -------- 280 232 DO ji = 1, jpi 281 233 zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2.e0 * un(ji,jj,jk) + ua(ji,jj,jk) ) … … 290 242 END DO 291 243 ! 292 ELSE 293 ! Temporary filered scale factor at (u/v)-points (will become before scale factor) 294 !----------------------------------------------- 295 ! Scale factor anomaly at (u/v)-points: surface averaging of scale factor at t-points 296 DO jk = 1, jpkm1 297 DO jj = 1, jpjm1 298 DO ji = 1, jpim1 299 zv_t_ij = zs_t(ji ,jj ) * fse3t_b(ji ,jj ,jk) 300 zv_t_ip1j = zs_t(ji+1,jj ) * fse3t_b(ji+1,jj ,jk) 301 zv_t_ijp1 = zs_t(ji ,jj+1) * fse3t_b(ji ,jj+1,jk) 302 ze3u_f(ji,jj,jk) = umask(ji,jj,jk) * ( zs_u_1(ji,jj) * ( zv_t_ij + zv_t_ip1j ) - fse3u_0(ji,jj,jk) ) 303 ze3v_f(ji,jj,jk) = vmask(ji,jj,jk) * ( zs_v_1(ji,jj) * ( zv_t_ij + zv_t_ijp1 ) - fse3v_0(ji,jj,jk) ) 304 END DO 305 END DO 306 END DO 307 ! lateral boundary conditions 308 CALL lbc_lnk( ze3u_f, 'U', 1. ) 309 CALL lbc_lnk( ze3v_f, 'V', 1. ) 310 ! Add initial scale factor to scale factor anomaly 311 ze3u_f(:,:,:) = ze3u_f(:,:,:) + fse3u_0(:,:,:) 312 ze3v_f(:,:,:) = ze3v_f(:,:,:) + fse3v_0(:,:,:) 313 ! Leap-Frog - Asselin filter and swap: applied on thickness weighted velocity 314 ! ----------------------------------- =========================== 315 DO jk = 1, jpkm1 316 DO jj = 1, jpj 317 DO ji = 1, jpim1 244 ELSE ! flux form (thickness weighted calulation) 245 ! 246 CALL dom_vvl_2( kt, ze3u_f, ze3v_f ) ! before scale factors at u- & v-pts (computed from fse3t_b) 247 ! 248 DO jk = 1, jpkm1 ! Leap-Frog - Asselin filter and swap: 249 DO jj = 1, jpj ! applied on thickness weighted velocity 250 DO ji = 1, jpim1 ! --------------------------- 318 251 zue3a = ua(ji,jj,jk) * fse3u_a(ji,jj,jk) 319 252 zve3a = va(ji,jj,jk) * fse3v_a(ji,jj,jk) … … 323 256 zve3b = vb(ji,jj,jk) * fse3v_b(ji,jj,jk) 324 257 ! 325 zuf = ( zue3n + atfp * ( zue3b - 2.e0* zue3n + zue3a ) ) / ze3u_f(ji,jj,jk)326 zvf = ( zve3n + atfp * ( zve3b - 2.e0* zve3n + zve3a ) ) / ze3v_f(ji,jj,jk)258 zuf = ( zue3n + atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ze3u_f(ji,jj,jk) 259 zvf = ( zve3n + atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ze3v_f(ji,jj,jk) 327 260 ! 328 ub(ji,jj,jk) = zuf 261 ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 329 262 vb(ji,jj,jk) = zvf 330 un(ji,jj,jk) = ua(ji,jj,jk) 263 un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 331 264 vn(ji,jj,jk) = va(ji,jj,jk) 332 265 END DO 333 266 END DO 334 267 END DO 335 fse3u_b(:,:, :) = ze3u_f(:,:,:)! e3u_b <-- filtered scale factor336 fse3v_b(:,:, :) = ze3v_f(:,:,:)337 CALL lbc_lnk( ub, 'U', -1. ) 268 fse3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) ! e3u_b <-- filtered scale factor 269 fse3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 270 CALL lbc_lnk( ub, 'U', -1. ) ! lateral boundary conditions 338 271 CALL lbc_lnk( vb, 'V', -1. ) 339 272 ENDIF … … 346 279 & tab3d_2=vn, clinfo2=' Vn: ' , mask2=vmask ) 347 280 ! 348 IF( wrk_not_released(2, 1,2,3) ) CALL ctl_stop('dyn_nxt: failed to release workspace arrays') 281 CALL wrk_dealloc( jpi,jpj,jpk, ze3u_f, ze3v_f ) 282 ! 283 IF( nn_timing == 1 ) CALL timing_stop('dyn_nxt') 349 284 ! 350 285 END SUBROUTINE dyn_nxt -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg.F90
r2715 r3294 15 15 USE dom_oce ! ocean space and time domain variables 16 16 USE phycst ! physical constants 17 USE obc_oce ! ocean open boundary conditions18 17 USE sbc_oce ! surface boundary condition: ocean 19 18 USE sbcapr ! surface boundary condition: atmospheric pressure … … 29 28 USE lib_mpp ! MPP library 30 29 USE solver ! solver initialization 30 USE wrk_nemo ! Memory Allocation 31 USE timing ! Timing 32 31 33 32 34 IMPLICIT NONE … … 74 76 !! of the physical meaning of the results. 75 77 !!---------------------------------------------------------------------- 76 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released77 USE wrk_nemo, ONLY: ztrdu => wrk_3d_4 , ztrdv => wrk_3d_5 ! 3D workspace78 78 ! 79 79 INTEGER, INTENT(in ) :: kt ! ocean time-step index … … 82 82 INTEGER :: ji, jj, jk ! dummy loop indices 83 83 REAL(wp) :: z2dt, zg_2 ! temporary scalar 84 !!----------------------------------------------------------------------85 86 IF( wrk_in_use(3, 4,5) ) THEN87 CALL ctl_stop('dyn_spg: requested workspace arrays unavailable') ; RETURN88 ENDIF84 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 85 !!---------------------------------------------------------------------- 86 ! 87 IF( nn_timing == 1 ) CALL timing_start('dyn_spg') 88 ! 89 89 90 90 !!gm NOTA BENE : the dynspg_exp and dynspg_ts should be modified so that … … 94 94 95 95 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 96 CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 96 97 ztrdu(:,:,:) = ua(:,:,:) 97 98 ztrdv(:,:,:) = va(:,:,:) … … 149 150 END SELECT 150 151 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_spg, 'DYN', kt ) 152 ! 153 CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 151 154 ENDIF 152 155 ! ! print mean trends (used for debugging) … … 154 157 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 155 158 ! 156 IF( wrk_not_released(3, 4,5) ) CALL ctl_stop('dyn_spg: failed to release workspace arrays')159 IF( nn_timing == 1 ) CALL timing_stop('dyn_spg') 157 160 ! 158 161 END SUBROUTINE dyn_spg … … 168 171 INTEGER :: ioptio 169 172 !!---------------------------------------------------------------------- 170 173 ! 174 IF( nn_timing == 1 ) CALL timing_start('dyn_spg_init') 175 ! 171 176 IF(lwp) THEN ! Control print 172 177 WRITE(numout,*) … … 221 226 IF( .NOT.ln_dynadv_vec ) CALL ctl_stop( 'Flux form not implemented for this free surface formulation' ) 222 227 ENDIF 223 224 #if defined key_obc 225 ! ! Conservation of ocean volume (key_dynspg_flt) 226 IF( lk_dynspg_flt ) ln_vol_cst = .true. 227 228 ! ! Application of Flather's algorithm at open boundaries 229 IF( lk_dynspg_flt ) ln_obc_fla = .false. 230 IF( lk_dynspg_exp ) ln_obc_fla = .true. 231 IF( lk_dynspg_ts ) ln_obc_fla = .true. 232 #endif 228 ! 229 IF( nn_timing == 1 ) CALL timing_stop('dyn_spg_init') 233 230 ! 234 231 END SUBROUTINE dyn_spg_init -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_exp.F90
r2715 r3294 21 21 USE phycst ! physical constants 22 22 USE obc_par ! open boundary condition parameters 23 USE obcdta ! open boundary condition data ( obc_dta_bt routine)23 USE obcdta ! open boundary condition data (bdy_dta_bt routine) 24 24 USE in_out_manager ! I/O manager 25 25 USE lib_mpp ! distributed memory computing library … … 28 28 USE iom ! I/O library 29 29 USE restart ! only for lrst_oce 30 USE timing ! Timing 31 30 32 31 33 IMPLICIT NONE … … 65 67 INTEGER :: ji, jj, jk ! dummy loop indices 66 68 !!---------------------------------------------------------------------- 67 69 ! 70 IF( nn_timing == 1 ) CALL timing_start('dyn_spg_exp') 71 ! 68 72 IF( kt == nit000 ) THEN 69 73 IF(lwp) WRITE(numout,*) … … 100 104 ENDIF 101 105 ! 106 IF( nn_timing == 1 ) CALL timing_stop('dyn_spg_exp') 107 ! 102 108 END SUBROUTINE dyn_spg_exp 103 109 -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_flt.F90
r2715 r3294 26 26 USE sbc_oce ! surface boundary condition: ocean 27 27 USE obc_oce ! Lateral open boundary condition 28 USE bdy_oce ! Lateral open boundary condition 28 29 USE sol_oce ! ocean elliptic solver 29 30 USE phycst ! physical constants … … 33 34 USE solpcg ! preconditionned conjugate gradient solver 34 35 USE solsor ! Successive Over-relaxation solver 35 USE obcdyn ! ocean open boundary condition (obc_dyn routines) 36 USE obcvol ! ocean open boundary condition (obc_vol routines) 37 USE bdy_oce ! Unstructured open boundaries condition 38 USE bdydyn ! Unstructured open boundaries condition (bdy_dyn routine) 39 USE bdyvol ! Unstructured open boundaries condition (bdy_vol routine) 36 USE obcdyn ! ocean open boundary condition on dynamics 37 USE obcvol ! ocean open boundary condition (obc_vol routine) 38 USE bdydyn ! ocean open boundary condition on dynamics 39 USE bdyvol ! ocean open boundary condition (bdy_vol routine) 40 40 USE cla ! cross land advection 41 41 USE in_out_manager ! I/O manager 42 42 USE lib_mpp ! distributed memory computing library 43 USE wrk_nemo ! Memory Allocation 43 44 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 44 45 USE prtctl ! Print control … … 49 50 USE agrif_opa_interp 50 51 #endif 52 USE timing ! Timing 51 53 52 54 IMPLICIT NONE … … 103 105 !! References : Roullet and Madec 1999, JGR. 104 106 !!--------------------------------------------------------------------- 105 USE oce, ONLY: zub => ta , zvb => sa ! (ta,sa) used as workspace106 !!107 107 INTEGER, INTENT(in ) :: kt ! ocean time-step index 108 108 INTEGER, INTENT( out) :: kindic ! solver convergence flag (<0 if not converge) … … 110 110 INTEGER :: ji, jj, jk ! dummy loop indices 111 111 REAL(wp) :: z2dt, z2dtg, zgcb, zbtd, ztdgu, ztdgv ! local scalars 112 REAL(wp), POINTER, DIMENSION(:,:,:) :: zub, zvb 112 113 !!---------------------------------------------------------------------- 114 ! 115 IF( nn_timing == 1 ) CALL timing_start('dyn_spg_flt') 116 ! 117 CALL wrk_alloc( jpi,jpj,jpk, zub, zvb ) 113 118 ! 114 119 IF( kt == nit000 ) THEN … … 187 192 #endif 188 193 #if defined key_bdy 189 CALL bdy_dyn _frs( kt ) ! Update velocities on unstructured boundary using the Flow Relaxation Scheme190 CALL bdy_vol( kt ) 194 CALL bdy_dyn( kt ) ! Update velocities on each open boundary 195 CALL bdy_vol( kt ) ! Correction of the barotropic component velocity to control the volume of the system 191 196 #endif 192 197 #if defined key_agrif … … 304 309 #if defined key_obc 305 310 ! caution : grad D = 0 along open boundaries 311 ! Remark: The filtering force could be reduced here in the FRS zone 312 ! by multiplying spgu/spgv by (1-alpha) ?? 306 313 spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj) 307 314 spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj) 308 315 #elif defined key_bdy 309 316 ! caution : grad D = 0 along open boundaries 310 ! Remark: The filtering force could be reduced here in the FRS zone311 ! by multiplying spgu/spgv by (1-alpha) ??312 317 spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj) 313 spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj) 318 spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj) 314 319 #else 315 320 spgu(ji,jj) = z2dt * ztdgu … … 345 350 ! -------------------------------------------------- 346 351 IF( lrst_oce ) CALL flt_rst( kt, 'WRITE' ) 352 ! 353 CALL wrk_dealloc( jpi,jpj,jpk, zub, zvb ) 354 ! 355 IF( nn_timing == 1 ) CALL timing_stop('dyn_spg_flt') 347 356 ! 348 357 END SUBROUTINE dyn_spg_flt -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_oce.F90
r2715 r3294 34 34 35 35 ! !!! Time splitting scheme (key_dynspg_ts) 36 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sshn_e, ssha_e ! sea surface heigth (now, after, average)37 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ua_e , va_e ! barotropic velocities (after)38 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hu_e , hv_e ! now ocean depth ( = Ho+sshn_e )39 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hur_e , hvr_e ! inverse of hu_e and hv_e40 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sshn_b! before field without time-filter36 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET :: sshn_e, ssha_e ! sea surface heigth (now, after, average) 37 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET :: ua_e , va_e ! barotropic velocities (after) 38 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hu_e , hv_e ! now ocean depth ( = Ho+sshn_e ) 39 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET :: hur_e , hvr_e ! inverse of hu_e and hv_e 40 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:), TARGET :: sshn_b ! before field without time-filter 41 41 42 42 !!---------------------------------------------------------------------- -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90
r2724 r3294 25 25 USE domvvl ! variable volume 26 26 USE zdfbfr ! bottom friction 27 USE obcdta ! open boundary condition data28 USE obcfla ! Flather open boundary condition29 27 USE dynvor ! vorticity term 30 28 USE obc_oce ! Lateral open boundary condition 31 29 USE obc_par ! open boundary condition parameters 32 USE bdy_oce ! unstructured open boundaries 33 USE bdy_par ! unstructured open boundaries 34 USE bdydta ! unstructured open boundaries 35 USE bdydyn ! unstructured open boundaries 36 USE bdytides ! tidal forcing at unstructured open boundaries. 30 USE obcdta ! open boundary condition data 31 USE obcfla ! Flather open boundary condition 32 USE bdy_par ! for lk_bdy 33 USE bdy_oce ! Lateral open boundary condition 34 USE bdydta ! open boundary condition data 35 USE bdydyn2d ! open boundary conditions on barotropic variables 36 USE sbctide 37 USE updtide 37 38 USE lib_mpp ! distributed memory computing library 38 39 USE lbclnk ! ocean lateral boundary conditions (or mpp link) … … 41 42 USE iom ! IOM library 42 43 USE restart ! only for lrst_oce 43 USE zdf_oce 44 USE zdf_oce ! Vertical diffusion 45 USE wrk_nemo ! Memory Allocation 46 USE timing ! Timing 47 44 48 45 49 IMPLICIT NONE … … 107 111 !! References : Griffies et al., (2003): A technical guide to MOM4. NOAA/GFDL 108 112 !!--------------------------------------------------------------------- 109 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released110 USE wrk_nemo, ONLY: zsshun_e => wrk_2d_1 , zsshb_e => wrk_2d_2 , zhdiv => wrk_2d_3111 USE wrk_nemo, ONLY: zsshvn_e => wrk_2d_4 , zssh_sum => wrk_2d_5112 USE wrk_nemo, ONLY: zcu => wrk_2d_6 , zwx => wrk_2d_7 , zua => wrk_2d_8 , zbfru => wrk_2d_9113 USE wrk_nemo, ONLY: zcv => wrk_2d_10 , zwy => wrk_2d_11 , zva => wrk_2d_12 , zbfrv => wrk_2d_13114 USE wrk_nemo, ONLY: zun => wrk_2d_14 , zun_e => wrk_2d_15 , zub_e => wrk_2d_16 , zu_sum => wrk_2d_17115 USE wrk_nemo, ONLY: zvn => wrk_2d_18 , zvn_e => wrk_2d_19 , zvb_e => wrk_2d_20 , zv_sum => wrk_2d_21116 113 ! 117 114 INTEGER, INTENT(in) :: kt ! ocean time-step index … … 119 116 INTEGER :: ji, jj, jk, jn ! dummy loop indices 120 117 INTEGER :: icycle ! local scalar 121 REAL(wp) :: zraur, zcoef, z2dt_e, z2dt_b ! local scalars 122 REAL(wp) :: z1_8, zx1, zy1 ! - - 123 REAL(wp) :: z1_4, zx2, zy2 ! - - 124 REAL(wp) :: zu_spg, zu_cor, zu_sld, zu_asp ! - - 125 REAL(wp) :: zv_spg, zv_cor, zv_sld, zv_asp ! - - 118 INTEGER :: ikbu, ikbv ! local scalar 119 REAL(wp) :: zraur, zcoef, z2dt_e, z1_2dt_b, z2dt_bf ! local scalars 120 REAL(wp) :: z1_8, zx1, zy1 ! - - 121 REAL(wp) :: z1_4, zx2, zy2 ! - - 122 REAL(wp) :: zu_spg, zu_cor, zu_sld, zu_asp ! - - 123 REAL(wp) :: zv_spg, zv_cor, zv_sld, zv_asp ! - - 124 REAL(wp) :: ua_btm, va_btm ! - - 125 ! 126 REAL(wp), POINTER, DIMENSION(:,:) :: zsshun_e, zsshvn_e, zsshb_e, zssh_sum, zhdiv 127 REAL(wp), POINTER, DIMENSION(:,:) :: zua, zva, zun, zvn, zun_e, zvn_e, zub_e, zvb_e 128 REAL(wp), POINTER, DIMENSION(:,:) :: zcu, zcv, zwx, zwy, zbfru, zbfrv, zu_sum, zv_sum 126 129 !!---------------------------------------------------------------------- 127 128 IF( wrk_in_use(2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, & 129 & 11,12,13,14,15,16,17,18,19,20,21 ) ) THEN 130 CALL ctl_stop( 'dyn_spg_ts: requested workspace arrays unavailable' ) ; RETURN 131 ENDIF 132 130 ! 131 IF( nn_timing == 1 ) CALL timing_start('dyn_spg_ts') 132 ! 133 CALL wrk_alloc( jpi, jpj, zsshun_e, zsshvn_e, zsshb_e, zssh_sum, zhdiv ) 134 CALL wrk_alloc( jpi, jpj, zua, zva, zun, zvn, zun_e, zvn_e, zub_e, zvb_e ) 135 CALL wrk_alloc( jpi, jpj, zcu, zcv, zwx, zwy, zbfru, zbfrv, zu_sum, zv_sum ) 136 ! 133 137 IF( kt == nit000 ) THEN !* initialisation 134 138 ! … … 147 151 hvr_e (:,:) = hvr (:,:) 148 152 IF( ln_dynvor_een ) THEN 149 ftne(1,:) = 0. e0 ; ftnw(1,:) = 0.e0 ; ftse(1,:) = 0.e0 ; ftsw(1,:) = 0.e0153 ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 150 154 DO jj = 2, jpj 151 155 DO ji = fs_2, jpi ! vector opt. 152 ftne(ji,jj) = ( ff(ji-1,jj ) + ff(ji ,jj ) + ff(ji ,jj-1) ) / 3. 153 ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj ) + ff(ji ,jj ) ) / 3. 154 ftse(ji,jj) = ( ff(ji ,jj ) + ff(ji ,jj-1) + ff(ji-1,jj-1) ) / 3. 155 ftsw(ji,jj) = ( ff(ji ,jj-1) + ff(ji-1,jj-1) + ff(ji-1,jj ) ) / 3. 156 ftne(ji,jj) = ( ff(ji-1,jj ) + ff(ji ,jj ) + ff(ji ,jj-1) ) / 3._wp 157 ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj ) + ff(ji ,jj ) ) / 3._wp 158 ftse(ji,jj) = ( ff(ji ,jj ) + ff(ji ,jj-1) + ff(ji-1,jj-1) ) / 3._wp 159 ftsw(ji,jj) = ( ff(ji ,jj-1) + ff(ji-1,jj-1) + ff(ji-1,jj ) ) / 3._wp 156 160 END DO 157 161 END DO … … 160 164 ENDIF 161 165 162 ! !* Local constant initialization 163 z2dt_b = 2.0 * rdt ! baroclinic time step 164 z1_8 = 0.5 * 0.25 ! coefficient for vorticity estimates 165 z1_4 = 0.5 * 0.5 166 zraur = 1. / rau0 ! 1 / volumic mass 167 ! 168 zhdiv(:,:) = 0.e0 ! barotropic divergence 169 zu_sld = 0.e0 ; zu_asp = 0.e0 ! tides trends (lk_tide=F) 170 zv_sld = 0.e0 ; zv_asp = 0.e0 166 ! !* Local constant initialization 167 z1_2dt_b = 1._wp / ( 2.0_wp * rdt ) ! reciprocal of baroclinic time step 168 IF( neuler == 0 .AND. kt == nit000 ) z1_2dt_b = 1.0_wp / rdt ! reciprocal of baroclinic 169 ! time step (euler timestep) 170 z1_8 = 0.125_wp ! coefficient for vorticity estimates 171 z1_4 = 0.25_wp 172 zraur = 1._wp / rau0 ! 1 / volumic mass 173 ! 174 zhdiv(:,:) = 0._wp ! barotropic divergence 175 zu_sld = 0._wp ; zu_asp = 0._wp ! tides trends (lk_tide=F) 176 zv_sld = 0._wp ; zv_asp = 0._wp 177 178 IF( kt == nit000 .AND. neuler == 0) THEN ! for implicit bottom friction 179 z2dt_bf = rdt 180 ELSE 181 z2dt_bf = 2.0_wp * rdt 182 ENDIF 171 183 172 184 ! ----------------------------------------------------------------------------- … … 176 188 ! !* e3*d/dt(Ua), e3*Ub, e3*Vn (Vertically integrated) 177 189 ! ! -------------------------- 178 zua(:,:) = 0. e0 ; zun(:,:) = 0.e0 ; ub_b(:,:) = 0.e0179 zva(:,:) = 0. e0 ; zvn(:,:) = 0.e0 ; vb_b(:,:) = 0.e0190 zua(:,:) = 0._wp ; zun(:,:) = 0._wp ; ub_b(:,:) = 0._wp 191 zva(:,:) = 0._wp ; zvn(:,:) = 0._wp ; vb_b(:,:) = 0._wp 180 192 ! 181 193 DO jk = 1, jpkm1 … … 195 207 ! 196 208 #if defined key_vvl 197 ub_b(ji,jj) = ub_b(ji,jj) + (fse3u_0(ji,jj,jk)*(1.+sshu_b(ji,jj)*muu(ji,jj,jk)))* ub(ji,jj,jk)198 vb_b(ji,jj) = vb_b(ji,jj) + (fse3v_0(ji,jj,jk)*(1.+sshv_b(ji,jj)*muv(ji,jj,jk)))* vb(ji,jj,jk)209 ub_b(ji,jj) = ub_b(ji,jj) + fse3u_b(ji,jj,jk)* ub(ji,jj,jk) *umask(ji,jj,jk) 210 vb_b(ji,jj) = vb_b(ji,jj) + fse3v_b(ji,jj,jk)* vb(ji,jj,jk) *vmask(ji,jj,jk) 199 211 #else 200 212 ub_b(ji,jj) = ub_b(ji,jj) + fse3u_0(ji,jj,jk) * ub(ji,jj,jk) * umask(ji,jj,jk) … … 270 282 DO jj = 2, jpjm1 ! Remove coriolis term (and possibly spg) from barotropic trend 271 283 DO ji = fs_2, fs_jpim1 272 zua(ji,jj) = zua(ji,jj) - zcu(ji,jj)273 zva(ji,jj) = zva(ji,jj) - zcv(ji,jj)274 END DO284 zua(ji,jj) = zua(ji,jj) - zcu(ji,jj) 285 zva(ji,jj) = zva(ji,jj) - zcv(ji,jj) 286 END DO 275 287 END DO 276 288 … … 278 290 ! ! Remove barotropic contribution of bottom friction 279 291 ! ! from the barotropic transport trend 280 zcoef = -1. / z2dt_b 292 zcoef = -1._wp * z1_2dt_b 293 294 IF(ln_bfrimp) THEN 295 ! ! Remove the bottom stress trend from 3-D sea surface level gradient 296 ! ! and Coriolis forcing in case of 3D semi-implicit bottom friction 297 DO jj = 2, jpjm1 298 DO ji = fs_2, fs_jpim1 299 ikbu = mbku(ji,jj) 300 ikbv = mbkv(ji,jj) 301 ua_btm = zcu(ji,jj) * z2dt_bf * hur(ji,jj) * umask (ji,jj,ikbu) 302 va_btm = zcv(ji,jj) * z2dt_bf * hvr(ji,jj) * vmask (ji,jj,ikbv) 303 304 zua(ji,jj) = zua(ji,jj) - bfrua(ji,jj) * ua_btm 305 zva(ji,jj) = zva(ji,jj) - bfrva(ji,jj) * va_btm 306 END DO 307 END DO 308 309 ELSE 310 281 311 # if defined key_vectopt_loop 282 DO jj = 1, 1283 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling)312 DO jj = 1, 1 313 DO ji = 1, jpij-jpi ! vector opt. (forced unrolling) 284 314 # else 285 DO jj = 2, jpjm1286 DO ji = 2, jpim1315 DO jj = 2, jpjm1 316 DO ji = 2, jpim1 287 317 # endif 288 318 ! Apply stability criteria for bottom friction 289 319 !RBbug for vvl and external mode we may need to use varying fse3 290 320 !!gm Rq: the bottom e3 present the smallest variation, the use of e3u_0 is not a big approx. 291 zbfru(ji,jj) = MAX( bfrua(ji,jj) , fse3u(ji,jj,mbku(ji,jj)) * zcoef ) 292 zbfrv(ji,jj) = MAX( bfrva(ji,jj) , fse3v(ji,jj,mbkv(ji,jj)) * zcoef ) 293 END DO 294 END DO 295 296 IF( lk_vvl ) THEN 297 DO jj = 2, jpjm1 298 DO ji = fs_2, fs_jpim1 ! vector opt. 299 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) & 300 & / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) ) 301 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) & 302 & / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) ) 303 END DO 304 END DO 305 ELSE 306 DO jj = 2, jpjm1 307 DO ji = fs_2, fs_jpim1 ! vector opt. 308 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) * hur(ji,jj) 309 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) * hvr(ji,jj) 310 END DO 311 END DO 312 ENDIF 313 321 zbfru(ji,jj) = MAX( bfrua(ji,jj) , fse3u(ji,jj,mbku(ji,jj)) * zcoef ) 322 zbfrv(ji,jj) = MAX( bfrva(ji,jj) , fse3v(ji,jj,mbkv(ji,jj)) * zcoef ) 323 END DO 324 END DO 325 326 IF( lk_vvl ) THEN 327 DO jj = 2, jpjm1 328 DO ji = fs_2, fs_jpim1 ! vector opt. 329 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) & 330 & / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1._wp - umask(ji,jj,1) ) 331 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) & 332 & / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1._wp - vmask(ji,jj,1) ) 333 END DO 334 END DO 335 ELSE 336 DO jj = 2, jpjm1 337 DO ji = fs_2, fs_jpim1 ! vector opt. 338 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) * hur(ji,jj) 339 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) * hvr(ji,jj) 340 END DO 341 END DO 342 ENDIF 343 END IF ! end (ln_bfrimp) 344 345 314 346 ! !* d/dt(Ua), Ub, Vn (Vertical mean velocity) 315 347 ! ! -------------------------- … … 318 350 ! 319 351 IF( lk_vvl ) THEN 320 ub_b(:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1. e0- umask(:,:,1) )321 vb_b(:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1. e0- vmask(:,:,1) )352 ub_b(:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) ) 353 vb_b(:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) ) 322 354 ELSE 323 355 ub_b(:,:) = ub_b(:,:) * hur(:,:) … … 355 387 ! set ssh corrections to 0 356 388 ! ssh corrections are applied to normal velocities (Flather's algorithm) and averaged over the barotropic loop 357 IF( lp_obc_east ) sshfoe_b(:,:) = 0. e0358 IF( lp_obc_west ) sshfow_b(:,:) = 0. e0359 IF( lp_obc_south ) sshfos_b(:,:) = 0. e0360 IF( lp_obc_north ) sshfon_b(:,:) = 0. e0389 IF( lp_obc_east ) sshfoe_b(:,:) = 0._wp 390 IF( lp_obc_west ) sshfow_b(:,:) = 0._wp 391 IF( lp_obc_south ) sshfos_b(:,:) = 0._wp 392 IF( lp_obc_north ) sshfon_b(:,:) = 0._wp 361 393 #endif 362 394 … … 367 399 IF( jn == 1 ) z2dt_e = rdt / nn_baro 368 400 369 ! !* Update the forcing ( OBC,BDY and tides)401 ! !* Update the forcing (BDY and tides) 370 402 ! ! ------------------ 371 403 IF( lk_obc ) CALL obc_dta_bt ( kt, jn ) 372 IF( lk_bdy ) CALL bdy_dta_fla( kt, jn+1, icycle ) 404 IF( lk_bdy ) CALL bdy_dta ( kt, jit=jn, time_offset=+1 ) 405 IF ( ln_tide_pot ) CALL upd_tide( kt, jn ) 373 406 374 407 ! !* after ssh_e 375 408 ! ! ----------- 376 DO jj = 2, jpjm1 409 DO jj = 2, jpjm1 ! Horizontal divergence of barotropic transports 377 410 DO ji = fs_2, fs_jpim1 ! vector opt. 378 411 zhdiv(ji,jj) = ( e2u(ji ,jj) * zun_e(ji ,jj) * hu_e(ji ,jj) & … … 386 419 ! ! OBC : zhdiv must be zero behind the open boundary 387 420 !! mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 388 IF( lp_obc_east ) zhdiv(nie0p1:nie1p1,nje0 :nje1 ) = 0. e0! east389 IF( lp_obc_west ) zhdiv(niw0 :niw1 ,njw0 :njw1 ) = 0. e0! west390 IF( lp_obc_north ) zhdiv(nin0 :nin1 ,njn0p1:njn1p1) = 0. e0! north391 IF( lp_obc_south ) zhdiv(nis0 :nis1 ,njs0 :njs1 ) = 0. e0! south421 IF( lp_obc_east ) zhdiv(nie0p1:nie1p1,nje0 :nje1 ) = 0._wp ! east 422 IF( lp_obc_west ) zhdiv(niw0 :niw1 ,njw0 :njw1 ) = 0._wp ! west 423 IF( lp_obc_north ) zhdiv(nin0 :nin1 ,njn0p1:njn1p1) = 0._wp ! north 424 IF( lp_obc_south ) zhdiv(nis0 :nis1 ,njs0 :njs1 ) = 0._wp ! south 392 425 #endif 393 426 #if defined key_bdy … … 403 436 ! !* after barotropic velocities (vorticity scheme dependent) 404 437 ! ! --------------------------- 405 zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:) 438 zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:) ! now_e transport 406 439 zwy(:,:) = e1v(:,:) * zvn_e(:,:) * hv_e(:,:) 407 440 ! … … 419 452 zv_spg = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj) 420 453 ENDIF 454 ! add tidal astronomical forcing 455 IF ( ln_tide_pot ) THEN 456 zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 457 zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 458 ENDIF 421 459 ! energy conserving formulation for planetary vorticity term 422 460 zy1 = ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) … … 427 465 zv_cor =-z1_4 * ( ff(ji-1,jj ) * zx1 + ff(ji,jj) * zx2 ) * hvr_e(ji,jj) 428 466 ! after velocities with implicit bottom friction 429 ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1) & 430 & / ( 1.e0 - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 431 va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1) & 432 & / ( 1.e0 - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 467 468 IF( ln_bfrimp ) THEN ! implicit bottom friction 469 ! A new method to implement the implicit bottom friction. 470 ! H. Liu 471 ! Sept 2011 472 ua_e(ji,jj) = umask(ji,jj,1) * ( zub_e(ji,jj) + & 473 & z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp ) & 474 & / ( 1._wp - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) ) 475 ua_e(ji,jj) = ( ua_e(ji,jj) + z2dt_e * zua(ji,jj) ) * umask(ji,jj,1) 476 ! 477 va_e(ji,jj) = vmask(ji,jj,1) * ( zvb_e(ji,jj) + & 478 & z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp ) & 479 & / ( 1._wp - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) ) 480 va_e(ji,jj) = ( va_e(ji,jj) + z2dt_e * zva(ji,jj) ) * vmask(ji,jj,1) 481 ! 482 ELSE 483 ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj))) * umask(ji,jj,1) & 484 & / ( 1._wp - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 485 va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj))) * vmask(ji,jj,1) & 486 & / ( 1._wp - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 487 ENDIF 433 488 END DO 434 489 END DO … … 447 502 zv_spg = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj) 448 503 ENDIF 504 ! add tidal astronomical forcing 505 IF ( ln_tide_pot ) THEN 506 zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 507 zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 508 ENDIF 449 509 ! enstrophy conserving formulation for planetary vorticity term 450 510 zy1 = z1_8 * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj ) ) / e1u(ji,jj) … … 453 513 zv_cor = zx1 * ( ff(ji-1,jj ) + ff(ji,jj) ) * hvr_e(ji,jj) 454 514 ! after velocities with implicit bottom friction 455 ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1) & 456 & / ( 1.e0 - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 457 va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1) & 458 & / ( 1.e0 - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 515 IF( ln_bfrimp ) THEN 516 ! A new method to implement the implicit bottom friction. 517 ! H. Liu 518 ! Sept 2011 519 ua_e(ji,jj) = umask(ji,jj,1) * ( zub_e(ji,jj) + & 520 & z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp ) & 521 & / ( 1._wp - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) ) 522 ua_e(ji,jj) = ( ua_e(ji,jj) + z2dt_e * zua(ji,jj) ) * umask(ji,jj,1) 523 ! 524 va_e(ji,jj) = vmask(ji,jj,1) * ( zvb_e(ji,jj) + & 525 & z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp ) & 526 & / ( 1._wp - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) ) 527 va_e(ji,jj) = ( va_e(ji,jj) + z2dt_e * zva(ji,jj) ) * vmask(ji,jj,1) 528 ! 529 ELSE 530 ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj))) * umask(ji,jj,1) & 531 & / ( 1._wp - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 532 va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj))) * vmask(ji,jj,1) & 533 & / ( 1._wp - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 534 ENDIF 459 535 END DO 460 536 END DO … … 473 549 zv_spg = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj) 474 550 ENDIF 551 ! add tidal astronomical forcing 552 IF ( ln_tide_pot ) THEN 553 zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 554 zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 555 ENDIF 475 556 ! energy/enstrophy conserving formulation for planetary vorticity term 476 557 zu_cor = + z1_4 / e1u(ji,jj) * ( ftne(ji,jj ) * zwy(ji ,jj ) + ftnw(ji+1,jj) * zwy(ji+1,jj ) & … … 479 560 & + ftnw(ji,jj ) * zwx(ji-1,jj ) + ftne(ji,jj ) * zwx(ji ,jj ) ) * hvr_e(ji,jj) 480 561 ! after velocities with implicit bottom friction 481 ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1) & 482 & / ( 1.e0 - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 483 va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1) & 484 & / ( 1.e0 - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 562 IF( ln_bfrimp ) THEN 563 ! A new method to implement the implicit bottom friction. 564 ! H. Liu 565 ! Sept 2011 566 ua_e(ji,jj) = umask(ji,jj,1) * ( zub_e(ji,jj) + & 567 & z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp ) & 568 & / ( 1._wp - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) ) 569 ua_e(ji,jj) = ( ua_e(ji,jj) + z2dt_e * zua(ji,jj) ) * umask(ji,jj,1) 570 ! 571 va_e(ji,jj) = vmask(ji,jj,1) * ( zvb_e(ji,jj) + & 572 & z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp ) & 573 & / ( 1._wp - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) ) 574 va_e(ji,jj) = ( va_e(ji,jj) + z2dt_e * zva(ji,jj) ) * vmask(ji,jj,1) 575 ! 576 ELSE 577 ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj))) * umask(ji,jj,1) & 578 & / ( 1._wp - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 579 va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj))) * vmask(ji,jj,1) & 580 & / ( 1._wp - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 581 ENDIF 485 582 END DO 486 583 END DO 487 584 ! 488 585 ENDIF 489 ! !* domain lateral boundary 490 ! ! ----------------------- 491 ! ! Flather's boundary condition for the barotropic loop : 492 ! ! - Update sea surface height on each open boundary 493 ! ! - Correct the velocity 494 586 ! !* domain lateral boundary 587 ! ! ----------------------- 588 589 ! OBC open boundaries 495 590 IF( lk_obc ) CALL obc_fla_ts ( ua_e, va_e, sshn_e, ssha_e ) 496 IF( lk_bdy .OR. ln_tides ) CALL bdy_dyn_fla( sshn_e ) 591 592 ! BDY open boundaries 593 #if defined key_bdy 594 pssh => sshn_e 595 phur => hur_e 596 phvr => hvr_e 597 pu2d => ua_e 598 pv2d => va_e 599 600 IF( lk_bdy ) CALL bdy_dyn2d( kt ) 601 #endif 602 497 603 ! 498 604 CALL lbc_lnk( ua_e , 'U', -1. ) ! local domain boundaries … … 526 632 DO jj = 1, jpjm1 ! Sea Surface Height at u- & v-points 527 633 DO ji = 1, fs_jpim1 ! Vector opt. 528 zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) ) &529 & * ( e1t(ji ,jj) * e2t(ji ,jj) * sshn_e(ji ,jj) &530 & +e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) )531 zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) ) &532 & * ( e1t(ji,jj ) * e2t(ji,jj ) * sshn_e(ji,jj ) &533 & +e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) )634 zsshun_e(ji,jj) = 0.5_wp * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) ) & 635 & * ( e1t(ji ,jj) * e2t(ji ,jj) * sshn_e(ji ,jj) & 636 & + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) ) 637 zsshvn_e(ji,jj) = 0.5_wp * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) ) & 638 & * ( e1t(ji,jj ) * e2t(ji,jj ) * sshn_e(ji,jj ) & 639 & + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) ) 534 640 END DO 535 641 END DO … … 539 645 hu_e (:,:) = hu_0(:,:) + zsshun_e(:,:) ! Ocean depth at U- and V-points 540 646 hv_e (:,:) = hv_0(:,:) + zsshvn_e(:,:) 541 hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1. e0- umask(:,:,1) )542 hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1. e0- vmask(:,:,1) )647 hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1._wp - umask(:,:,1) ) 648 hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1._wp - vmask(:,:,1) ) 543 649 ! 544 650 ENDIF … … 559 665 ! 560 666 ! !* Time average ==> after barotropic u, v, ssh 561 zcoef = 1. e0/ ( 2 * nn_baro + 1 )667 zcoef = 1._wp / ( 2 * nn_baro + 1 ) 562 668 zu_sum(:,:) = zcoef * zu_sum (:,:) 563 669 zv_sum(:,:) = zcoef * zv_sum (:,:) … … 565 671 ! !* update the general momentum trend 566 672 DO jk=1,jpkm1 567 ua(:,:,jk) = ua(:,:,jk) + ( zu_sum(:,:) - ub_b(:,:) ) / z2dt_b568 va(:,:,jk) = va(:,:,jk) + ( zv_sum(:,:) - vb_b(:,:) ) / z2dt_b673 ua(:,:,jk) = ua(:,:,jk) + ( zu_sum(:,:) - ub_b(:,:) ) * z1_2dt_b 674 va(:,:,jk) = va(:,:,jk) + ( zv_sum(:,:) - vb_b(:,:) ) * z1_2dt_b 569 675 END DO 570 676 un_b (:,:) = zu_sum(:,:) … … 575 681 IF( lrst_oce ) CALL ts_rst( kt, 'WRITE' ) 576 682 ! 577 ! 578 IF( wrk_not_released(2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, & 579 & 11,12,13,14,15,16,17,18,19,20,21) ) & 580 CALL ctl_stop('dyn_spg_ts: failed to release workspace arrays') 683 CALL wrk_dealloc( jpi, jpj, zsshun_e, zsshvn_e, zsshb_e, zssh_sum, zhdiv ) 684 CALL wrk_dealloc( jpi, jpj, zua, zva, zun, zvn, zun_e, zvn_e, zub_e, zvb_e ) 685 CALL wrk_dealloc( jpi, jpj, zcu, zcv, zwx, zwy, zbfru, zbfrv, zu_sum, zv_sum ) 686 ! 687 IF( nn_timing == 1 ) CALL timing_stop('dyn_spg_ts') 581 688 ! 582 689 END SUBROUTINE dyn_spg_ts … … 600 707 CALL iom_get( numror, jpdom_autoglo, 'vn_b' , vn_b (:,:) ) ! from barotropic loop 601 708 ELSE 602 un_b (:,:) = 0. e0603 vn_b (:,:) = 0. e0709 un_b (:,:) = 0._wp 710 vn_b (:,:) = 0._wp 604 711 ! vertical sum 605 712 IF( lk_vopt_loop ) THEN ! vector opt., forced unroll … … 622 729 ! Vertically integrated velocity (before) 623 730 IF (neuler/=0) THEN 624 ub_b (:,:) = 0. e0625 vb_b (:,:) = 0. e0731 ub_b (:,:) = 0._wp 732 vb_b (:,:) = 0._wp 626 733 627 734 ! vertical sum … … 641 748 642 749 IF( lk_vvl ) THEN 643 ub_b (:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1. e0- umask(:,:,1) )644 vb_b (:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1. e0- vmask(:,:,1) )750 ub_b (:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) ) 751 vb_b (:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) ) 645 752 ELSE 646 753 ub_b(:,:) = ub_b(:,:) * hur(:,:) -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90
r2715 r3294 27 27 USE oce ! ocean dynamics and tracers 28 28 USE dom_oce ! ocean space and time domain 29 USE dommsk ! ocean mask 29 30 USE dynadv ! momentum advection (use ln_dynadv_vec value) 30 31 USE trdmod ! ocean dynamics trends … … 33 34 USE prtctl ! Print control 34 35 USE in_out_manager ! I/O manager 35 USE lib_mpp 36 USE lib_mpp ! MPP library 37 USE wrk_nemo ! Memory Allocation 38 USE timing ! Timing 39 36 40 37 41 IMPLICIT NONE … … 71 75 !! and planetary vorticity trends) ('key_trddyn') 72 76 !!---------------------------------------------------------------------- 73 USE oce, ONLY: ztrdu => ta , ztrdv => sa ! (ta,sa) used as 3D workspace74 !75 77 INTEGER, INTENT( in ) :: kt ! ocean time-step index 76 !!---------------------------------------------------------------------- 78 ! 79 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 80 !!---------------------------------------------------------------------- 81 ! 82 IF( nn_timing == 1 ) CALL timing_start('dyn_vor') 83 ! 84 IF( l_trddyn ) CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 77 85 ! 78 86 ! ! vorticity term … … 175 183 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 176 184 ! 185 IF( l_trddyn ) CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 186 ! 187 IF( nn_timing == 1 ) CALL timing_stop('dyn_vor') 188 ! 177 189 END SUBROUTINE dyn_vor 178 190 … … 204 216 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 205 217 !!---------------------------------------------------------------------- 206 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released207 USE wrk_nemo, ONLY: zwx => wrk_2d_1 , zwy => wrk_2d_2 , zwz => wrk_2d_3 ! 2D workspace208 218 ! 209 219 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 215 225 INTEGER :: ji, jj, jk ! dummy loop indices 216 226 REAL(wp) :: zx1, zy1, zfact2, zx2, zy2 ! local scalars 217 !!---------------------------------------------------------------------- 218 219 IF( wrk_in_use(2, 1,2,3) ) THEN 220 CALL ctl_stop('dyn:vor_ene: requested workspace arrays unavailable') ; RETURN 221 ENDIF 222 227 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz 228 !!---------------------------------------------------------------------- 229 ! 230 IF( nn_timing == 1 ) CALL timing_start('vor_ene') 231 ! 232 CALL wrk_alloc( jpi, jpj, zwx, zwy, zwz ) 233 ! 223 234 IF( kt == nit000 ) THEN 224 235 IF(lwp) WRITE(numout,*) … … 284 295 END DO ! End of slab 285 296 ! ! =============== 286 IF( wrk_not_released(2, 1,2,3) ) CALL ctl_stop('dyn:vor_ene: failed to release workspace arrays') 297 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz ) 298 ! 299 IF( nn_timing == 1 ) CALL timing_stop('vor_ene') 287 300 ! 288 301 END SUBROUTINE vor_ene … … 320 333 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 321 334 !!---------------------------------------------------------------------- 322 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released323 USE wrk_nemo, ONLY: zwx => wrk_2d_4 , zwy => wrk_2d_5 , zwz => wrk_2d_6 , zww => wrk_2d_7 ! 2D workspace324 335 ! 325 336 INTEGER, INTENT(in) :: kt ! ocean timestep index … … 328 339 REAL(wp) :: zfact1, zua, zcua, zx1, zy1 ! local scalars 329 340 REAL(wp) :: zfact2, zva, zcva, zx2, zy2 ! - - 330 !!---------------------------------------------------------------------- 331 332 IF( wrk_in_use(2, 4,5,6,7) ) THEN 333 CALL ctl_stop('dyn:vor_mix: requested workspace arrays unavailable') ; RETURN 334 ENDIF 335 341 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww 342 !!---------------------------------------------------------------------- 343 ! 344 IF( nn_timing == 1 ) CALL timing_start('vor_mix') 345 ! 346 CALL wrk_alloc( jpi, jpj, zwx, zwy, zwz, zww ) 347 ! 336 348 IF( kt == nit000 ) THEN 337 349 IF(lwp) WRITE(numout,*) … … 404 416 END DO ! End of slab 405 417 ! ! =============== 406 IF( wrk_not_released(2, 4,5,6,7) ) CALL ctl_stop('dyn:vor_mix: failed to release workspace arrays') 418 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz, zww ) 419 ! 420 IF( nn_timing == 1 ) CALL timing_stop('vor_mix') 407 421 ! 408 422 END SUBROUTINE vor_mix … … 435 449 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 436 450 !!---------------------------------------------------------------------- 437 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released438 USE wrk_nemo, ONLY: zwx => wrk_2d_4, zwy => wrk_2d_5, zwz => wrk_2d_6 ! 2D workspace439 451 ! 440 452 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 446 458 INTEGER :: ji, jj, jk ! dummy loop indices 447 459 REAL(wp) :: zfact1, zuav, zvau ! temporary scalars 448 !!---------------------------------------------------------------------- 449 450 IF( wrk_in_use(2, 4,5,6) ) THEN 451 CALL ctl_stop('dyn:vor_ens: requested workspace arrays unavailable') ; RETURN 452 END IF 453 460 REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww 461 !!---------------------------------------------------------------------- 462 ! 463 IF( nn_timing == 1 ) CALL timing_start('vor_ens') 464 ! 465 CALL wrk_alloc( jpi, jpj, zwx, zwy, zwz ) 466 ! 454 467 IF( kt == nit000 ) THEN 455 468 IF(lwp) WRITE(numout,*) … … 523 536 END DO ! End of slab 524 537 ! ! =============== 525 IF( wrk_not_released(2, 4,5,6) ) CALL ctl_stop('dyn:vor_ens: failed to release workspace arrays') 538 CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz ) 539 ! 540 IF( nn_timing == 1 ) CALL timing_stop('vor_ens') 526 541 ! 527 542 END SUBROUTINE vor_ens … … 547 562 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 548 563 !!---------------------------------------------------------------------- 549 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released550 USE wrk_nemo, ONLY: zwx => wrk_2d_1 , zwy => wrk_2d_2 , zwz => wrk_2d_3 ! 2D workspace551 USE wrk_nemo, ONLY: ztnw => wrk_2d_4 , ztne => wrk_2d_5552 USE wrk_nemo, ONLY: ztsw => wrk_2d_6 , ztse => wrk_2d_7553 #if defined key_vvl554 USE wrk_nemo, ONLY: ze3f => wrk_3d_1 ! 3D workspace (lk_vvl=T)555 #endif556 564 ! 557 565 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 561 569 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva ! total v-trend 562 570 !! 563 INTEGER :: ji, jj, jk ! dummy loop indices 564 INTEGER :: ierr ! local integer 565 REAL(wp) :: zfac12, zua, zva ! local scalars 571 INTEGER :: ji, jj, jk ! dummy loop indices 572 INTEGER :: ierr ! local integer 573 REAL(wp) :: zfac12, zua, zva ! local scalars 574 ! ! 3D workspace 575 REAL(wp), POINTER , DIMENSION(:,: ) :: zwx, zwy, zwz 576 REAL(wp), POINTER , DIMENSION(:,: ) :: ztnw, ztne, ztsw, ztse 577 #if defined key_vvl 578 REAL(wp), POINTER , DIMENSION(:,:,:) :: ze3f ! 3D workspace (lk_vvl=T) 579 #endif 566 580 #if ! defined key_vvl 567 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE ::ze3f ! lk_vvl=F, ze3f=1/e3f saved one for all581 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: ze3f ! lk_vvl=F, ze3f=1/e3f saved one for all 568 582 #endif 569 583 !!---------------------------------------------------------------------- 570 571 IF( wrk_in_use(2, 1,2,3,4,5,6,7) .OR. wrk_in_use(3, 1) ) THEN 572 CALL ctl_stop('dyn:vor_een: requested workspace arrays unavailable') ; RETURN 573 ENDIF 574 584 ! 585 IF( nn_timing == 1 ) CALL timing_start('vor_een') 586 ! 587 CALL wrk_alloc( jpi, jpj, zwx , zwy , zwz ) 588 CALL wrk_alloc( jpi, jpj, ztnw, ztne, ztsw, ztse ) 589 #if defined key_vvl 590 CALL wrk_alloc( jpi, jpj, jpk, ze3f ) 591 #endif 592 ! 575 593 IF( kt == nit000 ) THEN 576 594 IF(lwp) WRITE(numout,*) … … 670 688 END DO ! End of slab 671 689 ! ! =============== 672 IF( wrk_not_released(2, 1,2,3,4,5,6,7) .OR. & 673 wrk_not_released(3, 1) ) CALL ctl_stop('dyn:vor_een: failed to release workspace arrays') 690 CALL wrk_dealloc( jpi, jpj, zwx , zwy , zwz ) 691 CALL wrk_dealloc( jpi, jpj, ztnw, ztne, ztsw, ztse ) 692 #if defined key_vvl 693 CALL wrk_dealloc( jpi, jpj, jpk, ze3f ) 694 #endif 695 ! 696 IF( nn_timing == 1 ) CALL timing_stop('vor_een') 674 697 ! 675 698 END SUBROUTINE vor_een … … 684 707 !!---------------------------------------------------------------------- 685 708 INTEGER :: ioptio ! local integer 709 INTEGER :: ji, jj, jk ! dummy loop indices 686 710 !! 687 711 NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een … … 700 724 WRITE(numout,*) ' mixed enstrophy/energy conserving scheme ln_dynvor_mix = ', ln_dynvor_mix 701 725 WRITE(numout,*) ' enstrophy and energy conserving scheme ln_dynvor_een = ', ln_dynvor_een 726 ENDIF 727 728 ! If energy, enstrophy or mixed advection of momentum in vector form change the value for masks 729 ! at angles with three ocean points and one land point 730 IF( ln_vorlat .AND. ( ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix ) ) THEN 731 DO jk = 1, jpk 732 DO jj = 2, jpjm1 733 DO ji = 2, jpim1 734 IF( tmask(ji,jj,jk)+tmask(ji+1,jj,jk)+tmask(ji,jj+1,jk)+tmask(ji+1,jj+1,jk) == 3._wp ) & 735 fmask(ji,jj,jk) = 1._wp 736 END DO 737 END DO 738 END DO 739 ! 740 CALL lbc_lnk( fmask, 'F', 1._wp ) ! Lateral boundary conditions on fmask 741 ! 702 742 ENDIF 703 743 -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90
r2715 r3294 21 21 USE lib_mpp ! MPP library 22 22 USE prtctl ! Print control 23 USE wrk_nemo ! Memory Allocation 24 USE timing ! Timing 23 25 24 26 IMPLICIT NONE … … 52 54 !! ** Action : - Update (ua,va) with the vert. momentum adv. trends 53 55 !! - Save the trends in (ztrdu,ztrdv) ('key_trddyn') 54 !!---------------------------------------------------------------------- 55 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 56 USE wrk_nemo, ONLY: zww => wrk_2d_1 ! 2D workspace 57 USE oce , ONLY: zwuw => ta , zwvw => sa ! (ta,sa) used as 3D workspace 58 USE wrk_nemo, ONLY: ztrdu => wrk_3d_1 , ztrdv => wrk_3d_2 ! 3D workspace 59 ! 56 !!---------------------------------------------------------------------- 60 57 INTEGER, INTENT(in) :: kt ! ocean time-step inedx 61 58 ! 62 59 INTEGER :: ji, jj, jk ! dummy loop indices 63 60 REAL(wp) :: zua, zva ! temporary scalars 61 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwuw , zwvw 62 REAL(wp), POINTER, DIMENSION(:,: ) :: zww 63 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 64 64 !!---------------------------------------------------------------------- 65 66 IF( wrk_in_use(2, 1) .OR. wrk_in_use(3, 1,2) ) THEN 67 CALL ctl_stop('dyn_zad: requested workspace arrays unavailable') ; RETURN 68 ENDIF 69 65 ! 66 IF( nn_timing == 1 ) CALL timing_start('dyn_zad') 67 ! 68 CALL wrk_alloc( jpi,jpj, zww ) 69 CALL wrk_alloc( jpi,jpj,jpk, zwuw , zwvw ) 70 ! 70 71 IF( kt == nit000 ) THEN 71 72 IF(lwp)WRITE(numout,*) … … 74 75 75 76 IF( l_trddyn ) THEN ! Save ua and va trends 77 CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 76 78 ztrdu(:,:,:) = ua(:,:,:) 77 79 ztrdv(:,:,:) = va(:,:,:) … … 117 119 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 118 120 CALL trd_mod(ztrdu, ztrdv, jpdyn_trd_zad, 'DYN', kt) 121 CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 119 122 ENDIF 120 123 ! ! Control print … … 122 125 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 123 126 ! 124 IF( wrk_not_released(2, 1) .OR. & 125 wrk_not_released(3, 1,2) ) CALL ctl_stop('dyn_zad: failed to release workspace arrays') 127 CALL wrk_dealloc( jpi,jpj, zww ) 128 CALL wrk_dealloc( jpi,jpj,jpk, zwuw , zwvw ) 129 ! 130 IF( nn_timing == 1 ) CALL timing_stop('dyn_zad') 126 131 ! 127 132 END SUBROUTINE dyn_zad -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf.F90
r2715 r3294 25 25 USE lib_mpp ! MPP library 26 26 USE prtctl ! Print control 27 USE wrk_nemo ! Memory Allocation 28 USE timing ! Timing 27 29 28 30 IMPLICIT NONE … … 53 55 !! ** Purpose : compute the vertical ocean dynamics physics. 54 56 !!--------------------------------------------------------------------- 55 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released56 USE wrk_nemo, ONLY: ztrdu => wrk_3d_1 , ztrdv => wrk_3d_2 ! 3D workspace57 57 !! 58 58 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 ! 60 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 59 61 !!--------------------------------------------------------------------- 60 61 IF( wrk_in_use(3, 1,2) ) THEN 62 CALL ctl_stop('dyn_zdf: requested workspace arrays unavailable') ; RETURN 63 END IF 62 ! 63 IF( nn_timing == 1 ) CALL timing_start('dyn_zdf') 64 ! 64 65 ! ! set time step 65 66 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdtra (restart with Euler time stepping) … … 68 69 69 70 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 71 CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 70 72 ztrdu(:,:,:) = ua(:,:,:) 71 73 ztrdv(:,:,:) = va(:,:,:) … … 90 92 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 91 93 CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_zdf, 'DYN', kt ) 94 ! 95 CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 92 96 ENDIF 93 97 ! ! print mean trends (used for debugging) … … 95 99 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 96 100 ! 97 IF( wrk_not_released(3, 1,2) ) CALL ctl_stop('dyn_zdf: failed to release workspace arrays')101 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf') 98 102 ! 99 103 END SUBROUTINE dyn_zdf -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90
r2715 r3294 22 22 USE in_out_manager ! I/O manager 23 23 USE lib_mpp ! MPP library 24 USE wrk_nemo ! Memory Allocation 25 USE timing ! Timing 26 24 27 25 28 IMPLICIT NONE … … 54 57 !! ** Action : - Update (ua,va) with the vertical diffusive trend 55 58 !!--------------------------------------------------------------------- 56 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released57 USE oce , ONLY: zwx => ta , zwy => sa ! (ta,sa) used as 3D workspace58 USE wrk_nemo, ONLY: zwz => wrk_3d_1 , zww => wrk_3d_2 ! 3D workspace59 !60 59 INTEGER , INTENT(in) :: kt ! ocean time-step index 61 60 REAL(wp), INTENT(in) :: p2dt ! time-step … … 63 62 INTEGER :: ji, jj, jk, jl ! dummy loop indices 64 63 REAL(wp) :: zrau0r, zlavmr, zua, zva ! local scalars 64 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwx, zwy, zwz, zww 65 65 !!---------------------------------------------------------------------- 66 67 IF( wrk_in_use(3, 1,2) ) THEN68 CALL ctl_stop('dyn_zdf_exp: requested workspace arrays unavailable') ; RETURN69 ENDIF70 66 ! 67 IF( nn_timing == 1 ) CALL timing_start('dyn_zdf_exp') 68 ! 69 CALL wrk_alloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 70 ! 71 71 IF( kt == nit000 .AND. lwp ) THEN 72 72 WRITE(numout,*) … … 120 120 END DO ! End of time splitting 121 121 ! 122 IF( wrk_not_released(3, 1,2) ) CALL ctl_stop('dyn_zdf_exp: failed to release workspace arrays') 122 CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 123 ! 124 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_exp') 123 125 ! 124 126 END SUBROUTINE dyn_zdf_exp -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90
r2715 r3294 8 8 !! NEMO 0.5 ! 2002-08 (G. Madec) F90: Free form and module 9 9 !! 3.3 ! 2010-04 (M. Leclair, G. Madec) Forcing averaged over 2 time steps 10 !! 3.4 ! 2012-01 (H. Liu) Semi-implicit bottom friction 10 11 !!---------------------------------------------------------------------- 11 12 … … 20 21 USE in_out_manager ! I/O manager 21 22 USE lib_mpp ! MPP library 23 USE zdfbfr ! Bottom friction setup 24 USE wrk_nemo ! Memory Allocation 25 USE timing ! Timing 22 26 23 27 IMPLICIT NONE … … 54 58 !! ** Action : - Update (ua,va) arrays with the after vertical diffusive mixing trend. 55 59 !!--------------------------------------------------------------------- 56 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 57 USE oce , ONLY: zwd => ta , zws => sa ! (ta,sa) used as 3D workspace 58 USE wrk_nemo, ONLY: zwi => wrk_3d_3 ! 3D workspace 59 !! 60 INTEGER , INTENT(in) :: kt ! ocean time-step index 60 INTEGER , INTENT(in) :: kt ! ocean time-step index 61 61 REAL(wp), INTENT(in) :: p2dt ! vertical profile of tracer time-step 62 62 !! 63 63 INTEGER :: ji, jj, jk ! dummy loop indices 64 INTEGER :: ikbu, ikbv ! local integers 64 65 REAL(wp) :: z1_p2dt, zcoef, zzwi, zzws, zrhs ! local scalars 65 66 !!---------------------------------------------------------------------- 66 67 67 IF( wrk_in_use(3, 3) ) THEN 68 CALL ctl_stop('dyn_zdf_imp: requested workspace array unavailable') ; RETURN 69 END IF 70 68 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwd, zws 69 REAL(wp), POINTER, DIMENSION(:,:) :: zavmu, zavmv 70 !!---------------------------------------------------------------------- 71 ! 72 IF( nn_timing == 1 ) CALL timing_start('dyn_zdf_imp') 73 ! 74 CALL wrk_alloc( jpi,jpj,jpk, zwi, zwd, zws ) 75 CALL wrk_alloc( jpi,jpj, zavmu, zavmv ) 76 ! 71 77 IF( kt == nit000 ) THEN 72 78 IF(lwp) WRITE(numout,*) … … 79 85 z1_p2dt = 1._wp / p2dt ! inverse of the timestep 80 86 81 ! 1. Vertical diffusion on u 87 ! 1. Apply semi-implicit bottom friction 88 ! -------------------------------------- 89 ! Only needed for semi-implicit bottom friction setup. The explicit 90 ! bottom friction has been included in "u(v)a" which act as the R.H.S 91 ! column vector of the tri-diagonal matrix equation 92 ! 93 94 IF( ln_bfrimp ) THEN 95 # if defined key_vectopt_loop 96 DO jj = 1, 1 97 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 98 # else 99 DO jj = 2, jpjm1 100 DO ji = 2, jpim1 101 # endif 102 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 103 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 104 zavmu(ji,jj) = avmu(ji,jj,ikbu+1) 105 zavmv(ji,jj) = avmv(ji,jj,ikbv+1) 106 avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1) 107 avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1) 108 END DO 109 END DO 110 ENDIF 111 112 ! 2. Vertical diffusion on u 82 113 ! --------------------------- 83 114 ! Matrix and second member construction 84 115 ! bottom boundary condition: both zwi and zws must be masked as avmu can take 85 ! non zero value at the ocean bottom depending on the bottom friction 86 ! used but the bottom velocities have already been updated with the bottom 87 ! friction velocity in dyn_bfr using values from the previous timestep. There 88 ! is no need to include these in the implicit calculation. 116 ! non zero value at the ocean bottom depending on the bottom friction used. 89 117 ! 90 118 DO jk = 1, jpkm1 ! Matrix … … 168 196 169 197 170 ! 2. Vertical diffusion on v198 ! 3. Vertical diffusion on v 171 199 ! --------------------------- 172 200 ! Matrix and second member construction 173 201 ! bottom boundary condition: both zwi and zws must be masked as avmv can take 174 ! non zero value at the ocean bottom depending on the bottom friction 175 ! used but the bottom velocities have already been updated with the bottom 176 ! friction velocity in dyn_bfr using values from the previous timestep. There 177 ! is no need to include these in the implicit calculation. 202 ! non zero value at the ocean bottom depending on the bottom friction used 178 203 ! 179 204 DO jk = 1, jpkm1 ! Matrix … … 255 280 END DO 256 281 END DO 257 ! 258 IF( wrk_not_released(3, 3) ) CALL ctl_stop('dyn_zdf_imp: failed to release workspace array') 282 283 !! restore bottom layer avmu(v) 284 IF( ln_bfrimp ) THEN 285 # if defined key_vectopt_loop 286 DO jj = 1, 1 287 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 288 # else 289 DO jj = 2, jpjm1 290 DO ji = 2, jpim1 291 # endif 292 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 293 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 294 avmu(ji,jj,ikbu+1) = zavmu(ji,jj) 295 avmv(ji,jj,ikbv+1) = zavmv(ji,jj) 296 END DO 297 END DO 298 ENDIF 299 ! 300 CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwd, zws) 301 CALL wrk_dealloc( jpi,jpj, zavmu, zavmv) 302 ! 303 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_imp') 259 304 ! 260 305 END SUBROUTINE dyn_zdf_imp -
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90
r2715 r3294 39 39 USE asminc ! Assimilation increment 40 40 #endif 41 USE wrk_nemo ! Memory Allocation 42 USE timing ! Timing 41 43 42 44 IMPLICIT NONE … … 75 77 !! Reference : Leclair, M., and G. Madec, 2009, Ocean Modelling. 76 78 !!---------------------------------------------------------------------- 77 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released78 USE oce , ONLY: z3d => ta ! ta used as 3D workspace79 USE wrk_nemo, ONLY: zhdiv => wrk_2d_1 , z2d => wrk_2d_2 ! 2D workspace80 !81 79 INTEGER, INTENT(in) :: kt ! time step 82 80 ! 83 81 INTEGER :: ji, jj, jk ! dummy loop indices 84 82 REAL(wp) :: zcoefu, zcoefv, zcoeff, z2dt, z1_2dt, z1_rau0 ! local scalars 85 !!---------------------------------------------------------------------- 86 87 IF( wrk_in_use(2, 1,2) ) THEN 88 CALL ctl_stop('ssh_wzv: requested workspace arrays unavailable') ; RETURN 89 ENDIF 90 83 REAL(wp), POINTER, DIMENSION(:,: ) :: z2d, zhdiv 84 REAL(wp), POINTER, DIMENSION(:,:,:) :: z3d 85 !!---------------------------------------------------------------------- 86 ! 87 IF( nn_timing == 1 ) CALL timing_start('ssh_wzv') 88 ! 89 CALL wrk_alloc( jpi, jpj, z2d, zhdiv ) 90 ! 91 91 IF( kt == nit000 ) THEN 92 92 ! … … 182 182 #if defined key_bdy 183 183 ssha(:,:) = ssha(:,:) * bdytmask(:,:) 184 CALL lbc_lnk( ssha, 'T', 1. ) 184 CALL lbc_lnk( ssha, 'T', 1. ) ! absolutly compulsory !! (jmm) 185 185 #endif 186 186 … … 230 230 IF( lk_diaar5 ) THEN ! vertical mass transport & its square value 231 231 ! Caution: in the VVL case, it only correponds to the baroclinic mass transport. 232 CALL wrk_alloc( jpi,jpj,jpk, z3d ) 232 233 z2d(:,:) = rau0 * e1t(:,:) * e2t(:,:) 233 234 DO jk = 1, jpk … … 236 237 CALL iom_put( "w_masstr" , z3d ) 237 238 CALL iom_put( "w_masstr2", z3d(:,:,:) * z3d(:,:,:) ) 239 CALL wrk_dealloc( jpi,jpj,jpk, z3d ) 238 240 ENDIF 239 241 ! 240 242 IF(ln_ctl) CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha - : ', mask1=tmask, ovlap=1 ) 241 243 ! 242 IF( wrk_not_released(2, 1,2) ) CALL ctl_stop('ssh_wzv: failed to release workspace arrays') 244 CALL wrk_dealloc( jpi, jpj, z2d, zhdiv ) 245 ! 246 IF( nn_timing == 1 ) CALL timing_stop('ssh_wzv') 243 247 ! 244 248 END SUBROUTINE ssh_wzv … … 269 273 REAL(wp) :: zec ! temporary scalar 270 274 !!---------------------------------------------------------------------- 271 275 ! 276 IF( nn_timing == 1 ) CALL timing_start('ssh_nxt') 277 ! 272 278 IF( kt == nit000 ) THEN 273 279 IF(lwp) WRITE(numout,*) … … 354 360 IF(ln_ctl) CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb - : ', mask1=tmask, ovlap=1 ) 355 361 ! 362 IF( nn_timing == 1 ) CALL timing_stop('ssh_nxt') 363 ! 356 364 END SUBROUTINE ssh_nxt 357 365
Note: See TracChangeset
for help on using the changeset viewer.